diff --git a/composer.json b/composer.json index 3850469de..9ffb12297 100644 --- a/composer.json +++ b/composer.json @@ -64,8 +64,10 @@ "Modules\\Fatture\\Custom\\": "modules/fatture/custom/src", "Modules\\Interventi\\": "modules/interventi/src", "Modules\\Interventi\\Custom\\": "modules/interventi/custom/src", - "Plugins\\Fatturazione\\": "plugins/fatturazione/src", - "Plugins\\Fatturazione\\Custom\\": "plugins/fatturazione/custom/src" + "Plugins\\ExportPA\\": "plugins/exportPA/src", + "Plugins\\ExportPA\\Custom\\": "plugins/exportPA/custom/src", + "Plugins\\ImportPA\\": "plugins/importPA/src", + "Plugins\\ImportPA\\Custom\\": "plugins/importPA/custom/src" }, "files": [ "lib/functions.php", diff --git a/modules/anagrafiche/actions.php b/modules/anagrafiche/actions.php index 48ac33af8..562197592 100644 --- a/modules/anagrafiche/actions.php +++ b/modules/anagrafiche/actions.php @@ -2,6 +2,8 @@ include_once __DIR__.'/../../core.php'; +use Modules\Anagrafiche\Anagrafica; + $id_azienda = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Azienda'")[0]['idtipoanagrafica']; $id_cliente = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Cliente'")[0]['idtipoanagrafica']; $id_fornitore = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Fornitore'")[0]['idtipoanagrafica']; @@ -9,73 +11,80 @@ $id_tecnico = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche switch (post('op')) { case 'update': - $partita_iva = trim(strtoupper(post('piva'))); - $codice_fiscale = trim(strtoupper(post('codice_fiscale'))); + $anagrafica = Anagrafica::find($id_record); - // Leggo tutti i valori passati dal POST e li salvo in un array - $dbo->update('an_anagrafiche', [ - 'ragione_sociale' => post('ragione_sociale'), - 'tipo' => post('tipo'), - 'piva' => $partita_iva, - 'codice_fiscale' => $codice_fiscale, - 'data_nascita' => post('data_nascita'), - 'luogo_nascita' => post('luogo_nascita'), - 'sesso' => post('sesso'), - 'capitale_sociale' => post('capitale_sociale'), - 'indirizzo' => post('indirizzo'), - 'indirizzo2' => post('indirizzo2'), - 'citta' => post('citta'), - 'cap' => post('cap'), - 'provincia' => post('provincia'), - 'km' => post('km'), - 'id_nazione' => !empty(post('id_nazione')) ? post('id_nazione') : null, - 'telefono' => post('telefono'), - 'cellulare' => post('cellulare'), - 'fax' => post('fax'), - 'email' => post('email'), - 'pec' => post('pec'), - 'idsede_fatturazione' => post('idsede_fatturazione'), - 'note' => post('note'), - 'codiceri' => post('codiceri'), - 'codicerea' => post('codicerea'), - 'appoggiobancario' => post('appoggiobancario'), - 'filiale' => post('filiale'), - 'codiceiban' => post('codiceiban'), - 'bic' => post('bic'), - 'diciturafissafattura' => post('diciturafissafattura'), - 'idpagamento_acquisti' => post('idpagamento_acquisti'), - 'idpagamento_vendite' => post('idpagamento_vendite'), - 'idlistino_acquisti' => post('idlistino_acquisti'), - 'idlistino_vendite' => post('idlistino_vendite'), - 'idiva_acquisti' => post('idiva_acquisti'), - 'idiva_vendite' => post('idiva_vendite'), - 'idbanca_acquisti' => post('idbanca_acquisti'), - 'idbanca_vendite' => post('idbanca_vendite'), - 'settore' => post('settore'), - 'marche' => post('marche'), - 'dipendenti' => post('dipendenti'), - 'macchine' => post('macchine'), - 'idagente' => post('idagente'), - 'idrelazione' => post('idrelazione'), - 'sitoweb' => post('sitoweb'), - 'idzona' => post('idzona'), - 'nome_cognome' => post('nome_cognome'), - 'iscrizione_tribunale' => post('iscrizione_tribunale'), - 'cciaa' => post('cciaa'), - 'cciaa_citta' => post('cciaa_citta'), - 'n_alboartigiani' => post('n_alboartigiani'), - 'foro_competenza' => post('foro_competenza'), - 'colore' => post('colore'), - 'idtipointervento_default' => post('idtipointervento_default'), - 'gaddress' => post('gaddress'), - 'lat' => post('lat'), - 'lng' => post('lng'), - ], ['idanagrafica' => $id_record]); + // Informazioni sull'anagrafica + $anagrafica->codice = post('codice'); + $anagrafica->ragione_sociale = post('ragione_sociale'); + $anagrafica->tipo = post('tipo'); + $anagrafica->data_nascita = post('data_nascita'); + $anagrafica->luogo_nascita = post('luogo_nascita'); + $anagrafica->sesso = post('sesso'); + $anagrafica->capitale_sociale = post('capitale_sociale'); + $anagrafica->pec = post('pec'); + $anagrafica->idsede_fatturazione = post('idsede_fatturazione'); + $anagrafica->note = post('note'); + $anagrafica->codiceri = post('codiceri'); + $anagrafica->codicerea = post('codicerea'); + $anagrafica->appoggiobancario = post('appoggiobancario'); + $anagrafica->filiale = post('filiale'); + $anagrafica->codiceiban = post('codiceiban'); + $anagrafica->bic = post('bic'); + $anagrafica->diciturafissafattura = post('diciturafissafattura'); + $anagrafica->idpagamento_acquisti = post('idpagamento_acquisti'); + $anagrafica->idpagamento_vendite = post('idpagamento_vendite'); + $anagrafica->idlistino_acquisti = post('idlistino_acquisti'); + $anagrafica->idlistino_vendite = post('idlistino_vendite'); + $anagrafica->idiva_acquisti = post('idiva_acquisti'); + $anagrafica->idiva_vendite = post('idiva_vendite'); + $anagrafica->idbanca_acquisti = post('idbanca_acquisti'); + $anagrafica->idbanca_vendite = post('idbanca_vendite'); + $anagrafica->settore = post('settore'); + $anagrafica->marche = post('marche'); + $anagrafica->dipendenti = post('dipendenti'); + $anagrafica->macchine = post('macchine'); + $anagrafica->idagente = post('idagente'); + $anagrafica->idrelazione = post('idrelazione'); + $anagrafica->sitoweb = post('sitoweb'); + $anagrafica->nome_cognome = post('nome_cognome'); + $anagrafica->iscrizione_tribunale = post('iscrizione_tribunale'); + $anagrafica->cciaa = post('cciaa'); + $anagrafica->cciaa_citta = post('cciaa_citta'); + $anagrafica->n_alboartigiani = post('n_alboartigiani'); + $anagrafica->foro_competenza = post('foro_competenza'); + $anagrafica->colore = post('colore'); + $anagrafica->idtipointervento_default = post('idtipointervento_default'); + + $anagrafica->save(); + + $anagrafica->updateTipologie((array)post('idtipoanagrafica')); + + // Informazioni sulla sede + $sede = $anagrafica->sedeLegale(); + $sede->partita_iva = post('piva'); + $sede->codice_fiscale = post('codice_fiscale'); + $sede->indirizzo = post('indirizzo'); + $sede->indirizzo2 = post('indirizzo2'); + $sede->citta = post('citta'); + $sede->cap = post('cap'); + $sede->provincia = post('provincia'); + $sede->km = post('km'); + $sede->id_nazione = post('id_nazione') ?: null; + $sede->gaddress = post('gaddress'); + $sede->lat = post('lat'); + $sede->lng = post('lng'); + $sede->telefono = post('telefono'); + $sede->cellulare = post('cellulare'); + $sede->fax = post('fax'); + $sede->idzona = post('idzona'); + $sede->email = post('email'); + $sede->save(); flash()->info(str_replace('_NAME_', '"'.post('ragione_sociale').'"', "Informazioni per l'anagrafica _NAME_ salvate correttamente!")); // Validazione della Partita IVA - $check_vat_number = Validate::isValidVatNumber(strtoupper($partita_iva)); + $partita_iva = $anagrafica->partita_iva ; + $check_vat_number = Validate::isValidVatNumber($partita_iva); if (empty($check_vat_number)) { flash()->error(tr('Attenzione: la partita IVA _IVA_ sembra non essere valida', [ '_IVA_' => $partita_iva, @@ -83,13 +92,8 @@ switch (post('op')) { } // Aggiorno il codice anagrafica se non è già presente, altrimenti lo ignoro - $esiste = $dbo->fetchNum('SELECT idanagrafica FROM an_anagrafiche WHERE codice='.prepare(post('codice')).' AND NOT idanagrafica='.prepare($id_record)); - - // Verifica dell'esistenza codice anagrafica - if ($esiste) { + if ($anagrafica->codice!= post('codice')) { flash()->error(tr("Il codice anagrafica inserito esiste già! Inserirne un'altro...")); - } else { - $dbo->query('UPDATE an_anagrafiche SET codice='.prepare(post('codice')).' WHERE idanagrafica='.prepare($id_record)); } // Aggiorno gli agenti collegati @@ -100,56 +104,17 @@ switch (post('op')) { $dbo->query('DELETE FROM an_anagrafiche_agenti WHERE idanagrafica='.prepare($id_record).' AND idagente='.prepare(post('idagente'))); } - // Aggiorno le tipologie di anagrafica - $idtipoanagrafica = (array) post('idtipoanagrafica'); - if (in_array($id_azienda, $tipi_anagrafica)) { - $idtipoanagrafica[] = $id_azienda; - } - - $dbo->sync('an_tipianagrafiche_anagrafiche', ['idanagrafica' => $id_record], ['idtipoanagrafica' => $idtipoanagrafica]); - - // Verifico se esiste già l'associazione dell'anagrafica a conti del partitario - $rs = $dbo->fetchArray('SELECT idconto_cliente, idconto_fornitore FROM an_anagrafiche WHERE idanagrafica='.prepare($id_record)); - $idconto_cliente = $rs[0]['idconto_cliente']; - $idconto_fornitore = $rs[0]['idconto_fornitore']; - - // Creo il relativo conto nel partitario se non esiste - if (empty($idconto_cliente) && in_array($id_cliente, $idtipoanagrafica)) { - // Calcolo prossimo numero cliente - $rs = $dbo->fetchArray("SELECT MAX(CAST(co_pianodeiconti3.numero AS UNSIGNED)) AS max_numero FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti2.descrizione='Crediti clienti e crediti diversi'"); - $new_numero = $rs[0]['max_numero'] + 1; - $new_numero = str_pad($new_numero, 6, '0', STR_PAD_LEFT); - - $dbo->query('INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2, can_delete, can_edit) VALUES('.prepare($new_numero).', '.prepare(post('ragione_sociale')).", (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Crediti clienti e crediti diversi'), 1, 1)"); - $idconto = $dbo->lastInsertedID(); - - // Collegamento conto - $dbo->query('UPDATE an_anagrafiche SET idconto_cliente='.prepare($idconto).' WHERE idanagrafica='.prepare($id_record)); - } - - if (empty($idconto_fornitore) && in_array($id_fornitore, $idtipoanagrafica)) { - // Calcolo prossimo numero cliente - $rs = $dbo->fetchArray("SELECT MAX(CAST(co_pianodeiconti3.numero AS UNSIGNED)) AS max_numero FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti2.descrizione='Debiti fornitori e debiti diversi'"); - $new_numero = $rs[0]['max_numero'] + 1; - $new_numero = str_pad($new_numero, 6, '0', STR_PAD_LEFT); - - $dbo->query('INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2, can_delete, can_edit) VALUES('.prepare($new_numero).', '.prepare(post('ragione_sociale')).", (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Debiti fornitori e debiti diversi'), 1, 1)"); - $idconto = $dbo->lastInsertedID(); - - // Collegamento conto - $dbo->query('UPDATE an_anagrafiche SET idconto_fornitore='.prepare($idconto).' WHERE idanagrafica='.prepare($id_record)); - } - break; case 'add': $idtipoanagrafica = post('idtipoanagrafica'); $ragione_sociale = post('ragione_sociale'); - // Inserimento anagrafica base - // Leggo l'ultimo codice anagrafica per calcolare il successivo - $rs = $dbo->fetchArray('SELECT codice FROM an_anagrafiche ORDER BY CAST(codice AS SIGNED) DESC LIMIT 0, 1'); - $codice = Util\Generator::generate(setting('Formato codice anagrafica'), $rs[0]['codice']); + $anagrafica = Anagrafica::create([ + 'ragione_sociale' => $ragione_sociale, + 'tipologie' => $idtipoanagrafica, + ]); + $id_record = $anagrafica->id; // Se ad aggiungere un cliente è un agente, lo imposto come agente di quel cliente // Lettura tipologia dell'utente loggato @@ -166,95 +131,32 @@ switch (post('op')) { $idagente = ($agente_is_logged && in_array($id_cliente, $idtipoanagrafica)) ? $user['idanagrafica'] : 0; - $partita_iva = trim(strtoupper(post('piva'))); - $codice_fiscale = trim(strtoupper(post('codice_fiscale'))); + $anagrafica->partita_iva = post('piva'); + $anagrafica->codice_fiscale = post('codice_fiscale'); + $anagrafica->indirizzo = post('indirizzo'); + $anagrafica->citta = post('citta'); + $anagrafica->cap = post('cap'); + $anagrafica->provincia = post('provincia'); + $anagrafica->telefono = post('telefono'); + $anagrafica->cellulare = post('cellulare'); + $anagrafica->email = post('email'); + $anagrafica->idrelazione = post('idrelazione'); + $anagrafica->idagente = $idagente; - // Inserisco l'anagrafica - $dbo->insert('an_anagrafiche', [ - 'ragione_sociale' => $ragione_sociale, - 'codice' => $codice, - 'piva' => $partita_iva, - 'codice_fiscale' => $codice_fiscale, - 'indirizzo' => post('indirizzo'), - 'citta' => post('citta'), - 'cap' => post('cap'), - 'provincia' => post('provincia'), - 'telefono' => post('telefono'), - 'cellulare' => post('cellulare'), - 'email' => post('email'), - 'idrelazione' => post('idrelazione'), - 'idagente' => $idagente, - ]); + $anagrafica->save(); - $new_id = $dbo->lastInsertedID(); - - // Inserisco il rapporto dell'anagrafica (cliente, tecnico, ecc) - $dbo->sync('an_tipianagrafiche_anagrafiche', ['idanagrafica' => $new_id], ['idtipoanagrafica' => (array) $idtipoanagrafica]); - - if (in_array($id_azienda, $idtipoanagrafica)) { - Settings::setValue('Azienda predefinita', $new_id); - - flash()->info(tr('Anagrafica Azienda impostata come predefinita. Per ulteriori informazionioni, visitare "Strumenti -> Impostazioni -> Generali"')); + if ($anagrafica->isAzienda()) { + flash()->info(tr('Anagrafica Azienda impostata come predefinita').'. '.tr('Per ulteriori informazionioni, visitare "Strumenti -> Impostazioni -> Generali"')); } - //se sto inserendo un tecnico, mi copio già le tariffe per le varie attività - if (in_array($id_tecnico, $idtipoanagrafica)) { - //per ogni tipo di attività - $rs_tipiintervento = $dbo->fetchArray('SELECT * FROM in_tipiintervento'); - - for ($i = 0; $i < count($rs_tipiintervento); ++$i) { - if ($dbo->query('INSERT INTO in_tariffe( idtecnico, idtipointervento, costo_ore, costo_km, costo_dirittochiamata, costo_ore_tecnico, costo_km_tecnico, costo_dirittochiamata_tecnico ) VALUES( '.prepare($new_id).', '.prepare($rs_tipiintervento[$i]['idtipointervento']).', (SELECT costo_orario FROM in_tipiintervento WHERE idtipointervento='.prepare($rs_tipiintervento[$i]['idtipointervento']).'), (SELECT costo_km FROM in_tipiintervento WHERE idtipointervento='.prepare($rs_tipiintervento[$i]['idtipointervento']).'), (SELECT costo_diritto_chiamata FROM in_tipiintervento WHERE idtipointervento='.prepare($rs_tipiintervento[$i]['idtipointervento']).'), (SELECT costo_orario_tecnico FROM in_tipiintervento WHERE idtipointervento='.prepare($rs_tipiintervento[$i]['idtipointervento']).'), (SELECT costo_km_tecnico FROM in_tipiintervento WHERE idtipointervento='.prepare($rs_tipiintervento[$i]['idtipointervento']).'), (SELECT costo_diritto_chiamata_tecnico FROM in_tipiintervento WHERE idtipointervento='.prepare($rs_tipiintervento[$i]['idtipointervento']).') )')) { - //flash()->info(tr('Informazioni salvate correttamente!')); - } else { - flash()->error(tr("Errore durante l'importazione tariffe!")); - } - } - } - - // Creo il relativo conto nel partitario (cliente) - if (in_array($id_cliente, $idtipoanagrafica)) { - // Calcolo prossimo numero cliente - $rs = $dbo->fetchArray("SELECT MAX(CAST(co_pianodeiconti3.numero AS UNSIGNED)) AS max_numero FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti2.descrizione='Crediti clienti e crediti diversi'"); - $new_numero = $rs[0]['max_numero'] + 1; - $new_numero = str_pad($new_numero, 6, '0', STR_PAD_LEFT); - - // Creazione conto - $dbo->query('INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2, can_delete, can_edit) VALUES('.prepare($new_numero).', '.prepare($ragione_sociale).", (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Crediti clienti e crediti diversi'), 1, 1)"); - $idconto = $dbo->lastInsertedID(); - - // Collegamento conto - $dbo->query('UPDATE an_anagrafiche SET idconto_cliente='.prepare($idconto).' WHERE idanagrafica='.prepare($new_id)); - } - - // Creo il relativo conto nel partitario (fornitore) - if (in_array($id_fornitore, $idtipoanagrafica)) { - // Calcolo prossimo numero cliente - $rs = $dbo->fetchArray("SELECT MAX(CAST(co_pianodeiconti3.numero AS UNSIGNED)) AS max_numero FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti2.descrizione='Debiti fornitori e debiti diversi'"); - $new_numero = $rs[0]['max_numero'] + 1; - $new_numero = str_pad($new_numero, 6, '0', STR_PAD_LEFT); - - // Creazione conto - $dbo->query('INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2, can_delete, can_edit) VALUES('.prepare($new_numero).', '.prepare($ragione_sociale).", (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Debiti fornitori e debiti diversi'), 1, 1)"); - $idconto = $dbo->lastInsertedID(); - - // Collegamento conto - $dbo->query('UPDATE an_anagrafiche SET idconto_fornitore='.prepare($idconto).' WHERE idanagrafica='.prepare($new_id)); - } - - $id_record = $new_id; - // Lettura tipologia della nuova anagrafica - if (!empty($idtipoanagrafica)) { - $rs = $dbo->fetchArray('SELECT descrizione FROM an_tipianagrafiche WHERE idtipoanagrafica IN ('.implode(',', $idtipoanagrafica).')'); - $tipoanagrafica_dst = implode(', ', array_column($rs, 'descrizione')); - } - - if (isAjaxRequest() && str_contains($tipoanagrafica_dst, post('tipoanagrafica'))) { + $descrizioni_tipi = $anagrafica->tipi()->get()->pluck('descrizione')->toArray(); + if (isAjaxRequest() && in_array(post('tipoanagrafica'), $descrizioni_tipi)) { echo json_encode(['id' => $id_record, 'text' => $ragione_sociale]); } flash()->info(tr('Aggiunta nuova anagrafica di tipo _TYPE_', [ - '_TYPE_' => '"'.$tipoanagrafica_dst.'"', + '_TYPE_' => '"'.implode(', ', $descrizioni_tipi).'"', ])); break; diff --git a/modules/anagrafiche/edit.php b/modules/anagrafiche/edit.php index be223c3d0..298555043 100644 --- a/modules/anagrafiche/edit.php +++ b/modules/anagrafiche/edit.php @@ -48,17 +48,17 @@ if (!$cliente) {
-
- {[ "type": "text", "label": "", "maxlength": 13, "name": "piva", "class": "text-center alphanumeric-mask", "value": "$piva$" ]} -
- -
- {[ "type": "text", "label": "", "maxlength": 16, "name": "codice_fiscale", "class": "text-center alphanumeric-mask", "value": "$codice_fiscale$" ]} -
-
{[ "type": "text", "label": "", "name": "codice", "required": 1, "class": "text-center", "value": "$codice$" ]}
+ +
+ {[ "type": "text", "label": "", "name": "pec", "class": "email-mask", "placeholder":"pec@dominio.ext", "value": "$pec$", "icon-before": "" ]} +
+ +
+ {[ "type": "text", "label": "", "name": "sitoweb", "placeholder":"www.dominio.ext", "value": "$sitoweb$", "icon-before": "" ]} +
@@ -74,85 +74,80 @@ if (!$cliente) { {[ "type": "select", "label": "", "name": "sesso", "values": "list=\"\": \"Non specificato\", \"M\": \"\", \"F\": \"\"", "value": "$sesso$" ]}
+ + -
-
- {[ "type": "text", "label": "", "name": "indirizzo", "value": "$indirizzo$" ]} -
+
+
+

+
+
-
- {[ "type": "text", "label": "", "name": "indirizzo2", "value": "$indirizzo2$" ]} -
+
+
+ {[ "type": "text", "label": "", "maxlength": 13, "name": "piva", "class": "text-center alphanumeric-mask", "value": "$piva$" ]} +
-
- {[ "type": "select", "label": "", "name": "idzona", "values": "query=SELECT id, CONCAT_WS( ' - ', nome, descrizione) AS descrizione FROM an_zone ORDER BY descrizione ASC", "value": "$idzona$", "placeholder": "", "icon-after": "add|" ]} -
-
+
+ {[ "type": "text", "label": "", "maxlength": 16, "name": "codice_fiscale", "class": "text-center alphanumeric-mask", "value": "$codice_fiscale$" ]} +
+
-
-
- {[ "type": "select", "label": "", "name": "id_nazione", "values": "query=SELECT id AS id, nome AS descrizione FROM an_nazioni ORDER BY nome ASC", "value": "$id_nazione$" ]} -
+
+
+ {[ "type": "text", "label": "", "name": "indirizzo", "value": "$indirizzo$" ]} +
-
- {[ "type": "text", "label": "", "name": "cap", "maxlength": 5, "class": "text-center", "value": "$cap$" ]} -
+
+ {[ "type": "text", "label": "", "name": "indirizzo2", "value": "$indirizzo2$" ]} +
-
- {[ "type": "text", "label": "", "name": "citta", "class": "text-center", "value": "$citta$" ]} -
+
+ {[ "type": "text", "label": "", "name": "citta", "class": "text-center", "value": "$citta$" ]} +
+
-
- {[ "type": "text", "label": "", "name": "provincia", "maxlength": 2, "class": "text-center", "value": "$provincia$" ]} -
+
+
+ {[ "type": "select", "label": "", "name": "id_nazione", "values": "query=SELECT id AS id, nome AS descrizione FROM an_nazioni ORDER BY nome ASC", "value": "$id_nazione$" ]} +
-
- {[ "type": "number", "label": "", "name": "km", "decimals":"1", "class": "text-center", "value": "$km$", "icon-after": "Km" ]} -
-
-
-
+
+ {[ "type": "select", "label": "", "name": "idzona", "values": "query=SELECT id, CONCAT_WS( ' - ', nome, descrizione) AS descrizione FROM an_zone ORDER BY descrizione ASC", "value": "$idzona$", "placeholder": "", "icon-after": "add|" ]} +
+
+ {[ "type": "text", "label": "", "name": "cap", "maxlength": 5, "class": "text-center", "value": "$cap$" ]} +
+
+ {[ "type": "text", "label": "", "name": "provincia", "maxlength": 2, "class": "text-center", "value": "$provincia$" ]} +
- -
-
-

-
+
+ {[ "type": "number", "label": "", "name": "km", "decimals":"1", "class": "text-center", "value": "$km$", "icon-after": "Km" ]} +
+
-
-
-
- {[ "type": "text", "label": "", "name": "telefono", "class": "text-center", "value": "$telefono$", "icon-before": "" ]} -
+
+
+ {[ "type": "text", "label": "", "name": "telefono", "class": "text-center", "value": "$telefono$", "icon-before": "" ]} +
-
- {[ "type": "text", "label": "", "name": "fax", "class": "text-center", "value": "$fax$", "icon-before": "" ]} -
+
+ {[ "type": "text", "label": "", "name": "fax", "class": "text-center", "value": "$fax$", "icon-before": "" ]} +
-
- {[ "type": "text", "label": "", "name": "cellulare", "class": "text-center", "value": "$cellulare$", "icon-before": "" ]} -
-
+
+ {[ "type": "text", "label": "", "name": "cellulare", "class": "text-center", "value": "$cellulare$", "icon-before": "" ]} +
-
-
- {[ "type": "text", "label": "", "name": "email", "class": "email-mask", "placeholder":"casella@dominio.ext", "value": "$email$", "icon-before": "" ]} -
- -
- {[ "type": "text", "label": "", "name": "pec", "class": "email-mask", "placeholder":"pec@dominio.ext", "value": "$pec$", "icon-before": "" ]} -
- -
- {[ "type": "text", "label": "", "name": "sitoweb", "placeholder":"www.dominio.ext", "value": "$sitoweb$", "icon-before": "" ]} -
- - -
-
-
+
+ {[ "type": "text", "label": "", "name": "email", "class": "email-mask", "placeholder":"casella@dominio.ext", "value": "$email$", "icon-before": "" ]} +
+
+ + create($attributes); + + // Completamento informazioni + $model->updateTipologie((array)$attributes['tipologie']); + + $ultimo = database()->fetchOne('SELECT codice FROM an_anagrafiche ORDER BY CAST(codice AS SIGNED) DESC LIMIT 1'); + $codice = Generator::generate(setting('Formato codice anagrafica'), $ultimo['codice']); + + $model->codice = $codice; + $model->save(); + + return $model; + } + + public static function fixAzienda(Anagrafica $anagrafica) + { + Settings::setValue('Azienda predefinita', $anagrafica->id); + } + + public static function fixCliente(Anagrafica $anagrafica) + { + $database = database(); + + // Creo il relativo conto nel partitario se non esiste + if (empty($anagrafica->idconto_cliente)) { + // Calcolo prossimo numero cliente + $rs = $database->fetchArray("SELECT MAX(CAST(co_pianodeiconti3.numero AS UNSIGNED)) AS max_numero FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti2.descrizione='Crediti clienti e crediti diversi'"); + $new_numero = $rs[0]['max_numero'] + 1; + $new_numero = str_pad($new_numero, 6, '0', STR_PAD_LEFT); + + $database->query('INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2, can_delete, can_edit) VALUES('.prepare($new_numero).', '.prepare(post('ragione_sociale')).", (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Crediti clienti e crediti diversi'), 1, 1)"); + $idconto = $database->lastInsertedID(); + + // Collegamento conto + $anagrafica->idconto_cliente = $idconto; + $anagrafica->save(); + } + } + + public static function fixFornitore(Anagrafica $anagrafica) + { + $database = database(); + + // Creo il relativo conto nel partitario se non esiste + if (empty($anagrafica->idconto_fornitore)) { + // Calcolo prossimo numero cliente + $rs = $database->fetchArray("SELECT MAX(CAST(co_pianodeiconti3.numero AS UNSIGNED)) AS max_numero FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti2.descrizione='Debiti fornitori e debiti diversi'"); + $new_numero = $rs[0]['max_numero'] + 1; + $new_numero = str_pad($new_numero, 6, '0', STR_PAD_LEFT); + + $database->query('INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2, can_delete, can_edit) VALUES('.prepare($new_numero).', '.prepare(post('ragione_sociale')).", (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Debiti fornitori e debiti diversi'), 1, 1)"); + $idconto = $database->lastInsertedID(); + + // Collegamento conto + $anagrafica->idconto_fornitore = $idconto; + $anagrafica->save(); + } + } + + public static function fixTecnico(Anagrafica $anagrafica) + { + // Copio già le tariffe per le varie attività + if (in_array($id_tecnico, $idtipoanagrafica)) { + $result = $database->query('INSERT INTO in_tariffe(idtecnico, idtipointervento, costo_ore, costo_km, costo_dirittochiamata, costo_ore_tecnico, costo_km_tecnico, costo_dirittochiamata_tecnico) SELECT '.prepare($model->id).', idtipointervento, costo_orario, costo_km, costo_diritto_chiamata, costo_orario_tecnico, costo_km_tecnico, costo_diritto_chiamata_tecnico FROM in_tipiintervento'); + + if (!$result) { + flash()->error(tr("Errore durante l'importazione tariffe!")); + } + } + } + + /** + * Aggiorna la tipologia dell'anagrafica. + * + * @param array $tipologie + * @return void + */ + public function updateTipologie(array $tipologie) + { + if ($this->isAzienda()) { + $tipologie[] = Tipo::where('descrizione', 'Azienda')->first()->id; + } + + $previous = $this->tipi()->get(); + $this->tipi()->sync($tipologie); + $actual = $this->tipi()->get(); + + $diff = $actual->diff($previous); + + foreach ($diff as $tipo) { + $method = 'fix'.$tipo->descrizione; + if (method_exists($this, $method)) { + self::$method($this); + } + } + } + + /** + * Controlla se l'anagrafica è di tipo 'Azienda'. + * + * @return bool + */ + public function isAzienda() + { + return $this->tipi()->get()->search(function ($item, $key) { + return $item->descrizione == 'Azienda'; + }) !== false ; + } + + /** + * Restituisce l'identificativo. + * + * @return int + */ + public function getIdAttribute() + { + return $this->idanagrafica; + } + + public function setCodiceAttribute($value) + { + if (self::where([ + ['codice', $value], + [$this->primaryKey, '<>', $this->id] + ])->count() == 0) { + $this->attributes['codice'] = $value; + } + } + + public function getPartitaIvaAttribute() + { + return $this->piva; + } + + public function setPartitaIvaAttribute($value) + { + $this->attributes['piva'] = trim(strtoupper($value)); + } + + public function setCodiceFiscaleAttribute($value) + { + $this->attributes['codice_fiscale'] = trim(strtoupper($value)); + } + + public function tipi() + { + return $this->belongsToMany(Tipo::class, 'an_tipianagrafiche_anagrafiche', 'idanagrafica', 'idtipoanagrafica'); + } + public function fatture() { return $this->hasMany(Fattura::class, 'idanagrafica'); } + + public function nazione() + { + return $this->belongsTo(Nazione::class, 'id_nazione'); + } + + /** + * Restituisce la sede legale collegata. + * + * @return self + */ + public function sedeLegale() + { + return $this; + } } diff --git a/modules/anagrafiche/src/Nazione.php b/modules/anagrafiche/src/Nazione.php new file mode 100644 index 000000000..8c55d16e0 --- /dev/null +++ b/modules/anagrafiche/src/Nazione.php @@ -0,0 +1,15 @@ +hasMany(Anagrafica::class, 'id_nazione'); + } +} diff --git a/modules/anagrafiche/src/Tipo.php b/modules/anagrafiche/src/Tipo.php new file mode 100644 index 000000000..15c21d231 --- /dev/null +++ b/modules/anagrafiche/src/Tipo.php @@ -0,0 +1,34 @@ +idtipoanagrafica; + } + + public function anagrafiche() + { + return $this->hasMany(Anagrafica::class, 'an_tipianagrafiche_anagrafiche', 'idtipoanagrafica', 'idanagrafica'); + } +} diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index bbb6c9dd0..272ab435f 100644 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -29,7 +29,7 @@ switch (post('op')) { 'idanagrafica' => $idanagrafica, 'data' => $data, 'id_segment' => $id_segment, - 'idtipodocumento' => $idtipodocumento, + 'tipo' => $idtipodocumento, ]); $id_record = $fattura->id; diff --git a/modules/fatture/add.php b/modules/fatture/add.php index 8f66aedf0..1ba3e09b7 100644 --- a/modules/fatture/add.php +++ b/modules/fatture/add.php @@ -35,6 +35,7 @@ $id_anagrafica = !empty(get('idanagrafica')) ? get('idanagrafica') : $user['idan
{[ "type": "select", "label": "", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, descrizione FROM co_tipidocumento WHERE dir=''" ]}
+
{[ "type": "select", "label": "", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='' ORDER BY name", "value": "" ]}
diff --git a/modules/fatture/edit.php b/modules/fatture/edit.php index 6ec8ce5cc..062778f5d 100644 --- a/modules/fatture/edit.php +++ b/modules/fatture/edit.php @@ -251,7 +251,7 @@ if ($tipodoc == 'Fattura accompagnatoria di vendita') {
- {[ "type": "select", "label": "'.tr('Vettore').'", "name": "idvettore", "values": "query=SELECT DISTINCT an_anagrafiche.idanagrafica AS id, an_anagrafiche.ragione_sociale AS descrizione FROM an_anagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE an_tipianagrafiche_anagrafiche.idtipoanagrafica=(SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione=\'Vettore\') ORDER BY descrizione ASC", "value": "$idvettore$" ]} + {[ "type": "select", "label": "'.tr('Vettore').'", "name": "idvettore", "values": "query=SELECT DISTINCT an_anagrafiche.idanagrafica AS id, an_anagrafiche.ragione_sociale AS descrizione FROM an_anagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE an_tipianagrafiche_anagrafiche.idtipoanagrafica=(SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione=\'Vettore\') ORDER BY descrizione ASC", "value": "$idvettore$", "required": 1 ]}
diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php index 238954f47..fab4ef42d 100644 --- a/modules/fatture/src/Fattura.php +++ b/modules/fatture/src/Fattura.php @@ -31,7 +31,7 @@ class Fattura extends Model { $model = static::query()->create($attributes); - $tipo_documento = Tipo::find($attributes['idtipodocumento']); + $tipo_documento = Tipo::find($attributes['tipo']); $stato_documento = Stato::where('descrizione', 'Bozza')->first(); $direzione = $tipo_documento->dir; @@ -40,7 +40,7 @@ class Fattura extends Model $id_anagrafica = $attributes['idanagrafica']; $id_segment = $attributes['id_segment']; - $dbo = database(); + $database = database(); // Calcolo dei numeri fattura $numero = static::getNumero($data, $direzione, $id_segment); @@ -55,7 +55,7 @@ class Fattura extends Model } // Tipo di pagamento e banca predefinite dall'anagrafica - $pagamento = $dbo->fetchOne('SELECT id, (SELECT idbanca_'.$conto.' FROM an_anagrafiche WHERE idanagrafica = ?) AS idbanca FROM co_pagamenti WHERE id = (SELECT idpagamento_'.$conto.' AS pagamento FROM an_anagrafiche WHERE idanagrafica = ?)', [ + $pagamento = $database->fetchOne('SELECT id, (SELECT idbanca_'.$conto.' FROM an_anagrafiche WHERE idanagrafica = ?) AS idbanca FROM co_pagamenti WHERE id = (SELECT idpagamento_'.$conto.' AS pagamento FROM an_anagrafiche WHERE idanagrafica = ?)', [ $id_anagrafica, $id_anagrafica, ]); @@ -69,12 +69,12 @@ class Fattura extends Model // Se non è impostata la banca dell'anagrafica, uso quella del pagamento. if (empty($id_banca)) { - $id_banca = $dbo->fetchOne('SELECT id FROM co_banche WHERE id_pianodeiconti3 = (SELECT idconto_'.$conto.' FROM co_pagamenti WHERE id = :id_pagamento)', [ + $id_banca = $database->fetchOne('SELECT id FROM co_banche WHERE id_pianodeiconti3 = (SELECT idconto_'.$conto.' FROM co_pagamenti WHERE id = :id_pagamento)', [ ':id_pagamento' => $id_pagamento, ])['id']; } - $id_sede = $dbo->selectOne('an_anagrafiche', 'idsede_fatturazione', ['idanagrafica' => $id_anagrafica])['idsede_fatturazione']; + $id_sede = $database->selectOne('an_anagrafiche', 'idsede_fatturazione', ['idanagrafica' => $id_anagrafica])['idsede_fatturazione']; // Salvataggio delle informazioni $model->numero = $numero; @@ -104,11 +104,11 @@ class Fattura extends Model */ public static function getNumero($data, $direzione, $id_segment) { - $dbo = database(); + $database = database(); $maschera = $direzione == 'uscita' ? static::getMaschera($id_segment) : '#'; - $ultima_fattura = $dbo->fetchOne('SELECT numero_esterno FROM co_documenti WHERE YEAR(data) = :year AND id_segment = :id_segment '.static::getMascheraOrder($maschera), [ + $ultima_fattura = $database->fetchOne('SELECT numero_esterno FROM co_documenti WHERE YEAR(data) = :year AND id_segment = :id_segment '.static::getMascheraOrder($maschera), [ ':year' => date('Y', strtotime($data)), ':id_segment' => $id_segment, ]); @@ -133,12 +133,12 @@ class Fattura extends Model return ''; } - $dbo = database(); + $database = database(); // Recupero maschera per questo segmento $maschera = static::getMaschera($id_segment); - $ultima_fattura = $dbo->fetchOne('SELECT numero_esterno FROM co_documenti WHERE YEAR(data) = :year AND id_segment = :id_segment '.static::getMascheraOrder($maschera), [ + $ultima_fattura = $database->fetchOne('SELECT numero_esterno FROM co_documenti WHERE YEAR(data) = :year AND id_segment = :id_segment '.static::getMascheraOrder($maschera), [ ':year' => date('Y', strtotime($data)), ':id_segment' => $id_segment, ]); @@ -157,9 +157,9 @@ class Fattura extends Model */ protected static function getMaschera($id_segment) { - $dbo = database(); + $database = database(); - $maschera = $dbo->fetchOne('SELECT pattern FROM zz_segments WHERE id = :id_segment', [ + $maschera = $database->fetchOne('SELECT pattern FROM zz_segments WHERE id = :id_segment', [ ':id_segment' => $id_segment, ])['pattern']; diff --git a/plugins/fatturazione/actions.php b/plugins/exportPA/actions.php similarity index 100% rename from plugins/fatturazione/actions.php rename to plugins/exportPA/actions.php diff --git a/plugins/fatturazione/edit.php b/plugins/exportPA/edit.php similarity index 98% rename from plugins/fatturazione/edit.php rename to plugins/exportPA/edit.php index 893706ae8..519ce9b6f 100644 --- a/plugins/fatturazione/edit.php +++ b/plugins/exportPA/edit.php @@ -18,7 +18,7 @@ if (!empty($fattura_pa)) { } // Campi obbligatori per l'anagrafica Azienda -$azienda = Plugins\Fatturazione\FatturaElettronica::getAzienda(); +$azienda = Plugins\ExportPA\FatturaElettronica::getAzienda(); $fields = [ 'piva' => 'Partita IVA', // 'codice_fiscale' => 'Codice Fiscale', diff --git a/plugins/fatturazione/init.php b/plugins/exportPA/init.php similarity index 63% rename from plugins/fatturazione/init.php rename to plugins/exportPA/init.php index a8e6152f0..bafc191a1 100644 --- a/plugins/fatturazione/init.php +++ b/plugins/exportPA/init.php @@ -1,7 +1,7 @@ static::getDatiGeneraliDocumento($fattura), - // TODO: DatiOrdineAcquisto, DatiContratto, DatiConvenzione, DatiRicezione, DatiFattureCollegate, DatiSAL, DatiDDT, DatiTrasporto, FatturaPrincipale + // TODO: DatiOrdineAcquisto, DatiContratto, DatiConvenzione, DatiRicezione, DatiFattureCollegate, DatiSAL, DatiDDT, FatturaPrincipale ]; if ($documento['tipo'] == 'Fattura accompagnatoria di vendita') { diff --git a/plugins/fatturazione/src/stylesheet-1.2.1.xsl b/plugins/exportPA/src/stylesheet-1.2.1.xsl similarity index 100% rename from plugins/fatturazione/src/stylesheet-1.2.1.xsl rename to plugins/exportPA/src/stylesheet-1.2.1.xsl diff --git a/plugins/fatturazione/view.php b/plugins/exportPA/view.php similarity index 100% rename from plugins/fatturazione/view.php rename to plugins/exportPA/view.php diff --git a/plugins/importPA/actions.php b/plugins/importPA/actions.php new file mode 100644 index 000000000..277dc9297 --- /dev/null +++ b/plugins/importPA/actions.php @@ -0,0 +1,42 @@ + tr('Fattura Elettronica'), + 'category' => tr('Fattura Elettronica'), + 'id_module' => $id_module, + 'id_record' => $id, + ]); + + echo json_encode([ + 'id' => $id, + 'filename' => $filename, + 'id_segment' => post('id_segment'), + ]); + + break; + + case 'generate': + $id = post('id'); + $filename = post('filename'); + + $directory = Uploads::getDirectory($id_module); + + $xml = file_get_contents(DOCROOT.'/'.$directory.'/'.$filename); + $fattura_pa = new Plugins\ImportPA\FatturaElettronica($xml); + + $id_record = $fattura_pa->saveFattura(post('id_segment'), post('articoli')); + + $fattura_pa->saveRighe(post('articoli')); + + $fattura_pa->saveAllegati($directory); + + Uploads::updateFake($id, $id_record); + + redirect(ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$id_record); + break; +} diff --git a/plugins/importPA/edit.php b/plugins/importPA/edit.php new file mode 100644 index 000000000..9db30377a --- /dev/null +++ b/plugins/importPA/edit.php @@ -0,0 +1,68 @@ + + function upload() { + if ($("#blob").val()) { + swal({ + title: "'.tr('Avviare la procedura?').'", + type: "warning", + showCancelButton: true, + confirmButtonText: "'.tr('Sì').'" + }).then(function (result) { + $("#upload").ajaxSubmit({ + url: globals.rootdir + "/actions.php", + data: { + op: "save", + id_module: "'.$id_module.'", + id_plugin: "'.$id_plugin.'", + }, + type: "post", + success: function(data){ + data = JSON.parse(data); + + launch_modal("'.tr('Righe fattura').'", globals.rootdir + "/plugins/importPA/rows.php?id_module=" + globals.id_module + "&id_plugin=" + '.$id_plugin.' + "&id=" + data.id + "&filename=" + data.filename + "&id_segment" + data.id_segment) + }, + error: function(data) { + alert("'.tr('Errore').': " + data); + } + }); + }) + } else { + swal({ + title: "'.tr('Selezionare un file!').'", + type: "error", + }) + } + } + + +
+
+

+ '.tr('Carica un XML').' +

+
+
+ +
+
+ +
+ +
+ {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.$id_module.' ORDER BY name", "value": "'.$_SESSION['module_'.$id_module]['id_segment'].'" ]} +
+
+ +
+
+ +
+
+
+
'; diff --git a/plugins/importPA/rows.php b/plugins/importPA/rows.php new file mode 100644 index 000000000..b2ab786bc --- /dev/null +++ b/plugins/importPA/rows.php @@ -0,0 +1,65 @@ +getRighe(); + +echo ' +
+ + + + + + + '; + +if (!empty($righe)) { + echo ' + + + + + + + + '; + + foreach ($righe as $key => $riga) { + echo ' + + + + + + + '; + } + + echo ' +
'.tr('Riga').''.tr('Descrizione').''.tr('Quantità').''.tr('Prezzo unitario').''.tr('Articolo associato').'
'.$key.''.$riga['Descrizione'].''.$riga['Quantita'].' '.$riga['UnitaMisura'].''.$riga['PrezzoUnitario'].' + {[ "type": "select", "name": "articoli['.$key.']", "ajax-source": "articoli" ]} +
'; +} else { + echo ' +

Non ci sono righe nella fattura.

'; +} + + +echo ' +
+
+ +
+
+
'; + +echo ' +'; diff --git a/plugins/importPA/src/FatturaElettronica.php b/plugins/importPA/src/FatturaElettronica.php new file mode 100644 index 000000000..e8f1eeb8f --- /dev/null +++ b/plugins/importPA/src/FatturaElettronica.php @@ -0,0 +1,215 @@ +xml = $array; + } + + public function getFattura() + { + return $this->fattura; + } + + public function getHeader() + { + return $this->xml['FatturaElettronicaHeader']; + } + + public function getBody() + { + return $this->xml['FatturaElettronicaBody']; + } + + public static function createAnagrafica($xml, $type = 'Fornitore') + { + $database = database(); + + $where = []; + + $partita_iva = $xml['DatiAnagrafici']['IdFiscaleIVA']['IdCodice']; + if (!empty($partita_iva)) { + $where[] = '`piva` = '.prepare($partita_iva); + } + + $codice_fiscale = $xml['DatiAnagrafici']['CodiceFiscale']; + if (!empty($codice_fiscale)) { + $where[] = '`codice_fiscale` = '.prepare($codice_fiscale); + } + + $id_anagrafica = $database->fetchOne('SELECT `an_anagrafiche`.`idanagrafica` FROM `an_anagrafiche` + INNER JOIN `an_tipianagrafiche_anagrafiche` ON `an_anagrafiche`.`idanagrafica` = `an_tipianagrafiche_anagrafiche`.`idanagrafica` + INNER JOIN `an_tipianagrafiche` ON `an_tipianagrafiche`.`idtipoanagrafica` = `an_tipianagrafiche_anagrafiche`.`idtipoanagrafica` + WHERE `an_tipianagrafiche`.`descrizione` = '.prepare($type).' AND ('.implode(' OR ', $where).')')['idanagrafica']; + if (!empty($id_anagrafica)) { + return $id_anagrafica; + } + + $ragione_sociale = $xml['DatiAnagrafici']['Anagrafica']['Denominazione'] ?: $xml['DatiAnagrafici']['Anagrafica']['Nome'].' '.$xml['DatiAnagrafici']['Anagrafica']['Cognome']; + $anagrafica = Anagrafica::create([ + 'ragione_sociale' => $ragione_sociale, + 'tipologie' => [ + TipoAnagrafica::where('descrizione', 'Fornitore')->first()->id + ], + ]); + + // Informazioni sull'anagrafica + $REA = $xml['IscrizioneREA']; + if (!empty($REA)) { + $anagrafica->codicerea = $REA['Ufficio'].'-'.$REA['NumeroREA']; + + if (!empty($REA['CapitaleSociale'])) { + $anagrafica->capitale_sociale = $REA['CapitaleSociale']; + } + } + + $anagrafica->save(); + + // Informazioni sulla sede + $info = $xml['Sede']; + $sede = $anagrafica->sedeLegale(); + + if (!empty($partita_iva)) { + $sede->partita_iva = $partita_iva; + } + + if (!empty($codice_fiscale)) { + $sede->codice_fiscale = $codice_fiscale; + } + + $sede->indirizzo = $info['Indirizzo']; + $sede->cap = $info['CAP']; + $sede->citta = $info['Comune']; + $sede->indirizzo = $info['Indirizzo']; + $sede->nazione()->associate(Nazione::where('iso2', $info['Nazione'])->first()); + if (!empty($info['Provincia'])) { + $sede->provincia = $info['Provincia']; + } + + $contatti = $xml['Contatti']; + if (!empty($contatti)) { + if (!empty($contatti['Telefono'])) { + $sede->telefono = $contatti['Telefono']; + } + + if (!empty($contatti['Fax'])) { + $sede->fax = $contatti['Fax']; + } + + if (!empty($contatti['email'])) { + $sede->email = $contatti['email']; + } + } + $sede->save(); + + return $anagrafica->id; + } + + public function saveRighe($articoli) + { + $righe = $this->getRighe(); + } + + public function getRighe() + { + return $this->getBody()['DatiBeniServizi']['DettaglioLinee']; + } + + public static function existsFattura($id_anagrafica, $data, $numero, $id_tipo) + { + return database()->fetchOne('SELECT `id` FROM `co_documenti` WHERE idanagrafica = '.prepare($id_anagrafica) .' AND idtipodocumento = '.prepare($id_tipo).' AND data = '.prepare($data).' AND numero = '.prepare($numero)); + } + + public function saveAllegati($directory) + { + $allegati = $this->getBody()['Allegati']; + + if (!isset($allegati[0])) { + $allegati = [$allegati]; + } + + foreach ($allegati as $allegato) { + $content = base64_decode($allegato['Attachment']); + $filename = $directory.'/'.$allegato['NomeAttachment'].'.'.strtolower($allegato['FormatoAttachment']); + + file_put_contents($filename, $content); + + Uploads::register([ + 'original' => $allegato['NomeAttachment'], + 'category' => tr('Fattura elettronica'), + 'id_module' => Modules::get('Fatture di acquisto')['id'], + 'id_record' => $this->fattura->id, + ]); + } + } + + /** + * Registra la fattura elettronica come fattura del gestionale. + * + * @param int $id_segment + * @return int + */ + public function saveFattura($id_segment) + { + $id_anagrafica = static::createAnagrafica($this->getHeader()['CedentePrestatore']); + + $dati_generali = $this->getBody()['DatiGenerali']['DatiGeneraliDocumento']; + $data = $dati_generali['Data']; + $numero = $dati_generali['Numero']; + + $tipo = empty($this->getBody()['DatiGenerali']['DatiTrasporto']) ? TipoFattura::where('descrizione', 'Fattura immediata di acquisto') : TipoFattura::where('descrizione', 'Fattura accompagnatoria di acquisto'); + $id_tipo = $tipo->first()->id; + + $result = self::existsFattura($id_anagrafica, $data, $numero, $id_tipo); + // Fattura già inserita + if (!empty($result)) { + $this->fattura = Fattura::find($result['id']); + + return $result['id']; + } + + $fattura = Fattura::create([ + 'idanagrafica' => $id_anagrafica, + 'data' => $data, + 'id_segment' => $id_segment, + 'tipo' => $id_tipo, + ]); + + $fattura->numero = $numero; + + $stato_documento = StatoFattura::where('descrizione', 'Emessa')->first(); + $fattura->stato()->associate($stato_documento); + $fattura->save(); + + $this->fattura = $fattura; + + return $fattura->id; + } +} diff --git a/src/Backup.php b/src/Backup.php index a26876cf6..d6bbd490a 100644 --- a/src/Backup.php +++ b/src/Backup.php @@ -238,15 +238,19 @@ class Backup // Rimozione del database $tables = include DOCROOT.'/update/tables.php'; - $database->query('SET foreign_key_checks = 0'); - foreach ($tables as $tables) { - $database->query('DROP TABLE `'.$tables.'`'); - } - $database->query('DROP TABLE `updates`'); - // Ripristino del database - $database->multiQuery($extraction_dir.'/database.sql'); - $database->query('SET foreign_key_checks = 1'); + $database_file = $extraction_dir.'/database.sql'; + if (file_exists($database_file)) { + $database->query('SET foreign_key_checks = 0'); + foreach ($tables as $tables) { + $database->query('DROP TABLE `'.$tables.'`'); + } + $database->query('DROP TABLE `updates`'); + + // Ripristino del database + $database->multiQuery($database_file); + $database->query('SET foreign_key_checks = 1'); + } // Salva il file di configurazione $config = file_get_contents(DOCROOT.'/config.inc.php'); diff --git a/src/Uploads.php b/src/Uploads.php index ccedc3925..a1589f6b8 100644 --- a/src/Uploads.php +++ b/src/Uploads.php @@ -272,7 +272,7 @@ class Uploads */ public static function updateFake($fake_id, $id_record) { - $database->update('zz_files', [ + database()->update('zz_files', [ 'id_record' => $id_record, ], [ 'id_record' => $fake_id, diff --git a/tests/unit/FatturaTest.php b/tests/unit/FatturaTest.php index 7583675e1..385fbfe69 100644 --- a/tests/unit/FatturaTest.php +++ b/tests/unit/FatturaTest.php @@ -10,7 +10,7 @@ class FatturaTest extends \Codeception\Test\Unit 'idanagrafica' => 1, 'data' => $data, 'id_segment' => 1, - 'idtipodocumento' => 2, + 'tipo' => 2, ]); $this->assertEquals($fattura->idanagrafica, 1); diff --git a/update/2_4_2.php b/update/2_4_2.php index 9c42702b3..d96c7bccd 100644 --- a/update/2_4_2.php +++ b/update/2_4_2.php @@ -648,6 +648,12 @@ foreach ($movimenti as $movimento) { $dbo->query("UPDATE mg_movimenti SET data = created_at WHERE data = '0000-00-00'"); +// Fix Partite IVA +foreach ($it as $key => $value) { + $dbo->query("UPDATE `an_anagrafiche` SET `piva` = SUBSTRING(`piva`, 2) WHERE `piva` LIKE '".$key."%'"); +} + + // File e cartelle deprecate $files = [ 'docs', diff --git a/update/2_4_2.sql b/update/2_4_2.sql index 63c1a15ba..4ca3332a8 100644 --- a/update/2_4_2.sql +++ b/update/2_4_2.sql @@ -370,7 +370,9 @@ INSERT INTO `zz_settings` (`idimpostazione`, `nome`, `valore`, `tipo`, `editable ALTER TABLE `an_anagrafiche` ADD `codice_destinatario` varchar(7); -- Plugin Fatturazione Elettronica -INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `directory`, `options`) VALUES (NULL, 'Fatturazione Elettronica', 'Fatturazione Elettronica', (SELECT `id` FROM `zz_modules` WHERE `name`='Fatture di vendita'), (SELECT `id` FROM `zz_modules` WHERE `name`='Fatture di vendita'), 'tab', 'fatturazione', 'custom'); +INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `directory`, `options`) VALUES +(NULL, 'Fatturazione Elettronica', 'Fatturazione Elettronica', (SELECT `id` FROM `zz_modules` WHERE `name`='Fatture di vendita'), (SELECT `id` FROM `zz_modules` WHERE `name`='Fatture di vendita'), 'tab', 'exportPA', 'custom'), +(NULL, 'Fatturazione Elettronica', 'Fatturazione Elettronica', (SELECT `id` FROM `zz_modules` WHERE `name`='Fatture di vendita'), (SELECT `id` FROM `zz_modules` WHERE `name`='Fatture di acquisto'), 'tab_main', 'importPA', 'custom'); --INSERT INTO `zz_emails` (`id`, `id_module`, `id_smtp`, `name`, `icon`, `subject`, `reply_to`, `cc`, `bcc`, `body`, `read_notify`, `main`) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Fatture di vendita'), 1, 'Fattura Elettronica', 'fa fa-file', 'Invio fattura numero {numero} del {data}', '', 'sdi01@pec.fatturapa.it', '', '

Gentile Cliente,

\r\n

inviamo in allegato la fattura numero {numero} del {data}.

\r\n

 

\r\n

Distinti saluti

\r\n', '0', '0'); --INSERT INTO `zz_email_print` (`id`, `id_email`, `id_print`) VALUES (NULL, (SELECT `id` FROM `zz_emails` WHERE `name` = 'Fattura Elettronica' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Fatture di vendita')), (SELECT `id` FROM `zz_prints` WHERE `name` = 'Fattura di vendita')); @@ -477,3 +479,6 @@ INSERT INTO `zz_email_print` (`id`, `id_email`, `id_print`) VALUES UPDATE `zz_emails` SET `main` = 1 WHERE `name` = 'Rapportino intervento' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi'); UPDATE `in_statiintervento` SET `id_email` = (SELECT `id` FROM `zz_emails` WHERE `name` = 'Stato intervento' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi')); + +-- Correzione partite ive e codici fiscali +UPDATE `an_anagrafiche` SET `piva` = REPLACE(`piva`, ' ', ''), `codice_fiscale` = REPLACE(`codice_fiscale`, ' ', '');