// скрипт для импорта прайс-листа Катрен. используется процедурой Loader.LoadFromFileWithScript
// на вход подается открытый Dataset, который нужно заполнить в соответствии с полями:

{
          add('code',ftstring,50);
          add('code_goods',ftstring,50);
          add('name_goods',ftstring,300);
          add('code_producer',ftstring,50);
          add('name_producer',ftstring,300);
          add('code_country',ftstring,50);
          add('name_country',ftstring,300);
          add('price',ftstring,50);
          add('price_without_nds',ftstring,50);
          add('price_first',ftstring,50);
          add('price_first_with_nds',ftstring,50);
          add('nds',ftstring,50);
          add('shelf_life',ftstring,50);
          add('ex_rate',ftstring,50);
          add('price_rtl',ftstring,50);
          add('amount',ftstring,50);
          add('id_valuta',ftstring,50);
          add('min_amount',ftstring,50);
          add('units',ftstring,50);
          add('place_cap',ftstring,50);
          add('isliveneed',ftstring,50);
          add('price_registry',ftstring,50);
          add('barcode',ftstring,50);
}

// если вернуть закрытый датасет, то операция не будет продолжена, и предполагается, что скрипт самостоятельно разобрался с прайсом.
// для самостоятельности скрипту передается ID - идентификатор прайса, который сейчас заливается.
// но в целом задача скрипта - транспортировать данные из файла Filename в Dataset

const
    //unpackcmd =' "c:\program files\winrar\unrar.exe"  e -y "%s" "%s"';
    unpackcmd =' "c:\program files\7-zip\7z.exe"  e -y "%s" -o"%s"';

var // предопределенные скриптом переменные
    Filename :string; // Файл импорта
    SelfLoader :TPriceLoader; // вызывающий объект

    // собственные объекты
var Table :ttable;
    tmpDir :string;
    tmpfile :string;
    Mappings :string;
    strval :string;
    cds :tclientdataset;
    dt :tdatetime;
    distinctcnt :integer = 0;
begin
  table := ttable.create(selfscript);
  try
    tmpdir := includetrailingpathdelimiter(getuniquedirname);
    forcedirectories(tmpdir);


    tmpfile := tmpdir + extractfilename(FileName);

    copyfile(filename,tmpfile);

    if uppercase(Extractfileext(tmpfile)) = '.ZIP'
    then begin
      tmpfile :=   ZipExtractAll(tmpfile,tmpdir);
      tmpfile := tmpdir + tmpfile;
    end
    else
    if uppercase(Extractfileext(tmpfile)) = '.RAR'
    then begin
      FileExecuteWait(format(unpackcmd,[tmpfile,tmpdir]), esNormal);
      tmpfile := tmpdir +  'price_1.dbf';
    end;

    try
      if uppercase(extractfileext(tmpfile))='.DBF'
      then begin

        table.tablename := tmpfile;

        table.tabletype := ttFoxpro;
        SetTableLangDriver(table,'db866ru0');
        //SetTableLangDriver(Table,'DBWINUS0');


        table.open;


        Mappings := 'CODEPST=CODE_GOODS;'+
                    'NAME=NAME_GOODS;'+
                    'FIRM=NAME_PRODUCER;'+
                    'CNTR=NAME_COUNTRY;'+
                    'PRICE1=PRICE;'+
                    'PRICE2=PRICE;'+
                    'PRICEGR=PRICE_REGISTRY;'+
                    //'IZGPR=PRICE_FIRST;'+
                    'QNT=AMOUNT;'+
                    //'PACK=MIN_AMOUNT;'+
                    'GDATE=SHELF_LIFE;'+
                    'EAN13=BARCODE;'+

                    'QNTPACK=PLACE_CAP;'+
                    'NDS=NDS;'+
                    'GNVLS=ISLIVENEED';


        SElfLoader.InitFieldsToDefault;
        SelfLoader.InitImportCDS;
        TableAppend(selfloader.importcds,table,false,Mappings);
        //dataset.close; // чтобы не продолжился импорт
      end
      else begin  //TXT
        //good-vendor id, good id, vendor id, наименование,
        //производитель, цена прайсовая, реестр. цена, срок годности

        cds := tclientdataset.create(selfscript);

        ReadTXT(cds,tmpfile,'|',false);


        SElfLoader.InitFieldsToDefault;
        SelfLoader.InitImportCDS;

        //selfloader.importcds.logchanges := false;

        selfloader.importcds.indexfieldnames := 'code_goods;code_producer;name_goods;name_producer;price;price_registry;shelf_life';

        cds.first;
        while not cds.eof do
        begin
          with selfloader.importcds do
          begin

            if not findkey([
                   cds.fields[0].asstring+'|'+cds.fields[1].asstring,
                   cds.fields[2].asstring,
                   cds.fields[3].asstring,
                   cds.fields[4].asstring,
                   cds.fields[5].asstring,
                   cds.fields[6].asstring,
                   cds.fields[8].asstring
                   ])
            then begin

              append;
              //fieldbyname('code').asstring := cds.fields[0].asstring;
              fieldbyname('code_goods').asstring :=cds.fields[0].asstring+'|'+cds.fields[1].asstring;
              fieldbyname('code_producer').asstring := cds.fields[2].asstring;
              fieldbyname('name_goods').asstring := cds.fields[3].asstring;
              fieldbyname('name_producer').asstring := cds.fields[4].asstring;
              fieldbyname('price').asstring := cds.fields[5].asstring;
              fieldbyname('price_registry').asstring := cds.fields[6].asstring;


              fieldbyname('shelf_life').asstring := cds.fields[8].asstring;

              fieldbyname('amount').asstring := cds.fields[7].asstring;

              post;
            end
            else begin
              inc(distinctcnt);
              edit;
              fieldbyname('amount').asstring := floattostr(strtofloatprotected(fieldbyname('amount').asstring) + strtofloatprotected(cds.fields[7].asstring));
              post;
            end;
          end;

          cds.next;
        end;

        selfloader.importcds.indexfieldnames := '';

        //createhint('Повторов: '+inttostr(distinctcnt),'',60);


      end;
    finally
      table.close;
      cleardir(tmpdir);
      deletedir(tmpdir);
    end

  finally
    //mappings.free;
    table.free
  end;


end.
