//********************************
// Скрипт импорта заявок, поступающих От программы Solaris.Заказ для Android (автор: Сабитов Владимир)
// http://www.realix.ru/apps/solariszakaz
// Настраивается в параметре "Скрипт импорта почты" в адресной книге для каждого агента
//********************************

const
      CreateNewFileNameIfExists = true; // создавать ли новое имя, если уже существует старое

      PreqTag = 'solariszakaz'; // Эта метка должна стоять для всех заказов. иначе это что-то другое и тогда не юзать.
      UseStoreAsSubdir = true;

      SYSTAGDELIMITER='//BVSOFT';
      SYSTAGNN='{NN}'; // Тэг, указывающий, что в качестве кода товара используется поле tovar.nn (а не tovar.id, как по-умолчанию делается фармнетом)

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 = '';
    
    MailDATE :string;

    i :integer;

    Dir :string;
    S :string;
    S1 :string;
    S2 :string;
    SenderName :string = '';

    PreqTagPos :integer;

    fname :string;
    tmpDir :string = '';

    //Table :TAdoTable;
    StorageName :string;

	  strval :string;
 
    List :Tstringlist = nil;
    List1 :Tstringlist = nil;
    //List2 :tstringlist;
    
    JSonObject :TJSONObject = nil;
    JSonObject1 : TJSonObject = nil;
    JSonPair :TJSONPair = nil;
    JSonArray : TJSONArray = nil;
    i :integer;
     
begin

  Message := TMailMessage.create; // CreateOleObject('MailProcessor.MPMailMessage');
  try

     Message.ID := asfloat(VARID);

     PreqTagPos := pos(PreqTag,Message.Subject);
     if  (PreqTagPos=0) then exit;

     //if Message.AttachmentCount<>1 then exit; // заблокируем, если количество вложений <>1 

     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;

     tmpdir := includetrailingpathdelimiter(createuniquedir);
     

     list := tstringlist.create;
     list1 := tstringlist.create;
     //list2 := tstringlist.create;
     try 
       
       stringtolist(s,list,';');
       
       for i := 0 to list.count-1 do 
       begin
          s := list[i];

           
          if ansiuppercase(extractfileext(s))='.JSON'
          then begin
  
            Message.SaveAttachment(S,tmpdir);
            
            with Tstringlist.create do 
            try
               LoadFromFileUTF8(tmpdir+s);
               JSonObject := TJsonObject(ParseJSONValue(Text));
            finally
               free
            end;
            
            if JSonObject=nil
            then begin
               createhintw('Не могу распознать содержимое файла '+ s );
               continue;
            end
            else 
            try

               JSonPair := jsonobject.GetByName('agent1');
               if JSonPair<>nil then OrgName:=  JSonPair.JsonValue.Value  else OrgName := '';
               JSonPair := jsonobject.GetByName('agent2');
               if JSonPair<>nil then StorageName := JSonPair.jsonvalue.value else StorageName := '';

               JSonPair := jsonobject.GetByName('datetime');
               if JSonPair<>nil then MailDate := JSonPair.jsonvalue.value else MailDate  := '';

               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);
               
               if orgname<>'' then 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  S1 := extractfilename(GetUniqueFileName(Dir,extractfilenamewithoutext(S)+'.txt'))
               else  s1:= extractfilenamewithoutext(S)+'.txt';
               

               JSonPair := jsonobject.getbyname('data');
               if (jsonpair<>nil) and (JSonPair.JsonValue<>nil)
               then begin
               
                 list1.clear;
      
                 list1.add('Заказчик : '+orgname+ SYSTAGDELIMITER + SYSTAGNN);
                 List1.add('Комментарий к заявке : '+StorageName);
                 
                 //List1.add('Время отправления : '+asstring(DBQueryValue('select created from mail_messages where id = :id',[VARID])));
                 List1.add('Время отправления : '+maildate); // asstring(DBQueryValue('select created from mail_messages where id = :id',[VARID])));

               
      
                 JSonArray := tjsonarray(JSonPair.JsonValue);
                 for i := 0 to JSonArray.Size-1 do
                 begin
                   JSonObject1 := tjsonobject(JSonArray.Get(I));
                   if JSonObject1<>nil then 
                   begin
                     strval := ''; 
                     JSonPair := JSonObject1.getByName('kol');
                     if JSonPair<>nil then strval := jsonPair.jsonvalue.value;
                     strval := strval + #9;
  
                     JSonPair := JSonObject1.getbyName('code');
                     if JSonPair<>nil then strval := strval + jsonPair.jsonvalue.value;
                     strval := strval + #9;
                     
                     JSonPair := JSonObject1.getbyName('name');
                     if JSonPair<>nil then strval := strval + jsonPair.jsonvalue.value;
                     strval := strval + #9;
                     
                     strval := strval + #9; // производитель пустой
                     
                     JSonPair := JSonObject1.getByName('cena');
                     if JSonPair<>nil then strval := strval + jsonPair.jsonvalue.value
                     else begin
                       JSonPair := JSonObject1.getByName('price');
                       if JSonPair<>nil then strval := strval + jsonPair.jsonvalue.value;
                     end;

                     strval := strval + #9; // закроем поле, чтобы, если даже оно пропущено, принялось как пустое

                     //JSonPair := JSonObject1.getByName('ostat');
                     //if JSonPair<>nil then createhint('ostat= '+jsonPair.jsonvalue.value);

                     
                     List1.add( strval);
                   end;
                 end;
      
                 LIST1.savetofile(tmpdir+ s1);
              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)));
               
            finally
               JSonObject.free
            end;
          end;
       end
     finally
       //List2.free;
       list1.free;
       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.
