//********************************
// Скрипт импорта заявок, поступающих От Фармнет.
// Настраивается в параметре "Скрипт импорта почты" в адресной книге
//********************************


const
      CreateNewFileNameIfExists = true; // создавать ли новое имя, если уже существует старое

      PreqTag = 'Заказы от'; // Эта метка должна стоять для всех заказов. иначе это что-то другое и тогда не юзать.
      StorageTag = '. Грузополучатель -'; // метка перед указанием грузополучателя в письме
      UseStoreAsSubdir = true;

      UseNNProducer = false; // в качестве кода используется пара NN_ПРОИЗВОДИТЕЛЬ

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 :integer;

    Dir :string;
    S :string;
    S1 :string;
    S2 :string;
    SenderName :string;

    PreqTagPos :integer;

    List1 :TSTringLIst;
    fname :string;
    tmpDir :string = '';
    cnt :integer;
    FileList:tstringlist;
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;
     if (SenderName='') then exit;
     
     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;
     delete(s1,PreqTagPos,length(preqtag));

     if not UseStoreAsSubDir
     then
       Dir := includetrailingpathdelimiter(dir + trim(correctfilename( S1)))
     else begin
       i := pos (StorageTag,s1);
       if i=0 then Dir := includetrailingpathdelimiter(dir + trim(correctfilename( S1)))
       else begin
         s2 := trim(copy(s1,i+length(StorageTag),length(s1)));
         //if (length(s2)>0) and (s2[length(s2)]=')')  then delete(s2,length(s2),1);

         s1 := copy(s1,1,i-1);
         i := pos('(',s1);
         if i>0 then s1 := copy(s1,1,i-1);

         Dir := includetrailingpathdelimiter(
                   dir +
                   includetrailingpathdelimiter(trim(correctfilename( S1))) +
                   trim(correctfilename( S2)) +

                );
       end;

     end;

     if VARUse_Date_As_SubDir
     then
        Dir := includetrailingpathdelimiter(Dir + formatdatetime('yyyy-mm-dd',date));

     //showmessage(dir);
     ForceDirectories(Dir);
     //if directoryexists(Dir) then Showmessage(Dir+ ' : Exists') else ShowMessage(Dir+ ' :  not exists');
     //showmessage('1');

     cnt := Message.AttachmentCount;
     
     FileList := tstringlist.create;
     try
       stringtolist(Message.AttachmentNames,FileList,';,');
       
       for i := 0 to filelist.count-1 do 
       begin
         s := filelist[i];
  
         if CreateNewFileNameIfExists and fileexists(Dir+S)
         then begin
           S1 := extractfilename(GetUniqueFileName(Dir,S));
         end
         else begin
           s1:= S;
         end;
    
         tmpdir := includetrailingpathdelimiter(createuniquedir);
         Message.SaveAttachment(S,tmpdir);
    
         if useNNProducer
         then begin
           List1 := tstringlist.create;
           try
             List1.loadfromfile(tmpdir+s);
             if list1.count>0 then list1[0] := list1[0] + ' //BVSOFT {NN_PRODUCER}';
             List1.Savetofile(tmpdir+s);
           finally
             List1.free;
           end;
    
         end;
    
         if not CreateNewFileNameIfExists and fileexists(Dir+S)
         then begin
           DeleteFile(Dir+S1); //movefile - не затрет сам
         end;
    
         MoveFile(TmpDir + S,Dir+S1);
         if DoLogFile then AddStringToLog(Dir+S1+ ' ,exists: '+asstring(fileexists(Dir+S1)));
    
         CreateHintI('Поступила заявка из фармнет от '+Message.Sender+'. Вложения сохранены в '+dir);
         Message.IsProcessed := true;
       end;
  
       result := 0; // письмо обработано, дальне обслуживатьь скриптами его не нужно
     finally
       FileLIst.free
     end;


  finally
    //AddressBook := nil;
    //Message := nil;
    if tmpdir >'' then deletedir(tmpdir);
    Message.free;
  end;
end.
