From 9215394965cdc2353ef4d14860ba985853370b6b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 Jan 2012 00:16:02 +0100 Subject: [PATCH] New: Import wizard can import contacts. New: A module can add import description for import wizard, even for tables with foreign keys. --- ChangeLog | 2 + htdocs/contact/class/contact.class.php | 4 + htdocs/contact/info.php | 3 +- htdocs/core/class/cpays.class.php | 317 +++++++++++++++++ htdocs/core/class/ctypent.class.php | 322 ++++++++++++++++++ .../modules/import/import_csv.modules.php | 161 ++++++--- htdocs/core/modules/modSociete.class.php | 29 +- htdocs/imports/class/import.class.php | 20 +- htdocs/imports/import.php | 35 +- htdocs/langs/en_US/companies.lang | 1 + htdocs/langs/en_US/errors.lang | 3 +- htdocs/langs/en_US/exports.lang | 4 + htdocs/langs/fr_FR/companies.lang | 1 + htdocs/langs/fr_FR/errors.lang | 1 + htdocs/langs/fr_FR/exports.lang | 4 + htdocs/societe/info.php | 5 +- 16 files changed, 829 insertions(+), 83 deletions(-) create mode 100644 htdocs/core/class/cpays.class.php create mode 100644 htdocs/core/class/ctypent.class.php diff --git a/ChangeLog b/ChangeLog index 24a47982ad0..b0bb143cd02 100644 --- a/ChangeLog +++ b/ChangeLog @@ -41,6 +41,7 @@ For users: - New: [ task #181 ] Hide password of click2dial in user card - New: Chart are faster to build - New: Value of data into charts are visible on mouse hover. +- New: Import wizard can import contacts. - Fix: Can use POS module with several concurrent users. For developers: @@ -55,6 +56,7 @@ For developers: - New: Add "canvas" feature to overwrite page of thirdparty, contact, product with yours. - New: Removed artichow deprecated libraries. - New: A page can force reload of css style sheet +- New: A module can add import description for import wizard, even for tables with foreign keys. - Qual: Add a lot of more PHPUnit tests. - Qual: Data structure for supplier prices is simpler. - Qual: Removed no more used external libraries. diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index 0a9dae0c131..b62172c9ffe 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -80,6 +80,7 @@ class Contact extends CommonObject var $user_id; var $user_login; + var $import_key; var $oldcopy; // To contains a clone of this when we need to save old properties of object @@ -468,6 +469,7 @@ class Contact extends CommonObject $sql.= " c.birthday,"; $sql.= " c.poste, c.phone, c.phone_perso, c.phone_mobile, c.fax, c.email, c.jabberid,"; $sql.= " c.priv, c.note, c.default_lang, c.canvas,"; + $sql.= " c.import_key,"; $sql.= " p.libelle as country, p.code as country_code,"; $sql.= " d.nom as departement, d.code_departement as departement_code,"; $sql.= " u.rowid as user_id, u.login as user_login,"; @@ -540,6 +542,8 @@ class Contact extends CommonObject $this->user_login = $obj->user_login; $this->canvas = $obj->canvas; + $this->import_key = $obj->import_key; + // Recherche le user Dolibarr lie a ce contact $sql = "SELECT u.rowid "; $sql .= " FROM ".MAIN_DB_PREFIX."user as u"; diff --git a/htdocs/contact/info.php b/htdocs/contact/info.php index 097c007ff49..4365f895247 100644 --- a/htdocs/contact/info.php +++ b/htdocs/contact/info.php @@ -46,6 +46,7 @@ llxHeader('',$langs->trans("ContactsAddresses"),'EN:Module_Third_Parties|FR:Modu $contact = new Contact($db); $contact->fetch($_GET["id"], $user); +$contact->info($_GET["id"]); $head = contact_prepare_head($contact); @@ -54,7 +55,6 @@ dol_fiche_head($head, 'info', $langs->trans("ContactsAddresses"), 0, 'contact'); print '
'; -$contact->info($_GET["id"]); print '
'; dol_print_object_info($contact); @@ -64,5 +64,4 @@ print ""; llxFooter(); $db->close(); - ?> diff --git a/htdocs/core/class/cpays.class.php b/htdocs/core/class/cpays.class.php new file mode 100644 index 00000000000..ec3283d73ce --- /dev/null +++ b/htdocs/core/class/cpays.class.php @@ -0,0 +1,317 @@ + + * + * 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 2 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/core/class/cpays.class.php + * \ingroup core + * \brief This file is a CRUD class file (Create/Read/Update/Delete) for c_pays dictionnary + * Initialy built by build_class_from_table on 2012-01-17 22:03 + */ + +// Put here all includes required by your class file +//require_once(DOL_DOCUMENT_ROOT."/core/class/commonobject.class.php"); +//require_once(DOL_DOCUMENT_ROOT."/societe/class/societe.class.php"); +//require_once(DOL_DOCUMENT_ROOT."/product/class/product.class.php"); + + +/** + * \class Cpays + * \brief Class to manage dictionnary Countries (used by imports) + */ +class Cpays // extends CommonObject +{ + var $db; //!< To store db handler + var $error; //!< To return error code (or message) + var $errors=array(); //!< To return several error codes (or messages) + //var $element='cpays'; //!< Id that identify managed objects + //var $table_element='cpays'; //!< Name of table without prefix where object is stored + + var $id; + var $code; + var $code_iso; + var $libelle; + var $active; + + + + + /** + * Constructor + * + * @param DoliDb $db Database handler + */ + function Cpays($db) + { + $this->db = $db; + return 1; + } + + + /** + * Create object into database + * + * @param User $user User that create + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, Id of created object if OK + */ + function create($user, $notrigger=0) + { + global $conf, $langs; + $error=0; + + // Clean parameters + if (isset($this->code)) $this->code=trim($this->code); + if (isset($this->code_iso)) $this->code_iso=trim($this->code_iso); + if (isset($this->libelle)) $this->libelle=trim($this->libelle); + if (isset($this->active)) $this->active=trim($this->active); + + // Check parameters + // Put here code to add control on parameters values + + // Insert request + $sql = "INSERT INTO ".MAIN_DB_PREFIX."c_pays("; + $sql.= "rowid,"; + $sql.= "code,"; + $sql.= "code_iso,"; + $sql.= "libelle,"; + $sql.= "active"; + $sql.= ") VALUES ("; + $sql.= " ".(! isset($this->rowid)?'NULL':"'".$this->rowid."'").","; + $sql.= " ".(! isset($this->code)?'NULL':"'".$this->db->escape($this->code)."'").","; + $sql.= " ".(! isset($this->code_iso)?'NULL':"'".$this->db->escape($this->code_iso)."'").","; + $sql.= " ".(! isset($this->libelle)?'NULL':"'".$this->db->escape($this->libelle)."'").","; + $sql.= " ".(! isset($this->active)?'NULL':"'".$this->active."'").""; + $sql.= ")"; + + $this->db->begin(); + + dol_syslog(get_class($this)."::create sql=".$sql, LOG_DEBUG); + $resql=$this->db->query($sql); + if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); } + + if (! $error) + { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."c_pays"); + + if (! $notrigger) + { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action call a trigger. + + //// Call triggers + //include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"); + //$interface=new Interfaces($this->db); + //$result=$interface->run_triggers('MYOBJECT_CREATE',$this,$user,$langs,$conf); + //if ($result < 0) { $error++; $this->errors=$interface->errors; } + //// End call triggers + } + } + + // Commit or rollback + if ($error) + { + foreach($this->errors as $errmsg) + { + dol_syslog(get_class($this)."::create ".$errmsg, LOG_ERR); + $this->error.=($this->error?', '.$errmsg:$errmsg); + } + $this->db->rollback(); + return -1*$error; + } + else + { + $this->db->commit(); + return $this->id; + } + } + + + /** + * Load object in memory from database + * + * @param int $id Id object + * @param string $code Code + * @return int <0 if KO, >0 if OK + */ + function fetch($id,$code='') + { + global $langs; + $sql = "SELECT"; + $sql.= " t.rowid,"; + $sql.= " t.code,"; + $sql.= " t.code_iso,"; + $sql.= " t.libelle,"; + $sql.= " t.active"; + $sql.= " FROM ".MAIN_DB_PREFIX."c_pays as t"; + if ($id) $sql.= " WHERE t.rowid = ".$id; + elseif ($code) $sql.= " WHERE t.code = '".$this->db->escape($code)."'"; + + dol_syslog(get_class($this)."::fetch sql=".$sql, LOG_DEBUG); + $resql=$this->db->query($sql); + if ($resql) + { + if ($this->db->num_rows($resql)) + { + $obj = $this->db->fetch_object($resql); + + $this->id = $obj->rowid; + $this->code = $obj->code; + $this->code_iso = $obj->code_iso; + $this->libelle = $obj->libelle; + $this->active = $obj->active; + } + $this->db->free($resql); + + return 1; + } + else + { + $this->error="Error ".$this->db->lasterror(); + dol_syslog(get_class($this)."::fetch ".$this->error, LOG_ERR); + return -1; + } + } + + + /** + * Update object into database + * + * @param User $user User that modify + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + function update($user=0, $notrigger=0) + { + global $conf, $langs; + $error=0; + + // Clean parameters + if (isset($this->code)) $this->code=trim($this->code); + if (isset($this->code_iso)) $this->code_iso=trim($this->code_iso); + if (isset($this->libelle)) $this->libelle=trim($this->libelle); + if (isset($this->active)) $this->active=trim($this->active); + + + // Check parameters + // Put here code to add control on parameters values + + // Update request + $sql = "UPDATE ".MAIN_DB_PREFIX."c_pays SET"; + $sql.= " code=".(isset($this->code)?"'".$this->db->escape($this->code)."'":"null").","; + $sql.= " code_iso=".(isset($this->code_iso)?"'".$this->db->escape($this->code_iso)."'":"null").","; + $sql.= " libelle=".(isset($this->libelle)?"'".$this->db->escape($this->libelle)."'":"null").","; + $sql.= " active=".(isset($this->active)?$this->active:"null").""; + $sql.= " WHERE rowid=".$this->id; + + $this->db->begin(); + + dol_syslog(get_class($this)."::update sql=".$sql, LOG_DEBUG); + $resql = $this->db->query($sql); + if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); } + + if (! $error) + { + if (! $notrigger) + { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action call a trigger. + + //// Call triggers + //include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"); + //$interface=new Interfaces($this->db); + //$result=$interface->run_triggers('MYOBJECT_MODIFY',$this,$user,$langs,$conf); + //if ($result < 0) { $error++; $this->errors=$interface->errors; } + //// End call triggers + } + } + + // Commit or rollback + if ($error) + { + foreach($this->errors as $errmsg) + { + dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR); + $this->error.=($this->error?', '.$errmsg:$errmsg); + } + $this->db->rollback(); + return -1*$error; + } + else + { + $this->db->commit(); + return 1; + } + } + + + /** + * Delete object in database + * + * @param User $user User that delete + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + function delete($user, $notrigger=0) + { + global $conf, $langs; + $error=0; + + $sql = "DELETE FROM ".MAIN_DB_PREFIX."c_pays"; + $sql.= " WHERE rowid=".$this->id; + + $this->db->begin(); + + dol_syslog(get_class($this)."::delete sql=".$sql); + $resql = $this->db->query($sql); + if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); } + + if (! $error) + { + if (! $notrigger) + { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action call a trigger. + + //// Call triggers + //include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"); + //$interface=new Interfaces($this->db); + //$result=$interface->run_triggers('MYOBJECT_DELETE',$this,$user,$langs,$conf); + //if ($result < 0) { $error++; $this->errors=$interface->errors; } + //// End call triggers + } + } + + // Commit or rollback + if ($error) + { + foreach($this->errors as $errmsg) + { + dol_syslog(get_class($this)."::delete ".$errmsg, LOG_ERR); + $this->error.=($this->error?', '.$errmsg:$errmsg); + } + $this->db->rollback(); + return -1*$error; + } + else + { + $this->db->commit(); + return 1; + } + } + +} +?> diff --git a/htdocs/core/class/ctypent.class.php b/htdocs/core/class/ctypent.class.php new file mode 100644 index 00000000000..66c4bbefc03 --- /dev/null +++ b/htdocs/core/class/ctypent.class.php @@ -0,0 +1,322 @@ + + * + * 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 2 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/core/class/ctypent.class.php + * \ingroup core + * \brief This file is CRUD class file (Create/Read/Update/Delete) for c_typent dictionnary + * Initialy built by build_class_from_table on 2012-01-17 16:24 + */ + + +/** + * \class Ctypent + * \brief Class of dictionnary type of thirdparty (used by imports) + */ +class Ctypent // extends CommonObject +{ + var $db; //!< To store db handler + var $error; //!< To return error code (or message) + var $errors=array(); //!< To return several error codes (or messages) + //var $element='ctypent'; //!< Id that identify managed objects + //var $table_element='ctypent'; //!< Name of table without prefix where object is stored + + var $id; + var $code; + var $libelle; + var $active; + var $module; + + + + + /** + * Constructor + * + * @param DoliDb $db Database handler + */ + function Ctypent($db) + { + $this->db = $db; + return 1; + } + + + /** + * Create object into database + * + * @param User $user User that create + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, Id of created object if OK + */ + function create($user, $notrigger=0) + { + global $conf, $langs; + $error=0; + + // Clean parameters + + if (isset($this->id)) $this->id=trim($this->id); + if (isset($this->code)) $this->code=trim($this->code); + if (isset($this->libelle)) $this->libelle=trim($this->libelle); + if (isset($this->active)) $this->active=trim($this->active); + if (isset($this->module)) $this->module=trim($this->module); + + + + // Check parameters + // Put here code to add control on parameters values + + // Insert request + $sql = "INSERT INTO ".MAIN_DB_PREFIX."c_typent("; + + $sql.= "id,"; + $sql.= "code,"; + $sql.= "libelle,"; + $sql.= "active,"; + $sql.= "module"; + + + $sql.= ") VALUES ("; + + $sql.= " ".(! isset($this->id)?'NULL':"'".$this->id."'").","; + $sql.= " ".(! isset($this->code)?'NULL':"'".$this->db->escape($this->code)."'").","; + $sql.= " ".(! isset($this->libelle)?'NULL':"'".$this->db->escape($this->libelle)."'").","; + $sql.= " ".(! isset($this->active)?'NULL':"'".$this->active."'").","; + $sql.= " ".(! isset($this->module)?'NULL':"'".$this->db->escape($this->module)."'").""; + + + $sql.= ")"; + + $this->db->begin(); + + dol_syslog(get_class($this)."::create sql=".$sql, LOG_DEBUG); + $resql=$this->db->query($sql); + if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); } + + if (! $error) + { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."c_typent"); + + if (! $notrigger) + { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action call a trigger. + + //// Call triggers + //include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"); + //$interface=new Interfaces($this->db); + //$result=$interface->run_triggers('MYOBJECT_CREATE',$this,$user,$langs,$conf); + //if ($result < 0) { $error++; $this->errors=$interface->errors; } + //// End call triggers + } + } + + // Commit or rollback + if ($error) + { + foreach($this->errors as $errmsg) + { + dol_syslog(get_class($this)."::create ".$errmsg, LOG_ERR); + $this->error.=($this->error?', '.$errmsg:$errmsg); + } + $this->db->rollback(); + return -1*$error; + } + else + { + $this->db->commit(); + return $this->id; + } + } + + + /** + * Load object in memory from database + * + * @param int $id Id object + * @param string $code Code + * @return int <0 if KO, >0 if OK + */ + function fetch($id,$code='') + { + global $langs; + $sql = "SELECT"; + $sql.= " t.id,"; + $sql.= " t.code,"; + $sql.= " t.libelle,"; + $sql.= " t.active,"; + $sql.= " t.module"; + $sql.= " FROM ".MAIN_DB_PREFIX."c_typent as t"; + if ($id) $sql.= " WHERE t.id = ".$id; + elseif ($code) $sql.= " WHERE t.code = '".$this->db->escape($code)."'"; + + dol_syslog(get_class($this)."::fetch sql=".$sql, LOG_DEBUG); + $resql=$this->db->query($sql); + if ($resql) + { + if ($this->db->num_rows($resql)) + { + $obj = $this->db->fetch_object($resql); + + $this->id = $obj->id; + $this->code = $obj->code; + $this->libelle = $obj->libelle; + $this->active = $obj->active; + $this->module = $obj->module; + } + $this->db->free($resql); + + return 1; + } + else + { + $this->error="Error ".$this->db->lasterror(); + dol_syslog(get_class($this)."::fetch ".$this->error, LOG_ERR); + return -1; + } + } + + + /** + * Update object into database + * + * @param User $user User that modify + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + function update($user=0, $notrigger=0) + { + global $conf, $langs; + $error=0; + + // Clean parameters + if (isset($this->code)) $this->code=trim($this->code); + if (isset($this->libelle)) $this->libelle=trim($this->libelle); + if (isset($this->active)) $this->active=trim($this->active); + if (isset($this->module)) $this->module=trim($this->module); + + + // Check parameters + // Put here code to add control on parameters values + + // Update request + $sql = "UPDATE ".MAIN_DB_PREFIX."c_typent SET"; + $sql.= " code=".(isset($this->code)?"'".$this->db->escape($this->code)."'":"null").","; + $sql.= " libelle=".(isset($this->libelle)?"'".$this->db->escape($this->libelle)."'":"null").","; + $sql.= " active=".(isset($this->active)?$this->active:"null").","; + $sql.= " module=".(isset($this->module)?"'".$this->db->escape($this->module)."'":"null").""; + $sql.= " WHERE id=".$this->id; + + $this->db->begin(); + + dol_syslog(get_class($this)."::update sql=".$sql, LOG_DEBUG); + $resql = $this->db->query($sql); + if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); } + + if (! $error) + { + if (! $notrigger) + { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action call a trigger. + + //// Call triggers + //include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"); + //$interface=new Interfaces($this->db); + //$result=$interface->run_triggers('MYOBJECT_MODIFY',$this,$user,$langs,$conf); + //if ($result < 0) { $error++; $this->errors=$interface->errors; } + //// End call triggers + } + } + + // Commit or rollback + if ($error) + { + foreach($this->errors as $errmsg) + { + dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR); + $this->error.=($this->error?', '.$errmsg:$errmsg); + } + $this->db->rollback(); + return -1*$error; + } + else + { + $this->db->commit(); + return 1; + } + } + + + /** + * Delete object in database + * + * @param User $user User that delete + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + function delete($user, $notrigger=0) + { + global $conf, $langs; + $error=0; + + $sql = "DELETE FROM ".MAIN_DB_PREFIX."c_typent"; + $sql.= " WHERE id=".$this->id; + + $this->db->begin(); + + dol_syslog(get_class($this)."::delete sql=".$sql); + $resql = $this->db->query($sql); + if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); } + + if (! $error) + { + if (! $notrigger) + { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action call a trigger. + + //// Call triggers + //include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"); + //$interface=new Interfaces($this->db); + //$result=$interface->run_triggers('MYOBJECT_DELETE',$this,$user,$langs,$conf); + //if ($result < 0) { $error++; $this->errors=$interface->errors; } + //// End call triggers + } + } + + // Commit or rollback + if ($error) + { + foreach($this->errors as $errmsg) + { + dol_syslog(get_class($this)."::delete ".$errmsg, LOG_ERR); + $this->error.=($this->error?', '.$errmsg:$errmsg); + } + $this->db->rollback(); + return -1*$error; + } + else + { + $this->db->commit(); + return 1; + } + } + +} +?> diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php index 5d54d64d03a..f35c565d071 100644 --- a/htdocs/core/modules/import/import_csv.modules.php +++ b/htdocs/core/modules/import/import_csv.modules.php @@ -21,7 +21,6 @@ * \file htdocs/core/modules/import/import_csv.modules.php * \ingroup import * \brief File to load import files with CSV format - * \author Laurent Destailleur */ require_once(DOL_DOCUMENT_ROOT ."/core/modules/import/modules_import.php"); @@ -29,7 +28,7 @@ require_once(DOL_DOCUMENT_ROOT ."/core/modules/import/modules_import.php"); /** * \class ImportCsv - * \brief Classe permettant de lire les fichiers imports CSV + * \brief Class to import CSV files */ class ImportCsv extends ModeleImports { @@ -48,12 +47,14 @@ class ImportCsv extends ModeleImports var $handle; // Handle fichier - var $cachefieldtable=array(); // Array to cache list of value into fields@tables + var $cacheconvert=array(); // Array to cache list of value found after a convertion + var $cachefieldtable=array(); // Array to cache list of value found into fields@tables /** - * \brief Constructeur - * \param db Handler acces base de donnee + * Constructor + * + * @param DoliDB $db Database handler */ function ImportCsv($db) { @@ -115,7 +116,9 @@ class ImportCsv extends ModeleImports /** * Output header of an example file for this format - * @param outputlangs Output language + * + * @param Translate $outputlangs Output language + * @return string */ function write_header_example($outputlangs) { @@ -124,7 +127,9 @@ class ImportCsv extends ModeleImports /** * Output title line of an example file for this format - * @param outputlangs Output language + * + * @param Translate $outputlangs Output language + * @return string */ function write_title_example($outputlangs,$headerlinefields) { @@ -134,7 +139,10 @@ class ImportCsv extends ModeleImports /** * Output record of an example file for this format - * @param outputlangs Output language + * + * @param Translate $outputlangs Output language + * @param array $contentlinevalues Array of lines + * @return string */ function write_record_example($outputlangs,$contentlinevalues) { @@ -144,7 +152,9 @@ class ImportCsv extends ModeleImports /** * Output footer of an example file for this format - * @param outputlangs Output language + * + * @param Translate $outputlangs Output language + * @return string */ function write_footer_example($outputlangs) { @@ -155,8 +165,9 @@ class ImportCsv extends ModeleImports /** * Open input file - * @param file Path of filename - * @return int <0 if KO, >=0 if OK + * + * @param string $file Path of filename + * @return int <0 if KO, >=0 if OK */ function import_open_file($file) { @@ -183,7 +194,9 @@ class ImportCsv extends ModeleImports } /** - * \brief Input header line from file + * Input header line from file + * + * @return int <0 if KO, >=0 if OK */ function import_read_header() { @@ -192,9 +205,9 @@ class ImportCsv extends ModeleImports /** - * \brief Return array of next record in input file. - * \return Array Array of field values. Data are UTF8 encoded. - * [0] => (['val']=>val, ['type']=>-1=null,0=blank,1=string) + * Return array of next record in input file. + * + * @return Array Array of field values. Data are UTF8 encoded. [fieldpos] => (['val']=>val, ['type']=>-1=null,0=blank,1=string) */ function import_read_record() { @@ -252,7 +265,9 @@ class ImportCsv extends ModeleImports } /** - * \brief Close file handle + * Close file handle + * + * @return void */ function import_close_file() { @@ -263,11 +278,12 @@ class ImportCsv extends ModeleImports /** * Insert a record into database - * @param arrayrecord Array of field values - * @param array_match_file_to_database - * @param objimport - * @param maxfields Max number of fiels to use - * @return int <0 if KO, >0 if OK + * + * @param array $arrayrecord Array of read values: [fieldpos] => (['val']=>val, ['type']=>-1=null,0=blank,1=string), [fieldpos+1]... + * @param array $array_match_file_to_database Array of target fields where to insert data: [fieldpos] => 's.fieldname', [fieldpos+1]... + * @param Object $objimport Object import (contains objimport->import_tables_array, objimport->import_fields_array, objimport->import_convertvalue_array, ...) + * @param int $maxfields Max number of fields to use + * @return int <0 if KO, >0 if OK */ function import_insert($arrayrecord,$array_match_file_to_database,$objimport,$maxfields,$importid) { @@ -288,8 +304,7 @@ class ImportCsv extends ModeleImports //var_dump($sort_array_match_file_to_database); - if (count($arrayrecord) == 0 || - (count($arrayrecord) == 1 && empty($arrayrecord[0]['val']))) + if (count($arrayrecord) == 0 || (count($arrayrecord) == 1 && empty($arrayrecord[0]['val']))) { //print 'W'; $this->warnings[$warning]['lib']=$langs->trans('EmptyLine'); @@ -307,31 +322,19 @@ class ImportCsv extends ModeleImports $listvalues=''; $i=0; $errorforthistable=0; + // Loop on each fields in the match array ($key = 1..n, $val=alias of field) foreach($sort_array_match_file_to_database as $key => $val) { if ($key <= $maxfields) { - if ($listfields) { $listfields.=', '; $listvalues.=', '; } - $listfields.=preg_replace('/^.*\./i','',$val); + // Set $newval with value to insert and set $listvalues with sql request part for insert $newval=''; - if ($arrayrecord[($key-1)]['type'] < 0) - { - $listvalues.="null"; - } - else if ($arrayrecord[($key-1)]['type'] == 0) - { - $listvalues.="''"; - } - else if ($arrayrecord[($key-1)]['type'] > 0) - { - $newval=$arrayrecord[($key-1)]['val']; - $listvalues.="'".$this->db->escape($arrayrecord[($key-1)]['val'])."'"; - } + if ($arrayrecord[($key-1)]['type'] > 0) $newval=$arrayrecord[($key-1)]['val']; // If type of field is not null or '' but string - // Make some tests + // Make some tests on $newval - // Required field is ok + // Is it a required field ? if (preg_match('/\*/',$objimport->array_import_fields[0][$val]) && ($newval=='')) { $this->errors[$error]['lib']=$langs->trans('ErrorMissingMandatoryValue',$key); @@ -340,8 +343,52 @@ class ImportCsv extends ModeleImports $error++; } // Test format only if field is not a missing mandatory field - else { - if (! empty($objimport->array_import_regex[0][$val])) + else + { + // We convert fields if required + if (! empty($objimport->array_import_convertvalue[0][$val])) + { + //print 'Must convert '.$newval.' with rule '.join(',',$objimport->array_import_convertvalue[0][$val]).'. '; + if ($objimport->array_import_convertvalue[0][$val]['rule']=='fetchidfromcodeid' || $objimport->array_import_convertvalue[0][$val]['rule']=='fetchidfromref') + { + if (! is_numeric($newval)) + { + $file=$objimport->array_import_convertvalue[0][$val]['classfile']; + $class=$objimport->array_import_convertvalue[0][$val]['class']; + $method=$objimport->array_import_convertvalue[0][$val]['method']; + if (empty($this->cacheconvert[$file.'_'.$class.'_'.$method.'_'][$newval])) + { + dol_include_once($file); + $classinstance=new $class($this->db); + call_user_func_array(array($classinstance, $method),array('', $newval)); + $this->cacheconvert[$file.'_'.$class.'_'.$method.'_'][$newval]=$classinstance->id; + //print 'We have made a '.$class.'->'.$method.' to get id from code '.$newval.'. '; + if (! empty($classinstance->id)) + { + $newval=$classinstance->id; + } + else + { + if (!empty($objimport->array_import_convertvalue[0][$val]['dict'])) $this->errors[$error]['lib']=$langs->trans('ErrorFieldValueNotIn',$key,$newval,'code',$langs->transnoentitiesnoconv($objimport->array_import_convertvalue[0][$val]['dict'])); + else if (!empty($objimport->array_import_convertvalue[0][$val]['element'])) $this->errors[$error]['lib']=$langs->trans('ErrorFieldRefNotIn',$key,$newval,$langs->transnoentitiesnoconv($objimport->array_import_convertvalue[0][$val]['element'])); + else $this->errors[$error]['lib']='ErrorFieldValueNotIn'; + $this->errors[$error]['type']='FOREIGNKEY'; + $errorforthistable++; + $error++; + } + } + else + { + $newval=$this->cacheconvert[$file.'_'.$class.'_'.$method.'_'][$newval]; + } + } + + } + //print 'Val to use as insert is '.$newval.'
'; + } + + // Test regexp + if (! empty($objimport->array_import_regex[0][$val]) && ($newval != '')) { // If test is "Must exist in a field@table" if (preg_match('/^(.*)@(.*)$/',$objimport->array_import_regex[0][$val],$reg)) @@ -349,7 +396,8 @@ class ImportCsv extends ModeleImports $field=$reg[1]; $table=$reg[2]; - if (! is_array($this->cachefieldtable[$field.'@'.$table])) // If content of field@table no already loaded into cache + // Load content of field@table into cache array + if (! is_array($this->cachefieldtable[$field.'@'.$table])) // If content of field@table not already loaded into cache { $sql="SELECT ".$field." as aliasfield FROM ".$table; $resql=$this->db->query($sql); @@ -375,6 +423,7 @@ class ImportCsv extends ModeleImports { $this->errors[$error]['lib']=$langs->trans('ErrorFieldValueNotIn',$key,$newval,$field,$table); $this->errors[$error]['type']='FOREIGNKEY'; + $errorforthistable++; $error++; } } @@ -391,10 +440,30 @@ class ImportCsv extends ModeleImports // Other tests // ... } + + // Define $listfields and $listvalues to build SQL request + if ($listfields) { $listfields.=', '; $listvalues.=', '; } + $listfields.=preg_replace('/^.*\./i','',$val); + if ($arrayrecord[($key-1)]['type'] < 0) $listvalues.="null"; + else if ($arrayrecord[($key-1)]['type'] == 0) $listvalues.="''"; + else if ($arrayrecord[($key-1)]['type'] > 0) $listvalues.="'".$this->db->escape($newval)."'"; } $i++; } - //print $listvalues; + + // Loop on each hidden fields + foreach($objimport->array_import_fieldshidden[0] as $key => $val) + { + if (! preg_match('/^'.preg_quote($alias).'\./', $key)) continue; // Not a field of current table + if ($listfields) { $listfields.=', '; $listvalues.=', '; } + if ($val == 'user->id') + { + $listfields.=preg_replace('/^'.preg_quote($alias).'\./','',$key); + $listvalues.=$user->id; + } + } + + //print 'Show listfields='.$listfields.'
listvalues='.$listvalues.'
'; if (! $errorforthistable) { @@ -402,10 +471,10 @@ class ImportCsv extends ModeleImports { // If some values need to be found somewhere else than in source file: Case we need a rowid found from a fetch on a reference. // This is used when insert must be done when a parent row already exists - // $objimport->array_import_convertvalue=array('s.fk_soc'=>array('rule'=>'fetchfromref',file='/societe.class.php','class'=>'Societe','method'=>'fetch')); + // $objimport->array_import_convertvalue=array('s.fk_soc'=>array('rule'=>'fetchidfromref',file='/societe.class.php','class'=>'Societe','method'=>'fetch')); foreach($objimport->array_import_convertvalue as $alias => $rulearray) { - if (empty($rulearray['rule']) || $rulearray['rule']!='fetchfromref') continue; + if (empty($rulearray['rule']) || $rulearray['rule']!='fetchidfromref') continue; dol_syslog("We need to get rowid from ref=".$alias." using value found in column ".$array_match_database_to_file." in source file, so ".$arrayrecord[$array_match_database_to_file]['val']); } diff --git a/htdocs/core/modules/modSociete.class.php b/htdocs/core/modules/modSociete.class.php index ac1109639a9..47740b102e5 100644 --- a/htdocs/core/modules/modSociete.class.php +++ b/htdocs/core/modules/modSociete.class.php @@ -268,27 +268,34 @@ class modSociete extends DolibarrModules $this->import_label[$r]='ImportDataset_company_1'; $this->import_icon[$r]='company'; $this->import_tables_array[$r]=array('s'=>MAIN_DB_PREFIX.'societe'); // List of tables to insert into (insert done in same order) - $this->import_fields_array[$r]=array('s.nom'=>"Name*",'s.status'=>"Status",'s.client'=>"Customer*",'s.fournisseur'=>"Supplier*",'s.datec'=>"DateCreation",'s.code_client'=>"CustomerCode",'s.code_fournisseur'=>"SupplierCode",'s.address'=>"Address",'s.cp'=>"Zip",'s.ville'=>"Town",'s.fk_pays'=>"CountryId",'s.tel'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.siret'=>"IdProf1",'s.siren'=>"IdProf2",'s.ape'=>"IdProf3",'s.idprof4'=>"IdProf4",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note'=>"Note",'s.fk_typent'=>"ThirdPartyType",'s.fk_effectif'=>"Effectif","s.fk_forme_juridique"=>"JuridicalStatus",'s.fk_prospectlevel'=>'ProspectLevel','s.fk_stcomm'=>'ProspectStatus','s.default_lang'=>'DefaultLanguage','s.barcode'=>'BarCode'); + $this->import_fields_array[$r]=array('s.nom'=>"Name*",'s.status'=>"Status",'s.client'=>"Customer*",'s.fournisseur'=>"Supplier*",'s.code_client'=>"CustomerCode",'s.code_fournisseur'=>"SupplierCode",'s.address'=>"Address",'s.cp'=>"Zip",'s.ville'=>"Town",'s.fk_pays'=>"CountryCode",'s.tel'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.siret'=>"IdProf1",'s.siren'=>"IdProf2",'s.ape'=>"IdProf3",'s.idprof4'=>"IdProf4",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note'=>"Note",'s.fk_typent'=>"ThirdPartyType",'s.fk_effectif'=>"Effectif","s.fk_forme_juridique"=>"JuridicalStatus",'s.fk_prospectlevel'=>'ProspectLevel','s.fk_stcomm'=>'ProspectStatus','s.default_lang'=>'DefaultLanguage','s.barcode'=>'BarCode','s.datec'=>"DateCreation"); + $this->import_fieldshidden_array[$r]=array('s.fk_user_creat'=>$user->id); $this->import_entities_array[$r]=array(); // We define here only fields that use another picto - $this->import_regex_array[$r]=array('s.status'=>'^[0|1]','s.client'=>'^[0|1|2|3]','s.fournisseur'=>'^[0|1]','s.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$'); - //$this->import_regex_array[$r]=array('s.status'=>'^[0|1]','s.client'=>'^[0|1|2|3]','s.fournisseur'=>'^[0|1]','s.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$','s.fk_typent'=>array('rule'=>'fetchidfromcode','file'=>'/societe/class/societe.class.php','class'=>'Societe','method'=>'fetch'))); - $this->import_examplevalues_array[$r]=array('s.nom'=>"MyBigCompany",'s.status'=>"0 (closed) or 1 (active)",'s.client'=>'0 (no customer no prospect)/1 (customer)/2 (prospect)/3 (customer and prospect)','s.fournisseur'=>'0 or 1','s.datec'=>dol_print_date(mktime(),'%Y-%m-%d'),'s.code_client'=>"CU01-0001",'s.code_fournisseur'=>"SU01-0001",'s.address'=>"61 jump street",'s.cp'=>"123456",'s.ville'=>"Big town",'s.fk_pays'=>'See field rowid into table llx_c_pays','s.tel'=>"0101010101",'s.fax'=>"0101010102",'s.url'=>"http://mycompany.com",'s.email'=>"test@mycompany.com",'s.siret'=>"",'s.siren'=>"",'s.ape'=>"",'s.idprof4'=>"",'s.tva_intra'=>"FR0123456789",'s.capital'=>"10000",'s.note'=>"This is an example of note for record",'s.fk_typent'=>"2",'s.fk_effectif'=>"3","s.fk_forme_juridique"=>"1",'s.fk_prospectlevel'=>'PL_MEDIUM','s.fk_stcomm'=>'','s.default_lang'=>'en_US','s.barcode'=>'123456789'); + $this->import_convertvalue_array[$r]=array( + 's.fk_typent'=>array('rule'=>'fetchidfromcodeid','classfile'=>'/core/class/ctypent.class.php','class'=>'Ctypent','method'=>'fetch','dict'=>'DictionnaryCompanyType'), + 's.fk_pays'=>array('rule'=>'fetchidfromcodeid','classfile'=>'/core/class/cpays.class.php','class'=>'Cpays','method'=>'fetch','dict'=>'DictionnaryCountry'), + ); + //$this->import_convertvalue_array[$r]=array('s.fk_soc'=>array('rule'=>'lastrowid',table='t'); + $this->import_regex_array[$r]=array('s.status'=>'^[0|1]','s.client'=>'^[0|1|2|3]','s.fournisseur'=>'^[0|1]','s.fk_typent'=>'id@'.MAIN_DB_PREFIX.'c_typent','s.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$'); + $this->import_examplevalues_array[$r]=array('s.nom'=>"MyBigCompany",'s.status'=>"0 (closed) or 1 (active)",'s.client'=>'0 (no customer no prospect)/1 (customer)/2 (prospect)/3 (customer and prospect)','s.fournisseur'=>'0 or 1','s.datec'=>dol_print_date(mktime(),'%Y-%m-%d'),'s.code_client'=>"CU01-0001",'s.code_fournisseur'=>"SU01-0001",'s.address'=>"61 jump street",'s.cp'=>"123456",'s.ville'=>"Big town",'s.fk_pays'=>'US, FR, DE...','s.tel'=>"0101010101",'s.fax'=>"0101010102",'s.url'=>"http://mycompany.com",'s.email'=>"test@mycompany.com",'s.siret'=>"",'s.siren'=>"",'s.ape'=>"",'s.idprof4'=>"",'s.tva_intra'=>"FR0123456789",'s.capital'=>"10000",'s.note'=>"This is an example of note for record",'s.fk_typent'=>"2",'s.fk_effectif'=>"3","s.fk_forme_juridique"=>"1",'s.fk_prospectlevel'=>'PL_MEDIUM','s.fk_stcomm'=>'','s.default_lang'=>'en_US','s.barcode'=>'123456789'); // Import list of contact and attributes -/* $r++; + $r++; $this->import_code[$r]=$this->rights_class.'_'.$r; $this->import_label[$r]='ImportDataset_company_2'; $this->import_icon[$r]='contact'; //$this->import_permission[$r]=array(array("societe","export")); $this->import_tables_array[$r]=array('s'=>MAIN_DB_PREFIX.'socpeople'); // List of tables to insert into (insert done in same order) - $this->import_fields_array[$r]=array('s.fk_soc'=>'ThirdPartyName*','s.civilite'=>'Civility','s.name'=>"Name*",'s.firstname'=>"Firstname",'s.address'=>"Address",'s.cp'=>"Zip",'s.ville'=>"Town",'s.fk_pays'=>"CountryCode",'s.birthday'=>"BirthdayDate",'s.poste'=>"Role",'s.phone'=>"Phone",'s.phone_perso'=>"PhonePerso",'s.phone_mobile'=>"PhoneMobile",'s.fax'=>"Fax",'s.email'=>"Email",'s.note'=>"Note"); + $this->import_fields_array[$r]=array('s.fk_soc'=>'ThirdPartyName*','s.civilite'=>'Civility','s.name'=>"Name*",'s.firstname'=>"Firstname",'s.address'=>"Address",'s.cp'=>"Zip",'s.ville'=>"Town",'s.fk_pays'=>"CountryCode",'s.birthday'=>"BirthdayDate",'s.poste'=>"Role",'s.phone'=>"Phone",'s.phone_perso'=>"PhonePerso",'s.phone_mobile'=>"PhoneMobile",'s.fax'=>"Fax",'s.email'=>"Email",'s.note'=>"Note",'s.datec'=>"DateCreation"); + $this->import_fieldshidden_array[$r]=array('s.fk_user_creat'=>'user->id'); $this->import_entities_array[$r]=array('s.fk_soc'=>'company'); // We define here only fields that use another picto - $this->import_examplevalues_array[$r]=array('s.fk_soc'=>'The Big Company','s.civilite'=>"MR",'s.name'=>"Smith",'s.firstname'=>'John','s.address'=>'61 jump street','s.cp'=>'75000','s.ville'=>'Bigtown','s.fk_pays'=>'0','s.datec'=>'1972-10-10','s.poste'=>"Director",'s.phone'=>"5551122",'s.phone_perso'=>"5551133",'s.phone_mobile'=>"5551144",'s.fax'=>"5551155",'s.email'=>"johnsmith@email.com",'s.note'=>"My comments"); - // If value for some fields are a ref to found the key of parent - $this->import_convertvalue_array[$r]=array('s.fk_soc'=>array('rule'=>'fetchidfromref','file'=>'/societe/class/societe.class.php','class'=>'Societe','method'=>'fetch')); - // If value for some fields must be the previous inserted record (lastinsertid) + $this->import_convertvalue_array[$r]=array( + 's.fk_soc'=>array('rule'=>'fetchidfromref','file'=>'/societe/class/societe.class.php','class'=>'Societe','method'=>'fetch','element'=>'ThirdParty'), + 's.fk_pays'=>array('rule'=>'fetchidfromcodeid','classfile'=>'/core/class/cpays.class.php','class'=>'Cpays','method'=>'fetch','dict'=>'DictionnaryCountry'), + ); //$this->import_convertvalue_array[$r]=array('s.fk_soc'=>array('rule'=>'lastrowid',table='t'); -*/ + $this->import_regex_array[$r]=array('s.birthday'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$','s.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$'); + $this->import_examplevalues_array[$r]=array('s.fk_soc'=>'MyBigCompany','s.civilite'=>"MR",'s.name'=>"Smith",'s.firstname'=>'John','s.address'=>'61 jump street','s.cp'=>'75000','s.ville'=>'Bigtown','s.fk_pays'=>'US, FR, DE...','s.datec'=>'1972-10-10','s.poste'=>"Director",'s.phone'=>"5551122",'s.phone_perso'=>"5551133",'s.phone_mobile'=>"5551144",'s.fax'=>"5551155",'s.email'=>"johnsmith@email.com",'s.note'=>"My comments"); } diff --git a/htdocs/imports/class/import.class.php b/htdocs/imports/class/import.class.php index fa9fdf20df7..f981847a466 100644 --- a/htdocs/imports/class/import.class.php +++ b/htdocs/imports/class/import.class.php @@ -43,19 +43,19 @@ class Import /** * Constructor * - * @param DoliDB $DB Database handler + * @param DoliDB $db Database handler */ - function Import($DB) + function Import($db) { - $this->db=$DB; + $this->db=$db; } /** - * Load description of an importable dataset + * Load description int this->array_import_module, this->array_import_fields, ... of an importable dataset * * @param User $user Object user making import - * @param string $filter Load a particular dataset only + * @param string $filter Load a particular dataset only. Index will start to 0. * @return int <0 if KO, >0 if OK */ function load_arrays($user,$filter='') @@ -127,8 +127,6 @@ class Import } } - // Module - $this->array_import_module[$i]=$module; // Permission $this->array_import_perms[$i]=$user->rights->import->run; // Icon @@ -141,8 +139,10 @@ class Import $this->array_import_tables[$i]=$module->import_tables_array[$r]; // Array of tables creator field to import (key=alias, value=creator field) $this->array_import_tables_creator[$i]=$module->import_tables_creator_array[$r]; - // Array of fiels to import (key=field, value=label) + // Array of fields to import (key=field, value=label) $this->array_import_fields[$i]=$module->import_fields_array[$r]; + // Array of hidden fields to import (key=field, value=label) + $this->array_import_fieldshidden[$i]=$module->import_fieldshidden_array[$r]; // Tableau des entites a exporter (cle=champ, valeur=entite) $this->array_import_entities[$i]=$module->import_entities_array[$r]; // Tableau des alias a exporter (cle=champ, valeur=alias) @@ -151,8 +151,10 @@ class Import $this->array_import_examplevalues[$i]=$module->import_examplevalues_array[$r]; // Tableau des regles de conversion d'une valeur depuis une autre source (cle=champ, valeur=tableau des regles) $this->array_import_convertvalue[$i]=$module->import_convertvalue_array[$r]; + // Module + $this->array_import_module[$i]=$module; - dol_syslog("Import loaded for module ".$modulename." with index ".$i.", dataset=".$module->import_code[$r].", nb of fields=".count($module->import_fields_code[$r])); + dol_syslog("Import loaded for module ".$modulename." with index ".$i.", dataset=".$module->import_code[$r].", nb of fields=".count($module->import_fields_array[$r])); $i++; } } diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index bc9cc5b8da4..77cc4412c5a 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -685,7 +685,7 @@ if ($step == 4 && $datatoimport) print ''.$langs->trans("FileToImport").''; print ''; $modulepart='import'; - //$relativepath=$filetoimport; + $relativepath=GETPOST('filetoimport'); print ''; print $filetoimport; print ''; @@ -818,12 +818,22 @@ if ($step == 4 && $datatoimport) } else { - if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchfromref') $htmltext.=$langs->trans("DataComeFromIdFoundFromRef",$filecolumn,$langs->transnoentitiesnoconv($entitylang)).'
'; + if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchidfromref') $htmltext.=$langs->trans("DataComeFromIdFoundFromRef",$filecolumn,$langs->transnoentitiesnoconv($entitylang)).'
'; + if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchidfromcodeid') $htmltext.=$langs->trans("DataComeFromIdFoundFromCodeId",$filecolumn,$langs->transnoentitiesnoconv($objimport->array_import_convertvalue[0][$code]['dict'])).'
'; } } $htmltext.=$langs->trans("SourceRequired").': '.yn(preg_match('/\*$/',$label)).'
'; $example=$objimport->array_import_examplevalues[0][$code]; - if ($example) $htmltext.=$langs->trans("SourceExample").': '.$example.'
'; + + if (empty($objimport->array_import_convertvalue[0][$code])) // If source file does not need convertion + { + if ($example) $htmltext.=$langs->trans("SourceExample").': '.$example.'
'; + } + else + { + if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchidfromref') $htmltext.=$langs->trans("SourceExample").': '.$langs->transnoentitiesnoconv("ExampleAnyRefFoundIntoElement",$entitylang).($example?' ('.$langs->transnoentitiesnoconv("Example").': '.$example.')':'').'
'; + if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchidfromcodeid') $htmltext.=$langs->trans("SourceExample").': '.$langs->trans("ExampleAnyCodeOrIdFoundIntoDictionnary",$langs->transnoentitiesnoconv($objimport->array_import_convertvalue[0][$code]['dict'])).($example?' ('.$langs->transnoentitiesnoconv("Example").': '.$example.')':'').'
'; + } $htmltext.='
'; // Target field info $htmltext.=''.$langs->trans("FieldTarget").'
'; @@ -833,7 +843,8 @@ if ($step == 4 && $datatoimport) } else { - if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchfromref') $htmltext.=$langs->trans("DataIDSourceIsInsertedInto").'
'; + if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchidfromref') $htmltext.=$langs->trans("DataIDSourceIsInsertedInto").'
'; + if ($objimport->array_import_convertvalue[0][$code]['rule']=='fetchidfromcodeid') $htmltext.=$langs->trans("DataCodeIDSourceIsInsertedInto").'
'; } $htmltext.=$langs->trans("FieldTitle").": ".$langs->trans($newlabel)."
"; $htmltext.=$langs->trans("Table")." -> ".$langs->trans("Field").': '.$tablename." -> ".preg_replace('/^.*\./','',$code)."
"; @@ -1093,8 +1104,8 @@ if ($step == 5 && $datatoimport) print ''.$langs->trans("FileToImport").''; print ''; $modulepart='import'; - //$relativepath=$filetoimport; - print ''; + $relativepath=GETPOST('filetoimport'); + print ''; print $filetoimport; print ''; print ''; @@ -1209,7 +1220,6 @@ if ($step == 5 && $datatoimport) } else { - // Launch import $arrayoferrors=array(); $arrayofwarnings=array(); @@ -1235,10 +1245,13 @@ if ($step == 5 && $datatoimport) while ($sourcelinenb < $nboflines) { $sourcelinenb++; + // Read line and stor it into $arrayrecord $arrayrecord=$obj->import_read_record(); if ($excludefirstline && $sourcelinenb == 1) continue; + // $result=$obj->import_insert($arrayrecord,$array_match_file_to_database,$objimport,count($fieldssource),$importid); + if (count($obj->errors)) $arrayoferrors[$sourcelinenb]=$obj->errors; if (count($obj->warnings)) $arrayofwarnings[$sourcelinenb]=$obj->warnings; if (! count($obj->errors) && ! count($obj->warnings)) $nbok++; @@ -1419,8 +1432,8 @@ if ($step == 6 && $datatoimport) print ''.$langs->trans("FileToImport").''; print ''; $modulepart='import'; - //$relativepath=$filetoimport; - print ''; + $relativepath=GETPOST('filetoimport'); + print ''; print $filetoimport; print ''; print ''; @@ -1571,10 +1584,10 @@ if ($step == 6 && $datatoimport) print '
'; -$db->close(); - llxFooter(); +$db->close(); + /** * Function to put the movable box of a source field diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index c41523584a2..10b28da4546 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -325,6 +325,7 @@ NoDolibarrAccess=No Dolibarr access ExportDataset_company_1=Third parties (Companies/foundations) and properties ExportDataset_company_2=Contacts and properties ImportDataset_company_1=Third parties (Companies/foundations) and properties +ImportDataset_company_2=Contacts (of thirdparties or not) and attributes PriceLevel=Price level DeliveriesAddress=Delivery addresses DeliveryAddress=Delivery address diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 6cd3bdb4879..b375711e4fc 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -64,7 +64,8 @@ ErrorModuleRequireJavascript=Javascript must not be disabled to have this featur ErrorPasswordsMustMatch=Both typed passwords must match each other ErrorContactEMail=A technical error occured. Please, contact administrator to following email %s en provide the error code %s in your message, or even better by adding a screen copy of this page. ErrorWrongValueForField=Wrong value for field number %s (value '%s' does not match regex rule %s) -ErrorFieldValueNotIn=Wrong value for field number%s (value '%s' is not a value available into field %s of table %s) +ErrorFieldValueNotIn=Wrong value for field number %s (value '%s' is not a value available into field %s of table %s) +ErrorFieldRefNotIn=Wrong value for field number %s (value '%s' is not a %s existing ref) ErrorsOnXLines=Errors on %s source lines ErrorFileIsInfectedWithAVirus=The antivirus program was not able to validate the file (file might be infected by a virus) ErrorSpecialCharNotAllowedForField=Special characters are not allowed for field "%s" diff --git a/htdocs/langs/en_US/exports.lang b/htdocs/langs/en_US/exports.lang index 02bb95324bf..64ee093fdbc 100644 --- a/htdocs/langs/en_US/exports.lang +++ b/htdocs/langs/en_US/exports.lang @@ -103,8 +103,12 @@ NbOfLinesImported=Number of lines successfully imported: %s. DataComeFromNoWhere=Value to insert comes from nowhere in source file. DataComeFromFileFieldNb=Value to insert comes from field number %s in source file. DataComeFromIdFoundFromRef=Value that comes from field number %s of source file will be used to find id of parent object to use (So the objet %s that has the ref. from source file must exists into Dolibarr). +DataComeFromIdFoundFromCodeId=Code that comes from field number %s of source file will be used to find id of parent object to use (So the code from source file must exists into dictionnary %s). Note that if you know id, you can also use it into source file instead of code. Import should work in both cases. DataIsInsertedInto=Data coming from source file will be inserted into the following field: DataIDSourceIsInsertedInto=The id of parent object found using the data in source file, will be inserted into the following field: +DataCodeIDSourceIsInsertedInto=The id of parent line found from code, will be inserted into following field: SourceRequired=Data value is mandatory SourceExample=Example of possible data value +ExampleAnyRefFoundIntoElement=Any ref found for element %s +ExampleAnyCodeOrIdFoundIntoDictionnary=Any code (or id) found into dictionnary %s CSVFormatDesc=Comma Separated Value file format (.csv).
This is a text file format where fields are separated by separator [ %s ]. If separator is found inside a field content, field is rounded by round character [ %s ]. Escape character to escape round character is [ %s ]. \ No newline at end of file diff --git a/htdocs/langs/fr_FR/companies.lang b/htdocs/langs/fr_FR/companies.lang index 28a53fe89ac..e86327e4959 100644 --- a/htdocs/langs/fr_FR/companies.lang +++ b/htdocs/langs/fr_FR/companies.lang @@ -326,6 +326,7 @@ NoDolibarrAccess=Pas d'accès utilisateur ExportDataset_company_1=Tiers (sociétés/institutions) et attributs ExportDataset_company_2=Contacts (de tiers) et attributs ImportDataset_company_1=Tiers (sociétés/institutions) et attributs +ImportDataset_company_2=Contacts (de tiers ou libre) et attributs PriceLevel=Niveau de prix DeliveriesAddress=Adresse(s) de livraison DeliveryAddress=Adresse de livraison diff --git a/htdocs/langs/fr_FR/errors.lang b/htdocs/langs/fr_FR/errors.lang index c7148b7f8c9..82a78406c04 100644 --- a/htdocs/langs/fr_FR/errors.lang +++ b/htdocs/langs/fr_FR/errors.lang @@ -66,6 +66,7 @@ ErrorPasswordsMustMatch=Les 2 mots de passe saisis doivent correspondre ErrorContactEMail=Une erreur technique est apparue. Merci de contacter l'administrateur à l'email suivant %s en lui indiquant le code erreur %s dans votre message ou mieux en fournissant une copie d'écran de cette page. ErrorWrongValueForField=Mauvaise valeur pour le champ numéro %s (la valeur '%s' ne respecte pas la règle %s) ErrorFieldValueNotIn=Mauvaise valeur pour le champ numéro %s (la valeur '%s' n'est pas une valeure présente dans le champ %s de la table %s) +ErrorFieldRefNotIn=Mauvaise valeur pour le champ numéro %s (la valeur '%s' n'est pas une référence existante comme %s) ErrorsOnXLines=Erreurs sur %s lignes sources ErrorFileIsInfectedWithAVirus=L'antivirus n'a pas pu valider ce fichier (il est probablement infecté par un virus) ! ErrorSpecialCharNotAllowedForField=Les caractères spéciaux ne sont pas admis pour le champ "%s" diff --git a/htdocs/langs/fr_FR/exports.lang b/htdocs/langs/fr_FR/exports.lang index 100df57bb13..c89613f71b8 100644 --- a/htdocs/langs/fr_FR/exports.lang +++ b/htdocs/langs/fr_FR/exports.lang @@ -103,8 +103,12 @@ NbOfLinesImported=Nombre de lignes importées avec succès: %s. DataComeFromNoWhere=La valeur à insérer n'est issue d'aucun champ du fichier source. DataComeFromFileFieldNb=La valeur à insérer sera issue du champ numéro %s du fichier source. DataComeFromIdFoundFromRef=La valeur issue du champ numéro %s du fichier source sera utilisée pour trouver l'id de l'objet père à utiliser (L'objet %s ayant la réf. issue du fichier source doit donc exister dans Dolibarr). +DataComeFromIdFoundFromCodeId=Le code issu du champ numéro %s du fichier source sera utilisée pour trouver l'id de l'objet père à utiliser (Le code issue du fichier source doit donc exister dans le dictionnaire %s). Noton que si vous connaissez cet id, vou spouvez l'utiliser dans le fichier source au lieu du code. L'import fonctionnera dans les 2 cas. DataIsInsertedInto=La donnée issue du fichier source sera insérée dans le champ suivant: DataIDSourceIsInsertedInto=L'id de l'objet père retrouvé à partir de la donnée source, sera insérée dans le champ suivant: +DataCodeIDSourceIsInsertedInto=L'id de la ligne père retrouvé à partir du code, sera insérée dans le champ suivant: SourceRequired=Donnée source obligatoire SourceExample=Exemple de donnée source possible +ExampleAnyRefFoundIntoElement=Toute réf trouvée pour les éléments %s +ExampleAnyCodeOrIdFoundIntoDictionnary=Tout code (ou id) trouvée dans le dictionnaire %s CSVFormatDesc=Fichier au format Comma Separated Value (.csv).
C'est un fichier au format texte dans lequel les champs sont séparés par le caractère [ %s ]. Si le séparateur est trouvé dans le contenu d'un champ, le champ doit être entouré du caractère [ %s ]. Le caractère d'échappement pour inclure un caractère de contour dans une donnée est [ %s ]. diff --git a/htdocs/societe/info.php b/htdocs/societe/info.php index ab129074400..e743eb53a1e 100644 --- a/htdocs/societe/info.php +++ b/htdocs/societe/info.php @@ -44,7 +44,6 @@ $result = restrictedArea($user, 'societe','',''); llxHeader(); $soc = new Societe($db); -$soc->id = $socid; $soc->fetch($socid); $soc->info($socid); @@ -64,7 +63,7 @@ print ''; print ''; -$db->close(); - llxFooter(); + +$db->close(); ?>