Miglioramento split payment

This commit is contained in:
Thomas Zilio 2018-12-29 11:15:34 +01:00
parent ec0f524eae
commit ffbbb73ddc
8 changed files with 235 additions and 247 deletions

View File

@ -21,7 +21,7 @@ $show_calcolo_ritenuta_acconto = $show_ritenuta_acconto;
if ($options['action'] == 'edit') { if ($options['action'] == 'edit') {
$id_rivalsa_inps = $result['idrivalsainps']; $id_rivalsa_inps = $result['idrivalsainps'];
$id_ritenuta_acconto = $result['idritenutaacconto']; $id_ritenuta_acconto = $result['idritenutaacconto'];
$calcolo_ritenuta_acconto = $result['calcolo_ritenutaacconto']; $calcolo_ritenuta_acconto = $result['calcolo_ritenuta_acconto'];
} elseif ($options['action'] == 'add') { } elseif ($options['action'] == 'add') {
// Fattura di acquisto // Fattura di acquisto
if ($options['dir'] == 'uscita') { if ($options['dir'] == 'uscita') {
@ -64,7 +64,7 @@ if ($show_rivalsa_inps == 1 || $show_ritenuta_acconto == 1) {
if ($show_calcolo_ritenuta_acconto == 1) { if ($show_calcolo_ritenuta_acconto == 1) {
echo ' echo '
<div class="col-md-4"> <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>'; </div>';
} }

View File

@ -25,44 +25,69 @@ abstract class Row extends Description
return parent::make($document, true); 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; return $this->prezzo_unitario_vendita * $this->qta;
} }
public function getImponibileAttribute() /**
{ * Restituisce l'imponibile scontato dell'elemento.
return $this->subtotale; *
} * @return float
*/
public function getImponibileScontatoAttribute() public function getImponibileScontatoAttribute()
{ {
return $this->imponibile - $this->sconto; return $this->imponibile - $this->sconto;
} }
/**
* Restituisce il totale (imponibile + iva + rivalsa_inps) dell'elemento.
*
* @return float
*/
public function getTotaleAttribute() public function getTotaleAttribute()
{ {
return $this->imponibile_scontato + $this->iva + $this->rivalsa_inps; 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() public function getSpesaAttribute()
{ {
return $this->prezzo_unitario_acquisto * $this->qta; return $this->prezzo_unitario_acquisto * $this->qta;
} }
/**
* Restituisce il gaudagno totale (imponibile_scontato - spesa) relativo all'elemento.
*
* @return float
*/
public function getGuadagnoAttribute() public function getGuadagnoAttribute()
{ {
return $this->imponibile_scontato - $this->spesa; return $this->imponibile_scontato - $this->spesa;
} }
public function getNettoAttribute() // Attributi della componente
{
if ($this->split_payment)
return $this->totale - $this->ritenuta_acconto - $this->iva;
else
return $this->totale - $this->ritenuta_acconto;
}
public function getRivalsaINPSAttribute() public function getRivalsaINPSAttribute()
{ {
@ -86,14 +111,6 @@ abstract class Row extends Description
])['percentuale']; ])['percentuale'];
return ($this->imponibile_scontato + $this->rivalsa_inps) * $percentuale / 100; 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() public function getIvaDetraibileAttribute()
@ -101,6 +118,11 @@ abstract class Row extends Description
return $this->iva - $this->iva_indetraibile; return $this->iva - $this->iva_indetraibile;
} }
public function getSubtotaleAttribute()
{
return $this->imponibile;
}
/** /**
* Restituisce lo sconto della riga corrente in euro. * Restituisce lo sconto della riga corrente in euro.
* *
@ -129,96 +151,13 @@ abstract class Row extends Description
} }
/** /**
* Effettua i conti per la Rivalsa INPS. * Imposta l'identificatore della Ritenuta d'Acconto.
*/
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.
* *
* @param int $value * @param int $value
*/ */
public function setIdRitenutaAccontoAttribute($value) public function setIdRitenutaAccontoAttribute($value)
{ {
$this->attributes['idritenutaacconto'] = $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) public function setIdIvaAttribute($value)
{ {
$this->attributes['idiva'] = $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. * Effettua i conti per lo sconto totale.
*
* @param float $value
*/ */
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->fixSubtotale();
$this->fixSconto(); $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->fixIva();
$this->fixRitenutaAcconto(); $this->fixRitenutaAcconto();
$this->fixRivalsaINPS(); $this->fixRivalsaINPS();
return parent::save($options);
} }
} }

View File

@ -80,7 +80,7 @@ switch (post('op')) {
'idvettore' => post('idvettore'), 'idvettore' => post('idvettore'),
'idsede' => post('idsede'), 'idsede' => post('idsede'),
'idconto' => post('idconto'), 'idconto' => post('idconto'),
'split_payment' => post('split_payment'), 'split_payment' => post('split_payment'),
'n_colli' => post('n_colli'), 'n_colli' => post('n_colli'),
'tipo_resa' => post('tipo_resa'), 'tipo_resa' => post('tipo_resa'),
@ -344,7 +344,7 @@ switch (post('op')) {
'idrivalsainps' => setting('Percentuale rivalsa INPS'), 'idrivalsainps' => setting('Percentuale rivalsa INPS'),
'rivalsainps' => $rivalsainps, 'rivalsainps' => $rivalsainps,
'abilita_serial' => $riga['abilita_serial'], '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'])) { if (!empty($riga['idarticolo'])) {
@ -480,7 +480,7 @@ switch (post('op')) {
'idrivalsainps' => setting('Percentuale rivalsa INPS'), 'idrivalsainps' => setting('Percentuale rivalsa INPS'),
'rivalsainps' => $rivalsainps, 'rivalsainps' => $rivalsainps,
'abilita_serial' => $riga['abilita_serial'], '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'])) { if (!empty($riga['idarticolo'])) {
@ -489,7 +489,7 @@ switch (post('op')) {
} }
} else { } else {
// Aggiunta riga contratto sul documento // 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); $dbo->query($query);
// Scalo le qta degli articoli nel contratto // Scalo le qta degli articoli nel contratto

View File

@ -234,8 +234,8 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
$totale_ritenutaacconto = $rs[0]['ritenutaacconto']; $totale_ritenutaacconto = $rs[0]['ritenutaacconto'];
$totale_rivalsainps = $rs[0]['rivalsainps']; $totale_rivalsainps = $rs[0]['rivalsainps'];
$data_documento = $rs[0]['data']; $data_documento = $rs[0]['data'];
$split_payment = $rs[0]['split_payment']; $split_payment = $rs[0]['split_payment'];
$netto_fattura = get_netto_fattura($iddocumento); $netto_fattura = get_netto_fattura($iddocumento);
$totale_fattura = get_totale_fattura($iddocumento); $totale_fattura = get_totale_fattura($iddocumento);
$imponibile_fattura = get_imponibile_fattura($iddocumento); $imponibile_fattura = get_imponibile_fattura($iddocumento);
@ -334,12 +334,12 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
6) eventuale marca da bollo 6) eventuale marca da bollo
*/ */
// 1) Aggiungo la riga del conto cliente // 1) Aggiungo la riga del conto cliente
$importo_cliente = $totale_fattura; $importo_cliente = $totale_fattura;
if( $split_payment ){ if ($split_payment) {
$importo_cliente = sum ($importo_cliente, -$iva_fattura, 2); $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).' )'; $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); $dbo->query($query2);
@ -500,10 +500,10 @@ function get_netto_fattura($iddocumento)
$rs[0]['bollo'], $rs[0]['bollo'],
-$rs[0]['ritenutaacconto'], -$rs[0]['ritenutaacconto'],
], null, 2); ], null, 2);
if ($rs[0]['split_payment']){ if ($rs[0]['split_payment']) {
$netto_a_pagare = sum($netto_a_pagare, - (get_ivadetraibile_fattura($iddocumento) + get_ivaindetraibile_fattura($iddocumento)), 2 ); $netto_a_pagare = sum($netto_a_pagare, - (get_ivadetraibile_fattura($iddocumento) + get_ivaindetraibile_fattura($iddocumento)), 2);
} }
return $netto_a_pagare; return $netto_a_pagare;
} }
@ -612,7 +612,7 @@ function ricalcola_costiagg_fattura($iddocumento, $idrivalsainps = '', $idritenu
* $prezzo float prezzo totale dell'articolo (prezzounitario*qtà) * $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). * $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 $dir;
global $idddt; global $idddt;
@ -657,9 +657,9 @@ function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva,
// Calcolo ritenuta d'acconto // Calcolo ritenuta d'acconto
$query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare($idritenutaacconto); $query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare($idritenutaacconto);
$rs = $dbo->fetchArray($query); $rs = $dbo->fetchArray($query);
if ($calcolo_ritenutaacconto == 'Imponibile') { if ($calcolo_ritenuta_acconto == 'IMP') {
$ritenutaacconto = ($prezzo - $sconto) / 100 * $rs[0]['percentuale']; $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']; $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; $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(); $idriga = $dbo->lastInsertedID();
/* /*

View File

@ -20,4 +20,15 @@ trait RelationTrait
{ {
return $this->parent(); return $this->parent();
} }
public function getNettoAttribute()
{
$result = parent::getNettoAttribute();
if ($this->parent->split_payment) {
$result = $result - $this->iva;
}
return $result;
}
} }

View File

@ -22,11 +22,6 @@ class Fattura extends Document
'bollo' => 'float', 'bollo' => 'float',
]; ];
public function getModuleAttribute()
{
return $this->tipo->dir == 'entrata' ? 'Fatture di vendita' : 'Fatture di acquisto';
}
/** /**
* Crea una nuova fattura. * Crea una nuova fattura.
* *
@ -57,18 +52,12 @@ class Fattura extends Document
} }
// Tipo di pagamento e banca predefinite dall'anagrafica // 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_pagamento = $database->fetchOne('SELECT id FROM co_pagamenti WHERE id = :id_pagamento', [
$id_anagrafica, ':id_pagamento' => $anagrafica['id_pagamento'.$conto],
$id_anagrafica, ])['id'];
]); $id_banca = $anagrafica['idbanca_'.$conto];
$id_pagamento = $pagamento['id'];
$id_banca = $pagamento['idbanca']; $split_payment = $anagrafica->split_payment;
$split_payment = $database->fetchOne('SELECT split_payment FROM an_anagrafiche WHERE idanagrafica = :id_anagrafica', [
':id_anagrafica' => $id_anagrafica,
])['split_payment'];
// Se la fattura è di vendita e non è stato associato un pagamento predefinito al cliente leggo il pagamento dalle impostazioni // 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)) { if ($direzione == 'entrata' && empty($id_pagamento)) {
@ -82,7 +71,7 @@ class Fattura extends Document
])['id']; ])['id'];
} }
$id_sede = $database->selectOne('an_anagrafiche', 'idsede_fatturazione', ['idanagrafica' => $id_anagrafica])['idsede_fatturazione']; $id_sede = $anagrafica->idsede_fatturazione;
$model->anagrafica()->associate($anagrafica); $model->anagrafica()->associate($anagrafica);
$model->tipo()->associate($tipo_documento); $model->tipo()->associate($tipo_documento);
@ -103,9 +92,11 @@ class Fattura extends Document
if (!empty($id_banca)) { if (!empty($id_banca)) {
$model->idbanca = $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(); $model->save();
return $model; return $model;
@ -134,63 +125,13 @@ class Fattura extends Document
} }
/** /**
* Calcola il nuovo numero di fattura. * Restituisce il nome del modulo a cui l'oggetto è collegato.
*
* @param string $data
* @param string $direzione
* @param int $id_segment
* *
* @return string * @return string
*/ */
public static function getNextNumero($data, $direzione, $id_segment) public function getModuleAttribute()
{ {
if ($direzione == 'entrata') { return $this->tipo->dir == 'entrata' ? 'Fatture di vendita' : 'Fatture di acquisto';
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;
} }
/** /**
@ -279,4 +220,66 @@ class Fattura extends Document
{ {
return $this->hasOne(Components\Sconto::class, 'iddocumento'); 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;
}
} }

View File

@ -404,7 +404,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale']; $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); $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']; $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); $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']; $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); $dbo->query($query);
} }
@ -556,7 +556,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$ritenutaacconto = ($subtot + $rivalsainps) / 100 * $rs[0]['percentuale']; $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); $dbo->query($query);
} }

View File

@ -23,6 +23,10 @@ INSERT INTO `fe_stati_documento`( `codice`, `descrizione`, `icon` ) VALUES
-- ssl_no_verify -- ssl_no_verify
ALTER TABLE `zz_smtps` ADD `ssl_no_verify` BOOLEAN NOT NULL DEFAULT FALSE AFTER `encryption`; ALTER TABLE `zz_smtps` ADD `ssl_no_verify` BOOLEAN NOT NULL DEFAULT FALSE AFTER `encryption`;
-- Introduzione del flag split payment per documenti -- 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';