add coef on input ht line expenseReport

This commit is contained in:
jpb 2022-05-23 16:41:05 +02:00
parent 6de1f6bbac
commit eb526afc3a
4 changed files with 187 additions and 17 deletions

View File

@ -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,52 @@ $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 = json_encode(array('error' => $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 = json_encode(array('error' => $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 = json_encode(array('error' => $langs->transnoentitiesnoconv('ErrorRecordNotFound'), 'fk_expense' => $fk_expense));
$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 = json_encode(array('error' => $langs->transnoentitiesnoconv('ErrorRecordNotFound'), 'fk_user_author' => $expense->fk_user_author));
$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));
$expense = new ExpenseReport($db);
$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';
}
/*if (empty($range)) {
$rep->errorMessage = json_encode(array('error' => $langs->transnoentitiesnoconv('ErrorRecordNotFound'), 'range' => $range));
$rep->response_status = 'error';
} 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'));
}
$rep->errorMessage = json_encode(array('up' => $range->coef, 'ikoffset' => $range->ikoffset, 'title' => $langs->transnoentitiesnoconv('ExpenseRangeOffset', $ikoffset), 'comment' => 'offset should be applied on addline or updateline'));
$rep->response_status = 'error';
}*/
}
}
}
echo json_encode($rep);

View File

@ -2377,7 +2377,7 @@ if ($action == 'create') {
// Quantity
print '<td class="right">';
print '<input type="text" min="0" class="right maxwidth50" name="qty" value="'.dol_escape_htmltag($line->qty).'" />'; // We must be able to enter decimal qty
print '<input type="text" min="0" class="right maxwidth50" id="input_qty" name="qty" value="'.dol_escape_htmltag($line->qty).'" />'; // We must be able to enter decimal qty
print '</td>';
//print '<td class="right">'.$langs->trans('AmountHT').'</td>';
@ -2559,7 +2559,7 @@ if ($action == 'create') {
// Quantity
print '<td class="right inputqty">';
print '<input type="text" min="0" class="right maxwidth50" name="qty" value="'.dol_escape_htmltag($qty ? $qty : 1).'">'; // We must be able to enter decimal qty
print '<input type="text" min="0" class="right maxwidth50" id="input_qty" name="qty" value="'.dol_escape_htmltag($qty ? $qty : 1).'">'; // We must be able to enter decimal qty
print '</td>';
// Picture
@ -2579,7 +2579,7 @@ if ($action == 'create') {
print '</table>';
print '</div>';
//var_dump($object);
print '<script javascript>
/* JQuery for product free or predefined select */
@ -2596,6 +2596,51 @@ if ($action == 'create') {
jQuery("#value_unit_ht").val("");
}
});
/* price calculation */
jQuery("#input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) {
let type_fee = jQuery("#fk_c_type_fees").find(":selected").val();
let tax_cat = jQuery("#select_fk_c_exp_tax_cat").find(":selected").val();
let tva = jQuery("#vatrate").find(":selected").val();
let qty = jQuery("#input_qty").val();
let path = "'.dol_buildpath("/expensereport/ajax/ajaxik.php", 1) .'";
path += "?fk_c_exp_tax_cat="+tax_cat;
path +="&fk_expense="+'.$object->id.';
path += "&vatrate="+tva;
path += "&qty="+qty;
if (type_fee == 4) { // frais_kilométriques
jQuery.ajax({
url: path
,async:false
,dataType:"json"
,success:function(response) {
if (response.response_status == "success"){
jQuery("#value_unit_ht").val(response.data);
}else{
console.log(response.errorMessage)
}
},
});
}else{
console.log("not a type concerned");
}
/*console.log(event.which); // discard event tag and arrows
if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
jQuery("#value_unit_ht").val("");
}*/
});
});
</script>';

View File

@ -398,7 +398,6 @@ class ExpenseReport extends CommonObject
}
}
/**
* Load an object from its id and create a new one in database
*
@ -2559,6 +2558,105 @@ 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 fk_cat Category of the vehicule used
* @param qty Number of kilometers
* @param tva VAT rate
* @return int <0 if KO, total ttc if OK
*/
function computeTotalKm($fk_cat, $qty, $tva)
{
global $langs,$user,$db,$conf;
$total_ttc = 0;
$ranges = array();
$coef = 0;
$offset = 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.offset, t.coef";
$sql .= " FROM ".MAIN_DB_PREFIX."c_exp_tax t";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_exp_tax_range r ON r.rowid = t.fk_range";
$sql .= " WHERE t.fk_cat = ".$fk_cat;
$sql .= " ORDER BY r.range_ik ASC";
dol_syslog("expenseReport::computeTotalkm sql=".$sql, LOG_DEBUG);
$result = $this->db->query($sql);
if ($result)
{
$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 && $qty < $ranges[$i+1]->range)
{
$coef = $ranges[$i]->coef;
$offset = $ranges[$i]->offset;
}
}
else
{
if ($qty > $ranges[$i]->range)
{
$coef = $ranges[$i]->coef;
$offset = $ranges[$i]->offset;
}
}
}
$total_ht = $coef;
//$total_ttc = price2num($total_ht + ( $total_ht * $tva / 100),'MT');
return $total_ht;
}
else
{
$this->error = $langs->trans('TaxUndefinedForThisCategory');
return -1;
}
}
else
{
$this->error = $this->db->error()." sql=".$sql;
return -1;
}
}
}
@ -2941,4 +3039,6 @@ class ExpenseReportLine extends CommonObjectLine
return -2;
}
}
// ajouter ici comput_ ...
}

View File

@ -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];
}
}