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 ''; 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 65f4fb9adcd..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 @@ -317,7 +317,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); 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; diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index f7275b54570..5d622c05c29 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2183,12 +2183,43 @@ class Product extends CommonObject } else { $sql .= " ppe.accountancy_code_buy, ppe.accountancy_code_buy_intra, ppe.accountancy_code_buy_export, ppe.accountancy_code_sell, ppe.accountancy_code_sell_intra, ppe.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 & Stocks Sharings stock_reel includes only stocks shared with this entity + $separatedEntityPMP = false; + $separatedStock = false; + 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; + 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 .= " 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 ppe ON ppe.fk_product = p.rowid AND ppe.entity = " . ((int) $conf->entity); } + 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 { @@ -2201,6 +2232,12 @@ class Product extends CommonObject $sql .= " AND p.barcode = '".$this->db->escape($barcode)."'"; } } + if ($separatedStock) { + $sql .= " AND sp.fk_entrepot IN ( + SELECT rowid + FROM ".MAIN_DB_PREFIX."entrepot WHERE entity IN (" . $this->db->sanitize($visibleWarehousesEntities) ."))"; + } + $resql = $this->db->query($sql); if ($resql) { diff --git a/htdocs/product/stock/card.php b/htdocs/product/stock/card.php index 983e0089fe5..b8698ff7ad3 100644 --- a/htdocs/product/stock/card.php +++ b/htdocs/product/stock/card.php @@ -605,7 +605,18 @@ 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 .= " pa.pmp as ppmp,"; + } else { + $sql .= " p.pmp as ppmp,"; + } $sql .= " ps.reel as value"; if (!empty($conf->global->PRODUCT_USE_UNITS)) { $sql .= ",fk_unit"; @@ -618,9 +629,19 @@ if ($action == 'create') { } $sql .= $hookmanager->resPrint; $sql .= " FROM ".MAIN_DB_PREFIX."product_stock as ps, ".MAIN_DB_PREFIX."product as p"; + + if ($separatedPMP) { + $sql .= ", ".MAIN_DB_PREFIX."product_perentity as pa"; + } + $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 pa.fk_product = p.rowid AND pa.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..dc15e092155 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -610,15 +610,31 @@ 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 * 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."product_perentity as pa"; + } $sql .= " WHERE ps.fk_entrepot = ".$this->id; + if ($separatedPMP) { + $sql .= " AND pa.fk_product = p.rowid AND pa.entity = ". (int) $conf->entity; + } $sql .= " AND ps.fk_product = p.rowid"; - //print $sql; $result = $this->db->query($sql); if ($result) { 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);