diff --git a/include/common/conti.php b/include/common/conti.php
index 57fb52d75..566e941b0 100644
--- a/include/common/conti.php
+++ b/include/common/conti.php
@@ -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 '
- {[ "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" ]}
';
}
diff --git a/include/src/Components/Row.php b/include/src/Components/Row.php
index 374d08b9a..8a57917df 100644
--- a/include/src/Components/Row.php
+++ b/include/src/Components/Row.php
@@ -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);
}
}
diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php
index 6002132e5..dc002bed2 100644
--- a/modules/fatture/actions.php
+++ b/modules/fatture/actions.php
@@ -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
diff --git a/modules/fatture/modutil.php b/modules/fatture/modutil.php
index 10b9c1a3e..cad04b679 100755
--- a/modules/fatture/modutil.php
+++ b/modules/fatture/modutil.php
@@ -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();
/*
diff --git a/modules/fatture/src/Components/RelationTrait.php b/modules/fatture/src/Components/RelationTrait.php
index 9090c7f36..37779f705 100644
--- a/modules/fatture/src/Components/RelationTrait.php
+++ b/modules/fatture/src/Components/RelationTrait.php
@@ -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;
+ }
}
diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php
index 75e1836ef..a6b98e9f4 100644
--- a/modules/fatture/src/Fattura.php
+++ b/modules/fatture/src/Fattura.php
@@ -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;
+ }
}
diff --git a/modules/interventi/modutil.php b/modules/interventi/modutil.php
index 24e3d06de..8681864b3 100644
--- a/modules/interventi/modutil.php
+++ b/modules/interventi/modutil.php
@@ -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);
}
diff --git a/update/2_4_5.sql b/update/2_4_5.sql
index a1505a4c4..a5696ad48 100644
--- a/update/2_4_5.sql
+++ b/update/2_4_5.sql
@@ -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`;
\ No newline at end of file
+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';