- {[ "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": "select", "label": "", "name": "id_nazione", "values": "query=SELECT id AS id, nome AS descrizione FROM an_nazioni ORDER BY nome ASC", "value": "$id_nazione$" ]}
+
+
+
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 '
+';
+
+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`, ' ', '');