From 1b62cd4481fb01f8dde6890f4259f482f9127e59 Mon Sep 17 00:00:00 2001 From: Sof Date: Sun, 29 Nov 2015 16:05:14 +0100 Subject: [PATCH 01/12] FIX: Multiple syntax errors --- htdocs/theme/eldy/style.css.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index c7795841429..88d2ae2d5a9 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -323,7 +323,7 @@ legend { margin-bottom: 8px; } fieldset { border: 1px solid #AAAAAA !important; box-shadow: 2px 2px 3px #DDD; } -.button, sbmtConnexion { +.button, input[name="sbmtConnexion"] { font-family: ; border-color: #c5c5c5; border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); @@ -847,7 +847,7 @@ div.mainmenu { div.mainmenu.home{ background-image: url(); - background-position-x: middle; + background-position-x: center; } div.mainmenu.accountancy { @@ -1017,7 +1017,7 @@ form#login { border-radius: 5px; border:solid 1px rgba(80,80,80,.4); - border-top:solid 1px f8f8f8; + border-top:solid 1px #f8f8f8; } .login_main_message { text-align: center; @@ -1472,7 +1472,7 @@ img.toolbarbutton { } /* hide the toggler-button when the pane is 'slid open' */ -.ui-layout-resizer-sliding ui-layout-toggler { +.ui-layout-resizer-sliding .ui-layout-toggler { display: none; } @@ -1645,7 +1645,7 @@ a.tab:link, a.tab:visited, a.tab:hover, a.tab#active { -moz-box-shadow: 0 -1px 4px rgba(0,0,0,.1); -webkit-box-shadow: 0 -1px 4px rgba(0,0,0,.1); box-shadow: 0 -1px 4px rgba(0,0,0,.1); - margin-bottom: 0 0.2em 0 0.2em !important; + margin: 0 0.2em 0 0.2em !important; border-right: 1px solid #AAA !important; border-left: 1px solid #AAA !important; @@ -1976,7 +1976,7 @@ tr.nocellnopadd td.nobordernopadding, tr.nocellnopadd td.nocellnopadd padding-: 0px; padding-: 16px; padding-bottom: 4px; - margin-right: 0px 0px; + margin-right: 0px; } .notopnoleftnoright { border-collapse: collapse; @@ -3333,7 +3333,7 @@ ul.filedirelem li { border: solid 1px #DDDDDD; } -ui-layout-north { +.ui-layout-north { } @@ -3430,7 +3430,7 @@ div.dolEventError h1, div.dolEventError h2 { /* Maps */ /* ============================================================================== */ -.divmap, #google-visualization-geomap-embed-0, #google-visualization-geomap-embed-1, google-visualization-geomap-embed-2 { +.divmap, #google-visualization-geomap-embed-0, #google-visualization-geomap-embed-1, #google-visualization-geomap-embed-2 { -moz-box-shadow: 0px 0px 10px #AAA; -webkit-box-shadow: 0px 0px 10px #AAA; box-shadow: 0px 0px 10px #AAA; @@ -3755,7 +3755,7 @@ a.ui-link { { white-space: normal; overflow: hidden; - text-overflow: hidden; + text-overflow: clip; /* "hidden" : do not exists as a text-overflow value (https://developer.mozilla.org/fr/docs/Web/CSS/text-overflow) */ } /* Warning: setting this may make screen not beeing refreshed after a combo selection */ From d518b24d554e2ed4dae4f6e5804d2a150d1bf3c4 Mon Sep 17 00:00:00 2001 From: Ion Agorria Date: Sun, 29 Nov 2015 16:19:30 +0100 Subject: [PATCH 02/12] Only print : when both $h and $m are set --- htdocs/core/class/html.form.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 0ee1495c85f..6b1eaa69aa3 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -4231,7 +4231,7 @@ class Form $retstring.=''; } $retstring.=''; - if (empty($conf->dol_optimize_smallscreen)) $retstring.=":"; + if ($m && empty($conf->dol_optimize_smallscreen)) $retstring.=":"; } if ($m) From 136724c083520350d4da95295d93487b85c6c34f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 30 Nov 2015 12:07:33 +0100 Subject: [PATCH 03/12] cleaning tarvis.yml --- .travis.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index a31aff2eda7..a865cf2b4de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,8 +29,7 @@ matrix: - php: 7.0 env: -# - DB=mysql PHPCS_VERSION=">=1.5.1,<2.0" - - DB=mysql PHPCS_VERSION=">=2.0" + - DB=mysql # - DB=postgres before_script: @@ -48,10 +47,9 @@ before_script: - cp composer.json composer.json.old - cp composer.json.phpcs composer.json - composer self-update - - composer require squizlabs/php_codesniffer:${PHPCS_VERSION} + - composer require squizlabs/php_codesniffer:">=2.0" - composer install - phpenv rehash - - ln -s `pwd` htdocs/includes/squizlabs/php_codesniffer/CodeSniffer/Standards/PHPCompatibility - htdocs/includes/squizlabs/php_codesniffer/scripts/phpcs --version # - which phpcs # - phpcs --version From 94101412e98eba899b5562028bfd109673b536b1 Mon Sep 17 00:00:00 2001 From: Romain DESCHAMPS Date: Mon, 30 Nov 2015 12:20:14 +0100 Subject: [PATCH 04/12] Progress column not wide enough for 100% Progress column not wide enough for 100% --- htdocs/core/modules/project/doc/pdf_baleine.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/project/doc/pdf_baleine.modules.php b/htdocs/core/modules/project/doc/pdf_baleine.modules.php index f684f0f786d..4b49397716f 100644 --- a/htdocs/core/modules/project/doc/pdf_baleine.modules.php +++ b/htdocs/core/modules/project/doc/pdf_baleine.modules.php @@ -79,7 +79,7 @@ class pdf_baleine extends ModelePDFProjects $this->posxref=$this->marge_gauche+1; $this->posxlabel=$this->marge_gauche+25; $this->posxworkload=$this->marge_gauche+100; - $this->posxprogress=$this->marge_gauche+140; + $this->posxprogress=$this->marge_gauche+130; $this->posxdatestart=$this->marge_gauche+150; $this->posxdateend=$this->marge_gauche+170; } From 5dab92836b53cc11fee3eb9c1eb2e9f876b7c496 Mon Sep 17 00:00:00 2001 From: Sof Date: Mon, 30 Nov 2015 12:27:58 +0100 Subject: [PATCH 05/12] FIX: Warning: implode(): Invalid arguments passed Declare array type before implode to avoid warning --- htdocs/core/class/extrafields.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 5cdc9f39a14..aed58a6556d 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -1551,7 +1551,7 @@ class ExtraFields else if (in_array($key_type,array('checkbox'))) { $value_arr=GETPOST($keysuffix."options_".$key.$keyprefix); - $value_key=implode(',', $value_arr); + $value_key=implode(',', (array)$value_arr); } else if (in_array($key_type,array('price','double'))) { From 9e988ee03eeb535087c2dbd6b77ded80664ebb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 30 Nov 2015 12:35:19 +0100 Subject: [PATCH 06/12] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a865cf2b4de..1769f2f0504 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,7 +47,7 @@ before_script: - cp composer.json composer.json.old - cp composer.json.phpcs composer.json - composer self-update - - composer require squizlabs/php_codesniffer:">=2.0" + - composer require squizlabs/php_codesniffer:"^2.0.0" - composer install - phpenv rehash - htdocs/includes/squizlabs/php_codesniffer/scripts/phpcs --version From 09b61fd185d656ea2e82f461ffdddd76daefe54f Mon Sep 17 00:00:00 2001 From: Sof Date: Mon, 30 Nov 2015 18:06:15 +0100 Subject: [PATCH 07/12] Update extrafields.class.php --- htdocs/core/class/extrafields.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index aed58a6556d..6a397c1245f 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -1551,7 +1551,9 @@ class ExtraFields else if (in_array($key_type,array('checkbox'))) { $value_arr=GETPOST($keysuffix."options_".$key.$keyprefix); - $value_key=implode(',', (array)$value_arr); + // Make sure we get an array even if there's only one checkbox + $value_arr=(array)$value_arr + $value_key=implode(',', $value_arr); } else if (in_array($key_type,array('price','double'))) { From de730c976259c3cedf2cc684e1e520b93dc44ed2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 30 Nov 2015 21:20:45 +0100 Subject: [PATCH 08/12] NEW Introduce cost price on product. --- htdocs/core/class/html.form.class.php | 15 ++++--- htdocs/core/lib/product.lib.php | 10 +++-- .../fourn/class/fournisseur.product.class.php | 16 ++++---- .../install/mysql/migration/3.8.0-3.9.0.sql | 2 + htdocs/install/mysql/tables/llx_product.sql | 5 ++- .../tables/llx_product_fournisseur_price.sql | 8 ++-- htdocs/langs/en_US/products.lang | 4 ++ htdocs/product/class/product.class.php | 3 +- htdocs/product/fournisseurs.php | 40 +++++++++++++++++-- htdocs/user/card.php | 10 ++++- 10 files changed, 83 insertions(+), 30 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index bada8627ee0..593d4100c22 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -77,7 +77,7 @@ class Form * @param string $preselected Name of Value to show/edit (not used in this function) * @param object $object Object * @param boolean $perm Permission to allow button to edit parameter. Set it to 0 to have a not edited field. - * @param string $typeofdata Type of data ('string' by default, 'email', 'numeric:99', 'text' or 'textarea:rows:cols', 'day' or 'datepicker', 'ckeditor:dolibarr_zzz:width:height:savemethod:1:rows:cols', 'select;xxx[:class]'...) + * @param string $typeofdata Type of data ('string' by default, 'email', 'amount:99', 'numeric:99', 'text' or 'textarea:rows:cols', 'day' or 'datepicker', 'ckeditor:dolibarr_zzz:width:height:savemethod:1:rows:cols', 'select;xxx[:class]'...) * @param string $moreparam More param to add on a href URL * @return string HTML edit field */ @@ -122,7 +122,7 @@ class Form * @param string $value Value to show/edit * @param object $object Object * @param boolean $perm Permission to allow button to edit parameter - * @param string $typeofdata Type of data ('string' by default, 'amount', 'email', 'numeric:99', 'text' or 'textarea:rows:cols', 'day' or 'datepicker', 'ckeditor:dolibarr_zzz:width:height:savemethod:toolbarstartexpanded:rows:cols', 'select:xxx'...) + * @param string $typeofdata Type of data ('string' by default, 'email', 'amount:99', 'numeric:99', 'text' or 'textarea:rows:cols', 'day' or 'datepicker', 'ckeditor:dolibarr_zzz:width:height:savemethod:toolbarstartexpanded:rows:cols', 'select:xxx'...) * @param string $editvalue When in edit mode, use this value as $value instead of value (for example, you can provide here a formated price instead of value). Use '' to use same than $value * @param object $extObject External object * @param mixed $custommsg String or Array of custom messages : eg array('success' => 'MyMessage', 'error' => 'MyMessage') @@ -154,11 +154,16 @@ class Form $ret.=''; $ret.=''; $ret.=''; + // Cost price. Can be used for margin module for option "calculate margin on explicit cost price + // Accountancy sell code + print ''; + print '
'; - if (preg_match('/^(string|email|numeric|amount)/',$typeofdata)) + if (preg_match('/^(string|email)/',$typeofdata)) { $tmp=explode(':',$typeofdata); $ret.=''; } + else if (preg_match('/^(numeric|amount)/',$typeofdata)) + { + $tmp=explode(':',$typeofdata); + $ret.=''; + } else if (preg_match('/^text/',$typeofdata) || preg_match('/^note/',$typeofdata)) { $tmp=explode(':',$typeofdata); @@ -203,8 +208,8 @@ class Form } else { - if ($typeofdata == 'email') $ret.=dol_print_email($value,0,0,0,0,1); - elseif ($typeofdata == 'amount') $ret.=($value != '' ? price($value,'',$langs,0,-1,-1,$conf->currency) : ''); + if (preg_match('/^(email)/',$typeofdata)) $ret.=dol_print_email($value,0,0,0,0,1); + elseif (preg_match('/^(amount|numeric)/',$typeofdata)) $ret.=($value != '' ? price($value,'',$langs,0,-1,-1,$conf->currency) : ''); elseif (preg_match('/^text/',$typeofdata) || preg_match('/^note/',$typeofdata)) $ret.=dol_htmlentitiesbr($value); elseif ($typeofdata == 'day' || $typeofdata == 'datepicker') $ret.=dol_print_date($value,'day'); elseif ($typeofdata == 'dayhour' || $typeofdata == 'datehourpicker') $ret.=dol_print_date($value,'dayhour'); diff --git a/htdocs/core/lib/product.lib.php b/htdocs/core/lib/product.lib.php index 5ca0389455f..73c74cfb97e 100644 --- a/htdocs/core/lib/product.lib.php +++ b/htdocs/core/lib/product.lib.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2006-2015 Laurent Destailleur * Copyright (C) 2007 Rodolphe Quiedeville * Copyright (C) 2009-2010 Regis Houssin * Copyright (C) 2015 Raphaƫl Doursenaud @@ -46,14 +46,16 @@ function product_prepare_head($object) $h++; $head[$h][0] = DOL_URL_ROOT."/product/price.php?id=".$object->id; - $head[$h][1] = $langs->trans("CustomerPrices"); + $head[$h][1] = $langs->trans("SellingPrices"); $head[$h][2] = 'price'; $h++; - if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->lire) + if ((! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->lire) + || (! empty($conf->margin->enabled) && $user->rights->margin->liretous) + ) { $head[$h][0] = DOL_URL_ROOT."/product/fournisseurs.php?id=".$object->id; - $head[$h][1] = $langs->trans("SuppliersPrices"); + $head[$h][1] = $langs->trans("BuyingPrices"); $head[$h][2] = 'suppliers'; $h++; } diff --git a/htdocs/fourn/class/fournisseur.product.class.php b/htdocs/fourn/class/fournisseur.product.class.php index d7344787623..424f9ad65d4 100644 --- a/htdocs/fourn/class/fournisseur.product.class.php +++ b/htdocs/fourn/class/fournisseur.product.class.php @@ -353,7 +353,7 @@ class ProductFournisseur extends Product function fetch_product_fournisseur_price($rowid, $ignore_expression = 0) { $sql = "SELECT pfp.rowid, pfp.price, pfp.quantity, pfp.unitprice, pfp.remise_percent, pfp.remise, pfp.tva_tx, pfp.fk_availability,"; - $sql.= " pfp.fk_soc, pfp.ref_fourn, pfp.fk_product, pfp.charges, pfp.unitcharges, pfp.fk_supplier_price_expression, pfp.delivery_time_days"; // , pfp.recuperableonly as fourn_tva_npr"; FIXME this field not exist in llx_product_fournisseur_price + $sql.= " pfp.fk_soc, pfp.ref_fourn, pfp.fk_product, pfp.charges, pfp.cost_price, pfp.unitcharges, pfp.fk_supplier_price_expression, pfp.delivery_time_days"; // , pfp.recuperableonly as fourn_tva_npr"; FIXME this field not exist in llx_product_fournisseur_price $sql.= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price as pfp"; $sql.= " WHERE pfp.rowid = ".$rowid; @@ -368,12 +368,12 @@ class ProductFournisseur extends Product $this->fourn_ref = $obj->ref_fourn; // deprecated $this->ref_supplier = $obj->ref_fourn; $this->fourn_price = $obj->price; - $this->fourn_charges = $obj->charges; + $this->fourn_charges = $obj->charges; // deprecated $this->fourn_qty = $obj->quantity; $this->fourn_remise_percent = $obj->remise_percent; $this->fourn_remise = $obj->remise; $this->fourn_unitprice = $obj->unitprice; - $this->fourn_unitcharges = $obj->unitcharges; + $this->fourn_unitcharges = $obj->unitcharges; // deprecated $this->fourn_tva_tx = $obj->tva_tx; $this->product_id = $obj->fk_product; // deprecated $this->fk_product = $obj->fk_product; @@ -456,9 +456,9 @@ class ProductFournisseur extends Product $prodfourn->fourn_qty = $record["quantity"]; $prodfourn->fourn_remise_percent = $record["remise_percent"]; $prodfourn->fourn_remise = $record["remise"]; - $prodfourn->fourn_unitprice = $record["unitprice"]; - $prodfourn->fourn_charges = $record["charges"]; - $prodfourn->fourn_unitcharges = $record["unitcharges"]; + $prodfourn->fourn_unitprice = $record["unitprice"]; + $prodfourn->fourn_charges = $record["charges"]; // deprecated + $prodfourn->fourn_unitcharges = $record["unitcharges"]; // deprecated $prodfourn->fourn_tva_tx = $record["tva_tx"]; $prodfourn->fourn_id = $record["fourn_id"]; $prodfourn->fourn_name = $record["supplier_name"]; @@ -591,8 +591,8 @@ class ProductFournisseur extends Product $this->fourn_remise_percent = $record["remise_percent"]; $this->fourn_remise = $record["remise"]; $this->fourn_unitprice = $fourn_unitprice; - $this->fourn_charges = $record["charges"]; - $this->fourn_unitcharges = $record["unitcharges"]; + $this->fourn_charges = $record["charges"]; // deprecated + $this->fourn_unitcharges = $record["unitcharges"]; // deprecated $this->fourn_tva_tx = $record["tva_tx"]; $this->fourn_id = $record["fourn_id"]; $this->fourn_name = $record["supplier_name"]; diff --git a/htdocs/install/mysql/migration/3.8.0-3.9.0.sql b/htdocs/install/mysql/migration/3.8.0-3.9.0.sql index 99a042c8c31..1a0bb08d44c 100755 --- a/htdocs/install/mysql/migration/3.8.0-3.9.0.sql +++ b/htdocs/install/mysql/migration/3.8.0-3.9.0.sql @@ -97,6 +97,8 @@ ALTER TABLE llx_commande ADD COLUMN fk_warehouse integer DEFAULT NULL AFTER fk_s ALTER TABLE llx_commande_fournisseur ADD COLUMN billed smallint DEFAULT 0 AFTER fk_statut; ALTER TABLE llx_commande_fournisseur ADD INDEX billed (billed); +ALTER TABLE llx_product ADD COLUMN cost_price double(24,8) DEFAULT NULL; + ALTER TABLE llx_ecm_directories MODIFY COLUMN fullpath varchar(750); ALTER TABLE llx_ecm_directories DROP INDEX idx_ecm_directories; ALTER TABLE llx_ecm_directories ADD UNIQUE INDEX uk_ecm_directories (label, fk_parent, entity); diff --git a/htdocs/install/mysql/tables/llx_product.sql b/htdocs/install/mysql/tables/llx_product.sql index e34ae887ffc..570bc651b2a 100755 --- a/htdocs/install/mysql/tables/llx_product.sql +++ b/htdocs/install/mysql/tables/llx_product.sql @@ -44,8 +44,9 @@ create table llx_product price_min double(24,8) DEFAULT 0, price_min_ttc double(24,8) DEFAULT 0, price_base_type varchar(3) DEFAULT 'HT', - tva_tx double(6,3), -- Default VAT rate of product - recuperableonly integer NOT NULL DEFAULT '0', -- French NPR VAT + cost_price double(24,8) DEFAULT NULL, -- Cost price without tax. Can be used for margin calculation. + tva_tx double(6,3), -- Default VAT rate of product + recuperableonly integer NOT NULL DEFAULT '0', -- French NPR VAT localtax1_tx double(6,3) DEFAULT 0, -- Spanish local VAT 1 localtax2_tx double(6,3) DEFAULT 0, -- Spanish local VAT 2 fk_user_author integer DEFAULT NULL, -- user making creation diff --git a/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql b/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql index fb5184715d1..e7cf555d24e 100755 --- a/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql +++ b/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql @@ -34,12 +34,12 @@ create table llx_product_fournisseur_price remise_percent double NOT NULL DEFAULT 0, remise double NOT NULL DEFAULT 0, unitprice double(24,8) DEFAULT 0, - charges double(24,8) DEFAULT 0, - unitcharges double(24,8) DEFAULT 0, + charges double(24,8) DEFAULT 0, -- to store transport cost. Constant PRODUCT_CHARGES must be set to see it. + unitcharges double(24,8) DEFAULT 0, -- deprecated tva_tx double(6,3) NOT NULL, info_bits integer NOT NULL DEFAULT 0, fk_user integer, - fk_supplier_price_expression integer, -- Link to the rule for dynamic price calculation - import_key varchar(14), -- Import key + fk_supplier_price_expression integer, -- Link to the rule for dynamic price calculation + import_key varchar(14), -- Import key delivery_time_days integer )ENGINE=innodb; diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index ddda0152245..b74db95d722 100644 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -76,6 +76,8 @@ SellingPriceHT=Selling price (net of tax) SellingPriceTTC=Selling price (inc. tax) PublicPrice=Public price CurrentPrice=Current price +CostPriceDescription=This price (net of tax) can be used to store the average amount this product cost to your company. It may be any price you calculate yourself, for example from the average buying price plus average transportation and acquiring cost. +CostPriceUsage=In a future version, this value could be used for margin calculation. NewPrice=New price MinPrice=Min. selling price MinPriceHT=Min. selling price (net of tax) @@ -190,6 +192,8 @@ ClonePricesProduct=Clone main informations and prices CloneCompositionProduct=Clone packaged product/service ProductIsUsed=This product is used NewRefForClone=Ref. of new product/service +SellingPrices=Selling prices +BuyingPrices=Buying prices CustomerPrices=Customer prices SuppliersPrices=Supplier prices SuppliersPricesOfProductsOrServices=Supplier prices (of products or services) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index aaf5aaf1baa..dcd889a0a77 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -1563,7 +1563,7 @@ class Product extends CommonObject } $sql = "SELECT rowid, ref, ref_ext, label, description, url, note, customcode, fk_country, price, price_ttc,"; - $sql.= " price_min, price_min_ttc, price_base_type, tva_tx, recuperableonly as tva_npr, localtax1_tx, localtax2_tx, tosell,"; + $sql.= " price_min, price_min_ttc, price_base_type, cost_price, tva_tx, recuperableonly as tva_npr, localtax1_tx, localtax2_tx, tosell,"; $sql.= " tobuy, fk_product_type, duration, seuil_stock_alerte, canvas,"; $sql.= " weight, weight_units, length, length_units, surface, surface_units, volume, volume_units, barcode, fk_barcode_type, finished,"; $sql.= " accountancy_code_buy, accountancy_code_sell, stock, pmp,"; @@ -1606,6 +1606,7 @@ class Product extends CommonObject $this->price_min = $obj->price_min; $this->price_min_ttc = $obj->price_min_ttc; $this->price_base_type = $obj->price_base_type; + $this->cost_price = $obj->cost_price; $this->tva_tx = $obj->tva_tx; //! French VAT NPR $this->tva_npr = $obj->tva_npr; diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php index 96aa9aa6311..dab8d8dcf5d 100644 --- a/htdocs/product/fournisseurs.php +++ b/htdocs/product/fournisseurs.php @@ -46,6 +46,7 @@ $rowid=GETPOST('rowid','int'); $action=GETPOST('action', 'alpha'); $cancel=GETPOST('cancel', 'alpha'); $socid=GETPOST('socid', 'int'); +$cost_price=GETPOST('cost_price', 'int'); $backtopage=GETPOST('backtopage','alpha'); $error=0; @@ -91,17 +92,37 @@ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'e if (empty($reshook)) { + if ($action == 'setcost_price') + { + if ($id) + { + $result=$object->fetch($id); + $result=$object->setValueFrom('cost_price', price2num($cost_price)); + if ($result > 0) + { + $object->cost_price = price2num($cost_price); + setEventMessage($langs->trans("RecordSaved")); + } + else + { + $error++; + setEventMessages($object->error, $object->errors, 'errors'); + } + } + $action=''; + } + if ($action == 'remove_pf') { - if ($rowid) + if ($rowid) // id of product supplier price to remove { $action = ''; - $result=$product->remove_product_fournisseur_price($rowid); + $result=$object->remove_product_fournisseur_price($rowid); if($result > 0){ setEventMessage($langs->trans("PriceRemoved")); }else{ $error++; - setEventMessages($product->error, $product->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } @@ -282,6 +303,17 @@ if ($id > 0 || $ref) } print '
'; + $textdesc =$langs->trans("CostPriceDescription"); + $textdesc.="
".$langs->trans("CostPriceUsage"); + $text=$form->textwithpicto($langs->trans("CostPrice"), $textdesc, 1, 'help', ''); + print $form->editfieldkey($text,'cost_price',$object->cost_price,$object,$user->rights->produit->creer||$user->rights->service->creer,'amount:6'); + print '
'; + print $form->editfieldval($text,'cost_price',$object->cost_price,$object,$user->rights->produit->creer||$user->rights->service->creer,'amount:6'); + print '
'; print ''; @@ -463,7 +495,7 @@ if ($id > 0 || $ref) print ' '.$langs->trans('days').''; print ''; - // Charges ???? + // Option to define a transport cost on supplier price if ($conf->global->PRODUCT_CHARGES) { if (! empty($conf->margin->enabled)) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 9cd92248b87..c7d745a2c94 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1016,14 +1016,20 @@ if (($action == 'create') || ($action == 'adduserldap')) $langs->load("salaries"); // THM - print ''.$langs->trans("THM").''; + print ''; + $text=$langs->trans("THM"); + print $form->textwithpicto($text, $langs->trans("THMDescription"), 1, 'help', 'classthm'); + print ''; print ''; print ''; print ''; print "\n"; // TJM - print ''.$langs->trans("TJM").''; + print ''; + $text=$langs->trans("TJM"); + print $form->textwithpicto($text, $langs->trans("TJMDescription"), 1, 'help', 'classtjm'); + print ''; print ''; print ''; print ''; From 357bc7a00c18a753dec2f59b059f4ee5a47dd719 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 30 Nov 2015 21:40:14 +0100 Subject: [PATCH 09/12] Fix color link --- htdocs/langs/en_US/products.lang | 2 +- htdocs/theme/eldy/style.css.php | 2 +- htdocs/theme/md/style.css.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index b74db95d722..8471e3b0a14 100644 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -76,7 +76,7 @@ SellingPriceHT=Selling price (net of tax) SellingPriceTTC=Selling price (inc. tax) PublicPrice=Public price CurrentPrice=Current price -CostPriceDescription=This price (net of tax) can be used to store the average amount this product cost to your company. It may be any price you calculate yourself, for example from the average buying price plus average transportation and acquiring cost. +CostPriceDescription=This price (net of tax) can be used to store the average amount this product cost to your company. It may be any price you calculate yourself, for example from the average buying price plus average production and distribution cost. CostPriceUsage=In a future version, this value could be used for margin calculation. NewPrice=New price MinPrice=Min. selling price diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index c7795841429..bb6a92c61dc 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -3044,7 +3044,7 @@ li.cal_event { border: none; list-style-type: none; } /* CSS for treeview */ .treeview ul { background-color: transparent !important; margin-top: 0; } .treeview li { background-color: transparent !important; padding: 0 0 0 16px !important; min-height: 20px; } -.treeview .hover { color: black !important; } +.treeview .hover { color: rgb() !important; text-decoration: underline !important; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index e316f078b24..6dae9fd3e9c 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -2908,7 +2908,7 @@ li.cal_event { border: none; list-style-type: none; } /* CSS for treeview */ .treeview ul { background-color: transparent !important; margin-top: 0; } .treeview li { background-color: transparent !important; padding: 0 0 0 16px !important; min-height: 20px; } -.treeview .hover { color: black !important; } +.treeview .hover { color: rgb() !important; text-decoration: underline !important; } From 6df4948a737c8f1a572980e75b0b84f13ca87176 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 1 Dec 2015 00:05:30 +0100 Subject: [PATCH 10/12] Fix text --- dev/skeletons/modMyModule.class.php | 4 ++-- htdocs/langs/en_US/mails.lang | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dev/skeletons/modMyModule.class.php b/dev/skeletons/modMyModule.class.php index 86d9636809a..a54aac470e5 100644 --- a/dev/skeletons/modMyModule.class.php +++ b/dev/skeletons/modMyModule.class.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2012 Laurent Destailleur + * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * * This program is free software; you can redistribute it and/or modify @@ -46,7 +46,7 @@ class modMyModule extends DolibarrModules // Id for module (must be unique). // Use here a free id (See in Home -> System information -> Dolibarr for list of used modules id). - $this->numero = 100000; + $this->numero = 500000; // TODO Go on page http://wiki.dolibarr.org/index.php/List_of_modules_id to reserve id number for your module // Key text used to identify module (for permissions, menus, etc...) $this->rights_class = 'mymodule'; diff --git a/htdocs/langs/en_US/mails.lang b/htdocs/langs/en_US/mails.lang index db8b013240f..df5ad878657 100644 --- a/htdocs/langs/en_US/mails.lang +++ b/htdocs/langs/en_US/mails.lang @@ -84,7 +84,7 @@ EachInvoiceWillBeAttachedToEmail=A document using default invoice document templ MailTopicSendRemindUnpaidInvoices=Reminder of invoice %s (%s) SendRemind=Send reminder by EMails RemindSent=%s reminder(s) sent -AllRecipientSelectedForRemind=All thirdparties selected and if an email is set (note that one mail per invoice will be sent) +AllRecipientSelectedForRemind=All thirdparties selected and if an email is set. NoRemindSent=No EMail reminder sent ResultOfMassSending=Result of mass EMail reminders sending From 574b270da0c835d2ef974787b76540ca8c7bbb36 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 2 Dec 2015 01:38:15 +0100 Subject: [PATCH 11/12] Work on the "mass action" feature. Can run mass action on result of a select. --- htdocs/compta/facture.php | 6 +- htdocs/compta/facture/class/facture.class.php | 8 +- htdocs/compta/facture/list.php | 433 +++++++++++++++++- htdocs/compta/facture/mergepdftool.php | 4 +- htdocs/core/class/html.form.class.php | 68 ++- htdocs/core/class/html.formmail.class.php | 4 +- htdocs/fourn/facture/card.php | 4 +- htdocs/langs/en_US/bills.lang | 1 + htdocs/langs/en_US/mails.lang | 7 +- htdocs/langs/en_US/main.lang | 1 + htdocs/langs/en_US/other.lang | 6 +- 11 files changed, 512 insertions(+), 30 deletions(-) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 86a49f9f232..d5e99af0df6 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -3886,9 +3886,9 @@ else if ($id > 0 || ! empty($ref)) $formmail->withtocc = $liste; // List suggested for CC $formmail->withtoccc = $conf->global->MAIN_EMAIL_USECCC; if (empty($object->ref_client)) { - $formmail->withtopic = $outputlangs->transnoentities($topicmail, '__FACREF__'); + $formmail->withtopic = $outputlangs->transnoentities($topicmail, '__REF__'); } else if (! empty($object->ref_client)) { - $formmail->withtopic = $outputlangs->transnoentities($topicmail, '__FACREF__ (__REFCLIENT__)'); + $formmail->withtopic = $outputlangs->transnoentities($topicmail, '__REF__ (__REFCLIENT__)'); } $formmail->withfile = 2; @@ -3896,7 +3896,7 @@ else if ($id > 0 || ! empty($ref)) $formmail->withdeliveryreceipt = 1; $formmail->withcancel = 1; // Tableau des substitutions - $formmail->substit['__FACREF__'] = $object->ref; + $formmail->substit['__REF__'] = $object->ref; $formmail->substit['__SIGNATURE__'] = $user->signature; $formmail->substit['__REFCLIENT__'] = $object->ref_client; $formmail->substit['__THIRDPARTY_NAME__'] = $object->thirdparty->name; diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index b27bc9d2294..b58d2052b99 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -3687,11 +3687,9 @@ class Facture extends CommonInvoice $now = dol_now(); - //Paid invoices have status STATUS_CLOSED - if (!$this->statut != Facture::STATUS_VALIDATED) { - return false; - } - + // Paid invoices have status STATUS_CLOSED + if ($this->statut != Facture::STATUS_VALIDATED) return false; + return $this->date_lim_reglement < ($now - $conf->facture->client->warning_delay); } } diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 9372f50f4aa..cce908dc368 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -60,6 +60,7 @@ $id=(GETPOST('id','int')?GETPOST('id','int'):GETPOST('facid','int')); // For ba $ref=GETPOST('ref','alpha'); $socid=GETPOST('socid','int'); $action=GETPOST('action','alpha'); +$massaction=GETPOST('massaction','alpha'); $confirm=GETPOST('confirm','alpha'); $lineid=GETPOST('lineid','int'); $userid=GETPOST('userid','int'); @@ -70,6 +71,9 @@ $search_societe=GETPOST('search_societe','alpha'); $search_montant_ht=GETPOST('search_montant_ht','alpha'); $search_montant_ttc=GETPOST('search_montant_ttc','alpha'); $search_status=GETPOST('search_status','int'); +$search_paymentmode=GETPOST('search_paymentmode','int'); +$option = GETPOST('option'); +if ($option == 'late') $filter = 'paye:0'; $sortfield = GETPOST("sortfield",'alpha'); $sortorder = GETPOST("sortorder",'alpha'); @@ -94,6 +98,7 @@ $day_lim = GETPOST('day_lim','int'); $month_lim = GETPOST('month_lim','int'); $year_lim = GETPOST('year_lim','int'); $filtre = GETPOST('filtre'); +$toselect = GETPOST('toselect', 'array'); // Security check $fieldid = (! empty($ref)?'facnumber':'rowid'); @@ -122,9 +127,290 @@ if (empty($user->socid)) $fieldstosearchall["f.note_private"]="NotePrivate"; * Actions */ +if (GETPOST('cancel')) { $action='list'; $massaction=''; } + $parameters=array('socid'=>$socid); $reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +if (empty($reshook)) +{ + // Mass actions + if (! empty($massaction) && count($toselect) < 1) + { + $error++; + setEventMessage("NoLineChecked","warnings"); + } + + if (! $error && $massaction == 'confirm_presend') + { + $resaction = ''; + $nbsent = 0; + $nbignored = 0; + $langs->load("mails"); + include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + + if (!isset($user->email)) + { + $error++; + setEventMessages($langs->trans("NoSenderEmailDefined"), null, 'warnings'); + } + + if (! $error) + { + $thirdparty=new Societe($db); + $objecttmp=new Facture($db); + $listofobjectid=array(); + $listofobjectthirdparties=array(); + $listofobjectref=array(); + foreach($toselect as $toselectid) + { + $objecttmp=new Facture($db); // must create new instance because instance is saved into $listofobjectref array for future use + $result=$objecttmp->fetch($toselectid); + if ($result > 0) + { + $listoinvoicesid[$toselectid]=$toselectid; + $thirdpartyid=$objecttmp->fk_soc?$objecttmp->fk_soc:$objecttmp->socid; + $listofobjectthirdparties[$thirdpartyid]=$thirdpartyid; + $listofobjectref[$thirdpartyid][$toselectid]=$objecttmp; + } + } + //var_dump($listofobjectthirdparties);exit; + + foreach ($listofobjectthirdparties as $thirdpartyid) + { + $result = $thirdparty->fetch($thirdpartyid); + if ($result < 0) + { + dol_print_error($db); + exit; + } + + // Define recipient $sendto and $sendtocc + if (trim($_POST['sendto'])) + { + // Recipient is provided into free text + $sendto = trim($_POST['sendto']); + $sendtoid = 0; + } + elseif ($_POST['receiver'] != '-1') + { + // Recipient was provided from combo list + if ($_POST['receiver'] == 'thirdparty') // Id of third party + { + $sendto = $thirdparty->email; + $sendtoid = 0; + } + else // Id du contact + { + $sendto = $thirdparty->contact_get_property((int) $_POST['receiver'],'email'); + $sendtoid = $_POST['receiver']; + } + } + if (trim($_POST['sendtocc'])) + { + $sendtocc = trim($_POST['sendtocc']); + } + elseif ($_POST['receivercc'] != '-1') + { + // Recipient was provided from combo list + if ($_POST['receivercc'] == 'thirdparty') // Id of third party + { + $sendtocc = $thirdparty->email; + } + else // Id du contact + { + $sendtocc = $thirdparty->contact_get_property((int) $_POST['receivercc'],'email'); + } + } + + //var_dump($listofobjectref[$thirdpartyid]); // Array of invoice for this thirdparty + + $attachedfiles=array('paths'=>array(), 'names'=>array(), 'mimes'=>array()); + $listofqualifiedinvoice=array(); + $listofqualifiedref=array(); + foreach($listofobjectref[$thirdpartyid] as $objectid => $object) + { + //var_dump($object); + //var_dump($thirdpartyid.' - '.$objectid.' - '.$object->statut); + + if ($object->statut != Facture::STATUS_VALIDATED) + { + $nbignored++; + continue; // Payment done or started or canceled + } + + // Read document + // TODO Use future field $object->fullpathdoc to know where is stored default file + // TODO If not defined, use $object->modelpdf (or defaut invoice config) to know what is template to use to regenerate doc. + $filename=dol_sanitizeFileName($object->ref).'.pdf'; + $filedir=$conf->facture->dir_output . '/' . dol_sanitizeFileName($object->ref); + $file = $filedir . '/' . $filename; + $mime = dol_mimetype($file); + + if (dol_is_file($file)) + { + if (empty($sendto)) // For the case, no recipient were set (multi thirdparties send) + { + $object->fetch_thirdparty(); + $sendto = $object->thirdparty->email; + } + + if (empty($sendto)) + { + //print "No recipient for thirdparty ".$object->thirdparty->name; + $nbignored++; + continue; + } + + if (dol_strlen($sendto)) + { + // Create form object + $attachedfiles=array( + 'paths'=>array_merge($attachedfiles['paths'],array($file)), + 'names'=>array_merge($attachedfiles['names'],array($filename)), + 'mimes'=>array_merge($attachedfiles['mimes'],array($mime)) + ); + } + + $listofqualifiedinvoice[$objectid]=$object; + $listofqualifiedref[$objectid]=$object->ref; + } + else + { + $nbignored++; + $langs->load("other"); + $resaction.='
'.$langs->trans('ErrorCantReadFile',$file).'
'; + dol_syslog('Failed to read file: '.$file, LOG_WARNING); + continue; + } + + //var_dump($listofqualifiedref); + } + + if (count($listofqualifiedinvoice) > 0) + { + $langs->load("commercial"); + $from = $user->getFullName($langs) . ' <' . $user->email .'>'; + $replyto = $from; + $subject = GETPOST('subject'); + $message = GETPOST('message'); + $sendtocc = GETPOST('sentocc'); + $sendtobcc = (empty($conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO)?'':$conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO); + + $substitutionarray=array( + '__ID__' => join(', ',array_keys($listofqualifiedinvoice)), + '__EMAIL__' => $thirdparty->email, + '__CHECK_READ__' => '', + //'__LASTNAME__' => $obj2->lastname, + //'__FIRSTNAME__' => $obj2->firstname, + '__FACREF__' => join(', ',$listofqualifiedref), // For backward compatibility + '__REF__' => join(', ',$listofqualifiedref), + '__REFCLIENT__' => $thirdparty->name + ); + + $subject=make_substitutions($subject, $substitutionarray); + $message=make_substitutions($message, $substitutionarray); + + $filepath = $attachedfiles['paths']; + $filename = $attachedfiles['names']; + $mimetype = $attachedfiles['mimes']; + + //var_dump($filepath); + + // Send mail + require_once(DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'); + $mailfile = new CMailFile($subject,$sendto,$from,$message,$filepath,$mimetype,$filename,$sendtocc,$sendtobcc,$deliveryreceipt,-1); + if ($mailfile->error) + { + $resaction.='
'.$mailfile->error.'
'; + } + else + { + $result=$mailfile->sendfile(); + if ($result) + { + $resaction.=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($from,2),$mailfile->getValidAddress($sendto,2)); // Must not contain " + + $error=0; + + foreach($listofqualifiedinvoice as $invid => $object) + { + $actiontypecode='AC_FAC'; + $actionmsg=$langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto; + if ($message) + { + if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc); + $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject); + $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":"); + $actionmsg = dol_concatdesc($actionmsg, $message); + } + + // Initialisation donnees + $object->sendtoid = 0; + $object->actiontypecode = $actiontypecode; + $object->actionmsg = $actionmsg; // Long text + $object->actionmsg2 = $actionmsg2; // Short text + $object->fk_element = $invid; + $object->elementtype = $object->element; + + // Appel des triggers + include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"); + $interface=new Interfaces($db); + $result=$interface->run_triggers('BILL_SENTBYMAIL',$object,$user,$langs,$conf); + if ($result < 0) { $error++; $this->errors=$interface->errors; } + // Fin appel triggers + + if (! $error) + { + $resaction.=$langs->trans("MailSent").': '.$sendto."
\n"; + } + else + { + dol_print_error($db); + } + $nbsent++; + } + } + else + { + $langs->load("other"); + if ($mailfile->error) + { + $resaction.=$langs->trans('ErrorFailedToSendMail',$from,$sendto); + $resaction.='
'.$mailfile->error.'
'; + } + else + { + $resaction.='
No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS
'; + } + } + } + } + } + + $resaction.=($resaction?'
':$resaction); + $resaction.=''.$langs->trans("ResultOfMailSending").':
'."\n"; + $resaction.=$langs->trans("NbSelected").': '.count($toselect)."\n
"; + $resaction.=$langs->trans("NbIgnored").': '.($nbignored?$nbignored:0)."\n
"; + $resaction.=$langs->trans("NbSent").': '.($nbsent?$nbsent:0)."\n
"; + + if ($nbsent) + { + $action=''; // Do not show form post if there was at least one successfull sent + setEventMessages($langs->trans("EMailSentToNRecipients", $nbsent.'/'.count($toselect)), null, 'mesgs'); + setEventMessages($resaction, null, 'mesgs'); + } + else + { + //setEventMessages($langs->trans("EMailSentToNRecipients", 0), null, 'warnings'); // May be object has no generated PDF file + setEventMessages($resaction, null, 'warnings'); + } + } + + $action='list'; + $massaction=''; + } +} // Do we click on purge search criteria ? if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers @@ -139,9 +425,13 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both $search_montant_ht=''; $search_montant_ttc=''; $search_status=''; + $search_paymentmode=''; $day=''; $year=''; $month=''; + $toselect=''; + $option=''; + $filter=''; } @@ -160,7 +450,7 @@ $facturestatic=new Facture($db); $sql = 'SELECT'; if ($sall || $search_product_category > 0) $sql = 'SELECT DISTINCT'; -$sql.= ' f.rowid as facid, f.facnumber, f.ref_client, f.type, f.note_private, f.increment, f.total as total_ht, f.tva as total_tva, f.total_ttc,'; +$sql.= ' f.rowid as facid, f.facnumber, f.ref_client, f.type, f.note_private, f.increment, f.fk_mode_reglement, f.total as total_ht, f.tva as total_tva, f.total_ttc,'; $sql.= ' f.datef as df, f.date_lim_reglement as datelimite,'; $sql.= ' f.paye as paye, f.fk_statut,'; $sql.= ' s.nom as name, s.rowid as socid, s.code_client, s.client '; @@ -203,6 +493,7 @@ if ($search_societe) $sql .= natural_search('s.nom', $search_societe); if ($search_montant_ht != '') $sql.= natural_search('f.total', $search_montant_ht, 1); if ($search_montant_ttc != '') $sql.= natural_search('f.total_ttc', $search_montant_ttc, 1); if ($search_status != '' && $search_status >= 0) $sql.= " AND f.fk_statut = ".$db->escape($search_status); +if ($search_paymentmode > 0) $sql .= " AND f.fk_mode_reglement = ".$search_paymentmode.""; if ($month > 0) { if ($year > 0 && empty($day)) @@ -229,6 +520,8 @@ else if ($year_lim > 0) { $sql.= " AND f.date_lim_reglement BETWEEN '".$db->idate(dol_get_first_day($year_lim,1,false))."' AND '".$db->idate(dol_get_last_day($year_lim,12,false))."'"; } +if ($option == 'late') $sql.=" AND f.date_lim_reglement < '".$db->idate(dol_now() - $conf->facture->client->warning_delay)."'"; +if ($filter == 'paye:0') $sql.= " AND f.fk_statut = 1"; if ($search_sale > 0) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$search_sale; if ($search_user > 0) { @@ -265,6 +558,8 @@ if ($resql) { $num = $db->num_rows($resql); + $arrayofselected=is_array($toselect)?$toselect:array(); + if ($socid) { $soc = new Societe($db); @@ -282,10 +577,113 @@ if ($resql) if ($search_montant_ht != '') $param.='&search_montant_ht='.$search_montant_ht; if ($search_montant_ttc != '') $param.='&search_montant_ttc='.$search_montant_ttc; if ($search_status != '') $param.='&search_status='.$search_status; - print_barre_liste($langs->trans('BillsCustomers').' '.($socid?' '.$soc->name:''),$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords,'title_accountancy.png'); - + if ($search_paymentmode > 0) $param.='search_paymentmode='.$search_paymentmode; + $param.=(! empty($option)?"&option=".$option:""); + + $massactionbutton=$form->selectMassAction('', $massaction ? array() : array('presend'=>$langs->trans("SendByMail"))); + $i = 0; - print '
'."\n"; + print ''."\n"; + + print_barre_liste($langs->trans('BillsCustomers').' '.($socid?' '.$soc->name:''),$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,$massactionbutton,$num,$nbtotalofrecords,'title_accountancy.png'); + + if ($massaction == 'presend') + { + $langs->load("mails"); + + if (! GETPOST('cancel')) + { + $objecttmp=new Facture($db); + $listofselectedid=array(); + $listofselectedthirdparties=array(); + $listofselectedref=array(); + foreach($arrayofselected as $toselectid) + { + $result=$objecttmp->fetch($toselectid); + if ($result > 0) + { + $listofselectedid[$toselectid]=$toselectid; + $thirdpartyid=$objecttmp->fk_soc?$objecttmp->fk_soc:$objecttmp->socid; + $listofselectedthirdparties[$thirdpartyid]=$thirdpartyid; + $listofselectedref[$thirdpartyid][$toselectid]=$objecttmp->ref; + } + } + } + + print ''; + + include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php'; + $formmail = new FormMail($db); + + dol_fiche_head(null, '', $langs->trans("SendByMail")); + + $topicmail="SendBillRef"; + $modelmail="facture_send"; + + // Cree l'objet formulaire mail + include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php'; + $formmail = new FormMail($db); + $formmail->withform=-1; + $formmail->fromtype = 'user'; + $formmail->fromid = $user->id; + $formmail->fromname = $user->getFullName($langs); + $formmail->frommail = $user->email; + if (! empty($conf->global->MAIN_EMAIL_ADD_TRACK_ID) && ($conf->global->MAIN_EMAIL_ADD_TRACK_ID & 1)) // If bit 1 is set + { + $formmail->trackid='inv'.$object->id; + } + if (! empty($conf->global->MAIN_EMAIL_ADD_TRACK_ID) && ($conf->global->MAIN_EMAIL_ADD_TRACK_ID & 2)) // If bit 2 is set + { + include DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; + $formmail->frommail=dolAddEmailTrackId($formmail->frommail, 'inv'.$object->id); + } + $formmail->withfrom=1; + $liste=$langs->trans("AllRecipientSelected"); + if (count($listofselectedthirdparties) == 1) + { + $liste=array(); + $thirdpartyid=array_shift($listofselectedthirdparties); + $soc=new Societe($db); + $soc->fetch($thirdpartyid); + foreach ($soc->thirdparty_and_contact_email_array(1) as $key=>$value) + { + $liste[$key]=$value; + } + $formmail->withtoreadonly=0; + } + else + { + $formmail->withtoreadonly=1; + } + $formmail->withto=$liste; + $formmail->withtofree=0; + $formmail->withtocc=1; + $formmail->withtoccc=$conf->global->MAIN_EMAIL_USECCC; + $formmail->withtopic=$langs->transnoentities($topicmail, '__REF__', '__REFCLIENT__'); + $formmail->withfile=$langs->trans("EachInvoiceWillBeAttachedToEmail"); + $formmail->withbody=1; + $formmail->withdeliveryreceipt=1; + $formmail->withcancel=1; + // Tableau des substitutions + $formmail->substit['__REF__']='__REF__'; // We want to keep the tag + $formmail->substit['__SIGNATURE__']=$user->signature; + $formmail->substit['__REFCLIENT__']='__REFCLIENT__'; // We want to keep the tag + $formmail->substit['__PERSONALIZED__']=''; + $formmail->substit['__CONTACTCIVNAME__']=''; + + // Tableau des parametres complementaires du post + $formmail->param['action']=$action; + $formmail->param['models']=$modelmail; + $formmail->param['models_id']=GETPOST('modelmailselected','int'); + $formmail->param['facid']=join(',',$arrayofselected); + //$formmail->param['returnurl']=$_SERVER["PHP_SELF"].'?id='.$object->id; + + print $formmail->get_form(); + + dol_fiche_end(); + } + + if ($optioncss != '') print ''; print ''; print ''; @@ -347,8 +745,9 @@ if ($resql) print_liste_field_titre($langs->trans('Date'),$_SERVER['PHP_SELF'],'f.datef','',$param,'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("DateDue"),$_SERVER['PHP_SELF'],"f.date_lim_reglement",'',$param,'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans('ThirdParty'),$_SERVER['PHP_SELF'],'s.nom','',$param,'',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("PaymentModeShort"),$_SERVER["PHP_SELF"],"f.fk_reglement_mode","",$param,"",$sortfield,$sortorder); print_liste_field_titre($langs->trans('AmountHT'),$_SERVER['PHP_SELF'],'f.total','',$param,'align="right"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans('AmountVAT'),$_SERVER['PHP_SELF'],'f.tva','',$param,'align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans('Taxes'),$_SERVER['PHP_SELF'],'f.tva','',$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans('AmountTTC'),$_SERVER['PHP_SELF'],'f.total_ttc','',$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans('Received'),$_SERVER['PHP_SELF'],'am','',$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans('Status'),$_SERVER['PHP_SELF'],'fk_statut,paye,am','',$param,'align="right"',$sortfield,$sortorder); @@ -372,8 +771,12 @@ if ($resql) if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; print ''; $formother->select_year($year_lim?$year_lim:-1,'year_lim',1, 20, 5); + print '
'.$langs->trans("Late"); print ''; print ''; + print ''; + $form->select_types_paiements($search_paymentmode, 'search_paymentmode', '', 0, 0, 1, 10); + print ''; print ''; print ''; print ''; @@ -407,8 +810,8 @@ if ($resql) $facturestatic->id=$objp->facid; $facturestatic->ref=$objp->facnumber; $facturestatic->type=$objp->type; - $facturestatic->statut = $objp->fk_statut; - $facturestatic->date_lim_reglement = $db->jdate($objp->datelimite); + $facturestatic->statut=$objp->fk_statut; + $facturestatic->date_lim_reglement=$db->jdate($objp->datelimite); $notetoshow=dol_string_nohtmltag(($user->societe_id>0?$objp->note_public:$objp->note),1); $paiement = $facturestatic->getSommePaiement(); @@ -463,6 +866,11 @@ if ($resql) print $thirdparty->getNomUrl(1,'customer'); print ''; + // Payment mode + print ''; + $form->form_modes_reglement($_SERVER['PHP_SELF'], $objp->fk_mode_reglement, 'none'); + print ''; + print ''.price($objp->total_ht,0,$langs).''; print ''.price($objp->total_tva,0,$langs).''; @@ -471,12 +879,17 @@ if ($resql) print ''.(! empty($paiement)?price($paiement,0,$langs):' ').''; - // Affiche statut de la facture + // Status print ''; print $facturestatic->LibStatut($objp->paye,$objp->fk_statut,5,$paiement,$objp->type); print ""; - print ""; + // Checkbox + print ''; + $selected=0; + if (in_array($objp->facid, $arrayofselected)) $selected=1; + print ''; + print '' ; print "\n"; $total_ht+=$objp->total_ht; @@ -490,7 +903,7 @@ if ($resql) { // Print total print ''; - print ''.$langs->trans('Total').''; + print ''.$langs->trans('Total').''; print ''.price($total_ht,0,$langs).''; print ''.price($total_tva,0,$langs).''; print ''.price($total_ttc,0,$langs).''; diff --git a/htdocs/compta/facture/mergepdftool.php b/htdocs/compta/facture/mergepdftool.php index 968ab8543c2..f79621a4d87 100644 --- a/htdocs/compta/facture/mergepdftool.php +++ b/htdocs/compta/facture/mergepdftool.php @@ -590,13 +590,13 @@ if ($resql) $formmail->withtoreadonly=1; $formmail->withtocc=1; $formmail->withtoccc=$conf->global->MAIN_EMAIL_USECCC; - $formmail->withtopic=$langs->transnoentities($topicmail, '__FACREF__', '__REFCLIENT__'); + $formmail->withtopic=$langs->transnoentities($topicmail, '__REF__', '__REFCLIENT__'); $formmail->withfile=$langs->trans("EachInvoiceWillBeAttachedToEmail"); $formmail->withbody=1; $formmail->withdeliveryreceipt=1; $formmail->withcancel=1; // Tableau des substitutions - //$formmail->substit['__FACREF__']=''; + //$formmail->substit['__REF__']=''; $formmail->substit['__SIGNATURE__']=$user->signature; //$formmail->substit['__REFCLIENT__']=''; $formmail->substit['__PERSONALIZED__']=''; diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 593d4100c22..3e58a43f43a 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -482,6 +482,72 @@ class Form return $this->textwithtooltip($text, $htmltext, 2, $direction, $img, $extracss, $notabs, '', $noencodehtmltext); } + /** + * Generate select HTML to choose massaction + * + * @parama string $selected Selected value + * @param int $arrayofaction array('code'=>'label', ...) + * @param string Select list + */ + function selectMassAction($selected, $arrayofaction) + { + global $conf,$langs,$hookmanager; + + if (count($arrayofaction) == 0) return; + + $disabled=0; + $ret='
'; + $ret.=''; + $ret.='
'; + + $ret.=' + + '; + + return $ret; + } + /** * Return combo list of activated countries, into language of user * @@ -2648,7 +2714,7 @@ class Form * @param int $maxlength Max length of label * @return void */ - function select_types_paiements($selected='',$htmlname='paiementtype',$filtertype='',$format=0, $empty=0, $noadmininfo=0,$maxlength=0) + function select_types_paiements($selected='', $htmlname='paiementtype', $filtertype='', $format=0, $empty=0, $noadmininfo=0, $maxlength=0) { global $langs,$user; diff --git a/htdocs/core/class/html.formmail.class.php b/htdocs/core/class/html.formmail.class.php index 1f0cb5c6e28..c9e8ab7899d 100644 --- a/htdocs/core/class/html.formmail.class.php +++ b/htdocs/core/class/html.formmail.class.php @@ -648,7 +648,7 @@ class FormMail extends Form } if ($this->param["models"]=='facture_send') { - $url=getPaypalPaymentUrl(0,'invoice',$this->substit['__FACREF__']); + $url=getPaypalPaymentUrl(0,'invoice',$this->substit['__REF__']); $this->substit['__PERSONALIZED__']=str_replace('\n',"\n",$langs->transnoentitiesnoconv("PredefinedMailContentLink",$url)); } } @@ -692,7 +692,7 @@ class FormMail extends Form else $this->withfckeditor=0; } - $doleditor=new DolEditor('message',$defaultmessage,'',280,$this->ckeditortoolbar,'In',true,true,$this->withfckeditor,8,72); + $doleditor=new DolEditor('message',$defaultmessage,'',280,$this->ckeditortoolbar,'In',true,true,$this->withfckeditor,8,'95%'); $out.= $doleditor->Create(1); } $out.= "\n"; diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index fe6582fd355..82cdbe03b64 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -2338,13 +2338,13 @@ else $formmail->withto=GETPOST("sendto")?GETPOST("sendto"):$liste; $formmail->withtocc=$liste; $formmail->withtoccc=$conf->global->MAIN_EMAIL_USECCC; - $formmail->withtopic=$outputlangs->trans('SendBillRef','__FACREF__'); + $formmail->withtopic=$outputlangs->trans('SendBillRef','__REF__'); $formmail->withfile=2; $formmail->withbody=1; $formmail->withdeliveryreceipt=1; $formmail->withcancel=1; // Tableau des substitutions - $formmail->substit['__FACREF__']=$object->ref; + $formmail->substit['__REF__']=$object->ref; $formmail->substit['__SIGNATURE__']=$user->signature; $formmail->substit['__PERSONALIZED__']=''; $formmail->substit['__CONTACTCIVNAME__']=''; diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang index c347c7a0336..a567fd4f062 100644 --- a/htdocs/langs/en_US/bills.lang +++ b/htdocs/langs/en_US/bills.lang @@ -74,6 +74,7 @@ PaymentsAlreadyDone=Payments already done PaymentsBackAlreadyDone=Payments back already done PaymentRule=Payment rule PaymentMode=Payment type +PaymentModeShort=Payment type PaymentTerm=Payment term PaymentConditions=Payment terms PaymentConditionsShort=Payment terms diff --git a/htdocs/langs/en_US/mails.lang b/htdocs/langs/en_US/mails.lang index df5ad878657..bda203ce05f 100644 --- a/htdocs/langs/en_US/mails.lang +++ b/htdocs/langs/en_US/mails.lang @@ -84,9 +84,12 @@ EachInvoiceWillBeAttachedToEmail=A document using default invoice document templ MailTopicSendRemindUnpaidInvoices=Reminder of invoice %s (%s) SendRemind=Send reminder by EMails RemindSent=%s reminder(s) sent -AllRecipientSelectedForRemind=All thirdparties selected and if an email is set. +AllRecipientSelected=All thirdparties selected and if an email is set. NoRemindSent=No EMail reminder sent -ResultOfMassSending=Result of mass EMail reminders sending +ResultOfMailSending=Result of mass EMail sending +NbSelected=Nb selected +NbIgnored=Nb ignored +NbSent=Nb sent # Libelle des modules de liste de destinataires mailing MailingModuleDescContactCompanies=Contacts/addresses of all third parties (customer, prospect, supplier, ...) diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 070bc5c3d56..db1cebac45d 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -698,6 +698,7 @@ Deductible=Deductible from=from toward=toward Access=Access +SelectAction=Select action HelpCopyToClipboard=Use Ctrl+C to copy to clipboard SaveUploadedFileWithMask=Save file on server with name "%s" (otherwise "%s") OriginFileName=Original filename diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang index 1ff53d36797..d2faa9baae5 100644 --- a/htdocs/langs/en_US/other.lang +++ b/htdocs/langs/en_US/other.lang @@ -58,13 +58,13 @@ Miscellaneous=Miscellaneous NbOfActiveNotifications=Number of notifications (nb of recipient emails) PredefinedMailTest=This is a test mail.\nThe two lines are separated by a carriage return.\n\n__SIGNATURE__ PredefinedMailTestHtml=This is a test mail (the word test must be in bold).
The two lines are separated by a carriage return.

__SIGNATURE__ -PredefinedMailContentSendInvoice=__CONTACTCIVNAME__\n\nYou will find here the invoice __FACREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ -PredefinedMailContentSendInvoiceReminder=__CONTACTCIVNAME__\n\nWe would like to warn you that the invoice __FACREF__ seems to not being payed. So this is the invoice in attachment again, as a reminder.\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +PredefinedMailContentSendInvoice=__CONTACTCIVNAME__\n\nYou will find here the invoice __REF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +PredefinedMailContentSendInvoiceReminder=__CONTACTCIVNAME__\n\nWe would like to warn you that the invoice __REF__ seems to not being payed. So this is the invoice in attachment again, as a reminder.\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentSendProposal=__CONTACTCIVNAME__\n\nYou will find here the commercial proposal __PROPREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentSendSupplierProposal=__CONTACTCIVNAME__\n\nYou will find here the price request __ASKREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentSendOrder=__CONTACTCIVNAME__\n\nYou will find here the order __ORDERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentSendSupplierOrder=__CONTACTCIVNAME__\n\nYou will find here our order __ORDERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ -PredefinedMailContentSendSupplierInvoice=__CONTACTCIVNAME__\n\nYou will find here the invoice __FACREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +PredefinedMailContentSendSupplierInvoice=__CONTACTCIVNAME__\n\nYou will find here the invoice __REF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentSendShipping=__CONTACTCIVNAME__\n\nYou will find here the shipping __SHIPPINGREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentSendFichInter=__CONTACTCIVNAME__\n\nYou will find here the intervention __FICHINTERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentThirdparty=__CONTACTCIVNAME__\n\n__PERSONALIZED__\n\n__SIGNATURE__ From 9aaab2c1dc4049c10041d7a669702fce3a4d8472 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 2 Dec 2015 23:20:19 +0100 Subject: [PATCH 12/12] Work on select fields on project list --- htdocs/projet/list.php | 67 ++++++++++++++++++++++++++++++++--------- htdocs/societe/list.php | 10 +++--- 2 files changed, 58 insertions(+), 19 deletions(-) diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index c4e8b8f5783..a50595db609 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -84,8 +84,58 @@ $syear = GETPOST('syear','int'); if ($search_status == '') $search_status=-1; // -1 or 1 -// Purge criteria -if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$contextpage='projectlist'; + +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$hookmanager->initHooks(array($contextpage)); +$extrafields = new ExtraFields($db); + +// fetch optionals attributes and labels +$extralabels = $extrafields->fetch_name_optionals_label('project'); +$search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_'); + +// List of fields to search into when doing a "search in all" +$fieldstosearchall = array( + 'p.ref'=>"Ref", + 'p.title'=>"Label", + 's.nom'=>"ThirdPartyName", + "p.note_public"=>"NotePublic" +); +if (empty($user->socid)) $fieldstosearchall["p.note_private"]="NotePrivate"; + +$arrayfields=array( + 'p.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), + 'p.label'=>array('label'=>$langs->trans("Label"), 'checked'=>1), + 's.nom'=>array('label'=>$langs->trans("ThirdParty"), 'checked'=>1), + 'commerical'=>array('label'=>$langs->trans("SaleRepresentative"), 'checked'=>1), + 'p.date_start'=>array('label'=>$langs->trans("DateStart"), 'checked'=>1, 'position'=>100), + 'p.date_end'=>array('label'=>$langs->trans("DateEnd"), 'checked'=>1, 'position'=>101), + 'p.visibility'=>array('label'=>$langs->trans("Visibility"), 'checked'=>1, 'position'=>102), + 'p.opportunity_amount'=>array('label'=>$langs->trans("OpportunityAmount"), 'checked'=>1, 'enabled'=>$conf->global->PROJECT_USE_OPPORTUNITIES, 'position'=>103), + 'p.opportunity_status'=>array('label'=>$langs->trans("OpportunityStatus"), 'checked'=>1, 'enabled'=>$conf->global->PROJECT_USE_OPPORTUNITIES, 'position'=>104), + 'p.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), + 'p.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), + 'p.status'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000), +); +// Extra fields +if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) +{ + foreach($extrafields->attribute_label as $key => $val) + { + $arrayfields["ef.".$key]=array('label'=>$extrafields->attribute_label[$key], 'checked'=>$extrafields->attribute_list[$key], 'position'=>$extrafields->attribute_pos[$key], 'enabled'=>$extrafields->attribute_perms[$key]); + } +} + + +/* + * Actions + */ + +include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; + +// Do we click on purge search criteria ? +if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers { $search_all=''; $search_ref=""; @@ -103,20 +153,9 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both $sday=""; $smonth=""; $syear=""; + $search_array_options=array(); } -// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array -$hookmanager->initHooks(array('projectlist')); -$extrafields = new ExtraFields($db); - -// List of fields to search into when doing a "search in all" -$fieldstosearchall = array( - 'p.ref'=>"Ref", - 'p.title'=>"Label", - 's.nom'=>"ThirdPartyName", - "p.note_public"=>"NotePublic" -); -if (empty($user->socid)) $fieldstosearchall["p.note_private"]="NotePrivate"; /* diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 8477eb97788..ef64761ab6f 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -634,14 +634,14 @@ if ($resql) if (! empty($arrayfields['s.town']['checked'])) { print ''; - print ''; + print ''; print ''; } // Zip if (! empty($arrayfields['s.zip']['checked'])) { print ''; - print ''; + print ''; print ''; } // Country @@ -966,21 +966,21 @@ if ($resql) // Date creation if (! empty($arrayfields['s.datec']['checked'])) { - print ''; + print ''; print dol_print_date($db->jdate($obj->date_creation), 'dayhour'); print ''; } // Date modification if (! empty($arrayfields['s.tms']['checked'])) { - print ''; + print ''; print dol_print_date($db->jdate($obj->date_update), 'dayhour'); print ''; } // Status if (! empty($arrayfields['s.status']['checked'])) { - print ''.$companystatic->getLibStatut(3).''; + print ''.$companystatic->getLibStatut(3).''; } // Action column print '';