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