From 70c0adc3d1eacaadf847bd55147a941270ae7378 Mon Sep 17 00:00:00 2001 From: Steve Date: Thu, 20 Dec 2018 16:49:17 +0100 Subject: [PATCH] import.php HTML5 validation ADDED htmlentities to enclosure and separator CHANGED td aligns to css, removed nospan tag ADDED clause to box generator to stop multiple duplicate ids when no $key REMOVED height attribute REMOVED nested b tag CHANGED deprecated Center tag for div style center FIX Added check if ($objimport->array_import_updatekeys[0] && count($objimport->array_import_updatekeys[0] to stop php warning ------------------ modProduct.class.php Products Import ordered fields as per table structure order ADDED and changed import fields and examples ------------------ modSociete.class.php Third Party Import Changed field orders to match table field order so future additions will be easier to manage. REMOVED s.datec repeated in import example ADDED: alias, payment mode, payment conditions, sales tax VAT, multicurrency, currency Additional Address Import Changed field orders to match table field order import example csv was missing birthday Bank Account Import Changed field orders to match table field order ADDED label (required for a bank account ADDED datec (required for d.debit UMR) ADDED to address import: s.fk_departement modified text to import example csv ------------------- companies.lang various new constants for import file column headers --- htdocs/core/modules/modProduct.class.php | 168 +++++++-- htdocs/core/modules/modSociete.class.php | 445 +++++++++++++++++------ htdocs/imports/import.php | 63 ++-- htdocs/langs/en_US/companies.lang | 7 + 4 files changed, 516 insertions(+), 167 deletions(-) diff --git a/htdocs/core/modules/modProduct.class.php b/htdocs/core/modules/modProduct.class.php index 05215f8aea8..e00df796409 100644 --- a/htdocs/core/modules/modProduct.class.php +++ b/htdocs/core/modules/modProduct.class.php @@ -143,8 +143,8 @@ class modProduct extends DolibarrModules // Menus //------- - $this->menu = 1; // This module add menu entries. They are coded into menu manager. - /* We can't enable this here because it must be enabled in both product and service module and this create duplicate insert + $this->menu = 1; // This module adds menu entries. They are coded into menu manager. + /* We can't enable this here because it must be enabled in both product and service module and this creates duplicate inserts $r=0; $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=home,fk_leftmenu=admintools', // Use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode 'type'=>'left', // This is a Left menu entry @@ -295,20 +295,49 @@ class modProduct extends DolibarrModules //-------- $r=0; + // Import list of products + $r++; $this->import_code[$r]=$this->rights_class.'_'.$r; $this->import_label[$r]="Products"; // Translation key $this->import_icon[$r]=$this->picto; - $this->import_entities_array[$r]=array(); // We define here only fields that use another icon that the one defined into import_icon + $this->import_entities_array[$r]=array(); // We define here only fields that use a different icon from the one defined in import_icon $this->import_tables_array[$r]=array('p'=>MAIN_DB_PREFIX.'product','extra'=>MAIN_DB_PREFIX.'product_extrafields'); $this->import_tables_creator_array[$r]=array('p'=>'fk_user_author'); // Fields to store import user id - $this->import_fields_array[$r]=array( - 'p.ref'=>"Ref*",'p.label'=>"Label*",'p.description'=>"Description",'p.url'=>"PublicUrl",'p.accountancy_code_sell'=>"ProductAccountancySellCode", - 'p.accountancy_code_buy'=>"ProductAccountancyBuyCode",'p.note'=>"Note",'p.length'=>"Length",'p.surface'=>"Surface",'p.volume'=>"Volume", - 'p.weight'=>"Weight",'p.duration'=>"Duration",'p.customcode'=>'CustomCode','p.price'=>"SellingPriceHT",'p.price_ttc'=>"SellingPriceTTC", - 'p.tva_tx'=>'VATRate', 'p.tosell'=>"OnSell*",'p.tobuy'=>"OnBuy*",'p.fk_product_type'=>"Type*",'p.finished'=>'Nature','p.datec'=>'DateCreation' + $this->import_fields_array[$r]=array(//field order as per structure of table llx_product + 'p.ref' => "Ref*", + 'p.datec' => 'DateCreation', + 'p.label' => "Label*", + 'p.description' => "Description", + 'p.note_public' => "PublicNote",//public note + 'p.note' => "PrivateNote",//private note + 'p.customcode' => 'CustomCode', + 'p.price' => "SellingPriceHT",//without tax + 'p.price_ttc' => "SellingPriceTTC",//with tax + 'p.price_base_type' => "PriceBaseType",//price base: with-tax (TTC) or without (HT) tax. Displays accordingly in Product card + 'p.tva_tx' => 'VATRate', + 'p.tosell' => "OnSell*", + 'p.tobuy' => "OnBuy*", + 'p.fk_product_type' => "Type*", + 'p.duration' => "Duration",///duration of service + 'p.url' => "PublicUrl", + 'p.accountancy_code_sell' => "ProductAccountancySellCode", + 'p.accountancy_code_buy' => "ProductAccountancyBuyCode", + 'p.weight' => "Weight", + 'p.length' => "Length", + 'p.width' => "Width", + 'p.height' => "Height", + 'p.surface' => "Surface", + 'p.volume' => "Volume", + 'p.finished' => 'Nature' ); - if (! empty($conf->stock->enabled)) $this->import_fields_array[$r]=array_merge($this->import_fields_array[$r],array('p.seuil_stock_alerte'=>'StockLimit','p.desiredstock'=>'DesiredStock','p.pmp'=>'PMPValue')); + if (!empty($conf->stock->enabled)) {//if Stock module enabled + $this->import_fields_array[$r] = array_merge($this->import_fields_array[$r], array( + 'p.seuil_stock_alerte' => 'StockLimit',//lower limit for warning + 'p.pmp' => 'PMPValue',//weighted average price + 'p.desiredstock' => 'DesiredStock'//desired stock for replenishment feature + )); + } if (! empty($conf->fournisseur->enabled) || !empty($conf->margin->enabled)) $this->import_fields_array[$r]=array_merge($this->import_fields_array[$r],array('p.cost_price'=>'CostPrice')); if (is_object($mysoc) && $mysoc->useNPR()) $this->import_fields_array[$r]=array_merge($this->import_fields_array[$r],array('p.recuperableonly'=>'NPR')); if (is_object($mysoc) && $mysoc->useLocalTax(1)) $this->import_fields_array[$r]=array_merge($this->import_fields_array[$r],array('p.localtax1_tx'=>'LT1', 'p.localtax1_type'=>'LT1Type')); @@ -331,14 +360,64 @@ class modProduct extends DolibarrModules } // End add extra fields $this->import_fieldshidden_array[$r]=array('extra.fk_object'=>'lastrowid-'.MAIN_DB_PREFIX.'product'); // aliastable.field => ('user->id' or 'lastrowid-'.tableparent) - $this->import_regex_array[$r]=array('p.ref'=>'[^ ]','p.tosell'=>'^[0|1]$','p.tobuy'=>'^[0|1]$','p.fk_product_type'=>'^[0|1]$','p.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$','p.recuperableonly'=>'^[0|1]$'); - $import_sample=array('p.ref'=>"PREF123456",'p.label'=>"My product",'p.description'=>"This is a description example for record",'p.note'=>"Some note",'p.price'=>"100",'p.price_ttc'=>"110",'p.tva_tx'=>'10','p.tosell'=>"0 or 1",'p.tobuy'=>"0 or 1",'p.fk_product_type'=>"0 for product/1 for service",'p.finished'=>'','p.duration'=>"1y",'p.datec'=>'2008-12-31','p.recuperableonly'=>'0 or 1'); + $this->import_regex_array[$r]=array( + 'p.ref' => '[^ ]', + 'p.price_base_type' => '\AHT\z|\ATTC\z', + 'p.tosell' => '^[0|1]$', + 'p.tobuy' => '^[0|1]$', + 'p.fk_product_type' => '^[0|1]$', + 'p.datec' => '^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$', + 'p.recuperableonly' => '^[0|1]$', + 'p.finished' => '^[0|1]$' + ); + + $import_sample = array(//field order as per structure of table llx_product + 'p.ref' => "PREF123456", + 'p.datec' => 'formatted as '.dol_print_date(dol_now(),'%Y-%m-%d'), + 'p.label' => "Product name in default language", + 'p.description' => "Product description in default language", + 'p.note_public' => "a public note (free text)", + 'p.note' => "a private note (free text)", + 'p.customcode' => 'customs code', + 'p.price' => "price ex-vat eg. 100", + 'p.price_ttc' => "price inc-vat eg. 110", + 'p.price_base_type' => "HT (show/use price excl. tax) / TTC (show/use price incl. tax)", + 'p.tva_tx' => 'tax rate eg: 10. Must match numerically one of the tax rates defined for your country', + 'p.tosell' => "0 (not for sale to customer, eg. raw material) / 1 (for sale)", + 'p.tobuy' => "0 (not for purchase from supplier, eg. virtual product) / 1 (for purchase)", + 'p.fk_product_type' => "0 (product) / 1 (service)", + 'p.duration' => "eg. 365d/12m/1y", + 'p.url' => 'link to product (no https)', + 'p.accountancy_code_sell' => "", + 'p.accountancy_code_buy' => "", + 'p.weight' => "", + 'p.length' => "", + 'p.width' => "", + 'p.height' => "", + 'p.surface' => "", + 'p.volume' => "", + 'p.finished' => '0 (raw material) / 1 (finished goods)' + ); + //clauses copied from import_fields_array + if (!empty($conf->stock->enabled)) $import_sample = array_merge($import_sample, array( + 'p.seuil_stock_alerte' => 'quantity for low-stock warning (empty for no warning)', + 'p.pmp' => '0 (default)', + 'p.desiredstock' => 'target quantity to maintain in stock (for replenishment feature)' + )); + if (! empty($conf->fournisseur->enabled) || !empty($conf->margin->enabled)) $import_sample=array_merge($import_sample,array('p.cost_price'=>'user-editable, used for margin calculations only')); + if (is_object($mysoc) && $mysoc->useNPR()) $import_sample=array_merge($import_sample,array('p.recuperableonly'=>'0 / 1 (French VAT NPR yes/no')); + if (is_object($mysoc) && $mysoc->useLocalTax(1)) $import_sample=array_merge($import_sample,array('p.localtax1_tx'=>'', 'p.localtax1_type'=>'')); + if (is_object($mysoc) && $mysoc->useLocalTax(2)) $import_sample=array_merge($import_sample,array('p.localtax2_tx'=>'', 'p.localtax2_type'=>'')); + if (! empty($conf->barcode->enabled)) $import_sample=array_merge($import_sample,array('p.barcode'=>'')); + if (! empty($conf->global->PRODUCT_USE_UNITS)) $import_sample=array_merge($import_sample,array('p.fk_unit'=>'use a unit of measure from the dictionary. 1/2/3 etc....matches field "rowid" in table "'.MAIN_DB_PREFIX.'c_units"')); + $this->import_examplevalues_array[$r]=array_merge($import_sample,$import_extrafield_sample); - $this->import_updatekeys_array[$r]=array('p.ref'=>'Ref','p.barcode'=>'BarCode'); + $this->import_updatekeys_array[$r] = array('p.ref'=>'Ref'); + if (! empty($conf->barcode->enabled)) $this->import_updatekeys_array[$r]=array_merge($this->import_updatekeys_array[$r],array('p.barcode'=>'BarCode'));//only show/allow barcode as update key if Barcode module enabled if (! empty($conf->fournisseur->enabled)) { - // Import suppliers prices (note: this code is duplicated into module service) + // Import suppliers prices (note: this code is duplicated in module Service) $r++; $this->import_code[$r]=$this->rights_class.'_supplierprices'; $this->import_label[$r]="SuppliersPricesOfProductsOrServices"; // Translation key @@ -346,9 +425,15 @@ class modProduct extends DolibarrModules $this->import_entities_array[$r]=array(); // We define here only fields that use another icon that the one defined into import_icon $this->import_tables_array[$r]=array('sp'=>MAIN_DB_PREFIX.'product_fournisseur_price'); $this->import_tables_creator_array[$r]=array('sp'=>'fk_user'); - $this->import_fields_array[$r]=array( - 'sp.fk_product'=>"ProductOrService*", - 'sp.fk_soc'=>"Supplier*", 'sp.ref_fourn'=>'SupplierRef', 'sp.quantity'=>"QtyMin*", 'sp.tva_tx'=>'VATRate', 'sp.default_vat_code'=>'VATCode' + $this->import_fields_array[$r]=array(//field order as per structure of table llx_product_fournisseur_price, without optional fields + 'sp.fk_product'=>"ProductOrService*", + 'sp.fk_soc' => "Supplier*", + 'sp.ref_fourn' => 'SupplierRef', + 'sp.quantity' => "QtyMin*", + 'sp.tva_tx' => 'VATRate', + 'sp.default_vat_code' => 'VATCode', + 'sp.delivery_time_days' => 'DeliveryDelay', + 'sp.supplier_reputation' => 'SupplierReputation' ); if (is_object($mysoc) && $mysoc->useNPR()) $this->import_fields_array[$r]=array_merge($this->import_fields_array[$r],array('sp.recuperableonly'=>'VATNPR')); if (is_object($mysoc) && $mysoc->useLocalTax(1)) $this->import_fields_array[$r]=array_merge($this->import_fields_array[$r],array('sp.localtax1_tx'=>'LT1', 'sp.localtax1_type'=>'LT1Type')); @@ -358,22 +443,60 @@ class modProduct extends DolibarrModules 'sp.unitprice'=>'UnitPriceHT*', // TODO Make this field not required and calculate it from price and qty 'sp.remise_percent'=>'DiscountQtyMin' )); + + if ($conf->multicurrency->enabled) + { + $this->import_fields_array[$r]=array_merge($this->import_fields_array[$r],array( + 'sp.fk_multicurrency'=>'CurrencyCodeId',//ideally this should be automatically obtained from the CurrencyCode on the next line + 'sp.multicurrency_code'=>'CurrencyCode', + 'sp.multicurrency_tx'=>'CurrencyRate', + 'sp.multicurrency_unitprice'=>'CurrencyUnitPrice', + 'sp.multicurrency_price'=>'CurrencyPrice', + )); + } + $this->import_convertvalue_array[$r]=array( 'sp.fk_soc'=>array('rule'=>'fetchidfromref','classfile'=>'/societe/class/societe.class.php','class'=>'Societe','method'=>'fetch','element'=>'ThirdParty'), 'sp.fk_product'=>array('rule'=>'fetchidfromref','classfile'=>'/product/class/product.class.php','class'=>'Product','method'=>'fetch','element'=>'Product') ); - $this->import_examplevalues_array[$r]=array('sp.fk_product'=>"PREF123456", - 'sp.fk_soc'=>"My Supplier",'sp.ref_fourn'=>"SupplierRef", 'sp.quantity'=>"1", 'sp.tva_tx'=>'21', - 'sp.price'=>"50", - 'sp.unitprice'=>'50', - 'sp.remise_percent'=>'0' + + $this->import_examplevalues_array[$r]=array( + 'sp.fk_product' => "My Ref. eg: PREF123456", + 'sp.fk_soc' => "My Supplier", + 'sp.ref_fourn' => "eg: XYZ-F123456", + 'sp.quantity' => "eg: 5", + 'sp.tva_tx' => 'one of the defined rates eg. 21', + 'sp.default_vat_code' => '', + 'sp.delivery_time_days' => 'eg. 5', + 'sp.supplier_reputation' => 'FAVORITE / NOTTHGOOD / DONOTORDER' ); + if (is_object($mysoc) && $mysoc->useNPR()) $this->import_examplevalues_array[$r]=array_merge($this->import_examplevalues_array[$r],array('sp.recuperableonly'=>'')); + if (is_object($mysoc) && $mysoc->useLocalTax(1)) $this->import_examplevalues_array[$r]=array_merge($this->import_examplevalues_array[$r],array('sp.localtax1_tx'=>'LT1', 'sp.localtax1_type'=>'LT1Type')); + if (is_object($mysoc) && $mysoc->useLocalTax(2)) $this->import_examplevalues_array[$r]=array_merge($this->import_examplevalues_array[$r],array('sp.localtax2_tx'=>'LT2', 'sp.localtax2_type'=>'LT2Type')); + $this->import_examplevalues_array[$r] = array_merge($this->import_examplevalues_array[$r], array( + 'sp.price' => "eg. 50.00", + 'sp.unitprice' => 'eg. 10', + // TODO Make this field not required and calculate it from price and qty + 'sp.remise_percent' => 'eg: 20' + )); + if ($conf->multicurrency->enabled) + { + $this->import_examplevalues_array[$r]=array_merge($this->import_examplevalues_array[$r],array( + 'sp.fk_multicurrency'=>'eg: 2, rowid for code of multicurrency currency', + 'sp.multicurrency_code'=>'eg: GBP', + 'sp.multicurrency_tx'=>'currency rate eg: 1.12345', + 'sp.multicurrency_unitprice'=>'cost per unit in supplier currency', + // TODO Make this field not required and calculate it from price and qty + 'sp.multicurrency_price'=>'cost for min quantity in supplier currency' + )); + } + $this->import_updatekeys_array[$r]=array('sp.fk_product'=>'ProductOrService','sp.ref_fourn'=>'SupplierRef','sp.fk_soc'=>'Supplier'); } if (! empty($conf->global->PRODUIT_MULTIPRICES)) { - // Import product multiprice + // Import products multiprices $r++; $this->import_code[$r]=$this->rights_class.'_multiprice'; $this->import_label[$r]="ProductsOrServiceMultiPrice"; // Translation key @@ -400,6 +523,7 @@ class modProduct extends DolibarrModules if (! empty($conf->global->MAIN_MULTILANGS)) { + // Import translations of product names and descriptions $r++; $this->import_code[$r]=$this->rights_class.'_languages'; $this->import_label[$r]="ProductsOrServicesTranslations"; diff --git a/htdocs/core/modules/modSociete.class.php b/htdocs/core/modules/modSociete.class.php index 443c7ce1e48..3623e857270 100644 --- a/htdocs/core/modules/modSociete.class.php +++ b/htdocs/core/modules/modSociete.class.php @@ -261,11 +261,11 @@ class modSociete extends DolibarrModules $this->export_icon[$r]='company'; $this->export_permission[$r]=array(array("societe","export")); $this->export_fields_array[$r]=array( - 's.rowid'=>"Id",'s.nom'=>"Name",'s.name_alias'=>"AliasNames",'s.status'=>"Status",'s.client'=>"Customer",'s.fournisseur'=>"Supplier",'s.datec'=>"DateCreation",'s.tms'=>"DateLastModification", + 's.rowid'=>"Id",'s.nom'=>"Name",'s.name_alias'=>"AliasNameShort",'s.status'=>"Status",'s.client'=>"Customer",'s.fournisseur'=>"Supplier",'s.datec'=>"DateCreation",'s.tms'=>"DateLastModification", 's.code_client'=>"CustomerCode",'s.code_fournisseur'=>"SupplierCode",'s.code_compta'=>"AccountancyCode",'s.code_compta_fournisseur'=>"SupplierAccountancyCode", 's.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town",'d.nom'=>'State','c.label'=>"Country",'c.code'=>"CountryCode",'s.phone'=>"Phone",'s.fax'=>"Fax", 's.url'=>"Url",'s.email'=>"Email",'s.default_lang'=>"DefaultLang",'s.siren'=>"ProfId1",'s.siret'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4", - 's.idprof5'=>"ProfId5",'s.idprof6'=>"ProfId6",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note_private'=>"NotePrivate",'s.note_public'=>"NotePublic",'s.canvas'=>"Canvas", + 's.idprof5'=>"ProfId5",'s.idprof6'=>"ProfId6",'s.tva_intra'=>"VATIntraShort",'s.capital'=>"Capital",'s.note_private'=>"NotePrivate",'s.note_public'=>"NotePublic", 't.libelle'=>"ThirdPartyType",'ce.code'=>"Staff","cfj.libelle"=>"JuridicalStatus",'s.fk_prospectlevel'=>'ProspectLevel', 'st.code'=>'ProspectStatus','payterm.libelle'=>'PaymentConditions','paymode.libelle'=>'PaymentMode' ); @@ -280,7 +280,7 @@ class modSociete extends DolibarrModules include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; $this->export_fields_array[$r]+=array('u.login'=>'SaleRepresentativeLogin','u.firstname'=>'SaleRepresentativeFirstname', 'u.lastname'=>'SaleRepresentativeLastname'); //$this->export_TypeFields_array[$r]=array( - // 's.rowid'=>"List:societe:nom", 's.nom'=>"Text", 's.name_alias'=>"Text", 's.status'=>"Text",'s.client'=>"Boolean",'s.fournisseur'=>"Boolean",'s.datec'=>"Date",'s.tms'=>"Date", + // 's.rowid'=>"List:societe:nom",'s.nom'=>"Text",'s.status'=>"Text",'s.client'=>"Boolean",'s.fournisseur'=>"Boolean",'s.datec'=>"Date",'s.tms'=>"Date", // 's.code_client'=>"Text",'s.code_fournisseur'=>"Text",'s.address'=>"Text",'s.zip'=>"Text",'s.town'=>"Text",'c.label'=>"List:c_country:label:label", // 'c.code'=>"Text",'s.phone'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text",'s.default_lang'=>"Text",'s.siret'=>"Text",'s.siren'=>"Text", // 's.ape'=>"Text",'s.idprof4'=>"Text",'s.idprof5'=>"Text",'s.idprof6'=>"Text",'s.tva_intra'=>"Text",'s.capital'=>"Numeric",'s.note'=>"Text", @@ -288,11 +288,11 @@ class modSociete extends DolibarrModules // 's.fk_stcomm'=>'List:c_stcomm:libelle:code','d.nom'=>'List:c_departements:nom:rowid' //); $this->export_TypeFields_array[$r]=array( - 's.rowid'=>"Numeric", 's.nom'=>"Text", 's.name_alias'=>"Text", 's.status'=>"Numeric",'s.client'=>"Numeric",'s.fournisseur'=>"Boolean",'s.datec'=>"Date",'s.tms'=>"Date", + 's.rowid'=>"Numeric", 's.nom'=>"Text",'s.name_alias'=>"Text",'s.status'=>"Numeric",'s.client'=>"Numeric",'s.fournisseur'=>"Boolean",'s.datec'=>"Date",'s.tms'=>"Date", 's.code_client'=>"Text",'s.code_fournisseur'=>"Text",'s.code_compta'=>"Text",'s.code_compta_fournisseur'=>"Text",'s.address'=>"Text",'s.zip'=>"Text", 's.town'=>"Text",'c.label'=>"List:c_country:label:label",'c.code'=>"Text",'s.phone'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text", 's.default_lang'=>"Text",'s.siret'=>"Text",'s.siren'=>"Text",'s.ape'=>"Text",'s.idprof4'=>"Text",'s.idprof5'=>"Text",'s.idprof6'=>"Text", - 's.tva_intra'=>"Text",'s.capital'=>"Numeric",'s.note_private'=>"Text",'s.note_public'=>"Text",'s.canvas'=>"Text",'t.libelle'=>"Text", + 's.tva_intra'=>"Text",'s.capital'=>"Numeric",'s.note_private'=>"Text",'s.note_public'=>"Text",'t.libelle'=>"Text", 'ce.code'=>"List:c_effectif:libelle:code","cfj.libelle"=>"Text",'s.fk_prospectlevel'=>'List:c_prospectlevel:label:code', 'st.code'=>'List:c_stcomm:libelle:code','d.nom'=>'Text','u.login'=>'Text','u.firstname'=>'Text','u.lastname'=>'Text','payterm.libelle'=>'Text', 'paymode.libelle'=>'Text','s.entity'=>'Numeric' @@ -374,122 +374,333 @@ class modSociete extends DolibarrModules } - // Imports - //-------- - $r=0; + // Imports + //-------- + $r = 0; - // Import list of third parties and attributes - $r++; - $this->import_code[$r]=$this->rights_class.'_'.$r; - $this->import_label[$r]='ImportDataset_company_1'; - $this->import_icon[$r]='company'; - $this->import_entities_array[$r]=array(); // We define here only fields that use another icon that the one defined into import_icon - $this->import_tables_array[$r]=array('s'=>MAIN_DB_PREFIX.'societe','extra'=>MAIN_DB_PREFIX.'societe_extrafields'); // List of tables to insert into (insert done in same order) - $this->import_fields_array[$r]=array( - 's.nom'=>"Name*", 's.name_alias'=>"Alias", 's.status'=>"Status",'s.client'=>"Customer*",'s.fournisseur'=>"Supplier*",'s.code_client'=>"CustomerCode",'s.code_fournisseur'=>"SupplierCode", - 's.code_compta'=>"CustomerAccountancyCode",'s.code_compta_fournisseur'=>"SupplierAccountancyCode",'s.address'=>"Address",'s.zip'=>"Zip",'s.town'=>"Town", - 's.fk_departement'=>"StateId",'s.fk_pays'=>"CountryCode",'s.phone'=>"Phone",'s.fax'=>"Fax",'s.url'=>"Url",'s.email'=>"Email",'s.siren'=>"ProfId1", - 's.siret'=>"ProfId2",'s.ape'=>"ProfId3",'s.idprof4'=>"ProfId4",'s.idprof5'=>"ProfId5",'s.idprof6'=>"ProfId6",'s.tva_intra'=>"VATIntraShort", - 's.capital'=>"Capital",'s.note_private'=>"NotePrivate",'s.note_public'=>"NotePublic",'s.canvas'=>"Canvas",'s.fk_typent'=>"ThirdPartyType",'s.fk_effectif'=>"Staff", - "s.fk_forme_juridique"=>"JuridicalStatus",'s.fk_prospectlevel'=>'ProspectLevel','s.fk_stcomm'=>'ProspectStatus','s.default_lang'=>'DefaultLanguage', - 's.barcode'=>'BarCode','s.datec'=>"DateCreation" - ); - // Add extra fields - $sql="SELECT name, label, fieldrequired FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = 'societe' AND entity IN (0,".$conf->entity.")"; - $resql=$this->db->query($sql); - if ($resql) // This can fail when class is used on old database (during migration for example) - { - while ($obj=$this->db->fetch_object($resql)) - { - $fieldname='extra.'.$obj->name; - $fieldlabel=ucfirst($obj->label); - $this->import_fields_array[$r][$fieldname]=$fieldlabel.($obj->fieldrequired?'*':''); - } - } - // End add extra fields - $this->import_fieldshidden_array[$r]=array('s.fk_user_creat'=>'user->id','extra.fk_object'=>'lastrowid-'.MAIN_DB_PREFIX.'societe'); // aliastable.field => ('user->id' or 'lastrowid-'.tableparent) - $this->import_convertvalue_array[$r]=array( - 's.fk_typent'=>array('rule'=>'fetchidfromcodeorlabel','classfile'=>'/core/class/ctypent.class.php','class'=>'Ctypent','method'=>'fetch','dict'=>'DictionaryCompanyType'), - 's.fk_departement'=>array('rule'=>'fetchidfromcodeid','classfile'=>'/core/class/cstate.class.php','class'=>'Cstate','method'=>'fetch','dict'=>'DictionaryState'), - 's.fk_pays'=>array('rule'=>'fetchidfromcodeid','classfile'=>'/core/class/ccountry.class.php','class'=>'Ccountry','method'=>'fetch','dict'=>'DictionaryCountry'), - 's.fk_stcomm'=>array('rule'=>'zeroifnull'), - 's.code_client'=>array('rule'=>'getcustomercodeifauto'), - 's.code_fournisseur'=>array('rule'=>'getsuppliercodeifauto'), - 's.code_compta'=>array('rule'=>'getcustomeraccountancycodeifauto'), - 's.code_compta_fournisseur'=>array('rule'=>'getsupplieraccountancycodeifauto'), - 's.capital'=>array('rule'=>'numeric') - ); - //$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]( [0-9][0-9]:[0-9][0-9]:[0-9][0-9])?$'); - $this->import_examplevalues_array[$r]=array( - 's.nom'=>"MyBigCompany", 's.name_alias'=>"MyBigAlias", '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(dol_now(),'%Y-%m-%d'),'s.code_client'=>'CU01-0001 or empty or "auto"','s.code_fournisseur'=>'SU01-0001 or empty or "auto"', - 's.address'=>"61 jump street",'s.zip'=>"123456",'s.town'=>"Big town",'s.fk_pays'=>'US, FR, DE...','s.phone'=>"0101010101",'s.fax'=>"0101010102", - 's.url'=>"http://mycompany.com",'s.email'=>"test@mycompany.com",'s.siret'=>"",'s.siren'=>"",'s.ape'=>"",'s.idprof4'=>"",'s.idprof5'=>"",'s.idprof6'=>"", - 's.tva_intra'=>"FR0123456789",'s.capital'=>"10000",'s.note_private'=>"This is an example of private note for record",'s.note_public'=>"This is an example of public note for record", - 's.fk_typent'=>"2",'s.fk_effectif'=>"3","s.fk_forme_juridique"=>"1",'s.fk_prospectlevel'=>'PL_MEDIUM','s.fk_stcomm'=>'0','s.default_lang'=>'en_US','s.barcode'=>'123456789', - 's.datec'=>"2015-01-01 or 2015-01-01 12:30:00" - ); - $this->import_updatekeys_array[$r]=array('s.nom'=>'Name','s.code_client'=>'CustomerCode','s.code_fournisseur'=>'SupplierCode','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode'); + // Import list of third parties and attributes - // Import list of contact and attributes - $r++; - $this->import_code[$r]=$this->rights_class.'_'.$r; - $this->import_label[$r]='ImportDataset_company_2'; - $this->import_icon[$r]='contact'; - $this->import_entities_array[$r]=array('s.fk_soc'=>'company'); // We define here only fields that use another icon that the one defined into import_icon - $this->import_tables_array[$r]=array('s'=>MAIN_DB_PREFIX.'socpeople','extra'=>MAIN_DB_PREFIX.'socpeople_extrafields'); // List of tables to insert into (insert done in same order) - $this->import_fields_array[$r]=array( - 's.fk_soc'=>'ThirdPartyName','s.civility'=>'UserTitle','s.lastname'=>"Lastname*",'s.firstname'=>"Firstname",'s.address'=>"Address",'s.zip'=>"Zip", - 's.town'=>"Town",'s.fk_departement'=>"StateId",'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_private'=>"Note",'s.note_public'=>"Note",'s.datec'=>"DateCreation" - ); - // Add extra fields - $sql="SELECT name, label, fieldrequired FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = 'socpeople' AND entity IN (0,".$conf->entity.")"; - $resql=$this->db->query($sql); - if ($resql) // This can fail when class is used on old database (during migration for example) - { - while ($obj=$this->db->fetch_object($resql)) - { - $fieldname='extra.'.$obj->name; - $fieldlabel=ucfirst($obj->label); - $this->import_fields_array[$r][$fieldname]=$fieldlabel.($obj->fieldrequired?'*':''); - } - } - // End add extra fields - $this->import_fieldshidden_array[$r]=array('s.fk_user_creat'=>'user->id','extra.fk_object'=>'lastrowid-'.MAIN_DB_PREFIX.'socpeople'); // aliastable.field => ('user->id' or 'lastrowid-'.tableparent) - $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_departement'=>array('rule'=>'fetchidfromcodeid','classfile'=>'/core/class/cstate.class.php','class'=>'Cstate','method'=>'fetch','dict'=>'DictionaryState'), - 's.fk_pays'=>array('rule'=>'fetchidfromcodeid','classfile'=>'/core/class/ccountry.class.php','class'=>'Ccountry','method'=>'fetch','dict'=>'DictionaryCountry'), - ); - //$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]( [0-9][0-9]:[0-9][0-9]:[0-9][0-9])?$'); - $this->import_examplevalues_array[$r]=array( - 's.fk_soc'=>'MyBigCompany','s.civility'=>"MR",'s.lastname'=>"Smith",'s.firstname'=>'John','s.address'=>'61 jump street','s.zip'=>'75000', - 's.town'=>'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_private'=>"My private note",'s.note_public'=>"My public note" - ); + $r++; + $this->import_code[$r] = $this->rights_class . '_' . $r; + $this->import_label[$r] = 'ImportDataset_company_1'; + $this->import_icon[$r] = 'company'; + $this->import_entities_array[$r] = array(); // We define here only fields that use a different icon from the one defined in import_icon + $this->import_tables_array[$r] = array( + 's' => MAIN_DB_PREFIX . 'societe', + 'extra' => MAIN_DB_PREFIX . 'societe_extrafields' + ); // List of tables to insert into (insert done in same order) + $this->import_fields_array[$r] = array(//field order as per structure of table llx_societe + 's.nom' => "Name*", + 's.name_alias' => "AliasNameShort", + 's.status' => "Status", + 's.code_client' => "CustomerCode", + 's.code_fournisseur' => "SupplierCode", + 's.code_compta' => "CustomerAccountancyCode", + 's.code_compta_fournisseur' => "SupplierAccountancyCode", + 's.address' => "Address", + 's.zip' => "Zip", + 's.town' => "Town", + 's.fk_departement' => "StateId", + 's.fk_pays' => "CountryCode", + 's.phone' => "Phone", + 's.fax' => "Fax", + 's.url' => "Url", + 's.email' => "Email", + 's.skype' => "Skype", + 's.fk_effectif' => "Staff", + 's.fk_typent' => "ThirdPartyType", + "s.fk_forme_juridique" => "JuridicalStatus", + 's.siren' => "ProfId1", + 's.siret' => "ProfId2", + 's.ape' => "ProfId3", + 's.idprof4' => "ProfId4", + 's.idprof5' => "ProfId5", + 's.idprof6' => "ProfId6", + 's.tva_intra' => "VATIntraShort", + 's.capital' => "Capital", + 's.fk_stcomm' => 'ProspectStatus', + 's.note_private' => "NotePrivate", + 's.note_public' => "NotePublic", + 's.client' => "Customer*", + 's.fournisseur' => "Supplier*", + 's.fk_prospectlevel' => 'ProspectLevel', + 's.mode_reglement' => 'PaymentTypeCustomer', + 's.cond_reglement' => "PaymentTermsCustomer", + 's.mode_reglement_supplier' => 'PaymentTypeSupplier', + 's.cond_reglement_supplier' => "PaymentTermsSupplier", + 's.tva_assuj' => 'VATIsUsed', + 's.barcode' => 'BarCode', + 's.default_lang' => 'DefaultLanguage', + 's.canvas' => "Canvas", + 's.datec' => "DateCreation", + 's.fk_multicurrency' => 'MulticurrencyUsed', + 's.multicurrency_code' => 'MulticurrencyCurrency' + ); + // Add extra fields + $sql = "SELECT name, label, fieldrequired FROM " . MAIN_DB_PREFIX . "extrafields WHERE elementtype = 'societe' AND entity = " . $conf->entity; + $resql = $this->db->query($sql); + if ($resql) // This can fail when class is used on old database (during migration for example) + { + while ($obj = $this->db->fetch_object($resql)) { + $fieldname = 'extra.' . $obj->name; + $fieldlabel = ucfirst($obj->label); + $this->import_fields_array[$r][$fieldname] = $fieldlabel . ($obj->fieldrequired ? '*' : ''); + } + } + // End add extra fields + $this->import_fieldshidden_array[$r] = array( + 's.fk_user_creat' => 'user->id', + 'extra.fk_object' => 'lastrowid-' . MAIN_DB_PREFIX . 'societe' + ); // aliastable.field => ('user->id' or 'lastrowid-'.tableparent) + $this->import_convertvalue_array[$r] = array(//field order as per structure of table llx_societe + 's.code_client' => array('rule' => 'getcustomercodeifauto'), + 's.code_fournisseur' => array('rule' => 'getsuppliercodeifauto'), + 's.code_compta' => array('rule' => 'getcustomeraccountancycodeifauto'), + 's.code_compta_fournisseur' => array('rule' => 'getsupplieraccountancycodeifauto'), + 's.fk_departement' => array( + 'rule' => 'fetchidfromcodeid', + 'classfile' => '/core/class/cstate.class.php', + 'class' => 'Cstate', + 'method' => 'fetch', + 'dict' => 'DictionaryState' + ), + 's.fk_pays' => array( + 'rule' => 'fetchidfromcodeid', + 'classfile' => '/core/class/ccountry.class.php', + 'class' => 'Ccountry', + 'method' => 'fetch', + 'dict' => 'DictionaryCountry' + ), + 's.fk_typent' => array( + 'rule' => 'fetchidfromcodeorlabel', + 'classfile' => '/core/class/ctypent.class.php', + 'class' => 'Ctypent', + 'method' => 'fetch', + 'dict' => 'DictionaryCompanyType' + ), + 's.capital' => array('rule' => 'numeric'), + 's.fk_stcomm' => array('rule' => 'zeroifnull'), + ); + //$this->import_convertvalue_array[$r]=array('s.fk_soc'=>array('rule'=>'lastrowid',table='t'); + $this->import_regex_array[$r] = array(//field order as per structure of table llx_societe + 's.status' => '^[0|1]', + 's.fk_typent' => 'id@' . MAIN_DB_PREFIX . 'c_typent', + 's.client' => '^[0|1|2|3]', + 's.fournisseur' => '^[0|1]', + 's.mode_reglement' => 'id@' . MAIN_DB_PREFIX . 'c_paiement', + 's.cond_reglement' => 'rowid@' . MAIN_DB_PREFIX . 'c_payment_term', + 's.mode_reglement_supplier' => 'id@' . MAIN_DB_PREFIX . 'c_paiement', + 's.cond_reglement_supplier' => 'rowid@' . MAIN_DB_PREFIX . 'c_payment_term', + 's.tva_assuj' => '^[0|1]', + 's.fk_multicurrency' => '^[0|1]', + 's.datec' => '^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]( [0-9][0-9]:[0-9][0-9]:[0-9][0-9])?$', + 's.multicurrency_code' => 'code_iso@' . MAIN_DB_PREFIX . 'c_currencies' + ); - // Import Bank Accounts - $r++; - $this->import_code[$r]=$this->rights_class.'_'.$r; - $this->import_label[$r]="ImportDataset_company_3"; // Translation key - $this->import_icon[$r]='company'; - $this->import_entities_array[$r]=array(); // We define here only fields that use another icon that the one defined into import_icon - $this->import_tables_array[$r]=array('sr'=>MAIN_DB_PREFIX.'societe_rib'); - $this->import_fields_array[$r]=array('sr.fk_soc'=>"ThirdPartyName*",'sr.bank'=>"Bank", - 'sr.code_banque'=>"BankCode",'sr.code_guichet'=>"DeskCode",'sr.number'=>"BankAccountNumber*", - 'sr.cle_rib'=>"BankAccountNumberKey",'sr.bic'=>"BIC",'sr.iban_prefix'=>"IBAN", 'sr.domiciliation'=>"BankAccountDomiciliation",'sr.proprio' => "BankAccountOwner", 'sr.owner_address' => "BankAccountOwnerAddress", 'sr.default_rib' => 'Default' - ); + $this->import_examplevalues_array[$r] = array(//field order as per structure of table llx_societe + 's.nom' => "TPBigCompany", + 's.name_alias' => "Alias for TPBigCompany", + 's.status' => "0 (closed) / 1 (active)", + 's.code_client' => 'eg. CU01-0001 / empty / "auto"', + 's.code_fournisseur' => 'eg. SU01-0001 / empty / "auto"', + 's.code_compta' => "Code or empty to be auto-created", + 's.code_compta_fournisseur' => "Code or empty to be auto-created", + 's.address' => "61 Jump Street", + 's.zip' => "123456", + 's.town' => "Bigtown", + 's.fk_departement' => 'matches field "code_departement" in table "' . MAIN_DB_PREFIX . 'c_departements"', + 's.fk_pays' => 'US/FR/DE etc. matches field "code" in table "' . MAIN_DB_PREFIX . 'c_country"', + 's.phone' => "eg: +34123456789", + 's.fax' => "eg. +34987654321", + 's.url' => "e.g. https://www.mybigcompany.com", + 's.email' => "e.g. test@mybigcompany.com", + 's.skype' => "Skype name", + 's.fk_effectif' => "1/2/3/5: represents one of the five ranges of employees", + 's.fk_typent' => 'matches field "id" (1-9 etc.) OR "code" (TE_SMALL etc.) in table "' . MAIN_DB_PREFIX . 'c_typent"', + 's.fk_forme_juridique' => '1/2/3 etc...matches field "code" in table "' . MAIN_DB_PREFIX . 'c_forme_juridique"', + 's.siret' => "", + 's.siren' => "", + 's.ape' => "", + 's.idprof4' => "", + 's.idprof5' => "", + 's.idprof6' => "", + 's.tva_intra' => 'VAT number e.g."FR0123456789"', + 's.capital' => "10000", + 's.fk_stcomm' => '-1/0/1/2 etc... matches field "id" in table "' . MAIN_DB_PREFIX . 'c_stcomm"', + 's.note_private' => "Example of a PRIVATE note.", + 's.note_public' => "Example of a PUBLIC note.", + 's.client' => '0 (no customer no prospect) / 1 (customer) / 2 (prospect)/ 3 (customer and prospect)', + 's.fournisseur' => '0 (not supplier) / 1 (supplier)', + 's.fk_prospectlevel' => 'eg. "PL_MEDIUM" matches field "code" in table "' . MAIN_DB_PREFIX . 'c_prospectlevel"', + 's.mode_reglement' => '1/2/3...matches field "id" in table "' . MAIN_DB_PREFIX . 'c_paiement"', + 's.cond_reglement' => '1/2/3...matches field "rowid" in table "' . MAIN_DB_PREFIX . 'c_payment_term"', + 's.mode_reglement_supplier' => '1/2/3...matches field "id" in table "' . MAIN_DB_PREFIX . 'c_paiement"', + 's.cond_reglement_supplier' => '1/2/3...matches field "rowid" in table "' . MAIN_DB_PREFIX . 'c_payment_term"', + 's.tva_assuj' => '0 (VAT not used) / 1 (VAT used)', + 's.barcode' => '123456789', + 's.default_lang' => 'en_US / es_ES etc...matches a language directory in htdocs/langs/', + 's.canvas' => "empty / a custom canvas form layout url e.g. mycanvas@mymodule", + 's.datec' => 'formatted as ' . dol_print_date(dol_now(), '%Y-%m-%d'), + 's.fk_multicurrency' => '0 (use system default currency) / 1 (use local currency)', + 's.multicurrency_code' => 'GBP/USD etc... matches field "code_iso" in table "' . MAIN_DB_PREFIX . 'c_currencies"' + ); + $this->import_updatekeys_array[$r] = array( + 's.nom' => 'Name', + 's.code_client' => 'CustomerCode', + 's.code_fournisseur' => 'SupplierCode', + 's.code_compta' => 'CustomerAccountancyCode', + 's.code_compta_fournisseur' => 'SupplierAccountancyCode' + ); - $this->import_convertvalue_array[$r]=array( - 'sr.fk_soc'=>array('rule'=>'fetchidfromref','classfile'=>'/societe/class/societe.class.php','class'=>'Societe','method'=>'fetch','element'=>'ThirdParty') - ); - $this->import_examplevalues_array[$r]=array('sr.fk_soc'=>"MyBigCompany",'sr.bank'=>"ING", - 'sr.code_banque'=>"0000", 'sr.code_guichet'=>"1111",'sr.number'=>"3333333333", - 'sr.cle_rib'=>"22",'sr.bic'=>"USHINGMMXXX",'sr.iban_prefix'=>"US00 0000 1111 22 3333 3333",'sr.domiciliation'=>"PARIS",'sr.proprio' => "Name of owner", 'sr.owner_address' => "15 paris street 75000 Paris", 'sr.default_rib' => '1 or 0' - ); + // Import list of contacts/additional addresses and attributes + $r++; + $this->import_code[$r] = $this->rights_class . '_' . $r; + $this->import_label[$r] = 'ImportDataset_company_2'; + $this->import_icon[$r] = 'contact'; + $this->import_entities_array[$r] = array('s.fk_soc' => 'company'); // We define here only fields that use a different icon than the one defined in import_icon + $this->import_tables_array[$r] = array( + 's' => MAIN_DB_PREFIX . 'socpeople', + 'extra' => MAIN_DB_PREFIX . 'socpeople_extrafields' + ); // List of tables to insert into (insert done in same order) + $this->import_fields_array[$r] = array(//field order as per structure of table llx_socpeople + 's.datec' => "DateCreation", + 's.fk_soc' => 'ThirdPartyName', + 's.civility' => 'UserTitle', + 's.lastname' => "Lastname*", + 's.firstname' => "Firstname", + 's.address' => "Address", + 's.zip' => "Zip", + 's.town' => "Town", + 's.fk_departement' => "StateId", + '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.skype' => "Skype", + 's.note_private' => "NotePrivate", + 's.note_public' => "NotePublic" + ); + // Add extra fields + $sql = "SELECT name, label, fieldrequired FROM " . MAIN_DB_PREFIX . "extrafields WHERE elementtype = 'socpeople' AND entity = " . $conf->entity; + $resql = $this->db->query($sql); + if ($resql) // This can fail when class is used on an old database (during a migration for example) + { + while ($obj = $this->db->fetch_object($resql)) { + $fieldname = 'extra.' . $obj->name; + $fieldlabel = ucfirst($obj->label); + $this->import_fields_array[$r][$fieldname] = $fieldlabel . ($obj->fieldrequired ? '*' : ''); + } + } + // End add extra fields + $this->import_fieldshidden_array[$r] = array( + 's.fk_user_creat' => 'user->id', + 'extra.fk_object' => 'lastrowid-' . MAIN_DB_PREFIX . 'socpeople' + ); // aliastable.field => ('user->id' or 'lastrowid-'.tableparent) + $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_departement' => array( + 'rule' => 'fetchidfromcodeid', + 'classfile' => '/core/class/cstate.class.php', + 'class' => 'Cstate', + 'method' => 'fetch', + 'dict' => 'DictionaryState' + ), + 's.fk_pays' => array( + 'rule' => 'fetchidfromcodeid', + 'classfile' => '/core/class/ccountry.class.php', + 'class' => 'Ccountry', + 'method' => 'fetch', + 'dict' => 'DictionaryCountry' + ), + ); + //$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]( [0-9][0-9]:[0-9][0-9]:[0-9][0-9])?$' + ); + $this->import_examplevalues_array[$r] = array(//field order as per structure of table llx_socpeople + 's.datec' => 'formatted as ' . dol_print_date(dol_now(), '%Y-%m-%d'), + 's.fk_soc' => 'Third Party name eg. TPBigCompany', + 's.civility' => 'honorific eg: MR...matches field "code" in table "' . MAIN_DB_PREFIX . 'c_civility"', + 's.lastname' => "lastname or label", + 's.firstname' => 'John', + 's.address' => '61 Jump street', + 's.zip' => '75000', + 's.town' => 'Bigtown', + 's.fk_departement' => 'matches field "code_departement" in table "' . MAIN_DB_PREFIX . 'c_departements"', + 's.fk_pays' => 'US/FR/DE etc. matches field "code" in table "' . MAIN_DB_PREFIX . 'c_country"', + 's.birthday' => 'formatted as ' . dol_print_date(dol_now(), '%Y-%m-%d'), + 's.poste' => "Director", + 's.phone' => "5551122", + 's.phone_perso' => "5551133", + 's.phone_mobile' => "5551144", + 's.fax' => "5551155", + 's.email' => "johnsmith@email.com", + 's.skype' => "skype username", + 's.note_private' => "My private note", + 's.note_public' => "My public note" + ); + + // Import Bank Accounts + $r++; + $this->import_code[$r] = $this->rights_class . '_' . $r; + $this->import_label[$r] = "ImportDataset_company_3"; // Translation key + $this->import_icon[$r] = 'company'; + $this->import_entities_array[$r] = array(); // We define here only fields that use a different icon to the one defined in import_icon + $this->import_tables_array[$r] = array('sr' => MAIN_DB_PREFIX . 'societe_rib'); + $this->import_fields_array[$r] = array(//field order as per structure of table llx_societe_rib + 'sr.label' => "Label*", + 'sr.fk_soc' => "ThirdPartyName*", + 'sr.datec' => "DateCreation*", + 'sr.bank' => "Bank", + 'sr.code_banque' => "BankCode", + 'sr.code_guichet' => "DeskCode", + 'sr.number' => "BankAccountNumber*", + 'sr.cle_rib' => "BankAccountNumberKey", + 'sr.bic' => "BIC", + 'sr.iban_prefix' => "IBAN", + 'sr.domiciliation' => "BankAccountDomiciliation", + 'sr.proprio' => "BankAccountOwner", + 'sr.owner_address' => "BankAccountOwnerAddress", + 'sr.default_rib' => 'Default' + ); + + $this->import_convertvalue_array[$r] = array( + 'sr.fk_soc' => array( + 'rule' => 'fetchidfromref', + 'classfile' => '/societe/class/societe.class.php', + 'class' => 'Societe', + 'method' => 'fetch', + 'element' => 'ThirdParty' + ) + ); + $this->import_examplevalues_array[$r] = array(//field order as per structure of table llx_societe_rib + 'sr.label' => 'eg. "account1"', + 'sr.fk_soc' => 'eg. "TPBigCompany"', + 'sr.datec' => 'date used for creating direct debit UMR formatted as ' . dol_print_date(dol_now(), + '%Y-%m-%d'), + 'sr.bank' => 'bank name eg: "ING-Direct"', + 'sr.code_banque' => 'account sort code (GB)/Routing number (US) eg. "8456"', + 'sr.code_guichet' => "bank code for office/branch", + 'sr.number' => 'account number eg. "3333333333"', + 'sr.cle_rib' => 'account checksum/control digits (if used) eg. "22"', + 'sr.bic' => 'bank identifier eg. "USHINGMMXXX"', + 'sr.iban_prefix' => 'complete account IBAN eg. "GB78CPBK08925068637123"', + 'sr.domiciliation' => 'bank branch address eg. "PARIS"', + 'sr.proprio' => 'name on the bank account', + 'sr.owner_address' => 'address of account holder', + 'sr.default_rib' => '1 (default account) / 0 (not default)' + ); // Import Company Sales representatives $r++; diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index 2e4ae5da357..04fc651685f 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -358,7 +358,7 @@ if ($step == 1 || ! $datatoimport) { //var_dump($objimport->array_import_code[$key]); $val=!$val; - print ''; + print ''; $titleofmodule=$objimport->array_import_module[$key]->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"); @@ -367,7 +367,7 @@ if ($step == 1 || ! $datatoimport) //print $value; print img_object($objimport->array_import_module[$key]->getName(),$objimport->array_import_icon[$key]).' '; print $objimport->array_import_label[$key]; - print ''; + print ''; if ($objimport->array_import_perms[$key]) { print ''.img_picto($langs->trans("NewImport"),'filenew').''; @@ -453,9 +453,9 @@ if ($step == 2 && $datatoimport) print ''.img_picto_common($key,$objmodelimport->getPictoForKey($key)).''; $text=$objmodelimport->getDriverDescForKey($key); print ''.$form->textwithpicto($objmodelimport->getDriverLabelForKey($key),$text).''; - print ''.$langs->trans("DownloadEmptyExample").''; + print ''.$langs->trans("DownloadEmptyExample").''; // Action button - print ''; + print ''; print ''.img_picto($langs->trans("SelectFormat"),'filenew').''; print ''; print ''; @@ -528,7 +528,7 @@ if ($step == 3 && $datatoimport) print ''; $text=$objmodelimport->getDriverDescForKey($format); print $form->textwithpicto($objmodelimport->getDriverLabelForKey($format),$text); - print ''.$langs->trans("DownloadEmptyExample").''; + print ''.$langs->trans("DownloadEmptyExample").''; print ''; @@ -617,14 +617,14 @@ if ($step == 3 && $datatoimport) print ''; print ''; // Affiche taille fichier - print ''.dol_print_size(dol_filesize($dir.'/'.$file)).''; + print ''.dol_print_size(dol_filesize($dir.'/'.$file)).''; // Affiche date fichier - print ''.dol_print_date(dol_filemtime($dir.'/'.$file),'dayhour').''; + print ''.dol_print_date(dol_filemtime($dir.'/'.$file),'dayhour').''; // Del button - print ''.img_delete().''; // Action button - print ''; + print ''; print ''.img_picto($langs->trans("NewImport"),'filenew').''; print ''; print ''; @@ -900,15 +900,15 @@ if ($step == 4 && $datatoimport) print ''; - // List of targets fields - $height=24; + // List of target fields + $height='24px';//needs px for css height attribute below $i = 0; $mandatoryfieldshavesource=true; print ''; foreach($fieldstarget as $code=>$label) { - print ''; + print ''; $i++; $entity=(! empty($objimport->array_import_entities[0][$code])?$objimport->array_import_entities[0][$code]:$objimport->array_import_icon[0]); @@ -934,7 +934,7 @@ if ($step == 4 && $datatoimport) print $text; print ''; // Info field - print ''; print ''; - print ''; @@ -1145,7 +1145,7 @@ if ($step == 4 && $datatoimport) $obj = $db->fetch_object($resql); print ''; - // Nb of fields + // Total lines in source file print ''; - // Lines nb to import + // Range of lines to import print ''; - // Keys for update + // Keys for data UPDATE (not INSERT of new data) print '
'; + print ''; $filecolumn=$array_match_database_to_file[$code]; // Source field info $htmltext =''.$langs->trans("FieldSource").'
'; @@ -1125,7 +1125,7 @@ if ($step == 4 && $datatoimport) print '
'; + print ''; print ''; print '
'; print $obj->label; - print ''; + print ''; print 'rowid.'&filetoimport='.urlencode($filetoimport).'">'; print img_delete(); print ''; @@ -1275,14 +1275,14 @@ if ($step == 5 && $datatoimport) print ''; print '
'; print $langs->trans("NbOfSourceLines"); print ''; print $nboflines; print '
'; print $langs->trans("ImportFromToLine"); print ''; @@ -1310,7 +1310,7 @@ if ($step == 5 && $datatoimport) if ($action == 'launchsimu') print '   '.$langs->trans("Modify").''; print '
'; print $langs->trans("KeysToUseForUpdates"); print ''; @@ -1328,8 +1328,8 @@ if ($step == 5 && $datatoimport) } print '   '.$langs->trans("Modify").''; } else { - if (count($objimport->array_import_updatekeys[0])) - { + if ($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")); } @@ -1475,7 +1475,7 @@ if ($step == 5 && $datatoimport) $arrayrecord=$obj->import_read_record(); if ($arrayrecord === false) { - $arrayofwarnings[$sourcelinenb][0]=array('lib'=>'File has '.$nboflines.' lines. However we reach end of file after record '.$sourcelinenb.'. This may occurs when some records are split onto several lines.','type'=>'EOF_RECORD_ON_SEVERAL_LINES'); + $arrayofwarnings[$sourcelinenb][0]=array('lib'=>'File has '.$nboflines.' lines. However we reach end of file after record '.$sourcelinenb.'. This may occurs when some records are split onto several lines. Ensure the complete string is delimited correctly when there is a separator character in the text string.','type'=>'EOF_RECORD_ON_SEVERAL_LINES'); $endoffile++; continue; } @@ -1520,11 +1520,11 @@ if ($step == 5 && $datatoimport) // Show OK if (! count($arrayoferrors) && ! count($arrayofwarnings)) { - print '
'.img_picto($langs->trans("OK"),'tick').' '.$langs->trans("NoError").'


'; + print '
'.img_picto($langs->trans("OK"),'tick').' '.$langs->trans("NoError").'


'; print $langs->trans("NbInsert", $obj->nbinsert).'
'; print $langs->trans("NbUpdate", $obj->nbupdate).'

'; } - else print ''.$langs->trans("NbOfLinesOK",$nbok).'

'; + else print $langs->trans("NbOfLinesOK",$nbok).'

'; // Show Errors //var_dump($arrayoferrors); @@ -1929,15 +1929,22 @@ function show_elem($fieldssource,$pos,$key,$var,$nostyle='') { global $langs,$bc; - $height='24'; + $height='24px'; + 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"; print '
'."\n"; + } + if ($pos && $pos > count($fieldssource)) // No fields { - print ''; + print ''; print ''; @@ -1948,7 +1955,7 @@ function show_elem($fieldssource,$pos,$key,$var,$nostyle='') } elseif ($key == 'none') // Empty line { - print ''; + print ''; print ''; @@ -1959,7 +1966,7 @@ function show_elem($fieldssource,$pos,$key,$var,$nostyle='') } else // Print field of source file { - print ''; + print ''; print '
'; print img_picto(($pos>0?$langs->trans("MoveField",$pos):''),'grip_title','class="boxhandle" style="cursor:move;"'); 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;"'); diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index a60e2e3adfa..15edbc80e2a 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -433,3 +433,10 @@ SaleRepresentativeFirstname=First name of sales representative SaleRepresentativeLastname=Last name of sales representative ErrorThirdpartiesMerge=There was an error when deleting the third parties. Please check the log. Changes have been reverted. NewCustomerSupplierCodeProposed=Customer or Vendor code already used, a new code is suggested +#Imports +PaymentTypeCustomer=Payment Type - Customer +PaymentTermsCustomer=Payment Terms - Customer +PaymentTypeSupplier=Payment Type - Vendor +PaymentTermsSupplier=Payment Term - Vendor +MulticurrencyUsed=Use Multicurrency +MulticurrencyCurrency=Currency \ No newline at end of file