// Èìïîðò íàêëàäíûõ

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;

var Table :TTable;
    CDS :TClientDAtaset;
    num_doc :string;
    Item :variant;
    i :integer;
    OpenDialog :TOpenDialog;
    thF_GNVLS,
    ThF_FIRSTPRICE,thf_SROK,thF_SrokSertif,ThF_NameSertif,thF_Amount,thF_NDS,
    thF_Name,thF_Seria,thF_Sertif,thF_NameProducer,thf_Tamog,
    thF_Country,thF_Regn,thF_Price,thF_BarCode,thF_DateSertif,thF_ED :TField;
    id : integer;


    thF_Code,thF_CountryCode,thF_ProducerCode,thf_AnalizeCode,thF_SertifCode :TField;

    thF_Price_Reg :TField;
    str,str1 :string;
    Field :TField;

    function GetItemValue(Item :Variant; Name :String) :string;
    begin
       try
         result := vartostr(Item.attributes.getNamedItem(Name).value);
       except
         result := ''
       end;
    end;

    function FindField(const Table :tDataset; const FieldNames :string; const FieldDescription :string) :TField;
    var List :TstringList;
        i :integer;
    begin
       result := nil;
       List := tstringlist.create;
       try
          stringtolist(FieldNames,List,';,');
          if list.count=0 then RaiseException('íå óêàçàíû èìåíà ïîëåé â ôóíêöèè FindField');

          for i := 0 to List.count-1 do
          begin
            Result := Table.findfield(List[i]);
            if result<>nil then break;
          end;
          if (Result=nil) and (FieldDescription>'') then RaiseException('íå íàéäåíî ïîëå "'+FieldDescription+'" ('+FieldNames+')');
       finally
          List.free;
       end;

    end;

    procedure AddStr(var Destination :string; const thField :tField);
    begin
      if thField<>nil
      then Destination := Destination + thField.asstring;
      Destination := Destination + #9;
    end;

    function IFSTR(BoolVal :boolean; const TrueVal :string; const FAlseVal :string = '') :string;
    begin
      if BoolVal then Result := TrueVal
      else Result := FalseVal;
    end;

 begin
     //FileName := '';
     if filename = ''
     then begin
       OpenDialog := TOpenDialog.create(nil);
       try
         OpenDialog.Title := 'Óêàæèòå ôàéë';
         OpenDialog.FileName  := AppIniFile.readstring('plugins_kruchinin','filename','');
         OpenDialog.initialdir := extractfilepath(opendialog.filename);
         OpenDialog.Filter := 'Ôàéëû-íàêëàäíûå(*.dbf,*.csv)|*.dbf;*.csv|Âñå ôàéëû(*.*)|*.*';
         while  OpenDialog.execute do begin
           if not fileexists(OpenDialog.FileName) then CreateHint('Óêàæèòå ïðàâèëüíî ôàéë ')
           else begin
             Filename := OpenDialog.FileName;
             AppIniFile.writestring('plugins_kruchinin','filename',OpenDialog.filename);
             break;
           end;
         end;
       finally
         OpenDialog.free;
       end;
     end;

     if FileName = '' then exit;

     with TMyWait.create('Èäåò èìïîðò íàêëàäíîé') do
     try

       CDS := TClientdataset.create(nil);
       try

        if uppercase(extractfileext(filename))='.DBF'
        then begin
            Table := TTable.Create(nil);
            try
              table.tabletype := ttFoxpro;

              Table.TableName := gettempdir + extractfilename(FileName);
              filedelete(Table.tablename);
              Table.tabletype := ttfoxpro;
              copyfile(FileName,Table.TableName,False);
              //SetTableLangDriver(Table,'db866ru0');
              //CheckDBFCP(Table.TableName,38); //866DOS
              Table.Open;
              Table.First;

              readdataset(cds,table);

            finally
              table.free;
            end;
        end
        else begin
          ReadTXT( CDS, FileName, '|');
        end;


        Table:=TTable.Create(nil);
        Table.DatabaseName:='dbKassa';
        Table.TableName:='TOVAR.DB';
        //Table.IndexName:='NAME';
        Table.Open;

        cds.first;

        if cds.findfield('ndoc')<>nil
        then begin
          Header.Values[ExportNakladNom] := cds.fieldbyname('ndoc').asstring;
          Header.Values[ExportNakladData] := cds.fieldbyname('datedoc').asstring;
        end
        else begin
          raiseexception('Òàáëèöà èìååò ôîðìàò, íå ñîãëàñîâàííûé ñ ïîñòàâùèêîì. Îáðàòèòåñü â òåõïîääåðæêó');
        end;

        data.Clear;

        {
        list.Add('srok'#9'barcode'#9'sroksertif'#9'sertifname'#9+
          'upa'#9'nn'#9'article'#9'kart'#9'kol'#9'em'#9'rosn'#9'nds'#9'ed'#9+
          'name'#9'firstcena'#9'seria'#9'sertif'#9'analize'#9'producer'#9+
          'producername'#9'nalog5'#9'idanalize'#9'analizename'#9'datasertif'#9+
          'dateanalize'#9'reestrcena'#9'tamog'#9'producercountry'#9+
          'producercountryname'#9'maxprocent'#9'passport'#9'datepassport'#9+
          'sorti'#9'gost'#9'regn'#9'summa'#9'cena'#9'itogcena'#9'itogsumma');
        }


        thF_Price := FindField(cds,'sumpay','Ñóììa');
        thF_AMOUNT := FindField(cds,'qnt','Êîëè÷åñòâî åäèíèö');
        thF_Seria := FindField(cds,'ser','Ñåðèÿ');
        thF_GNVLS := FindField(cds,'GNVLS','ÆÍÂËÑ');

        if UseBarcode then
          thF_Barcode := FindField(cds,'ean13','') // åñëè íåò, òî íå áóäåò îøèáêè
        else
          thF_Barcode := nil;

        thF_SROK :=  FindField(cds,'gdate','Ñðîê ãîäíîñòè');
        thF_NAME := FindField(cds,'name','Íàèìåíîâàíèå òîâàðà');

        thf_country := findfield(cds,'cntr','Ñòðàíà-ïðîèçâîäèòåëü');
        thF_NameProducer := FindField(cds,'firm','Ïðîèçâîäèòåëü');
        thF_NDS := FindField(cds,'nds','Ñòàâêà ÍÄÑ');
        thF_tamog := FindField(cds,'numgtd','Íîìåð òàìîæåííîé äåêëàðàöèè');
        thF_Sertif := FindField(cds,'sertif','Ñåðòèôèêàò');
        thF_DateSertif := findfield(cds,'sertdate','');
        thF_NAMESERTIF := FindField(cds,'sertorg','Êåì âûäàí ñåðòèôèêàò');
        //thF_RegN := FindField(cds,'regnomer','Ðåãèñòðàöèîííûé íîìåð');

        thF_FIRSTPRICE := FindField(cds, 'price1','Öåíà çàâîäà');
        thF_Price_reg := findfield(cds,'regprc','');

        //thF_SROKSERTIF := FindField(Table,'srok','Ñðîê äåéñòâèÿ ñåðòèôèêàòà');


        //thF_ED := 'óï.';




        data.Add(
          'srok'#9+
          'sroksertif'#9+
          'sertifname'#9+
          'kol'#9+
          'nds'#9+
          'name'#9+
          //'firstcenaplusnds'+#9+
          'firstcena'+#9+
          'seria'#9+
          'sertif'#9+
          'producername'#9+
          'tamog'#9+
          'countryname'#9+
          'regn'#9+
          'summa'#9+
          'price_reg'+#9+
          'barcode'+#9+
          'datesertif'+#9+

          //'sroksertif'#9+

          //+ifstr(thf_em<>nil,'em'+#9,'')
          );



        while not cds.eof do begin

             Table.IndexName:='NAME';
             if Table.FindKey([thF_NAME.AsString]) then
               Table.Edit
             else
              begin
               Table.IndexName:='';
               i:=0;
               Str:='=' + Format('%.6d', [i]);
               while Table.FindKey([Str]) do
                begin
                  i:=i+1;
                  Str:='=' + Format('%.6d', [i]);
                end;
               Table.Append;
               Table.FieldByName('NN').AsString:=Str;
               Table.FieldByName('id').Asinteger:=asinteger(bdeQueryValue('select max(id) from tovar',[null],'dbkassa'))+1;
              end;
             Table.FieldByName('NAME').AsString:=thF_NAME.Value;
             if Table.FieldByName('ISLIVENEED').AsInteger=0 then
               Table.FieldByName('ISLIVENEED').AsString:=thF_GNVLS.Value;
             Table.FieldByName('MaxProcent').AsInteger:=100;
             Table.Post;

             Str:='';
             Addstr(str,thF_Srok);
             Addstr(str,thF_Sroksertif);
             Addstr(str,thf_namesertif);
             Addstr(str,thf_amount);
             Addstr(str,thf_NDS);
             Addstr(str,thf_name);
             Addstr(str,thF_FIRSTPRICE);
             Addstr(str,thf_SEria);
             Addstr(str,thf_SErtif);
             Addstr(str,thf_NameProducer);
             Addstr(str,thf_Tamog);
             Addstr(str,thF_Country);
             Addstr(str,thf_regn);
             Addstr(str,thF_Price);
             Addstr(str,thF_price_reg);
             Addstr(str,thF_Barcode);
             Addstr(str,thF_DateSErtif);

             //thf_sroksertif.asstring+#9;



          //if  thf_em<>nil
          //then str := str + thF_em.asstring+#9;



          data.Add(str);
          cds.Next;
        end;
       finally
          cds.free;
       end;

     finally
       free
     end;

     createhint('Îïåðàöèÿ çàâåðøåíà');
 end.
