diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index d3836d9ea..900b1e356 100755 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -1166,6 +1166,14 @@ switch ($op) { } break; + + case 'cambia_stato': + $stato = Stato::find((new Stato())->getByName('Non valida')->id_record); + $fattura->stato()->associate($stato); + $fattura->save(); + + break; + } // Nota di debito diff --git a/modules/fatture/edit.php b/modules/fatture/edit.php index 69e9a257c..dee8d3ff9 100755 --- a/modules/fatture/edit.php +++ b/modules/fatture/edit.php @@ -181,6 +181,18 @@ if ($dir == 'entrata') { ]).'. '; } + + $data_fattura = new DateTime($fattura->data); + $data_odierna = new DateTime(); + $differenza = $data_odierna->diff($data_fattura)->days; + + if ($fattura->codice_stato_fe == 'NS' && $fattura->stato->name != 'Non valida' && ($differenza > setting('Giorni validità fattura scartata'))) { + echo ' +
+ '.tr("Questa fattura è stata scartata e sono trascorsi i termini di reinvio, è necessario invalidare il documento.").' + +
'; + } // Verifica la data dell'intervento rispetto alla data della fattura $fatturazione_futura = false; @@ -262,7 +274,7 @@ if ($righe_vuote) { - {[ "type": "select", "label": "'.tr('Stato').'", "name": "idstatodocumento", "required": 1, "values": "query='.$query.'", "value": "$idstatodocumento$", "class": "'.(($record['stato'] != 'Bozza' && !$abilita_genera) ? '' : 'unblockable').'", "extra": "onchange=\"return cambiaStato()\"" ]} + {[ "type": "select", "label": "'.tr('Stato').'", "name": "idstatodocumento", "required": 1, "values": "query='.$query.'", "value": "'.$fattura->stato->id.'", "class": "'.(($fattura->stato->name != 'Bozza' && !$abilita_genera) ? '' : 'unblockable').'", "extra": "onchange=\"return cambiaStato()\"" ]} @@ -1238,4 +1250,23 @@ input("ordinamento").on("change", function(){ }); } }); + +function risolviStato() { + $.ajax({ + url: globals.rootdir + "/actions.php", + type: "POST", + dataType: "json", + data: { + id_module: globals.id_module, + id_record: globals.id_record, + op: "cambia_stato", + }, + success: function (response) { + location.reload(); + }, + error: function() { + location.reload(); + } + }); +} '; diff --git a/modules/fatture/init.php b/modules/fatture/init.php index 36deb195f..e92ea2c5b 100755 --- a/modules/fatture/init.php +++ b/modules/fatture/init.php @@ -37,7 +37,8 @@ if (isset($id_record)) { $is_fiscale = $fattura->isFiscale(); } - $record = $dbo->fetchOne('SELECT `co_documenti`.*, + $record = $dbo->fetchOne('SELECT + `co_documenti`.*, `co_tipidocumento`.`reversed` AS is_reversed, `co_documenti`.`idagente` AS idagente_fattura, `co_documenti`.`note`, @@ -53,7 +54,7 @@ if (isset($id_record)) { (SELECT `descrizione` FROM `co_rivalse` WHERE `id`=`idrivalsainps`) AS rivalsainps_desc, `dt_causalet_lang`.`name` AS causale_desc FROM `co_documenti` - LEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento`=`co_statidocumento`.`id` + INNER JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id` LEFT JOIN `co_statidocumento_lang` ON (`co_statidocumento_lang`.`id_record` = `co_statidocumento`.`id` AND `co_statidocumento_lang`.`id_lang` = '.prepare(\App::getLang()).') INNER JOIN `an_anagrafiche` ON `co_documenti`.`idanagrafica`=`an_anagrafiche`.`idanagrafica` INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento`=`co_tipidocumento`.`id` diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php index e47b9da28..feebe991b 100755 --- a/modules/fatture/src/Fattura.php +++ b/modules/fatture/src/Fattura.php @@ -602,7 +602,7 @@ class Fattura extends Document // Bozza o Annullato -> Stato diverso da Bozza o Annullato if ( (in_array($stato_precedente->name, ['Bozza', 'Annullata']) - && !in_array($stato->name, ['Bozza', 'Annullata'])) + && !in_array($stato->name, ['Bozza', 'Annullata', 'Non valida'])) || $options[0] == 'forza_emissione' ) { // Registrazione scadenze @@ -611,7 +611,7 @@ class Fattura extends Document // Registrazione movimenti $this->gestoreMovimenti->registra(); } // Stato qualunque -> Bozza o Annullato - elseif (in_array($stato->name, ['Bozza', 'Annullata'])) { + elseif (in_array($stato->name, ['Bozza', 'Annullata', 'Non valida'])) { // Rimozione delle scadenza $this->rimuoviScadenze(); @@ -622,7 +622,7 @@ class Fattura extends Document $this->movimentiContabili()->delete(); } - if ($this->changes['data_competenza'] && !in_array($stato->name, ['Bozza', 'Annullata'])) { + if ($this->changes['data_competenza'] && !in_array($stato->name, ['Bozza', 'Annullata', 'Non valida'])) { $movimenti = Movimento::where('iddocumento', $this->id)->where('primanota', 0)->get(); foreach ($movimenti as $movimento) { $movimento->data = $this->data_competenza; diff --git a/update/2_5.sql b/update/2_5.sql index a4b26afc2..1efc27395 100644 --- a/update/2_5.sql +++ b/update/2_5.sql @@ -2354,3 +2354,10 @@ ALTER TABLE `zz_files` ADD `id_adapter` INT NOT NULL AFTER `id_record`; UPDATE zz_files SET id_adapter=1; DELETE FROM `zz_settings` WHERE `nome` = 'Iva da applicare su marca da bollo'; + +-- Aggiunta gestione stato documento Non valida +INSERT INTO `co_statidocumento` (`icona`, `colore`) VALUES ('fa fa-times text-muted', '#d3d3d3'); +INSERT INTO `co_statidocumento_lang` (`id_record`, `id_lang`, `name`) VALUES ((SELECT MAX(`id`) FROM `co_statidocumento`), (SELECT `valore` FROM `zz_settings` WHERE `nome` = 'Lingua'), 'Non valida'); + +INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `help`) VALUES ('Giorni validità fattura scartata', '5', 'int', '0', 'Fatturazione Elettronica', 'Numero di giorni a disposizione per poter correggere una fattura scartata dallo SDI prima di non poter più utilizzare il suo numero di fatturazione. Una volta passati i giorni indicati è necessario emettere una nuova fattura e questa passa in stato Non valida.'); +INSERT INTO `zz_settings_lang` (`id_record`, `id_lang`, `title`) VALUES ((SELECT `id` FROM `zz_settings` WHERE `nome` = 'Giorni validità fattura scartata'), (SELECT `valore` FROM `zz_settings` WHERE `nome` = 'Lingua'), 'Giorni validità fattura scartata');