From fff805e7eccb0e3c82f1085d0ab97f6533e4d20b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 2 Jan 2020 15:10:46 +0100 Subject: [PATCH 01/10] Look and feel v11 --- htdocs/societe/paymentmodes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index 9bf2a40f069..04717aa01be 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -1769,7 +1769,7 @@ if ($socid && $action == 'editcard' && $user->rights->societe->creer) // Create BAN if ($socid && $action == 'create' && $user->rights->societe->creer) { - dol_fiche_head($head, 'rib', $langs->trans("ThirdParty"), -1, 'company'); + dol_fiche_head($head, 'rib', $langs->trans("ThirdParty"), 0, 'company'); $linkback = ''.$langs->trans("BackToList").''; From d398917294b1e567c7971654f78d92b28c5e963a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 2 Jan 2020 15:47:31 +0100 Subject: [PATCH 02/10] Prepare final version --- htdocs/filefunc.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index 401a2c01380..5c854d0ecb1 100644 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -31,7 +31,7 @@ */ if (! defined('DOL_APPLICATION_TITLE')) define('DOL_APPLICATION_TITLE', 'Dolibarr'); -if (! defined('DOL_VERSION')) define('DOL_VERSION', '11.0.0-beta'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c +if (! defined('DOL_VERSION')) define('DOL_VERSION', '11.0.0'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c if (! defined('EURO')) define('EURO', chr(128)); From 2c20b25a298f623cb5dbcd4ca11a39bb39818482 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 2 Jan 2020 18:02:53 +0100 Subject: [PATCH 03/10] Suggest another value than "bad customer" to close an invoice paid --- htdocs/compta/facture/card.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 3f3bffc6cd2..aefe642970a 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -3747,18 +3747,24 @@ elseif ($id > 0 || !empty($ref)) $i++; $close[$i]['code'] = 'badcustomer'; $i++; + $close[$i]['code'] = 'other'; + $i++; // Help $i = 0; $close[$i]['label'] = $langs->trans("HelpEscompte").'

'.$langs->trans("ConfirmClassifyPaidPartiallyReasonDiscountVatDesc"); $i++; $close[$i]['label'] = $langs->trans("ConfirmClassifyPaidPartiallyReasonBadCustomerDesc"); $i++; + $close[$i]['label'] = $langs->trans("Other"); + $i++; // Texte $i = 0; $close[$i]['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyPaidPartiallyReasonDiscount", $resteapayer, $langs->trans("Currency".$conf->currency)), $close[$i]['label'], 1); $i++; $close[$i]['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyPaidPartiallyReasonBadCustomer", $resteapayer, $langs->trans("Currency".$conf->currency)), $close[$i]['label'], 1); $i++; + $close[$i]['reason'] = $form->textwithpicto($langs->transnoentities("Other"), $close[$i]['label'], 1); + $i++; // arrayreasons[code]=reason foreach ($close as $key => $val) { $arrayreasons[$close [$key]['code']] = $close[$key]['reason']; From d93de4b931aa0d474ffc8b6ff6c4ac669fab939d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 2 Jan 2020 20:08:43 +0100 Subject: [PATCH 04/10] FIX Import of customer prices per segment was not possible --- htdocs/install/mysql/migration/10.0.0-11.0.0.sql | 2 ++ htdocs/install/mysql/tables/llx_product_price.sql | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/install/mysql/migration/10.0.0-11.0.0.sql b/htdocs/install/mysql/migration/10.0.0-11.0.0.sql index b73593c3dfd..e5d996be713 100644 --- a/htdocs/install/mysql/migration/10.0.0-11.0.0.sql +++ b/htdocs/install/mysql/migration/10.0.0-11.0.0.sql @@ -59,6 +59,8 @@ ALTER TABLE llx_emailcollector_emailcollectoraction ADD COLUMN position integer -- For v11 +ALTER TABLE llx_product_price MODIFY COLUMN tva_tx double(6,3) DEFAULT 0 NOT NULL; + ALTER TABLE llx_facturedet MODIFY COLUMN situation_percent real DEFAULT 100; UPDATE llx_facturedet SET situation_percent = 100 WHERE situation_percent IS NULL AND fk_prev_id IS NULL; diff --git a/htdocs/install/mysql/tables/llx_product_price.sql b/htdocs/install/mysql/tables/llx_product_price.sql index 11b2ac972cf..75a5355afe7 100644 --- a/htdocs/install/mysql/tables/llx_product_price.sql +++ b/htdocs/install/mysql/tables/llx_product_price.sql @@ -35,7 +35,7 @@ create table llx_product_price price_min_ttc double(24,8) default NULL, price_base_type varchar(3) DEFAULT 'HT', default_vat_code varchar(10), -- Same code than into table llx_c_tva (but no constraints). Should be used in priority to find default vat, npr, localtaxes for product. - tva_tx double(6,3) NOT NULL, + tva_tx double(6,3) DEFAULT 0 NOT NULL, -- Used only when option PRODUIT_MULTIPRICES_USE_VAT_PER_LEVEL is on (not supported) recuperableonly integer NOT NULL DEFAULT '0', localtax1_tx double(6,3) DEFAULT 0, localtax1_type varchar(10) NOT NULL DEFAULT '0', From 298f6d06836f2b7a1ea459c2cbdc2a57a4dd4132 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 2 Jan 2020 20:36:35 +0100 Subject: [PATCH 05/10] Look and feel v11 --- .../class/companypaymentmode.class.php | 60 +++++++------------ 1 file changed, 23 insertions(+), 37 deletions(-) diff --git a/htdocs/societe/class/companypaymentmode.class.php b/htdocs/societe/class/companypaymentmode.class.php index aa0c083f4f7..5fe072cc826 100644 --- a/htdocs/societe/class/companypaymentmode.class.php +++ b/htdocs/societe/class/companypaymentmode.class.php @@ -58,6 +58,10 @@ class CompanyPaymentMode extends CommonObject public $picto = 'generic'; + const STATUS_ENABLED = 1; + const STATUS_CANCELED = 0; + + /** * 'type' if the field format. * 'label' the translation key. @@ -475,9 +479,9 @@ class CompanyPaymentMode extends CommonObject } /** - * Retourne le libelle du status d'un user (actif, inactif) + * Return label of the status * - * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto + * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto * @return string Label of status */ public function getLibStatut($mode = 0) @@ -493,47 +497,29 @@ class CompanyPaymentMode extends CommonObject * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto * @return string Label of status */ - public static function LibStatut($status, $mode = 0) + public function LibStatut($status, $mode = 0) { - // phpcs:enable - global $langs; + // phpcs:enable + if (empty($this->labelStatus) || empty($this->labelStatusShort)) + { + global $langs; + //$langs->load("mymodule"); + $this->labelStatus[self::STATUS_ENABLED] = $langs->trans('Enabled'); + $this->labelStatus[self::STATUS_CANCELED] = $langs->trans('Disabled'); + $this->labelStatusShort[self::STATUS_ENABLED] = $langs->trans('Enabled'); + $this->labelStatusShort[self::STATUS_CANCELED] = $langs->trans('Disabled'); + } - if ($mode == 0 || $mode == 1) - { - if ($status == 1) return $langs->trans('Enabled'); - elseif ($status == 0) return $langs->trans('Disabled'); - } - elseif ($mode == 2) - { - if ($status == 1) return img_picto($langs->trans('Enabled'), 'statut4').' '.$langs->trans('Enabled'); - elseif ($status == 0) return img_picto($langs->trans('Disabled'), 'statut5').' '.$langs->trans('Disabled'); - } - elseif ($mode == 3) - { - if ($status == 1) return img_picto($langs->trans('Enabled'), 'statut4'); - elseif ($status == 0) return img_picto($langs->trans('Disabled'), 'statut5'); - } - elseif ($mode == 4) - { - if ($status == 1) return img_picto($langs->trans('Enabled'), 'statut4').' '.$langs->trans('Enabled'); - elseif ($status == 0) return img_picto($langs->trans('Disabled'), 'statut5').' '.$langs->trans('Disabled'); - } - elseif ($mode == 5) - { - if ($status == 1) return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'), 'statut4'); - elseif ($status == 0) return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'), 'statut5'); - } - elseif ($mode == 6) - { - if ($status == 1) return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'), 'statut4'); - elseif ($status == 0) return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'), 'statut5'); - } + $statusType = 'status5'; + if ($status == self::STATUS_ENABLED) $statusType = 'status4'; + + return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode); } /** - * Charge les informations d'ordre info dans l'objet commande + * Load the info information in the object * - * @param int $id Id of order + * @param int $id Id of object * @return void */ public function info($id) From d95e37aa72298818f232cb0c9e996f2af21cb90a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 2 Jan 2020 20:43:16 +0100 Subject: [PATCH 06/10] Look and feel v11 --- htdocs/societe/paymentmodes.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index 04717aa01be..41bda75b2b5 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -1615,15 +1615,15 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' // Edit BAN if ($socid && $action == 'edit' && $user->rights->societe->creer) { - dol_fiche_head($head, 'rib', $langs->trans("ThirdParty"), -1, 'company'); + dol_fiche_head($head, 'rib', $langs->trans("ThirdParty"), 0, 'company'); $linkback = ''.$langs->trans("BackToList").''; dol_banner_tab($object, 'socid', $linkback, ($user->socid ? 0 : 1), 'rowid', 'nom'); - print '
'; - print '
'; + + print '
'; print ''; print ''; @@ -1683,11 +1683,13 @@ if ($socid && $action == 'edit' && $user->rights->societe->creer) print ""; print '
'.$langs->trans("LabelRIB").'
'; + print '
'; if ($conf->prelevement->enabled) { print '
'; + print '
'; print ''; if (empty($companybankaccount->rum)) $companybankaccount->rum = $prelevement->buildRumNumber($object->code_client, $companybankaccount->datec, $companybankaccount->id); @@ -1705,9 +1707,9 @@ if ($socid && $action == 'edit' && $user->rights->societe->creer) print ''; print '
'; + print '
'; } - print '
'; dol_fiche_end(); From 68d7195964ac599d829f63e47d7c09efd21c2b2c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 2 Jan 2020 22:05:35 +0100 Subject: [PATCH 07/10] MRP --- .../mysql/data/llx_c_action_trigger.sql | 8 +- .../install/mysql/migration/10.0.0-11.0.0.sql | 9 +- htdocs/langs/en_US/agenda.lang | 6 +- htdocs/langs/en_US/main.lang | 2 +- htdocs/langs/en_US/mrp.lang | 4 +- htdocs/mrp/mo_production.php | 264 ++++++++++-------- 6 files changed, 160 insertions(+), 133 deletions(-) diff --git a/htdocs/install/mysql/data/llx_c_action_trigger.sql b/htdocs/install/mysql/data/llx_c_action_trigger.sql index 85360478500..dee1200389c 100644 --- a/htdocs/install/mysql/data/llx_c_action_trigger.sql +++ b/htdocs/install/mysql/data/llx_c_action_trigger.sql @@ -124,10 +124,10 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BOM_CLOSE','BOM disabled','Executed when a BOM is disabled','bom',652); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BOM_REOPEN','BOM reopen','Executed when a BOM is re-open','bom',653); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BOM_DELETE','BOM deleted','Executed when a BOM deleted','bom',654); -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MO_VALIDATE','MO validated','Executed when a MO is validated','bom',660); -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MO_PRODUCED','MO produced','Executed when a MO is produced','bom',661); -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MO_DELETE','MO deleted','Executed when a MO is deleted','bom',662); -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MO_CANCEL','MO canceled','Executed when a MO is canceled','bom',663); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MRP_MO_VALIDATE','MO validated','Executed when a MO is validated','bom',660); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MRP_MO_PRODUCED','MO produced','Executed when a MO is produced','bom',661); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MRP_MO_DELETE','MO deleted','Executed when a MO is deleted','bom',662); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MRP_MO_CANCEL','MO canceled','Executed when a MO is canceled','bom',663); -- actions not enabled by default : they are excluded when we enable the module Agenda (except TASK_...) insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TASK_CREATE','Task created','Executed when a project task is created','project',150); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TASK_MODIFY','Task modified','Executed when a project task is modified','project',151); diff --git a/htdocs/install/mysql/migration/10.0.0-11.0.0.sql b/htdocs/install/mysql/migration/10.0.0-11.0.0.sql index e5d996be713..50014e2da05 100644 --- a/htdocs/install/mysql/migration/10.0.0-11.0.0.sql +++ b/htdocs/install/mysql/migration/10.0.0-11.0.0.sql @@ -522,10 +522,11 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BOM_REOPEN','BOM reopen','Executed when a BOM is re-open','bom',653); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BOM_DELETE','BOM deleted','Executed when a BOM deleted','bom',654); -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MO_VALIDATE','MO validated','Executed when a MO is validated','bom',660); -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MO_PRODUCED','MO produced','Executed when a MO is produced','bom',661); -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MO_DELETE','MO deleted','Executed when a MO is deleted','bom',662); -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MO_CANCEL','MO canceled','Executed when a MO is canceled','bom',663); +DELETE FROM llx_c_action_trigger where code LIKE 'MO_%'; +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MRP_MO_VALIDATE','MO validated','Executed when a MO is validated','bom',660); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MRP_MO_PRODUCED','MO produced','Executed when a MO is produced','bom',661); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MRP_MO_DELETE','MO deleted','Executed when a MO is deleted','bom',662); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MRP_MO_CANCEL','MO canceled','Executed when a MO is canceled','bom',663); ALTER TABLE llx_comment ADD COLUMN fk_user_modif integer DEFAULT NULL; diff --git a/htdocs/langs/en_US/agenda.lang b/htdocs/langs/en_US/agenda.lang index 9f141d15220..6e5415067f1 100644 --- a/htdocs/langs/en_US/agenda.lang +++ b/htdocs/langs/en_US/agenda.lang @@ -110,9 +110,9 @@ BOM_UNVALIDATEInDolibarr=BOM unvalidated BOM_CLOSEInDolibarr=BOM disabled BOM_REOPENInDolibarr=BOM reopen BOM_DELETEInDolibarr=BOM deleted -MO_VALIDATEInDolibarr=MO validated -MO_PRODUCEDInDolibarr=MO produced -MO_DELETEInDolibarr=MO deleted +MRP_MO_VALIDATEInDolibarr=MO validated +MRP_MO_PRODUCEDInDolibarr=MO produced +MRP_MO_DELETEInDolibarr=MO deleted ##### End agenda events ##### AgendaModelModule=Document templates for event DateActionStart=Start date diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index fa9f48ee4c4..bc9abb9753d 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -741,7 +741,7 @@ NotSupported=Not supported RequiredField=Required field Result=Result ToTest=Test -ValidateBefore=Card must be validated before using this feature +ValidateBefore=Item must be validated before using this feature Visibility=Visibility Totalizable=Totalizable TotalizableDesc=This field is totalizable in list diff --git a/htdocs/langs/en_US/mrp.lang b/htdocs/langs/en_US/mrp.lang index e5bcb1e5318..a414920ff83 100644 --- a/htdocs/langs/en_US/mrp.lang +++ b/htdocs/langs/en_US/mrp.lang @@ -58,4 +58,6 @@ ConsumeAndProduceAll=Consume and Produce All Manufactured=Manufactured TheProductXIsAlreadyTheProductToProduce=The product to add is already the product to produce. ForAQuantityOf1=For a quantity to produce of 1 -ConfirmValidateMo=Are you sure you want to validate this Manufacturing Order? \ No newline at end of file +ConfirmValidateMo=Are you sure you want to validate this Manufacturing Order? +ConfirmProductionDesc=By clicking on '%s', you will validate the consumption and/or production for the quantities set. This will also update the stock and record stock movements. +ProductionForRefAndDate=Production %s - %s diff --git a/htdocs/mrp/mo_production.php b/htdocs/mrp/mo_production.php index 17f2cd44069..cc08486e27d 100644 --- a/htdocs/mrp/mo_production.php +++ b/htdocs/mrp/mo_production.php @@ -47,11 +47,12 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php'; dol_include_once('/mrp/class/mo.class.php'); dol_include_once('/mrp/lib/mrp_mo.lib.php'); // Load translation files required by the page -$langs->loadLangs(array("mrp", "other")); +$langs->loadLangs(array("mrp", "stocks", "other")); // Get parameters $id = GETPOST('id', 'int'); @@ -103,8 +104,6 @@ $permissiontoproduce = $permissiontoadd; /* * Actions - * - * Put here all code to do according to value of "action" parameter */ $parameters = array(); @@ -120,7 +119,7 @@ if (empty($reshook)) if (empty($backtopage) || ($cancel && empty($id))) { //var_dump($backurlforlist);exit; if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) $backtopage = $backurlforlist; - else $backtopage = DOL_URL_ROOT.'/mrp/mo_card.php?id='.($id > 0 ? $id : '__ID__'); + else $backtopage = DOL_URL_ROOT.'/mrp/mo_production.php?id='.($id > 0 ? $id : '__ID__'); } $triggermodname = 'MRP_MO_MODIFY'; // Name of trigger action code to execute when we modify record @@ -162,6 +161,7 @@ if (empty($reshook)) $form = new Form($db); $formfile = new FormFile($db); $formproject = new FormProjets($db); +$formproduct = new FormProduct($db); llxHeader('', $langs->trans('Mo'), ''); @@ -306,48 +306,85 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea dol_fiche_end(); - print '
'; - $parameters = array(); - // Note that $action and $object may be modified by hook - $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); - if (empty($reshook)) { - // Consume + if (! in_array($action, array('consume', 'produce', 'consumeandproduceall'))) + { + print '
'; - if ($object->status == Mo::STATUS_VALIDATED || $object->status == Mo::STATUS_INPROGRESS) { - if ($permissiontoproduce) { - print ''.$langs->trans('Consume').''; + $parameters = array(); + // Note that $action and $object may be modified by hook + $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); + if (empty($reshook)) { + // Consume + + if ($object->status == Mo::STATUS_VALIDATED || $object->status == Mo::STATUS_INPROGRESS) { + if ($permissiontoproduce) { + print ''.$langs->trans('Consume').''; + } else { + print ''.$langs->trans('Consume').''; + } } else { - print ''.$langs->trans('Consume').''; + print ''.$langs->trans('Consume').''; + } + + // Produce + if ($object->status == Mo::STATUS_VALIDATED || $object->status == Mo::STATUS_INPROGRESS) { + if ($permissiontoproduce) { + print ''.$langs->trans('Produce').''; + } else { + print ''.$langs->trans('Produce').''; + } + } else { + print ''.$langs->trans('Produce').''; + } + + // ConsumeAndProduceAll + if ($object->status == Mo::STATUS_VALIDATED || $object->status == Mo::STATUS_INPROGRESS) { + if ($permissiontoproduce) { + print ''.$langs->trans('ConsumeAndProduceAll').''; + } else { + print ''.$langs->trans('ConsumeAndProduceAll').''; + } + } else { + print ''.$langs->trans('ConsumeAndProduceAll').''; } - } else { - print ''.$langs->trans('Consume').''; } - // Produce - if ($object->status == Mo::STATUS_VALIDATED || $object->status == Mo::STATUS_INPROGRESS) { - if ($permissiontoproduce) { - print ''.$langs->trans('Produce').''; - } else { - print ''.$langs->trans('Produce').''; - } - } else { - print ''.$langs->trans('Produce').''; - } - - // ConsumeAndProduceAll - if ($object->status == Mo::STATUS_VALIDATED || $object->status == Mo::STATUS_INPROGRESS) { - if ($permissiontoproduce) { - print ''.$langs->trans('ConsumeAndProduceAll').''; - } else { - print ''.$langs->trans('ConsumeAndProduceAll').''; - } - } else { - print ''.$langs->trans('ConsumeAndProduceAll').''; - } + print '
'; } - print '
'; + if (in_array($action, array('consume', 'produce', 'consumeandproduceall'))) + { + print '
'; + print ''; + print ''; + print ''; + print ''; + + if ($action == 'consume') + { + print $langs->trans("FeatureNotYetAvailable"); + } + if ($action == 'produce') + { + print $langs->trans("FeatureNotYetAvailable"); + } + if ($action == 'consumeandproduceall') + { + $defaultstockmovementlabel = $langs->trans("ProductionForRefAndDate", $object->ref, dol_print_date(dol_now(), 'standard')); + $defaultstockmovementcode = $object->ref.'_'.dol_print_date(dol_now(), 'dayhourlog'); + + print '
'; + print ''.$langs->trans("ConfirmProductionDesc", $langs->transnoentitiesnoconv("Confirm")).'

'; + print $langs->trans("MovementLabel").':   '; + print $langs->trans("InventoryCode").':   '; + print ''; + print '   '; + print ''; + print '
'; + print '
'; + } + } /* @@ -360,17 +397,6 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea //$result = $object->getLinesArray(); $object->fetchLines(); - print ' - - - - - '; - - if (!empty($conf->use_javascript_ajax) && $object->status == 0) { - include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php'; - } - print '
'; print '
'; print '
'; @@ -384,27 +410,54 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea print ''.$langs->trans("Product").''; print ''.$langs->trans("Qty").''; print ''.$langs->trans("QtyAlreadyConsumed").''; - /*print ''.$langs->trans("Date").''; - print ''.$langs->trans("Batch").'';*/ + print ''; + if ($conf->productbatch->enabled) { + print ''; + if ($action == 'consumeandproduceall') print $langs->trans("Batch"); + print ''; + } print ''; if (!empty($object->lines)) { foreach($object->lines as $line) { if ($line->role == 'toconsume') { - print ''; $tmpproduct = new Product($db); $tmpproduct->fetch($line->fk_product); + + print ''; print ''.$tmpproduct->getNomUrl(1).''; print ''.$line->qty.''; $alreadyconsumed = 0; print ''.$alreadyconsumed.''; - /*print ''.''; - print ''.'';*/ + print ''; // Warehouse + if ($conf->productbatch->enabled) { + print ''; // Lot + } print ''; - // Show detailed of already consumed + // Show detailed of already consumed with js code to collapse //$arrayoflines = $line->fetchLinesLinked('consumed'); + + if ($action == 'consumeandproduceall') { + print ''; + print ''.$langs->trans("ToConsume").''; + print ''; + print ''; + print ''; + if ($tmpproduct->type == Product::TYPE_PRODUCT || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) { + print $formproduct->selectWarehouses('ifone', 'idwarehouse-'.$line->id, '', 1, 0, $line->fk_product, '', 1); + } + print ''; + if ($conf->productbatch->enabled) { + print ''; + if ($tmpproduct->status_batch) { + print ''; + } + print ''; + } + print ''; + } } } } @@ -443,8 +496,12 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea print ''.$langs->trans("Product").''; print ''.$langs->trans("Qty").''; print ''.$langs->trans("QtyAlreadyProduced").''; - /*print ''.$langs->trans("Date").''; - print ''.$langs->trans("Batch").'';*/ + print ''; + if ($conf->productbatch->enabled) { + print ''; + if ($action == 'consumeandproduceall') print $langs->trans("Batch"); + print ''; + } print ''; if (!empty($object->lines)) @@ -456,14 +513,36 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $tmpproduct->fetch($line->fk_product); print ''.$tmpproduct->getNomUrl(1).''; print ''.$line->qty.''; - $alreadyconsumed = 0; - print ''.$alreadyconsumed.''; - /*print ''.''; - print ''.'';*/ + $alreadyproduced = 0; + print ''.$alreadyproduced.''; + print ''; // Warehouse + if ($conf->productbatch->enabled) { + print ''; // Lot + } print ''; - // Show detailed of already consumed - //$arrayoflines = $line->fetchLinesLinked('consumed'); + // Show detailed of already produced + //$arrayoflines = $line->fetchLinesLinked('produced'); + + if ($action == 'consumeandproduceall') { + print ''; + print ''.$langs->trans("ToProduce").''; + print ''; + print ''; + print ''; + if ($tmpproduct->type == Product::TYPE_PRODUCT || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) { + print $formproduct->selectWarehouses('ifone', 'idwarehouse-'.$line->id, '', 1, 0, $line->fk_product, '', 1); + } + print ''; + if ($conf->productbatch->enabled) { + print ''; + if ($tmpproduct->status_batch) { + print ''; + } + print ''; + } + print ''; + } } } } @@ -473,66 +552,11 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea print '
'; print '
'; - - print "
\n"; } - - // Buttons for actions - /* - if ($action != 'presend' && $action != 'editline') { - print '
'."\n"; - $parameters=array(); - $reshook=$hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - - if (empty($reshook)) - { - // Send - print '' . $langs->trans('SendMail') . ''."\n"; - - // Modify - if (! empty($user->rights->mrp->write)) - { - print ''.$langs->trans("Modify").''."\n"; - } - else - { - print ''.$langs->trans('Modify').''."\n"; - } - - // Clone - if (! empty($user->rights->mrp->write)) - { - print ''; - } - - // Delete (need delete permission, or if draft, just need create/modify permission) - if (! empty($user->rights->mrp->delete) || (! empty($object->fields['status']) && $object->status == $object::STATUS_DRAFT && ! empty($user->rights->mrp->write))) - { - print ''.$langs->trans('Delete').''."\n"; - } - else - { - print ''.$langs->trans('Delete').''."\n"; - } - } - print '
'."\n"; - }*/ - - - if ($action != 'presend') + if (in_array($action, array('consume', 'produce', 'consumeandproduceall'))) { - print '
'; - print ''; // ancre - - - - print '
'; - - - - print '
'; + print "\n"; } } From 15ad41ee6d553d67b699df2df96cb27cf316a90a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 3 Jan 2020 15:01:14 +0100 Subject: [PATCH 08/10] MRP --- htdocs/langs/en_US/errors.lang | 1 + htdocs/langs/en_US/mrp.lang | 6 +- htdocs/mrp/class/mo.class.php | 36 +++++++- htdocs/mrp/mo_card.php | 2 - htdocs/mrp/mo_production.php | 145 +++++++++++++++++++++++++++++---- 5 files changed, 166 insertions(+), 24 deletions(-) diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 53f9e57fceb..db7fa8330bf 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -223,6 +223,7 @@ ErrorSearchCriteriaTooSmall=Search criteria too small. ErrorObjectMustHaveStatusActiveToBeDisabled=Objects must have status 'Active' to be disabled ErrorObjectMustHaveStatusDraftOrDisabledToBeActivated=Objects must have status 'Draft' or 'Disabled' to be enabled ErrorNoFieldWithAttributeShowoncombobox=No fields has property 'showoncombobox' into definition of object '%s'. No way to show the combolist. +ErrorFieldRequiredForProduct=Field '%s' is required for product %s # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Your PHP parameter upload_max_filesize (%s) is higher than PHP parameter post_max_size (%s). This is not a consistent setup. WarningPasswordSetWithNoAccount=A password was set for this member. However, no user account was created. So this password is stored but can't be used to login to Dolibarr. It may be used by an external module/interface but if you don't need to define any login nor password for a member, you can disable option "Manage a login for each member" from Member module setup. If you need to manage a login but don't need any password, you can keep this field empty to avoid this warning. Note: Email can also be used as a login if the member is linked to a user. diff --git a/htdocs/langs/en_US/mrp.lang b/htdocs/langs/en_US/mrp.lang index a414920ff83..e336dd2552d 100644 --- a/htdocs/langs/en_US/mrp.lang +++ b/htdocs/langs/en_US/mrp.lang @@ -44,8 +44,8 @@ StatusMOProduced=Produced QtyFrozen=Frozen Qty QuantityFrozen=Frozen Quantity QuantityConsumedInvariable=When this flag is set, the quantity consumed is always the value defined and is not relative to the quantity produced. -DisableStockChange=Disable stock change -DisableStockChangeHelp=When this flag is set, there is no stock change on this product, whatever is the quantity produced +DisableStockChange=Stock change disabled +DisableStockChangeHelp=When this flag is set, there is no stock change on this product, whatever is the quantity consumed BomAndBomLines=Bills Of Material and lines BOMLine=Line of BOM WarehouseForProduction=Warehouse for production @@ -61,3 +61,5 @@ ForAQuantityOf1=For a quantity to produce of 1 ConfirmValidateMo=Are you sure you want to validate this Manufacturing Order? ConfirmProductionDesc=By clicking on '%s', you will validate the consumption and/or production for the quantities set. This will also update the stock and record stock movements. ProductionForRefAndDate=Production %s - %s +AutoCloseMO=Close automatically the Manufacturing Order if quantities to consume and to produce are reached +NoStockChangeOnServices=No stock change on services \ No newline at end of file diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index cc51515eeb6..e5ac29616a7 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -505,7 +505,7 @@ class Mo extends CommonObject } /** - * Erase and update the line to produce + * Erase and update the line to produce. * * @param User $user User that modifies * @return int <0 if KO, >0 if OK @@ -557,7 +557,11 @@ class Mo extends CommonObject $moline = new MoLine($this->db); $moline->fk_mo = $this->id; - $moline->qty = round($line->qty * $this->qty / $bom->efficiency, 2); + if ($line->qty_frozen) { + $moline->qty = $line->qty; // Qty to consume does not depends on quantity to produce + } else { + $moline->qty = round($line->qty * $this->qty / $bom->efficiency, 2); + } if ($moline->qty <= 0) { $error++; $this->error = "BadValueForquantityToConsume"; @@ -980,10 +984,16 @@ class Mo extends CommonObject global $langs; //$langs->load("mrp"); $this->labelStatus[self::STATUS_DRAFT] = $langs->trans('Draft'); - $this->labelStatus[self::STATUS_VALIDATED] = $langs->trans('Validated'); + $this->labelStatus[self::STATUS_VALIDATED] = $langs->trans('Validated').' ('.$langs->trans("ToProduce").')'; $this->labelStatus[self::STATUS_INPROGRESS] = $langs->trans('InProgress'); $this->labelStatus[self::STATUS_PRODUCED] = $langs->trans('StatusMOProduced'); $this->labelStatus[self::STATUS_CANCELED] = $langs->trans('Canceled'); + + $this->labelStatusShort[self::STATUS_DRAFT] = $langs->trans('Draft'); + $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->trans('Validated'); + $this->labelStatusShort[self::STATUS_INPROGRESS] = $langs->trans('InProgress'); + $this->labelStatusShort[self::STATUS_PRODUCED] = $langs->trans('StatusMOProduced'); + $this->labelStatusShort[self::STATUS_CANCELED] = $langs->trans('Canceled'); } $statusType = 'status'.$status; @@ -992,7 +1002,7 @@ class Mo extends CommonObject if ($status == self::STATUS_PRODUCED) $statusType = 'status5'; if ($status == self::STATUS_CANCELED) $statusType = 'status6'; - return dolGetStatus($this->labelStatus[$status], $this->labelStatus[$status], '', $statusType, $mode); + return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode); } /** @@ -1448,6 +1458,24 @@ class MoLine extends CommonObjectLine } } + /** + * Get list of lines linked to current line for a defined role + * + * @param string $role Get lines linked to current line with the selected role ('consumed', 'produced', ...) + * @return array Array of lines + */ + public function fetchLinesLinked($role) { + $array = array(); + + $sql = 'SELECT rowid, qty '; + $sql .= $this->getFieldList(); + $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; + if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')'; + else $sql .= ' WHERE 1 = 1'; + + return $array; + } + /** * Update object into database * diff --git a/htdocs/mrp/mo_card.php b/htdocs/mrp/mo_card.php index 671353ff961..68938f97a58 100644 --- a/htdocs/mrp/mo_card.php +++ b/htdocs/mrp/mo_card.php @@ -117,8 +117,6 @@ $upload_dir = $conf->mrp->multidir_output[isset($object->entity) ? $object->enti /* * Actions - * - * Put here all code to do according to value of "action" parameter */ $parameters = array(); diff --git a/htdocs/mrp/mo_production.php b/htdocs/mrp/mo_production.php index cc08486e27d..212a7040927 100644 --- a/htdocs/mrp/mo_production.php +++ b/htdocs/mrp/mo_production.php @@ -47,6 +47,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php'; dol_include_once('/mrp/class/mo.class.php'); dol_include_once('/mrp/lib/mrp_mo.lib.php'); @@ -149,6 +150,89 @@ if (empty($reshook)) { $object->setProject(GETPOST('projectid', 'int')); } + + if ($action == 'confirm_consumeandproduceall') { + $db->begin(); + + // Process line to consume + foreach($object->lines as $line) { + if ($line->role == 'toconsume') { + $tmpproduct = new Product($db); + $tmpproduct->fetch($line->fk_product); + + $i=1; + while (GETPOSTISSET('qty-'.$line->id.'-'.$i)) { + // Check warehouse is set if we should have to + if (GETPOST('idwarehouse-'.$line->id.'-'.$i)) { + if (! (GETPOST('idwarehouse-'.$line->id.'-'.$i) > 0)) { + $langs->load("errors"); + setEventMessages($langs->trans("ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv("Warehouse"), $tmpproduct->ref), null, 'errors'); + $error++; + } + if ($tmpproduct->status_batch && (! GETPOST('batch-'.$line->id.'-'.$i))) { + $langs->load("errors"); + setEventMessages($langs->trans("ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv("Batch"), $tmpproduct->ref), null, 'errors'); + $error++; + } + } + + if (! $error) { + + + + } + + $i++; + } + } + } + + // Process line to produce + foreach($object->lines as $line) { + if ($line->role == 'toproduce') { + $tmpproduct = new Product($db); + $tmpproduct->fetch($line->fk_product); + + $i=1; + while (GETPOSTISSET('qtytoproduce-'.$line->id.'-'.$i)) { + // Check warehouse is set if we should have to + if (GETPOST('idwarehousetoproduce-'.$line->id.'-'.$i)) { + if (! (GETPOST('idwarehousetoproduce-'.$line->id.'-'.$i) > 0)) { + $langs->load("errors"); + setEventMessages($langs->trans("ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv("Warehouse"), $tmpproduct->ref), null, 'errors'); + $error++; + } + if ($tmpproduct->status_batch && (! GETPOST('batchtoproduce-'.$line->id.'-'.$i))) { + $langs->load("errors"); + setEventMessages($langs->trans("ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv("Batch"), $tmpproduct->ref), null, 'errors'); + $error++; + } + } + + if (! $error) { + + + + } + + $i++; + } + } + } + + if (! $error) { + // Update status of MO + + } + + if ($error) { + $action = str_replace('confirm_', '', $action); + $db->rollback(); + } else { + $db->commit(); + } + + } } @@ -357,7 +441,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea { print '
'; print ''; - print ''; + print ''; print ''; print ''; @@ -375,9 +459,10 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $defaultstockmovementcode = $object->ref.'_'.dol_print_date(dol_now(), 'dayhourlog'); print '
'; - print ''.$langs->trans("ConfirmProductionDesc", $langs->transnoentitiesnoconv("Confirm")).'

'; + print ''.$langs->trans("ConfirmProductionDesc", $langs->transnoentitiesnoconv("Confirm")).'
'; print $langs->trans("MovementLabel").':   '; - print $langs->trans("InventoryCode").':   '; + print $langs->trans("InventoryCode").':

'; + print ' '.$langs->trans("AutoCloseMO").'
'; print ''; print '   '; print ''; @@ -425,10 +510,24 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $tmpproduct = new Product($db); $tmpproduct->fetch($line->fk_product); + $arrayoflines = $line->fetchLinesLinked('consumed'); + $alreadyconsumed = 0; + foreach($arrayoflines as $line2) { + $alreadyconsumed += $line2->qty; + } + print ''; print ''.$tmpproduct->getNomUrl(1).''; - print ''.$line->qty.''; - $alreadyconsumed = 0; + print ''; + $help = ''; + if ($line->qty_frozen) $help.=($help ? '
' : '').''.$langs->trans("QuantityFrozen").': '.yn(1).' ('.$langs->trans("QuantityConsumedInvariable").')'; + if ($line->disable_stock_change) $help.=($help ? '
' : '').''.$langs->trans("DisableStockChange").': '.yn(1).' ('.(($tmpproduct->type == Product::TYPE_SERVICE && empty($conf->global->STOCK_SUPPORTS_SERVICES)) ? $langs->trans("NoStockChangeOnServices") : $langs->trans("DisableStockChangeHelp")).')'; + if ($help) { + print $form->textwithpicto($line->qty, $help); + } else { + print $line->qty; + } + print ''; print ''.$alreadyconsumed.''; print ''; // Warehouse if ($conf->productbatch->enabled) { @@ -440,19 +539,28 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea //$arrayoflines = $line->fetchLinesLinked('consumed'); if ($action == 'consumeandproduceall') { + $i = 1; print ''; print ''.$langs->trans("ToConsume").''; - print ''; + print ''; print ''; print ''; if ($tmpproduct->type == Product::TYPE_PRODUCT || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) { - print $formproduct->selectWarehouses('ifone', 'idwarehouse-'.$line->id, '', 1, 0, $line->fk_product, '', 1); + if (empty($line->disable_stock_change)) { + $preselected = (GETPOSTISSET('idwarehouse-'.$line->id.'-'.$i) ? GETPOST('idwarehouse-'.$line->id.'-'.$i) : 'ifone'); + print $formproduct->selectWarehouses($preselected, 'idwarehouse-'.$line->id.'-'.$i, '', 1, 0, $line->fk_product, '', 1); + } else { + print ''.$langs->trans("DisableStockChange").''; + } + } else { + print ''.$langs->trans("NoStockChangeOnServices").''; } print ''; if ($conf->productbatch->enabled) { print ''; if ($tmpproduct->status_batch) { - print ''; + $preselected = (GETPOSTISSET('batch-'.$line->id.'-'.$i) ? GETPOST('batch-'.$line->id.'-'.$i) : ''); + print ''; } print ''; } @@ -508,12 +616,18 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea { foreach($object->lines as $line) { if ($line->role == 'toproduce') { - print ''; $tmpproduct = new Product($db); $tmpproduct->fetch($line->fk_product); + + $arrayoflines = $line->fetchLinesLinked('produced'); + $alreadyproduced = 0; + foreach($arrayoflines as $line2) { + $alreadyproduced += $line2->qty; + } + + print ''; print ''.$tmpproduct->getNomUrl(1).''; print ''.$line->qty.''; - $alreadyproduced = 0; print ''.$alreadyproduced.''; print ''; // Warehouse if ($conf->productbatch->enabled) { @@ -521,23 +635,22 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea } print ''; - // Show detailed of already produced - //$arrayoflines = $line->fetchLinesLinked('produced'); - if ($action == 'consumeandproduceall') { print ''; print ''.$langs->trans("ToProduce").''; - print ''; + print ''; print ''; print ''; if ($tmpproduct->type == Product::TYPE_PRODUCT || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) { - print $formproduct->selectWarehouses('ifone', 'idwarehouse-'.$line->id, '', 1, 0, $line->fk_product, '', 1); + $preselected = (GETPOSTISSET('idwarehousetoproduce-'.$line->id.'-'.$i) ? GETPOST('idwarehousetoproduce-'.$line->id.'-'.$i) : ($object->fk_warehouse > 0 ? $object->fk_warehouse : 'ifone')); + print $formproduct->selectWarehouses($preselected, 'idwarehousetoproduce-'.$line->id.'-'.$i, '', 1, 0, $line->fk_product, '', 1); } print ''; if ($conf->productbatch->enabled) { print ''; if ($tmpproduct->status_batch) { - print ''; + $preselected = (GETPOSTISSET('batchtoproduce-'.$line->id.'-'.$i) ? GETPOST('batchtoproduce-'.$line->id.'-'.$i) : ''); + print ''; } print ''; } From 6e9bb5d7dae602bcc11a634c8a91e3d18a68a0a6 Mon Sep 17 00:00:00 2001 From: VESSILLER Date: Thu, 26 Dec 2019 16:18:26 +0100 Subject: [PATCH 09/10] FIX sql bad request in product buying price extrafields --- htdocs/product/fournisseurs.php | 132 ++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 56 deletions(-) diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php index bd93ef60a26..0abb57d8951 100644 --- a/htdocs/product/fournisseurs.php +++ b/htdocs/product/fournisseurs.php @@ -265,32 +265,31 @@ if (empty($reshook)) $extralabels = $extrafields->fetch_name_optionals_label("product_fournisseur_price"); $extrafield_values = $extrafields->getOptionalsFromPost("product_fournisseur_price"); + if (!empty($extrafield_values)) { + $resql = $db->query("SELECT fk_object FROM " . MAIN_DB_PREFIX . "product_fournisseur_price_extrafields WHERE fk_object = " . $object->product_fourn_price_id); + // Insert a new extrafields row, if none exists + if ($db->num_rows($resql) != 1) { + $sql = "INSERT INTO " . MAIN_DB_PREFIX . "product_fournisseur_price_extrafields (fk_object, "; + foreach ($extrafield_values as $key => $value) { + $sql .= str_replace('options_', '', $key) . ', '; + } + $sql = substr($sql, 0, strlen($sql) - 2) . ") VALUES (" . $object->product_fourn_price_id . ", "; + foreach ($extrafield_values as $key => $value) { + $sql .= '"' . $value . '", '; + } + $sql = substr($sql, 0, strlen($sql) - 2) . ')'; + } // else update the existing one + else { + $sql = "UPDATE " . MAIN_DB_PREFIX . "product_fournisseur_price_extrafields SET "; + foreach ($extrafield_values as $key => $value) { + $sql .= str_replace('options_', '', $key) . ' = "' . $value . '", '; + } + $sql = substr($sql, 0, strlen($sql) - 2) . ' WHERE fk_object = ' . $object->product_fourn_price_id; + } - $sql = ""; - $resql = $db->query("SELECT * FROM ".MAIN_DB_PREFIX."product_fournisseur_price_extrafields WHERE fk_object = ".$object->product_fourn_price_id); - // Insert a new extrafields row, if none exists - if ($db->num_rows($resql) != 1) { - $sql = "INSERT INTO ".MAIN_DB_PREFIX."product_fournisseur_price_extrafields (fk_object, "; - foreach ($extrafield_values as $key => $value) { - $sql .= str_replace('options_', '', $key).', '; - } - $sql = substr($sql, 0, strlen($sql) - 2).") VALUES (".$object->product_fourn_price_id.", "; - foreach ($extrafield_values as $key => $value) { - $sql .= '"'.$value.'", '; - } - $sql = substr($sql, 0, strlen($sql) - 2).')'; - } - // else update the existing one - else { - $sql = "UPDATE ".MAIN_DB_PREFIX."product_fournisseur_price_extrafields SET "; - foreach ($extrafield_values as $key => $value) { - $sql .= str_replace('options_', '', $key).' = "'.$value.'", '; - } - $sql = substr($sql, 0, strlen($sql) - 2).' WHERE fk_object = '.$object->product_fourn_price_id; - } - - // Execute the sql command from above - $db->query($sql); + // Execute the sql command from above + $db->query($sql); + } $newprice = price2num(GETPOST("price", "alpha")); @@ -765,25 +764,36 @@ SCRIPT; print ''; } + // Extrafields $extrafields->fetch_name_optionals_label("product_fournisseur_price"); $extralabels = $extrafields->attributes["product_fournisseur_price"]['label']; - // Extrafields - $resql = $db->query("SELECT * FROM ".MAIN_DB_PREFIX."product_fournisseur_price_extrafields WHERE fk_object = ".$rowid); + $extrafield_values = $extrafields->getOptionalsFromPost("product_fournisseur_price"); if (!empty($extralabels)) { - if ($db->num_rows($resql) != 1) { - foreach ($extralabels as $key => $value) { - if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && ($extrafields->attributes["product_fournisseur_price"]['list'][$key] == 1 || $extrafields->attributes["product_fournisseur_price"]['list'][$key] == 3 || ($action == "update_price" && $extrafields->attributes["product_fournisseur_price"]['list'][$key] == 4))) { - print 'attributes["product_fournisseur_price"]['required'][$key] ? ' class="fieldrequired"' : '').'>'.$langs->trans($value).''.$extrafields->showInputField($key, '', '', '', '', '', 0, 'product_fournisseur_price').''; - } - } - } else { - $resql = $db->fetch_object($resql); - foreach ($extralabels as $key => $value) { - if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && ($extrafields->attributes["product_fournisseur_price"]['list'][$key] == 1 || $extrafields->attributes["product_fournisseur_price"]['list'][$key] == 3 || ($action == "update_price" && $extrafields->attributes["product_fournisseur_price"]['list'][$key] == 4))) { - print 'attributes["product_fournisseur_price"]['required'][$key] ? ' class="fieldrequired"' : '').'>'.$langs->trans($value).''.$extrafields->showInputField($key, $resql->{$key}, '', '', '', '', 0, 'product_fournisseur_price').''; - } - } - } + if (empty($rowid)) { + foreach ($extralabels as $key => $value) { + if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && ($extrafields->attributes["product_fournisseur_price"]['list'][$key] == 1 || $extrafields->attributes["product_fournisseur_price"]['list'][$key] == 3 || ($action == "update_price" && $extrafields->attributes["product_fournisseur_price"]['list'][$key] == 4))) { + print 'attributes["product_fournisseur_price"]['required'][$key] ? ' class="fieldrequired"' : '').'>'.$langs->trans($value).''.$extrafields->showInputField($key, GETPOSTISSET('options_' . $key) ? $extrafield_values['options_' . $key] : '', '', '', '', '', 0, 'product_fournisseur_price').''; + } + } + } else { + $sql = "SELECT"; + $sql .= " fk_object"; + foreach ($extralabels as $key => $value) { + $sql .= ", " . $key; + } + $sql .= " FROM " . MAIN_DB_PREFIX . "product_fournisseur_price_extrafields"; + $sql .= " WHERE fk_object = " . $rowid; + $resql = $db->query($sql); + if ($resql) { + $obj = $db->fetch_object($resql); + foreach ($extralabels as $key => $value) { + if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && ($extrafields->attributes["product_fournisseur_price"]['list'][$key] == 1 || $extrafields->attributes["product_fournisseur_price"]['list'][$key] == 3 || ($action == "update_price" && $extrafields->attributes["product_fournisseur_price"]['list'][$key] == 4))) { + print 'attributes["product_fournisseur_price"]['required'][$key] ? ' class="fieldrequired"' : '').'>'.$langs->trans($value).''.$extrafields->showInputField($key, GETPOSTISSET('options_' . $key) ? $extrafield_values['options_' . $key] : $obj->{$key}, '', '', '', '', 0, 'product_fournisseur_price').''; + } + } + $db->free($resql); + } + } } if (is_object($hookmanager)) @@ -1008,22 +1018,32 @@ SCRIPT; print ''; // Extrafields - $resql = $db->query("SELECT * FROM ".MAIN_DB_PREFIX."product_fournisseur_price_extrafields WHERE fk_object = ".$productfourn->product_fourn_price_id); if (!empty($extralabels)) { - if ($db->num_rows($resql) != 1) { - foreach ($extralabels as $key => $value) { - if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && $extrafields->attributes["product_fournisseur_price"]['list'][$key] != 3) { - print ""; - } - } - } else { - $resql = $db->fetch_object($resql); - foreach ($extralabels as $key => $value) { - if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && $extrafields->attributes["product_fournisseur_price"]['list'][$key] != 3) { - print ''.$extrafields->showOutputField($key, $resql->{$key}).""; - } - } - } + $sql = "SELECT"; + $sql .= " fk_object"; + foreach ($extralabels as $key => $value) { + $sql .= ", " . $key; + } + $sql .= " FROM " . MAIN_DB_PREFIX . "product_fournisseur_price_extrafields"; + $sql .= " WHERE fk_object = " . $productfourn->product_fourn_price_id; + $resql = $db->query($sql); + if ($resql) { + if ($db->num_rows($resql) != 1) { + foreach ($extralabels as $key => $value) { + if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && $extrafields->attributes["product_fournisseur_price"]['list'][$key] != 3) { + print ""; + } + } + } else { + $obj = $db->fetch_object($resql); + foreach ($extralabels as $key => $value) { + if (!empty($extrafields->attributes["product_fournisseur_price"]['list'][$key]) && $extrafields->attributes["product_fournisseur_price"]['list'][$key] != 3) { + print ''.$extrafields->showOutputField($key, $obj->{$key}).""; + } + } + } + $db->free($resql); + } } if (is_object($hookmanager)) From a84ff7089ccd196ff8057db0f880ee1c3281a511 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 3 Jan 2020 21:14:04 +0100 Subject: [PATCH 10/10] Fix static text that is never updated --- README-FR.md | 3 +++ README.md | 5 +---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README-FR.md b/README-FR.md index 3d5473b14cc..95a42da1127 100644 --- a/README-FR.md +++ b/README-FR.md @@ -1,5 +1,8 @@ # DOLIBARR ERP & CRM +![Downloads per day](https://img.shields.io/sourceforge/dw/dolibarr.svg) +![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/develop.svg) + Dolibarr ERP & CRM est un logiciel moderne pour gérer votre activité (société, association, auto-entrepreneurs, artisans). Il est simple d'utilisation et modulaire, vous permettant de n'activez que les fonctions dont vous avez besoin (contacts, fournisseurs, factures, commandes, stocks, agenda, ...). diff --git a/README.md b/README.md index e7f1535d1e5..a0c4dfd59ad 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,7 @@ # DOLIBARR ERP & CRM ![Downloads per day](https://img.shields.io/sourceforge/dw/dolibarr.svg) - -|7|8|9|10|develop| -|----------|----------|----------|----------|----------| -|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/7.0.svg)|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/8.0.svg)|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/9.0.svg)|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/10.0.svg)|![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/develop.svg)| +![Build status](https://img.shields.io/travis/Dolibarr/dolibarr/develop.svg) Dolibarr ERP & CRM is a modern software package to manage your organization's activity (contacts, suppliers, invoices, orders, stocks, agenda…).