From e80f29c271f6e75f8771447c12e37526222092c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Wed, 16 Sep 2015 12:46:50 +0200 Subject: [PATCH 01/58] Fix: [ bug 1794 ] - Error when cloning Proposal gives error in a malformed page --- htdocs/comm/propal.php | 10 ++--- htdocs/comm/propal/class/propal.class.php | 54 +++++++++++------------ 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 99119414971..aefef2af68e 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -112,20 +112,20 @@ if (empty($reshook)) { // Action clone object if ($action == 'confirm_clone' && $confirm == 'yes') { - if (1 == 0 && ! GETPOST('clone_content') && ! GETPOST('clone_receivers')) { - setEventMessage($langs->trans("NoCloneOptionsSpecified"), 'errors'); - } else { +// if (1 == 0 && ! GETPOST('clone_content') && ! GETPOST('clone_receivers')) { +// setEventMessage($langs->trans("NoCloneOptionsSpecified"), 'errors'); +// } else { if ($object->id > 0) { $result = $object->createFromClone($socid); if ($result > 0) { header("Location: " . $_SERVER['PHP_SELF'] . '?id=' . $result); exit(); } else { - setEventMessage($object->error, 'errors'); + if (count($object->errors) > 0) setEventMessage($object->errors, 'errors'); $action = ''; } } - } +// } } // Delete proposal diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 483b6ec8258..ba361ea6aa5 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -956,35 +956,35 @@ class Propal extends CommonObject foreach($this->lines as $line) $line->fetch_optionals($line->rowid); - // Load source object - $objFrom = dol_clone($this); + // Load dest object + $clonedObj = clone $this; $objsoc=new Societe($this->db); // Change socid if needed - if (! empty($socid) && $socid != $this->socid) + if (! empty($socid) && $socid != $clonedObj->socid) { if ($objsoc->fetch($socid) > 0) { - $this->socid = $objsoc->id; - $this->cond_reglement_id = (! empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0); - $this->mode_reglement_id = (! empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0); - $this->fk_project = ''; - $this->fk_delivery_address = ''; + $clonedObj->socid = $objsoc->id; + $clonedObj->cond_reglement_id = (! empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0); + $clonedObj->mode_reglement_id = (! empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0); + $clonedObj->fk_project = ''; + $clonedObj->fk_delivery_address = ''; } // reset ref_client - $this->ref_client = ''; + $clonedObj->ref_client = ''; // TODO Change product price if multi-prices } else { - $objsoc->fetch($this->socid); + $objsoc->fetch($clonedObj->socid); } - $this->id=0; - $this->statut=0; + $clonedObj->id=0; + $clonedObj->statut=0; if (empty($conf->global->PROPALE_ADDON) || ! is_readable(DOL_DOCUMENT_ROOT ."/core/modules/propale/".$conf->global->PROPALE_ADDON.".php")) { @@ -993,32 +993,32 @@ class Propal extends CommonObject } // Clear fields - $this->user_author = $user->id; - $this->user_valid = ''; - $this->date = $now; - $this->datep = $now; // deprecated - $this->fin_validite = $this->date + ($this->duree_validite * 24 * 3600); - if (empty($conf->global->MAIN_KEEP_REF_CUSTOMER_ON_CLONING)) $this->ref_client = ''; + $clonedObj->user_author = $user->id; + $clonedObj->user_valid = ''; + $clonedObj->date = $now; + $clonedObj->datep = $now; // deprecated + $clonedObj->fin_validite = $clonedObj->date + ($clonedObj->duree_validite * 24 * 3600); + if (empty($conf->global->MAIN_KEEP_REF_CUSTOMER_ON_CLONING)) $clonedObj->ref_client = ''; // Set ref require_once DOL_DOCUMENT_ROOT ."/core/modules/propale/".$conf->global->PROPALE_ADDON.'.php'; $obj = $conf->global->PROPALE_ADDON; $modPropale = new $obj; - $this->ref = $modPropale->getNextValue($objsoc,$this); + $clonedObj->ref = $modPropale->getNextValue($objsoc,$clonedObj); // Create clone - $result=$this->create($user); + $result=$clonedObj->create($user); if ($result < 0) $error++; else { // copy internal contacts - if ($this->copy_linked_contact($objFrom, 'internal') < 0) + if ($clonedObj->copy_linked_contact($this, 'internal') < 0) $error++; // copy external contacts if same company - elseif ($objFrom->socid == $this->socid) + elseif ($this->socid == $clonedObj->socid) { - if ($this->copy_linked_contact($objFrom, 'external') < 0) + if ($clonedObj->copy_linked_contact($this, 'external') < 0) $error++; } } @@ -1028,16 +1028,16 @@ class Propal extends CommonObject // Hook of thirdparty module if (is_object($hookmanager)) { - $parameters=array('objFrom'=>$objFrom); + $parameters=array('objFrom'=>$this); $action=''; - $reshook=$hookmanager->executeHooks('createFrom',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + $reshook=$hookmanager->executeHooks('createFrom',$parameters,$clonedObj,$action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) $error++; } // Appel des triggers include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; $interface=new Interfaces($this->db); - $result=$interface->run_triggers('PROPAL_CLONE',$this,$user,$langs,$conf); + $result=$interface->run_triggers('PROPAL_CLONE',$clonedObj,$user,$langs,$conf); if ($result < 0) { $error++; $this->errors=$interface->errors; } @@ -1048,7 +1048,7 @@ class Propal extends CommonObject if (! $error) { $this->db->commit(); - return $this->id; + return $clonedObj->id; } else { From 3818bff86af9a9d0b98114e5fc6a88b926844f2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Wed, 16 Sep 2015 12:49:05 +0200 Subject: [PATCH 02/58] Fix: [ bug 1776 ] Undefined $deliverycompany variable in pdf_build_address --- htdocs/core/lib/pdf.lib.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php index 8b0091a6f6d..054cc633cf3 100644 --- a/htdocs/core/lib/pdf.lib.php +++ b/htdocs/core/lib/pdf.lib.php @@ -301,7 +301,6 @@ function pdf_build_address($outputlangs,$sourcecompany,$targetcompany='',$target if ($mode == 'source' && ! is_object($sourcecompany)) return -1; if ($mode == 'target' && ! is_object($targetcompany)) return -1; - if ($mode == 'delivery' && ! is_object($deliverycompany)) return -1; if (! empty($sourcecompany->state_id) && empty($sourcecompany->departement)) $sourcecompany->departement=getState($sourcecompany->state_id); //TODO: Deprecated if (! empty($sourcecompany->state_id) && empty($sourcecompany->state)) $sourcecompany->state=getState($sourcecompany->state_id); From 2d35124c71b683ad8a2ebc015792564b28b7e7ef Mon Sep 17 00:00:00 2001 From: Alexis Algoud Date: Wed, 23 Sep 2015 11:11:19 +0200 Subject: [PATCH 03/58] FIX no need to remove file into mail form, the temp dir will be deleted after any sending --- htdocs/core/lib/files.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index bcc6c165472..a4e26f116ef 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1115,7 +1115,7 @@ function dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesessio * @param int $donotdeletefile 1=Do not delete physically file * @return void */ -function dol_remove_file_process($filenb,$donotupdatesession=0,$donotdeletefile=0) +function dol_remove_file_process($filenb,$donotupdatesession=0,$donotdeletefile=1) { global $db,$user,$conf,$langs,$_FILES; From b222800012bbdb5ff0c8329d10fea991aa35f77b Mon Sep 17 00:00:00 2001 From: phf Date: Wed, 23 Sep 2015 15:14:08 +0200 Subject: [PATCH 04/58] FIX clone customer order create new order with validate ref and not with PROV --- htdocs/commande/class/commande.class.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 767bf294d6f..567c3f1a702 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -988,14 +988,16 @@ class Commande extends CommonOrder $this->ref_client = ''; // Set ref - require_once DOL_DOCUMENT_ROOT ."/core/modules/commande/".$conf->global->COMMANDE_ADDON.'.php'; - $obj = $conf->global->COMMANDE_ADDON; - $modCommande = new $obj; - $this->ref = $modCommande->getNextValue($objsoc,$this); - + $this->ref = '(PROV)'; // Create clone $result=$this->create($user); + if ($result < 0) $error++; + + // Set new ref + $newref='(PROV'.$this->id.')'; + $sql = 'UPDATE '.MAIN_DB_PREFIX."commande SET ref='".$this->db->escape($newref)."' WHERE rowid=".$this->id; + $result=$this->db->query($sql); if ($result < 0) $error++; if (! $error) From 3f8e9bd1810450d05974d770fdf64d8707139273 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 10 Oct 2015 19:24:31 +0200 Subject: [PATCH 05/58] Remove warning --- htdocs/product/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/index.php b/htdocs/product/index.php index a8502498e41..2803c2d06ad 100644 --- a/htdocs/product/index.php +++ b/htdocs/product/index.php @@ -299,7 +299,7 @@ if ($result) if (empty($conf->global->PRODUIT_MULTIPRICES)) { print ''; - if ($objp->price_base_type == 'TTC') print price($objp->price_ttc).' '.$langs->trans("TTC"); + if (isset($objp->price_base_type) && $objp->price_base_type == 'TTC') print price($objp->price_ttc).' '.$langs->trans("TTC"); else print price($objp->price).' '.$langs->trans("HT"); print ''; } From 9f1fa7e212be3a879e8604b7140469b6f973ed60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Sun, 11 Oct 2015 12:32:02 +0200 Subject: [PATCH 06/58] Missing changelog --- ChangeLog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ChangeLog b/ChangeLog index f83979aa8e0..51ae09529f1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,9 @@ English Dolibarr ChangeLog -------------------------------------------------------------- +***** ChangeLog for 3.6.5 compared to 3.6.4 ***** +- Fix: [ bug #1794 ] Error when cloning Proposal gives error in a malformed page + ***** ChangeLog for 3.6.4 compared to 3.6.3 ***** - Fix: [ bug #2893 ] Dolibarr error when viewing an invoice after changing invoice mask From fd9f51df88927d9a41c62d50fc6a04d2d6fa515a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Sun, 11 Oct 2015 12:39:42 +0200 Subject: [PATCH 07/58] Missing changelog --- ChangeLog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ChangeLog b/ChangeLog index f83979aa8e0..3bc56c5de5b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,9 @@ English Dolibarr ChangeLog -------------------------------------------------------------- +***** ChangeLog for 3.6.5 compared to 3.6.4 ***** +- Fix: [ bug #1776 ] Undefined $deliverycompany variable in pdf_build_address + ***** ChangeLog for 3.6.4 compared to 3.6.3 ***** - Fix: [ bug #2893 ] Dolibarr error when viewing an invoice after changing invoice mask From 87fad70f4a7c6989983d6a519517b95a2f0c5725 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 11 Oct 2015 20:42:49 +0200 Subject: [PATCH 08/58] Revert "FIX no need to remove file into mail form" --- htdocs/core/lib/files.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index a4e26f116ef..bcc6c165472 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1115,7 +1115,7 @@ function dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesessio * @param int $donotdeletefile 1=Do not delete physically file * @return void */ -function dol_remove_file_process($filenb,$donotupdatesession=0,$donotdeletefile=1) +function dol_remove_file_process($filenb,$donotupdatesession=0,$donotdeletefile=0) { global $db,$user,$conf,$langs,$_FILES; From 0251728e286a99f5f013f878c9872dde0fbcabf7 Mon Sep 17 00:00:00 2001 From: Alexis Algoud Date: Mon, 12 Oct 2015 17:36:24 +0200 Subject: [PATCH 09/58] FIX double db escape add too quote --- htdocs/product/stock/class/entrepot.class.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php index b65c01f6840..2b1b368ef8c 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -135,14 +135,14 @@ class Entrepot extends CommonObject */ function update($id, $user) { - $this->libelle=$this->db->escape(trim($this->libelle)); - $this->description=$this->db->escape(trim($this->description)); + $this->libelle=trim($this->libelle); + $this->description=trim($this->description); - $this->lieu=$this->db->escape(trim($this->lieu)); + $this->lieu=trim($this->lieu); - $this->address=$this->db->escape(trim($this->address)); - $this->zip=$this->zip?trim($this->zip):trim($this->zip); - $this->town=$this->town?trim($this->town):trim($this->town); + $this->address=trim($this->address); + $this->zip=trim($this->zip); + $this->town=trim($this->town); $this->country_id=($this->country_id > 0 ? $this->country_id : $this->country_id); $sql = "UPDATE ".MAIN_DB_PREFIX."entrepot "; From 8aaa1993c6b1107db00a180d6c36dbc6aa14fa2a Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Tue, 13 Oct 2015 09:37:33 +0200 Subject: [PATCH 10/58] FIX : #3724 Bug: Blank page after cloning proposal with changed client --- htdocs/comm/propal/class/propal.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index b818de76a0e..69f36c83136 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1063,7 +1063,7 @@ class Propal extends CommonObject { global $db, $user,$langs,$conf,$hookmanager; - dol_include_once('/projet/class.project.class.php'); + dol_include_once('/projet/class/project.class.php'); $this->context['createfromclone']='createfromclone'; From 00b610d87fec9815bb73626d52b27335512d1d23 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 14 Oct 2015 08:23:52 +0200 Subject: [PATCH 11/58] FIX : fix HTML into formconfirm box --- htdocs/core/class/html.form.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 87d177e5d7d..b75bd01d2aa 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -3233,7 +3233,7 @@ class Form if (! empty($more)) { $formconfirm.= '
'.$more.'
'; } - $formconfirm.= ($question ? '
': ''); + $formconfirm.= ($question ? '
'.img_help('','').' '.$question . '
': ''); $formconfirm.= '
'."\n"; $formconfirm.= "\n\n"; From 727db565765037705c50905c400d45ef17f77e3f Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 14 Oct 2015 08:27:56 +0200 Subject: [PATCH 12/58] FIX : #3724 Bug: Blank page after cloning proposal with changed client --- htdocs/comm/propal/class/propal.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index dbd03788293..c5c432610ee 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -961,7 +961,7 @@ class Propal extends CommonObject { global $db, $user,$langs,$conf,$hookmanager; - dol_include_once('/projet/class.project.class.php'); + dol_include_once('/projet/class/project.class.php'); $this->context['createfromclone']='createfromclone'; From 6b8707516e9ef2ea56827e2e724508034f0008b3 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 14 Oct 2015 10:05:42 +0200 Subject: [PATCH 13/58] FIX : skeleton class must use db->order rather than ORDER BY into fetchAll --- dev/skeletons/skeleton_class.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/skeletons/skeleton_class.class.php b/dev/skeletons/skeleton_class.class.php index 2f8c78556e1..1eeae9a9fd2 100644 --- a/dev/skeletons/skeleton_class.class.php +++ b/dev/skeletons/skeleton_class.class.php @@ -244,7 +244,7 @@ class Skeleton_Class extends CommonObject } if (!empty($sortfield)) { - $sql .= ' ORDER BY ' . $sortfield . ' ' . $sortorder; + $sql .= $this->db->order($sortfield,$sortorder); } if (!empty($limit)) { $sql .= ' ' . $this->db->plimit($limit + 1, $offset); From e9facbf1086fb9ee3674729cc6ab695848e70e5b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 14 Oct 2015 10:53:38 +0200 Subject: [PATCH 14/58] FIX bad property so after creating an event from calendar, filter were lost. --- htdocs/comm/action/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index 94905919022..32d5a34aa52 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -323,7 +323,7 @@ if ($action == 'add') unset($_SESSION['assignedtouser']); $moreparam=''; - if ($user->id != $object->ownerid) $moreparam="usertodo=-1"; // We force to remove filter so created record is visible when going back to per user view. + if ($user->id != $object->userownerid) $moreparam="usertodo=-1"; // We force to remove filter so created record is visible when going back to per user view. $db->commit(); if (! empty($backtopage)) From 68aac4476c7c2f5266a483dae30f48088614b3e0 Mon Sep 17 00:00:00 2001 From: fappels Date: Wed, 14 Oct 2015 12:16:54 +0200 Subject: [PATCH 15/58] FIX: #3605 deleting a shipping Get lots to move back to stock. Move lots back to stock. Do not log object because it will be deleted Improve error reporting --- htdocs/expedition/class/expedition.class.php | 97 ++++++++++++------- .../class/expeditionbatch.class.php | 9 +- 2 files changed, 69 insertions(+), 37 deletions(-) diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index b43afdfc206..6c2214c7e82 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -7,7 +7,7 @@ * Copyright (C) 2013 Florian Henry * Copyright (C) 2014 Cedric GROSS * Copyright (C) 2014-2015 Marcos García - * Copyright (C) 2014 Francis Appels + * Copyright (C) 2014-2015 Francis Appels * * 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 @@ -1002,7 +1002,7 @@ class Expedition extends CommonObject } } - /** + /** * Delete shipment. * Warning, do not delete a shipment if a delivery is linked to (with table llx_element_element) * @@ -1011,9 +1011,13 @@ class Expedition extends CommonObject function delete() { global $conf, $langs, $user; - require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + if ($conf->productbatch->enabled) + { + require_once DOL_DOCUMENT_ROOT.'/expedition/class/expeditionbatch.class.php'; + } $error=0; + $this->error=''; // Add a protection to refuse deleting if shipment has at least one delivery $this->fetchObjectLinked($this->id, 'shipping', 0, 'delivery'); // Get deliveries linked to this shipment @@ -1024,15 +1028,6 @@ class Expedition extends CommonObject } $this->db->begin(); - - if ($conf->productbatch->enabled) - { - require_once DOL_DOCUMENT_ROOT.'/expedition/class/expeditionbatch.class.php'; - if (ExpeditionLineBatch::deletefromexp($this->db,$this->id) < 0) - { - $error++;$this->errors[]="Error ".$this->db->lasterror(); - } - } // Stock control if ($conf->stock->enabled && $conf->global->STOCK_CALCULATE_ON_SHIPMENT && $this->statut > 0) { @@ -1041,7 +1036,7 @@ class Expedition extends CommonObject $langs->load("agenda"); // Loop on each product line to add a stock movement - $sql = "SELECT cd.fk_product, cd.subprice, ed.qty, ed.fk_entrepot"; + $sql = "SELECT cd.fk_product, cd.subprice, ed.qty, ed.fk_entrepot, ed.rowid as expeditiondet_id"; $sql.= " FROM ".MAIN_DB_PREFIX."commandedet as cd,"; $sql.= " ".MAIN_DB_PREFIX."expeditiondet as ed"; $sql.= " WHERE ed.fk_expedition = ".$this->id; @@ -1056,26 +1051,62 @@ class Expedition extends CommonObject { dol_syslog(get_class($this)."::delete movement index ".$i); $obj = $this->db->fetch_object($resql); - - //var_dump($this->lines[$i]); + $mouvS = new MouvementStock($this->db); - $mouvS->origin = &$this; - // We decrement stock of product (and sub-products) - // We use warehouse selected for each line - $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $obj->qty, $obj->subprice, $langs->trans("ShipmentDeletedInDolibarr",$this->ref)); - if ($result < 0) + // we do not log origin because it will be deleted + $mouvS->origin = null; + // get lot/serial + $lotArray = null; + if ($conf->productbatch->enabled) { - $error++; - break; + $lotArray = ExpeditionLineBatch::fetchAll($this->db,$obj->expeditiondet_id); + if (! is_array($lotArray)) + { + $error++;$this->errors[]="Error ".$this->db->lasterror(); + } } + if (empty($lotArray)) { + // no lot/serial + // We increment stock of product (and sub-products) + // We use warehouse selected for each line + $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $obj->qty, $obj->subprice, $langs->trans("ShipmentDeletedInDolibarr", $this->ref)); + if ($result < 0) + { + $error++;$this->errors=$this->errors + $mouvS->errors; + break; + } + } + else + { + // We increment stock of batches + // We use warehouse selected for each line + foreach($lotArray as $lot) + { + $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $lot->dluo_qty, $obj->subprice, $langs->trans("ShipmentDeletedInDolibarr", $this->ref), $lot->eatby, $lot->sellby, $lot->batch); + if ($result < 0) + { + $error++;$this->errors=$this->errors + $mouvS->errors; + break; + } + } + } } } else { - $error++; + $error++;$this->errors[]="Error ".$this->db->lasterror(); } } - + + // delete batch expedition line + if (! $error && $conf->productbatch->enabled) + { + if (ExpeditionLineBatch::deletefromexp($this->db,$this->id) < 0) + { + $error++;$this->errors[]="Error ".$this->db->lasterror(); + } + } + if (! $error) { $sql = "DELETE FROM ".MAIN_DB_PREFIX."expeditiondet"; @@ -1094,13 +1125,13 @@ class Expedition extends CommonObject if ($this->db->query($sql)) { - // Call trigger - $result=$this->call_trigger('SHIPPING_DELETE',$user); - if ($result < 0) { $error++; } - // End call triggers + // Call trigger + $result=$this->call_trigger('SHIPPING_DELETE',$user); + if ($result < 0) { $error++; } + // End call triggers - if (! $error) - { + if (! $error) + { $this->db->commit(); // We delete PDFs @@ -1127,8 +1158,8 @@ class Expedition extends CommonObject } return 1; - } - else + } + else { $this->db->rollback(); return -1; diff --git a/htdocs/expedition/class/expeditionbatch.class.php b/htdocs/expedition/class/expeditionbatch.class.php index fd424fc4990..49a59b726e1 100644 --- a/htdocs/expedition/class/expeditionbatch.class.php +++ b/htdocs/expedition/class/expeditionbatch.class.php @@ -189,11 +189,12 @@ class ExpeditionLineBatch extends CommonObject $sql.= " WHERE fk_expeditiondet=".(int) $id_line_expdet; dol_syslog(__METHOD__ ."", LOG_DEBUG); - $resql=$db->query($sql); - if ($resql) - { + $resql=$db->query($sql); + if ($resql) + { $num=$db->num_rows($resql); - $i=0; + $i=0; + $ret = array(); while ($i<$num) { $tmp=new self($db); From 6c2b46f9398645ea290ddef63680a52dc5446bdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 15 Oct 2015 10:13:52 +0200 Subject: [PATCH 16/58] Fix #3728 Properly remove last category --- htdocs/adherents/class/adherent.class.php | 10 ++++++---- htdocs/contact/class/contact.class.php | 10 ++++++---- htdocs/product/class/product.class.php | 10 ++++++---- htdocs/societe/class/societe.class.php | 10 ++++++---- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 29cc0aac249..de3b937094a 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -1991,12 +1991,14 @@ class Adherent extends CommonObject // Process foreach ($to_del as $del) { - $c->fetch($del); - $c->del_type($this, 'member'); + if ($c->fetch($del) > 0) { + $c->del_type($this, 'member'); + } } foreach ($to_add as $add) { - $c->fetch($add); - $c->add_type($this, 'member'); + if ($c->fetch($add) > 0) { + $c->add_type($this, 'member'); + } } return; diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index c48408ab281..7af2a763ad1 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -1155,12 +1155,14 @@ class Contact extends CommonObject // Process foreach ($to_del as $del) { - $c->fetch($del); - $c->del_type($this, 'contact'); + if ($c->fetch($del) > 0) { + $c->del_type($this, 'contact'); + } } foreach ($to_add as $add) { - $c->fetch($add); - $c->add_type($this, 'contact'); + if ($c->fetch($add) > 0) { + $c->add_type($this, 'contact'); + } } return; diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index a51a1a77c7b..6f4e37c8ab2 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -3976,12 +3976,14 @@ class Product extends CommonObject // Process foreach($to_del as $del) { - $c->fetch($del); - $c->del_type($this, 'product'); + if ($c->fetch($del) > 0) { + $c->del_type($this, 'product'); + } } foreach ($to_add as $add) { - $c->fetch($add); - $c->add_type($this, 'product'); + if ($c->fetch($add) > 0) { + $c->add_type($this, 'product'); + } } return; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index af54c7b8742..7bf8d6c45cf 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -3395,12 +3395,14 @@ class Societe extends CommonObject // Process foreach ($to_del as $del) { - $c->fetch($del); - $c->del_type($this, $type_text); + if ($c->fetch($del) > 0) { + $c->del_type($this, $type_text); + } } foreach ($to_add as $add) { - $c->fetch($add); - $c->add_type($this, $type_text); + if ($c->fetch($add) > 0) { + $c->add_type($this, $type_text); + } } return; From 4cdf17d8b5f405d6329a3bfda40139dbddd4d358 Mon Sep 17 00:00:00 2001 From: fmarcet Date: Thu, 15 Oct 2015 12:17:57 +0200 Subject: [PATCH 17/58] FIX #3689 Bug on workflow module --- htdocs/commande/class/commande.class.php | 186 +++++++++++------------ 1 file changed, 91 insertions(+), 95 deletions(-) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index e681bfc7726..16c889c6e61 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1045,116 +1045,112 @@ class Commande extends CommonOrder $error=0; - // Signed proposal - if ($object->statut == 2) + + $this->date_commande = dol_now(); + $this->source = 0; + + $num=count($object->lines); + for ($i = 0; $i < $num; $i++) { - $this->date_commande = dol_now(); - $this->source = 0; + $line = new OrderLine($this->db); - $num=count($object->lines); - for ($i = 0; $i < $num; $i++) - { - $line = new OrderLine($this->db); + $line->libelle = $object->lines[$i]->libelle; + $line->label = $object->lines[$i]->label; + $line->desc = $object->lines[$i]->desc; + $line->price = $object->lines[$i]->price; + $line->subprice = $object->lines[$i]->subprice; + $line->tva_tx = $object->lines[$i]->tva_tx; + $line->localtax1_tx = $object->lines[$i]->localtax1_tx; + $line->localtax2_tx = $object->lines[$i]->localtax2_tx; + $line->qty = $object->lines[$i]->qty; + $line->fk_remise_except = $object->lines[$i]->fk_remise_except; + $line->remise_percent = $object->lines[$i]->remise_percent; + $line->fk_product = $object->lines[$i]->fk_product; + $line->info_bits = $object->lines[$i]->info_bits; + $line->product_type = $object->lines[$i]->product_type; + $line->rang = $object->lines[$i]->rang; + $line->special_code = $object->lines[$i]->special_code; + $line->fk_parent_line = $object->lines[$i]->fk_parent_line; + $line->fk_unit = $object->lines[$i]->fk_unit; - $line->libelle = $object->lines[$i]->libelle; - $line->label = $object->lines[$i]->label; - $line->desc = $object->lines[$i]->desc; - $line->price = $object->lines[$i]->price; - $line->subprice = $object->lines[$i]->subprice; - $line->tva_tx = $object->lines[$i]->tva_tx; - $line->localtax1_tx = $object->lines[$i]->localtax1_tx; - $line->localtax2_tx = $object->lines[$i]->localtax2_tx; - $line->qty = $object->lines[$i]->qty; - $line->fk_remise_except = $object->lines[$i]->fk_remise_except; - $line->remise_percent = $object->lines[$i]->remise_percent; - $line->fk_product = $object->lines[$i]->fk_product; - $line->info_bits = $object->lines[$i]->info_bits; - $line->product_type = $object->lines[$i]->product_type; - $line->rang = $object->lines[$i]->rang; - $line->special_code = $object->lines[$i]->special_code; - $line->fk_parent_line = $object->lines[$i]->fk_parent_line; - $line->fk_unit = $object->lines[$i]->fk_unit; + $line->date_start = $object->lines[$i]->date_start; + $line->date_end = $object->lines[$i]->date_end; - $line->date_start = $object->lines[$i]->date_start; - $line->date_end = $object->lines[$i]->date_end; - - $line->fk_fournprice = $object->lines[$i]->fk_fournprice; - $marginInfos = getMarginInfos($object->lines[$i]->subprice, $object->lines[$i]->remise_percent, $object->lines[$i]->tva_tx, $object->lines[$i]->localtax1_tx, $object->lines[$i]->localtax2_tx, $object->lines[$i]->fk_fournprice, $object->lines[$i]->pa_ht); - $line->pa_ht = $marginInfos[0]; - $line->marge_tx = $marginInfos[1]; - $line->marque_tx = $marginInfos[2]; - - // get extrafields from original line - $object->lines[$i]->fetch_optionals($object->lines[$i]->rowid); - foreach($object->lines[$i]->array_options as $options_key => $value) - $line->array_options[$options_key] = $value; - - $this->lines[$i] = $line; - } - - $this->socid = $object->socid; - $this->fk_project = $object->fk_project; - $this->cond_reglement_id = $object->cond_reglement_id; - $this->mode_reglement_id = $object->mode_reglement_id; - $this->fk_account = $object->fk_account; - $this->availability_id = $object->availability_id; - $this->demand_reason_id = $object->demand_reason_id; - $this->date_livraison = $object->date_livraison; - $this->shipping_method_id = $object->shipping_method_id; - $this->fk_delivery_address = $object->fk_delivery_address; - $this->contact_id = $object->contactid; - $this->ref_client = $object->ref_client; - $this->note_private = $object->note_private; - $this->note_public = $object->note_public; - - $this->origin = $object->element; - $this->origin_id = $object->id; + $line->fk_fournprice = $object->lines[$i]->fk_fournprice; + $marginInfos = getMarginInfos($object->lines[$i]->subprice, $object->lines[$i]->remise_percent, $object->lines[$i]->tva_tx, $object->lines[$i]->localtax1_tx, $object->lines[$i]->localtax2_tx, $object->lines[$i]->fk_fournprice, $object->lines[$i]->pa_ht); + $line->pa_ht = $marginInfos[0]; + $line->marge_tx = $marginInfos[1]; + $line->marque_tx = $marginInfos[2]; // get extrafields from original line - $object->fetch_optionals($object->id); + $object->lines[$i]->fetch_optionals($object->lines[$i]->rowid); + foreach($object->lines[$i]->array_options as $options_key => $value) + $line->array_options[$options_key] = $value; - $e = new ExtraFields($db); - $element_extrafields = $e->fetch_name_optionals_label($this->element); + $this->lines[$i] = $line; + } - foreach($object->array_options as $options_key => $value) { - if(array_key_exists(str_replace('options_', '', $options_key), $element_extrafields)){ - $this->array_options[$options_key] = $value; - } + $this->socid = $object->socid; + $this->fk_project = $object->fk_project; + $this->cond_reglement_id = $object->cond_reglement_id; + $this->mode_reglement_id = $object->mode_reglement_id; + $this->fk_account = $object->fk_account; + $this->availability_id = $object->availability_id; + $this->demand_reason_id = $object->demand_reason_id; + $this->date_livraison = $object->date_livraison; + $this->shipping_method_id = $object->shipping_method_id; + $this->fk_delivery_address = $object->fk_delivery_address; + $this->contact_id = $object->contactid; + $this->ref_client = $object->ref_client; + $this->note_private = $object->note_private; + $this->note_public = $object->note_public; + + $this->origin = $object->element; + $this->origin_id = $object->id; + + // get extrafields from original line + $object->fetch_optionals($object->id); + + $e = new ExtraFields($db); + $element_extrafields = $e->fetch_name_optionals_label($this->element); + + foreach($object->array_options as $options_key => $value) { + if(array_key_exists(str_replace('options_', '', $options_key), $element_extrafields)){ + $this->array_options[$options_key] = $value; } - // Possibility to add external linked objects with hooks - $this->linked_objects[$this->origin] = $this->origin_id; - if (is_array($object->other_linked_objects) && ! empty($object->other_linked_objects)) + } + // Possibility to add external linked objects with hooks + $this->linked_objects[$this->origin] = $this->origin_id; + if (is_array($object->other_linked_objects) && ! empty($object->other_linked_objects)) + { + $this->linked_objects = array_merge($this->linked_objects, $object->other_linked_objects); + } + + $ret = $this->create($user); + + if ($ret > 0) + { + // Actions hooked (by external module) + $hookmanager->initHooks(array('orderdao')); + + $parameters=array('objFrom'=>$object); + $action=''; + $reshook=$hookmanager->executeHooks('createFrom',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + if ($reshook < 0) $error++; + + if (! $error) { - $this->linked_objects = array_merge($this->linked_objects, $object->other_linked_objects); - } - - $ret = $this->create($user); - - if ($ret > 0) - { - // Actions hooked (by external module) - $hookmanager->initHooks(array('orderdao')); - - $parameters=array('objFrom'=>$object); - $action=''; - $reshook=$hookmanager->executeHooks('createFrom',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks - if ($reshook < 0) $error++; - - if (! $error) + // Ne pas passer par la commande provisoire + if ($conf->global->COMMANDE_VALID_AFTER_CLOSE_PROPAL == 1) { - // Ne pas passer par la commande provisoire - if ($conf->global->COMMANDE_VALID_AFTER_CLOSE_PROPAL == 1) - { - $this->fetch($ret); - $this->valid($user); - } - return $ret; + $this->fetch($ret); + $this->valid($user); } - else return -1; + return $ret; } else return -1; } - else return 0; + else return -1; } From 2c6aeac64f53b8eb88aaf8797975500c01692897 Mon Sep 17 00:00:00 2001 From: Gauthier Date: Thu, 15 Oct 2015 16:48:52 +0200 Subject: [PATCH 18/58] FIX : Societe::set_parent() function needs societe object to be fetched to update parent --- htdocs/societe/class/societe.class.php | 1 + htdocs/societe/soc.php | 1 + 2 files changed, 2 insertions(+) diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 7bf8d6c45cf..cd68317c709 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -2468,6 +2468,7 @@ class Societe extends CommonObject $resql=$this->db->query($sql); if ($resql) { + $this->parent = $id; return 1; } else diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php index be879efecf5..b376a8c2765 100644 --- a/htdocs/societe/soc.php +++ b/htdocs/societe/soc.php @@ -649,6 +649,7 @@ if (empty($reshook)) // Set parent company if ($action == 'set_thirdparty' && $user->rights->societe->creer) { + $object->fetch($socid); $result = $object->set_parent(GETPOST('editparentcompany','int')); } From 6bd13b8071b87a8251b0b0c6aaa941b853011740 Mon Sep 17 00:00:00 2001 From: arnaud Date: Thu, 15 Oct 2015 16:53:28 +0200 Subject: [PATCH 19/58] FIX bug invoice classified in propale next update commonobject class in 3.8 --- htdocs/comm/propal/class/propal.class.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 69f36c83136..71295e94f70 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -2124,26 +2124,26 @@ class Propal extends CommonObject $this->fetchObjectLinked($id,$this->element); foreach($this->linkedObjectsIds as $objecttype => $objectid) { - $numi=count($objectid); - for ($i=0;$i<$numi;$i++) + // Nouveau système du comon object renvoi des rowid et non un id linéaire de 1 à n + // On parcourt donc une liste d'objets en tant qu'objet unique + foreach($objectid as $key => $object) { // Cas des factures liees directement if ($objecttype == 'facture') { - $linkedInvoices[] = $objectid[$i]; + $linkedInvoices[] = $object; } // Cas des factures liees par un autre objet (ex: commande) else { - $this->fetchObjectLinked($objectid[$i],$objecttype); + $this->fetchObjectLinked($object,$objecttype); foreach($this->linkedObjectsIds as $subobjecttype => $subobjectid) { - $numj=count($subobjectid); - for ($j=0;$j<$numj;$j++) + foreach($subobjectid as $subkey => $subobject) { if ($subobjecttype == 'facture') { - $linkedInvoices[] = $subobjectid[$j]; + $linkedInvoices[] = $subobject; } } } From b3e3cc14a7ebcc0c01fbbf31081414c62b83b656 Mon Sep 17 00:00:00 2001 From: Gauthier Date: Thu, 15 Oct 2015 17:26:16 +0200 Subject: [PATCH 20/58] FIX : 1/ update_extra() function musn't be in "if(!empty(MAIN_DISABLE_CONTACTS_TAB)" test. 2/ Reindented code --- htdocs/compta/facture.php | 78 +++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index b96edc31b2c..de0a591cf98 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -1737,40 +1737,41 @@ if (empty($reshook)) $result = $object->add_contact($contactid, $_POST["type"], $_POST["source"]); } - if ($result >= 0) { - header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $object->id); - exit(); - } else { - if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') { - $langs->load("errors"); - setEventMessage($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), 'errors'); + if ($result >= 0) { + header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $object->id); + exit(); } else { - setEventMessage($object->error, 'errors'); + if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') { + $langs->load("errors"); + setEventMessage($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), 'errors'); + } else { + setEventMessage($object->error, 'errors'); + } } } - } - - // bascule du statut d'un contact - else if ($action == 'swapstatut') - { - if ($object->fetch($id)) { - $result = $object->swapContactStatus(GETPOST('ligne')); - } else { - dol_print_error($db); + + // bascule du statut d'un contact + else if ($action == 'swapstatut') + { + if ($object->fetch($id)) { + $result = $object->swapContactStatus(GETPOST('ligne')); + } else { + dol_print_error($db); + } + } + + // Efface un contact + else if ($action == 'deletecontact') + { + $object->fetch($id); + $result = $object->delete_contact($lineid); + + if ($result >= 0) { + header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $object->id); + exit(); + } else { + dol_print_error($db); } - } - - // Efface un contact - else if ($action == 'deletecontact') - { - $object->fetch($id); - $result = $object->delete_contact($lineid); - - if ($result >= 0) { - header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $object->id); - exit(); - } else { - dol_print_error($db); } } @@ -1790,17 +1791,16 @@ if (empty($reshook)) $reshook = $hookmanager->executeHooks('insertExtraFields', $parameters, $object, $action); // Note that $action and $object may have been modified by // some hooks if (empty($reshook)) { - $result = $object->insertExtraFields(); - if ($result < 0) { - $error ++; - } - } else if ($reshook < 0) + $result = $object->insertExtraFields(); + if ($result < 0) { $error ++; - } - - if ($error) - $action = 'edit_extras'; + } + } else if ($reshook < 0) + $error ++; } + + if ($error) + $action = 'edit_extras'; } } From d68db2a844231880780b75901abd9b74f6b77d72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 17 Oct 2015 08:48:53 +0200 Subject: [PATCH 21/58] Update fournisseur.commande.class.php --- htdocs/fourn/class/fournisseur.commande.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 54022429fb3..492663295b8 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -460,6 +460,7 @@ class CommandeFournisseur extends CommonOrder { $result = 1; $this->log($user, 1, time()); // Statut 1 + $this->statut = 1; $this->ref = $num; } From 0211ad64eed4de33aec6bf0e966cbf449aca96eb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 17 Oct 2015 12:28:47 +0200 Subject: [PATCH 22/58] FIX Total in summary was not same than into detail on the referrer page. Conflicts: htdocs/product/stats/facture.php --- htdocs/product/stats/commande.php | 4 ++-- htdocs/product/stats/commande_fournisseur.php | 4 ++-- htdocs/product/stats/facture.php | 24 +++++++++++-------- htdocs/product/stats/facture_fournisseur.php | 2 +- htdocs/product/stats/propal.php | 2 +- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/htdocs/product/stats/commande.php b/htdocs/product/stats/commande.php index 9491b18da1e..42925a704ec 100644 --- a/htdocs/product/stats/commande.php +++ b/htdocs/product/stats/commande.php @@ -128,9 +128,9 @@ if ($id > 0 || ! empty($ref)) if ($user->rights->commande->lire) { - $sql = "SELECT distinct s.nom as name, s.rowid as socid, s.code_client, c.rowid, d.total_ht as total_ht, c.ref,"; + $sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, s.code_client, c.rowid, d.total_ht as total_ht, c.ref,"; $sql .= " c.ref_client,"; - $sql.= " c.date_commande, c.fk_statut as statut, c.facture, c.rowid as commandeid, d.qty"; + $sql.= " c.date_commande, c.fk_statut as statut, c.facture, c.rowid as commandeid, d.rowid, d.qty"; if (!$user->rights->societe->client->voir && !$socid) $sql.= ", sc.fk_soc, sc.fk_user "; $sql.= " FROM ".MAIN_DB_PREFIX."societe as s"; $sql.= ", ".MAIN_DB_PREFIX."commande as c"; diff --git a/htdocs/product/stats/commande_fournisseur.php b/htdocs/product/stats/commande_fournisseur.php index e7a803c299c..0516163b2a1 100644 --- a/htdocs/product/stats/commande_fournisseur.php +++ b/htdocs/product/stats/commande_fournisseur.php @@ -135,9 +135,9 @@ if ($id > 0 || ! empty($ref)) { print ''; if ($user->rights->fournisseur->commande->lire) { - $sql = "SELECT distinct s.nom as name, s.rowid as socid, s.code_client,"; + $sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, s.code_client,"; $sql .= " c.rowid, d.total_ht as total_ht, c.ref,"; - $sql .= " c.date_commande, c.fk_statut as statut, c.rowid as commandeid, d.qty"; + $sql .= " c.date_commande, c.fk_statut as statut, c.rowid as commandeid, d.rowid, d.qty"; if (! $user->rights->societe->client->voir && ! $socid) $sql .= ", sc.fk_soc, sc.fk_user "; $sql .= " FROM " . MAIN_DB_PREFIX . "societe as s"; diff --git a/htdocs/product/stats/facture.php b/htdocs/product/stats/facture.php index 2a79b97e399..9c400dcdeaa 100644 --- a/htdocs/product/stats/facture.php +++ b/htdocs/product/stats/facture.php @@ -128,10 +128,11 @@ if ($id > 0 || ! empty($ref)) print ''; - if ($user->rights->facture->lire) { - $sql = "SELECT distinct s.nom as name, s.rowid as socid, s.code_client,"; - $sql.= " f.facnumber, d.total_ht as total_ht,"; - $sql.= " f.datef, f.paye, f.fk_statut as statut, f.rowid as facid, d.qty"; + if ($user->rights->facture->lire) + { + $sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, s.code_client,"; + $sql.= " f.facnumber, f.datef, f.paye, f.fk_statut as statut, f.rowid as facid,"; + $sql.= " d.rowid, d.total_ht as total_ht, d.qty"; // We must keep the d.rowid here to not loose record because of the distinct used to ignore duplicate line when link on societe_commerciaux is used if (!$user->rights->societe->client->voir && !$socid) $sql.= ", sc.fk_soc, sc.fk_user "; $sql.= " FROM ".MAIN_DB_PREFIX."societe as s"; $sql.= ", ".MAIN_DB_PREFIX."facture as f"; @@ -147,24 +148,27 @@ if ($id > 0 || ! empty($ref)) $sql.= ' AND YEAR(f.datef) IN (' . $search_year . ')'; if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; if ($socid) $sql.= " AND f.fk_soc = ".$socid; - $sql.= " ORDER BY $sortfield $sortorder "; + $sql.= $db->order($sortfield, $sortorder); //Calcul total qty and amount for global if full scan list $total_ht=0; $total_qty=0; $totalrecords=0; - if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { + if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) + { $result = $db->query($sql); - if ($result) { + if ($result) + { $totalrecords = $db->num_rows($result); - while ($objp = $db->fetch_object($result)) { + while ($objp = $db->fetch_object($result)) + { $total_ht+=$objp->total_ht; $total_qty+=$objp->qty; } } } - $sql.= $db->plimit($conf->liste_limit +1, $offset); + $sql.= $db->plimit($conf->liste_limit + 1, $offset); $result = $db->query($sql); if ($result) @@ -214,7 +218,7 @@ if ($id > 0 || ! empty($ref)) if ($num > 0) { $var=True; - while ($i < $num && $i < $conf->liste_limit) + while ($i < min($num,$conf->liste_limit)) { $objp = $db->fetch_object($result); $var=!$var; diff --git a/htdocs/product/stats/facture_fournisseur.php b/htdocs/product/stats/facture_fournisseur.php index 9b56cee7552..5ce40658d0d 100644 --- a/htdocs/product/stats/facture_fournisseur.php +++ b/htdocs/product/stats/facture_fournisseur.php @@ -130,7 +130,7 @@ if ($id > 0 || ! empty($ref)) if ($user->rights->fournisseur->facture->lire) { - $sql = "SELECT distinct s.nom as name, s.rowid as socid, s.code_client, f.ref, d.total_ht as total_ht,"; + $sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, s.code_client, f.ref, d.rowid, d.total_ht as total_ht,"; $sql .= " f.datef, f.paye, f.fk_statut as statut, f.rowid as facid, d.qty"; if (! $user->rights->societe->client->voir && ! $socid) $sql .= ", sc.fk_soc, sc.fk_user "; diff --git a/htdocs/product/stats/propal.php b/htdocs/product/stats/propal.php index 690f9c8c421..84d1ba72a80 100644 --- a/htdocs/product/stats/propal.php +++ b/htdocs/product/stats/propal.php @@ -129,7 +129,7 @@ if ($id > 0 || ! empty($ref)) if ($user->rights->propale->lire) { $sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, p.rowid as propalid, p.ref, d.total_ht as amount,"; $sql .= " p.ref_client,"; - $sql .= "p.datep, p.fk_statut as statut, d.qty"; + $sql .= "p.datep, p.fk_statut as statut, d.rowid, d.qty"; if (! $user->rights->societe->client->voir && ! $socid) $sql .= ", sc.fk_soc, sc.fk_user "; $sql .= " FROM " . MAIN_DB_PREFIX . "societe as s"; From 334c14d088c0f22805247917770dbcc5f6a8e3f8 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Sun, 18 Oct 2015 11:56:42 +0200 Subject: [PATCH 23/58] Fix: Last page total is 0 --- htdocs/compta/bank/account.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/bank/account.php b/htdocs/compta/bank/account.php index 10e9674ec8d..32284874797 100644 --- a/htdocs/compta/bank/account.php +++ b/htdocs/compta/bank/account.php @@ -952,7 +952,7 @@ if ($id > 0 || ! empty($ref)) if ($sep > 0) print ' '; // If we had at least one line in future else print $langs->trans("CurrentBalance"); print ' '.$object->currency_code.''; - print ''.price($solde, 0, $langs, 0, 0, -1, $object->currency_code).''; + print ''.price($total, 0, $langs, 0, 0, -1, $object->currency_code).''; print ' '; print ''; } else { From c51bc09e3974b940dd5aaaaebddf28f142776a52 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Oct 2015 18:54:54 +0200 Subject: [PATCH 24/58] FIX The preview of PDF was never refreshed if PDF document was changed --- htdocs/comm/propal/apercu.php | 2 +- htdocs/commande/apercu.php | 2 +- htdocs/compta/facture/apercu.php | 2 +- htdocs/fichinter/apercu.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/comm/propal/apercu.php b/htdocs/comm/propal/apercu.php index 87281e7ea63..837dc48c670 100644 --- a/htdocs/comm/propal/apercu.php +++ b/htdocs/comm/propal/apercu.php @@ -144,7 +144,7 @@ if ($id > 0 || ! empty($ref)) print "\n"; // Conversion du PDF en image png si fichier png non existant - if (! file_exists($fileimage) && ! file_exists($fileimagebis)) + if ((! file_exists($fileimage) && ! file_exists($fileimagebis)) || (filemtime($fileimage) < filemtime($file))) { if (class_exists("Imagick")) { diff --git a/htdocs/commande/apercu.php b/htdocs/commande/apercu.php index f3d83b837dd..5d65ba1a493 100644 --- a/htdocs/commande/apercu.php +++ b/htdocs/commande/apercu.php @@ -142,7 +142,7 @@ if ($id > 0 || ! empty($ref)) print "\n"; // Conversion du PDF en image png si fichier png non existant - if (! file_exists($fileimage) && ! file_exists($fileimagebis)) + if ((! file_exists($fileimage) && ! file_exists($fileimagebis)) || (filemtime($fileimage) < filemtime($file))) { if (class_exists("Imagick")) { diff --git a/htdocs/compta/facture/apercu.php b/htdocs/compta/facture/apercu.php index 340df8172dc..b649dd43c43 100644 --- a/htdocs/compta/facture/apercu.php +++ b/htdocs/compta/facture/apercu.php @@ -280,7 +280,7 @@ if ($id > 0 || ! empty($ref)) print "\n"; // Conversion du PDF en image png si fichier png non existant - if (! file_exists($fileimage) && ! file_exists($fileimagebis)) + if ((! file_exists($fileimage) && ! file_exists($fileimagebis)) || (filemtime($fileimage) < filemtime($file))) { if (class_exists("Imagick")) { diff --git a/htdocs/fichinter/apercu.php b/htdocs/fichinter/apercu.php index 0d4d3421538..9e08fae27ab 100644 --- a/htdocs/fichinter/apercu.php +++ b/htdocs/fichinter/apercu.php @@ -124,7 +124,7 @@ if ($id > 0 || ! empty($ref)) print "\n"; // Conversion du PDF en image png si fichier png non existant - if (! file_exists($fileimage) && ! file_exists($fileimagebis)) + if ((! file_exists($fileimage) && ! file_exists($fileimagebis)) || (filemtime($fileimage) < filemtime($file))) { if (class_exists("Imagick")) { From 420bfd8301ba8f9b7950338a26014b844e073d2b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Oct 2015 19:09:35 +0200 Subject: [PATCH 25/58] FIX Preview pages was not using correct style for ref --- htdocs/comm/propal/apercu.php | 13 ++++++++----- htdocs/commande/apercu.php | 11 ++++++++--- htdocs/compta/facture/apercu.php | 20 ++++++++++++++++---- htdocs/fichinter/apercu.php | 29 +++++++++++++++-------------- 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/htdocs/comm/propal/apercu.php b/htdocs/comm/propal/apercu.php index 837dc48c670..cdeacefafe1 100644 --- a/htdocs/comm/propal/apercu.php +++ b/htdocs/comm/propal/apercu.php @@ -47,8 +47,9 @@ $result = restrictedArea($user, 'propal', $id); * View Mode */ -llxHeader(); +$form = new Form($db); +llxHeader(); if ($id > 0 || ! empty($ref)) { @@ -68,10 +69,12 @@ if ($id > 0 || ! empty($ref)) */ print ''; - // Ref - print ''; - print ''; - print ''; + $linkback = '' . $langs->trans("BackToList") . ''; + + // Ref + print ''; // Ref client print ''; diff --git a/htdocs/commande/apercu.php b/htdocs/commande/apercu.php index 5d65ba1a493..1ec3a0533cc 100644 --- a/htdocs/commande/apercu.php +++ b/htdocs/commande/apercu.php @@ -47,6 +47,8 @@ $result=restrictedArea($user,'commande',$id,''); * View Mode */ +$form = new Form($db); + llxHeader('',$langs->trans('Order'),'EN:Customers_Orders|FR:Commandes_Clients|ES:Pedidos de clientes'); if ($id > 0 || ! empty($ref)) @@ -64,9 +66,12 @@ if ($id > 0 || ! empty($ref)) print '
'.$langs->trans('Ref').''.$object->ref.'
' . $langs->trans('Ref') . ''; + print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref', ''); + print '
'.$langs->trans('RefCustomer').'
'; - // Ref - print '"; - print ''; + //$linkback = '' . $langs->trans("BackToList") . ''; + + // Ref + print ''; // Ref cde client print ''; diff --git a/htdocs/compta/facture/apercu.php b/htdocs/compta/facture/apercu.php index b649dd43c43..1172769e95a 100644 --- a/htdocs/compta/facture/apercu.php +++ b/htdocs/compta/facture/apercu.php @@ -29,6 +29,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/invoice.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; if (! empty($conf->projet->enabled)) require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; @@ -79,10 +80,21 @@ if ($id > 0 || ! empty($ref)) */ print '
'.$langs->trans("Ref")."'.$object->ref.'
' . $langs->trans('Ref') . ''; + print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref', ''); + print '
'.$langs->trans('RefCustomer').'
'; - // Ref - print ''; - print ''; - print ''; + $linkback = '' . $langs->trans("BackToList") . ''; + + // Ref + print ''; // Ref customer print ''; diff --git a/htdocs/fichinter/apercu.php b/htdocs/fichinter/apercu.php index 9e08fae27ab..04ed6b71e19 100644 --- a/htdocs/fichinter/apercu.php +++ b/htdocs/fichinter/apercu.php @@ -72,13 +72,21 @@ if ($id > 0 || ! empty($ref)) */ print '
'.$langs->trans('Ref').''.$object->ref.'
' . $langs->trans('Ref') . ''; + $morehtmlref = ''; + $discount = new DiscountAbsolute($db); + $result = $discount->fetch(0, $object->id); + if ($result > 0) { + $morehtmlref = ' (' . $langs->trans("CreditNoteConvertedIntoDiscount", $discount->getNomUrl(1, 'discount')) . ')'; + } + if ($result < 0) { + dol_print_error('', $discount->error); + } + print $form->showrefnav($object, 'ref', $linkback, 1, 'facnumber', 'ref', $morehtmlref); + print '
'.$langs->trans('RefCustomer').'
'; - // Ref - print '"; - print ''; + $linkback = ''.$langs->trans("BackToList").''; + + // Ref + print ''; - $nbrow=4; + $nbrow=3; + // Client + print ""; + print ''; print '"; - // Client - print ""; - print ''; - print ''; - // Statut print ''; - print "\n"; + print "\n"; print ''; // Date print ''; - print "\n"; + print "\n"; print ''; print '
'.$langs->trans("Ref")."'.$object->ref.'
'.$langs->trans("Ref").''; + print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref'); + print '
".$langs->trans("Customer")."'; + print ''.$soc->name.''; + print ''; - + /* * Documents */ @@ -141,21 +149,14 @@ if ($id > 0 || ! empty($ref)) print "
".$langs->trans("Customer")."'; - print ''.$soc->name.''; - print '
'.$langs->trans("Status").'".$object->getLibStatut(4)."".$object->getLibStatut(4)."
'.$langs->trans("Date").'".dol_print_date($object->datec,"daytext")."".dol_print_date($object->datec,"daytext")."
'; From c64c1a0201f00e6b7d83f36e3ffa996c911b9fcf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Oct 2015 20:11:26 +0200 Subject: [PATCH 26/58] FIX If no end date is set on survey, we should be able to vote. --- htdocs/public/opensurvey/studs.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/public/opensurvey/studs.php b/htdocs/public/opensurvey/studs.php index 1d2d6d2d1e6..f522bc0ac14 100644 --- a/htdocs/public/opensurvey/studs.php +++ b/htdocs/public/opensurvey/studs.php @@ -1,6 +1,6 @@ - * Copyright (C) 2014 Marcos García +/* Copyright (C) 2013-2015 Laurent Destailleur + * Copyright (C) 2014 Marcos García * * 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 @@ -46,7 +46,7 @@ if ($result <= 0) dol_print_error('','Failed to get survey id '.$numsondage); $nblignes=$object->fetch_lines(); //If the survey has not yet finished, then it can be modified -$canbemodified = ($object->date_fin > dol_now()); +$canbemodified = (empty($object->date_fin) || $object->date_fin > dol_now()); /* From afe4057a976abd8d834a2cf698c249ff40ed83f7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Oct 2015 21:17:19 +0200 Subject: [PATCH 27/58] FIX #3757 Can't set amount in a social contribution with some languages --- htdocs/compta/sociales/charges.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/htdocs/compta/sociales/charges.php b/htdocs/compta/sociales/charges.php index 7be1360287c..74e4d3f8aff 100644 --- a/htdocs/compta/sociales/charges.php +++ b/htdocs/compta/sociales/charges.php @@ -79,7 +79,7 @@ if ($action == 'add' && $user->rights->tax->charges->creer) { $dateech=@dol_mktime(GETPOST('echhour'),GETPOST('echmin'),GETPOST('echsec'),GETPOST('echmonth'),GETPOST('echday'),GETPOST('echyear')); $dateperiod=@dol_mktime(GETPOST('periodhour'),GETPOST('periodmin'),GETPOST('periodsec'),GETPOST('periodmonth'),GETPOST('periodday'),GETPOST('periodyear')); - $amount=GETPOST('amount'); + $amount=price2num(GETPOST('amount')); $actioncode=GETPOST('actioncode'); if (! $dateech) { @@ -114,7 +114,7 @@ if ($action == 'add' && $user->rights->tax->charges->creer) $chargesociales->lib=GETPOST('label'); $chargesociales->date_ech=$dateech; $chargesociales->periode=$dateperiod; - $chargesociales->amount=price2num($amount); + $chargesociales->amount=$amount; $id=$chargesociales->create($user); if ($id <= 0) @@ -130,7 +130,7 @@ if ($action == 'update' && ! $_POST["cancel"] && $user->rights->tax->charges->cr { $dateech=dol_mktime(GETPOST('echhour'),GETPOST('echmin'),GETPOST('echsec'),GETPOST('echmonth'),GETPOST('echday'),GETPOST('echyear')); $dateperiod=dol_mktime(GETPOST('periodhour'),GETPOST('periodmin'),GETPOST('periodsec'),GETPOST('periodmonth'),GETPOST('periodday'),GETPOST('periodyear')); - $amount=GETPOST('amount'); + $amount=price2num(GETPOST('amount')); if (! $dateech) { setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentities("DateDue")), 'errors'); @@ -146,7 +146,12 @@ if ($action == 'update' && ! $_POST["cancel"] && $user->rights->tax->charges->cr setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentities("Amount")), 'errors'); $action = 'edit'; } - else + elseif (! is_numeric($amount)) + { + setEventMessage($langs->trans("ErrorFieldMustBeANumeric",$langs->transnoentities("Amount")), 'errors'); + $action = 'create'; + } + else { $chargesociales=new ChargeSociales($db); $result=$chargesociales->fetch($id); From fd3ba131307c9cc54f69d8f7186b2786e73da9a6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Oct 2015 21:33:47 +0200 Subject: [PATCH 28/58] FIX #3541 Bypass authentication when user was created using LDAP --- htdocs/core/login/functions_dolibarr.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/login/functions_dolibarr.php b/htdocs/core/login/functions_dolibarr.php index 36596165191..c421fdb1aeb 100644 --- a/htdocs/core/login/functions_dolibarr.php +++ b/htdocs/core/login/functions_dolibarr.php @@ -91,7 +91,7 @@ function check_user_password_dolibarr($usertotest,$passwordtotest,$entitytotest= if (! $passok) { if ((! $passcrypted || $passtyped) - && ($passtyped == $passclear)) + && ($passclear && ($passtyped == $passclear))) { $passok=true; dol_syslog("functions_dolibarr::check_user_password_dolibarr Authentification ok - found pass in database"); From 6a90431cf1d4f0853041538203f461a05ff91d3b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 19 Oct 2015 14:04:47 +0200 Subject: [PATCH 29/58] Prepare 3.8.2 --- htdocs/filefunc.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index ea369d8aff3..415a7addf4a 100644 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -30,7 +30,7 @@ * \brief File that include conf.php file and commons lib like functions.lib.php */ -if (! defined('DOL_VERSION')) define('DOL_VERSION','3.8.1'); +if (! defined('DOL_VERSION')) define('DOL_VERSION','3.8.2'); if (! defined('EURO')) define('EURO',chr(128)); From 9e9f32e3bf848dc965de0a55c99c89ff6798d7bc Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Mon, 19 Oct 2015 15:38:28 +0200 Subject: [PATCH 30/58] FIX : project was not retrieved on invoice creation form --- htdocs/compta/facture.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index de0a591cf98..6368dd00831 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -1877,7 +1877,7 @@ if ($action == 'create') $objectsrc->fetch_lines(); $objectsrc->fetch_thirdparty(); - $projectid = (! empty($objectsrc->fk_project) ? $objectsrc->fk_project : ''); + $projectid = (! empty($projectid) ? $projectid : $objectsrc->fk_project); $ref_client = (! empty($objectsrc->ref_client) ? $objectsrc->ref_client : ''); $ref_int = (! empty($objectsrc->ref_int) ? $objectsrc->ref_int : ''); @@ -2257,9 +2257,6 @@ if ($action == 'create') // Project if (! empty($conf->projet->enabled) && $socid > 0) { - $projectid = GETPOST('projectid')?GETPOST('projectid'):0; - if ($origin == 'project') $projectid = ($originid ? $originid : 0); - $langs->load('projects'); print '' . $langs->trans('Project') . ''; $numprojet = $formproject->select_projects($soc->id, $projectid, 'projectid', 0); From 5fb6705b5c57e14523c71f655b3231d0ab394ece Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Mon, 19 Oct 2015 15:53:13 +0200 Subject: [PATCH 31/58] FIX : Search status not saved into list --- htdocs/compta/facture/list.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 2f87ff09e8b..2adab72dc1c 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -270,6 +270,7 @@ if ($resql) if ($search_user > 0) $param.='&search_user=' .$search_user; if ($search_montant_ht != '') $param.='&search_montant_ht='.$search_montant_ht; if ($search_montant_ttc != '') $param.='&search_montant_ttc='.$search_montant_ttc; + if ($search_status != '') $param.='&search_status='.$search_status; print_barre_liste($langs->trans('BillsCustomers').' '.($socid?' '.$soc->name:''),$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords,'title_accountancy.png'); $i = 0; From 572be23fc1e2716b64ae584d5ea288b4b9831e72 Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Mon, 19 Oct 2015 15:57:23 +0200 Subject: [PATCH 32/58] FIX : filters on supplier invoices list are not used, search_status instead --- htdocs/fourn/facture/list.php | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index dc8adddec39..a2b48c253df 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -81,7 +81,6 @@ $year = GETPOST("year","int"); $day_lim = GETPOST('day_lim','int'); $month_lim = GETPOST('month_lim','int'); $year_lim = GETPOST('year_lim','int'); -$filter = GETPOST("filtre"); if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test must be present to be compatible with all browsers { @@ -91,9 +90,9 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both $search_company=""; $search_amount_no_tax=""; $search_amount_all_tax=""; + $search_status=""; $year=""; $month=""; - $filter=""; } /* @@ -147,15 +146,6 @@ if ($socid) { $sql .= " AND s.rowid = ".$socid; } -if ($filter && $filter != -1) // GETPOST('filtre') may be a string -{ - $filtrearr = explode(",", $filter); - foreach ($filtrearr as $fil) - { - $filt = explode(":", $fil); - $sql .= " AND " . $filt[0] . " = " . $filt[1]; - } -} if ($search_ref) { @@ -214,7 +204,7 @@ if ($search_amount_all_tax != '') if ($search_status != '') { - $sql.= " AND fac.fk_statut = '".$db->escape($search_status)."'"; + $sql.= " AND fac.fk_statut = ".$search_status; } $nbtotalofrecords = 0; @@ -248,7 +238,7 @@ if ($resql) if ($search_company) $param.='&search_company='.urlencode($search_company); if ($search_amount_no_tax) $param.='&search_amount_no_tax='.urlencode($search_amount_no_tax); if ($search_amount_all_tax) $param.='&search_amount_all_tax='.urlencode($search_amount_all_tax); - if ($filter && $filter != -1) $param.='&filtre='.urlencode($filter); + if ($search_status >= 0) $param.="&search_status=".$search_status; print_barre_liste($langs->trans("BillsSuppliers").($socid?" $soc->name.":""),$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords); print '
'; @@ -305,8 +295,8 @@ if ($resql) print ''; print ''; print ''; - $liststatus=array('fac.fk_statut:0'=>$langs->trans("Draft"),'fac.fk_statut:1,paye:0'=>$langs->trans("Unpaid"), 'paye:1'=>$langs->trans("Paid")); - print $form->selectarray('filtre', $liststatus, $filter, 1); + $liststatus=array('0'=>$langs->trans("Draft"),'1'=>$langs->trans("Unpaid"), '2'=>$langs->trans("Paid")); + print $form->selectarray('filtre', $liststatus, $search_status, 1); print ''; print ''; print ''; From d79fb7198762e09f0c07055f1086211878dc7f8b Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Mon, 19 Oct 2015 16:17:47 +0200 Subject: [PATCH 33/58] FIX : search_status not used in mergefusiontool --- htdocs/compta/facture/mergepdftool.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/compta/facture/mergepdftool.php b/htdocs/compta/facture/mergepdftool.php index 5acca49d1b1..ea0eedfa36a 100644 --- a/htdocs/compta/facture/mergepdftool.php +++ b/htdocs/compta/facture/mergepdftool.php @@ -417,6 +417,7 @@ $search_societe = GETPOST("search_societe"); $search_paymentmode = GETPOST("search_paymentmode"); $search_montant_ht = GETPOST("search_montant_ht"); $search_montant_ttc = GETPOST("search_montant_ttc"); +$search_status = GETPOST("search_status"); $late = GETPOST("late"); // Do we click on purge search criteria ? @@ -428,6 +429,7 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both $search_paymentmode=''; $search_montant_ht=''; $search_montant_ttc=''; + $search_status=''; } $sortfield = GETPOST("sortfield",'alpha'); @@ -483,6 +485,7 @@ if ($search_paymentmode) $sql .= " AND f.fk_mode_reglement = ".$search_paymentmo if ($search_montant_ht) $sql .= " AND f.total = '".$db->escape($search_montant_ht)."'"; if ($search_montant_ttc) $sql .= " AND f.total_ttc = '".$db->escape($search_montant_ttc)."'"; if (GETPOST('sf_ref')) $sql .= " AND f.facnumber LIKE '%".$db->escape(GETPOST('sf_ref'))."%'"; +if ($search_status) $sql .= " AND f.fk_statut = ".$search_status; if ($month > 0) { if ($year > 0) @@ -528,6 +531,7 @@ if ($resql) if ($search_societe) $param.='&search_paymentmode='.urlencode($search_paymentmode); if ($search_montant_ht) $param.='&search_montant_ht='.urlencode($search_montant_ht); if ($search_montant_ttc) $param.='&search_montant_ttc='.urlencode($search_montant_ttc); + if ($search_status) $param.='&search_status='.urlencode($search_status); if ($late) $param.='&late='.urlencode($late); if ($mode) $param.='&mode='.urlencode($mode); $urlsource=$_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder; From 7d382f7997fec9d9fbdb5e199c8e5befb18dfa11 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 19 Oct 2015 18:16:28 +0200 Subject: [PATCH 34/58] FIX Revert option WORKFLOW_PROPAL_CAN_CLASSIFIED_BILLED_WITHOUT_INVOICES into option WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED for better compatibility with old versions --- htdocs/comm/propal.php | 2 +- htdocs/langs/en_US/workflow.lang | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index bcfaa747cab..fd6794c3d44 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -2223,7 +2223,7 @@ if ($action == 'create') } $arrayofinvoiceforpropal = $object->getInvoiceArrayList(); - if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || ! empty($conf->global->WORKFLOW_PROPAL_CAN_CLASSIFIED_BILLED_WITHOUT_INVOICES)) + if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || empty($conf->global->WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED)) { print ''; } diff --git a/htdocs/langs/en_US/workflow.lang b/htdocs/langs/en_US/workflow.lang index 7414fcb7e62..14be1a6ade6 100644 --- a/htdocs/langs/en_US/workflow.lang +++ b/htdocs/langs/en_US/workflow.lang @@ -3,9 +3,9 @@ WorkflowSetup=Workflow module setup WorkflowDesc=This module is designed to modify the behaviour of automatic actions into application. By default, workflow is open (you can do things in the order you want). You can activate the automatic actions you are interested in. ThereIsNoWorkflowToModify=There is no workflow modifications available with the activated modules. descWORKFLOW_PROPAL_AUTOCREATE_ORDER=Automatically create a customer order after a commercial proposal is signed -descWORKFLOW_PROPAL_AUTOCREATE_INVOICEAutomatically create a customer invoice after a commercial proposal is signed -descWORKFLOW_CONTRACT_AUTOCREATE_INVOICEAutomatically create a customer invoice after a contract is validated -descWORKFLOW_ORDER_AUTOCREATE_INVOICEAutomatically create a customer invoice after a customer order is closed +descWORKFLOW_PROPAL_AUTOCREATE_INVOICE=Automatically create a customer invoice after a commercial proposal is signed +descWORKFLOW_CONTRACT_AUTOCREATE_INVOICE=Automatically create a customer invoice after a contract is validated +descWORKFLOW_ORDER_AUTOCREATE_INVOICE=Automatically create a customer invoice after a customer order is closed descWORKFLOW_ORDER_CLASSIFY_BILLED_PROPAL=Classify linked source proposal to billed when customer order is set to paid descWORKFLOW_INVOICE_CLASSIFY_BILLED_ORDER=Classify linked source customer order(s) to billed when customer invoice is set to paid descWORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_ORDER=Classify linked source customer order(s) to billed when customer invoice is validated From 5237a2afc7bf155cbdc8a73bcaeefb90264084ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Tue, 20 Oct 2015 17:45:24 +0200 Subject: [PATCH 35/58] Fix lost searchstatus on next page list --- htdocs/compta/facture/list.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 2f87ff09e8b..87b27ef8199 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -69,7 +69,7 @@ $search_refcustomer=GETPOST('search_refcustomer','alpha'); $search_societe=GETPOST('search_societe','alpha'); $search_montant_ht=GETPOST('search_montant_ht','alpha'); $search_montant_ttc=GETPOST('search_montant_ttc','alpha'); -$search_status=GETPOST('search_status','alpha'); +$search_status=GETPOST('search_status','int'); $sortfield = GETPOST("sortfield",'alpha'); $sortorder = GETPOST("sortorder",'alpha'); @@ -270,6 +270,7 @@ if ($resql) if ($search_user > 0) $param.='&search_user=' .$search_user; if ($search_montant_ht != '') $param.='&search_montant_ht='.$search_montant_ht; if ($search_montant_ttc != '') $param.='&search_montant_ttc='.$search_montant_ttc; + if ($search_status > 0) $param.='&search_status='.$search_status; print_barre_liste($langs->trans('BillsCustomers').' '.($socid?' '.$soc->name:''),$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords,'title_accountancy.png'); $i = 0; From 4689b0cc11846010f43b29aeb64db4d298994c39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 21 Oct 2015 17:31:51 +0200 Subject: [PATCH 36/58] Update fournisseur.commande.class.php --- htdocs/fourn/class/fournisseur.commande.class.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 492663295b8..51602cafe1c 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -1571,6 +1571,7 @@ class CommandeFournisseur extends CommonOrder $result=$this->call_trigger('ORDER_SUPPLIER_DELETE',$user); if ($result < 0) { + $this->errors[]='ErrorWhenRunningTrigger'; dol_syslog(get_class($this)."::delete ".$this->error, LOG_ERR); return -1; } @@ -1583,6 +1584,8 @@ class CommandeFournisseur extends CommonOrder dol_syslog(get_class($this)."::delete", LOG_DEBUG); if (! $this->db->query($sql) ) { + $this->error=$this->db->lasterror(); + $this->errors[]=$this->db->lasterror(); $error++; } @@ -1593,12 +1596,14 @@ class CommandeFournisseur extends CommonOrder if ($this->db->affected_rows($resql) < 1) { $this->error=$this->db->lasterror(); + $this->errors[]=$this->db->lasterror(); $error++; } } else { $this->error=$this->db->lasterror(); + $this->errors[]=$this->db->lasterror(); $error++; } @@ -1608,6 +1613,8 @@ class CommandeFournisseur extends CommonOrder $result=$this->deleteExtraFields(); if ($result < 0) { + $this->error='FailToDeleteExtraFields'; + $this->errors[]='FailToDeleteExtraFields'; $error++; dol_syslog(get_class($this)."::delete error -4 ".$this->error, LOG_ERR); } @@ -1615,7 +1622,11 @@ class CommandeFournisseur extends CommonOrder // Delete linked object $res = $this->deleteObjectLinked(); - if ($res < 0) $error++; + if ($res < 0) { + $this->error='FailToDeleteObjectLinked'; + $this->errors[]='FailToDeleteObjectLinked'; + $error++; + } if (! $error) { @@ -1630,6 +1641,7 @@ class CommandeFournisseur extends CommonOrder if (! dol_delete_file($file,0,0,0,$this)) // For triggers { $this->error='ErrorFailToDeleteFile'; + $this->errors[]='ErrorFailToDeleteFile'; $error++; } } @@ -1639,6 +1651,7 @@ class CommandeFournisseur extends CommonOrder if (! $res) { $this->error='ErrorFailToDeleteDir'; + $this->errors[]='ErrorFailToDeleteDir'; $error++; } } From a01a85c3f6eb7afc589f7c666a2533647d8e9d32 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 23 Oct 2015 15:13:02 +0200 Subject: [PATCH 37/58] FIX tag object_total_vat_x need x to be a string with unknown decimal lenght. Now use for x the real vat real with no more decimal (x = 20 or x = 8.5 or x = 5.99, ...) --- htdocs/core/class/commondocgenerator.class.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index 41ae45ef638..24c2fe34a93 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -388,11 +388,16 @@ abstract class CommonDocGenerator // Add vat by rates foreach ($object->lines as $line) { + // $line->tva_tx format depends on database field accuraty, no reliable. This is kept for backward comaptibility if (empty($resarray[$array_key.'_total_vat_'.$line->tva_tx])) $resarray[$array_key.'_total_vat_'.$line->tva_tx]=0; $resarray[$array_key.'_total_vat_'.$line->tva_tx]+=$line->total_tva; $resarray[$array_key.'_total_vat_locale_'.$line->tva_tx]=price($resarray[$array_key.'_total_vat_'.$line->tva_tx]); + // $vatformated is vat without not expected chars (so 20, or 8.5 or 5.99 for example) + $vatformated=vatrate($line->tva_tx); + if (empty($resarray[$array_key.'_total_vat_'.$vatformated])) $resarray[$array_key.'_total_vat_'.$vatformated]=0; + $resarray[$array_key.'_total_vat_'.$vatformated]+=$line->total_tva; + $resarray[$array_key.'_total_vat_locale_'.$vatformated]=price($resarray[$array_key.'_total_vat_'.$vatformated]); } - // Retrieve extrafields if (is_array($object->array_options) && count($object->array_options)) { From 2cbfb69f9b70c851cd2e13a25010d91ab472f843 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 23 Oct 2015 15:28:14 +0200 Subject: [PATCH 38/58] Update template --- .../invoices/template_invoice.odt | Bin 25534 -> 37996 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/htdocs/install/doctemplates/invoices/template_invoice.odt b/htdocs/install/doctemplates/invoices/template_invoice.odt index e9cd7c836fb0363394d73d3579ca7f84cb33cb01..dad29a292efcae907c1af651f8caae0fba453ec1 100644 GIT binary patch delta 36631 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 Q8tJGz?h?nUG7eGy0kU*u5&!@I literal 25534 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 Date: Sun, 25 Oct 2015 19:42:00 +0100 Subject: [PATCH 39/58] FIX The thumb of user into top menu was using the image in full size. This make a large download at each page call. We must use the mini thumbs. --- htdocs/core/class/html.form.class.php | 10 +++++++-- htdocs/core/lib/functions.lib.php | 29 +++++++++++++++++++++++++++ htdocs/main.inc.php | 2 +- htdocs/user/class/user.class.php | 5 +++-- 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index b75bd01d2aa..9b0ef17b465 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5134,10 +5134,11 @@ class Form * @param int $width Width of photo * @param int $height Height of photo (auto if 0) * @param int $caneditfield Add edit fields + * @param string $imagesize 'mini', 'small' or '' (original) * @param string $cssclass CSS name to use on img for photo * @return string HTML code to output photo */ - static function showphoto($modulepart, $object, $width=100, $height=0, $caneditfield=0, $cssclass='photowithmargin') + static function showphoto($modulepart, $object, $width=100, $height=0, $caneditfield=0, $cssclass='photowithmargin', $imagesize='') { global $conf,$langs; @@ -5156,7 +5157,12 @@ class Form else if ($modulepart=='userphoto') { $dir=$conf->user->dir_output; - if ($object->photo) $file=get_exdir($id, 2, 0, 0, $object, 'user').$object->photo; + if (! empty($object->photo)) + { + if ($imagesize == 'mini') $file=get_exdir($id, 2, 0, 0, $object, 'user').getImageFileNameForSize($object->photo, '_mini'); + else if ($imagesize == 'small') $file=get_exdir($id, 2, 0, 0, $object, 'user').getImageFileNameForSize($object->photo, '_small'); + else $file=get_exdir($id, 2, 0, 0, $object, 'user').$object->photo; + } if (! empty($conf->global->MAIN_OLD_IMAGE_LINKS)) $altfile=$object->id.".jpg"; // For backward compatibility $email=$object->email; } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 290cdb2300b..04c2c02a7d5 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -5118,3 +5118,32 @@ function natural_search($fields, $value, $mode=0, $nofirstand=0) return $res; } +/** + * Return the filename of file to get the thumbs + * + * @param string $file Original filename + * @param string $extName Extension to differenciate thumb file name ('', '_small', '_mini') + * @param string $extImgTarget Force image format for thumbs. Use '' to keep same extension than original image. + * @return string New file name + */ +function getImageFileNameForSize($file, $extName, $extImgTarget='') +{ + $dirName = dirname($file); + if ($dirName == '.') $dirName=''; + + $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp)$/i','',$file); // On enleve extension quelquesoit la casse + $fileName = basename($fileName); + + if (empty($extImgTarget)) $extImgTarget = (preg_match('/\.jpg$/i',$file)?'.jpg':''); + if (empty($extImgTarget)) $extImgTarget = (preg_match('/\.jpeg$/i',$file)?'.jpeg':''); + if (empty($extImgTarget)) $extImgTarget = (preg_match('/\.gif$/i',$file)?'.gif':''); + if (empty($extImgTarget)) $extImgTarget = (preg_match('/\.png$/i',$file)?'.png':''); + if (empty($extImgTarget)) $extImgTarget = (preg_match('/\.bmp$/i',$file)?'.bmp':''); + + if (! $extImgTarget) return $file; + + $subdir=''; + if ($extName) $subdir = 'thumbs/'; + + return $dirName.$subdir.$fileName.$extName.$extImgTarget; // New filename for thumb +} diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 51147a03a9c..92d421d42cb 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1443,7 +1443,7 @@ function top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $a // User photo $toprightmenu.='
'; // Login name with tooltip diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index e375a3c3d80..4459dfc3fc0 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -1813,14 +1813,15 @@ class User extends CommonObject * @param int $width Width of image * @param int $height Height of image * @param string $cssclass Force a css class + * @param string $imagesize 'mini', 'small' or '' (original) * @return string String with URL link */ - function getPhotoUrl($width, $height, $cssclass='') + function getPhotoUrl($width, $height, $cssclass='', $imagesize='') { $result=''; $result.=''; - $result.=Form::showphoto('userphoto', $this, $width, $height, 0, $cssclass); + $result.=Form::showphoto('userphoto', $this, $width, $height, 0, $cssclass, $imagesize); $result.=''; return $result; From 4e206fa80b3dc44ab92fa68f313dd8710b9b6efb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 25 Oct 2015 19:53:59 +0100 Subject: [PATCH 40/58] Fix doxygen --- htdocs/core/class/html.form.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 9b0ef17b465..6d802e7f567 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5134,8 +5134,8 @@ class Form * @param int $width Width of photo * @param int $height Height of photo (auto if 0) * @param int $caneditfield Add edit fields - * @param string $imagesize 'mini', 'small' or '' (original) * @param string $cssclass CSS name to use on img for photo + * @param string $imagesize 'mini', 'small' or '' (original) * @return string HTML code to output photo */ static function showphoto($modulepart, $object, $width=100, $height=0, $caneditfield=0, $cssclass='photowithmargin', $imagesize='') From 295eb533f884a3da9ec4c5476b3c2f34ead761e1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 25 Oct 2015 20:14:57 +0100 Subject: [PATCH 41/58] FIX Bad picto for expense report --- htdocs/expensereport/class/expensereport.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index 78ca120516e..7de680d02f3 100644 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -1543,7 +1543,7 @@ class ExpenseReport extends CommonObject $response->warning_delay=$conf->expensereport->payment->warning_delay/60/60/24; $response->label=$langs->trans("ExpenseReportsToPay"); $response->url=DOL_URL_ROOT.'/expensereport/list.php?mainmenu=hrm&statut=5'; - $response->img=img_object($langs->trans("ExpenseReports"),"user"); + $response->img=img_object($langs->trans("ExpenseReports"),"trip"); while ($obj=$this->db->fetch_object($resql)) { From 77a0359cfc13bbcd896292bc86669b5154072bdd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 25 Oct 2015 20:17:43 +0100 Subject: [PATCH 42/58] Fix bad test --- htdocs/core/class/html.form.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 6d802e7f567..79ba773ad36 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5159,8 +5159,8 @@ class Form $dir=$conf->user->dir_output; if (! empty($object->photo)) { - if ($imagesize == 'mini') $file=get_exdir($id, 2, 0, 0, $object, 'user').getImageFileNameForSize($object->photo, '_mini'); - else if ($imagesize == 'small') $file=get_exdir($id, 2, 0, 0, $object, 'user').getImageFileNameForSize($object->photo, '_small'); + if ((string) $imagesize == 'mini') $file=get_exdir($id, 2, 0, 0, $object, 'user').getImageFileNameForSize($object->photo, '_mini'); + else if ((string) $imagesize == 'small') $file=get_exdir($id, 2, 0, 0, $object, 'user').getImageFileNameForSize($object->photo, '_small'); else $file=get_exdir($id, 2, 0, 0, $object, 'user').$object->photo; } if (! empty($conf->global->MAIN_OLD_IMAGE_LINKS)) $altfile=$object->id.".jpg"; // For backward compatibility From fa3af485ef92c475b42ac2dc4e1ad2304c230d36 Mon Sep 17 00:00:00 2001 From: Alexis Algoud Date: Mon, 26 Oct 2015 18:33:22 +0100 Subject: [PATCH 43/58] FIX action not appear before an update because of a lack of line in action ressource --- htdocs/comm/action/listactions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/action/listactions.php b/htdocs/comm/action/listactions.php index 509a9c90d77..977a91a404a 100644 --- a/htdocs/comm/action/listactions.php +++ b/htdocs/comm/action/listactions.php @@ -199,7 +199,7 @@ if ($status == 'todo') { $sql.= " AND ((a.percent >= 0 AND a.percent < 100) OR ( if ($filtert > 0 || $usergroup > 0) { $sql.= " AND ("; - if ($filtert > 0) $sql.= "ar.fk_element = ".$filtert; + if ($filtert > 0) $sql.= "(ar.fk_element = ".$filtert." OR a.fk_user_action=".$filtert.")"; if ($usergroup > 0) $sql.= ($filtert>0?" OR ":"")." ugu.fk_usergroup = ".$usergroup; $sql.= ")"; } From 87c240252c4ade8a164ed5eab97cb309bab2631d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 27 Oct 2015 22:24:18 +0100 Subject: [PATCH 44/58] FIX Can export a field into task time table with export project profile --- htdocs/core/modules/modProjet.class.php | 4 ++-- htdocs/langs/en_US/projects.lang | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/modProjet.class.php b/htdocs/core/modules/modProjet.class.php index 6ac8b877ad6..ff4adeb1986 100644 --- a/htdocs/core/modules/modProjet.class.php +++ b/htdocs/core/modules/modProjet.class.php @@ -300,8 +300,8 @@ class modProjet extends DolibarrModules } } // End add extra fields - $this->export_fields_array[$r]=array_merge($this->export_fields_array[$r], array('ptt.task_date'=>'TaskTimeDate','ptt.task_duration'=>"TimesSpent",'ptt.fk_user'=>"TaskTimeUser",'ptt.note'=>"TaskTimeNote")); - $this->export_entities_array[$r]=array_merge($this->export_entities_array[$r], array('ptt.task_date'=>'task_time','ptt.task_duration'=>"task_time",'ptt.fk_user'=>"task_time",'ptt.note'=>"task_time")); + $this->export_fields_array[$r]=array_merge($this->export_fields_array[$r], array('ptt.rowid'=>'IdTaskTime','ptt.task_date'=>'TaskTimeDate','ptt.task_duration'=>"TimesSpent",'ptt.fk_user'=>"TaskTimeUser",'ptt.note'=>"TaskTimeNote")); + $this->export_entities_array[$r]=array_merge($this->export_entities_array[$r], array('ptt.rowid'=>'task_time','ptt.task_date'=>'task_time','ptt.task_duration'=>"task_time",'ptt.fk_user'=>"task_time",'ptt.note'=>"task_time")); $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'projet as p'; diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index d9fecb40ad4..4ed6ccfc2f5 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -175,6 +175,7 @@ ProjectWeightedOppAmountOfProjectsByMonth=Weighted amount of opportunities by mo ProjectOpenedProjectByOppStatus=Opened project/lead by opportunity status ProjectsStatistics=Statistics on projects/leads TaskAssignedToEnterTime=Task assigned. Entering time on this task should be possible. +IdTaskTime=Id task time OpenedProjectsByThirdparties=Opened projects by thirdparties OpportunityTotalAmount=Opportunities total amount OpportunityPonderatedAmount=Opportunities weighted amount From 9a95401473ae5f6deede751dab6ef8802dfae7ad Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 28 Oct 2015 11:27:39 +0100 Subject: [PATCH 45/58] FIX : add tag myuser_job into ODT replacement --- htdocs/core/class/commondocgenerator.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index 24c2fe34a93..c2634cbaaed 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -75,6 +75,7 @@ abstract class CommonDocGenerator 'myuser_mobile'=>$user->user_mobile, 'myuser_email'=>$user->email, 'myuser_logo'=>$user->photo, + 'myuser_job'=>$user->job, 'myuser_web'=>'' // url not exist in $user object ); } From f385f8bcfa1c44930e46c94430d76b9aa9deba3f Mon Sep 17 00:00:00 2001 From: phf Date: Wed, 28 Oct 2015 14:34:34 +0100 Subject: [PATCH 46/58] FIX better fix to generate a PROV ref after clone --- htdocs/commande/class/commande.class.php | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 567c3f1a702..fff3f64de8d 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -978,6 +978,7 @@ class Commande extends CommonOrder } $this->id=0; + $this->ref = ''; $this->statut=self::STATUS_DRAFT; // Clear fields @@ -986,18 +987,9 @@ class Commande extends CommonOrder $this->date_creation = ''; $this->date_validation = ''; $this->ref_client = ''; - - // Set ref - $this->ref = '(PROV)'; - + // Create clone $result=$this->create($user); - if ($result < 0) $error++; - - // Set new ref - $newref='(PROV'.$this->id.')'; - $sql = 'UPDATE '.MAIN_DB_PREFIX."commande SET ref='".$this->db->escape($newref)."' WHERE rowid=".$this->id; - $result=$this->db->query($sql); if ($result < 0) $error++; if (! $error) From e2ba24826ffe5b9061808c084778d08780cbeceb Mon Sep 17 00:00:00 2001 From: aspangaro Date: Thu, 29 Oct 2015 06:06:56 +0100 Subject: [PATCH 47/58] Review 3.8 --- htdocs/langs/en_US/admin.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index fce013be146..9c2879db463 100755 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -974,6 +974,7 @@ Delays_MAIN_DELAY_CUSTOMER_BILLS_UNPAYED=Tolerence delay (in days) before alert Delays_MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE=Tolerance delay (in days) before alert on pending bank reconciliation Delays_MAIN_DELAY_MEMBERS=Tolerance delay (in days) before alert on delayed membership fee Delays_MAIN_DELAY_CHEQUES_TO_DEPOSIT=Tolerance delay (in days) before alert for cheques deposit to do +Delays_MAIN_DELAY_EXPENSEREPORTS=Tolerance delay (in days) before alert for expense reports to approve SetupDescription1=All parameters available in the setup area allow you to setup Dolibarr before starting using it. SetupDescription2=The 2 most important setup steps are the 2 first ones in the left setup menu, this means Company/foundation setup page and Modules setup page: SetupDescription3=Parameters in menu Setup -> Company/foundation are required because input information is used on Dolibarr displays and to modify Dolibarr behaviour (for example for features related to your country). From 4e9d06785c762aaff28eba9305d5839175be84b4 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Thu, 29 Oct 2015 06:47:42 +0100 Subject: [PATCH 48/58] Fix #3818 & presentation --- htdocs/admin/security.php | 17 +++++++++++------ htdocs/langs/en_US/admin.lang | 3 +++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/htdocs/admin/security.php b/htdocs/admin/security.php index 84c5ecb92e4..fe20d868e83 100644 --- a/htdocs/admin/security.php +++ b/htdocs/admin/security.php @@ -292,6 +292,7 @@ $var=!$var; $this->NbRepeat = $tabConf[4]; $this->WithoutAmbi = $tabConf[5]; */ + print '
'; print ''; print ''; print ''; @@ -332,13 +333,17 @@ $var=!$var; print '"; print ''; print ''; - - $var=!$var; - print ""; - print ''; - print ''; + print '
'.$langs->trans("PasswordPatternDesc").'' . $langs->trans("NoAmbiCaracAutoGeneration")." '.($tabConf[5] ? $langs->trans("Activated") : $langs->trans("Disabled")).'
'.$langs->trans("Save").'
'; + print '
'; + print ''; + print ''; + print '
'; + print ''.$langs->trans("Save").''; + print '
'; + print '

'; + print '