diff --git a/include/common/form.php b/include/common/form.php index 51c9f27b3..5e54e1458 100644 --- a/include/common/form.php +++ b/include/common/form.php @@ -30,4 +30,4 @@ echo ' '; echo ' - '; +'; diff --git a/lib/functions.js b/lib/functions.js index e86c3a8ff..8315d6ed4 100644 --- a/lib/functions.js +++ b/lib/functions.js @@ -940,6 +940,73 @@ function openLink(event, link) { } } +function start_datepickers() { + var icons = { + time: 'fa fa-clock-o', + date: 'fa fa-calendar', + up: 'fa fa-chevron-up', + down: 'fa fa-chevron-down', + previous: 'fa fa-chevron-left', + next: 'fa fa-chevron-right', + today: 'fa fa-street-view', + clear: 'fa fa-trash', + close: 'fa fa-times' + }; + + $('.timestamp-picker').each(function () { + $this = $(this); + $this.datetimepicker({ + locale: globals.locale, + icons: icons, + collapse: false, + sideBySide: true, + useCurrent: false, + stepping: 5, + widgetPositioning: { + horizontal: 'left', + vertical: 'bottom' + }, + minDate: moment($this.attr('min-date')).isValid() ? $this.attr('min-date') : false, + maxDate: moment($this.attr('max-date')).isValid() ? $this.attr('max-date') : false, + }); + }); + + //fix per timestamp-picker non visibile con la classe table-responsive + $('.timestamp-picker').each(function () { + $this = $(this); + $this.on("dp.show", function (e) { + $('#tecnici > div').removeClass('table-responsive'); + }); + $this.on("dp.hide", function (e) { + $('#tecnici > div').addClass('table-responsive'); + }) + }); + + $('.datepicker').each(function () { + $this = $(this); + $this.datetimepicker({ + locale: globals.locale, + icons: icons, + useCurrent: false, + format: 'L', + minDate: moment($this.attr('min-date')).isValid() ? $this.attr('min-date') : false, + maxDate: moment($this.attr('max-date')).isValid() ? $this.attr('max-date') : false, + }); + }); + + $('.timepicker').each(function () { + $this = $(this); + $this.datetimepicker({ + locale: globals.locale, + icons: icons, + useCurrent: false, + format: 'LT', + stepping: 5, + minDate: moment($this.attr('min-date')).isValid() ? $this.attr('min-date') : false, + maxDate: moment($this.attr('max-date')).isValid() ? $this.attr('max-date') : false, + }); + }); +} // Select function start_superselect() { // Statico diff --git a/lib/init.js b/lib/init.js index 4696bdaa8..25f5d4620 100644 --- a/lib/init.js +++ b/lib/init.js @@ -34,71 +34,7 @@ $(document).ready(function () { this.$element.removeClass('parsley-success'); }); - var icons = { - time: 'fa fa-clock-o', - date: 'fa fa-calendar', - up: 'fa fa-chevron-up', - down: 'fa fa-chevron-down', - previous: 'fa fa-chevron-left', - next: 'fa fa-chevron-right', - today: 'fa fa-street-view', - clear: 'fa fa-trash', - close: 'fa fa-times' - }; - - $('.timestamp-picker').each(function () { - $this = $(this); - $this.datetimepicker({ - locale: globals.locale, - icons: icons, - collapse: false, - sideBySide: true, - useCurrent: false, - stepping: 5, - widgetPositioning: { - horizontal: 'left', - vertical: 'bottom' - }, - minDate: moment($this.attr('min-date')).isValid() ? $this.attr('min-date') : false, - maxDate: moment($this.attr('max-date')).isValid() ? $this.attr('max-date') : false, - }); - }); - - //fix per timestamp-picker non visibile con la classe table-responsive - $('.timestamp-picker').each(function () { - $this = $(this); - $this.on("dp.show", function (e) { - $('#tecnici > div').removeClass('table-responsive'); - }); - $this.on("dp.hide", function (e) { - $('#tecnici > div').addClass('table-responsive'); - }) - }); - - $('.datepicker').each(function () { - $this = $(this); - $this.datetimepicker({ - locale: globals.locale, - icons: icons, - useCurrent: false, - format: 'L', - minDate: moment($this.attr('min-date')).isValid() ? $this.attr('min-date') : false, - maxDate: moment($this.attr('max-date')).isValid() ? $this.attr('max-date') : false, - }); - }); - - $('.timepicker').each(function () { - $this = $(this); - $this.datetimepicker({ - locale: globals.locale, - icons: icons, - useCurrent: false, - format: 'LT', - stepping: 5, - minDate: moment($this.attr('min-date')).isValid() ? $this.attr('min-date') : false, - maxDate: moment($this.attr('max-date')).isValid() ? $this.attr('max-date') : false, - }); - }); + start_datepickers(); // Aggiunta nell'URL del nome tab su cui tornare dopo il submit // Blocco del pulsante di submit dopo il primo submit diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index aa62d80c7..d5bbb100a 100644 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -270,6 +270,61 @@ switch (post('op')) { } break; + case 'manage_documento_fe': + $data = Filter::getPOST(); + + $ignore = [ + 'id_plugin', + 'id_module', + 'id_record', + 'backto', + 'hash', + 'op', + 'idriga', + 'dir', + ]; + foreach ($ignore as $name) { + unset($data[$name]); + } + + $fattura->dati_aggiuntivi_fe = $data; + $fattura->save(); + + flash()->info(tr('Dati FE aggiornati correttamente!')); + + break; + + case 'manage_riga_fe': + $id_riga = post('idriga'); + if ($id_riga != null) { + $riga = Articolo::find($id_riga) ?: Riga::find($id_riga); + $riga = $riga ?: Descrizione::find($id_riga); + $riga = $riga ?: Sconto::find($id_riga); + + $data = Filter::getPOST(); + + $ignore = [ + 'id_plugin', + 'id_module', + 'id_record', + 'backto', + 'hash', + 'op', + 'idriga', + 'dir', + ]; + foreach ($ignore as $name) { + unset($data[$name]); + } + + $riga->dati_aggiuntivi_fe = $data; + $riga->save(); + + flash()->info(tr('Dati FE aggiornati correttamente!')); + } + + break; + case 'manage_articolo': if (post('idriga') != null) { $articolo = Articolo::find(post('idriga')); @@ -323,36 +378,6 @@ switch (post('op')) { // Ricalcolo inps, ritenuta e bollo ricalcola_costiagg_fattura($id_record); - break; - case 'manage_dati_fe': - $id_riga = post('idriga'); - if ($id_riga != null) { - $riga = Articolo::find($id_riga) ?: Riga::find($id_riga); - $riga = $riga ?: Descrizione::find($id_riga); - $riga = $riga ?: Sconto::find($id_riga); - - $data = Filter::getPOST(); - - $ignore = [ - 'id_plugin', - 'id_module', - 'id_record', - 'backto', - 'hash', - 'op', - 'idriga', - 'dir', - ]; - foreach ($ignore as $name) { - unset($data[$name]); - } - - $riga->dati_aggiuntivi_fe = $data; - $riga->save(); - - flash()->info(tr('Dati FE aggiornati correttamente!')); - } - break; case 'manage_sconto': diff --git a/modules/fatture/buttons.php b/modules/fatture/buttons.php index a42bc5b11..ff5e74888 100644 --- a/modules/fatture/buttons.php +++ b/modules/fatture/buttons.php @@ -13,6 +13,13 @@ echo ' '.tr('Duplica fattura').' '; +if ($record['stato'] != 'Emessa' && $record['stato'] != 'Parzialmente pagato' && $record['stato'] != 'Pagato') { + echo ' + + '.tr('Attributi avanzati').' +'; +} + if ($dir == 'entrata') { echo '
@@ -73,4 +80,4 @@ if (!empty($record['is_fiscale'])) { \ No newline at end of file +?> diff --git a/include/common/fe_components/altri_dati.php b/modules/fatture/fe/components/altri_dati.php similarity index 84% rename from include/common/fe_components/altri_dati.php rename to modules/fatture/fe/components/altri_dati.php index 831ddfc8d..389937d15 100644 --- a/include/common/fe_components/altri_dati.php +++ b/modules/fatture/fe/components/altri_dati.php @@ -3,7 +3,7 @@ // Altri dati gestionali echo ' - + '.str_repeat($space, 3).'2.2.1.16 AltriDatiGestionali - '.tr('Riga _NUM_', [ '_NUM_' => $key, ]); @@ -16,7 +16,7 @@ if ($key == 1) { } echo ' - + '; // Tipo Dato @@ -24,7 +24,7 @@ echo ' '.str_repeat($space, 4).'2.2.1.16.1 TipoDato - {[ "type": "text", "name": "altri_dati['.$key.'][tipo_dato]", "value": "'.$dato['tipo_dato'].'", "maxlength": 20 ]} + {[ "type": "text", "name": "altri_dati['.$key.'][tipo_dato]", "value": "'.$dato['tipo_dato'].'", "maxlength": 10 ]} '; @@ -33,7 +33,7 @@ echo ' '.str_repeat($space, 4).'2.2.1.16.2 RiferimentoTesto - {[ "type": "text", "name": "altri_dati['.$key.'][riferimento_testo]", "value": "'.$dato['riferimento_testo'].'", "maxlength": 20 ]} + {[ "type": "text", "name": "altri_dati['.$key.'][riferimento_testo]", "value": "'.$dato['riferimento_testo'].'", "maxlength": 60 ]} '; @@ -42,7 +42,7 @@ echo ' '.str_repeat($space, 4).'2.2.1.16.3 RiferimentoNumero - {[ "type": "number", "name": "altri_dati['.$key.'][riferimento_numero]", "value": "'.$dato['tipo_dato'].'", "maxlength": 20 ]} + {[ "type": "number", "name": "altri_dati['.$key.'][riferimento_numero]", "value": "'.$dato['tipo_dato'].'" ]} '; @@ -51,6 +51,6 @@ echo ' '.str_repeat($space, 4).'2.2.1.16.4 RiferimentoData - {[ "type": "date", "name": "altri_dati['.$key.'][riferimento_data]", "value": "'.$dato['tipo_dato'].'", "maxlength": 20 ]} + {[ "type": "date", "name": "altri_dati['.$key.'][riferimento_data]", "value": "'.$dato['tipo_dato'].'"]} '; diff --git a/modules/fatture/fe/components/dati_documento.php b/modules/fatture/fe/components/dati_documento.php new file mode 100644 index 000000000..5065f4aa1 --- /dev/null +++ b/modules/fatture/fe/components/dati_documento.php @@ -0,0 +1,105 @@ + + + '.str_repeat($space, 3).$info['code'].' '.$info['name'].' - '.tr('Riga _NUM_', [ + '_NUM_' => $key, + ]); + +if ($key == 1) { + echo ' + '; +} + +echo ' + + '; + +// RiferimentoNumeroLinea +if (empty($dato['riferimento_linea'])) { + $dato['riferimento_linea'][] = 0; +} + +$index = 1; +foreach ($dato['riferimento_linea'] as $linea) { + echo ' + + + '.str_repeat($space, 4).$info['code'].'.1 RiferimentoNumeroLinea - '.tr('Riga _NUM_', [ + '_NUM_' => $index, + ]); + + if ($index == 1) { + echo ' + '; + } + + echo ' + + + {[ "type": "number", "name": "'.$nome.'['.$key.'][riferimento_linea][]", "value": "'.$linea.'", "maxlength": 4, "decimals": 0 ]} + + '; + + ++$index; +} + +// IdDocumento +echo ' + + '.str_repeat($space, 4).$info['code'].'.2 IdDocumento + + {[ "type": "text", "name": "'.$nome.'['.$key.'][id_documento]", "value": "'.$dato['id_documento'].'", "maxlength": 20 ]} + + '; + +// Data +echo ' + + '.str_repeat($space, 4).$info['code'].'.3 Data + + {[ "type": "date", "name": "'.$nome.'['.$key.'][data]", "value": "'.$dato['data'].'" ]} + + '; + +// NumItem +echo ' + + '.str_repeat($space, 4).$info['code'].'.4 NumItem + + {[ "type": "text", "name": "'.$nome.'['.$key.'][num_item]", "value": "'.$dato['num_item'].'", "maxlength": 20 ]} + + '; + +// CodiceCommessaConvenzione +echo ' + + '.str_repeat($space, 4).$info['code'].'.5 CodiceCommessaConvenzione + + {[ "type": "text", "name": "'.$nome.'['.$key.'][codice_commessa]", "value": "'.$dato['codice_commessa'].'", "maxlength": 100 ]} + + '; + +// CodiceCUP +echo ' + + '.str_repeat($space, 4).$info['code'].'.6 CodiceCUP + + {[ "type": "text", "name": "'.$nome.'['.$key.'][codice_cup]", "value": "'.$dato['codice_cup'].'", "maxlength": 15 ]} + + '; + +// CodiceCIG +echo ' + + '.str_repeat($space, 4).$info['code'].'.7 CodiceCIG + + {[ "type": "text", "name": "'.$nome.'['.$key.'][codice_cig]", "value": "'.$dato['codice_cig'].'", "maxlength": 15 ]} + + '; diff --git a/modules/fatture/fe/document-fe.php b/modules/fatture/fe/document-fe.php new file mode 100644 index 000000000..de43ae2b3 --- /dev/null +++ b/modules/fatture/fe/document-fe.php @@ -0,0 +1,188 @@ +toArray(); +$result = array_merge($result, $documento->dati_aggiuntivi_fe); + +echo ' +
+ + + + '; + +echo ' + + + + + + + + + + + '; + +// Art73 +echo ' + + + + '; + +$documenti = [ + 'dati_ordine' => [ + 'code' => '2.1.2', + 'name' => 'DatiOrdineAcquisto', + ], + 'dati_contratto' => [ + 'code' => '2.1.3', + 'name' => 'DatiContratto', + ], + 'dati_convenzione' => [ + 'code' => '2.1.4', + 'name' => 'DatiConvenzione', + ], + 'dati_ricezione' => [ + 'code' => '2.1.5', + 'name' => 'DatiRicezione', + ], + 'dati_fatture' => [ + 'code' => '2.1.6', + 'name' => 'DatiFattureCollegate', + ], +]; +foreach ($documenti as $nome => $info) { + if (empty($result[$nome])) { + $result[$nome][] = []; + } + + $key = 1; + foreach ($result[$nome] as $dato) { + include __DIR__.'/components/dati_documento.php'; + + ++$key; + } + + $documenti[$nome]['key'] = $key; + $documenti[$nome]['index'] = $index; +} + +echo ' + +
+ 2 FatturaElettronicaBody + +
'.str_repeat($space, 1).'2.1 DatiGenerali
'.str_repeat($space, 2).'2.1.1 DatiGeneraliDocumento
'.str_repeat($space, 3).'2.1.1.12 Art73 + {[ "type": "checkbox", "name": "art73", "value": "'.$result['art73'].'", "placeholder": "'.tr("Emesso ai sensi dell'articolo 73 del DPR 633/72").'" ]} +
'; + +echo ' +'; + +foreach ($documenti as $nome => $info) { + echo ' + + '; + $dato = []; + $key = '-id-'; + + include __DIR__.'/components/dati_documento.php'; + + echo ' + + + + + + + + +
+ '.str_repeat($space, 4).$info['code'].'.1 RiferimentoNumeroLinea - '.tr('Riga _NUM_', [ + '_NUM_' => '-num-', + ]).' + + {[ "type": "number", "name": "'.$nome.'[-id-][riferimento_linea][]", "value": "", "maxlength": 4, "decimals": 0 ]} +
'; +} + +echo ' + +
+
+ +
+
'; + +echo ' +
'; + +echo ' + + +'; diff --git a/include/common/riga_fe.php b/modules/fatture/fe/row-fe.php similarity index 70% rename from include/common/riga_fe.php rename to modules/fatture/fe/row-fe.php index 0f15b9c2a..0435f300d 100644 --- a/include/common/riga_fe.php +++ b/modules/fatture/fe/row-fe.php @@ -1,5 +1,9 @@ 'SC', @@ -21,11 +25,32 @@ $tipi_cessione_prestazione = [ $space = str_repeat(' ', 6); +$documento = Fattura::find($id_record); + +// Dati della riga +$id_riga = get('idriga'); +$riga = $documento->getRighe()->find($id_riga); + +$result = $riga->toArray(); +$result = array_merge($result, $riga->dati_aggiuntivi_fe); + +echo ' +
+ + + + '; + echo ' - + @@ -76,7 +101,7 @@ if (empty($result['altri_dati'])) { $key = 1; foreach ($result['altri_dati'] as $dato) { - include __DIR__.'/fe_components/altri_dati.php'; + include __DIR__.'/components/altri_dati.php'; ++$key; } @@ -111,8 +136,24 @@ function add_altri_dati(btn){ $dato = []; $key = '-id-'; -include __DIR__.'/fe_components/altri_dati.php'; +include __DIR__.'/components/altri_dati.php'; echo '
2 FatturaElettronicaBody + 2 FatturaElettronicaBody + +
'.str_repeat($space, 1).'2.2 DatiBeniServizi
'; + +echo ' + +
+
+ +
+
'; + +echo ' +
'; + +echo ' +'; diff --git a/modules/fatture/row-fe.php b/modules/fatture/row-fe.php deleted file mode 100644 index f6340c784..000000000 --- a/modules/fatture/row-fe.php +++ /dev/null @@ -1,23 +0,0 @@ - 'manage_dati_fe', - 'action' => 'edit', - 'dir' => $documento->direzione, -]; - -// Dati della riga -$id_riga = get('idriga'); -$riga = $documento->getRighe()->find($id_riga); - -$result = $riga->toArray(); -$result = array_merge($result, $riga->dati_aggiuntivi_fe); - -echo App::load('riga_fe.php', $result, $options); diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php index 618fb3922..e527cf75f 100644 --- a/modules/fatture/row-list.php +++ b/modules/fatture/row-list.php @@ -262,7 +262,7 @@ foreach ($righe as $row) { } echo " - + diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php index 4405fb006..a37596321 100644 --- a/modules/fatture/src/Fattura.php +++ b/modules/fatture/src/Fattura.php @@ -210,6 +210,29 @@ class Fattura extends Document return $this->calcola('ritenuta_contributi'); } + /** + * Restituisce i dati aggiuntivi per la fattura elettronica dell'elemento. + * + * @return array + */ + public function getDatiAggiuntiviFEAttribute() + { + $result = json_decode($this->attributes['dati_aggiuntivi_fe'], true); + + return (array) $result; + } + + /** + * Imposta i dati aggiuntivi per la fattura elettronica dell'elemento. + */ + public function setDatiAggiuntiviFEAttribute($values) + { + $values = (array) $values; + $dati = array_deep_clean($values); + + $this->attributes['dati_aggiuntivi_fe'] = json_encode($dati); + } + // Relazioni Eloquent public function anagrafica() diff --git a/plugins/exportFE/src/FatturaElettronica.php b/plugins/exportFE/src/FatturaElettronica.php index 89f576a2d..505e92522 100644 --- a/plugins/exportFE/src/FatturaElettronica.php +++ b/plugins/exportFE/src/FatturaElettronica.php @@ -703,6 +703,10 @@ class FatturaElettronica } // Art73 - Ciò consente al cedente/prestatore l'emissione nello stesso anno di più documenti aventi stesso numero (2.1.1.12) + $dati_aggiuntivi = $documento->dati_aggiuntivi_fe; + if (!empty($dati_aggiuntivi['art73'])) { + $result['Art73'] = 'SI'; + } return $result; } diff --git a/update/2_4_11.sql b/update/2_4_11.sql index 2352c7865..d3372ffe4 100644 --- a/update/2_4_11.sql +++ b/update/2_4_11.sql @@ -6,3 +6,5 @@ DELETE FROM `zz_plugins` WHERE `name` = 'Pianificazione ordini di servizio'; ALTER TABLE `co_righe_documenti` ADD `dati_aggiuntivi_fe` TEXT; UPDATE `co_righe_documenti` SET `dati_aggiuntivi_fe` = CONCAT('{"tipo_cessione_prestazione":"', IFNULL(tipo_cessione_prestazione, ""), '","riferimento_amministrazione":"', IFNULL(riferimento_amministrazione, ""), '","data_inizio_periodo":"', IFNULL(data_inizio_periodo, ""), '","data_fine_periodo":"', IFNULL(data_fine_periodo, ""), '"}'); ALTER TABLE `co_righe_documenti` DROP `tipo_cessione_prestazione`, DROP `riferimento_amministrazione`, DROP `data_inizio_periodo`, DROP `data_fine_periodo`; + +ALTER TABLE `co_documenti` ADD `dati_aggiuntivi_fe` TEXT;