// скрипт загрузки заявки из формата, адаптированного под Фармнет.
// Предполагается, что заявки пришли на майлпроцессор и были адаптированы под один формат (переформатированы) фармнетовский стандартный,
// и сложены в один каталог, в подкаталоги согласно названию фирмы, далее - торговая точка. Дальше могут быть каталоги-даты (опц-но).
// в качестве кода товара приходит ID_GOODS и, возможно, последним полем ID_PRODUCER (опц-но). Все другие форматы подведены под этот
// на этапе извлечения из mailprocessor его спец.скриптами выгрузки
//const
//  LoadFromMP = false;

var
  id_goods_type :integer = 2; //0: не брать код товара, 1: код товара - поле tovar.nn, 2: код товара - поле tovar.id
  producer_in_id :boolean = false;


const
  SYSTAGDELIMITER='//BVSOFT';
  SYSTAGNN_PRODUCER='{NN_PRODUCER}';


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

VAR
 VariantName :string; // имя варианта в программе
 VariantFile :string; // файл-скрипт
 Dataset :tdataset; // формируемый файл заявки, уже открыт, нужно заполнить. Структуру можно изучить непосредственно в окне импорта, он и есть таблица, отображаемая на экране
 DateDoc :tdatetime;  // дата документа, будет сохранено в накладной
 TimeDoc :TDatetime;
 numberdoc :string;  // номер документа
 id_org :integer;  // код организации-заказчика в нашей базе
 id_org1 :integer;  // код подразделения в нашей базе
 name_org :string;  // наименование организации-заказчика
 name_org1 :string;  // наименование подразделения
 Info :string; // Дополнительная информация


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

  checkNotUsed :TCheckBox;

  ds :TDatasource;


  StrValue :string;


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

  //TableGOods, TableProducer :ttable;

  firstrec :integer;

const
   dbname = 'importpreqfiles.db';


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

    TimeDoc := FileDateTime(filename);

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

    numberdoc := extractfilenamewithoutext(filename);


    StrValue := List[0];


    i :=  pos(SYSTAGDELIMITER,strvalue);
    if i>0
    then begin
      if  pos(systagnn_producer,strvalue)<>0
      then begin
        id_goods_type := 1;
        producer_in_id := true;
      end;

      strvalue := copy(strvalue,1,i-1);
    end;

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

    strvalue := trim(copy(strvalue,9,length(strvalue)));

    i := pos(':',strvalue);
    if i>0
    then strvalue := trim(copy(strvalue,i+1,length(strvalue)));

    strvalue1 := '';
    i := pos('ФИЛИАЛ',ansiuppercase(StrVAlue));
    if i>0
    then begin
      StrValue1 := trim(copy(StrVAlue,i+7,length(StrValue)));
      if STrVAlue1<>''
      then begin
        i := pos(':',strvalue1);
        if i>0 then strvalue1 := trim(copy(strvalue1,i+1,length(strvalue1)));

        if StrVAlue1[length(StrValue1)]=')' then delete(StrVAlue1,length(strVAlue1),1);
        StrValue := trim(copy(StrValue,1,pos('(',StrVAlue)-1));
      end;
    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  or upper(CODE) = :p_name  or upper(CODE1) = :p_name ';
        Query.parambyname('p_name').asstring := StrValue;
        Query.open;
        if Query.isempty
           //and  (GetConfirm('Не найден заказчик с таким именем, укороченным именем, альт.кодом, альт.кодом-1: '+StrValue+'. Вы хотите продолжить?','','Продолжить','Отмена') <> mrOk)
        then CreateHintW('Не найден заказчик с таким именем, укороченным именем, альт.кодом, альт.кодом-1: '+StrValue);
          //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 >'')
    then begin
       Info := strvalue;
    end;


    StrValue := List[2];
    if pos(':',strvalue)>0
    then begin
      strvalue := trim(copy(strvalue,pos(':',strvalue)+1,length(strvalue)));
      if pos(' ',strvalue)>0   then strvalue := copy(strvalue,1,pos(' ',strvalue)-1);
      datedoc := strtodateprotected(strvalue);
      //createhinti(strvalue+' : '+datetimetostr(datedoc));
    end;

    (*
    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;

      StringToList(List[3],List1,#09);

      if list1.count<5 then
      begin
        CreateHintW('В таблице заказа должно быть не менее 5 полей');
        exit;
      end;


      useFormInName := (list1.count>5) and (list1[4]>'') and not validfloat(list1[4]);


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

         if list1.count<5 then
         begin
          CreateHintW('В таблице заказа должно быть не менее 6 полей (строка '+inttostr(i-2)+')');
          exit;
         end;


         begin


           Quantity := strtointprotected(List1[0]);

           //if id_goods_type = 0
           //then  id_goods := ''
           //else
           begin
             id_goods := trim(list1[1]);
             id_producer := '';

             if (id_goods_type = 2) and (pos('_',id_goods)>0) then producer_in_id := true;

             if (id_goods>'')
             THEN BEGIN
               if producer_in_id
               then begin
                 i := pos('_',id_goods);
                 if i>0
                 then begin
                   id_producer := copy(id_goods,i+1,length(id_goods));
                   id_goods := copy(id_goods,1,i-1);
                 end;
               end;


               if (id_goods_type = 2) and  (strtointprotected(id_goods)<>0)
               then begin
                 id_goods := asstring(BDEQueryValue('select nn from tovar where id = :id ',[strtointprotected(id_goods)],'dbkassa'));
               end
             END;

           end;


           if useforminname
           then begin
             name_goods := trim(List1[2]+' '+list1[3]);
             name_producer := trim(List1[4]);
           end
           else begin
             name_goods := trim(List1[2]);
             name_producer := trim(List1[3]);
           end;

           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;

           if useforminname then i1 := 5
           else i1 := 4;

           price := strtofloatprotected(List1[i1]);

           if (list1.count>i1+1) and (id_producer='') then id_producer := list1[i1+1];



           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;

           if id_goods<>''
           then dataset.fieldbyname('id_tovar').asstring := id_goods;

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


           dataset.post;

         end

      end;

    finally
      List1.free;
    end;

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

  finally
    List.free;
  end;
end;


var
  Form :TForm;
  Grid :tbvdbgrid;
  Panel0,Panel1,Panel2 :tpanel;
  button1 :tbutton;

  cds :tclientdataset = nil;

  label1,label2 :Tlabel;
  labrecc :tlabel;
  EditDir :TEdit;
  BtnEdit1 :tspeedbutton;

  taLog :ttable;

  menu :tpopupmenu;
  mi :tmenuitem;

  procedure ShowPreqList;
  var List :tstringlist;
      i :integer;
      dt,dt1 :tdatetime;
      strval :string;
      ipos :integer;
  begin
    with tmywait.create1('Идет сбор информации',Selfscript) do
    try
      while not cds.isempty do cds.delete;

      if editdir.text>''
      then begin
        editdir.text:= includetrailingpathdelimiter(editdir.text);
        list := tstringlist.create;
        try
          GetFileList(EditDir.text,List,'*.txt',false,true);

          for i := 0 to List.count-1 do
          begin
            dt := FileDateTime(editdir.text+ List[i]);



            if talog.findkey([ansiuppercase(editdir.text + list[i])])
            then dt1 :=  taLog.fieldbyname('dt').asdatetime
            else dt1 := 0;

            if (dt1=0) or not checknotused.checked then
            begin

              cds.append;
              cds.fieldbyname('Дата').asdatetime := dt;
              cds.fieldbyname('Часов').asinteger := hoursbetween(now,dt);
              cds.fieldbyname('Минут').asinteger := minutesbetween(now,dt);
              cds.fieldbyname('Файл').asstring := List[i];

              if dt1<>0 then  cds.fieldbyname('Принято').asdatetime := dt1;

              strval := list[i];
              ipos := pos('\',strval);
              if ipos>0 then begin
                cds.fieldbyname('Покупатель').asstring :=  copy(strval,1,ipos-1);
                strval := copy(strval,ipos+1,length(strval));

                ipos := pos('\',strval);
                if ipos>0
                then begin
                  cds.fieldbyname('Грузополучатель').asstring :=  copy(strval,1,ipos-1);
                end;

              end;

              cds.post;
            end;

          end;

          cds.first;
          LabREcC.caption := 'Записей: '+inttostr(cds.recordcount);
        finally
         list.free
        end;
      end;
    finally
      free
    end;
  end;


  procedure OnBtnEditClick(Sender :TObject);
  var CurrDir :string;
  begin
    currDir := EditDir.text;
    if SelectDirectory('Выберите каталог с заявками', '', Currdir)
    then begin
      EditDir.text := CurrDir;
      showPreqList;
    end;
    //SelectDirectory1(var Directory: string; AllowCreate :boolean; PerformCreate :boolean; Prompt :boolean) :boolean
  end;

  procedure GridKeyPress(Sender: TObject; var Key: Char);
  begin
    if Key = #13
    then begin
      form.close;
      form.modalresult := mrOk;
    end;
  end;

  procedure MenuItemClick(Sender :TObject);
  var strval :string;
  begin
     strval := editdir.text + cds.fieldbyname('Файл').asstring;
     if not fileexists(strval) then createhinte('Файл '+strval+' не найден')
     else  begin
       strval := '"'+strval+'"';
       createhint('Открытие файла: '+strval);
       fileexecute(Strval,esnormal);
     end;
  end;

  procedure GridDBLClick(Sender :TObject);
  begin
      form.close;
      form.modalresult := mrOk;
  end;

  procedure GridGetCellParams(Sender: TObject; Field: TField; AFont: TFont;
    var Background: TColor; Highlight: Boolean);
  begin
    if (cds<>nil) and  cds.active and ( cds.fieldbyname('Принято').asdatetime=0)
    then  AFont.style := AFont.style + fsBold;
  end;


  procedure OnCheckNotUsedClick(Sender :TObject);
  begin
     if cds.active then ShowPreqList;
  end;


var
  fname :string;
begin

  taLog := ttable.create(selfscript);
  talog.databasename := 'dbkassa';
  talog.tablename := dbname;
  if not fileexists(includetrailingpathdelimiter(getaliaspath('dbkassa'))+talog.tablename)
  then begin
    bdeexecsql('create table ":dbkassa:'+dbname+'" (filename varchar(200),dt date, primary key (filename))',[null],'dbkassa');
  end;
  try
    BDECheckPrimaryIndex(talog,'filename',tmywait(nil));
  except
  end;
  talog.open;


  Form := TForm.create(selfscript);

  form.Position := poDesigned;
  form.top := AppIniFile.readinteger('farmnet_load','form_top',150);
  form.left := AppIniFile.readinteger('farmnet_load','form_left',50);
  form.width := AppIniFile.readinteger('farmnet_load','form_width',900);
  form.height := AppIniFile.readinteger('farmnet_load','form_height',500);
  form.showhint := true;


  Panel0 :=  Tpanel.create(form);
  with Panel0 do
  begin
     align := alTop;
     height := 40;
     parent := Form;
     bevelouter := bvnone;
  end;

  BtnEdit1 := tspeedbutton.create(form);
  with BtnEdit1 do
  begin
    parent := panel0;
     top := (panel0.height - height) div 2;
    width := 100;
    left := 10;
    caption := 'Обновить';
    hint := 'Обновить';
    OnClick := 'OnCheckNotUsedClick';
  end;


  label1 := tlabel.create(form);
  with label1 do
  begin
     parent := panel0;
     caption := 'Каталог с заявками: ';
     top := (panel0.height - height) div 2;
     left := BtnEdit1.left + BtnEdit1.width + 10;
  end;

  EditDir := tEdit.create(form);
  with EditDir do
  begin
     parent := Panel0;
     top := (panel0.height - height) div 2;
     left := label1.left + label1.width + 10;
     width := 300;
     enabled := false;
     text := AppIniFile.readstring('farmnet_load','currdir','');
  end;

  BtnEdit1 := tspeedbutton.create(form);
  with BtnEdit1 do
  begin
    parent := panel0;
    top := EditDir.top;
    height := editDir.height;
    width := editDir.height;
    left := editDir.left + editDir.width + 5;
    caption := '...';
    hint := 'Выбрать каталог заявок';
    OnClick := 'OnBtnEditClick';
  end;


  CheckNotUsed := tcheckbox.create(form);
  with CheckNotUsed do begin
    caption := 'Только не обработанные';
    parent := panel0;
    Top := (panel0.height - checknotused.height) div 2;
    Left := BtnEdit1.left + BtnEdit1.width + 10;
    width := 150;
    checked := appinifile.readbool('farmnet_load','checknotused',false);
    OnClick := 'OnCheckNotUsedClick';
    end;

  panel1 := tpanel.create(form);
  with panel1 do
  begin
     align := albottom;
     height := 40;
     parent := Form;
     bevelouter := bvnone;
  end;

  labrecc := tlabel.create(form);
  with labrecc do
  begin
    parent := panel1;
    top := 5;
    left := 5;
    caption := '';
  end;


  Panel2 := Tpanel.create(form);

  with Panel2 do
  begin
     align := alright;
     width := 200;
     parent := Panel1;
     bevelouter := bvnone;
  end;

  button1 :=  tbutton.create(form);
  with button1 do
  begin
    parent := panel2;
    left := 2;
    top := (panel2.height - height) div 2;
    modalresult:= mrok;
    Default := true;
    caption := 'Принять';
  end;

  with tbutton.create(form) do
  begin
    parent := panel2;
    left := button1.left + button1.width + 5;
    top := button1.top;
    modalresult := mrcancel;
    caption := 'Отмена';
  end;



  cds := tclientdataset.create(form);

  Grid := tbvdbgrid.create(form);
  with Grid do
  begin
    align := alclient;
    parent := form;
    datasource := tdatasource.create(form);
    datasource.dataset := cds;
    onkeypress := 'GridKeyPress';
    ondblclick := 'GridDblClick';
    ongetcellparams := 'GridGetCellParams';
  end;



  menu := tpopupmenu.create(form);
  mi := tmenuitem.create(form);
  mi.caption := 'Просмотр файла';
  mi.shortcut := 113;
  mi.onclick := 'menuitemclick';
  menu.items.add(mi);

  form.popupmenu := menu;
  grid.popupmenu := menu;


  grid.loaded;

  cds.fielddefs.clear;
  cds.fielddefs.add('Дата',ftdatetime,0,false);
  cds.fielddefs.add('Часов',ftInteger,0,false);
  cds.fielddefs.add('Минут',ftInteger,0,false);
  cds.fielddefs.add('Принято',ftdate,0,false);
  cds.fielddefs.add('Покупатель',ftstring,100,false);
  cds.fielddefs.add('Грузополучатель',ftstring,250,false);
  cds.fielddefs.add('Файл',ftstring,300,false);
  cds.createdataset;
  cds.indexfieldnames := 'Часов;Минут';

  grid.restoregrid;

  form.activecontrol := grid;

  showPreqList;

  form.showmodal;
  grid.savegrid;
  AppIniFile.writeinteger('farmnet_load','form_top',form.top);
  AppIniFile.writeinteger('farmnet_load','form_left',form.left);
  AppIniFile.writeinteger('farmnet_load','form_width',form.width);
  AppIniFile.writeinteger('farmnet_load','form_height',form.height);
  AppIniFile.writestring('farmnet_load','currdir',editDir.text);
  appinifile.writebool('farmnet_load','checknotused',checknotused.checked);

  if (form.modalresult<> mrOk)
     or cds.isempty
  then exit;

  fname := ansiuppercase(editdir.text + cds.fieldbyname('Файл').asstring);
  bdelocktable(talog);
  try
    if talog.findkey([fname])
    then taLog.edit
    else begin
      talog.append;
      talog.fieldbyname('filename').asstring := fname;
    end;

    talog.fieldbyname('dt').asdatetime := date();
    talog.post;
  finally
    bdeunlocktable(talog);
    bdeflush;
  end;


  LoadFromFile(Fname);


end.
