diff --git a/ChangeLog b/ChangeLog
index f1679bbdfab..0d3f04d314f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,33 @@
English Dolibarr ChangeLog
--------------------------------------------------------------
+***** ChangeLog for 10.0.5 compared to 10.0.4 *****
+FIX: 10.0: add URL param "restore_last_search_values=1" to all backlinks pointing to lists
+FIX: 10.0: do not display single-letter values (indicating duration unit without value) in product list
+FIX: #12473
+FIX: #12481 : fix ticket creation from thirdparty, mission $socid var
+FIX: #12482
+FIX: #12644
+FIX: #12665 Mass invoice validation with stock management
+FIX: #12688
+FIX: #12745
+FIX: add and modify category translate form with posted values on errors
+FIX: add URL param "restore_last_search_values=1" to all backlinks that point to a list
+FIX: CommandeFournisseurLigne update function must not be able to return other value than 1 if success
+FIX: contact card state address selected after filling address
+FIX: dol_string_nohtmltag when there is html with windows EOL "
\r\n"
+FIX: filter language is an array
+FIX: first col at wrong position in Export 2007 (new)
+FIX: getrights() request
+FIX: Invoice Situation integration into Margin
+FIX: missing nl2br conversion
+FIX: not fee in payout list
+FIX: product_fourn_price_id was assigned too late for logPrice() function
+FIX: Reduce number of request for list of products
+FIX: set due date in object in create invoice
+FIX: units traductions for selectUnits() function
+FIX: when we need to bill several orders, order lines unit is not on bill lines
+NEW: 9.0: allow users to use the mysqldump '--quick' option
***** ChangeLog for 11.0.0 compared to 10.0.0 *****
For Users:
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
+
+
+
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

-
-|7|8|9|10|develop|
-|----------|----------|----------|----------|----------|
-||||||
+
Dolibarr ERP & CRM is a modern software package to manage your organization's activity (contacts, suppliers, invoices, orders, stocks, agenda…).
diff --git a/htdocs/comm/action/list.php b/htdocs/comm/action/list.php
index 023b1f4b21d..8288db9d90b 100644
--- a/htdocs/comm/action/list.php
+++ b/htdocs/comm/action/list.php
@@ -308,7 +308,7 @@ if (!$user->rights->societe->client->voir && !$socid) $sql .= " AND (a.fk_soc IS
if ($socid > 0) $sql .= " AND s.rowid = ".$socid;
// We must filter on assignement table
if ($filtert > 0 || $usergroup > 0) $sql .= " AND ar.fk_actioncomm = a.id AND ar.element_type='user'";
-if ($type) $sql .= " AND c.id = ".$type;
+if ($type) $sql .= " AND c.id = ".(int) $type;
if ($status == '0') { $sql .= " AND a.percent = 0"; }
if ($status == '-1') { $sql .= " AND a.percent = -1"; } // Not applicable
if ($status == '50') { $sql .= " AND (a.percent > 0 AND a.percent < 100)"; } // Running already started
diff --git a/htdocs/compta/bank/releve.php b/htdocs/compta/bank/releve.php
index e299b999a0e..c236266ce96 100644
--- a/htdocs/compta/bank/releve.php
+++ b/htdocs/compta/bank/releve.php
@@ -38,12 +38,15 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/paiement/cheque/class/remisecheque.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
+require_once DOL_DOCUMENT_ROOT.'/don/class/paymentdonation.class.php';
+require_once DOL_DOCUMENT_ROOT.'/loan/class/paymentloan.class.php';
+require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/paymentvarious.class.php';
//show files
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php';
// Load translation files required by the page
-$langs->loadLangs(array("banks", "categories", "companies", "bills", "trips"));
+$langs->loadLangs(array("banks", "categories", "companies", "bills", "trips", "donations", "loan"));
$action = GETPOST('action', 'alpha');
$id = GETPOST('account', 'int');
@@ -202,6 +205,9 @@ $paymentvatstatic = new TVA($db);
$bankstatic = new Account($db);
$banklinestatic = new AccountLine($db);
$remisestatic = new RemiseCheque($db);
+$paymentdonationstatic=new PaymentDonation($db);
+$paymentloanstatic=new PaymentLoan($db);
+$paymentvariousstatic=new PaymentVarious($db);
// Must be before button action
$param = '';
@@ -512,7 +518,28 @@ else
print '';
$newline = 0;
}
- elseif ($links[$key]['type'] == 'banktransfert') {
+ elseif ($links[$key]['type']=='payment_donation')
+ {
+ $paymentdonationstatic->id=$links[$key]['url_id'];
+ $paymentdonationstatic->ref=$langs->trans("Payment");
+ print ' '.$paymentdonationstatic->getNomUrl(1);
+ $newline = 0;
+ }
+ elseif ($links[$key]['type']=='payment_loan')
+ {
+ $paymentloanstatic->id=$links[$key]['url_id'];
+ $paymentloanstatic->ref=$langs->trans("Payment");
+ print ' '.$paymentloanstatic->getNomUrl(1);
+ $newline = 0;
+ }
+ elseif ($links[$key]['type']=='payment_various')
+ {
+ $paymentvariousstatic->id=$links[$key]['url_id'];
+ $paymentvariousstatic->ref=$langs->trans("Payment");
+ print ' '.$paymentvariousstatic->getNomUrl(1);
+ $newline = 0;
+ }
+ elseif ($links[$key]['type']=='banktransfert') {
// Do not show link to transfer since there is no transfer card (avoid confusion). Can already be accessed from transaction detail.
if ($objp->amount > 0)
{
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'];
diff --git a/htdocs/core/actions_addupdatedelete.inc.php b/htdocs/core/actions_addupdatedelete.inc.php
index f5f0f822108..b30cc1a411d 100644
--- a/htdocs/core/actions_addupdatedelete.inc.php
+++ b/htdocs/core/actions_addupdatedelete.inc.php
@@ -142,8 +142,8 @@ if ($action == 'update' && !empty($permissiontoadd))
} else {
$value = '';
}
- } elseif (in_array($object->fields[$key]['type'], array('price', 'real'))) {
- $value = price2num(GETPOST($key));
+ } elseif (preg_match('/^(integer|price|real|double)/', $object->fields[$key]['type'])) {
+ $value = price2num(GETPOST($key, 'none')); // To fix decimal separator according to lang setup
} else {
$value = GETPOST($key, 'alpha');
}
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));
diff --git a/htdocs/fourn/class/api_supplier_invoices.class.php b/htdocs/fourn/class/api_supplier_invoices.class.php
index ca712c456f9..21e5e82c13b 100644
--- a/htdocs/fourn/class/api_supplier_invoices.class.php
+++ b/htdocs/fourn/class/api_supplier_invoices.class.php
@@ -208,7 +208,7 @@ class SupplierInvoices extends DolibarrApi
foreach($request_data as $field => $value) {
$this->invoice->$field = $value;
}
- if(! array_keys($request_data, 'date')) {
+ if(! array_key_exists('date', $request_data)) {
$this->invoice->date = dol_now();
}
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 b73593c3dfd..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
@@ -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;
@@ -520,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/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',
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/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/main.lang b/htdocs/langs/en_US/main.lang
index fa9f48ee4c4..ac411f56f3e 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
@@ -1012,3 +1012,4 @@ ContactDefault_propal=Proposal
ContactDefault_supplier_proposal=Supplier Proposal
ContactDefault_ticketsup=Ticket
ContactAddedAutomatically=Contact added from contact thirdparty roles
+More=More
diff --git a/htdocs/langs/en_US/mrp.lang b/htdocs/langs/en_US/mrp.lang
index e5bcb1e5318..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
@@ -58,4 +58,8 @@ 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
+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/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang
index 6e9b6d66f32..7ee672f089b 100644
--- a/htdocs/langs/en_US/other.lang
+++ b/htdocs/langs/en_US/other.lang
@@ -56,7 +56,7 @@ Notify_BILL_SUPPLIER_PAYED=Vendor invoice paid
Notify_BILL_SUPPLIER_SENTBYMAIL=Vendor invoice sent by mail
Notify_BILL_SUPPLIER_CANCELED=Vendor invoice cancelled
Notify_CONTRACT_VALIDATE=Contract validated
-Notify_FICHEINTER_VALIDATE=Intervention validated
+Notify_FICHINTER_VALIDATE=Intervention validated
Notify_FICHINTER_ADD_CONTACT=Added contact to Intervention
Notify_FICHINTER_SENTBYMAIL=Intervention sent by mail
Notify_SHIPPING_VALIDATE=Shipping validated
@@ -272,4 +272,4 @@ WEBSITE_KEYWORDS=Keywords
LinesToImport=Lines to import
MemoryUsage=Memory usage
-RequestDuration=Duration of request
\ No newline at end of file
+RequestDuration=Duration of request
diff --git a/htdocs/loan/card.php b/htdocs/loan/card.php
index aeb4f77550b..ac27da29628 100644
--- a/htdocs/loan/card.php
+++ b/htdocs/loan/card.php
@@ -624,7 +624,7 @@ if ($id > 0)
else
{
print '
';
- print $langs->trans("LoanAccountancyCapitalCode");
+ print $langs->trans("LoanAccountancyInsuranceCode");
print ' | ';
if (!empty($conf->accounting->enabled))
diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php
index cc51515eeb6..0f22e00de3c 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,25 @@ 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 17f2cd44069..415e7cc7f99 100644
--- a/htdocs/mrp/mo_production.php
+++ b/htdocs/mrp/mo_production.php
@@ -47,11 +47,14 @@ 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';
+require_once DOL_DOCUMENT_ROOT.'/product/stock/class/mouvementstock.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 +106,6 @@ $permissiontoproduce = $permissiontoadd;
/*
* Actions
- *
- * Put here all code to do according to value of "action" parameter
*/
$parameters = array();
@@ -120,7 +121,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
@@ -150,6 +151,130 @@ if (empty($reshook))
{
$object->setProject(GETPOST('projectid', 'int'));
}
+
+ if ($action == 'confirm_consumeandproduceall') {
+ $stockmove = new MouvementStock($db);
+
+ $labelmovement = GETPOST('inventorylabel', 'alphanohtml');
+ $codemovement = GETPOST('inventorycode', 'alphanohtml');
+
+ $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) {
+ // Record consumption
+ $moline = new MoLine($db);
+
+ $result = $moline->create($user);
+ if ($result <= 0) {
+ $error++;
+ setEventMessages($moline->error, $moline->errors, 'errors');
+ }
+ }
+
+ if (! $error) {
+ // Record stock movement
+ $id_product_batch = 0;
+ $result = $stockmove->livraison($user, $line->fk_product, GETPOST('idwarehouse-'.$line->id.'-'.$i), GETPOST('qty-'.$line->id.'-'.$i), 0, $labelmovement, dol_now(), '', '', GETPOST('batch-'.$line->id.'-'.$i), $id_product_batch, $codemovement);
+ if ($result <= 0) {
+ $error++;
+ setEventMessages($stockmove->error, $stockmove->errors, 'errors');
+ }
+ }
+
+ $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) {
+ // Record production
+ $moline = new MoLine($db);
+
+ $result = $moline->create($user);
+ if ($result <= 0) {
+ $error++;
+ setEventMessages($moline->error, $moline->errors, 'errors');
+ }
+ }
+
+ if (! $error) {
+ // Record stock movement
+ $id_product_batch = 0;
+ $result = $stockmove->reception($user, $line->fk_product, GETPOST('idwarehouse-'.$line->id.'-'.$i), GETPOST('qty-'.$line->id.'-'.$i), 0, $labelmovement, dol_now(), '', '', GETPOST('batch-'.$line->id.'-'.$i), $id_product_batch, $codemovement);
+ if ($result <= 0) {
+ $error++;
+ setEventMessages($stockmove->error, $stockmove->errors, 'errors');
+ }
+ }
+
+ $i++;
+ }
+ }
+ }
+
+ if (! $error) {
+ // Update status of MO
+ $qtyremaintoconsume = 0;
+ $qtyremaintoproduce = 0;
+ if ($qtyremaintoconsume == 0 && $qtyremaintoproduce == 0) {
+ $object->setStatut($object::STATUS_INPROGRESS);
+ } else {
+ $object->setStatut($object::STATUS_PRODUCED);
+ }
+ }
+
+ if ($error) {
+ $action = str_replace('confirm_', '', $action);
+ $db->rollback();
+ } else {
+ $db->commit();
+ }
+
+ }
}
@@ -162,6 +287,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 +432,86 @@ 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 ' ';
}
- print ' ';
+ if (in_array($action, array('consume', 'produce', 'consumeandproduceall')))
+ {
+ print '\n";
}
-
- // Buttons for actions
- /*
- if ($action != 'presend' && $action != 'editline') {
- print ''."\n";
- }*/
-
-
- if ($action != 'presend')
+ if (in_array($action, array('consume', 'produce', 'consumeandproduceall')))
{
- print '';
- print ' '; // ancre
-
-
-
- print ' ';
+ print "\n";
}
}
diff --git a/htdocs/product/admin/product_tools.php b/htdocs/product/admin/product_tools.php
index a3813963cc5..6a3f8a898eb 100644
--- a/htdocs/product/admin/product_tools.php
+++ b/htdocs/product/admin/product_tools.php
@@ -135,7 +135,7 @@ if ($action == 'convert')
$newlevel=$level;
//print "$objectstatic->id $newprice, $price_base_type, $newvat, $newminprice, $newlevel, $newnpr \n";
- $retm=$objectstatic->updatePrice($newprice, $price_base_type, $user, $newvatratclean, $newminprice, $newlevel, $newnpr, 0, 0, $localtaxes_type, $newdefaultvatcode);
+ $retm=$objectstatic->updatePrice($newprice, $price_base_type, $user, $newvatrateclean, $newminprice, $newlevel, $newnpr, 0, 0, $localtaxes_type, $newdefaultvatcode);
if ($retm < 0)
{
$error++;
diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php
index ca0f8112fc1..ba143057b59 100644
--- a/htdocs/product/class/product.class.php
+++ b/htdocs/product/class/product.class.php
@@ -1876,6 +1876,9 @@ class Product extends CommonObject
if (empty($newminprice)) {
$newminprice = 0;
}
+ if (empty($newminprice)) {
+ $newminprice=0;
+ }
// Check parameters
if ($newvat == '') {
@@ -2677,7 +2680,7 @@ class Product extends CommonObject
* Charge tableau des stats expedition client pour le produit/service
*
* @param int $socid Id societe pour filtrer sur une societe
- * @param string $filtrestatut Id statut pour filtrer sur un statut
+ * @param string $filtrestatut [=''] Ids order status separated by comma
* @param int $forVirtualStock Ignore rights filter for virtual stock calculation.
* @param string $filterShipmentStatus [=''] Ids shipment status separated by comma
* @return int <0 if KO, >0 if OK (Tableau des stats)
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))
diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php
index 48d336e8ace..c107693b8c6 100644
--- a/htdocs/product/reassort.php
+++ b/htdocs/product/reassort.php
@@ -122,7 +122,8 @@ $sql .= ' p.duration, p.tosell as statut, p.tobuy, p.seuil_stock_alerte, p.desir
$sql .= ' SUM(s.reel) as stock_physique';
if (!empty($conf->global->PRODUCT_USE_UNITS)) $sql .= ', u.short_label as unit_short';
$sql .= ' FROM '.MAIN_DB_PREFIX.'product as p';
-$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_stock as s on p.rowid = s.fk_product';
+$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_stock as s ON p.rowid = s.fk_product';
+$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'entrepot as e ON s.fk_entrepot = e.rowid AND e.entity IN ('.getEntity('entrepot').')';
if (!empty($conf->global->PRODUCT_USE_UNITS)) $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_units as u on p.fk_unit = u.rowid';
// We'll need this table joined to the select in order to filter by categ
if ($search_categ) $sql .= ", ".MAIN_DB_PREFIX."categorie_product as cp";
diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php
index 777c0dcb360..1cb88b47a28 100644
--- a/htdocs/projet/element.php
+++ b/htdocs/projet/element.php
@@ -463,7 +463,7 @@ $listofreferent = array(
'table'=>'projet_task',
'datefieldname'=>'task_date',
'disableamount'=>0,
- 'urlnew'=>DOL_URL_ROOT.'/projet/tasks/time.php?id='.$id,
+ 'urlnew'=>DOL_URL_ROOT.'/projet/tasks/time.php?withproject=1&action=createtime&projectid='.$id,
'buttonnew'=>'AddTimeSpent',
'testnew'=>$user->rights->projet->creer,
'test'=>($conf->projet->enabled && $user->rights->projet->lire && empty($conf->global->PROJECT_HIDE_TASKS))),
@@ -538,7 +538,7 @@ if ($action=="addelement")
elseif ($action == "unlink")
{
$tablename = GETPOST("tablename", "aZ09");
- $projectField = GETPOST('projectfield', 'aZ09') ? GETPOST('projectfield', 'aZ09') : 'fk_projet';
+ $projectField = GETPOSTISSET('projectfield') ? GETPOST('projectfield', 'aZ09') : 'fk_projet';
$elementselectid = GETPOST("elementselect", "int");
$result = $object->remove_element($tablename, $elementselectid, $projectField);
diff --git a/htdocs/salaries/card.php b/htdocs/salaries/card.php
index 798ef8dab4a..39f7fee3397 100644
--- a/htdocs/salaries/card.php
+++ b/htdocs/salaries/card.php
@@ -44,7 +44,7 @@ if (! empty($conf->projet->enabled)) $langs->load("projects");
$id = GETPOST("id", 'int');
$action = GETPOST('action', 'aZ09');
$cancel = GETPOST('cancel', 'aZ09');
-$accountid = GETPOST("accountid", 'int');
+$accountid = GETPOST('accountid', 'int') > 0 ? GETPOST('accountid', 'int') : 0;
$projectid = (GETPOST('projectid', 'int') ? GETPOST('projectid', 'int') : GETPOST('fk_project', 'int'));
$datep = dol_mktime(12, 0, 0, GETPOST("datepmonth", 'int'), GETPOST("datepday", 'int'), GETPOST("datepyear", 'int'));
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)
diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php
index 9bf2a40f069..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 '| '.$langs->trans("LabelRIB").' | ';
@@ -1683,11 +1683,13 @@ if ($socid && $action == 'edit' && $user->rights->societe->creer)
print "
";
print '
';
+ 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();
@@ -1769,7 +1771,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").'';