Complete #24049. Reduce bad effect of option INVOICE_USE_SITUATION
This commit is contained in:
parent
6f8b1108ca
commit
5b65d7d3fb
@ -142,8 +142,8 @@ if ($action == 'validatehistory') {
|
|||||||
}*/
|
}*/
|
||||||
|
|
||||||
// Customer Invoice lines (must be same request than into page list.php for manual binding)
|
// Customer Invoice lines (must be same request than into page list.php for manual binding)
|
||||||
$sql = "SELECT f.rowid as facid, f.ref as ref, f.datef, f.type as ftype, f.fk_facture_source,";
|
$sql = "SELECT f.rowid as facid, f.ref as ref, f.datef, f.type as ftype, f.situation_cycle_ref, f.fk_facture_source,";
|
||||||
$sql .= " l.rowid, l.fk_product, l.description, l.total_ht, l.fk_code_ventilation, l.product_type as type_l, l.tva_tx as tva_tx_line, l.vat_src_code,";
|
$sql .= " l.rowid, l.fk_product, l.description, l.total_ht, l.fk_code_ventilation, l.product_type as type_l, l.situation_percent, l.tva_tx as tva_tx_line, l.vat_src_code,";
|
||||||
$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.tva_tx as tva_tx_prod,";
|
$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.tva_tx as tva_tx_prod,";
|
||||||
if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
|
if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
|
||||||
$sql .= " ppe.accountancy_code_sell as code_sell, ppe.accountancy_code_sell_intra as code_sell_intra, ppe.accountancy_code_sell_export as code_sell_export,";
|
$sql .= " ppe.accountancy_code_sell as code_sell, ppe.accountancy_code_sell_intra as code_sell_intra, ppe.accountancy_code_sell_export as code_sell_export,";
|
||||||
@ -321,6 +321,10 @@ print '<span class="opacitymedium">'.$langs->trans("DescVentilCustomer").'</span
|
|||||||
print '<span class="opacitymedium hideonsmartphone">'.$langs->trans("DescVentilMore", $langs->transnoentitiesnoconv("ValidateHistory"), $langs->transnoentitiesnoconv("ToBind")).'<br>';
|
print '<span class="opacitymedium hideonsmartphone">'.$langs->trans("DescVentilMore", $langs->transnoentitiesnoconv("ValidateHistory"), $langs->transnoentitiesnoconv("ToBind")).'<br>';
|
||||||
print '</span><br>';
|
print '</span><br>';
|
||||||
|
|
||||||
|
if (getDolGlobalInt('INVOICE_USE_SITUATION') == 1) {
|
||||||
|
print info_admin($langs->trans("SorryThisModuleIsNotCompatibleWithTheExperimentalFeatureOfSituationInvoices"));
|
||||||
|
print "<br>";
|
||||||
|
}
|
||||||
|
|
||||||
$y = $year_current;
|
$y = $year_current;
|
||||||
|
|
||||||
@ -395,6 +399,11 @@ if ($resql) {
|
|||||||
$num = $db->num_rows($resql);
|
$num = $db->num_rows($resql);
|
||||||
|
|
||||||
while ($row = $db->fetch_row($resql)) {
|
while ($row = $db->fetch_row($resql)) {
|
||||||
|
// TODO When INVOICE_USE_SITUATION = 1, values here are wrong. There is no compensation on bad stored amounts
|
||||||
|
//$situation_ratio = 1;
|
||||||
|
//if (getDolGlobalInt('INVOICE_USE_SITUATION') == 1) {
|
||||||
|
//}
|
||||||
|
|
||||||
print '<tr class="oddeven">';
|
print '<tr class="oddeven">';
|
||||||
print '<td>';
|
print '<td>';
|
||||||
if ($row[0] == 'tobind') {
|
if ($row[0] == 'tobind') {
|
||||||
@ -512,6 +521,11 @@ if ($resql) {
|
|||||||
$num = $db->num_rows($resql);
|
$num = $db->num_rows($resql);
|
||||||
|
|
||||||
while ($row = $db->fetch_row($resql)) {
|
while ($row = $db->fetch_row($resql)) {
|
||||||
|
// TODO When INVOICE_USE_SITUATION = 1, values here are wrong. There is no compensation on bad stored amounts
|
||||||
|
//$situation_ratio = 1;
|
||||||
|
//if (getDolGlobalInt('INVOICE_USE_SITUATION') == 1) {
|
||||||
|
//}
|
||||||
|
|
||||||
print '<tr class="oddeven">';
|
print '<tr class="oddeven">';
|
||||||
print '<td>';
|
print '<td>';
|
||||||
if ($row[0] == 'tobind') {
|
if ($row[0] == 'tobind') {
|
||||||
@ -623,7 +637,6 @@ if ($conf->global->MAIN_FEATURES_LEVEL > 0) { // This part of code looks strange
|
|||||||
print "</table>\n";
|
print "</table>\n";
|
||||||
print '</div>';
|
print '</div>';
|
||||||
|
|
||||||
|
|
||||||
if (isModEnabled('margin')) {
|
if (isModEnabled('margin')) {
|
||||||
print "<br>\n";
|
print "<br>\n";
|
||||||
print '<div class="div-table-responsive-no-min">';
|
print '<div class="div-table-responsive-no-min">';
|
||||||
@ -637,22 +650,41 @@ if ($conf->global->MAIN_FEATURES_LEVEL > 0) { // This part of code looks strange
|
|||||||
print '<td width="60" class="right">'.$langs->trans('MonthShort'.str_pad($j, 2, '0', STR_PAD_LEFT)).'</td>';
|
print '<td width="60" class="right">'.$langs->trans('MonthShort'.str_pad($j, 2, '0', STR_PAD_LEFT)).'</td>';
|
||||||
}
|
}
|
||||||
print '<td width="60" class="right"><b>'.$langs->trans("Total").'</b></td></tr>';
|
print '<td width="60" class="right"><b>'.$langs->trans("Total").'</b></td></tr>';
|
||||||
$sql = "SELECT '".$db->escape($langs->trans("Vide"))."' AS marge,";
|
|
||||||
for ($i = 1; $i <= 12; $i++) {
|
|
||||||
$j = $i + ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1) - 1;
|
|
||||||
if ($j > 12) {
|
|
||||||
$j -= 12;
|
|
||||||
}
|
|
||||||
$sql .= " SUM(".$db->ifsql("MONTH(f.datef)=".$j,
|
|
||||||
" (".$db->ifsql("fd.total_ht < 0",
|
|
||||||
" (-1 * (abs(fd.total_ht) - (fd.buy_price_ht * fd.qty * (fd.situation_percent / 100))))",
|
|
||||||
" (fd.total_ht - (fd.buy_price_ht * fd.qty * (fd.situation_percent / 100)))").")",
|
|
||||||
0).") AS month".str_pad($j, 2, '0', STR_PAD_LEFT).",";
|
|
||||||
}
|
|
||||||
$sql .= " SUM(".$db->ifsql("fd.total_ht < 0",
|
|
||||||
" (-1 * (abs(fd.total_ht) - (fd.buy_price_ht * fd.qty * (fd.situation_percent / 100))))",
|
|
||||||
" (fd.total_ht - (fd.buy_price_ht * fd.qty * (fd.situation_percent / 100)))").") as total";
|
|
||||||
|
|
||||||
|
if (getDolGlobalInt('INVOICE_USE_SITUATION') == 1) {
|
||||||
|
// With old situation invoice setup
|
||||||
|
$sql = "SELECT '".$db->escape($langs->trans("Vide"))."' AS marge,";
|
||||||
|
for ($i = 1; $i <= 12; $i++) {
|
||||||
|
$j = $i + ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1) - 1;
|
||||||
|
if ($j > 12) {
|
||||||
|
$j -= 12;
|
||||||
|
}
|
||||||
|
$sql .= " SUM(".$db->ifsql("MONTH(f.datef)=".$j,
|
||||||
|
" (".$db->ifsql("fd.total_ht < 0",
|
||||||
|
" (-1 * (abs(fd.total_ht) - (fd.buy_price_ht * fd.qty * (fd.situation_percent / 100))))", // TODO This is bugged, we must use the percent for the invoice and fd.situation_percent is cumulated percent !
|
||||||
|
" (fd.total_ht - (fd.buy_price_ht * fd.qty * (fd.situation_percent / 100)))").")",
|
||||||
|
0).") AS month".str_pad($j, 2, '0', STR_PAD_LEFT).",";
|
||||||
|
}
|
||||||
|
$sql .= " SUM(".$db->ifsql("fd.total_ht < 0",
|
||||||
|
" (-1 * (abs(fd.total_ht) - (fd.buy_price_ht * fd.qty * (fd.situation_percent / 100))))", // TODO This is bugged, we must use the percent for the invoice and fd.situation_percent is cumulated percent !
|
||||||
|
" (fd.total_ht - (fd.buy_price_ht * fd.qty * (fd.situation_percent / 100)))").") as total";
|
||||||
|
} else {
|
||||||
|
$sql = "SELECT '".$db->escape($langs->trans("Vide"))."' AS marge,";
|
||||||
|
for ($i = 1; $i <= 12; $i++) {
|
||||||
|
$j = $i + ($conf->global->SOCIETE_FISCAL_MONTH_START ? $conf->global->SOCIETE_FISCAL_MONTH_START : 1) - 1;
|
||||||
|
if ($j > 12) {
|
||||||
|
$j -= 12;
|
||||||
|
}
|
||||||
|
$sql .= " SUM(".$db->ifsql("MONTH(f.datef)=".$j,
|
||||||
|
" (".$db->ifsql("fd.total_ht < 0",
|
||||||
|
" (-1 * (abs(fd.total_ht) - (fd.buy_price_ht * fd.qty)))",
|
||||||
|
" (fd.total_ht - (fd.buy_price_ht * fd.qty))").")",
|
||||||
|
0).") AS month".str_pad($j, 2, '0', STR_PAD_LEFT).",";
|
||||||
|
}
|
||||||
|
$sql .= " SUM(".$db->ifsql("fd.total_ht < 0",
|
||||||
|
" (-1 * (abs(fd.total_ht) - (fd.buy_price_ht * fd.qty)))",
|
||||||
|
" (fd.total_ht - (fd.buy_price_ht * fd.qty))").") as total";
|
||||||
|
}
|
||||||
$sql .= " FROM ".MAIN_DB_PREFIX."facturedet as fd";
|
$sql .= " FROM ".MAIN_DB_PREFIX."facturedet as fd";
|
||||||
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facture as f ON f.rowid = fd.fk_facture";
|
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facture as f ON f.rowid = fd.fk_facture";
|
||||||
$sql .= " WHERE f.datef >= '".$db->idate($search_date_start)."'";
|
$sql .= " WHERE f.datef >= '".$db->idate($search_date_start)."'";
|
||||||
|
|||||||
@ -189,8 +189,8 @@ print '<script type="text/javascript">
|
|||||||
/*
|
/*
|
||||||
* Customer Invoice lines
|
* Customer Invoice lines
|
||||||
*/
|
*/
|
||||||
$sql = "SELECT f.rowid as facid, f.ref as ref, f.type as ftype, f.datef, f.ref_client,";
|
$sql = "SELECT f.rowid as facid, f.ref as ref, f.type as ftype, f.situation_cycle_ref, f.datef, f.ref_client,";
|
||||||
$sql .= " fd.rowid, fd.description, fd.product_type as line_type, fd.total_ht, fd.total_tva, fd.tva_tx, fd.vat_src_code, fd.total_ttc,";
|
$sql .= " fd.rowid, fd.description, fd.product_type as line_type, fd.total_ht, fd.total_tva, fd.tva_tx, fd.vat_src_code, fd.total_ttc, fd.situation_percent,";
|
||||||
$sql .= " s.rowid as socid, s.nom as name, s.code_client,";
|
$sql .= " s.rowid as socid, s.nom as name, s.code_client,";
|
||||||
if (!empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED)) {
|
if (!empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED)) {
|
||||||
$sql .= " spe.accountancy_code_customer as code_compta_client,";
|
$sql .= " spe.accountancy_code_customer as code_compta_client,";
|
||||||
@ -502,8 +502,33 @@ if ($result) {
|
|||||||
print $form->textwithtooltip(dol_trunc($text, $trunclength), $objp->description);
|
print $form->textwithtooltip(dol_trunc($text, $trunclength), $objp->description);
|
||||||
print '</td>';
|
print '</td>';
|
||||||
|
|
||||||
print '<td class="right nowraponall amount">'.price($objp->total_ht).'</td>';
|
// Amount
|
||||||
|
print '<td class="right nowraponall amount">';
|
||||||
|
|
||||||
|
// Create a compensation rate for old situation invoice feature.
|
||||||
|
$situation_ratio = 1;
|
||||||
|
if (getDolGlobalInt('INVOICE_USE_SITUATION') == 1) {
|
||||||
|
if ($objp->situation_cycle_ref) {
|
||||||
|
// Avoid divide by 0
|
||||||
|
if ($objp->situation_percent == 0) {
|
||||||
|
$situation_ratio = 0;
|
||||||
|
} else {
|
||||||
|
$line = new FactureLigne($db);
|
||||||
|
$line->fetch($objp->rowid);
|
||||||
|
|
||||||
|
// Situation invoices handling
|
||||||
|
$prev_progress = $line->get_prev_progress($objp->facid);
|
||||||
|
|
||||||
|
$situation_ratio = ($objp->situation_percent - $prev_progress) / $objp->situation_percent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print price($objp->total_ht * $situation_ratio);
|
||||||
|
} else {
|
||||||
|
print price($objp->total_ht);
|
||||||
|
}
|
||||||
|
print '</td>';
|
||||||
|
|
||||||
|
// Vat rate
|
||||||
print '<td class="right">'.vatrate($objp->tva_tx.($objp->vat_src_code ? ' ('.$objp->vat_src_code.')' : '')).'</td>';
|
print '<td class="right">'.vatrate($objp->tva_tx.($objp->vat_src_code ? ' ('.$objp->vat_src_code.')' : '')).'</td>';
|
||||||
|
|
||||||
// Thirdparty
|
// Thirdparty
|
||||||
|
|||||||
@ -228,8 +228,8 @@ if (empty($chartaccountcode)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Customer Invoice lines
|
// Customer Invoice lines
|
||||||
$sql = "SELECT f.rowid as facid, f.ref, f.datef, f.type as ftype, f.fk_facture_source,";
|
$sql = "SELECT f.rowid as facid, f.ref, f.datef, f.type as ftype, f.situation_cycle_ref, f.fk_facture_source,";
|
||||||
$sql .= " l.rowid, l.fk_product, l.description, l.total_ht, l.fk_code_ventilation, l.product_type as type_l, l.tva_tx as tva_tx_line, l.vat_src_code,";
|
$sql .= " l.rowid, l.fk_product, l.description, l.total_ht, l.situation_percent, l.fk_code_ventilation, l.product_type as type_l, l.tva_tx as tva_tx_line, l.vat_src_code,";
|
||||||
$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.tva_tx as tva_tx_prod,";
|
$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.tva_tx as tva_tx_prod,";
|
||||||
if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
|
if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
|
||||||
$sql .= " ppe.accountancy_code_sell as code_sell, ppe.accountancy_code_sell_intra as code_sell_intra, ppe.accountancy_code_sell_export as code_sell_export,";
|
$sql .= " ppe.accountancy_code_sell as code_sell, ppe.accountancy_code_sell_intra as code_sell_intra, ppe.accountancy_code_sell_export as code_sell_export,";
|
||||||
@ -655,8 +655,30 @@ if ($result) {
|
|||||||
print $form->textwithtooltip(dol_trunc($text, $trunclength), $facture_static_det->desc);
|
print $form->textwithtooltip(dol_trunc($text, $trunclength), $facture_static_det->desc);
|
||||||
print '</td>';
|
print '</td>';
|
||||||
|
|
||||||
|
// Amount
|
||||||
print '<td class="right nowraponall amount">';
|
print '<td class="right nowraponall amount">';
|
||||||
print price($objp->total_ht);
|
|
||||||
|
// Create a compensation rate for old situation invoice feature.
|
||||||
|
$situation_ratio = 1;
|
||||||
|
if (getDolGlobalInt('INVOICE_USE_SITUATION') == 1) {
|
||||||
|
if ($objp->situation_cycle_ref) {
|
||||||
|
// Avoid divide by 0
|
||||||
|
if ($objp->situation_percent == 0) {
|
||||||
|
$situation_ratio = 0;
|
||||||
|
} else {
|
||||||
|
$line = new FactureLigne($db);
|
||||||
|
$line->fetch($objp->rowid);
|
||||||
|
|
||||||
|
// Situation invoices handling
|
||||||
|
$prev_progress = $line->get_prev_progress($objp->facid);
|
||||||
|
|
||||||
|
$situation_ratio = ($objp->situation_percent - $prev_progress) / $objp->situation_percent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print price($objp->total_ht * $situation_ratio);
|
||||||
|
} else {
|
||||||
|
print price($objp->total_ht);
|
||||||
|
}
|
||||||
print '</td>';
|
print '</td>';
|
||||||
|
|
||||||
// Vat rate
|
// Vat rate
|
||||||
|
|||||||
@ -106,7 +106,7 @@ if (!GETPOSTISSET('date_startmonth') && (empty($date_start) || empty($date_end))
|
|||||||
$date_end = dol_get_last_day($pastmonthyear, $pastmonth, false);
|
$date_end = dol_get_last_day($pastmonthyear, $pastmonth, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql = "SELECT f.rowid, f.ref, f.type, f.datef as df, f.ref_client, f.date_lim_reglement as dlr, f.close_code,";
|
$sql = "SELECT f.rowid, f.ref, f.type, f.situation_cycle_ref, f.datef as df, f.ref_client, f.date_lim_reglement as dlr, f.close_code,";
|
||||||
$sql .= " fd.rowid as fdid, fd.description, fd.product_type, fd.total_ht, fd.total_tva, fd.total_localtax1, fd.total_localtax2, fd.tva_tx, fd.total_ttc, fd.situation_percent, fd.vat_src_code, fd.info_bits,";
|
$sql .= " fd.rowid as fdid, fd.description, fd.product_type, fd.total_ht, fd.total_tva, fd.total_localtax1, fd.total_localtax2, fd.tva_tx, fd.total_ttc, fd.situation_percent, fd.vat_src_code, fd.info_bits,";
|
||||||
$sql .= " s.rowid as socid, s.nom as name, s.code_client, s.code_fournisseur,";
|
$sql .= " s.rowid as socid, s.nom as name, s.code_client, s.code_fournisseur,";
|
||||||
if (!empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED)) {
|
if (!empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED)) {
|
||||||
@ -205,21 +205,23 @@ if ($result) {
|
|||||||
$def_tva[$obj->rowid][$compta_tva][vatrate($obj->tva_tx).($obj->vat_src_code ? ' ('.$obj->vat_src_code.')' : '')] = (vatrate($obj->tva_tx).($obj->vat_src_code ? ' ('.$obj->vat_src_code.')' : ''));
|
$def_tva[$obj->rowid][$compta_tva][vatrate($obj->tva_tx).($obj->vat_src_code ? ' ('.$obj->vat_src_code.')' : '')] = (vatrate($obj->tva_tx).($obj->vat_src_code ? ' ('.$obj->vat_src_code.')' : ''));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($obj->type == Facture::TYPE_SITUATION) {
|
// Create a compensation rate.
|
||||||
// Avoid divide by 0
|
$situation_ratio = 1;
|
||||||
if ($obj->situation_percent == 0) {
|
if (getDolGlobalInt('INVOICE_USE_SITUATION') == 1) {
|
||||||
$situation_ratio = 0;
|
if ($obj->situation_cycle_ref) {
|
||||||
} else {
|
// Avoid divide by 0
|
||||||
$line = new FactureLigne($db);
|
if ($obj->situation_percent == 0) {
|
||||||
$line->fetch($obj->fdid);
|
$situation_ratio = 0;
|
||||||
|
} else {
|
||||||
|
$line = new FactureLigne($db);
|
||||||
|
$line->fetch($obj->fdid);
|
||||||
|
|
||||||
// Situation invoices handling
|
// Situation invoices handling
|
||||||
$prev_progress = $line->get_prev_progress($obj->rowid);
|
$prev_progress = $line->get_prev_progress($obj->rowid);
|
||||||
|
|
||||||
$situation_ratio = ($obj->situation_percent - $prev_progress) / $obj->situation_percent;
|
$situation_ratio = ($obj->situation_percent - $prev_progress) / $obj->situation_percent;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
$situation_ratio = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invoice lines
|
// Invoice lines
|
||||||
|
|||||||
@ -629,7 +629,7 @@ if (!empty($conf->global->INVOICE_USE_DEFAULT_DOCUMENT)) { // Hidden conf
|
|||||||
Facture::TYPE_CREDIT_NOTE=>$langs->trans("InvoiceAvoir"),
|
Facture::TYPE_CREDIT_NOTE=>$langs->trans("InvoiceAvoir"),
|
||||||
Facture::TYPE_DEPOSIT=>$langs->trans("InvoiceDeposit"),
|
Facture::TYPE_DEPOSIT=>$langs->trans("InvoiceDeposit"),
|
||||||
);
|
);
|
||||||
if (!empty($conf->global->INVOICE_USE_SITUATION)) {
|
if (getDolGlobalInt('INVOICE_USE_SITUATION')) {
|
||||||
$listtype[Facture::TYPE_SITUATION] = $langs->trans("InvoiceSituation");
|
$listtype[Facture::TYPE_SITUATION] = $langs->trans("InvoiceSituation");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6404,9 +6404,9 @@ class FactureLigne extends CommonInvoiceLine
|
|||||||
* Returns situation_percent of the previous line.
|
* Returns situation_percent of the previous line.
|
||||||
* Warning: If invoice is a replacement invoice, this->fk_prev_id is id of the replaced line.
|
* Warning: If invoice is a replacement invoice, this->fk_prev_id is id of the replaced line.
|
||||||
*
|
*
|
||||||
* @param int $invoiceid Invoice id
|
* @param int $invoiceid Invoice id
|
||||||
* @param bool $include_credit_note Include credit note or not
|
* @param bool $include_credit_note Include credit note or not
|
||||||
* @return int >= 0
|
* @return int >= 0
|
||||||
*/
|
*/
|
||||||
public function get_prev_progress($invoiceid, $include_credit_note = true)
|
public function get_prev_progress($invoiceid, $include_credit_note = true)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -104,7 +104,7 @@ global $permissiontoadd;
|
|||||||
if ($this->statut == 0 && !empty($object_rights->creer) && $action != 'selectlines') {
|
if ($this->statut == 0 && !empty($object_rights->creer) && $action != 'selectlines') {
|
||||||
$situationinvoicelinewithparent = 0;
|
$situationinvoicelinewithparent = 0;
|
||||||
if ($line->fk_prev_id != null && in_array($object->element, array('facture', 'facturedet'))) {
|
if ($line->fk_prev_id != null && in_array($object->element, array('facture', 'facturedet'))) {
|
||||||
if ($object->type == $object::TYPE_SITUATION) { // The constant TYPE_SITUATION exists only for object invoice
|
if (!empty($object->situation_cycle_ref)) {
|
||||||
// Set constant to disallow editing during a situation cycle
|
// Set constant to disallow editing during a situation cycle
|
||||||
$situationinvoicelinewithparent = 1;
|
$situationinvoicelinewithparent = 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -334,76 +334,79 @@ if (empty($reshook)) {
|
|||||||
if (($line->product_type != 9 && empty($line->fk_parent_line)) || $line->product_type == 9) {
|
if (($line->product_type != 9 && empty($line->fk_parent_line)) || $line->product_type == 9) {
|
||||||
$fk_parent_line = 0;
|
$fk_parent_line = 0;
|
||||||
}
|
}
|
||||||
if ($invoice->type == Facture::TYPE_SITUATION) {
|
|
||||||
$source_fk_prev_id = $line->fk_prev_id; // temporary storing situation invoice fk_prev_id
|
|
||||||
$line->fk_prev_id = $line->id; // The new line of the new credit note we are creating must be linked to the situation invoice line it is created from
|
|
||||||
if (!empty($invoice->tab_previous_situation_invoice)) {
|
|
||||||
// search the last standard invoice in cycle and the possible credit note between this last and invoice
|
|
||||||
// TODO Move this out of loop of $invoice->lines
|
|
||||||
$tab_jumped_credit_notes = array();
|
|
||||||
$lineIndex = count($invoice->tab_previous_situation_invoice) - 1;
|
|
||||||
$searchPreviousInvoice = true;
|
|
||||||
while ($searchPreviousInvoice) {
|
|
||||||
if ($invoice->tab_previous_situation_invoice[$lineIndex]->type == Facture::TYPE_SITUATION || $lineIndex < 1) {
|
|
||||||
$searchPreviousInvoice = false; // find, exit;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
if ($invoice->tab_previous_situation_invoice[$lineIndex]->type == Facture::TYPE_CREDIT_NOTE) {
|
|
||||||
$tab_jumped_credit_notes[$lineIndex] = $invoice->tab_previous_situation_invoice[$lineIndex]->id;
|
|
||||||
}
|
|
||||||
$lineIndex--; // go to previous invoice in cycle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$maxPrevSituationPercent = 0;
|
if (getDolGlobalInt('INVOICE_USE_SITUATION')) {
|
||||||
foreach ($invoice->tab_previous_situation_invoice[$lineIndex]->lines as $prevLine) {
|
if (!empty($invoice->situation_counter)) {
|
||||||
if ($prevLine->id == $source_fk_prev_id) {
|
$source_fk_prev_id = $line->fk_prev_id; // temporary storing situation invoice fk_prev_id
|
||||||
$maxPrevSituationPercent = max($maxPrevSituationPercent, $prevLine->situation_percent);
|
$line->fk_prev_id = $line->id; // The new line of the new credit note we are creating must be linked to the situation invoice line it is created from
|
||||||
|
if (!empty($invoice->tab_previous_situation_invoice)) {
|
||||||
//$line->subprice = $line->subprice - $prevLine->subprice;
|
// search the last standard invoice in cycle and the possible credit note between this last and invoice
|
||||||
$line->total_ht = $line->total_ht - $prevLine->total_ht;
|
// TODO Move this out of loop of $invoice->lines
|
||||||
$line->total_tva = $line->total_tva - $prevLine->total_tva;
|
$tab_jumped_credit_notes = array();
|
||||||
$line->total_ttc = $line->total_ttc - $prevLine->total_ttc;
|
$lineIndex = count($invoice->tab_previous_situation_invoice) - 1;
|
||||||
$line->total_localtax1 = $line->total_localtax1 - $prevLine->total_localtax1;
|
$searchPreviousInvoice = true;
|
||||||
$line->total_localtax2 = $line->total_localtax2 - $prevLine->total_localtax2;
|
while ($searchPreviousInvoice) {
|
||||||
|
if ($invoice->tab_previous_situation_invoice[$lineIndex]->situation_cycle_ref || $lineIndex < 1) {
|
||||||
$line->multicurrency_subprice = $line->multicurrency_subprice - $prevLine->multicurrency_subprice;
|
$searchPreviousInvoice = false; // find, exit;
|
||||||
$line->multicurrency_total_ht = $line->multicurrency_total_ht - $prevLine->multicurrency_total_ht;
|
break;
|
||||||
$line->multicurrency_total_tva = $line->multicurrency_total_tva - $prevLine->multicurrency_total_tva;
|
} else {
|
||||||
$line->multicurrency_total_ttc = $line->multicurrency_total_ttc - $prevLine->multicurrency_total_ttc;
|
if ($invoice->tab_previous_situation_invoice[$lineIndex]->type == Facture::TYPE_CREDIT_NOTE) {
|
||||||
}
|
$tab_jumped_credit_notes[$lineIndex] = $invoice->tab_previous_situation_invoice[$lineIndex]->id;
|
||||||
}
|
}
|
||||||
|
$lineIndex--; // go to previous invoice in cycle
|
||||||
// prorata
|
|
||||||
$line->situation_percent = $maxPrevSituationPercent - $line->situation_percent;
|
|
||||||
|
|
||||||
//print 'New line based on invoice id '.$invoice->tab_previous_situation_invoice[$lineIndex]->id.' fk_prev_id='.$source_fk_prev_id.' will be fk_prev_id='.$line->fk_prev_id.' '.$line->total_ht.' '.$line->situation_percent.'<br>';
|
|
||||||
|
|
||||||
// If there is some credit note between last situation invoice and invoice used for credit note generation (note: credit notes are stored as delta)
|
|
||||||
$maxPrevSituationPercent = 0;
|
|
||||||
foreach ($tab_jumped_credit_notes as $index => $creditnoteid) {
|
|
||||||
foreach ($invoice->tab_previous_situation_invoice[$index]->lines as $prevLine) {
|
|
||||||
if ($prevLine->fk_prev_id == $source_fk_prev_id) {
|
|
||||||
$maxPrevSituationPercent = $prevLine->situation_percent;
|
|
||||||
|
|
||||||
$line->total_ht -= $prevLine->total_ht;
|
|
||||||
$line->total_tva -= $prevLine->total_tva;
|
|
||||||
$line->total_ttc -= $prevLine->total_ttc;
|
|
||||||
$line->total_localtax1 -= $prevLine->total_localtax1;
|
|
||||||
$line->total_localtax2 -= $prevLine->total_localtax2;
|
|
||||||
|
|
||||||
$line->multicurrency_subprice -= $prevLine->multicurrency_subprice;
|
|
||||||
$line->multicurrency_total_ht -= $prevLine->multicurrency_total_ht;
|
|
||||||
$line->multicurrency_total_tva -= $prevLine->multicurrency_total_tva;
|
|
||||||
$line->multicurrency_total_ttc -= $prevLine->multicurrency_total_ttc;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$maxPrevSituationPercent = 0;
|
||||||
|
foreach ($invoice->tab_previous_situation_invoice[$lineIndex]->lines as $prevLine) {
|
||||||
|
if ($prevLine->id == $source_fk_prev_id) {
|
||||||
|
$maxPrevSituationPercent = max($maxPrevSituationPercent, $prevLine->situation_percent);
|
||||||
|
|
||||||
|
//$line->subprice = $line->subprice - $prevLine->subprice;
|
||||||
|
$line->total_ht = $line->total_ht - $prevLine->total_ht;
|
||||||
|
$line->total_tva = $line->total_tva - $prevLine->total_tva;
|
||||||
|
$line->total_ttc = $line->total_ttc - $prevLine->total_ttc;
|
||||||
|
$line->total_localtax1 = $line->total_localtax1 - $prevLine->total_localtax1;
|
||||||
|
$line->total_localtax2 = $line->total_localtax2 - $prevLine->total_localtax2;
|
||||||
|
|
||||||
|
$line->multicurrency_subprice = $line->multicurrency_subprice - $prevLine->multicurrency_subprice;
|
||||||
|
$line->multicurrency_total_ht = $line->multicurrency_total_ht - $prevLine->multicurrency_total_ht;
|
||||||
|
$line->multicurrency_total_tva = $line->multicurrency_total_tva - $prevLine->multicurrency_total_tva;
|
||||||
|
$line->multicurrency_total_ttc = $line->multicurrency_total_ttc - $prevLine->multicurrency_total_ttc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// prorata
|
||||||
|
$line->situation_percent = $maxPrevSituationPercent - $line->situation_percent;
|
||||||
|
|
||||||
|
//print 'New line based on invoice id '.$invoice->tab_previous_situation_invoice[$lineIndex]->id.' fk_prev_id='.$source_fk_prev_id.' will be fk_prev_id='.$line->fk_prev_id.' '.$line->total_ht.' '.$line->situation_percent.'<br>';
|
||||||
|
|
||||||
|
// If there is some credit note between last situation invoice and invoice used for credit note generation (note: credit notes are stored as delta)
|
||||||
|
$maxPrevSituationPercent = 0;
|
||||||
|
foreach ($tab_jumped_credit_notes as $index => $creditnoteid) {
|
||||||
|
foreach ($invoice->tab_previous_situation_invoice[$index]->lines as $prevLine) {
|
||||||
|
if ($prevLine->fk_prev_id == $source_fk_prev_id) {
|
||||||
|
$maxPrevSituationPercent = $prevLine->situation_percent;
|
||||||
|
|
||||||
|
$line->total_ht -= $prevLine->total_ht;
|
||||||
|
$line->total_tva -= $prevLine->total_tva;
|
||||||
|
$line->total_ttc -= $prevLine->total_ttc;
|
||||||
|
$line->total_localtax1 -= $prevLine->total_localtax1;
|
||||||
|
$line->total_localtax2 -= $prevLine->total_localtax2;
|
||||||
|
|
||||||
|
$line->multicurrency_subprice -= $prevLine->multicurrency_subprice;
|
||||||
|
$line->multicurrency_total_ht -= $prevLine->multicurrency_total_ht;
|
||||||
|
$line->multicurrency_total_tva -= $prevLine->multicurrency_total_tva;
|
||||||
|
$line->multicurrency_total_ttc -= $prevLine->multicurrency_total_ttc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// prorata
|
||||||
|
$line->situation_percent += $maxPrevSituationPercent;
|
||||||
|
|
||||||
|
//print 'New line based on invoice id '.$invoice->tab_previous_situation_invoice[$lineIndex]->id.' fk_prev_id='.$source_fk_prev_id.' will be fk_prev_id='.$line->fk_prev_id.' '.$line->total_ht.' '.$line->situation_percent.'<br>';
|
||||||
}
|
}
|
||||||
|
|
||||||
// prorata
|
|
||||||
$line->situation_percent += $maxPrevSituationPercent;
|
|
||||||
|
|
||||||
//print 'New line based on invoice id '.$invoice->tab_previous_situation_invoice[$lineIndex]->id.' fk_prev_id='.$source_fk_prev_id.' will be fk_prev_id='.$line->fk_prev_id.' '.$line->total_ht.' '.$line->situation_percent.'<br>';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user