29require_once
'../main.inc.php';
30require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
31require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
32require_once DOL_DOCUMENT_ROOT.
'/imports/class/import.class.php';
33require_once DOL_DOCUMENT_ROOT.
'/core/modules/import/modules_import.php';
34require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
35require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
36require_once DOL_DOCUMENT_ROOT.
'/core/lib/import.lib.php';
39$langs->loadLangs(array(
'exports',
'compta',
'errors',
'projects',
'admin'));
47 'invoice_line' =>
'bill',
49 'order_line' =>
'order',
51 'propal_line' =>
'propal',
52 'intervention' =>
'intervention',
53 'inter_line' =>
'intervention',
55 'member_type' =>
'group',
56 'subscription' =>
'payment',
57 'payment' =>
'payment',
59 'tax_type' =>
'generic',
61 'account' =>
'account',
62 'product' =>
'product',
63 'virtualproduct' =>
'product',
64 'subproduct' =>
'product',
65 'product_supplier_ref' =>
'product',
67 'warehouse' =>
'stock',
69 'stockbatch' =>
'stock',
70 'category' =>
'category',
71 'shipment' =>
'sending',
72 'shipment_line' =>
'sending',
73 'reception' =>
'sending',
74 'reception_line' =>
'sending',
75 'expensereport' =>
'trip',
76 'expensereport_line' =>
'trip',
77 'holiday' =>
'holiday',
78 'contract_line' =>
'contract',
79 'translation' =>
'generic',
87 'company' =>
'Company',
88 'contact' =>
'Contact',
90 'invoice_line' =>
'InvoiceLine',
92 'order_line' =>
'OrderLine',
93 'propal' =>
'Proposal',
94 'propal_line' =>
'ProposalLine',
95 'intervention' =>
'Intervention',
96 'inter_line' =>
'InterLine',
98 'member_type' =>
'MemberType',
99 'subscription' =>
'Subscription',
100 'tax' =>
'SocialContribution',
101 'tax_type' =>
'DictionarySocialContributions',
102 'account' =>
'BankTransactions',
103 'payment' =>
'Payment',
104 'product' =>
'Product',
105 'virtualproduct' =>
'AssociatedProducts',
106 'subproduct' =>
'SubProduct',
107 'product_supplier_ref' =>
'SupplierPrices',
108 'service' =>
'Service',
110 'movement' =>
'StockMovement',
112 'stockbatch' =>
'StockDetailPerBatch',
113 'warehouse' =>
'Warehouse',
114 'category' =>
'Category',
116 'trip' =>
'TripsAndExpenses',
117 'shipment' =>
'Shipments',
118 'shipment_line' =>
'ShipmentLine',
119 'project' =>
'Projects',
120 'projecttask' =>
'Tasks',
121 'task_time' =>
'TaskTimeSpent',
123 'expensereport' =>
'ExpenseReport',
124 'expensereport_line' =>
'ExpenseReportLine',
125 'holiday' =>
'TitreRequestCP',
126 'contract' =>
'Contract',
127 'contract_line' =>
'ContractLine',
128 'translation' =>
'Translation',
130 'bomline' =>
'BOMLine'
133$datatoimport =
GETPOST(
'datatoimport');
135$filetoimport =
GETPOST(
'filetoimport');
136$action =
GETPOST(
'action',
'alpha');
137$confirm =
GETPOST(
'confirm',
'alpha');
139$import_name =
GETPOST(
'import_name');
142$excludefirstline = (
GETPOST(
'excludefirstline') ?
GETPOST(
'excludefirstline') : 2);
143$endatlinenb = (
GETPOST(
'endatlinenb') ?
GETPOST(
'endatlinenb') :
'');
144$updatekeys = (
GETPOST(
'updatekeys',
'array') ?
GETPOST(
'updatekeys',
'array') : array());
145$separator = (
GETPOST(
'separator',
'nohtml') ?
GETPOST(
'separator',
'nohtml', 3) :
'');
146$enclosure = (
GETPOST(
'enclosure',
'nohtml') ?
GETPOST(
'enclosure',
'nohtml') :
'"');
147$charset =
GETPOST(
'charset',
'aZ09');
148$separator_used = str_replace(
'\t',
"\t", $separator);
152$hookmanager->initHooks(array(
'imports'));
155$objimport =
new Import($db);
156$objimport->load_arrays($user, ($step == 1 ?
'' : $datatoimport));
158if (empty($updatekeys) && !empty($objimport->array_import_preselected_updatekeys[0])) {
159 $updatekeys = $objimport->array_import_preselected_updatekeys[0];
164$form =
new Form($db);
169if (empty($array_match_file_to_database)) {
170 $serialized_array_match_file_to_database = isset($_SESSION[
"dol_array_match_file_to_database_select"]) ? $_SESSION[
"dol_array_match_file_to_database_select"] :
'';
171 $array_match_file_to_database = array();
172 $fieldsarray = explode(
',', $serialized_array_match_file_to_database);
173 foreach ($fieldsarray as $elem) {
174 $tabelem = explode(
'=', $elem, 2);
176 $val = (isset($tabelem[1]) ? $tabelem[1] :
'');
178 $array_match_file_to_database[$key] = $val;
188if ($action ==
'deleteprof') {
191 $result = $objimport->delete($user);
196if ($action ==
'add_import_model') {
200 foreach ($array_match_file_to_database as $key => $val) {
204 $hexa .= $key.
'='.$val;
207 $objimport->model_name = $import_name;
208 $objimport->datatoimport = $datatoimport;
209 $objimport->hexa = $hexa;
210 $objimport->fk_user = (
GETPOST(
'visibility',
'aZ09') ==
'all' ? 0 : $user->id);
212 $result = $objimport->create($user);
214 setEventMessages($langs->trans(
"ImportModelSaved", $objimport->model_name),
null,
'mesgs');
217 $langs->load(
"errors");
218 if ($objimport->errno ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
219 setEventMessages($langs->trans(
"ErrorImportDuplicateProfil"),
null,
'errors');
225 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"ImportModelName")),
null,
'errors');
229if ($step == 3 && $datatoimport) {
234 $fullpath = $conf->import->dir_temp.
"/".$nowyearmonth.
'-'.$_FILES[
'userfile'][
'name'];
236 dol_syslog(
"File ".$fullpath.
" was added for import");
238 $langs->load(
"errors");
244 if ($action ==
'confirm_deletefile' && $confirm ==
'yes') {
245 $langs->load(
"other");
247 $param =
'&datatoimport='.urlencode($datatoimport).
'&format='.urlencode($format);
248 if ($excludefirstline) {
249 $param .=
'&excludefirstline='.urlencode($excludefirstline);
252 $param .=
'&endatlinenb='.urlencode($endatlinenb);
255 $file = $conf->import->dir_temp.
'/'.
GETPOST(
'urlfile');
262 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?step='.$step.$param);
267if ($step == 4 && $action ==
'select_model') {
269 $_SESSION[
"dol_array_match_file_to_database"] =
'';
270 $serialized_array_match_file_to_database =
'';
271 $array_match_file_to_database = array();
275 $result = $objimport->fetch($importmodelid);
277 $serialized_array_match_file_to_database = $objimport->hexa;
278 $fieldsarray = explode(
',', $serialized_array_match_file_to_database);
279 foreach ($fieldsarray as $elem) {
280 $tabelem = explode(
'=', $elem);
284 $array_match_file_to_database[$key] = $val;
287 $_SESSION[
"dol_array_match_file_to_database"] = $serialized_array_match_file_to_database;
288 $_SESSION[
'dol_array_match_file_to_database_select'] = $_SESSION[
"dol_array_match_file_to_database"];
291if ($action ==
'saveselectorder') {
293 $serialized_array_match_file_to_database =
'';
295 $selectorder = explode(
",",
GETPOST(
'selectorder'));
296 $fieldtarget = $fieldstarget = $objimport->array_import_fields[0];
297 foreach ($selectorder as $key => $code) {
298 $serialized_array_match_file_to_database .= $key.
'='.$code;
299 $serialized_array_match_file_to_database .=
',';
301 $serialized_array_match_file_to_database = substr($serialized_array_match_file_to_database, 0, -1);
302 dol_syslog(
'dol_array_match_file_to_database_select='.$serialized_array_match_file_to_database);
303 $_SESSION[
"dol_array_match_file_to_database_select"] = $serialized_array_match_file_to_database;
315$help_url =
'EN:Module_Imports_En|FR:Module_Imports|ES:Módulo_Importaciones';
319if ($step == 1 || !$datatoimport) {
321 $serialized_array_match_file_to_database =
'';
322 $array_match_file_to_database = array();
323 $_SESSION[
"dol_array_match_file_to_database"] =
'';
324 $_SESSION[
"dol_array_match_file_to_database_select"] =
'';
327 if ($excludefirstline) {
328 $param .=
'&excludefirstline='.urlencode($excludefirstline);
331 $param .=
'&endatlinenb='.urlencode($endatlinenb);
334 $param .=
'&separator='.urlencode($separator);
337 $param .=
'&enclosure='.urlencode($enclosure);
340 llxHeader(
'', $langs->trans(
"NewImport"), $help_url);
346 print
'<div class="opacitymedium">'.$langs->trans(
"SelectImportDataSet").
'</div><br>';
349 print
'<div class="div-table-responsive-no-min">';
350 print
'<table class="noborder centpercent">';
351 print
'<tr class="liste_titre">';
352 print
'<td>'.$langs->trans(
"Module").
'</td>';
353 print
'<td>'.$langs->trans(
"ImportableDatas").
'</td>';
354 print
'<td> </td>';
357 if (count($objimport->array_import_module)) {
358 $sortedarrayofmodules =
dol_sort_array($objimport->array_import_module,
'position_of_profile',
'asc', 0, 0, 1);
359 foreach ($sortedarrayofmodules as $key => $value) {
361 print
'<tr class="oddeven"><td>';
362 $titleofmodule = $objimport->array_import_module[$key][
'module']->getName();
364 if (in_array($objimport->array_import_code[$key], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
365 $titleofmodule = $langs->trans(
"ProductOrService");
367 print $titleofmodule;
369 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[$key]);
370 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
371 print
img_object($objimport->array_import_module[$key][
'module']->getName(), $entityicon).
' ';
372 print $objimport->array_import_label[$key];
373 print
'</td><td style="text-align: right">';
374 if ($objimport->array_import_perms[$key]) {
375 print
'<a href="'.DOL_URL_ROOT.
'/imports/import.php?step=2&datatoimport='.$objimport->array_import_code[$key].$param.
'">'.
img_picto($langs->trans(
"NewImport"),
'next',
'class="fa-15"').
'</a>';
377 print $langs->trans(
"NotEnoughPermissions");
382 print
'<tr><td class="oddeven" colspan="3">'.$langs->trans(
"NoImportableData").
'</td></tr>';
392if ($step == 2 && $datatoimport) {
393 $param =
'&datatoimport='.urlencode($datatoimport);
394 if ($excludefirstline) {
395 $param .=
'&excludefirstline='.urlencode($excludefirstline);
398 $param .=
'&endatlinenb='.urlencode($endatlinenb);
401 $param .=
'&separator='.urlencode($separator);
404 $param .=
'&enclosure='.urlencode($enclosure);
407 llxHeader(
'', $langs->trans(
"NewImport"), $help_url);
413 print
'<div class="underbanner clearboth"></div>';
414 print
'<div class="fichecenter">';
416 print
'<table class="border tableforfield centpercent">';
419 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Module").
'</td>';
421 $titleofmodule = $objimport->array_import_module[0][
'module']->getName();
423 if (in_array($objimport->array_import_code[0], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
424 $titleofmodule = $langs->trans(
"ProductOrService");
426 print $titleofmodule;
430 print
'<tr><td>'.$langs->trans(
"DatasetToImport").
'</td>';
432 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[0]);
433 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
434 print
img_object($objimport->array_import_module[0][
'module']->getName(), $entityicon).
' ';
435 print $objimport->array_import_label[0];
443 print
'<form name="userfile" action="'.$_SERVER[
"PHP_SELF"].
'" enctype="multipart/form-data" METHOD="POST">';
444 print
'<input type="hidden" name="token" value="'.newToken().
'">';
448 print
'<span class="opacitymedium">';
449 $s = $langs->trans(
"ChooseFormatOfFileToImport",
'{s1}');
450 $s = str_replace(
'{s1}',
img_picto(
'',
'next'), $s);
452 print
'</span><br><br>';
456 print
'<div class="div-table-responsive-no-min">';
457 print
'<table class="noborder centpercent" cellpadding="4">';
462 print
'<tr class="liste_titre"><td colspan="5">';
463 print $langs->trans(
"FileMustHaveOneOfFollowingFormat");
465 $list = $objmodelimport->listOfAvailableImportFormat($db);
466 foreach ($list as $key) {
467 print
'<tr class="oddeven">';
468 print
'<td width="16">'.img_picto_common($key, $objmodelimport->getPictoForKey($key)).
'</td>';
469 $htmltext = $objmodelimport->getDriverDescForKey($key);
470 print
'<td>'.$form->textwithpicto($objmodelimport->getDriverLabelForKey($key), $htmltext).
'</td>';
471 print
'<td style="text-align:center">';
472 if (empty($objmodelimport->drivererror[$key])) {
473 $filename = $langs->transnoentitiesnoconv(
"ExampleOfImportFile").
'_'.$datatoimport.
'.'.$key;
474 print
'<a href="'.DOL_URL_ROOT.
'/imports/emptyexample.php?format='.$key.$param.
'&output=file&file='.urlencode($filename).
'" target="_blank" rel="noopener noreferrer">';
475 print
img_picto(
'',
'download',
'class="paddingright opacitymedium"');
476 print $langs->trans(
"DownloadEmptyExampleShort");
478 print $form->textwithpicto(
'', $langs->trans(
"DownloadEmptyExample").
'.<br>'.$langs->trans(
"StarAreMandatory"));
484 print
'<td style="text-align:right">';
485 if (empty($objmodelimport->drivererror[$key])) {
486 print
'<a href="'.DOL_URL_ROOT.
'/imports/import.php?step=3&format='.$key.$param.
'">'.
img_picto($langs->trans(
"SelectFormat"),
'next',
'class="fa-15"').
'</a>';
500if ($step == 3 && $datatoimport) {
501 $param =
'&datatoimport='.urlencode($datatoimport).
'&format='.urlencode($format);
502 if ($excludefirstline) {
503 $param .=
'&excludefirstline='.urlencode($excludefirstline);
506 $param .=
'&endatlinenb='.urlencode($endatlinenb);
509 $param .=
'&separator='.urlencode($separator);
512 $param .=
'&enclosure='.urlencode($enclosure);
515 $list = $objmodelimport->listOfAvailableImportFormat($db);
517 llxHeader(
'', $langs->trans(
"NewImport"), $help_url);
526 if ($action ==
'delete') {
527 print $form->formconfirm($_SERVER[
"PHP_SELF"].
'?urlfile='.urlencode(
GETPOST(
'urlfile')).
'&step=3'.$param, $langs->trans(
'DeleteFile'), $langs->trans(
'ConfirmDeleteFile'),
'confirm_deletefile',
'', 0, 1);
530 print
'<div class="underbanner clearboth"></div>';
531 print
'<div class="fichecenter">';
533 print
'<table class="border tableforfield centpercent">';
536 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Module").
'</td>';
538 $titleofmodule = $objimport->array_import_module[0][
'module']->getName();
540 if (in_array($objimport->array_import_code[0], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
541 $titleofmodule = $langs->trans(
"ProductOrService");
543 print $titleofmodule;
547 print
'<tr><td>'.$langs->trans(
"DatasetToImport").
'</td>';
549 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[0]);
550 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
551 print
img_object($objimport->array_import_module[0][
'module']->getName(), $entityicon).
' ';
552 print $objimport->array_import_label[0];
558 print
load_fiche_titre($langs->trans(
"InformationOnSourceFile"),
'',
'file-export');
560 print
'<div class="underbanner clearboth"></div>';
561 print
'<div class="fichecenter">';
562 print
'<table width="100%" class="border tableforfield">';
565 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"SourceFileFormat").
'</td>';
566 print
'<td class="nowraponall">';
567 $text = $objmodelimport->getDriverDescForKey($format);
569 print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text);
570 print
'</td><td style="text-align:right" class="nowrap">';
571 $filename = $langs->transnoentitiesnoconv(
"ExampleOfImportFile").
'_'.$datatoimport.
'.'.$format;
572 print
'<a href="'.DOL_URL_ROOT.
'/imports/emptyexample.php?format='.$format.$param.
'&output=file&file='.urlencode($filename).
'" target="_blank" rel="noopener noreferrer">';
573 print
img_picto(
'',
'download',
'class="paddingright opacitymedium"');
574 print $langs->trans(
"DownloadEmptyExampleShort");
576 print $form->textwithpicto(
'', $langs->trans(
"DownloadEmptyExample").
'.<br>'.$langs->trans(
"StarAreMandatory"));
585 if ($format ==
'xlsx' && !class_exists(
'XMLWriter')) {
586 $langs->load(
"install");
587 print
info_admin($langs->trans(
"ErrorPHPDoesNotSupport",
'php-xml'), 0, 0, 1,
'error');
593 print
'<form name="userfile" action="'.$_SERVER[
"PHP_SELF"].
'" enctype="multipart/form-data" method="POST">';
594 print
'<input type="hidden" name="token" value="'.newToken().
'">';
595 print
'<input type="hidden" value="'.$step.
'" name="step">';
596 print
'<input type="hidden" value="'.dol_escape_htmltag($format).
'" name="format">';
597 print
'<input type="hidden" value="'.$excludefirstline.
'" name="excludefirstline">';
598 print
'<input type="hidden" value="'.$endatlinenb.
'" name="endatlinenb">';
599 print
'<input type="hidden" value="'.dol_escape_htmltag($separator).
'" name="separator">';
600 print
'<input type="hidden" value="'.dol_escape_htmltag($enclosure).
'" name="enclosure">';
601 print
'<input type="hidden" value="'.dol_escape_htmltag($datatoimport).
'" name="datatoimport">';
603 print
'<span class="opacitymedium">';
604 $s = $langs->trans(
"ChooseFileToImport",
'{s1}');
605 $s = str_replace(
'{s1}',
img_picto(
'',
'next'), $s);
607 print
'</span><br><br>';
612 print
'<div class="marginbottomonly">';
614 $maxmin = $maxfilesizearray[
'maxmin'];
616 print
'<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).
'">';
618 print
'<input type="file" name="userfile" size="20" maxlength="80"> ';
620 print
'<input type="submit" class="button small" value="'.$langs->trans(
"AddFile").
'"'.$out.
' name="sendit">';
624 $maxphp = @ini_get(
'upload_max_filesize');
625 if (preg_match(
'/k$/i', $maxphp)) {
626 $maxphp = (int) substr($maxphp, 0, -1);
628 if (preg_match(
'/m$/i', $maxphp)) {
629 $maxphp = (int) substr($maxphp, 0, -1) * 1024;
631 if (preg_match(
'/g$/i', $maxphp)) {
632 $maxphp = (int) substr($maxphp, 0, -1) * 1024 * 1024;
634 if (preg_match(
'/t$/i', $maxphp)) {
635 $maxphp = (int) substr($maxphp, 0, -1) * 1024 * 1024 * 1024;
637 $maxphp2 = @ini_get(
'post_max_size');
638 if (preg_match(
'/k$/i', $maxphp2)) {
639 $maxphp2 = (int) substr($maxphp2, 0, -1);
641 if (preg_match(
'/m$/i', $maxphp2)) {
642 $maxphp2 = (int) substr($maxphp2, 0, -1) * 1024;
644 if (preg_match(
'/g$/i', $maxphp2)) {
645 $maxphp2 = (int) substr($maxphp2, 0, -1) * 1024 * 1024;
647 if (preg_match(
'/t$/i', $maxphp2)) {
648 $maxphp2 = (int) substr($maxphp2, 0, -1) * 1024 * 1024 * 1024;
652 $maxphptoshow = $maxphptoshowparam =
'';
654 $maxmin = min($max, $maxphp);
655 $maxphptoshow = $maxphp;
656 $maxphptoshowparam =
'upload_max_filesize';
659 $maxmin = min($max, $maxphp2);
660 if ($maxphp2 < $maxphp) {
661 $maxphptoshow = $maxphp2;
662 $maxphptoshowparam =
'post_max_size';
666 $langs->load(
'other');
668 $out .=
info_admin($langs->trans(
"ThisLimitIsDefinedInSetup", $max, $maxphptoshow), 1);
670 $out .=
' ('.$langs->trans(
"UploadDisabled").
')';
676 $filearray =
dol_dir_list($conf->import->dir_temp,
'files', 0,
'',
'',
'name', SORT_DESC);
677 if (count($filearray) > 0) {
678 print
'<div class="div-table-responsive-no-min">';
679 print
'<table class="noborder centpercent" width="100%" cellpadding="4">';
681 $dir = $conf->import->dir_temp;
685 foreach ($filearray as $key => $val) {
686 $file = $val[
'name'];
690 $file = mb_convert_encoding($file,
'UTF-8',
'ISO-8859-1');
693 if (preg_match(
'/^\./', $file)) {
697 $modulepart =
'import';
698 $urlsource = $_SERVER[
"PHP_SELF"].
'?step='.$step.$param.
'&filetoimport='.urlencode($filetoimport);
699 $relativepath = $file;
701 print
'<tr class="oddeven">';
703 print
img_mime($file,
'',
'pictofixedwidth');
704 print
'<a data-ajax="false" href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&file='.urlencode($relativepath).
'&step=3'.$param.
'" target="_blank" rel="noopener noreferrer">';
709 print
'<td style="text-align:right">'.dol_print_size(
dol_filesize($dir.
'/'.$file)).
'</td>';
711 print
'<td style="text-align:right">'.dol_print_date(
dol_filemtime($dir.
'/'.$file),
'dayhour').
'</td>';
713 print
'<td style="text-align:right"><a href="'.$_SERVER[
'PHP_SELF'].
'?action=delete&token='.
newToken().
'&step=3'.$param.
'&urlfile='.urlencode($relativepath);
714 print
'">'.img_delete().
'</a></td>';
716 print
'<td style="text-align:right">';
717 print
'<a href="'.$_SERVER[
'PHP_SELF'].
'?step=4'.$param.
'&filetoimport='.urlencode($relativepath).
'">'.
img_picto($langs->trans(
"NewImport"),
'next',
'class="fa-15"').
'</a>';
731if ($step == 4 && $datatoimport) {
733 $serialized_array_match_file_to_database = isset($_SESSION[
"dol_array_match_file_to_database_select"]) ? $_SESSION[
"dol_array_match_file_to_database_select"] :
'';
734 $fieldsarray = explode(
',', $serialized_array_match_file_to_database);
735 $array_match_file_to_database = array();
736 foreach ($fieldsarray as $elem) {
737 $tabelem = explode(
'=', $elem, 2);
739 $val = (isset($tabelem[1]) ? $tabelem[1] :
'');
741 $array_match_file_to_database[$key] = $val;
750 $list = $objmodelimport->listOfAvailableImportFormat($db);
752 if (empty($separator)) {
753 $separator = (!
getDolGlobalString(
'IMPORT_CSV_SEPARATOR_TO_USE') ?
',' : $conf->global->IMPORT_CSV_SEPARATOR_TO_USE);
757 if ($model ==
'csv' && strlen($separator) == 1 && !GETPOSTISSET(
'separator')) {
759 $fh = fopen($conf->import->dir_temp.
'/'.$filetoimport,
'r');
761 $sline = fgets($fh, 1000000);
763 $nboccurence = substr_count($sline, $separator);
764 $nboccurencea = substr_count($sline,
',');
765 $nboccurenceb = substr_count($sline,
';');
767 if ($nboccurence == 0) {
768 if ($nboccurencea > 2) {
770 } elseif ($nboccurenceb > 2) {
778 $separator_used = str_replace(
'\t',
"\t", $separator);
781 $dir = DOL_DOCUMENT_ROOT.
"/core/modules/import/";
782 $file =
"import_".$model.
".modules.php";
783 $classname =
"Import".ucfirst($model);
784 require_once $dir.$file;
785 $obj =
new $classname($db, $datatoimport);
786 if ($model ==
'csv') {
787 $obj->separator = $separator_used;
788 $obj->enclosure = $enclosure;
791 if ($model ==
'xlsx') {
792 if (!preg_match(
'/\.xlsx$/i', $filetoimport)) {
793 $langs->load(
"errors");
794 $param =
'&datatoimport='.$datatoimport.
'&format='.$format;
795 setEventMessages($langs->trans(
"ErrorFileMustHaveFormat", $model),
null,
'errors');
796 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?step=3'.$param.
'&filetoimport='.urlencode($relativepath));
802 $array_match_file_to_database = array();
806 $fieldssource = array();
807 $result = $obj->import_open_file($conf->import->dir_temp.
'/'.$filetoimport, $langs);
810 $arrayrecord = $obj->import_read_record();
814 foreach ($arrayrecord as $key => $val) {
815 if ($val[
"type"] != -1) {
816 $fieldssource[$i][
'example1'] =
dol_trunc($val[
'val'], 128);
819 $fieldssource[$i][
'example1'] = $langs->trans(
'Empty');
823 $obj->import_close_file();
827 $fieldstarget = $objimport->array_import_fields[0];
828 $minpos = min(count($fieldssource), count($fieldstarget));
832 $initialloadofstep4 =
false;
833 if (empty($_SESSION[
'dol_array_match_file_to_database_select'])) {
834 $initialloadofstep4 =
true;
838 if (count($array_match_file_to_database) == 0) {
844 $num = count($fieldssource);
845 while ($pos <= $num) {
846 if ($num >= 1 && $pos <= $num) {
848 foreach ($fieldstarget as $key => $val) {
849 if ($posbis < $pos) {
854 $array_match_file_to_database[$pos] = $key;
861 $array_match_database_to_file = array_flip($array_match_file_to_database);
865 $fieldstarget_tmp = array();
866 $arraykeysfieldtarget = array_keys($fieldstarget);
868 foreach ($fieldstarget as $key => $label) {
869 $isrequired = preg_match(
'/\*$/', $label);
870 if (!empty($isrequired)) {
871 $newlabel = substr($label, 0, -1);
872 $fieldstarget_tmp[$key] = array(
"label" => $newlabel,
"required" =>
true);
874 $fieldstarget_tmp[$key] = array(
"label" => $label,
"required" =>
false);
876 if (!empty($array_match_database_to_file[$key])) {
877 $fieldstarget_tmp[$key][
"imported"] =
true;
878 $fieldstarget_tmp[$key][
"position"] = $array_match_database_to_file[$key] - 1;
880 while (!empty($array_match_database_to_file[$keytoswap])) {
881 if ($position + 1 > $array_match_database_to_file[$keytoswap]) {
882 $keytoswapwith = $array_match_database_to_file[$keytoswap] - 1;
883 $tmp = [$keytoswap => $fieldstarget_tmp[$keytoswap]];
884 unset($fieldstarget_tmp[$keytoswap]);
885 $fieldstarget_tmp =
arrayInsert($fieldstarget_tmp, $keytoswapwith, $tmp);
886 $keytoswapwith = $arraykeysfieldtarget[$array_match_database_to_file[$keytoswap] - 1];
887 $tmp = $fieldstarget_tmp[$keytoswapwith];
888 unset($fieldstarget_tmp[$keytoswapwith]);
889 $fieldstarget_tmp[$keytoswapwith] = $tmp;
890 $keytoswap = $keytoswapwith;
896 $fieldstarget_tmp[$key][
"imported"] =
false;
900 $fieldstarget = $fieldstarget_tmp;
909 $param =
'&format='.$format.
'&datatoimport='.urlencode($datatoimport).
'&filetoimport='.urlencode($filetoimport);
910 if ($excludefirstline) {
911 $param .=
'&excludefirstline='.urlencode($excludefirstline);
914 $param .=
'&endatlinenb='.urlencode($endatlinenb);
917 $param .=
'&separator='.urlencode($separator);
920 $param .=
'&enclosure='.urlencode($enclosure);
923 llxHeader(
'', $langs->trans(
"NewImport"), $help_url);
929 print
'<div class="underbanner clearboth"></div>';
930 print
'<div class="fichecenter">';
932 print
'<table class="centpercent border tableforfield">';
935 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Module").
'</td>';
937 $titleofmodule = $objimport->array_import_module[0][
'module']->getName();
939 if (in_array($objimport->array_import_code[0], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
940 $titleofmodule = $langs->trans(
"ProductOrService");
942 print $titleofmodule;
946 print
'<tr><td>'.$langs->trans(
"DatasetToImport").
'</td>';
948 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[0]);
949 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
950 print
img_object($objimport->array_import_module[0][
'module']->getName(), $entityicon).
' ';
951 print $objimport->array_import_label[0];
957 print
load_fiche_titre($langs->trans(
"InformationOnSourceFile"),
'',
'file-export');
959 print
'<div class="underbanner clearboth"></div>';
960 print
'<div class="fichecenter">';
961 print
'<table width="100%" class="border tableforfield">';
964 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"SourceFileFormat").
'</td>';
966 $text = $objmodelimport->getDriverDescForKey($format);
968 print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text);
972 if ($model ==
'csv') {
973 print
'<tr><td>'.$langs->trans(
"CsvOptions").
'</td>';
975 print
'<form method="POST">';
976 print
'<input type="hidden" name="token" value="'.newToken().
'">';
977 print
'<input type="hidden" value="'.$step.
'" name="step">';
978 print
'<input type="hidden" value="'.$format.
'" name="format">';
979 print
'<input type="hidden" value="'.$excludefirstline.
'" name="excludefirstline">';
980 print
'<input type="hidden" value="'.$endatlinenb.
'" name="endatlinenb">';
981 print
'<input type="hidden" value="'.$datatoimport.
'" name="datatoimport">';
982 print
'<input type="hidden" value="'.$filetoimport.
'" name="filetoimport">';
983 print $langs->trans(
"Separator").
' : ';
984 print
'<input type="text" class="width25 center" name="separator" value="'.dol_escape_htmltag($separator).
'"/>';
985 print
' '.$langs->trans(
"Enclosure").
' : ';
986 print
'<input type="text" class="width25 center" name="enclosure" value="'.dol_escape_htmltag($enclosure).
'"/> ';
987 print
'<input name="update" type="submit" value="'.$langs->trans(
'Update').
'" class="button smallpaddingimp" />';
993 print
'<tr><td>'.$langs->trans(
"FileToImport").
'</td>';
995 $modulepart =
'import';
996 $relativepath =
GETPOST(
'filetoimport');
997 print
'<a data-ajax="false" href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&file='.urlencode($relativepath).
'&step=4'.$param.
'" target="_blank" rel="noopener noreferrer">';
998 print
img_mime($file,
'',
'pictofixedwidth');
1000 print
img_picto($langs->trans(
"Download"),
'download',
'class="paddingleft opacitymedium"');
1013 print
'<!-- List of source fields -->'.
"\n";
1014 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1015 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1016 print
'<input type="hidden" name="action" value="select_model">';
1017 print
'<input type="hidden" name="step" value="4">';
1018 print
'<input type="hidden" name="format" value="'.$format.
'">';
1019 print
'<input type="hidden" name="datatoimport" value="'.$datatoimport.
'">';
1020 print
'<input type="hidden" name="filetoimport" value="'.$filetoimport.
'">';
1021 print
'<input type="hidden" name="excludefirstline" value="'.$excludefirstline.
'">';
1022 print
'<input type="hidden" name="endatlinenb" value="'.$endatlinenb.
'">';
1023 print
'<input type="hidden" name="separator" value="'.dol_escape_htmltag($separator).
'">';
1024 print
'<input type="hidden" name="enclosure" value="'.dol_escape_htmltag($enclosure).
'">';
1027 print
'<div class="marginbottomonly">';
1028 print
'<span class="opacitymedium">';
1029 $s = $langs->trans(
"SelectImportFieldsSource",
'{s1}');
1030 $s = str_replace(
'{s1}',
img_picto(
'',
'grip_title',
'',
false, 0, 0,
'',
'', 0), $s);
1033 $htmlother->select_import_model($importmodelid,
'importmodelid', $datatoimport, 1, $user->id);
1034 print
'<input type="submit" class="button small reposition" value="'.$langs->trans(
"Select").
'">';
1039 print
'<div class="div-table-responsive-no-min">';
1040 print
'<table class="noborder centpercent">';
1041 print
'<tr class="liste_titre">';
1042 print
'<td>'.$langs->trans(
"FieldsInSourceFile").
'</td>';
1043 print
'<td>'.$langs->trans(
"FieldsInTargetDatabase").
'</td>';
1048 print
'<tr valign="top"><td width="50%" class="nopaddingleftimp">';
1050 $fieldsplaced = array();
1051 $valforsourcefieldnb = array();
1052 $listofkeys = array();
1053 foreach ($array_match_file_to_database as $key => $val) {
1054 $listofkeys[$key] = 1;
1057 print
"\n<!-- Box left container -->\n";
1058 print
'<div id="left" class="connectedSortable">'.
"\n";
1063 foreach ($fieldssource as $key => $val) {
1066 $listofkeys[$key] = 1;
1067 $fieldsplaced[$key] = 1;
1068 $valforsourcefieldnb[$lefti] = $key;
1078 print
"<!-- End box left container -->\n";
1081 print
'</td><td width="50%" class="nopaddingrightimp">';
1085 $optionsall = array();
1086 foreach ($fieldstarget as $code => $line) {
1089 $tmparray = explode(
'|', $line[
"label"]);
1091 foreach ($tmparray as $tmpkey => $tmpval) {
1092 $labeltoshow .= ($labeltoshow ?
' '.$langs->trans(
'or').
' ' :
'').$langs->transnoentities($tmpval);
1094 $optionsall[$code] = array(
'labelkey' => $line[
'label'],
'labelkeyarray' => $tmparray,
'label' => $labeltoshow,
'required' => (empty($line[
"required"]) ? 0 : 1),
'position' => !empty($line[
'position']) ? $line[
'position'] : 0);
1099 $optionsall[$code][
'picto'] = $picto;
1106 $mandatoryfieldshavesource =
true;
1119 $modetoautofillmapping =
'session';
1120 if ($initialloadofstep4) {
1121 $modetoautofillmapping =
'guess';
1125 print
'<table class="nobordernopadding centpercent tableimport">';
1126 foreach ($fieldssource as $code => $line) {
1130 print
'<tr style="height:'.$height.
'" class="trimport oddevenimport">';
1131 $entity = (!empty($objimport->array_import_entities[0][$code]) ? $objimport->array_import_entities[0][$code] : $objimport->array_import_icon[0]);
1133 $entityicon = !empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity;
1134 $entitylang = !empty($entitytolang[$entity]) ? $entitytolang[$entity] : $objimport->array_import_label[0];
1136 print
'<td class="nowraponall hideonsmartphone" style="font-weight: normal">=> </td>';
1137 print
'<td class="nowraponall" style="font-weight: normal">';
1142 $selectforline =
'';
1143 $selectforline .=
'<select id="selectorderimport_'.($i + 1).
'" class="targetselectchange minwidth300" name="select_'.($i + 1).
'">';
1144 if (!empty($line[
"imported"])) {
1145 $selectforline .=
'<option value="-1"> </option>';
1147 $selectforline .=
'<option selected="" value="-1"> </option>';
1151 $codeselectedarray = array();
1152 foreach ($optionsall as $tmpcode => $tmpval) {
1154 if (!empty($tmpval[
'picto'])) {
1155 $label .=
img_picto(
'', $tmpval[
'picto'],
'class="pictofixedwidth"');
1157 $label .= $tmpval[
'required'] ?
'<strong>' :
'';
1158 $label .= $tmpval[
'label'];
1159 $label .= $tmpval[
'required'] ?
'*</strong>' :
'';
1161 $tablealias = preg_replace(
'/(\..*)$/i',
'', $tmpcode);
1162 $tablename = !empty($objimport->array_import_tables[0][$tablealias]) ? $objimport->array_import_tables[0][$tablealias] :
"";
1166 $filecolumn = ($i + 1);
1168 if (empty($objimport->array_import_convertvalue[0][$tmpcode])) {
1171 if ($objimport->array_import_convertvalue[0][$tmpcode][
'rule'] ==
'fetchidfromref') {
1172 $htmltext .= $langs->trans(
"DataComeFromIdFoundFromRef", $langs->transnoentitiesnoconv($entitylang)).
'<br>';
1174 if ($objimport->array_import_convertvalue[0][$tmpcode][
'rule'] ==
'fetchidfromcodeid') {
1175 $htmltext .= $langs->trans(
"DataComeFromIdFoundFromCodeId", $langs->transnoentitiesnoconv($objimport->array_import_convertvalue[0][$tmpcode][
'dict'])).
'<br>';
1179 $example = !empty($objimport->array_import_examplevalues[0][$tmpcode]) ? $objimport->array_import_examplevalues[0][$tmpcode] :
"";
1181 if (empty($objimport->array_import_convertvalue[0][$tmpcode])) {
1183 $htmltext .= $langs->trans(
"SourceExample").
': <b>'.str_replace(
'"',
'', $example).
'</b><br>';
1186 if ($objimport->array_import_convertvalue[0][$tmpcode][
'rule'] ==
'fetchidfromref') {
1187 $htmltext .= $langs->trans(
"SourceExample").
': <b>'.$langs->transnoentitiesnoconv(
"ExampleAnyRefFoundIntoElement", $entitylang).($example ?
' ('.$langs->transnoentitiesnoconv(
"Example").
': '.str_replace(
'"',
'', $example).
')' :
'').
'</b><br>';
1188 } elseif ($objimport->array_import_convertvalue[0][$tmpcode][
'rule'] ==
'fetchidfromcodeid') {
1189 $htmltext .= $langs->trans(
"SourceExample").
': <b>'.$langs->trans(
"ExampleAnyCodeOrIdFoundIntoDictionary", $langs->transnoentitiesnoconv($objimport->array_import_convertvalue[0][$tmpcode][
'dict'])).($example ?
' ('.$langs->transnoentitiesnoconv(
"Example").
': '.str_replace(
'"',
'', $example).
')' :
'').
'</b><br>';
1190 } elseif ($example) {
1191 $htmltext .= $langs->trans(
"SourceExample").
': <b>'.str_replace(
'"',
'', $example).
'</b><br>';
1195 if (!empty($objimport->array_import_regex[0][$tmpcode])) {
1196 $htmltext .= $langs->trans(
"FormatControlRule").
': <b>'.str_replace(
'"',
'', $objimport->array_import_regex[0][$tmpcode]).
'</b><br>';
1200 $htmltext .= $langs->trans(
"InformationOnTargetTables").
': <b>'.$tablename.
"->".preg_replace(
'/^.*\./',
'', $tmpcode).
"</b>";
1202 $labelhtml = $label.
' '.$form->textwithpicto(
'', $htmltext, 1,
'help',
'', 1);
1204 $selectforline .=
'<option value="'.$tmpcode.
'"';
1205 if ($modetoautofillmapping ==
'orderoftargets') {
1208 $selectforline .=
' selected';
1210 } elseif ($modetoautofillmapping ==
'guess') {
1214 if (preg_match(
'/^(.+)\((.+\..+)\)$/', $line[
'example1'], $regs)) {
1215 $tmpstring1 = $regs[1];
1216 $tmpstring2 = $regs[2];
1218 $tmpstring1 = $line[
'example1'];
1226 foreach ($tmpval[
'labelkeyarray'] as $tmpval2) {
1227 $labeltarget = $langs->transnoentities($tmpval2);
1229 if ($tmpstring1 && ($tmpstring1 == $tmpcode || $tmpstring1 == strtolower($labeltarget)
1230 || $tmpstring1 == strtolower(
dol_string_unaccent($labeltarget)) || $tmpstring1 == strtolower($tmpval2))) {
1231 if (empty($codeselectedarray[$code])) {
1232 $selectforline .=
' selected';
1233 $codeselectedarray[$code] = 1;
1236 } elseif ($tmpstring2 && ($tmpstring2 == $tmpcode || $tmpstring2 == strtolower($labeltarget)
1237 || $tmpstring2 == strtolower(
dol_string_unaccent($labeltarget)) || $tmpstring2 == strtolower($tmpval2))) {
1238 if (empty($codeselectedarray[$code])) {
1239 $selectforline .=
' selected';
1240 $codeselectedarray[$code] = 1;
1245 } elseif ($modetoautofillmapping ==
'session' && !empty($_SESSION[
'dol_array_match_file_to_database_select'])) {
1246 $tmpselectioninsession =
dolExplodeIntoArray($_SESSION[
'dol_array_match_file_to_database_select'],
',',
'=');
1248 if (!empty($tmpselectioninsession[(
string) ($i + 1)]) && $tmpselectioninsession[(
string) ($i + 1)] == $tmpcode) {
1249 $selectforline .=
' selected';
1251 $selectforline .=
' data-debug="'.$tmpcode.
'-'.$code.
'-'.$j.
'-'.(!empty($tmpselectioninsession[(
string) ($i + 1)]) ? $tmpselectioninsession[(string) ($i + 1)] :
"").
'"';
1253 $selectforline .=
' data-html="'.dol_escape_htmltag($labelhtml).
'"';
1254 $selectforline .=
'>';
1255 $selectforline .= $label;
1256 $selectforline .=
'</options>';
1259 $selectforline .=
'</select>';
1260 $selectforline .=
ajax_combobox(
'selectorderimport_'.($i + 1));
1262 print $selectforline;
1267 print
'<td class="nowraponall" style="font-weight:normal; text-align:right">';
1270 $htmltext =
'<b><u>'.$langs->trans(
"FieldSource").
'</u></b><br>';
1272 $htmltext .= $langs->trans(
"DataComeFromFileFieldNb", $filecolumntoshow).
'<br>';
1274 print $form->textwithpicto(
'', $htmltext);
1285 print
'<tr class="liste_titre"><td colspan="2">'.$langs->trans(
"Note").
'</td></tr>';
1286 print
'<tr><td colspan="2"><div id="div-mandatory-target-fields-not-mapped"></div></td></tr>';
1292 if (!empty($conf->use_javascript_ajax)) {
1293 print
'<script type="text/javascript">'.
"\n";
1294 print
'var previousselectedvalueimport = "0";'.
"\n";
1295 print
'var previousselectedlabelimport = "0";'.
"\n";
1296 print
'var arrayofselectedvalues = [];'.
"\n";
1297 print
'var arrayoftargetfields = [];'.
"\n";
1298 print
'var arrayoftargetmandatoryfields = [];'.
"\n";
1302 foreach ($fieldstarget as $key => $val) {
1303 print
"arrayoftargetfields[".$tmpi.
"] = '".
dol_escape_js($langs->trans($val[
'label'])).
"'; ";
1304 if ($val[
'required']) {
1305 print
"arrayoftargetmandatoryfields[".$tmpi.
"] = '".
dol_escape_js($key).
"'; ";
1311 print
'$(document).ready(function () {'.
"\n";
1313 print
'setOptionsToDisabled();'.
"\n";
1314 print
'saveSelection();'.
"\n";
1316 print
'$(".targetselectchange").focus(function(){'.
"\n";
1317 print
' previousselectedvalueimport = $(this).val();'.
"\n";
1318 print
' previousselectedlabelimport = $(this).children("option:selected").text();'.
"\n";
1319 print
' console.log("previousselectedvalueimport="+previousselectedvalueimport)'.
"\n";
1326 print
'function setOptionsToDisabled() {'.
"\n";
1327 print
' console.log("Remove the disabled flag everywhere");'.
"\n";
1328 print
' $("select.targetselectchange").not($( this )).find(\'option\').prop("disabled", false);'.
"\n";
1329 print
' arrayofselectedvalues = [];'.
"\n";
1331 print
' $("select.targetselectchange").each(function(){'.
"\n";
1332 print
' id = $(this).attr(\'id\')'.
"\n";
1333 print
' value = $(this).val()'.
"\n";
1334 print
' console.log("a selected value has been found for component "+id+" = "+value);'.
"\n";
1335 print
' arrayofselectedvalues.push(value);'.
"\n";
1338 print
' console.log("List of all selected values arrayofselectedvalues");'.
"\n";
1339 print
' console.log(arrayofselectedvalues);'.
"\n";
1340 print
' console.log("Set the option to disabled for every entry that is currently selected somewhere else (so into arrayofselectedvalues)");'.
"\n";
1342 print
' $.each(arrayofselectedvalues, function(key, value) {'.
"\n";
1343 print
' if (value != -1) {'.
"\n";
1344 print
' console.log("Process key="+key+" value="+value+" to disable.");'.
"\n";
1345 print
' $("select.targetselectchange").find(\'option[value="\'+value+\'"]:not(:selected)\').prop("disabled", true);'.
"\n";
1351 print
'function saveSelection() {'.
"\n";
1353 print
' arrayselectedfields = [];'.
"\n";
1354 print
' arrayselectedfields.push(0);'.
"\n";
1356 print
' $.each( arrayofselectedvalues, function( key, value ) {'.
"\n";
1357 print
' if (value != -1) {'.
"\n";
1358 print
' arrayselectedfields.push(value);'.
"\n";
1359 print
' } else {'.
"\n";
1360 print
' arrayselectedfields.push(0);'.
"\n";
1364 print
" $.ajax({\n";
1365 print
" type: 'POST',\n";
1366 print
" dataType: 'json',\n";
1367 print
" url: '".dol_escape_js($_SERVER[
"PHP_SELF"]).
"?action=saveselectorder&token=".
newToken().
"',\n";
1368 print
" data: 'selectorder='+arrayselectedfields.toString(),\n";
1369 print
" success: function(){\n";
1370 print
" console.log('The selected fields have been saved into '+arrayselectedfields.toString());\n";
1375 print
' console.log("arrayselectedfields");';
1376 print
' console.log(arrayselectedfields);';
1377 print
' console.log("arrayoftargetmandatoryfields");';
1378 print
' console.log(arrayoftargetmandatoryfields);';
1379 print
" listtoshow = '';";
1380 print
" nbelement = arrayoftargetmandatoryfields.length
1381 for (let i = 0; i < nbelement; i++) {
1382 if (arrayoftargetmandatoryfields[i] && ! arrayselectedfields.includes(arrayoftargetmandatoryfields[i])) {
1383 console.log(arrayoftargetmandatoryfields[i]+' not mapped');
1384 listtoshow = listtoshow + (listtoshow ? ', ' : '') + '<b>' + arrayoftargetfields[i] + '*</b>';
1387 console.log(listtoshow);
1389 listtoshow = '".dol_escape_js(
img_warning($langs->trans(
"MandatoryTargetFieldsNotMapped")).
' '.$langs->trans(
"MandatoryTargetFieldsNotMapped")).
": ' + listtoshow;
1390 $('#div-mandatory-target-fields-not-mapped').html(listtoshow);
1392 $('#div-mandatory-target-fields-not-mapped').html('<span class=\"opacitymedium\">".
dol_escape_js($langs->trans(
"AllTargetMandatoryFieldsAreMapped")).
"</span>');
1399 print
'$(".targetselectchange").change(function(){'.
"\n";
1400 print
' setOptionsToDisabled();'.
"\n";
1402 print
' if(previousselectedlabelimport != "" && previousselectedvalueimport != -1) {'.
"\n";
1403 print
' let valuetochange = $(this).val(); '.
"\n";
1404 print
' $(".boxtdunused").each(function(){'.
"\n";
1405 print
' if ($(this).text().includes(valuetochange)){'.
"\n";
1406 print
' arraychild = $(this)[0].childNodes'.
"\n";
1407 print
' arraytexttomodify = arraychild[0].textContent.split(" ")'.
"\n";
1408 print
' arraytexttomodify[1] = previousselectedvalueimport '.
"\n";
1409 print
' textmodified = arraytexttomodify.join(" ") '.
"\n";
1410 print
' arraychild[0].textContent = textmodified'.
"\n";
1411 print
' arraychild[1].innerHTML = previousselectedlabelimport'.
"\n";
1415 print
' $(this).blur()'.
"\n";
1417 print
' saveSelection()'.
"\n";
1421 print
'</script>'.
"\n";
1427 print
'<div class="tabsAction">';
1429 if (count($array_match_file_to_database)) {
1430 if ($mandatoryfieldshavesource) {
1431 print
'<a class="butAction saveorderselect" href="import.php?step=5'.$param.
'&filetoimport='.urlencode($filetoimport).
'">'.$langs->trans(
"NextStep").
'</a>';
1433 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"SomeMandatoryFieldHaveNoSource")).
'">'.$langs->trans(
"NextStep").
'</a>';
1441 if (count($array_match_file_to_database)) {
1443 print
'<!-- Area to add new import profile -->'.
"\n";
1444 print
'<div class="marginbottomonly"><span class="opacitymedium">'.$langs->trans(
"SaveImportModel").
'</span></div>';
1446 print
'<form class="nocellnopadd" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1447 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1448 print
'<input type="hidden" name="action" value="add_import_model">';
1449 print
'<input type="hidden" name="step" value="'.$step.
'">';
1450 print
'<input type="hidden" name="format" value="'.$format.
'">';
1451 print
'<input type="hidden" name="datatoimport" value="'.$datatoimport.
'">';
1452 print
'<input type="hidden" name="filetoimport" value="'.$filetoimport.
'">';
1453 print
'<input type="hidden" name="hexa" value="'.$hexa.
'">';
1454 print
'<input type="hidden" name="excludefirstline" value="'.$excludefirstline.
'">';
1455 print
'<input type="hidden" name="endatlinenb" value="'.$endatlinenb.
'">';
1456 print
'<input type="hidden" name="page_y" value="">';
1457 print
'<input type="hidden" value="'.dol_escape_htmltag($separator).
'" name="separator">';
1458 print
'<input type="hidden" value="'.dol_escape_htmltag($enclosure).
'" name="enclosure">';
1460 print
'<div class="div-table-responsive-no-min">';
1461 print
'<table summary="selectofimportprofil" class="noborder centpercent">';
1462 print
'<tr class="liste_titre">';
1463 print
'<td>'.$langs->trans(
"ImportModelName").
'</td>';
1464 print
'<td>'.$langs->trans(
"Visibility").
'</td>';
1468 $nameofimportprofile = str_replace(
' ',
'-', $langs->trans(
"ImportProfile").
' '.$titleofmodule.
' '.
dol_print_date(
dol_now(
'gmt'),
'dayxcard'));
1470 $nameofimportprofile = $import_name;
1473 print
'<tr class="oddeven">';
1474 print
'<td><input name="import_name" class="minwidth300" value="'.$nameofimportprofile.
'"></td>';
1476 $arrayvisibility = array(
'private' => $langs->trans(
"Private"),
'all' => $langs->trans(
"Everybody"));
1477 print $form->selectarray(
'visibility', $arrayvisibility,
'private');
1479 print
'<td class="right">';
1480 print
'<input type="submit" class="button smallpaddingimp reposition" value="'.$langs->trans(
"SaveImportProfile").
'">';
1484 $sql =
"SELECT rowid, label, fk_user, entity";
1485 $sql .=
" FROM ".MAIN_DB_PREFIX.
"import_model";
1486 $sql .=
" WHERE type = '".$db->escape($datatoimport).
"'";
1488 $sql .=
" AND fk_user IN (0, ".((int) $user->id).
")";
1490 $sql .=
" ORDER BY rowid";
1492 $resql = $db->query($sql);
1494 $num = $db->num_rows($resql);
1496 $tmpuser =
new User($db);
1500 $obj = $db->fetch_object($resql);
1502 print
'<tr class="oddeven"><td>';
1505 print
'<td class="tdoverflowmax150">';
1506 if (empty($obj->fk_user)) {
1507 print $langs->trans(
"Everybody");
1509 $tmpuser->fetch($obj->fk_user);
1510 print $tmpuser->getNomUrl(-1);
1513 print
'<td class="right">';
1514 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?step='.$step.$param.
'&action=deleteprof&token='.
newToken().
'&id='.$obj->rowid.
'&filetoimport='.urlencode($filetoimport).
'">';
1532if ($step == 5 && $datatoimport) {
1533 $max_execution_time_for_importexport =
getDolGlobalInt(
'IMPORT_MAX_EXECUTION_TIME', 300);
1534 $max_time = @ini_get(
"max_execution_time");
1535 if ($max_time && $max_time < $max_execution_time_for_importexport) {
1536 dol_syslog(
"max_execution_time=".$max_time.
" is lower than max_execution_time_for_importexport=".$max_execution_time_for_importexport.
". We try to increase it dynamically.");
1537 @ini_set(
"max_execution_time", $max_execution_time_for_importexport);
1541 $list = $objmodelimport->listOfAvailableImportFormat($db);
1544 $dir = DOL_DOCUMENT_ROOT.
"/core/modules/import/";
1545 $file =
"import_".$model.
".modules.php";
1546 $classname =
"Import".ucfirst($model);
1547 require_once $dir.$file;
1548 $obj =
new $classname($db, $datatoimport);
1549 if ($model ==
'csv') {
1550 $obj->separator = $separator_used;
1551 $obj->enclosure = $enclosure;
1555 $fieldssource = array();
1556 $result = $obj->import_open_file($conf->import->dir_temp.
'/'.$filetoimport, $langs);
1560 $arrayrecord = $obj->import_read_record();
1563 foreach ($arrayrecord as $key => $val) {
1564 $fieldssource[$i][
'example1'] =
dol_trunc($val[
'val'], 24);
1567 $obj->import_close_file();
1570 $nboflines = $obj->import_get_nb_of_lines($conf->import->dir_temp.
'/'.$filetoimport);
1572 $param =
'&leftmenu=import&format='.urlencode($format).
'&datatoimport='.urlencode($datatoimport).
'&filetoimport='.urlencode($filetoimport).
'&nboflines='.((int) $nboflines).
'&separator='.urlencode($separator).
'&enclosure='.urlencode($enclosure);
1574 if ($excludefirstline) {
1575 $param .=
'&excludefirstline='.urlencode($excludefirstline);
1578 $param .=
'&endatlinenb='.urlencode($endatlinenb);
1580 if (!empty($updatekeys)) {
1581 $param .=
'&updatekeys[]='.implode(
'&updatekeys[]=', $updatekeys);
1584 llxHeader(
'', $langs->trans(
"NewImport"), $help_url);
1589 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'?'.$param2.
'" method="POST">';
1590 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1591 print
'<input type="hidden" name="step" value="5">';
1592 print
'<input type="hidden" name="action" value="launchsimu">';
1596 print
'<div class="underbanner clearboth"></div>';
1597 print
'<div class="fichecenter">';
1599 print
'<table width="100%" class="border tableforfield">';
1602 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Module").
'</td>';
1604 $titleofmodule = $objimport->array_import_module[0][
'module']->getName();
1606 if (in_array($objimport->array_import_code[0], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
1607 $titleofmodule = $langs->trans(
"ProductOrService");
1609 print $titleofmodule;
1613 print
'<tr><td>'.$langs->trans(
"DatasetToImport").
'</td>';
1615 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[0]);
1616 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
1617 print
img_object($objimport->array_import_module[0][
'module']->getName(), $entityicon).
' ';
1618 print $objimport->array_import_label[0];
1624 print
load_fiche_titre($langs->trans(
"InformationOnSourceFile"),
'',
'file-export');
1626 print
'<div class="underbanner clearboth"></div>';
1627 print
'<div class="fichecenter">';
1628 print
'<table width="100%" class="border tableforfield">';
1631 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"SourceFileFormat").
'</td>';
1633 $text = $objmodelimport->getDriverDescForKey($format);
1635 print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text);
1639 if ($model ==
'csv') {
1640 print
'<tr><td>'.$langs->trans(
"CsvOptions").
'</td>';
1643 print
' '.$langs->trans(
"Enclosure").
' : '.
dol_escape_htmltag($enclosure);
1648 print
'<tr><td>'.$langs->trans(
"FileToImport").
'</td>';
1650 $modulepart =
'import';
1651 $relativepath =
GETPOST(
'filetoimport');
1652 print
'<a data-ajax="false" href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&file='.urlencode($relativepath).
'&step=4'.$param.
'" target="_blank" rel="noopener noreferrer">';
1653 print
img_mime($file,
'',
'pictofixedwidth');
1654 print $filetoimport;
1655 print
img_picto($langs->trans(
"Download"),
'download',
'class="paddingleft opacitymedium"');
1661 print $langs->trans(
"NbOfSourceLines");
1668 print $langs->trans(
"ImportFromToLine");
1670 if ($action ==
'launchsimu') {
1671 print
'<input type="number" class="maxwidth50 right" name="excludefirstlinebis" disabled="disabled" value="'.$excludefirstline.
'">';
1672 print
'<input type="hidden" name="excludefirstline" value="'.$excludefirstline.
'">';
1674 print
'<input type="number" class="maxwidth50 right" name="excludefirstline" value="'.$excludefirstline.
'">';
1675 print $form->textwithpicto(
"", $langs->trans(
"SetThisValueTo2ToExcludeFirstLine"));
1678 if ($action ==
'launchsimu') {
1679 print
'<input type="text" class="maxwidth50" name="endatlinenbbis" disabled="disabled" value="'.$endatlinenb.
'">';
1680 print
'<input type="hidden" name="endatlinenb" value="'.$endatlinenb.
'">';
1682 print
'<input type="text" class="maxwidth50" name="endatlinenb" value="'.$endatlinenb.
'">';
1683 print $form->textwithpicto(
"", $langs->trans(
"KeepEmptyToGoToEndOfFile"));
1685 if ($action ==
'launchsimu') {
1686 print
' <a href="'.$_SERVER[
"PHP_SELF"].
'?step=5'.$param.
'">'.$langs->trans(
"Modify").
'</a>';
1688 if ($excludefirstline == 2) {
1689 print $form->textwithpicto(
"", $langs->trans(
"WarningFirstImportedLine", $excludefirstline), 1,
'warning',
"warningexcludefirstline");
1691 $( document ).ready(function() {
1692 $("input[name=\'excludefirstline\']").on("change",function(){
1693 if($(this).val() <= 1){
1694 $(".warningexcludefirstline").hide();
1696 $(".warningexcludefirstline").show();
1706 print $form->textwithpicto($langs->trans(
"KeysToUseForUpdates"), $langs->trans(
"SelectPrimaryColumnsForUpdateAttempt"));
1708 if ($action ==
'launchsimu') {
1709 if (count($updatekeys)) {
1710 print $form->multiselectarray(
'updatekeysbis', $objimport->array_import_updatekeys[0], $updatekeys, 0, 0,
'', 1,
'80%',
'disabled');
1712 print
'<span class="opacitymedium">'.$langs->trans(
"NoUpdateAttempt").
'</span> -';
1714 foreach ($updatekeys as $val) {
1715 print
'<input type="hidden" name="updatekeys[]" value="'.$val.
'">';
1717 print
' <a href="'.$_SERVER[
"PHP_SELF"].
'?step=5'.$param.
'">'.$langs->trans(
"Modify").
'</a>';
1719 if (is_array($objimport->array_import_updatekeys[0]) && count($objimport->array_import_updatekeys[0])) {
1720 print $form->multiselectarray(
'updatekeys', $objimport->array_import_updatekeys[0], $updatekeys, 0, 0,
'', 1,
'80%');
1723 print
'<span class="opacitymedium">'.$langs->trans(
"UpdateNotYetSupportedForThisImport").
'</span>';
1735 print
load_fiche_titre($langs->trans(
"InformationOnTargetTables"),
'',
'file-import');
1737 print
'<div class="underbanner clearboth"></div>';
1738 print
'<div class="fichecenter">';
1740 print
'<table width="100%" class="border tableforfield">';
1743 print
'<tr><td class="titlefieldcreate">';
1744 print $langs->trans(
"TablesTarget");
1746 $listtables = array();
1747 $sort_array_match_file_to_database = $array_match_file_to_database;
1748 foreach ($array_match_file_to_database as $code => $label) {
1750 if ($code > count($fieldssource)) {
1754 $alias = preg_replace(
'/(\..*)$/i',
'', $label);
1755 $listtables[$alias] = $objimport->array_import_tables[0][$alias];
1757 if (count($listtables)) {
1760 foreach ($listtables as $val) {
1779 print $langs->trans(
"Error");
1785 print $langs->trans(
"FieldsTarget").
'</td><td>';
1786 $listfields = array();
1789 $sort_array_match_file_to_database = $array_match_file_to_database;
1790 ksort($sort_array_match_file_to_database);
1792 foreach ($sort_array_match_file_to_database as $code => $label) {
1795 if ($code > count($fieldssource)) {
1799 $alias = preg_replace(
'/(\..*)$/i',
'', $label);
1800 $listfields[$i] =
'<span class="nowrap">'.$langs->trans(
"Column").
' '.
num2Alpha($code - 1).
' -> '.$label.
'</span>';
1802 print count($listfields) ? (implode(
', ', $listfields)) : $langs->trans(
"Error");
1811 if ($action !=
'launchsimu') {
1813 print
'<br><span class="opacitymedium">';
1814 print $langs->trans(
"NowClickToTestTheImport", $langs->transnoentitiesnoconv(
"RunSimulateImportFile")).
'</span><br>';
1818 print
'<div class="center">';
1819 if ($user->hasRight(
'import',
'run')) {
1820 print
'<input type="submit" class="butAction" value="'.$langs->trans(
"RunSimulateImportFile").
'">';
1822 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions")).
'">'.$langs->trans(
"RunSimulateImportFile").
'</a>';
1827 $arrayoferrors = array();
1828 $arrayofwarnings = array();
1829 $maxnboferrors = !
getDolGlobalString(
'IMPORT_MAX_NB_OF_ERRORS') ? 50 : $conf->global->IMPORT_MAX_NB_OF_ERRORS;
1830 $maxnbofwarnings = !
getDolGlobalString(
'IMPORT_MAX_NB_OF_WARNINGS') ? 50 : $conf->global->IMPORT_MAX_NB_OF_WARNINGS;
1842 $pathfile = $conf->import->dir_temp.
'/'.$filetoimport;
1843 $result = $obj->import_open_file($pathfile, $langs);
1845 global $tablewithentity_cache;
1846 $tablewithentity_cache = array();
1851 while (($sourcelinenb < $nboflines) && !$endoffile) {
1855 $arrayrecord = $obj->import_read_record();
1856 if ($arrayrecord ===
false) {
1857 $arrayofwarnings[$sourcelinenb][0] = array(
'lib' =>
'File has '.$nboflines.
' lines. However we reach the end of file or an empty line at record '.$sourcelinenb.
'. This may occurs when some records are split onto several lines and not correctly delimited by the "Char delimiter", or if there is line with no data on all fields.',
'type' =>
'EOF_RECORD_ON_SEVERAL_LINES');
1861 if ($excludefirstline && ($sourcelinenb < $excludefirstline)) {
1864 if ($endatlinenb && ($sourcelinenb > $endatlinenb)) {
1868 $parameters = array(
1870 'datatoimport' => $datatoimport,
1872 'arrayrecord' => $arrayrecord,
1873 'array_match_file_to_database' => $array_match_file_to_database,
1874 'objimport' => $objimport,
1875 'fieldssource' => $fieldssource,
1876 'importid' => $importid,
1877 'updatekeys' => $updatekeys,
1878 'arrayoferrors' => &$arrayoferrors,
1879 'arrayofwarnings' => &$arrayofwarnings,
1883 $reshook = $hookmanager->executeHooks(
'ImportInsert', $parameters);
1885 $arrayoferrors[$sourcelinenb][] = [
1886 'lib' => implode(
"<br>", array_merge([$hookmanager->error], $hookmanager->errors))
1890 if (empty($reshook)) {
1892 $result = $obj->import_insert($arrayrecord, $array_match_file_to_database, $objimport, count($fieldssource), $importid, $updatekeys);
1894 if (count($obj->errors)) {
1895 $arrayoferrors[$sourcelinenb] = $obj->errors;
1897 if (count($obj->warnings)) {
1898 $arrayofwarnings[$sourcelinenb] = $obj->warnings;
1900 if (!count($obj->errors) && !count($obj->warnings)) {
1906 $obj->import_close_file();
1908 print $langs->trans(
"ErrorFailedToOpenFile", $pathfile);
1915 if (!empty($objimport->array_import_run_sql_after[0]) && is_array($objimport->array_import_run_sql_after[0])) {
1917 foreach ($objimport->array_import_run_sql_after[0] as $sqlafterimport) {
1919 $resqlafterimport = $db->query($sqlafterimport);
1920 if (!$resqlafterimport) {
1921 $arrayoferrors[
'none'][] = array(
'lib' => $langs->trans(
"Error running final request: ".$sqlafterimport));
1930 if (!count($arrayoferrors) && !count($arrayofwarnings)) {
1932 print
'<div class="info">';
1933 print
'<div class=""><b>'.$langs->trans(
"ResultOfSimulationNoError").
'</b></div>';
1934 print $langs->trans(
"NbInsertSim", empty($obj->nbinsert) ? 0 : $obj->nbinsert).
'<br>';
1935 print $langs->trans(
"NbUpdateSim", empty($obj->nbupdate) ? 0 : $obj->nbupdate).
'<br>';
1940 print
'<div class="warning">';
1941 print $langs->trans(
"NbOfLinesOK", $nbok).
'...<br>';
1948 if (count($arrayoferrors)) {
1949 print
img_error().
' <b>'.$langs->trans(
"ErrorsOnXLines", count($arrayoferrors)).
'</b><br>';
1950 print
'<table width="100%" class="border"><tr><td>';
1951 foreach ($arrayoferrors as $key => $val) {
1953 if ($nboferrors > $maxnboferrors) {
1954 print $langs->trans(
"TooMuchErrors", (count($arrayoferrors) - $nboferrors)).
"<br>";
1958 foreach ($val as $i => $err) {
1959 print
' > '.dol_escape_htmltag($err[
'lib']).
'<br>';
1962 print
'</td></tr></table>';
1968 if (count($arrayofwarnings)) {
1969 print
img_warning().
' <b>'.$langs->trans(
"WarningsOnXLines", count($arrayofwarnings)).
'</b><br>';
1970 print
'<table width="100%" class="border"><tr><td>';
1971 foreach ($arrayofwarnings as $key => $val) {
1973 if ($nbofwarnings > $maxnbofwarnings) {
1974 print $langs->trans(
"TooMuchWarnings", (count($arrayofwarnings) - $nbofwarnings)).
"<br>";
1978 foreach ($val as $i => $err) {
1979 print
' > '.dol_escape_htmltag($err[
'lib']).
'<br>';
1982 print
'</td></tr></table>';
1989 print
'<div class="center">';
1990 print
'<span class="opacitymedium">'.$langs->trans(
"NowClickToRunTheImport", $langs->transnoentitiesnoconv(
"RunImportFile")).
'</span><br>';
1999 print
'<div class="center">';
2000 if ($user->hasRight(
'import',
'run')) {
2001 if (empty($nboferrors)) {
2002 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/imports/import.php?leftmenu=import&step=6&importid='.$importid.$param.
'">'.$langs->trans(
"RunImportFile").
'</a>';
2006 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"CorrectErrorBeforeRunningImport")).
'">'.$langs->trans(
"RunImportFile").
'</a>';
2009 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions")).
'">'.$langs->trans(
"RunSimulateImportFile").
'</a>';
2011 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions")).
'">'.$langs->trans(
"RunImportFile").
'</a>';
2021if ($step == 6 && $datatoimport) {
2022 $max_execution_time_for_importexport =
getDolGlobalInt(
'IMPORT_MAX_EXECUTION_TIME', 300);
2023 $max_time = @ini_get(
"max_execution_time");
2024 if ($max_time && $max_time < $max_execution_time_for_importexport) {
2025 dol_syslog(
"max_execution_time=".$max_time.
" is lower than max_execution_time_for_importexport=".$max_execution_time_for_importexport.
". We try to increase it dynamically.");
2026 @ini_set(
"max_execution_time", $max_execution_time_for_importexport);
2030 $list = $objmodelimport->listOfAvailableImportFormat($db);
2031 $importid =
GETPOST(
"importid",
'alphanohtml');
2035 $dir = DOL_DOCUMENT_ROOT.
"/core/modules/import/";
2036 $file =
"import_".$model.
".modules.php";
2037 $classname =
"Import".ucfirst($model);
2038 require_once $dir.$file;
2039 $obj =
new $classname($db, $datatoimport);
2040 if ($model ==
'csv') {
2041 $obj->separator = $separator_used;
2042 $obj->enclosure = $enclosure;
2046 $fieldssource = array();
2047 $result = $obj->import_open_file($conf->import->dir_temp.
'/'.$filetoimport, $langs);
2050 $arrayrecord = $obj->import_read_record();
2053 foreach ($arrayrecord as $key => $val) {
2054 $fieldssource[$i][
'example1'] =
dol_trunc($val[
'val'], 24);
2057 $obj->import_close_file();
2062 $param =
'&format='.$format.
'&datatoimport='.urlencode($datatoimport).
'&filetoimport='.urlencode($filetoimport).
'&nboflines='.((int) $nboflines);
2063 if ($excludefirstline) {
2064 $param .=
'&excludefirstline='.urlencode($excludefirstline);
2067 $param .=
'&endatlinenb='.urlencode($endatlinenb);
2070 $param .=
'&separator='.urlencode($separator);
2073 $param .=
'&enclosure='.urlencode($enclosure);
2076 llxHeader(
'', $langs->trans(
"NewImport"), $help_url);
2082 print
'<div class="underbanner clearboth"></div>';
2083 print
'<div class="fichecenter">';
2085 print
'<table width="100%" class="border">';
2088 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Module").
'</td>';
2090 $titleofmodule = $objimport->array_import_module[0][
'module']->getName();
2092 if (in_array($objimport->array_import_code[0], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
2093 $titleofmodule = $langs->trans(
"ProductOrService");
2095 print $titleofmodule;
2099 print
'<tr><td>'.$langs->trans(
"DatasetToImport").
'</td>';
2101 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[0]);
2102 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
2103 print
img_object($objimport->array_import_module[0][
'module']->getName(), $entityicon).
' ';
2104 print $objimport->array_import_label[0];
2110 print
load_fiche_titre($langs->trans(
"InformationOnSourceFile"),
'',
'file-export');
2112 print
'<div class="underbanner clearboth"></div>';
2113 print
'<div class="fichecenter">';
2114 print
'<table width="100%" class="border">';
2117 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"SourceFileFormat").
'</td>';
2119 $text = $objmodelimport->getDriverDescForKey($format);
2121 print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text);
2125 if ($model ==
'csv') {
2126 print
'<tr><td>'.$langs->trans(
"CsvOptions").
'</td>';
2128 print $langs->trans(
"Separator").
' : ';
2129 print htmlentities($separator);
2130 print
' '.$langs->trans(
"Enclosure").
' : ';
2131 print htmlentities($enclosure);
2136 print
'<tr><td>'.$langs->trans(
"FileToImport").
'</td>';
2138 $modulepart =
'import';
2139 $relativepath =
GETPOST(
'filetoimport');
2140 print
'<a data-ajax="false" href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&file='.urlencode($relativepath).
'&step=4'.$param.
'" target="_blank" rel="noopener noreferrer">';
2141 print
img_mime($file,
'',
'pictofixedwidth');
2142 print $filetoimport;
2148 print $langs->trans(
"NbOfSourceLines");
2155 print $langs->trans(
"ImportFromLine");
2157 print
'<input type="text" size="4" name="excludefirstline" disabled="disabled" value="'.$excludefirstline.
'">';
2162 print $langs->trans(
"EndAtLineNb");
2164 print
'<input type="text" size="4" name="endatlinenb" disabled="disabled" value="'.$endatlinenb.
'">';
2172 print
'<b>'.$langs->trans(
"InformationOnTargetTables").
'</b>';
2173 print
'<div class="underbanner clearboth"></div>';
2174 print
'<div class="fichecenter">';
2175 print
'<table class="border centpercent">';
2178 print
'<tr><td width="25%">';
2179 print $langs->trans(
"TablesTarget");
2181 $listtables = array();
2182 foreach ($array_match_file_to_database as $code => $label) {
2184 if ($code > count($fieldssource)) {
2188 $alias = preg_replace(
'/(\..*)$/i',
'', $label);
2189 $listtables[$alias] = $objimport->array_import_tables[0][$alias];
2191 if (count($listtables)) {
2193 foreach ($listtables as $val) {
2212 print $langs->trans(
"Error");
2218 print $langs->trans(
"FieldsTarget").
'</td><td>';
2219 $listfields = array();
2221 $sort_array_match_file_to_database = $array_match_file_to_database;
2222 ksort($sort_array_match_file_to_database);
2224 foreach ($sort_array_match_file_to_database as $code => $label) {
2227 if ($code > count($fieldssource)) {
2231 $alias = preg_replace(
'/(\..*)$/i',
'', $label);
2232 $listfields[$i] = $langs->trans(
"Field").
' '.$code.
'->'.$label;
2234 print count($listfields) ? (implode(
', ', $listfields)) : $langs->trans(
"Error");
2241 $arrayoferrors = array();
2242 $arrayofwarnings = array();
2243 $maxnboferrors = !
getDolGlobalString(
'IMPORT_MAX_NB_OF_ERRORS') ? 50 : $conf->global->IMPORT_MAX_NB_OF_ERRORS;
2244 $maxnbofwarnings = !
getDolGlobalString(
'IMPORT_MAX_NB_OF_WARNINGS') ? 50 : $conf->global->IMPORT_MAX_NB_OF_WARNINGS;
2256 $pathfile = $conf->import->dir_temp.
'/'.$filetoimport;
2257 $result = $obj->import_open_file($pathfile, $langs);
2259 global $tablewithentity_cache;
2260 $tablewithentity_cache = array();
2264 while ($sourcelinenb < $nboflines && !$endoffile) {
2266 $arrayrecord = $obj->import_read_record();
2267 if ($arrayrecord ===
false) {
2268 $arrayofwarnings[$sourcelinenb][0] = array(
'lib' =>
'File has '.$nboflines.
' lines. However we reach the end of file or an empty line at record '.$sourcelinenb.
'. This may occurs when some records are split onto several lines and not correctly delimited by the "Char delimiter", or if there is line with no data on all fields.',
'type' =>
'EOF_RECORD_ON_SEVERAL_LINES');
2272 if ($excludefirstline && ($sourcelinenb < $excludefirstline)) {
2275 if ($endatlinenb && ($sourcelinenb > $endatlinenb)) {
2279 $parameters = array(
2281 'datatoimport' => $datatoimport,
2283 'arrayrecord' => $arrayrecord,
2284 'array_match_file_to_database' => $array_match_file_to_database,
2285 'objimport' => $objimport,
2286 'fieldssource' => $fieldssource,
2287 'importid' => $importid,
2288 'updatekeys' => $updatekeys,
2289 'arrayoferrors' => &$arrayoferrors,
2290 'arrayofwarnings' => &$arrayofwarnings,
2294 $reshook = $hookmanager->executeHooks(
'ImportInsert', $parameters);
2296 $arrayoferrors[$sourcelinenb][] = [
2297 'lib' => implode(
"<br>", array_merge([$hookmanager->error], $hookmanager->errors))
2301 if (empty($reshook)) {
2303 $result = $obj->import_insert($arrayrecord, $array_match_file_to_database, $objimport, count($fieldssource), $importid, $updatekeys);
2305 if (count($obj->errors)) {
2306 $arrayoferrors[$sourcelinenb] = $obj->errors;
2308 if (count($obj->warnings)) {
2309 $arrayofwarnings[$sourcelinenb] = $obj->warnings;
2312 if (!count($obj->errors) && !count($obj->warnings)) {
2317 $reshook = $hookmanager->executeHooks(
'AfterImportInsert', $parameters);
2319 $arrayoferrors[$sourcelinenb][] = [
2320 'lib' => implode(
"<br>", array_merge([$hookmanager->error], $hookmanager->errors))
2325 $obj->import_close_file();
2327 print $langs->trans(
"ErrorFailedToOpenFile", $pathfile);
2330 if (count($arrayoferrors) > 0) {
2337 if (!empty($objimport->array_import_run_sql_after[0]) && is_array($objimport->array_import_run_sql_after[0])) {
2339 foreach ($objimport->array_import_run_sql_after[0] as $sqlafterimport) {
2341 $resqlafterimport = $db->query($sqlafterimport);
2342 if (!$resqlafterimport) {
2343 $arrayoferrors[
'none'][] = array(
'lib' => $langs->trans(
"Error running final request: ".$sqlafterimport));
2361 print
'<div class="info">';
2362 print $langs->trans(
"NbOfLinesImported", $nbok).
'</b><br>';
2363 print $langs->trans(
"NbInsert", empty($obj->nbinsert) ? 0 : $obj->nbinsert).
'<br>';
2364 print $langs->trans(
"NbUpdate", empty($obj->nbupdate) ? 0 : $obj->nbupdate).
'<br>';
2366 print
'<div class="center">';
2367 print $langs->trans(
"FileWasImported", $importid).
'<br>';
2368 print
'<span class="opacitymedium">'.$langs->trans(
"YouCanUseImportIdToFindRecord", $importid).
'</span><br>';
2391 global $conf, $langs;
2395 if ($key ==
'none') {
2397 print
"\n\n<!-- Box_no-key start-->\n";
2398 print
'<div class="box boximport" style="padding:0;">'.
"\n";
2399 print
'<table summary="boxtable_no-key" class="centpercent nobordernopadding">'.
"\n";
2401 print
"\n\n<!-- Box ".$pos.
" start -->\n";
2402 print
'<div class="box boximport" style="padding: 0;" id="boxto_'.$pos.
'">'.
"\n";
2404 print
'<table summary="boxtable'.$pos.
'" class="nobordernopadding centpercent tableimport">'.
"\n";
2407 if (($pos && $pos > count($fieldssource)) && (!isset($fieldssource[$pos][
"imported"]))) {
2417 } elseif ($key ==
'none') {
2418 print
'<tr style="height:'.$height.
'" class="trimport oddevenimport">';
2419 print
'<td class="nocellnopadding" width="16" style="font-weight: normal">';
2422 print
'<td style="font-weight: normal">';
2428 print
'<tr style="height:'.$height.
'" class="trimport oddevenimport">';
2429 print
'<td class="nocellnopadding" width="16" style="font-weight: normal">';
2432 print
img_picto($langs->trans(
"Column").
' '.
num2Alpha($pos - 1),
'file',
'class="pictofixedwith"');
2434 if (isset($fieldssource[$pos][
'imported']) && $fieldssource[$pos][
'imported'] ==
false) {
2435 print
'<td class="nowraponall boxtdunused" style="font-weight: normal">';
2437 print
'<td class="nowraponall tdoverflowmax500" style="font-weight: normal">';
2439 print $langs->trans(
"Column").
' '.
num2Alpha($pos - 1).
' (#'.$pos.
')';
2440 if (empty($fieldssource[$pos][
'example1'])) {
2441 $example = $fieldssource[$pos][
'label'];
2443 $example = $fieldssource[$pos][
'example1'];
2447 $example = mb_convert_encoding($example,
'UTF-8',
'ISO-8859-1');
2451 print
'<i class="opacitymedium">'.dol_escape_htmltag($example).
'</i>';
2460 print
"<!-- Box end -->\n\n";
2473 $i = count($fieldssource) + 1;
2476 foreach ($listofkey as $key => $val) {
2477 $maxkey = max($maxkey, $key);
2480 while ($i <= $maxkey) {
2481 if (empty($listofkey[$i])) {
2503 if ($position == count($array)) {
2504 $ret = $array + $insertArray;
2507 foreach ($array as $key => $value) {
2508 if ($position == $i++) {
2509 $ret += $insertArray;
2512 $ret[$key] = $value;
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Parent class for import file readers.
Class to manage Dolibarr users.
dol_filemtime($pathoffile)
Return time of a file.
dol_filesize($pathoffile)
Return size of a file.
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan=0, $uploaderrorcode=0, $nohook=0, $varfiles='addedfile', $upload_dir='')
Check validity of a file upload from an GUI page, and move it to its final destination.
dol_count_nb_of_line($file)
Count number of lines in a file.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dolExplodeIntoArray($string, $delimiter=';', $kv='=')
Split a string with 2 keys into key array.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_now($mode='auto')
Return date for now.
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_string_unaccent($str)
Clean a string from all accent characters to be used as ref, login or by dol_sanitizeFileName.
num2Alpha($n)
Return a numeric value into an Excel like column number.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
img_error($titlealt='default')
Show error logo.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
utf8_check($str)
Check if a string is in UTF8.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
import_prepare_head($param, $maxstep=0)
Function to return list of tabs for import pages.
show_elem($fieldssource, $pos, $key)
Function to put the movable box of a source field.
getnewkey(&$fieldssource, &$listofkey)
Return not used field number.
arrayInsert($array, $position, $insertArray)
Return array with element inserted in it at position $position.
getMaxFileSizeArray()
Return the max allowed for file upload.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.