123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776 |
- <?php
- /* Copyright (C) 2005-2011 Laurent Destailleur <eldy@users.sourceforge.net>
- * Copyright (C) 2005-2009 Regis Houssin <regis.houssin@capnetworks.com>
- * Copyright (C) 2012 Christophe Battarel <christophe.battarel@altairis.fr>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * \file htdocs/imports/import.php
- * \ingroup import
- * \brief Pages of import Wizard
- */
- require_once '../main.inc.php';
- require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
- require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
- require_once DOL_DOCUMENT_ROOT.'/imports/class/import.class.php';
- require_once DOL_DOCUMENT_ROOT.'/core/modules/import/modules_import.php';
- require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
- require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
- require_once DOL_DOCUMENT_ROOT.'/core/lib/import.lib.php';
- $langs->load("exports");
- $langs->load("errors");
- // Security check
- $result=restrictedArea($user, 'import');
- $entitytoicon=array(
- 'invoice'=>'bill','invoice_line'=>'bill',
- 'order'=>'order' ,'order_line'=>'order',
- 'intervention'=>'intervention' ,'inter_line'=>'intervention',
- 'member'=>'user' ,'member_type'=>'group','subscription'=>'payment',
- 'tax'=>'generic' ,'tax_type'=>'generic',
- 'account'=>'account',
- 'payment'=>'payment',
- 'product'=>'product','stock'=>'generic','warehouse'=>'stock',
- 'category'=>'generic',
- 'other'=>'generic'
- );
- $entitytolang=array( // Translation code
- 'user'=>'User',
- 'company'=>'Company','contact'=>'Contact',
- 'invoice'=>'Bill','invoice_line'=>'InvoiceLine',
- 'order'=>'Order','order_line'=>'OrderLine',
- 'intervention'=>'Intervention' ,'inter_line'=>'InterLine',
- 'member'=>'Member','member_type'=>'MemberType','subscription'=>'Subscription',
- 'tax'=>'SocialContribution','tax_type'=>'DictionarySocialContributions',
- 'account'=>'BankTransactions',
- 'payment'=>'Payment',
- 'product'=>'Product','stock'=>'Stock','warehouse'=>'Warehouse',
- 'category'=>'Category',
- 'other'=>'Other'
- );
- $datatoimport = GETPOST('datatoimport');
- $format = GETPOST('format');
- $filetoimport = GETPOST('filetoimport');
- $action = GETPOST('action','alpha');
- $confirm = GETPOST('confirm','alpha');
- $step = (GETPOST('step') ? GETPOST('step') : 1);
- $import_name = GETPOST('import_name');
- $hexa = GETPOST('hexa');
- $importmodelid = GETPOST('importmodelid');
- $excludefirstline = (GETPOST('excludefirstline') ? GETPOST('excludefirstline') : 0);
- $separator = (GETPOST('separator') ? GETPOST('separator') : (! empty($conf->global->IMPORT_CSV_SEPARATOR_TO_USE)?$conf->global->IMPORT_CSV_SEPARATOR_TO_USE:','));
- $enclosure = (GETPOST('enclosure') ? GETPOST('enclosure') : '"');
- $objimport=new Import($db);
- $objimport->load_arrays($user,($step==1?'':$datatoimport));
- $objmodelimport=new ModeleImports();
- $form = new Form($db);
- $htmlother = new FormOther($db);
- $formfile = new FormFile($db);
- // Init $array_match_file_to_database from _SESSION
- $serialized_array_match_file_to_database=isset($_SESSION["dol_array_match_file_to_database"])?$_SESSION["dol_array_match_file_to_database"]:'';
- $array_match_file_to_database=array();
- $fieldsarray=explode(',',$serialized_array_match_file_to_database);
- foreach($fieldsarray as $elem)
- {
- $tabelem=explode('=',$elem,2);
- $key=$tabelem[0];
- $val=(isset($tabelem[1])?$tabelem[1]:'');
- if ($key && $val)
- {
- $array_match_file_to_database[$key]=$val;
- }
- }
- /*
- * Actions
- */
- /*
- if ($action=='downfield' || $action=='upfield')
- {
- $pos=$array_match_file_to_database[$_GET["field"]];
- if ($action=='downfield') $newpos=$pos+1;
- if ($action=='upfield') $newpos=$pos-1;
- // Recherche code avec qui switcher
- $newcode="";
- foreach($array_match_file_to_database as $code=>$value)
- {
- if ($value == $newpos)
- {
- $newcode=$code;
- break;
- }
- }
- //print("Switch pos=$pos (code=".$_GET["field"].") and newpos=$newpos (code=$newcode)");
- if ($newcode) // Si newcode trouve (protection contre resoumission de page)
- {
- $array_match_file_to_database[$_GET["field"]]=$newpos;
- $array_match_file_to_database[$newcode]=$pos;
- $_SESSION["dol_array_match_file_to_database"]=$serialized_array_match_file_to_database;
- }
- }
- */
- if ($action == 'builddoc')
- {
- // Build import file
- $result=$objimport->build_file($user, GETPOST('model','alpha'), $datatoimport, $array_match_file_to_database);
- if ($result < 0)
- {
- setEventMessage($objimport->error, 'errors');
- }
- else
- {
- setEventMessage($langs->trans("FileSuccessfullyBuilt"));
- }
- }
- if ($action == 'deleteprof')
- {
- if ($_GET["id"])
- {
- $objimport->fetch($_GET["id"]);
- $result=$objimport->delete($user);
- }
- }
- // Save import config to database
- if ($action == 'add_import_model')
- {
- if ($import_name)
- {
- // Set save string
- $hexa='';
- foreach($array_match_file_to_database as $key=>$val)
- {
- if ($hexa) $hexa.=',';
- $hexa.=$key.'='.$val;
- }
- $objimport->model_name = $import_name;
- $objimport->datatoimport = $datatoimport;
- $objimport->hexa = $hexa;
- $result = $objimport->create($user);
- if ($result >= 0)
- {
- setEventMessage($langs->trans("ImportModelSaved",$objimport->model_name));
- }
- else
- {
- $langs->load("errors");
- if ($objimport->errno == 'DB_ERROR_RECORD_ALREADY_EXISTS')
- {
- setEventMessage($langs->trans("ErrorImportDuplicateProfil"), 'errors');
- }
- else {
- setEventMessage($objimport->error, 'errors');
- }
- }
- }
- else
- {
- setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentities("ImportModelName")), 'errors');
- }
- }
- if ($step == 3 && $datatoimport)
- {
- if (GETPOST('sendit') && ! empty($conf->global->MAIN_UPLOAD_DOC))
- {
- dol_mkdir($conf->import->dir_temp);
- $nowyearmonth=dol_print_date(dol_now(),'%Y%m%d%H%M%S');
- $fullpath=$conf->import->dir_temp . "/" . $nowyearmonth . '-'.$_FILES['userfile']['name'];
- if (dol_move_uploaded_file($_FILES['userfile']['tmp_name'], $fullpath,1) > 0)
- {
- dol_syslog("File ".$fullpath." was added for import");
- }
- else
- {
- $langs->load("errors");
- setEventMessage($langs->trans("ErrorFailedToSaveFile"), 'errors');
- }
- }
- // Delete file
- if ($action == 'confirm_deletefile' && $confirm == 'yes')
- {
- $langs->load("other");
- $param='&datatoimport='.$datatoimport.'&format='.$format;
- if ($excludefirstline) $param.='&excludefirstline=1';
- $file = $conf->import->dir_temp . '/' . GETPOST('urlfile'); // Do not use urldecode here ($_GET and $_REQUEST are already decoded by PHP).
- $ret=dol_delete_file($file);
- if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('urlfile')));
- else setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), 'errors');
- Header('Location: '.$_SERVER["PHP_SELF"].'?step='.$step.$param);
- exit;
- }
- }
- if ($step == 4 && $action == 'select_model')
- {
- // Reinit match arrays
- $_SESSION["dol_array_match_file_to_database"]='';
- $serialized_array_match_file_to_database='';
- $array_match_file_to_database=array();
- // Load model from $importmodelid and set $array_match_file_to_database
- // and $_SESSION["dol_array_match_file_to_database"]
- $result = $objimport->fetch($importmodelid);
- if ($result > 0)
- {
- $serialized_array_match_file_to_database=$objimport->hexa;
- $fieldsarray=explode(',',$serialized_array_match_file_to_database);
- foreach($fieldsarray as $elem)
- {
- $tabelem=explode('=',$elem);
- $key=$tabelem[0];
- $val=$tabelem[1];
- if ($key && $val)
- {
- $array_match_file_to_database[$key]=$val;
- }
- }
- $_SESSION["dol_array_match_file_to_database"]=$serialized_array_match_file_to_database;
- }
- }
- if ($action == 'saveorder')
- {
- // Enregistrement de la position des champs
- dol_syslog("boxorder=".$_GET['boxorder']." datatoimport=".$_GET["datatoimport"], LOG_DEBUG);
- $part=explode(':',$_GET['boxorder']);
- $colonne=$part[0];
- $list=$part[1];
- dol_syslog('column='.$colonne.' list='.$list);
- // Init targets fields array
- $fieldstarget=$objimport->array_import_fields[0];
- // Reinit match arrays. We redefine array_match_file_to_database
- $serialized_array_match_file_to_database='';
- $array_match_file_to_database=array();
- $fieldsarray=explode(',',$list);
- $pos=0;
- foreach($fieldsarray as $fieldnb) // For each elem in list. fieldnb start from 1 to ...
- {
- // Get name of database fields at position $pos and put it into $namefield
- $posbis=0;$namefield='';
- foreach($fieldstarget as $key => $val) // key: val:
- {
- //dol_syslog('AjaxImport key='.$key.' val='.$val);
- if ($posbis < $pos)
- {
- $posbis++;
- continue;
- }
- // We found the key of targets that is at position pos
- $namefield=$key;
- //dol_syslog('AjaxImport Field name found for file field nb '.$fieldnb.'='.$namefield);
- break;
- }
- if ($fieldnb && $namefield)
- {
- $array_match_file_to_database[$fieldnb]=$namefield;
- if ($serialized_array_match_file_to_database) $serialized_array_match_file_to_database.=',';
- $serialized_array_match_file_to_database.=($fieldnb.'='.$namefield);
- }
- $pos++;
- }
- // We save new matching in session
- $_SESSION["dol_array_match_file_to_database"]=$serialized_array_match_file_to_database;
- dol_syslog('dol_array_match_file_to_database='.$serialized_array_match_file_to_database);
- }
- /*
- * View
- */
- // STEP 1: Page to select dataset to import
- if ($step == 1 || ! $datatoimport)
- {
- // Clean saved file-database matching
- $serialized_array_match_file_to_database='';
- $array_match_file_to_database=array();
- $_SESSION["dol_array_match_file_to_database"]='';
- $param='';
- if ($excludefirstline) $param.='&excludefirstline=1';
- if ($separator) $param.='&separator='.urlencode($separator);
- if ($enclosure) $param.='&enclosure='.urlencode($enclosure);
- llxHeader('',$langs->trans("NewImport"),'EN:Module_Imports_En|FR:Module_Imports|ES:Módulo_Importaciones');
- $head = import_prepare_head($param, 1);
- dol_fiche_head($head, 'step1', $langs->trans("NewImport"));
- print '<table class="notopnoleftnoright" width="100%">';
- print $langs->trans("SelectImportDataSet").'<br>';
- // Affiche les modules d'imports
- print '<table class="noborder" width="100%">';
- print '<tr class="liste_titre">';
- print '<td>'.$langs->trans("Module").'</td>';
- print '<td>'.$langs->trans("ImportableDatas").'</td>';
- print '<td> </td>';
- print '</tr>';
- $val=true;
- if (count($objimport->array_import_code))
- {
- foreach ($objimport->array_import_code as $key => $value)
- {
- //var_dump($objimport->array_import_code[$key]);
- $val=!$val;
- print '<tr '.$bc[$val].'><td nospan="nospan">';
- $titleofmodule=$objimport->array_import_module[$key]->getName();
- // Special cas for import common to module/services
- if (in_array($objimport->array_import_code[$key], array('produit_supplierprices','produit_multiprice'))) $titleofmodule=$langs->trans("ProductOrService");
- print $titleofmodule;
- print '</td><td>';
- //print $value;
- print img_object($objimport->array_import_module[$key]->getName(),$objimport->array_import_icon[$key]).' ';
- print $objimport->array_import_label[$key];
- print '</td><td align="right">';
- if ($objimport->array_import_perms[$key])
- {
- print '<a href="'.DOL_URL_ROOT.'/imports/import.php?step=2&datatoimport='.$objimport->array_import_code[$key].$param.'">'.img_picto($langs->trans("NewImport"),'filenew').'</a>';
- }
- else
- {
- print $langs->trans("NotEnoughPermissions");
- }
- print '</td></tr>';
- }
- }
- else
- {
- print '<tr><td '.$bc[false].' colspan="3">'.$langs->trans("NoImportableData").'</td></tr>';
- }
- print '</table>';
- print '</table>';
- dol_fiche_end();
- }
- // STEP 2: Page to select input format file
- if ($step == 2 && $datatoimport)
- {
- $param='&datatoimport='.$datatoimport;
- if ($excludefirstline) $param.='&excludefirstline=1';
- if ($separator) $param.='&separator='.urlencode($separator);
- if ($enclosure) $param.='&enclosure='.urlencode($enclosure);
- llxHeader('',$langs->trans("NewImport"),'EN:Module_Imports_En|FR:Module_Imports|ES:Módulo_Importaciones');
- $head = import_prepare_head($param,2);
- dol_fiche_head($head, 'step2', $langs->trans("NewImport"));
- print '<table width="100%" class="border">';
- // Module
- print '<tr><td width="25%">'.$langs->trans("Module").'</td>';
- print '<td>';
- $titleofmodule=$objimport->array_import_module[0]->getName();
- // Special cas for import common to module/services
- if (in_array($objimport->array_import_code[0], array('produit_supplierprices','produit_multiprice'))) $titleofmodule=$langs->trans("ProductOrService");
- print $titleofmodule;
- print '</td></tr>';
- // Lot de donnees a importer
- print '<tr><td width="25%">'.$langs->trans("DatasetToImport").'</td>';
- print '<td>';
- print img_object($objimport->array_import_module[0]->getName(),$objimport->array_import_icon[0]).' ';
- print $objimport->array_import_label[0];
- print '</td></tr>';
- print '</table>';
- print '<br>'."\n";
- print '<form name="userfile" action="'.$_SERVER["PHP_SELF"].'" enctype="multipart/form-data" METHOD="POST">';
- print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
- print '<input type="hidden" name="max_file_size" value="'.$conf->maxfilesize.'">';
- print $langs->trans("ChooseFormatOfFileToImport",img_picto('','filenew')).'<br>';
- print '<table class="noborder" width="100%" cellspacing="0" cellpadding="4">';
- $filetoimport='';
- $var=true;
- // Add format informations and link to download example
- print '<tr class="liste_titre"><td colspan="6">';
- print $langs->trans("FileMustHaveOneOfFollowingFormat");
- print '</td></tr>';
- $liste=$objmodelimport->liste_modeles($db);
- foreach($liste as $key)
- {
- $var=!$var;
- print '<tr '.$bc[$var].'>';
- print '<td width="16">'.img_picto_common($key,$objmodelimport->getPictoForKey($key)).'</td>';
- $text=$objmodelimport->getDriverDescForKey($key);
- print '<td>'.$form->textwithpicto($objmodelimport->getDriverLabelForKey($key),$text).'</td>';
- print '<td align="center"><a href="'.DOL_URL_ROOT.'/imports/emptyexample.php?format='.$key.$param.'" target="_blank">'.$langs->trans("DownloadEmptyExample").'</a></td>';
- // Action button
- print '<td align="right">';
- print '<a href="'.DOL_URL_ROOT.'/imports/import.php?step=3&format='.$key.$param.'">'.img_picto($langs->trans("SelectFormat"),'filenew').'</a>';
- print '</td>';
- print '</tr>';
- }
- print '</table></form>';
- dol_fiche_end();
- }
- // STEP 3: Page to select file
- if ($step == 3 && $datatoimport)
- {
- $param='&datatoimport='.$datatoimport.'&format='.$format;
- if ($excludefirstline) $param.='&excludefirstline=1';
- if ($separator) $param.='&separator='.urlencode($separator);
- if ($enclosure) $param.='&enclosure='.urlencode($enclosure);
- $liste=$objmodelimport->liste_modeles($db);
- llxHeader('',$langs->trans("NewImport"),'EN:Module_Imports_En|FR:Module_Imports|ES:Módulo_Importaciones');
- $head = import_prepare_head($param, 3);
- dol_fiche_head($head, 'step3', $langs->trans("NewImport"));
- /*
- * Confirm delete file
- */
- if ($action == 'delete')
- {
- print $form->formconfirm($_SERVER["PHP_SELF"].'?urlfile='.urlencode(GETPOST('urlfile')).'&step=3'.$param, $langs->trans('DeleteFile'), $langs->trans('ConfirmDeleteFile'), 'confirm_deletefile', '', 0, 1);
- }
- print '<table width="100%" class="border">';
- // Module
- print '<tr><td width="25%">'.$langs->trans("Module").'</td>';
- print '<td>';
- $titleofmodule=$objimport->array_import_module[0]->getName();
- // Special cas for import common to module/services
- if (in_array($objimport->array_import_code[0], array('produit_supplierprices','produit_multiprice'))) $titleofmodule=$langs->trans("ProductOrService");
- print $titleofmodule;
- print '</td></tr>';
- // Lot de donnees a importer
- print '<tr><td width="25%">'.$langs->trans("DatasetToImport").'</td>';
- print '<td>';
- print img_object($objimport->array_import_module[0]->getName(),$objimport->array_import_icon[0]).' ';
- print $objimport->array_import_label[0];
- print '</td></tr>';
- print '</table><br>';
- print '<b>'.$langs->trans("InformationOnSourceFile").'</b>';
- print '<table width="100%" class="border">';
- //print '<tr><td colspan="2"><b>'.$langs->trans("InformationOnSourceFile").'</b></td></tr>';
- // Source file format
- print '<tr><td width="25%">'.$langs->trans("SourceFileFormat").'</td>';
- print '<td>';
- $text=$objmodelimport->getDriverDescForKey($format);
- print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format),$text);
- print '</td><td align="right" class="nowrap"><a href="'.DOL_URL_ROOT.'/imports/emptyexample.php?format='.$format.$param.'" target="_blank">'.$langs->trans("DownloadEmptyExample").'</a>';
- print '</td></tr>';
- print '</table>';
- print '<br>'."\n";
- print '<form name="userfile" action="'.$_SERVER["PHP_SELF"].'" enctype="multipart/form-data" METHOD="POST">';
- print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
- print '<input type="hidden" name="max_file_size" value="'.$conf->maxfilesize.'">';
- print '<table class="noborder" width="100%" cellspacing="0" cellpadding="4">';
- $filetoimport='';
- $var=true;
- print '<tr><td colspan="6">'.$langs->trans("ChooseFileToImport",img_picto('','filenew')).'</td></tr>';
- print '<tr class="liste_titre"><td colspan="6">'.$langs->trans("FileWithDataToImport").'</td></tr>';
- // Input file name box
- $var=false;
- print '<tr '.$bc[$var].'><td colspan="6">';
- print '<input type="file" name="userfile" size="20" maxlength="80"> ';
- print '<input type="submit" class="button" value="'.$langs->trans("AddFile").'" name="sendit">';
- print '<input type="hidden" value="'.$step.'" name="step">';
- print '<input type="hidden" value="'.$format.'" name="format">';
- print '<input type="hidden" value="'.$excludefirstline.'" name="excludefirstline">';
- print '<input type="hidden" value="'.$separator.'" name="separator">';
- print '<input type="hidden" value="'.$enclosure.'" name="enclosure">';
- print '<input type="hidden" value="'.$datatoimport.'" name="datatoimport">';
- print "</tr>\n";
- // Search available imports
- $filearray=dol_dir_list($conf->import->dir_temp, 'files', 0, '', '', 'name', SORT_DESC);
- if (count($filearray) > 0)
- {
- $dir=$conf->import->dir_temp;
- // Search available files to import
- $i=0;
- foreach ($filearray as $key => $val)
- {
- $file=$val['name'];
- // readdir return value in ISO and we want UTF8 in memory
- if (! utf8_check($file)) $file=utf8_encode($file);
- if (preg_match('/^\./',$file)) continue;
- $modulepart='import';
- $urlsource=$_SERVER["PHP_SELF"].'?step='.$step.$param.'&filetoimport='.urlencode($filetoimport);
- $relativepath=$file;
- $var=!$var;
- print '<tr '.$bc[$var].'>';
- print '<td width="16">'.img_mime($file).'</td>';
- print '<td>';
- print '<a data-ajax="false" href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&file='.urlencode($relativepath).'&step=3'.$param.'" target="_blank">';
- print $file;
- print '</a>';
- print '</td>';
- // Affiche taille fichier
- print '<td align="right">'.dol_print_size(dol_filesize($dir.'/'.$file)).'</td>';
- // Affiche date fichier
- print '<td align="right">'.dol_print_date(dol_filemtime($dir.'/'.$file),'dayhour').'</td>';
- // Del button
- print '<td align="right"><a href="'.$_SERVER['PHP_SELF'].'?action=delete&step=3'.$param.'&urlfile='.urlencode($relativepath);
- print '">'.img_delete().'</a></td>';
- // Action button
- print '<td align="right">';
- print '<a href="'.$_SERVER['PHP_SELF'].'?step=4'.$param.'&filetoimport='.urlencode($relativepath).'">'.img_picto($langs->trans("NewImport"),'filenew').'</a>';
- print '</td>';
- print '</tr>';
- }
- }
- print '</table></form>';
- dol_fiche_end();
- }
- // STEP 4: Page to make matching between source file and database fields
- if ($step == 4 && $datatoimport)
- {
- $model=$format;
- $liste=$objmodelimport->liste_modeles($db);
- // Create classe to use for import
- $dir = DOL_DOCUMENT_ROOT . "/core/modules/import/";
- $file = "import_".$model.".modules.php";
- $classname = "Import".ucfirst($model);
- require_once $dir.$file;
- $obj = new $classname($db,$datatoimport);
- if ($model == 'csv') {
- $obj->separator = $separator;
- $obj->enclosure = $enclosure;
- }
- // Load source fields in input file
- $fieldssource=array();
- $result=$obj->import_open_file($conf->import->dir_temp.'/'.$filetoimport,$langs);
- if ($result >= 0)
- {
- // Read first line
- $arrayrecord=$obj->import_read_record();
- // Put into array fieldssource starting with 1.
- $i=1;
- foreach($arrayrecord as $key => $val)
- {
- $fieldssource[$i]['example1']=dol_trunc($val['val'],24);
- $i++;
- }
- $obj->import_close_file();
- }
- // Load targets fields in database
- $fieldstarget=$objimport->array_import_fields[0];
- $maxpos=max(count($fieldssource),count($fieldstarget));
- //var_dump($array_match_file_to_database);
- // Is it a first time in page (if yes, we must initialize array_match_file_to_database)
- if (count($array_match_file_to_database) == 0)
- {
- // This is first input in screen, we need to define
- // $array_match_file_to_database
- // $serialized_array_match_file_to_database
- // $_SESSION["dol_array_match_file_to_database"]
- $pos=1;
- $num=count($fieldssource);
- while ($pos <= $num)
- {
- if ($num >= 1 && $pos <= $num)
- {
- $posbis=1;
- foreach($fieldstarget as $key => $val)
- {
- if ($posbis < $pos)
- {
- $posbis++;
- continue;
- }
- // We found the key of targets that is at position pos
- $array_match_file_to_database[$pos]=$key;
- if ($serialized_array_match_file_to_database) $serialized_array_match_file_to_database.=',';
- $serialized_array_match_file_to_database.=($pos.'='.$key);
- break;
- }
- }
- $pos++;
- }
- // Save the match array in session. We now will use the array in session.
- $_SESSION["dol_array_match_file_to_database"]=$serialized_array_match_file_to_database;
- }
- $array_match_database_to_file=array_flip($array_match_file_to_database);
- //print $serialized_array_match_file_to_database;
- //print $_SESSION["dol_array_match_file_to_database"];
- //var_dump($array_match_file_to_database);exit;
- // Now $array_match_file_to_database contains fieldnb(1,2,3...)=>fielddatabase(key in $array_match_file_to_database)
- $param='&format='.$format.'&datatoimport='.$datatoimport.'&filetoimport='.urlencode($filetoimport);
- if ($excludefirstline) $param.='&excludefirstline=1';
- if ($separator) $param.='&separator='.urlencode($separator);
- if ($enclosure) $param.='&enclosure='.urlencode($enclosure);
- llxHeader('',$langs->trans("NewImport"),'EN:Module_Imports_En|FR:Module_Imports|ES:Módulo_Importaciones');
- $head = import_prepare_head($param,4);
- dol_fiche_head($head, 'step4', $langs->trans("NewImport"));
- print '<table width="100%" class="border">';
- // Module
- print '<tr><td width="25%">'.$langs->trans("Module").'</td>';
- print '<td>';
- $titleofmodule=$objimport->array_import_module[0]->getName();
- // Special cas for import common to module/services
- if (in_array($objimport->array_import_code[0], array('produit_supplierprices','produit_multiprice'))) $titleofmodule=$langs->trans("ProductOrService");
- print $titleofmodule;
- print '</td></tr>';
- // Lot de donnees a importer
- print '<tr><td width="25%">'.$langs->trans("DatasetToImport").'</td>';
- print '<td>';
- print img_object($objimport->array_import_module[0]->getName(),$objimport->array_import_icon[0]).' ';
- print $objimport->array_import_label[0];
- print '</td></tr>';
- print '</table><br>';
- print '<b>'.$langs->trans("InformationOnSourceFile").'</b>';
- print '<table width="100%" class="border">';
- //print '<tr><td colspan="2"><b>'.$langs->trans("InformationOnSourceFile").'</b></td></tr>';
- // Source file format
- print '<tr><td width="25%">'.$langs->trans("SourceFileFormat").'</td>';
- print '<td>';
- $text=$objmodelimport->getDriverDescForKey($format);
- print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format),$text);
- print '</td></tr>';
- // Separator and enclosure
- if ($model == 'csv') {
- print '<tr><td width="25%">'.$langs->trans("CsvOptions").'</td>';
- print '<td>';
- print '<form>';
- print '<input type="hidden" value="'.$step.'" name="step">';
- print '<input type="hidden" value="'.$format.'" name="format">';
- print '<input type="hidden" value="'.$excludefirstline.'" name="excludefirstline">';
- print '<input type="hidden" value="'.$datatoimport.'" name="datatoimport">';
- print '<input type="hidden" value="'.$filetoimport.'" name="filetoimport">';
- print $langs->trans("Separator").' : ';
- print '<input type="text" size="1" name="separator" value="'.htmlentities($separator).'"/>';
- print ' '.$langs->trans("Enclosure").' : ';
- print '<input type="text" size="1" name="enclosure" value="'.htmlentities($enclosure).'"/>';
- print '<input type="submit" value="'.$langs->trans('Update').'" class="button" />';
- print '</form>';
- print '</td></tr>';
- }
- // File to import
- print '<tr><td width="25%">'.$langs->trans("FileToImport").'</td>';
- print '<td>';
- $modulepart='import';
- $relativepath=GETPOST('filetoimport');
- print '<a data-ajax="false" href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&file='.urlencode($relativepath).'&step=4'.$param.'" target="_blank">';
- print $filetoimport;
- print '</a>';
- print '</td></tr>';
- print '</table>';
- print '<br>'."\n";
- // List of source fields
- print '<!-- List of source fields -->'."\n";
- print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">';
- print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
- print '<input type="hidden" name="action" value="select_model">';
- print '<input type="hidden" name="step" value="4">';
- print '<input type="hidden" name="format" value="'.$format.'">';
- print '<input type="hidden" name="datatoimport" value="'.$datatoimport.'">';
- print '<input type="hidden" name="filetoimport" value="'.$filetoimport.'">';
- print '<input type="hidden" name="excludefirstline" value="'.$excludefirstline.'">';
- print '<input type="hidden" name="separator" value="'.$separator.'">';
- print '<input type="hidden" name="enclosure" value="'.$enclosure.'">';
- print '<table><tr><td colspan="2">';
- print $langs->trans("SelectImportFields",img_picto('','uparrow','')).' ';
- $htmlother->select_import_model($importmodelid,'importmodelid',$datatoimport,1);
- print '<input type="submit" class="button" value="'.$langs->trans("Select").'">';
- print '</td></tr></table>';
- print '</form>';
- // Title of array with fields
- print '<table class="nobordernopadding" width="100%">';
- print '<tr class="liste_titre">';
- print '<td>'.$langs->trans("FieldsInSourceFile").'</td>';
- print '<td>'.$langs->trans("FieldsInTargetDatabase").'</td>';
- print '</tr>';
- //var_dump($array_match_file_to_database);
- print '<tr valign="top"><td width="50%">';
- $fieldsplaced=array();
- $valforsourcefieldnb=array();
- $listofkeys=array();
- foreach($array_match_file_to_database as $key => $val)
- {
- $listofkeys[$key]=1;
- }
- print "\n<!-- Box left container -->\n";
- print '<div id="left" class="connectedSortable">'."\n";
- // List of source fields
- $var=true;
- $lefti=1;
- foreach ($array_match_file_to_database as $key => $val)
- {
- $var=!$var;
- show_elem($fieldssource,$key,$val,$var); // key is field number in source file
- //print '> '.$lefti.'-'.$key.'-'.$val;
- $listofkeys[$key]=1;
- $fieldsplaced[$key]=1;
- $valforsourcefieldnb[$lefti]=$key;
- $lefti++;
- if ($lefti > count($fieldstarget)) break; // Other fields are in the not imported area
- }
- //var_dump($valforsourcefieldnb);
- // Complete source fields from count($fieldssource)+1 to count($fieldstarget)
- $more=1;
- $num=count($fieldssource);
- while ($lefti <= $num)
- {
- $var=!$var;
- $newkey=getnewkey($fieldssource,$listofkeys);
- show_elem($fieldssource,$newkey,'',$var); // key start after field number in source file
- //print '> '.$lefti.'-'.$newkey;
- $listofkeys[$key]=1;
- $lefti++;
- $more++;
- }
- print "</div>\n";
- print "<!-- End box left container -->\n";
- print '</td><td width="50%">';
- // List of targets fields
- $i = 0;
- $var=true;
- $mandatoryfieldshavesource=true;
- print '<table width="100%" class="nobordernopadding">';
- foreach($fieldstarget as $code=>$label)
- {
- $var=!$var;
- print '<tr '.$bc[$var].' height="20">';
- $i++;
- $entity=(! empty($objimport->array_import_entities[0][$code])?$objimport->array_import_entities[0][$code]:$objimport->array_import_icon[0]);
- $tablealias=preg_replace('/(\..*)$/i','',$code);
- $tablename=$objimport->array_import_tables[0][$tablealias];
- $entityicon=$entitytoicon[$entity]?$entitytoicon[$entity]:$entity;
- $entitylang=$entitytolang[$entity]?$entitytolang[$entity]:$entity;
- print '<td class="nowrap" style="font-weight: normal">=>'.img_object('',$entityicon).' '.$langs->trans($entitylang).'</td>';
- print '<td style="font-weight: normal">';
- $newlabel=preg_replace('/\*$/','',$label);
- $text=$langs->trans($newlabel);
- $more='';
- if (preg_match('/\*$/',$label))
- {
- $text='<span class="fieldrequired">'.$text.'</span>';
- $more=((! empty($valforsourcefieldnb[$i]) && $valforsourcefieldnb[$i] <= count($fieldssource)) ? '' : img_warning($langs->trans("FieldNeedSource")));
- if ($mandatoryfieldshavesource) $mandatoryfieldshavesource=(! empty($valforsourcefieldnb[$i]) && ($valforsourcefieldnb[$i] <= count($fieldssource)));
- //print 'xx'.($i).'-'.$valforsourcefieldnb[$i].'-'.$mandatoryfieldshavesource;
- }
- print $text;
- print '</td>';
- // Info field
- print '<td style="font-weight: normal" align="right">';
- $filecolumn=$array_match_database_to_file[$code];
- // Source field info
- $htmltext ='<b><u>'.$langs->trans("FieldSource").'</u></b><br>';
- if ($filecolumn > count($fieldssource)) $htmltext.=$langs->trans("DataComeFromNoWhere").'<br>';
- else
- {
- if (empty($objimport->array_import_convertvalue[0][$code])) // If source file does not need convertion
- {
- $filecolumntoshow=$filecolumn;
- $htmltext.=$langs->trans("DataComeFromFileFieldNb",$filecolumntoshow).'<br>';
- }
- else
- {
- if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchidfromref') $htmltext.=$langs->trans("DataComeFromIdFoundFromRef",$filecolumn,$langs->transnoentitiesnoconv($entitylang)).'<br>';
- if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchidfromcodeid') $htmltext.=$langs->trans("DataComeFromIdFoundFromCodeId",$filecolumn,$langs->transnoentitiesnoconv($objimport->array_import_convertvalue[0][$code]['dict'])).'<br>';
- }
- }
- $htmltext.=$langs->trans("SourceRequired").': <b>'.yn(preg_match('/\*$/',$label)).'</b><br>';
- $example=$objimport->array_import_examplevalues[0][$code];
- if (empty($objimport->array_import_convertvalue[0][$code])) // If source file does not need convertion
- {
- if ($example) $htmltext.=$langs->trans("SourceExample").': <b>'.$example.'</b><br>';
- }
- else
- {
- if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchidfromref') $htmltext.=$langs->trans("SourceExample").': <b>'.$langs->transnoentitiesnoconv("ExampleAnyRefFoundIntoElement",$entitylang).($example?' ('.$langs->transnoentitiesnoconv("Example").': '.$example.')':'').'</b><br>';
- if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchidfromcodeid') $htmltext.=$langs->trans("SourceExample").': <b>'.$langs->trans("ExampleAnyCodeOrIdFoundIntoDictionary",$langs->transnoentitiesnoconv($objimport->array_import_convertvalue[0][$code]['dict'])).($example?' ('.$langs->transnoentitiesnoconv("Example").': '.$example.')':'').'</b><br>';
- }
- $htmltext.='<br>';
- // Target field info
- $htmltext.='<b><u>'.$langs->trans("FieldTarget").'</u></b><br>';
- if (empty($objimport->array_import_convertvalue[0][$code])) // If source file does not need convertion
- {
- $htmltext.=$langs->trans("DataIsInsertedInto").'<br>';
- }
- else
- {
- if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchidfromref') $htmltext.=$langs->trans("DataIDSourceIsInsertedInto").'<br>';
- if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchidfromcodeid') $htmltext.=$langs->trans("DataCodeIDSourceIsInsertedInto").'<br>';
- }
- $htmltext.=$langs->trans("FieldTitle").": <b>".$langs->trans($newlabel)."</b><br>";
- $htmltext.=$langs->trans("Table")." -> ".$langs->trans("Field").': <b>'.$tablename." -> ".preg_replace('/^.*\./','',$code)."</b><br>";
- print $form->textwithpicto($more,$htmltext);
- print '</td>';
- print '</tr>';
- $save_select.=$bit;
- }
- print '</table>';
- print '</td></tr>';
- // List of not imported fields
- print '<tr class="liste_titre"><td colspan="2">'.$langs->trans("NotImportedFields").'</td></tr>';
- print '<tr valign="top"><td width="50%">';
- print "\n<!-- Box ignore container -->\n";
- print '<div id="right" class="connectedSortable">'."\n";
- $nbofnotimportedfields=0;
- foreach ($fieldssource as $key => $val)
- {
- if (empty($fieldsplaced[$key]))
- {
- //$var=!$var;
- $nbofnotimportedfields++;
- show_elem($fieldssource,$key,'',$var,'nostyle');
- //print '> '.$lefti.'-'.$key;
- $listofkeys[$key]=1;
- $lefti++;
- }
- }
- // Print one more empty field
- $newkey=getnewkey($fieldssource,$listofkeys);
- show_elem($fieldssource,$newkey,'',$var,'nostyle');
- //print '> '.$lefti.'-'.$newkey;
- $listofkeys[$newkey]=1;
- $nbofnotimportedfields++;
- print "</div>\n";
- print "<!-- End box ignore container -->\n";
- print '</td>';
- print '<td width="50%">';
- $i=0;
- while ($i < $nbofnotimportedfields)
- {
- // Print empty cells
- show_elem('','','none',$var,'nostyle');
- $i++;
- }
- print '</td></tr>';
- print '</table>';
- dol_fiche_end();
- if ($conf->use_javascript_ajax)
- {
- print '<script type="text/javascript" language="javascript">';
- print 'jQuery(function() {
- jQuery("#left, #right").sortable({
- /* placeholder: \'ui-state-highlight\', */
- handle: \'.boxhandle\',
- revert: \'invalid\',
- items: \'.box\',
- containment: \'.fiche\',
- connectWith: \'.connectedSortable\',
- stop: function(event, ui) {
- updateOrder();
- }
- });
- });
- ';
- print "\n";
- print 'function updateOrder(){'."\n";
- print 'var left_list = cleanSerialize(jQuery("#left").sortable("serialize" ));'."\n";
- //print 'var right_list = cleanSerialize(jQuery("#right").sortable("serialize" ));'."\n";
- print 'var boxorder = \'A:\' + left_list;'."\n";
- //print 'var boxorder = \'A:\' + left_list + \'-B:\' + right_list;'."\n";
- //print 'alert(\'boxorder=\' + boxorder);';
- //print 'var userid = \''.$user->id.'\';'."\n";
- //print 'var datatoimport = "'.$datatoimport.'";'."\n";
- // print 'jQuery.ajax({ url: "ajaximport.php?step=4&boxorder=" + boxorder + "&userid=" + userid + "&datatoimport=" + datatoimport,
- // async: false
- // });'."\n";
- // Now reload page
- print 'var newlocation= \''.$_SERVER["PHP_SELF"].'?step=4'.$param.'&action=saveorder&boxorder=\' + boxorder;'."\n";
- //print 'alert(newlocation);';
- print 'window.location.href=newlocation;'."\n";
- print '}'."\n";
- print '</script>'."\n";
- }
- /*
- * Barre d'action
- */
- print '<div class="tabsAction">';
- if (count($array_match_file_to_database))
- {
- if ($mandatoryfieldshavesource)
- {
- print '<a class="butAction" href="import.php?step=5'.$param.'&filetoimport='.urlencode($filetoimport).'">'.$langs->trans("NextStep").'</a>';
- }
- else
- {
- print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("SomeMandatoryFieldHaveNoSource")).'">'.$langs->trans("NextStep").'</a>';
- }
- }
- print '</div>';
- // Area for profils import
- if (count($array_match_file_to_database))
- {
- print '<br>'."\n";
- print '<!-- Area to add new import profile -->'."\n";
- print $langs->trans("SaveImportModel");
- print '<form class="nocellnopadd" action="'.$_SERVER["PHP_SELF"].'" method="post">';
- print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
- print '<input type="hidden" name="action" value="add_import_model">';
- print '<input type="hidden" name="step" value="'.$step.'">';
- print '<input type="hidden" name="format" value="'.$format.'">';
- print '<input type="hidden" name="datatoimport" value="'.$datatoimport.'">';
- print '<input type="hidden" name="filetoimport" value="'.$filetoimport.'">';
- print '<input type="hidden" name="hexa" value="'.$hexa.'">';
- print '<input type="hidden" name="excludefirstline" value="'.$excludefirstline.'">';
- print '<input type="hidden" value="'.$separator.'" name="separator">';
- print '<input type="hidden" value="'.$enclosure.'" name="enclosure">';
- print '<table summary="selectofimportprofil" class="noborder" width="100%">';
- print '<tr class="liste_titre">';
- print '<td>'.$langs->trans("ImportModelName").'</td>';
- print '<td> </td>';
- print '</tr>';
- $var=false;
- print '<tr '.$bc[$var].'>';
- print '<td><input name="import_name" size="48" value=""></td><td align="right">';
- print '<input type="submit" class="button" value="'.$langs->trans("SaveImportProfile").'">';
- print '</td></tr>';
- // List of existing import profils
- $sql = "SELECT rowid, label";
- $sql.= " FROM ".MAIN_DB_PREFIX."import_model";
- $sql.= " WHERE type = '".$datatoimport."'";
- $sql.= " ORDER BY rowid";
- $resql = $db->query($sql);
- if ($resql)
- {
- $num = $db->num_rows($resql);
- $i = 0;
- $var=false;
- while ($i < $num)
- {
- $var=!$var;
- $obj = $db->fetch_object($resql);
- print '<tr '.$bc[$var].'><td>';
- print $obj->label;
- print '</td><td align="right">';
- print '<a href="'.$_SERVER["PHP_SELF"].'?step='.$step.$param.'&action=deleteprof&id='.$obj->rowid.'&filetoimport='.urlencode($filetoimport).'">';
- print img_delete();
- print '</a>';
- print '</tr>';
- $i++;
- }
- }
- else {
- dol_print_error($db);
- }
- print '</table>';
- print '</form>';
- }
- }
- // STEP 5: Summary of choices and launch simulation
- if ($step == 5 && $datatoimport)
- {
- $model=$format;
- $liste=$objmodelimport->liste_modeles($db);
- // Create classe to use for import
- $dir = DOL_DOCUMENT_ROOT . "/core/modules/import/";
- $file = "import_".$model.".modules.php";
- $classname = "Import".ucfirst($model);
- require_once $dir.$file;
- $obj = new $classname($db,$datatoimport);
- if ($model == 'csv') {
- $obj->separator = $separator;
- $obj->enclosure = $enclosure;
- }
- // Load source fields in input file
- $fieldssource=array();
- $result=$obj->import_open_file($conf->import->dir_temp.'/'.$filetoimport,$langs);
- if ($result >= 0)
- {
- // Read first line
- $arrayrecord=$obj->import_read_record();
- // Put into array fieldssource starting with 1.
- $i=1;
- foreach($arrayrecord as $key => $val)
- {
- $fieldssource[$i]['example1']=dol_trunc($val['val'],24);
- $i++;
- }
- $obj->import_close_file();
- }
- $nboflines=dol_count_nb_of_line($conf->import->dir_temp.'/'.$filetoimport);
- $param='&leftmenu=import&format='.$format.'&datatoimport='.$datatoimport.'&filetoimport='.urlencode($filetoimport).'&nboflines='.$nboflines.'&separator='.urlencode($separator).'&enclosure='.urlencode($enclosure);
- $param2 = $param;
- if ($excludefirstline) {
- $param.='&excludefirstline=1';
- }
- llxHeader('',$langs->trans("NewImport"),'EN:Module_Imports_En|FR:Module_Imports|ES:Módulo_Importaciones');
- $head = import_prepare_head($param,5);
- dol_fiche_head($head, 'step5', $langs->trans("NewImport"));
- print '<table width="100%" class="border">';
- // Module
- print '<tr><td width="25%">'.$langs->trans("Module").'</td>';
- print '<td>';
- $titleofmodule=$objimport->array_import_module[0]->getName();
- // Special cas for import common to module/services
- if (in_array($objimport->array_import_code[0], array('produit_supplierprices','produit_multiprice'))) $titleofmodule=$langs->trans("ProductOrService");
- print $titleofmodule;
- print '</td></tr>';
- // Lot de donnees a importer
- print '<tr><td>'.$langs->trans("DatasetToImport").'</td>';
- print '<td>';
- print img_object($objimport->array_import_module[0]->getName(),$objimport->array_import_icon[0]).' ';
- print $objimport->array_import_label[0];
- print '</td></tr>';
- print '</table><br>';
- print '<b>'.$langs->trans("InformationOnSourceFile").'</b>';
- print '<table width="100%" class="border">';
- //print '<tr><td colspan="2"><b>'.$langs->trans("InformationOnSourceFile").'</b></td></tr>';
- // Source file format
- print '<tr><td width="25%">'.$langs->trans("SourceFileFormat").'</td>';
- print '<td>';
- $text=$objmodelimport->getDriverDescForKey($format);
- print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format),$text);
- print '</td></tr>';
- // File to import
- print '<tr><td>'.$langs->trans("FileToImport").'</td>';
- print '<td>';
- $modulepart='import';
- $relativepath=GETPOST('filetoimport');
- print '<a data-ajax="false" href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&file='.urlencode($relativepath).'&step=4'.$param.'" target="_blank">';
- print $filetoimport;
- print '</a>';
- print '</td></tr>';
- // Nb of fields
- print '<tr><td>';
- print $langs->trans("NbOfSourceLines");
- print '</td><td>';
- print $nboflines;
- print '</td></tr>';
- // Checkbox do not import first line
- print '<tr><td>';
- print $langs->trans("Option");
- print '</td><td>';
- print '<input type="checkbox" name="excludefirstline" value="1"';
- print ($excludefirstline?' checked="checked"':'');
- print ' onClick="javascript: window.location=\''.$_SERVER["PHP_SELF"].'?step=5&excludefirstline='.($excludefirstline?'0':'1').$param2.'\';">';
- print ' '.$langs->trans("DoNotImportFirstLine");
- print '</td></tr>';
- print '</table>';
- print '<br>';
- print '<b>'.$langs->trans("InformationOnTargetTables").'</b>';
- print '<table width="100%" class="border">';
- //print '<tr><td colspan="2"><b>'.$langs->trans("InformationOnTargetTables").'</b></td></tr>';
- // Tables imported
- print '<tr><td width="25%">';
- print $langs->trans("TablesTarget");
- print '</td><td>';
- $listtables=array();
- $sort_array_match_file_to_database=$array_match_file_to_database;
- foreach($array_match_file_to_database as $code=>$label)
- {
- //var_dump($fieldssource);
- if ($code > count($fieldssource)) continue;
- //print $code.'-'.$label;
- $alias=preg_replace('/(\..*)$/i','',$label);
- $listtables[$alias]=$objimport->array_import_tables[0][$alias];
- }
- if (count($listtables))
- {
- $newval='';
- //ksort($listtables);
- foreach ($listtables as $val)
- {
- if ($newval) print ', ';
- $newval=$val;
- // Link to Dolibarr wiki pages
- /*$helppagename='EN:Table_'.$newval;
- if ($helppagename && empty($conf->global->MAIN_HELP_DISABLELINK))
- {
- // Get helpbaseurl, helppage and mode from helppagename and langs
- $arrayres=getHelpParamFor($helppagename,$langs);
- $helpbaseurl=$arrayres['helpbaseurl'];
- $helppage=$arrayres['helppage'];
- $mode=$arrayres['mode'];
- $newval.=' <a href="'.sprintf($helpbaseurl,$helppage).'">'.img_picto($langs->trans($mode == 'wiki' ? 'GoToWikiHelpPage': 'GoToHelpPage'),DOL_URL_ROOT.'/theme/common/helpdoc.png','',1).'</a>';
- }*/
- print $newval;
- }
- }
- else print $langs->trans("Error");
- print '</td></tr>';
- // Fields imported
- print '<tr><td>';
- print $langs->trans("FieldsTarget").'</td><td>';
- $listfields=array();
- $i=0;
- //print 'fieldsource='.$fieldssource;
- $sort_array_match_file_to_database=$array_match_file_to_database;
- ksort($sort_array_match_file_to_database);
- //var_dump($sort_array_match_file_to_database);
- foreach($sort_array_match_file_to_database as $code=>$label)
- {
- $i++;
- //var_dump($fieldssource);
- if ($code > count($fieldssource)) continue;
- //print $code.'-'.$label;
- $alias=preg_replace('/(\..*)$/i','',$label);
- $listfields[$i]=$langs->trans("Field").' '.$code.'->'.$label;
- }
- print count($listfields)?(join(', ',$listfields)):$langs->trans("Error");
- print '</td></tr>';
- print '</table>';
- dol_fiche_end();
- if (GETPOST('action') != 'launchsimu')
- {
- // Show import id
- print $langs->trans("NowClickToTestTheImport",$langs->transnoentitiesnoconv("RunSimulateImportFile")).'<br>';
- print '<br>';
- // Actions
- print '<div class="center">';
- if ($user->rights->import->run)
- {
- print '<a class="butAction" href="'.DOL_URL_ROOT.'/imports/import.php?leftmenu=import&step=5&action=launchsimu'.$param.'">'.$langs->trans("RunSimulateImportFile").'</a>';
- }
- else
- {
- print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("RunSimulateImportFile").'</a>';
- }
- print '</div>';
- }
- else
- {
- // Launch import
- $arrayoferrors=array();
- $arrayofwarnings=array();
- $maxnboferrors=empty($conf->global->IMPORT_MAX_NB_OF_ERRORS)?50:$conf->global->IMPORT_MAX_NB_OF_ERRORS;
- $maxnbofwarnings=empty($conf->global->IMPORT_MAX_NB_OF_WARNINGS)?50:$conf->global->IMPORT_MAX_NB_OF_WARNINGS;
- $nboferrors=0;
- $nbofwarnings=0;
- $importid=dol_print_date(dol_now(),'%Y%m%d%H%M%S');
- //var_dump($array_match_file_to_database);
- $db->begin();
- // Open input file
- $nbok=0;
- $pathfile=$conf->import->dir_temp.'/'.$filetoimport;
- $result=$obj->import_open_file($pathfile,$langs);
- if ($result > 0)
- {
- global $tablewithentity_cache;
- $tablewithentity_cache=array();
- $sourcelinenb=0; $endoffile=0;
- // Loop on each input file record
- while ($sourcelinenb < $nboflines && ! $endoffile)
- {
- $sourcelinenb++;
- // Read line and stor it into $arrayrecord
- $arrayrecord=$obj->import_read_record();
- if ($arrayrecord === false)
- {
- $arrayofwarnings[$sourcelinenb][0]=array('lib'=>'File has '.$nboflines.' lines. However we reach end of file after record '.$sourcelinenb.'. This may occurs when some records are split onto several lines.','type'=>'EOF_RECORD_ON_SEVERAL_LINES');
- $endoffile++;
- continue;
- }
- if ($excludefirstline && $sourcelinenb == 1) continue;
- //
- $result=$obj->import_insert($arrayrecord,$array_match_file_to_database,$objimport,count($fieldssource),$importid);
- if (count($obj->errors)) $arrayoferrors[$sourcelinenb]=$obj->errors;
- if (count($obj->warnings)) $arrayofwarnings[$sourcelinenb]=$obj->warnings;
- if (! count($obj->errors) && ! count($obj->warnings)) $nbok++;
- }
- // Close file
- $obj->import_close_file();
- }
- else
- {
- print $langs->trans("ErrorFailedToOpenFile",$pathfile);
- }
- $db->rollback(); // We force rollback because this was just a simulation.
- // Show OK
- if (! count($arrayoferrors) && ! count($arrayofwarnings)) print img_picto($langs->trans("OK"),'tick').' <b>'.$langs->trans("NoError").'</b><br><br>';
- else print $langs->trans("NbOfLinesOK",$nbok).'</b><br><br>';
- // Show Errors
- //var_dump($arrayoferrors);
- if (count($arrayoferrors))
- {
- print img_error().' <b>'.$langs->trans("ErrorsOnXLines",count($arrayoferrors)).'</b><br>';
- print '<table width="100%" class="border"><tr><td>';
- foreach ($arrayoferrors as $key => $val)
- {
- $nboferrors++;
- if ($nboferrors > $maxnboferrors)
- {
- print $langs->trans("TooMuchErrors",(count($arrayoferrors)-$nboferrors))."<br>";
- break;
- }
- print '* '.$langs->trans("Line").' '.$key.'<br>';
- foreach($val as $i => $err)
- {
- print ' > '.$err['lib'].'<br>';
- }
- }
- print '</td></tr></table>';
- print '<br>';
- }
- // Show Warnings
- //var_dump($arrayoferrors);
- if (count($arrayofwarnings))
- {
- print img_warning().' <b>'.$langs->trans("WarningsOnXLines",count($arrayofwarnings)).'</b><br>';
- print '<table width="100%" class="border"><tr><td>';
- foreach ($arrayofwarnings as $key => $val)
- {
- $nbofwarnings++;
- if ($nbofwarnings > $maxnbofwarnings)
- {
- print $langs->trans("TooMuchWarnings",(count($arrayofwarnings)-$nbofwarnings))."<br>";
- break;
- }
- print ' * '.$langs->trans("Line").' '.$key.'<br>';
- foreach($val as $i => $err)
- {
- print ' > '.$err['lib'].'<br>';
- }
- }
- print '</td></tr></table>';
- print '<br>';
- }
- // Show import id
- $importid=dol_print_date(dol_now(),'%Y%m%d%H%M%S');
- print '<div class="center">';
- print $langs->trans("NowClickToRunTheImport",$langs->transnoentitiesnoconv("RunImportFile")).'<br>';
- print $langs->trans("DataLoadedWithId",$importid).'<br>';
- print '</div>';
- print '<br>';
- // Actions
- print '<div class="center">';
- if ($user->rights->import->run)
- {
- if (empty($nboferrors))
- {
- print '<a class="butAction" href="'.DOL_URL_ROOT.'/imports/import.php?leftmenu=import&step=6&importid='.$importid.$param.'">'.$langs->trans("RunImportFile").'</a>';
- }
- else
- {
- //print '<a class="butAction" href="'.DOL_URL_ROOT.'/imports/import.php?leftmenu=import&step=5&action=launchsimu'.$param.'">'.$langs->trans("RunSimulateImportFile").'</a>';
- print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("CorrectErrorBeforeRunningImport")).'">'.$langs->trans("RunImportFile").'</a>';
- }
- }
- else
- {
- print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("RunSimulateImportFile").'</a>';
- print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("RunImportFile").'</a>';
- }
- print '</div>';
- }
- }
- // STEP 6: Real import
- if ($step == 6 && $datatoimport)
- {
- $model=$format;
- $liste=$objmodelimport->liste_modeles($db);
- $importid=$_REQUEST["importid"];
- // Create classe to use for import
- $dir = DOL_DOCUMENT_ROOT . "/core/modules/import/";
- $file = "import_".$model.".modules.php";
- $classname = "Import".ucfirst($model);
- require_once $dir.$file;
- $obj = new $classname($db,$datatoimport);
- if ($model == 'csv') {
- $obj->separator = $separator;
- $obj->enclosure = $enclosure;
- }
- // Load source fields in input file
- $fieldssource=array();
- $result=$obj->import_open_file($conf->import->dir_temp.'/'.$filetoimport,$langs);
- if ($result >= 0)
- {
- // Read first line
- $arrayrecord=$obj->import_read_record();
- // Put into array fieldssource starting with 1.
- $i=1;
- foreach($arrayrecord as $key => $val)
- {
- $fieldssource[$i]['example1']=dol_trunc($val['val'],24);
- $i++;
- }
- $obj->import_close_file();
- }
- $nboflines=(! empty($_GET["nboflines"])?$_GET["nboflines"]:dol_count_nb_of_line($conf->import->dir_temp.'/'.$filetoimport));
- $param='&format='.$format.'&datatoimport='.$datatoimport.'&filetoimport='.urlencode($filetoimport).'&nboflines='.$nboflines;
- if ($excludefirstline) $param.='&excludefirstline=1';
- if ($separator) $param.='&separator='.urlencode($separator);
- if ($enclosure) $param.='&enclosure='.urlencode($enclosure);
- llxHeader('',$langs->trans("NewImport"),'EN:Module_Imports_En|FR:Module_Imports|ES:Módulo_Importaciones');
- $head = import_prepare_head($param,6);
- dol_fiche_head($head, 'step6', $langs->trans("NewImport"));
- print '<table width="100%" class="border">';
- // Module
- print '<tr><td width="25%">'.$langs->trans("Module").'</td>';
- print '<td>';
- $titleofmodule=$objimport->array_import_module[0]->getName();
- // Special cas for import common to module/services
- if (in_array($objimport->array_import_code[0], array('produit_supplierprices','produit_multiprice'))) $titleofmodule=$langs->trans("ProductOrService");
- print $titleofmodule;
- print '</td></tr>';
- // Lot de donnees a importer
- print '<tr><td>'.$langs->trans("DatasetToImport").'</td>';
- print '<td>';
- print img_object($objimport->array_import_module[0]->getName(),$objimport->array_import_icon[0]).' ';
- print $objimport->array_import_label[0];
- print '</td></tr>';
- print '</table><br>';
- print '<b>'.$langs->trans("InformationOnSourceFile").'</b>';
- print '<table width="100%" class="border">';
- //print '<tr><td colspan="2"><b>'.$langs->trans("InformationOnSourceFile").'</b></td></tr>';
- // Source file format
- print '<tr><td width="25%">'.$langs->trans("SourceFileFormat").'</td>';
- print '<td>';
- $text=$objmodelimport->getDriverDescForKey($format);
- print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format),$text);
- print '</td></tr>';
- // File to import
- print '<tr><td>'.$langs->trans("FileToImport").'</td>';
- print '<td>';
- $modulepart='import';
- $relativepath=GETPOST('filetoimport');
- print '<a data-ajax="false" href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&file='.urlencode($relativepath).'&step=4'.$param.'" target="_blank">';
- print $filetoimport;
- print '</a>';
- print '</td></tr>';
- // Nb of fields
- print '<tr><td>';
- print $langs->trans("NbOfSourceLines");
- print '</td><td>';
- print $nboflines;
- print '</td></tr>';
- // Checkbox do not import first line
- print '<tr><td>';
- print $langs->trans("Option");
- print '</td><td>';
- print '<input type="checkbox" name="excludefirstline" value="1" disabled="disabled"';
- print ($excludefirstline?' checked="checked"':'');
- print '>';
- print ' '.$langs->trans("DoNotImportFirstLine");
- print '</td></tr>';
- print '</table>';
- print '<br>';
- print '<b>'.$langs->trans("InformationOnTargetTables").'</b>';
- print '<table width="100%" class="border">';
- //print '<tr><td colspan="2"><b>'.$langs->trans("InformationOnTargetTables").'</b></td></tr>';
- // Tables imported
- print '<tr><td width="25%">';
- print $langs->trans("TablesTarget");
- print '</td><td>';
- $listtables=array();
- foreach($array_match_file_to_database as $code=>$label)
- {
- //var_dump($fieldssource);
- if ($code > count($fieldssource)) continue;
- //print $code.'-'.$label;
- $alias=preg_replace('/(\..*)$/i','',$label);
- $listtables[$alias]=$objimport->array_import_tables[0][$alias];
- }
- if (count($listtables))
- {
- $newval='';
- foreach ($listtables as $val)
- {
- if ($newval) print ', ';
- $newval=$val;
- // Link to Dolibarr wiki pages
- /*$helppagename='EN:Table_'.$newval;
- if ($helppagename && empty($conf->global->MAIN_HELP_DISABLELINK))
- {
- // Get helpbaseurl, helppage and mode from helppagename and langs
- $arrayres=getHelpParamFor($helppagename,$langs);
- $helpbaseurl=$arrayres['helpbaseurl'];
- $helppage=$arrayres['helppage'];
- $mode=$arrayres['mode'];
- $newval.=' <a href="'.sprintf($helpbaseurl,$helppage).'">'.img_picto($langs->trans($mode == 'wiki' ? 'GoToWikiHelpPage': 'GoToHelpPage'),DOL_URL_ROOT.'/theme/common/helpdoc.png','',1).'</a>';
- }*/
- print $newval;
- }
- }
- else print $langs->trans("Error");
- print '</td></tr>';
- // Fields imported
- print '<tr><td>';
- print $langs->trans("FieldsTarget").'</td><td>';
- $listfields=array();
- $i=0;
- $sort_array_match_file_to_database=$array_match_file_to_database;
- ksort($sort_array_match_file_to_database);
- //var_dump($sort_array_match_file_to_database);
- foreach($sort_array_match_file_to_database as $code=>$label)
- {
- $i++;
- //var_dump($fieldssource);
- if ($code > count($fieldssource)) continue;
- //print $code.'-'.$label;
- $alias=preg_replace('/(\..*)$/i','',$label);
- $listfields[$i]=$langs->trans("Field").' '.$code.'->'.$label;
- }
- print count($listfields)?(join(', ',$listfields)):$langs->trans("Error");
- print '</td></tr>';
- print '</table>';
- // Launch import
- $arrayoferrors=array();
- $arrayofwarnings=array();
- $maxnboferrors=empty($conf->global->IMPORT_MAX_NB_OF_ERRORS)?50:$conf->global->IMPORT_MAX_NB_OF_ERRORS;
- $maxnbofwarnings=empty($conf->global->IMPORT_MAX_NB_OF_WARNINGS)?50:$conf->global->IMPORT_MAX_NB_OF_WARNINGS;
- $nboferrors=0;
- $nbofwarnings=0;
- $importid=dol_print_date(dol_now(),'%Y%m%d%H%M%S');
- //var_dump($array_match_file_to_database);
- $db->begin();
- // Open input file
- $nbok=0;
- $pathfile=$conf->import->dir_temp.'/'.$filetoimport;
- $result=$obj->import_open_file($pathfile,$langs);
- if ($result > 0)
- {
- global $tablewithentity_cache;
- $tablewithentity_cache=array();
- $sourcelinenb=0; $endoffile=0;
- while ($sourcelinenb < $nboflines && ! $endoffile)
- {
- $sourcelinenb++;
- $arrayrecord=$obj->import_read_record();
- if ($arrayrecord === false)
- {
- $arrayofwarnings[$sourcelinenb][0]=array('lib'=>'File has '.$nboflines.' lines. However we reach end of file after record '.$sourcelinenb.'. This may occurs when some records are split onto several lines.','type'=>'EOF_RECORD_ON_SEVERAL_LINES');
- $endoffile++;
- continue;
- }
- if ($excludefirstline && $sourcelinenb == 1) continue;
- $result=$obj->import_insert($arrayrecord,$array_match_file_to_database,$objimport,count($fieldssource),$importid);
- if (count($obj->errors)) $arrayoferrors[$sourcelinenb]=$obj->errors;
- if (count($obj->warnings)) $arrayofwarnings[$sourcelinenb]=$obj->warnings;
- if (! count($obj->errors) && ! count($obj->warnings)) $nbok++;
- }
- // Close file
- $obj->import_close_file();
- }
- else
- {
- print $langs->trans("ErrorFailedToOpenFile",$pathfile);
- }
- if (count($arrayoferrors) > 0) $db->rollback(); // We force rollback because this was errors.
- else $db->commit(); // We can commit if no errors.
- dol_fiche_end();
- // Show result
- print '<br>';
- print '<div class="center">';
- print $langs->trans("NbOfLinesImported",$nbok).'</b><br><br>';
- print $langs->trans("FileWasImported",$importid).'<br>';
- print $langs->trans("YouCanUseImportIdToFindRecord",$importid).'<br>';
- print '</div>';
- }
- print '<br>';
- llxFooter();
- $db->close();
- /**
- * Function to put the movable box of a source field
- *
- * @param array $fieldssource List of source fields
- * @param int $pos Pos
- * @param string $key Key
- * @param boolean $var Line style (odd or not)
- * @param int $nostyle Hide style
- * @return void
- */
- function show_elem($fieldssource,$pos,$key,$var,$nostyle='')
- {
- global $langs,$bc;
- print "\n\n<!-- Box ".$pos." start -->\n";
- print '<div class="box" style="padding: 0px 0px 0px 0px;" id="boxto_'.$pos.'">'."\n";
- print '<table summary="boxtable'.$pos.'" width="100%" class="nobordernopadding">'."\n";
- if ($pos && $pos > count($fieldssource)) // No fields
- {
- print '<tr '.($nostyle?'':$bc[$var]).' height="20">';
- print '<td class="nocellnopadding" width="16" style="font-weight: normal">';
- print img_picto(($pos>0?$langs->trans("MoveField",$pos):''),'uparrow','class="boxhandle" style="cursor:move;"');
- print '</td>';
- print '<td style="font-weight: normal">';
- print $langs->trans("NoFields");
- print '</td>';
- print '</tr>';
- }
- elseif ($key == 'none') // Empty line
- {
- print '<tr '.($nostyle?'':$bc[$var]).' height="20">';
- print '<td class="nocellnopadding" width="16" style="font-weight: normal">';
- print ' ';
- print '</td>';
- print '<td style="font-weight: normal">';
- print ' ';
- print '</td>';
- print '</tr>';
- }
- else // Print field of source file
- {
- print '<tr '.($nostyle?'':$bc[$var]).' height="20">';
- print '<td class="nocellnopadding" width="16" style="font-weight: normal">';
- // The image must have the class 'boxhandle' beause it's value used in DOM draggable objects to define the area used to catch the full object
- print img_picto($langs->trans("MoveField",$pos),'uparrow','class="boxhandle" style="cursor:move;"');
- print '</td>';
- print '<td style="font-weight: normal">';
- print $langs->trans("Field").' '.$pos;
- $example=$fieldssource[$pos]['example1'];
- if ($example)
- {
- if (! utf8_check($example)) $example=utf8_encode($example);
- print ' (<i>'.$example.'</i>)';
- }
- print '</td>';
- print '</tr>';
- }
- print "</table>\n";
- print "</div>\n";
- print "<!-- Box end -->\n\n";
- }
- /**
- * Return not used field number
- *
- * @param array $fieldssource Array of field source
- * @param array $listofkey Array of keys
- * @return void
- */
- function getnewkey(&$fieldssource,&$listofkey)
- {
- $i=count($fieldssource)+1;
- // Max number of key
- $maxkey=0;
- foreach($listofkey as $key=>$val)
- {
- $maxkey=max($maxkey,$key);
- }
- // Found next empty key
- while($i <= $maxkey)
- {
- if (empty($listofkey[$i])) break;
- else $i++;
- }
- $listofkey[$i]=1;
- return $i;
- }
|