Merge pull request #20999 from atm-jpb/NEW/ExpenseReport_ik_add

NEW : add coefficient on unit  ht   line  in expenseReport card
This commit is contained in:
Laurent Destailleur 2022-06-07 10:02:12 +02:00 committed by GitHub
commit efb6a8a791
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 192 additions and 19 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,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);

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="input_qty right maxwidth50" 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=" input_qty right maxwidth50" 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,52 @@ if ($action == 'create') {
jQuery("#value_unit_ht").val("");
}
});
/* unit price coéf 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
if (tax_cat == "" || parseInt(tax_cat) <= 0){
return ;
}
jQuery.ajax({
url: path
,async:false
,dataType:"json"
,success:function(response) {
if (response.response_status == "success"){
jQuery("#value_unit_ht").val(response.data);
jQuery("#value_unit_ht").trigger("change");
jQuery("#value_unit").val("");
} else if(response.response_status == "error" && response.errorMessage != undefined && response.errorMessage.length > 0 ){
$.jnotify(response.errorMessage, "error", {timeout: 0, type: "error"},{ remove: function (){} } );
}
},
});
}
/*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,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_ ...
}

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

View File

@ -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