diff --git a/include/common/riga.php b/include/common/riga.php index 3443f5e73..1a718e833 100644 --- a/include/common/riga.php +++ b/include/common/riga.php @@ -26,7 +26,7 @@ echo ' '; - // Costo unitario +// Costo unitario echo '
@@ -39,3 +39,70 @@ echo ' {[ "type": "number", "label": "'.tr('Sconto unitario').'", "name": "sconto", "value": "'.$result['sconto_unitario'].'", "icon-after": "choice|untprc|'.$result['tipo_sconto'].'" ]}
'; + +if ($module['name'] == 'Fatture di vendita') { + $collapsed = empty($result['data_inizio_periodo']) && empty($result['data_fine_periodo']) && empty($result['riferimento_amministrazione']); + + echo ' +
+
+

'.tr('Dati Fatturazione Elettronica').'

+
+ +
+
+
'; + + $tipi_cessione_prestazione = [ + [ + 'id' => 'SC', + 'text' => 'SC - '.tr('Sconto'), + ], + [ + 'id' => 'PR', + 'text' => 'PR - '.tr('Premio'), + ], + [ + 'id' => 'AB', + 'text' => 'AB - '.tr('Abbuono'), + ], + [ + 'id' => 'AC', + 'text' => 'AC - '.tr('Spesa accessoria'), + ], + ]; + + // Data inizio periodo + echo ' +
+
+ {[ "type": "select", "label": "'.tr('Tipo Cessione Prestazione').'", "name": "tipo_cessione_prestazione", "value": "'.$result['tipo_cessione_prestazione'].'", "values": '.json_encode($tipi_cessione_prestazione).' ]} +
'; + + // Riferimento amministrazione + echo ' +
+ {[ "type": "text", "label": "'.tr('Riferimento Amministrazione').'", "name": "riferimento_amministrazione", "value": "'.$result['riferimento_amministrazione'].'", "maxlength": 20 ]} +
+
'; + + // Data inizio periodo + echo ' +
+
+ {[ "type": "date", "label": "'.tr('Data Inizio Periodo').'", "name": "data_inizio_periodo", "value": "'.$result['data_inizio_periodo'].'" ]} +
'; + + // Data fine periodo + echo ' +
+ {[ "type": "date", "label": "'.tr('Data Fine Periodo').'", "name": "data_fine_periodo", "value": "'.$result['data_fine_periodo'].'" ]} +
+
'; + + echo ' +
+
'; +} diff --git a/modules/anagrafiche/add.php b/modules/anagrafiche/add.php index 3f5bdc9d5..6f9e84553 100644 --- a/modules/anagrafiche/add.php +++ b/modules/anagrafiche/add.php @@ -32,7 +32,7 @@ echo ' -
+
{[ "type": "text", "label": "'.tr('Partita IVA').'", "maxlength": 13, "name": "piva", "class": "text-center alphanumeric-mask" ]} diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index edd19c398..e1d4b09a9 100644 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -574,6 +574,12 @@ switch (post('op')) { flash()->error(tr('Alcuni serial number sono già stati utilizzati!')); } + // Informazioni aggiuntive FE + $articolo->data_inizio_periodo = post('data_inizio_periodo') ?: null; + $articolo->data_fine_periodo = post('data_fine_periodo') ?: null; + $articolo->riferimento_amministrazione = post('riferimento_amministrazione'); + $articolo->tipo_cessione_prestazione = post('tipo_cessione_prestazione'); + $articolo->save(); flash()->info(tr('Articolo aggiunto!')); @@ -618,6 +624,12 @@ switch (post('op')) { $riga->sconto_unitario = post('sconto'); $riga->tipo_sconto = post('tipo_sconto'); + // Informazioni aggiuntive FE + $riga->data_inizio_periodo = post('data_inizio_periodo') ?: null; + $riga->data_fine_periodo = post('data_fine_periodo') ?: null; + $riga->riferimento_amministrazione = post('riferimento_amministrazione'); + $riga->tipo_cessione_prestazione = post('tipo_cessione_prestazione'); + $riga->save(); if (post('idriga') != null) { diff --git a/modules/fatture/row-edit.php b/modules/fatture/row-edit.php index fcf4bee0c..c0ab1c78c 100644 --- a/modules/fatture/row-edit.php +++ b/modules/fatture/row-edit.php @@ -34,11 +34,11 @@ $result['prezzo'] = $riga['subtotale'] / $riga['qta']; $file = 'riga'; if (!empty($result['is_descrizione'])) { $file = 'descrizione'; - + $options['op'] = 'manage_descrizione'; } elseif (!empty($result['idarticolo'])) { $file = 'articolo'; - + $options['op'] = 'manage_articolo'; } diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php index b271c9164..504976921 100644 --- a/modules/ordini/actions.php +++ b/modules/ordini/actions.php @@ -54,18 +54,10 @@ switch (post('op')) { break; case 'update': - - $numero_esterno = post('numero_esterno'); - $numero = post('numero'); - $data = post('data'); - $idanagrafica = post('idanagrafica'); - $note = post('note'); - $note_aggiuntive = post('note_aggiuntive'); $idstatoordine = post('idstatoordine'); $idpagamento = post('idpagamento'); $idsede = post('idsede'); - $idconto = post('idconto'); - $idagente = post('idagente'); + $totale_imponibile = get_imponibile_ordine($id_record); $totale_ordine = get_totale_ordine($id_record); @@ -88,22 +80,33 @@ switch (post('op')) { $pagamento = $rs[0]['descrizione']; // Query di aggiornamento - $query = 'UPDATE or_ordini SET idanagrafica='.prepare($idanagrafica).','. - ' numero='.prepare($numero).','. - ' data='.prepare($data).','. - ' idagente='.prepare($idagente).','. - ' idstatoordine='.prepare($idstatoordine).','. - ' idpagamento='.prepare($idpagamento).','. - ' idsede='.prepare($idsede).','. - ' numero_esterno='.prepare($numero_esterno).','. - ' note='.prepare($note).','. - ' note_aggiuntive='.prepare($note_aggiuntive).','. - ' idconto='.prepare($idconto).','. - ' idrivalsainps='.prepare($idrivalsainps).','. - ' idritenutaacconto='.prepare($idritenutaacconto).','. - ' tipo_sconto_globale='.prepare($tipo_sconto).','. - ' sconto_globale='.prepare($sconto).','. - ' bollo=0, rivalsainps=0, ritenutaacconto=0 WHERE id='.prepare($id_record); + $dbo->update('or_ordini', [ + 'idanagrafica' => post('idanagrafica'), + 'data' => post('data'), + 'numero' => post('numero'), + 'numero_esterno' => post('numero_esterno'), + 'note' => post('note'), + 'note_aggiuntive' => post('note_aggiuntive'), + + 'idagente' => post('idagente'), + 'idstatoordine' => $idstatoordine, + 'idpagamento' => $idpagamento, + 'idsede' => $idsede, + 'idconto' => post('idconto'), + 'idrivalsainps' => $idrivalsainps, + 'idritenutaacconto' => $idritenutaacconto, + + 'sconto_globale' => $sconto, + 'tipo_sconto_globale' => $tipo_sconto, + + 'bollo' => 0, + 'rivalsainps' => 0, + 'ritenutaacconto' => 0, + + 'id_documento_fe' => post('id_documento_fe'), + 'codice_cup' => post('codice_cup'), + 'codice_cig' => post('codice_cig'), + ], ['id' => $id_record]); if ($dbo->query($query)) { aggiorna_sconto([ @@ -350,10 +353,10 @@ switch (post('op')) { break; case 'update_position': - $orders = explode( ",", $_POST['order'] ); + $orders = explode(",", $_POST['order']); $order = 0; - foreach( $orders as $idriga ){ + foreach ($orders as $idriga) { $dbo->query('UPDATE `or_righe_ordini` SET `order`='.prepare($order).' WHERE id='.prepare($idriga)); $order++; } diff --git a/modules/ordini/edit.php b/modules/ordini/edit.php index d2d771b39..45d2791d8 100644 --- a/modules/ordini/edit.php +++ b/modules/ordini/edit.php @@ -93,15 +93,36 @@ if ($module['name'] == 'Ordini cliente') {
- {[ "type": "textarea", "label": "", "name": "note_aggiuntive", "help": "", "value": "$note_aggiuntive$" ]} + {[ "type": "textarea", "label": "", "name": "note_aggiuntive", "help": "", "value": "$note_aggiuntive$" ]}
+ + +
+
+

+
+ +
+
+
+ {[ "type": "text", "label": "", "name": "id_documento_fe", "required": 0, "value": "$id_documento_fe$", "maxlength": 20, "readonly": "" ]} +
+ +
+ {[ "type": "text", "label": "", "name": "codice_cig", "required": 0, "value": "$codice_cig$", "maxlength": 15, "readonly": "" ]} +
+ +
+ {[ "type": "text", "label": "", "name": "codice_cup", "required": 0, "value": "$codice_cup$", "maxlength": 15, "readonly": "" ]} +
+
+
+
- -
diff --git a/modules/ordini/init.php b/modules/ordini/init.php index f04f2e758..833f40a27 100644 --- a/modules/ordini/init.php +++ b/modules/ordini/init.php @@ -8,5 +8,16 @@ if (isset($id_record)) { $dbo->query('UPDATE or_ordini SET idstatoordine=(SELECT id FROM or_statiordine WHERE descrizione="'.get_stato_ordine($id_record).'") WHERE id='.prepare($id_record)); } - $record = $dbo->fetchOne('SELECT *, or_ordini.note, or_ordini.idpagamento, or_ordini.id AS idordine, or_statiordine.descrizione AS `stato`, or_tipiordine.descrizione AS `descrizione_tipodoc`, (SELECT completato FROM or_statiordine WHERE or_statiordine.id=or_ordini.idstatoordine) AS flag_completato FROM ((or_ordini LEFT OUTER JOIN or_statiordine ON or_ordini.idstatoordine=or_statiordine.id) INNER JOIN an_anagrafiche ON or_ordini.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN or_tipiordine ON or_ordini.idtipoordine=or_tipiordine.id WHERE or_ordini.id='.prepare($id_record)); + $record = $dbo->fetchOne('SELECT *, + or_ordini.note, + or_ordini.idpagamento, + or_ordini.id AS idordine, + or_statiordine.descrizione AS `stato`, + or_tipiordine.descrizione AS `descrizione_tipodoc`, + (SELECT tipo FROM an_anagrafiche WHERE idanagrafica = or_ordini.idanagrafica) AS tipo_anagrafica, + (SELECT completato FROM or_statiordine WHERE or_statiordine.id=or_ordini.idstatoordine) AS flag_completato + FROM or_ordini LEFT OUTER JOIN or_statiordine ON or_ordini.idstatoordine=or_statiordine.id + INNER JOIN an_anagrafiche ON or_ordini.idanagrafica=an_anagrafiche.idanagrafica + INNER JOIN or_tipiordine ON or_ordini.idtipoordine=or_tipiordine.id + WHERE or_ordini.id='.prepare($id_record)); } diff --git a/plugins/exportPA/src/FatturaElettronica.php b/plugins/exportPA/src/FatturaElettronica.php index c8de07a9a..ef34cb662 100644 --- a/plugins/exportPA/src/FatturaElettronica.php +++ b/plugins/exportPA/src/FatturaElettronica.php @@ -31,6 +31,8 @@ class FatturaElettronica /** @var array Contratti collegati al documento */ protected $contratti = []; + /** @var array Ordini di acquisto collegati al documento */ + protected $ordini = []; /** @var array Righe del documento */ protected $righe = []; @@ -132,6 +134,25 @@ class FatturaElettronica return $this->contratti; } + /** + * Restituisce gli ordini di acquisto collegati al documento. + * + * @return array + */ + public function getOrdiniAcquisto() + { + if (empty($this->ordini)) { + $documento = $this->getDocumento(); + $database = database(); + + $ordini = $database->fetchArray('SELECT `id_documento_fe`, `codice_cig`, `codice_cup` FROM `or_ordini` INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`idordine` = `or_ordini`.`id` WHERE `co_righe_documenti`.`iddocumento` = '.prepare($documento['id']).' AND `id_documento_fe` IS NOT NULL'); + + $this->ordini = $ordini; + } + + return $this->ordini; + } + /** * Restituisce le informazioni relative al documento. * @@ -430,6 +451,36 @@ class FatturaElettronica return $result; } + /** + * Restituisce l'array responsabile per la generazione del tag DatiOrdineAcquisto. + * + * @return array + */ + protected static function getDatiOrdineAcquisto($fattura) + { + $ordini = $fattura->getOrdiniAcquisto(); + + $result = []; + foreach ($ordini as $element) { + if (!empty($element['id_documento_fe'])) { + $dati_contratto = [ + 'IdDocumento' => $element['id_documento_fe'], + ]; + } + + if (!empty($element['codice_cig'])) { + $dati_contratto['CodiceCIG'] = $element['codice_cig']; + } + + if (!empty($element['codice_cup'])) { + $dati_contratto['CodiceCUP'] = $element['codice_cup']; + } + + $result[] = $dati_contratto; + } + + return $result; + } /** * Restituisce l'array responsabile per la generazione del tag DatiContratto. @@ -441,19 +492,19 @@ class FatturaElettronica $contratti = $fattura->getContratti(); $result = []; - foreach ($contratti as $contratto) { - if (!empty($contratto['id_documento_fe'])) { + foreach ($contratti as $element) { + if (!empty($element['id_documento_fe'])) { $dati_contratto = [ - 'IdDocumento' => $contratto['id_documento_fe'], + 'IdDocumento' => $element['id_documento_fe'], ]; } - if (!empty($contratto['codice_cig'])) { - $dati_contratto['CodiceCIG'] = $contratto['codice_cig']; + if (!empty($element['codice_cig'])) { + $dati_contratto['CodiceCIG'] = $element['codice_cig']; } - if (!empty($contratto['codice_cup'])) { - $dati_contratto['CodiceCUP'] = $contratto['codice_cup']; + if (!empty($element['codice_cup'])) { + $dati_contratto['CodiceCUP'] = $element['codice_cup']; } $result[] = $dati_contratto; @@ -476,6 +527,18 @@ class FatturaElettronica 'DatiGeneraliDocumento' => static::getDatiGeneraliDocumento($fattura), ]; + // Controllo le le righe per la fatturazione di ordini + $dati_ordini = static::getDatiOrdineAcquisto($fattura); + if (!empty($dati_ordini)) { + foreach ($dati_ordini as $dato) { + if (!empty($dato)) { + $result[] = [ + 'DatiOrdineAcquisto' => $dato, + ]; + } + } + } + // Controllo le le righe per la fatturazione di contratti $dati_contratti = static::getDatiContratto($fattura); if (!empty($dati_contratti)) { @@ -519,12 +582,24 @@ class FatturaElettronica $dettaglio = [ 'NumeroLinea' => $numero + 1, - 'Descrizione' => $riga['descrizione'], - 'Quantita' => $riga['qta'] ]; + if (!empty($riga['tipo_cessione_prestazione'])) { + $dettaglio['TipoCessionePrestazione'] = $riga['tipo_cessione_prestazione']; + } + + $dettaglio['Descrizione'] = $riga['descrizione']; + $dettaglio['Quantita'] = $riga['qta']; + if (!empty($riga['um'])) { - $dettaglio['UnitaMisura']= $riga['um']; + $dettaglio['UnitaMisura'] = $riga['um']; + } + + if (!empty($riga['data_inizio_periodo'])) { + $dettaglio['DataInizioPeriodo'] = $riga['data_inizio_periodo']; + } + if (!empty($riga['data_fine_periodo'])) { + $dettaglio['DataFinePeriodo'] = $riga['data_fine_periodo']; } $dettaglio['PrezzoUnitario']= $prezzo_unitario; @@ -556,6 +631,10 @@ class FatturaElettronica $dettaglio['Natura'] = $iva['codice_natura_fe']; } + if (!empty($riga['riferimento_amministrazione'])) { + $dettaglio['RiferimentoAmministrazione'] = $riga['riferimento_amministrazione']; + } + $result[] = [ 'DettaglioLinee' => $dettaglio, ]; @@ -703,10 +782,11 @@ class FatturaElettronica $rapportino_nome = sanitizeFilename($documento['numero'].'.pdf'); $filename = slashes(DOCROOT.'/'.$dir.'/'.$rapportino_nome); + Uploads::delete($rapportino_nome, $data); + $print = Prints::getModulePredefinedPrint($id_module); Prints::render($print['id'], $documento['id'], $filename); - Uploads::delete($rapportino_nome, $data); Uploads::register(array_merge([ 'name' => 'Stampa allegata', 'original' => $rapportino_nome, diff --git a/update/2_4_2.sql b/update/2_4_2.sql index f00a34d85..5e003c33d 100644 --- a/update/2_4_2.sql +++ b/update/2_4_2.sql @@ -603,7 +603,7 @@ UPDATE `zz_plugins` SET `options` = ' { "main_query": [ { "type": "table", "fiel -- Fix plugin "Ddt del cliente" UPDATE `zz_plugins` SET `options` = ' { "main_query": [ { "type": "table", "fields": "Numero, Data, Descrizione, Qtà", "query": "SELECT dt_ddt.id, (SELECT `id` FROM `zz_modules` WHERE `name` = \'Ddt di vendita\') AS _link_module_, dt_ddt.id AS _link_record_, IF(dt_ddt.numero_esterno = \'\', dt_ddt.numero, dt_ddt.numero_esterno) AS Numero, DATE_FORMAT(dt_ddt.data, \'%d/%m/%Y\') AS Data, dt_righe_ddt.descrizione AS `Descrizione`, REPLACE(REPLACE(REPLACE(FORMAT(dt_righe_ddt.qta, 2), \',\', \'#\'), \'.\', \',\'), \'#\', \'.\') AS `Qtà` FROM dt_ddt LEFT JOIN dt_righe_ddt ON dt_ddt.id=dt_righe_ddt.idddt WHERE dt_ddt.idanagrafica=|id_parent| GROUP BY dt_ddt.id HAVING 2=2 ORDER BY dt_ddt.id DESC"} ]}' WHERE `zz_plugins`.`name` = 'Ddt del cliente'; --- Aggiunto codice cig e codice cup per contratti +-- Aggiunto codice cig e codice cup per contratti e interventi ALTER TABLE `co_contratti` ADD `codice_cig` VARCHAR(15) AFTER `tipo_sconto_globale`, ADD `codice_cup` VARCHAR(15) AFTER `codice_cig`, ADD `id_documento_fe` VARCHAR(20) AFTER `codice_cup`; ALTER TABLE `in_interventi` ADD `codice_cig` VARCHAR(15) AFTER `tipo_sconto_globale`, ADD `codice_cup` VARCHAR(15) AFTER `codice_cig`, ADD `id_documento_fe` VARCHAR(20) AFTER `codice_cup`; diff --git a/update/2_4_3.sql b/update/2_4_3.sql index 1aaa44e4f..902c27086 100644 --- a/update/2_4_3.sql +++ b/update/2_4_3.sql @@ -27,3 +27,7 @@ UPDATE `zz_widgets` SET `more_link` = 'reset(\'Tipo\');' WHERE `zz_widgets`.`nam -- Fix del campo codice_xml ALTER TABLE `co_documenti` CHANGE `codice_xml` `progressivo_invio` VARCHAR(255); + +-- Aggiunto codice cig e codice cup per fatture e ordini +ALTER TABLE `or_ordini` ADD `codice_cig` VARCHAR(15) AFTER `tipo_sconto_globale`, ADD `codice_cup` VARCHAR(15) AFTER `codice_cig`, ADD `id_documento_fe` VARCHAR(20) AFTER `codice_cup`; +ALTER TABLE `co_righe_documenti` ADD `data_inizio_periodo` date, ADD `data_fine_periodo` date, ADD `riferimento_amministrazione` VARCHAR(20), ADD `tipo_cessione_prestazione` enum('SC', 'PR', 'AB', 'AC') DEFAULT NULL;