diff --git a/htdocs/core/actions_dellink.inc.php b/htdocs/core/actions_dellink.inc.php
index a7ac035506f..fbecacce515 100644
--- a/htdocs/core/actions_dellink.inc.php
+++ b/htdocs/core/actions_dellink.inc.php
@@ -27,17 +27,42 @@
// $permissiondellink must be defined
$dellinkid = GETPOST('dellinkid', 'int');
+$addlink = GETPOST('addlink', 'alpha');
$addlinkid = GETPOST('idtolinkto', 'int');
+$addlinkref = GETPOST('reftolinkto', 'alpha');
+$cancellink = GETPOST('cancel', 'alpha');
// Link invoice to order
-if ($action == 'addlink' && !empty($permissiondellink) && !GETPOST('cancel', 'alpha') && $id > 0 && $addlinkid > 0) {
+if ($action == 'addlink' && !empty($permissiondellink) && !$cancellink && $id > 0 && $addlinkid > 0) {
$object->fetch($id);
$object->fetch_thirdparty();
- $result = $object->add_object_linked(GETPOST('addlink', 'alpha'), $addlinkid);
+ $result = $object->add_object_linked($addlink, $addlinkid);
+}
+
+// Link by reference
+if ($action == 'addlinkbyref' && ! empty($permissiondellink) && !$cancellink && $id > 0 && !empty($addlinkref) && !empty($conf->global->MAIN_LINK_BY_REF_IN_LINKTO)) {
+ $element_prop = getElementProperties($addlink);
+ if (is_array($element_prop)) {
+ dol_include_once('/' . $element_prop['classpath'] . '/' . $element_prop['classfile'] . '.class.php');
+
+ $objecttmp = new $element_prop['classname']($db);
+ $ret = $objecttmp->fetch(0, $addlinkref);
+ if ($ret > 0) {
+ $object->fetch($id);
+ $object->fetch_thirdparty();
+ $result = $object->add_object_linked($addlink, $objecttmp->id);
+ if (isset($_POST['reftolinkto'])) unset($_POST['reftolinkto']);
+ } elseif ($ret < 0) {
+ setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
+ } else {
+ $langs->load('errors');
+ setEventMessage($langs->trans('ErrorRecordNotFound'), 'errors');
+ }
+ }
}
// Delete link
-if ($action == 'dellink' && !empty($permissiondellink) && !GETPOST('cancel', 'alpha') && $dellinkid > 0) {
+if ($action == 'dellink' && !empty($permissiondellink) && !$cancellink && $dellinkid > 0) {
$result = $object->deleteObjectLinked(0, '', 0, '', $dellinkid);
if ($result < 0) {
setEventMessages($object->error, $object->errors, 'errors');
diff --git a/htdocs/core/class/dolreceiptprinter.class.php b/htdocs/core/class/dolreceiptprinter.class.php
index 45c87401416..a3ddb3d7c7f 100644
--- a/htdocs/core/class/dolreceiptprinter.class.php
+++ b/htdocs/core/class/dolreceiptprinter.class.php
@@ -680,9 +680,7 @@ class dolReceiptPrinter extends Printer
foreach ($object->lines as $line) {
$total_localtax1 += $line->total_localtax1;
}
- foreach ($vatarray as $vatkey => $vatvalue) {
- $this->printer->text(str_pad(price($total_localtax1), 10, ' ', STR_PAD_LEFT)."\n");
- }
+ $this->printer->text(str_pad(price($total_localtax1), 10, ' ', STR_PAD_LEFT)."\n");
break;
case 'DOL_PRINT_OBJECT_TAX2':
//var_dump($object);
@@ -690,9 +688,7 @@ class dolReceiptPrinter extends Printer
foreach ($object->lines as $line) {
$total_localtax2 += $line->total_localtax2;
}
- foreach ($vatarray as $vatkey => $vatvalue) {
- $this->printer->text(str_pad(price($total_localtax2), 10, ' ', STR_PAD_LEFT)."\n");
- }
+ $this->printer->text(str_pad(price($total_localtax2), 10, ' ', STR_PAD_LEFT)."\n");
break;
case 'DOL_PRINT_OBJECT_TOTAL':
$title = $langs->trans('TotalHT');
diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index 178404da973..a6280a7c9f5 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -1332,7 +1332,7 @@ class Form
}
// We search companies
- $sql = "SELECT s.rowid, s.nom as name, s.name_alias, s.client, s.fournisseur, s.code_client, s.code_fournisseur";
+ $sql = "SELECT s.rowid, s.nom as name, s.name_alias, s.tva_intra, s.client, s.fournisseur, s.code_client, s.code_fournisseur";
if (!empty($conf->global->COMPANY_SHOW_ADDRESS_SELECTLIST)) {
$sql .= ", s.address, s.zip, s.town";
$sql .= ", dictp.code as country_code";
@@ -1384,6 +1384,7 @@ class Form
$sql .= " OR s.barcode LIKE '".$this->db->escape($prefix.$filterkey)."%'";
}
$sql .= " OR s.code_client LIKE '".$this->db->escape($prefix.$filterkey)."%' OR s.code_fournisseur LIKE '".$this->db->escape($prefix.$filterkey)."%'";
+ $sql .= " OR s.name_alias LIKE '".$this->db->escape($prefix.$filterkey)."%' OR s.tva_intra LIKE '".$this->db->escape($prefix.$filterkey)."%'";
$sql .= ")";
}
$sql .= $this->db->order("nom", "ASC");
@@ -7970,6 +7971,21 @@ class Form
if (!empty($possiblelink['perms']) && (empty($restrictlinksto) || in_array($key, $restrictlinksto)) && (empty($excludelinksto) || !in_array($key, $excludelinksto))) {
print '
use_javascript_ajax) ? '' : ' style="display:none"').'>';
+
+ if (!empty($conf->global->MAIN_LINK_BY_REF_IN_LINKTO)) {
+ print '
';
+ }
+
$sql = $possiblelink['sql'];
$resqllist = $this->db->query($sql);
@@ -8027,7 +8043,7 @@ class Form
print '
';
//$linktoelem.=($linktoelem?' ':'');
- if ($num > 0) {
+ if ($num > 0 || !empty($conf->global->MAIN_LINK_BY_REF_IN_LINKTO)) {
$linktoelemlist .= ''.$langs->trans($possiblelink['label']).' ('.$num.')';
// } else $linktoelem.=$langs->trans($possiblelink['label']);
} else {
diff --git a/htdocs/core/js/timesheet.js b/htdocs/core/js/timesheet.js
index 0c8c9ff3245..e9e66787aa0 100644
--- a/htdocs/core/js/timesheet.js
+++ b/htdocs/core/js/timesheet.js
@@ -1,5 +1,6 @@
/* Copyright (C) 2014 delcroip
* Copyright (C) 2015-2017 Laurent Destailleur
+ * Copyright (C) 2021 Josep LluĂs Amador
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -257,7 +258,7 @@ function updateTotal(days,mode)
result=parseTime(jQuery('.totalDay'+stringdays).text(),taskTime);
if (result >= 0)
{
- totalhour = totalhour + taskTime.getHours();
+ totalhour = totalhour + taskTime.getHours() + result*24;
totalmin = totalmin + taskTime.getMinutes();
}
}
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index a8879ad64f5..a6c62ba2a47 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -10204,7 +10204,7 @@ function newToken()
*/
function currentToken()
{
- return $_SESSION['token'];
+ return isset($_SESSION['token']) ? $_SESSION['token'] : '';
}
/**
diff --git a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php
index 8e6f34383b4..e1822d49c5c 100644
--- a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php
+++ b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php
@@ -581,6 +581,11 @@ class InterfaceActionsAuto extends DolibarrTriggers
}
$object->actionmsg = $langs->transnoentities("SupplierOrderSubmitedInDolibarr", ($object->newref ? $object->newref : $object->ref));
+ if (!empty($object->context['comments'])) {
+ $object->actionmsg .= '
';
+ $object->actionmsg .= $langs->trans("Comment") . ': '.$object->context['comments'];
+ }
+
$object->sendtoid = 0;
} elseif ($action == 'ORDER_SUPPLIER_RECEIVE') {
// Load translation files required by the page
diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php
index b43447529b5..0affc7dcce4 100644
--- a/htdocs/fourn/commande/card.php
+++ b/htdocs/fourn/commande/card.php
@@ -983,7 +983,9 @@ if (empty($reshook)) {
if ($action == 'commande') {
$methodecommande = GETPOST('methodecommande', 'int');
- if ($methodecommande <= 0) {
+ if ($cancel) {
+ $action = '';
+ } elseif ($methodecommande <= 0) {
setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("OrderMode")), null, 'errors');
$action = 'makeorder';
}
@@ -1059,32 +1061,36 @@ if (empty($reshook)) {
// Set status of reception (complete, partial, ...)
if ($action == 'livraison' && $usercanreceived) {
- $db->begin();
+ if ($cancel) {
+ $action = '';
+ } else {
+ $db->begin();
- if (GETPOST("type") != '') {
- $date_liv = dol_mktime(GETPOST('rehour'), GETPOST('remin'), GETPOST('resec'), GETPOST("remonth"), GETPOST("reday"), GETPOST("reyear"));
+ if (GETPOST("type") != '') {
+ $date_liv = dol_mktime(GETPOST('rehour'), GETPOST('remin'), GETPOST('resec'), GETPOST("remonth"), GETPOST("reday"), GETPOST("reyear"));
- $result = $object->Livraison($user, $date_liv, GETPOST("type"), GETPOST("comment")); // GETPOST("type") is 'tot', 'par', 'nev', 'can'
- if ($result > 0) {
- $langs->load("deliveries");
- setEventMessages($langs->trans("DeliveryStateSaved"), null);
- $action = '';
- } elseif ($result == -3) {
- $error++;
- setEventMessages($object->error, $object->errors, 'errors');
+ $result = $object->Livraison($user, $date_liv, GETPOST("type"), GETPOST("comment")); // GETPOST("type") is 'tot', 'par', 'nev', 'can'
+ if ($result > 0) {
+ $langs->load("deliveries");
+ setEventMessages($langs->trans("DeliveryStateSaved"), null);
+ $action = '';
+ } elseif ($result == -3) {
+ $error++;
+ setEventMessages($object->error, $object->errors, 'errors');
+ } else {
+ $error++;
+ setEventMessages($object->error, $object->errors, 'errors');
+ }
} else {
$error++;
- setEventMessages($object->error, $object->errors, 'errors');
+ setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Delivery")), null, 'errors');
}
- } else {
- $error++;
- setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Delivery")), null, 'errors');
- }
- if (!$error) {
- $db->commit();
- } else {
- $db->rollback();
+ if (!$error) {
+ $db->commit();
+ } else {
+ $db->rollback();
+ }
}
}
@@ -2652,7 +2658,11 @@ if ($action == 'create') {
print '';
print '| '.$langs->trans("Comment").' | |
';
- print ' |
';
+ print '| ';
+ print '';
+ print ' ';
+ print '';
+ print ' |
';
print "\n";
print "\n";
print "
";
diff --git a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql
index e319c6116f0..62fb0902eee 100644
--- a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql
+++ b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql
@@ -33,9 +33,10 @@
-- Missing in v14 or lower
-
-
-- v15
--- add action trigger
-INSERT INTO llx_c_action_trigger (code,label,description,elementtype,rang) VALUES ('ORDER_SUPPLIER_CANCEL','Supplier order request canceled','Executed when a supplier order is canceled','order_supplier',13);
+ALTER TABLE llx_product_fournisseur_price MODIFY COLUMN ref_fourn varchar(128);
+ALTER TABLE llx_product_customer_price MODIFY COLUMN ref_customer varchar(128);
+
+-- -- add action trigger
+INSERT INTO llx_c_action_trigger (code,label,description,elementtype,rang) VALUES ('ORDER_SUPPLIER_CANCEL','Supplier order request canceled','Executed when a supplier order is canceled','order_supplier',13);
diff --git a/htdocs/install/mysql/tables/llx_product_customer_price.sql b/htdocs/install/mysql/tables/llx_product_customer_price.sql
index f0d5edf9c2f..361a42a5b54 100644
--- a/htdocs/install/mysql/tables/llx_product_customer_price.sql
+++ b/htdocs/install/mysql/tables/llx_product_customer_price.sql
@@ -28,7 +28,7 @@ create table llx_product_customer_price
tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
fk_product integer NOT NULL,
fk_soc integer NOT NULL,
- ref_customer varchar(30),
+ ref_customer varchar(128),
price double(24,8) DEFAULT 0,
price_ttc double(24,8) DEFAULT 0,
price_min double(24,8) DEFAULT 0,
diff --git a/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql b/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql
index 4e1d75dd1dd..2a01df30e4b 100644
--- a/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql
+++ b/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql
@@ -27,7 +27,7 @@ create table llx_product_fournisseur_price
tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
fk_product integer,
fk_soc integer,
- ref_fourn varchar(30),
+ ref_fourn varchar(128),
desc_fourn text,
fk_availability integer,
price double(24,8) DEFAULT 0, -- price without tax for quantity
diff --git a/htdocs/product/composition/card.php b/htdocs/product/composition/card.php
index e1250f10cb3..e2539dae31c 100644
--- a/htdocs/product/composition/card.php
+++ b/htdocs/product/composition/card.php
@@ -51,6 +51,9 @@ if (!empty($user->socid)) {
$fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : ''));
$fieldtype = (!empty($ref) ? 'ref' : 'rowid');
+// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+$hookmanager->initHooks(array('productcompositioncard', 'globalcard'));
+
$object = new Product($db);
$objectid = 0;
if ($id > 0 || !empty($ref)) {
diff --git a/htdocs/product/stats/card.php b/htdocs/product/stats/card.php
index 6929c70a5ff..3e7d9045dc8 100644
--- a/htdocs/product/stats/card.php
+++ b/htdocs/product/stats/card.php
@@ -59,6 +59,9 @@ if (!empty($user->socid)) {
$fieldvalue = (!empty($id) ? $id : $ref);
$fieldtype = (!empty($ref) ? 'ref' : 'rowid');
+// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+$hookmanager->initHooks(array('productstatscard', 'globalcard'));
+
$tmp = dol_getdate(dol_now());
$currentyear = $tmp['year'];
if (empty($search_year)) {
diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php
index 3c2d5b02829..ec1a0fee47c 100644
--- a/htdocs/projet/card.php
+++ b/htdocs/projet/card.php
@@ -511,7 +511,7 @@ if ($action == 'create' && $user->rights->projet->creer) {
// Ref
$suggestedref = (GETPOST("ref") ? GETPOST("ref") : $defaultref);
- print '| '.$langs->trans("Ref").' | ';
+ print ' |
| '.$langs->trans("Ref").' | ';
print ' '.$form->textwithpicto('', $langs->trans("YouCanCompleteRef", $suggestedref));
print ' |
';
@@ -796,7 +796,7 @@ if ($action == 'create' && $user->rights->projet->creer) {
// Ref
$suggestedref = $object->ref;
print '| '.$langs->trans("Ref").' | ';
- print '';
+ print ' | ';
print ' '.$form->textwithpicto('', $langs->trans("YouCanCompleteRef", $suggestedref));
print ' |
';