Correzionu sull'esportazione CSV da azioni di gruppo

This commit is contained in:
Dasc3er 2020-11-27 15:10:27 +01:00
parent eff17804e5
commit c82165e6fa
12 changed files with 151 additions and 158 deletions

View File

@ -17,8 +17,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use Util\FileSystem;
use Models\Cache;
use Util\FileSystem;
include_once __DIR__.'/../core.php';
@ -578,7 +578,6 @@ if (!Auth::check() && (!empty($messages['info']) || !empty($messages['warning'])
$osm_size = Cache::pool('Spazio utilizzato')->content;
if (!empty(setting('Soft quota')) && !empty($osm_size)) {
// Controllo lo spazio disponibile
//$osm_size = disk_free_space('.');
//$osm_size = FileSystem::folderSize(base_dir(), ['htaccess']);

View File

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

View File

@ -91,7 +91,6 @@ if (!function_exists('base_dir')) {
}
}
// Aggiornamenti
if (setting('Attiva aggiornamenti')) {
$alerts = [];

View File

@ -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':
// Esportazione dei record selezionati
$anagrafiche = Anagrafica::whereIn('id', $id_records)->get();
$exporter->setRecords($anagrafiche);
$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/');
}
$count = $exporter->exportRecords();
download($file, 'anagrafiche.csv');
break;
}
$operations = [];
@ -98,8 +91,8 @@ if (App::debug()) {
],
];
$operations['download-csv'] = [
'text' => '<span><i class="fa fa-download"></i> '.tr('Esporta tutto').'</span> <span class="label label-danger" >beta</span>',
$operations['export-csv'] = [
'text' => '<span><i class="fa fa-download"></i> '.tr('Esporta selezionati').'</span> <span class="label label-danger" >beta</span>',
'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) {

View File

@ -114,7 +114,7 @@ class CSV extends CSVExporter
'label' => 'Note',
],
[
'field' => 'id_nazione',
'field' => 'nazione.nome',
'label' => 'Nazione',
],
[

View File

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

View File

@ -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')) {
@ -281,7 +282,6 @@ switch (post('op')) {
$anomalie = collect();
foreach ($id_records as $id) {
$fattura_vendita = Fattura::vendita()
->whereNotIn('codice_stato_fe', ['ERR', 'NS', 'EC02', 'ERVAL'])
->where('data', '>=', $_SESSION['period_start'])
@ -294,7 +294,6 @@ switch (post('op')) {
if (!empty($fattura_vendita)) {
try {
$xml = XML::read($fattura_vendita->getXML());
$totale_documento_xml = null;
@ -326,7 +325,6 @@ switch (post('op')) {
// 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) {
/*echo json_encode([
'totale_documento_xml' => $totale_documento_xml,
'totale_documento' => $totale_documento,
@ -341,17 +339,13 @@ switch (post('op')) {
'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);
@ -360,20 +354,17 @@ switch (post('op')) {
// Messaggi di risposta
if (empty($list)) {
flash()->warning(tr('Nessuna fattura utile per il controllo!'));
} else {
flash()->info(tr('Fatture _LIST_ controllate.', [
'_LIST_' => implode(',', $list),
]));
// Se ci sono anomalie
if ($anomalie->count() > 0) {
function diff($old, $new){
$matrix = array();
function diff($old, $new)
{
$matrix = [];
$maxlen = 0;
foreach ($old as $oindex => $ovalue) {
$nkeys = array_keys($new, $ovalue);
@ -387,77 +378,69 @@ switch (post('op')) {
}
}
}
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'])?"<del>".implode(' ',$k['d'])."</del> ":'').
(!empty($k['i'])?"<span>".implode(' ',$k['i'])."</span> ":'');
else $ret .= $k . ' ';
if (is_array($k)) {
$ret .= (!empty($k['d']) ? '<del>'.implode(' ', $k['d']).'</del> ' : '').
(!empty($k['i']) ? '<span>'.implode(' ', $k['i']).'</span> ' : '');
} 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()]).' </br></br>';
foreach ($anomalie as $anomalia) {
$riepilogo_anomalie .= '<ul><li>'.reference($anomalia['fattura_vendita'], $anomalia['fattura_vendita']->getReference()).'</li>';
if (!empty($anomalia['have_xml'])) {
$riepilogo_anomalie .= '<li><table class="table table-bordered table-condensed">
<tr><th>Sorgente</th><th>P. Iva</th><th>Cod. fiscale</th><th>Totale</th></tr>';
$riepilogo_anomalie .= '<tr><td>XML</td> <td>'.$anomalia['piva_xml'].'</td> <td>'.$anomalia['codice_fiscale_xml'].'</td> <td>'.$anomalia['totale_documento_xml'].'</td></tr>';
$riepilogo_anomalie .= '<tr><td>Gestionale</td> <td>'.htmlDiff($anomalia['piva_xml'], $anomalia['piva']).'</td> <td>'.htmlDiff($anomalia['codice_fiscale_xml'], $anomalia['codice_fiscale']).'</td> <td>'.htmlDiff($anomalia['totale_documento_xml'], $anomalia['totale_documento']).'</td></tr></table></li>';
} else {
$riepilogo_anomalie .= ' <li>'.tr('Impossibile verificare l\'XML di questa fattura.').'</li>';
}
$riepilogo_anomalie .= '</ul><br>';
}
flash()->warning($riepilogo_anomalie);
} else {
flash()->info(tr('Nessuna anomalia!'));
}
}
break;
case 'download-csv':
case 'export-csv':
$file = temp_file();
$exporter = new CSV($file);
$dir = base_dir().'/files/export_fatture/';
directory($dir.'tmp/');
$file = secure_random_string().'.csv';
$dir_csv = slashes($dir.'tmp/'.$file);
// Esportazione dei record selezionati
$fatture = Fattura::whereIn('id', $id_records)->get();
$exporter->setRecords($fatture);
$filename = 'fatture.csv';
$count = $exporter->exportRecords();
$t = new Modules\Fatture\Export\CSV($dir_csv);
if($t->exportRecords()){
download($dir_csv, $filename);
delete($dir.'tmp/');
}
download($file, 'fatture.csv');
break;
@ -479,8 +462,8 @@ if (App::debug()) {
'text' => '<span><i class="fa fa-trash"></i> '.tr('Elimina selezionati').'</span> <span class="label label-danger" >beta</span>',
];
$operations['download-csv'] = [
'text' => '<span><i class="fa fa-download"></i> '.tr('Esporta tutto').'</span> <span class="label label-danger" >beta</span>',
$operations['export-csv'] = [
'text' => '<span><i class="fa fa-download"></i> '.tr('Esporta selezionati').'</span> <span class="label label-danger" >beta</span>',
'data' => [
'msg' => tr('Vuoi davvero esportare un CSV con tutte le fatture?'),
'button' => tr('Procedi'),
@ -488,7 +471,6 @@ if (App::debug()) {
'blank' => true,
],
];
}
$operations['copy-bulk'] = [
@ -543,7 +525,6 @@ if ($module->name == 'Fatture di vendita') {
'blank' => true,
],
];
}
$operations['export-xml-bulk'] = [

View File

@ -46,7 +46,7 @@ class CSV extends CSVExporter
'label' => 'Data',
],
[
'field' => 'idanagrafica',
'field' => 'anagrafica.ragione_sociale',
'label' => 'Ragione sociale',
],
[
@ -54,7 +54,7 @@ class CSV extends CSVExporter
'label' => 'Totale',
],
[
'field' => 'idstatodocumento',
'field' => 'stato.descrizione',
'label' => 'Stato',
],
[
@ -66,11 +66,6 @@ class CSV extends CSVExporter
public function getRecords()
{
$id_module = filter('id_module');
$results = Fattura::all()->where('id_segment', $_SESSION['module_'.$id_module]['id_segment']);
return $results;
return Fattura::all();
}
}

View File

@ -17,35 +17,30 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
include_once __DIR__.'/../../core.php';
use Modules\Impianti\Export\CSV;
use Modules\Impianti\Impianto;
include_once __DIR__.'/../../core.php';
switch (post('op')) {
case 'export-csv':
$file = temp_file();
$exporter = new CSV($file);
case 'download-csv':
// Esportazione dei record selezionati
$fatture = Impianto::whereIn('id', $id_records)->get();
$exporter->setRecords($fatture);
$dir = base_dir().'/files/export_impianti/';
directory($dir.'tmp/');
$file = secure_random_string().'.csv';
$dir_csv = slashes($dir.'tmp/'.$file);
$count = $exporter->exportRecords();
$filename = 'impianti.csv';
$t = new Modules\Impianti\Export\CSV($dir_csv);
if($t->exportRecords()){
download($dir_csv, $filename);
delete($dir.'tmp/');
}
download($file, 'impianti.csv');
break;
}
if (App::debug()) {
$operations['download-csv'] = [
'text' => '<span><i class="fa fa-download"></i> '.tr('Esporta tutto').'</span> <span class="label label-danger" >beta</span>',
$operations['export-csv'] = [
'text' => '<span><i class="fa fa-download"></i> '.tr('Esporta selezionati').'</span> <span class="label label-danger" >beta</span>',
'data' => [
'msg' => tr('Vuoi davvero esportare un CSV con tutti gli impianti?'),
'button' => tr('Procedi'),

View File

@ -19,16 +19,14 @@
namespace Modules\StatoServizi;
use Util\FileSystem;
use Hooks\CachedManager;
use Util\FileSystem;
/**
* Hook dedicato all'individuazione di nuove versioni del gestionale, pubblicate sulla repository ufficiale di GitHub.
*/
class SpaceHook extends CachedManager
{
public function getCacheName()
{
return 'Spazio utilizzato';
@ -46,10 +44,9 @@ class SpaceHook extends CachedManager
$soft_quota = setting('Soft quota'); //MB
$space_limit = ($soft_quota / 100) * 95; //MB
$message = tr("Attenzione: occupati _TOT_ dei _SOFTQUOTA_ previsti", [
$message = tr('Attenzione: occupati _TOT_ dei _SOFTQUOTA_ previsti', [
'_TOT_' => FileSystem::formatBytes($osm_size),
'_SOFTQUOTA_' => FileSystem::formatBytes($soft_quota * 1048576),
]);
return [
@ -66,17 +63,12 @@ class SpaceHook extends CachedManager
*/
public static function isAvailable()
{
if (!empty(setting('Soft quota'))) {
$osm_size = FileSystem::folderSize(base_dir(), ['htaccess']);
return $osm_size;
}
return false;
}
}

View File

@ -64,6 +64,10 @@ abstract class CSVExporter implements ExporterInterface
public function exportRecords()
{
// Esportazione header
$fields = $this->getAvailableFields();
$this->csv->insertOne(array_column($fields, 'label'));
$records = $this->records ?: $this->getRecords();
foreach ($records as $record) {
// Esportazione del record
@ -81,7 +85,14 @@ abstract class CSVExporter implements ExporterInterface
foreach ($fields as $field) {
$nome = $field['field'];
$row[] = $record[$nome];
// Navigazione secondo dot notation
$dot_notation = explode('.', $nome);
$contenuto = $record;
foreach ($dot_notation as $segment) {
$contenuto = isset($contenuto[$segment]) ? $contenuto[$segment] : null;
}
$row[] = $contenuto;
}
return $this->csv->insertOne($row);