';
-*/
-
/*
// Seems to be not so used. So kept hidden for the moment to avoid dangerous options inflation.
// Ask for payment bank during order
diff --git a/htdocs/admin/tools/dolibarr_export.php b/htdocs/admin/tools/dolibarr_export.php
index d6700cedf04..5f9dc97ba44 100644
--- a/htdocs/admin/tools/dolibarr_export.php
+++ b/htdocs/admin/tools/dolibarr_export.php
@@ -400,8 +400,6 @@ print '';
print '';
print '';
-print '';
-print '';
@@ -538,6 +536,8 @@ if (!empty($_SESSION["commandbackuptorun"])) {
print " \n";
+print '';
+print '';
print " \n";
diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php
index 652e7a72d4a..e3b2c64c92a 100644
--- a/htdocs/commande/class/commande.class.php
+++ b/htdocs/commande/class/commande.class.php
@@ -261,6 +261,11 @@ class Commande extends CommonOrder
//! key of pos source ('0', '1', ...)
public $pos_source;
+ /**
+ * @var array Array with line of all shipments
+ */
+ public $expeditions;
+
/**
* 'type' if the field format ('integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter]]', 'varchar(x)', 'double(24,8)', 'real', 'price', 'text', 'html', 'date', 'datetime', 'timestamp', 'duration', 'mail', 'phone', 'url', 'password')
@@ -2010,9 +2015,9 @@ class Commande extends CommonOrder
/**
* Load array lines
*
- * @param int $only_product Return only physical products, not services
+ * @param int $only_product Return only physical products, not services
* @param int $loadalsotranslation Return translation for products
- * @return int <0 if KO, >0 if OK
+ * @return int <0 if KO, >0 if OK
*/
public function fetch_lines($only_product = 0, $loadalsotranslation = 0)
{
@@ -2207,9 +2212,10 @@ class Commande extends CommonOrder
* Note: For a dedicated shipment, the fetch_lines can be used to load the qty_asked and qty_shipped. This function is use to return qty_shipped cumulated for the order
*
* @param int $filtre_statut Filter on shipment status
+ * @param int $fk_product Add a filter on a product
* @return int <0 if KO, Nb of lines found if OK
*/
- public function loadExpeditions($filtre_statut = -1)
+ public function loadExpeditions($filtre_statut = -1, $fk_product = 0)
{
$this->expeditions = array();
diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php
index 8fc93a233c2..717b57ae8b1 100644
--- a/htdocs/commande/list.php
+++ b/htdocs/commande/list.php
@@ -1854,10 +1854,13 @@ if ($resql) {
print '
';
if (!empty($show_shippable_command) && !empty($conf->stock->enabled)) {
if (($obj->fk_statut > $generic_commande::STATUS_DRAFT) && ($obj->fk_statut < $generic_commande::STATUS_CLOSED)) {
- $generic_commande->getLinesArray(); // This set ->lines
+ $generic_commande->getLinesArray(); // Load array ->lines
+ $generic_commande->loadExpeditions(); // Load array ->expeditions
$numlines = count($generic_commande->lines); // Loop on each line of order
for ($lig = 0; $lig < $numlines; $lig++) {
+ $reliquat = $generic_commande->lines[$lig]->qty - $generic_commande->expeditions[$generic_commande->lines[$lig]->id];
+
if ($generic_commande->lines[$lig]->product_type == 0 && $generic_commande->lines[$lig]->fk_product > 0) { // If line is a product and not a service
$nbprod++; // order contains real products
$generic_product->id = $generic_commande->lines[$lig]->fk_product;
@@ -1872,15 +1875,15 @@ if ($resql) {
$generic_product->stock_theorique = $productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_theorique;
}
+ if ($reliquat > $generic_product->stock_reel) {
+ $notshippable++;
+ }
if (empty($conf->global->SHIPPABLE_ORDER_ICON_IN_LIST)) { // Default code. Default should be this case.
- $text_info .= $generic_commande->lines[$lig]->qty.' X '.$generic_commande->lines[$lig]->product_ref.' '.dol_trunc($generic_commande->lines[$lig]->product_label, 25);
+ $text_info .= $reliquat.' x '.$generic_commande->lines[$lig]->product_ref.' '.dol_trunc($generic_commande->lines[$lig]->product_label, 20);
$text_info .= ' - '.$langs->trans("Stock").': '.$generic_product->stock_reel.'';
$text_info .= ' - '.$langs->trans("VirtualStock").': '.$generic_product->stock_theorique.'';
+ $text_info .= ($reliquat != $generic_commande->lines[$lig]->qty ? ' ('.$langs->trans("QtyInOtherShipments").' '.($generic_commande->lines[$lig]->qty - $reliquat).')' : '');
$text_info .= ' ';
-
- if ($generic_commande->lines[$lig]->qty > $generic_product->stock_reel) {
- $notshippable++;
- }
} else { // BUGGED CODE.
// DOES NOT TAKE INTO ACCOUNT MANUFACTURING. THIS CODE SHOULD BE USELESS. PREVIOUS CODE SEEMS COMPLETE.
// COUNT STOCK WHEN WE SHOULD ALREADY HAVE VALUE
@@ -1908,32 +1911,31 @@ if ($resql) {
$stock_order_supplier = $generic_product->stats_commande_fournisseur['qty'];
}
}
- $text_info .= $generic_commande->lines[$lig]->qty.' X '.$generic_commande->lines[$lig]->ref.' '.dol_trunc($generic_commande->lines[$lig]->product_label, 25);
+ $text_info .= $reliquat.' x '.$generic_commande->lines[$lig]->ref.' '.dol_trunc($generic_commande->lines[$lig]->product_label, 20);
$text_stock_reel = $generic_product->stock_reel.'/'.$stock_order;
if ($stock_order > $generic_product->stock_reel && !($generic_product->stock_reel < $generic_commande->lines[$lig]->qty)) {
$warning++;
$text_warning .= ''.$langs->trans('Available').' : '.$text_stock_reel.'';
}
- if ($generic_product->stock_reel < $generic_commande->lines[$lig]->qty) {
- $notshippable++;
+ if ($reliquat > $generic_product->stock_reel) {
$text_info .= ''.$langs->trans('Available').' : '.$text_stock_reel.'';
} else {
$text_info .= ''.$langs->trans('Available').' : '.$text_stock_reel.'';
}
if ((!empty($conf->fournisseur->enabled) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || !empty($conf->supplier_order->enabled)) {
- $text_info .= ' '.$langs->trans('SupplierOrder').' : '.$stock_order_supplier.' ';
- } else {
- $text_info .= ' ';
+ $text_info .= ' '.$langs->trans('SupplierOrder').' : '.$stock_order_supplier;
}
+ $text_info .= ($reliquat != $generic_commande->lines[$lig]->qty ? ' ('.$langs->trans("QtyInOtherShipments").' '.($generic_commande->lines[$lig]->qty - $reliquat).')' : '');
+ $text_info .= ' ';
}
}
}
if ($notshippable == 0) {
$text_icon = img_picto('', 'dolly', '', false, 0, 0, '', 'green paddingleft');
- $text_info = $langs->trans('Shippable').' '.$text_info;
+ $text_info = $text_icon.' '.$langs->trans('Shippable').' '.$text_info;
} else {
$text_icon = img_picto('', 'dolly', '', false, 0, 0, '', 'error paddingleft');
- $text_info = $langs->trans('NonShippable').' '.$text_info;
+ $text_info = $text_icon.' '.$langs->trans('NonShippable').' '.$text_info;
}
}
diff --git a/htdocs/contrat/agenda.php b/htdocs/contrat/agenda.php
index edb54631786..d654ac38d9f 100644
--- a/htdocs/contrat/agenda.php
+++ b/htdocs/contrat/agenda.php
@@ -245,6 +245,8 @@ if ($id > 0) {
$newcardbutton = '';
if (!empty($conf->agenda->enabled)) {
if (!empty($user->rights->agenda->myactions->create) || !empty($user->rights->agenda->allactions->create)) {
+ $backtopage = $_SERVER['PHP_SELF'].'?id='.$object->id;
+ $out = '&origin='.$object->element.'&originid='.$object->id.'&backtopage='.urlencode($backtopage);
$newcardbutton .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out);
}
}
diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php
index db004c117a0..1345320f08a 100644
--- a/htdocs/core/class/commonobject.class.php
+++ b/htdocs/core/class/commonobject.class.php
@@ -7598,7 +7598,7 @@ abstract class CommonObject
} else { return true; }
} elseif (in_array($type, array('double', 'real', 'price'))) {
// is numeric
- if (!$validate->isDuration($fieldValue)) {
+ if (!$validate->isNumeric($fieldValue)) {
$this->setFieldError($fieldKey, $validate->error);
return false;
} else { return true; }
diff --git a/htdocs/core/class/validate.class.php b/htdocs/core/class/validate.class.php
index 389bb708e82..61251167c21 100644
--- a/htdocs/core/class/validate.class.php
+++ b/htdocs/core/class/validate.class.php
@@ -55,18 +55,17 @@ class Validate
{
global $langs;
- if ($outputLang) {
+ if (empty($outputLang)) {
$this->outputLang = $langs;
} else {
$this->outputLang = $outputLang;
}
- if (!is_object($this->outputLang) || !method_exists($outputLang, 'load')) {
+ if (!is_object($this->outputLang) || !method_exists($this->outputLang, 'load')) {
return false;
}
- /** @var Translate $outputLang */
- $outputLang->load('validate');
+ $this->outputLang->loadLangs(array('validate', 'errors'));
$this->db = $db;
}
@@ -229,6 +228,21 @@ class Validate
return true;
}
+ /**
+ * Check numeric validity
+ *
+ * @param mixed $string to validate
+ * @return boolean Validity is ok or not
+ */
+ public function isNumeric($string)
+ {
+ if (!is_numeric($string)) {
+ $this->error = $this->outputLang->trans('RequireValidNumeric');
+ return false;
+ }
+ return true;
+ }
+
/**
* Check for boolean validity
*
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index ac7ea26e791..2eb1802d303 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -1545,6 +1545,7 @@ function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
// This is when PHP session is ran outside a web server, like from Linux command line (Not always defined, but usefull if OS defined it).
$data['ip'] = '???@'.$_SERVER['LOGNAME'];
}
+
// Loop on each log handler and send output
foreach ($conf->loghandlers as $loghandlerinstance) {
if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
diff --git a/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php b/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php
index c30a2512083..59f4067cf31 100644
--- a/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php
+++ b/htdocs/core/modules/supplier_order/doc/pdf_cornas.modules.php
@@ -1252,20 +1252,30 @@ class pdf_cornas extends ModelePDFSuppliersOrders
$pdf->SetXY($this->marge_gauche, $posy);
// Logo
- $logo = $conf->mycompany->dir_output.'/logos/'.$this->emetteur->logo;
- if ($this->emetteur->logo) {
- if (is_readable($logo)) {
- $height = pdf_getHeightForLogo($logo);
- $pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto)
+ if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) {
+ if ($this->emetteur->logo) {
+ $logodir = $conf->mycompany->dir_output;
+ if (!empty($conf->mycompany->multidir_output[$object->entity])) {
+ $logodir = $conf->mycompany->multidir_output[$object->entity];
+ }
+ if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) {
+ $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small;
+ } else {
+ $logo = $logodir.'/logos/'.$this->emetteur->logo;
+ }
+ if (is_readable($logo)) {
+ $height = pdf_getHeightForLogo($logo);
+ $pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto)
+ } else {
+ $pdf->SetTextColor(200, 0, 0);
+ $pdf->SetFont('', 'B', $default_font_size - 2);
+ $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound", $logo), 0, 'L');
+ $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L');
+ }
} else {
- $pdf->SetTextColor(200, 0, 0);
- $pdf->SetFont('', 'B', $default_font_size - 2);
- $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound", $logo), 0, 'L');
- $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToModuleSetup"), 0, 'L');
+ $text = $this->emetteur->name;
+ $pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, $ltrdirection);
}
- } else {
- $text = $this->emetteur->name;
- $pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, $ltrdirection);
}
$pdf->SetFont('', 'B', $default_font_size + 3);
diff --git a/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php b/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php
index bb3d4f073fe..3f7e6181913 100644
--- a/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php
+++ b/htdocs/core/modules/supplier_order/doc/pdf_muscadet.modules.php
@@ -1160,20 +1160,30 @@ class pdf_muscadet extends ModelePDFSuppliersOrders
$pdf->SetXY($this->marge_gauche, $posy);
// Logo
- $logo = $conf->mycompany->dir_output.'/logos/'.$this->emetteur->logo;
- if ($this->emetteur->logo) {
- if (is_readable($logo)) {
- $height = pdf_getHeightForLogo($logo);
- $pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto)
+ if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) {
+ if ($this->emetteur->logo) {
+ $logodir = $conf->mycompany->dir_output;
+ if (!empty($conf->mycompany->multidir_output[$object->entity])) {
+ $logodir = $conf->mycompany->multidir_output[$object->entity];
+ }
+ if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) {
+ $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small;
+ } else {
+ $logo = $logodir.'/logos/'.$this->emetteur->logo;
+ }
+ if (is_readable($logo)) {
+ $height = pdf_getHeightForLogo($logo);
+ $pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto)
+ } else {
+ $pdf->SetTextColor(200, 0, 0);
+ $pdf->SetFont('', 'B', $default_font_size - 2);
+ $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound", $logo), 0, 'L');
+ $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L');
+ }
} else {
- $pdf->SetTextColor(200, 0, 0);
- $pdf->SetFont('', 'B', $default_font_size - 2);
- $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound", $logo), 0, 'L');
- $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToModuleSetup"), 0, 'L');
+ $text = $this->emetteur->name;
+ $pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, $ltrdirection);
}
- } else {
- $text = $this->emetteur->name;
- $pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, $ltrdirection);
}
$pdf->SetFont('', 'B', $default_font_size + 3);
diff --git a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php
index 0417d06e44d..7539d89167b 100644
--- a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php
+++ b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php
@@ -1295,20 +1295,30 @@ class pdf_aurore extends ModelePDFSupplierProposal
$pdf->SetXY($this->marge_gauche, $posy);
// Logo
- $logo = $conf->mycompany->dir_output.'/logos/'.$this->emetteur->logo;
- if ($this->emetteur->logo) {
- if (is_readable($logo)) {
- $height = pdf_getHeightForLogo($logo);
- $pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto)
+ if (empty($conf->global->PDF_DISABLE_MYCOMPANY_LOGO)) {
+ if ($this->emetteur->logo) {
+ $logodir = $conf->mycompany->dir_output;
+ if (!empty($conf->mycompany->multidir_output[$object->entity])) {
+ $logodir = $conf->mycompany->multidir_output[$object->entity];
+ }
+ if (empty($conf->global->MAIN_PDF_USE_LARGE_LOGO)) {
+ $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small;
+ } else {
+ $logo = $logodir.'/logos/'.$this->emetteur->logo;
+ }
+ if (is_readable($logo)) {
+ $height = pdf_getHeightForLogo($logo);
+ $pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto)
+ } else {
+ $pdf->SetTextColor(200, 0, 0);
+ $pdf->SetFont('', 'B', $default_font_size - 2);
+ $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound", $logo), 0, 'L');
+ $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L');
+ }
} else {
- $pdf->SetTextColor(200, 0, 0);
- $pdf->SetFont('', 'B', $default_font_size - 2);
- $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound", $logo), 0, 'L');
- $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L');
+ $text = $this->emetteur->name;
+ $pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, $ltrdirection);
}
- } else {
- $text = $this->emetteur->name;
- $pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, 'L');
}
$pdf->SetFont('', 'B', $default_font_size + 3);
diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php
index 064dfc3a52c..f835e293f5f 100644
--- a/htdocs/expedition/card.php
+++ b/htdocs/expedition/card.php
@@ -1126,16 +1126,19 @@ if ($action == 'create') {
$product_static->status_buy = $line->product_tobuy;
$product_static->status_batch = $line->product_tobatch;
+ $showdescinproductdesc = (getDolGlobalString('PRODUIT_DESC_IN_FORM') == 2 ? 1 : 0);
+
$text = $product_static->getNomUrl(1);
$text .= ' - '.(!empty($line->label) ? $line->label : $line->product_label);
- $description = ($conf->global->PRODUIT_DESC_IN_FORM ? '' : dol_htmlentitiesbr($line->desc));
+ $description = ($showdescinproductdesc ? '' : dol_htmlentitiesbr($line->desc));
+
print $form->textwithtooltip($text, $description, 3, '', '', $i);
// Show range
print_date_range($db->jdate($line->date_start), $db->jdate($line->date_end));
// Add description in form
- if (!empty($conf->global->PRODUIT_DESC_IN_FORM)) {
+ if ($showdescinproductdesc) {
print ($line->desc && $line->desc != $line->product_label) ? ' '.dol_htmlentitiesbr($line->desc) : '';
}
diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php
index 0151af97acf..aefb8741668 100644
--- a/htdocs/fourn/class/fournisseur.commande.class.php
+++ b/htdocs/fourn/class/fournisseur.commande.class.php
@@ -1370,29 +1370,35 @@ class CommandeFournisseur extends CommonOrder
// insert products details into database
for ($i = 0; $i < $num; $i++) {
- $this->special_code = $this->lines[$i]->special_code; // TODO : remove this in 9.0 and add special_code param to addline()
+ $line = $this->lines[$i];
+ if (!is_object($line)) {
+ $line = (object) $line;
+ }
+
+
+ $this->special_code = $line->special_code; // TODO : remove this in 9.0 and add special_code param to addline()
// This include test on qty if option SUPPLIER_ORDER_WITH_NOPRICEDEFINED is not set
$result = $this->addline(
- $this->lines[$i]->desc,
- $this->lines[$i]->subprice,
- $this->lines[$i]->qty,
- $this->lines[$i]->tva_tx,
- $this->lines[$i]->localtax1_tx,
- $this->lines[$i]->localtax2_tx,
- $this->lines[$i]->fk_product,
+ $line->desc,
+ $line->subprice,
+ $line->qty,
+ $line->tva_tx,
+ $line->localtax1_tx,
+ $line->localtax2_tx,
+ $line->fk_product,
0,
- $this->lines[$i]->ref_fourn, // $this->lines[$i]->ref_fourn comes from field ref into table of lines. Value may ba a ref that does not exists anymore, so we first try with value of product
- $this->lines[$i]->remise_percent,
+ $line->ref_fourn, // $line->ref_fourn comes from field ref into table of lines. Value may ba a ref that does not exists anymore, so we first try with value of product
+ $line->remise_percent,
'HT',
0,
- $this->lines[$i]->product_type,
- $this->lines[$i]->info_bits,
+ $line->product_type,
+ $line->info_bits,
false,
- $this->lines[$i]->date_start,
- $this->lines[$i]->date_end,
- $this->lines[$i]->array_options,
- $this->lines[$i]->fk_unit
+ $line->date_start,
+ $line->date_end,
+ $line->array_options,
+ $line->fk_unit
);
if ($result < 0) {
dol_syslog(get_class($this)."::create ".$this->error, LOG_WARNING); // do not use dol_print_error here as it may be a functionnal error
diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php
index 00408c1e43b..ec4ea692f78 100644
--- a/htdocs/fourn/commande/card.php
+++ b/htdocs/fourn/commande/card.php
@@ -101,6 +101,10 @@ $extrafields = new ExtraFields($db);
// fetch optionals attributes and labels
$extrafields->fetch_name_optionals_label($object->table_element);
+if ($user->socid) {
+ $socid = $user->socid;
+}
+
// Load object
if ($id > 0 || !empty($ref)) {
$ret = $object->fetch($id, $ref);
@@ -124,7 +128,9 @@ if ($id > 0 || !empty($ref)) {
}
}
-$result = restrictedArea($user, 'fournisseur', $id, 'commande_fournisseur', 'commande');
+// Security check
+$isdraft = (isset($object->statut) && ($object->statut == $object::STATUS_DRAFT) ? 1 : 0);
+$result = restrictedArea($user, 'fournisseur', $id, 'commande_fournisseur', 'commande', 'fk_soc', 'rowid', $isdraft);
// Common permissions
$usercanread = ($user->rights->fournisseur->commande->lire || $user->rights->supplier_order->lire);
@@ -842,8 +848,7 @@ if (empty($reshook)) {
} else {
$db->rollback();
- dol_print_error($db, $object->error);
- exit;
+ setEventMessages($object->error, $object->errors, 'errors');
}
}
diff --git a/htdocs/includes/OAuth/OAuth2/Service/WordPress.php b/htdocs/includes/OAuth/OAuth2/Service/WordPress.php
index 4d6d81e086d..79a13d00e2d 100755
--- a/htdocs/includes/OAuth/OAuth2/Service/WordPress.php
+++ b/htdocs/includes/OAuth/OAuth2/Service/WordPress.php
@@ -11,17 +11,28 @@ use OAuth\Common\Http\Exception\TokenResponseException;
use OAuth\OAuth2\Service\Exception\InvalidAccessTypeException;
use OAuth\Common\Http\Uri\Uri;
+/**
+ * Class For WordPress OAuth
+ */
class WordPress extends AbstractService
{
+ /**
+ * @var string
+ */
protected $accessType = 'online';
- public function __construct(
- CredentialsInterface $credentials,
- ClientInterface $httpClient,
- TokenStorageInterface $storage,
- $scopes = array(),
- UriInterface $baseApiUri = null
- ) {
+ /**
+ * Construct
+ *
+ * @param CredentialsInterface $credentials credentials
+ * @param ClientInterface $httpClient httpClient
+ * @param TokenStorageInterface $storage storage
+ * @param $scopes scope
+ * @param UriInterface|null $baseApiUri baseApiUri
+ * @throws Exception\InvalidScopeException
+ */
+ public function __construct(CredentialsInterface $credentials, ClientInterface $httpClient, TokenStorageInterface $storage, $scopes = array(), UriInterface $baseApiUri = null)
+ {
parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
if (null === $baseApiUri) {
@@ -41,7 +52,7 @@ class WordPress extends AbstractService
}*/
/**
- * {@inheritdoc}
+ * @return Uri
*/
public function getAuthorizationEndpoint()
{
@@ -49,7 +60,7 @@ class WordPress extends AbstractService
}
/**
- * {@inheritdoc}
+ * @return Uri
*/
public function getAccessTokenEndpoint()
{
@@ -57,7 +68,7 @@ class WordPress extends AbstractService
}
/**
- * {@inheritdoc}
+ * @return int
*/
protected function getAuthorizationMethod()
{
@@ -66,7 +77,9 @@ class WordPress extends AbstractService
}
/**
- * {@inheritdoc}
+ * @param $responseBody responseBody
+ * @return StdOAuth2Token
+ * @throws TokenResponseException
*/
protected function parseAccessTokenResponse($responseBody)
{
diff --git a/htdocs/install/default.css b/htdocs/install/default.css
index 6a0e84ce20a..d18e54c0c1c 100644
--- a/htdocs/install/default.css
+++ b/htdocs/install/default.css
@@ -479,5 +479,3 @@ table.tablesupport {
width: 100%;
}
}
-
-}
diff --git a/htdocs/install/mysql/migration/12.0.0-13.0.0.sql b/htdocs/install/mysql/migration/12.0.0-13.0.0.sql
index a9f1a669e52..517771ced4e 100644
--- a/htdocs/install/mysql/migration/12.0.0-13.0.0.sql
+++ b/htdocs/install/mysql/migration/12.0.0-13.0.0.sql
@@ -484,9 +484,9 @@ ALTER TABLE llx_delivery DROP FOREIGN KEY fk_livraison_fk_user_author;
ALTER TABLE llx_delivery DROP FOREIGN KEY fk_livraison_fk_user_valid;
-- add constraint
-ALTER TABLE llx_delivery ADD CONSTRAINT fk_delivery_fk_soc FOREIGN KEY (fk_soc) REFERENCES llx_societe (rowid);
-ALTER TABLE llx_delivery ADD CONSTRAINT fk_delivery_fk_user_author FOREIGN KEY (fk_user_author) REFERENCES llx_user (rowid);
-ALTER TABLE llx_delivery ADD CONSTRAINT fk_delivery_fk_user_valid FOREIGN KEY (fk_user_valid) REFERENCES llx_user (rowid);
+ALTER TABLE llx_delivery ADD CONSTRAINT fk_delivery_fk_soc FOREIGN KEY (fk_soc) REFERENCES llx_societe (rowid);
+ALTER TABLE llx_delivery ADD CONSTRAINT fk_delivery_fk_user_author FOREIGN KEY (fk_user_author) REFERENCES llx_user (rowid);
+ALTER TABLE llx_delivery ADD CONSTRAINT fk_delivery_fk_user_valid FOREIGN KEY (fk_user_valid) REFERENCES llx_user (rowid);
ALTER TABLE llx_deliverydet DROP FOREIGN KEY fk_livraisondet_fk_livraison;
ALTER TABLE llx_deliverydet DROP INDEX idx_livraisondet_fk_expedition;
diff --git a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql
index 0f223d520e5..93eecc6fa89 100644
--- a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql
+++ b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql
@@ -1,7 +1,7 @@
--
-- Be carefull to requests order.
-- This file must be loaded by calling /install/index.php page
--- when current version is 14.0.0 or higher.
+-- when current version is 15.0.0 or higher.
--
-- To restrict request to Mysql version x.y minimum use -- VMYSQLx.y
-- To restrict request to Pgsql version x.y minimum use -- VPGSQLx.y
@@ -38,4 +38,4 @@ UPDATE llx_rights_def SET perms = 'writeall' WHERE perms = 'writeall_advance' AN
-- v16
-
+ALTER TABLE llx_projet_task_time ADD COLUMN fk_product integer NULL;
diff --git a/htdocs/install/mysql/tables/llx_projet_task_time.sql b/htdocs/install/mysql/tables/llx_projet_task_time.sql
index 786d8907588..63eadb1177f 100644
--- a/htdocs/install/mysql/tables/llx_projet_task_time.sql
+++ b/htdocs/install/mysql/tables/llx_projet_task_time.sql
@@ -24,6 +24,7 @@ create table llx_projet_task_time
task_datehour datetime, -- day + hour
task_date_withhour integer DEFAULT 0, -- 0 by default, 1 if date was entered with start hour
task_duration double,
+ fk_product integer NULL,
fk_user integer,
thm double(24,8),
invoice_id integer DEFAULT NULL, -- If we need to invoice each line of timespent, we can save invoice id here
diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang
index 7f4ca7b074f..293bf4ad53b 100644
--- a/htdocs/langs/en_US/errors.lang
+++ b/htdocs/langs/en_US/errors.lang
@@ -315,6 +315,7 @@ RequireAtLeastXString = Requires at least %s character(s)
RequireXStringMax = Requires %s character(s) max
RequireAtLeastXDigits = Requires at least %s digit(s)
RequireXDigitsMax = Requires %s digit(s) max
+RequireValidNumeric = Requires a numeric value
RequireValidEmail = Email address is not valid
RequireMaxLength = Length must be less than %s chars
RequireMinLength = Length must be more than %s char(s)
diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php
index 9dedb2dd24e..a493508878c 100644
--- a/htdocs/modulebuilder/template/myobject_card.php
+++ b/htdocs/modulebuilder/template/myobject_card.php
@@ -132,7 +132,7 @@ $upload_dir = $conf->mymodule->multidir_output[isset($object->entity) ? $object-
// Security check (enable the most restrictive one)
//if ($user->socid > 0) accessforbidden();
//if ($user->socid > 0) $socid = $user->socid;
-//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
+//$isdraft = (isset($object->status) && ($object->status == $object::STATUS_DRAFT) ? 1 : 0);
//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
//if (empty($conf->mymodule->enabled)) accessforbidden();
//if (!$permissiontoread) accessforbidden();
diff --git a/htdocs/product/inventory/inventory.php b/htdocs/product/inventory/inventory.php
index 82747fb8360..95c9e2972cb 100644
--- a/htdocs/product/inventory/inventory.php
+++ b/htdocs/product/inventory/inventory.php
@@ -630,7 +630,10 @@ if ($object->id > 0) {
errortab3 = [];
errortab4 = [];
- if(textarray[0] != ""){
+ textarray = textarray.filter(function(value){
+ return value != "";
+ });
+ if(textarray.some((element) => element != "")){
$(".expectedqty").each(function(){
id = this.id;
console.log("Analyze line "+id+" in inventory");
@@ -851,7 +854,7 @@ if ($object->id > 0) {
print '
';
print '
'.$langs->trans("Warehouse").'
';
print '
'.$langs->trans("Product").'
';
- if ($conf->productbatch->enabled) {
+ if (!empty($conf->productbatch->enabled)) {
print '
';
- if ($conf->productbatch->enabled) {
+ if (!empty($conf->productbatch->enabled)) {
print '
';
print '';
print '
';
@@ -927,6 +930,7 @@ if ($object->id > 0) {
}
// Load real stock we have now
+ $option = '';
if (isset($cacheOfProducts[$obj->fk_product])) {
$product_static = $cacheOfProducts[$obj->fk_product];
} else {
@@ -948,7 +952,7 @@ if ($object->id > 0) {
print $product_static->getNomUrl(1).' - '.$product_static->label;
print '';
- if ($conf->productbatch->enabled) {
+ if (!empty($conf->productbatch->enabled)) {
print '
';
print $obj->batch;
print '
';
@@ -959,7 +963,7 @@ if ($object->id > 0) {
$valuetoshow = $obj->qty_stock;
// For inventory not yet close, we overwrite with the real value in stock now
if ($object->status == $object::STATUS_DRAFT || $object->status == $object::STATUS_VALIDATED) {
- if ($conf->productbatch->enabled && $product_static->hasbatch()) {
+ if (!empty($conf->productbatch->enabled) && $product_static->hasbatch()) {
$valuetoshow = $product_static->stock_warehouse[$obj->fk_warehouse]->detail_batch[$obj->batch]->qty;
} else {
$valuetoshow = $product_static->stock_warehouse[$obj->fk_warehouse]->real;
diff --git a/htdocs/ticket/messaging.php b/htdocs/ticket/messaging.php
index e0232ae1175..61291836cdb 100644
--- a/htdocs/ticket/messaging.php
+++ b/htdocs/ticket/messaging.php
@@ -204,6 +204,7 @@ if (!empty($conf->projet->enabled)) {
}
} else {
if (!empty($object->fk_project)) {
+ require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
$proj = new Project($db);
$proj->fetch($object->fk_project);
$morehtmlref .= $proj->getNomUrl(1);
diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php
index bd23514cf47..b8aca57b38c 100644
--- a/htdocs/user/class/user.class.php
+++ b/htdocs/user/class/user.class.php
@@ -524,7 +524,7 @@ class User extends CommonObject
$this->admin = $obj->admin;
$this->note_public = $obj->note_public;
$this->note_private = $obj->note_private;
- $this->note = $obj->note_private;
+ $this->note = $obj->note_private; // deprecated
$this->statut = $obj->statut;
$this->photo = $obj->photo;
$this->openid = $obj->openid;
@@ -1905,7 +1905,7 @@ class User extends CommonObject
// Update password
if (!empty($this->pass)) {
if ($this->pass != $this->pass_indatabase && $this->pass != $this->pass_indatabase_crypted) {
- // Si mot de passe saisi et different de celui en base
+ // If a new value for password is set and different than the one crypted into database
$result = $this->setPassword($user, $this->pass, 0, $notrigger, $nosyncmemberpass);
if ($result < 0) {
return -5;
@@ -3080,7 +3080,7 @@ class User extends CommonObject
$this->personal_mobile = '0999999996';
$this->admin = 0;
$this->login = 'dolibspec';
- $this->pass = 'dolibspec';
+ $this->pass = 'dolibSpec+@123';
//$this->pass_indatabase='dolibspec'; Set after a fetch
//$this->pass_indatabase_crypted='e80ca5a88c892b0aaaf7e154853bccab'; Set after a fetch
$this->datec = $now;
diff --git a/test/phpunit/UserTest.php b/test/phpunit/UserTest.php
index b8025a3cd41..699e9fd89f0 100644
--- a/test/phpunit/UserTest.php
+++ b/test/phpunit/UserTest.php
@@ -143,11 +143,13 @@ class UserTest extends PHPUnit\Framework\TestCase
$langs=$this->savlangs;
$db=$this->savdb;
+ print __METHOD__." USER_PASSWORD_GENERATED=".getDolGlobalString('USER_PASSWORD_GENERATED')."\n";
+
$localobject=new User($this->savdb);
$localobject->initAsSpecimen();
$result=$localobject->create($user);
- $this->assertLessThan($result, 0);
+ $this->assertLessThan($result, 0, 'Creation of user has failed: '.$localobject->error);
print __METHOD__." result=".$result."\n";
return $result;
}
diff --git a/test/phpunit/testvirus.txt b/test/phpunit/testvirus.txt
index cef4658b70f..86bb55dac62 100644
--- a/test/phpunit/testvirus.txt
+++ b/test/phpunit/testvirus.txt
@@ -1,2 +1,2 @@
-# Remove this line and replace the ABC with X5 to get a file that is detected by antiviruses.
-ABO!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
\ No newline at end of file
+# Remove this line and replace the "AB" with "X5" at begin of line to get a file that is detected by antiviruses.
+ABO!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*