diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php
index 42944e82610..5d96945c17a 100644
--- a/htdocs/core/class/commonobject.class.php
+++ b/htdocs/core/class/commonobject.class.php
@@ -2260,30 +2260,32 @@ abstract class CommonObject
function update_price($exclspec=0,$roundingadjust='none',$nodatabaseupdate=0,$seller=null)
{
global $conf;
-
- //Some external module want no update price after a trigger because they have a other method for calculate the total (ex: with a extrafield)
- $MODULE = "";
- if ($this->element == 'propal')
- $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_PROPOSAL";
- elseif ($this->element == 'order')
- $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_ORDER";
- elseif ($this->element == 'facture')
- $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_INVOICE";
- elseif ($this->element == 'facture_fourn')
- $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_INVOICE";
- elseif ($this->element == 'order_supplier')
- $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_ORDER";
- elseif ($this->element == 'supplier_proposal')
- $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_PROPOSAL";
- if(!empty($MODULE)){
- if (!empty($conf->global->$MODULE)) {
- $modsactivated = explode(',', $conf->global->$MODULE);
- foreach ($modsactivated as $mod) {
- if ($conf->$mod->enabled) return 1;
- }
- }
- } else {
+ // Some external module want no update price after a trigger because they have another method to calculate the total (ex: with an extrafield)
+ $MODULE = "";
+ if ($this->element == 'propal')
+ $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_PROPOSAL";
+ elseif ($this->element == 'order')
+ $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_ORDER";
+ elseif ($this->element == 'facture')
+ $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_INVOICE";
+ elseif ($this->element == 'facture_fourn')
+ $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_INVOICE";
+ elseif ($this->element == 'order_supplier')
+ $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_ORDER";
+ elseif ($this->element == 'supplier_proposal')
+ $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_PROPOSAL";
+
+ if (! empty($MODULE)) {
+ if (! empty($conf->global->$MODULE)) {
+ $modsactivated = explode(',', $conf->global->$MODULE);
+ foreach ($modsactivated as $mod) {
+ if ($conf->$mod->enabled)
+ return 1; // update was disabled by specific setup
+ }
+ }
+ }
+
include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
if ($roundingadjust == '-1') $roundingadjust='auto'; // For backward compatibility
@@ -2337,7 +2339,7 @@ abstract class CommonObject
$total_ht_by_vats = array();
$total_tva_by_vats = array();
$total_ttc_by_vats = array();
- $this->multicurrency_total_ht = 0;
+ $this->multicurrency_total_ht = 0;
$this->multicurrency_total_tva = 0;
$this->multicurrency_total_ttc = 0;
@@ -2345,84 +2347,85 @@ abstract class CommonObject
$i = 0;
while ($i < $num)
{
- $obj = $this->db->fetch_object($resql);
+ $obj = $this->db->fetch_object($resql);
- // Note: There is no check on detail line and no check on total, if $forcedroundingmode = 'none'
- if ($forcedroundingmode == '0') // Check if data on line are consistent. This may solve lines that were not consistent because set with $forcedroundingmode='auto'
- {
- $localtax_array=array($obj->localtax1_type,$obj->localtax1_tx,$obj->localtax2_type,$obj->localtax2_tx);
- $tmpcal=calcul_price_total($obj->qty, $obj->up, $obj->remise_percent, $obj->vatrate, $obj->localtax1_tx, $obj->localtax2_tx, 0, 'HT', $obj->info_bits, $obj->product_type, $seller, $localtax_array, (isset($obj->situation_percent) ? $obj->situation_percent : 100), $multicurrency_tx);
- $diff=price2num($tmpcal[1] - $obj->total_tva, 'MT', 1);
- if ($diff)
+ // Note: There is no check on detail line and no check on total, if $forcedroundingmode = 'none'
+ if ($forcedroundingmode == '0') // Check if data on line are consistent. This may solve lines that were not consistent because set with $forcedroundingmode='auto'
{
- $sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".$tmpcal[1].", total_ttc = ".$tmpcal[2]." WHERE rowid = ".$obj->rowid;
- dol_syslog('We found unconsistent data into detailed line (difference of '.$diff.') for line rowid = '.$obj->rowid." (total vat of line calculated=".$tmpcal[1].", database=".$obj->total_tva."). We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
- $resqlfix=$this->db->query($sqlfix);
- if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
- $obj->total_tva = $tmpcal[1];
- $obj->total_ttc = $tmpcal[2];
- //
+ $localtax_array=array($obj->localtax1_type,$obj->localtax1_tx,$obj->localtax2_type,$obj->localtax2_tx);
+ $tmpcal=calcul_price_total($obj->qty, $obj->up, $obj->remise_percent, $obj->vatrate, $obj->localtax1_tx, $obj->localtax2_tx, 0, 'HT', $obj->info_bits, $obj->product_type, $seller, $localtax_array, (isset($obj->situation_percent) ? $obj->situation_percent : 100), $multicurrency_tx);
+ $diff=price2num($tmpcal[1] - $obj->total_tva, 'MT', 1);
+ if ($diff)
+ {
+ $sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".$tmpcal[1].", total_ttc = ".$tmpcal[2]." WHERE rowid = ".$obj->rowid;
+ dol_syslog('We found unconsistent data into detailed line (difference of '.$diff.') for line rowid = '.$obj->rowid." (total vat of line calculated=".$tmpcal[1].", database=".$obj->total_tva."). We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
+ $resqlfix=$this->db->query($sqlfix);
+ if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
+ $obj->total_tva = $tmpcal[1];
+ $obj->total_ttc = $tmpcal[2];
+ //
+ }
}
- }
- $this->total_ht += $obj->total_ht; // The field visible at end of line detail
- $this->total_tva += $obj->total_tva;
- $this->total_localtax1 += $obj->total_localtax1;
- $this->total_localtax2 += $obj->total_localtax2;
- $this->total_ttc += $obj->total_ttc;
- $this->multicurrency_total_ht += $obj->multicurrency_total_ht; // The field visible at end of line detail
- $this->multicurrency_total_tva += $obj->multicurrency_total_tva;
- $this->multicurrency_total_ttc += $obj->multicurrency_total_ttc;
+ $this->total_ht += $obj->total_ht; // The field visible at end of line detail
+ $this->total_tva += $obj->total_tva;
+ $this->total_localtax1 += $obj->total_localtax1;
+ $this->total_localtax2 += $obj->total_localtax2;
+ $this->total_ttc += $obj->total_ttc;
+ $this->multicurrency_total_ht += $obj->multicurrency_total_ht; // The field visible at end of line detail
+ $this->multicurrency_total_tva += $obj->multicurrency_total_tva;
+ $this->multicurrency_total_ttc += $obj->multicurrency_total_ttc;
- if (! isset($total_ht_by_vats[$obj->vatrate])) $total_ht_by_vats[$obj->vatrate]=0;
- if (! isset($total_tva_by_vats[$obj->vatrate])) $total_tva_by_vats[$obj->vatrate]=0;
- if (! isset($total_ttc_by_vats[$obj->vatrate])) $total_ttc_by_vats[$obj->vatrate]=0;
- $total_ht_by_vats[$obj->vatrate] += $obj->total_ht;
- $total_tva_by_vats[$obj->vatrate] += $obj->total_tva;
- $total_ttc_by_vats[$obj->vatrate] += $obj->total_ttc;
+ if (! isset($total_ht_by_vats[$obj->vatrate])) $total_ht_by_vats[$obj->vatrate]=0;
+ if (! isset($total_tva_by_vats[$obj->vatrate])) $total_tva_by_vats[$obj->vatrate]=0;
+ if (! isset($total_ttc_by_vats[$obj->vatrate])) $total_ttc_by_vats[$obj->vatrate]=0;
+ $total_ht_by_vats[$obj->vatrate] += $obj->total_ht;
+ $total_tva_by_vats[$obj->vatrate] += $obj->total_tva;
+ $total_ttc_by_vats[$obj->vatrate] += $obj->total_ttc;
- if ($forcedroundingmode == '1') // Check if we need adjustement onto line for vat. TODO This works on the company currency but not on multicurrency
- {
- $tmpvat=price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100, 'MT', 1);
- $diff=price2num($total_tva_by_vats[$obj->vatrate]-$tmpvat, 'MT', 1);
- //print 'Line '.$i.' rowid='.$obj->rowid.' vat_rate='.$obj->vatrate.' total_ht='.$obj->total_ht.' total_tva='.$obj->total_tva.' total_ttc='.$obj->total_ttc.' total_ht_by_vats='.$total_ht_by_vats[$obj->vatrate].' total_tva_by_vats='.$total_tva_by_vats[$obj->vatrate].' (new calculation = '.$tmpvat.') total_ttc_by_vats='.$total_ttc_by_vats[$obj->vatrate].($diff?" => DIFF":"")."
\n";
- if ($diff)
+ if ($forcedroundingmode == '1') // Check if we need adjustement onto line for vat. TODO This works on the company currency but not on multicurrency
{
- if (abs($diff) > 0.1) { dol_syslog('A rounding difference was detected into TOTAL but is too high to be corrected', LOG_WARNING); exit; }
- $sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".($obj->total_tva - $diff).", total_ttc = ".($obj->total_ttc - $diff)." WHERE rowid = ".$obj->rowid;
- dol_syslog('We found a difference of '.$diff.' for line rowid = '.$obj->rowid.". We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
- $resqlfix=$this->db->query($sqlfix);
- if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
- $this->total_tva -= $diff;
- $this->total_ttc -= $diff;
- $total_tva_by_vats[$obj->vatrate] -= $diff;
- $total_ttc_by_vats[$obj->vatrate] -= $diff;
+ $tmpvat=price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100, 'MT', 1);
+ $diff=price2num($total_tva_by_vats[$obj->vatrate]-$tmpvat, 'MT', 1);
+ //print 'Line '.$i.' rowid='.$obj->rowid.' vat_rate='.$obj->vatrate.' total_ht='.$obj->total_ht.' total_tva='.$obj->total_tva.' total_ttc='.$obj->total_ttc.' total_ht_by_vats='.$total_ht_by_vats[$obj->vatrate].' total_tva_by_vats='.$total_tva_by_vats[$obj->vatrate].' (new calculation = '.$tmpvat.') total_ttc_by_vats='.$total_ttc_by_vats[$obj->vatrate].($diff?" => DIFF":"")."
\n";
+ if ($diff)
+ {
+ if (abs($diff) > 0.1) { dol_syslog('A rounding difference was detected into TOTAL but is too high to be corrected', LOG_WARNING); exit; }
+ $sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".($obj->total_tva - $diff).", total_ttc = ".($obj->total_ttc - $diff)." WHERE rowid = ".$obj->rowid;
+ dol_syslog('We found a difference of '.$diff.' for line rowid = '.$obj->rowid.". We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
+ $resqlfix=$this->db->query($sqlfix);
+ if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
+ $this->total_tva -= $diff;
+ $this->total_ttc -= $diff;
+ $total_tva_by_vats[$obj->vatrate] -= $diff;
+ $total_ttc_by_vats[$obj->vatrate] -= $diff;
+ }
}
- }
- $i++;
+ $i++;
}
// Add revenue stamp to total
$this->total_ttc += isset($this->revenuestamp)?$this->revenuestamp:0;
$this->multicurrency_total_ttc += isset($this->revenuestamp)?($this->revenuestamp * $multicurrency_tx):0;
- // Situations totals
- if ($this->situation_cycle_ref && $this->situation_counter > 1 && method_exists($this, 'get_prev_sits')) {
- $prev_sits = $this->get_prev_sits();
+ // Situations totals
+ if ($this->situation_cycle_ref && $this->situation_counter > 1 && method_exists($this, 'get_prev_sits'))
+ {
+ $prev_sits = $this->get_prev_sits();
- foreach ($prev_sits as $sit) { // $sit is an object Facture loaded with a fetch.
- $this->total_ht -= $sit->total_ht;
- $this->total_tva -= $sit->total_tva;
- $this->total_localtax1 -= $sit->total_localtax1;
- $this->total_localtax2 -= $sit->total_localtax2;
- $this->total_ttc -= $sit->total_ttc;
- $this->multicurrency_total_ht -= $sit->multicurrency_total_ht;
- $this->multicurrency_total_tva -= $sit->multicurrency_total_tva;
- $this->multicurrency_total_ttc -= $sit->multicurrency_total_ttc;
- }
+ foreach ($prev_sits as $sit) { // $sit is an object Facture loaded with a fetch.
+ $this->total_ht -= $sit->total_ht;
+ $this->total_tva -= $sit->total_tva;
+ $this->total_localtax1 -= $sit->total_localtax1;
+ $this->total_localtax2 -= $sit->total_localtax2;
+ $this->total_ttc -= $sit->total_ttc;
+ $this->multicurrency_total_ht -= $sit->multicurrency_total_ht;
+ $this->multicurrency_total_tva -= $sit->multicurrency_total_tva;
+ $this->multicurrency_total_ttc -= $sit->multicurrency_total_ttc;
}
+ }
$this->db->free($resql);
@@ -2441,35 +2444,35 @@ abstract class CommonObject
if (empty($nodatabaseupdate))
{
- $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET';
- $sql .= " ".$fieldht."='".price2num($this->total_ht)."',";
- $sql .= " ".$fieldtva."='".price2num($this->total_tva)."',";
- $sql .= " ".$fieldlocaltax1."='".price2num($this->total_localtax1)."',";
- $sql .= " ".$fieldlocaltax2."='".price2num($this->total_localtax2)."',";
- $sql .= " ".$fieldttc."='".price2num($this->total_ttc)."'";
- $sql .= ", multicurrency_total_ht='".price2num($this->multicurrency_total_ht, 'MT', 1)."'";
- $sql .= ", multicurrency_total_tva='".price2num($this->multicurrency_total_tva, 'MT', 1)."'";
- $sql .= ", multicurrency_total_ttc='".price2num($this->multicurrency_total_ttc, 'MT', 1)."'";
- $sql .= ' WHERE rowid = '.$this->id;
+ $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET';
+ $sql .= " ".$fieldht."='".price2num($this->total_ht)."',";
+ $sql .= " ".$fieldtva."='".price2num($this->total_tva)."',";
+ $sql .= " ".$fieldlocaltax1."='".price2num($this->total_localtax1)."',";
+ $sql .= " ".$fieldlocaltax2."='".price2num($this->total_localtax2)."',";
+ $sql .= " ".$fieldttc."='".price2num($this->total_ttc)."'";
+ $sql .= ", multicurrency_total_ht='".price2num($this->multicurrency_total_ht, 'MT', 1)."'";
+ $sql .= ", multicurrency_total_tva='".price2num($this->multicurrency_total_tva, 'MT', 1)."'";
+ $sql .= ", multicurrency_total_ttc='".price2num($this->multicurrency_total_ttc, 'MT', 1)."'";
+ $sql .= ' WHERE rowid = '.$this->id;
- //print "xx".$sql;
- dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
- $resql=$this->db->query($sql);
- if (! $resql)
- {
- $error++;
- $this->error=$this->db->lasterror();
- $this->errors[]=$this->db->lasterror();
- }
+ //print "xx".$sql;
+ dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
+ $resql=$this->db->query($sql);
+ if (! $resql)
+ {
+ $error++;
+ $this->error=$this->db->lasterror();
+ $this->errors[]=$this->db->lasterror();
+ }
}
if (! $error)
{
- return 1;
+ return 1;
}
else
{
- return -1;
+ return -1;
}
}
else
@@ -2477,7 +2480,6 @@ abstract class CommonObject
dol_print_error($this->db,'Bad request in update_price');
return -1;
}
- }
}
/**