Merge pull request #4411 from atm-ph/fix_develop_situation_invoice
FIX invoice situation
This commit is contained in:
commit
90833e5d0e
@ -103,7 +103,7 @@ $extrafields = new ExtraFields($db);
|
|||||||
|
|
||||||
// Load object
|
// Load object
|
||||||
if ($id > 0 || ! empty($ref)) {
|
if ($id > 0 || ! empty($ref)) {
|
||||||
$ret = $object->fetch($id, $ref);
|
$ret = $object->fetch($id, $ref, '', '', $conf->global->INVOICE_USE_SITUATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
|
// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
|
||||||
@ -1163,6 +1163,18 @@ if (empty($reshook))
|
|||||||
$object->fk_facture_source = $_POST['situations'];
|
$object->fk_facture_source = $_POST['situations'];
|
||||||
$object->type = Facture::TYPE_SITUATION;
|
$object->type = Facture::TYPE_SITUATION;
|
||||||
|
|
||||||
|
if (!empty($origin) && !empty($originid))
|
||||||
|
{
|
||||||
|
$object->origin = $origin;
|
||||||
|
$object->origin_id = $originid;
|
||||||
|
|
||||||
|
foreach ($object->lines as &$line)
|
||||||
|
{
|
||||||
|
$line->origin = $object->origin;
|
||||||
|
$line->origin_id = $line->id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$object->fetch_thirdparty();
|
$object->fetch_thirdparty();
|
||||||
$object->date = $datefacture;
|
$object->date = $datefacture;
|
||||||
$object->note_public = trim($_POST['note_public']);
|
$object->note_public = trim($_POST['note_public']);
|
||||||
@ -1492,11 +1504,11 @@ if (empty($reshook))
|
|||||||
$date_end = '';
|
$date_end = '';
|
||||||
$date_start = dol_mktime(GETPOST('date_starthour'), GETPOST('date_startmin'), GETPOST('date_startsec'), GETPOST('date_startmonth'), GETPOST('date_startday'), GETPOST('date_startyear'));
|
$date_start = dol_mktime(GETPOST('date_starthour'), GETPOST('date_startmin'), GETPOST('date_startsec'), GETPOST('date_startmonth'), GETPOST('date_startday'), GETPOST('date_startyear'));
|
||||||
$date_end = dol_mktime(GETPOST('date_endhour'), GETPOST('date_endmin'), GETPOST('date_endsec'), GETPOST('date_endmonth'), GETPOST('date_endday'), GETPOST('date_endyear'));
|
$date_end = dol_mktime(GETPOST('date_endhour'), GETPOST('date_endmin'), GETPOST('date_endsec'), GETPOST('date_endmonth'), GETPOST('date_endday'), GETPOST('date_endyear'));
|
||||||
$description = dol_htmlcleanlastbr(GETPOST('product_desc'));
|
$description = dol_htmlcleanlastbr(GETPOST('product_desc') ? GETPOST('product_desc') : GETPOST('desc'));
|
||||||
$pu_ht = GETPOST('price_ht');
|
$pu_ht = GETPOST('price_ht');
|
||||||
$vat_rate = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0);
|
$vat_rate = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0);
|
||||||
$qty = GETPOST('qty');
|
$qty = GETPOST('qty');
|
||||||
|
|
||||||
// Define info_bits
|
// Define info_bits
|
||||||
$info_bits = 0;
|
$info_bits = 0;
|
||||||
if (preg_match('/\*/', $vat_rate))
|
if (preg_match('/\*/', $vat_rate))
|
||||||
@ -2131,7 +2143,7 @@ if ($action == 'create')
|
|||||||
$opt = $form->selectSituationInvoices(GETPOST('originid'), $socid);
|
$opt = $form->selectSituationInvoices(GETPOST('originid'), $socid);
|
||||||
print '<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
|
print '<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
|
||||||
$tmp='<input type="radio" name="type" value="5"' . (GETPOST('type') == 5 && GETPOST('originid') ? ' checked' : '');
|
$tmp='<input type="radio" name="type" value="5"' . (GETPOST('type') == 5 && GETPOST('originid') ? ' checked' : '');
|
||||||
if ($opt == ('<option value ="0" selected>' . $langs->trans('NoSituations') . '</option>') || (GETPOST('origin') && GETPOST('origin') != 'facture')) $tmp.=' disabled';
|
if ($opt == ('<option value ="0" selected>' . $langs->trans('NoSituations') . '</option>') || (GETPOST('origin') && GETPOST('origin') != 'facture' && GETPOST('origin') != 'commande')) $tmp.=' disabled';
|
||||||
$tmp.= '> ';
|
$tmp.= '> ';
|
||||||
$text = $tmp.$langs->trans("InvoiceSituationAsk") . ' ';
|
$text = $tmp.$langs->trans("InvoiceSituationAsk") . ' ';
|
||||||
$text .= '<select class="flat" id="situations" name="situations">';
|
$text .= '<select class="flat" id="situations" name="situations">';
|
||||||
@ -3018,6 +3030,96 @@ else if ($id > 0 || ! empty($ref))
|
|||||||
|
|
||||||
print '<td rowspan="' . $nbrows . '" colspan="2" valign="top">';
|
print '<td rowspan="' . $nbrows . '" colspan="2" valign="top">';
|
||||||
|
|
||||||
|
if ($object->type == Facture::TYPE_SITUATION && !empty($conf->global->INVOICE_USE_SITUATION))
|
||||||
|
{
|
||||||
|
if (count($object->tab_previous_situation_invoice) > 0 || count($object->tab_next_situation_invoice) > 0) print '<table class="nobordernopadding paymenttable" width="100%">';
|
||||||
|
|
||||||
|
if (count($object->tab_previous_situation_invoice) > 0)
|
||||||
|
{
|
||||||
|
//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;
|
||||||
|
$var = true;
|
||||||
|
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 '.$bc [$var].'>';
|
||||||
|
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>';
|
||||||
|
|
||||||
|
$var = !$var;
|
||||||
|
}
|
||||||
|
|
||||||
|
print '<tr '.$bc [$var].'>';
|
||||||
|
print '<td colspan="2" align="right"></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)
|
||||||
|
{
|
||||||
|
//List of next invoices
|
||||||
|
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;
|
||||||
|
|
||||||
|
$var = true;
|
||||||
|
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 '.$bc [$var].'>';
|
||||||
|
print '<td>'.$next_invoice->getNomUrl(1).'</td>';
|
||||||
|
print '<td></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>';
|
||||||
|
|
||||||
|
$var = !$var;
|
||||||
|
}
|
||||||
|
|
||||||
|
print '<tr '.$bc [$var].'>';
|
||||||
|
print '<td colspan="2" align="right"></td>';
|
||||||
|
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 '</table>';
|
||||||
|
}
|
||||||
|
|
||||||
print '<table class="nobordernopadding paymenttable" width="100%">';
|
print '<table class="nobordernopadding paymenttable" width="100%">';
|
||||||
|
|
||||||
// List of payments already done
|
// List of payments already done
|
||||||
@ -3576,7 +3678,7 @@ else if ($id > 0 || ! empty($ref))
|
|||||||
|
|
||||||
if ($resteapayer == $object->total_ttc && empty($object->paye) && $ventilExportCompta == 0)
|
if ($resteapayer == $object->total_ttc && empty($object->paye) && $ventilExportCompta == 0)
|
||||||
{
|
{
|
||||||
if (! $objectidnext && $object->is_last_in_cycle())
|
if (! $objectidnext)
|
||||||
{
|
{
|
||||||
if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->facture->creer))
|
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)))
|
|| (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->facture->invoice_advance->unvalidate)))
|
||||||
|
|||||||
@ -123,6 +123,16 @@ class Facture extends CommonInvoice
|
|||||||
*/
|
*/
|
||||||
public $situation_final;
|
public $situation_final;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array Table of previous situations
|
||||||
|
*/
|
||||||
|
public $tab_previous_situation_invoice=array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array Table of next situations
|
||||||
|
*/
|
||||||
|
public $tab_next_situation_invoice=array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Standard invoice
|
* Standard invoice
|
||||||
*/
|
*/
|
||||||
@ -595,6 +605,8 @@ class Facture extends CommonInvoice
|
|||||||
*/
|
*/
|
||||||
function createFromCurrent($user,$invertdetail=0)
|
function createFromCurrent($user,$invertdetail=0)
|
||||||
{
|
{
|
||||||
|
global $conf;
|
||||||
|
|
||||||
// Charge facture source
|
// Charge facture source
|
||||||
$facture=new Facture($this->db);
|
$facture=new Facture($this->db);
|
||||||
|
|
||||||
@ -612,6 +624,9 @@ class Facture extends CommonInvoice
|
|||||||
$facture->remise_absolue = $this->remise_absolue;
|
$facture->remise_absolue = $this->remise_absolue;
|
||||||
$facture->remise_percent = $this->remise_percent;
|
$facture->remise_percent = $this->remise_percent;
|
||||||
|
|
||||||
|
$facture->origin = $this->origin;
|
||||||
|
$facture->origin_id = $this->origin_id;
|
||||||
|
|
||||||
$facture->lines = $this->lines; // Tableau des lignes de factures
|
$facture->lines = $this->lines; // Tableau des lignes de factures
|
||||||
$facture->products = $this->lines; // Tant que products encore utilise
|
$facture->products = $this->lines; // Tant que products encore utilise
|
||||||
$facture->situation_counter = $this->situation_counter;
|
$facture->situation_counter = $this->situation_counter;
|
||||||
@ -641,6 +656,20 @@ class Facture extends CommonInvoice
|
|||||||
$this->error=$facture->error;
|
$this->error=$facture->error;
|
||||||
$this->errors=$facture->errors;
|
$this->errors=$facture->errors;
|
||||||
}
|
}
|
||||||
|
elseif ($this->type == self::TYPE_SITUATION && !empty($conf->global->INVOICE_USE_SITUATION))
|
||||||
|
{
|
||||||
|
$this->fetchObjectLinked('', '', $object->id, 'facture');
|
||||||
|
|
||||||
|
foreach ($this->linkedObjectsIds as $typeObject => $Tfk_object)
|
||||||
|
{
|
||||||
|
foreach ($Tfk_object as $fk_object)
|
||||||
|
{
|
||||||
|
$facture->add_object_linked($typeObject, $fk_object);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$facture->add_object_linked('facture', $this->fk_facture_source);
|
||||||
|
}
|
||||||
|
|
||||||
return $facid;
|
return $facid;
|
||||||
}
|
}
|
||||||
@ -923,9 +952,10 @@ class Facture extends CommonInvoice
|
|||||||
* @param string $ref Reference of invoice
|
* @param string $ref Reference of invoice
|
||||||
* @param string $ref_ext External reference of invoice
|
* @param string $ref_ext External reference of invoice
|
||||||
* @param int $ref_int Internal reference of other object
|
* @param int $ref_int Internal reference of other object
|
||||||
|
* @param bool $fetch_situation Fetch the previous and next situation in $tab_previous_situation_invoice and $tab_next_situation_invoice
|
||||||
* @return int >0 if OK, <0 if KO, 0 if not found
|
* @return int >0 if OK, <0 if KO, 0 if not found
|
||||||
*/
|
*/
|
||||||
function fetch($rowid, $ref='', $ref_ext='', $ref_int='')
|
function fetch($rowid, $ref='', $ref_ext='', $ref_int='', $fetch_situation=false)
|
||||||
{
|
{
|
||||||
global $conf;
|
global $conf;
|
||||||
|
|
||||||
@ -1015,6 +1045,11 @@ class Facture extends CommonInvoice
|
|||||||
$this->location_incoterms = $obj->location_incoterms;
|
$this->location_incoterms = $obj->location_incoterms;
|
||||||
$this->libelle_incoterms = $obj->libelle_incoterms;
|
$this->libelle_incoterms = $obj->libelle_incoterms;
|
||||||
|
|
||||||
|
if ($this->type == self::TYPE_SITUATION && $fetch_situation)
|
||||||
|
{
|
||||||
|
$this->fetchPreviousNextSituationInvoice();
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->statut == self::STATUS_DRAFT) $this->brouillon = 1;
|
if ($this->statut == self::STATUS_DRAFT) $this->brouillon = 1;
|
||||||
|
|
||||||
// Retrieve all extrafield for invoice
|
// Retrieve all extrafield for invoice
|
||||||
@ -1143,6 +1178,36 @@ class Facture extends CommonInvoice
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch previous and next situations invoices
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function fetchPreviousNextSituationInvoice()
|
||||||
|
{
|
||||||
|
global $conf;
|
||||||
|
|
||||||
|
$this->tab_previous_situation_invoice = array();
|
||||||
|
$this->tab_next_situation_invoice = array();
|
||||||
|
|
||||||
|
$sql = 'SELECT rowid, situation_counter FROM '.MAIN_DB_PREFIX.'facture WHERE rowid <> '.$this->id.' AND entity = '.$conf->entity.' AND situation_cycle_ref = '.(int) $this->situation_cycle_ref.' ORDER BY situation_counter ASC';
|
||||||
|
|
||||||
|
dol_syslog(get_class($this).'::fetchPreviousNextSituationInvoice ', LOG_DEBUG);
|
||||||
|
$result = $this->db->query($sql);
|
||||||
|
if ($result && $this->db->num_rows($result) > 0)
|
||||||
|
{
|
||||||
|
while ($objp = $this->db->fetch_object($result))
|
||||||
|
{
|
||||||
|
$invoice = new Facture($this->db);
|
||||||
|
if ($invoice->fetch($objp->rowid) > 0)
|
||||||
|
{
|
||||||
|
if ($objp->situation_counter < $this->situation_counter) $this->tab_previous_situation_invoice[] = $invoice;
|
||||||
|
else $this->tab_next_situation_invoice[] = $invoice;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update database
|
* Update database
|
||||||
@ -1910,6 +1975,14 @@ class Facture extends CommonInvoice
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (! $error && !$this->is_last_in_cycle())
|
||||||
|
{
|
||||||
|
if (! $this->updatePriceNextInvoice($langs))
|
||||||
|
{
|
||||||
|
$error++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Set new ref and define current statut
|
// Set new ref and define current statut
|
||||||
if (! $error)
|
if (! $error)
|
||||||
{
|
{
|
||||||
@ -1946,6 +2019,45 @@ class Facture extends CommonInvoice
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update price of next invoice
|
||||||
|
*
|
||||||
|
* @param Translate $langs Translate object
|
||||||
|
* @return bool false if KO, true if OK
|
||||||
|
*/
|
||||||
|
function updatePriceNextInvoice(&$langs)
|
||||||
|
{
|
||||||
|
foreach ($this->tab_next_situation_invoice as $next_invoice)
|
||||||
|
{
|
||||||
|
$is_last = $next_invoice->is_last_in_cycle();
|
||||||
|
|
||||||
|
if ($next_invoice->brouillon && $is_last != 1)
|
||||||
|
{
|
||||||
|
$this->error = $langs->trans('updatePriceNextInvoiceErrorUpdateline', $next_invoice->ref);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$next_invoice->brouillon = 1;
|
||||||
|
foreach ($next_invoice->lines as $line)
|
||||||
|
{
|
||||||
|
$result = $next_invoice->updateline($line->id, $line->desc, $line->subprice, $line->qty, $line->remise_percent,
|
||||||
|
$line->date_start, $line->date_end, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->product_type,
|
||||||
|
$line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->special_code, $line->array_options, $line->situation_percent,
|
||||||
|
$line->fk_unit);
|
||||||
|
|
||||||
|
if ($result < 0)
|
||||||
|
{
|
||||||
|
$this->error = $langs->trans('updatePriceNextInvoiceErrorUpdateline', $next_invoice->ref);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break; // Only the next invoice and not each next invoice
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set draft status
|
* Set draft status
|
||||||
*
|
*
|
||||||
@ -2164,7 +2276,8 @@ class Facture extends CommonInvoice
|
|||||||
$this->line=new FactureLigne($this->db);
|
$this->line=new FactureLigne($this->db);
|
||||||
|
|
||||||
$this->line->context = $this->context;
|
$this->line->context = $this->context;
|
||||||
|
|
||||||
|
$this->line->situpation_percent = $situation_percent;
|
||||||
$this->line->fk_facture=$this->id;
|
$this->line->fk_facture=$this->id;
|
||||||
$this->line->label=$label; // deprecated
|
$this->line->label=$label; // deprecated
|
||||||
$this->line->desc=$desc;
|
$this->line->desc=$desc;
|
||||||
@ -2270,12 +2383,21 @@ class Facture extends CommonInvoice
|
|||||||
|
|
||||||
include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
|
include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
|
||||||
|
|
||||||
global $mysoc;
|
global $mysoc,$langs;
|
||||||
|
|
||||||
dol_syslog(get_class($this)."::updateline rowid=$rowid, desc=$desc, pu=$pu, qty=$qty, remise_percent=$remise_percent, date_start=$date_start, date_end=$date_end, txtva=$txtva, txlocaltax1=$txlocaltax1, txlocaltax2=$txlocaltax2, price_base_type=$price_base_type, info_bits=$info_bits, type=$type, fk_parent_line=$fk_parent_line pa_ht=$pa_ht, special_code=$special_code fk_unit=$fk_unit", LOG_DEBUG);
|
dol_syslog(get_class($this)."::updateline rowid=$rowid, desc=$desc, pu=$pu, qty=$qty, remise_percent=$remise_percent, date_start=$date_start, date_end=$date_end, txtva=$txtva, txlocaltax1=$txlocaltax1, txlocaltax2=$txlocaltax2, price_base_type=$price_base_type, info_bits=$info_bits, type=$type, fk_parent_line=$fk_parent_line pa_ht=$pa_ht, special_code=$special_code fk_unit=$fk_unit", LOG_DEBUG);
|
||||||
|
|
||||||
if ($this->brouillon)
|
if ($this->brouillon)
|
||||||
{
|
{
|
||||||
|
if (!$this->is_last_in_cycle() && empty($this->error))
|
||||||
|
{
|
||||||
|
if (!$this->checkProgressLine($rowid, $situation_percent))
|
||||||
|
{
|
||||||
|
if (!$this->error) $this->error=$langs->trans('invoiceLineProgressError');
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$this->db->begin();
|
$this->db->begin();
|
||||||
|
|
||||||
// Clean parameters
|
// Clean parameters
|
||||||
@ -2398,6 +2520,33 @@ class Facture extends CommonInvoice
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the percent edited is lower of next invoice line
|
||||||
|
*
|
||||||
|
* @param int $idline id of line to check
|
||||||
|
* @param float $situation_percent progress percentage need to be test
|
||||||
|
* @return false if KO, true if OK
|
||||||
|
*/
|
||||||
|
function checkProgressLine($idline, $situation_percent)
|
||||||
|
{
|
||||||
|
$sql = 'SELECT fd.situation_percent FROM '.MAIN_DB_PREFIX.'facturedet fd
|
||||||
|
INNER JOIN '.MAIN_DB_PREFIX.'facture f ON (fd.fk_facture = f.rowid)
|
||||||
|
WHERE fd.fk_prev_id = '.$idline.'
|
||||||
|
AND f.fk_statut <> 0';
|
||||||
|
|
||||||
|
$result = $this->db->query($sql);
|
||||||
|
if (! $result)
|
||||||
|
{
|
||||||
|
$this->error=$this->db->error();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = $this->db->fetch_object($result);
|
||||||
|
|
||||||
|
if ($obj === null) return true;
|
||||||
|
else return $situation_percent < $obj->situation_percent;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update invoice line with percentage
|
* Update invoice line with percentage
|
||||||
*
|
*
|
||||||
@ -3589,10 +3738,12 @@ class Facture extends CommonInvoice
|
|||||||
*/
|
*/
|
||||||
function get_prev_sits()
|
function get_prev_sits()
|
||||||
{
|
{
|
||||||
|
global $conf;
|
||||||
|
|
||||||
$sql = 'SELECT rowid FROM ' . MAIN_DB_PREFIX . 'facture';
|
$sql = 'SELECT rowid FROM ' . MAIN_DB_PREFIX . 'facture';
|
||||||
$sql .= ' where situation_cycle_ref = ' . $this->situation_cycle_ref;
|
$sql .= ' where situation_cycle_ref = ' . $this->situation_cycle_ref;
|
||||||
$sql .= ' and situation_counter < ' . $this->situation_counter;
|
$sql .= ' and situation_counter < ' . $this->situation_counter;
|
||||||
|
$sql .= ' AND entity = '. ($this->entity > 0 ? $this->entity : $conf->entity);
|
||||||
$resql = $this->db->query($sql);
|
$resql = $this->db->query($sql);
|
||||||
$res = array();
|
$res = array();
|
||||||
if ($resql && $resql->num_rows > 0) {
|
if ($resql && $resql->num_rows > 0) {
|
||||||
@ -3642,9 +3793,11 @@ class Facture extends CommonInvoice
|
|||||||
*/
|
*/
|
||||||
function is_last_in_cycle()
|
function is_last_in_cycle()
|
||||||
{
|
{
|
||||||
|
global $conf;
|
||||||
|
|
||||||
if (!empty($this->situation_cycle_ref)) {
|
if (!empty($this->situation_cycle_ref)) {
|
||||||
// No point in testing anything if we're not inside a cycle
|
// No point in testing anything if we're not inside a cycle
|
||||||
$sql = 'SELECT max(situation_counter) FROM ' . MAIN_DB_PREFIX . 'facture WHERE situation_cycle_ref = ' . $this->situation_cycle_ref;
|
$sql = 'SELECT max(situation_counter) FROM ' . MAIN_DB_PREFIX . 'facture WHERE situation_cycle_ref = ' . $this->situation_cycle_ref . ' AND entity = ' . ($this->entity > 0 ? $this->entity : $conf->entity);
|
||||||
$resql = $this->db->query($sql);
|
$resql = $this->db->query($sql);
|
||||||
|
|
||||||
if ($resql && $resql->num_rows > 0) {
|
if ($resql && $resql->num_rows > 0) {
|
||||||
|
|||||||
@ -2075,6 +2075,7 @@ abstract class CommonObject
|
|||||||
|
|
||||||
$sql = 'SELECT rowid, qty, '.$fieldup.' as up, remise_percent, total_ht, '.$fieldtva.' as total_tva, total_ttc, '.$fieldlocaltax1.' as total_localtax1, '.$fieldlocaltax2.' as total_localtax2,';
|
$sql = 'SELECT rowid, qty, '.$fieldup.' as up, remise_percent, total_ht, '.$fieldtva.' as total_tva, total_ttc, '.$fieldlocaltax1.' as total_localtax1, '.$fieldlocaltax2.' as total_localtax2,';
|
||||||
$sql.= ' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, info_bits, product_type';
|
$sql.= ' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, info_bits, product_type';
|
||||||
|
if ($this->table_element_line == 'facturedet') $sql.= ', situation_percent';
|
||||||
$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line;
|
$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line;
|
||||||
$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
|
$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
|
||||||
if ($exclspec)
|
if ($exclspec)
|
||||||
@ -2109,7 +2110,7 @@ abstract class CommonObject
|
|||||||
if ($forcedroundingmode == '0') // Check if data on line are consistent. This may solve lines that were not consistent because set with $forcedroundingmode='auto'
|
if ($forcedroundingmode == '0') // Check if data on line are consistent. This may solve lines that were not consistent because set with $forcedroundingmode='auto'
|
||||||
{
|
{
|
||||||
$localtax_array=array($obj->localtax1_type,$obj->localtax1_tx,$obj->localtax2_type,$obj->localtax2_tx);
|
$localtax_array=array($obj->localtax1_type,$obj->localtax1_tx,$obj->localtax2_type,$obj->localtax2_tx);
|
||||||
$tmpcal=calcul_price_total($obj->qty, $obj->up, $obj->remise_percent, $obj->vatrate, $obj->localtax1_tx, $obj->localtax2_tx, 0, 'HT', $obj->info_bits, $obj->product_type, $seller, $localtax_array);
|
$tmpcal=calcul_price_total($obj->qty, $obj->up, $obj->remise_percent, $obj->vatrate, $obj->localtax1_tx, $obj->localtax2_tx, 0, 'HT', $obj->info_bits, $obj->product_type, $seller, $localtax_array, (isset($obj->situation_percent) ? $obj->situation_percent : 100));
|
||||||
$diff=price2num($tmpcal[1] - $obj->total_tva, 'MT', 1);
|
$diff=price2num($tmpcal[1] - $obj->total_tva, 'MT', 1);
|
||||||
if ($diff)
|
if ($diff)
|
||||||
{
|
{
|
||||||
|
|||||||
2040
htdocs/core/modules/facture/doc/pdf_crevette.modules.php
Normal file
2040
htdocs/core/modules/facture/doc/pdf_crevette.modules.php
Normal file
File diff suppressed because it is too large
Load Diff
@ -186,6 +186,7 @@ ShowInvoice=Show invoice
|
|||||||
ShowInvoiceReplace=Show replacing invoice
|
ShowInvoiceReplace=Show replacing invoice
|
||||||
ShowInvoiceAvoir=Show credit note
|
ShowInvoiceAvoir=Show credit note
|
||||||
ShowInvoiceDeposit=Show deposit invoice
|
ShowInvoiceDeposit=Show deposit invoice
|
||||||
|
ShowInvoiceSituation=Show situation invoice
|
||||||
ShowPayment=Show payment
|
ShowPayment=Show payment
|
||||||
AlreadyPaid=Already paid
|
AlreadyPaid=Already paid
|
||||||
AlreadyPaidBack=Already paid back
|
AlreadyPaidBack=Already paid back
|
||||||
@ -301,6 +302,8 @@ WarningBillExist=Warning, one or more invoice already exist
|
|||||||
MergingPDFTool=Merging PDF tool
|
MergingPDFTool=Merging PDF tool
|
||||||
AmountPaymentDistributedOnInvoice=Payment amount distributed on invoice
|
AmountPaymentDistributedOnInvoice=Payment amount distributed on invoice
|
||||||
PaymentNote=Payment note
|
PaymentNote=Payment note
|
||||||
|
ListOfPreviousSituationInvoices=List of previous situation invoices
|
||||||
|
ListOfNextSituationInvoices=List of next situation invoices
|
||||||
|
|
||||||
# PaymentConditions
|
# PaymentConditions
|
||||||
PaymentConditionShortRECEP=Immediate
|
PaymentConditionShortRECEP=Immediate
|
||||||
@ -410,6 +413,7 @@ NoteListOfYourUnpaidInvoices=Note: This list contains only invoices for third pa
|
|||||||
RevenueStamp=Revenue stamp
|
RevenueStamp=Revenue stamp
|
||||||
YouMustCreateInvoiceFromThird=This option is only available when creating invoice from tab "customer" of thirdparty
|
YouMustCreateInvoiceFromThird=This option is only available when creating invoice from tab "customer" of thirdparty
|
||||||
PDFCrabeDescription=Invoice PDF template Crabe. A complete invoice template (recommended Template)
|
PDFCrabeDescription=Invoice PDF template Crabe. A complete invoice template (recommended Template)
|
||||||
|
PDFCrevetteDescription=Invoice PDF template Crevette. A complete invoice template for invoice situation
|
||||||
TerreNumRefModelDesc1=Return number with format %syymm-nnnn for standard invoices and %syymm-nnnn for credit notes where yy is year, mm is month and nnnn is a sequence with no break and no return to 0
|
TerreNumRefModelDesc1=Return number with format %syymm-nnnn for standard invoices and %syymm-nnnn for credit notes where yy is year, mm is month and nnnn is a sequence with no break and no return to 0
|
||||||
MarsNumRefModelDesc1=Return number with format %syymm-nnnn for standard invoices, %syymm-nnnn for replacement invoices, %syymm-nnnn for deposit invoices and %syymm-nnnn for credit notes where yy is year, mm is month and nnnn is a sequence with no break and no return to 0
|
MarsNumRefModelDesc1=Return number with format %syymm-nnnn for standard invoices, %syymm-nnnn for replacement invoices, %syymm-nnnn for deposit invoices and %syymm-nnnn for credit notes where yy is year, mm is month and nnnn is a sequence with no break and no return to 0
|
||||||
TerreNumRefModelError=A bill starting with $syymm already exists and is not compatible with this model of sequence. Remove it or rename it to activate this module.
|
TerreNumRefModelError=A bill starting with $syymm already exists and is not compatible with this model of sequence. Remove it or rename it to activate this module.
|
||||||
@ -439,3 +443,11 @@ DisabledBecauseFinal=This situation is final.
|
|||||||
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
|
||||||
|
PDFCrevetteSituationNumber=Situation N°%s
|
||||||
|
PDFCrevetteSituationInvoiceLineDecompte=Situation invoice - COUNT
|
||||||
|
PDFCrevetteSituationInvoiceTitle=Situation invoice
|
||||||
|
PDFCrevetteDescription=Invoice PDF template Crevette. A invoice template if you use situation invoice
|
||||||
|
PDFCrevetteSituationInvoiceLine=Situation N°%s : Inv. N°%s on %s
|
||||||
|
TotalSituationInvoice=Total situation
|
||||||
|
invoiceLineProgressError=Invoice line progress can't be egal or upper the next invoice line
|
||||||
|
updatePriceNextInvoiceErrorUpdateline=Error : update price on invoice line : %s
|
||||||
@ -186,6 +186,7 @@ ShowInvoice=Afficher facture
|
|||||||
ShowInvoiceReplace=Afficher facture de remplacement
|
ShowInvoiceReplace=Afficher facture de remplacement
|
||||||
ShowInvoiceAvoir=Afficher facture d'avoir
|
ShowInvoiceAvoir=Afficher facture d'avoir
|
||||||
ShowInvoiceDeposit=Afficher facture d'acompte
|
ShowInvoiceDeposit=Afficher facture d'acompte
|
||||||
|
ShowInvoiceSituation=Afficher facture de situation
|
||||||
ShowPayment=Afficher règlement
|
ShowPayment=Afficher règlement
|
||||||
File=Fichier
|
File=Fichier
|
||||||
AlreadyPaid=Déjà réglé
|
AlreadyPaid=Déjà réglé
|
||||||
@ -300,6 +301,8 @@ RelatedSupplierInvoices=Factures fournisseurs liées
|
|||||||
LatestRelatedBill=Dernière facture en rapport
|
LatestRelatedBill=Dernière facture en rapport
|
||||||
WarningBillExist=Attention, une ou plusieurs factures existent déjà
|
WarningBillExist=Attention, une ou plusieurs factures existent déjà
|
||||||
MergingPDFTool=Outil de fusion de PDF
|
MergingPDFTool=Outil de fusion de PDF
|
||||||
|
ListOfPreviousSituationInvoices=Liste des précédentes factures de situation
|
||||||
|
ListOfNextSituationInvoices=Liste des factures suivantes de situation
|
||||||
|
|
||||||
# PaymentConditions
|
# PaymentConditions
|
||||||
PaymentConditionShortRECEP=À réception
|
PaymentConditionShortRECEP=À réception
|
||||||
@ -408,6 +411,7 @@ NoteListOfYourUnpaidInvoices=Remarque: Cette liste ne contient que les factures
|
|||||||
RevenueStamp=Timbre fiscal
|
RevenueStamp=Timbre fiscal
|
||||||
YouMustCreateInvoiceFromThird=Cette option n'est disponible que lorsqu'on accède à la création de facture depuis l'onglet "Client" d'un Tiers.
|
YouMustCreateInvoiceFromThird=Cette option n'est disponible que lorsqu'on accède à la création de facture depuis l'onglet "Client" d'un Tiers.
|
||||||
PDFCrabeDescription=Modèle de facture PDF complet (modèle recommandé par défaut)
|
PDFCrabeDescription=Modèle de facture PDF complet (modèle recommandé par défaut)
|
||||||
|
PDFCrevetteDescription=Modèle de facture PDF pour les factures de situations
|
||||||
TerreNumRefModelDesc1=Renvoie le numéro sous la forme %syymm-nnnn pour les factures et factures de remplacement, %syymm-nnnn pour les avoirs et %syymm-nnnn pour les acomptes où yy est l'année, mm le mois et nnnn un compteur séquentiel sans rupture et sans remise à 0
|
TerreNumRefModelDesc1=Renvoie le numéro sous la forme %syymm-nnnn pour les factures et factures de remplacement, %syymm-nnnn pour les avoirs et %syymm-nnnn pour les acomptes où yy est l'année, mm le mois et nnnn un compteur séquentiel sans rupture et sans remise à 0
|
||||||
MarsNumRefModelDesc1=Renvoie le numéro sous la forme %syymm-nnnn pour les factures, %syymm-nnnn pour les factures de remplacement, %syymm-nnnn pour les acomptes et %syymm-nnnn pour les avoirs où yy est l'année, mm le mois et nnnn un compteur séquentiel sans rupture et sans remise à 0
|
MarsNumRefModelDesc1=Renvoie le numéro sous la forme %syymm-nnnn pour les factures, %syymm-nnnn pour les factures de remplacement, %syymm-nnnn pour les acomptes et %syymm-nnnn pour les avoirs où yy est l'année, mm le mois et nnnn un compteur séquentiel sans rupture et sans remise à 0
|
||||||
TerreNumRefModelError=Une facture commençant par $syymm existe déjà et est incompatible avec cet modèle de numérotation. Supprimez-la ou renommez-la pour activer ce module.
|
TerreNumRefModelError=Une facture commençant par $syymm existe déjà et est incompatible avec cet modèle de numérotation. Supprimez-la ou renommez-la pour activer ce module.
|
||||||
@ -437,3 +441,11 @@ DisabledBecauseFinal=Cette situation est la dernière
|
|||||||
CantBeLessThanMinPercent=La progression ne peut être inférieure à la valeur de progression du point de situation précédent
|
CantBeLessThanMinPercent=La progression ne peut être inférieure à la valeur de progression du point de situation précédent
|
||||||
NoSituations=Pas de situations ouvertes
|
NoSituations=Pas de situations ouvertes
|
||||||
InvoiceSituationLast=Dernière facture
|
InvoiceSituationLast=Dernière facture
|
||||||
|
PDFCrevetteSituationNumber=Situation N°%s
|
||||||
|
PDFCrevetteSituationOrderTitle=Commande d'origine
|
||||||
|
PDFCrevetteSituationInvoiceTitle=Facture de situation
|
||||||
|
PDFCrevetteSituationInvoiceLineDecompte=Facture de situation - DECOMPTE
|
||||||
|
PDFCrevetteSituationInvoiceLine=Situation N°%s : Fact. N°%s au %s
|
||||||
|
TotalSituationInvoice=Total Situtation
|
||||||
|
invoiceLineProgressError=La progression de la ligne de situation ne peut être égale ou supérieure à la ligne de situation suivante
|
||||||
|
updatePriceNextInvoiceErrorUpdateline=Erreur de mise à jour d'un prix sur la facture : %s
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user