From 3a6184ccae9dea31537e603444e2b3e13b9a6393 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Fri, 13 May 2022 13:23:15 +0200 Subject: [PATCH] Gestione Autofattura --- assets/src/css/style.css | 4 +++ modules/fatture/actions.php | 50 ++++++++++++++++++++++++++-- modules/fatture/buttons.php | 22 ++++++++---- modules/fatture/crea_autofattura.php | 50 ++++++++++++++++++++++++++++ modules/fatture/edit.php | 40 +++++++++++++++++++++- modules/fatture/init.php | 19 +++++++++++ modules/fatture/src/Fattura.php | 11 ++++++ plugins/importFE/actions.php | 8 +++++ plugins/importFE/generate.php | 10 +++++- 9 files changed, 203 insertions(+), 11 deletions(-) create mode 100644 modules/fatture/crea_autofattura.php diff --git a/assets/src/css/style.css b/assets/src/css/style.css index c56406c04..7dab59b51 100755 --- a/assets/src/css/style.css +++ b/assets/src/css/style.css @@ -1107,4 +1107,8 @@ div.tip { .table-extra-condensed > tbody > tr > td, .table-extra-condensed > tfoot > tr > td { padding: 2px; +} + +.alert-warning { + background-color: #ff851b !important; } \ No newline at end of file diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index c105aedf7..2159da793 100755 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -20,6 +20,7 @@ include_once __DIR__.'/../../core.php'; use Modules\Anagrafiche\Anagrafica; +use Modules\Anagrafiche\Tipo as TipoAnagrafica; use Modules\Articoli\Articolo as ArticoloOriginale; use Modules\Fatture\Components\Articolo; use Modules\Fatture\Components\Descrizione; @@ -28,7 +29,7 @@ use Modules\Fatture\Components\Sconto; use Modules\Fatture\Fattura; use Modules\Fatture\Stato; use Modules\Fatture\Tipo; -use Plugins\ExportFE\FatturaElettronica; +use Modules\Iva\Aliquota; use Util\XML; $module = Modules::get($id_module); @@ -817,10 +818,9 @@ switch (post('op')) { $copia = $riga->copiaIn($nota, $qta); $copia->ref_riga_documento = $riga->id; - // Aggiornamento seriali dalla riga dell'ordine + // Aggiornamento seriali dalla riga della fattura if ($copia->isArticolo()) { $serials = is_array(post('serial')[$riga->id]) ? post('serial')[$riga->id] : []; - $copia->serials = $serials; } @@ -833,6 +833,50 @@ switch (post('op')) { break; + // Autofattura + case 'autofattura': + $fattura = Fattura::find($id_record); + + $id_segment = post('id_segment'); + $data = date('Y-m-d'); + + $anagrafica = $fattura->anagrafica; + $tipo = Tipo::find(post('idtipodocumento')); + $iva = Aliquota::find(setting('Iva predefinita')); + $totale_imponibile = setting('Utilizza prezzi di vendita comprensivi di IVA') ? $fattura->totale_imponibile + ($fattura->totale_imponibile * $iva->percentuale / 100) : $fattura->totale_imponibile; + + $autofattura = Fattura::build($anagrafica, $tipo, $data, $id_segment); + $autofattura->idconto = $fattura->idconto; + $autofattura->idpagamento = $fattura->idpagamento; + $autofattura->is_fattura_conto_terzi = 1; + $autofattura->save(); + + $riga = Riga::build($autofattura); + $riga->descrizione = $tipo->descrizione; + $riga->id_iva = $iva->id; + $riga->idconto = setting('Conto per autofattura') ?: setting('Conto predefinito fatture di vendita'); + $riga->setPrezzoUnitario($totale_imponibile, $iva->id); + $riga->qta = 1; + $riga->save(); + + // Aggiunta tipologia cliente se necessario + if (!$anagrafica->isTipo('Cliente')) { + $tipo_cliente = TipoAnagrafica::where('descrizione', '=', 'Cliente')->first(); + $tipi = $anagrafica->tipi->pluck('idtipoanagrafica')->toArray(); + $tipi[] = $tipo_cliente->id; + + $anagrafica->tipologie = $tipi; + $anagrafica->save(); + } + + $fattura->id_autofattura = $autofattura->id; + $fattura->save(); + + $id_module = Modules::get('Fatture di vendita')['id']; + $id_record = $autofattura->id; + + break; + case 'transform': $fattura->id_segment = post('id_segment'); $fattura->data = post('data'); diff --git a/modules/fatture/buttons.php b/modules/fatture/buttons.php index 27c96d01c..13919c51e 100755 --- a/modules/fatture/buttons.php +++ b/modules/fatture/buttons.php @@ -33,14 +33,15 @@ if ($module->name == 'Fatture di vendita') { '; } -if ($dir == 'entrata') { - echo ' +if ($dir == 'entrata' || !empty($abilita_autofattura)) { +echo '
- + '; + if ($dir == 'entrata') { + echo ' + '; + } elseif (!empty($abilita_autofattura)) { + echo ' + '; + } +echo '
'; } @@ -108,4 +118,4 @@ if (!empty($record['is_fiscale'])) { '.tr('Riapri documento').'... '; } -} +} \ No newline at end of file diff --git a/modules/fatture/crea_autofattura.php b/modules/fatture/crea_autofattura.php new file mode 100644 index 000000000..d0ccd254b --- /dev/null +++ b/modules/fatture/crea_autofattura.php @@ -0,0 +1,50 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +$id_module_fatture_vendita = Modules::get('Fatture di vendita')['id']; +$id_segment = setting('Sezionale per autofatture di vendita'); + +echo ' +
+ + + +
+
+ {[ "type": "select", "label": "'.tr('Tipo documento').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, CONCAT_WS(\" - \",codice_tipo_documento_fe, descrizione) AS descrizione FROM co_tipidocumento WHERE dir=\"entrata\" AND codice_tipo_documento_fe IN(\"TD16\", \"TD17\", \"TD18\", \"TD19\", \"TD20\") ORDER BY codice_tipo_documento_fe" ]} +
+ +
+ {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.prepare($id_module_fatture_vendita).' ORDER BY name", "value": "'.$id_segment.'" ]} +
+
+ + +
+
+ +
+
+
+ +'; diff --git a/modules/fatture/edit.php b/modules/fatture/edit.php index 766578814..2d47d127a 100755 --- a/modules/fatture/edit.php +++ b/modules/fatture/edit.php @@ -86,6 +86,45 @@ if ($dir == 'entrata' && !empty($fattura->dichiarazione) ) { } } +// Autofattura +if (!empty($fattura_acquisto_originale)) { + echo ' +
+ '.tr("Questa è un'autofattura generata da una fattura di acquisto").': + '.Modules::link('Fatture di acquisto', $fattura_acquisto_originale->id, tr('Fattura num. _NUM_ del _DATE_', [ + '_NUM_' => $fattura_acquisto_originale->numero_esterno, + '_DATE_' => dateFormat($fattura_acquisto_originale->data), + ])).' +
'; +} + +if ($abilita_autofattura) { + echo ' +
+ '.tr("Per questa fattura è prevista la generazione di un'autofattura tramite Crea » Autofattura").'. +
'; +} elseif ($fattura->id_autofattura != null) { + echo ' +
+ '.tr("È presente un'autofattura collegata").': + '.Modules::link('Fatture di vendita', $fattura->id_autofattura, tr('Fattura num. _NUM_ del _DATE_', [ + '_NUM_' => $autofattura_vendita->numero_esterno, + '_DATE_' => dateFormat($autofattura_vendita->data), + ])).' +
'; +} elseif ($autofattura_collegata != null) { + $link_module = $fattura->direzione == 'entrata' ? 'Fatture di acquisto' : 'Fatture di vendita'; + $link_desc = $fattura->direzione == 'entrata' ? tr("Questa autofattura è già stata importata come fattura di acquisto") : tr("È presente un'autofattura collegata"); + echo ' +
+ '.$link_desc.': + '.Modules::link($link_module, $autofattura_collegata->id, tr('Fattura num. _NUM_ del _DATE_', [ + '_NUM_' => $autofattura_collegata->numero_esterno, + '_DATE_' => dateFormat($autofattura_collegata->data), + ])).' +
'; +} + // Ricordo che si sta emettendo una fattura conto terzi if ($dir == 'entrata' && $fattura->stato->descrizione == 'Bozza' ) { if ($fattura->is_fattura_conto_terzi){ @@ -96,7 +135,6 @@ if ($dir == 'entrata' && $fattura->stato->descrizione == 'Bozza' ) { '; } - } // Verifica aggiuntive sulla sequenzialità dei numeri if ($dir == 'entrata') { diff --git a/modules/fatture/init.php b/modules/fatture/init.php index 67b497cb4..55dacb209 100755 --- a/modules/fatture/init.php +++ b/modules/fatture/init.php @@ -63,4 +63,23 @@ if (isset($id_record)) { // Blocco gestito dallo stato della Fattura Elettronica $stato_fe = $database->fetchOne('SELECT * FROM fe_stati_documento WHERE codice = '.prepare($fattura->codice_stato_fe)); $abilita_genera = empty($fattura->codice_stato_fe) || intval($stato_fe['is_generabile']); + + // Controllo autofattura e gestione avvisi + $reverse_charge = null; + $abilita_autofattura = null; + $autofattura_vendita = null; + $fattura_acquisto_originale = null; + + if (!empty($fattura)) { + $reverse_charge = $fattura->getRighe()->first(function ($item, $key) { + return $item->aliquota != null && substr($item->aliquota->codice_natura_fe, 0, 2) == 'N6'; + })->id; + $autofattura_vendita = Fattura::find($fattura->id_autofattura); + if (empty($autofattura_vendita) && !empty($fattura->progressivo_invio)) { + $autofattura_collegata = Fattura::where('progressivo_invio', '=', $fattura->progressivo_invio)->where('id', '!=', $fattura->id)->first(); + } + $abilita_autofattura = ($fattura->anagrafica->nazione->iso2 != 'IT' || $reverse_charge) && $dir == 'uscita' && $fattura->id_autofattura == null && empty($autofattura_collegata); + + $fattura_acquisto_originale = Fattura::where('id_autofattura', '=', $fattura->id)->first(); + } } diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php index 79238d3fd..c0b04fd05 100755 --- a/modules/fatture/src/Fattura.php +++ b/modules/fatture/src/Fattura.php @@ -747,6 +747,17 @@ class Fattura extends Document return $this->tipo->reversed == 1; } + /** + * Controlla se la fattura è una nota di credito. + * + * @return bool + */ + public function isAutofattura() + { + return in_array($this->tipo->codice_tipo_documento_fe, ['TD16','TD17','TD18','TD19', + 'TD20']); + } + /** * Controlla se la fattura è fiscale. * diff --git a/plugins/importFE/actions.php b/plugins/importFE/actions.php index 653479cac..40f569ed1 100755 --- a/plugins/importFE/actions.php +++ b/plugins/importFE/actions.php @@ -143,6 +143,14 @@ switch (filter('op')) { $fattura_pa->delete(); $fattura = Fattura::find($id_fattura); + if ($fattura->isAutofattura()) { + $autofattura_collegata = Fattura::where('progressivo_invio', '=', $fattura->progressivo_invio)->where('id', '!=', $fattura->id)->first(); + if (!empty($autofattura_collegata)) { + $fattura->registraScadenze(true); + $autofattura_collegata->registraScadenze(true); + } + } + // Aggiorno la tipologia di anagrafica fornitore $anagrafica = $database->fetchOne('SELECT idanagrafica FROM co_documenti WHERE co_documenti.id='.prepare($id_fattura)); $rs_t = $database->fetchOne("SELECT * FROM an_tipianagrafiche_anagrafiche WHERE idtipoanagrafica=(SELECT an_tipianagrafiche.idtipoanagrafica FROM an_tipianagrafiche WHERE an_tipianagrafiche.descrizione='Fornitore') AND idanagrafica=".prepare($anagrafica['idanagrafica'])); diff --git a/plugins/importFE/generate.php b/plugins/importFE/generate.php index e3b295825..939e3bcf3 100755 --- a/plugins/importFE/generate.php +++ b/plugins/importFE/generate.php @@ -124,6 +124,11 @@ if (isset($fattura_body['DatiPagamento'])) { $pagamenti = isset($pagamenti[0]) ? $pagamenti : [$pagamenti]; } +$is_autofattura = false; +if (in_array($dati_generali['TipoDocumento'], ['TD16', 'TD17', 'TD18', 'TD19', 'TD20'])) { + $is_autofattura = true; +} + // Individuazione metodo di pagamento di base $metodi = isset($pagamenti[0]['DettaglioPagamento']) ? $pagamenti[0]['DettaglioPagamento'] : []; $metodi = isset($metodi[0]) ? $metodi : [$metodi]; @@ -219,9 +224,11 @@ echo ' '; // Sezionale +$id_segment = $is_autofattura ? setting('Sezionale per autofatture di acquisto') : $_SESSION['module_'.$id_module]['id_segment']; + echo '
- {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE is_fiscale = 1 AND id_module='.$id_module.' ORDER BY name", "value": "'.$_SESSION['module_'.$id_module]['id_segment'].'" ]} + {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE is_fiscale = 1 AND id_module='.$id_module.' ORDER BY name", "value": "'.$id_segment.'" ]}
'; // Data di registrazione @@ -400,6 +407,7 @@ if (!empty($righe)) { $idconto_acquisto = $database->fetchOne('SELECT idconto_acquisto FROM mg_articoli WHERE id = '.prepare($id_articolo))['idconto_acquisto']; } + $idconto_acquisto = $is_autofattura ? setting('Conto per autofattura') : $idconto_acquisto; $qta = $riga['Quantita']; $um = $riga['UnitaMisura']; $prezzo_unitario = $riga['PrezzoUnitario'] ?: $riga['Importo'];