* Copyright (C) 2005-2009 Regis Houssin * Copyright (C) 2012 Christophe Battarel * Copyright (C) 2022 Charlene Benke * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * \file htdocs/imports/import.php * \ingroup import * \brief Pages of import Wizard */ require_once '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/imports/class/import.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/modules/import/modules_import.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/import.lib.php'; // Load translation files required by the page $langs->loadLangs(array('exports', 'compta', 'errors')); // Security check $result = restrictedArea($user, 'import'); // Map icons, array duplicated in export.php, was not synchronized, TODO put it somewhere only once $entitytoicon = array( 'invoice' => 'bill', 'invoice_line' => 'bill', 'order' => 'order', 'order_line' => 'order', 'propal' => 'propal', 'propal_line' => 'propal', 'intervention' => 'intervention', 'inter_line' => 'intervention', 'member' => 'user', 'member_type' => 'group', 'subscription' => 'payment', 'payment' => 'payment', 'tax' => 'bill', 'tax_type' => 'generic', 'other' => 'generic', 'account' => 'account', 'product' => 'product', 'virtualproduct'=>'product', 'subproduct' => 'product', 'product_supplier_ref' => 'product', 'stock' => 'stock', 'warehouse' => 'stock', 'batch' => 'stock', 'stockbatch' => 'stock', 'category' => 'category', 'shipment' => 'sending', 'shipment_line'=> 'sending', 'reception'=> 'sending', 'reception_line'=> 'sending', 'expensereport'=> 'trip', 'expensereport_line'=> 'trip', 'holiday' => 'holiday', 'contract_line' => 'contract', 'translation' => 'generic', 'bomm' => 'bom', 'bomline' => 'bom' ); // Translation code, array duplicated in export.php, was not synchronized, TODO put it somewhere only once $entitytolang = array( 'user' => 'User', 'company' => 'Company', 'contact' => 'Contact', 'invoice' => 'Bill', 'invoice_line' => 'InvoiceLine', 'order' => 'Order', 'order_line' => 'OrderLine', 'propal' => 'Proposal', 'propal_line' => 'ProposalLine', 'intervention' => 'Intervention', 'inter_line' => 'InterLine', 'member' => 'Member', 'member_type' => 'MemberType', 'subscription' => 'Subscription', 'tax' => 'SocialContribution', 'tax_type' => 'DictionarySocialContributions', 'account' => 'BankTransactions', 'payment' => 'Payment', 'product' => 'Product', 'virtualproduct' => 'AssociatedProducts', 'subproduct' => 'SubProduct', 'product_supplier_ref' => 'SupplierPrices', 'service' => 'Service', 'stock' => 'Stock', 'movement' => 'StockMovement', 'batch' => 'Batch', 'stockbatch' => 'StockDetailPerBatch', 'warehouse' => 'Warehouse', 'category' => 'Category', 'other' => 'Other', 'trip' => 'TripsAndExpenses', 'shipment' => 'Shipments', 'shipment_line'=> 'ShipmentLine', 'project' => 'Projects', 'projecttask' => 'Tasks', 'task_time' => 'TaskTimeSpent', 'action' => 'Event', 'expensereport'=> 'ExpenseReport', 'expensereport_line'=> 'ExpenseReportLine', 'holiday' => 'TitreRequestCP', 'contract' => 'Contract', 'contract_line'=> 'ContractLine', 'translation' => 'Translation', 'bom' => 'BOM', 'bomline' => 'BOMLine' ); $datatoimport = GETPOST('datatoimport'); $format = GETPOST('format'); $filetoimport = GETPOST('filetoimport'); $action = GETPOST('action', 'alpha'); $confirm = GETPOST('confirm', 'alpha'); $step = (GETPOST('step') ? GETPOST('step') : 1); $import_name = GETPOST('import_name'); $hexa = GETPOST('hexa'); $importmodelid = GETPOST('importmodelid', 'int'); $excludefirstline = (GETPOST('excludefirstline') ? GETPOST('excludefirstline') : 2); $endatlinenb = (GETPOST('endatlinenb') ? GETPOST('endatlinenb') : ''); $updatekeys = (GETPOST('updatekeys', 'array') ? GETPOST('updatekeys', 'array') : array()); $separator = (GETPOST('separator', 'alphanohtml') ? GETPOST('separator', 'alphanohtml', 3) : ''); $enclosure = (GETPOST('enclosure', 'nohtml') ? GETPOST('enclosure', 'nohtml') : '"'); // We must use 'nohtml' and not 'alphanohtml' because we must accept " $separator_used = str_replace('\t', "\t", $separator); $objimport = new Import($db); $objimport->load_arrays($user, ($step == 1 ? '' : $datatoimport)); $objmodelimport = new ModeleImports(); $form = new Form($db); $htmlother = new FormOther($db); $formfile = new FormFile($db); // Init $array_match_file_to_database from _SESSION if (empty($array_match_file_to_database)) { $serialized_array_match_file_to_database = isset($_SESSION["dol_array_match_file_to_database_select"]) ? $_SESSION["dol_array_match_file_to_database_select"] : ''; $array_match_file_to_database = array(); $fieldsarray = explode(',', $serialized_array_match_file_to_database); foreach ($fieldsarray as $elem) { $tabelem = explode('=', $elem, 2); $key = $tabelem[0]; $val = (isset($tabelem[1]) ? $tabelem[1] : ''); if ($key && $val) { $array_match_file_to_database[$key] = $val; } } } /* * Actions */ /* if ($action=='downfield' || $action=='upfield') { $pos=$array_match_file_to_database[$_GET["field"]]; if ($action=='downfield') $newpos=$pos+1; if ($action=='upfield') $newpos=$pos-1; // Recherche code avec qui switcher $newcode=""; foreach($array_match_file_to_database as $code=>$value) { if ($value == $newpos) { $newcode=$code; break; } } //print("Switch pos=$pos (code=".$_GET["field"].") and newpos=$newpos (code=$newcode)"); if ($newcode) // Si newcode trouve (protection contre resoumission de page) { $array_match_file_to_database[$_GET["field"]]=$newpos; $array_match_file_to_database[$newcode]=$pos; $_SESSION["dol_array_match_file_to_database"]=$serialized_array_match_file_to_database; } } */ // if ($action == 'builddoc') { // // Build import file // $result = $objimport->build_file($user, GETPOST('model', 'alpha'), $datatoimport, $array_match_file_to_database); // if ($result < 0) { // setEventMessages($objimport->error, $objimport->errors, 'errors'); // } else { // setEventMessages($langs->trans("FileSuccessfullyBuilt"), null, 'mesgs'); // } // } if ($action == 'deleteprof') { if (GETPOST("id", 'int')) { $objimport->fetch(GETPOST("id", 'int')); $result = $objimport->delete($user); } } // Save import config to database if ($action == 'add_import_model') { if ($import_name) { // Set save string $hexa = ''; foreach ($array_match_file_to_database as $key => $val) { if ($hexa) { $hexa .= ','; } $hexa .= $key.'='.$val; } $objimport->model_name = $import_name; $objimport->datatoimport = $datatoimport; $objimport->hexa = $hexa; $objimport->fk_user = (GETPOST('visibility', 'aZ09') == 'all' ? 0 : $user->id); $result = $objimport->create($user); if ($result >= 0) { setEventMessages($langs->trans("ImportModelSaved", $objimport->model_name), null, 'mesgs'); $import_name = ''; } else { $langs->load("errors"); if ($objimport->errno == 'DB_ERROR_RECORD_ALREADY_EXISTS') { setEventMessages($langs->trans("ErrorImportDuplicateProfil"), null, 'errors'); } else { setEventMessages($objimport->error, null, 'errors'); } } } else { setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("ImportModelName")), null, 'errors'); } } if ($step == 3 && $datatoimport) { if (GETPOST('sendit') && !empty($conf->global->MAIN_UPLOAD_DOC)) { dol_mkdir($conf->import->dir_temp); $nowyearmonth = dol_print_date(dol_now(), '%Y%m%d%H%M%S'); $fullpath = $conf->import->dir_temp."/".$nowyearmonth.'-'.$_FILES['userfile']['name']; if (dol_move_uploaded_file($_FILES['userfile']['tmp_name'], $fullpath, 1) > 0) { dol_syslog("File ".$fullpath." was added for import"); } else { $langs->load("errors"); setEventMessages($langs->trans("ErrorFailedToSaveFile"), null, 'errors'); } } // Delete file if ($action == 'confirm_deletefile' && $confirm == 'yes') { $langs->load("other"); $param = '&datatoimport='.urlencode($datatoimport).'&format='.urlencode($format); if ($excludefirstline) { $param .= '&excludefirstline='.urlencode($excludefirstline); } if ($endatlinenb) { $param .= '&endatlinenb='.urlencode($endatlinenb); } $file = $conf->import->dir_temp.'/'.GETPOST('urlfile'); // Do not use urldecode here ($_GET and $_REQUEST are already decoded by PHP). $ret = dol_delete_file($file); if ($ret) { setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs'); } else { setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors'); } Header('Location: '.$_SERVER["PHP_SELF"].'?step='.$step.$param); exit; } } if ($step == 4 && $action == 'select_model') { // Reinit match arrays $_SESSION["dol_array_match_file_to_database"] = ''; $serialized_array_match_file_to_database = ''; $array_match_file_to_database = array(); // Load model from $importmodelid and set $array_match_file_to_database // and $_SESSION["dol_array_match_file_to_database"] $result = $objimport->fetch($importmodelid); if ($result > 0) { $serialized_array_match_file_to_database = $objimport->hexa; $fieldsarray = explode(',', $serialized_array_match_file_to_database); foreach ($fieldsarray as $elem) { $tabelem = explode('=', $elem); $key = $tabelem[0]; $val = $tabelem[1]; if ($key && $val) { $array_match_file_to_database[$key] = $val; } } $_SESSION["dol_array_match_file_to_database"] = $serialized_array_match_file_to_database; $_SESSION['dol_array_match_file_to_database_select'] = $_SESSION["dol_array_match_file_to_database"]; } } if ($action == 'saveselectorder') { // Enregistrement de la position des champs $serialized_array_match_file_to_database = ''; dol_syslog("selectorder=".GETPOST('selectorder'), LOG_DEBUG); $selectorder = explode(",", GETPOST('selectorder')); $fieldtarget = $fieldstarget = $objimport->array_import_fields[0]; foreach ($selectorder as $key => $code) { $serialized_array_match_file_to_database .= $key.'='.$code; $serialized_array_match_file_to_database .= ','; } $serialized_array_match_file_to_database = substr($serialized_array_match_file_to_database, 0, -1); dol_syslog('dol_array_match_file_to_database_select='.$serialized_array_match_file_to_database); $_SESSION["dol_array_match_file_to_database_select"] = $serialized_array_match_file_to_database; echo "{}"; exit(0); } /* * View */ $help_url = 'EN:Module_Imports_En|FR:Module_Imports|ES:Módulo_Importaciones'; // STEP 1: Page to select dataset to import if ($step == 1 || !$datatoimport) { // Clean saved file-database matching $serialized_array_match_file_to_database = ''; $array_match_file_to_database = array(); $_SESSION["dol_array_match_file_to_database"] = ''; $_SESSION["dol_array_match_file_to_database_select"] = ''; $param = ''; if ($excludefirstline) { $param .= '&excludefirstline='.urlencode($excludefirstline); } if ($endatlinenb) { $param .= '&endatlinenb='.urlencode($endatlinenb); } if ($separator) { $param .= '&separator='.urlencode($separator); } if ($enclosure) { $param .= '&enclosure='.urlencode($enclosure); } llxHeader('', $langs->trans("NewImport"), $help_url); $head = import_prepare_head($param, 1); print dol_get_fiche_head($head, 'step1', '', -1); print '
'.$langs->trans("SelectImportDataSet").'

'; // Affiche les modules d'imports print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table print ''; print ''; print ''; print ''; print ''; print ''; if (count($objimport->array_import_module)) { $sortedarrayofmodules = dol_sort_array($objimport->array_import_module, 'position_of_profile', 'asc', 0, 0, 1); foreach ($sortedarrayofmodules as $key => $value) { //var_dump($key.' '.$value['position_of_profile'].' '.$value['import_code'].' '.$objimport->array_import_module[$key]['module']->getName().' '.$objimport->array_import_code[$key]); print ''; } } else { print ''; } print '
'.$langs->trans("Module").''.$langs->trans("ImportableDatas").' 
'; $titleofmodule = $objimport->array_import_module[$key]['module']->getName(); // Special cas for import common to module/services if (in_array($objimport->array_import_code[$key], array('produit_supplierprices', 'produit_multiprice', 'produit_languages'))) { $titleofmodule = $langs->trans("ProductOrService"); } print $titleofmodule; print ''; $entity = preg_replace('/:.*$/', '', $objimport->array_import_icon[$key]); $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity); print img_object($objimport->array_import_module[$key]['module']->getName(), $entityicon).' '; print $objimport->array_import_label[$key]; print ''; if ($objimport->array_import_perms[$key]) { print ''.img_picto($langs->trans("NewImport"), 'next', 'class="fa-15"').''; } else { print $langs->trans("NotEnoughPermissions"); } print '
'.$langs->trans("NoImportableData").'
'; print '
'; print dol_get_fiche_end(); } // STEP 2: Page to select input format file if ($step == 2 && $datatoimport) { $param = '&datatoimport='.urlencode($datatoimport); if ($excludefirstline) { $param .= '&excludefirstline='.urlencode($excludefirstline); } if ($endatlinenb) { $param .= '&endatlinenb='.urlencode($endatlinenb); } if ($separator) { $param .= '&separator='.urlencode($separator); } if ($enclosure) { $param .= '&enclosure='.urlencode($enclosure); } llxHeader('', $langs->trans("NewImport"), $help_url); $head = import_prepare_head($param, 2); print dol_get_fiche_head($head, 'step2', '', -2); print '
'; print '
'; print ''; // Module print ''; print ''; // Dataset to import print ''; print ''; print '
'.$langs->trans("Module").''; $titleofmodule = $objimport->array_import_module[0]['module']->getName(); // Special cas for import common to module/services if (in_array($objimport->array_import_code[0], array('produit_supplierprices', 'produit_multiprice', 'produit_languages'))) { $titleofmodule = $langs->trans("ProductOrService"); } print $titleofmodule; print '
'.$langs->trans("DatasetToImport").''; $entity = preg_replace('/:.*$/', '', $objimport->array_import_icon[0]); $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity); print img_object($objimport->array_import_module[0]['module']->getName(), $entityicon).' '; print $objimport->array_import_label[0]; print '
'; print '
'; print dol_get_fiche_end(); print '
'; print ''; print '
'; print ''; $s = $langs->trans("ChooseFormatOfFileToImport", '{s1}'); $s = str_replace('{s1}', img_picto('', 'next'), $s); print $s; print '

'; print '
'; print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table print ''; $filetoimport = ''; // Add format informations and link to download example print ''; $list = $objmodelimport->liste_modeles($db); foreach ($list as $key) { print ''; print ''; $text = $objmodelimport->getDriverDescForKey($key); print ''; print ''; // Action button print ''; print ''; } print '
'; print $langs->trans("FileMustHaveOneOfFollowingFormat"); print '
'.img_picto_common($key, $objmodelimport->getPictoForKey($key)).''.$form->textwithpicto($objmodelimport->getDriverLabelForKey($key), $text).''; $filename = $langs->trans("ExampleOfImportFile").'_'.$datatoimport.'.'.$key; print ''; print img_picto('', 'download', 'class="paddingright opacitymedium"'); print $langs->trans("DownloadEmptyExampleShort"); print ''; print $form->textwithpicto('', $langs->trans("DownloadEmptyExample").'.
'.$langs->trans("StarAreMandatory")); print '
'; print ''.img_picto($langs->trans("SelectFormat"), 'next', 'class="fa-15"').''; print '
'; print '
'; print '
'; } // STEP 3: Page to select file if ($step == 3 && $datatoimport) { $param = '&datatoimport='.urlencode($datatoimport).'&format='.urlencode($format); if ($excludefirstline) { $param .= '&excludefirstline='.urlencode($excludefirstline); } if ($endatlinenb) { $param .= '&endatlinenb='.urlencode($endatlinenb); } if ($separator) { $param .= '&separator='.urlencode($separator); } if ($enclosure) { $param .= '&enclosure='.urlencode($enclosure); } $list = $objmodelimport->liste_modeles($db); llxHeader('', $langs->trans("NewImport"), $help_url); $head = import_prepare_head($param, 3); print dol_get_fiche_head($head, 'step3', '', -2); /* * Confirm delete file */ if ($action == 'delete') { print $form->formconfirm($_SERVER["PHP_SELF"].'?urlfile='.urlencode(GETPOST('urlfile')).'&step=3'.$param, $langs->trans('DeleteFile'), $langs->trans('ConfirmDeleteFile'), 'confirm_deletefile', '', 0, 1); } print '
'; print '
'; print ''; // Module print ''; print ''; // Lot de donnees a importer print ''; print ''; print '
'.$langs->trans("Module").''; $titleofmodule = $objimport->array_import_module[0]['module']->getName(); // Special cas for import common to module/services if (in_array($objimport->array_import_code[0], array('produit_supplierprices', 'produit_multiprice', 'produit_languages'))) { $titleofmodule = $langs->trans("ProductOrService"); } print $titleofmodule; print '
'.$langs->trans("DatasetToImport").''; $entity = preg_replace('/:.*$/', '', $objimport->array_import_icon[0]); $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity); print img_object($objimport->array_import_module[0]['module']->getName(), $entityicon).' '; print $objimport->array_import_label[0]; print '
'; print '
'; print load_fiche_titre($langs->trans("InformationOnSourceFile"), '', 'file-export'); print '
'; print '
'; print ''; // Source file format print ''; print ''; print '
'.$langs->trans("SourceFileFormat").''; $text = $objmodelimport->getDriverDescForKey($format); print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text); print ''; $filename = $langs->trans("ExampleOfImportFile").'_'.$datatoimport.'.'.$format; print ''; print img_picto('', 'download', 'class="paddingright opacitymedium"'); print $langs->trans("DownloadEmptyExampleShort"); print ''; print $form->textwithpicto('', $langs->trans("DownloadEmptyExample").'.
'.$langs->trans("StarAreMandatory")); print '
'; print '
'; print dol_get_fiche_end(); if ($format == 'xlsx' && !class_exists('XMLWriter')) { $langs->load("install"); print info_admin($langs->trans("ErrorPHPDoesNotSupport", 'php-xml'), 0, 0, 1, 'error'); } print '

'; print '
'; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; $s = $langs->trans("ChooseFileToImport", '{s1}'); $s = str_replace('{s1}', img_picto('', 'next'), $s); print $s; print '

'; $filetoimport = ''; // Input file name box print '
'; $maxfilesizearray = getMaxFileSizeArray(); $maxmin = $maxfilesizearray['maxmin']; if ($maxmin > 0) { print ''; // MAX_FILE_SIZE must precede the field type=file } print '     '; $out = (empty($conf->global->MAIN_UPLOAD_DOC) ? ' disabled' : ''); print ''; $out = ''; if (!empty($conf->global->MAIN_UPLOAD_DOC)) { $max = $conf->global->MAIN_UPLOAD_DOC; // In Kb $maxphp = @ini_get('upload_max_filesize'); // In unknown if (preg_match('/k$/i', $maxphp)) { $maxphp = (int) substr($maxphp, 0, -1) * 1; } if (preg_match('/m$/i', $maxphp)) { $maxphp = (int) substr($maxphp, 0, -1) * 1024; } if (preg_match('/g$/i', $maxphp)) { $maxphp = (int) substr($maxphp, 0, -1) * 1024 * 1024; } if (preg_match('/t$/i', $maxphp)) { $maxphp = (int) substr($maxphp, 0, -1) * 1024 * 1024 * 1024; } $maxphp2 = @ini_get('post_max_size'); // In unknown if (preg_match('/k$/i', $maxphp2)) { $maxphp2 = (int) substr($maxphp2, 0, -1) * 1; } if (preg_match('/m$/i', $maxphp2)) { $maxphp2 = (int) substr($maxphp2, 0, -1) * 1024; } if (preg_match('/g$/i', $maxphp2)) { $maxphp2 = (int) substr($maxphp2, 0, -1) * 1024 * 1024; } if (preg_match('/t$/i', $maxphp2)) { $maxphp2 = (int) substr($maxphp2, 0, -1) * 1024 * 1024 * 1024; } // Now $max and $maxphp and $maxphp2 are in Kb $maxmin = $max; $maxphptoshow = $maxphptoshowparam = ''; if ($maxphp > 0) { $maxmin = min($max, $maxphp); $maxphptoshow = $maxphp; $maxphptoshowparam = 'upload_max_filesize'; } if ($maxphp2 > 0) { $maxmin = min($max, $maxphp2); if ($maxphp2 < $maxphp) { $maxphptoshow = $maxphp2; $maxphptoshowparam = 'post_max_size'; } } $langs->load('other'); $out .= ' '; $out .= info_admin($langs->trans("ThisLimitIsDefinedInSetup", $max, $maxphptoshow), 1); } else { $out .= ' ('.$langs->trans("UploadDisabled").')'; } print $out; print '
'; // Search available imports $filearray = dol_dir_list($conf->import->dir_temp, 'files', 0, '', '', 'name', SORT_DESC); if (count($filearray) > 0) { print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table print ''; $dir = $conf->import->dir_temp; // Search available files to import $i = 0; foreach ($filearray as $key => $val) { $file = $val['name']; // readdir return value in ISO and we want UTF8 in memory if (!utf8_check($file)) { $file = utf8_encode($file); } if (preg_match('/^\./', $file)) { continue; } $modulepart = 'import'; $urlsource = $_SERVER["PHP_SELF"].'?step='.$step.$param.'&filetoimport='.urlencode($filetoimport); $relativepath = $file; print ''; print ''; // Affiche taille fichier print ''; // Affiche date fichier print ''; // Del button print ''; // Action button print ''; print ''; } print '
'; print img_mime($file, '', 'pictofixedwidth'); print ''; print $file; print ''; print ''.dol_print_size(dol_filesize($dir.'/'.$file)).''.dol_print_date(dol_filemtime($dir.'/'.$file), 'dayhour').''.img_delete().''; print ''.img_picto($langs->trans("NewImport"), 'next', 'class="fa-15"').''; print '
'; print '
'; } print '
'; } // STEP 4: Page to make matching between source file and database fields if ($step == 4 && $datatoimport) { //var_dump($_SESSION["dol_array_match_file_to_database_select"]); $serialized_array_match_file_to_database = isset($_SESSION["dol_array_match_file_to_database_select"]) ? $_SESSION["dol_array_match_file_to_database_select"] : ''; $fieldsarray = explode(',', $serialized_array_match_file_to_database); $array_match_file_to_database = array(); // Same than $fieldsarray but with mapped value only (col1 => 's.fielda', col2 => 's.fieldb'...) foreach ($fieldsarray as $elem) { $tabelem = explode('=', $elem, 2); $key = $tabelem[0]; $val = (isset($tabelem[1]) ? $tabelem[1] : ''); if ($key && $val) { $array_match_file_to_database[$key] = $val; } } //var_dump($serialized_array_match_file_to_database); //var_dump($fieldsarray); //var_dump($array_match_file_to_database); $model = $format; $list = $objmodelimport->liste_modeles($db); if (empty($separator)) { $separator = (empty($conf->global->IMPORT_CSV_SEPARATOR_TO_USE) ? ',' : $conf->global->IMPORT_CSV_SEPARATOR_TO_USE); } // The separator has been defined, if it is a unique char, we check it is valid by reading the source file if ($model == 'csv' && strlen($separator) == 1 && !GETPOSTISSET('separator')) { // Count the char in first line of file. $fh = fopen($conf->import->dir_temp.'/'.$filetoimport, 'r'); if ($fh) { $sline = fgets($fh, 1000000); fclose($fh); $nboccurence = substr_count($sline, $separator); $nboccurencea = substr_count($sline, ','); $nboccurenceb = substr_count($sline, ';'); //var_dump($nboccurence." ".$nboccurencea." ".$nboccurenceb);exit; if ($nboccurence == 0) { if ($nboccurencea > 2) { $separator = ','; } elseif ($nboccurenceb > 2) { $separator = ';'; } } } } // The value to use $separator_used = str_replace('\t', "\t", $separator); // Create classe to use for import $dir = DOL_DOCUMENT_ROOT."/core/modules/import/"; $file = "import_".$model.".modules.php"; $classname = "Import".ucfirst($model); require_once $dir.$file; $obj = new $classname($db, $datatoimport); if ($model == 'csv') { $obj->separator = $separator_used; $obj->enclosure = $enclosure; } if ($model == 'xlsx') { if (!preg_match('/\.xlsx$/i', $filetoimport)) { $langs->load("errors"); $param = '&datatoimport='.$datatoimport.'&format='.$format; setEventMessages($langs->trans("ErrorFileMustHaveFormat", $model), null, 'errors'); header("Location: ".$_SERVER["PHP_SELF"].'?step=3'.$param.'&filetoimport='.urlencode($relativepath)); exit; } } if (GETPOST('update')) { $array_match_file_to_database = array(); } // Load the source fields from input file into variable $arrayrecord $fieldssource = array(); $result = $obj->import_open_file($conf->import->dir_temp.'/'.$filetoimport, $langs); if ($result >= 0) { // Read first line $arrayrecord = $obj->import_read_record(); // Create array $fieldssource starting with 1 with values found of first line. $i = 1; foreach ($arrayrecord as $key => $val) { if ($val["type"] != -1) { $fieldssource[$i]['example1'] = dol_trunc($val['val'], 128); $i++; } else { $fieldssource[$i]['example1'] = $langs->trans('Empty'); $i++; } } $obj->import_close_file(); } // Load targets fields in database $fieldstarget = $objimport->array_import_fields[0]; $minpos = min(count($fieldssource), count($fieldstarget)); //var_dump($array_match_file_to_database); $initialloadofstep4 = false; if (empty($_SESSION['dol_array_match_file_to_database_select'])) { $initialloadofstep4 = true; } // Is it a first time in page (if yes, we must initialize array_match_file_to_database) if (count($array_match_file_to_database) == 0) { // This is first input in screen, we need to define // $array_match_file_to_database // $serialized_array_match_file_to_database // $_SESSION["dol_array_match_file_to_database"] $pos = 1; $num = count($fieldssource); while ($pos <= $num) { if ($num >= 1 && $pos <= $num) { $posbis = 1; foreach ($fieldstarget as $key => $val) { if ($posbis < $pos) { $posbis++; continue; } // We found the key of targets that is at position pos $array_match_file_to_database[$pos] = $key; break; } } $pos++; } } $array_match_database_to_file = array_flip($array_match_file_to_database); //var_dump($array_match_database_to_file); //var_dump($_SESSION["dol_array_match_file_to_database_select"]); $fieldstarget_tmp = array(); $arraykeysfieldtarget = array_keys($fieldstarget); $position = 0; foreach ($fieldstarget as $key => $label) { $isrequired = preg_match('/\*$/', $label); if (!empty($isrequired)) { $newlabel = substr($label, 0, -1); $fieldstarget_tmp[$key] = array("label"=>$newlabel, "required"=>true); } else { $fieldstarget_tmp[$key] = array("label"=>$label, "required"=>false); } if (!empty($array_match_database_to_file[$key])) { $fieldstarget_tmp[$key]["imported"] = true; $fieldstarget_tmp[$key]["position"] = $array_match_database_to_file[$key]-1; $keytoswap = $key; while (!empty($array_match_database_to_file[$keytoswap])) { if ($position+1 > $array_match_database_to_file[$keytoswap]) { $keytoswapwith = $array_match_database_to_file[$keytoswap]-1; $tmp = [$keytoswap=>$fieldstarget_tmp[$keytoswap]]; unset($fieldstarget_tmp[$keytoswap]); $fieldstarget_tmp = arrayInsert($fieldstarget_tmp, $keytoswapwith, $tmp); $keytoswapwith = $arraykeysfieldtarget[$array_match_database_to_file[$keytoswap]-1]; $tmp = $fieldstarget_tmp[$keytoswapwith]; unset($fieldstarget_tmp[$keytoswapwith]); $fieldstarget_tmp[$keytoswapwith] = $tmp; $keytoswap = $keytoswapwith; } else { break; } } } else { $fieldstarget_tmp[$key]["imported"] = false; } $position++; } $fieldstarget = $fieldstarget_tmp; //print $serialized_array_match_file_to_database; //print $_SESSION["dol_array_match_file_to_database"]; //print $_SESSION["dol_array_match_file_to_database_select"]; //var_dump($array_match_file_to_database);exit; // Now $array_match_file_to_database contains fieldnb(1,2,3...)=>fielddatabase(key in $array_match_file_to_database) $param = '&format='.$format.'&datatoimport='.urlencode($datatoimport).'&filetoimport='.urlencode($filetoimport); if ($excludefirstline) { $param .= '&excludefirstline='.urlencode($excludefirstline); } if ($endatlinenb) { $param .= '&endatlinenb='.urlencode($endatlinenb); } if ($separator) { $param .= '&separator='.urlencode($separator); } if ($enclosure) { $param .= '&enclosure='.urlencode($enclosure); } llxHeader('', $langs->trans("NewImport"), $help_url); $head = import_prepare_head($param, 4); print dol_get_fiche_head($head, 'step4', '', -2); print '
'; print '
'; print ''; // Module print ''; print ''; // Lot de donnees a importer print ''; print ''; print '
'.$langs->trans("Module").''; $titleofmodule = $objimport->array_import_module[0]['module']->getName(); // Special cas for import common to module/services if (in_array($objimport->array_import_code[0], array('produit_supplierprices', 'produit_multiprice', 'produit_languages'))) { $titleofmodule = $langs->trans("ProductOrService"); } print $titleofmodule; print '
'.$langs->trans("DatasetToImport").''; $entity = preg_replace('/:.*$/', '', $objimport->array_import_icon[0]); $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity); print img_object($objimport->array_import_module[0]['module']->getName(), $entityicon).' '; print $objimport->array_import_label[0]; print '
'; print '
'; print load_fiche_titre($langs->trans("InformationOnSourceFile"), '', 'file-export'); print '
'; print '
'; print ''; // Source file format print ''; print ''; // Separator and enclosure if ($model == 'csv') { print ''; print ''; } // File to import print ''; print ''; print '
'.$langs->trans("SourceFileFormat").''; $text = $objmodelimport->getDriverDescForKey($format); print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text); print '
'.$langs->trans("CsvOptions").''; print '
'; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print $langs->trans("Separator").' : '; print ''; print '    '.$langs->trans("Enclosure").' : '; print ' '; print ''; print '
'; print '
'.$langs->trans("FileToImport").''; $modulepart = 'import'; $relativepath = GETPOST('filetoimport'); print ''; print img_mime($file, '', 'pictofixedwidth'); print $filetoimport; print img_picto($langs->trans("Download"), 'download', 'class="paddingleft opacitymedium"'); print ''; print '
'; print '
'; print dol_get_fiche_end(); print '
'."\n"; // List of source fields print ''."\n"; print '
'; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; // Import profile to use/load print '
'; print ''; $s = $langs->trans("SelectImportFieldsSource", '{s1}'); $s = str_replace('{s1}', img_picto('', 'grip_title', '', false, 0, 0, '', '', 0), $s); print $s; print ' '; $htmlother->select_import_model($importmodelid, 'importmodelid', $datatoimport, 1, $user->id); print ''; print '
'; print '
'; // Title of array with fields print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table print ''; print ''; print ''; print ''; print ''; //var_dump($array_match_file_to_database); print ''; // Lines for remark print ''; print ''; print '
'.$langs->trans("FieldsInSourceFile").''.$langs->trans("FieldsInTargetDatabase").'
'; $fieldsplaced = array(); $valforsourcefieldnb = array(); $listofkeys = array(); foreach ($array_match_file_to_database as $key => $val) { $listofkeys[$key] = 1; } print "\n\n"; print '
'."\n"; // List of source fields $var = false; $lefti = 1; foreach ($fieldssource as $key => $val) { show_elem($fieldssource, $key, $val, $var); // key is field number in source file $listofkeys[$key] = 1; $fieldsplaced[$key] = 1; $valforsourcefieldnb[$lefti] = $key; $lefti++; /*if ($lefti > count($fieldstarget)) { break; // Other fields are in the not imported area }*/ } //var_dump($valforsourcefieldnb); print "
\n"; print "\n"; print '
'; // Set the list of all possible target fields in Dolibarr. $optionsall = array(); foreach ($fieldstarget as $code => $line) { //var_dump($line); $tmparray = explode('|', $line["label"]); // If label of field is several translation keys separated with | $labeltoshow = ''; foreach ($tmparray as $tmpkey => $tmpval) { $labeltoshow .= ($labeltoshow ? ' '.$langs->trans('or').' ' : '').$langs->transnoentities($tmpval); } $optionsall[$code] = array('labelkey'=>$line['label'], 'labelkeyarray'=>$tmparray, 'label'=>$labeltoshow, 'required'=>(empty($line["required"]) ? 0 : 1), 'position'=>!empty($line['position']) ? $line['position'] : 0); // TODO Get type from a new array into module descriptor. //$picto = 'email'; $picto = ''; if ($picto) { $optionsall[$code]['picto'] = $picto; } } // $optionsall is an array of all possible target fields. key=>array('label'=>..., 'xxx') $height = '32px'; //needs px for css height attribute below $i = 0; $mandatoryfieldshavesource = true; //var_dump($fieldstarget); //var_dump($optionsall); //exit; //var_dump($_SESSION['dol_array_match_file_to_database']); //var_dump($_SESSION['dol_array_match_file_to_database_select']); //exit; //var_dump($optionsall); //var_dump($fieldssource); //var_dump($fieldstarget); $modetoautofillmapping = 'session'; // Use setup in session if ($initialloadofstep4) { $modetoautofillmapping = 'guess'; } //var_dump($modetoautofillmapping); print ''; foreach ($fieldssource as $code => $line) { // $fieldssource is an array code=column num, line=content on first line for column in source file. /*if ($i == $minpos) { break; }*/ print ''; $entity = (!empty($objimport->array_import_entities[0][$code]) ? $objimport->array_import_entities[0][$code] : $objimport->array_import_icon[0]); $entityicon = !empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity; // $entityicon must string name of picto of the field like 'project', 'company', 'contact', 'modulename', ... $entitylang = $entitytolang[$entity] ? $entitytolang[$entity] : $objimport->array_import_label[0]; // $entitylang must be a translation key to describe object the field is related to, like 'Company', 'Contact', 'MyModyle', ... print ''; print ''; // Tooltip at end of line print ''; print ''; $i++; } print '
=> '; //var_dump($_SESSION['dol_array_match_file_to_database_select']); //var_dump($_SESSION['dol_array_match_file_to_database']); $selectforline = ''; $selectforline .= ''; $selectforline .= ajax_combobox('selectorderimport_'.($i+1)); print $selectforline; print ''; // Source field info $htmltext = ''.$langs->trans("FieldSource").'
'; $filecolumntoshow = num2Alpha($i); $htmltext .= $langs->trans("DataComeFromFileFieldNb", $filecolumntoshow).'
'; print $form->textwithpicto('', $htmltext); print '
'; print '
'.$langs->trans("Note").'
'; print '
'; if (!empty($conf->use_javascript_ajax)) { print ''."\n"; } /* * Action bar */ print '
'; if (count($array_match_file_to_database)) { if ($mandatoryfieldshavesource) { print ''.$langs->trans("NextStep").''; } else { print ''.$langs->trans("NextStep").''; } } print '
'; // Area for profils import if (count($array_match_file_to_database)) { print '
'."\n"; print ''."\n"; print '
'.$langs->trans("SaveImportModel").'
'; print '
'; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table print ''; print ''; print ''; print ''; print ''; print ''; $nameofimportprofile = str_replace(' ', '-', $langs->trans("ImportProfile").' '.$titleofmodule.' '.dol_print_date(dol_now('gmt'), 'dayxcard')); if (GETPOST('import_name')) { // If we have submited a form, we take value used fot the update try $nameofimportprofile = $import_name; } print ''; print ''; print ''; print ''; // List of existing import profils $sql = "SELECT rowid, label, fk_user, entity"; $sql .= " FROM ".MAIN_DB_PREFIX."import_model"; $sql .= " WHERE type = '".$db->escape($datatoimport)."'"; if (empty($conf->global->EXPORTS_SHARE_MODELS)) { // EXPORTS_SHARE_MODELS means all templates are visible, whatever is owner. $sql .= " AND fk_user IN (0, ".((int) $user->id).")"; } $sql .= " ORDER BY rowid"; $resql = $db->query($sql); if ($resql) { $num = $db->num_rows($resql); $tmpuser = new user($db); $i = 0; while ($i < $num) { $obj = $db->fetch_object($resql); print ''; print ''; print ''; $i++; } } else { dol_print_error($db); } print '
'.$langs->trans("ImportModelName").''.$langs->trans("Visibility").'
'; $arrayvisibility = array('private'=>$langs->trans("Private"), 'all'=>$langs->trans("Everybody")); print $form->selectarray('visibility', $arrayvisibility, 'private'); print ''; print ''; print '
'; print $obj->label; print ''; if (empty($obj->fk_user)) { print $langs->trans("Everybody"); } else { $tmpuser->fetch($obj->fk_user); print $tmpuser->getNomUrl(-1); } print ''; print 'rowid.'&filetoimport='.urlencode($filetoimport).'">'; print img_delete(); print ''; print '
'; print '
'; print '
'; } } // STEP 5: Summary of choices and launch simulation if ($step == 5 && $datatoimport) { $max_execution_time_for_importexport = (empty($conf->global->IMPORT_MAX_EXECUTION_TIME) ? 300 : $conf->global->IMPORT_MAX_EXECUTION_TIME); // 5mn if not defined $max_time = @ini_get("max_execution_time"); if ($max_time && $max_time < $max_execution_time_for_importexport) { 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."); @ini_set("max_execution_time", $max_execution_time_for_importexport); // This work only if safe mode is off. also web servers has timeout of 300 } $model = $format; $list = $objmodelimport->liste_modeles($db); // Create classe to use for import $dir = DOL_DOCUMENT_ROOT."/core/modules/import/"; $file = "import_".$model.".modules.php"; $classname = "Import".ucfirst($model); require_once $dir.$file; $obj = new $classname($db, $datatoimport); if ($model == 'csv') { $obj->separator = $separator_used; $obj->enclosure = $enclosure; } // Load source fields in input file $fieldssource = array(); $result = $obj->import_open_file($conf->import->dir_temp.'/'.$filetoimport, $langs); if ($result >= 0) { // Read first line $arrayrecord = $obj->import_read_record(); // Put into array fieldssource starting with 1. $i = 1; foreach ($arrayrecord as $key => $val) { $fieldssource[$i]['example1'] = dol_trunc($val['val'], 24); $i++; } $obj->import_close_file(); } $nboflines = $obj->import_get_nb_of_lines($conf->import->dir_temp.'/'.$filetoimport); $param = '&leftmenu=import&format='.urlencode($format).'&datatoimport='.urlencode($datatoimport).'&filetoimport='.urlencode($filetoimport).'&nboflines='.urlencode($nboflines).'&separator='.urlencode($separator).'&enclosure='.urlencode($enclosure); $param2 = $param; // $param2 = $param without excludefirstline and endatlinenb if ($excludefirstline) { $param .= '&excludefirstline='.urlencode($excludefirstline); } if ($endatlinenb) { $param .= '&endatlinenb='.urlencode($endatlinenb); } if (!empty($updatekeys)) { $param .= '&updatekeys[]='.implode('&updatekeys[]=', $updatekeys); } llxHeader('', $langs->trans("NewImport"), $help_url); $head = import_prepare_head($param, 5); print '
'; print ''; print ''; // step 5 print ''; // step 5 print dol_get_fiche_head($head, 'step5', '', -2); print '
'; print '
'; print ''; // Module print ''; print ''; // Lot de donnees a importer print ''; print ''; print '
'.$langs->trans("Module").''; $titleofmodule = $objimport->array_import_module[0]['module']->getName(); // Special cas for import common to module/services if (in_array($objimport->array_import_code[0], array('produit_supplierprices', 'produit_multiprice', 'produit_languages'))) { $titleofmodule = $langs->trans("ProductOrService"); } print $titleofmodule; print '
'.$langs->trans("DatasetToImport").''; $entity = preg_replace('/:.*$/', '', $objimport->array_import_icon[0]); $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity); print img_object($objimport->array_import_module[0]['module']->getName(), $entityicon).' '; print $objimport->array_import_label[0]; print '
'; print '
'; print load_fiche_titre($langs->trans("InformationOnSourceFile"), '', 'file-export'); print '
'; print '
'; print ''; // Source file format print ''; print ''; // Separator and enclosure if ($model == 'csv') { print ''; print ''; } // File to import print ''; print ''; // Total lines in source file print ''; // Range of lines to import print ''; // Keys for data UPDATE (not INSERT of new data) print ''; print '
'.$langs->trans("SourceFileFormat").''; $text = $objmodelimport->getDriverDescForKey($format); print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text); print '
'.$langs->trans("CsvOptions").''; print $langs->trans("Separator").' : '.dol_escape_htmltag($separator); print '    '.$langs->trans("Enclosure").' : '.dol_escape_htmltag($enclosure); print '
'.$langs->trans("FileToImport").''; $modulepart = 'import'; $relativepath = GETPOST('filetoimport'); print ''; print img_mime($file, '', 'pictofixedwidth'); print $filetoimport; print img_picto($langs->trans("Download"), 'download', 'class="paddingleft opacitymedium"'); print ''; print '
'; print $langs->trans("NbOfSourceLines"); print ''; print $nboflines; print '
'; print $langs->trans("ImportFromToLine"); print ''; if ($action == 'launchsimu') { print ''; print ''; } else { print ''; print $form->textwithpicto("", $langs->trans("SetThisValueTo2ToExcludeFirstLine")); } print ' - '; if ($action == 'launchsimu') { print ''; print ''; } else { print ''; print $form->textwithpicto("", $langs->trans("KeepEmptyToGoToEndOfFile")); } if ($action == 'launchsimu') { print '   '.$langs->trans("Modify").''; } if ($excludefirstline == 2) { print $form->textwithpicto("", $langs->trans("WarningFirstImportedLine", $excludefirstline), 1, 'warning', "warningexcludefirstline"); print ''; } print '
'; print $form->textwithpicto($langs->trans("KeysToUseForUpdates"), $langs->trans("SelectPrimaryColumnsForUpdateAttempt")); print ''; if ($action == 'launchsimu') { if (count($updatekeys)) { print $form->multiselectarray('updatekeysbis', $objimport->array_import_updatekeys[0], $updatekeys, 0, 0, '', 1, '80%', 'disabled'); } else { print ''.$langs->trans("NoUpdateAttempt").'   -'; } foreach ($updatekeys as $val) { print ''; } print '   '.$langs->trans("Modify").''; } else { if (is_array($objimport->array_import_updatekeys[0]) && count($objimport->array_import_updatekeys[0])) { //TODO dropdown UL is created inside nested SPANS print $form->multiselectarray('updatekeys', $objimport->array_import_updatekeys[0], $updatekeys, 0, 0, '', 1, '80%'); //print $form->textwithpicto("", $langs->trans("SelectPrimaryColumnsForUpdateAttempt")); } else { print ''.$langs->trans("UpdateNotYetSupportedForThisImport").''; } } /*echo '
';
	print_r($objimport->array_import_updatekeys);
	echo '
';*/ print '
'; print '
'; print load_fiche_titre($langs->trans("InformationOnTargetTables"), '', 'file-import'); print '
'; print '
'; print ''; // Tables imported print ''; // Fields imported print ''; print '
'; print $langs->trans("TablesTarget"); print ''; $listtables = array(); $sort_array_match_file_to_database = $array_match_file_to_database; foreach ($array_match_file_to_database as $code => $label) { //var_dump($fieldssource); if ($code > count($fieldssource)) { continue; } //print $code.'-'.$label; $alias = preg_replace('/(\..*)$/i', '', $label); $listtables[$alias] = $objimport->array_import_tables[0][$alias]; } if (count($listtables)) { $newval = ''; //ksort($listtables); foreach ($listtables as $val) { if ($newval) { print ', '; } $newval = $val; // Link to Dolibarr wiki pages /*$helppagename='EN:Table_'.$newval; if ($helppagename && empty($conf->global->MAIN_HELP_DISABLELINK)) { // Get helpbaseurl, helppage and mode from helppagename and langs $arrayres=getHelpParamFor($helppagename,$langs); $helpbaseurl=$arrayres['helpbaseurl']; $helppage=$arrayres['helppage']; $mode=$arrayres['mode']; $newval.=' '.img_picto($langs->trans($mode == 'wiki' ? 'GoToWikiHelpPage': 'GoToHelpPage'),DOL_URL_ROOT.'/theme/common/helpdoc.png','',1).''; }*/ print $newval; } } else { print $langs->trans("Error"); } print '
'; print $langs->trans("FieldsTarget").''; $listfields = array(); $i = 0; //print 'fieldsource='.$fieldssource; $sort_array_match_file_to_database = $array_match_file_to_database; ksort($sort_array_match_file_to_database); //var_dump($sort_array_match_file_to_database); foreach ($sort_array_match_file_to_database as $code => $label) { $i++; //var_dump($fieldssource); if ($code > count($fieldssource)) { continue; } //print $code.'-'.$label; $alias = preg_replace('/(\..*)$/i', '', $label); $listfields[$i] = ''.$langs->trans("Column").' '.num2Alpha($code - 1).' -> '.$label.''; } print count($listfields) ? (join(', ', $listfields)) : $langs->trans("Error"); print '
'; print '
'; print dol_get_fiche_end(); if ($action != 'launchsimu') { // Show import id print '
'; print $langs->trans("NowClickToTestTheImport", $langs->transnoentitiesnoconv("RunSimulateImportFile")).'
'; print '
'; // Actions print '
'; if ($user->hasRight('import', 'run')) { print ''; } else { print ''.$langs->trans("RunSimulateImportFile").''; } print '
'; } else { // Launch import $arrayoferrors = array(); $arrayofwarnings = array(); $maxnboferrors = empty($conf->global->IMPORT_MAX_NB_OF_ERRORS) ? 50 : $conf->global->IMPORT_MAX_NB_OF_ERRORS; $maxnbofwarnings = empty($conf->global->IMPORT_MAX_NB_OF_WARNINGS) ? 50 : $conf->global->IMPORT_MAX_NB_OF_WARNINGS; $nboferrors = 0; $nbofwarnings = 0; $importid = dol_print_date(dol_now(), '%Y%m%d%H%M%S'); //var_dump($array_match_file_to_database); $db->begin(); // Open input file $nbok = 0; $pathfile = $conf->import->dir_temp.'/'.$filetoimport; $result = $obj->import_open_file($pathfile, $langs); if ($result > 0) { global $tablewithentity_cache; $tablewithentity_cache = array(); $sourcelinenb = 0; $endoffile = 0; // Loop on each input file record while (($sourcelinenb < $nboflines) && !$endoffile) { $sourcelinenb++; // Read line and store it into $arrayrecord //dol_syslog("line ".$sourcelinenb.' - '.$nboflines.' - '.$excludefirstline.' - '.$endatlinenb); $arrayrecord = $obj->import_read_record(); if ($arrayrecord === false) { $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'); $endoffile++; continue; } if ($excludefirstline && ($sourcelinenb < $excludefirstline)) { continue; } if ($endatlinenb && ($sourcelinenb > $endatlinenb)) { break; } // Run import $result = $obj->import_insert($arrayrecord, $array_match_file_to_database, $objimport, count($fieldssource), $importid, $updatekeys); if (count($obj->errors)) { $arrayoferrors[$sourcelinenb] = $obj->errors; } if (count($obj->warnings)) { $arrayofwarnings[$sourcelinenb] = $obj->warnings; } if (!count($obj->errors) && !count($obj->warnings)) { $nbok++; } } // Close file $obj->import_close_file(); } else { print $langs->trans("ErrorFailedToOpenFile", $pathfile); } $error = 0; // Run the sql after import if defined //var_dump($objimport->array_import_run_sql_after[0]); if (!empty($objimport->array_import_run_sql_after[0]) && is_array($objimport->array_import_run_sql_after[0])) { $i = 0; foreach ($objimport->array_import_run_sql_after[0] as $sqlafterimport) { $i++; $resqlafterimport = $db->query($sqlafterimport); if (!$resqlafterimport) { $arrayoferrors['none'][] = array('lib'=>$langs->trans("Error running final request: ".$sqlafterimport)); $error++; } } } $db->rollback(); // We force rollback because this was just a simulation. // Show OK if (!count($arrayoferrors) && !count($arrayofwarnings)) { print '
'; print '
'; print '
'.$langs->trans("ResultOfSimulationNoError").'
'; print $langs->trans("NbInsertSim", empty($obj->nbinsert) ? 0 : $obj->nbinsert).'
'; print $langs->trans("NbUpdateSim", empty($obj->nbupdate) ? 0 : $obj->nbupdate).'
'; print '
'; print '
'; } else { print '
'; print '
'; print $langs->trans("NbOfLinesOK", $nbok).'...
'; print '
'; print '
'; } // Show Errors //var_dump($arrayoferrors); if (count($arrayoferrors)) { print img_error().' '.$langs->trans("ErrorsOnXLines", count($arrayoferrors)).'
'; print '
'; foreach ($arrayoferrors as $key => $val) { $nboferrors++; if ($nboferrors > $maxnboferrors) { print $langs->trans("TooMuchErrors", (count($arrayoferrors) - $nboferrors))."
"; break; } print '* '.$langs->trans("Line").' '.dol_escape_htmltag($key).'
'; foreach ($val as $i => $err) { print '     > '.dol_escape_htmltag($err['lib']).'
'; } } print '
'; print '
'; } // Show Warnings //var_dump($arrayoferrors); if (count($arrayofwarnings)) { print img_warning().' '.$langs->trans("WarningsOnXLines", count($arrayofwarnings)).'
'; print '
'; foreach ($arrayofwarnings as $key => $val) { $nbofwarnings++; if ($nbofwarnings > $maxnbofwarnings) { print $langs->trans("TooMuchWarnings", (count($arrayofwarnings) - $nbofwarnings))."
"; break; } print ' * '.$langs->trans("Line").' '.dol_escape_htmltag($key).'
'; foreach ($val as $i => $err) { print '     > '.dol_escape_htmltag($err['lib']).'
'; } } print '
'; print '
'; } // Show import id $importid = dol_print_date(dol_now(), '%Y%m%d%H%M%S'); print '
'; print ''.$langs->trans("NowClickToRunTheImport", $langs->transnoentitiesnoconv("RunImportFile")).'
'; /*if (empty($nboferrors)) { print $langs->trans("DataLoadedWithId", $importid).'
'; }*/ print '
'; print '
'; // Actions print '
'; if ($user->hasRight('import', 'run')) { if (empty($nboferrors)) { print ''.$langs->trans("RunImportFile").''; } else { //print ''; print ''.$langs->trans("RunImportFile").''; } } else { print ''.$langs->trans("RunSimulateImportFile").''; print ''.$langs->trans("RunImportFile").''; } print '
'; } print '
'; } // STEP 6: Real import if ($step == 6 && $datatoimport) { $max_execution_time_for_importexport = (empty($conf->global->IMPORT_MAX_EXECUTION_TIME) ? 300 : $conf->global->IMPORT_MAX_EXECUTION_TIME); // 5mn if not defined $max_time = @ini_get("max_execution_time"); if ($max_time && $max_time < $max_execution_time_for_importexport) { 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."); @ini_set("max_execution_time", $max_execution_time_for_importexport); // This work only if safe mode is off. also web servers has timeout of 300 } $model = $format; $list = $objmodelimport->liste_modeles($db); $importid = GETPOST("importid", 'alphanohtml'); // Create classe to use for import $dir = DOL_DOCUMENT_ROOT."/core/modules/import/"; $file = "import_".$model.".modules.php"; $classname = "Import".ucfirst($model); require_once $dir.$file; $obj = new $classname($db, $datatoimport); if ($model == 'csv') { $obj->separator = $separator_used; $obj->enclosure = $enclosure; } // Load source fields in input file $fieldssource = array(); $result = $obj->import_open_file($conf->import->dir_temp.'/'.$filetoimport, $langs); if ($result >= 0) { // Read first line $arrayrecord = $obj->import_read_record(); // Put into array fieldssource starting with 1. $i = 1; foreach ($arrayrecord as $key => $val) { $fieldssource[$i]['example1'] = dol_trunc($val['val'], 24); $i++; } $obj->import_close_file(); } $nboflines = (!empty($_GET["nboflines"]) ? $_GET["nboflines"] : dol_count_nb_of_line($conf->import->dir_temp.'/'.$filetoimport)); $param = '&format='.$format.'&datatoimport='.urlencode($datatoimport).'&filetoimport='.urlencode($filetoimport).'&nboflines='.urlencode($nboflines); if ($excludefirstline) { $param .= '&excludefirstline='.urlencode($excludefirstline); } if ($endatlinenb) { $param .= '&endatlinenb='.urlencode($endatlinenb); } if ($separator) { $param .= '&separator='.urlencode($separator); } if ($enclosure) { $param .= '&enclosure='.urlencode($enclosure); } llxHeader('', $langs->trans("NewImport"), $help_url); $head = import_prepare_head($param, 6); print dol_get_fiche_head($head, 'step6', '', -1); print '
'; print '
'; print ''; // Module print ''; print ''; // Lot de donnees a importer print ''; print ''; print '
'.$langs->trans("Module").''; $titleofmodule = $objimport->array_import_module[0]['module']->getName(); // Special cas for import common to module/services if (in_array($objimport->array_import_code[0], array('produit_supplierprices', 'produit_multiprice', 'produit_languages'))) { $titleofmodule = $langs->trans("ProductOrService"); } print $titleofmodule; print '
'.$langs->trans("DatasetToImport").''; $entity = preg_replace('/:.*$/', '', $objimport->array_import_icon[0]); $entityicon = strtolower(!empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity); print img_object($objimport->array_import_module[0]['module']->getName(), $entityicon).' '; print $objimport->array_import_label[0]; print '
'; print '
'; print load_fiche_titre($langs->trans("InformationOnSourceFile"), '', 'file-export'); print '
'; print '
'; print ''; // Source file format print ''; print ''; // Separator and enclosure if ($model == 'csv') { print ''; print ''; } // File to import print ''; print ''; // Nb of fields print ''; // Do not import first lines print ''; // Do not import end lines print ''; print '
'.$langs->trans("SourceFileFormat").''; $text = $objmodelimport->getDriverDescForKey($format); print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format), $text); print '
'.$langs->trans("CsvOptions").''; print $langs->trans("Separator").' : '; print htmlentities($separator); print '    '.$langs->trans("Enclosure").' : '; print htmlentities($enclosure); print '
'.$langs->trans("FileToImport").''; $modulepart = 'import'; $relativepath = GETPOST('filetoimport'); print ''; print img_mime($file, '', 'pictofixedwidth'); print $filetoimport; print ''; print '
'; print $langs->trans("NbOfSourceLines"); print ''; print $nboflines; print '
'; print $langs->trans("ImportFromLine"); print ''; print ''; print '
'; print $langs->trans("EndAtLineNb"); print ''; print ''; print '
'; print '
'; print '
'; print ''.$langs->trans("InformationOnTargetTables").''; print '
'; print '
'; print ''; // Tables imported print ''; // Fields imported print ''; print '
'; print $langs->trans("TablesTarget"); print ''; $listtables = array(); foreach ($array_match_file_to_database as $code => $label) { //var_dump($fieldssource); if ($code > count($fieldssource)) { continue; } //print $code.'-'.$label; $alias = preg_replace('/(\..*)$/i', '', $label); $listtables[$alias] = $objimport->array_import_tables[0][$alias]; } if (count($listtables)) { $newval = ''; foreach ($listtables as $val) { if ($newval) { print ', '; } $newval = $val; // Link to Dolibarr wiki pages /*$helppagename='EN:Table_'.$newval; if ($helppagename && empty($conf->global->MAIN_HELP_DISABLELINK)) { // Get helpbaseurl, helppage and mode from helppagename and langs $arrayres=getHelpParamFor($helppagename,$langs); $helpbaseurl=$arrayres['helpbaseurl']; $helppage=$arrayres['helppage']; $mode=$arrayres['mode']; $newval.=' '.img_picto($langs->trans($mode == 'wiki' ? 'GoToWikiHelpPage': 'GoToHelpPage'),DOL_URL_ROOT.'/theme/common/helpdoc.png','',1).''; }*/ print $newval; } } else { print $langs->trans("Error"); } print '
'; print $langs->trans("FieldsTarget").''; $listfields = array(); $i = 0; $sort_array_match_file_to_database = $array_match_file_to_database; ksort($sort_array_match_file_to_database); //var_dump($sort_array_match_file_to_database); foreach ($sort_array_match_file_to_database as $code => $label) { $i++; //var_dump($fieldssource); if ($code > count($fieldssource)) { continue; } //print $code.'-'.$label; $alias = preg_replace('/(\..*)$/i', '', $label); $listfields[$i] = $langs->trans("Field").' '.$code.'->'.$label; } print count($listfields) ? (join(', ', $listfields)) : $langs->trans("Error"); print '
'; print '
'; // Launch import $arrayoferrors = array(); $arrayofwarnings = array(); $maxnboferrors = empty($conf->global->IMPORT_MAX_NB_OF_ERRORS) ? 50 : $conf->global->IMPORT_MAX_NB_OF_ERRORS; $maxnbofwarnings = empty($conf->global->IMPORT_MAX_NB_OF_WARNINGS) ? 50 : $conf->global->IMPORT_MAX_NB_OF_WARNINGS; $nboferrors = 0; $nbofwarnings = 0; $importid = dol_print_date(dol_now(), '%Y%m%d%H%M%S'); //var_dump($array_match_file_to_database); $db->begin(); // Open input file $nbok = 0; $pathfile = $conf->import->dir_temp.'/'.$filetoimport; $result = $obj->import_open_file($pathfile, $langs); if ($result > 0) { global $tablewithentity_cache; $tablewithentity_cache = array(); $sourcelinenb = 0; $endoffile = 0; while ($sourcelinenb < $nboflines && !$endoffile) { $sourcelinenb++; $arrayrecord = $obj->import_read_record(); if ($arrayrecord === false) { $arrayofwarnings[$sourcelinenb][0] = array('lib'=>'File has '.$nboflines.' lines. However we reach 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'); $endoffile++; continue; } if ($excludefirstline && ($sourcelinenb < $excludefirstline)) { continue; } if ($endatlinenb && ($sourcelinenb > $endatlinenb)) { break; } // Run import $result = $obj->import_insert($arrayrecord, $array_match_file_to_database, $objimport, count($fieldssource), $importid, $updatekeys); if (count($obj->errors)) { $arrayoferrors[$sourcelinenb] = $obj->errors; } if (count($obj->warnings)) { $arrayofwarnings[$sourcelinenb] = $obj->warnings; } if (!count($obj->errors) && !count($obj->warnings)) { $nbok++; } } // Close file $obj->import_close_file(); } else { print $langs->trans("ErrorFailedToOpenFile", $pathfile); } if (count($arrayoferrors) > 0) { $db->rollback(); // We force rollback because this was errors. } else { $error = 0; // Run the sql after import if defined //var_dump($objimport->array_import_run_sql_after[0]); if (!empty($objimport->array_import_run_sql_after[0]) && is_array($objimport->array_import_run_sql_after[0])) { $i = 0; foreach ($objimport->array_import_run_sql_after[0] as $sqlafterimport) { $i++; $resqlafterimport = $db->query($sqlafterimport); if (!$resqlafterimport) { $arrayoferrors['none'][] = array('lib'=>$langs->trans("Error running final request: ".$sqlafterimport)); $error++; } } } if (!$error) { $db->commit(); // We can commit if no errors. } else { $db->rollback(); } } print dol_get_fiche_end(); // Show result print '
'; print '
'; print $langs->trans("NbOfLinesImported", $nbok).'
'; print $langs->trans("NbInsert", empty($obj->nbinsert) ? 0 : $obj->nbinsert).'
'; print $langs->trans("NbUpdate", empty($obj->nbupdate) ? 0 : $obj->nbupdate).'
'; print '
'; print '
'; print $langs->trans("FileWasImported", $importid).'
'; print ''.$langs->trans("YouCanUseImportIdToFindRecord", $importid).'
'; print '
'; } print '
'; // End of page llxFooter(); $db->close(); /** * Function to put the movable box of a source field * * @param array $fieldssource List of source fields * @param int $pos Pos * @param string $key Key * @param boolean $var Line style (odd or not). No more used. * @param int $nostyle Hide style * @return void */ function show_elem($fieldssource, $pos, $key, $var, $nostyle = '') { global $conf, $langs; $height = '32px'; if ($key == 'none') { //stop multiple duplicate ids with no number print "\n\n\n"; print '
'."\n"; print ''."\n"; } else { print "\n\n\n"; print '
'."\n"; print '
'."\n"; } if (($pos && $pos > count($fieldssource)) && (!isset($fieldssource[$pos]["imported"]))) { // No fields /* print ''; print ''; print ''; print ''; */ } elseif ($key == 'none') { // Empty line print ''; print ''; print ''; print ''; } else { // Print field of source file print ''; print ''; if (isset($fieldssource[$pos]['imported']) && $fieldssource[$pos]['imported'] == false) { print ''; print ''; } print "
'; print ''; print $langs->trans("NoFields"); print '
'; print ' '; print ''; print ' '; print '
'; // The image must have the class 'boxhandle' beause it's value used in DOM draggable objects to define the area used to catch the full object //print img_picto($langs->trans("MoveField", $pos), 'grip_title', 'class="boxhandle" style="cursor:move;"'); print img_picto($langs->trans("Column").' '.num2Alpha($pos - 1), 'file', 'class="pictofixedwith"'); print ''; } else { print ''; } print $langs->trans("Column").' '.num2Alpha($pos - 1).' (#'.$pos.')'; if (empty($fieldssource[$pos]['example1'])) { $example = $fieldssource[$pos]['label']; } else { $example = $fieldssource[$pos]['example1']; } if ($example) { if (!utf8_check($example)) { $example = utf8_encode($example); } if (!empty($conf->dol_optimize_smallscreen)) { //print '
'; print ' - '; } else { print ' - '; } print ''.dol_escape_htmltag($example).''; } print '
\n"; print "
\n"; print "\n\n"; } /** * Return not used field number * * @param array $fieldssource Array of field source * @param array $listofkey Array of keys * @return integer */ function getnewkey(&$fieldssource, &$listofkey) { $i = count($fieldssource) + 1; // Max number of key $maxkey = 0; foreach ($listofkey as $key => $val) { $maxkey = max($maxkey, $key); } // Found next empty key while ($i <= $maxkey) { if (empty($listofkey[$i])) { break; } else { $i++; } } $listofkey[$i] = 1; return $i; } /** * Return array with element inserted in it at position $position * * @param array $array Array of field source * @param mixed $position key of postion to insert to * @param array $insertArray Array to insert * @return array */ function arrayInsert($array, $position, $insertArray) { $ret = []; if ($position == count($array)) { $ret = $array + $insertArray; } else { $i = 0; foreach ($array as $key => $value) { if ($position == $i++) { $ret += $insertArray; } $ret[$key] = $value; } } return $ret; }