// скрипт для импорта прайс-листа ИнтерЛек (Москва). используется процедурой 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; // запускающий объект


function CodeIsValid(CODE :string) :boolean;
var i :integer;
begin
  result := length(code)>0;
  for i := 1 to length(code) do
  begin
    if not (isdigit(code[i]) or (code[i]='/') ) then
    begin
       result := false;
       exit;
    end;
  end;
end;

var Table :Tclientdataset;
    tmpDir :string;
    tmpfile :string;
    Mappings :string;
    strval :string;
    missstrings :integer;
    i :integer;
    isFound :boolean;
    Field :TField;
    strval1 :string;
begin
  table := tclientdataset.create(selfscript);
  //mappings := tstringlist.create;
  try

      readxls(table, filename,false,false,-1);

      //table.savetofile('c:\temp\1.cds');
      //exit;

      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');



      Mappings := 'Код=CODE_GOODS;'+
                  'Наименование=NAME_GOODS;'+
                  //'Форма выпуска=FORM;'+
                  'Производитель=NAME_PRODUCER;'+
                  //'Страна=NAME_COUNTRY;'+

                  'В кор=PLACE_CAP;'+
                  'Остаток=AMOUNT;'+
                  //'Процент НДС=NDS;'+
                  'Срок годности=SHELF_LIFE;'+
                  'жв=IsLiveneed;'+
                  //'Кратность=MIN_AMOUNT;'+
                  'цена реестра без ндс=PRICE_REGISTRY;'+

                  'Цена с ндс=PRICE';


      SElfLoader.InitFieldsToDefault;
      SelfLoader.InitImportCDS;

      (*
      table.first;
      while not table.eof do
      begin
        if table.fieldbyname('Цена').asstring>''
        then begin
          selfloader.importcds.append;

          strval := table.fieldbyname('Наименование товаров').asstring;


          { не везде есть коды, а часто просто "2083252/50/068 Боди", так что код будем считать часть наименования
          i := pos(' ', strval);
          strval1 := '';
          if i>0 then begin
             strval1 := copy(strval,1,i-1);
             if not CodeIsValid(strval1) then strval1 := '';
          end;

          if strval1>''
          then strval := copy(strval,i+1,length(strval));


          selfloader.importcds.fieldbyname('CODE_GOODS').asstring := strval1;
          }

          selfloader.importcds.fieldbyname('NAME_GOODS').asstring := strval;

          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; // чтобы не продолжился импорт

  finally
    //mappings.free;
    table.free
  end;


end.
