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',
'products',
'margins'));
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);
787 if (!empty($obj->error)) {
788 $langs->load(
"errors");
789 $param =
'&datatoimport='.$datatoimport.
'&format='.$format;
791 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?step=3'.$param.
'&filetoimport='.urlencode($relativepath));
796 if ($model ==
'csv') {
797 $obj->separator = $separator_used;
798 $obj->enclosure = $enclosure;
801 if ($model ==
'xlsx') {
802 if (!preg_match(
'/\.xlsx$/i', $filetoimport)) {
803 $langs->load(
"errors");
804 $param =
'&datatoimport='.$datatoimport.
'&format='.$format;
805 setEventMessages($langs->trans(
"ErrorFileMustHaveFormat", $model),
null,
'errors');
806 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?step=3'.$param.
'&filetoimport='.urlencode($relativepath));
812 $array_match_file_to_database = array();
816 $fieldssource = array();
817 $result = $obj->import_open_file($conf->import->dir_temp.
'/'.$filetoimport, $langs);
820 $arrayrecord = $obj->import_read_record();
824 foreach ($arrayrecord as $key => $val) {
825 if ($val[
"type"] != -1) {
826 $fieldssource[$i][
'example1'] =
dol_trunc($val[
'val'], 128);
829 $fieldssource[$i][
'example1'] = $langs->trans(
'Empty');
833 $obj->import_close_file();
837 $fieldstarget = $objimport->array_import_fields[0];
838 $minpos = min(count($fieldssource), count($fieldstarget));
842 $initialloadofstep4 =
false;
843 if (empty($_SESSION[
'dol_array_match_file_to_database_select'])) {
844 $initialloadofstep4 =
true;
848 if (count($array_match_file_to_database) == 0) {
854 $num = count($fieldssource);
855 while ($pos <= $num) {
856 if ($num >= 1 && $pos <= $num) {
858 foreach ($fieldstarget as $key => $val) {
859 if ($posbis < $pos) {
864 $array_match_file_to_database[$pos] = $key;
871 $array_match_database_to_file = array_flip($array_match_file_to_database);
875 $fieldstarget_tmp = array();
876 $arraykeysfieldtarget = array_keys($fieldstarget);
878 foreach ($fieldstarget as $key => $label) {
879 $isrequired = preg_match(
'/\*$/', $label);
880 if (!empty($isrequired)) {
881 $newlabel = substr($label, 0, -1);
882 $fieldstarget_tmp[$key] = array(
"label" => $newlabel,
"required" =>
true);
884 $fieldstarget_tmp[$key] = array(
"label" => $label,
"required" =>
false);
886 if (!empty($array_match_database_to_file[$key])) {
887 $fieldstarget_tmp[$key][
"imported"] =
true;
888 $fieldstarget_tmp[$key][
"position"] = $array_match_database_to_file[$key] - 1;
890 while (!empty($array_match_database_to_file[$keytoswap])) {
891 if ($position + 1 > $array_match_database_to_file[$keytoswap]) {
892 $keytoswapwith = $array_match_database_to_file[$keytoswap] - 1;
893 $tmp = [$keytoswap => $fieldstarget_tmp[$keytoswap]];
894 unset($fieldstarget_tmp[$keytoswap]);
895 $fieldstarget_tmp =
arrayInsert($fieldstarget_tmp, $keytoswapwith, $tmp);
896 $keytoswapwith = $arraykeysfieldtarget[$array_match_database_to_file[$keytoswap] - 1];
897 $tmp = $fieldstarget_tmp[$keytoswapwith];
898 unset($fieldstarget_tmp[$keytoswapwith]);
899 $fieldstarget_tmp[$keytoswapwith] = $tmp;
900 $keytoswap = $keytoswapwith;
906 $fieldstarget_tmp[$key][
"imported"] =
false;
910 $fieldstarget = $fieldstarget_tmp;
919 $param =
'&format='.$format.
'&datatoimport='.urlencode($datatoimport).
'&filetoimport='.urlencode($filetoimport);
920 if ($excludefirstline) {
921 $param .=
'&excludefirstline='.urlencode($excludefirstline);
924 $param .=
'&endatlinenb='.urlencode($endatlinenb);
927 $param .=
'&separator='.urlencode($separator);
930 $param .=
'&enclosure='.urlencode($enclosure);
933 llxHeader(
'', $langs->trans(
"NewImport"), $help_url);
939 print
'<div class="underbanner clearboth"></div>';
940 print
'<div class="fichecenter">';
942 print
'<table class="centpercent border tableforfield">';
945 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Module").
'</td>';
947 $titleofmodule = $objimport->array_import_module[0][
'module']->getName();
949 if (in_array($objimport->array_import_code[0], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
950 $titleofmodule = $langs->trans(
"ProductOrService");
952 print $titleofmodule;
956 print
'<tr><td>'.$langs->trans(
"DatasetToImport").
'</td>';
958 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[0]);
959 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
960 print
img_object($objimport->array_import_module[0][
'module']->getName(), $entityicon).
' ';
961 print $objimport->array_import_label[0];
967 print
load_fiche_titre($langs->trans(
"InformationOnSourceFile"),
'',
'file-export');
969 print
'<div class="underbanner clearboth"></div>';
970 print
'<div class="fichecenter">';
971 print
'<table width="100%" class="border tableforfield">';
974 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"SourceFileFormat").
'</td>';
976 $text = $objmodelimport->getDriverDescForKey($format);
978 print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text);
982 if ($model ==
'csv') {
983 print
'<tr><td>'.$langs->trans(
"CsvOptions").
'</td>';
985 print
'<form method="POST">';
986 print
'<input type="hidden" name="token" value="'.newToken().
'">';
987 print
'<input type="hidden" value="'.$step.
'" name="step">';
988 print
'<input type="hidden" value="'.$format.
'" name="format">';
989 print
'<input type="hidden" value="'.$excludefirstline.
'" name="excludefirstline">';
990 print
'<input type="hidden" value="'.$endatlinenb.
'" name="endatlinenb">';
991 print
'<input type="hidden" value="'.$datatoimport.
'" name="datatoimport">';
992 print
'<input type="hidden" value="'.$filetoimport.
'" name="filetoimport">';
993 print $langs->trans(
"Separator").
' : ';
994 print
'<input type="text" class="width25 center" name="separator" value="'.dol_escape_htmltag($separator).
'"/>';
995 print
' '.$langs->trans(
"Enclosure").
' : ';
996 print
'<input type="text" class="width25 center" name="enclosure" value="'.dol_escape_htmltag($enclosure).
'"/> ';
997 print
'<input name="update" type="submit" value="'.$langs->trans(
'Update').
'" class="button smallpaddingimp" />';
1003 print
'<tr><td>'.$langs->trans(
"FileToImport").
'</td>';
1005 $modulepart =
'import';
1006 $relativepath =
GETPOST(
'filetoimport');
1007 print
'<a data-ajax="false" href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&file='.urlencode($relativepath).
'&step=4'.$param.
'" target="_blank" rel="noopener noreferrer">';
1008 print
img_mime($file,
'',
'pictofixedwidth');
1009 print $filetoimport;
1010 print
img_picto($langs->trans(
"Download"),
'download',
'class="paddingleft opacitymedium"');
1023 print
'<!-- List of source fields -->'.
"\n";
1024 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1025 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1026 print
'<input type="hidden" name="action" value="select_model">';
1027 print
'<input type="hidden" name="step" value="4">';
1028 print
'<input type="hidden" name="format" value="'.$format.
'">';
1029 print
'<input type="hidden" name="datatoimport" value="'.$datatoimport.
'">';
1030 print
'<input type="hidden" name="filetoimport" value="'.$filetoimport.
'">';
1031 print
'<input type="hidden" name="excludefirstline" value="'.$excludefirstline.
'">';
1032 print
'<input type="hidden" name="endatlinenb" value="'.$endatlinenb.
'">';
1033 print
'<input type="hidden" name="separator" value="'.dol_escape_htmltag($separator).
'">';
1034 print
'<input type="hidden" name="enclosure" value="'.dol_escape_htmltag($enclosure).
'">';
1037 print
'<div class="marginbottomonly">';
1038 print
'<span class="opacitymedium">';
1039 $s = $langs->trans(
"SelectImportFieldsSource",
'{s1}');
1040 $s = str_replace(
'{s1}',
img_picto(
'',
'grip_title',
'',
false, 0, 0,
'',
'', 0), $s);
1043 $htmlother->select_import_model($importmodelid,
'importmodelid', $datatoimport, 1, $user->id);
1044 print
'<input type="submit" class="button small reposition" value="'.$langs->trans(
"Select").
'">';
1049 print
'<div class="div-table-responsive-no-min">';
1050 print
'<table class="noborder centpercent">';
1051 print
'<tr class="liste_titre">';
1052 print
'<td>'.$langs->trans(
"FieldsInSourceFile").
'</td>';
1053 print
'<td>'.$langs->trans(
"FieldsInTargetDatabase").
'</td>';
1058 print
'<tr valign="top"><td width="50%" class="nopaddingleftimp">';
1060 $fieldsplaced = array();
1061 $valforsourcefieldnb = array();
1062 $listofkeys = array();
1063 foreach ($array_match_file_to_database as $key => $val) {
1064 $listofkeys[$key] = 1;
1067 print
"\n<!-- Box left container -->\n";
1068 print
'<div id="left" class="connectedSortable">'.
"\n";
1073 foreach ($fieldssource as $key => $val) {
1076 $listofkeys[$key] = 1;
1077 $fieldsplaced[$key] = 1;
1078 $valforsourcefieldnb[$lefti] = $key;
1088 print
"<!-- End box left container -->\n";
1091 print
'</td><td width="50%" class="nopaddingrightimp">';
1095 $optionsall = array();
1096 foreach ($fieldstarget as $code => $line) {
1099 $tmparray = explode(
'|', $line[
"label"]);
1101 foreach ($tmparray as $tmpkey => $tmpval) {
1102 $labeltoshow .= ($labeltoshow ?
' '.$langs->trans(
'or').
' ' :
'').$langs->transnoentities($tmpval);
1104 $optionsall[$code] = array(
'labelkey' => $line[
'label'],
'labelkeyarray' => $tmparray,
'label' => $labeltoshow,
'required' => (empty($line[
"required"]) ? 0 : 1),
'position' => !empty($line[
'position']) ? $line[
'position'] : 0);
1109 $optionsall[$code][
'picto'] = $picto;
1116 $mandatoryfieldshavesource =
true;
1129 $modetoautofillmapping =
'session';
1130 if ($initialloadofstep4) {
1131 $modetoautofillmapping =
'guess';
1135 print
'<table class="nobordernopadding centpercent tableimport">';
1136 foreach ($fieldssource as $code => $line) {
1140 print
'<tr style="height:'.$height.
'" class="trimport oddevenimport">';
1141 $entity = (!empty($objimport->array_import_entities[0][$code]) ? $objimport->array_import_entities[0][$code] : $objimport->array_import_icon[0]);
1143 $entityicon = !empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity;
1144 $entitylang = !empty($entitytolang[$entity]) ? $entitytolang[$entity] : $objimport->array_import_label[0];
1146 print
'<td class="nowraponall hideonsmartphone" style="font-weight: normal">=> </td>';
1147 print
'<td class="nowraponall" style="font-weight: normal">';
1152 $selectforline =
'';
1153 $selectforline .=
'<select id="selectorderimport_'.($i + 1).
'" class="targetselectchange minwidth300" name="select_'.($i + 1).
'">';
1154 if (!empty($line[
"imported"])) {
1155 $selectforline .=
'<option value="-1"> </option>';
1157 $selectforline .=
'<option selected="" value="-1"> </option>';
1161 $codeselectedarray = array();
1162 foreach ($optionsall as $tmpcode => $tmpval) {
1164 if (!empty($tmpval[
'picto'])) {
1165 $label .=
img_picto(
'', $tmpval[
'picto'],
'class="pictofixedwidth"');
1167 $label .= $tmpval[
'required'] ?
'<strong>' :
'';
1168 $label .= $tmpval[
'label'];
1169 $label .= $tmpval[
'required'] ?
'*</strong>' :
'';
1171 $tablealias = preg_replace(
'/(\..*)$/i',
'', $tmpcode);
1172 $tablename = !empty($objimport->array_import_tables[0][$tablealias]) ? $objimport->array_import_tables[0][$tablealias] :
"";
1176 $filecolumn = ($i + 1);
1178 if (empty($objimport->array_import_convertvalue[0][$tmpcode])) {
1181 if ($objimport->array_import_convertvalue[0][$tmpcode][
'rule'] ==
'fetchidfromref') {
1182 $htmltext .= $langs->trans(
"DataComeFromIdFoundFromRef", $langs->transnoentitiesnoconv($entitylang)).
'<br>';
1184 if ($objimport->array_import_convertvalue[0][$tmpcode][
'rule'] ==
'fetchidfromcodeid') {
1185 $dictlabel = $objimport->array_import_convertvalue[0][$tmpcode][
'dict'] ??
'';
1186 $htmltext .= $langs->trans(
"DataComeFromIdFoundFromCodeId", $langs->transnoentitiesnoconv($dictlabel)).
'<br>';
1190 $example = !empty($objimport->array_import_examplevalues[0][$tmpcode]) ? $objimport->array_import_examplevalues[0][$tmpcode] :
"";
1192 if (empty($objimport->array_import_convertvalue[0][$tmpcode])) {
1194 $htmltext .= $langs->trans(
"SourceExample").
': <b>'.str_replace(
'"',
'', $example).
'</b><br>';
1197 if ($objimport->array_import_convertvalue[0][$tmpcode][
'rule'] ==
'fetchidfromref') {
1198 $htmltext .= $langs->trans(
"SourceExample").
': <b>'.$langs->transnoentitiesnoconv(
"ExampleAnyRefFoundIntoElement", $entitylang).($example ?
' ('.$langs->transnoentitiesnoconv(
"Example").
': '.str_replace(
'"',
'', $example).
')' :
'').
'</b><br>';
1199 } elseif ($objimport->array_import_convertvalue[0][$tmpcode][
'rule'] ==
'fetchidfromcodeid') {
1200 $dictlabel = $objimport->array_import_convertvalue[0][$tmpcode][
'dict'] ??
'';
1201 $htmltext .= $langs->trans(
"SourceExample").
': <b>'.$langs->trans(
"ExampleAnyCodeOrIdFoundIntoDictionary", $langs->transnoentitiesnoconv($dictlabel)).($example ?
' ('.$langs->transnoentitiesnoconv(
"Example").
': '.str_replace(
'"',
'', $example).
')' :
'').
'</b><br>';
1202 } elseif ($example) {
1203 $htmltext .= $langs->trans(
"SourceExample").
': <b>'.str_replace(
'"',
'', $example).
'</b><br>';
1207 if (!empty($objimport->array_import_regex[0][$tmpcode])) {
1208 $htmltext .= $langs->trans(
"FormatControlRule").
': <b>'.str_replace(
'"',
'', $objimport->array_import_regex[0][$tmpcode]).
'</b><br>';
1212 $htmltext .= $langs->trans(
"InformationOnTargetTables").
': <b>'.$tablename.
"->".preg_replace(
'/^.*\./',
'', $tmpcode).
"</b>";
1214 $labelhtml = $label.
' '.$form->textwithpicto(
'', $htmltext, 1,
'help',
'', 1);
1216 $selectforline .=
'<option value="'.$tmpcode.
'"';
1217 if ($modetoautofillmapping ==
'orderoftargets') {
1220 $selectforline .=
' selected';
1222 } elseif ($modetoautofillmapping ==
'guess') {
1226 if (preg_match(
'/^(.+)\((.+\..+)\)$/', $line[
'example1'], $regs)) {
1227 $tmpstring1 = $regs[1];
1228 $tmpstring2 = $regs[2];
1230 $tmpstring1 = $line[
'example1'];
1238 foreach ($tmpval[
'labelkeyarray'] as $tmpval2) {
1239 $labeltarget = $langs->transnoentities($tmpval2);
1241 if ($tmpstring1 && ($tmpstring1 == $tmpcode || $tmpstring1 == strtolower($labeltarget)
1242 || $tmpstring1 == strtolower(
dol_string_unaccent($labeltarget)) || $tmpstring1 == strtolower($tmpval2))) {
1243 if (empty($codeselectedarray[$code])) {
1244 $selectforline .=
' selected';
1245 $codeselectedarray[$code] = 1;
1248 } elseif ($tmpstring2 && ($tmpstring2 == $tmpcode || $tmpstring2 == strtolower($labeltarget)
1249 || $tmpstring2 == strtolower(
dol_string_unaccent($labeltarget)) || $tmpstring2 == strtolower($tmpval2))) {
1250 if (empty($codeselectedarray[$code])) {
1251 $selectforline .=
' selected';
1252 $codeselectedarray[$code] = 1;
1257 } elseif ($modetoautofillmapping ==
'session' && !empty($_SESSION[
'dol_array_match_file_to_database_select'])) {
1258 $tmpselectioninsession =
dolExplodeIntoArray($_SESSION[
'dol_array_match_file_to_database_select'],
',',
'=');
1260 if (!empty($tmpselectioninsession[(
string) ($i + 1)]) && $tmpselectioninsession[(
string) ($i + 1)] == $tmpcode) {
1261 $selectforline .=
' selected';
1263 $selectforline .=
' data-debug="'.$tmpcode.
'-'.$code.
'-'.$j.
'-'.(!empty($tmpselectioninsession[(
string) ($i + 1)]) ? $tmpselectioninsession[(string) ($i + 1)] :
"").
'"';
1265 $selectforline .=
' data-html="'.dol_escape_htmltag($labelhtml).
'"';
1266 $selectforline .=
'>';
1267 $selectforline .= $label;
1268 $selectforline .=
'</options>';
1271 $selectforline .=
'</select>';
1272 $selectforline .=
ajax_combobox(
'selectorderimport_'.($i + 1));
1274 print $selectforline;
1279 print
'<td class="nowraponall" style="font-weight:normal; text-align:right">';
1282 $htmltext =
'<b><u>'.$langs->trans(
"FieldSource").
'</u></b><br>';
1284 $htmltext .= $langs->trans(
"DataComeFromFileFieldNb", $filecolumntoshow).
'<br>';
1286 print $form->textwithpicto(
'', $htmltext);
1297 print
'<tr class="liste_titre"><td colspan="2">'.$langs->trans(
"Note").
'</td></tr>';
1298 print
'<tr><td colspan="2"><div id="div-mandatory-target-fields-not-mapped"></div></td></tr>';
1304 if (!empty($conf->use_javascript_ajax)) {
1305 print
'<script type="text/javascript">'.
"\n";
1306 print
'var previousselectedvalueimport = "0";'.
"\n";
1307 print
'var previousselectedlabelimport = "0";'.
"\n";
1308 print
'var arrayofselectedvalues = [];'.
"\n";
1309 print
'var arrayoftargetfields = [];'.
"\n";
1310 print
'var arrayoftargetmandatoryfields = [];'.
"\n";
1314 foreach ($fieldstarget as $key => $val) {
1315 print
"arrayoftargetfields[".$tmpi.
"] = '".
dol_escape_js($langs->trans($val[
'label'])).
"'; ";
1316 if ($val[
'required']) {
1317 print
"arrayoftargetmandatoryfields[".$tmpi.
"] = '".
dol_escape_js($key).
"'; ";
1323 print
'$(document).ready(function () {'.
"\n";
1325 print
'setOptionsToDisabled();'.
"\n";
1326 print
'saveSelection();'.
"\n";
1328 print
'$(".targetselectchange").focus(function(){'.
"\n";
1329 print
' previousselectedvalueimport = $(this).val();'.
"\n";
1330 print
' previousselectedlabelimport = $(this).children("option:selected").text();'.
"\n";
1331 print
' console.log("previousselectedvalueimport="+previousselectedvalueimport)'.
"\n";
1338 print
'function setOptionsToDisabled() {'.
"\n";
1339 print
' console.log("Remove the disabled flag everywhere");'.
"\n";
1340 print
' $("select.targetselectchange").not($( this )).find(\'option\').prop("disabled", false);'.
"\n";
1341 print
' arrayofselectedvalues = [];'.
"\n";
1343 print
' $("select.targetselectchange").each(function(){'.
"\n";
1344 print
' id = $(this).attr(\'id\')'.
"\n";
1345 print
' value = $(this).val()'.
"\n";
1346 print
' console.log("a selected value has been found for component "+id+" = "+value);'.
"\n";
1347 print
' arrayofselectedvalues.push(value);'.
"\n";
1350 print
' console.log("List of all selected values arrayofselectedvalues");'.
"\n";
1351 print
' console.log(arrayofselectedvalues);'.
"\n";
1352 print
' console.log("Set the option to disabled for every entry that is currently selected somewhere else (so into arrayofselectedvalues)");'.
"\n";
1354 print
' $.each(arrayofselectedvalues, function(key, value) {'.
"\n";
1355 print
' if (value != -1) {'.
"\n";
1356 print
' console.log("Process key="+key+" value="+value+" to disable.");'.
"\n";
1357 print
' $("select.targetselectchange").find(\'option[value="\'+value+\'"]:not(:selected)\').prop("disabled", true);'.
"\n";
1363 print
'function saveSelection() {'.
"\n";
1365 print
' arrayselectedfields = [];'.
"\n";
1366 print
' arrayselectedfields.push(0);'.
"\n";
1368 print
' $.each( arrayofselectedvalues, function( key, value ) {'.
"\n";
1369 print
' if (value != -1) {'.
"\n";
1370 print
' arrayselectedfields.push(value);'.
"\n";
1371 print
' } else {'.
"\n";
1372 print
' arrayselectedfields.push(0);'.
"\n";
1376 print
" $.ajax({\n";
1377 print
" type: 'POST',\n";
1378 print
" dataType: 'json',\n";
1379 print
" url: '".dol_escape_js($_SERVER[
"PHP_SELF"]).
"?action=saveselectorder&token=".
newToken().
"',\n";
1380 print
" data: 'selectorder='+arrayselectedfields.toString(),\n";
1381 print
" success: function(){\n";
1382 print
" console.log('The selected fields have been saved into '+arrayselectedfields.toString());\n";
1387 print
' console.log("arrayselectedfields");';
1388 print
' console.log(arrayselectedfields);';
1389 print
' console.log("arrayoftargetmandatoryfields");';
1390 print
' console.log(arrayoftargetmandatoryfields);';
1391 print
" listtoshow = '';";
1392 print
" nbelement = arrayoftargetmandatoryfields.length
1393 for (let i = 0; i < nbelement; i++) {
1394 if (arrayoftargetmandatoryfields[i] && ! arrayselectedfields.includes(arrayoftargetmandatoryfields[i])) {
1395 console.log(arrayoftargetmandatoryfields[i]+' not mapped');
1396 listtoshow = listtoshow + (listtoshow ? ', ' : '') + '<b>' + arrayoftargetfields[i] + '*</b>';
1399 console.log(listtoshow);
1401 listtoshow = '".dol_escape_js(
img_warning($langs->trans(
"MandatoryTargetFieldsNotMapped")).
' '.$langs->trans(
"MandatoryTargetFieldsNotMapped")).
": ' + listtoshow;
1402 $('#div-mandatory-target-fields-not-mapped').html(listtoshow);
1404 $('#div-mandatory-target-fields-not-mapped').html('<span class=\"opacitymedium\">".
dol_escape_js($langs->trans(
"AllTargetMandatoryFieldsAreMapped")).
"</span>');
1411 print
'$(".targetselectchange").change(function(){'.
"\n";
1412 print
' setOptionsToDisabled();'.
"\n";
1414 print
' if(previousselectedlabelimport != "" && previousselectedvalueimport != -1) {'.
"\n";
1415 print
' let valuetochange = $(this).val(); '.
"\n";
1416 print
' $(".boxtdunused").each(function(){'.
"\n";
1417 print
' if ($(this).text().includes(valuetochange)){'.
"\n";
1418 print
' arraychild = $(this)[0].childNodes'.
"\n";
1419 print
' arraytexttomodify = arraychild[0].textContent.split(" ")'.
"\n";
1420 print
' arraytexttomodify[1] = previousselectedvalueimport '.
"\n";
1421 print
' textmodified = arraytexttomodify.join(" ") '.
"\n";
1422 print
' arraychild[0].textContent = textmodified'.
"\n";
1423 print
' arraychild[1].innerHTML = previousselectedlabelimport'.
"\n";
1427 print
' $(this).blur()'.
"\n";
1429 print
' saveSelection()'.
"\n";
1433 print
'</script>'.
"\n";
1439 print
'<div class="tabsAction">';
1441 if (count($array_match_file_to_database)) {
1442 if ($mandatoryfieldshavesource) {
1443 print
'<a class="butAction saveorderselect" href="import.php?step=5'.$param.
'&filetoimport='.urlencode($filetoimport).
'">'.$langs->trans(
"NextStep").
'</a>';
1445 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"SomeMandatoryFieldHaveNoSource")).
'">'.$langs->trans(
"NextStep").
'</a>';
1453 if (count($array_match_file_to_database)) {
1455 print
'<!-- Area to add new import profile -->'.
"\n";
1456 print
'<div class="marginbottomonly"><span class="opacitymedium">'.$langs->trans(
"SaveImportModel").
'</span></div>';
1458 print
'<form class="nocellnopadd" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1459 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1460 print
'<input type="hidden" name="action" value="add_import_model">';
1461 print
'<input type="hidden" name="step" value="'.$step.
'">';
1462 print
'<input type="hidden" name="format" value="'.$format.
'">';
1463 print
'<input type="hidden" name="datatoimport" value="'.$datatoimport.
'">';
1464 print
'<input type="hidden" name="filetoimport" value="'.$filetoimport.
'">';
1465 print
'<input type="hidden" name="hexa" value="'.$hexa.
'">';
1466 print
'<input type="hidden" name="excludefirstline" value="'.$excludefirstline.
'">';
1467 print
'<input type="hidden" name="endatlinenb" value="'.$endatlinenb.
'">';
1468 print
'<input type="hidden" name="page_y" value="">';
1469 print
'<input type="hidden" value="'.dol_escape_htmltag($separator).
'" name="separator">';
1470 print
'<input type="hidden" value="'.dol_escape_htmltag($enclosure).
'" name="enclosure">';
1472 print
'<div class="div-table-responsive-no-min">';
1473 print
'<table summary="selectofimportprofil" class="noborder centpercent">';
1474 print
'<tr class="liste_titre">';
1475 print
'<td>'.$langs->trans(
"ImportModelName").
'</td>';
1476 print
'<td>'.$langs->trans(
"Visibility").
'</td>';
1480 $nameofimportprofile = str_replace(
' ',
'-', $langs->trans(
"ImportProfile").
' '.$titleofmodule.
' '.
dol_print_date(
dol_now(
'gmt'),
'dayxcard'));
1482 $nameofimportprofile = $import_name;
1485 print
'<tr class="oddeven">';
1486 print
'<td><input name="import_name" class="minwidth300" value="'.$nameofimportprofile.
'"></td>';
1488 $arrayvisibility = array(
'private' => $langs->trans(
"Private"),
'all' => $langs->trans(
"Everybody"));
1489 print $form->selectarray(
'visibility', $arrayvisibility,
'private');
1491 print
'<td class="right">';
1492 print
'<input type="submit" class="button smallpaddingimp reposition" value="'.$langs->trans(
"SaveImportProfile").
'">';
1496 $sql =
"SELECT rowid, label, fk_user, entity";
1497 $sql .=
" FROM ".MAIN_DB_PREFIX.
"import_model";
1498 $sql .=
" WHERE type = '".$db->escape($datatoimport).
"'";
1500 $sql .=
" AND fk_user IN (0, ".((int) $user->id).
")";
1502 $sql .=
" ORDER BY rowid";
1504 $resql = $db->query($sql);
1506 $num = $db->num_rows($resql);
1508 $tmpuser =
new User($db);
1512 $obj = $db->fetch_object($resql);
1514 print
'<tr class="oddeven"><td>';
1517 print
'<td class="tdoverflowmax150">';
1518 if (empty($obj->fk_user)) {
1519 print $langs->trans(
"Everybody");
1521 $tmpuser->fetch($obj->fk_user);
1522 print $tmpuser->getNomUrl(-1);
1525 print
'<td class="right">';
1526 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?step='.$step.$param.
'&action=deleteprof&token='.
newToken().
'&id='.$obj->rowid.
'&filetoimport='.urlencode($filetoimport).
'">';
1544if ($step == 5 && $datatoimport) {
1545 $max_execution_time_for_importexport =
getDolGlobalInt(
'IMPORT_MAX_EXECUTION_TIME', 300);
1546 $max_time = @ini_get(
"max_execution_time");
1547 if ($max_time && $max_time < $max_execution_time_for_importexport) {
1548 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.");
1549 @ini_set(
"max_execution_time", $max_execution_time_for_importexport);
1553 $list = $objmodelimport->listOfAvailableImportFormat($db);
1556 $dir = DOL_DOCUMENT_ROOT.
"/core/modules/import/";
1557 $file =
"import_".$model.
".modules.php";
1558 $classname =
"Import".ucfirst($model);
1559 require_once $dir.$file;
1560 $obj =
new $classname($db, $datatoimport);
1561 if ($model ==
'csv') {
1562 $obj->separator = $separator_used;
1563 $obj->enclosure = $enclosure;
1567 $fieldssource = array();
1568 $result = $obj->import_open_file($conf->import->dir_temp.
'/'.$filetoimport, $langs);
1572 $arrayrecord = $obj->import_read_record();
1575 foreach ($arrayrecord as $key => $val) {
1576 $fieldssource[$i][
'example1'] =
dol_trunc($val[
'val'], 24);
1579 $obj->import_close_file();
1582 $nboflines = $obj->import_get_nb_of_lines($conf->import->dir_temp.
'/'.$filetoimport);
1584 $param =
'&leftmenu=import&format='.urlencode($format).
'&datatoimport='.urlencode($datatoimport).
'&filetoimport='.urlencode($filetoimport).
'&nboflines='.((int) $nboflines).
'&separator='.urlencode($separator).
'&enclosure='.urlencode($enclosure);
1586 if ($excludefirstline) {
1587 $param .=
'&excludefirstline='.urlencode($excludefirstline);
1590 $param .=
'&endatlinenb='.urlencode($endatlinenb);
1592 if (!empty($updatekeys)) {
1593 $param .=
'&updatekeys[]='.implode(
'&updatekeys[]=', $updatekeys);
1596 llxHeader(
'', $langs->trans(
"NewImport"), $help_url);
1601 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'?'.$param2.
'" method="POST">';
1602 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1603 print
'<input type="hidden" name="step" value="5">';
1604 print
'<input type="hidden" name="action" value="launchsimu">';
1608 print
'<div class="underbanner clearboth"></div>';
1609 print
'<div class="fichecenter">';
1611 print
'<table width="100%" class="border tableforfield">';
1614 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Module").
'</td>';
1616 $titleofmodule = $objimport->array_import_module[0][
'module']->getName();
1618 if (in_array($objimport->array_import_code[0], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
1619 $titleofmodule = $langs->trans(
"ProductOrService");
1621 print $titleofmodule;
1625 print
'<tr><td>'.$langs->trans(
"DatasetToImport").
'</td>';
1627 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[0]);
1628 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
1629 print
img_object($objimport->array_import_module[0][
'module']->getName(), $entityicon).
' ';
1630 print $objimport->array_import_label[0];
1636 print
load_fiche_titre($langs->trans(
"InformationOnSourceFile"),
'',
'file-export');
1638 print
'<div class="underbanner clearboth"></div>';
1639 print
'<div class="fichecenter">';
1640 print
'<table width="100%" class="border tableforfield">';
1643 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"SourceFileFormat").
'</td>';
1645 $text = $objmodelimport->getDriverDescForKey($format);
1647 print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text);
1651 if ($model ==
'csv') {
1652 print
'<tr><td>'.$langs->trans(
"CsvOptions").
'</td>';
1655 print
' '.$langs->trans(
"Enclosure").
' : '.
dol_escape_htmltag($enclosure);
1660 print
'<tr><td>'.$langs->trans(
"FileToImport").
'</td>';
1662 $modulepart =
'import';
1663 $relativepath =
GETPOST(
'filetoimport');
1664 print
'<a data-ajax="false" href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&file='.urlencode($relativepath).
'&step=4'.$param.
'" target="_blank" rel="noopener noreferrer">';
1665 print
img_mime($file,
'',
'pictofixedwidth');
1666 print $filetoimport;
1667 print
img_picto($langs->trans(
"Download"),
'download',
'class="paddingleft opacitymedium"');
1673 print $langs->trans(
"NbOfSourceLines");
1680 print $langs->trans(
"ImportFromToLine");
1682 if ($action ==
'launchsimu') {
1683 print
'<input type="number" class="maxwidth50 right" name="excludefirstlinebis" disabled="disabled" value="'.$excludefirstline.
'">';
1684 print
'<input type="hidden" name="excludefirstline" value="'.$excludefirstline.
'">';
1686 print
'<input type="number" class="maxwidth50 right" name="excludefirstline" value="'.$excludefirstline.
'">';
1687 print $form->textwithpicto(
"", $langs->trans(
"SetThisValueTo2ToExcludeFirstLine"));
1690 if ($action ==
'launchsimu') {
1691 print
'<input type="text" class="maxwidth50" name="endatlinenbbis" disabled="disabled" value="'.$endatlinenb.
'">';
1692 print
'<input type="hidden" name="endatlinenb" value="'.$endatlinenb.
'">';
1694 print
'<input type="text" class="maxwidth50" name="endatlinenb" value="'.$endatlinenb.
'">';
1695 print $form->textwithpicto(
"", $langs->trans(
"KeepEmptyToGoToEndOfFile"));
1697 if ($action ==
'launchsimu') {
1698 print
' <a href="'.$_SERVER[
"PHP_SELF"].
'?step=5'.$param.
'">'.$langs->trans(
"Modify").
'</a>';
1700 if ($excludefirstline == 2) {
1701 print $form->textwithpicto(
"", $langs->trans(
"WarningFirstImportedLine", $excludefirstline), 1,
'warning',
"warningexcludefirstline");
1703 $( document ).ready(function() {
1704 $("input[name=\'excludefirstline\']").on("change",function(){
1705 if($(this).val() <= 1){
1706 $(".warningexcludefirstline").hide();
1708 $(".warningexcludefirstline").show();
1718 print $form->textwithpicto($langs->trans(
"KeysToUseForUpdates"), $langs->trans(
"SelectPrimaryColumnsForUpdateAttempt"));
1720 if ($action ==
'launchsimu') {
1721 if (count($updatekeys)) {
1722 print $form->multiselectarray(
'updatekeysbis', $objimport->array_import_updatekeys[0], $updatekeys, 0, 0,
'', 1,
'80%',
'disabled');
1724 print
'<span class="opacitymedium">'.$langs->trans(
"NoUpdateAttempt").
'</span> -';
1726 foreach ($updatekeys as $val) {
1727 print
'<input type="hidden" name="updatekeys[]" value="'.$val.
'">';
1729 print
' <a href="'.$_SERVER[
"PHP_SELF"].
'?step=5'.$param.
'">'.$langs->trans(
"Modify").
'</a>';
1731 if (is_array($objimport->array_import_updatekeys[0]) && count($objimport->array_import_updatekeys[0])) {
1732 print $form->multiselectarray(
'updatekeys', $objimport->array_import_updatekeys[0], $updatekeys, 0, 0,
'', 1,
'80%');
1735 print
'<span class="opacitymedium">'.$langs->trans(
"UpdateNotYetSupportedForThisImport").
'</span>';
1747 print
load_fiche_titre($langs->trans(
"InformationOnTargetTables"),
'',
'file-import');
1749 print
'<div class="underbanner clearboth"></div>';
1750 print
'<div class="fichecenter">';
1752 print
'<table width="100%" class="border tableforfield">';
1755 print
'<tr><td class="titlefieldcreate">';
1756 print $langs->trans(
"TablesTarget");
1758 $listtables = array();
1759 $sort_array_match_file_to_database = $array_match_file_to_database;
1760 foreach ($array_match_file_to_database as $code => $label) {
1762 if ($code > count($fieldssource)) {
1766 $alias = preg_replace(
'/(\..*)$/i',
'', $label);
1767 $listtables[$alias] = $objimport->array_import_tables[0][$alias];
1769 if (count($listtables)) {
1772 foreach ($listtables as $val) {
1791 print $langs->trans(
"Error");
1797 print $langs->trans(
"FieldsTarget").
'</td><td>';
1798 $listfields = array();
1801 $sort_array_match_file_to_database = $array_match_file_to_database;
1802 ksort($sort_array_match_file_to_database);
1804 foreach ($sort_array_match_file_to_database as $code => $label) {
1807 if ($code > count($fieldssource)) {
1811 $alias = preg_replace(
'/(\..*)$/i',
'', $label);
1812 $listfields[$i] =
'<span class="nowrap">'.$langs->trans(
"Column").
' '.
num2Alpha($code - 1).
' -> '.$label.
'</span>';
1814 print count($listfields) ? (implode(
', ', $listfields)) : $langs->trans(
"Error");
1823 if ($action !=
'launchsimu') {
1825 print
'<br><span class="opacitymedium">';
1826 print $langs->trans(
"NowClickToTestTheImport", $langs->transnoentitiesnoconv(
"RunSimulateImportFile")).
'</span><br>';
1830 print
'<div class="center">';
1831 if ($user->hasRight(
'import',
'run')) {
1832 print
'<input type="submit" class="butAction" value="'.$langs->trans(
"RunSimulateImportFile").
'">';
1834 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions")).
'">'.$langs->trans(
"RunSimulateImportFile").
'</a>';
1839 $arrayoferrors = array();
1840 $arrayofwarnings = array();
1841 $maxnboferrors = !
getDolGlobalString(
'IMPORT_MAX_NB_OF_ERRORS') ? 50 : $conf->global->IMPORT_MAX_NB_OF_ERRORS;
1842 $maxnbofwarnings = !
getDolGlobalString(
'IMPORT_MAX_NB_OF_WARNINGS') ? 50 : $conf->global->IMPORT_MAX_NB_OF_WARNINGS;
1854 $pathfile = $conf->import->dir_temp.
'/'.$filetoimport;
1855 $result = $obj->import_open_file($pathfile, $langs);
1857 global $tablewithentity_cache;
1858 $tablewithentity_cache = array();
1863 while (($sourcelinenb < $nboflines) && !$endoffile) {
1867 $arrayrecord = $obj->import_read_record();
1868 if ($arrayrecord ===
false) {
1869 $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');
1873 if ($excludefirstline && ($sourcelinenb < $excludefirstline)) {
1876 if ($endatlinenb && ($sourcelinenb > $endatlinenb)) {
1880 $parameters = array(
1882 'datatoimport' => $datatoimport,
1884 'arrayrecord' => $arrayrecord,
1885 'array_match_file_to_database' => $array_match_file_to_database,
1886 'objimport' => $objimport,
1887 'fieldssource' => $fieldssource,
1888 'importid' => $importid,
1889 'updatekeys' => $updatekeys,
1890 'arrayoferrors' => &$arrayoferrors,
1891 'arrayofwarnings' => &$arrayofwarnings,
1895 $reshook = $hookmanager->executeHooks(
'ImportInsert', $parameters);
1897 $arrayoferrors[$sourcelinenb][] = [
1898 'lib' => implode(
"<br>", array_merge([$hookmanager->error], $hookmanager->errors))
1902 if (empty($reshook)) {
1904 $result = $obj->import_insert($arrayrecord, $array_match_file_to_database, $objimport, count($fieldssource), $importid, $updatekeys);
1906 if (count($obj->errors)) {
1907 $arrayoferrors[$sourcelinenb] = $obj->errors;
1909 if (count($obj->warnings)) {
1910 $arrayofwarnings[$sourcelinenb] = $obj->warnings;
1912 if (!count($obj->errors) && !count($obj->warnings)) {
1917 $reshook = $hookmanager->executeHooks(
'AfterImportInsert', $parameters);
1919 $arrayoferrors[$sourcelinenb][] = [
1920 'lib' => implode(
"<br>", array_merge([$hookmanager->error], $hookmanager->errors))
1925 $obj->import_close_file();
1927 print $langs->trans(
"ErrorFailedToOpenFile", $pathfile);
1934 if (!empty($objimport->array_import_run_sql_after[0]) && is_array($objimport->array_import_run_sql_after[0])) {
1936 foreach ($objimport->array_import_run_sql_after[0] as $sqlafterimport) {
1938 $resqlafterimport = $db->query($sqlafterimport);
1939 if (!$resqlafterimport) {
1940 $arrayoferrors[
'none'][] = array(
'lib' => $langs->trans(
"Error running final request: ".$sqlafterimport));
1949 if (!count($arrayoferrors) && !count($arrayofwarnings)) {
1951 print
'<div class="info">';
1952 print
'<div class=""><b>'.$langs->trans(
"ResultOfSimulationNoError").
'</b></div>';
1953 print $langs->trans(
"NbInsertSim", empty($obj->nbinsert) ? 0 : $obj->nbinsert).
'<br>';
1954 print $langs->trans(
"NbUpdateSim", empty($obj->nbupdate) ? 0 : $obj->nbupdate).
'<br>';
1959 print
'<div class="warning">';
1960 print $langs->trans(
"NbOfLinesOK", $nbok).
'...<br>';
1967 if (count($arrayoferrors)) {
1968 print
img_error().
' <b>'.$langs->trans(
"ErrorsOnXLines", count($arrayoferrors)).
'</b><br>';
1969 print
'<table width="100%" class="border"><tr><td>';
1970 foreach ($arrayoferrors as $key => $val) {
1972 if ($nboferrors > $maxnboferrors) {
1973 print $langs->trans(
"TooMuchErrors", (count($arrayoferrors) - $nboferrors)).
"<br>";
1977 foreach ($val as $i => $err) {
1978 print
' > '.dol_escape_htmltag($err[
'lib']).
'<br>';
1981 print
'</td></tr></table>';
1987 if (count($arrayofwarnings)) {
1988 print
img_warning().
' <b>'.$langs->trans(
"WarningsOnXLines", count($arrayofwarnings)).
'</b><br>';
1989 print
'<table width="100%" class="border"><tr><td>';
1990 foreach ($arrayofwarnings as $key => $val) {
1992 if ($nbofwarnings > $maxnbofwarnings) {
1993 print $langs->trans(
"TooMuchWarnings", (count($arrayofwarnings) - $nbofwarnings)).
"<br>";
1997 foreach ($val as $i => $err) {
1998 print
' > '.dol_escape_htmltag($err[
'lib']).
'<br>';
2001 print
'</td></tr></table>';
2008 print
'<div class="center">';
2009 print
'<span class="opacitymedium">'.$langs->trans(
"NowClickToRunTheImport", $langs->transnoentitiesnoconv(
"RunImportFile")).
'</span><br>';
2018 print
'<div class="center">';
2019 if ($user->hasRight(
'import',
'run')) {
2020 if (empty($nboferrors)) {
2021 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/imports/import.php?leftmenu=import&step=6&importid='.$importid.$param.
'">'.$langs->trans(
"RunImportFile").
'</a>';
2025 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"CorrectErrorBeforeRunningImport")).
'">'.$langs->trans(
"RunImportFile").
'</a>';
2028 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions")).
'">'.$langs->trans(
"RunSimulateImportFile").
'</a>';
2030 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions")).
'">'.$langs->trans(
"RunImportFile").
'</a>';
2040if ($step == 6 && $datatoimport) {
2041 $max_execution_time_for_importexport =
getDolGlobalInt(
'IMPORT_MAX_EXECUTION_TIME', 300);
2042 $max_time = @ini_get(
"max_execution_time");
2043 if ($max_time && $max_time < $max_execution_time_for_importexport) {
2044 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.");
2045 @ini_set(
"max_execution_time", $max_execution_time_for_importexport);
2049 $list = $objmodelimport->listOfAvailableImportFormat($db);
2050 $importid =
GETPOST(
"importid",
'alphanohtml');
2054 $dir = DOL_DOCUMENT_ROOT.
"/core/modules/import/";
2055 $file =
"import_".$model.
".modules.php";
2056 $classname =
"Import".ucfirst($model);
2057 require_once $dir.$file;
2058 $obj =
new $classname($db, $datatoimport);
2059 if ($model ==
'csv') {
2060 $obj->separator = $separator_used;
2061 $obj->enclosure = $enclosure;
2065 $fieldssource = array();
2066 $result = $obj->import_open_file($conf->import->dir_temp.
'/'.$filetoimport, $langs);
2069 $arrayrecord = $obj->import_read_record();
2072 foreach ($arrayrecord as $key => $val) {
2073 $fieldssource[$i][
'example1'] =
dol_trunc($val[
'val'], 24);
2076 $obj->import_close_file();
2081 $param =
'&format='.$format.
'&datatoimport='.urlencode($datatoimport).
'&filetoimport='.urlencode($filetoimport).
'&nboflines='.((int) $nboflines);
2082 if ($excludefirstline) {
2083 $param .=
'&excludefirstline='.urlencode($excludefirstline);
2086 $param .=
'&endatlinenb='.urlencode($endatlinenb);
2089 $param .=
'&separator='.urlencode($separator);
2092 $param .=
'&enclosure='.urlencode($enclosure);
2095 llxHeader(
'', $langs->trans(
"NewImport"), $help_url);
2101 print
'<div class="underbanner clearboth"></div>';
2102 print
'<div class="fichecenter">';
2104 print
'<table width="100%" class="border">';
2107 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Module").
'</td>';
2109 $titleofmodule = $objimport->array_import_module[0][
'module']->getName();
2111 if (in_array($objimport->array_import_code[0], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
2112 $titleofmodule = $langs->trans(
"ProductOrService");
2114 print $titleofmodule;
2118 print
'<tr><td>'.$langs->trans(
"DatasetToImport").
'</td>';
2120 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[0]);
2121 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
2122 print
img_object($objimport->array_import_module[0][
'module']->getName(), $entityicon).
' ';
2123 print $objimport->array_import_label[0];
2129 print
load_fiche_titre($langs->trans(
"InformationOnSourceFile"),
'',
'file-export');
2131 print
'<div class="underbanner clearboth"></div>';
2132 print
'<div class="fichecenter">';
2133 print
'<table width="100%" class="border">';
2136 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"SourceFileFormat").
'</td>';
2138 $text = $objmodelimport->getDriverDescForKey($format);
2140 print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text);
2144 if ($model ==
'csv') {
2145 print
'<tr><td>'.$langs->trans(
"CsvOptions").
'</td>';
2147 print $langs->trans(
"Separator").
' : ';
2148 print htmlentities($separator);
2149 print
' '.$langs->trans(
"Enclosure").
' : ';
2150 print htmlentities($enclosure);
2155 print
'<tr><td>'.$langs->trans(
"FileToImport").
'</td>';
2157 $modulepart =
'import';
2158 $relativepath =
GETPOST(
'filetoimport');
2159 print
'<a data-ajax="false" href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&file='.urlencode($relativepath).
'&step=4'.$param.
'" target="_blank" rel="noopener noreferrer">';
2160 print
img_mime($file,
'',
'pictofixedwidth');
2161 print $filetoimport;
2167 print $langs->trans(
"NbOfSourceLines");
2174 print $langs->trans(
"ImportFromLine");
2176 print
'<input type="text" size="4" name="excludefirstline" disabled="disabled" value="'.$excludefirstline.
'">';
2181 print $langs->trans(
"EndAtLineNb");
2183 print
'<input type="text" size="4" name="endatlinenb" disabled="disabled" value="'.$endatlinenb.
'">';
2191 print
'<b>'.$langs->trans(
"InformationOnTargetTables").
'</b>';
2192 print
'<div class="underbanner clearboth"></div>';
2193 print
'<div class="fichecenter">';
2194 print
'<table class="border centpercent">';
2197 print
'<tr><td width="25%">';
2198 print $langs->trans(
"TablesTarget");
2200 $listtables = array();
2201 foreach ($array_match_file_to_database as $code => $label) {
2203 if ($code > count($fieldssource)) {
2207 $alias = preg_replace(
'/(\..*)$/i',
'', $label);
2208 $listtables[$alias] = $objimport->array_import_tables[0][$alias];
2210 if (count($listtables)) {
2212 foreach ($listtables as $val) {
2231 print $langs->trans(
"Error");
2237 print $langs->trans(
"FieldsTarget").
'</td><td>';
2238 $listfields = array();
2240 $sort_array_match_file_to_database = $array_match_file_to_database;
2241 ksort($sort_array_match_file_to_database);
2243 foreach ($sort_array_match_file_to_database as $code => $label) {
2246 if ($code > count($fieldssource)) {
2250 $alias = preg_replace(
'/(\..*)$/i',
'', $label);
2251 $listfields[$i] = $langs->trans(
"Field").
' '.$code.
'->'.$label;
2253 print count($listfields) ? (implode(
', ', $listfields)) : $langs->trans(
"Error");
2260 $arrayoferrors = array();
2261 $arrayofwarnings = array();
2262 $maxnboferrors = !
getDolGlobalString(
'IMPORT_MAX_NB_OF_ERRORS') ? 50 : $conf->global->IMPORT_MAX_NB_OF_ERRORS;
2263 $maxnbofwarnings = !
getDolGlobalString(
'IMPORT_MAX_NB_OF_WARNINGS') ? 50 : $conf->global->IMPORT_MAX_NB_OF_WARNINGS;
2275 $pathfile = $conf->import->dir_temp.
'/'.$filetoimport;
2276 $result = $obj->import_open_file($pathfile, $langs);
2278 global $tablewithentity_cache;
2279 $tablewithentity_cache = array();
2283 while ($sourcelinenb < $nboflines && !$endoffile) {
2285 $arrayrecord = $obj->import_read_record();
2286 if ($arrayrecord ===
false) {
2287 $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');
2291 if ($excludefirstline && ($sourcelinenb < $excludefirstline)) {
2294 if ($endatlinenb && ($sourcelinenb > $endatlinenb)) {
2298 $parameters = array(
2300 'datatoimport' => $datatoimport,
2302 'arrayrecord' => $arrayrecord,
2303 'array_match_file_to_database' => $array_match_file_to_database,
2304 'objimport' => $objimport,
2305 'fieldssource' => $fieldssource,
2306 'importid' => $importid,
2307 'updatekeys' => $updatekeys,
2308 'arrayoferrors' => &$arrayoferrors,
2309 'arrayofwarnings' => &$arrayofwarnings,
2313 $reshook = $hookmanager->executeHooks(
'ImportInsert', $parameters);
2315 $arrayoferrors[$sourcelinenb][] = [
2316 'lib' => implode(
"<br>", array_merge([$hookmanager->error], $hookmanager->errors))
2320 if (empty($reshook)) {
2322 $result = $obj->import_insert($arrayrecord, $array_match_file_to_database, $objimport, count($fieldssource), $importid, $updatekeys);
2324 if (count($obj->errors)) {
2325 $arrayoferrors[$sourcelinenb] = $obj->errors;
2327 if (count($obj->warnings)) {
2328 $arrayofwarnings[$sourcelinenb] = $obj->warnings;
2331 if (!count($obj->errors) && !count($obj->warnings)) {
2336 $reshook = $hookmanager->executeHooks(
'AfterImportInsert', $parameters);
2338 $arrayoferrors[$sourcelinenb][] = [
2339 'lib' => implode(
"<br>", array_merge([$hookmanager->error], $hookmanager->errors))
2344 $obj->import_close_file();
2346 print $langs->trans(
"ErrorFailedToOpenFile", $pathfile);
2349 if (count($arrayoferrors) > 0) {
2356 if (!empty($objimport->array_import_run_sql_after[0]) && is_array($objimport->array_import_run_sql_after[0])) {
2358 foreach ($objimport->array_import_run_sql_after[0] as $sqlafterimport) {
2360 $resqlafterimport = $db->query($sqlafterimport);
2361 if (!$resqlafterimport) {
2362 $arrayoferrors[
'none'][] = array(
'lib' => $langs->trans(
"Error running final request: ".$sqlafterimport));
2380 print
'<div class="info">';
2381 print $langs->trans(
"NbOfLinesImported", $nbok).
'</b><br>';
2382 print $langs->trans(
"NbInsert", empty($obj->nbinsert) ? 0 : $obj->nbinsert).
'<br>';
2383 print $langs->trans(
"NbUpdate", empty($obj->nbupdate) ? 0 : $obj->nbupdate).
'<br>';
2385 print
'<div class="center">';
2386 print $langs->trans(
"FileWasImported", $importid).
'<br>';
2387 print
'<span class="opacitymedium">'.$langs->trans(
"YouCanUseImportIdToFindRecord", $importid).
'</span><br>';
2410 global $conf, $langs;
2414 if ($key ==
'none') {
2416 print
"\n\n<!-- Box_no-key start-->\n";
2417 print
'<div class="box boximport" style="padding:0;">'.
"\n";
2418 print
'<table summary="boxtable_no-key" class="centpercent nobordernopadding">'.
"\n";
2420 print
"\n\n<!-- Box ".$pos.
" start -->\n";
2421 print
'<div class="box boximport" style="padding: 0;" id="boxto_'.$pos.
'">'.
"\n";
2423 print
'<table summary="boxtable'.$pos.
'" class="nobordernopadding centpercent tableimport">'.
"\n";
2426 if (($pos && $pos > count($fieldssource)) && (!isset($fieldssource[$pos][
"imported"]))) {
2436 } elseif ($key ==
'none') {
2437 print
'<tr style="height:'.$height.
'" class="trimport oddevenimport">';
2438 print
'<td class="nocellnopadding" width="16" style="font-weight: normal">';
2441 print
'<td style="font-weight: normal">';
2447 print
'<tr style="height:'.$height.
'" class="trimport oddevenimport">';
2448 print
'<td class="nocellnopadding" width="16" style="font-weight: normal">';
2451 print
img_picto($langs->trans(
"Column").
' '.
num2Alpha($pos - 1),
'file',
'class="pictofixedwith"');
2453 if (isset($fieldssource[$pos][
'imported']) && $fieldssource[$pos][
'imported'] ==
false) {
2454 print
'<td class="nowraponall boxtdunused" style="font-weight: normal">';
2456 print
'<td class="nowraponall tdoverflowmax500" style="font-weight: normal">';
2458 print $langs->trans(
"Column").
' '.
num2Alpha($pos - 1).
' (#'.$pos.
')';
2459 if (empty($fieldssource[$pos][
'example1'])) {
2460 $example = $fieldssource[$pos][
'label'];
2462 $example = $fieldssource[$pos][
'example1'];
2466 $example = mb_convert_encoding($example,
'UTF-8',
'ISO-8859-1');
2470 print
'<i class="opacitymedium">'.dol_escape_htmltag($example).
'</i>';
2479 print
"<!-- Box end -->\n\n";
2492 $i = count($fieldssource) + 1;
2495 foreach ($listofkey as $key => $val) {
2496 $maxkey = max($maxkey, $key);
2499 while ($i <= $maxkey) {
2500 if (empty($listofkey[$i])) {
2522 if ($position == count($array)) {
2523 $ret = $array + $insertArray;
2526 foreach ($array as $key => $value) {
2527 if ($position == $i++) {
2528 $ret += $insertArray;
2531 $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.