mirror of
https://github.com/Dolibarr/dolibarr.git
synced 2025-02-20 13:46:52 +01:00
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:
commit
efb6a8a791
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>';
|
||||
|
|
|
|||
|
|
@ -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_ ...
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user