From c82165e6faeac2db746da316520b3f1f1ddb08f3 Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Fri, 27 Nov 2020 15:10:27 +0100 Subject: [PATCH] Correzionu sull'esportazione CSV da azioni di gruppo --- include/top.php | 11 +- lib/util.php | 30 +++++ modules/aggiornamenti/edit.php | 1 - modules/anagrafiche/bulk.php | 34 +++--- modules/anagrafiche/src/Export/CSV.php | 2 +- modules/articoli/bulk.php | 1 - modules/fatture/bulk.php | 149 +++++++++++------------- modules/fatture/src/Export/CSV.php | 11 +- modules/impianti/bulk.php | 33 +++--- modules/stato_servizi/src/SpaceHook.php | 22 ++-- plugins/exportFE/src/Interaction.php | 2 +- src/Exporter/CSVExporter.php | 13 ++- 12 files changed, 151 insertions(+), 158 deletions(-) diff --git a/include/top.php b/include/top.php index 7ff8a20d9..bf7be0fd3 100755 --- a/include/top.php +++ b/include/top.php @@ -17,8 +17,8 @@ * along with this program. If not, see . */ -use Util\FileSystem; use Models\Cache; +use Util\FileSystem; include_once __DIR__.'/../core.php'; @@ -577,14 +577,13 @@ if (!Auth::check() && (!empty($messages['info']) || !empty($messages['warning']) //Se la mia installazione supera una data dimensione visualizzo un messaggio $osm_size = Cache::pool('Spazio utilizzato')->content; -if (!empty(setting('Soft quota')) && !empty($osm_size)){ - +if (!empty(setting('Soft quota')) && !empty($osm_size)) { // Controllo lo spazio disponibile //$osm_size = disk_free_space('.'); //$osm_size = FileSystem::folderSize(base_dir(), ['htaccess']); $soft_quota = setting('Soft quota'); //MB - $space_limit = ($soft_quota / 100)*95; //MB + $space_limit = ($soft_quota / 100) * 95; //MB if ($osm_size > ($space_limit * 1048576)) { echo ' @@ -594,10 +593,10 @@ if (!empty(setting('Soft quota')) && !empty($osm_size)){

'.tr('Lo spazio a disposizione del gestionale è in esaurimento: il gestionale occupa _TOT_ dei _SOFTQUOTA_ previsti', [ '_TOT_' => FileSystem::formatBytes($osm_size), - '_SOFTQUOTA_' => FileSystem::formatBytes($soft_quota * 1048576), + '_SOFTQUOTA_' => FileSystem::formatBytes($soft_quota * 1048576), ]).'.

'.tr('Questo può risultare un serio problema per la continuità di funzionamento del software, poichè le operazioni più espansive riguardanti lo spazio di archiviazione possono provocare malfunzionamento imprevedibili').'. '.tr('Operazioni di backup, caricamento di allegati o anche il semplice utilizzo del gestionale possono rendere i dati inaffidabili, provocando pertanto una perdita irreversibile delle informazioni salvate').'.

'.tr("Contatta gli amministratori di sistema oppure l'assistenza tecnica per risolvere il problema").'.

'; } -} \ No newline at end of file +} diff --git a/lib/util.php b/lib/util.php index 1b755adcf..c7ab7fa0e 100755 --- a/lib/util.php +++ b/lib/util.php @@ -528,3 +528,33 @@ if (!function_exists('readSQLFile')) { return $queryLine; } } + +if (!function_exists('temp_file')) { + /** + * Crea un file temporaneo e lo imposta per la rimozione alla fine dell'esecuzione. + * + * @param $name + * @param $content + * + * @return string + */ + function temp_file($name = null, $content = null) + { + if (empty($name)) { + $name = secure_random_string(); + } + + $file = DIRECTORY_SEPARATOR. + trim(sys_get_temp_dir(), DIRECTORY_SEPARATOR). + DIRECTORY_SEPARATOR. + ltrim($name, DIRECTORY_SEPARATOR); + + file_put_contents($file, $content); + + register_shutdown_function(function () use ($file) { + unlink($file); + }); + + return $file; + } +} diff --git a/modules/aggiornamenti/edit.php b/modules/aggiornamenti/edit.php index 01d10cf26..7be0106f6 100755 --- a/modules/aggiornamenti/edit.php +++ b/modules/aggiornamenti/edit.php @@ -91,7 +91,6 @@ if (!function_exists('base_dir')) { } } - // Aggiornamenti if (setting('Attiva aggiornamenti')) { $alerts = []; diff --git a/modules/anagrafiche/bulk.php b/modules/anagrafiche/bulk.php index 28d04c5d7..c87d18f7a 100755 --- a/modules/anagrafiche/bulk.php +++ b/modules/anagrafiche/bulk.php @@ -20,6 +20,7 @@ use Geocoder\Provider\GoogleMaps; use Ivory\HttpAdapter\CurlHttpAdapter; use Modules\Anagrafiche\Anagrafica; +use Modules\Anagrafiche\Export\CSV; include_once __DIR__.'/../../core.php'; $google = setting('Google Maps API key'); @@ -64,26 +65,18 @@ switch (post('op')) { break; + case 'export-csv': + $file = temp_file(); + $exporter = new CSV($file); - case 'download-csv': - - $dir = base_dir().'/files/export_anagrafiche/'; - directory($dir.'tmp/'); - $file = secure_random_string().'.csv'; - $dir_csv = slashes($dir.'tmp/'.$file); - - $filename = 'anagrafiche.csv'; - - $t = new Modules\Anagrafiche\Export\CSV($dir_csv); - - if($t->exportRecords()){ - - download($dir_csv, $filename); - delete($dir.'tmp/'); - } - + // Esportazione dei record selezionati + $anagrafiche = Anagrafica::whereIn('id', $id_records)->get(); + $exporter->setRecords($anagrafiche); + + $count = $exporter->exportRecords(); + + download($file, 'anagrafiche.csv'); break; - } $operations = []; @@ -98,8 +91,8 @@ if (App::debug()) { ], ]; - $operations['download-csv'] = [ - 'text' => ' '.tr('Esporta tutto').' beta', + $operations['export-csv'] = [ + 'text' => ' '.tr('Esporta selezionati').' beta', 'data' => [ 'msg' => tr('Vuoi davvero esportare un CSV con tutte le anagrafiche?'), 'button' => tr('Procedi'), @@ -107,7 +100,6 @@ if (App::debug()) { 'blank' => true, ], ]; - } if (App::debug() && $google) { diff --git a/modules/anagrafiche/src/Export/CSV.php b/modules/anagrafiche/src/Export/CSV.php index 3a4d403d8..d5ab66155 100644 --- a/modules/anagrafiche/src/Export/CSV.php +++ b/modules/anagrafiche/src/Export/CSV.php @@ -114,7 +114,7 @@ class CSV extends CSVExporter 'label' => 'Note', ], [ - 'field' => 'id_nazione', + 'field' => 'nazione.nome', 'label' => 'Nazione', ], [ diff --git a/modules/articoli/bulk.php b/modules/articoli/bulk.php index dc860a912..0c145def4 100644 --- a/modules/articoli/bulk.php +++ b/modules/articoli/bulk.php @@ -36,7 +36,6 @@ switch (post('op')) { break; case 'delete-bulk': - foreach ($id_records as $id) { $elementi = $dbo->fetchArray('SELECT `co_documenti`.`id`, `co_documenti`.`data`, `co_documenti`.`numero`, `co_documenti`.`numero_esterno`, `co_tipidocumento`.`descrizione` AS tipo_documento, `co_tipidocumento`.`dir` FROM `co_documenti` JOIN `co_tipidocumento` ON `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento` WHERE `co_documenti`.`id` IN (SELECT `iddocumento` FROM `co_righe_documenti` WHERE `idarticolo` = '.prepare($id).') diff --git a/modules/fatture/bulk.php b/modules/fatture/bulk.php index 944eb3dfd..6b5570692 100755 --- a/modules/fatture/bulk.php +++ b/modules/fatture/bulk.php @@ -19,11 +19,12 @@ include_once __DIR__.'/../../core.php'; +use Modules\Fatture\Export\CSV; use Modules\Fatture\Fattura; use Modules\Fatture\Stato; use Plugins\ExportFE\FatturaElettronica; -use Util\XML; use Plugins\ExportFE\Interaction; +use Util\XML; use Util\Zip; switch (post('op')) { @@ -275,13 +276,12 @@ switch (post('op')) { ])); break; - + case 'check-bulk': $list = []; $anomalie = collect(); foreach ($id_records as $id) { - $fattura_vendita = Fattura::vendita() ->whereNotIn('codice_stato_fe', ['ERR', 'NS', 'EC02', 'ERVAL']) ->where('data', '>=', $_SESSION['period_start']) @@ -289,175 +289,158 @@ switch (post('op')) { ->where('id', '=', $id) ->orderBy('data') ->get(); - - $fattura_vendita = $fattura_vendita[0]; - - if (!empty($fattura_vendita)){ - try { + $fattura_vendita = $fattura_vendita[0]; + + if (!empty($fattura_vendita)) { + try { $xml = XML::read($fattura_vendita->getXML()); - + $totale_documento_xml = null; // Totale basato sul campo ImportoTotaleDocumento $dati_generali = $xml['FatturaElettronicaBody']['DatiGenerali']['DatiGeneraliDocumento']; if (isset($dati_generali['ImportoTotaleDocumento'])) { $totale_documento_indicato = abs(floatval($dati_generali['ImportoTotaleDocumento'])); - + // Calcolo del totale basato sui DatiRiepilogo if (empty($totale_documento_xml) && empty($dati_generali['ScontoMaggiorazione'])) { $totale_documento_xml = 0; - + $riepiloghi = $xml['FatturaElettronicaBody']['DatiBeniServizi']['DatiRiepilogo']; if (!empty($riepiloghi) && !isset($riepiloghi[0])) { $riepiloghi = [$riepiloghi]; } - + foreach ($riepiloghi as $riepilogo) { $totale_documento_xml = sum([$totale_documento_xml, $riepilogo['ImponibileImporto'], $riepilogo['Imposta']]); } - + $totale_documento_xml = abs($totale_documento_xml); } else { $totale_documento_xml = $totale_documento_indicato; } - $totale_documento_xml = $fattura_vendita->isNota() ? -$totale_documento_xml : $totale_documento_xml; + $totale_documento_xml = $fattura_vendita->isNota() ? -$totale_documento_xml : $totale_documento_xml; } - + // Se riscontro un'anomalia - if ( $fattura_vendita->anagrafica->piva != $xml['FatturaElettronicaHeader']['CessionarioCommittente']['DatiAnagrafici']['IdFiscaleIVA']['IdCodice'] || $fattura_vendita->anagrafica->codice_fiscale != $xml['FatturaElettronicaHeader']['CessionarioCommittente']['DatiAnagrafici']['CodiceFiscale'] || $fattura_vendita->totale != $totale_documento_xml ){ - + if ($fattura_vendita->anagrafica->piva != $xml['FatturaElettronicaHeader']['CessionarioCommittente']['DatiAnagrafici']['IdFiscaleIVA']['IdCodice'] || $fattura_vendita->anagrafica->codice_fiscale != $xml['FatturaElettronicaHeader']['CessionarioCommittente']['DatiAnagrafici']['CodiceFiscale'] || $fattura_vendita->totale != $totale_documento_xml) { /*echo json_encode([ 'totale_documento_xml' => $totale_documento_xml, 'totale_documento' => $totale_documento, ]);*/ - + $anomalie->push([ 'fattura_vendita' => $fattura_vendita, 'codice_fiscale_xml' => !empty($xml['FatturaElettronicaHeader']['CessionarioCommittente']['DatiAnagrafici']['CodiceFiscale']) ? $xml['FatturaElettronicaHeader']['CessionarioCommittente']['DatiAnagrafici']['CodiceFiscale'] : null, 'codice_fiscale' => $fattura_vendita->anagrafica->codice_fiscale, 'piva_xml' => !empty($xml['FatturaElettronicaHeader']['CessionarioCommittente']['DatiAnagrafici']['IdFiscaleIVA']['IdCodice']) ? $xml['FatturaElettronicaHeader']['CessionarioCommittente']['DatiAnagrafici']['IdFiscaleIVA']['IdCodice'] : null, 'piva' => $fattura_vendita->anagrafica->piva, - 'totale_documento_xml' => moneyFormat($totale_documento_xml,2), - 'totale_documento' => moneyFormat($fattura_vendita->totale,2), + 'totale_documento_xml' => moneyFormat($totale_documento_xml, 2), + 'totale_documento' => moneyFormat($fattura_vendita->totale, 2), 'have_xml' => 1, - ]); - } - + } } catch (Exception $e) { - $anomalie->push([ 'fattura_vendita' => $fattura_vendita, 'have_xml' => 0, ]); - } - + array_push($list, $fattura_vendita->numero_esterno); } } // Messaggi di risposta - if (empty($list)){ - + if (empty($list)) { flash()->warning(tr('Nessuna fattura utile per il controllo!')); - - }else{ - + } else { flash()->info(tr('Fatture _LIST_ controllate.', [ '_LIST_' => implode(',', $list), ])); // Se ci sono anomalie - if ($anomalie->count()>0) { - - function diff($old, $new){ - $matrix = array(); + if ($anomalie->count() > 0) { + function diff($old, $new) + { + $matrix = []; $maxlen = 0; - foreach($old as $oindex => $ovalue){ + foreach ($old as $oindex => $ovalue) { $nkeys = array_keys($new, $ovalue); - foreach($nkeys as $nindex){ + foreach ($nkeys as $nindex) { $matrix[$oindex][$nindex] = isset($matrix[$oindex - 1][$nindex - 1]) ? $matrix[$oindex - 1][$nindex - 1] + 1 : 1; - if($matrix[$oindex][$nindex] > $maxlen){ + if ($matrix[$oindex][$nindex] > $maxlen) { $maxlen = $matrix[$oindex][$nindex]; $omax = $oindex + 1 - $maxlen; $nmax = $nindex + 1 - $maxlen; } - } + } } - if($maxlen == 0) return array(array('d'=>$old, 'i'=>$new)); + if ($maxlen == 0) { + return [['d' => $old, 'i' => $new]]; + } + return array_merge( diff(array_slice($old, 0, $omax), array_slice($new, 0, $nmax)), array_slice($new, $nmax, $maxlen), diff(array_slice($old, $omax + $maxlen), array_slice($new, $nmax + $maxlen))); } - - function htmlDiff($old, $new){ + + function htmlDiff($old, $new) + { $ret = ''; $diff = diff(preg_split("/[\s]+/", $old), preg_split("/[\s]+/", $new)); - foreach($diff as $k){ - if(is_array($k)) - $ret .= (!empty($k['d'])?"".implode(' ',$k['d'])." ":''). - (!empty($k['i'])?"".implode(' ',$k['i'])." ":''); - else $ret .= $k . ' '; + foreach ($diff as $k) { + if (is_array($k)) { + $ret .= (!empty($k['d']) ? ''.implode(' ', $k['d']).' ' : ''). + (!empty($k['i']) ? ''.implode(' ', $k['i']).' ' : ''); + } else { + $ret .= $k.' '; + } } + return $ret; } - $riepilogo_anomalie .= tr('Attenzione: Trovate _NUM_ anomalie! Le seguenti fatture non trovano corrispondenza tra XML e dati nel documento:', [ '_NUM_' => $anomalie->count() ]).'

'; - - - foreach ($anomalie as $anomalia) { - - $riepilogo_anomalie .= '