From b76c2937fac3a24f685050f5aafb021b980b5977 Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Tue, 8 Sep 2020 11:38:25 +0200 Subject: [PATCH] Correzioni sul blocco fattura per Fattura Elettronica --- modules/fatture/edit.php | 36 ++++--- modules/fatture/init.php | 8 +- modules/fatture/modutil.php | 6 +- plugins/exportFE/edit.php | 102 ++++++++++---------- plugins/exportFE/src/FatturaElettronica.php | 1 + update/2_4_18.sql | 15 +++ 6 files changed, 97 insertions(+), 71 deletions(-) diff --git a/modules/fatture/edit.php b/modules/fatture/edit.php index 557fe4ee3..bffdd1caf 100755 --- a/modules/fatture/edit.php +++ b/modules/fatture/edit.php @@ -21,11 +21,7 @@ use Modules\Iva\Aliquota; include_once __DIR__.'/../../core.php'; -$block_edit = !empty($note_accredito) || $record['stato'] == 'Emessa' || $record['stato'] == 'Pagato' || $record['stato'] == 'Parzialmente pagato'; - -$rs = $dbo->fetchArray('SELECT co_tipidocumento.descrizione, dir FROM co_tipidocumento INNER JOIN co_documenti ON co_tipidocumento.id=co_documenti.idtipodocumento WHERE co_documenti.id='.prepare($id_record)); -$dir = $rs[0]['dir']; -$tipodoc = $rs[0]['descrizione']; +$block_edit = !empty($note_accredito) || in_array($record['stato'], ['Emessa', 'Pagato', 'Parzialmente pagato']) || !$abilita_genera; if ($dir == 'entrata') { $conto = 'vendite'; @@ -164,7 +160,7 @@ if (empty($record['is_fiscale'])) { $plugin = $dbo->fetchArray("SELECT id FROM zz_plugins WHERE name='Fatturazione Elettronica' AND idmodule_to = ".prepare($id_module)); echo ''; } -//Forzo il passaggio della fattura da Bozza ad Emessa per il corretto calcolo del numero. +// Forzo il passaggio della fattura da Bozza ad Emessa per il corretto calcolo del numero. elseif ($record['stato'] == 'Bozza') { $query .= " WHERE descrizione IN ('Emessa', 'Bozza')"; } @@ -195,19 +191,17 @@ elseif ($record['stato'] == 'Bozza') { -
- - {[ "type": "select", "label": "", "name": "idstatodocumento", "required": 1, "values": "query=", "value": "$idstatodocumento$", "class": "unblockable", "extra": " onchange = \"if ($('#idstatodocumento option:selected').text()=='Pagato' || $('#idstatodocumento option:selected').text()=='Parzialmente pagato' ){if( confirm('') ){ return true; }else{ $('#idstatodocumento').selectSet(); }}\" " ]} + echo ' +
+ + {[ "type": "select", "label": "'.tr('Stato').'", "name": "idstatodocumento", "required": 1, "values": "query='.$query.'", "value": "$idstatodocumento$", "class": "'.(!$abilita_genera ? '' : 'unblockable').'", "extra": "onchange=\"return cambiaStato()\"" ]}
- @@ -337,7 +331,7 @@ elseif ($record['stato'] == 'Bozza') {
@@ -410,7 +404,7 @@ echo '
'; -if ($tipodoc == 'Fattura accompagnatoria di vendita') { +if ($record['descrizione_tipo'] == 'Fattura accompagnatoria di vendita') { echo '
@@ -884,4 +878,16 @@ $(document).ready(function () { } }); }); + +function cambiaStato() { + let testo = $("#idstatodocumento option:selected").text(); + + if (testo == "Pagato" || testo == "Parzialmente pagato") { + if(confirm("'.tr('Sicuro di voler impostare manualmente la fattura come pagata senza aggiungere il movimento in prima nota?').'")) { + return true; + } else { + $("#idstatodocumento").selectSet('.$record['idstatodocumento'].'); + } + } +} '; diff --git a/modules/fatture/init.php b/modules/fatture/init.php index b1af4e9f7..cd62c998b 100755 --- a/modules/fatture/init.php +++ b/modules/fatture/init.php @@ -29,6 +29,7 @@ if ($module['name'] == 'Fatture di vendita') { if (isset($id_record)) { $fattura = Fattura::with('tipo', 'stato')->find($id_record); + $dir = $fattura->direzione; $is_fiscale = false; if (!empty($fattura)) { @@ -44,7 +45,7 @@ if (isset($id_record)) { co_documenti.id AS iddocumento, co_documenti.split_payment AS split_payment, co_statidocumento.descrizione AS `stato`, - co_tipidocumento.descrizione AS `descrizione_tipodoc`, + co_tipidocumento.descrizione AS `descrizione_tipo`, co_pagamenti.riba AS `riba`, (SELECT is_fiscale FROM zz_segments WHERE id = id_segment) AS is_fiscale, (SELECT descrizione FROM co_ritenutaacconto WHERE id=idritenutaacconto) AS ritenutaacconto_desc, @@ -57,5 +58,10 @@ if (isset($id_record)) { LEFT JOIN co_pagamenti ON co_documenti.idpagamento=co_pagamenti.id WHERE co_tipidocumento.dir = '.prepare($dir).' AND co_documenti.id='.prepare($id_record)); + // Note di credito collegate $note_accredito = $dbo->fetchArray("SELECT co_documenti.id, IF(numero_esterno != '', numero_esterno, numero) AS numero, data FROM co_documenti JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE reversed = 1 AND ref_documento=".prepare($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']); } diff --git a/modules/fatture/modutil.php b/modules/fatture/modutil.php index c6b9e1ae0..53f4eaef0 100755 --- a/modules/fatture/modutil.php +++ b/modules/fatture/modutil.php @@ -237,7 +237,7 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0) } // Lettura info fattura - $query = 'SELECT *, co_documenti.data_competenza, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipodoc` FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento); + $query = 'SELECT *, co_documenti.data_competenza, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipo` FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento); $rs = $dbo->fetchArray($query); $n = sizeof($rs); $data = $rs[0]['data_competenza']; @@ -256,9 +256,9 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0) // Abbreviazioni contabili dei movimenti $tipodoc = ''; - if ($rs[0]['descrizione_tipodoc'] == 'Nota di credito') { + if ($rs[0]['descrizione_tipo'] == 'Nota di credito') { $tipodoc = 'Nota di credito'; - } elseif ($rs[0]['descrizione_tipodoc'] == 'Nota di debito') { + } elseif ($rs[0]['descrizione_tipo'] == 'Nota di debito') { $tipodoc = 'Nota di debito'; } else { $tipodoc = 'Fattura'; diff --git a/plugins/exportFE/edit.php b/plugins/exportFE/edit.php index d0ed4ef45..01b093d02 100755 --- a/plugins/exportFE/edit.php +++ b/plugins/exportFE/edit.php @@ -25,15 +25,14 @@ use Plugins\ExportFE\Interaction; use Util\XML; /* Per le PA EC02 e EC01 sono dei stati successivi a NE il quale a sua volta è successivo a RC. EC01 e EC02 sono definiti all'interno della ricevuta di NE che di fatto indica il rifiuto o l'accettazione. */ -$abilita_genera = empty($fattura->codice_stato_fe) || in_array($fattura->codice_stato_fe, ['GEN', 'NS', 'EC02', 'ERR']); +$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']); $ricevuta_principale = $fattura->getRicevutaPrincipale(); if (!empty($fattura_pa)) { - $disabled = false; - $generated = $fattura_pa->isGenerated(); + $generata = $fattura_pa->isGenerated(); } else { - $disabled = true; - $generated = false; + $generata = false; } $checks = FatturaElettronica::controllaFattura($fattura); @@ -78,12 +77,12 @@ echo ' - '; - $file = $generated ? Upload::where('filename', $fattura_pa->getFilename()) + $file = $generata ? Upload::where('filename', $fattura_pa->getFilename()) ->where('id_record', $id_record) ->first() : null; @@ -91,17 +90,17 @@ echo ' - + '.tr('Visualizza').' '; // Scelgo quando posso inviarla - $send = Interaction::isEnabled() && $generated && in_array($record['codice_stato_fe'], ['GEN', 'ERVAL', 'ERR']); + $inviabile = Interaction::isEnabled() && $generata && intval($stato_fe['is_inviabile']); echo ' - + '.tr('Scarica').' '; @@ -109,11 +108,11 @@ echo ' - '; -$verify = Interaction::isEnabled() && $generated; +$verify = Interaction::isEnabled() && $generata; echo ' @@ -125,47 +124,47 @@ echo ' echo '

'; // Messaggio informativo sulla ricevuta principale impostata -if (!empty($record['codice_stato_fe'])) { - if ($record['codice_stato_fe'] == 'GEN') { - echo ' -
'.tr("La fattura è stata generata ed è pronta per l'invio").'.
'; - } else { - $stato_fe = database()->fetchOne('SELECT codice, descrizione, icon FROM fe_stati_documento WHERE codice='.prepare($record['codice_stato_fe'])); - - if (in_array($stato_fe['codice'], ['EC01', 'RC'])) { - $class = 'success'; - } elseif (in_array($stato_fe['codice'], ['ERVAL', 'GEN', 'MC', 'WAIT', 'NE'])) { - $class = 'warning'; - } else { - $class = 'danger'; - } - - echo ' -
+if (!empty($fattura->codice_stato_fe)) { + echo ' +
- '.Translator::timestampToLocale($record['data_stato_fe']); + '.timestampFormat($record['data_stato_fe']); - if (!empty($ricevuta_principale)) { - echo ' + if (!empty($ricevuta_principale)) { + echo ' '.tr('Visualizza ricevuta').' '; - } + } - echo ' + echo '
- - '.$stato_fe['codice'].' - '.$stato_fe['descrizione'].' '.(!empty($record['descrizione_ricevuta_fe']) ? '
'.tr('Note', [], ['upper' => true]).': '.$record['descrizione_ricevuta_fe'] : '').' + + + '.$stato_fe['codice'].' - '.$stato_fe['descrizione'].' + '; + + if (!empty($record['descrizione_ricevuta_fe'])) { + echo ' +
'.tr('Note', [], ['upper' => true]).': '.$record['descrizione_ricevuta_fe']; + } + + if ($fattura->codice_stato_fe == 'GEN') { + echo ' +
'.tr("La fattura è stata generata ed è pronta per l'invio").'.'; + } + + echo '
'; - // Lettura della ricevuta - if (!empty($ricevuta_principale)) { - $contenuto_ricevuta = XML::readFile($ricevuta_principale->filepath); - $lista_errori = $contenuto_ricevuta['ListaErrori']; + // Lettura della ricevuta + if (!empty($ricevuta_principale)) { + $contenuto_ricevuta = XML::readFile($ricevuta_principale->filepath); + $lista_errori = $contenuto_ricevuta['ListaErrori']; - if (!empty($lista_errori)) { - echo ' + if (!empty($lista_errori)) { + echo '

'.tr('Elenco degli errori').'

@@ -176,20 +175,19 @@ if (!empty($record['codice_stato_fe'])) { '; - $lista_errori = $lista_errori[0] ? $lista_errori : [$lista_errori]; - foreach ($lista_errori as $errore) { - $errore = $errore['Errore']; - echo ' + $lista_errori = $lista_errori[0] ? $lista_errori : [$lista_errori]; + foreach ($lista_errori as $errore) { + $errore = $errore['Errore']; + echo ' '; - } + } - echo ' + echo '
'.$errore['Codice'].' '.$errore['Descrizione'].'
'; - } } } } @@ -212,7 +210,7 @@ echo ' buttonRestore(btn, restore); data = JSON.parse(data); - if (data.code == "200") { + if (data.code === "200") { swal("'.tr('Fattura inviata!').'", data.message, "success"); $(btn).attr("disabled", true).addClass("disabled"); @@ -220,7 +218,7 @@ echo ' swal("'.tr('Invio fallito').'", data.code + " - " + data.message, "error"); } }, - error: function(data) { + error: function() { swal("'.tr('Errore').'", "'.tr('Errore durante il salvataggio').'", "error"); buttonRestore(btn, restore); @@ -269,7 +267,7 @@ echo ' salvaForm(this, "#edit-form").then(function(valid) { if (valid) {'; -if ($generated) { +if ($generata) { echo ' swal({ title: "'.tr('Sei sicuro di rigenerare la fattura?').'", diff --git a/plugins/exportFE/src/FatturaElettronica.php b/plugins/exportFE/src/FatturaElettronica.php index 86de15ae5..b58dd82e4 100755 --- a/plugins/exportFE/src/FatturaElettronica.php +++ b/plugins/exportFE/src/FatturaElettronica.php @@ -301,6 +301,7 @@ class FatturaElettronica database()->update('co_documenti', [ 'progressivo_invio' => $this->getDocumento()['progressivo_invio'], 'codice_stato_fe' => 'GEN', + 'id_ricevuta_principale' => null, 'data_stato_fe' => date('Y-m-d H:i:s'), ], ['id' => $this->getDocumento()['id']]); diff --git a/update/2_4_18.sql b/update/2_4_18.sql index 7634a6738..777f0ca47 100644 --- a/update/2_4_18.sql +++ b/update/2_4_18.sql @@ -98,3 +98,18 @@ UPDATE `co_documenti` SET `co_documenti`.`id_ricevuta_principale` = ( ORDER BY `zz_files`.`created_at` LIMIT 1 ); + +ALTER TABLE `fe_stati_documento` ADD `is_generabile` BOOLEAN DEFAULT FALSE, + ADD `is_inviabile` BOOLEAN DEFAULT FALSE, + ADD `tipo` varchar(255) NOT NULL; + +UPDATE `fe_stati_documento` SET `is_generabile` = '1', `is_inviabile` = '1' WHERE `codice` = 'ERVAL'; +UPDATE `fe_stati_documento` SET `is_generabile` = '1', `is_inviabile` = '1' WHERE `codice` = 'ERR'; +UPDATE `fe_stati_documento` SET `is_generabile` = '1', `is_inviabile` = '1' WHERE `codice` = 'GEN'; +UPDATE `fe_stati_documento` SET `is_generabile` = '1' WHERE `codice` = 'NS'; +UPDATE `fe_stati_documento` SET `is_generabile` = '1' WHERE `codice` = 'EC02'; + +UPDATE `fe_stati_documento` SET `tipo` = 'danger'; +UPDATE `fe_stati_documento` SET `tipo` = 'warning' WHERE `codice` IN ('ERVAL', 'MC', 'WAIT', 'NE'); +UPDATE `fe_stati_documento` SET `tipo` = 'success' WHERE `codice` IN ('EC01', 'RC'); +UPDATE `fe_stati_documento` SET `tipo` = 'info' WHERE `codice` IN ('GEN');