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 '
+
+ '.tr('Aggiungi').'
+ ';
+}
+
+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 '
+
+ '.tr('Aggiungi').'
+ ';
+ }
+
+ 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 '
+
+
+';
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 '
+';
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;