Miglioramento split payment
This commit is contained in:
parent
ec0f524eae
commit
ffbbb73ddc
|
@ -21,7 +21,7 @@ $show_calcolo_ritenuta_acconto = $show_ritenuta_acconto;
|
|||
if ($options['action'] == 'edit') {
|
||||
$id_rivalsa_inps = $result['idrivalsainps'];
|
||||
$id_ritenuta_acconto = $result['idritenutaacconto'];
|
||||
$calcolo_ritenuta_acconto = $result['calcolo_ritenutaacconto'];
|
||||
$calcolo_ritenuta_acconto = $result['calcolo_ritenuta_acconto'];
|
||||
} elseif ($options['action'] == 'add') {
|
||||
// Fattura di acquisto
|
||||
if ($options['dir'] == 'uscita') {
|
||||
|
@ -64,7 +64,7 @@ if ($show_rivalsa_inps == 1 || $show_ritenuta_acconto == 1) {
|
|||
if ($show_calcolo_ritenuta_acconto == 1) {
|
||||
echo '
|
||||
<div class="col-md-4">
|
||||
{[ "type": "select", "label": "'.tr("Calcola ritenuta d'acconto su").'", "name": "calcolo_ritenuta_acconto", "value": "'.$calcolo_ritenuta_acconto.'", "values": "list=\"Imponibile\":\"Imponibile\", \"Imponibile + rivalsa inps\":\"Imponibile + rivalsa inps\"", "required": "1" ]}
|
||||
{[ "type": "select", "label": "'.tr("Calcola ritenuta d'acconto su").'", "name": "calcolo_ritenuta_acconto", "value": "'.$calcolo_ritenuta_acconto.'", "values": "list=\"IMP\":\"Imponibile\", \"IMP+RIV\":\"Imponibile + rivalsa inps\"", "required": "1" ]}
|
||||
</div>';
|
||||
}
|
||||
|
||||
|
|
|
@ -25,44 +25,69 @@ abstract class Row extends Description
|
|||
return parent::make($document, true);
|
||||
}
|
||||
|
||||
public function getSubtotaleAttribute()
|
||||
// Attributi di contabilità
|
||||
|
||||
/**
|
||||
* Restituisce l'imponibile dell'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getImponibileAttribute()
|
||||
{
|
||||
return $this->prezzo_unitario_vendita * $this->qta;
|
||||
}
|
||||
|
||||
public function getImponibileAttribute()
|
||||
{
|
||||
return $this->subtotale;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce l'imponibile scontato dell'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getImponibileScontatoAttribute()
|
||||
{
|
||||
return $this->imponibile - $this->sconto;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il totale (imponibile + iva + rivalsa_inps) dell'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getTotaleAttribute()
|
||||
{
|
||||
return $this->imponibile_scontato + $this->iva + $this->rivalsa_inps;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il netto a pagare (totale - ritenuta_acconto) dell'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getNettoAttribute()
|
||||
{
|
||||
return $this->totale - $this->ritenuta_acconto;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce la spesa (prezzo_unitario_acquisto * qta) relativa all'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getSpesaAttribute()
|
||||
{
|
||||
return $this->prezzo_unitario_acquisto * $this->qta;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il gaudagno totale (imponibile_scontato - spesa) relativo all'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getGuadagnoAttribute()
|
||||
{
|
||||
return $this->imponibile_scontato - $this->spesa;
|
||||
}
|
||||
|
||||
public function getNettoAttribute()
|
||||
{
|
||||
|
||||
if ($this->split_payment)
|
||||
return $this->totale - $this->ritenuta_acconto - $this->iva;
|
||||
else
|
||||
return $this->totale - $this->ritenuta_acconto;
|
||||
}
|
||||
// Attributi della componente
|
||||
|
||||
public function getRivalsaINPSAttribute()
|
||||
{
|
||||
|
@ -86,14 +111,6 @@ abstract class Row extends Description
|
|||
])['percentuale'];
|
||||
|
||||
return ($this->imponibile_scontato + $this->rivalsa_inps) * $percentuale / 100;
|
||||
}
|
||||
|
||||
public function getSplitPaymentAttribute()
|
||||
{
|
||||
return database()->fetchOne('SELECT split_payment FROM co_documenti WHERE id = :id', [
|
||||
':id' => $this->iddocumento,
|
||||
])['split_payment'];
|
||||
|
||||
}
|
||||
|
||||
public function getIvaDetraibileAttribute()
|
||||
|
@ -101,6 +118,11 @@ abstract class Row extends Description
|
|||
return $this->iva - $this->iva_indetraibile;
|
||||
}
|
||||
|
||||
public function getSubtotaleAttribute()
|
||||
{
|
||||
return $this->imponibile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce lo sconto della riga corrente in euro.
|
||||
*
|
||||
|
@ -129,96 +151,13 @@ abstract class Row extends Description
|
|||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per la Rivalsa INPS.
|
||||
*/
|
||||
protected function fixRivalsaINPS()
|
||||
{
|
||||
$rivalsa = database()->fetchOne('SELECT * FROM co_rivalsainps WHERE id = '.prepare($this->idrivalsainps));
|
||||
$this->attributes['rivalsainps'] = ($this->imponibile_scontato) / 100 * $rivalsa['percentuale'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il metodo di calcolo per la Ritenuta d'Acconto.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getCalcoloRitenutaAccontoAttribute()
|
||||
{
|
||||
return $this->calcolo_ritenutaacconto ?: setting("Metodologia calcolo ritenuta d'acconto predefinito");
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il metodo di calcolo per la Ritenuta d'Acconto.
|
||||
*
|
||||
* @param string $value
|
||||
*/
|
||||
public function setCalcoloRitenutaAccontoAttribute($value)
|
||||
{
|
||||
$this->calcolo_ritenutaacconto = $value;
|
||||
|
||||
$this->fixRitenutaAcconto();
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta l'identificatore della Ritenuta d'Acconto, effettuando di conseguenza i conti in base al valore del campo calcolo_ritenuta_acconto.
|
||||
* Imposta l'identificatore della Ritenuta d'Acconto.
|
||||
*
|
||||
* @param int $value
|
||||
*/
|
||||
public function setIdRitenutaAccontoAttribute($value)
|
||||
{
|
||||
$this->attributes['idritenutaacconto'] = $value;
|
||||
|
||||
$this->fixRitenutaAcconto();
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per la Ritenuta d'Acconto.
|
||||
*/
|
||||
protected function fixRitenutaAcconto()
|
||||
{
|
||||
// Calcolo ritenuta d'acconto
|
||||
$ritenuta = database()->fetchOne('SELECT * FROM co_ritenutaacconto WHERE id = '.prepare($this->idritenutaacconto));
|
||||
$conto = $this->imponibile_scontato;
|
||||
|
||||
if ($this->calcolo_ritenuta_acconto == 'Imponibile + rivalsa inps') {
|
||||
$conto += $this->rivalsainps;
|
||||
}
|
||||
|
||||
$this->attributes['ritenutaacconto'] = $conto / 100 * $ritenuta['percentuale'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il valore dello sconto.
|
||||
*
|
||||
* @param float $value
|
||||
*/
|
||||
public function setScontoUnitarioAttribute($value)
|
||||
{
|
||||
$this->attributes['sconto_unitario'] = $value;
|
||||
|
||||
$this->fixSconto();
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il tipo dello sconto.
|
||||
*
|
||||
* @param string $value
|
||||
*/
|
||||
public function setTipoScontoAttribute($value)
|
||||
{
|
||||
$this->attributes['tipo_sconto'] = $value;
|
||||
|
||||
$this->fixSconto();
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per lo sconto totale.
|
||||
*/
|
||||
protected function fixSconto()
|
||||
{
|
||||
$this->attributes['sconto'] = $this->sconto;
|
||||
|
||||
$this->fixIva();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -229,8 +168,62 @@ abstract class Row extends Description
|
|||
public function setIdIvaAttribute($value)
|
||||
{
|
||||
$this->attributes['idiva'] = $value;
|
||||
}
|
||||
|
||||
$this->fixIva();
|
||||
/**
|
||||
* Imposta il costo unitario della riga.
|
||||
*
|
||||
* @param float $value
|
||||
*/
|
||||
public function setPrezzoUnitarioVenditaAttribute($value)
|
||||
{
|
||||
$this->prezzo_unitario_vendita_riga = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il costo unitario della riga.
|
||||
*/
|
||||
public function getPrezzoUnitarioVenditaAttribute()
|
||||
{
|
||||
if (!isset($this->prezzo_unitario_vendita_riga)) {
|
||||
$this->prezzo_unitario_vendita_riga = $this->attributes['subtotale'] / $this->qta;
|
||||
}
|
||||
|
||||
return $this->prezzo_unitario_vendita_riga;
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per il subtotale della riga.
|
||||
*/
|
||||
protected function fixSubtotale()
|
||||
{
|
||||
$this->attributes['subtotale'] = $this->imponibile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per la Rivalsa INPS.
|
||||
*/
|
||||
protected function fixRivalsaINPS()
|
||||
{
|
||||
$rivalsa = database()->fetchOne('SELECT * FROM co_rivalsainps WHERE id = '.prepare($this->idrivalsainps));
|
||||
|
||||
$this->attributes['rivalsainps'] = ($this->imponibile_scontato) / 100 * $rivalsa['percentuale'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per la Ritenuta d'Acconto, basandosi sul valore del campo calcolo_ritenuta_acconto.
|
||||
*/
|
||||
protected function fixRitenutaAcconto()
|
||||
{
|
||||
// Calcolo ritenuta d'acconto
|
||||
$ritenuta = database()->fetchOne('SELECT * FROM co_ritenutaacconto WHERE id = '.prepare($this->idritenutaacconto));
|
||||
$conto = $this->imponibile_scontato;
|
||||
|
||||
if ($this->calcolo_ritenuta_acconto == 'IMP+RIV') {
|
||||
$conto += $this->rivalsainps;
|
||||
}
|
||||
|
||||
$this->attributes['ritenutaacconto'] = $conto / 100 * $ritenuta['percentuale'];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -264,52 +257,29 @@ abstract class Row extends Description
|
|||
}
|
||||
|
||||
/**
|
||||
* Imposta la quantità della riga.
|
||||
*
|
||||
* @param float $value
|
||||
* Effettua i conti per lo sconto totale.
|
||||
*/
|
||||
public function setQtaAttribute($value)
|
||||
protected function fixSconto()
|
||||
{
|
||||
$this->attributes['qta'] = $value;
|
||||
$this->attributes['sconto'] = $this->sconto;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the model to the database.
|
||||
*
|
||||
* @param array $options
|
||||
* @return bool
|
||||
*/
|
||||
public function save(array $options = [])
|
||||
{
|
||||
// Fix dei campi statici
|
||||
$this->fixSubtotale();
|
||||
$this->fixSconto();
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il costo unitario della riga.
|
||||
*
|
||||
* @param float $value
|
||||
*/
|
||||
public function setPrezzoUnitarioVenditaAttribute($value)
|
||||
{
|
||||
$this->prezzo_unitario_vendita_riga = $value;
|
||||
|
||||
$this->fixSubtotale();
|
||||
$this->fixSconto();
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il costo unitario della riga.
|
||||
*/
|
||||
public function getPrezzoUnitarioVenditaAttribute()
|
||||
{
|
||||
if (!isset($this->prezzo_unitario_vendita_riga)) {
|
||||
$this->prezzo_unitario_vendita_riga = $this->attributes['subtotale'] / $this->qta;
|
||||
}
|
||||
|
||||
return $this->prezzo_unitario_vendita_riga;
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per il subtotale della riga.
|
||||
*/
|
||||
protected function fixSubtotale()
|
||||
{
|
||||
$this->attributes['subtotale'] = $this->prezzo_unitario_vendita * $this->qta;
|
||||
|
||||
$this->fixIva();
|
||||
$this->fixRitenutaAcconto();
|
||||
$this->fixRivalsaINPS();
|
||||
|
||||
return parent::save($options);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -80,7 +80,7 @@ switch (post('op')) {
|
|||
'idvettore' => post('idvettore'),
|
||||
'idsede' => post('idsede'),
|
||||
'idconto' => post('idconto'),
|
||||
'split_payment' => post('split_payment'),
|
||||
'split_payment' => post('split_payment'),
|
||||
|
||||
'n_colli' => post('n_colli'),
|
||||
'tipo_resa' => post('tipo_resa'),
|
||||
|
@ -344,7 +344,7 @@ switch (post('op')) {
|
|||
'idrivalsainps' => setting('Percentuale rivalsa INPS'),
|
||||
'rivalsainps' => $rivalsainps,
|
||||
'abilita_serial' => $riga['abilita_serial'],
|
||||
'calcolo_ritenutaacconto' => setting("Metodologia calcolo ritenuta d'acconto predefinito"),
|
||||
'calcolo_ritenuta_acconto' => setting("Metodologia calcolo ritenuta d'acconto predefinito"),
|
||||
]);
|
||||
|
||||
if (!empty($riga['idarticolo'])) {
|
||||
|
@ -480,7 +480,7 @@ switch (post('op')) {
|
|||
'idrivalsainps' => setting('Percentuale rivalsa INPS'),
|
||||
'rivalsainps' => $rivalsainps,
|
||||
'abilita_serial' => $riga['abilita_serial'],
|
||||
'calcolo_ritenutaacconto' => setting("Metodologia calcolo ritenuta d'acconto predefinito"),
|
||||
'calcolo_ritenuta_acconto' => setting("Metodologia calcolo ritenuta d'acconto predefinito"),
|
||||
]);
|
||||
|
||||
if (!empty($riga['idarticolo'])) {
|
||||
|
@ -489,7 +489,7 @@ switch (post('op')) {
|
|||
}
|
||||
} else {
|
||||
// Aggiunta riga contratto sul documento
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idcontratto, is_contratto, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_record).', '.prepare($idcontratto).', "1", '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).", '-', 1, ".prepare(setting('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(setting("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idcontratto, is_contratto, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenuta_acconto, `order`) VALUES('.prepare($id_record).', '.prepare($idcontratto).', "1", '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).", '-', 1, ".prepare(setting('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(setting("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
|
||||
$dbo->query($query);
|
||||
|
||||
// Scalo le qta degli articoli nel contratto
|
||||
|
|
|
@ -234,8 +234,8 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
|
|||
$totale_ritenutaacconto = $rs[0]['ritenutaacconto'];
|
||||
$totale_rivalsainps = $rs[0]['rivalsainps'];
|
||||
$data_documento = $rs[0]['data'];
|
||||
$split_payment = $rs[0]['split_payment'];
|
||||
|
||||
$split_payment = $rs[0]['split_payment'];
|
||||
|
||||
$netto_fattura = get_netto_fattura($iddocumento);
|
||||
$totale_fattura = get_totale_fattura($iddocumento);
|
||||
$imponibile_fattura = get_imponibile_fattura($iddocumento);
|
||||
|
@ -334,12 +334,12 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
|
|||
6) eventuale marca da bollo
|
||||
*/
|
||||
// 1) Aggiungo la riga del conto cliente
|
||||
$importo_cliente = $totale_fattura;
|
||||
|
||||
if( $split_payment ){
|
||||
$importo_cliente = sum ($importo_cliente, -$iva_fattura, 2);
|
||||
}
|
||||
|
||||
$importo_cliente = $totale_fattura;
|
||||
|
||||
if ($split_payment) {
|
||||
$importo_cliente = sum($importo_cliente, -$iva_fattura, 2);
|
||||
}
|
||||
|
||||
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($data_documento).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($importo_cliente + $totale_bolli) * $segno_mov1_cliente).', '.prepare($primanota).' )';
|
||||
$dbo->query($query2);
|
||||
|
||||
|
@ -500,10 +500,10 @@ function get_netto_fattura($iddocumento)
|
|||
$rs[0]['bollo'],
|
||||
-$rs[0]['ritenutaacconto'],
|
||||
], null, 2);
|
||||
|
||||
if ($rs[0]['split_payment']){
|
||||
$netto_a_pagare = sum($netto_a_pagare, - (get_ivadetraibile_fattura($iddocumento) + get_ivaindetraibile_fattura($iddocumento)), 2 );
|
||||
}
|
||||
|
||||
if ($rs[0]['split_payment']) {
|
||||
$netto_a_pagare = sum($netto_a_pagare, - (get_ivadetraibile_fattura($iddocumento) + get_ivaindetraibile_fattura($iddocumento)), 2);
|
||||
}
|
||||
|
||||
return $netto_a_pagare;
|
||||
}
|
||||
|
@ -612,7 +612,7 @@ function ricalcola_costiagg_fattura($iddocumento, $idrivalsainps = '', $idritenu
|
|||
* $prezzo float prezzo totale dell'articolo (prezzounitario*qtà)
|
||||
* $idintervento integer id dell'intervento da cui arriva l'articolo (per non creare casini quando si rimuoverà un articolo dalla fattura).
|
||||
*/
|
||||
function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT', $idintervento = 0, $idconto = 0, $idum = 0, $idrivalsainps = '', $idritenutaacconto = '', $calcolo_ritenutaacconto = '')
|
||||
function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT', $idintervento = 0, $idconto = 0, $idum = 0, $idrivalsainps = '', $idritenutaacconto = '', $calcolo_ritenuta_acconto = '')
|
||||
{
|
||||
global $dir;
|
||||
global $idddt;
|
||||
|
@ -657,9 +657,9 @@ function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva,
|
|||
// Calcolo ritenuta d'acconto
|
||||
$query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare($idritenutaacconto);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
if ($calcolo_ritenutaacconto == 'Imponibile') {
|
||||
if ($calcolo_ritenuta_acconto == 'IMP') {
|
||||
$ritenutaacconto = ($prezzo - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
} elseif ($calcolo_ritenutaacconto == 'Imponibile + rivalsa inps') {
|
||||
} elseif ($calcolo_ritenuta_acconto == 'IMP+RIV') {
|
||||
$ritenutaacconto = ($prezzo - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
|
||||
}
|
||||
}
|
||||
|
@ -673,7 +673,7 @@ function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva,
|
|||
}
|
||||
$idconto = empty($idconto) ? $default_idconto : $idconto;
|
||||
|
||||
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idintervento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, qta, abilita_serial, idconto, um, `order`, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, calcolo_ritenutaacconto) VALUES ('.prepare($iddocumento).', '.prepare($idarticolo).', '.(!empty($idintervento) ? prepare($idintervento) : 'NULL').', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($qta).', '.prepare($rsart[0]['abilita_serial']).', '.prepare($idconto).', '.prepare($um).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($iddocumento).'), '.prepare($idritenutaacconto).', '.prepare($ritenutaacconto).', '.prepare($idrivalsainps).', '.prepare($rivalsainps).', '.prepare($calcolo_ritenutaacconto).')');
|
||||
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idintervento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, qta, abilita_serial, idconto, um, `order`, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, calcolo_ritenuta_acconto) VALUES ('.prepare($iddocumento).', '.prepare($idarticolo).', '.(!empty($idintervento) ? prepare($idintervento) : 'NULL').', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($qta).', '.prepare($rsart[0]['abilita_serial']).', '.prepare($idconto).', '.prepare($um).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($iddocumento).'), '.prepare($idritenutaacconto).', '.prepare($ritenutaacconto).', '.prepare($idrivalsainps).', '.prepare($rivalsainps).', '.prepare($calcolo_ritenuta_acconto).')');
|
||||
$idriga = $dbo->lastInsertedID();
|
||||
|
||||
/*
|
||||
|
|
|
@ -20,4 +20,15 @@ trait RelationTrait
|
|||
{
|
||||
return $this->parent();
|
||||
}
|
||||
|
||||
public function getNettoAttribute()
|
||||
{
|
||||
$result = parent::getNettoAttribute();
|
||||
|
||||
if ($this->parent->split_payment) {
|
||||
$result = $result - $this->iva;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,11 +22,6 @@ class Fattura extends Document
|
|||
'bollo' => 'float',
|
||||
];
|
||||
|
||||
public function getModuleAttribute()
|
||||
{
|
||||
return $this->tipo->dir == 'entrata' ? 'Fatture di vendita' : 'Fatture di acquisto';
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova fattura.
|
||||
*
|
||||
|
@ -57,18 +52,12 @@ class Fattura extends Document
|
|||
}
|
||||
|
||||
// Tipo di pagamento e banca predefinite dall'anagrafica
|
||||
$pagamento = $database->fetchOne('SELECT id, (SELECT idbanca_'.$conto.' FROM an_anagrafiche WHERE idanagrafica = ?) AS idbanca FROM co_pagamenti WHERE id = (SELECT idpagamento_'.$conto.' AS pagamento FROM an_anagrafiche WHERE idanagrafica = ?)', [
|
||||
$id_anagrafica,
|
||||
$id_anagrafica,
|
||||
]);
|
||||
$id_pagamento = $pagamento['id'];
|
||||
$id_banca = $pagamento['idbanca'];
|
||||
|
||||
$split_payment = $database->fetchOne('SELECT split_payment FROM an_anagrafiche WHERE idanagrafica = :id_anagrafica', [
|
||||
':id_anagrafica' => $id_anagrafica,
|
||||
])['split_payment'];
|
||||
|
||||
|
||||
$id_pagamento = $database->fetchOne('SELECT id FROM co_pagamenti WHERE id = :id_pagamento', [
|
||||
':id_pagamento' => $anagrafica['id_pagamento'.$conto],
|
||||
])['id'];
|
||||
$id_banca = $anagrafica['idbanca_'.$conto];
|
||||
|
||||
$split_payment = $anagrafica->split_payment;
|
||||
|
||||
// Se la fattura è di vendita e non è stato associato un pagamento predefinito al cliente leggo il pagamento dalle impostazioni
|
||||
if ($direzione == 'entrata' && empty($id_pagamento)) {
|
||||
|
@ -82,7 +71,7 @@ class Fattura extends Document
|
|||
])['id'];
|
||||
}
|
||||
|
||||
$id_sede = $database->selectOne('an_anagrafiche', 'idsede_fatturazione', ['idanagrafica' => $id_anagrafica])['idsede_fatturazione'];
|
||||
$id_sede = $anagrafica->idsede_fatturazione;
|
||||
|
||||
$model->anagrafica()->associate($anagrafica);
|
||||
$model->tipo()->associate($tipo_documento);
|
||||
|
@ -103,9 +92,11 @@ class Fattura extends Document
|
|||
if (!empty($id_banca)) {
|
||||
$model->idbanca = $id_banca;
|
||||
}
|
||||
if (!empty($split_payment)) {
|
||||
$model->split_payment = $split_payment;
|
||||
}
|
||||
|
||||
if (!empty($split_payment)) {
|
||||
$model->split_payment = $split_payment;
|
||||
}
|
||||
|
||||
$model->save();
|
||||
|
||||
return $model;
|
||||
|
@ -134,63 +125,13 @@ class Fattura extends Document
|
|||
}
|
||||
|
||||
/**
|
||||
* Calcola il nuovo numero di fattura.
|
||||
*
|
||||
* @param string $data
|
||||
* @param string $direzione
|
||||
* @param int $id_segment
|
||||
* Restituisce il nome del modulo a cui l'oggetto è collegato.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getNextNumero($data, $direzione, $id_segment)
|
||||
public function getModuleAttribute()
|
||||
{
|
||||
if ($direzione == 'entrata') {
|
||||
return '';
|
||||
}
|
||||
|
||||
$database = database();
|
||||
|
||||
// Recupero maschera per questo segmento
|
||||
$maschera = Generator::getMaschera($id_segment);
|
||||
|
||||
$ultima_fattura = $database->fetchOne('SELECT numero FROM co_documenti WHERE YEAR(data) = :year AND id_segment = :id_segment '.Generator::getMascheraOrder($maschera, 'numero'), [
|
||||
':year' => date('Y', strtotime($data)),
|
||||
':id_segment' => $id_segment,
|
||||
]);
|
||||
|
||||
$numero = Generator::generate($maschera, $ultima_fattura['numero'], 1, Generator::dateToPattern($data));
|
||||
|
||||
return $numero;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calcola il nuovo numero secondario di fattura.
|
||||
*
|
||||
* @param string $data
|
||||
* @param string $direzione
|
||||
* @param int $id_segment
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getNextNumeroSecondario($data, $direzione, $id_segment)
|
||||
{
|
||||
if ($direzione == 'uscita') {
|
||||
return '';
|
||||
}
|
||||
|
||||
$database = database();
|
||||
|
||||
// Recupero maschera per questo segmento
|
||||
$maschera = Generator::getMaschera($id_segment);
|
||||
|
||||
$ultima_fattura = $database->fetchOne('SELECT numero_esterno FROM co_documenti WHERE YEAR(data) = :year AND id_segment = :id_segment '.Generator::getMascheraOrder($maschera, 'numero_esterno'), [
|
||||
':year' => date('Y', strtotime($data)),
|
||||
':id_segment' => $id_segment,
|
||||
]);
|
||||
|
||||
$numero_esterno = Generator::generate($maschera, $ultima_fattura['numero_esterno'], 1, Generator::dateToPattern($data));
|
||||
|
||||
return $numero_esterno;
|
||||
return $this->tipo->dir == 'entrata' ? 'Fatture di vendita' : 'Fatture di acquisto';
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -279,4 +220,66 @@ class Fattura extends Document
|
|||
{
|
||||
return $this->hasOne(Components\Sconto::class, 'iddocumento');
|
||||
}
|
||||
|
||||
// Metodi statici
|
||||
|
||||
/**
|
||||
* Calcola il nuovo numero di fattura.
|
||||
*
|
||||
* @param string $data
|
||||
* @param string $direzione
|
||||
* @param int $id_segment
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getNextNumero($data, $direzione, $id_segment)
|
||||
{
|
||||
if ($direzione == 'entrata') {
|
||||
return '';
|
||||
}
|
||||
|
||||
$database = database();
|
||||
|
||||
// Recupero maschera per questo segmento
|
||||
$maschera = Generator::getMaschera($id_segment);
|
||||
|
||||
$ultima_fattura = $database->fetchOne('SELECT numero FROM co_documenti WHERE YEAR(data) = :year AND id_segment = :id_segment '.Generator::getMascheraOrder($maschera, 'numero'), [
|
||||
':year' => date('Y', strtotime($data)),
|
||||
':id_segment' => $id_segment,
|
||||
]);
|
||||
|
||||
$numero = Generator::generate($maschera, $ultima_fattura['numero'], 1, Generator::dateToPattern($data));
|
||||
|
||||
return $numero;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calcola il nuovo numero secondario di fattura.
|
||||
*
|
||||
* @param string $data
|
||||
* @param string $direzione
|
||||
* @param int $id_segment
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getNextNumeroSecondario($data, $direzione, $id_segment)
|
||||
{
|
||||
if ($direzione == 'uscita') {
|
||||
return '';
|
||||
}
|
||||
|
||||
$database = database();
|
||||
|
||||
// Recupero maschera per questo segmento
|
||||
$maschera = Generator::getMaschera($id_segment);
|
||||
|
||||
$ultima_fattura = $database->fetchOne('SELECT numero_esterno FROM co_documenti WHERE YEAR(data) = :year AND id_segment = :id_segment '.Generator::getMascheraOrder($maschera, 'numero_esterno'), [
|
||||
':year' => date('Y', strtotime($data)),
|
||||
':id_segment' => $id_segment,
|
||||
]);
|
||||
|
||||
$numero_esterno = Generator::generate($maschera, $ultima_fattura['numero_esterno'], 1, Generator::dateToPattern($data));
|
||||
|
||||
return $numero_esterno;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -404,7 +404,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
|
|||
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
|
||||
}
|
||||
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', 'ore', ".prepare($ore).', '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare($calcolo_ritenuta_acconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenuta_acconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', 'ore', ".prepare($ore).', '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare($calcolo_ritenuta_acconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
|
||||
$dbo->query($query);
|
||||
}
|
||||
}
|
||||
|
@ -495,7 +495,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
|
|||
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
|
||||
}
|
||||
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($rsr[$i]['descrizione']).', '.prepare($subtot).', '.prepare($rsr[$i]['sconto']).', '.prepare($rsr[$i]['sconto_unitario']).', '.prepare($rsr[$i]['tipo_sconto']).', '.prepare($rsr[$i]['um']).', '.prepare($rsr[$i]['qta']).', '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare($calcolo_ritenuta_acconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenuta_acconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($rsr[$i]['descrizione']).', '.prepare($subtot).', '.prepare($rsr[$i]['sconto']).', '.prepare($rsr[$i]['sconto_unitario']).', '.prepare($rsr[$i]['tipo_sconto']).', '.prepare($rsr[$i]['um']).', '.prepare($rsr[$i]['qta']).', '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare($calcolo_ritenuta_acconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
|
||||
$dbo->query($query);
|
||||
}
|
||||
}
|
||||
|
@ -526,7 +526,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
|
|||
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $dati[0]['percentuale'];
|
||||
}
|
||||
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Trasferta intervento '.$codice.' del '.Translator::dateToLocale($data)).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', '', 1, ".prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare($calcolo_ritenuta_acconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenuta_acconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Trasferta intervento '.$codice.' del '.Translator::dateToLocale($data)).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', '', 1, ".prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare($calcolo_ritenuta_acconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
|
||||
$dbo->query($query);
|
||||
}
|
||||
|
||||
|
@ -556,7 +556,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
|
|||
$ritenutaacconto = ($subtot + $rivalsainps) / 100 * $rs[0]['percentuale'];
|
||||
}
|
||||
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', NULL, '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Sconto '.$descrizione).', '.prepare($subtot).', 1, '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare($calcolo_ritenuta_acconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenuta_acconto, `order`) VALUES('.prepare($id_fattura).', NULL, '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Sconto '.$descrizione).', '.prepare($subtot).', 1, '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare($calcolo_ritenuta_acconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
|
||||
$dbo->query($query);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,10 @@ INSERT INTO `fe_stati_documento`( `codice`, `descrizione`, `icon` ) VALUES
|
|||
-- ssl_no_verify
|
||||
ALTER TABLE `zz_smtps` ADD `ssl_no_verify` BOOLEAN NOT NULL DEFAULT FALSE AFTER `encryption`;
|
||||
|
||||
|
||||
-- Introduzione del flag split payment per documenti
|
||||
ALTER TABLE `co_documenti` ADD `split_payment` BOOLEAN NOT NULL DEFAULT FALSE AFTER `bollo`;
|
||||
ALTER TABLE `co_documenti` ADD `split_payment` BOOLEAN NOT NULL DEFAULT FALSE AFTER `bollo`;
|
||||
|
||||
-- Fix campo calcolo_ritenutaacconto
|
||||
UPDATE `co_righe_documenti` SET `calcolo_ritenutaacconto` = 'IMP' WHERE `calcolo_ritenutaacconto` = 'Imponibile' OR `calcolo_ritenutaacconto` = '';
|
||||
UPDATE `co_righe_documenti` SET `calcolo_ritenutaacconto` = 'IMP+RIV' WHERE `calcolo_ritenutaacconto` = 'Imponibile + rivalsa inps';
|
||||
ALTER TABLE `co_righe_documenti` CHANGE `calcolo_ritenutaacconto` `calcolo_ritenuta_acconto` ENUM('IMP', 'IMP+RIV') DEFAULT 'IMP';
|
||||
|
|
Loading…
Reference in New Issue