// скрипт загрузки заявки из Аббат. Заявка должна поступить в почту X-Price или в локальный каталог,
// в зависимости от переключателя LoadFromXPrice (Переключатель алгоритма чтения): True - брать из почты x-price, false - брать из файла

const
  LoadFromXPrice = false;


// предопределены переменные:

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; // Дополнительная информация


var
  Mail : Variant;
  MailMessage :Variant;
  Form :tForm;
  iPos :integer;

  ds :TDatasource;


  StrValue :string;


  Quantity :integer;
  Price :currency;
  Name_goods :string;
  Name_producer :string;
  Name_country :string;

  //TableGOods, TableProducer :ttable;


function  LoadFromFile(FileName :string) :boolean;
var
  List :TSTringList;
  List1 :tStringList;
  i,k :integer;
  Query :TQuery;
  StrValue, StrVAlue1 :string;
begin
  result := false;
  List := TStringLIst.create;
  try
    List.LoadFromFile(FileName);

    if List.count<3 then begin
      CreateHintW('Во вложении должно быть не менее 3 строк заголовка');
      exit;
    end;


    StrValue := List[0];
    if (pos('ЗАКАЗЧИК',ansiuppercase(StrValue))<>1)
       and  (GetConfirm('Первая строка имеет неожиданный формат: '+StrValue+'. Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
    then exit;

    StrVAlue := copy(StrValue,pos(':',StrValue)+1,length(STrVAlue));
    if (StrVAlue ='')
       and  (GetConfirm('Первая строка имеет неожиданный формат: не найден символ ":". Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
    then exit;

    StrValue1 := trim(copy(StrVAlue,pos('(',StrVAlue)+1,length(StrValue)));
    if STrVAlue1<>''
    then begin
      if StrVAlue1[length(StrValue1)]=')' then delete(StrVAlue1,length(strVAlue1),1);
      StrValue := trim(copy(StrValue,1,pos('(',StrVAlue)-1));
    end;

    name_org := trim(StrValue);
    name_org1 := trim(StrVAlue1);

   //debug bvMessage('name_org='+Name_org+'; Name_org1='+name_org1);

    if StrValue>'' then begin
      StrVAlue := ansiUppercase(name_org);

      Query := tQuery.create(nil);
      try
        query.databasename := 'dbkassa';
        Query.sql.text := 'select * from agents where upper(name) = :p_name or upper(smallname) = :p_name ';
        Query.parambyname('p_name').asstring := StrValue;
        Query.open;
        if Query.isempty
           and  (GetConfirm('Не найден заказчик с таким именем или укороченным именем: '+StrValue+'. Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
        then exit;

        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 exit;

    StrVAlue := copy(StrValue,pos(':',StrValue)+1,length(STrVAlue));
    if (StrVAlue ='')
       and  (GetConfirm('Первая строка имеет неожиданный формат: не найден символ ":". Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
    then exit;

    name_org1 := trim(StrValue);
    *)
    (*
    if StrValue>'' then begin
      StrVAlue := ansiUppercase(name_org1);

      Query := tQuery.create(nil);
      try
        query.databasename := 'dbkassa';
        Query.sql.text := 'select * from agents where upper(name) = :p_name or upper(smallname) = :p_name ';
        Query.parambyname('p_name').asstring := StrValue;
        Query.open;
        if Query.isempty
           and  (GetConfirm('Не найден грузополучатель с таким именем или укороченным именем: '+StrValue+'. Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
        then continue;

        id_org1 := Query.fieldbyname('id').asinteger;

        Query.close;
      finally
        Query.free;
      end;
    end;
    *)

    List1 :=TStringList.create;
    try

      while not dataset.isempty do dataset.delete;


      // парсим состав документа
      for i := 3 to List.count-1 do
      begin
         StringToList(List[i],List1,#09);

         begin

           Quantity := strtointprotected(List1[0]);
           name_goods := trim(List1[2]);
           name_producer := trim(List1[3]);
           if pos('/',name_producer)>0 // country
           then begin
             name_country := trim(copy(name_producer,pos('/',name_producer)+1,length(name_producer)));
             name_producer := trim(copy(name_producer,1,pos('/',name_producer)-1));
           end;

           price := strtofloatprotected(List1[4]);



           dataset.append;

           if name_goods <> ''
           then
             dataset.fieldbyname('name').asstring := name_goods;

           if (name_producer <> '')
           then begin
             dataset.fieldbyname('name_producer').asstring := name_producer;
           end;

           if (name_country <> '')
           then begin
             dataset.fieldbyname('name_country').asstring := name_country;
           end;

           dataset.fieldbyname('price').asfloat := price;
           dataset.fieldbyname('quantity').asfloat := quantity;

           dataset.post;

         end

      end;

    finally
      List1.free;
    end;

    createhint('Процедура окончена');
    result := true;

  finally
    List.free;
  end;
end;

begin
  if loadfromxprice then
  begin
    Mail := CreateOleObject('xpricews.xpemail');
    if not Mail.srv.connected
    then mail.srv.connectwp('Пользователь','1');

    if not mail.srv.connected then
    begin
      createhinte('Ошибка, сервер не подключен');
      exit;
    end;

    MailMessage := CreateOleObject('xpricews.xpemailmessage');

    mail.folderid := 1;
    mail.active := true;
    mail.sort('ID DESC');

    Form := TForm.create(nil);
    try
      Form.Caption := 'Почта X-Price';
      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
        if LoadFromFile( gettempdir + mailmessage.attachmentnames) then break
      end
    finally
      Form.free;
    end;
  end
  else
  with tOpenDialog.create(nil) do
  try
     Title := 'Укажите файл-заявку';
     FileName  := AppIniFile.readstring('farmnet_load','filename','');
     Filter := 'Файлы-заявки (*.txt)|*.txt|Все файлы(*.*)|*.*';
     while  execute do begin
       if not fileexists(FileName) then CreateHint('Укажите правильно файл ')
       else begin
         StrVAlue := FileName;
         AppIniFile.writestring('farmnet_load','filename',filename);

         if LoadFromFile(StrVAlue) then  break;
       end;
     end;
  finally
    free
  end;


end.
