//********************************
// Скрипт импорта заявок, поступающих От Медуницы.
// Настраивается в параметре "Скрипт импорта почты" в адресной книге
//********************************

const
      CreateNewFileNameIfExists = true; // создавать ли новое имя, если уже существует старое

      PreqTag = 'Заявка от Медуница'; // Эта метка должна стоять для всех заказов. иначе это что-то другое и тогда не юзать.
      UseStoreAsSubdir = true;

      SYSTAGDELIMITER='//BVSOFT';
      SYSTAGNN_PRODUCER='{NN_PRODUCER}';

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;

    ORGNAME :string = 'Медуница';

    i :integer;

    Dir :string;
    S :string;
    S1 :string;
    S2 :string;
    SenderName :string;

    PreqTagPos :integer;

    List1 :TSTringLIst;
    fname :string;
    tmpDir :string = '';

    //Table :TAdoTable;
    Table :TDBF;
    StorageName :string;

	  strval :string;
 
    List :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;


     s := Message.AttachmentNames;

     table := tDBF.create(selfscript);

     tmpdir := includetrailingpathdelimiter(createuniquedir);

     list := tstringlist.create;
     try  // .DBF
       
       stringtolist(s,list,';');
       
       for i := 0 to list.count-1 do 
       begin
           s := list[i];

           Message.SaveAttachment(S,tmpdir);

           table.close;              
           table.tablename := tmpdir + s;
  
           //CheckDBFCP(tmpdir+S,87,true);
  
           (*
           AdoTable := TAdoTable.create(selfscript);
           AdoTable.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "'+tmpdir+'";Extended Properties="Driver={Microsoft dbase Driver};UID=;SourceDB=;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=RUSSIAN;Null=Yes;Deleted=Yes";Persist Security Info=False;Jet OLEDB:Engine Type=17;OLE DB Services=-2';
           AdoTable.tableName := '['+s+']';
           *)
  
           Table.open;
           if table.IsEmpty
           then begin
             createhintw('Таблица '+ s + ' во вложении пуста');
             continue;
           end;
           
           table.first;
           StorageName := table.fieldbyname('podr').asstring;
           
           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);
           Dir := includetrailingpathdelimiter(dir + trim(correctfilename( OrgName)));

           if UseStoreAsSubDir
           then begin
               Dir := includetrailingpathdelimiter(dir + trim(correctfilename( StorageName)));
           end;
      
           if VARUse_Date_As_SubDir
           then
              Dir := includetrailingpathdelimiter(Dir + formatdatetime('yyyy-mm-dd',date));
      
           ForceDirectories(Dir);
  
           if CreateNewFileNameIfExists and fileexists(Dir+extractfilenamewithoutext(S)+'.txt')
           then begin
             S1 := extractfilename(GetUniqueFileName(Dir,extractfilenamewithoutext(S)+'.txt'));
           end
           else begin
             s1:= extractfilenamewithoutext(S)+'.txt';
           end;
  
           table.first;
  
           list1 := tstringlist.create;
           try
           
  		         //strval := message.subject;
        		   //strval := copy(strval,pos(' ',strval)+1,length(strval));
        		   //strval := copy(strval,1,pos(' ',strval)-1);
  
             list1.add('Заказчик : '+orgname + SYSTAGDELIMITER + SYSTAGNN_PRODUCER);
             List1.add('Комментарий к заявке : '+StorageName);
             List1.add('Время отправления : '+Table.Fieldbyname('DateZ').asstring);
  
             while not Table.eof do begin
               List1.add(
                 Table.Fieldbyname('QNT').asstring+#9+
                 Table.fieldbyname('codepst').asstring+#9+
                 Table.fieldbyname('name').asstring+#9+
                 ''+#9+ // Здесь должен был быть производитель, но они его не дали. в txt - давали
                 Table.fieldbyname('price2').asstring
                 );
  
               Table.next;
             end;
  
  
             LIST1.savetofile(tmpdir+ s1);
          finally
             list1.free;
          end;
  
          if not CreateNewFileNameIfExists and fileexists(Dir+S1)
          then begin
             DeleteFile(Dir+S1); //movefile - не затрет сам
          end;
  
          MoveFile(TmpDir + S1,Dir+S1);
          if DoLogFile then AddStringToLog(Dir+S1+ ' ,exists: '+asstring(fileexists(Dir+S1)));
           
          table.close;
       end
     finally
       list.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.
