// Экспорт прайс-листа в ros-med.info, используется MailProcessor


const hourofexport = 10; // время, во сколько данный экспорт должен произойти (при usefrommenu = false)
      UseFromMenu = true;  // если true, то hourofexport не учитывается, генерится при каждом вызове
      //price_recipient = '' ; //если пусто, то останавливаемся на генерации файла
      ExportToDir ='c:\temp\ros-med.info\'; // если price_recipient пусто, то используется этот каталог

      ProducerJoinWithCountry = true; // одна колонка - "производитель / страна"

      DiscountPercent = 0;
      DiscountPercentForLiveneed = 0;

      StorageList = ''; // склады. если пусто, то все. иначе - через запятую указать список складов

      UsePartial = false; // false - передать все остатки (непроданные), true - передать часть прайса, в зависммости от UsePartialByLastDAte
      UsePartialMethod = 2; // Если UsePartial = true, то: 0 = по самым дорогим ценам, 1 - по самому последнему приходу; 2 - по самым низким ценам




var
    MailMessage :Variant;
    Agents :Variant;

var query :TQuery;
    s :string;
    Stream :tMemoryStream;
    CurrNN :string;
    CurrProducer :integer;

    CDS :TClientdataset; // здесь формируем структуру

    Price :currency;

begin
  //if (dayofweek(date()) = 2) and (hourof(now())=10)
  //if (dayofweek(date()) = 5) and (hourof(now())=12)

  if useFromMenu or (hourof(now())=hourofexport)
  then // Экспорт прайс-листа
  with TMyWait.create('Идет сбор данных для прайс-листа') do
  try
    Query := TQuery.create(SElfScript);
    CDS := TClientDataset.create(SelfScript);
    try
      advancedtext := 'запрос данных';

      Query.sql.text := 'select a.nn,a.producer,b.name,c.name as name_producer,d.name as name_country '+
        //Roundsqlto(' a.rs_cena * (1 + '+inttostr(discountPercent)+' / 100) ',-2)+' as price, '+
        ' ,a.rs_cena as price '+
        //' a.rs_cena as price_base, ' +
        ' ,pr.data as date_doc '+
        ' ,b.isliveneed '+
        ' ,pr.sklad '+
        ' from pr_nakl pr left join pr_tovar a on pr.id= a.id_nakl '+
        ' left join tovar b on a.nn = b.nn'+
        ' left join producer c on a.producer = c.id'+
        ' left join country d on c.country = d.id'+
        ' where ostat >0 ';

      if StorageList <> '' then Query.sql.add(' and a.sklad in ( '+StorageList+' )');

      Query.sql.add(' order by b.name,a.nn,a.producer');

      if UsePartial
      then begin
        case UsePartialMethod  of
         1:  Query.sql.add(',pr.data desc');
         0:  Query.sql.add(',a.rs_cena desc');
         2:  Query.sql.add(',a.rs_cena');
        end;
      end;

      Query.databasename := 'dbkassa';
      query.open;

      cds.fielddefs.clear;
      cds.fielddefs.add('nn',ftstring,10,false);
      cds.fielddefs.add('name',ftstring,200,false);
      cds.fielddefs.add('name_producer',ftstring,200,false);
      if not producerjoinwithcountry
      then    cds.fielddefs.add('name_country',ftstring,200,false);


      cds.fielddefs.add('price',ftfloat,0,false);
      cds.fielddefs.add('date_doc',ftdate,0,false);
      cds.fielddefs.add('storage',ftinteger,0,false);

      cds.createdataset;
      cds.logchanges := false;

      Query.first;

      advancedtext := 'Копирование данных';
      progressbarmax := Query.recordcount;

      CurrNN := '---------------------------';
      CurrProducer := -1;

      while not Query.eof do
      begin
        if not UsePartial or ( CurrNN <> Query.fieldbyname('nn').asstring) or ( CurrProducer <> Query.fieldbyname('producer').asinteger)
        then begin
            Price := Query.fieldbyname('Price').asFloat;

            if (Query.fieldbyname('isliveneed').asinteger = 1)
            then begin
              Price := bvroundto( Price * (1 + DiscountPercentForLiveneed / 100),-2);
            end
            else begin
              Price := bvroundto( Price * (1 + DiscountPercent / 100),-2);
            end;


            cds.append;
            cds.fieldbyname('nn').asstring := Query.fieldbyname('nn').asstring;
            cds.fieldbyname('name').asstring := Query.fieldbyname('name').asstring;
            cds.fieldbyname('name_producer').asstring := Query.fieldbyname('name_producer').asstring;

            if not ProducerJoinWithCountry
            then
              cds.fieldbyname('name_country').asstring := Query.fieldbyname('name_country').asstring
            else
            if Query.fieldbyname('name_country').asstring>''
            then
              cds.fieldbyname('name_producer').asstring :=
                cds.fieldbyname('name_producer').asstring + ' /'+
                Query.fieldbyname('name_country').asstring;

            cds.fieldbyname('price').asfloat := Price;
            cds.fieldbyname('date_doc').asdatetime := Query.fieldbyname('date_doc').asdatetime;

            cds.fieldbyname('storage').asinteger := Query.fieldbyname('sklad').asinteger;

            cds.post;

            CurrNN := Query.fieldbyname('nn').asstring;
            CurrProducer := Query.fieldbyname('producer').asinteger;
        end;

        incprogress;
        Query.next;
      end;


      advancedtext := 'Передача данных';
      progressbarpos := 0;
      ForceDirectories(includetrailingpathdelimiter(exporttodir));
      SaveDatasetToTxt(includetrailingpathdelimiter(ExportToDir)+'price.csv', CDS); //,true,',' ShowDialog :Boolean = False)

      CreateHIntI('Прайс-лист сохранен в каталоге '+exporttodir);



      (*

      STream := TMemoryStream.create;
      try
        Stream.write(S,length(S));
        //StringToFile(gettempdir+'price.txt' ,s);

        //ZipAddFS(const ZipName :string; SourceStream: TStream; const FileName :string; const BaseDirectory :string = '')
        deletefile(gettempdir+'price.zip');
        ZipAddFS(gettempdir+'price.zip', Stream, 'price.txt');
        //ZipAdd(gettempdir+'price.zip',gettempdir+'price.txt', gettempdir );
      finally
        Stream.free
      end;


      Agents := CreateOleObject('mailprocessor.addressbook');
      MailMessage := CreateOleObject('mailprocessor.mpmailmessage');
      Agents.SRV.ConnectWP('Пользователь','1');
      if not agents.srv.connected
      then begin
        CreateHintE('Не могу присоединиться.');
        exit;
      end;

      MailMessage.ID := 0;
      MailMessage.Recipient :=  price_recipient;
      MailMessage.Subject := 'Прайс-лист';
      MailMessage.AddAttachment(gettempdir+'price.zip');
      MailMessage.Save;

      //Application.Terminate;

      *)

    finally
      Query.free
    end

  finally
    free
  end;


end.

