diff --git a/modules/interventi/modutil.php b/modules/interventi/modutil.php index 3f3f14d74..828212ee5 100644 --- a/modules/interventi/modutil.php +++ b/modules/interventi/modutil.php @@ -447,9 +447,9 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion 'tipo_sconto' => 'UNT', 'um' => '-', 'qta' => $rst[$i]['qta'], - 'idrivalsainps' => $id_rivalsa_inps, + 'idrivalsainps' => $id_rivalsa_inps ?: 0, 'rivalsainps' => $rivalsainps, - 'idritenutaacconto' => $id_ritenuta_acconto, + 'idritenutaacconto' => $id_ritenuta_acconto ?: 0, 'ritenutaacconto' => $ritenutaacconto, 'order' => orderValue('co_righe_documenti', 'iddocumento', $id_fattura), ]); diff --git a/modules/iva/actions.php b/modules/iva/actions.php index 17f69e595..033a453df 100644 --- a/modules/iva/actions.php +++ b/modules/iva/actions.php @@ -11,6 +11,9 @@ switch (filter('op')) { $percentuale = empty($esente) ? post('percentuale') : 0; if ($dbo->fetchNum('SELECT * FROM `co_iva` WHERE (`descrizione` = '.prepare($descrizione).' OR `codice` = '.prepare($codice).') AND `id` != '.prepare($id_record)) == 0) { + $codice_natura = post('codice_natura_fe'); + $esigibilita = post('esigibilita'); + $dbo->update('co_iva', [ 'descrizione' => $descrizione, 'esente' => $esente, @@ -18,9 +21,15 @@ switch (filter('op')) { 'indetraibile' => post('indetraibile'), 'dicitura' => post('dicitura'), 'codice' => $codice, - 'codice_natura_fe' => post('codice_natura_fe'), + 'codice_natura_fe' => $codice_natura, + 'esigibilita' => $esigibilita, ], ['id' => $id_record]); + // Messaggio di avvertenza + if ($codice_natura == 'N6' && $esigibilita == 'S') { + flash()->warning(tr('Combinazione di natura IVA N6 ed esigibilità non compatibile!')); + } + flash()->info(tr('Salvataggio completato!')); } else { flash()->error(tr("E' già presente una tipologia di _TYPE_ con la stesse caratteristiche!", [ diff --git a/modules/iva/edit.php b/modules/iva/edit.php index b941e7539..9135ae038 100644 --- a/modules/iva/edit.php +++ b/modules/iva/edit.php @@ -2,6 +2,21 @@ include_once __DIR__.'/../../core.php'; +$esigibilita = [ + [ + 'id' => 'I', + 'text' => tr('IVA ad esigibilità immediata'), + ], + [ + 'id' => 'D', + 'text' => tr('IVA ad esigibilità differita'), + ], + [ + 'id' => 'S', + 'text' => tr('Scissione dei pagamenti'), + ], +]; + ?>
@@ -34,13 +49,17 @@ include_once __DIR__.'/../../core.php';
-
+
{[ "type": "text", "label": "", "name": "codice", "value": "$codice$" ]}
-
+
{[ "type": "select", "label": "", "name": "codice_natura_fe", "value": "$codice_natura_fe$", "values": "query=SELECT codice as id, CONCAT(codice, ' - ', descrizione) AS descrizione FROM fe_natura" ]}
+ +
+ {[ "type": "select", "label": "", "name": "esigibilita", "value": "$esigibilita$", "values": ]} +
diff --git a/plugins/exportPA/src/FatturaElettronica.php b/plugins/exportPA/src/FatturaElettronica.php index 96cb398b1..13b95c2f3 100644 --- a/plugins/exportPA/src/FatturaElettronica.php +++ b/plugins/exportPA/src/FatturaElettronica.php @@ -488,10 +488,15 @@ class FatturaElettronica $dettaglio = [ 'NumeroLinea' => $numero + 1, 'Descrizione' => $riga['descrizione'], - 'Quantita' => $riga['qta'], - 'PrezzoUnitario' => $prezzo_unitario, + 'Quantita' => $riga['qta'] ]; + if (!empty($riga['um'])) { + $dettaglio['UnitaMisura']= $riga['um']; + } + + $dettaglio['PrezzoUnitario']= $prezzo_unitario; + // Sconto $riga['sconto_unitario'] = floatval($riga['sconto_unitario']); if (!empty($riga['sconto_unitario'])) { @@ -524,32 +529,40 @@ class FatturaElettronica ]; } - // Riepiloghi per IVA - // TODO: risolvere di conseguenza alla Natura IVA - $riepiloghi_percentuale = $database->fetchArray('SELECT SUM(`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`) as totale, SUM(`co_righe_documenti`.`iva`) as iva, `co_iva`.`percentuale` FROM `co_righe_documenti` INNER JOIN `co_iva` ON `co_iva`.`id` = `co_righe_documenti`.`idiva` WHERE `co_righe_documenti`.`iddocumento` = '.prepare($documento['id']).' AND + // Riepiloghi per IVA per percentuale + $riepiloghi_percentuale = $database->fetchArray('SELECT SUM(`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`) as totale, SUM(`co_righe_documenti`.`iva`) as iva, `co_iva`.`percentuale`, `co_iva`.`dicitura` FROM `co_righe_documenti` INNER JOIN `co_iva` ON `co_iva`.`id` = `co_righe_documenti`.`idiva` WHERE `co_righe_documenti`.`iddocumento` = '.prepare($documento['id']).' AND `co_iva`.`codice_natura_fe` IS NULL GROUP BY `co_iva`.`percentuale`'); foreach ($riepiloghi_percentuale as $riepilogo) { + $iva = [ + 'AliquotaIVA' => $riepilogo['percentuale'], + 'ImponibileImporto' => $riepilogo['totale'], + 'Imposta' => $riepilogo['iva'], + 'EsigibilitaIVA' => $riepilogo['esigibilita'], + ]; + + if (!empty($riepilogo['dicitura'])) { + $iva['RiferimentoNormativo'] = $riepilogo['dicitura']; + } + $result[] = [ - 'DatiRiepilogo' => [ - 'AliquotaIVA' => $riepilogo['percentuale'], - 'ImponibileImporto' => $riepilogo['totale'], - 'Imposta' => $riepilogo['iva'], - 'EsigibilitaIVA' => 'I', - ], + 'DatiRiepilogo' => $iva ]; } + // Riepiloghi per IVA per natura $riepiloghi_natura = $database->fetchArray('SELECT SUM(`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`) as totale, SUM(`co_righe_documenti`.`iva`) as iva, `co_iva`.`codice_natura_fe` FROM `co_righe_documenti` INNER JOIN `co_iva` ON `co_iva`.`id` = `co_righe_documenti`.`idiva` WHERE `co_righe_documenti`.`iddocumento` = '.prepare($documento['id']).' AND `co_iva`.`codice_natura_fe` IS NOT NULL GROUP BY `co_iva`.`codice_natura_fe`'); foreach ($riepiloghi_natura as $riepilogo) { + $iva = [ + 'AliquotaIVA' => 0, + 'Natura' => $riepilogo['codice_natura_fe'], + 'ImponibileImporto' => $riepilogo['totale'], + 'Imposta' => $riepilogo['iva'], + 'EsigibilitaIVA' => $riepilogo['esigibilita'], + ]; + $result[] = [ - 'DatiRiepilogo' => [ - 'AliquotaIVA' => 0, - 'Natura' => $riepilogo['codice_natura_fe'], - 'ImponibileImporto' => $riepilogo['totale'], - 'Imposta' => $riepilogo['iva'], - 'EsigibilitaIVA' => 'I', - ], + 'DatiRiepilogo' => $iva ]; } @@ -597,6 +610,10 @@ class FatturaElettronica { $documento = $fattura->getDocumento(); + if (!setting('Aggiungere stampa nella Fattura Elettronica')) { + return []; + } + $id_module = Modules::get('Fatture di vendita')['id']; $dir = Uploads::getDirectory($id_module, Plugins::get('Fatturazione Elettronica')['id']); @@ -649,9 +666,13 @@ class FatturaElettronica 'DatiGenerali' => static::getDatiGenerali($fattura), 'DatiBeniServizi' => static::getDatiBeniServizi($fattura), 'DatiPagamento' => static::getDatiPagamento($fattura), - 'Allegati' => static::getAllegati($fattura), ]; + $allegati = static::getAllegati($fattura); + if (!empty($allegati)) { + $result['Allegati'] = $allegati; + } + return $result; } @@ -734,8 +755,8 @@ class FatturaElettronica return null; } - // Localhost: ['curl' => [CURLOPT_SSL_VERIFYPEER => false]] - $client = new Client(); + // Localhost: + $client = new Client(['curl' => [CURLOPT_SSL_VERIFYPEER => false]]); $response = $client->request('POST', 'https://www.indicepa.gov.it/public-ws/WS01_SFE_CF.php', [ 'form_params' => [ @@ -832,8 +853,7 @@ class FatturaElettronica $cliente = $this->getCliente(); // Inizializzazione libreria per la generazione della fattura in XML - //, ['stylesheet' => 'http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2.1/fatturaPA_v1.2.1.xsl'] - $fattura = new FluidXml(null); + $fattura = new FluidXml(null, ['stylesheet' => 'http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2.1/fatturaPA_v1.2.1.xsl']); // Generazione dell'elemento root $fattura->namespace('p', 'http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2'); diff --git a/update/2_4_2.sql b/update/2_4_2.sql index 0642272f0..e0287b255 100644 --- a/update/2_4_2.sql +++ b/update/2_4_2.sql @@ -29,6 +29,8 @@ UPDATE `zz_modules` `t1` INNER JOIN `zz_modules` `t2` ON (`t1`.`name` = 'Categor ALTER TABLE `an_nazioni` ADD `name` VARCHAR(255); ALTER TABLE `co_documenti` ADD `codice_xml` VARCHAR(255); +INSERT INTO `zz_settings` (`idimpostazione`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES (NULL, 'Aggiungere stampa nella Fattura Elettronica', '0', 'boolean', 1, 'Generali', 20); + CREATE TABLE IF NOT EXISTS `fe_regime_fiscale` ( `codice` varchar(4) NOT NULL, `descrizione` varchar(255) NOT NULL, @@ -163,7 +165,7 @@ INSERT INTO `fe_natura` (`codice`, `descrizione`) VALUES ('N6','Inversione contabile (per le operazioni in reverse charge ovvero nei casi di autofatturazione per acquisti extra UE di servizi ovvero per importazioni di beni nei soli casi previsti)'), ('N7','IVA assolta in altro stato UE (vendite a distanza ex art. 40 c. 3 e 4 e art. 41 c. 1 lett. b, DL 331/93; prestazione di servizi di telecomunicazioni, tele-radiodiffusione ed elettronici ex art. 7-sexies lett. f, g, art. 74-sexies DPR 633/72)'); -ALTER TABLE `co_iva` ADD `codice_natura_fe` varchar(4), ADD `deleted_at` timestamp NULL DEFAULT NULL, ADD `codice` int(11), ADD `default` boolean NOT NULL DEFAULT 0, ADD FOREIGN KEY (`codice_natura_fe`) REFERENCES `fe_natura`(`codice`) ON DELETE CASCADE; +ALTER TABLE `co_iva` ADD `codice_natura_fe` varchar(4), ADD `deleted_at` timestamp NULL DEFAULT NULL, ADD `codice` int(11), ADD `esigibilita` enum('I', 'D', 'S') NOT NULL DEFAULT 'I', ADD `default` boolean NOT NULL DEFAULT 0, ADD FOREIGN KEY (`codice_natura_fe`) REFERENCES `fe_natura`(`codice`) ON DELETE CASCADE; UPDATE `co_iva` SET `deleted_at` = NOW(); UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_iva` WHERE 1=1 AND deleted_at IS NULL HAVING 2=2' WHERE `name` = 'IVA';