// Экспорт прайс-листа на sarbc.ru, используется MailProcessor

var
    MailMessage :Variant;
    //Agents :Variant;


const hourofexport = 10; // время (час), во сколько данный экспорт должен произойти (если вызов не через меню)
      UseFromMenu = true; // скрипт используется из меню
      price_recipient =   'apteka_upload@sarbc.ru' ; // адрес получателя писем
      price_subject = 'прайс-лист'; // тема письма

      UseCode1AsTheme = false; // использовать альт.код1 из справочника контрагентов в метке темы. если пусто, то альт.код
      UseCodeAsTheme = true; // использовать альт.код в метке темы. если пусто, то наименование

      DiscountPercent = 0; // скидка или надбавка от прайсовой цены

      StorageList = ''; // склады, через запятую. Если без фильтра, то оставить пустым

      UsePartial = false; // false - передать все остатки (непроданные), true - передать часть прайса, в зависммости от UsePartialByLastDAte
      UsePartialByLastDate = false; // Если UsePartial = true, то: false = по самым дорогим ценам, true - по самому последнему приходу




var query :TQuery;
    s :string;
    Stream :tMemoryStream;
    CurrNN :string;
    List :TstringList;
    iStor :integer;
    strval :string;

    List1 :tstringlist;

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
    List := tstringlist.create;
    List1 := tstringlist.create;
    Query := TQuery.create(nil);
    try
      stringtolist(StorageList,List,';,');

      iStor := 0;

      repeat

        Query.sql.text := 'select a.nn,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_base, ' +
          ' pr.data as date_doc '+
          ' 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 List.count>0
        then Query.sql.add('and a.sklad = '+inttostr(strtointprotected(list[istor])));
        //if StorageList > '' then Query.sql.add(' and a.sklad in ( '+StorageList+ ')');

        Query.sql.add(' order by b.name,a.nn');

        if UsePartial
        then begin
          if UsePartialByLastDAte
          then begin
            Query.sql.add(',pr.data desc');
          end
          else begin
            Query.sql.add(',a.rs_cena desc');
          end;
        end;

        Query.databasename := 'dbkassa';
        query.open;

        Query.first;
        s := 'Наименование'+#9+'Производитель'+#9+'Страна'+#9+'Цена'+ #13#10;

        CurrNN := '---------------------------';

        while not Query.eof do
        begin
          if not UsePartial or ( CurrNN <> Query.fieldbyname('nn').asstring)
          then begin
              S := S +Query.fieldbyname('name').asstring + #9 + Query.fieldbyname('name_producer').asstring + #9 + Query.fieldbyname('name_country').asstring + #9 + Query.fieldbyname('price').asstring + #13#10;
              CurrNN := Query.fieldbyname('nn').asstring;
          end;

          Query.next;
        end;

        //s := ansitoutf8(s);
        List1.text := s;

        //list1.savetofile('c:\temp\price.txt');

        STream := TMemoryStream.create;
        try
          list1.savetostream(stream);
          // Stream.write(S,length(S));
          //Stream.write(List1.text,length(List1.text));
          //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');

        MailMessage.SRV.ConnectWP('Пользователь','1');
        if not MailMessage.srv.connected
        then begin
          CreateHintE('Не могу присоединиться.');
          exit;
        end;

        MailMessage.ID := 0;
        MailMessage.Recipient :=  price_recipient;

        strval := PRice_subject;


        if List.count>0
        then begin
           strval := '';

           if UseCode1asTheme
           then
             strval := asstring(BDEQueryValue('select code1 from agents where id = :id',[strtointprotected(list[istor])],'dbkassa'));

           if strval=''
           then begin
             if useCodeastheme
             then
               strval := asstring(BDEQueryValue('select code from agents where id = :id',[strtointprotected(list[istor])],'dbkassa'));

             if strval = ''
             then
               strval := asstring(BDEQueryValue('select name from agents where id = :id',[strtointprotected(list[istor])],'dbkassa'));

           end;

           strval :=  Price_subject + ': '+strval;
        end
        else strval := price_subject;

        MailMessage.Subject := strval;

        MailMessage.AddAttachment(gettempdir+'price.zip');
        MailMessage.Save;

        inc(iStor);
      until (iStor>=List.count);


  //Application.Terminate;


    finally
      Query.free;
      List.free;
      List1.free;
    end

  finally
    free
  end;


end.
