From ffbbb73ddc92cf2f7823f08760d8516663939364 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Sat, 29 Dec 2018 11:15:34 +0100 Subject: [PATCH] Miglioramento split payment --- include/common/conti.php | 4 +- include/src/Components/Row.php | 260 ++++++++---------- modules/fatture/actions.php | 8 +- modules/fatture/modutil.php | 32 +-- .../fatture/src/Components/RelationTrait.php | 11 + modules/fatture/src/Fattura.php | 151 +++++----- modules/interventi/modutil.php | 8 +- update/2_4_5.sql | 8 +- 8 files changed, 235 insertions(+), 247 deletions(-) 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';