From 9e2ee5bf57d4b187ceea53ff874db63631a269d2 Mon Sep 17 00:00:00 2001 From: Antonin MARCHAL Date: Mon, 26 Apr 2021 19:29:56 +0200 Subject: [PATCH 01/15] add(pmp) PMP per entity --- htdocs/product/class/product.class.php | 53 ++++++++++++++++++- htdocs/product/stock/card.php | 25 ++++++++- htdocs/product/stock/class/entrepot.class.php | 25 ++++++++- 3 files changed, 100 insertions(+), 3 deletions(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 6ed0b4266a8..65a73814c8e 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2181,12 +2181,52 @@ class Product extends CommonObject } else { $sql .= " pa.accountancy_code_buy, pa.accountancy_code_buy_intra, pa.accountancy_code_buy_export, pa.accountancy_code_sell, pa.accountancy_code_sell_intra, pa.accountancy_code_sell_export,"; } - $sql .= " p.stock,p.pmp, p.datec, p.tms, p.import_key, p.entity, p.desiredstock, p.tobatch, p.batch_mask, p.fk_unit,"; + //For MultiCompany PMP per entity + $separatedEntityPMP = false; + if (!empty($conf->global->MULTICOMPANY_PRODUCT_SHARING_ENABLED) && !empty($conf->global->MULTICOMPANY_PMP_PER_ENTITY_ENABLED)) { + $checkPMPPerEntity = $this->db->query("SELECT pmp FROM " . MAIN_DB_PREFIX . "entity_product_pmp WHERE fk_product = ".((int) $id)." AND entity = ".(int) $conf->entity); + if($this->db->num_rows($checkPMPPerEntity)>0){ + $separatedEntityPMP = true; + } + } + + //For MultiCompany Stocks Sharings stock_reel includes only stocks shared with this entity + $separatedStock = false; + if (!empty($conf->global->MULTICOMPANY_STOCK_SHARING_ENABLED)){ + global $mc; + $separatedStock = true; + $visibleWarehousesEntities = $conf->entity; + if(isset($mc->sharings['stock']) && !empty($mc->sharings['stock'])){ + $visibleWarehousesEntities .= "," . implode(",",$mc->sharings['stock']); + } + } + if($separatedStock){ + $sql .= " SUM(sp.reel) as stock,"; + } + else{ + $sql .= " p.stock,"; + } + + if ($separatedEntityPMP){ + $sql .= " ppe.pmp, p.datec, p.tms, p.import_key, p.entity, p.desiredstock, p.tobatch, p.batch_mask, p.fk_unit,"; + } + else{ + $sql .= " p.pmp, p.datec, p.tms, p.import_key, p.entity, p.desiredstock, p.tobatch, p.batch_mask, p.fk_unit,"; + } $sql .= " p.fk_price_expression, p.price_autogen, p.model_pdf"; $sql .= " FROM ".MAIN_DB_PREFIX."product as p"; if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) { $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_perentity as pa ON pa.fk_product = p.rowid AND pa.entity = " . ((int) $conf->entity); } + + if ($separatedEntityPMP) { + $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "entity_product_pmp as ppe ON ppe.fk_product = p.rowid"; + } + + if($separatedStock){ + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_stock as sp ON sp.fk_product = p.rowid"; + } + if ($id) { $sql .= " WHERE p.rowid = ".((int) $id); } else { @@ -2200,6 +2240,17 @@ class Product extends CommonObject } } + if ($separatedEntityPMP) { + $sql .= " AND ppe.entity = " . (int) $conf->entity; + } + + if($separatedStock){ + $sql .= " AND sp.fk_entrepot IN ( + SELECT rowid + FROM ".MAIN_DB_PREFIX."entrepot WHERE entity IN (" . $visibleWarehousesEntities ."))"; + } + + $resql = $this->db->query($sql); if ($resql) { unset($this->oldcopy); diff --git a/htdocs/product/stock/card.php b/htdocs/product/stock/card.php index 0a77a39a0df..25cea1621c7 100644 --- a/htdocs/product/stock/card.php +++ b/htdocs/product/stock/card.php @@ -596,15 +596,38 @@ if ($action == 'create') { $totalunit = 0; $totalvalue = $totalvaluesell = 0; - $sql = "SELECT p.rowid as rowid, p.ref, p.label as produit, p.tobatch, p.fk_product_type as type, p.pmp as ppmp, p.price, p.price_ttc, p.entity,"; + //For MultiCompany PMP per entity + $separatedPMP = false; + if (!empty($conf->global->MULTICOMPANY_PRODUCT_SHARING_ENABLED) && !empty($conf->global->MULTICOMPANY_PMP_PER_ENTITY_ENABLED)) { + $separatedPMP = true; + } + + $sql = "SELECT p.rowid as rowid, p.ref, p.label as produit, p.tobatch, p.fk_product_type as type, p.price, p.price_ttc, p.entity,"; + if ($separatedPMP) { + $sql .= " ppe.pmp as ppmp,"; + } + else{ + $sql .= " p.pmp as ppmp,"; + } + $sql .= " ps.reel as value"; if (!empty($conf->global->PRODUCT_USE_UNITS)) { $sql .= ",fk_unit"; } $sql .= " FROM ".MAIN_DB_PREFIX."product_stock as ps, ".MAIN_DB_PREFIX."product as p"; + + if ($separatedPMP) { + $sql .= ", ".MAIN_DB_PREFIX."entity_product_pmp as ppe"; + } + $sql .= " WHERE ps.fk_product = p.rowid"; $sql .= " AND ps.reel <> 0"; // We do not show if stock is 0 (no product in this warehouse) $sql .= " AND ps.fk_entrepot = ".$object->id; + + if ($separatedPMP) { + $sql .= " AND ppe.fk_product = p.rowid AND ppe.entity = ". (int) $conf->entity; + } + $sql .= $db->order($sortfield, $sortorder); dol_syslog('List products', LOG_DEBUG); diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php index 8bd250bc76e..53799617420 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -610,13 +610,36 @@ class Entrepot extends CommonObject */ public function nb_products() { + global $conf; // phpcs:enable $ret = array(); - $sql = "SELECT sum(ps.reel) as nb, sum(ps.reel * p.pmp) as value"; + //For MultiCompany PMP per entity + $separatedPMP = false; + if (!empty($conf->global->MULTICOMPANY_PRODUCT_SHARING_ENABLED) && !empty($conf->global->MULTICOMPANY_PMP_PER_ENTITY_ENABLED)) { + $separatedPMP = true; + } + + if ($separatedPMP) { + $sql = "SELECT sum(ps.reel) as nb, sum(ps.reel * ppe.pmp) as value"; + } + else{ + $sql = "SELECT sum(ps.reel) as nb, sum(ps.reel * p.pmp) as value"; + } $sql .= " FROM ".MAIN_DB_PREFIX."product_stock as ps"; + $sql .= ", ".MAIN_DB_PREFIX."product as p"; + + if ($separatedPMP) { + $sql .= ", ".MAIN_DB_PREFIX."entity_product_pmp as ppe"; + } + $sql .= " WHERE ps.fk_entrepot = ".$this->id; + + if ($separatedPMP) { + $sql .= " AND ppe.fk_product = p.rowid AND ppe.entity = ". (int) $conf->entity; + } + $sql .= " AND ps.fk_product = p.rowid"; //print $sql; From 1d162cc62ca8ff486afb558ccf80c8cfa83ad9b4 Mon Sep 17 00:00:00 2001 From: Antonin MARCHAL Date: Mon, 26 Apr 2021 20:06:45 +0200 Subject: [PATCH 02/15] lint(stickler) --- htdocs/product/class/product.class.php | 27 +++++++------------ htdocs/product/stock/card.php | 4 +-- htdocs/product/stock/class/entrepot.class.php | 10 +++---- 3 files changed, 15 insertions(+), 26 deletions(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index be18056c223..cefc4a27b23 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2185,32 +2185,30 @@ class Product extends CommonObject $separatedEntityPMP = false; if (!empty($conf->global->MULTICOMPANY_PRODUCT_SHARING_ENABLED) && !empty($conf->global->MULTICOMPANY_PMP_PER_ENTITY_ENABLED)) { $checkPMPPerEntity = $this->db->query("SELECT pmp FROM " . MAIN_DB_PREFIX . "entity_product_pmp WHERE fk_product = ".((int) $id)." AND entity = ".(int) $conf->entity); - if($this->db->num_rows($checkPMPPerEntity)>0){ + if( $this->db->num_rows($checkPMPPerEntity)>0 ){ $separatedEntityPMP = true; } } - //For MultiCompany Stocks Sharings stock_reel includes only stocks shared with this entity $separatedStock = false; - if (!empty($conf->global->MULTICOMPANY_STOCK_SHARING_ENABLED)){ + if (!empty($conf->global->MULTICOMPANY_STOCK_SHARING_ENABLED)) { global $mc; $separatedStock = true; $visibleWarehousesEntities = $conf->entity; - if(isset($mc->sharings['stock']) && !empty($mc->sharings['stock'])){ - $visibleWarehousesEntities .= "," . implode(",",$mc->sharings['stock']); + if (isset($mc->sharings['stock']) && !empty($mc->sharings['stock'])) { + $visibleWarehousesEntities .= "," . implode( ",", $mc->sharings['stock'] ); } } - if($separatedStock){ + if ($separatedStock) { $sql .= " SUM(sp.reel) as stock,"; } - else{ + else { $sql .= " p.stock,"; } - - if ($separatedEntityPMP){ + if ($separatedEntityPMP) { $sql .= " ppe.pmp, p.datec, p.tms, p.import_key, p.entity, p.desiredstock, p.tobatch, p.batch_mask, p.fk_unit,"; } - else{ + else { $sql .= " p.pmp, p.datec, p.tms, p.import_key, p.entity, p.desiredstock, p.tobatch, p.batch_mask, p.fk_unit,"; } $sql .= " p.fk_price_expression, p.price_autogen, p.model_pdf"; @@ -2218,15 +2216,12 @@ class Product extends CommonObject if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) { $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_perentity as pa ON pa.fk_product = p.rowid AND pa.entity = " . ((int) $conf->entity); } - if ($separatedEntityPMP) { $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "entity_product_pmp as ppe ON ppe.fk_product = p.rowid"; } - - if($separatedStock){ + if ($separatedStock) { $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_stock as sp ON sp.fk_product = p.rowid"; } - if ($id) { $sql .= " WHERE p.rowid = ".((int) $id); } else { @@ -2239,12 +2234,10 @@ class Product extends CommonObject $sql .= " AND p.barcode = '".$this->db->escape($barcode)."'"; } } - if ($separatedEntityPMP) { $sql .= " AND ppe.entity = " . (int) $conf->entity; } - - if($separatedStock){ + if ($separatedStock) { $sql .= " AND sp.fk_entrepot IN ( SELECT rowid FROM ".MAIN_DB_PREFIX."entrepot WHERE entity IN (" . $visibleWarehousesEntities ."))"; diff --git a/htdocs/product/stock/card.php b/htdocs/product/stock/card.php index 865245aef72..86b97204cf0 100644 --- a/htdocs/product/stock/card.php +++ b/htdocs/product/stock/card.php @@ -605,8 +605,8 @@ if ($action == 'create') { $sql = "SELECT p.rowid as rowid, p.ref, p.label as produit, p.tobatch, p.fk_product_type as type, p.price, p.price_ttc, p.entity,"; if ($separatedPMP) { $sql .= " ppe.pmp as ppmp,"; - } - else{ + } + else { $sql .= " p.pmp as ppmp,"; } diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php index 53799617420..f58f12f3240 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -622,8 +622,8 @@ class Entrepot extends CommonObject if ($separatedPMP) { $sql = "SELECT sum(ps.reel) as nb, sum(ps.reel * ppe.pmp) as value"; - } - else{ + } + else { $sql = "SELECT sum(ps.reel) as nb, sum(ps.reel * p.pmp) as value"; } $sql .= " FROM ".MAIN_DB_PREFIX."product_stock as ps"; @@ -632,16 +632,12 @@ class Entrepot extends CommonObject if ($separatedPMP) { $sql .= ", ".MAIN_DB_PREFIX."entity_product_pmp as ppe"; - } - + } $sql .= " WHERE ps.fk_entrepot = ".$this->id; - if ($separatedPMP) { $sql .= " AND ppe.fk_product = p.rowid AND ppe.entity = ". (int) $conf->entity; } - $sql .= " AND ps.fk_product = p.rowid"; - //print $sql; $result = $this->db->query($sql); if ($result) { From 285fa4a506c47f0a4e97ec420904e492b963c229 Mon Sep 17 00:00:00 2001 From: Antonin MARCHAL Date: Mon, 26 Apr 2021 20:10:57 +0200 Subject: [PATCH 03/15] lint(stickler) again --- htdocs/product/class/product.class.php | 10 +++++----- htdocs/product/stock/card.php | 1 - htdocs/product/stock/class/entrepot.class.php | 2 -- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index cefc4a27b23..1c803fefd7e 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2185,7 +2185,7 @@ class Product extends CommonObject $separatedEntityPMP = false; if (!empty($conf->global->MULTICOMPANY_PRODUCT_SHARING_ENABLED) && !empty($conf->global->MULTICOMPANY_PMP_PER_ENTITY_ENABLED)) { $checkPMPPerEntity = $this->db->query("SELECT pmp FROM " . MAIN_DB_PREFIX . "entity_product_pmp WHERE fk_product = ".((int) $id)." AND entity = ".(int) $conf->entity); - if( $this->db->num_rows($checkPMPPerEntity)>0 ){ + if ($this->db->num_rows($checkPMPPerEntity)>0) { $separatedEntityPMP = true; } } @@ -2196,18 +2196,18 @@ class Product extends CommonObject $separatedStock = true; $visibleWarehousesEntities = $conf->entity; if (isset($mc->sharings['stock']) && !empty($mc->sharings['stock'])) { - $visibleWarehousesEntities .= "," . implode( ",", $mc->sharings['stock'] ); + $visibleWarehousesEntities .= "," . implode(",", $mc->sharings['stock']); } } if ($separatedStock) { $sql .= " SUM(sp.reel) as stock,"; - } + } else { $sql .= " p.stock,"; } if ($separatedEntityPMP) { $sql .= " ppe.pmp, p.datec, p.tms, p.import_key, p.entity, p.desiredstock, p.tobatch, p.batch_mask, p.fk_unit,"; - } + } else { $sql .= " p.pmp, p.datec, p.tms, p.import_key, p.entity, p.desiredstock, p.tobatch, p.batch_mask, p.fk_unit,"; } @@ -2235,7 +2235,7 @@ class Product extends CommonObject } } if ($separatedEntityPMP) { - $sql .= " AND ppe.entity = " . (int) $conf->entity; + $sql .= " AND ppe.entity = " . (int) $conf->entity; } if ($separatedStock) { $sql .= " AND sp.fk_entrepot IN ( diff --git a/htdocs/product/stock/card.php b/htdocs/product/stock/card.php index 86b97204cf0..b0b5cdfe2c9 100644 --- a/htdocs/product/stock/card.php +++ b/htdocs/product/stock/card.php @@ -609,7 +609,6 @@ if ($action == 'create') { else { $sql .= " p.pmp as ppmp,"; } - $sql .= " ps.reel as value"; if (!empty($conf->global->PRODUCT_USE_UNITS)) { $sql .= ",fk_unit"; diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php index f58f12f3240..8777450fbb9 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -627,9 +627,7 @@ class Entrepot extends CommonObject $sql = "SELECT sum(ps.reel) as nb, sum(ps.reel * p.pmp) as value"; } $sql .= " FROM ".MAIN_DB_PREFIX."product_stock as ps"; - $sql .= ", ".MAIN_DB_PREFIX."product as p"; - if ($separatedPMP) { $sql .= ", ".MAIN_DB_PREFIX."entity_product_pmp as ppe"; } From 57118da2068acb06f8c11db0a82d2d81430f3f69 Mon Sep 17 00:00:00 2001 From: Antonin MARCHAL Date: Mon, 26 Apr 2021 20:13:55 +0200 Subject: [PATCH 04/15] lint(stickler)3rd --- htdocs/product/class/product.class.php | 6 ++---- htdocs/product/stock/card.php | 3 +-- htdocs/product/stock/class/entrepot.class.php | 5 ++--- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 1c803fefd7e..d79ae061ae9 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2201,14 +2201,12 @@ class Product extends CommonObject } if ($separatedStock) { $sql .= " SUM(sp.reel) as stock,"; - } - else { + } else { $sql .= " p.stock,"; } if ($separatedEntityPMP) { $sql .= " ppe.pmp, p.datec, p.tms, p.import_key, p.entity, p.desiredstock, p.tobatch, p.batch_mask, p.fk_unit,"; - } - else { + } else { $sql .= " p.pmp, p.datec, p.tms, p.import_key, p.entity, p.desiredstock, p.tobatch, p.batch_mask, p.fk_unit,"; } $sql .= " p.fk_price_expression, p.price_autogen, p.model_pdf"; diff --git a/htdocs/product/stock/card.php b/htdocs/product/stock/card.php index b0b5cdfe2c9..1faa19be499 100644 --- a/htdocs/product/stock/card.php +++ b/htdocs/product/stock/card.php @@ -605,8 +605,7 @@ if ($action == 'create') { $sql = "SELECT p.rowid as rowid, p.ref, p.label as produit, p.tobatch, p.fk_product_type as type, p.price, p.price_ttc, p.entity,"; if ($separatedPMP) { $sql .= " ppe.pmp as ppmp,"; - } - else { + } else { $sql .= " p.pmp as ppmp,"; } $sql .= " ps.reel as value"; diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php index 8777450fbb9..b51c0d4ea75 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -622,8 +622,7 @@ class Entrepot extends CommonObject if ($separatedPMP) { $sql = "SELECT sum(ps.reel) as nb, sum(ps.reel * ppe.pmp) as value"; - } - else { + } else { $sql = "SELECT sum(ps.reel) as nb, sum(ps.reel * p.pmp) as value"; } $sql .= " FROM ".MAIN_DB_PREFIX."product_stock as ps"; @@ -634,7 +633,7 @@ class Entrepot extends CommonObject $sql .= " WHERE ps.fk_entrepot = ".$this->id; if ($separatedPMP) { $sql .= " AND ppe.fk_product = p.rowid AND ppe.entity = ". (int) $conf->entity; - } + } $sql .= " AND ps.fk_product = p.rowid"; //print $sql; $result = $this->db->query($sql); From c0b6dd92d7ffb39e76f4e077a495c4be233a2442 Mon Sep 17 00:00:00 2001 From: Antonin MARCHAL Date: Mon, 26 Apr 2021 20:15:32 +0200 Subject: [PATCH 05/15] lint(stickler)4th --- htdocs/product/stock/class/entrepot.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php index b51c0d4ea75..b1c41d24ef3 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -629,11 +629,11 @@ class Entrepot extends CommonObject $sql .= ", ".MAIN_DB_PREFIX."product as p"; if ($separatedPMP) { $sql .= ", ".MAIN_DB_PREFIX."entity_product_pmp as ppe"; - } + } $sql .= " WHERE ps.fk_entrepot = ".$this->id; if ($separatedPMP) { $sql .= " AND ppe.fk_product = p.rowid AND ppe.entity = ". (int) $conf->entity; - } + } $sql .= " AND ps.fk_product = p.rowid"; //print $sql; $result = $this->db->query($sql); From a296f81bc6424858207b6d55fc0db649de4c6579 Mon Sep 17 00:00:00 2001 From: Antonin MARCHAL Date: Mon, 26 Apr 2021 20:30:21 +0200 Subject: [PATCH 06/15] lint(travis) --- htdocs/product/class/product.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index d79ae061ae9..83354384e8b 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2238,7 +2238,7 @@ class Product extends CommonObject if ($separatedStock) { $sql .= " AND sp.fk_entrepot IN ( SELECT rowid - FROM ".MAIN_DB_PREFIX."entrepot WHERE entity IN (" . $visibleWarehousesEntities ."))"; + FROM ".MAIN_DB_PREFIX."entrepot WHERE entity IN (" . $this->db->sanitize($visibleWarehousesEntities) ."))"; } From b573d81e4596dc98577b13e4a45304626b5528bc Mon Sep 17 00:00:00 2001 From: Antonin MARCHAL Date: Tue, 27 Apr 2021 09:54:38 +0200 Subject: [PATCH 07/15] fix(lint) eldy's remarks + other table used --- htdocs/product/class/product.class.php | 32 ++++++++++++-------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 83354384e8b..bf1cfa1c244 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2181,17 +2181,20 @@ class Product extends CommonObject } else { $sql .= " pa.accountancy_code_buy, pa.accountancy_code_buy_intra, pa.accountancy_code_buy_export, pa.accountancy_code_sell, pa.accountancy_code_sell_intra, pa.accountancy_code_sell_export,"; } - //For MultiCompany PMP per entity + + //For MultiCompany + //PMP per entity & Stocks Sharings stock_reel includes only stocks shared with this entity + //TODO : Add to Dolibarr update : SQL ; + $separatedEntityPMP = false; - if (!empty($conf->global->MULTICOMPANY_PRODUCT_SHARING_ENABLED) && !empty($conf->global->MULTICOMPANY_PMP_PER_ENTITY_ENABLED)) { - $checkPMPPerEntity = $this->db->query("SELECT pmp FROM " . MAIN_DB_PREFIX . "entity_product_pmp WHERE fk_product = ".((int) $id)." AND entity = ".(int) $conf->entity); - if ($this->db->num_rows($checkPMPPerEntity)>0) { - $separatedEntityPMP = true; - } - } - //For MultiCompany Stocks Sharings stock_reel includes only stocks shared with this entity $separatedStock = false; - if (!empty($conf->global->MULTICOMPANY_STOCK_SHARING_ENABLED)) { + if (!empty($conf->global->MULTICOMPANY_PRODUCT_SHARING_ENABLED)) { + if (!empty($conf->global->MULTICOMPANY_PMP_PER_ENTITY_ENABLED)) { + $checkPMPPerEntity = $this->db->query("SELECT pmp FROM " . MAIN_DB_PREFIX . "product_perentity WHERE fk_product = ".((int) $id)." AND entity = ".(int) $conf->entity); + if ($this->db->num_rows($checkPMPPerEntity)>0) { + $separatedEntityPMP = true; + } + } global $mc; $separatedStock = true; $visibleWarehousesEntities = $conf->entity; @@ -2199,24 +2202,22 @@ class Product extends CommonObject $visibleWarehousesEntities .= "," . implode(",", $mc->sharings['stock']); } } + if ($separatedStock) { $sql .= " SUM(sp.reel) as stock,"; } else { $sql .= " p.stock,"; } if ($separatedEntityPMP) { - $sql .= " ppe.pmp, p.datec, p.tms, p.import_key, p.entity, p.desiredstock, p.tobatch, p.batch_mask, p.fk_unit,"; + $sql .= " pa.pmp, p.datec, p.tms, p.import_key, p.entity, p.desiredstock, p.tobatch, p.batch_mask, p.fk_unit,"; } else { $sql .= " p.pmp, p.datec, p.tms, p.import_key, p.entity, p.desiredstock, p.tobatch, p.batch_mask, p.fk_unit,"; } $sql .= " p.fk_price_expression, p.price_autogen, p.model_pdf"; $sql .= " FROM ".MAIN_DB_PREFIX."product as p"; - if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) { + if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED) || $separatedEntityPMP) { $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_perentity as pa ON pa.fk_product = p.rowid AND pa.entity = " . ((int) $conf->entity); } - if ($separatedEntityPMP) { - $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "entity_product_pmp as ppe ON ppe.fk_product = p.rowid"; - } if ($separatedStock) { $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_stock as sp ON sp.fk_product = p.rowid"; } @@ -2232,9 +2233,6 @@ class Product extends CommonObject $sql .= " AND p.barcode = '".$this->db->escape($barcode)."'"; } } - if ($separatedEntityPMP) { - $sql .= " AND ppe.entity = " . (int) $conf->entity; - } if ($separatedStock) { $sql .= " AND sp.fk_entrepot IN ( SELECT rowid From 5fd0c1b81002de20cc13e162d0313ccd208a3a8e Mon Sep 17 00:00:00 2001 From: Antonin MARCHAL Date: Tue, 27 Apr 2021 09:55:35 +0200 Subject: [PATCH 08/15] fix(code)eldy's remarks --- htdocs/install/mysql/migration/13.0.0-14.0.0.sql | 3 +++ htdocs/product/stock/card.php | 6 +++--- htdocs/product/stock/class/entrepot.class.php | 6 +++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql index e762ddd94e4..652be6ec035 100644 --- a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql +++ b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql @@ -436,3 +436,6 @@ ALTER TABLE llx_entrepot ADD COLUMN fk_project INTEGER DEFAULT NULL AFTER entity UPDATE llx_const SET value = 'github' WHERE __DECRYPT('name')__ = 'MAIN_BUGTRACK_ENABLELINK' AND __DECRYPT('value')__ = 1; +-- For MultiCompany PMP per entity +ALTER TABLE llx_product_perentity ADD pmp FLOAT NULL DEFAULT NULL AFTER accountancy_code_buy_export + diff --git a/htdocs/product/stock/card.php b/htdocs/product/stock/card.php index 1faa19be499..2a88e8191e8 100644 --- a/htdocs/product/stock/card.php +++ b/htdocs/product/stock/card.php @@ -604,7 +604,7 @@ if ($action == 'create') { $sql = "SELECT p.rowid as rowid, p.ref, p.label as produit, p.tobatch, p.fk_product_type as type, p.price, p.price_ttc, p.entity,"; if ($separatedPMP) { - $sql .= " ppe.pmp as ppmp,"; + $sql .= " pa.pmp as ppmp,"; } else { $sql .= " p.pmp as ppmp,"; } @@ -615,7 +615,7 @@ if ($action == 'create') { $sql .= " FROM ".MAIN_DB_PREFIX."product_stock as ps, ".MAIN_DB_PREFIX."product as p"; if ($separatedPMP) { - $sql .= ", ".MAIN_DB_PREFIX."entity_product_pmp as ppe"; + $sql .= ", ".MAIN_DB_PREFIX."product_perentity as pa"; } $sql .= " WHERE ps.fk_product = p.rowid"; @@ -623,7 +623,7 @@ if ($action == 'create') { $sql .= " AND ps.fk_entrepot = ".$object->id; if ($separatedPMP) { - $sql .= " AND ppe.fk_product = p.rowid AND ppe.entity = ". (int) $conf->entity; + $sql .= " AND pa.fk_product = p.rowid AND pa.entity = ". (int) $conf->entity; } $sql .= $db->order($sortfield, $sortorder); diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php index b1c41d24ef3..dc15e092155 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -621,18 +621,18 @@ class Entrepot extends CommonObject } if ($separatedPMP) { - $sql = "SELECT sum(ps.reel) as nb, sum(ps.reel * ppe.pmp) as value"; + $sql = "SELECT sum(ps.reel) as nb, sum(ps.reel * pa.pmp) as value"; } else { $sql = "SELECT sum(ps.reel) as nb, sum(ps.reel * p.pmp) as value"; } $sql .= " FROM ".MAIN_DB_PREFIX."product_stock as ps"; $sql .= ", ".MAIN_DB_PREFIX."product as p"; if ($separatedPMP) { - $sql .= ", ".MAIN_DB_PREFIX."entity_product_pmp as ppe"; + $sql .= ", ".MAIN_DB_PREFIX."product_perentity as pa"; } $sql .= " WHERE ps.fk_entrepot = ".$this->id; if ($separatedPMP) { - $sql .= " AND ppe.fk_product = p.rowid AND ppe.entity = ". (int) $conf->entity; + $sql .= " AND pa.fk_product = p.rowid AND pa.entity = ". (int) $conf->entity; } $sql .= " AND ps.fk_product = p.rowid"; //print $sql; From c865199a783326e5a36cd5b64cc248c6d2926db8 Mon Sep 17 00:00:00 2001 From: Antonin MARCHAL Date: Tue, 27 Apr 2021 09:58:36 +0200 Subject: [PATCH 09/15] lint(stickler) --- htdocs/product/class/product.class.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index bf1cfa1c244..5b6ba2762c9 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2181,11 +2181,9 @@ class Product extends CommonObject } else { $sql .= " pa.accountancy_code_buy, pa.accountancy_code_buy_intra, pa.accountancy_code_buy_export, pa.accountancy_code_sell, pa.accountancy_code_sell_intra, pa.accountancy_code_sell_export,"; } - - //For MultiCompany - //PMP per entity & Stocks Sharings stock_reel includes only stocks shared with this entity - //TODO : Add to Dolibarr update : SQL ; + //For MultiCompany + //PMP per entity & Stocks Sharings stock_reel includes only stocks shared with this entity $separatedEntityPMP = false; $separatedStock = false; if (!empty($conf->global->MULTICOMPANY_PRODUCT_SHARING_ENABLED)) { From 00ef5b94bf3fc9032fcac36119638369fa9bea1b Mon Sep 17 00:00:00 2001 From: Antonin MARCHAL Date: Tue, 27 Apr 2021 09:59:33 +0200 Subject: [PATCH 10/15] lint(stickler) --- htdocs/product/class/product.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 5b6ba2762c9..9c773d6382d 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2200,7 +2200,6 @@ class Product extends CommonObject $visibleWarehousesEntities .= "," . implode(",", $mc->sharings['stock']); } } - if ($separatedStock) { $sql .= " SUM(sp.reel) as stock,"; } else { From 5d1d6eee95d4bbebd713dbd8a5281fb28647716d Mon Sep 17 00:00:00 2001 From: Antonin MARCHAL Date: Tue, 27 Apr 2021 10:51:15 +0200 Subject: [PATCH 11/15] add(pmp) on Warehouse List --- htdocs/product/stock/list.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php index d49db2f7b02..ae8b13c776f 100644 --- a/htdocs/product/stock/list.php +++ b/htdocs/product/stock/list.php @@ -208,7 +208,16 @@ if (!empty($extrafields->attributes[$object->table_element]['label'])) { $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.' as options_'.$key.', ' : ''); } } -$sql .= " SUM(p.pmp * ps.reel) as estimatedvalue, SUM(p.price * ps.reel) as sellvalue, SUM(ps.reel) as stockqty"; + +//For Multicompany PMP per entity +$separatedPMP = false; +if (!empty($conf->global->MULTICOMPANY_PRODUCT_SHARING_ENABLED) && !empty($conf->global->MULTICOMPANY_PMP_PER_ENTITY_ENABLED)) { + $separatedPMP = true; + $sql .= " SUM(pa.pmp * ps.reel) as estimatedvalue, SUM(p.price * ps.reel) as sellvalue, SUM(ps.reel) as stockqty"; +} else { + $sql .= " SUM(p.pmp * ps.reel) as estimatedvalue, SUM(p.price * ps.reel) as sellvalue, SUM(ps.reel) as stockqty"; +} + // Add fields from hooks $parameters = array(); $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook @@ -225,7 +234,12 @@ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_stock as ps ON t.rowid = ps.fk_ent $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON ps.fk_product = p.rowid"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as c_dep ON c_dep.rowid = t.fk_departement"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as ccount ON ccount.rowid = t.fk_pays"; +if ($separatedPMP) { + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_perentity as pa ON pa.fk_product = p.rowid AND pa.fk_product = ps.fk_product AND pa.entity = ". (int) $conf->entity; +} + $sql .= " WHERE t.entity IN (".getEntity('stock').")"; + if (!empty($conf->categorie->enabled)) { $sql .= Categorie::getFilterSelectQuery(Categorie::TYPE_WAREHOUSE, "t.rowid", $search_category_list); } @@ -273,6 +287,7 @@ $reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters); // $sql .= $hookmanager->resPrint; $sql = preg_replace('/,\s*$/', '', $sql); $totalnboflines = 0; + $result = $db->query($sql); if ($result) { $totalnboflines = $db->num_rows($result); From 0108826ee58cc3207c839acdf3aee9b0f5a5f8a5 Mon Sep 17 00:00:00 2001 From: antonin_tdj <50403308+ibuiv@users.noreply.github.com> Date: Wed, 28 Apr 2021 16:03:40 +0200 Subject: [PATCH 12/15] add column instead of just add --- htdocs/install/mysql/migration/13.0.0-14.0.0.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql index 652be6ec035..3c21284363a 100644 --- a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql +++ b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql @@ -437,5 +437,5 @@ ALTER TABLE llx_entrepot ADD COLUMN fk_project INTEGER DEFAULT NULL AFTER entity UPDATE llx_const SET value = 'github' WHERE __DECRYPT('name')__ = 'MAIN_BUGTRACK_ENABLELINK' AND __DECRYPT('value')__ = 1; -- For MultiCompany PMP per entity -ALTER TABLE llx_product_perentity ADD pmp FLOAT NULL DEFAULT NULL AFTER accountancy_code_buy_export +ALTER TABLE llx_product_perentity ADD COLUMN pmp FLOAT NULL DEFAULT NULL AFTER accountancy_code_buy_export From c89830b25b3db9ab457c7941455bda4db1027a44 Mon Sep 17 00:00:00 2001 From: Antonin MARCHAL Date: Thu, 29 Apr 2021 01:17:21 +0200 Subject: [PATCH 13/15] fix(sql) pmp added to create table both migration and install --- htdocs/install/mysql/migration/13.0.0-14.0.0.sql | 9 +++------ htdocs/install/mysql/tables/llx_product_perentity.sql | 3 ++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql index 652be6ec035..acc0659bbcb 100644 --- a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql +++ b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql @@ -307,7 +307,8 @@ create table llx_product_perentity accountancy_code_sell_export varchar(32), -- Selling accountancy code for vat export accountancy_code_buy varchar(32), -- Buying accountancy code accountancy_code_buy_intra varchar(32), -- Buying accountancy code for vat intracommunity - accountancy_code_buy_export varchar(32) -- Buying accountancy code for vat import + accountancy_code_buy_export varchar(32), -- Buying accountancy code for vat import + pmp double(24,8) )ENGINE=innodb; ALTER TABLE llx_product_perentity ADD INDEX idx_product_perentity_fk_product (fk_product); @@ -434,8 +435,4 @@ ALTER TABLE llx_entrepot ADD COLUMN fk_project INTEGER DEFAULT NULL AFTER entity -- Rebuild sequence for postgres only after query INSERT INTO llx_salary(rowid, ... -- VPGSQL8.2 SELECT dol_util_rebuild_sequences(); -UPDATE llx_const SET value = 'github' WHERE __DECRYPT('name')__ = 'MAIN_BUGTRACK_ENABLELINK' AND __DECRYPT('value')__ = 1; - --- For MultiCompany PMP per entity -ALTER TABLE llx_product_perentity ADD pmp FLOAT NULL DEFAULT NULL AFTER accountancy_code_buy_export - +UPDATE llx_const SET value = 'github' WHERE __DECRYPT('name')__ = 'MAIN_BUGTRACK_ENABLELINK' AND __DECRYPT('value')__ = 1; \ No newline at end of file diff --git a/htdocs/install/mysql/tables/llx_product_perentity.sql b/htdocs/install/mysql/tables/llx_product_perentity.sql index 6e32e506ddf..495324f9f5b 100644 --- a/htdocs/install/mysql/tables/llx_product_perentity.sql +++ b/htdocs/install/mysql/tables/llx_product_perentity.sql @@ -26,5 +26,6 @@ create table llx_product_perentity accountancy_code_sell_export varchar(32), -- Selling accountancy code for vat export accountancy_code_buy varchar(32), -- Buying accountancy code accountancy_code_buy_intra varchar(32), -- Buying accountancy code for vat intracommunity - accountancy_code_buy_export varchar(32) -- Buying accountancy code for vat import + accountancy_code_buy_export varchar(32), -- Buying accountancy code for vat import + pmp double(24,8) )ENGINE=innodb; From 6644fd3a739e1b222731cf8f351031bfa11c1e7d Mon Sep 17 00:00:00 2001 From: daraelmin Date: Mon, 3 May 2021 22:15:40 +0200 Subject: [PATCH 14/15] Fix undefined translation key --- htdocs/adherents/type.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php index 4bde256c8f8..6c4f63725e1 100644 --- a/htdocs/adherents/type.php +++ b/htdocs/adherents/type.php @@ -796,7 +796,7 @@ if ($rowid > 0) { print $form->selectyesno("subscription", $object->subscription, 1); print ''; - print ''.$langs->trans("DefineAmountMemberType").''; + print ''.$langs->trans("Amount").''; print ''; print ''; From da08670a3dd3685ad42d5942dd47f3d190ee78a3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 4 May 2021 00:24:32 +0200 Subject: [PATCH 15/15] Update 13.0.0-14.0.0.sql --- htdocs/install/mysql/migration/13.0.0-14.0.0.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql index 956e0824754..af6c2f48f50 100644 --- a/htdocs/install/mysql/migration/13.0.0-14.0.0.sql +++ b/htdocs/install/mysql/migration/13.0.0-14.0.0.sql @@ -449,7 +449,6 @@ ALTER TABLE llx_payment_donation ADD COLUMN ext_payment_id varchar(128) AFTER n -- Rebuild sequence for postgres only after query INSERT INTO llx_salary(rowid, ... -- VPGSQL8.2 SELECT dol_util_rebuild_sequences(); -UPDATE llx_const SET value = 'github' WHERE __DECRYPT('name')__ = 'MAIN_BUGTRACK_ENABLELINK' AND __DECRYPT('value')__ = 1; UPDATE llx_const SET value = 'github' WHERE __DECRYPT('name')__ = 'MAIN_BUGTRACK_ENABLELINK' AND __DECRYPT('value')__ = 1; ALTER TABLE llx_facture_fourn_det ADD COLUMN fk_remise_except integer DEFAULT NULL after remise_percent;