Aggiunta gestione RappresentanteFiscale in XML

This commit is contained in:
Pek5892 2023-12-04 11:59:42 +01:00
parent b1080c129b
commit d0a8011ce6
6 changed files with 185 additions and 103 deletions

View File

@ -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;
}
}
}

View File

@ -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'))) {

View File

@ -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;

View File

@ -42,18 +42,11 @@ echo '
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Indirizzo').'", "name": "indirizzo", "required": 0 ]}
</div>
<div class="col-md-6">
{[ "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('<b>Attenzione</b>: per impostare il codice specificare prima \'Tipologia\' e \'Nazione\' dell\'anagrafica:<br><ul><li>Ente pubblico (B2G/PA) - Codice Univoco Ufficio (www.indicepa.gov.it), 6 caratteri</li><li>Azienda (B2B) - Codice Destinatario, 7 caratteri</li><li>Privato (B2C) - viene utilizzato il Codice Fiscale</li></ul>').'", "readonly": "'.intval($record['iso2'] ? $record['iso2'] != 'IT' : 0).'" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Città').'", "name": "citta", "required": 1 ]}
</div>
</div>
<div class="row">
<div class="col-md-2">
{[ "type": "text", "label": "'.tr('C.A.P.').'", "name": "cap" ]}
</div>
@ -65,40 +58,41 @@ echo '
<div class="col-md-2">
{[ "type": "text", "label": "'.tr('Km').'", "name": "km" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="col-md-3">
{[ "type": "select", "label": "'.tr('Nazione').'", "name": "id_nazione", "ajax-source": "nazioni", "required": 1 ]}
</div>
<div class="col-md-6">
<div class="col-md-3">
{[ "type": "select", "label": "'.tr('Zona').'", "name": "idzona", "ajax-source": "zone", "placeholder": "'.tr('Nessuna zona').'", "icon-after": "add|'.Modules::get('Zone')['id'].'" ]}
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="col-md-3">
{[ "type": "telefono", "label": "'.tr('Cellulare').'", "name": "cellulare" ]}
</div>
<div class="col-md-4">
<div class="col-md-3">
{[ "type": "telefono", "label": "'.tr('Telefono').'", "name": "telefono" ]}
</div>
<div class="col-md-4">
<div class="col-md-3">
{[ "type": "text", "label": "'.tr('Indirizzo email').'", "name": "email", "class": "email-mask", "validation": "email" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="col-md-3">
{[ "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.").'" ]}
</div>
<div class="col-md-6">
</div>
<div class="row">
<div class="col-md-4">
{[ "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('<b>Attenzione</b>: per impostare il codice specificare prima \'Tipologia\' e \'Nazione\' dell\'anagrafica:<br><ul><li>Ente pubblico (B2G/PA) - Codice Univoco Ufficio (www.indicepa.gov.it), 6 caratteri</li><li>Azienda (B2B) - Codice Destinatario, 7 caratteri</li><li>Privato (B2C) - viene utilizzato il Codice Fiscale</li></ul>').'", "readonly": "'.intval($record['iso2'] ? $record['iso2'] != 'IT' : 0).'" ]}
</div>
<div class="col-md-4">
{[ "type": "checkbox", "label": "'.tr('Automezzo').'", "name": "is_automezzo", "id": "is_automezzo", "value": "0", "help": "'.tr('Seleziona se questa sede rappresenta un automezzo.').'" ]}
</div>
<div class="col-md-4">
{[ "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.").'" ]}
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "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.'" ]}

View File

@ -40,76 +40,70 @@ echo '
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Indirizzo').'", "name": "indirizzo", "id": "indirizzo_", "required": 0, "value": "$indirizzo$" ]}
</div>
<div class="col-md-6">
{[ "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('<b>Attenzione</b>: per impostare il codice specificare prima \'Tipologia\' e \'Nazione\' dell\'anagrafica:<br><ul><li>Ente pubblico (B2G/PA) - Codice Univoco Ufficio (www.indicepa.gov.it), 6 caratteri</li><li>Azienda (B2B) - Codice Destinatario, 7 caratteri</li><li>Privato (B2C) - viene utilizzato il Codice Fiscale</li></ul>').'", "readonly": "'.intval($record['iso2'] ? $record['iso2'] != 'IT' : 0).'" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Città').'", "name": "citta", "id": "citta_", "value": "$citta$", "required": 1 ]}
</div>
</div>
<div class="col-md-2">
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "'.tr('C.A.P.').'", "name": "cap", "value": "$cap$", "required":1 ]}
</div>
<div class="col-md-2">
<div class="col-md-4">
{[ "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();\"" ]}
</div>
<div class="col-md-2">
{[ "type": "number", "label": "'.tr('Km').'", "name": "km", "value": "$km$" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Nazione').'", "name": "id_nazione", "value": "$id_nazione$", "ajax-source": "nazioni", "required": 1 ]}
</div>
<div class="col-md-6">
</div>
<div class="row">
<div class="col-md-3">
{[ "type": "telefono", "label": "'.tr('Telefono').'", "name": "telefono", "value": "$telefono$" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Fax').'", "name": "fax", "value": "$fax$" ]}
</div>
<div class="col-md-6">
<div class="col-md-3">
{[ "type": "telefono", "label": "'.tr('Cellulare').'", "name": "cellulare", "value": "$cellulare$" ]}
</div>
</div>
<div class="row">
<div class="col-md-3">
{[ "type": "text", "label": "'.tr('Indirizzo email').'", "name": "email", "value": "$email$", "class": "email-mask", "validation": "email" ]}
</div>
<div class="col-md-3">
{[ "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.").'" ]}
</div>
</div>
<div class="row">
<div class="col-md-3">
{[ "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('<b>Attenzione</b>: per impostare il codice specificare prima \'Tipologia\' e \'Nazione\' dell\'anagrafica:<br><ul><li>Ente pubblico (B2G/PA) - Codice Univoco Ufficio (www.indicepa.gov.it), 6 caratteri</li><li>Azienda (B2B) - Codice Destinatario, 7 caratteri</li><li>Privato (B2C) - viene utilizzato il Codice Fiscale</li></ul>').'", "readonly": "'.intval($record['iso2'] ? $record['iso2'] != 'IT' : 0).'" ]}
</div>
<div class="col-md-3">
{[ "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.").'" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "'.tr('Partita IVA').'", "name": "piva", "value": "'.($record['piva']).'", "help": "'.tr('Partita IVA del rappresentante fiscale.').'", "disabled":"disabled"]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "'.tr('Codice fiscale').'", "name": "codice_fiscale", "value": "'.($record['codice_fiscale']).'", "help": "'.tr('Codice fiscale del rappresentante fiscale.').'", "disabled":"disabled" ]}
</div>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "checkbox", "label": "'.tr('Automezzo').'", "name": "is_automezzo", "id": "is_automezzo", "value": "'.$record['is_automezzo'].'", "help": "'.tr('Seleziona se questa sede rappresenta un automezzo.').'" ]}
</div>
<div class="col-md-3">
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Zona').'", "name": "idzona", "ajax-source": "zone", "value": "$idzona$", "placeholder": "'.tr('Nessuna zona').'", "icon-after": "add|'.Modules::get('Zone')['id'].'" ]}
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "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.'" ]}
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Km').'", "name": "km", "value": "$km$" ]}
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="col-md-6">
{[ "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.'" ]}
</div>
<div class="col-md-6">
{[ "type": "textarea", "label": "'.tr('Note').'", "name": "note", "value": "$note$" ]}
</div>
</div>
@ -214,6 +208,29 @@ echo '
<script>$(document).ready(init)</script>
<script>
function rappresentante_fiscale() {
let rappresentante_fiscale = input("is_rappresentante_fiscale");
let piva = input("piva");
let codice_fiscale = input("codice_fiscale");
if(rappresentante_fiscale.get()==1){
input("piva").enable();
input("codice_fiscale").enable();
} else {
input("piva").disable();
input("codice_fiscale").disable();
}
}
$(document).ready(function() {
rappresentante_fiscale();
});
input("is_rappresentante_fiscale").change(function () {
rappresentante_fiscale();
});
$("#modals > div").on("shown.bs.modal", function () {
if (input("lat").get() && input("lng").get()) {
caricaMappaSede();
@ -288,5 +305,4 @@ function rimuoviSede(button) {
});
}).catch(swal.noop);
}
</script>';

View File

@ -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);
(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;