Merge branch '12.0' of git@github.com:Dolibarr/dolibarr.git into develop
Conflicts: .travis.yml htdocs/accountancy/bookkeeping/balance.php htdocs/adherents/class/subscription.class.php htdocs/compta/bank/categ.php htdocs/compta/facture/class/facture.class.php htdocs/core/boxes/box_task.php htdocs/core/class/commondocgenerator.class.php htdocs/core/class/interfaces.class.php htdocs/core/lib/project.lib.php htdocs/core/modules/modCategorie.class.php htdocs/expensereport/class/expensereport.class.php htdocs/fichinter/class/fichinterrec.class.php htdocs/fourn/class/fournisseur.commande.class.php htdocs/fourn/class/fournisseur.facture.class.php htdocs/install/repair.php htdocs/main.inc.php htdocs/product/price.php htdocs/projet/tasks/time.php htdocs/reception/card.php
This commit is contained in:
commit
574919de52
@ -120,7 +120,7 @@ install:
|
||||
|
||||
- |
|
||||
echo "Adding path of binaries tools installed by composer to the PATH"
|
||||
export PATH="$TRAVIS_BUILD_DIR/htdocs/includes/bin:$TRAVIS_BUILD_DIR/vendor/bin:$TRAVIS_BUILD_DIR/htdocs/includes:$PATH"
|
||||
export PATH="$TRAVIS_BUILD_DIR/htdocs/includes/bin:$PATH"
|
||||
echo $PATH
|
||||
ls $TRAVIS_BUILD_DIR/vendor
|
||||
ls $TRAVIS_BUILD_DIR/htdocs/includes/bin
|
||||
|
||||
@ -360,12 +360,12 @@ if ($action != 'export_csv')
|
||||
|
||||
if (!empty($show_subgroup))
|
||||
{
|
||||
print '<tr class="liste_total"><td class="right" colspan="2">'.$langs->trans("SubTotal").':</td><td class="nowrap right">'.price($sous_total_debit).'</td><td class="nowrap right">'.price($sous_total_credit).'</td><td class="nowrap right">'.price(price2num($sous_total_debit - $sous_total_credit)).'</td>';
|
||||
print '<tr class="liste_total"><td class="right" colspan="2">'.$langs->trans("SubTotal").':</td><td class="nowrap right">'.price($sous_total_debit).'</td><td class="nowrap right">'.price($sous_total_credit).'</td><td class="nowrap right">'.price(price2num($sous_total_opening_balance + $sous_total_debit - $sous_total_credit, 'MT')).'</td>';
|
||||
print "<td></td>\n";
|
||||
print '</tr>';
|
||||
}
|
||||
|
||||
print '<tr class="liste_total"><td class="right" colspan="2">'.$langs->trans("AccountBalance").':</td><td class="nowrap right">'.price($total_debit).'</td><td class="nowrap right">'.price($total_credit).'</td><td class="nowrap right">'.price(price2num($total_debit - $total_credit)).'</td>';
|
||||
print '<tr class="liste_total"><td class="right" colspan="2">'.$langs->trans("AccountBalance").':</td><td class="nowrap right">'.price($total_debit).'</td><td class="nowrap right">'.price($total_credit).'</td><td class="nowrap right">'.price(price2num($total_opening_balance + $total_debit - $total_credit, 'MT')).'</td>';
|
||||
print "<td></td>\n";
|
||||
print '</tr>';
|
||||
|
||||
|
||||
@ -250,11 +250,16 @@ class Subscription extends CommonObject
|
||||
|
||||
$this->db->begin();
|
||||
|
||||
if (!is_numeric($this->amount)) {
|
||||
$this->error = 'BadValueForParameterAmount';
|
||||
return -1;
|
||||
}
|
||||
|
||||
$sql = "UPDATE ".MAIN_DB_PREFIX."subscription SET ";
|
||||
$sql .= " fk_type = ".$this->fk_type.",";
|
||||
$sql .= " fk_adherent = ".$this->fk_adherent.",";
|
||||
$sql .= " note=".($this->note ? "'".$this->db->escape($this->note)."'" : 'null').",";
|
||||
$sql .= " subscription = '".price2num($this->amount)."',";
|
||||
$sql .= " subscription = ".price2num($this->amount).",";
|
||||
$sql .= " dateadh='".$this->db->idate($this->dateh)."',";
|
||||
$sql .= " datef='".$this->db->idate($this->datef)."',";
|
||||
$sql .= " datec='".$this->db->idate($this->datec)."',";
|
||||
|
||||
@ -145,7 +145,7 @@ print '</tr>';
|
||||
// Description
|
||||
print '<tr>';
|
||||
print '<td>'.$langs->trans("Description").'</td>';
|
||||
print '<td >';
|
||||
print '<td>';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
|
||||
$doleditor = new DolEditor('description', $object->description, '', 200, 'dolibarr_notes', '', false, true, $conf->fckeditor->enabled, ROWS_6, '90%');
|
||||
$doleditor->Create();
|
||||
@ -154,7 +154,7 @@ print '</td></tr>';
|
||||
// Color
|
||||
print '<tr>';
|
||||
print '<td>'.$langs->trans("Color").'</td>';
|
||||
print '<td >';
|
||||
print '<td>';
|
||||
print $formother->selectColor($object->color, 'color');
|
||||
print '</td></tr>';
|
||||
|
||||
|
||||
@ -3086,6 +3086,7 @@ class Commande extends CommonOrder
|
||||
|
||||
// Clean vat code
|
||||
$vat_src_code = '';
|
||||
$reg = array();
|
||||
if (preg_match('/\((.*)\)/', $txtva, $reg))
|
||||
{
|
||||
$vat_src_code = $reg[1];
|
||||
|
||||
@ -885,7 +885,7 @@ if ($action == 'create')
|
||||
print '<td><input size="12" type="text" class="flat" name="account_min_allowed" value="'.(isset($_POST["account_min_allowed"]) ?GETPOST("account_min_allowed") : $object->min_allowed).'"></td></tr>';
|
||||
|
||||
print '<tr><td>'.$langs->trans("BalanceMinimalDesired").'</td>';
|
||||
print '<td ><input size="12" type="text" class="flat" name="account_min_desired" value="'.(isset($_POST["account_min_desired"]) ?GETPOST("account_min_desired") : $object->min_desired).'"></td></tr>';
|
||||
print '<td><input size="12" type="text" class="flat" name="account_min_desired" value="'.(isset($_POST["account_min_desired"]) ?GETPOST("account_min_desired") : $object->min_desired).'"></td></tr>';
|
||||
|
||||
// Web
|
||||
print '<tr><td>'.$langs->trans("Web").'</td>';
|
||||
|
||||
@ -3295,6 +3295,7 @@ class Facture extends CommonInvoice
|
||||
$localtaxes_type = getLocalTaxesFromRate($txtva, 0, $this->thirdparty, $mysoc);
|
||||
|
||||
// Clean vat code
|
||||
$reg = array();
|
||||
$vat_src_code = '';
|
||||
if (preg_match('/\((.*)\)/', $txtva, $reg))
|
||||
{
|
||||
|
||||
@ -1469,9 +1469,9 @@ class Contrat extends CommonObject
|
||||
}
|
||||
|
||||
$txtva = price2num($txtva);
|
||||
|
||||
$txlocaltax1 = price2num($txlocaltax1);
|
||||
$txlocaltax2 = price2num($txlocaltax2);
|
||||
|
||||
$remise_percent = price2num($remise_percent);
|
||||
$qty = price2num($qty);
|
||||
if (empty($qty)) $qty = 1;
|
||||
|
||||
@ -137,7 +137,7 @@ class box_task extends ModeleBoxes
|
||||
$boxcontent .= '<script>date = new Date(); date.setTime(date.getTime()+(30*86400000)); document.cookie = "'.$cookie_name.'='.$filterValue.'; expires= " + date.toGMTString() + "; path=/ "; </script>';
|
||||
}
|
||||
$this->info_box_contents[0][] = array(
|
||||
'tr'=>'class="nohover showiffilter'.$this->boxcode.' hideobject"',
|
||||
'tr' => 'class="nohover showiffilter'.$this->boxcode.' hideobject"',
|
||||
'td' => 'class="nohover"',
|
||||
'textnoformat' => $boxcontent,
|
||||
);
|
||||
|
||||
@ -1389,7 +1389,7 @@ abstract class CommonDocGenerator
|
||||
if ($itemsInRow > 0) {
|
||||
// close table row and empty cols
|
||||
for ($i = $itemsInRow; $i <= $maxItemsInRow; $i++) {
|
||||
$html .= "<td ></td><td></td>";
|
||||
$html .= "<td></td><td></td>";
|
||||
}
|
||||
$html .= "</tr>";
|
||||
|
||||
|
||||
@ -207,7 +207,7 @@ class Interfaces
|
||||
if ($result < 0)
|
||||
{
|
||||
// Action KO
|
||||
//dol_syslog("Error in trigger ".$action." - Nb of error string returned = ".count($objMod->errors), LOG_ERR);
|
||||
//dol_syslog("Error in trigger ".$action." - result = ".$result." - Nb of error string returned = ".count($objMod->errors), LOG_ERR);
|
||||
$nbtotal++;
|
||||
$nbko++;
|
||||
if (!empty($objMod->errors)) $this->errors = array_merge($this->errors, $objMod->errors);
|
||||
|
||||
@ -4755,14 +4755,15 @@ function price($amount, $form = 0, $outlangs = '', $trunc = 1, $rounding = -1, $
|
||||
* 'MS'=Round to Max for stock quantity (MAIN_MAX_DECIMALS_STOCK)
|
||||
* 'CR'=Currency rate
|
||||
* Numeric = Nb of digits for rounding
|
||||
* @param int $alreadysqlnb Put 1 if you know that content is already universal format number
|
||||
* @param int $option Put 1 if you know that content is already universal format number (so no correction on decimal will be done)
|
||||
* Put 2 if you know that number is a user input (so we know we don't have to fix decimal separator).
|
||||
* @return string Amount with universal numeric format (Example: '99.99999').
|
||||
* If conversion fails, it return text unchanged if $rounding = '' or '0' if $rounding is defined.
|
||||
* If amount is null or '', it returns '' if $rounding = '' or '0' if $rounding is defined..
|
||||
*
|
||||
* @see price() Opposite function of price2num
|
||||
*/
|
||||
function price2num($amount, $rounding = '', $alreadysqlnb = 0)
|
||||
function price2num($amount, $rounding = '', $option = 0)
|
||||
{
|
||||
global $langs, $conf;
|
||||
|
||||
@ -4777,14 +4778,16 @@ function price2num($amount, $rounding = '', $alreadysqlnb = 0)
|
||||
//print "amount=".$amount." html=".$form." trunc=".$trunc." nbdecimal=".$nbdecimal." dec='".$dec."' thousand='".$thousand."'<br>";
|
||||
|
||||
// Convert value to universal number format (no thousand separator, '.' as decimal separator)
|
||||
if ($alreadysqlnb != 1) { // If not a PHP number or unknown, we change or clean format
|
||||
if ($option != 1) { // If not a PHP number or unknown, we change or clean format
|
||||
//print 'PP'.$amount.' - '.$dec.' - '.$thousand.' - '.intval($amount).'<br>';
|
||||
|
||||
if ($thousand == '.' && preg_match('/\.(\d\d\d)$/', (string) $amount)) { // It means the . is used as a thousand separator, not as a decimal separator
|
||||
$amount = str_replace($thousand, '', $amount); // Replace of thousand before test of is_numeric to avoid pb if thousand is . and there is 3 numbers after
|
||||
if ($option == 2 && $thousand == '.' && preg_match('/\.(\d\d\d)$/', (string) $amount)) { // It means the . is used as a thousand separator and string come frominput data, so 1.123 is 1123
|
||||
$amount = str_replace($thousand, '', $amount);
|
||||
}
|
||||
|
||||
// Convert amount to format with dolibarr dec and thousand (this is because PHP convert a number
|
||||
// to format defined by LC_NUMERIC after a calculation and we want source format to be like defined by Dolibarr setup.
|
||||
// So if number was already a good number, it is converted into local Dolibarr setup.
|
||||
if (is_numeric($amount))
|
||||
{
|
||||
// We put in temps value of decimal ("0.00001"). Works with 0 and 2.0E-5 and 9999.10
|
||||
@ -4793,7 +4796,7 @@ function price2num($amount, $rounding = '', $alreadysqlnb = 0)
|
||||
$nbofdec = max(0, dol_strlen($temps) - 2); // -2 to remove "0."
|
||||
$amount = number_format($amount, $nbofdec, $dec, $thousand);
|
||||
}
|
||||
//print "QQ".$amount.'<br>';
|
||||
//print "QQ".$amount."<br>\n";
|
||||
|
||||
// Now make replace (the main goal of function)
|
||||
if ($thousand != ',' && $thousand != '.') {
|
||||
|
||||
@ -103,10 +103,14 @@ function calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocalt
|
||||
$seller = $mysoc; // If sell is done to a customer, $seller is not provided, we use $mysoc
|
||||
//var_dump($seller->country_id);exit;
|
||||
}
|
||||
if (empty($localtaxes_array) || !is_array($localtaxes_array))
|
||||
{
|
||||
if (empty($localtaxes_array) || !is_array($localtaxes_array)) {
|
||||
dol_syslog("Price.lib::calcul_price_total Warning: function is called with parameter localtaxes_array that is missing", LOG_WARNING);
|
||||
}
|
||||
if (!is_numeric($txtva)) {
|
||||
dol_syslog("Price.lib::calcul_price_total Warning: function was called with a parameter vat rate that is not a real numeric value. There is surely a bug.", LOG_ERR);
|
||||
} elseif ($txtva >= 1000) {
|
||||
dol_syslog("Price.lib::calcul_price_total Warning: function was called with a bad value for vat rate (should be often < 100, always < 1000). There is surely a bug.", LOG_ERR);
|
||||
}
|
||||
// Too verbose. Enable for debug only
|
||||
//dol_syslog("Price.lib::calcul_price_total qty=".$qty." pu=".$pu." remiserpercent_ligne=".$remise_percent_ligne." txtva=".$txtva." uselocaltax1_rate=".$uselocaltax1_rate." uselocaltax2_rate=".$uselocaltax2_rate.' remise_percent_global='.$remise_percent_global.' price_base_type='.$ice_base_type.' type='.$type.' progress='.$progress);
|
||||
|
||||
|
||||
@ -2400,8 +2400,8 @@ function getTaskProgressView($task, $label = true, $progressNumber = true, $hide
|
||||
// this conf is actually hidden, by default we use 10% for "be carefull or warning"
|
||||
$warningRatio = !empty($conf->global->PROJECT_TIME_SPEND_WARNING_PERCENT) ? (1 + $conf->global->PROJECT_TIME_SPEND_WARNING_PERCENT / 100) : 1.10;
|
||||
|
||||
$diffTitle = '<br/>'.$langs->trans('ProgressDeclared').' : '.$task->progress.($task->progress ? '%' : '');
|
||||
$diffTitle .= '<br/>'.$langs->trans('ProgressCalculated').' : '.$progressCalculated.($progressCalculated ? '%' : '');
|
||||
$diffTitle = '<br>'.$langs->trans('ProgressDeclared').' : '.$task->progress.($task->progress ? '%' : '');
|
||||
$diffTitle .= '<br>'.$langs->trans('ProgressCalculated').' : '.$progressCalculated.($progressCalculated ? '%' : '');
|
||||
|
||||
//var_dump($progressCalculated.' '.$warningRatio.' '.$task->progress.' '.doubleval($task->progress * $warningRatio));
|
||||
if (doubleval($progressCalculated) > doubleval($task->progress * $warningRatio)) {
|
||||
|
||||
@ -300,6 +300,7 @@ class modBom extends DolibarrModules
|
||||
$this->export_dependencies_array[$r] = array('bomline'=>'tl.rowid'); // To force to activate one or several fields if we select some fields that need same (like to select a unique key if we ask a field of a child to avoid the DISTINCT to discard them, or for computed field than need several other fields)
|
||||
$this->export_sql_start[$r] = 'SELECT DISTINCT ';
|
||||
$this->export_sql_end[$r] = ' FROM '.MAIN_DB_PREFIX.'bom_bom as t';
|
||||
$this->export_sql_end[$r] .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bom_bom_extrafields as extra on (t.rowid = extra.fk_object)';
|
||||
$this->export_sql_end[$r] .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bom_bomline as tl ON tl.fk_bom = t.rowid';
|
||||
$this->export_sql_end[$r] .= ' WHERE 1 = 1';
|
||||
$this->export_sql_end[$r] .= ' AND t.entity IN ('.getEntity('bom').')';
|
||||
|
||||
@ -176,56 +176,20 @@ class modCategorie extends DolibarrModules
|
||||
's.idprof4'=>"company", 's.tva_intra'=>"company", 's.capital'=>"company", 's.note_public'=>"company", 's.fk_prospectlevel'=>'company',
|
||||
's.fk_stcomm'=>'company'
|
||||
); // We define here only fields that use another picto
|
||||
|
||||
$keyforselect = 'societe'; $keyforelement = 'company'; $keyforaliasextra = 'extrasoc';
|
||||
include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php';
|
||||
|
||||
$this->export_sql_start[$r] = 'SELECT DISTINCT ';
|
||||
$this->export_sql_end[$r] = ' FROM '.MAIN_DB_PREFIX.'categorie as u, ';
|
||||
$this->export_sql_end[$r] .= MAIN_DB_PREFIX.'categorie_societe as cf, ';
|
||||
$this->export_sql_end[$r] .= MAIN_DB_PREFIX.'societe as s LEFT JOIN '.MAIN_DB_PREFIX.'c_typent as t ON s.fk_typent = t.id LEFT JOIN '.MAIN_DB_PREFIX.'c_country as c ON s.fk_pays = c.rowid LEFT JOIN '.MAIN_DB_PREFIX.'c_effectif as ce ON s.fk_effectif = ce.id LEFT JOIN '.MAIN_DB_PREFIX.'c_forme_juridique as cfj ON s.fk_forme_juridique = cfj.code LEFT JOIN '.MAIN_DB_PREFIX.'societe_extrafields as extra ON s.rowid = extra.fk_object ';
|
||||
$this->export_sql_end[$r] .= MAIN_DB_PREFIX.'societe as s';
|
||||
$this->export_sql_end[$r] .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_typent as t ON s.fk_typent = t.id LEFT JOIN '.MAIN_DB_PREFIX.'c_country as c ON s.fk_pays = c.rowid LEFT JOIN '.MAIN_DB_PREFIX.'c_effectif as ce ON s.fk_effectif = ce.id LEFT JOIN '.MAIN_DB_PREFIX.'c_forme_juridique as cfj ON s.fk_forme_juridique = cfj.code';
|
||||
$this->export_sql_end[$r] .= ' LEFT JOIN '.MAIN_DB_PREFIX.'societe_extrafields as extrasoc ON s.rowid = extrasoc.fk_object ';
|
||||
$this->export_sql_end[$r] .= ' WHERE u.rowid = cf.fk_categorie AND cf.fk_soc = s.rowid';
|
||||
$this->export_sql_end[$r] .= ' AND u.entity IN ('.getEntity('category').')';
|
||||
$this->export_sql_end[$r] .= ' AND u.type = 2'; // Customer/Prospect categories
|
||||
|
||||
// Add extra fields
|
||||
$sql = "SELECT name, label, type, param FROM ".MAIN_DB_PREFIX."extrafields WHERE elementtype = 'societe' AND entity IN (0, ".$conf->entity.")";
|
||||
$resql = $this->db->query($sql);
|
||||
if ($resql) // This can fail when class is used on old database (during migration for example)
|
||||
{
|
||||
while ($obj = $this->db->fetch_object($resql))
|
||||
{
|
||||
$fieldname = 'extra.'.$obj->name;
|
||||
$fieldlabel = ucfirst($obj->label);
|
||||
$typeFilter = "Text";
|
||||
switch ($obj->type)
|
||||
{
|
||||
case 'int':
|
||||
case 'double':
|
||||
case 'price':
|
||||
$typeFilter = "Numeric";
|
||||
break;
|
||||
case 'date':
|
||||
case 'datetime':
|
||||
$typeFilter = "Date";
|
||||
break;
|
||||
case 'boolean':
|
||||
$typeFilter = "Boolean";
|
||||
break;
|
||||
case 'sellist':
|
||||
$typeFilter = "List:".$obj->param;
|
||||
break;
|
||||
case 'select':
|
||||
$typeFilter = "Select:".$obj->param;
|
||||
break;
|
||||
}
|
||||
$this->export_fields_array[$r][$fieldname] = $fieldlabel;
|
||||
$this->export_TypeFields_array[$r][$fieldname] = $typeFilter;
|
||||
$this->export_entities_array[$r][$fieldname] = 'company';
|
||||
}
|
||||
}
|
||||
// End add axtra fields
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
$r++;
|
||||
$this->export_code[$r] = 'category_'.$r;
|
||||
$this->export_label[$r] = 'CatProdList';
|
||||
|
||||
@ -1805,6 +1805,7 @@ class ExpenseReport extends CommonObject
|
||||
$localtaxes_type = getLocalTaxesFromRate($vatrate, 0, $mysoc, $this->thirdparty);
|
||||
|
||||
$vat_src_code = '';
|
||||
$reg = array();
|
||||
if (preg_match('/\s*\((.*)\)/', $vatrate, $reg))
|
||||
{
|
||||
$vat_src_code = $reg[1];
|
||||
@ -2038,6 +2039,7 @@ class ExpenseReport extends CommonObject
|
||||
$localtaxes_type = getLocalTaxesFromRate($vatrate, 0, $buyer, $seller);
|
||||
|
||||
// Clean vat code
|
||||
$reg = array();
|
||||
$vat_src_code = '';
|
||||
if (preg_match('/\((.*)\)/', $vatrate, $reg))
|
||||
{
|
||||
@ -2053,10 +2055,6 @@ class ExpenseReport extends CommonObject
|
||||
|
||||
$tx_tva = $vatrate / 100;
|
||||
$tx_tva = $tx_tva + 1;
|
||||
$total_ht = price2num($total_ttc / $tx_tva, 'MT');
|
||||
|
||||
$total_tva = price2num($total_ttc - $total_ht, 'MT');
|
||||
// fin calculs
|
||||
|
||||
$this->line = new ExpenseReportLine($this->db);
|
||||
$this->line->comments = $comments;
|
||||
|
||||
@ -102,6 +102,7 @@ class Export
|
||||
// Search module files
|
||||
while (($file = readdir($handle)) !== false)
|
||||
{
|
||||
$reg = array();
|
||||
if (is_readable($dir.$file) && preg_match("/^(mod.*)\.class\.php$/i", $file, $reg))
|
||||
{
|
||||
$modulename = $reg[1];
|
||||
|
||||
@ -1723,8 +1723,6 @@ class CommandeFournisseur extends CommonOrder
|
||||
$localtax1_type = $localtaxes_type[0];
|
||||
$localtax2_type = $localtaxes_type[2];
|
||||
|
||||
$subprice = price2num($pu, 'MU');
|
||||
|
||||
$rangmax = $this->line_max();
|
||||
$rang = $rangmax + 1;
|
||||
|
||||
@ -2578,6 +2576,7 @@ class CommandeFournisseur extends CommonOrder
|
||||
$localtaxes_type = getLocalTaxesFromRate($txtva, 0, $mysoc, $this->thirdparty);
|
||||
|
||||
// Clean vat code
|
||||
$reg = array();
|
||||
$vat_src_code = '';
|
||||
if (preg_match('/\((.*)\)/', $txtva, $reg))
|
||||
{
|
||||
@ -2604,12 +2603,9 @@ class CommandeFournisseur extends CommonOrder
|
||||
$localtax1_type = $localtaxes_type[0];
|
||||
$localtax2_type = $localtaxes_type[2];
|
||||
|
||||
$subprice = price2num($pu_ht, 'MU');
|
||||
|
||||
//Fetch current line from the database and then clone the object and set it in $oldline property
|
||||
$this->line = new CommandeFournisseurLigne($this->db);
|
||||
$this->line->fetch($rowid);
|
||||
$this->line->fetch_optionals();
|
||||
|
||||
$oldline = clone $this->line;
|
||||
$this->line->oldline = $oldline;
|
||||
|
||||
@ -1634,11 +1634,11 @@ class FactureFournisseur extends CommonInvoice
|
||||
$remise_percent = price2num($remise_percent);
|
||||
$qty = price2num($qty);
|
||||
$pu = price2num($pu);
|
||||
$txlocaltax1 = price2num($txlocaltax1);
|
||||
$txlocaltax2 = price2num($txlocaltax2);
|
||||
if (!preg_match('/\((.*)\)/', $txtva)) {
|
||||
$txtva = price2num($txtva); // $txtva can have format '5,1' or '5.1' or '5.1(XXX)', we must clean only if '5,1'
|
||||
}
|
||||
$txlocaltax1 = price2num($txlocaltax1);
|
||||
$txlocaltax2 = price2num($txlocaltax2);
|
||||
|
||||
if ($date_start && $date_end && $date_start > $date_end) {
|
||||
$langs->load("errors");
|
||||
@ -1884,8 +1884,6 @@ class FactureFournisseur extends CommonInvoice
|
||||
$txlocaltax1 = price2num($txlocaltax1);
|
||||
$txlocaltax2 = price2num($txlocaltax2);
|
||||
|
||||
$localtaxes_type = array($txlocaltax1, $txlocaltax2);
|
||||
|
||||
// Calcul du total TTC et de la TVA pour la ligne a partir de
|
||||
// qty, pu, remise_percent et txtva
|
||||
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
|
||||
|
||||
@ -225,7 +225,7 @@ if ($ok && GETPOST('standard', 'alpha'))
|
||||
$listofmodulesextra = array('societe'=>'societe', 'adherent'=>'adherent', 'product'=>'product',
|
||||
'socpeople'=>'socpeople', 'commande'=>'commande', 'facture'=>'facture',
|
||||
'supplier_proposal'=>'supplier_proposal', 'commande_fournisseur'=>'commande_fournisseur', 'facture_fourn'=>'facture_fourn',
|
||||
'actioncomm'=>'actioncomm',
|
||||
'actioncomm'=>'actioncomm', 'bom_bom'=>'bom_bom', 'mrp_mo'=>'mrp_mo',
|
||||
'adherent_type'=>'adherent_type', 'user'=>'user', 'projet'=>'projet', 'projet_task'=>'projet_task');
|
||||
print '<tr><td colspan="2"><br>*** Check fields into extra table structure match table of definition. If not add column into table</td></tr>';
|
||||
foreach ($listofmodulesextra as $tablename => $elementtype)
|
||||
|
||||
@ -1714,7 +1714,7 @@ function top_menu($head, $title = '', $target = '', $disablejs = 0, $disablehead
|
||||
}
|
||||
|
||||
if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
|
||||
$text = '<span href="#" class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.'</span></span>';
|
||||
$text = '<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.'</span></span>';
|
||||
$toprightmenu .= $form->textwithtooltip('', $appli, 2, 1, $text, 'login_block_elem', 2);
|
||||
}
|
||||
|
||||
|
||||
@ -33,6 +33,7 @@
|
||||
* \ingroup product
|
||||
* \brief Page to show product prices
|
||||
*/
|
||||
|
||||
require '../main.inc.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
|
||||
@ -111,6 +112,7 @@ if (empty($reshook))
|
||||
|
||||
// We must define tva_tx, npr and local taxes
|
||||
$tva_tx = $tva_tx_txt;
|
||||
$reg = array();
|
||||
$vatratecode = '';
|
||||
if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg))
|
||||
{
|
||||
@ -262,8 +264,8 @@ if (empty($reshook))
|
||||
}
|
||||
|
||||
$pricestoupdate[$i] = array(
|
||||
'price' => price2num($newprice[$i]),
|
||||
'price_min' => price2num($newprice_min[$i]),
|
||||
'price' => price2num($newprice[$i], '', 2),
|
||||
'price_min' => price2num($newprice_min[$i], '', 2),
|
||||
'price_base_type' => $newpricebase[$i],
|
||||
'default_vat_code' => $vatratecode,
|
||||
'vat_tx' => $tva_tx, // default_vat_code should be used in priority in a future
|
||||
@ -278,8 +280,8 @@ if (empty($reshook))
|
||||
}
|
||||
} elseif (!$error)
|
||||
{
|
||||
$newprice = price2num(GETPOST('price', 'alpha'));
|
||||
$newprice_min = price2num(GETPOST('price_min', 'alpha'));
|
||||
$newprice = price2num(GETPOST('price', 'alpha'), '', 2);
|
||||
$newprice_min = price2num(GETPOST('price_min', 'alpha'), '', 2);
|
||||
$newpricebase = GETPOST('price_base_type', 'alpha');
|
||||
$tva_tx_txt = GETPOST('tva_tx', 'alpha'); // tva_tx can be '8.5' or '8.5*' or '8.5 (XXX)' or '8.5* (XXX)'
|
||||
|
||||
|
||||
@ -1398,7 +1398,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0)
|
||||
if (!empty($arrayfields['value']['checked']))
|
||||
{
|
||||
print '<td class="nowraponall right">';
|
||||
$value = price2num($task_time->thm * $task_time->task_duration / 3600, 'MT');
|
||||
$value = price2num($task_time->thm * $task_time->task_duration / 3600, 'MT', 1);
|
||||
print price($value, 1, $langs, 1, -1, -1, $conf->currency);
|
||||
print '</td>';
|
||||
if (!$i) $totalarray['nbfield']++;
|
||||
@ -1598,7 +1598,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0)
|
||||
if (!empty($arrayfields['value']['checked']))
|
||||
{
|
||||
print '<td class="right">';
|
||||
$value = price2num($task_time->thm * $task_time->task_duration / 3600);
|
||||
$value = price2num($task_time->thm * $task_time->task_duration / 3600, 'MT', 1);
|
||||
print price($value, 1, $langs, 1, -1, -1, $conf->currency);
|
||||
print '</td>';
|
||||
}
|
||||
@ -1607,7 +1607,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0)
|
||||
if (!empty($arrayfields['valuebilled']['checked']))
|
||||
{
|
||||
print '<td class="right">';
|
||||
$valuebilled = price2num($task_time->total_ht);
|
||||
$valuebilled = price2num($task_time->total_ht, '', 1);
|
||||
if (isset($task_time->total_ht)) print price($valuebilled, 1, $langs, 1, -1, -1, $conf->currency);
|
||||
print '</td>';
|
||||
}
|
||||
@ -1745,7 +1745,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0)
|
||||
if (!empty($arrayfields['valuebilled']['checked']))
|
||||
{
|
||||
print '<td class="right">';
|
||||
$valuebilled = price2num($task_time->total_ht);
|
||||
$valuebilled = price2num($task_time->total_ht, '', 1);
|
||||
if (isset($task_time->total_ht)) print price($valuebilled, 1, $langs, 1, -1, -1, $conf->currency);
|
||||
print '</td>';
|
||||
}
|
||||
|
||||
@ -1754,7 +1754,7 @@ if ($action == 'create')
|
||||
|
||||
if ($action == 'editline' && $lines[$i]->id == $line_id)
|
||||
{
|
||||
print '<td ><textarea name="comment'.$line_id.'" id="comment'.$line_id.'" /> '.$lines[$i]->comment.'</textarea></td>';
|
||||
print '<td><textarea name="comment'.$line_id.'" id="comment'.$line_id.'" /> '.$lines[$i]->comment.'</textarea></td>';
|
||||
} else {
|
||||
print '<td style="white-space: pre-wrap;max-width: 200px;" >'.$lines[$i]->comment.'</td>';
|
||||
}
|
||||
|
||||
@ -2070,7 +2070,7 @@ class Societe extends CommonObject
|
||||
$discount->amount_tva = $discount->multicurrency_amount_tva = price2num($remise * $vatrate / 100, 'MT');
|
||||
$discount->amount_ttc = $discount->multicurrency_amount_ttc = price2num($discount->amount_ht + $discount->amount_tva, 'MT');
|
||||
|
||||
$discount->tva_tx = price2num($vatrate, 'MT');
|
||||
$discount->tva_tx = price2num($vatrate);
|
||||
$discount->vat_src_code = $vat_src_code;
|
||||
|
||||
$discount->description = $desc;
|
||||
|
||||
@ -1262,16 +1262,24 @@ class FunctionsLibTest extends PHPUnit\Framework\TestCase
|
||||
|
||||
// Test with 3 chars after . or ,
|
||||
// If a . is used and there is 3 digits after, it is a thousand separator
|
||||
$this->assertEquals(1234, price2num('1.234'), 'Test 1.234 give 1234 with spanish language');
|
||||
$this->assertEquals(1234, price2num('1.234', '', 2), 'Test 1.234 give 1234 with spanish language if user input');
|
||||
$this->assertEquals(1.234, price2num('1,234', '', 2), 'Test 1,234 give 1234 with spanish language if user input');
|
||||
$this->assertEquals(1234, price2num('1 234', '', 2), 'Test 1 234 give 1234 with spanish language if user input');
|
||||
$this->assertEquals(1.234, price2num('1.234'), 'Test 1.234 give 1.234 with spanish language');
|
||||
$this->assertEquals(1.234, price2num('1,234'), 'Test 1,234 give 1234 with spanish language');
|
||||
$this->assertEquals(1234, price2num('1 234'), 'Test 1 234 give 1234 with spanish language');
|
||||
$this->assertEquals(1234, price2num('1.234'), 'Test 1.234 give 1234 with spanish language');
|
||||
$this->assertEquals(1.234, price2num('1,234'), 'Test 1,234 give 1.234 with spanish language');
|
||||
$this->assertEquals(21500123, price2num('21.500.123'), 'Test 21.500.123 give 21500123 with spanish language');
|
||||
$this->assertEquals(21500123, price2num('21500.123'), 'Test 21500.123 give 21500123 with spanish language');
|
||||
$this->assertEquals(21500123, price2num('21500.123', 0, 2), 'Test 21500.123 give 21500123 with spanish language if user input');
|
||||
$this->assertEquals(21500.123, price2num('21500.123'), 'Test 21500.123 give 21500123 with spanish language');
|
||||
$this->assertEquals(21500.123, price2num('21500,123'), 'Test 21500,123 give 21500.123 with spanish language');
|
||||
// Test with 2 digits
|
||||
$this->assertEquals(21500.12, price2num('21500.12'), 'Test 21500.12 give 21500.12 with spanish language');
|
||||
$this->assertEquals(21500.12, price2num('21500,12'), 'Test 21500,12 give 21500.12 with spanish language');
|
||||
// Test with 3 digits
|
||||
$this->assertEquals(12123, price2num('12.123', '', 2), 'Test 12.123 give 12123 with spanish language if user input');
|
||||
$this->assertEquals(12.123, price2num('12,123', '', 2), 'Test 12,123 give 12.123 with spanish language if user input');
|
||||
$this->assertEquals(12.123, price2num('12.123'), 'Test 12.123 give 12.123 with spanish language');
|
||||
$this->assertEquals(12.123, price2num('12,123'), 'Test 12,123 give 12.123 with spanish language');
|
||||
|
||||
// For french language
|
||||
$newlangs3 = new Translate('', $conf);
|
||||
@ -1279,9 +1287,12 @@ class FunctionsLibTest extends PHPUnit\Framework\TestCase
|
||||
$newlangs3->load("main");
|
||||
$langs = $newlangs3;
|
||||
|
||||
$this->assertEquals(1, price2num('1.000', '', 2), 'Test 1.000 give 1 with french language if user input');
|
||||
$this->assertEquals(1, price2num('1.000'), 'Test 1.000 give 1 with french language');
|
||||
$this->assertEquals(1000, price2num('1 000'), 'Test 1.000 give 1 with french language');
|
||||
$this->assertEquals(1.234, price2num('1.234', '', 2), 'Test 1.234 give 1.234 with french language if user input');
|
||||
$this->assertEquals(1.234, price2num('1.234'), 'Test 1.234 give 1.234 with french language');
|
||||
$this->assertEquals(1.234, price2num('1,234', '', 2), 'Test 1,234 give 1.234 with french language if user input');
|
||||
$this->assertEquals(1.234, price2num('1,234'), 'Test 1,234 give 1.234 with french language');
|
||||
$this->assertEquals(21500000, price2num('21500 000'), 'Test 21500 000 give 21500000 with french language');
|
||||
$this->assertEquals(21500000, price2num('21 500 000'), 'Test 21 500 000 give 21500000 with french language');
|
||||
|
||||
Loading…
Reference in New Issue
Block a user