// скрипт загрузки заявки от 36,6. Используется почта x-price
// скрипт открывает входящую почту X-Price, оттуда оператор выбирает нужное письмо.
// Далее из письма достается файл заявки и принимается.

// предопределены переменные:

VAR
 VariantName :string; // имя варианта в программе
 VariantFile :string; // файл-скрипт
 Dataset :tdataset; // формируемый файл заявки, уже открыт, нужно заполнить. Структуру можно изучить непосредственно в окне импорта, он и есть таблица, отображаемая на экране
 DateDoc :tdatetime;  // дата документа, будет сохранено в накладной
 numberdoc :string;  // номер документа
 id_org :integer;  // код организации-заказчика в нашей базе
 id_org1 :integer;  // код подразделения в нашей базе
 name_org :string;  // наименование организации-заказчика
 name_org1 :string;  // наименование подразделения
 Info :string; // Дополнительная информация

const
  A366_ID = 266 ; // Код Аптеки 36.6 в нашей базе данных в справочнике контрагентов

var
  Mail : Variant;
  MailMessage :Variant;
  Form :tForm;
  iPos :integer;

  ds :TDatasource;

  List :TSTringList;
  List1 :tStringList;
  i,k :integer;

  StrValue :string;

  Query :TQuery;

  Quantity :integer;

  CODE_GOODS :string;
  CODE_PRODUCER :string;
  Price :currency;
  Name_goods :string;

  TableGOods, TableProducer :ttable;

begin
  Mail := CreateOleObject('mailprocessor.mpmail');
  if not Mail.srv.connected
  then mail.srv.connectwp('Пользователь','1');

  if not mail.srv.connected then
  begin
    createhinte('Ошибка, сервер не подключен');
    exit;
  end;

  MailMessage := CreateOleObject('mailprocessor.mpmailmessage');

  mail.folderid := 1;
  mail.active := true;
  mail.sort('ID DESC');

  Form := TForm.create(nil);
  try
    Form.Caption := 'Почта MailProcessor';
    Form.borderStyle := bsDialog;
    Form.width := 600;
    Form.position := poScreenCenter;
    Form.Font.name := 'Tahoma';


    with TBevel.create(form) do
    begin
      Shape := bsTopLine;
      Height := 4;
      align := alTop;
      parent := Form;
    end;

    iPos := 0;

    (*
    with TLabel.create(form) do
    begin
      caption := 'Письма в почте X-Price:';
      font.size := 10;
      Top := 20;
      Left :=  20; //(Form.clientWidth - Width) div 2;
      parent := Form;
      iPos := Top + Height;
    end;
    *)

    ds := TDatasource.create(form);
    ds.dataset := TClientDataset.create(Form);
    ds.autoedit := false;

    with TClientDAtaset(ds.dataset) do
    begin
      with FieldDefs do
      begin
        clear;
        add('date',ftdate,0,false);
        add('From',ftstring,200,false);
        add('Subject',ftstring,200,false);
        add('Attachments',ftstring,200,false);
        add('id',ftinteger,0,false);
      end;
      CreateDataset;
      Fieldbyname('date').displayLabel := 'Дата письма';
      Fieldbyname('subject').displayLabel := 'Тема';
      Fieldbyname('attachments').displayLabel := 'Вложения';
      Fieldbyname('From').displayLabel := 'Отправитель';

      mail.first;
      while not mail.eof do begin
        append;
        mail.fieldname := 'received';
        fieldbyname('date').asdatetime := mail.asDAteTime;
        mail.fieldname := 'subject';
        Fieldbyname('subject').asstring := mail.asstring;
        mail.fieldname := 'senders';
        Fieldbyname('from').asstring := mail.asstring;

        mail.FieldName := 'ID';
        fieldbyname('id').asinteger  := mail.asinteger;

        mailMessage.ID := mail.asfloat;
        fieldbyname('attachments').asstring := mailmessage.attachmentnames;
        post;
        mail.next;
      end;

      //data := mail.getdata;
    end;



    with TbvdbGrid.create(form) do
    begin
      Name := 'grd';
      Left := 20;
      Top := iPos + 20;
      Height := 200;
      iPos := Top + Height;
      Width := Form.clientWidth - 40;
      Parent := Form;

      MaxColumnWidth := 150;
      AutoSizeColumns := true;


      datasource := ds;
      REstoreGrid;
    end;




    with TBevel.create(Form) do
    begin
      shape := bsTopLine;
      Height := 4;
      Width := Form.clientWidth - 30;
      Left := (Form.ClientWidth - Width) div 2;
      Top := iPos + 20;
      parent := Form;
      iPos := Top;
    end;

    with Tbutton.create(Form) do
    begin
      Caption := 'Выбрать';
      Width := 70;
      ModalResult := mrOk;
      Top := iPos + 13;
      Left := Form.clientWidth - width * 2 - 45;
      Default := true;
      Parent := Form;
    end;


    with Tbutton.create(Form) do
    begin
      Caption := 'Отмена';
      Width := 70;
      ModalResult := mrCAncel;
      Top := iPos + 13;
      Left := Form.clientWidth - width  - 35;
      Parent := Form;
      iPos := Top + height;
    end;

    Form.Clientheight := iPos + 10;



    while form.Showmodal = mrOk do
    begin
      //exit;

      if mail.recordcount = 0 then begin
        CreateHIntW('Нет писем');
        continue;
      end;
      mailMessage.ID := ds.dataset.fieldbyname('id').asstring;

      (*
      if mailmessage.attachmentcount<>1 then begin
        CreateHIntW('В письме должно быть всего одно вложение');
        continue;
      end;
      *)

      mailmessage.saveattachments(gettempdir);

      List := TStringLIst.create;
      try
        List.LoadFromFile(gettempdir + mailmessage.attachmentnames);

        if List.count<3 then begin
          CreateHintW('Во вложении должно быть не менее 3 строк заголовка');
          continue;
        end;


        StrValue := List[0];

        (*
        if (pos('ЗАКАЗЧИК',ansiuppercase(StrValue))<>1)
           and  (GetConfirm('Первая строка имеет неожиданный формат: '+StrValue+'. Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
        then Continue;

        StrVAlue := copy(StrValue,pos(':',StrValue)+1,length(STrVAlue));
        if (StrVAlue ='')
           and  (GetConfirm('Первая строка имеет неожиданный формат: не найден символ ":". Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
        then Continue;

        name_org := trim(StrValue);
        *)


        if StrValue>'' then begin

          Query := tQuery.create(nil);
          try
            query.databasename := 'dbkassa';
            Query.sql.text := 'select * from agents where code = :p_code';
            Query.parambyname('p_code').asstring := StrValue;
            Query.open;
            if Query.isempty
               and  (GetConfirm('Не найден заказчик с таким альт.кодом: '+StrValue+'. Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
            then continue;

            if (Query.fieldbyname('id').asinteger <> a366_id)
               and  (GetConfirm('Код найденного заказчика: '+StrValue+'='+Query.fieldbyname('id').asstring+' и он не совпадает с ожидаемым для Аптеки 36.6. Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
            then continue;

            id_org := Query.fieldbyname('id').asinteger;
            Query.close;

          finally
            Query.free;
          end;

        end;

        StrValue := List[1];
        (*
        if (pos('КОММЕНТАРИЙ К ЗАЯВКЕ',ansiuppercase(StrValue))<>1)
           and  (GetConfirm('Вторая строка имеет неожиданный формат: '+StrValue+'. Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
        then Continue;

        StrVAlue := copy(StrValue,pos(':',StrValue)+1,length(STrVAlue));
        if (StrVAlue ='')
           and  (GetConfirm('Первая строка имеет неожиданный формат: не найден символ ":". Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
        then Continue;

        name_org1 := trim(StrValue);
        *)


        if StrValue>'' then begin

          Query := tQuery.create(nil);
          try
            query.databasename := 'dbkassa';
            Query.sql.text := 'select * from agents where code = :p_code';
            Query.parambyname('p_code').asstring := StrValue;
            Query.open;
            if Query.isempty
               and  (GetConfirm('Не найдено подразделение с таким альт.кодом: '+StrValue+'. Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
            then continue;

            (*
            if (Query.fieldbyname('id').asinteger <> a366_id)
               and  (GetConfirm('Код найденного заказчика: '+StrValue+'='+Query.fieldbyname('id').asstring+' и он не совпадает с ожидаемым для Аптеки 36.6. Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
            then continue;
            *)

              id_org1 := Query.fieldbyname('id').asinteger;
            Query.close;

          finally
            Query.free;
          end;
        end;

        List1 :=TStringList.create;
        TableGoods := TTAble.create(nil);
        TableProducer := TTAble.create(nil);
        try

          TAbleGoods.databasename := 'dbkassa';
          tableProducer.databasename := 'dbkassa';

          tablegoods.tablename := 'tovar.db';
          tableproducer.tablename := 'producer.db';

          TableGoods.Open;
          tablegoods.indexfieldnames := '';
          TableProducer.Open;

          while not dataset.isempty do dataset.delete;



          // парсим состав документа
          for i := 3 to List.count-1 do
          begin
             StringToList(List[i],List1,' ');

             begin


               Quantity := strtointprotected(List1[1]);
               Code_goods := uppercase(List1[0]);

               if Pos('_',CODE_goods)>0
               then begin
                  code_producer := Copy(code_goods,Pos('_',code_goods)+1,200);
                  Delete(code_goods,Pos('_',code_goods),200);
               end
               else code_producer := '';



               dataset.append;


               dataset.fieldbyname('id_tovar').asstring := code_goods; //tablegoods.fieldbyname('NN').asstring;
               if (code_goods <> '')
                  and TableGoods.findkey([code_goods])
               then begin
                 dataset.fieldbyname('name').asstring := tablegoods.fieldbyname('name').asstring;
                 dataset.fieldbyname('name_my').asstring := tablegoods.fieldbyname('name').asstring;
               end;

               dataset.fieldbyname('id_producer').asstring := code_producer;
               if (code_producer <> '')
                  and tableProducer.findkey([code_producer])
               then begin
                 dataset.fieldbyname('name_producer').asstring := tableproducer.fieldbyname('name').asstring;
                 dataset.fieldbyname('name_producer_my').asstring := tableproducer.fieldbyname('name').asstring;
               end;

               //dataset.fieldbyname('price').asfloat := price;
               dataset.fieldbyname('quantity').asfloat := quantity;

               dataset.post;

             end

          end;

        finally
          TableProducer.free;
          TAbleGoods.free;
          List1.free;
        end;


      finally
        List.free;
      end;


      createhint('Процедура окончена');
      break;
    end
  finally
    Form.free;
  end;


end.
