From 500bd7cade96944a36fc8e7df5246cf0345f5d3c Mon Sep 17 00:00:00 2001 From: Luca Date: Fri, 1 Feb 2019 17:55:28 +0100 Subject: [PATCH 1/5] Terminata gestione xml con Terzo intermediario --- lib/functions.php | 2 +- modules/statistiche/edit.php | 18 +++++++-- plugins/exportFE/src/FatturaElettronica.php | 43 ++++++++++++++------- update/2_4_6.sql | 3 ++ 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/lib/functions.php b/lib/functions.php index 32d9f5213..69c4b3384 100644 --- a/lib/functions.php +++ b/lib/functions.php @@ -410,6 +410,6 @@ function operationLog($operation, array $ids = [], array $options = []) * * @return string */ -function clean($string, $permitted) { +function clean($string, $permitted = '') { return preg_replace('/[^A-Za-z0-9'.$permitted.']/', '', $string); // Removes special chars. } diff --git a/modules/statistiche/edit.php b/modules/statistiche/edit.php index b5e44f054..38c386dc7 100644 --- a/modules/statistiche/edit.php +++ b/modules/statistiche/edit.php @@ -38,8 +38,8 @@ $d1 = new DateTime($start); $d2 = new DateTime($end); $count = $d1->diff($d2)->m + ($d1->diff($d2)->y * 12) + 1; -$fatturato = $dbo->fetchArray("SELECT SUM(co_righe_documenti.subtotale - co_righe_documenti.sconto) AS totale, YEAR(co_documenti.data) AS year, MONTH(co_documenti.data) AS month FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id WHERE co_tipidocumento.dir='entrata' AND co_tipidocumento.descrizione!='Bozza' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY YEAR(co_documenti.data), MONTH(co_documenti.data) ORDER BY YEAR(co_documenti.data) ASC, MONTH(co_documenti.data) ASC'); -$acquisti = $dbo->fetchArray("SELECT SUM(co_righe_documenti.subtotale - co_righe_documenti.sconto) AS totale, YEAR(co_documenti.data) AS year, MONTH(co_documenti.data) AS month FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id WHERE co_tipidocumento.dir='uscita' AND co_tipidocumento.descrizione!='Bozza' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY YEAR(co_documenti.data), MONTH(co_documenti.data) ORDER BY YEAR(co_documenti.data) ASC, MONTH(co_documenti.data) ASC'); +$fatturato = $dbo->fetchArray("SELECT ROUND(SUM(co_righe_documenti.subtotale - co_righe_documenti.sconto), 2) AS totale, YEAR(co_documenti.data) AS year, MONTH(co_documenti.data) AS month FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id WHERE co_tipidocumento.dir='entrata' AND co_tipidocumento.descrizione!='Bozza' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY YEAR(co_documenti.data), MONTH(co_documenti.data) ORDER BY YEAR(co_documenti.data) ASC, MONTH(co_documenti.data) ASC'); +$acquisti = $dbo->fetchArray("SELECT ROUND(SUM(co_righe_documenti.subtotale - co_righe_documenti.sconto), 2) AS totale, YEAR(co_documenti.data) AS year, MONTH(co_documenti.data) AS month FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id WHERE co_tipidocumento.dir='uscita' AND co_tipidocumento.descrizione!='Bozza' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY YEAR(co_documenti.data), MONTH(co_documenti.data) ORDER BY YEAR(co_documenti.data) ASC, MONTH(co_documenti.data) ASC'); $month = intval($d1->format('m')) - 1; for ($i = 0; $i < $count; ++$i) { @@ -85,14 +85,14 @@ $(document).ready(function() { labels: months, datasets: [ { - label: "'.tr('Fatturato').'", + label: "'.tr('Fatturato (iva esclusa)').'", backgroundColor: "#63E360", data: [ '.implode(',', array_column($fatturato, 'totale')).' ] }, { - label: "'.tr('Acquisti').'", + label: "'.tr('Acquisti (iva esclusa)').'", backgroundColor: "#EE4B4B", data: [ '.implode(',', array_column($acquisti, 'totale')).' @@ -105,6 +105,16 @@ $(document).ready(function() { legend: { position: "bottom", }, + scales: { + yAxes: [{ + ticks: { + // Include a dollar sign in the ticks + callback: function(value, index, values) { + return \'€ \' + value; + } + } + }] + }, } }); }); diff --git a/plugins/exportFE/src/FatturaElettronica.php b/plugins/exportFE/src/FatturaElettronica.php index 03a66a3a6..f6c57fdc9 100644 --- a/plugins/exportFE/src/FatturaElettronica.php +++ b/plugins/exportFE/src/FatturaElettronica.php @@ -286,8 +286,13 @@ class FatturaElettronica */ public function getFilename($new = false) { - $azienda = static::getAzienda(); - $prefix = 'IT'.(!empty($azienda['codice_fiscale']) ? $azienda['codice_fiscale'] : $azienda['piva']); + + if (!empty(setting('Terzo intermediario'))) + $anagrafica = Anagrafica::find(setting('Terzo intermediario')); + else + $anagrafica = static::getAzienda(); + + $prefix = 'IT'.(!empty($anagrafica['codice_fiscale']) ? $anagrafica['codice_fiscale'] : $anagrafica['piva']); if (empty($this->documento['progressivo_invio']) || !empty($new)) { $database = database(); @@ -354,9 +359,14 @@ class FatturaElettronica * @return array */ protected static function getDatiTrasmissione($fattura) - { - $azienda = static::getAzienda(); - $documento = $fattura->getDocumento(); + { + // Se in impostazioni ho definito un terzo intermediario (es. Aruba, Teamsystem) + if (!empty(setting('Terzo intermediario'))) + $anagrafica = Anagrafica::find(setting('Terzo intermediario')); + else + $anagrafica = static::getAzienda(); + + $documento = $fattura->getDocumento(); $cliente = $fattura->getCliente(); $sede = database()->fetchOne('SELECT `codice_destinatario` FROM `an_sedi` WHERE `id` = '.prepare($documento['idsede'])); @@ -372,25 +382,28 @@ class FatturaElettronica $default_code = ($cliente->nazione->iso2 != 'IT') ? 'XXXXXXX' : $default_code; // Generazione dell'header - // Se all'Anagrafe Tributaria il trasmittente è censito con il codice fiscale - $result = [ - 'IdTrasmittente' => [ - 'IdPaese' => $azienda->nazione->iso2, - 'IdCodice' => (!empty($azienda['codice_fiscale'])) ? $azienda['codice_fiscale'] : $azienda['piva'], - ], + // Se all'Anagrafe Tributaria il trasmittente è censito con il codice fiscale, es. ditte individuali + $result = [ + 'IdTrasmittente' => [ + 'IdPaese' => $anagrafica->nazione->iso2, + 'IdCodice' => (!empty($anagrafica['codice_fiscale'])) ? $anagrafica['codice_fiscale'] : $anagrafica['piva'], + ] + ]; + + $result[] = [ 'ProgressivoInvio' => $documento['progressivo_invio'], 'FormatoTrasmissione' => ($cliente['tipo'] == 'Ente pubblico') ? 'FPA12' : 'FPR12', 'CodiceDestinatario' => !empty($cliente['codice_destinatario']) ? $cliente['codice_destinatario'] : $default_code, ]; // Telefono di contatto - if (!empty($azienda['telefono'])) { - $result['ContattiTrasmittente']['Telefono'] = $azienda['telefono']; + if (!empty($anagrafica['telefono'])) { + $result['ContattiTrasmittente']['Telefono'] = $anagrafica['telefono']; } // Email di contatto - if (!empty($azienda['email'])) { - $result['ContattiTrasmittente']['Email'] = $azienda['email']; + if (!empty($anagrafica['email'])) { + $result['ContattiTrasmittente']['Email'] = $anagrafica['email']; } // Inizializzazione PEC solo se anagrafica azienda e codice destinatario non compilato, per privato e PA la PEC non serve diff --git a/update/2_4_6.sql b/update/2_4_6.sql index 9838eaa38..ab827d49b 100644 --- a/update/2_4_6.sql +++ b/update/2_4_6.sql @@ -77,3 +77,6 @@ CREATE TABLE IF NOT EXISTS `co_ritenuta_contributi` ( UPDATE `zz_views` SET `query` = '(SELECT GROUP_CONCAT(DISTINCT `name` SEPARATOR \'\r\n \') FROM zz_operations INNER JOIN zz_emails ON zz_operations.id_email = zz_emails.id WHERE zz_operations.id_module = (SELECT id FROM zz_modules WHERE `name` = \'Fatture di vendita\') AND op = \'send-email\' AND id_record = co_documenti.id ORDER BY zz_operations.created_at DESC LIMIT 1)' WHERE `zz_views`.`name` = 'icon_title_Inviata' AND id_module = (SELECT id FROM zz_modules WHERE name = 'Fatture di vendita'); UPDATE `zz_views` SET `query` = 'IF((SELECT GROUP_CONCAT(DISTINCT `name` SEPARATOR \'\r\n \') FROM zz_operations INNER JOIN zz_emails ON zz_operations.id_email = zz_emails.id WHERE zz_operations.id_module = (SELECT id FROM zz_modules WHERE `name` = \'Fatture di vendita\') AND op = \'send-email\' AND id_record = co_documenti.id ORDER BY zz_operations.created_at DESC LIMIT 1) IS NOT NULL, \'fa fa-envelope text-success\', \'\') ' WHERE `zz_views`.`name` = 'icon_Inviata' AND id_module = (SELECT id FROM zz_modules WHERE name = 'Fatture di vendita'); + +-- Limitato il controllo numeri fattura duplicati all'anno in corso +UPDATE `zz_views` SET `query` = 'IF((SELECT COUNT(t.numero_esterno) FROM co_documenti AS t WHERE t.numero_esterno = co_documenti.numero_esterno AND t.numero_esterno != '''' AND t.id_segment = co_documenti.id_segment AND idtipodocumento IN (SELECT id FROM co_tipidocumento WHERE dir = ''entrata'') AND t.data >= ''|period_start|'' AND t.data <= ''|period_end|'' AND YEAR(t.data) = YEAR(co_documenti.data) ) > 1, ''red'', '''') ' WHERE `zz_views`.`name` = '_bg_' AND id_module = (SELECT id FROM zz_modules WHERE name = 'Fatture di vendita'); From ce4f76013a64f661ba35ad19e307ca0db46384fd Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Fri, 1 Feb 2019 18:19:13 +0100 Subject: [PATCH 2/5] Rimozione descrizione_stato_fe Si devono utilizzare le descrizioni della tabella apposita. E' anche necessario utilizzare le funzioni corrette per la formattazione delle date. @lucasalva87 Ho sostituito i riferimenti manuali con la funzione generale *doc_references*. --- lib/common.php | 7 +- modules/fatture/src/Fattura.php | 5 + modules/fatture/src/StatoFE.php | 17 +++ modules/gestione_documentale/edit.php | 2 +- plugins/exportFE/actions.php | 1 - plugins/exportFE/edit.php | 42 +++--- plugins/exportFE/src/FatturaElettronica.php | 150 ++++++++------------ plugins/receiptFE/src/Ricevuta.php | 3 +- update/2_4_6.sql | 4 +- 9 files changed, 109 insertions(+), 122 deletions(-) create mode 100644 modules/fatture/src/StatoFE.php diff --git a/lib/common.php b/lib/common.php index b9322989a..6657713dc 100644 --- a/lib/common.php +++ b/lib/common.php @@ -191,8 +191,11 @@ function calcola_sconto($data) /** * Restistuisce le informazioni sull'eventuale riferimento ai documenti. * - * @param array $data - * @param string $dir + * @param $info + * @param $dir + * @param array $ignore + * + * @throws Exception * * @return array */ diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php index c1d9a68b5..140b271bd 100644 --- a/modules/fatture/src/Fattura.php +++ b/modules/fatture/src/Fattura.php @@ -201,6 +201,11 @@ class Fattura extends Document return $this->belongsTo(Stato::class, 'idstatodocumento'); } + public function statoFE() + { + return $this->belongsTo(StatoFE::class, 'codice_stato_fe'); + } + public function articoli() { return $this->hasMany(Components\Articolo::class, 'iddocumento'); diff --git a/modules/fatture/src/StatoFE.php b/modules/fatture/src/StatoFE.php new file mode 100644 index 000000000..4ce50b84c --- /dev/null +++ b/modules/fatture/src/StatoFE.php @@ -0,0 +1,17 @@ +hasMany(Fattura::class, 'codice_stato_fe'); + } +} diff --git a/modules/gestione_documentale/edit.php b/modules/gestione_documentale/edit.php index e2d26bb72..47cd30a53 100644 --- a/modules/gestione_documentale/edit.php +++ b/modules/gestione_documentale/edit.php @@ -28,7 +28,7 @@ include_once __DIR__.'/../../core.php';
- {[ "type": "text", "label": "Data", "name": "data", "required": 1, "class": "datepicker text-center", "value": "", "extra": "" ]} + {[ "type": "text", "label": "Data", "name": "data", "required": 1, "class": "datepicker text-center", "value": "", "extra": "" ]}
diff --git a/plugins/exportFE/actions.php b/plugins/exportFE/actions.php index d05be6761..c60e33d2e 100644 --- a/plugins/exportFE/actions.php +++ b/plugins/exportFE/actions.php @@ -31,7 +31,6 @@ switch (filter('op')) { if ($result) { database()->update('co_documenti', [ 'codice_stato_fe' => 'WAIT', - 'descrizione_stato_fe' => 'Fattura in elaborazione...', 'data_stato_fe' => date('Y-m-d H:i:s'), ], ['id' => $id_record]); } diff --git a/plugins/exportFE/edit.php b/plugins/exportFE/edit.php index f5dd3bf1c..d4b62b2ae 100644 --- a/plugins/exportFE/edit.php +++ b/plugins/exportFE/edit.php @@ -152,7 +152,7 @@ echo ' '; // Scelgo quando posso inviarla -$send = Interaction::isEnabled() && $generated && in_array( $record['codice_stato_fe'], array('GEN', 'ERVAL') ); +$send = Interaction::isEnabled() && $generated && in_array($record['codice_stato_fe'], ['GEN', 'ERVAL']); echo ' @@ -163,31 +163,25 @@ echo '

'; // Messaggio esito invio - -if ($send){ - if ($record['codice_stato_fe'] == '') { - - } elseif ($record['codice_stato_fe'] == 'GEN') { - echo ' -
'.tr('La fattura è stata generata ed è pronta per l\'invio.').'
+ if ($record['codice_stato_fe'] == 'GEN') { + echo ' +
'.tr("La fattura è stata generata ed è pronta per l'invio").'.
'; - } else { - $stato_fe = database()->fetchOne('SELECT codice, descrizione, icon FROM fe_stati_documento WHERE codice='.prepare($record['codice_stato_fe'])); - - if (in_array($stato_fe['codice'], array('EC01', 'RC'))) { - $class = 'success'; - } elseif (in_array($stato_fe['codice'], array('ERVAL', 'GEN', 'MC', 'WAIT'))) { - $class = 'warning'; - } else { - $class = 'danger'; - } - - echo ' -
'.$record['codice_stato_fe'].' - '.$record['descrizione_stato_fe'].'
'.date('d/m/Y H:i', strtotime($record['data_stato_fe'])).'
- '; - } -} + } else { + $stato_fe = database()->fetchOne('SELECT codice, descrizione, icon FROM fe_stati_documento WHERE codice='.prepare($record['codice_stato_fe'])); + if (in_array($stato_fe['codice'], ['EC01', 'RC'])) { + $class = 'success'; + } elseif (in_array($stato_fe['codice'], ['ERVAL', 'GEN', 'MC', 'WAIT'])) { + $class = 'warning'; + } else { + $class = 'danger'; + } + + echo ' +
'.$stato_fe['codice'].' - '.$stato_fe['descrizione'].'
'.Translator::timestampToLocale($record['data_stato_fe']).'
+ '; + } echo '