Merge pull request #8802 from atm-john/new_avoir_situation
Add credit note compatibility with situation invoice.
This commit is contained in:
commit
e724cfd6a2
@ -913,12 +913,21 @@ if (empty($reshook))
|
|||||||
$object->fk_facture_source = $sourceinvoice > 0 ? $sourceinvoice : '';
|
$object->fk_facture_source = $sourceinvoice > 0 ? $sourceinvoice : '';
|
||||||
$object->type = Facture::TYPE_CREDIT_NOTE;
|
$object->type = Facture::TYPE_CREDIT_NOTE;
|
||||||
|
|
||||||
|
$facture_source = new Facture($db); // fetch origin object
|
||||||
|
if ($facture_source->fetch($object->fk_facture_source)>0)
|
||||||
|
{
|
||||||
|
if ($facture_source->type == Facture::TYPE_SITUATION)
|
||||||
|
{
|
||||||
|
$object->situation_counter = $facture_source->situation_counter;
|
||||||
|
$object->situation_cycle_ref = $facture_source->situation_cycle_ref;
|
||||||
|
$facture_source->fetchPreviousNextSituationInvoice();
|
||||||
|
}
|
||||||
|
}
|
||||||
$id = $object->create($user);
|
$id = $object->create($user);
|
||||||
|
|
||||||
$facture_source = new Facture($db); // fetch origin object
|
|
||||||
if (GETPOST('invoiceAvoirWithLines', 'int')==1 && $id>0)
|
if (GETPOST('invoiceAvoirWithLines', 'int')==1 && $id>0)
|
||||||
{
|
{
|
||||||
if ($facture_source->fetch($object->fk_facture_source)>0)
|
if (!empty($facture_source->lines))
|
||||||
{
|
{
|
||||||
$fk_parent_line = 0;
|
$fk_parent_line = 0;
|
||||||
|
|
||||||
@ -935,6 +944,61 @@ if (empty($reshook))
|
|||||||
$fk_parent_line = 0;
|
$fk_parent_line = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if($facture_source->type == Facture::TYPE_SITUATION)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(!empty($facture_source->tab_previous_situation_invoice))
|
||||||
|
{
|
||||||
|
// search the last invoice in cycle
|
||||||
|
$lineIndex = count($facture_source->tab_previous_situation_invoice) - 1;
|
||||||
|
$searchPreviousInvoice = true;
|
||||||
|
while( $searchPreviousInvoice )
|
||||||
|
{
|
||||||
|
if($facture_source->tab_previous_situation_invoice[$lineIndex]->type == Facture::TYPE_SITUATION || $lineIndex < 1)
|
||||||
|
{
|
||||||
|
$searchPreviousInvoice=false; // find, exit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$lineIndex--; // go to previous invoice in cycle
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$maxPrevSituationPercent = 0;
|
||||||
|
foreach($facture_source->tab_previous_situation_invoice[$lineIndex]->lines as $prevLine)
|
||||||
|
{
|
||||||
|
if($prevLine->id == $line->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;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$line->fk_facture = $object->id;
|
$line->fk_facture = $object->id;
|
||||||
$line->fk_parent_line = $fk_parent_line;
|
$line->fk_parent_line = $fk_parent_line;
|
||||||
|
|
||||||
@ -1959,7 +2023,25 @@ if (empty($reshook))
|
|||||||
$line->fetch(GETPOST('lineid'));
|
$line->fetch(GETPOST('lineid'));
|
||||||
$percent = $line->get_prev_progress($object->id);
|
$percent = $line->get_prev_progress($object->id);
|
||||||
|
|
||||||
if (GETPOST('progress') < $percent)
|
if($object->type == Facture::TYPE_CREDIT_NOTE && $object->situation_cycle_ref>0)
|
||||||
|
{
|
||||||
|
// in case of situation credit note
|
||||||
|
if(GETPOST('progress') >= 0 )
|
||||||
|
{
|
||||||
|
$mesg = $langs->trans("CantBeNullOrPositive");
|
||||||
|
setEventMessages($mesg, null, 'warnings');
|
||||||
|
$error++;
|
||||||
|
$result = -1;
|
||||||
|
}
|
||||||
|
elseif (GETPOST('progress') < $line->situation_percent) // TODO : use a modified $line->get_prev_progress($object->id) result
|
||||||
|
{
|
||||||
|
$mesg = $langs->trans("CantBeLessThanMinPercent");
|
||||||
|
setEventMessages($mesg, null, 'warnings');
|
||||||
|
$error++;
|
||||||
|
$result = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif (GETPOST('progress') < $percent)
|
||||||
{
|
{
|
||||||
$mesg = '<div class="warning">' . $langs->trans("CantBeLessThanMinPercent") . '</div>';
|
$mesg = '<div class="warning">' . $langs->trans("CantBeLessThanMinPercent") . '</div>';
|
||||||
setEventMessages($mesg, null, 'warnings');
|
setEventMessages($mesg, null, 'warnings');
|
||||||
@ -2105,6 +2187,126 @@ if (empty($reshook))
|
|||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Outing situation invoice from cycle
|
||||||
|
elseif ($action == 'confirm_situationout' && $confirm == 'yes' && $user->rights->facture->creer)
|
||||||
|
{
|
||||||
|
$object->fetch($id,'', '','', true);
|
||||||
|
|
||||||
|
if ($object->statut == Facture::STATUS_VALIDATED
|
||||||
|
&& $object->type == Facture::TYPE_SITUATION
|
||||||
|
&& $user->rights->facture->creer
|
||||||
|
&& !$objectidnext
|
||||||
|
&& $object->is_last_in_cycle()
|
||||||
|
&& ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->facture->creer))
|
||||||
|
|| (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->facture->invoice_advance->unvalidate)))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$outingError = 0;
|
||||||
|
$newCycle = $object->newCycle(); // we need to keep the "situation behavior" so we place it on a new situation cycle
|
||||||
|
if($newCycle > 1)
|
||||||
|
{
|
||||||
|
// Search credit notes
|
||||||
|
$lastCycle = $object->situation_cycle_ref;
|
||||||
|
$lastSituationCounter = $object->situation_counter;
|
||||||
|
$linkedCreditNotesList = array();
|
||||||
|
|
||||||
|
if (count($object->tab_next_situation_invoice) > 0) {
|
||||||
|
foreach ($object->tab_next_situation_invoice as $next_invoice) {
|
||||||
|
if($next_invoice->type == Facture::TYPE_CREDIT_NOTE
|
||||||
|
&& $next_invoice->situation_counter == $object->situation_counter
|
||||||
|
&& $next_invoice->fk_facture_source == $object->id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$linkedCreditNotesList[] = $next_invoice->id ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$object->situation_cycle_ref = $newCycle;
|
||||||
|
$object->situation_counter = 1;
|
||||||
|
$object->situation_final = 0;
|
||||||
|
if($object->update($user) > 0)
|
||||||
|
{
|
||||||
|
$errors = 0;
|
||||||
|
if(count($linkedCreditNotesList) > 0)
|
||||||
|
{
|
||||||
|
// now, credit note must follow
|
||||||
|
$sql = 'UPDATE '.MAIN_DB_PREFIX.'facture ';
|
||||||
|
$sql.= ' SET situation_cycle_ref='.$newCycle;
|
||||||
|
$sql.= ' , situation_final=0';
|
||||||
|
$sql.= ' , situation_counter='.$object->situation_counter;
|
||||||
|
$sql.= ' WHERE rowid IN ('.implode(',',$linkedCreditNotesList).')';
|
||||||
|
|
||||||
|
$resql=$db->query($sql);
|
||||||
|
if (!$resql) $errors++;
|
||||||
|
|
||||||
|
// Change each progression persent on each lines
|
||||||
|
foreach($object->lines as $line)
|
||||||
|
{
|
||||||
|
|
||||||
|
// no traitement for special product
|
||||||
|
if ($line->product_type == 9 ) continue;
|
||||||
|
|
||||||
|
|
||||||
|
if(!empty($object->tab_previous_situation_invoice))
|
||||||
|
{
|
||||||
|
// search the last invoice in cycle
|
||||||
|
$lineIndex = count($object->tab_previous_situation_invoice) - 1;
|
||||||
|
$searchPreviousInvoice = true;
|
||||||
|
while( $searchPreviousInvoice )
|
||||||
|
{
|
||||||
|
if($object->tab_previous_situation_invoice[$lineIndex]->type == Facture::TYPE_SITUATION || $lineIndex < 1)
|
||||||
|
{
|
||||||
|
$searchPreviousInvoice=false; // find, exit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$lineIndex--; // go to previous invoice in cycle
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$maxPrevSituationPercent = 0;
|
||||||
|
foreach($object->tab_previous_situation_invoice[$lineIndex]->lines as $prevLine)
|
||||||
|
{
|
||||||
|
if($prevLine->id == $line->fk_prev_id)
|
||||||
|
{
|
||||||
|
$maxPrevSituationPercent = max($maxPrevSituationPercent,$prevLine->situation_percent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$line->situation_percent = $line->situation_percent - $maxPrevSituationPercent;
|
||||||
|
|
||||||
|
if($line->update()<0) $errors++;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$errors)
|
||||||
|
{
|
||||||
|
setEventMessages($langs->trans('Updated'));
|
||||||
|
header("Location: ".$_SERVER['PHP_SELF']."?id=".$id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages($langs->trans('ErrorOutingSituationInvoiceCreditNote'), array(), 'errors');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages($langs->trans('ErrorOutingSituationInvoiceOnUpdate'), array(), 'errors');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setEventMessages($langs->trans('ErrorFindNextSituationInvoice'), array(), 'errors');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// add lines from objectlinked
|
// add lines from objectlinked
|
||||||
elseif($action == 'import_lines_from_object'
|
elseif($action == 'import_lines_from_object'
|
||||||
&& $user->rights->facture->creer
|
&& $user->rights->facture->creer
|
||||||
@ -3141,6 +3343,24 @@ else if ($id > 0 || ! empty($ref))
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Confirmation to remove invoice from cycle
|
||||||
|
if ($action == 'situationout') {
|
||||||
|
$text = $langs->trans('ConfirmRemoveSituationFromCycle', $object->ref);
|
||||||
|
$label = $langs->trans("ConfirmOuting");
|
||||||
|
$formquestion = array();
|
||||||
|
// remove situation from cycle
|
||||||
|
if ($object->statut == Facture::STATUS_VALIDATED
|
||||||
|
&& $user->rights->facture->creer
|
||||||
|
&& !$objectidnext
|
||||||
|
&& $object->is_last_in_cycle()
|
||||||
|
&& ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->facture->creer))
|
||||||
|
|| (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->facture->invoice_advance->unvalidate)))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$formconfirm = $form->formconfirm($_SERVER['PHP_SELF'] . '?facid=' . $object->id, $label, $text, 'confirm_situationout', $formquestion, "yes", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Confirmation of validation
|
// Confirmation of validation
|
||||||
if ($action == 'valid')
|
if ($action == 'valid')
|
||||||
{
|
{
|
||||||
@ -3622,54 +3842,10 @@ else if ($id > 0 || ! empty($ref))
|
|||||||
print "</td>";
|
print "</td>";
|
||||||
print '</tr>';
|
print '</tr>';
|
||||||
|
|
||||||
// Situations
|
|
||||||
if (! empty($conf->global->INVOICE_USE_SITUATION))
|
|
||||||
{
|
|
||||||
if ($object->type == 5 && ($object->situation_counter > 1))
|
|
||||||
{
|
|
||||||
$prevsits = $object->get_prev_sits();
|
|
||||||
print '<tr><td>';
|
|
||||||
print $langs->trans('SituationAmount');
|
|
||||||
print ' ';
|
|
||||||
|
|
||||||
print $prevsits[0]->situation_counter;
|
|
||||||
$cprevsits = count($prevsits);
|
|
||||||
|
|
||||||
for ($i = 1; $i < $cprevsits; $i++) {
|
|
||||||
print ' + ';
|
|
||||||
print $prevsits[$i]->situation_counter;
|
|
||||||
}
|
|
||||||
print ' + ';
|
|
||||||
print $object->situation_counter;
|
|
||||||
|
|
||||||
print '</td>';
|
|
||||||
print '<td class="nowrap">';
|
|
||||||
|
|
||||||
$prevsits_total_amount = 0;
|
|
||||||
foreach ($prevsits as $situation) {
|
|
||||||
$prevsits_total_amount += $situation->total_ht;
|
|
||||||
}
|
|
||||||
$prevsits_total_amount += $object->total_ht;
|
|
||||||
|
|
||||||
print price($prevsits_total_amount, 0, $langs, 1, -1, -1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency) );
|
|
||||||
|
|
||||||
print '</td></tr>';
|
|
||||||
|
|
||||||
// Previous situation(s) deduction(s)
|
|
||||||
for ($i = 0; $i < $cprevsits; $i++) {
|
|
||||||
print '<tr><td>';
|
|
||||||
print '<a href="' . $_SERVER['PHP_SELF'] . '?facid=' . $prevsits[$i]->id . '">';
|
|
||||||
print $langs->trans('SituationDeduction');
|
|
||||||
print ' ';
|
|
||||||
print $prevsits[$i]->situation_counter;
|
|
||||||
print '</a></td>';
|
|
||||||
|
|
||||||
print '<td class="nowrap">';
|
|
||||||
print '- ' . price($prevsits[$i]->total_ht, 0, $langs, 1, -1, -1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency) );
|
|
||||||
print '</td></tr>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Incoterms
|
// Incoterms
|
||||||
if (!empty($conf->incoterm->enabled))
|
if (!empty($conf->incoterm->enabled))
|
||||||
@ -3828,88 +4004,129 @@ else if ($id > 0 || ! empty($ref))
|
|||||||
if (! empty($conf->incoterm->enabled))
|
if (! empty($conf->incoterm->enabled))
|
||||||
$nbrows += 1;
|
$nbrows += 1;
|
||||||
|
|
||||||
if ($object->type == Facture::TYPE_SITUATION && ! empty($conf->global->INVOICE_USE_SITUATION))
|
// List of previous situation invoices
|
||||||
|
if (($object->situation_cycle_ref > 0) && ! empty($conf->global->INVOICE_USE_SITUATION))
|
||||||
{
|
{
|
||||||
if (count($object->tab_previous_situation_invoice) > 0 || count($object->tab_next_situation_invoice) > 0)
|
|
||||||
print '<table class="noborder situationstable" width="100%">';
|
|
||||||
|
|
||||||
if (count($object->tab_previous_situation_invoice) > 0) {
|
print '<table class="noborder situationstable" width="100%">';
|
||||||
// List of previous invoices
|
|
||||||
print '<tr class="liste_titre">';
|
|
||||||
print '<td>' . $langs->trans('ListOfPreviousSituationInvoices') . '</td>';
|
|
||||||
print '<td></td>';
|
|
||||||
if (! empty($conf->banque->enabled)) print '<td align="right"></td>';
|
|
||||||
print '<td align="right">' . $langs->trans('AmountHT') . '</td>';
|
|
||||||
print '<td align="right">' . $langs->trans('AmountTTC') . '</td>';
|
|
||||||
print '<td width="18"> </td>';
|
|
||||||
print '</tr>';
|
|
||||||
|
|
||||||
$total_prev_ht = $total_prev_ttc = 0;
|
|
||||||
foreach ($object->tab_previous_situation_invoice as $prev_invoice) {
|
|
||||||
$totalpaye = $prev_invoice->getSommePaiement();
|
|
||||||
$total_prev_ht += $prev_invoice->total_ht;
|
|
||||||
$total_prev_ttc += $prev_invoice->total_ttc;
|
|
||||||
print '<tr class="oddeven">';
|
|
||||||
print '<td>' . $prev_invoice->getNomUrl(1) . '</td>';
|
|
||||||
print '<td></td>';
|
|
||||||
if (! empty($conf->banque->enabled)) print '<td align="right"></td>';
|
|
||||||
print '<td align="right">' . price($prev_invoice->total_ht) . '</td>';
|
|
||||||
print '<td align="right">' . price($prev_invoice->total_ttc) . '</td>';
|
|
||||||
print '<td align="right">' . $prev_invoice->getLibStatut(3, $totalpaye) . '</td>';
|
|
||||||
print '</tr>';
|
|
||||||
|
|
||||||
}
|
print '<tr class="liste_titre">';
|
||||||
|
print '<td>' . $langs->trans('ListOfSituationInvoices') . '</td>';
|
||||||
|
print '<td></td>';
|
||||||
|
print '<td align="center">' . $langs->trans('Situation') . '</td>';
|
||||||
|
if (! empty($conf->banque->enabled)) print '<td align="right"></td>';
|
||||||
|
print '<td align="right">' . $langs->trans('AmountHT') . '</td>';
|
||||||
|
print '<td align="right">' . $langs->trans('AmountTTC') . '</td>';
|
||||||
|
print '<td width="18"> </td>';
|
||||||
|
print '</tr>';
|
||||||
|
|
||||||
print '<tr class="oddeven">';
|
|
||||||
print '<td></td>';
|
|
||||||
print '<td></td>';
|
|
||||||
if (! empty($conf->banque->enabled)) print '<td></td>';
|
|
||||||
print '<td align="right"><b>' . price($total_prev_ht) . '</b></td>';
|
|
||||||
print '<td align="right"><b>' . price($total_prev_ttc) . '</b></td>';
|
|
||||||
print '<td width="18"> </td>';
|
|
||||||
print '</tr>';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count($object->tab_next_situation_invoice) > 0) {
|
$total_prev_ht = $total_prev_ttc = 0;
|
||||||
// List of next invoices
|
$total_global_ht = $total_global_ttc = 0;
|
||||||
print '<tr class="liste_titre">';
|
|
||||||
print '<td>' . $langs->trans('ListOfNextSituationInvoices') . '</td>';
|
|
||||||
print '<td></td>';
|
|
||||||
if (! empty($conf->banque->enabled)) print '<td align="right"></td>';
|
|
||||||
print '<td align="right">' . $langs->trans('AmountHT') . '</td>';
|
|
||||||
print '<td align="right">' . $langs->trans('AmountTTC') . '</td>';
|
|
||||||
print '<td width="18"> </td>';
|
|
||||||
print '</tr>';
|
|
||||||
|
|
||||||
$total_next_ht = $total_next_ttc = 0;
|
if (count($object->tab_previous_situation_invoice) > 0) {
|
||||||
|
// List of previous invoices
|
||||||
|
|
||||||
foreach ($object->tab_next_situation_invoice as $next_invoice) {
|
$current_situation_counter = array();
|
||||||
$totalpaye = $next_invoice->getSommePaiement();
|
foreach ($object->tab_previous_situation_invoice as $prev_invoice) {
|
||||||
$total_next_ht += $next_invoice->total_ht;
|
$totalpaye = $prev_invoice->getSommePaiement();
|
||||||
$total_next_ttc += $next_invoice->total_ttc;
|
$total_prev_ht += $prev_invoice->total_ht;
|
||||||
print '<tr class="oddeven">';
|
$total_prev_ttc += $prev_invoice->total_ttc;
|
||||||
print '<td>' . $next_invoice->getNomUrl(1) . '</td>';
|
$current_situation_counter[] = (($prev_invoice->type == Facture::TYPE_CREDIT_NOTE)?-1:1) * $prev_invoice->situation_counter;
|
||||||
print '<td></td>';
|
print '<tr class="oddeven">';
|
||||||
if (! empty($conf->banque->enabled)) print '<td align="right"></td>';
|
print '<td>' . $prev_invoice->getNomUrl(1) . '</td>';
|
||||||
print '<td align="right">' . price($next_invoice->total_ht) . '</td>';
|
print '<td></td>';
|
||||||
print '<td align="right">' . price($next_invoice->total_ttc) . '</td>';
|
print '<td align="center" >'.(($prev_invoice->type == Facture::TYPE_CREDIT_NOTE)?$langs->trans('situationInvoiceShortcode_AS'):$langs->trans('situationInvoiceShortcode_S')) . $prev_invoice->situation_counter.'</td>';
|
||||||
print '<td align="right">' . $next_invoice->getLibStatut(3, $totalpaye) . '</td>';
|
if (! empty($conf->banque->enabled)) print '<td align="right"></td>';
|
||||||
print '</tr>';
|
print '<td align="right">' . price($prev_invoice->total_ht) . '</td>';
|
||||||
|
print '<td align="right">' . price($prev_invoice->total_ttc) . '</td>';
|
||||||
|
print '<td align="right">' . $prev_invoice->getLibStatut(3, $totalpaye) . '</td>';
|
||||||
|
print '</tr>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
print '<tr class="oddeven">';
|
$total_global_ht += $total_prev_ht ;
|
||||||
print '<td colspan="2" align="right"></td>';
|
$total_global_ttc += $total_prev_ttc ;
|
||||||
if (! empty($conf->banque->enabled)) print '<td align="right"></td>';
|
$total_global_ht += $object->total_ht;
|
||||||
|
$total_global_ttc += $object->total_ttc;
|
||||||
|
$current_situation_counter[] = (($object->type == Facture::TYPE_CREDIT_NOTE)?-1:1) * $object->situation_counter;
|
||||||
|
print '<tr class="oddeven">';
|
||||||
|
print '<td>' . $object->getNomUrl(1) . '</td>';
|
||||||
|
print '<td></td>';
|
||||||
|
print '<td align="center">'.(($object->type == Facture::TYPE_CREDIT_NOTE)?$langs->trans('situationInvoiceShortcode_AS'):$langs->trans('situationInvoiceShortcode_S')) . $object->situation_counter.'</td>';
|
||||||
|
if (! empty($conf->banque->enabled)) print '<td align="right"></td>';
|
||||||
|
print '<td align="right">' . price($object->total_ht) . '</td>';
|
||||||
|
print '<td align="right">' . price($object->total_ttc) . '</td>';
|
||||||
|
print '<td align="right">' . $object->getLibStatut(3, $object->getSommePaiement()) . '</td>';
|
||||||
|
print '</tr>';
|
||||||
|
|
||||||
print '<td align="right"><b>' . price($total_next_ht) . '</b></td>';
|
|
||||||
print '<td align="right"><b>' . price($total_next_ttc) . '</b></td>';
|
|
||||||
print '<td width="18"> </td>';
|
|
||||||
print '</tr>';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count($object->tab_previous_situation_invoice) > 0 || count($object->tab_next_situation_invoice) > 0)
|
print '<tr class="oddeven">';
|
||||||
print '</table>';
|
print '<td colspan="2" align="left"><b>' . $langs->trans('CurrentSituationTotal') . '</b></td>';
|
||||||
|
print '<td>';
|
||||||
|
$i =0;
|
||||||
|
foreach ($current_situation_counter as $sit)
|
||||||
|
{
|
||||||
|
$curSign = $sit>0?'+':'-';
|
||||||
|
$curType = $sit>0?$langs->trans('situationInvoiceShortcode_S'):$langs->trans('situationInvoiceShortcode_AS');
|
||||||
|
if($i>0) print ' '.$curSign.' ';
|
||||||
|
print $curType . abs($sit);
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
print '</td>';
|
||||||
|
if (! empty($conf->banque->enabled)) print '<td></td>';
|
||||||
|
print '<td align="right"><b>' . price($total_global_ht) . '</b></td>';
|
||||||
|
print '<td align="right"><b>' . price($total_global_ttc) . '</b></td>';
|
||||||
|
print '<td width="18"> </td>';
|
||||||
|
print '</tr>';
|
||||||
|
|
||||||
|
|
||||||
|
if (count($object->tab_next_situation_invoice) > 0) {
|
||||||
|
// List of next invoices
|
||||||
|
/*print '<tr class="liste_titre">';
|
||||||
|
print '<td>' . $langs->trans('ListOfNextSituationInvoices') . '</td>';
|
||||||
|
print '<td></td>';
|
||||||
|
print '<td></td>';
|
||||||
|
if (! empty($conf->banque->enabled)) print '<td align="right"></td>';
|
||||||
|
print '<td align="right">' . $langs->trans('AmountHT') . '</td>';
|
||||||
|
print '<td align="right">' . $langs->trans('AmountTTC') . '</td>';
|
||||||
|
print '<td width="18"> </td>';
|
||||||
|
print '</tr>';*/
|
||||||
|
|
||||||
|
$total_next_ht = $total_next_ttc = 0;
|
||||||
|
|
||||||
|
foreach ($object->tab_next_situation_invoice as $next_invoice) {
|
||||||
|
$totalpaye = $next_invoice->getSommePaiement();
|
||||||
|
$total_next_ht += $next_invoice->total_ht;
|
||||||
|
$total_next_ttc += $next_invoice->total_ttc;
|
||||||
|
|
||||||
|
print '<tr class="oddeven">';
|
||||||
|
print '<td>' . $next_invoice->getNomUrl(1) . '</td>';
|
||||||
|
print '<td></td>';
|
||||||
|
print '<td align="center">'.(($next_invoice->type == Facture::TYPE_CREDIT_NOTE)?$langs->trans('situationInvoiceShortcode_AS'):$langs->trans('situationInvoiceShortcode_S')) . $next_invoice->situation_counter.'</td>';
|
||||||
|
if (! empty($conf->banque->enabled)) print '<td align="right"></td>';
|
||||||
|
print '<td align="right">' . price($next_invoice->total_ht) . '</td>';
|
||||||
|
print '<td align="right">' . price($next_invoice->total_ttc) . '</td>';
|
||||||
|
print '<td align="right">' . $next_invoice->getLibStatut(3, $totalpaye) . '</td>';
|
||||||
|
print '</tr>';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$total_global_ht += $total_next_ht;
|
||||||
|
$total_global_ttc += $total_next_ttc;
|
||||||
|
|
||||||
|
print '<tr class="oddeven">';
|
||||||
|
print '<td colspan="3" align="right"></td>';
|
||||||
|
if (! empty($conf->banque->enabled)) print '<td align="right"></td>';
|
||||||
|
print '<td align="right"><b>' . price($total_global_ht) . '</b></td>';
|
||||||
|
print '<td align="right"><b>' . price($total_global_ttc) . '</b></td>';
|
||||||
|
print '<td width="18"> </td>';
|
||||||
|
print '</tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
print '</table>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4465,6 +4682,45 @@ else if ($id > 0 || ! empty($ref))
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For situation invoice with excess received
|
||||||
|
if ($object->statut == Facture::STATUS_VALIDATED
|
||||||
|
&& ($object->total_ttc - $totalpaye - $totalcreditnotes - $totaldeposits) > 0
|
||||||
|
&& $user->rights->facture->creer
|
||||||
|
&& !$objectidnext
|
||||||
|
&& $object->is_last_in_cycle()
|
||||||
|
&& $conf->global->INVOICE_USE_SITUATION_CREDIT_NOTE
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->facture->creer))
|
||||||
|
|| (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->facture->invoice_advance->unvalidate)))
|
||||||
|
{
|
||||||
|
print '<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER['PHP_SELF'] . '?socid=' . $object->socid .'&fac_avoir=' . $object->id . '&invoiceAvoirWithLines=1&action=create&type=2'.($object->fk_project > 0 ? '&projectid='.$object->fk_project : '').'">' . $langs->trans("CreateCreditNote") . '</a></div>';
|
||||||
|
} else {
|
||||||
|
print '<div class="inline-block divButAction"><span class="butActionRefused" title="' . $langs->trans("NotEnoughPermissions") . '">' . $langs->trans("CreateCreditNote") . '</span></div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove situation from cycle
|
||||||
|
if ($object->statut == Facture::STATUS_VALIDATED
|
||||||
|
&& $object->type == Facture::TYPE_SITUATION
|
||||||
|
&& $user->rights->facture->creer
|
||||||
|
&& !$objectidnext
|
||||||
|
&& $object->situation_counter > 1
|
||||||
|
&& $object->is_last_in_cycle()
|
||||||
|
&& ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->facture->creer))
|
||||||
|
|| (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->facture->invoice_advance->unvalidate)))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if(($object->total_ttc - $totalcreditnotes ) == 0 )
|
||||||
|
{
|
||||||
|
print '<div class="inline-block divButAction"><a id="butSituationOut" class="butAction" href="' . $_SERVER['PHP_SELF'] . '?facid=' . $object->id . '&action=situationout">' . $langs->trans("RemoveSituationFromCycle") . '</a></div>';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print '<div class="inline-block divButAction"><a id="butSituationOutRefused" class="butActionRefused" href="#" title="' . $langs->trans("DisabledBecauseNotEnouthCreditNote") . '" >' . $langs->trans("RemoveSituationFromCycle") . '</a></div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Create next situation invoice
|
// Create next situation invoice
|
||||||
if ($user->rights->facture->creer && ($object->type == 5) && ($object->statut == 1 || $object->statut == 2)) {
|
if ($user->rights->facture->creer && ($object->type == 5) && ($object->statut == 1 || $object->statut == 2)) {
|
||||||
if ($object->is_last_in_cycle() && $object->situation_final != 1) {
|
if ($object->is_last_in_cycle() && $object->situation_final != 1) {
|
||||||
|
|||||||
@ -1349,7 +1349,7 @@ class Facture extends CommonInvoice
|
|||||||
$this->multicurrency_total_tva = $obj->multicurrency_total_tva;
|
$this->multicurrency_total_tva = $obj->multicurrency_total_tva;
|
||||||
$this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
|
$this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
|
||||||
|
|
||||||
if ($this->type == self::TYPE_SITUATION && $fetch_situation)
|
if (($this->type == self::TYPE_SITUATION || ($this->type == self::TYPE_CREDIT_NOTE && $this->situation_cycle_ref > 0)) && $fetch_situation)
|
||||||
{
|
{
|
||||||
$this->fetchPreviousNextSituationInvoice();
|
$this->fetchPreviousNextSituationInvoice();
|
||||||
}
|
}
|
||||||
@ -1521,8 +1521,16 @@ class Facture extends CommonInvoice
|
|||||||
$invoice = new Facture($this->db);
|
$invoice = new Facture($this->db);
|
||||||
if ($invoice->fetch($objp->rowid) > 0)
|
if ($invoice->fetch($objp->rowid) > 0)
|
||||||
{
|
{
|
||||||
if ($objp->situation_counter < $this->situation_counter) $this->tab_previous_situation_invoice[] = $invoice;
|
if ($objp->situation_counter < $this->situation_counter
|
||||||
else $this->tab_next_situation_invoice[] = $invoice;
|
|| ($objp->situation_counter == $this->situation_counter && $objp->rowid < $this->id) // This case appear when there are credit notes
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$this->tab_previous_situation_invoice[] = $invoice;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->tab_next_situation_invoice[] = $invoice;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3493,6 +3501,7 @@ class Facture extends CommonInvoice
|
|||||||
|
|
||||||
$return = array();
|
$return = array();
|
||||||
|
|
||||||
|
|
||||||
$sql = "SELECT f.rowid as rowid, f.facnumber, f.fk_statut, f.type, f.paye, pf.fk_paiement";
|
$sql = "SELECT f.rowid as rowid, f.facnumber, f.fk_statut, f.type, f.paye, pf.fk_paiement";
|
||||||
$sql.= " FROM ".MAIN_DB_PREFIX."facture as f";
|
$sql.= " FROM ".MAIN_DB_PREFIX."facture as f";
|
||||||
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON f.rowid = pf.fk_facture";
|
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON f.rowid = pf.fk_facture";
|
||||||
@ -3504,6 +3513,23 @@ class Facture extends CommonInvoice
|
|||||||
// $sql.= " OR f.close_code IS NOT NULL)"; // Classee payee partiellement
|
// $sql.= " OR f.close_code IS NOT NULL)"; // Classee payee partiellement
|
||||||
$sql.= " AND ff.type IS NULL"; // Renvoi vrai si pas facture de remplacement
|
$sql.= " AND ff.type IS NULL"; // Renvoi vrai si pas facture de remplacement
|
||||||
$sql.= " AND f.type != ".self::TYPE_CREDIT_NOTE; // Type non 2 si facture non avoir
|
$sql.= " AND f.type != ".self::TYPE_CREDIT_NOTE; // Type non 2 si facture non avoir
|
||||||
|
|
||||||
|
if($conf->global->INVOICE_USE_SITUATION_CREDIT_NOTE){
|
||||||
|
// Select the last situation invoice
|
||||||
|
$sqlSit = 'SELECT MAX(fs.rowid)';
|
||||||
|
$sqlSit.= " FROM ".MAIN_DB_PREFIX."facture as fs";
|
||||||
|
$sqlSit.= " WHERE fs.entity = ".$conf->entity;
|
||||||
|
$sqlSit.= " AND fs.type = ".self::TYPE_SITUATION;
|
||||||
|
$sqlSit.= " AND fs.fk_statut in (".self::STATUS_VALIDATED.",".self::STATUS_CLOSED.")";
|
||||||
|
$sqlSit.= " GROUP BY fs.situation_cycle_ref";
|
||||||
|
$sqlSit.= " ORDER BY fs.situation_counter";
|
||||||
|
$sql.= " AND ( f.type != ".self::TYPE_SITUATION . " OR f.rowid IN (".$sqlSit.") )"; // Type non 5 si facture non avoir
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sql.= " AND f.type != ".self::TYPE_SITUATION ; // Type non 5 si facture non avoir
|
||||||
|
}
|
||||||
|
|
||||||
if ($socid > 0) $sql.=" AND f.fk_soc = ".$socid;
|
if ($socid > 0) $sql.=" AND f.fk_soc = ".$socid;
|
||||||
$sql.= " ORDER BY f.facnumber";
|
$sql.= " ORDER BY f.facnumber";
|
||||||
|
|
||||||
|
|||||||
@ -2660,7 +2660,7 @@ abstract class CommonObject
|
|||||||
$this->multicurrency_total_ttc += isset($this->revenuestamp)?($this->revenuestamp * $multicurrency_tx):0;
|
$this->multicurrency_total_ttc += isset($this->revenuestamp)?($this->revenuestamp * $multicurrency_tx):0;
|
||||||
|
|
||||||
// Situations totals
|
// Situations totals
|
||||||
if ($this->situation_cycle_ref && $this->situation_counter > 1 && method_exists($this, 'get_prev_sits'))
|
if ($this->situation_cycle_ref && $this->situation_counter > 1 && method_exists($this, 'get_prev_sits') && $this->type != $this::TYPE_CREDIT_NOTE )
|
||||||
{
|
{
|
||||||
$prev_sits = $this->get_prev_sits();
|
$prev_sits = $this->get_prev_sits();
|
||||||
|
|
||||||
@ -2704,7 +2704,7 @@ abstract class CommonObject
|
|||||||
$sql .= ", multicurrency_total_ttc='".price2num($this->multicurrency_total_ttc, 'MT', 1)."'";
|
$sql .= ", multicurrency_total_ttc='".price2num($this->multicurrency_total_ttc, 'MT', 1)."'";
|
||||||
$sql .= ' WHERE rowid = '.$this->id;
|
$sql .= ' WHERE rowid = '.$this->id;
|
||||||
|
|
||||||
//print "xx".$sql;
|
|
||||||
dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
|
dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
|
||||||
$resql=$this->db->query($sql);
|
$resql=$this->db->query($sql);
|
||||||
if (! $resql)
|
if (! $resql)
|
||||||
|
|||||||
@ -339,6 +339,12 @@ PaymentOnDifferentThirdBills=Allow payments on different thirdparties bills but
|
|||||||
PaymentNote=Payment note
|
PaymentNote=Payment note
|
||||||
ListOfPreviousSituationInvoices=List of previous situation invoices
|
ListOfPreviousSituationInvoices=List of previous situation invoices
|
||||||
ListOfNextSituationInvoices=List of next situation invoices
|
ListOfNextSituationInvoices=List of next situation invoices
|
||||||
|
ListOfSituationInvoices=List of situation invoices
|
||||||
|
CurrentSituationTotal=Total current situation
|
||||||
|
DisabledBecauseNotEnouthCreditNote=To remove a situation invoice from cycle, this invoice's credit note total must cover this invoice total
|
||||||
|
RemoveSituationFromCycle=Remove this invoice from cycle
|
||||||
|
ConfirmRemoveSituationFromCycle=Remove this invoice %s from cycle ?
|
||||||
|
ConfirmOuting=Confirm outing
|
||||||
FrequencyPer_d=Every %s days
|
FrequencyPer_d=Every %s days
|
||||||
FrequencyPer_m=Every %s months
|
FrequencyPer_m=Every %s months
|
||||||
FrequencyPer_y=Every %s years
|
FrequencyPer_y=Every %s years
|
||||||
@ -505,9 +511,14 @@ SituationAmount=Situation invoice amount(net)
|
|||||||
SituationDeduction=Situation subtraction
|
SituationDeduction=Situation subtraction
|
||||||
ModifyAllLines=Modify all lines
|
ModifyAllLines=Modify all lines
|
||||||
CreateNextSituationInvoice=Create next situation
|
CreateNextSituationInvoice=Create next situation
|
||||||
|
ErrorFindNextSituationInvoice=Error unable to find next situation cycle ref
|
||||||
|
ErrorOutingSituationInvoiceOnUpdate=Unable to outing this situation invoice.
|
||||||
|
ErrorOutingSituationInvoiceCreditNote=Unable to outing linked credit note.
|
||||||
NotLastInCycle=This invoice is not the latest in cycle and must not be modified.
|
NotLastInCycle=This invoice is not the latest in cycle and must not be modified.
|
||||||
DisabledBecauseNotLastInCycle=The next situation already exists.
|
DisabledBecauseNotLastInCycle=The next situation already exists.
|
||||||
DisabledBecauseFinal=This situation is final.
|
DisabledBecauseFinal=This situation is final.
|
||||||
|
situationInvoiceShortcode_AS=AS
|
||||||
|
situationInvoiceShortcode_S=S
|
||||||
CantBeLessThanMinPercent=The progress can't be smaller than its value in the previous situation.
|
CantBeLessThanMinPercent=The progress can't be smaller than its value in the previous situation.
|
||||||
NoSituations=No open situations
|
NoSituations=No open situations
|
||||||
InvoiceSituationLast=Final and general invoice
|
InvoiceSituationLast=Final and general invoice
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user