// скрипт для импорта прайс-листа ИП Куклин. используется процедурой Loader.LoadFromFileWithScript

{
          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


var
    Filename :string; // Файл импорта
    SelfLoader :TPriceLoader; // запускающий объект

var Table :Tclientdataset;
    tmpDir :string;
    tmpfile :string;
    Mappings :string;
    strval :string;
    missstrings :integer;
    i :integer;
    isFound :boolean;
    Field :TField;
    DBFTable :ttable;
    tempdir :string;
    tmpfile :string;
begin
  table := tclientdataset.create(selfscript);
  //mappings := tstringlist.create;
  try
      if uppercase(extractfileext(filename))='.XLS'
      then begin

        readxls(table, filename,false,false,0);

        missstrings := 0;
        table.first;

        isFound := false;

        while not table.eof
        do begin
         for i := 0 to table.fieldcount-1 do
         if (table.fields[i].asstring='Наименование')
         then begin
           isfound := true;
           break;
         end;

          if not isfound
          then begin
            inc(MissStrings);
            table.next;
          end
          else break
        end;

        if missstrings>= table.recordcount
        then RaiseException('Не найдены нужные поля в таблице');


        // считаем, сколько строк пропустить

        readxls(table, filename,false,true,MissStrings);


        //table.savetofile('c:\temp\1.cds');

        SElfLoader.InitFieldsToDefault;
        SelfLoader.InitImportCDS;

        table.first;
        while not table.eof do
        begin
          if trim(table.fieldbyname('Наименование').asstring)>''
          then begin
            selfloader.importcds.append;
            //selfloader.importcds.fieldbyname('CODE_GOODS').asstring := table.fieldbyname('Код препарата').asstring;

            //if pos(table.Fieldbyname('Наименование').asstring,table.Fieldbyname('Форма').asstring)=1
            //then

              selfloader.importcds.fieldbyname('NAME_GOODS').asstring := table.Fieldbyname('Наименование').asstring;

            //else
            //  selfloader.importcds.fieldbyname('NAME_GOODS').asstring :=
            //     table.Fieldbyname('Наименование').asstring + ' ' +
            //     table.Fieldbyname('Форма').asstring;

            selfloader.importcds.fieldbyname('PRICE').asstring := table.fieldbyname('Цена').asstring;
            selfloader.importcds.fieldbyname('NAME_PRODUCER').asstring := table.fieldbyname('Производитель').asstring;

            {
            Field := table.findfield('СрокГодности');
            if field=nil then Field := table.findfield('Годен до');
            if field = nil then raiseexception('Поле "срок годности" не найдено ни в одном из вариантов написания');
            selfloader.importcds.fieldbyname('SHELF_LIFE').asstring := Field.asstring;

            selfloader.importcds.fieldbyname('AMOUNT').asstring := table.fieldbyname('Остаток').asstring;


            Field := table.findfield('В кор');
            if field=nil then Field := table.findfield('Шт в кор');
            if field = nil then raiseexception('Поле "емкость места" не найдено ни в одном из вариантов написания');
            selfloader.importcds.fieldbyname('place_cap').asstring := Field.asstring;
            }

            selfloader.importcds.post;

          end;
          table.next
        end;
        TableAppend(SelfLoader.ImportCDS,table,false,Mappings);
        //dataset.close; // чтобы не продолжился импорт

      end
      else begin
        dbftable := ttable.create(selfscript);

        tmpdir := includetrailingpathdelimiter(gettempdir+'tmpscriptimport-'+formatdatetime('dd-mm-yyyy-hh-nn-ss',now));
        forcedirectories(tmpdir);

        tmpfile := tmpdir + 'tmpprice.dbf';

        copyfile(filename,tmpfile);
        try
          DBFtable.tablename := tmpfile;

          DBFtable.tabletype := ttFoxpro;

          //SetTableLangDriver(table,'DBWINUS0');
          //SetTableLangDriver(Table,'db866ru0');
          //CheckDBFCP(Table.TableName,87); //866DOS - 38

          dbftable.open;

            Mappings :=
                      'CODE=CODE_GOODS;'+
                      'NAME=NAME_GOODS;'+
                      'MANUFAC=NAME_PRODUCER;'+
    //                  'COUNTRY=NAME_COUNTRY;'+
                      'PRICE=PRICE;'+
    //                  'PRICER=PRICE_REGISTRY;'+
    //                  'PRICEPR=PRICE_FIRST;'+
                      'BALANCE=AMOUNT;'+
                      'EXPDATE=SHELF_LIFE;'+
                      'MINORDER=MIN_AMOUNT';
                      //'EAN13=BARCODE;'+

    //                  'PACK=PLACE_CAP;'+
    //                  'NDS=NDS;'+
    //                  'LIFE=ISLIVENEED';

          SElfLoader.InitFieldsToDefault;
          SelfLoader.InitImportCDS;
          TableAppend(selfloader.importcds,dbftable,false,Mappings);
          //dataset.close; // чтобы не продолжился импорт
        finally
          dbftable.close;
          cleardir(tmpdir);
          deletedir(tmpdir);
        end;

      end;



  finally
    //mappings.free;
    table.free
  end;


end.
