27 require_once
'../main.inc.php';
28 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
29 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
30 require_once DOL_DOCUMENT_ROOT.
'/imports/class/import.class.php';
31 require_once DOL_DOCUMENT_ROOT.
'/core/modules/import/modules_import.php';
32 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
33 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
34 require_once DOL_DOCUMENT_ROOT.
'/core/lib/import.lib.php';
37 $langs->loadLangs(array(
'exports',
'compta',
'errors'));
43 $entitytoicon = array(
45 'invoice_line' =>
'bill',
47 'order_line' =>
'order',
49 'propal_line' =>
'propal',
50 'intervention' =>
'intervention',
51 'inter_line' =>
'intervention',
53 'member_type' =>
'group',
54 'subscription' =>
'payment',
55 'payment' =>
'payment',
57 'tax_type' =>
'generic',
59 'account' =>
'account',
60 'product' =>
'product',
61 'virtualproduct'=>
'product',
62 'subproduct' =>
'product',
63 'product_supplier_ref' =>
'product',
65 'warehouse' =>
'stock',
67 'stockbatch' =>
'stock',
68 'category' =>
'category',
69 'shipment' =>
'sending',
70 'shipment_line'=>
'sending',
71 'reception'=>
'sending',
72 'reception_line'=>
'sending',
73 'expensereport'=>
'trip',
74 'expensereport_line'=>
'trip',
75 'holiday' =>
'holiday',
76 'contract_line' =>
'contract',
77 'translation' =>
'generic',
83 $entitytolang = array(
85 'company' =>
'Company',
86 'contact' =>
'Contact',
88 'invoice_line' =>
'InvoiceLine',
90 'order_line' =>
'OrderLine',
91 'propal' =>
'Proposal',
92 'propal_line' =>
'ProposalLine',
93 'intervention' =>
'Intervention',
94 'inter_line' =>
'InterLine',
96 'member_type' =>
'MemberType',
97 'subscription' =>
'Subscription',
98 'tax' =>
'SocialContribution',
99 'tax_type' =>
'DictionarySocialContributions',
100 'account' =>
'BankTransactions',
101 'payment' =>
'Payment',
102 'product' =>
'Product',
103 'virtualproduct' =>
'AssociatedProducts',
104 'subproduct' =>
'SubProduct',
105 'product_supplier_ref' =>
'SupplierPrices',
106 'service' =>
'Service',
108 'movement' =>
'StockMovement',
110 'stockbatch' =>
'StockDetailPerBatch',
111 'warehouse' =>
'Warehouse',
112 'category' =>
'Category',
114 'trip' =>
'TripsAndExpenses',
115 'shipment' =>
'Shipments',
116 'shipment_line'=>
'ShipmentLine',
117 'project' =>
'Projects',
118 'projecttask' =>
'Tasks',
119 'task_time' =>
'TaskTimeSpent',
121 'expensereport'=>
'ExpenseReport',
122 'expensereport_line'=>
'ExpenseReportLine',
123 'holiday' =>
'TitreRequestCP',
124 'contract' =>
'Contract',
125 'contract_line'=>
'ContractLine',
126 'translation' =>
'Translation',
128 'bomline' =>
'BOMLine'
131 $datatoimport =
GETPOST(
'datatoimport');
133 $filetoimport =
GETPOST(
'filetoimport');
134 $action =
GETPOST(
'action',
'alpha');
135 $confirm =
GETPOST(
'confirm',
'alpha');
137 $import_name =
GETPOST(
'import_name');
139 $importmodelid =
GETPOST(
'importmodelid',
'int');
140 $excludefirstline = (
GETPOST(
'excludefirstline') ?
GETPOST(
'excludefirstline') : 2);
141 $endatlinenb = (
GETPOST(
'endatlinenb') ?
GETPOST(
'endatlinenb') :
'');
142 $updatekeys = (
GETPOST(
'updatekeys',
'array') ?
GETPOST(
'updatekeys',
'array') : array());
143 $separator = (
GETPOST(
'separator',
'alphanohtml') ?
GETPOST(
'separator',
'alphanohtml', 3) :
'');
144 $enclosure = (
GETPOST(
'enclosure',
'nohtml') ?
GETPOST(
'enclosure',
'nohtml') :
'"');
145 $separator_used = str_replace(
'\t',
"\t", $separator);
147 $objimport =
new Import($db);
148 $objimport->load_arrays($user, ($step == 1 ?
'' : $datatoimport));
157 if (empty($array_match_file_to_database)) {
158 $serialized_array_match_file_to_database = isset($_SESSION[
"dol_array_match_file_to_database_select"]) ? $_SESSION[
"dol_array_match_file_to_database_select"] :
'';
159 $array_match_file_to_database = array();
160 $fieldsarray = explode(
',', $serialized_array_match_file_to_database);
161 foreach ($fieldsarray as $elem) {
162 $tabelem = explode(
'=', $elem, 2);
164 $val = (isset($tabelem[1]) ? $tabelem[1] :
'');
166 $array_match_file_to_database[$key] = $val;
211 if ($action ==
'deleteprof') {
213 $objimport->fetch(
GETPOST(
"id",
'int'));
214 $result = $objimport->delete($user);
219 if ($action ==
'add_import_model') {
223 foreach ($array_match_file_to_database as $key => $val) {
227 $hexa .= $key.
'='.$val;
230 $objimport->model_name = $import_name;
231 $objimport->datatoimport = $datatoimport;
232 $objimport->hexa = $hexa;
233 $objimport->fk_user = (
GETPOST(
'visibility',
'aZ09') ==
'all' ? 0 : $user->id);
235 $result = $objimport->create($user);
237 setEventMessages($langs->trans(
"ImportModelSaved", $objimport->model_name),
null,
'mesgs');
240 $langs->load(
"errors");
241 if ($objimport->errno ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
242 setEventMessages($langs->trans(
"ErrorImportDuplicateProfil"),
null,
'errors');
248 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"ImportModelName")),
null,
'errors');
252 if ($step == 3 && $datatoimport) {
253 if (
GETPOST(
'sendit') && !empty($conf->global->MAIN_UPLOAD_DOC)) {
257 $fullpath = $conf->import->dir_temp.
"/".$nowyearmonth.
'-'.$_FILES[
'userfile'][
'name'];
259 dol_syslog(
"File ".$fullpath.
" was added for import");
261 $langs->load(
"errors");
267 if ($action ==
'confirm_deletefile' && $confirm ==
'yes') {
268 $langs->load(
"other");
270 $param =
'&datatoimport='.urlencode($datatoimport).
'&format='.urlencode($format);
271 if ($excludefirstline) {
272 $param .=
'&excludefirstline='.urlencode($excludefirstline);
275 $param .=
'&endatlinenb='.urlencode($endatlinenb);
278 $file = $conf->import->dir_temp.
'/'.
GETPOST(
'urlfile');
285 Header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?step='.$step.$param);
290 if ($step == 4 && $action ==
'select_model') {
292 $_SESSION[
"dol_array_match_file_to_database"] =
'';
293 $serialized_array_match_file_to_database =
'';
294 $array_match_file_to_database = array();
298 $result = $objimport->fetch($importmodelid);
300 $serialized_array_match_file_to_database = $objimport->hexa;
301 $fieldsarray = explode(
',', $serialized_array_match_file_to_database);
302 foreach ($fieldsarray as $elem) {
303 $tabelem = explode(
'=', $elem);
307 $array_match_file_to_database[$key] = $val;
310 $_SESSION[
"dol_array_match_file_to_database"] = $serialized_array_match_file_to_database;
311 $_SESSION[
'dol_array_match_file_to_database_select'] = $_SESSION[
"dol_array_match_file_to_database"];
314 if ($action ==
'saveselectorder') {
316 $serialized_array_match_file_to_database =
'';
318 $selectorder = explode(
",",
GETPOST(
'selectorder'));
319 $fieldtarget = $fieldstarget = $objimport->array_import_fields[0];
320 foreach ($selectorder as $key => $code) {
321 $serialized_array_match_file_to_database .= $key.
'='.$code;
322 $serialized_array_match_file_to_database .=
',';
324 $serialized_array_match_file_to_database = substr($serialized_array_match_file_to_database, 0, -1);
325 dol_syslog(
'dol_array_match_file_to_database_select='.$serialized_array_match_file_to_database);
326 $_SESSION[
"dol_array_match_file_to_database_select"] = $serialized_array_match_file_to_database;
338 $help_url =
'EN:Module_Imports_En|FR:Module_Imports|ES:Módulo_Importaciones';
342 if ($step == 1 || !$datatoimport) {
344 $serialized_array_match_file_to_database =
'';
345 $array_match_file_to_database = array();
346 $_SESSION[
"dol_array_match_file_to_database"] =
'';
347 $_SESSION[
"dol_array_match_file_to_database_select"] =
'';
350 if ($excludefirstline) {
351 $param .=
'&excludefirstline='.urlencode($excludefirstline);
354 $param .=
'&endatlinenb='.urlencode($endatlinenb);
357 $param .=
'&separator='.urlencode($separator);
360 $param .=
'&enclosure='.urlencode($enclosure);
369 print
'<div class="opacitymedium">'.$langs->trans(
"SelectImportDataSet").
'</div><br>';
372 print
'<div class="div-table-responsive-no-min">';
373 print
'<table class="noborder centpercent">';
374 print
'<tr class="liste_titre">';
375 print
'<td>'.$langs->trans(
"Module").
'</td>';
376 print
'<td>'.$langs->trans(
"ImportableDatas").
'</td>';
377 print
'<td> </td>';
380 if (count($objimport->array_import_module)) {
381 $sortedarrayofmodules =
dol_sort_array($objimport->array_import_module,
'position_of_profile',
'asc', 0, 0, 1);
382 foreach ($sortedarrayofmodules as $key => $value) {
384 print
'<tr class="oddeven"><td>';
385 $titleofmodule = $objimport->array_import_module[$key][
'module']->getName();
387 if (in_array($objimport->array_import_code[$key], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
388 $titleofmodule = $langs->trans(
"ProductOrService");
390 print $titleofmodule;
392 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[$key]);
393 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
394 print
img_object($objimport->array_import_module[$key][
'module']->getName(), $entityicon).
' ';
395 print $objimport->array_import_label[$key];
396 print
'</td><td style="text-align: right">';
397 if ($objimport->array_import_perms[$key]) {
398 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>';
400 print $langs->trans(
"NotEnoughPermissions");
405 print
'<tr><td class="oddeven" colspan="3">'.$langs->trans(
"NoImportableData").
'</td></tr>';
415 if ($step == 2 && $datatoimport) {
416 $param =
'&datatoimport='.urlencode($datatoimport);
417 if ($excludefirstline) {
418 $param .=
'&excludefirstline='.urlencode($excludefirstline);
421 $param .=
'&endatlinenb='.urlencode($endatlinenb);
424 $param .=
'&separator='.urlencode($separator);
427 $param .=
'&enclosure='.urlencode($enclosure);
436 print
'<div class="underbanner clearboth"></div>';
437 print
'<div class="fichecenter">';
439 print
'<table class="border tableforfield centpercent">';
442 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Module").
'</td>';
444 $titleofmodule = $objimport->array_import_module[0][
'module']->getName();
446 if (in_array($objimport->array_import_code[0], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
447 $titleofmodule = $langs->trans(
"ProductOrService");
449 print $titleofmodule;
453 print
'<tr><td>'.$langs->trans(
"DatasetToImport").
'</td>';
455 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[0]);
456 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
457 print
img_object($objimport->array_import_module[0][
'module']->getName(), $entityicon).
' ';
458 print $objimport->array_import_label[0];
466 print
'<form name="userfile" action="'.$_SERVER[
"PHP_SELF"].
'" enctype="multipart/form-data" METHOD="POST">';
467 print
'<input type="hidden" name="token" value="'.newToken().
'">';
471 print
'<span class="opacitymedium">';
472 $s = $langs->trans(
"ChooseFormatOfFileToImport",
'{s1}');
473 $s = str_replace(
'{s1}',
img_picto(
'',
'next'), $s);
475 print
'</span><br><br>';
479 print
'<div class="div-table-responsive-no-min">';
480 print
'<table class="noborder centpercent" cellpadding="4">';
485 print
'<tr class="liste_titre"><td colspan="5">';
486 print $langs->trans(
"FileMustHaveOneOfFollowingFormat");
488 $list = $objmodelimport->listOfAvailableImportFormat($db);
489 foreach ($list as $key) {
490 print
'<tr class="oddeven">';
491 print
'<td width="16">'.img_picto_common($key, $objmodelimport->getPictoForKey($key)).
'</td>';
492 $text = $objmodelimport->getDriverDescForKey($key);
493 print
'<td>'.$form->textwithpicto($objmodelimport->getDriverLabelForKey($key), $text).
'</td>';
494 print
'<td style="text-align:center">';
495 $filename = $langs->trans(
"ExampleOfImportFile").
'_'.$datatoimport.
'.'.$key;
496 print
'<a href="'.DOL_URL_ROOT.
'/imports/emptyexample.php?format='.$key.$param.
'&output=file&file='.urlencode($filename).
'" target="_blank" rel="noopener noreferrer">';
497 print
img_picto(
'',
'download',
'class="paddingright opacitymedium"');
498 print $langs->trans(
"DownloadEmptyExampleShort");
500 print
$form->textwithpicto(
'', $langs->trans(
"DownloadEmptyExample").
'.<br>'.$langs->trans(
"StarAreMandatory"));
503 print
'<td style="text-align:right">';
504 print
'<a href="'.DOL_URL_ROOT.
'/imports/import.php?step=3&format='.$key.$param.
'">'.
img_picto($langs->trans(
"SelectFormat"),
'next',
'class="fa-15"').
'</a>';
517 if ($step == 3 && $datatoimport) {
518 $param =
'&datatoimport='.urlencode($datatoimport).
'&format='.urlencode($format);
519 if ($excludefirstline) {
520 $param .=
'&excludefirstline='.urlencode($excludefirstline);
523 $param .=
'&endatlinenb='.urlencode($endatlinenb);
526 $param .=
'&separator='.urlencode($separator);
529 $param .=
'&enclosure='.urlencode($enclosure);
532 $list = $objmodelimport->listOfAvailableImportFormat($db);
543 if ($action ==
'delete') {
544 print
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?urlfile='.urlencode(
GETPOST(
'urlfile')).
'&step=3'.$param, $langs->trans(
'DeleteFile'), $langs->trans(
'ConfirmDeleteFile'),
'confirm_deletefile',
'', 0, 1);
547 print
'<div class="underbanner clearboth"></div>';
548 print
'<div class="fichecenter">';
550 print
'<table class="border tableforfield centpercent">';
553 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Module").
'</td>';
555 $titleofmodule = $objimport->array_import_module[0][
'module']->getName();
557 if (in_array($objimport->array_import_code[0], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
558 $titleofmodule = $langs->trans(
"ProductOrService");
560 print $titleofmodule;
564 print
'<tr><td>'.$langs->trans(
"DatasetToImport").
'</td>';
566 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[0]);
567 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
568 print
img_object($objimport->array_import_module[0][
'module']->getName(), $entityicon).
' ';
569 print $objimport->array_import_label[0];
575 print
load_fiche_titre($langs->trans(
"InformationOnSourceFile"),
'',
'file-export');
577 print
'<div class="underbanner clearboth"></div>';
578 print
'<div class="fichecenter">';
579 print
'<table width="100%" class="border tableforfield">';
582 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"SourceFileFormat").
'</td>';
583 print
'<td class="nowraponall">';
584 $text = $objmodelimport->getDriverDescForKey($format);
585 print
$form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text);
586 print
'</td><td style="text-align:right" class="nowrap">';
587 $filename = $langs->trans(
"ExampleOfImportFile").
'_'.$datatoimport.
'.'.$format;
588 print
'<a href="'.DOL_URL_ROOT.
'/imports/emptyexample.php?format='.$format.$param.
'&output=file&file='.urlencode($filename).
'" target="_blank" rel="noopener noreferrer">';
589 print
img_picto(
'',
'download',
'class="paddingright opacitymedium"');
590 print $langs->trans(
"DownloadEmptyExampleShort");
592 print
$form->textwithpicto(
'', $langs->trans(
"DownloadEmptyExample").
'.<br>'.$langs->trans(
"StarAreMandatory"));
601 if ($format ==
'xlsx' && !class_exists(
'XMLWriter')) {
602 $langs->load(
"install");
603 print
info_admin($langs->trans(
"ErrorPHPDoesNotSupport",
'php-xml'), 0, 0, 1,
'error');
609 print
'<form name="userfile" action="'.$_SERVER[
"PHP_SELF"].
'" enctype="multipart/form-data" method="POST">';
610 print
'<input type="hidden" name="token" value="'.newToken().
'">';
611 print
'<input type="hidden" value="'.$step.
'" name="step">';
612 print
'<input type="hidden" value="'.dol_escape_htmltag($format).
'" name="format">';
613 print
'<input type="hidden" value="'.$excludefirstline.
'" name="excludefirstline">';
614 print
'<input type="hidden" value="'.$endatlinenb.
'" name="endatlinenb">';
615 print
'<input type="hidden" value="'.dol_escape_htmltag($separator).
'" name="separator">';
616 print
'<input type="hidden" value="'.dol_escape_htmltag($enclosure).
'" name="enclosure">';
617 print
'<input type="hidden" value="'.dol_escape_htmltag($datatoimport).
'" name="datatoimport">';
619 print
'<span class="opacitymedium">';
620 $s = $langs->trans(
"ChooseFileToImport",
'{s1}');
621 $s = str_replace(
'{s1}',
img_picto(
'',
'next'), $s);
623 print
'</span><br><br>';
628 print
'<div class="marginbottomonly">';
630 $maxmin = $maxfilesizearray[
'maxmin'];
632 print
'<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).
'">';
634 print
'<input type="file" name="userfile" size="20" maxlength="80"> ';
635 $out = (empty($conf->global->MAIN_UPLOAD_DOC) ?
' disabled' :
'');
636 print
'<input type="submit" class="button small" value="'.$langs->trans(
"AddFile").
'"'.$out.
' name="sendit">';
638 if (!empty($conf->global->MAIN_UPLOAD_DOC)) {
639 $max = $conf->global->MAIN_UPLOAD_DOC;
640 $maxphp = @ini_get(
'upload_max_filesize');
641 if (preg_match(
'/k$/i', $maxphp)) {
642 $maxphp = (int) substr($maxphp, 0, -1);
644 if (preg_match(
'/m$/i', $maxphp)) {
645 $maxphp = (int) substr($maxphp, 0, -1) * 1024;
647 if (preg_match(
'/g$/i', $maxphp)) {
648 $maxphp = (int) substr($maxphp, 0, -1) * 1024 * 1024;
650 if (preg_match(
'/t$/i', $maxphp)) {
651 $maxphp = (int) substr($maxphp, 0, -1) * 1024 * 1024 * 1024;
653 $maxphp2 = @ini_get(
'post_max_size');
654 if (preg_match(
'/k$/i', $maxphp2)) {
655 $maxphp2 = (int) substr($maxphp2, 0, -1);
657 if (preg_match(
'/m$/i', $maxphp2)) {
658 $maxphp2 = (int) substr($maxphp2, 0, -1) * 1024;
660 if (preg_match(
'/g$/i', $maxphp2)) {
661 $maxphp2 = (int) substr($maxphp2, 0, -1) * 1024 * 1024;
663 if (preg_match(
'/t$/i', $maxphp2)) {
664 $maxphp2 = (int) substr($maxphp2, 0, -1) * 1024 * 1024 * 1024;
668 $maxphptoshow = $maxphptoshowparam =
'';
670 $maxmin = min($max, $maxphp);
671 $maxphptoshow = $maxphp;
672 $maxphptoshowparam =
'upload_max_filesize';
675 $maxmin = min($max, $maxphp2);
676 if ($maxphp2 < $maxphp) {
677 $maxphptoshow = $maxphp2;
678 $maxphptoshowparam =
'post_max_size';
682 $langs->load(
'other');
684 $out .=
info_admin($langs->trans(
"ThisLimitIsDefinedInSetup", $max, $maxphptoshow), 1);
686 $out .=
' ('.$langs->trans(
"UploadDisabled").
')';
692 $filearray =
dol_dir_list($conf->import->dir_temp,
'files', 0,
'',
'',
'name', SORT_DESC);
693 if (count($filearray) > 0) {
694 print
'<div class="div-table-responsive-no-min">';
695 print
'<table class="noborder centpercent" width="100%" cellpadding="4">';
697 $dir = $conf->import->dir_temp;
701 foreach ($filearray as $key => $val) {
702 $file = $val[
'name'];
706 $file = utf8_encode($file);
709 if (preg_match(
'/^\./', $file)) {
713 $modulepart =
'import';
714 $urlsource = $_SERVER[
"PHP_SELF"].
'?step='.$step.$param.
'&filetoimport='.urlencode($filetoimport);
715 $relativepath = $file;
717 print
'<tr class="oddeven">';
719 print
img_mime($file,
'',
'pictofixedwidth');
720 print
'<a data-ajax="false" href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&file='.urlencode($relativepath).
'&step=3'.$param.
'" target="_blank" rel="noopener noreferrer">';
725 print
'<td style="text-align:right">'.dol_print_size(
dol_filesize($dir.
'/'.$file)).
'</td>';
727 print
'<td style="text-align:right">'.dol_print_date(
dol_filemtime($dir.
'/'.$file),
'dayhour').
'</td>';
729 print
'<td style="text-align:right"><a href="'.$_SERVER[
'PHP_SELF'].
'?action=delete&token='.
newToken().
'&step=3'.$param.
'&urlfile='.urlencode($relativepath);
730 print
'">'.img_delete().
'</a></td>';
732 print
'<td style="text-align:right">';
733 print
'<a href="'.$_SERVER[
'PHP_SELF'].
'?step=4'.$param.
'&filetoimport='.urlencode($relativepath).
'">'.
img_picto($langs->trans(
"NewImport"),
'next',
'class="fa-15"').
'</a>';
747 if ($step == 4 && $datatoimport) {
749 $serialized_array_match_file_to_database = isset($_SESSION[
"dol_array_match_file_to_database_select"]) ? $_SESSION[
"dol_array_match_file_to_database_select"] :
'';
750 $fieldsarray = explode(
',', $serialized_array_match_file_to_database);
751 $array_match_file_to_database = array();
752 foreach ($fieldsarray as $elem) {
753 $tabelem = explode(
'=', $elem, 2);
755 $val = (isset($tabelem[1]) ? $tabelem[1] :
'');
757 $array_match_file_to_database[$key] = $val;
766 $list = $objmodelimport->listOfAvailableImportFormat($db);
768 if (empty($separator)) {
769 $separator = (empty($conf->global->IMPORT_CSV_SEPARATOR_TO_USE) ?
',' : $conf->global->IMPORT_CSV_SEPARATOR_TO_USE);
773 if ($model ==
'csv' && strlen($separator) == 1 && !
GETPOSTISSET(
'separator')) {
775 $fh = fopen($conf->import->dir_temp.
'/'.$filetoimport,
'r');
777 $sline = fgets($fh, 1000000);
779 $nboccurence = substr_count($sline, $separator);
780 $nboccurencea = substr_count($sline,
',');
781 $nboccurenceb = substr_count($sline,
';');
783 if ($nboccurence == 0) {
784 if ($nboccurencea > 2) {
786 } elseif ($nboccurenceb > 2) {
794 $separator_used = str_replace(
'\t',
"\t", $separator);
797 $dir = DOL_DOCUMENT_ROOT.
"/core/modules/import/";
798 $file =
"import_".$model.
".modules.php";
799 $classname =
"Import".ucfirst($model);
800 require_once $dir.$file;
801 $obj =
new $classname($db, $datatoimport);
802 if ($model ==
'csv') {
803 $obj->separator = $separator_used;
804 $obj->enclosure = $enclosure;
806 if ($model ==
'xlsx') {
807 if (!preg_match(
'/\.xlsx$/i', $filetoimport)) {
808 $langs->load(
"errors");
809 $param =
'&datatoimport='.$datatoimport.
'&format='.$format;
810 setEventMessages($langs->trans(
"ErrorFileMustHaveFormat", $model),
null,
'errors');
811 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?step=3'.$param.
'&filetoimport='.urlencode($relativepath));
817 $array_match_file_to_database = array();
821 $fieldssource = array();
822 $result = $obj->import_open_file($conf->import->dir_temp.
'/'.$filetoimport, $langs);
825 $arrayrecord = $obj->import_read_record();
829 foreach ($arrayrecord as $key => $val) {
830 if ($val[
"type"] != -1) {
831 $fieldssource[$i][
'example1'] =
dol_trunc($val[
'val'], 128);
834 $fieldssource[$i][
'example1'] = $langs->trans(
'Empty');
838 $obj->import_close_file();
842 $fieldstarget = $objimport->array_import_fields[0];
843 $minpos = min(count($fieldssource), count($fieldstarget));
847 $initialloadofstep4 =
false;
848 if (empty($_SESSION[
'dol_array_match_file_to_database_select'])) {
849 $initialloadofstep4 =
true;
853 if (count($array_match_file_to_database) == 0) {
859 $num = count($fieldssource);
860 while ($pos <= $num) {
861 if ($num >= 1 && $pos <= $num) {
863 foreach ($fieldstarget as $key => $val) {
864 if ($posbis < $pos) {
869 $array_match_file_to_database[$pos] = $key;
876 $array_match_database_to_file = array_flip($array_match_file_to_database);
880 $fieldstarget_tmp = array();
881 $arraykeysfieldtarget = array_keys($fieldstarget);
883 foreach ($fieldstarget as $key => $label) {
884 $isrequired = preg_match(
'/\*$/', $label);
885 if (!empty($isrequired)) {
886 $newlabel = substr($label, 0, -1);
887 $fieldstarget_tmp[$key] = array(
"label"=>$newlabel,
"required"=>
true);
889 $fieldstarget_tmp[$key] = array(
"label"=>$label,
"required"=>
false);
891 if (!empty($array_match_database_to_file[$key])) {
892 $fieldstarget_tmp[$key][
"imported"] =
true;
893 $fieldstarget_tmp[$key][
"position"] = $array_match_database_to_file[$key]-1;
895 while (!empty($array_match_database_to_file[$keytoswap])) {
896 if ($position+1 > $array_match_database_to_file[$keytoswap]) {
897 $keytoswapwith = $array_match_database_to_file[$keytoswap]-1;
898 $tmp = [$keytoswap=>$fieldstarget_tmp[$keytoswap]];
899 unset($fieldstarget_tmp[$keytoswap]);
900 $fieldstarget_tmp =
arrayInsert($fieldstarget_tmp, $keytoswapwith, $tmp);
901 $keytoswapwith = $arraykeysfieldtarget[$array_match_database_to_file[$keytoswap]-1];
902 $tmp = $fieldstarget_tmp[$keytoswapwith];
903 unset($fieldstarget_tmp[$keytoswapwith]);
904 $fieldstarget_tmp[$keytoswapwith] = $tmp;
905 $keytoswap = $keytoswapwith;
911 $fieldstarget_tmp[$key][
"imported"] =
false;
915 $fieldstarget = $fieldstarget_tmp;
924 $param =
'&format='.$format.
'&datatoimport='.urlencode($datatoimport).
'&filetoimport='.urlencode($filetoimport);
925 if ($excludefirstline) {
926 $param .=
'&excludefirstline='.urlencode($excludefirstline);
929 $param .=
'&endatlinenb='.urlencode($endatlinenb);
932 $param .=
'&separator='.urlencode($separator);
935 $param .=
'&enclosure='.urlencode($enclosure);
944 print
'<div class="underbanner clearboth"></div>';
945 print
'<div class="fichecenter">';
947 print
'<table class="centpercent border tableforfield">';
950 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Module").
'</td>';
952 $titleofmodule = $objimport->array_import_module[0][
'module']->getName();
954 if (in_array($objimport->array_import_code[0], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
955 $titleofmodule = $langs->trans(
"ProductOrService");
957 print $titleofmodule;
961 print
'<tr><td>'.$langs->trans(
"DatasetToImport").
'</td>';
963 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[0]);
964 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
965 print
img_object($objimport->array_import_module[0][
'module']->getName(), $entityicon).
' ';
966 print $objimport->array_import_label[0];
972 print
load_fiche_titre($langs->trans(
"InformationOnSourceFile"),
'',
'file-export');
974 print
'<div class="underbanner clearboth"></div>';
975 print
'<div class="fichecenter">';
976 print
'<table width="100%" class="border tableforfield">';
979 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"SourceFileFormat").
'</td>';
981 $text = $objmodelimport->getDriverDescForKey($format);
982 print
$form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text);
986 if ($model ==
'csv') {
987 print
'<tr><td>'.$langs->trans(
"CsvOptions").
'</td>';
989 print
'<form method="POST">';
990 print
'<input type="hidden" name="token" value="'.newToken().
'">';
991 print
'<input type="hidden" value="'.$step.
'" name="step">';
992 print
'<input type="hidden" value="'.$format.
'" name="format">';
993 print
'<input type="hidden" value="'.$excludefirstline.
'" name="excludefirstline">';
994 print
'<input type="hidden" value="'.$endatlinenb.
'" name="endatlinenb">';
995 print
'<input type="hidden" value="'.$datatoimport.
'" name="datatoimport">';
996 print
'<input type="hidden" value="'.$filetoimport.
'" name="filetoimport">';
997 print $langs->trans(
"Separator").
' : ';
998 print
'<input type="text" class="width25 center" name="separator" value="'.dol_escape_htmltag($separator).
'"/>';
999 print
' '.$langs->trans(
"Enclosure").
' : ';
1000 print
'<input type="text" class="width25 center" name="enclosure" value="'.dol_escape_htmltag($enclosure).
'"/> ';
1001 print
'<input name="update" type="submit" value="'.$langs->trans(
'Update').
'" class="button smallpaddingimp" />';
1007 print
'<tr><td>'.$langs->trans(
"FileToImport").
'</td>';
1009 $modulepart =
'import';
1010 $relativepath =
GETPOST(
'filetoimport');
1011 print
'<a data-ajax="false" href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&file='.urlencode($relativepath).
'&step=4'.$param.
'" target="_blank" rel="noopener noreferrer">';
1012 print
img_mime($file,
'',
'pictofixedwidth');
1013 print $filetoimport;
1014 print
img_picto($langs->trans(
"Download"),
'download',
'class="paddingleft opacitymedium"');
1027 print
'<!-- List of source fields -->'.
"\n";
1028 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1029 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1030 print
'<input type="hidden" name="action" value="select_model">';
1031 print
'<input type="hidden" name="step" value="4">';
1032 print
'<input type="hidden" name="format" value="'.$format.
'">';
1033 print
'<input type="hidden" name="datatoimport" value="'.$datatoimport.
'">';
1034 print
'<input type="hidden" name="filetoimport" value="'.$filetoimport.
'">';
1035 print
'<input type="hidden" name="excludefirstline" value="'.$excludefirstline.
'">';
1036 print
'<input type="hidden" name="endatlinenb" value="'.$endatlinenb.
'">';
1037 print
'<input type="hidden" name="separator" value="'.dol_escape_htmltag($separator).
'">';
1038 print
'<input type="hidden" name="enclosure" value="'.dol_escape_htmltag($enclosure).
'">';
1041 print
'<div class="marginbottomonly">';
1042 print
'<span class="opacitymedium">';
1043 $s = $langs->trans(
"SelectImportFieldsSource",
'{s1}');
1044 $s = str_replace(
'{s1}',
img_picto(
'',
'grip_title',
'',
false, 0, 0,
'',
'', 0), $s);
1047 $htmlother->select_import_model($importmodelid,
'importmodelid', $datatoimport, 1, $user->id);
1048 print
'<input type="submit" class="button small reposition" value="'.$langs->trans(
"Select").
'">';
1053 print
'<div class="div-table-responsive-no-min">';
1054 print
'<table class="noborder centpercent">';
1055 print
'<tr class="liste_titre">';
1056 print
'<td>'.$langs->trans(
"FieldsInSourceFile").
'</td>';
1057 print
'<td>'.$langs->trans(
"FieldsInTargetDatabase").
'</td>';
1062 print
'<tr valign="top"><td width="50%" class="nopaddingleftimp">';
1064 $fieldsplaced = array();
1065 $valforsourcefieldnb = array();
1066 $listofkeys = array();
1067 foreach ($array_match_file_to_database as $key => $val) {
1068 $listofkeys[$key] = 1;
1071 print
"\n<!-- Box left container -->\n";
1072 print
'<div id="left" class="connectedSortable">'.
"\n";
1078 foreach ($fieldssource as $key => $val) {
1079 show_elem($fieldssource, $key, $val, $var);
1080 $listofkeys[$key] = 1;
1081 $fieldsplaced[$key] = 1;
1082 $valforsourcefieldnb[$lefti] = $key;
1085 if ($lefti > count($fieldstarget)) {
1092 print
"<!-- End box left container -->\n";
1095 print
'</td><td width="50%" class="nopaddingrightimp">';
1099 $optionsall = array();
1100 foreach ($fieldstarget as $code => $line) {
1103 $tmparray = explode(
'|', $line[
"label"]);
1105 foreach ($tmparray as $tmpkey => $tmpval) {
1106 $labeltoshow .= ($labeltoshow ?
' '.$langs->trans(
'or').
' ' :
'').$langs->transnoentities($tmpval);
1108 $optionsall[$code] = array(
'labelkey'=>$line[
'label'],
'labelkeyarray'=>$tmparray,
'label'=>$labeltoshow,
'required'=>(empty($line[
"required"]) ? 0 : 1),
'position'=>!empty($line[
'position']) ? $line[
'position'] : 0);
1113 $optionsall[$code][
'picto'] = $picto;
1120 $mandatoryfieldshavesource =
true;
1133 $modetoautofillmapping =
'session';
1134 if ($initialloadofstep4) {
1135 $modetoautofillmapping =
'guess';
1139 print
'<table class="nobordernopadding centpercent tableimport">';
1140 foreach ($fieldssource as $code => $line) {
1141 if ($i == $minpos) {
1144 print
'<tr style="height:'.$height.
'" class="trimport oddevenimport">';
1145 $entity = (!empty($objimport->array_import_entities[0][$code]) ? $objimport->array_import_entities[0][$code] : $objimport->array_import_icon[0]);
1147 $entityicon = !empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity;
1148 $entitylang = $entitytolang[$entity] ? $entitytolang[$entity] : $objimport->array_import_label[0];
1150 print
'<td class="nowraponall hideonsmartphone" style="font-weight: normal">=> </td>';
1151 print
'<td class="nowraponall" style="font-weight: normal">';
1156 $selectforline =
'';
1157 $selectforline .=
'<select id="selectorderimport_'.($i+1).
'" class="targetselectchange minwidth300" name="select_'.($i+1).
'">';
1158 if (!empty($line[
"imported"])) {
1159 $selectforline .=
'<option value="-1"> </option>';
1161 $selectforline .=
'<option selected="" value="-1"> </option>';
1165 $codeselectedarray = array();
1166 foreach ($optionsall as $tmpcode => $tmpval) {
1168 if (!empty($tmpval[
'picto'])) {
1169 $label .=
img_picto(
'', $tmpval[
'picto'],
'class="pictofixedwidth"');
1171 $label .= $tmpval[
'required'] ?
'<strong>' :
'';
1172 $label .= $tmpval[
'label'];
1173 $label .= $tmpval[
'required'] ?
'*</strong>' :
'';
1175 $tablealias = preg_replace(
'/(\..*)$/i',
'', $tmpcode);
1176 $tablename = !empty($objimport->array_import_tables[0][$tablealias]) ? $objimport->array_import_tables[0][$tablealias] :
"";
1180 $filecolumn = ($i + 1);
1182 if (empty($objimport->array_import_convertvalue[0][$tmpcode])) {
1185 if ($objimport->array_import_convertvalue[0][$tmpcode][
'rule'] ==
'fetchidfromref') {
1186 $htmltext .= $langs->trans(
"DataComeFromIdFoundFromRef", $langs->transnoentitiesnoconv($entitylang)).
'<br>';
1188 if ($objimport->array_import_convertvalue[0][$tmpcode][
'rule'] ==
'fetchidfromcodeid') {
1189 $htmltext .= $langs->trans(
"DataComeFromIdFoundFromCodeId", $langs->transnoentitiesnoconv($objimport->array_import_convertvalue[0][$tmpcode][
'dict'])).
'<br>';
1193 $example = !empty($objimport->array_import_examplevalues[0][$tmpcode])?$objimport->array_import_examplevalues[0][$tmpcode]:
"";
1195 if (empty($objimport->array_import_convertvalue[0][$tmpcode])) {
1197 $htmltext .= $langs->trans(
"SourceExample").
': <b>'.str_replace(
'"',
'', $example).
'</b><br>';
1200 if ($objimport->array_import_convertvalue[0][$tmpcode][
'rule'] ==
'fetchidfromref') {
1201 $htmltext .= $langs->trans(
"SourceExample").
': <b>'.$langs->transnoentitiesnoconv(
"ExampleAnyRefFoundIntoElement", $entitylang).($example ?
' ('.$langs->transnoentitiesnoconv(
"Example").
': '.str_replace(
'"',
'', $example).
')' :
'').
'</b><br>';
1202 } elseif ($objimport->array_import_convertvalue[0][$tmpcode][
'rule'] ==
'fetchidfromcodeid') {
1203 $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>';
1204 } elseif ($example) {
1205 $htmltext .= $langs->trans(
"SourceExample").
': <b>'.str_replace(
'"',
'', $example).
'</b><br>';
1209 if (!empty($objimport->array_import_regex[0][$tmpcode])) {
1210 $htmltext .= $langs->trans(
"FormatControlRule").
': <b>'.str_replace(
'"',
'', $objimport->array_import_regex[0][$tmpcode]).
'</b><br>';
1214 $htmltext .= $langs->trans(
"InformationOnTargetTables").
': <b>'.$tablename.
"->".preg_replace(
'/^.*\./',
'', $tmpcode).
"</b>";
1216 $labelhtml = $label.
' '.
$form->textwithpicto(
'', $htmltext, 1,
'help',
'', 1);
1218 $selectforline .=
'<option value="'.$tmpcode.
'"';
1219 if ($modetoautofillmapping ==
'orderoftargets') {
1222 $selectforline .=
' selected';
1224 } elseif ($modetoautofillmapping ==
'guess') {
1228 if (preg_match(
'/^(.+)\((.+\..+)\)$/', $line[
'example1'], $regs)) {
1229 $tmpstring1 = $regs[1];
1230 $tmpstring2 = $regs[2];
1232 $tmpstring1 = $line[
'example1'];
1235 $tmpstring1 = strtolower(str_replace(
'*',
'', trim($tmpstring1)));
1236 $tmpstring2 = strtolower(str_replace(
'*',
'', trim($tmpstring2)));
1239 foreach ($tmpval[
'labelkeyarray'] as $tmpval2) {
1240 $labeltarget = $langs->transnoentities($tmpval2);
1242 if ($tmpstring1 && ($tmpstring1 == $tmpcode || $tmpstring1 == strtolower($labeltarget)
1243 || $tmpstring1 == strtolower(
dol_string_unaccent($labeltarget)) || $tmpstring1 == strtolower($tmpval2))) {
1244 if (empty($codeselectedarray[$code])) {
1245 $selectforline .=
' selected';
1246 $codeselectedarray[$code] = 1;
1249 } elseif ($tmpstring2 && ($tmpstring2 == $tmpcode || $tmpstring2 == strtolower($labeltarget)
1250 || $tmpstring2 == strtolower(
dol_string_unaccent($labeltarget)) || $tmpstring2 == strtolower($tmpval2))) {
1251 if (empty($codeselectedarray[$code])) {
1252 $selectforline .=
' selected';
1253 $codeselectedarray[$code] = 1;
1258 } elseif ($modetoautofillmapping ==
'session' && !empty($_SESSION[
'dol_array_match_file_to_database_select'])) {
1259 $tmpselectioninsession =
dolExplodeIntoArray($_SESSION[
'dol_array_match_file_to_database_select'],
',',
'=');
1261 if (!empty($tmpselectioninsession[($i+1)]) && $tmpselectioninsession[($i+1)] == $tmpcode) {
1262 $selectforline .=
' selected';
1264 $selectforline .=
' data-debug="'.$tmpcode.
'-'.$code.
'-'.$j.
'-'.(!empty($tmpselectioninsession[($i+1)]) ? $tmpselectioninsession[($i+1)] :
"").
'"';
1266 $selectforline .=
' data-html="'.dol_escape_htmltag($labelhtml).
'"';
1267 $selectforline .=
'>';
1268 $selectforline .= $label;
1269 $selectforline .=
'</options>';
1272 $selectforline .=
'</select>';
1273 $selectforline .=
ajax_combobox(
'selectorderimport_'.($i+1));
1275 print $selectforline;
1280 print
'<td class="nowraponall" style="font-weight:normal; text-align:right">';
1283 $htmltext =
'<b><u>'.$langs->trans(
"FieldSource").
'</u></b><br>';
1285 $htmltext .= $langs->trans(
"DataComeFromFileFieldNb", $filecolumntoshow).
'<br>';
1287 print
$form->textwithpicto(
'', $htmltext);
1298 print
'<tr class="liste_titre"><td colspan="2">'.$langs->trans(
"Note").
'</td></tr>';
1299 print
'<tr><td colspan="2"><div id="div-mandatory-target-fields-not-mapped"></div></td></tr>';
1305 if (!empty($conf->use_javascript_ajax)) {
1306 print
'<script type="text/javascript">'.
"\n";
1307 print
'var previousselectedvalueimport = "0";'.
"\n";
1308 print
'var previousselectedlabelimport = "0";'.
"\n";
1309 print
'var arrayofselectedvalues = [];'.
"\n";
1310 print
'var arrayoftargetfields = [];'.
"\n";
1311 print
'var arrayoftargetmandatoryfields = [];'.
"\n";
1315 foreach ($fieldstarget as $key => $val) {
1316 print
"arrayoftargetfields[".$tmpi.
"] = '".
dol_escape_js($langs->trans($val[
'label'])).
"'; ";
1317 if ($val[
'required']) {
1318 print
"arrayoftargetmandatoryfields[".$tmpi.
"] = '".
dol_escape_js($key).
"'; ";
1324 print
'$(document).ready(function () {'.
"\n";
1326 print
'setOptionsToDisabled();'.
"\n";
1327 print
'saveSelection();'.
"\n";
1329 print
'$(".targetselectchange").focus(function(){'.
"\n";
1330 print
' previousselectedvalueimport = $(this).val();'.
"\n";
1331 print
' previousselectedlabelimport = $(this).children("option:selected").text();'.
"\n";
1332 print
' console.log("previousselectedvalueimport="+previousselectedvalueimport)'.
"\n";
1339 print
'function setOptionsToDisabled() {'.
"\n";
1340 print
' console.log("Remove the disabled flag everywhere");'.
"\n";
1341 print
' $("select.targetselectchange").not($( this )).find(\'option\').prop("disabled", false);'.
"\n";
1342 print
' arrayofselectedvalues = [];'.
"\n";
1344 print
' $("select.targetselectchange").each(function(){'.
"\n";
1345 print
' id = $(this).attr(\'id\')'.
"\n";
1346 print
' value = $(this).val()'.
"\n";
1347 print
' console.log("a selected value has been found for component "+id+" = "+value);'.
"\n";
1348 print
' arrayofselectedvalues.push(value);'.
"\n";
1351 print
' console.log("List of all selected values arrayofselectedvalues");'.
"\n";
1352 print
' console.log(arrayofselectedvalues);'.
"\n";
1353 print
' console.log("Set the option to disabled for every entry that is currently selected somewhere else (so into arrayofselectedvalues)");'.
"\n";
1355 print
' $.each(arrayofselectedvalues, function(key, value) {'.
"\n";
1356 print
' if (value != -1) {'.
"\n";
1357 print
' console.log("Process key="+key+" value="+value+" to disable.");'.
"\n";
1358 print
' $("select.targetselectchange").find(\'option[value="\'+value+\'"]:not(:selected)\').prop("disabled", true);'.
"\n";
1364 print
'function saveSelection() {'.
"\n";
1366 print
' arrayselectedfields = [];'.
"\n";
1367 print
' arrayselectedfields.push(0);'.
"\n";
1369 print
' $.each( arrayofselectedvalues, function( key, value ) {'.
"\n";
1370 print
' if (value != -1) {'.
"\n";
1371 print
' arrayselectedfields.push(value);'.
"\n";
1372 print
' } else {'.
"\n";
1373 print
' arrayselectedfields.push(0);'.
"\n";
1377 print
" $.ajax({\n";
1378 print
" type: 'POST',\n";
1379 print
" dataType: 'json',\n";
1380 print
" url: '".dol_escape_js($_SERVER[
"PHP_SELF"]).
"?action=saveselectorder&token=".
newToken().
"',\n";
1381 print
" data: 'selectorder='+arrayselectedfields.toString(),\n";
1382 print
" success: function(){\n";
1383 print
" console.log('The selected fields have been saved into '+arrayselectedfields.toString());\n";
1388 print
' console.log("arrayselectedfields");';
1389 print
' console.log(arrayselectedfields);';
1390 print
' console.log("arrayoftargetmandatoryfields");';
1391 print
' console.log(arrayoftargetmandatoryfields);';
1392 print
" listtoshow = '';";
1393 print
" nbelement = arrayoftargetmandatoryfields.length
1394 for (let i = 0; i < nbelement; i++) {
1395 if (arrayoftargetmandatoryfields[i] && ! arrayselectedfields.includes(arrayoftargetmandatoryfields[i])) {
1396 console.log(arrayoftargetmandatoryfields[i]+' not mapped');
1397 listtoshow = listtoshow + (listtoshow ? ', ' : '') + '<b>' + arrayoftargetfields[i] + '*</b>';
1400 console.log(listtoshow);
1402 listtoshow = '".dol_escape_js(
img_warning($langs->trans(
"MandatoryTargetFieldsNotMapped")).
' '.$langs->trans(
"MandatoryTargetFieldsNotMapped")).
": ' + listtoshow;
1403 $('#div-mandatory-target-fields-not-mapped').html(listtoshow);
1405 $('#div-mandatory-target-fields-not-mapped').html('<span class=\"opacitymedium\">".
dol_escape_js($langs->trans(
"AllTargetMandatoryFieldsAreMapped")).
"</span>');
1412 print
'$(".targetselectchange").change(function(){'.
"\n";
1413 print
' setOptionsToDisabled();'.
"\n";
1415 print
' if(previousselectedlabelimport != "" && previousselectedvalueimport != -1) {'.
"\n";
1416 print
' let valuetochange = $(this).val(); '.
"\n";
1417 print
' $(".boxtdunused").each(function(){'.
"\n";
1418 print
' if ($(this).text().includes(valuetochange)){'.
"\n";
1419 print
' arraychild = $(this)[0].childNodes'.
"\n";
1420 print
' arraytexttomodify = arraychild[0].textContent.split(" ")'.
"\n";
1421 print
' arraytexttomodify[1] = previousselectedvalueimport '.
"\n";
1422 print
' textmodified = arraytexttomodify.join(" ") '.
"\n";
1423 print
' arraychild[0].textContent = textmodified'.
"\n";
1424 print
' arraychild[1].innerHTML = previousselectedlabelimport'.
"\n";
1428 print
' $(this).blur()'.
"\n";
1430 print
' saveSelection()'.
"\n";
1434 print
'</script>'.
"\n";
1440 print
'<div class="tabsAction">';
1442 if (count($array_match_file_to_database)) {
1443 if ($mandatoryfieldshavesource) {
1444 print
'<a class="butAction saveorderselect" href="import.php?step=5'.$param.
'&filetoimport='.urlencode($filetoimport).
'">'.$langs->trans(
"NextStep").
'</a>';
1446 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"SomeMandatoryFieldHaveNoSource")).
'">'.$langs->trans(
"NextStep").
'</a>';
1454 if (count($array_match_file_to_database)) {
1456 print
'<!-- Area to add new import profile -->'.
"\n";
1457 print
'<div class="marginbottomonly"><span class="opacitymedium">'.$langs->trans(
"SaveImportModel").
'</span></div>';
1459 print
'<form class="nocellnopadd" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1460 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1461 print
'<input type="hidden" name="action" value="add_import_model">';
1462 print
'<input type="hidden" name="step" value="'.$step.
'">';
1463 print
'<input type="hidden" name="format" value="'.$format.
'">';
1464 print
'<input type="hidden" name="datatoimport" value="'.$datatoimport.
'">';
1465 print
'<input type="hidden" name="filetoimport" value="'.$filetoimport.
'">';
1466 print
'<input type="hidden" name="hexa" value="'.$hexa.
'">';
1467 print
'<input type="hidden" name="excludefirstline" value="'.$excludefirstline.
'">';
1468 print
'<input type="hidden" name="endatlinenb" value="'.$endatlinenb.
'">';
1469 print
'<input type="hidden" name="page_y" value="">';
1470 print
'<input type="hidden" value="'.dol_escape_htmltag($separator).
'" name="separator">';
1471 print
'<input type="hidden" value="'.dol_escape_htmltag($enclosure).
'" name="enclosure">';
1473 print
'<div class="div-table-responsive-no-min">';
1474 print
'<table summary="selectofimportprofil" class="noborder centpercent">';
1475 print
'<tr class="liste_titre">';
1476 print
'<td>'.$langs->trans(
"ImportModelName").
'</td>';
1477 print
'<td>'.$langs->trans(
"Visibility").
'</td>';
1481 $nameofimportprofile = str_replace(
' ',
'-', $langs->trans(
"ImportProfile").
' '.$titleofmodule.
' '.
dol_print_date(
dol_now(
'gmt'),
'dayxcard'));
1483 $nameofimportprofile = $import_name;
1486 print
'<tr class="oddeven">';
1487 print
'<td><input name="import_name" class="minwidth300" value="'.$nameofimportprofile.
'"></td>';
1489 $arrayvisibility = array(
'private'=>$langs->trans(
"Private"),
'all'=>$langs->trans(
"Everybody"));
1490 print
$form->selectarray(
'visibility', $arrayvisibility,
'private');
1492 print
'<td class="right">';
1493 print
'<input type="submit" class="button smallpaddingimp reposition" value="'.$langs->trans(
"SaveImportProfile").
'">';
1497 $sql =
"SELECT rowid, label, fk_user, entity";
1498 $sql .=
" FROM ".MAIN_DB_PREFIX.
"import_model";
1499 $sql .=
" WHERE type = '".$db->escape($datatoimport).
"'";
1500 if (empty($conf->global->EXPORTS_SHARE_MODELS)) {
1501 $sql .=
" AND fk_user IN (0, ".((int) $user->id).
")";
1503 $sql .=
" ORDER BY rowid";
1505 $resql = $db->query($sql);
1507 $num = $db->num_rows(
$resql);
1509 $tmpuser =
new user($db);
1513 $obj = $db->fetch_object(
$resql);
1515 print
'<tr class="oddeven"><td>';
1518 print
'<td class="tdoverflowmax150">';
1519 if (empty($obj->fk_user)) {
1520 print $langs->trans(
"Everybody");
1522 $tmpuser->fetch($obj->fk_user);
1523 print $tmpuser->getNomUrl(-1);
1526 print
'<td class="right">';
1527 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?step='.$step.$param.
'&action=deleteprof&token='.
newToken().
'&id='.$obj->rowid.
'&filetoimport='.urlencode($filetoimport).
'">';
1545 if ($step == 5 && $datatoimport) {
1546 $max_execution_time_for_importexport = (empty($conf->global->IMPORT_MAX_EXECUTION_TIME) ? 300 : $conf->global->IMPORT_MAX_EXECUTION_TIME);
1547 $max_time = @ini_get(
"max_execution_time");
1548 if ($max_time && $max_time < $max_execution_time_for_importexport) {
1549 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.");
1550 @ini_set(
"max_execution_time", $max_execution_time_for_importexport);
1554 $list = $objmodelimport->listOfAvailableImportFormat($db);
1557 $dir = DOL_DOCUMENT_ROOT.
"/core/modules/import/";
1558 $file =
"import_".$model.
".modules.php";
1559 $classname =
"Import".ucfirst($model);
1560 require_once $dir.$file;
1561 $obj =
new $classname($db, $datatoimport);
1562 if ($model ==
'csv') {
1563 $obj->separator = $separator_used;
1564 $obj->enclosure = $enclosure;
1568 $fieldssource = array();
1569 $result = $obj->import_open_file($conf->import->dir_temp.
'/'.$filetoimport, $langs);
1573 $arrayrecord = $obj->import_read_record();
1576 foreach ($arrayrecord as $key => $val) {
1577 $fieldssource[$i][
'example1'] =
dol_trunc($val[
'val'], 24);
1580 $obj->import_close_file();
1583 $nboflines = $obj->import_get_nb_of_lines($conf->import->dir_temp.
'/'.$filetoimport);
1585 $param =
'&leftmenu=import&format='.urlencode($format).
'&datatoimport='.urlencode($datatoimport).
'&filetoimport='.urlencode($filetoimport).
'&nboflines='.urlencode($nboflines).
'&separator='.urlencode($separator).
'&enclosure='.urlencode($enclosure);
1587 if ($excludefirstline) {
1588 $param .=
'&excludefirstline='.urlencode($excludefirstline);
1591 $param .=
'&endatlinenb='.urlencode($endatlinenb);
1593 if (!empty($updatekeys)) {
1594 $param .=
'&updatekeys[]='.implode(
'&updatekeys[]=', $updatekeys);
1602 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'?'.$param2.
'" method="POST">';
1603 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1604 print
'<input type="hidden" name="step" value="5">';
1605 print
'<input type="hidden" name="action" value="launchsimu">';
1609 print
'<div class="underbanner clearboth"></div>';
1610 print
'<div class="fichecenter">';
1612 print
'<table width="100%" class="border tableforfield">';
1615 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Module").
'</td>';
1617 $titleofmodule = $objimport->array_import_module[0][
'module']->getName();
1619 if (in_array($objimport->array_import_code[0], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
1620 $titleofmodule = $langs->trans(
"ProductOrService");
1622 print $titleofmodule;
1626 print
'<tr><td>'.$langs->trans(
"DatasetToImport").
'</td>';
1628 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[0]);
1629 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
1630 print
img_object($objimport->array_import_module[0][
'module']->getName(), $entityicon).
' ';
1631 print $objimport->array_import_label[0];
1637 print
load_fiche_titre($langs->trans(
"InformationOnSourceFile"),
'',
'file-export');
1639 print
'<div class="underbanner clearboth"></div>';
1640 print
'<div class="fichecenter">';
1641 print
'<table width="100%" class="border tableforfield">';
1644 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"SourceFileFormat").
'</td>';
1646 $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) ? (join(
', ', $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 = empty($conf->global->IMPORT_MAX_NB_OF_ERRORS) ? 50 : $conf->global->IMPORT_MAX_NB_OF_ERRORS;
1842 $maxnbofwarnings = empty($conf->global->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();
1859 $sourcelinenb = 0; $endoffile = 0;
1862 while (($sourcelinenb < $nboflines) && !$endoffile) {
1866 $arrayrecord = $obj->import_read_record();
1867 if ($arrayrecord ===
false) {
1868 $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');
1872 if ($excludefirstline && ($sourcelinenb < $excludefirstline)) {
1875 if ($endatlinenb && ($sourcelinenb > $endatlinenb)) {
1880 $result = $obj->import_insert($arrayrecord, $array_match_file_to_database, $objimport, count($fieldssource), $importid, $updatekeys);
1882 if (count($obj->errors)) {
1883 $arrayoferrors[$sourcelinenb] = $obj->errors;
1885 if (count($obj->warnings)) {
1886 $arrayofwarnings[$sourcelinenb] = $obj->warnings;
1888 if (!count($obj->errors) && !count($obj->warnings)) {
1893 $obj->import_close_file();
1895 print $langs->trans(
"ErrorFailedToOpenFile", $pathfile);
1902 if (!empty($objimport->array_import_run_sql_after[0]) && is_array($objimport->array_import_run_sql_after[0])) {
1904 foreach ($objimport->array_import_run_sql_after[0] as $sqlafterimport) {
1906 $resqlafterimport = $db->query($sqlafterimport);
1907 if (!$resqlafterimport) {
1908 $arrayoferrors[
'none'][] = array(
'lib'=>$langs->trans(
"Error running final request: ".$sqlafterimport));
1917 if (!count($arrayoferrors) && !count($arrayofwarnings)) {
1919 print
'<div class="info">';
1920 print
'<div class=""><b>'.$langs->trans(
"ResultOfSimulationNoError").
'</b></div>';
1921 print $langs->trans(
"NbInsertSim", empty($obj->nbinsert) ? 0 : $obj->nbinsert).
'<br>';
1922 print $langs->trans(
"NbUpdateSim", empty($obj->nbupdate) ? 0 : $obj->nbupdate).
'<br>';
1927 print
'<div class="warning">';
1928 print $langs->trans(
"NbOfLinesOK", $nbok).
'...<br>';
1935 if (count($arrayoferrors)) {
1936 print
img_error().
' <b>'.$langs->trans(
"ErrorsOnXLines", count($arrayoferrors)).
'</b><br>';
1937 print
'<table width="100%" class="border"><tr><td>';
1938 foreach ($arrayoferrors as $key => $val) {
1940 if ($nboferrors > $maxnboferrors) {
1941 print $langs->trans(
"TooMuchErrors", (count($arrayoferrors) - $nboferrors)).
"<br>";
1945 foreach ($val as $i => $err) {
1946 print
' > '.dol_escape_htmltag($err[
'lib']).
'<br>';
1949 print
'</td></tr></table>';
1955 if (count($arrayofwarnings)) {
1956 print
img_warning().
' <b>'.$langs->trans(
"WarningsOnXLines", count($arrayofwarnings)).
'</b><br>';
1957 print
'<table width="100%" class="border"><tr><td>';
1958 foreach ($arrayofwarnings as $key => $val) {
1960 if ($nbofwarnings > $maxnbofwarnings) {
1961 print $langs->trans(
"TooMuchWarnings", (count($arrayofwarnings) - $nbofwarnings)).
"<br>";
1965 foreach ($val as $i => $err) {
1966 print
' > '.dol_escape_htmltag($err[
'lib']).
'<br>';
1969 print
'</td></tr></table>';
1976 print
'<div class="center">';
1977 print
'<span class="opacitymedium">'.$langs->trans(
"NowClickToRunTheImport", $langs->transnoentitiesnoconv(
"RunImportFile")).
'</span><br>';
1986 print
'<div class="center">';
1987 if ($user->hasRight(
'import',
'run')) {
1988 if (empty($nboferrors)) {
1989 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/imports/import.php?leftmenu=import&step=6&importid='.$importid.$param.
'">'.$langs->trans(
"RunImportFile").
'</a>';
1993 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"CorrectErrorBeforeRunningImport")).
'">'.$langs->trans(
"RunImportFile").
'</a>';
1996 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions")).
'">'.$langs->trans(
"RunSimulateImportFile").
'</a>';
1998 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions")).
'">'.$langs->trans(
"RunImportFile").
'</a>';
2008 if ($step == 6 && $datatoimport) {
2009 $max_execution_time_for_importexport = (empty($conf->global->IMPORT_MAX_EXECUTION_TIME) ? 300 : $conf->global->IMPORT_MAX_EXECUTION_TIME);
2010 $max_time = @ini_get(
"max_execution_time");
2011 if ($max_time && $max_time < $max_execution_time_for_importexport) {
2012 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.");
2013 @ini_set(
"max_execution_time", $max_execution_time_for_importexport);
2017 $list = $objmodelimport->listOfAvailableImportFormat($db);
2018 $importid =
GETPOST(
"importid",
'alphanohtml');
2022 $dir = DOL_DOCUMENT_ROOT.
"/core/modules/import/";
2023 $file =
"import_".$model.
".modules.php";
2024 $classname =
"Import".ucfirst($model);
2025 require_once $dir.$file;
2026 $obj =
new $classname($db, $datatoimport);
2027 if ($model ==
'csv') {
2028 $obj->separator = $separator_used;
2029 $obj->enclosure = $enclosure;
2033 $fieldssource = array();
2034 $result = $obj->import_open_file($conf->import->dir_temp.
'/'.$filetoimport, $langs);
2037 $arrayrecord = $obj->import_read_record();
2040 foreach ($arrayrecord as $key => $val) {
2041 $fieldssource[$i][
'example1'] =
dol_trunc($val[
'val'], 24);
2044 $obj->import_close_file();
2047 $nboflines = (!empty($_GET[
"nboflines"]) ? $_GET[
"nboflines"] :
dol_count_nb_of_line($conf->import->dir_temp.
'/'.$filetoimport));
2049 $param =
'&format='.$format.
'&datatoimport='.urlencode($datatoimport).
'&filetoimport='.urlencode($filetoimport).
'&nboflines='.urlencode($nboflines);
2050 if ($excludefirstline) {
2051 $param .=
'&excludefirstline='.urlencode($excludefirstline);
2054 $param .=
'&endatlinenb='.urlencode($endatlinenb);
2057 $param .=
'&separator='.urlencode($separator);
2060 $param .=
'&enclosure='.urlencode($enclosure);
2069 print
'<div class="underbanner clearboth"></div>';
2070 print
'<div class="fichecenter">';
2072 print
'<table width="100%" class="border">';
2075 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Module").
'</td>';
2077 $titleofmodule = $objimport->array_import_module[0][
'module']->getName();
2079 if (in_array($objimport->array_import_code[0], array(
'produit_supplierprices',
'produit_multiprice',
'produit_languages'))) {
2080 $titleofmodule = $langs->trans(
"ProductOrService");
2082 print $titleofmodule;
2086 print
'<tr><td>'.$langs->trans(
"DatasetToImport").
'</td>';
2088 $entity = preg_replace(
'/:.*$/',
'', $objimport->array_import_icon[0]);
2089 $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity);
2090 print
img_object($objimport->array_import_module[0][
'module']->getName(), $entityicon).
' ';
2091 print $objimport->array_import_label[0];
2097 print
load_fiche_titre($langs->trans(
"InformationOnSourceFile"),
'',
'file-export');
2099 print
'<div class="underbanner clearboth"></div>';
2100 print
'<div class="fichecenter">';
2101 print
'<table width="100%" class="border">';
2104 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"SourceFileFormat").
'</td>';
2106 $text = $objmodelimport->getDriverDescForKey($format);
2107 print
$form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text);
2111 if ($model ==
'csv') {
2112 print
'<tr><td>'.$langs->trans(
"CsvOptions").
'</td>';
2114 print $langs->trans(
"Separator").
' : ';
2115 print htmlentities($separator);
2116 print
' '.$langs->trans(
"Enclosure").
' : ';
2117 print htmlentities($enclosure);
2122 print
'<tr><td>'.$langs->trans(
"FileToImport").
'</td>';
2124 $modulepart =
'import';
2125 $relativepath =
GETPOST(
'filetoimport');
2126 print
'<a data-ajax="false" href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&file='.urlencode($relativepath).
'&step=4'.$param.
'" target="_blank" rel="noopener noreferrer">';
2127 print
img_mime($file,
'',
'pictofixedwidth');
2128 print $filetoimport;
2134 print $langs->trans(
"NbOfSourceLines");
2141 print $langs->trans(
"ImportFromLine");
2143 print
'<input type="text" size="4" name="excludefirstline" disabled="disabled" value="'.$excludefirstline.
'">';
2148 print $langs->trans(
"EndAtLineNb");
2150 print
'<input type="text" size="4" name="endatlinenb" disabled="disabled" value="'.$endatlinenb.
'">';
2158 print
'<b>'.$langs->trans(
"InformationOnTargetTables").
'</b>';
2159 print
'<div class="underbanner clearboth"></div>';
2160 print
'<div class="fichecenter">';
2161 print
'<table class="border centpercent">';
2164 print
'<tr><td width="25%">';
2165 print $langs->trans(
"TablesTarget");
2167 $listtables = array();
2168 foreach ($array_match_file_to_database as $code => $label) {
2170 if ($code > count($fieldssource)) {
2174 $alias = preg_replace(
'/(\..*)$/i',
'', $label);
2175 $listtables[$alias] = $objimport->array_import_tables[0][$alias];
2177 if (count($listtables)) {
2179 foreach ($listtables as $val) {
2198 print $langs->trans(
"Error");
2204 print $langs->trans(
"FieldsTarget").
'</td><td>';
2205 $listfields = array();
2207 $sort_array_match_file_to_database = $array_match_file_to_database;
2208 ksort($sort_array_match_file_to_database);
2210 foreach ($sort_array_match_file_to_database as $code => $label) {
2213 if ($code > count($fieldssource)) {
2217 $alias = preg_replace(
'/(\..*)$/i',
'', $label);
2218 $listfields[$i] = $langs->trans(
"Field").
' '.$code.
'->'.$label;
2220 print count($listfields) ? (join(
', ', $listfields)) : $langs->trans(
"Error");
2227 $arrayoferrors = array();
2228 $arrayofwarnings = array();
2229 $maxnboferrors = empty($conf->global->IMPORT_MAX_NB_OF_ERRORS) ? 50 : $conf->global->IMPORT_MAX_NB_OF_ERRORS;
2230 $maxnbofwarnings = empty($conf->global->IMPORT_MAX_NB_OF_WARNINGS) ? 50 : $conf->global->IMPORT_MAX_NB_OF_WARNINGS;
2242 $pathfile = $conf->import->dir_temp.
'/'.$filetoimport;
2243 $result = $obj->import_open_file($pathfile, $langs);
2245 global $tablewithentity_cache;
2246 $tablewithentity_cache = array();
2247 $sourcelinenb = 0; $endoffile = 0;
2249 while ($sourcelinenb < $nboflines && !$endoffile) {
2251 $arrayrecord = $obj->import_read_record();
2252 if ($arrayrecord ===
false) {
2253 $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');
2257 if ($excludefirstline && ($sourcelinenb < $excludefirstline)) {
2260 if ($endatlinenb && ($sourcelinenb > $endatlinenb)) {
2265 $result = $obj->import_insert($arrayrecord, $array_match_file_to_database, $objimport, count($fieldssource), $importid, $updatekeys);
2267 if (count($obj->errors)) {
2268 $arrayoferrors[$sourcelinenb] = $obj->errors;
2270 if (count($obj->warnings)) {
2271 $arrayofwarnings[$sourcelinenb] = $obj->warnings;
2273 if (!count($obj->errors) && !count($obj->warnings)) {
2278 $obj->import_close_file();
2280 print $langs->trans(
"ErrorFailedToOpenFile", $pathfile);
2283 if (count($arrayoferrors) > 0) {
2290 if (!empty($objimport->array_import_run_sql_after[0]) && is_array($objimport->array_import_run_sql_after[0])) {
2292 foreach ($objimport->array_import_run_sql_after[0] as $sqlafterimport) {
2294 $resqlafterimport = $db->query($sqlafterimport);
2295 if (!$resqlafterimport) {
2296 $arrayoferrors[
'none'][] = array(
'lib'=>$langs->trans(
"Error running final request: ".$sqlafterimport));
2314 print
'<div class="info">';
2315 print $langs->trans(
"NbOfLinesImported", $nbok).
'</b><br>';
2316 print $langs->trans(
"NbInsert", empty($obj->nbinsert) ? 0 : $obj->nbinsert).
'<br>';
2317 print $langs->trans(
"NbUpdate", empty($obj->nbupdate) ? 0 : $obj->nbupdate).
'<br>';
2319 print
'<div class="center">';
2320 print $langs->trans(
"FileWasImported", $importid).
'<br>';
2321 print
'<span class="opacitymedium">'.$langs->trans(
"YouCanUseImportIdToFindRecord", $importid).
'</span><br>';
2344 function show_elem($fieldssource, $pos, $key, $var, $nostyle =
'')
2346 global $conf, $langs;
2350 if ($key ==
'none') {
2352 print
"\n\n<!-- Box_no-key start-->\n";
2353 print
'<div class="box boximport" style="padding:0;">'.
"\n";
2354 print
'<table summary="boxtable_no-key" class="centpercent nobordernopadding">'.
"\n";
2356 print
"\n\n<!-- Box ".$pos.
" start -->\n";
2357 print
'<div class="box boximport" style="padding: 0;" id="boxto_'.$pos.
'">'.
"\n";
2359 print
'<table summary="boxtable'.$pos.
'" class="nobordernopadding centpercent tableimport">'.
"\n";
2362 if (($pos && $pos > count($fieldssource)) && (!isset($fieldssource[$pos][
"imported"]))) {
2372 } elseif ($key ==
'none') {
2373 print
'<tr style="height:'.$height.
'" class="trimport oddevenimport">';
2374 print
'<td class="nocellnopadding" width="16" style="font-weight: normal">';
2377 print
'<td style="font-weight: normal">';
2383 print
'<tr style="height:'.$height.
'" class="trimport oddevenimport">';
2384 print
'<td class="nocellnopadding" width="16" style="font-weight: normal">';
2387 print
img_picto($langs->trans(
"Column").
' '.
num2Alpha($pos - 1),
'file',
'class="pictofixedwith"');
2389 if (isset($fieldssource[$pos][
'imported']) && $fieldssource[$pos][
'imported'] ==
false) {
2390 print
'<td class="nowraponall boxtdunused" style="font-weight: normal">';
2392 print
'<td class="nowraponall tdoverflowmax500" style="font-weight: normal">';
2394 print $langs->trans(
"Column").
' '.
num2Alpha($pos - 1).
' (#'.$pos.
')';
2395 if (empty($fieldssource[$pos][
'example1'])) {
2396 $example = $fieldssource[$pos][
'label'];
2398 $example = $fieldssource[$pos][
'example1'];
2402 $example = utf8_encode($example);
2404 if (!empty($conf->dol_optimize_smallscreen)) {
2411 print
'<i class="opacitymedium">'.$example.
'</i>';
2420 print
"<!-- Box end -->\n\n";
2433 $i = count($fieldssource) + 1;
2436 foreach ($listofkey as $key => $val) {
2437 $maxkey = max($maxkey, $key);
2440 while ($i <= $maxkey) {
2441 if (empty($listofkey[$i])) {
2463 if ($position == count($array)) {
2464 $ret = $array + $insertArray;
2467 foreach ($array as $key => $value) {
2468 if ($position == $i++) {
2469 $ret += $insertArray;
2472 $ret[$key] = $value;
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
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.
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
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='')
Make control on an uploaded file from an GUI page and move it to final destination.
dol_count_nb_of_line($file)
Count number of lines in a file.
dol_dir_list($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.
dolExplodeIntoArray($string, $delimiter=';', $kv='=')
Split a string with 2 keys into key array.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tabs of a record.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by second index function, which produces ascending (default) or descending output...
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.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
img_error($titlealt='default')
Show error logo.
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.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
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)
import_prepare_head($param, $maxstep=0)
Function to return list of tabs for import pages.
getnewkey(&$fieldssource, &$listofkey)
Return not used field number.
arrayInsert($array, $position, $insertArray)
Return array with element inserted in it at position $position.
show_elem($fieldssource, $pos, $key, $var, $nostyle='')
Function to put the movable box of a source field.
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.