// Скрипт импорта накладной из ПАНДА

const UseBarcode = true; // определяет, будет ли использоваться штрихкод, поставляемый поставщиком


var
    Header :TStringList; // предопределена приложением
    Data :TStringList; // предопределена приложением
    ExportAgent :string; // все определены приложением
    FileName :string;

    ExportAgentName :string;
    ExportNakladNom :string;
    ExportNakladID_DOC :string;
    ExportNakladData :string;
    ExportNakladSklad :string;
    ExportSkladName :string;
    EXPORTNAKLADSROK :string;

var Table :TDBF;//TTable;
    num_doc :string;
    Item :variant;
    i,k :integer;
    tmpname :string;
    OpenDialog :TOpenDialog;
    ThF :TField;
    str,str1 :string;
    Field :TField;
    FPrice_Reg :TField;
    FBarcode :TField;

    List :TStringList;
    List1 :TSTringList;
    List2 :Tstringlist;

    function StrToDTStr( str :string) :string;
    begin
      if length(str)<>8
      then begin
        result := str;
      end
      else begin
        result := copy(str,7,2)+'.'+copy(str,5,2)+'.'+ copy(str,1,4);
      end;
    end;

    function GetItemValue(Item :Variant; Name :String) :string;
    begin
       try
         result := vartostr(Item.attributes.getNamedItem(Name).value);
       except
         result := ''
       end;
    end;

    function IFSTR(BoolVal :boolean; const TrueVal :string; const FAlseVal :string = '') :string;
    begin
      if BoolVal then Result := TrueVal
      else Result := FalseVal;
    end;

    procedure AddStr(var Destination :string; FieldNameList :tstringLIst; const FieldName :string; FieldValueList :TStringlist);
    var j :integer;
    begin
      j := FieldNameList.indexof(FieldName);
      //createhint('i='+inttostr(i)+',Name =' +FieldName+',NC ='+inttostr(FieldNamelist.count)+', VC='+inttostr(fieldvaluelist.count));
      if j>=0
      then Destination := Destination + FieldValueList[j];
      Destination := Destination + #9;
    end;

 begin
     //FileName := '';
     if filename = '' 
     then begin
       OpenDialog := TOpenDialog.create(nil);
       try
         OpenDialog.Title := 'Укажите файл';
         OpenDialog.FileName  := AppIniFile.readstring('plugins_panda','filename','');
         opendialog.initialdir := extractfilepath(opendialog.filename);
         OpenDialog.Filter := 'Файлы-накладные(*.dbf,*.txt)|*.dbf;*.txt|Все файлы(*.*)|*.*';
         while  OpenDialog.execute do begin
           if not fileexists(OpenDialog.FileName) then CreateHint('Укажите правильно файл ')
           else begin
             Filename := OpenDialog.FileName;
             AppIniFile.writestring('plugins_panda','filename',OpenDialog.filename);
             break;
           end;
         end;
       finally
         OpenDialog.free;
       end;
     end;

     if FileName = '' then exit;

     with TMyWait.create('Идет импорт накладной') do
     try

       if uppercase(extractfileext(filename))='.DBF'
       then begin
         //createhintw('Не реализовано, обратитесь в техподдержку');
        // exit;




         Table := TDBF.create(nil);// TTable.Create(nil);
         try

          //table.tabletype := ttFoxpro;

          tmpname := gettempdir + extractfilename(FileName);
          filedelete(tmpname);
          //Table.tabletype := ttfoxpro;
          copyfile(FileName,tmpname,False);
          //SetTableLangDriver(Table,'db866ru0');
          
          CheckDBFCP(tmpname,38); //866DOS

          table.tablename := tmpname;
          Table.Open;
          Table.First;

          data.Clear;

          if table.findfield('NDOCe') <> nil
          then begin
             Header.Values[ExportNakladNom] := table.fieldbyname('NDOCe').asstring;
             Header.Values[ExportNakladData] := table.fieldbyname('DATEDOCe').asstring;

              data.Add(
              'srok'+#9+
              'sroksertif'+#9+
              'sertifname'+#9+
              'kol'+#9+
              'nds'+#9+
              'name'+#9+
              'firstcena'+#9+
              'seria'+#9+
              'sertif'+#9+
              'producername'+#9+
              'datesertif'+#9+
              'tamog'+#9+
              'countryname'+#9+
              'regn'+#9+ //+'cenanotnds'
              'barcode'+#9+
              'summa'+#9+
              'price_reg');

              FPrice_reg := table.findfield('reestr');

              if UseBarcode then
                FBarcode := Table.findfield('barcode')
              else
                FBarcode := nil;


              while not Table.eof do begin

                try
                  str1 := table.fieldbyname('docend').asstring;

                  (* устарело
                      formatdatetime('dd.mm.yyyy',
                      EncodeDate(
                        strtoint(Copy( Table.FieldByName('docend').AsString,1,4)),
                        strToInt(Copy( Table.FieldByName('docend').AsString,5,2)),
                        strToInt(Copy( Table.FieldByName('docend').AsString,7,2))
                      ))  *);


                except
                  str1  := '';
                end;

                str :=
                   Table.FieldByName('dataendtov').AsString+#9+
                   Str1 +#9+
                   Table.FieldByName('centrsert').AsString+#9+
                   Table.FieldByName('amount').AsString+#9+
                   Table.FieldByName('nds').AsString+#9+
                   Table.FieldByName('name').AsString+#9+
                   Table.FieldByName('price1').asstring+#9+
                   Table.FieldByName('seria').AsString+#9+
                   Table.FieldByName('numdoc').AsString+#9+
                   Table.FieldByName('manufac').AsString+#9+
                   Table.FieldByName('docd').AsString+#9+
                   Table.FieldByName('gtd').AsString+#9+
                   Table.FieldByName('country').AsString+#9+
                   Table.FieldByName('regn').AsString+#9;

                if (FBarcode<>nil)
                then Str := Str + FBarcode.asstring;
                Str := Str + #9;

                Str := Str + Table.FieldByName('SUMPAY').AsString;
                Str := Str + #9;

                if (FPrice_Reg<>nil) and (FPrice_Reg.asFloat <>0)
                then Str := Str +FPrice_Reg.asstring;
                // else оставляем пустым

                data.Add(str);
                Table.Next;
              end;

          end
          else
          if (table.findfield('NDOC') <> nil)  and (table.findfield('PRICEF') <> nil)
          then begin
             Header.Values[ExportNakladNom] := table.fieldbyname('NDOC').asstring;
             Header.Values[ExportNakladData] := StrTodtStr( table.fieldbyname('DATEDOC').asstring);
             //Header.Values[ExportNakladSROK] := strtodtstr( table.fieldbyname('datepay').asstring);

              data.Add(
              'srok'+#9+
              'sroksertif'+#9+
              'sertifname'+#9+
              'kol'+#9+
              'nds'+#9+
              'name'+#9+
              'firstcena'+#9+
              'seria'+#9+
              'sertif'+#9+
              'producername'+#9+
              'datesertif'+#9+
              'tamog'+#9+
              'countryname'+#9+
              'regn'+#9+ //+'cenanotnds'
              'barcode'+#9+
              'summa'+#9+
              'price_reg');

              FPrice_reg := table.findfield('reestr');

              if UseBarcode then
                FBarcode := Table.findfield('barcode')
              else
                FBarcode := nil;


              while not Table.eof do begin
              str :=
                   Table.FieldByName('GDATE').AsString+#9+
                   table.fieldbyname('SERTDATE').asstring +#9+
                   Table.FieldByName('SERTORG').AsString+#9+
                   Table.FieldByName('QNT').AsString+#9+
                   Table.FieldByName('nds').AsString+#9+
                   Table.FieldByName('NAME').AsString+#9+
                   Table.FieldByName('PRICEF').asstring+#9+
                   Table.FieldByName('SER').AsString+#9+
                   Table.FieldByName('SERTIF').AsString+#9+
                   Table.FieldByName('FIRM').AsString+#9+
                   {Table.FieldByName('dates').AsString+}#9+
                   {Table.FieldByName('gtd').AsString+}#9+
                   {Table.FieldByName('country').AsString+}#9+
                   {Table.FieldByName('regn').AsString+}#9;

                if (FBarcode<>nil)
                then Str := Str + FBarcode.asstring;
                Str := Str + #9;

                Str := Str + Table.FieldByName('SUMPAY').AsString;
                Str := Str + #9;

                if (FPrice_Reg<>nil) and (FPrice_Reg.asFloat <>0)
                then Str := Str +FPrice_Reg.asstring;
                // else оставляем пустым

                data.Add(str);
                Table.Next;
              end;
              
              //data.savetofile('c:\temp\1.sql');

          end
             else
          if (table.findfield('NDOC') <> nil)  and (table.findfield('PRICE2') <> nil)
          then begin
             Header.Values[ExportNakladNom] := table.fieldbyname('NDOC').asstring;
             Header.Values[ExportNakladData] := StrTodtStr( table.fieldbyname('DATEDOC').asstring);
             //Header.Values[ExportNakladSROK] := strtodtstr( table.fieldbyname('datepay').asstring);

              data.Add(
              'srok'+#9+
              'sroksertif'+#9+
              'sertifname'+#9+
              'kol'+#9+
              'nds'+#9+
              'name'+#9+
              'firstcena'+#9+
              'seria'+#9+
              'sertif'+#9+
              'producername'+#9+
              'datesertif'+#9+
              'tamog'+#9+
              'countryname'+#9+
              'regn'+#9+ //+'cenanotnds'
              'barcode'+#9+
              'summa'+#9+
              'price_reg');

              FPrice_reg := table.findfield('reestr');

              if UseBarcode then
                FBarcode := Table.findfield('barcode')
              else
                FBarcode := nil;


              while not Table.eof do begin
              str :=
                   Table.FieldByName('GDATE').AsString+#9+
                   table.fieldbyname('SERTDATE').asstring +#9+
                   Table.FieldByName('SERTORG').AsString+#9+
                   Table.FieldByName('QNT').AsString+#9+
                   Table.FieldByName('nds').AsString+#9+
                   Table.FieldByName('NAME').AsString+#9+
                   Table.FieldByName('PRICE1').asstring+#9+
                   Table.FieldByName('SER').AsString+#9+
                   Table.FieldByName('SERTIF').AsString+#9+
                   Table.FieldByName('FIRM').AsString+#9+
                   {Table.FieldByName('dates').AsString+}#9+
                   Table.FieldByName('NUMGTD').AsString+#9+
                   Table.FieldByName('CNTR').AsString+#9+
                   {Table.FieldByName('regn').AsString+}#9;

                if (FBarcode<>nil)
                then Str := Str + FBarcode.asstring;
                Str := Str + #9;

                Str := Str + Table.FieldByName('SUMS0').AsString;
                Str := Str + #9;

                if (FPrice_Reg<>nil) and (FPrice_Reg.asFloat <>0)
                then Str := Str +FPrice_Reg.asstring;
                // else оставляем пустым

                data.Add(str);
                Table.Next;
              end;
              
              //data.savetofile('c:\temp\1.sql');

          end
          else begin
            raiseexception('Таблица имеет формат, не согласованный с поставщиком. Обратитесь в техподдержку');
          end;

         finally
            Table.free;
         end;
       end
       else if uppercase(extractfileext(filename))='.TXT'
       then begin


         List := Tstringlist.create;
         List1 := Tstringlist.create;
         LIst2 := Tstringlist.create;
         try

          List.loadfromfile(filename);
          //if (list.count<3) or (pos('DATE_ORDER;NUM_ORDER;DATE_TO_PAID;ORDER_SUM;ORDER_NDS_SUM',list[0])=0)
          //then
          //  raiseexception('Таблица имеет формат, не согласованный с поставщиком. Обратитесь в техподдержку');

          StringtoList( list[1],List2,';');

          if list2.count<3
          then
            raiseexception('Таблица имеет формат, не согласованный с поставщиком (количество полей в заголовке = '+inttostr(list2.count)+'). Обратитесь в техподдержку');


          Header.Values[ExportNakladNom] := List2[0];
          Header.Values[ExportNakladData] := List2[1];
          //Header.Values[ExportNakladSROK] := List2[2];

          //StringtoList( list[2],List1,';');

          //
          //
          // Тело - код товара; наименование; кол-во в упаковке;
          // код производителя (по базе поставщика); производитель; страна производства;
          //ГТД; кол-во; цена производителя с НДС; ставка НДС; НДС позиции;
          // цена поставщика без НДС; сумма позиции с НДС; серия; сертификат;
          // дата сертификата; срок сертификата; орган сертификации (кем выдан);
          //срок годности товара (дата)


          data.Clear;

          data.Add('name'+#9+'em'+#9+
            'producername'+#9+
            'countryname'+#9+
            'tamog'+#9+
            'kol'+#9+
            'firstcenaplusnds'+#9+
            'nds'+#9+
            'summa'+#9+
            'seria'+#9+'sertif'+#9+
            'datesertif'+#9+
            'sroksertif'+#9+
            'sertifname'+#9+
            'srok');


          (*
          data.Add('srok'+#9+'sroksertif'+#9+'sertifname'+#9+
            'kol'+#9+'nds'+#9+
            'name'+#9+'firstcenaplusnds'+#9+'seria'+#9+'sertif'+#9+
            'producername'+#9+
            'datesertif'+#9+
            'tamog'+#9+
            'countryname'+#9+
            'regn'+#9+ //+'cenanotnds'
            'barcode'+#9+'price_reg');
          *)


          for i := 1 to list.count-1 do
          begin
            StringtoList( list[i],List2,';');

            //if list2.count=List1.count
            //then
            begin

          // Тело - код товара; наименование; кол-во в упаковке;
          // код производителя (по базе поставщика); производитель; страна производства;
          //ГТД; кол-во; цена производителя с НДС; ставка НДС; НДС позиции;
          // цена поставщика без НДС; сумма позиции с НДС; серия; сертификат;
          // дата сертификата; срок сертификата; орган сертификации (кем выдан);
          //срок годности товара (дата)


          (*
          data.Clear;

          data.Add('name'+#9+'em'+#9+
            'producername'+#9+
            'countryname'+#9+
            'tamog'+#9+
            'kol'+#9+
            'firstcenaplusnds'+#9+
            'nds'+#9+
            'summa'+#9+
            'seria'+#9+'sertif'+#9+
            'datesertif'+#9+
            'sroksertif'+#9+
            'sertifname'+#9+
            'srok'); *)


              Str := '';

          // Тело - код товара; наименование; кол-во в упаковке;
          // код производителя (по базе поставщика); производитель; страна производства;
          //ГТД; кол-во; цена производителя с НДС; ставка НДС; НДС позиции;
          // цена поставщика без НДС; сумма позиции с НДС; серия; сертификат;
          // дата сертификата; срок сертификата; орган сертификации (кем выдан);
          //срок годности товара (дата)



              str := str +  list2[1]+ #9; // наименование
              str := str +  list2[3]+ #9; // емкость места

              str := str +  list2[4]+ #9; // производитель
              str := str +  list2[5]+ #9; // страна
              str := str +  list2[6]+ #9; // GTD
              str := str +  list2[7]+ #9; // кол-во
              str := str +  list2[8]+ #9; // цена произв. с НДС
              str := str +  list2[9]+ #9; // ставка НДС
              str := str +  list2[12]+ #9; // сумма
              str := str +  list2[13]+ #9; // серия
              str := str +  list2[14]+ #9; // сертификат
              str := str +  list2[15]+ #9; // дата сертификата
              str := str +  list2[16]+ #9; // срок сертификата
              str := str +  list2[17]+ #9; // орган сертификации
              str := str +  list2[18]+ #9; // срок годности товара

              (*
              AddStr(Str,List1,'BEST_BEFORE',List2);
              AddStr(Str,List1,'CERTIFICATE_SROK',List2);
              AddStr(Str,List1,'CERTIFICATE_ORG',List2);
              AddStr(Str,List1,'QUANT',List2);
              AddStr(Str,List1,'PERCENT_NDS',List2);
              AddStr(Str,List1,'GOODS',List2);
              AddStr(Str,List1,'PRICE',List2);
              AddStr(Str,List1,'SERIES',List2);
              AddStr(Str,List1,'CERTIFICATE_SERIES',List2);
              AddStr(Str,List1,'PRODUCER',List2);
              AddStr(Str,List1,'CERTIFICATE_DATE',List2);
              AddStr(Str,List1,'GTD',List2);
              AddStr(Str,List1,'COUNTRY',List2);
              AddStr(Str,List1,'REGN',List2); // такого поля нет у них пока
              AddStr(Str,List1,'BARCODE',List2); // поля нет пока
              AddStr(Str,List1,'SUM',List2);
              AddStr(Str,List1,'PRICE_REGISTRY',List2); // поля нет пока
              *)

              data.Add(str);
            end;
          end;

         finally

            LIst2.free;
            LIst1.free;
            List.free;
         end;
       end
       else CreateHintE('Данный формат накладных от Панда не исследован, обратитесь в техподдержку');

     finally
       free
     end;

     createhint('Операция завершена');
 end.
