// GetDataFromSolarisForPreq.pas
// Скрипт собирает данные из соляриса по остаткам и продажам
// Скрипт сохраняет результаты для анализа об остатках и продажах системой ФармЭксперт
// Скрипт может быть запущен как из программы solaris, так и с помощью fsexec, либо mailprocessor
// пример командной строки вызова скрипта с помощью fsexec:
// fsexec.exe /script GetDataFromSolarisForPreq.pas /aliasname=kalendula /ExportPath c:\temp\infoas /storage=1 -exit
// для корректной работы скрипта необходимо, чтобы программа, исполняющая его, была с датой выпуска не раньше 08.08.13
// bvsoft


var
  AliasName :string = '';
  // алиас в BDE для соляриса на данном рабочем месте.
  // Если запускается из соляриса, то игнорируется.
  // если запущено другой программой, то использует 'SOLARIS' по-умолчанию, либо значение, указанное здесь,  либо по параметру командной строки /ALIASNAME
  // пример командной строки: /ALIASNAME=SOLARIS или  /ALIASNAME SOLARIS

  StorageList :String = '';
  // номера складов, по которым запрашивается остаток, через запятую.
  // переопределить переменную можно будет, используя параметр командной строки: -STORAGELIST (или /STORAGELIST)
  // пример: /STORAGELIST=123 или  /STORAGELIST "123,33,555"

  ExportPath :string  = '';
  // путь для экспорта данных. если не указать, то положит рядом с исполнителем скрипта
  // переопределить переменную можно будет, используя параметр командной строки: -EXPORTPATH (или /EXPORTPATH)

  DaysForPurchase :integer = 0;
  // количество последних дней для сбора продаж. 0 - без ограничений

// локальные переменные
var
 strval :string;
 i :integer;
 Session1 :tsession;
 Query :TQuery;

 List,list1 :TstringList;

 tmpFile :string;
 CDS :TClientDataset;

 IsSolaris :boolean;

 taTovar,TaProducer,taCountry :tTable;

 strname ,strProducer,strcountry :string;


begin
   List := tstringlist.create;
   list1 := tstringlist.create;
   with tmywait.create('Идет запрос данных из программы Солярис') do
   try
     try

       issolaris := ansiuppercase(extractfilename(paramstr(0))) = 'SOLARIS.EXE';

       if issolaris
       then AliasName := 'dbkassa'
       else if  (AliasName='')
       then aliasname := 'solaris';


       cds := tclientdataset.create(selfscript);

         // переопределение переменных, елси они найдены в параметрах командной строки

       with TAPPParamStr.create do
       try
         if FIND('STORAGELIST')
         then begin
           StorageList := vartostr(Values('STORAGELIST'));
           if storagelist[1]='"'
           then delete(storagelist,1,1);
           if storagelist[length(storagelist)] = '"'
           then delete(storagelist,length(storagelist),1);
         end;

         if FIND('ALIASNAME')
         then AliasName := vartostr(Values('AliasName'));

         if FIND('DAYSFORPURCHASE')
         then DaysForPurchase := strtointprotected(vartostr(Values('DAYSFORPURCHASE')));


         if FIND('EXPORTPATH')
         then ExportPath := includetrailingpathdelimiter(vartostr(Values('EXPORTPATH')));
         if exportpath = '' then exportpath := includetrailingpathdelimiter(extractfilepath(paramstr(0)));

         if (exportpath[1] = '"') or (exportpath[1]='''')
         then delete(exportpath,1,1);

         if (exportpath[length(exportpath)] = '"') or (exportpath[length(exportpath)]='''')
         then delete(exportpath,length(exportpath),1);

         forcedirectories(exportpath);

         //showmessage(getallparams);
       finally
         free
       end;

       //Инициализация сессии и компоненты-запроса

        if not issolaris
        then begin
          randomize;
          session1 := tsession.create(selfscript);
          Session1.Sessionname := 'tempsession'+inttostr(randomrange(0,10000));
          Session1.netfiledir := Getaliaspath(AliasName);
          session1.active := true;
        end;

        Query := TQuery.create(selfscript);
        if not issolaris
        then  Query.sessionname := Session1.Sessionname;
        Query.databasename := aliasname;

        taTovar := tTable.create(selfscript);
        if not issolaris
        then  taTovar.sessionname := Session1.Sessionname;
        taTovar.databasename := aliasname;
        taTovar.tablename := 'tovar.db';
        taTovar.open;

        taProducer := tTable.create(selfscript);
        if not issolaris
        then  taProducer.sessionname := Session1.Sessionname;
        taProducer.databasename := aliasname;
        taProducer.tablename := 'producer.db';
        taProducer.open;

        taCountry := tTable.create(selfscript);
        if not issolaris
        then  tacountry.sessionname := Session1.Sessionname;
        tacountry.databasename := aliasname;
        tacountry.tablename := 'country.db';
        tacountry.open;

       // собственно сбор данных. При сохранении можно было бы использовать гораздо более простую функцию SaveDatasetToTXT,
       // но ТЗ требовало нестандартных для этого случая форматов даты и чисел, пришлось сохранение делать руками через TStringlist

       ///////////////////////////////////////////////////////////////////////////

       // Запрос данных
       AdvancedText := 'Данные по остаткам товара - 1';

       Query.close;


       Query.sql.text := 'select '+
          ' a.nn,a.producer,a.ostat,b.data,a.sklad'+
          ' from pr_tovar a '+
          ' left join pr_nakl b on a.id_nakl = b.id '+
          ' where a.ostat>0 ';

       if Storagelist>''
       then begin
         Query.sql.add('and b.sklad in ( '+storageList+')');
       end;

       tmpfile :=bdebatchmovetotmp(Query);

       AdvancedText := AdvancedText + ' - 2';


       Query.sql.text := 'select '+
          ' nn,producer,sum(ostat) as ostat,min(data) as data'+
          ' from '+QuotedStr(tmpfile);

       Query.sql.add('group by nn,producer');

       Query.open;
       deletefile(tmpfile);

       AdvancedText := AdvancedText + ' - формирование';
       application.processmessages;

       cds.fielddefs.clear;
       cds.fielddefs.add('nn',ftstring,10,false);
       cds.fielddefs.add('producer',ftinteger,0,false);
       cds.createdataset;
       cds.indexfieldnames := 'nn;producer';
       cds.logchanges := false;

       // Сохранение данных

       list.clear;
       List.add('ID'#9'NAME'#9'PRODUCTION'#9'DATE'#9'COUNT');

       Progressbarmax := Query.recordcount;

       Query.first;
       while not Query.eof do
       begin
         strcountry := '';
         strproducer := '';
         strname := '';

         if tatovar.findkey([Query.fieldbyname('nn').asstring])
         then strname := tatovar.fieldbyname('name').asstring;

         if (query.fieldbyname('producer').asinteger<>0)
            and taproducer.findkey([Query.fieldbyname('producer').asinteger])
         then begin
           strproducer := taproducer.fieldbyname('name').asstring;
           if (taproducer.fieldbyname('country').asstring>'')
              and taCountry.findkey([taproducer.fieldbyname('country').asstring])
           then strcountry := tacountry.fieldbyname('name').asstring;
         end;

         if (strproducer>'') and (strcountry>'')
         then strproducer := strproducer + ' /'+strcountry;



         list.add(Query.fieldbyname('nn').asstring+'_'+Query.fieldbyname('producer').asstring + #9+
                  strname+ #9+
                  strproducer +#9+
                  formatdatetime('YYYY-MM-DD',Query.fieldbyname('data').asdatetime)+ #9+
                  stringreplace(Query.fieldbyname('ostat').asstring,DecimalSeparator,'.'));

         if not cds.findkey([Query.fieldbyname('nn').asstring,Query.fieldbyname('producer').asinteger])
         then begin
           cds.append;
           cds.fieldbyname('nn').asstring := Query.fieldbyname('nn').asstring;
           cds.fieldbyname('producer').asinteger := Query.fieldbyname('producer').asinteger;
           cds.post;
         end;



         query.next;
         incprogress;
         application.processmessages;

       end;

       //readdataset(cds,Query);
       //cds.indexfieldnames := 'nn;producer';
       //cds.logchanges := false;

       //List.savetofile(ExportPath+'xposition.txt');

       (*
       tmpfile := bdebatchmovetotmp(Query);


       ///////////////////////////////////////////////////////////////////////////
       progressbarpos := 0;
       AdvancedText := 'Активный справочник товаров';
       application.processmessages;

       Query.close;
       Query.sql.text := 'select distinct'+
          ' a.nn,b.name'+
          ' from '+QuotedStr(tmpfile)+' a '+
          ' join tovar b on a.nn = b.nn ';


       Query.open;
       AdvancedText := AdvancedText + ' - сохранение';
       application.processmessages;

       list.clear;
       List.add('NN'#9'NAME');

       Progressbarmax := Query.recordcount;

       Query.first;
       while not Query.eof do
       begin
         List.add(Query.fieldbyname('nn').asstring + #9+
                         Query.fieldbyname('name').asstring);
         query.next;
         incprogress;
         application.processmessages;

       end;

       List.savetofile(ExportPath+'xgoods.txt');

       ///////////////////////////////////////////////////////////////////////////
       progressbarpos := 0;
       AdvancedText := 'Активный справочник производителей';
       application.processmessages;

       Query.close;
       Query.sql.text := 'select distinct'+
          ' a.producer,b.name,c.name as name_country'+
          ' from '+QuotedStr(tmpfile)+' a '+
          ' left join producer b on a.producer = b.id '+
          ' left join country c on b.country = c.id '+
          ' where a.producer <>0 and a.producer is not null';

       Query.open;
       AdvancedText := AdvancedText + ' - сохранение';
       application.processmessages;

       list.clear;
       List.add('ID'#9'NAME'#9'NAME_COUNTRY');

       Progressbarmax := Query.recordcount;

       Query.first;
       while not Query.eof do
       begin
         List.add(Query.fieldbyname('producer').asstring + #9+
                         Query.fieldbyname('name').asstring+ #9+
                         Query.fieldbyname('name_country').asstring);
         query.next;
         incprogress;
         application.processmessages;

       end;

       List.savetofile(ExportPath+'xproducers.txt');

       deletefile(tmpfile);

       *)

       {
       if cds.findkey(['00014О',null])
       then begin
         if cds.fieldbyname('producer').isnull then showmessage('null')
         else showmessage(cds.fieldbyname('producer').value);
       end
       else showmessage('not found');
       }

       ///////////////////////////////////////////////////////////////////////////
       progressbarpos := 0;
       AdvancedText := 'Данные по продажам товара';

       Query.close;
       Query.sql.text := 'select '+
          ' c.nn,c.producer,b.data,a.kol,a.cena'+
          ' from rs_tovar a '+
          ' join rs_nakl b on a.id_nakl = b.id '+
          ' join osnov o on b.osnov = o.id '+
          ' join pr_tovar c on a.id_pr = c.id '+
          ' where o.iscash=1 and c.id is not null';

       if StorageList>''
       then begin
         Query.sql.add('and b.sklad in ( '+storageList+')');
       end;

       if DaysForPurchase<>0
       then begin
         Query.sql.add('and b.data > :dt ');
         Query.parambyname('dt').asdatetime := date-daysforpurchase;
       end;


       Query.open;
       AdvancedText := AdvancedText + ' - формирование';
       application.processmessages;

       list1.clear;
       List1.add('ID'#9'DATE'#9'COUNT'#9'COST');

       progressbarpos := 0;
       progressbarmax := Query.recordcount;

       Query.first;
       while not Query.eof do
       begin
         list1.add(Query.fieldbyname('NN').asstring+'_'+Query.fieldbyname('producer').asstring + #9+
                  formatdatetime('YYYY-MM-DD',Query.fieldbyname('data').asdatetime)+ #9+
                  stringreplace(Query.fieldbyname('kol').asstring,DecimalSeparator,'.')+#9+
                  stringreplace(stringreplace(Query.fieldbyname('cena').asstring,DecimalSeparator,'.'),thousandseparator,''));


         if not cds.findkey([Query.fieldbyname('nn').asstring, Query.fieldbyname('producer').asinteger])
            or (Query.fieldbyname('producer').asinteger=0)
               and not cds.findkey([Query.fieldbyname('nn').asstring,null])
         then begin  // дополнение в xproducers товаров, которые там не присутствуют
           cds.append;
           cds.fieldbyname('nn').asstring := Query.fieldbyname('nn').asstring;
           cds.fieldbyname('producer').asinteger := Query.fieldbyname('producer').asinteger;
           cds.post;

           strcountry := '';
           strproducer := '';
           strname := '';

           if tatovar.findkey([Query.fieldbyname('nn').asstring])
           then strname := tatovar.fieldbyname('name').asstring;

           if (query.fieldbyname('producer').asinteger<>0)
              and taproducer.findkey([Query.fieldbyname('producer').asinteger])
           then begin
             strproducer := taproducer.fieldbyname('name').asstring;
             if (taproducer.fieldbyname('country').asstring>'')
                and taCountry.findkey([taproducer.fieldbyname('country').asstring])
             then strcountry := tacountry.fieldbyname('name').asstring;
           end;

           if (strproducer>'') and (strcountry>'')
           then strproducer := strproducer + ' /'+strcountry;



           list.add(Query.fieldbyname('nn').asstring+'_'+Query.fieldbyname('producer').asstring + #9+
                    strname+ #9+
                    strproducer +#9+
                     #9+
                    '0'+#9
                    );

           query.next;
           incprogress;
           application.processmessages;


         end;

         query.next;
         application.processmessages;
         incprogress;
       end;

       //cds.savetofile('c:\temp\3.cds');


       AdvancedText := 'Cохранение результата в каталоге '+exportpath;

       List1.savetofile(ExportPath+'xpurchase.txt');
       List.savetofile(ExportPath+'xposition.txt');

       createhint('Операция завершена');

       //application.terminate;
     except
       bvMessageError(exceptmessage+#13+Advancedtext+'/позиция :'+inttostr(progressbarpos));
     end;
   finally
     free;
     List.free;
     list1.free;
   end;
end.
