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:
- 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", "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