//********************************
// Скрипт импорта заявок, поступающих от системы Аналит-Фармация Волгоград
// Настраивается в параметре "Скрипт импорта почты" в адресной книге
//********************************


const
      CreateNewFileNameIfExists = true; // создавать ли новое имя, если уже существует старое

      PreqTag = 'Заказ'; // Эта метка должна стоять для всех заказов. иначе это что-то другое и тогда не юзать.
      UseStoreAsSubdir = true;
      UseNNProducer = true;

const
    DoLogFile = false; // вести лог экспорта по контрагентам

procedure AddStringToLog(Value :string);
var Fname :string ;
    List :TStringList;
begin
  Fname := GetAppLocaldataFolder + 'ExtractFilesLog.log';
  List := tstringlist.create;
  try
    if fileexists(FName) then List.loadfromfile(FName);
    List.add(datetimetostr(now)+' : '+Value);
    List.SaveToFile(FName);
  finally
    list.free;
  end;

end;



var
    Result :integer;
      //возврат - result 0,1,... 0 - ничего не делать, предполагается. что скрипт все сам сделал.
      //1 - стандартно, скрипт или ничего не сказал или не отработал.


    VARID :int64; // предопределенная переменная. ID письма.
    VARExport_dir :string; // каталог экспорта
    VARUSE_Date_As_Subdir :string;
    VARADDRESSBOOK_ID :int64;
    VARADDRESSBOOK_NAME :string;
    VARADDRESSBOOK_ENABLED :boolean;
    VARADDRESSBOOK_MAIL :string;
    VARADDRESSBOOK_EXTERNAL_CODES :string;
    VARADDRESSBOOK_AUTOMAIL_SCRIPT :string;


var
    Message :TMailMessage;

    i,k :integer;

    Dir :string;
    S :string;
    S1 :string;
    S2 :string;
    S3 :string;
    SenderName :string;
    Num :string;

    PreqTagPos :integer;

    List1,list2,List3 :TSTringLIst;
    fname :string;
    tmpDir :string = '';
    strval :string;

    Table :TDBF;// Ttable;
    //Session :tSession;
begin

  Message := TMailMessage.create; // CreateOleObject('MailProcessor.MPMailMessage');
  try

     Message.ID := asfloat(VARID);

     PreqTagPos := pos(PreqTag,Message.Subject);
     if  (PreqTagPos=0) then exit;

     SenderName := VARADDRESSBOOK_EXTERNAL_CODES;
     repeat // возьмем последний из кодов для этой процедуры
       i := pos(',',sendername);
       if i=0 then i:= pos(';',sendername);
       if i>0 then sendername := copy(sendername,i+1,length(sendername));
     until i=0;

     //createhint(sendername);
     if (SenderName='') then exit;

     //if Message.AttachmentCount<>1 then exit;
     s := Message.AttachmentNames;

       //createhint(S);

     list3 := tstringlist.create;
     try
       StringToList(S,List3,';,');

       if list3.count>0
       then begin
         S := '';
         for i := 0 to list3.count-1 do
         begin
           if ansiuppercase(extractfileext(list3[i]))='.DBF'
           then begin
             S := list3[i];
             break;
           end;
         end;
       end;
     finally
       List3.free;
     end;

     if S='' then begin
       createhintw('Не найдено файлов необходимого формата DBF в письме от '+Message.SenderName);
       exit;
     end;

     tmpdir := includetrailingpathdelimiter(createuniquedir);
     Message.SaveAttachment(S,tmpdir);


     table := tDBF.create(selfscript); //ttable.create(selfscript);
     //CheckUniqueSessionName;
     //session.active := false;
     //session.sessionname := 'sess'+inttostr(randomrange(0,65000));
     //session.active := true;
     //table.sessionname := session.sessionname;

     List1 := tstringlist.create;
     list2 := tstringlist.create;
     try
       //List1.loadfromfile(tmpdir+s);

       //table.tabletype := ttFoxpro;
       table.tablename := tmpdir+s;
       table.open;
       if table.isempty
       then begin
         createhintw('Файл DBF в письме от '+Message.SenderName+' пуст.');
         exit;
       end;
       table.first;

       Dir := Includetrailingpathdelimiter(VARExport_Dir);

       if SenderName >'' then Dir := Dir + SenderName
       else if Message.SenderName>'' then Dir := Dir + Message.SenderName
       else Dir := Dir + Message.SenderAddress;

       Dir := IncludeTrailingpathdelimiter(Dir);

       {
       s1 := Message.Subject;

       s2 := '';
       s1 := copy(s1,length(preqtag)+1,length(s1));
       }

       S2 := '';
       S1 := table.fieldbyname('CLIENT').asstring;
       Num:= table.fieldbyname('ORDERID').asstring;


       if not UseStoreAsSubDir or (S2='')
       then
         Dir := includetrailingpathdelimiter(dir + trim(correctfilename( S1+' '+S2)))
       else begin
         Dir := includetrailingpathdelimiter(
                     dir +
                     includetrailingpathdelimiter(trim(correctfilename( S1))) +
                     trim(correctfilename( S2)) +

                  );
       end;

       if VARUse_Date_As_SubDir
       then
          Dir := includetrailingpathdelimiter(Dir + formatdatetime('yyyy-mm-dd',date));

         //createhint(dir);

       ForceDirectories(Dir);

       if CreateNewFileNameIfExists and fileexists(Dir+S)
       then begin
         S1 := extractfilename(GetUniqueFileName(Dir,S));
       end
       else begin
         s1:= S;
       end;

       if not CreateNewFileNameIfExists and fileexists(Dir+S)
       then begin
         DeleteFile(Dir+S1); //movefile - не затрет сам
       end;

       //MoveFile(TmpDir + S,Dir+S1);
       {
       List1.loadfromfile(dir+s1);
       if list1.count>10
       then
       begin
         for i := 3 to list1.count-1 do
         begin
           stringtolist(list1[i],list2,#9);
           if list2.count>=6
           then begin
             list2.delete(4);
             strval := '';
             for k := 0 to list2.count-1 do
             begin
                if strval > '' then strval := strval + #9;
               strval := strval + list2[k];
             end;
             list1[i] := strval;
           end;
         end;
       end;
       }

       //Заказ № 68701260 от 'Аптеки 36,6 Волгоград' (г.Волгоград, ул.Туркменская, д.19) - Волгоград
       s2 := trim(Message.Subject);
       i := pos(' от ',s2);
       if i >0 then s2 := trim(copy(s2,i+4,length(s2)));


       i := pos('(',s2);
       if i>0
       then begin
         s3 := trim(copy(s2,i+1,length(s2)));
         s2 := trim(copy(s2,1,i-1));
       end
       else begin
         s3 := '';
       end;

       if (S2>'') and ((S2[1]='''') or (S2[1]='"')) then s2 := copy(s2,2,length(s2));
       if (S2>'') and ((S2[length(s2)]='''') or (S2[length(s2)]='"')) then s2 := copy(s2,1,length(s2)-1);

       i := pos(')',s3);
       if i>0 then S3 := trim(copy(s3,1,i-1));


       if UseNNProducer then StrvAl := ' //BVSOFt {NN_PRODUCER}' else StrvAl := '';
       list1.add('Заказчик : '+ S2+ ' (Филиал: '+s3+')'+ StrVal);
       List1.add('Комментарий к заявке: '+s3);
       list1.add('Время отправления : '+ table.fieldbyname('orderdate').asstring);

       table.first;
       while not table.eof do begin
         list1.add(table.fieldbyname('quantity').asstring+#9+
                   table.fieldbyname('goodscode').asstring+#9+
                   table.fieldbyname('goodsname').asstring+#9+
                   table.fieldbyname('producname').asstring+#9+
                   table.fieldbyname('cost').asstring);

         table.next;
       end;

       List1.savetofile(dir+'order_'+Num+'.txt');
       if DoLogFile then AddStringToLog(Dir+S1+ ' ,exists: '+asstring(fileexists(Dir+S1)));

     finally
       list2.free;
       list1.free;
     end;

     CreateHintI('Поступила заявка от '+Message.Sender+'. Вложения сохранены в '+dir);
     Message.IsProcessed := true;

     result := 0; // письмо обработано, дальне обслуживатьь скриптами его не нужно


  finally
    //AddressBook := nil;
    //Message := nil;
    if tmpdir >'' then deletedir(tmpdir);
    Message.free;
  end;
end.
