From d0a8011ce6c2f60ff725352afb0e0d2465763bb8 Mon Sep 17 00:00:00 2001 From: Pek5892 Date: Mon, 4 Dec 2023 11:59:42 +0100 Subject: [PATCH] Aggiunta gestione RappresentanteFiscale in XML --- modules/anagrafiche/src/Sede.php | 22 +++++ plugins/exportFE/src/FatturaElettronica.php | 49 +++++++++-- plugins/sedi/actions.php | 76 ++++++++-------- plugins/sedi/add.php | 40 ++++----- plugins/sedi/edit.php | 96 ++++++++++++--------- update/2_4_52.sql | 5 +- 6 files changed, 185 insertions(+), 103 deletions(-) diff --git a/modules/anagrafiche/src/Sede.php b/modules/anagrafiche/src/Sede.php index 4e2e7d5b5..fa0219d6c 100644 --- a/modules/anagrafiche/src/Sede.php +++ b/modules/anagrafiche/src/Sede.php @@ -62,4 +62,26 @@ class Sede extends Model { return $this->belongsTo(Nazione::class, 'id_nazione'); } + + public function save(array $options = []) + { + $this->fixRappresentanteFiscale(); + + return parent::save($options); + } + + protected function fixRappresentanteFiscale() + { + $rappresentante_fiscale = post('is_rappresentante_fiscale'); + + if (!empty($rappresentante_fiscale)) { + self::where('idanagrafica', $this->idanagrafica) + ->where('id', '!=', $this->id) + ->update([ + 'is_rappresentante_fiscale' => 0, + ]); + + $this->attributes['is_rappresentante_fiscale'] = $rappresentante_fiscale; + } + } } diff --git a/plugins/exportFE/src/FatturaElettronica.php b/plugins/exportFE/src/FatturaElettronica.php index b645c3d70..2f2174326 100755 --- a/plugins/exportFE/src/FatturaElettronica.php +++ b/plugins/exportFE/src/FatturaElettronica.php @@ -23,6 +23,7 @@ use FluidXml\FluidXml; use GuzzleHttp\Client; use Modules; use Modules\Anagrafiche\Anagrafica; +use Modules\Anagrafiche\Sede; use Modules\Banche\Banca; use Modules\Fatture\Fattura; use Modules\Fatture\Gestori\Bollo; @@ -829,6 +830,24 @@ class FatturaElettronica return $result; } + /** + * Restituisce l'array responsabile per la generazione del tag RappresentanteFiscale (1.3). + * + * @return array + */ + protected static function getRappresentanteFiscale($fattura) + { + //Fattura per conto terzi, il cliente diventa il cedente al posto della mia Azienda (fornitore) + $cliente = $fattura->getCliente(); + $azienda = Sede::where('idanagrafica', $cliente->id)->where('is_rappresentante_fiscale', 1)->selectRaw('*, nomesede AS ragione_sociale')->first(); + + $result = [ + 'DatiAnagrafici' => static::getDatiAnagrafici($azienda, true), + ]; + + return $result; + } + /** * Restituisce l'array responsabile per la generazione del tag CessionarioCommittente (Cliente) (1.4). * @@ -1757,11 +1776,31 @@ class FatturaElettronica */ protected static function getHeader($fattura) { - $result = [ - 'DatiTrasmissione' => static::getDatiTrasmissione($fattura), - 'CedentePrestatore' => static::getCedentePrestatore($fattura), - 'CessionarioCommittente' => static::getCessionarioCommittente($fattura), - ]; + $documento = $fattura->getDocumento(); + $rappresentante_fiscale = null; + + //Fattura per conto terzi, il cliente diventa il cedente al posto della mia Azienda (fornitore) + if ($documento['is_fattura_conto_terzi']) { + $azienda = $fattura->getCliente(); + $rappresentante_fiscale = Sede::where('idanagrafica', $azienda->id)->where('is_rappresentante_fiscale', 1)->first(); + } else { + $azienda = static::getAzienda(); + } + + if ($rappresentante_fiscale) { + $result = [ + 'DatiTrasmissione' => static::getDatiTrasmissione($fattura), + 'CedentePrestatore' => static::getCedentePrestatore($fattura), + 'RappresentanteFiscale' => static::getRappresentanteFiscale($fattura), + 'CessionarioCommittente' => static::getCessionarioCommittente($fattura), + ]; + } else { + $result = [ + 'DatiTrasmissione' => static::getDatiTrasmissione($fattura), + 'CedentePrestatore' => static::getCedentePrestatore($fattura), + 'CessionarioCommittente' => static::getCessionarioCommittente($fattura), + ]; + } // 1.5 Terzo Intermediario if (!empty(setting('Terzo intermediario'))) { diff --git a/plugins/sedi/actions.php b/plugins/sedi/actions.php index adc7d728d..30effd919 100755 --- a/plugins/sedi/actions.php +++ b/plugins/sedi/actions.php @@ -19,77 +19,83 @@ include_once __DIR__.'/../../core.php'; +use Modules\Anagrafiche\Sede; + $operazione = filter('op'); switch ($operazione) { case 'addsede': - if (!empty(post('nomesede'))) { - $opt_out_newsletter = post('disable_newsletter'); - $dbo->insert('an_sedi', [ + if (!empty(post('nomesede'))) { + $opt_out_newsletter = post('disable_newsletter'); + $dbo->insert('an_sedi', [ 'idanagrafica' => $id_parent, 'nomesede' => post('nomesede'), 'indirizzo' => post('indirizzo'), - 'codice_destinatario' => post('codice_destinatario'), 'citta' => post('citta'), 'cap' => post('cap'), - 'is_automezzo' => post('is_automezzo'), 'provincia' => strtoupper(post('provincia')), 'km' => post('km'), + 'id_nazione' => !empty(post('id_nazione')) ? post('id_nazione') : null, + 'idzona' => !empty(post('idzona')) ? post('idzona') : 0, 'cellulare' => post('cellulare'), 'telefono' => post('telefono'), 'email' => post('email'), - 'id_nazione' => !empty(post('id_nazione')) ? post('id_nazione') : null, - 'idzona' => !empty(post('idzona')) ? post('idzona') : 0, 'enable_newsletter' => empty($opt_out_newsletter), + 'codice_destinatario' => post('codice_destinatario'), + 'is_automezzo' => post('is_automezzo'), + 'is_rappresentante_fiscale' => post('is_rappresentante_fiscale'), ]); - $id_record = $dbo->lastInsertedID(); - $id_referenti = (array) post('id_referenti'); - foreach ($id_referenti as $id_referente) { - $dbo->update('an_referenti', [ - 'idsede' => $id_record, - ], [ - 'id' => $id_referente, - ]); - } + $id_record = $dbo->lastInsertedID(); - if (isAjaxRequest() && !empty($id_record)) { - echo json_encode(['id' => $id_record, 'text' => post('nomesede').' - '.post('citta')]); - } + $id_referenti = (array) post('id_referenti'); + foreach ($id_referenti as $id_referente) { + $dbo->update('an_referenti', [ + 'idsede' => $id_record, + ], [ + 'id' => $id_referente, + ]); + } - flash()->info(tr('Aggiunta una nuova sede!')); - } else { - flash()->warning(tr('Errore durante aggiunta della sede')); - } + if (isAjaxRequest() && !empty($id_record)) { + echo json_encode(['id' => $id_record, 'text' => post('nomesede').' - '.post('citta')]); + } + + flash()->info(tr('Aggiunta una nuova sede!')); + } else { + flash()->warning(tr('Errore durante aggiunta della sede')); + } + + $id_record->save(); break; case 'updatesede': $opt_out_newsletter = post('disable_newsletter'); + $sede = Sede::find($id_record); $dbo->update('an_sedi', [ 'nomesede' => post('nomesede'), 'indirizzo' => post('indirizzo'), - 'codice_destinatario' => post('codice_destinatario'), - 'piva' => post('piva'), - 'codice_fiscale' => post('codice_fiscale'), 'citta' => post('citta'), 'cap' => post('cap'), - 'is_automezzo' => post('is_automezzo'), 'provincia' => strtoupper(post('provincia')), - 'km' => post('km'), - 'cellulare' => post('cellulare'), - 'telefono' => post('telefono'), - 'email' => post('email'), - 'fax' => post('fax'), 'id_nazione' => !empty(post('id_nazione')) ? post('id_nazione') : null, + 'telefono' => post('telefono'), + 'cellulare' => post('cellulare'), + 'email' => post('email'), + 'enable_newsletter' => empty($opt_out_newsletter), + 'codice_destinatario' => post('codice_destinatario'), + 'is_rappresentante_fiscale' => post('is_rappresentante_fiscale'), + 'piva' => post('piva'), + 'codice_fiscale' => post('codice_fiscale'), + 'is_automezzo' => post('is_automezzo'), 'idzona' => post('idzona'), + 'km' => post('km'), 'note' => post('note'), 'gaddress' => post('gaddress'), 'lat' => post('lat'), 'lng' => post('lng'), - - 'enable_newsletter' => empty($opt_out_newsletter), ], ['id' => $id_record]); $referenti = $dbo->fetchArray('SELECT id FROM an_referenti WHERE idsede = '.$id_record); @@ -112,6 +118,8 @@ switch ($operazione) { ]); } + $sede->save(); + flash()->info(tr('Salvataggio completato!')); break; diff --git a/plugins/sedi/add.php b/plugins/sedi/add.php index ca161717f..cce665f23 100755 --- a/plugins/sedi/add.php +++ b/plugins/sedi/add.php @@ -42,18 +42,11 @@ echo '
{[ "type": "text", "label": "'.tr('Indirizzo').'", "name": "indirizzo", "required": 0 ]}
- -
- {[ "type": "text", "label": "'.($record['tipo_anagrafica'] == 'Ente pubblico' ? tr('Codice unico ufficio') : tr('Codice destinatario')).'", "name": "codice_destinatario", "required": 0, "class": "text-center text-uppercase alphanumeric-mask", "value": "$codice_destinatario$", "maxlength": '.($record['tipo_anagrafica'] == 'Ente pubblico' ? '6' : '7').', "help": "'.tr('Attenzione: per impostare il codice specificare prima \'Tipologia\' e \'Nazione\' dell\'anagrafica:
').'", "readonly": "'.intval($record['iso2'] ? $record['iso2'] != 'IT' : 0).'" ]} -
- - - -
{[ "type": "text", "label": "'.tr('Città').'", "name": "citta", "required": 1 ]}
- +
+
{[ "type": "text", "label": "'.tr('C.A.P.').'", "name": "cap" ]}
@@ -65,40 +58,41 @@ echo '
{[ "type": "text", "label": "'.tr('Km').'", "name": "km" ]}
-
- -
-
+
{[ "type": "select", "label": "'.tr('Nazione').'", "name": "id_nazione", "ajax-source": "nazioni", "required": 1 ]}
-
+
{[ "type": "select", "label": "'.tr('Zona').'", "name": "idzona", "ajax-source": "zone", "placeholder": "'.tr('Nessuna zona').'", "icon-after": "add|'.Modules::get('Zone')['id'].'" ]}
-
+
{[ "type": "telefono", "label": "'.tr('Cellulare').'", "name": "cellulare" ]}
-
+
{[ "type": "telefono", "label": "'.tr('Telefono').'", "name": "telefono" ]}
-
+
{[ "type": "text", "label": "'.tr('Indirizzo email').'", "name": "email", "class": "email-mask", "validation": "email" ]}
-
- -
-
+
{[ "type": "checkbox", "label": "'.tr('Opt-out per newsletter').'", "name": "disable_newsletter", "id": "disable_newsletter_m", "value": "0", "help": "'.tr("Blocco per l'invio delle email.").'" ]}
-
+
+
+
+ {[ "type": "text", "label": "'.($record['tipo_anagrafica'] == 'Ente pubblico' ? tr('Codice unico ufficio') : tr('Codice destinatario')).'", "name": "codice_destinatario", "required": 0, "class": "text-center text-uppercase alphanumeric-mask", "value": "$codice_destinatario$", "maxlength": '.($record['tipo_anagrafica'] == 'Ente pubblico' ? '6' : '7').', "help": "'.tr('Attenzione: per impostare il codice specificare prima \'Tipologia\' e \'Nazione\' dell\'anagrafica:
  • Ente pubblico (B2G/PA) - Codice Univoco Ufficio (www.indicepa.gov.it), 6 caratteri
  • Azienda (B2B) - Codice Destinatario, 7 caratteri
  • Privato (B2C) - viene utilizzato il Codice Fiscale
').'", "readonly": "'.intval($record['iso2'] ? $record['iso2'] != 'IT' : 0).'" ]} +
+
{[ "type": "checkbox", "label": "'.tr('Automezzo').'", "name": "is_automezzo", "id": "is_automezzo", "value": "0", "help": "'.tr('Seleziona se questa sede rappresenta un automezzo.').'" ]}
+
+ {[ "type": "checkbox", "label": "'.tr('Rappresentante fiscale').'", "name": "is_rappresentante_fiscale", "value": "'.($record['is_rappresentante_fiscale']).'", "help": "'.tr("Utilizza questa sede come rappresentante fiscale per l'anagrafica.").'" ]} +
-
{[ "type": "select", "multiple": "1", "label": "'.tr('Referenti').'", "name": "id_referenti[]", "ajax-source": "referenti", "select-options": {"idanagrafica": '.$id_parent.'}, "icon-after": "add|'.Modules::get('Anagrafiche')['id'].'|id_plugin='.Plugins::get('Referenti')['id'].'&id_parent='.$id_parent.'" ]} diff --git a/plugins/sedi/edit.php b/plugins/sedi/edit.php index 9f3e0c0ce..8f5054721 100755 --- a/plugins/sedi/edit.php +++ b/plugins/sedi/edit.php @@ -40,76 +40,70 @@ echo '
{[ "type": "text", "label": "'.tr('Indirizzo').'", "name": "indirizzo", "id": "indirizzo_", "required": 0, "value": "$indirizzo$" ]}
- -
- {[ "type": "text", "label": "'.($record['tipo_anagrafica'] == 'Ente pubblico' ? tr('Codice unico ufficio') : tr('Codice destinatario')).'", "name": "codice_destinatario", "required": 0, "class": "text-center text-uppercase alphanumeric-mask", "value": "$codice_destinatario$", "maxlength": '.($record['tipo_anagrafica'] == 'Ente pubblico' ? '6' : '7').', "help": "'.tr('Attenzione: per impostare il codice specificare prima \'Tipologia\' e \'Nazione\' dell\'anagrafica:
  • Ente pubblico (B2G/PA) - Codice Univoco Ufficio (www.indicepa.gov.it), 6 caratteri
  • Azienda (B2B) - Codice Destinatario, 7 caratteri
  • Privato (B2C) - viene utilizzato il Codice Fiscale
').'", "readonly": "'.intval($record['iso2'] ? $record['iso2'] != 'IT' : 0).'" ]} -
-
- -
{[ "type": "text", "label": "'.tr('Città').'", "name": "citta", "id": "citta_", "value": "$citta$", "required": 1 ]}
+
-
+
+
{[ "type": "text", "label": "'.tr('C.A.P.').'", "name": "cap", "value": "$cap$", "required":1 ]}
-
+
{[ "type": "text", "label": "'.tr('Provincia').'", "name": "provincia", "value": "$provincia$", "maxlength": 2, "class": "text-center provincia-mask text-uppercase", "extra": "onkeyup=\"this.value = this.value.toUpperCase();\"" ]}
- -
- {[ "type": "number", "label": "'.tr('Km').'", "name": "km", "value": "$km$" ]} -
-
- -
-
+
{[ "type": "select", "label": "'.tr('Nazione').'", "name": "id_nazione", "value": "$id_nazione$", "ajax-source": "nazioni", "required": 1 ]}
- -
+
+
+
{[ "type": "telefono", "label": "'.tr('Telefono').'", "name": "telefono", "value": "$telefono$" ]}
-
- -
-
- {[ "type": "text", "label": "'.tr('Fax').'", "name": "fax", "value": "$fax$" ]} -
- -
+
{[ "type": "telefono", "label": "'.tr('Cellulare').'", "name": "cellulare", "value": "$cellulare$" ]}
-
- -
{[ "type": "text", "label": "'.tr('Indirizzo email').'", "name": "email", "value": "$email$", "class": "email-mask", "validation": "email" ]}
-
{[ "type": "checkbox", "label": "'.tr('Opt-out per newsletter').'", "name": "disable_newsletter", "id": "disable_newsletter_m", "value": "'.empty($record['enable_newsletter']).'", "help": "'.tr("Blocco per l'invio delle email.").'" ]}
+
+
+
+ {[ "type": "text", "label": "'.($record['tipo_anagrafica'] == 'Ente pubblico' ? tr('Codice unico ufficio') : tr('Codice destinatario')).'", "name": "codice_destinatario", "required": 0, "class": "text-center text-uppercase alphanumeric-mask", "value": "$codice_destinatario$", "maxlength": '.($record['tipo_anagrafica'] == 'Ente pubblico' ? '6' : '7').', "help": "'.tr('Attenzione: per impostare il codice specificare prima \'Tipologia\' e \'Nazione\' dell\'anagrafica:
  • Ente pubblico (B2G/PA) - Codice Univoco Ufficio (www.indicepa.gov.it), 6 caratteri
  • Azienda (B2B) - Codice Destinatario, 7 caratteri
  • Privato (B2C) - viene utilizzato il Codice Fiscale
').'", "readonly": "'.intval($record['iso2'] ? $record['iso2'] != 'IT' : 0).'" ]} +
+ {[ "type": "checkbox", "label": "'.tr('Rappresentante fiscale').'", "name": "is_rappresentante_fiscale", "value": "'.($record['is_rappresentante_fiscale']).'", "help": "'.tr("Utilizza questa sede come rappresentante fiscale per l'anagrafica.").'" ]} +
+ +
+ {[ "type": "text", "label": "'.tr('Partita IVA').'", "name": "piva", "value": "'.($record['piva']).'", "help": "'.tr('Partita IVA del rappresentante fiscale.').'", "disabled":"disabled"]} +
+
+ {[ "type": "text", "label": "'.tr('Codice fiscale').'", "name": "codice_fiscale", "value": "'.($record['codice_fiscale']).'", "help": "'.tr('Codice fiscale del rappresentante fiscale.').'", "disabled":"disabled" ]} +
+
+
+
{[ "type": "checkbox", "label": "'.tr('Automezzo').'", "name": "is_automezzo", "id": "is_automezzo", "value": "'.$record['is_automezzo'].'", "help": "'.tr('Seleziona se questa sede rappresenta un automezzo.').'" ]}
-
+
{[ "type": "select", "label": "'.tr('Zona').'", "name": "idzona", "ajax-source": "zone", "value": "$idzona$", "placeholder": "'.tr('Nessuna zona').'", "icon-after": "add|'.Modules::get('Zone')['id'].'" ]}
-
- -
-
- {[ "type": "select", "multiple": "1", "label": "'.tr('Referenti').'", "name": "id_referenti[]", "value": "'.$referenti.'", "ajax-source": "referenti", "select-options": {"idanagrafica": '.$id_parent.'}, "icon-after": "add|'.Modules::get('Anagrafiche')['id'].'|id_plugin='.Plugins::get('Referenti')['id'].'&id_parent='.$id_parent.'" ]} +
+ {[ "type": "number", "label": "'.tr('Km').'", "name": "km", "value": "$km$" ]}
-
-
+
+ {[ "type": "select", "multiple": "1", "label": "'.tr('Referenti').'", "name": "id_referenti[]", "value": "'.$referenti.'", "ajax-source": "referenti", "select-options": {"idanagrafica": '.$id_parent.'}, "icon-after": "add|'.Modules::get('Anagrafiche')['id'].'|id_plugin='.Plugins::get('Referenti')['id'].'&id_parent='.$id_parent.'" ]} +
+
{[ "type": "textarea", "label": "'.tr('Note').'", "name": "note", "value": "$note$" ]}
@@ -214,6 +208,29 @@ echo ' '; diff --git a/update/2_4_52.sql b/update/2_4_52.sql index 09831505b..4a2ca976f 100644 --- a/update/2_4_52.sql +++ b/update/2_4_52.sql @@ -87,4 +87,7 @@ INSERT INTO `zz_prints` (`id`, `id_module`, `is_record`, `name`, `title`, `filen -- Widget modulo automezzi INSERT INTO `zz_widgets` (`id`, `name`, `type`, `id_module`, `location`, `class`, `query`, `bgcolor`, `icon`, `print_link`, `more_link`, `more_link_type`, `php_include`, `text`, `enabled`, `order`, `help`) VALUES (NULL, 'Stampa carico odierno', 'print', (SELECT `id` FROM `zz_modules` WHERE name='Automezzi'), 'controller_top', 'col-md-4', '', '#37a02d', 'fa fa-print', '', 'var data_carico = prompt(\'Data del carico da stampare?\', moment(new Date()).format(\'DD/MM/YYYY\'));\r\nif ( data_carico != null){ \r\nwindow.open(\'pdfgen.php?id_print=54&search_targa=\'+$(\'#th_Targa input\').val()+\'&search_nome=\'+$(\'#th_Nome input\').val()+\'&data_carico=\'+data_carico); \r\n}', 'javascript', '', 'Stampa carico odierno', '1', '2', NULL), -(NULL, 'Stampa giacenza', 'print', (SELECT `id` FROM `zz_modules` WHERE name='Automezzi'), 'controller_top', 'col-md-4', '', '#45a9f1', 'fa fa-truck', '', 'if( confirm(\'Stampare la giacenza attuale sugli automezzi?\') ){ window.open(\'pdfgen.php?id_print=53&search_targa=\'+$(\'#th_Targa input\').val()+\'&search_nome=\'+$(\'#th_Nome input\').val()); }', 'javascript', '', 'Stampa giacenza', '1', '1', NULL); \ No newline at end of file +(NULL, 'Stampa giacenza', 'print', (SELECT `id` FROM `zz_modules` WHERE name='Automezzi'), 'controller_top', 'col-md-4', '', '#45a9f1', 'fa fa-truck', '', 'if( confirm(\'Stampare la giacenza attuale sugli automezzi?\') ){ window.open(\'pdfgen.php?id_print=53&search_targa=\'+$(\'#th_Targa input\').val()+\'&search_nome=\'+$(\'#th_Nome input\').val()); }', 'javascript', '', 'Stampa giacenza', '1', '1', NULL); + +-- Aggiunta flag rappresentante fiscale per sede +ALTER TABLE `an_sedi` ADD `is_rappresentante_fiscale` BOOLEAN NOT NULL DEFAULT FALSE; \ No newline at end of file