diff --git a/htdocs/expensereport/ajax/ajaxik.php b/htdocs/expensereport/ajax/ajaxik.php
index 6cd8c05fe5b..9abd767e1f9 100644
--- a/htdocs/expensereport/ajax/ajaxik.php
+++ b/htdocs/expensereport/ajax/ajaxik.php
@@ -51,6 +51,8 @@ $langs->loadlangs(array('errors', 'trips'));
$fk_expense = GETPOST('fk_expense', 'int');
$fk_c_exp_tax_cat = GETPOST('fk_c_exp_tax_cat', 'int');
+$vatrate = GETPOST('vatrate', 'int');
+$qty = GETPOST('qty', 'int');
// Security check
$result = restrictedArea($user, 'expensereport', $fk_expense, 'expensereport');
@@ -61,30 +63,45 @@ $result = restrictedArea($user, 'expensereport', $fk_expense, 'expensereport');
*/
top_httphead();
+$rep = new stdClass();
+$rep->response_status = 0;
+$rep->data = null;
+$rep->error = '';//@todo deprecated use error_message instead
+$rep->errorMessage = '';
+
if (empty($fk_expense) || $fk_expense < 0) {
- echo json_encode(array('error' => $langs->transnoentitiesnoconv('ErrorBadValueForParameter', $fk_expense, 'fk_expense')));
+ $rep->errorMessage = $langs->transnoentitiesnoconv('ErrorBadValueForParameter', $fk_expense, 'fk_expense');
} elseif (empty($fk_c_exp_tax_cat) || $fk_c_exp_tax_cat < 0) {
- echo json_encode(array('error' => $langs->transnoentitiesnoconv('ErrorBadValueForParameter', $fk_c_exp_tax_cat, 'fk_c_exp_tax_cat')));
+ $rep->errorMessage = $langs->transnoentitiesnoconv('ErrorBadValueForParameter', $fk_c_exp_tax_cat, 'fk_c_exp_tax_cat');
+
+ $rep->response_status = 'error';
} else {
// @see ndfp.class.php:3576 (method: compute_total_km)
$expense = new ExpenseReport($db);
if ($expense->fetch($fk_expense) <= 0) {
- echo json_encode(array('error' => $langs->transnoentitiesnoconv('ErrorRecordNotFound'), 'fk_expense' => $fk_expense));
+ $rep->errorMessage = $langs->transnoentitiesnoconv('ErrorRecordNotFound');
+ $rep->response_status = 'error';
} else {
$userauthor = new User($db);
if ($userauthor->fetch($expense->fk_user_author) <= 0) {
- echo json_encode(array('error' => $langs->transnoentitiesnoconv('ErrorRecordNotFound'), 'fk_user_author' => $expense->fk_user_author));
+ $rep->errorMessage = $langs->transnoentitiesnoconv('ErrorRecordNotFound');
+ $rep->response_status = 'error';
} else {
- $expenseik = new ExpenseReportIk($db);
- $range = $expenseik->getRangeByUser($userauthor, $fk_c_exp_tax_cat);
-
- if (empty($range)) {
- echo json_encode(array('error' => $langs->transnoentitiesnoconv('ErrorRecordNotFound'), 'range' => $range));
- } else {
- $ikoffset = price($range->ikoffset, 0, $langs, 1, -1, -1, $conf->currency);
- echo json_encode(array('up' => $range->coef, 'ikoffset' => $range->ikoffset, 'title' => $langs->transnoentitiesnoconv('ExpenseRangeOffset', $ikoffset), 'comment' => 'offset should be applied on addline or updateline'));
+ $expense = new ExpenseReport($db);
+ $result = $expense->fetch($fk_expense);
+ if ($result) {
+ $result = $expense->computeTotalKm($fk_c_exp_tax_cat, $qty, $vatrate);
+ if ($result < 0) {
+ $rep->error = $result;
+ $rep->errorMessage = $langs->trans('errorComputeTtcOnMileageExpense');
+ $rep->response_status = 'error';
+ } else {
+ $rep->data = $result;
+ $rep->response_status = 'success';
+ }
}
}
}
}
+echo json_encode($rep);
diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php
index c1aebe67534..818b3d564a6 100644
--- a/htdocs/expensereport/card.php
+++ b/htdocs/expensereport/card.php
@@ -2377,7 +2377,7 @@ if ($action == 'create') {
// Quantity
print '
';
- print ''; // We must be able to enter decimal qty
+ print ''; // We must be able to enter decimal qty
print ' | ';
//print ''.$langs->trans('AmountHT').' | ';
@@ -2559,7 +2559,7 @@ if ($action == 'create') {
// Quantity
print '';
- print ''; // We must be able to enter decimal qty
+ print ''; // We must be able to enter decimal qty
print ' | ';
// Picture
@@ -2579,7 +2579,7 @@ if ($action == 'create') {
print '';
print '';
-
+ //var_dump($object);
print '';
diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php
index 9a69784adce..da93c26ceaa 100644
--- a/htdocs/expensereport/class/expensereport.class.php
+++ b/htdocs/expensereport/class/expensereport.class.php
@@ -398,7 +398,6 @@ class ExpenseReport extends CommonObject
}
}
-
/**
* Load an object from its id and create a new one in database
*
@@ -2559,6 +2558,106 @@ class ExpenseReport extends CommonObject
return -1;
}
}
+
+ /**
+ * \brief Compute the cost of the kilometers expense based on the number of kilometers and the vehicule category
+ *
+ * @param int $fk_cat Category of the vehicule used
+ * @param real $qty Number of kilometers
+ * @param real $tva VAT rate
+ * @return int <0 if KO, total ttc if OK
+ */
+ public function computeTotalKm($fk_cat, $qty, $tva)
+ {
+ global $langs,$user,$db,$conf;
+
+
+ $cumulYearQty = 0;
+ $ranges = array();
+ $coef = 0;
+
+
+ if ($fk_cat < 0) {
+ $this->error = $langs->trans('ErrorBadParameterCat');
+ return -1;
+ }
+
+ if ($qty <= 0) {
+ $this->error = $langs->trans('ErrorBadParameterQty');
+ return -1;
+ }
+
+ $currentUser = new User($db);
+ $currentUser->fetch($this->fk_user);
+ $currentUser->getrights('expensereport');
+ //Clean
+ $qty = price2num($qty);
+
+ $sql = " SELECT r.range_ik, t.ikoffset as offset, t.coef";
+ $sql .= " FROM ".MAIN_DB_PREFIX."expensereport_ik t";
+ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_exp_tax_range r ON r.rowid = t.fk_range";
+ $sql .= " WHERE t.fk_c_exp_tax_cat = ".(int) $fk_cat;
+ $sql .= " ORDER BY r.range_ik ASC";
+
+ dol_syslog("expenseReport::computeTotalkm sql=".$sql, LOG_DEBUG);
+
+ $result = $this->db->query($sql);
+
+ if ($result) {
+ if ($conf->global->EXPENSEREPORT_CALCULATE_MILEAGE_EXPENSE_COEFFICIENT_ON_CURRENT_YEAR) {
+ $arrayDate = dol_getdate(dol_now());
+ $sql = " SELECT count(n.qty) as cumul FROM ".MAIN_DB_PREFIX."expensereport_det n";
+ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."expensereport e ON e.rowid = n.fk_expensereport";
+ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_type_fees tf ON tf.id = n.fk_c_type_fees";
+ $sql.= " WHERE e.fk_user_author = ".(int) $this->fk_user_author;
+ $sql.= " AND YEAR(n.date) = ".(int) $arrayDate['year'];
+ $sql.= " AND tf.code = 'EX_KME' ";
+ $sql.= " AND e.fk_statut = ".(int) ExpenseReport::STATUS_VALIDATED;
+
+ $resql = $this->db->query($sql);
+
+ if ($resql) {
+ $obj = $this->db->fetch_object($resql);
+ $cumulYearQty = $obj->cumul;
+ }
+ $qty = $cumulYearQty + $qty;
+ }
+
+ $num = $this->db->num_rows($result);
+
+ if ($num) {
+ for ($i = 0; $i < $num; $i++) {
+ $obj = $this->db->fetch_object($result);
+
+ $ranges[$i] = $obj;
+ }
+
+
+ for ($i = 0; $i < $num; $i++) {
+ if ($i < ($num - 1)) {
+ if ($qty > $ranges[$i]->range_ik && $qty < $ranges[$i+1]->range_ik) {
+ $coef = $ranges[$i]->coef;
+ $offset = $ranges[$i]->offset;
+ }
+ } else {
+ if ($qty > $ranges[$i]->range_ik) {
+ $coef = $ranges[$i]->coef;
+ $offset = $ranges[$i]->offset;
+ }
+ }
+ }
+ $total_ht = $coef;
+ return $total_ht;
+ } else {
+ $this->error = $langs->trans('TaxUndefinedForThisCategory');
+ return 0;
+ }
+ } else {
+ $this->error = $this->db->error()." sql=".$sql;
+
+ return -1;
+ }
+ }
}
@@ -2941,4 +3040,6 @@ class ExpenseReportLine extends CommonObjectLine
return -2;
}
}
+
+ // ajouter ici comput_ ...
}
diff --git a/htdocs/expensereport/class/expensereport_ik.class.php b/htdocs/expensereport/class/expensereport_ik.class.php
index 49ac0af9857..0d374f1c722 100644
--- a/htdocs/expensereport/class/expensereport_ik.class.php
+++ b/htdocs/expensereport/class/expensereport_ik.class.php
@@ -197,12 +197,13 @@ class ExpenseReportIk extends CommonObject
{
$default_range = (int) $userauthor->default_range; // if not defined, then 0
$ranges = $this->getRangesByCategory($fk_c_exp_tax_cat);
-
+ // prevent out of range -1 indice
+ $indice = $default_range > 0 ? $default_range - 1 : 0;
// substract 1 because array start from 0
- if (empty($ranges) || !isset($ranges[$default_range - 1])) {
+ if (empty($ranges) || !isset($ranges[$indice])) {
return false;
} else {
- return $ranges[$default_range - 1];
+ return $ranges[$indice];
}
}
diff --git a/htdocs/langs/en_US/expensereports.lang b/htdocs/langs/en_US/expensereports.lang
index 624a278b393..6a305e43ad7 100644
--- a/htdocs/langs/en_US/expensereports.lang
+++ b/htdocs/langs/en_US/expensereports.lang
@@ -1 +1,9 @@
ExpenseReportPayments=Expense report payments
+#
+# error
+#
+
+TaxUndefinedForThisCategory = Taxe undefined for this category
+ErrorRecordNotFound=Record not found
+errorComputeTtcOnMileageExpense=Error on computing mileage expense
+ErrorBadValueForParameter=Error bad value for parameter %s