From 19a3194b02fdff5bb29a1e819aa2add047ff4866 Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sat, 14 Jun 2014 12:53:02 +0200 Subject: [PATCH 1/3] Fix : duedate was not auto calculated + move calculation function to common invoice class --- htdocs/compta/facture/class/facture.class.php | 69 ------------------- htdocs/core/class/commoninvoice.class.php | 68 ++++++++++++++++++ htdocs/fourn/facture/fiche.php | 3 + 3 files changed, 71 insertions(+), 69 deletions(-) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 81bf47715e6..fb92a3b69e1 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -1406,75 +1406,6 @@ class Facture extends CommonInvoice } } - - /** - * Renvoi une date limite de reglement de facture en fonction des - * conditions de reglements de la facture et date de facturation - * - * @param string $cond_reglement Condition of payment (code or id) to use. If 0, we use current condition. - * @return date Date limite de reglement si ok, <0 si ko - */ - function calculate_date_lim_reglement($cond_reglement=0) - { - if (! $cond_reglement) $cond_reglement=$this->cond_reglement_code; - if (! $cond_reglement) $cond_reglement=$this->cond_reglement_id; - - $cdr_nbjour=0; $cdr_fdm=0; $cdr_decalage=0; - - $sqltemp = 'SELECT c.fdm,c.nbjour,c.decalage'; - $sqltemp.= ' FROM '.MAIN_DB_PREFIX.'c_payment_term as c'; - if (is_numeric($cond_reglement)) $sqltemp.= " WHERE c.rowid=".$cond_reglement; - else $sqltemp.= " WHERE c.code='".$this->db->escape($cond_reglement)."'"; - - dol_syslog(get_class($this).'::calculate_date_lim_reglement sql='.$sqltemp); - $resqltemp=$this->db->query($sqltemp); - if ($resqltemp) - { - if ($this->db->num_rows($resqltemp)) - { - $obj = $this->db->fetch_object($resqltemp); - $cdr_nbjour = $obj->nbjour; - $cdr_fdm = $obj->fdm; - $cdr_decalage = $obj->decalage; - } - } - else - { - $this->error=$this->db->error(); - return -1; - } - $this->db->free($resqltemp); - - /* Definition de la date limite */ - - // 1 : ajout du nombre de jours - $datelim = $this->date + ($cdr_nbjour * 3600 * 24); - - // 2 : application de la regle "fin de mois" - if ($cdr_fdm) - { - $mois=date('m', $datelim); - $annee=date('Y', $datelim); - if ($mois == 12) - { - $mois = 1; - $annee += 1; - } - else - { - $mois += 1; - } - // On se deplace au debut du mois suivant, et on retire un jour - $datelim=dol_mktime(12,0,0,$mois,1,$annee); - $datelim -= (3600 * 24); - } - - // 3 : application du decalage - $datelim += ($cdr_decalage * 3600 * 24); - - return $datelim; - } - /** * Tag la facture comme paye completement (si close_code non renseigne) => this->fk_statut=2, this->paye=1 * ou partiellement (si close_code renseigne) + appel trigger BILL_PAYED => this->fk_statut=2, this->paye stay 0 diff --git a/htdocs/core/class/commoninvoice.class.php b/htdocs/core/class/commoninvoice.class.php index 80d719decae..6d657f0c36c 100644 --- a/htdocs/core/class/commoninvoice.class.php +++ b/htdocs/core/class/commoninvoice.class.php @@ -288,6 +288,74 @@ abstract class CommonInvoice extends CommonObject } } } + + /** + * Renvoi une date limite de reglement de facture en fonction des + * conditions de reglements de la facture et date de facturation + * + * @param string $cond_reglement Condition of payment (code or id) to use. If 0, we use current condition. + * @return date Date limite de reglement si ok, <0 si ko + */ + function calculate_date_lim_reglement($cond_reglement=0) + { + if (! $cond_reglement) $cond_reglement=$this->cond_reglement_code; + if (! $cond_reglement) $cond_reglement=$this->cond_reglement_id; + + $cdr_nbjour=0; $cdr_fdm=0; $cdr_decalage=0; + + $sqltemp = 'SELECT c.fdm,c.nbjour,c.decalage'; + $sqltemp.= ' FROM '.MAIN_DB_PREFIX.'c_payment_term as c'; + if (is_numeric($cond_reglement)) $sqltemp.= " WHERE c.rowid=".$cond_reglement; + else $sqltemp.= " WHERE c.code='".$this->db->escape($cond_reglement)."'"; + + dol_syslog(get_class($this).'::calculate_date_lim_reglement sql='.$sqltemp); + $resqltemp=$this->db->query($sqltemp); + if ($resqltemp) + { + if ($this->db->num_rows($resqltemp)) + { + $obj = $this->db->fetch_object($resqltemp); + $cdr_nbjour = $obj->nbjour; + $cdr_fdm = $obj->fdm; + $cdr_decalage = $obj->decalage; + } + } + else + { + $this->error=$this->db->error(); + return -1; + } + $this->db->free($resqltemp); + + /* Definition de la date limite */ + + // 1 : ajout du nombre de jours + $datelim = $this->date + ($cdr_nbjour * 3600 * 24); + + // 2 : application de la regle "fin de mois" + if ($cdr_fdm) + { + $mois=date('m', $datelim); + $annee=date('Y', $datelim); + if ($mois == 12) + { + $mois = 1; + $annee += 1; + } + else + { + $mois += 1; + } + // On se deplace au debut du mois suivant, et on retire un jour + $datelim=dol_mktime(12,0,0,$mois,1,$annee); + $datelim -= (3600 * 24); + } + + // 3 : application du decalage + $datelim += ($cdr_decalage * 3600 * 24); + + return $datelim; + } } /** diff --git a/htdocs/fourn/facture/fiche.php b/htdocs/fourn/facture/fiche.php index 92c8be3469c..46932f5de97 100644 --- a/htdocs/fourn/facture/fiche.php +++ b/htdocs/fourn/facture/fiche.php @@ -300,6 +300,9 @@ elseif ($action == 'add' && $user->rights->fournisseur->facture->creer) $object->cond_reglement_id = GETPOST('cond_reglement_id'); $object->mode_reglement_id = GETPOST('mode_reglement_id'); $object->fk_project = ($tmpproject > 0) ? $tmpproject : null; + + // Auto calculation of date due if not filled by user + if(empty($object->date_echeance)) $object->date_echeance = $object->calculate_date_lim_reglement(); // If creation from another object of another module if ($_POST['origin'] && $_POST['originid']) From a3e278993e81f0ec1c848204a0f7d87e9a4be871 Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sat, 14 Jun 2014 23:34:19 +0200 Subject: [PATCH 2/3] Fix 1455 outstanding amount --- htdocs/societe/class/societe.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 9ffa0546782..5893fbab021 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -3058,7 +3058,7 @@ class Societe extends CommonObject // Set outstanding amount $sql = "UPDATE ".MAIN_DB_PREFIX."societe SET "; - $sql.= " outstanding_limit= ".($outstanding!=''?$outstanding:'null'); + $sql.= " outstanding_limit= '".($outstanding!=''?$outstanding:'null')."'"; $sql.= " WHERE rowid = ".$this->id; dol_syslog(get_class($this)."::set_outstanding sql=".$sql); From f2760f74ed959ad5e972eded75294547c47b5407 Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Fri, 20 Jun 2014 09:10:50 +0200 Subject: [PATCH 3/3] Fix replenishment on virtual stock --- htdocs/product/stock/replenish.php | 36 ++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/htdocs/product/stock/replenish.php b/htdocs/product/stock/replenish.php index c833bcb2bb8..197645db2f4 100644 --- a/htdocs/product/stock/replenish.php +++ b/htdocs/product/stock/replenish.php @@ -48,6 +48,7 @@ $sall = GETPOST('sall', 'alpha'); $type = GETPOST('type','int'); $tobuy = GETPOST('tobuy', 'int'); $salert = GETPOST('salert', 'alpha'); +$mode = GETPOST('mode','alpha'); $sortfield = GETPOST('sortfield','alpha'); $sortorder = GETPOST('sortorder','alpha'); @@ -191,8 +192,8 @@ $usevirtualstock=-1; if ($virtualdiffersfromphysical) { $usevirtualstock=($conf->global->STOCK_USE_VIRTUAL_STOCK?1:0); - if (GETPOST('mode')=='virtual') $usevirtualstock=1; - if (GETPOST('mode')=='physical') $usevirtualstock=0; + if ($mode=='virtual') $usevirtualstock=1; + if ($mode=='physical') $usevirtualstock=0; } $title = $langs->trans('Status'); @@ -240,8 +241,30 @@ $sql.= ' GROUP BY p.rowid, p.ref, p.label, p.price'; $sql.= ', p.price_ttc, p.price_base_type,p.fk_product_type, p.tms'; $sql.= ', p.duration, p.tobuy, p.seuil_stock_alerte'; $sql.= ', p.desiredstock, s.fk_product'; -$sql.= ' HAVING p.desiredstock > SUM('.$db->ifsql("s.reel IS NULL", "0", "s.reel").')'; -$sql.= ' AND p.desiredstock > 0'; + +if($usevirtualstock) { + $sqlCommandesCli = "(SELECT SUM(cd.qty) as qty"; + $sqlCommandesCli.= " FROM ".MAIN_DB_PREFIX."commandedet as cd"; + $sqlCommandesCli.= ", ".MAIN_DB_PREFIX."commande as c"; + $sqlCommandesCli.= " WHERE c.rowid = cd.fk_commande"; + $sqlCommandesCli.= " AND c.entity = ".$conf->entity; + $sqlCommandesCli.= " AND cd.fk_product = p.rowid"; + $sqlCommandesCli.= " AND c.fk_statut in (1,2))"; + + $sqlCommandesFourn = "(SELECT SUM(cd.qty) as qty"; + $sqlCommandesFourn.= " FROM ".MAIN_DB_PREFIX."commande_fournisseurdet as cd"; + $sqlCommandesFourn.= ", ".MAIN_DB_PREFIX."commande_fournisseur as c"; + $sqlCommandesFourn.= " WHERE c.rowid = cd.fk_commande"; + $sqlCommandesFourn.= " AND c.entity = ".$conf->entity; + $sqlCommandesFourn.= " AND cd.fk_product = p.rowid"; + $sqlCommandesFourn.= " AND c.fk_statut in (3))"; + + $sql.= ' HAVING p.desiredstock > SUM('.$db->ifsql("s.reel IS NULL", "0", "s.reel").')'; + $sql.= ' - '.$db->ifsql($sqlCommandesCli.' IS NULL', '0', $sqlCommandesCli).' + '.$db->ifsql($sqlCommandesFourn.' IS NULL', '0', $sqlCommandesFourn); +} else { + $sql.= ' HAVING p.desiredstock > SUM('.$db->ifsql("s.reel IS NULL", "0", "s.reel").')'; + $sql.= ' AND p.desiredstock > 0'; +} if ($salert == 'on') // Option to see when stock is lower than alert { $sql .= ' AND SUM('.$db->ifsql("s.reel IS NULL", "0", "s.reel").') < p.seuil_stock_alerte AND p.seuil_stock_alerte is not NULL'; @@ -295,6 +318,7 @@ if ($sref || $snom || $sall || $salert || GETPOST('search', 'alpha')) { $filters = '&sref=' . $sref . '&snom=' . $snom; $filters .= '&sall=' . $sall; $filters .= '&salert=' . $salert; + $filters .= '&mode=' . $mode; print_barre_liste( $texte, $page, @@ -310,6 +334,7 @@ if ($sref || $snom || $sall || $salert || GETPOST('search', 'alpha')) { $filters .= '&fourn_id=' . $fourn_id; $filters .= (isset($type)?'&type=' . $type:''); $filters .= '&salert=' . $salert; + $filters .= '&mode=' . $mode; print_barre_liste( $texte, $page, @@ -335,6 +360,7 @@ print '
' $param = (isset($type)? '&type=' . $type : ''); $param .= '&fourn_id=' . $fourn_id . '&snom='. $snom . '&salert=' . $salert; $param .= '&sref=' . $sref; +$param .= '&mode=' . $mode; // Lignes des titres print ''. @@ -589,6 +615,7 @@ if ($num > $conf->liste_limit) $filters = '&sref=' . $sref . '&snom=' . $snom; $filters .= '&sall=' . $sall; $filters .= '&salert=' . $salert; + $filters .= '&mode=' . $mode; print_barre_liste( '', $page, @@ -606,6 +633,7 @@ if ($num > $conf->liste_limit) $filters .= '&fourn_id=' . $fourn_id; $filters .= (isset($type)? '&type=' . $type : ''); $filters .= '&salert=' . $salert; + $filters .= '&mode=' . $mode; print_barre_liste( '', $page,