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';
@ -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)){
</h4>
<p>'.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),
]).'.</p>
<p>'.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').'.</p>
<p>'.tr("Contatta gli amministratori di sistema oppure l'assistenza tecnica per risolvere il problema").'.</p>
</div>';
}
}
}

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':
$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' => '<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')) {
@ -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'])?"<del>".implode(' ',$k['d'])."</del> ":'').
(!empty($k['i'])?"<span>".implode(' ',$k['i'])."</span> ":'');
else $ret .= $k . ' ';
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.' ';
}
}
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 .= 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 .= '<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{
} else {
flash()->info(tr('Nessuna anomalia!'));
}
}
break;
case 'download-csv':
$dir = base_dir().'/files/export_fatture/';
directory($dir.'tmp/');
$file = secure_random_string().'.csv';
$dir_csv = slashes($dir.'tmp/'.$file);
case 'export-csv':
$file = temp_file();
$exporter = new CSV($file);
$filename = 'fatture.csv';
// Esportazione dei record selezionati
$fatture = Fattura::whereIn('id', $id_records)->get();
$exporter->setRecords($fatture);
$t = new Modules\Fatture\Export\CSV($dir_csv);
$count = $exporter->exportRecords();
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 'download-csv':
$dir = base_dir().'/files/export_impianti/';
directory($dir.'tmp/');
$file = secure_random_string().'.csv';
$dir_csv = slashes($dir.'tmp/'.$file);
case 'export-csv':
$file = temp_file();
$exporter = new CSV($file);
$filename = 'impianti.csv';
// Esportazione dei record selezionati
$fatture = Impianto::whereIn('id', $id_records)->get();
$exporter->setRecords($fatture);
$t = new Modules\Impianti\Export\CSV($dir_csv);
$count = $exporter->exportRecords();
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'),
@ -55,4 +50,4 @@ if (App::debug()) {
];
}
return $operations;
return $operations;

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';
@ -44,12 +42,11 @@ class SpaceHook extends CachedManager
$osm_size = $this->getCache()->content;
$soft_quota = setting('Soft quota'); //MB
$space_limit = ($soft_quota / 100)*95; //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),
'_SOFTQUOTA_' => FileSystem::formatBytes($soft_quota * 1048576),
]);
return [
@ -59,24 +56,19 @@ class SpaceHook extends CachedManager
];
}
/**
/**
* Controlla se è disponibile un aggiornamento nella repository GitHub.
*
* @return int|bool
*/
public static function isAvailable()
{
if (!empty(setting('Soft quota'))){
if (!empty(setting('Soft quota'))) {
$osm_size = FileSystem::folderSize(base_dir(), ['htaccess']);
return $osm_size;
}
return false;
}
}

View File

@ -40,7 +40,7 @@ class Interaction extends Services
'filename' => $fattura->getFilename(),
]);
$body = static::responseBody($response);
// Aggiornamento dello stato
if ($body['status'] == 200 || $body['status'] == 301) {
database()->update('co_documenti', [

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);