This commit is contained in:
MatteoPistorello 2021-09-07 15:51:05 +02:00
commit ebb1b5a791
8 changed files with 1124 additions and 356 deletions

View File

@ -567,3 +567,35 @@ if (!function_exists('temp_file')) {
return $file;
}
}
if (!function_exists('adjustBrightness')) {
/**
* Increases or decreases the brightness of a color by a percentage of the current brightness.
*
* @param string $hexCode Supported formats: `#FFF`, `#FFFFFF`, `FFF`, `FFFFFF`
* @param float $adjustPercent A number between -1 and 1. E.g. 0.3 = 30% lighter; -0.4 = 40% darker.
*
* @return string
*
* @author maliayas
*/
function adjustBrightness($hexCode, $adjustPercent)
{
$hexCode = ltrim($hexCode, '#');
if (strlen($hexCode) == 3) {
$hexCode = $hexCode[0].$hexCode[0].$hexCode[1].$hexCode[1].$hexCode[2].$hexCode[2];
}
$hexCode = array_map('hexdec', str_split($hexCode, 2));
foreach ($hexCode as &$color) {
$adjustableLimit = $adjustPercent < 0 ? $color : 255 - $color;
$adjustAmount = ceil($adjustableLimit * $adjustPercent);
$color = str_pad(dechex($color + $adjustAmount), 2, '0', STR_PAD_LEFT);
}
return '#'.implode($hexCode);
}
}

View File

@ -21,101 +21,230 @@ include_once __DIR__.'/../../core.php';
use API\Services;
use Models\Cache;
use Models\Module;
use Models\Plugin;
use Util\FileSystem;
$id = post('id');
switch (filter('op')) {
case 'uninstall':
if (!empty($id)) {
// Leggo l'id del modulo
$rs = $dbo->fetchArray('SELECT id, name, directory FROM zz_modules WHERE id='.prepare($id).' AND `default`=0');
$modulo = $rs[0]['title'];
$module_dir = $rs[0]['directory'];
case 'rimuovi-modulo':
$id = filter('id');
$is_plugin = filter('tipo') == 'plugin';
if (empty($id)) {
echo json_encode([]);
}
if (count($rs) == 1) {
// Elimino il modulo dal menu
$dbo->query('DELETE FROM zz_modules WHERE id='.prepare($id).' OR parent='.prepare($id));
// Ricerca del modulo/plugin tra quelli disponibili
if (!$is_plugin) {
$struttura = Module::where('default', '=', 0)->find($id);
} else {
$struttura = Plugin::where('default', '=', 0)->find($id);
}
$uninstall_script = base_dir().'/modules/'.$module_dir.'/update/uninstall.php';
// Modulo/plugin non trovato
if (empty($struttura)) {
echo json_encode([]);
}
if (file_exists($uninstall_script)) {
include_once $uninstall_script;
}
// Eliminazione del modulo/plugin dal sistema di navigazione
$struttura->delete();
delete(base_dir().'/modules/'.$module_dir.'/');
// Esecuzione dello script di disinstallazione (se presente)
$uninstall_script = $struttura->path.'/update/uninstall.php';
if (file_exists($uninstall_script)) {
include_once $uninstall_script;
}
flash()->info(tr('Modulo "_MODULE_" disinstallato!', [
'_MODULE_' => $modulo,
]));
// Eliminazione dei file del modulo/plugin
delete($struttura->path);
// Messaggio informativo
if (!$is_plugin) {
flash()->info(tr('Modulo "_NAME_" disinstallato!', [
'_NAME_' => $struttura->title,
]));
} else {
flash()->info(tr('Plugin "_NAME_" disinstallato!', [
'_NAME_' => $struttura->title,
]));
}
echo json_encode([]);
break;
case 'disabilita-modulo':
$id = filter('id');
$is_plugin = filter('tipo') == 'plugin';
// Disabilitazione del modulo indicato
$database->table($is_plugin ? 'zz_plugins' : 'zz_modules')
->where('id', '=', $id)
->update(['enabled' => 0]);
// Cascata in tutti i sotto-moduli
if (!$is_plugin) {
$moduli_interessati = collect([$id]);
while (!$moduli_interessati->isEmpty()) {
$id_modulo = $moduli_interessati->pop();
// Disabilitazione dei sotto-moduli
$database->table('zz_modules')
->where('parent', '=', $id_modulo)
->update(['enabled' => 0]);
// Ricerca sotto-moduli
$sotto_moduli = $database->table('zz_modules')
->where('parent', '=', $id_modulo)
->select('id')
->get()->pluck('id');
$moduli_interessati->concat($sotto_moduli);
}
}
break;
// Disabilitazione modulo/plugin indicato
$moduli_sempre_attivi = ['Utenti e permessi', 'Stato dei servizi'];
$database->table('zz_modules')
->whereIn('name', $moduli_sempre_attivi)
->update(['enabled' => 1]);
case 'disable':
$dbo->query('UPDATE `zz_modules` SET `enabled` = 0 WHERE (`id` = '.prepare($id).' OR `parent` = '.prepare($id).') AND `id` != '.prepare(Modules::get('Stato dei servizi')['id']));
// Messaggio informativo
$struttura = $is_plugin ? Plugin::find($id) : Module::find($id);
if (!$is_plugin) {
flash()->info(tr('Modulo "_NAME_" disabilitato!', [
'_NAME_' => $struttura->title,
]));
} else {
flash()->info(tr('Plugin "_NAME_" disabilitato!', [
'_NAME_' => $struttura->title,
]));
}
flash()->info(tr('Modulo "_MODULE_" disabilitato!', [
'_MODULE_' => Modules::get($id)['title'],
]));
echo json_encode([]);
break;
case 'enable':
$dbo->query('UPDATE `zz_modules` SET `enabled` = 1 WHERE `id` = '.prepare($id).' OR `parent` = '.prepare($id));
case 'abilita-sotto-modulo':
$id = filter('id');
flash()->info(tr('Modulo "_MODULE_" abilitato!', [
'_MODULE_' => Modules::get($id)['title'],
]));
// Cascata in tutti i sotto-moduli
$moduli_interessati = collect([$id]);
while (!$moduli_interessati->isEmpty()) {
$id_modulo = $moduli_interessati->pop();
// Disabilitazione dei sotto-moduli
$database->table('zz_modules')
->where('parent', '=', $id_modulo)
->update(['enabled' => 1]);
// Ricerca sotto-moduli
$sotto_moduli = $database->table('zz_modules')
->where('parent', '=', $id_modulo)
->select('id')
->get()->pluck('id');
$moduli_interessati->concat($sotto_moduli);
}
// no break
case 'abilita-modulo':
$id = filter('id');
$is_plugin = filter('tipo') == 'plugin';
// Abilitazione del modulo/plugin indicato
$database->table($is_plugin ? 'zz_plugins' : 'zz_modules')
->where('id', '=', $id)
->update(['enabled' => 1]);
// Messaggio informativo
$struttura = $is_plugin ? Plugin::find($id) : Module::find($id);
if (!isset($moduli_interessati)) {
if (!$is_plugin) {
flash()->info(tr('Modulo "_NAME_" abilitato!', [
'_NAME_' => $struttura->title,
]));
} else {
flash()->info(tr('Plugin "_NAME_" abilitato!', [
'_NAME_' => $struttura->title,
]));
}
} else {
$modulo = Modules::get($id);
flash()->info(tr('Moduli sotto a "_NAME_" abilitati!', [
'_NAME_' => $struttura->title,
]));
}
echo json_encode([]);
break;
case 'disable_widget':
$dbo->query('UPDATE zz_widgets SET enabled = 0 WHERE id = '.prepare($id));
case 'disabilita-widget':
$id = filter('id');
$rs = $dbo->fetchArray('SELECT id, name FROM zz_widgets WHERE id='.prepare($id));
$widget = $rs[0]['name'];
// Abilitazione del widget indicato
$database->table('zz_widgets')
->where('id', '=', $id)
->update(['enabled' => 0]);
flash()->info(tr('Widget "_WIDGET_" disabilitato!', [
'_WIDGET_' => $widget,
// Messaggio informativo
$widget = $database->table('zz_widgets')
->where('id', '=', $id)
->first();
flash()->info(tr('Widget "_NAME_" disabilitato!', [
'_NAME_' => $widget->name,
]));
echo json_encode([]);
break;
case 'enable_widget':
$dbo->query('UPDATE zz_widgets SET enabled=1 WHERE id='.prepare($id));
case 'abilita-widget':
$id = filter('id');
$rs = $dbo->fetchArray('SELECT id, name FROM zz_widgets WHERE id='.prepare($id));
$widget = $rs[0]['name'];
// Abilitazione del widget indicato
$database->table('zz_widgets')
->where('id', '=', $id)
->update(['enabled' => 1]);
flash()->info(tr('Widget "_WIDGET_" abilitato!', [
'_WIDGET_' => $widget,
// Messaggio informativo
$widget = $database->table('zz_widgets')
->where('id', '=', $id)
->first();
flash()->info(tr('Widget "_NAME_" abilitato!', [
'_NAME_' => $widget->name,
]));
echo json_encode([]);
break;
case 'change_position_widget_top':
$dbo->query("UPDATE zz_widgets SET location='controller_top' WHERE id=".prepare($id));
case 'sposta-widget':
$id = filter('id');
$rs = $dbo->fetchArray('SELECT id, name FROM zz_widgets WHERE id='.prepare($id));
$widget = $rs[0]['name'];
// Individuazione widget
$widget = $database->table('zz_widgets')
->where('id', '=', $id)
->first();
if (empty($widget)) {
echo json_encode([]);
}
flash()->info(tr('Posizione del widget "_WIDGET_" aggiornata!', [
'_WIDGET_' => $widget,
// Individuazione dello spostamento da effettuare
$pieces = explode('_', $widget->location);
$location = $pieces[0].'_'.($pieces[1] == 'right' ? 'top' : 'right');
// Abilitazione del widget indicato
$database->table('zz_widgets')
->where('id', '=', $id)
->update(['location' => $location]);
// Messaggio informativo
flash()->info(tr('Posizione del widget "_NAME_" aggiornata!', [
'_NAME_' => $widget->name,
]));
break;
case 'change_position_widget_right':
$dbo->query("UPDATE zz_widgets SET location='controller_right' WHERE id=".prepare($id));
$rs = $dbo->fetchArray('SELECT id, name FROM zz_widgets WHERE id='.prepare($id));
$widget = $rs[0]['name'];
flash()->info(tr('Posizione del widget "_WIDGET_" aggiornata!', [
'_WIDGET_' => $widget,
]));
echo json_encode([]);
break;
@ -178,14 +307,18 @@ switch (filter('op')) {
$informazioni = $info->content;
// Formattazione dei contenuti
// Restrizione storico agli ultimi 3 anni
$history = (array) $informazioni['history'];
$history = array_slice($history, 0, 3);
// Formattazione dei contenuti dello storico
foreach ($history as $key => $value) {
$history[$key]['size'] = Filesystem::formatBytes($value['size']);
$history[$key]['invoices_size'] = Filesystem::formatBytes($value['invoices_size']);
$history[$key]['notifies_size'] = Filesystem::formatBytes($value['notifies_size']);
}
// Formattazione dei contenuti generici
echo json_encode([
'invoice_number' => $informazioni['invoice_number'],
'size' => Filesystem::formatBytes($informazioni['size']),

View File

@ -17,222 +17,270 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
// Elenco moduli installati
use API\Services;
use Carbon\Carbon;
use Models\Cache;
use Modules\StatoServizi\ServicesHook;
include_once __DIR__.'/../../core.php';
// Informazioni sui servizi attivi
echo '
<div class="row">
<div class="col-md-12 col-lg-6">
<h3>'.tr('Moduli installati').'</h3>
<table class="table table-hover table-bordered table-condensed">
<tr>
<th>'.tr('Nome').'</th>
<th>'.tr('Versione').'</th>
<th>'.tr('Stato').'</th>
<th>'.tr('Compatibilità').'</th>
<th>'.tr('Opzioni').'</th>
</tr>';
$modules = Modules::getHierarchy();
$osm_version = Update::getVersion();
echo submodules($modules);
echo '
</table>
</div>';
<div class="row">';
/**
* Contenuto aggiornato e gestito dall'Hook ServicesHook.
*
* @var array
*/
$response = Cache::pool('Informazioni su Services')->content;
$limite_scadenze = (new Carbon())->addDays(60);
if (Services::isEnabled()) {
// Informazioni su Services
$servizi = Cache::pool('Informazioni su Services')->content;
if (!empty($servizi)) {
// Elaborazione dei servizi in scadenza
$limite_scadenze = (new Carbon())->addDays(60);
$servizi_in_scadenza = [];
foreach ($servizi as $servizio) {
// Gestione per data di scadenza
$scadenza = new Carbon($servizio['expiration_at']);
if (
(isset($servizio['expiration_at']) && $scadenza->lessThan($limite_scadenze))
) {
$servizi_in_scadenza[] = $servizio['name'].' ('.$scadenza->diffForHumans().')';
}
// Gestione per crediti
elseif (
(isset($servizio['credits']) && $servizio['credits'] < 100)
) {
$servizi_in_scadenza[] = $servizio['name'].' ('.$servizio['credits'].' crediti)';
}
}
echo '
<div class="col-md-12 col-lg-6">
<div class="box box-info">
<div class="box-header">
<h3 class="box-title">
'.tr('Informazioni su Services').'
</h3>
</div>
echo '
<!-- Informazioni sui Servizi attivi -->
<div class="col-md-12 col-lg-6">
<div class="box box-success">
<div class="box-header">
<h3 class="box-title">
'.tr('Servizi attivi').'
</h3>
</div>
<div class="box-body">';
if (empty($servizi_in_scadenza)) {
$servizi = collect($response['servizi'])->flatten(1);
if (!$servizi->isEmpty()) {
echo '
<table class="table table-striped table-hover">
<thead>
<tr>
<th>'.tr('Tipo').'</th>
<th>'.tr('Nome').'</th>
<th>'.tr('Scadenza').'</th>
</tr>
</thead>
<tbody>';
foreach ($servizi as $servizio) {
$scadenza = Carbon::parse($servizio['data_conclusione']);
echo '
<p>'.tr('Nessun servizio in scadenza').'.</p>';
<tr class="'.($scadenza->lessThan($limite_scadenze) ? 'info' : '').'">
<td>'.$servizio['sottocategoria'].'</td>
<td>'.$servizio['codice'].' - '.$servizio['nome'].'</td>
<td>'.dateFormat($scadenza).' ('.$scadenza->diffForHumans().')</td>
</tr>';
}
echo '
</tbody>
</table>';
} else {
echo '
<div class="alert alert-warning" role="alert">
<i class="fa fa-warning"></i> '.tr('Nessun servizio abilitato al momento').'.
</div>';
}
echo '
</div>
</div>
</div>
<!-- Informazioni sulle Risorse API -->
<div class="col-md-12 col-lg-6">
<div class="box box-info">
<div class="box-header">
<h3 class="box-title">
'.tr('Risorse Services').'
</h3>
</div>
<div class="box-body">';
// Elaborazione delle risorse API in scadenza
if (!empty($response['risorse-api'])) {
$risorse_in_scadenza = ServicesHook::getRisorseInScadenza($response['risorse-api'], $limite_scadenze);
if (!$risorse_in_scadenza->isEmpty()) {
echo '
<p>'.tr('Le seguenti risorse sono in scadenza:').'</p>
<table class="table table-striped table-hover">
<thead>
<tr>
<th>'.tr('Nome').'</th>
<th>'.tr('Crediti').'</th>
<th>'.tr('Scadenza').'</th>
</tr>
</thead>
<tbody>';
foreach ($risorse_in_scadenza as $servizio) {
$scadenza = Carbon::parse($servizio['data_scadenza']);
echo '
<tr>
<td>'.$servizio['nome'].'</td>
<td>'.$servizio['crediti'].'</td>
<td>'.dateFormat($scadenza).' ('.$scadenza->diffForHumans().')</td>
</tr>';
}
echo '
</tbody>
</table>';
} else {
echo '
<p>'.tr('I seguenti servizi sono in scadenza:').'</p>
<ul>';
foreach ($servizi_in_scadenza as $servizio) {
echo '
<li>'.$servizio.'</li>';
}
echo '
</ul>';
<p>'.tr('Nessuna risorsa in scadenza').'.</p>';
}
echo '
<hr><br>
<hr><br>
<h4>'.tr('Statistiche su Fatture Elettroniche').'</h4>
<table class="table table-striped">
<thead>
<tr>
<th>'.tr('Anno').'</th>
<th>'.tr('Documenti archiviati').'
<h4>'.tr('Statistiche su Fatture Elettroniche').'</h4>
<table class="table table-striped">
<thead>
<tr>
<th>'.tr('Anno').'</th>
<th>
'.tr('Documenti archiviati').'
<span class="tip" title="'.tr('Fatture attive e relative ricevute, fatture passive').'.">
<i class="fa fa-question-circle-o"></i>
</span>
</th>
</th>
<th>'.tr('Totale spazio occupato').'
<th>
'.tr('Totale spazio occupato').'
<span class="tip" title="'.tr('Fatture attive con eventuali allegati e ricevute, fatture passive con eventuali allegati').'.">
<i class="fa fa-question-circle-o"></i>
</span>
</th>
</tr>
</thead>
</th>
</tr>
</thead>
<tbody id="elenco-fe">
<tr class="info">
<td>'.tr('Totale').'</td>
<td id="fe_numero"></td>
<td id="fe_spazio"></td>
</tr>
</tbody>
</table>
</div>
</div>
<tbody id="elenco-fe">
<tr class="info">
<td>'.tr('Totale').'</td>
<td id="fe_numero"></td>
<td id="fe_spazio"></td>
</tr>
</tbody>
</table>
<script>
$(document).ready(function (){
$.ajax({
url: globals.rootdir + "/actions.php",
type: "GET",
dataType: "JSON",
data: {
id_module: globals.id_module,
op: "informazioni-fe",
},
success: function (response) {
$("#fe_numero").html(response.invoice_number);
$("#fe_spazio").html(response.size);
if (response.history.length) {
for (let i = 0; i < response.history.length; i++) {
const data = response.history[i];
$("#elenco-fe").append(`<tr>
<td>` + data["year"] + `</td>
<td>` + data["number"] + `</td>
<td>` + data["size"] + `</td>
</tr>`);
}
}
}
<script>
$(document).ready(function (){
aggiornaStatisticheFE();
});
});
</script>';
</script>';
} else {
echo '
<div class="col-md-12 col-lg-6"><div class="alert alert-warning alert-dismissible" role="alert"><button class="close" type="button" data-dismiss="alert" aria-hidden="true"><span aria-hidden="true">×</span><span class="sr-only">'.tr('Chiudi').'</span></button><span><i class="fa fa-warning"></i> '.tr('Nessun servizio abilitato o "OSMCloud Services API Token" non valido').'.</span></div></div>';
<div class="alert alert-warning" role="alert">
<i class="fa fa-warning"></i> '.tr('Nessuna risorsa Services abilitata').'.
</div>';
}
echo '
</div>
</div>';
} else {
echo '
<div class="col-md-12 col-lg-6">
<div class="alert alert-warning" role="alert">
<i class="fa fa-warning"></i> '.tr("Configurazione per l'accesso Services non completata correttamente").'. '.tr('Per abilitare i servizi, compilare l\'impostazione "OSMCloud Services API Token"').'.
</div>
</div>';
}
echo '
</div>
<div class="row">
<div class="col-md-12 col-lg-6">
<div class="box box-info">
<div class="box-header">
<h3 class="box-title">
'.tr('Moduli disponibili').'
</h3>
</div>
<div class="box-body" id="moduli">
</div>
</div>
</div>';
// Widgets
echo '
<div class="col-md-12 col-lg-6">
<h3>'.tr('Widgets').'</h3>
<table class="table table-hover table-bordered table-condensed">
<tr>
<th>'.tr('Nome').'</th>
<th>'.tr('Posizione').'</th>
<th>'.tr('Stato').'</th>
<th>'.tr('Posizione').'</th>
</tr>';
<div class="box box-info">
<div class="box-header">
<h3 class="box-title">
'.tr('Widget disponibili').'
</h3>
</div>
$widgets = $dbo->fetchArray('SELECT zz_widgets.id, zz_widgets.name AS widget_name, zz_modules.name AS module_name, zz_widgets.enabled AS enabled, location, help FROM zz_widgets INNER JOIN zz_modules ON zz_widgets.id_module=zz_modules.id ORDER BY `id_module` ASC, `zz_widgets`.`order` ASC');
<div class="box-body" id="widget">
</div>
</div>
</div>
</div>
$previous = '';
<script>
function aggiornaStatisticheFE(){
$.ajax({
url: globals.rootdir + "/actions.php",
type: "GET",
dataType: "JSON",
data: {
id_module: globals.id_module,
op: "informazioni-fe",
},
success: function (response) {
$("#fe_numero").html(response.invoice_number);
$("#fe_spazio").html(response.size);
foreach ($widgets as $widget) {
// Nome modulo come titolo sezione
if ($widget['module_name'] != $previous) {
echo '
<tr>
<th colspan="4">'.$widget['module_name'].'</th>
</tr>';
}
if (response.history.length) {
for (let i = 0; i < response.history.length; i++) {
const data = response.history[i];
// STATO
if ($widget['enabled']) {
$stato = '<i class="fa fa-cog fa-spin text-success tip" title="'.tr('Abilitato').'. '.tr('Clicca per disabilitarlo').'..."></i>';
$class = 'success';
} else {
$stato = '<i class="fa fa-cog text-warning tip" title="'.tr('Non abilitato').'"></i>';
$class = 'warning';
}
// Possibilità di disabilitare o abilitare i moduli tranne quello degli aggiornamenti
if ($widget['enabled']) {
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Disabilitare questo widget?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'disable_widget', id: '".$widget['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); }\">".$stato."</a>\n";
} else {
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Abilitare questo widget?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'enable_widget', id: '".$widget['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); }\"\">".$stato."</a>\n";
}
// POSIZIONE
if ($widget['location'] == 'controller_top') {
$location = tr('Schermata modulo in alto');
} elseif ($widget['location'] == 'controller_right') {
$location = tr('Schermata modulo a destra');
}
if ($widget['location'] == 'controller_right') {
$posizione = "<i class='fa fa-arrow-up text-warning tip' title=\"".tr('Clicca per cambiare la posizione...')."\"></i>&nbsp;<i class='fa fa-arrow-right text-success' ></i>";
$posizione = "<a href='javascript:;' onclick=\"if( confirm('".tr('Cambiare la posizione di questo widget?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'change_position_widget_top', id: '".$widget['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); }\"\">".$posizione."</a>\n";
} elseif ($widget['location'] == 'controller_top') {
$posizione = "<i class='fa fa-arrow-up text-success'></i>&nbsp;<i class='fa fa-arrow-right text-warning tip' title=\"".tr('Clicca per cambiare la posizione...').'"></i>';
$posizione = "<a href='javascript:;' onclick=\"if( confirm('".tr('Cambiare la posizione di questo widget?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'change_position_widget_right', id: '".$widget['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); }\"\">".$posizione."</a>\n";
}
echo '
<tr class="'.$class.'">
<td>'.$widget['widget_name'].((!empty($widget['help'])) ? ' <i class="tip fa fa-question-circle-o" title="'.$widget['help'].'"</i>' : '').'</td>
<td align="left"><small>'.$location.'</small></td>
<td align="center">'.$stato.'</td>
<td align="center">'.$posizione.'</td>
</tr>';
$previous = $widget['module_name'];
$("#elenco-fe").append(`<tr>
<td>` + data["year"] + `</td>
<td>` + data["number"] + `</td>
<td>` + data["size"] + `</td>
</tr>`);
}
}
}
});
}
echo '
</table>
</div>
</div>';
function caricaElencoModuli() {
let container = $("#moduli");
localLoading(container, true);
return $.get("'.$structure->fileurl('elenco-moduli.php').'?id_module='.$id_module.'", function(data) {
container.html(data);
localLoading(container, false);
init();
});
}
function caricaElencoWidget() {
let container = $("#widget");
localLoading(container, true);
return $.get("'.$structure->fileurl('elenco-widget.php').'?id_module='.$id_module.'", function(data) {
container.html(data);
localLoading(container, false);
init();
});
}
$(document).ready(function() {
caricaElencoModuli();
caricaElencoWidget();
init();
});
</script>';

View File

@ -0,0 +1,388 @@
<?php
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
include_once __DIR__.'/../../core.php';
echo '
<table class="table table-hover table-bordered table-condensed">
<thead>
<tr>
<th>'.tr('Nome').'</th>
<th class="text-center">'.tr('Versione').'</th>
<th class="text-center">'.tr('Stato').'</th>
<th class="text-center">#</th>
</tr>
</thead>
<tbody>';
$moduli = Modules::getHierarchy();
echo renderElencoModuli($moduli);
echo '
</tbody>
</table>
<script>
function disabilitaModulo(button){
const riga = $(button).closest("tr");
const id = riga.data("id");
const nome = riga.data("nome");
const tipo = riga.data("tipo");
const nome_tipo = riga.data("nome_tipo");
swal({
title: "'.tr('Disabilitare il _TYPE_?', [
'_TYPE_' => '" + nome_tipo + "',
]).'",
html: "'.tr('Sei sicuro di voler disabilitare il _TYPE_ _NAME_?', [
'_TYPE_' => '" + nome_tipo + "',
'_NAME_' => '" + nome + "',
]).'",
type: "warning",
showCancelButton: true,
confirmButtonText: "'.tr('Continua').'"
}).then(function (result) {
let restore = buttonLoading(button);
$.ajax({
url: globals.rootdir + "/actions.php",
type: "POST",
dataType: "JSON",
data: {
id_module: globals.id_module,
op: "disabilita-modulo",
tipo: tipo,
id: id,
},
success: function (response) {
caricaElencoModuli();
renderMessages();
},
error: function() {
buttonRestore(button, restore);
swal({
type: "error",
title: globals.translations.ajax.error.title,
text: globals.translations.ajax.error.text,
});
}
});
})
}
function abilitaModulo(button) {
const riga = $(button).closest("tr");
const id = riga.data("id");
const nome = riga.data("nome");
const tipo = riga.data("tipo");
const nome_tipo = riga.data("nome_tipo");
swal({
title: "'.tr('Abilitare il _TYPE_?', [
'_TYPE_' => '" + nome_tipo + "',
]).'",
html: "'.tr('Sei sicuro di voler abilitare il _TYPE_ _NAME_?', [
'_TYPE_' => '" + nome_tipo + "',
'_NAME_' => '" + nome + "',
]).'",
type: "warning",
showCancelButton: true,
confirmButtonText: "'.tr('Continua').'"
}).then(function (result) {
let restore = buttonLoading(button);
$.ajax({
url: globals.rootdir + "/actions.php",
type: "POST",
dataType: "JSON",
data: {
id_module: globals.id_module,
op: "abilita-modulo",
tipo: tipo,
id: id,
},
success: function (response) {
caricaElencoModuli();
renderMessages();
},
error: function() {
buttonRestore(button, restore);
swal({
type: "error",
title: globals.translations.ajax.error.title,
text: globals.translations.ajax.error.text,
});
}
});
})
}
function abilitaSottoModuli(button) {
const riga = $(button).closest("tr");
const id = riga.data("id");
const nome = riga.data("nome");
const tipo = riga.data("tipo");
const nome_tipo = riga.data("nome_tipo");
swal({
title: "'.tr('Abilitare tutti i sotto-moduli?').'",
html: "'.tr('Sei sicuro di voler abilitare tutti i sotto-moduli del modulo _NAME_?', [
'_NAME_' => '" + nome + "',
]).'",
type: "warning",
showCancelButton: true,
confirmButtonText: "'.tr('Continua').'"
}).then(function (result) {
let restore = buttonLoading(button);
$.ajax({
url: globals.rootdir + "/actions.php",
type: "POST",
dataType: "JSON",
data: {
id_module: globals.id_module,
op: "abilita-sotto-modulo",
tipo: tipo,
id: id,
},
success: function (response) {
caricaElencoModuli();
renderMessages();
},
error: function() {
buttonRestore(button, restore);
swal({
type: "error",
title: globals.translations.ajax.error.title,
text: globals.translations.ajax.error.text,
});
}
});
})
}
function rimuoviModulo(button) {
const riga = $(button).closest("tr");
const id = riga.data("id");
const nome = riga.data("nome");
const tipo = riga.data("tipo");
const nome_tipo = riga.data("nome_tipo");
swal({
title: "'.tr('Rimuovere il _TYPE_?', [
'_TYPE_' => '" + nome_tipo + "',
]).'",
html: "'.tr('Sei sicuro di voler rimuovere il _TYPE_ _NAME_?', [
'_TYPE_' => '" + nome_tipo + "',
'_NAME_' => '" + nome + "',
]).'<br>'.tr('Questa operazione è irreversibile e provocherà la potenziale perdita dei dati attualmente collegati al _TYPE_', [
'_TYPE_' => '" + nome_tipo + "',
]).'.",
type: "warning",
showCancelButton: true,
confirmButtonText: "'.tr('Continua').'"
}).then(function (result) {
let restore = buttonLoading(button);
$.ajax({
url: globals.rootdir + "/actions.php",
type: "POST",
dataType: "JSON",
data: {
id_module: globals.id_module,
op: "rimuovi-modulo",
tipo: tipo,
id: id,
},
success: function (response) {
caricaElencoModuli();
renderMessages();
},
error: function() {
buttonRestore(button, restore);
swal({
type: "error",
title: globals.translations.ajax.error.title,
text: globals.translations.ajax.error.text,
});
}
});
})
}
</script>
<style>
.depth-0 {
filter: brightness(1);
}
.depth-1 {
filter: brightness(1.05);
}
.depth-2 {
filter: brightness(1.1);
}
.depth-3 {
filter: brightness(1.15);
}
</style>';
function renderElencoModuli($elenco, $depth = 0)
{
$versione_gestionale = Update::getVersion();
$moduli_sempre_attivi = ['Utenti e permessi', 'Stato dei servizi'];
$result = '';
foreach ($elenco as $record) {
$record_bloccato = in_array($record['name'], $moduli_sempre_attivi);
$is_plugin = !empty($record['idmodule_to']);
$nome_tipo = string_lowercase($is_plugin ? tr('Plugin') : tr('Modulo'));
// Render per sotto-moduli
$sotto_moduli = renderElencoModuli($record['all_children'], $depth + 1);
$elenco_plugin = null;
if (empty($record['idmodule_to'])) {
$plugins = database()->table('zz_plugins')
->where('idmodule_to', '=', $record['id'])
->get()->map(function ($i) {
return (array) $i;
})->toArray();
$elenco_plugin = renderElencoModuli($plugins, $depth + 1);
}
// COMPATIBILITA'
// Controllo per ogni versione se la regexp combacia per dire che è compatibile o meno
$compatibile = false;
$versioni_compatibili = explode(',', $record['compatibility']);
foreach ($versioni_compatibili as $versione) {
$compatibile = (preg_match('/'.$versione.'/', $versione_gestionale)) ? true : $compatibile;
}
if ($compatibile) {
$class = ($record['enabled']) ? 'success' : 'warning';
} else {
$class = 'danger';
}
$result .= '
<tr class="'.$class.' depth-'.$depth.'" data-id="'.$record['id'].'" data-nome='.json_encode($record['title']).' data-tipo="'.($is_plugin ? 'plugin' : 'module').'" data-nome_tipo='.json_encode($nome_tipo).'>
<td>
'.str_repeat('&nbsp;', $depth * 4).'- '.$record['title'].'
'.($compatibile ? '' :
'<div class="tip pull-right" data-toggle="tooltip" title="'.tr('Non compatibile!').' '.tr('Questo _TYPE_ è compatibile solo con le versioni: _LIST_', [
'_TYPE_' => $nome_tipo,
'_LIST_' => $record['compatibility'],
]).'">
<span class="label label-danger">
<i class="fa fa-warning" title="'.tr('Non compatibile!').'"></i>
</span>
</div>'
).'
'.($is_plugin ? '<span class="badge pull-right" style="margin-right: 5px">'.tr('Plugin').'</span>' : '').'
</td>
<td class="text-center">'.$record['version'].'</td>
<td class="text-center">';
// Possibilità di disabilitare o abilitare il moduli/plugin
if (!$record_bloccato) {
if ($record['enabled']) {
$result .= '
<div class="tip" data-toggle="tooltip" title="'.tr('Questo _TYPE_ è abilitato: clicca qui per disabilitarlo', [
'_TYPE_' => $nome_tipo,
]).'">
<button type="button" class="btn btn-warning btn-xs" onclick="disabilitaModulo(this)">
<i class="fa fa-power-off" title="'.tr('Disabilita').'"></i>
</button>
</div>';
// Possibilità di abilitare tutti i sottomoduli
$sotto_moduli_disabilitato = strpos($sotto_moduli, 'fa fa-plug') !== false;
if ($sotto_moduli_disabilitato) {
$result .= '
<div class="tip" data-toggle="tooltip" title="'.tr('Abilita tutti i sotto-moduli').'">
<button type="button" class="btn btn-success btn-xs" onclick="abilitaSottoModuli(this)">
<i class="fa fa-recycle" title="'.tr('Abilita sotto-moduli').'"></i>
</button>
</div>';
}
} else {
$result .= '
<div class="tip" data-toggle="tooltip" title="'.tr('Questo _TYPE_ è disabilitato: clicca qui per abilitarlo', [
'_TYPE_' => $nome_tipo,
]).'">
<button type="button" class="btn btn-success btn-xs" onclick="abilitaModulo(this)">
<i class="fa fa-plug" title="'.tr('Abilita').'"></i>
</button>
</div>';
}
} else {
$result .= '
<div class="tip" data-toggle="tooltip" title="'.tr('Questo _TYPE_ non può essere disabilitato', [
'_TYPE_' => $nome_tipo,
]).'">
<i class="fa fa-eye" title="'.tr('Modulo sempre abilitato').'"></i>
</div>';
}
$result .= '
</td>
<td class="text-center">';
// Possibilità di disinstallare solo se il modulo/plugin non è tra quelli predefiniti
if (empty($record['default'])) {
$result .= '
<div class="tip" data-toggle="tooltip" title="'.tr('Puoi disintallare questo modulo: clicca qui per procedere').'">
<button type="button" class="btn btn-danger btn-xs" onclick="rimuoviModulo(this)">
<i class="fa fa-trash" title="'.tr('Disinstalla').'"></i>
</button>
</div>';
} else {
$result .= '
<div class="tip" data-toggle="tooltip" title="'.tr('Questo _TYPE_ non può essere disinstallato', [
'_TYPE_' => $nome_tipo,
]).'">
<i class="fa fa-trash text-muted" title="'.tr('Modulo non disinstallabile').'"></i>
</div>';
}
$result .= '
</td>
</tr>';
$result .= $elenco_plugin;
$result .= $sotto_moduli;
}
return $result;
}

View File

@ -0,0 +1,253 @@
<?php
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
include_once __DIR__.'/../../core.php';
echo '
<table class="table table-hover table-condensed">
<thead>
<tr>
<th>'.tr('Nome').'</th>
<th>'.tr('Posizione').'</th>
<th>'.tr('Stato').'</th>
<th>'.tr('Posizione').'</th>
</tr>
</thead>';
$widgets = $dbo->fetchArray('SELECT zz_widgets.*, zz_modules.name AS modulo
FROM zz_widgets
INNER JOIN zz_modules ON zz_widgets.id_module = zz_modules.id
ORDER BY `id_module` ASC, `zz_widgets`.`order` ASC');
$gruppi = collect($widgets)->groupBy('modulo');
foreach ($gruppi as $modulo => $widgets) {
echo '
<thead>
<tr>
<th colspan="4">'.$modulo.'</th>
</tr>
</thead>
<tbody>';
foreach ($widgets as $widget) {
$class = $widget['enabled'] ? 'success' : 'warning';
$nome_tipo = 'widget';
echo '
<tr class="'.$class.'" data-id="'.$widget['id'].'" data-nome='.json_encode($widget['name']).'>
<td>
'.$widget['name'].(!empty($widget['help']) ? '
<i class="tip fa fa-question-circle-o" title="'.$widget['help'].'"</i>' : '').'
</td>
<td><small>'.(
string_starts_with($widget['location'], 'controller') ?
tr('Schermata modulo') :
tr('Schermata dettagli')
).'</small></td>
<td class="text-center">';
// Possibilità di disabilitare o abilitare il widget
if ($widget['enabled']) {
echo '
<div class="tip" data-toggle="tooltip" title="'.tr('Questo _TYPE_ è abilitato: clicca qui per disabilitarlo', [
'_TYPE_' => $nome_tipo,
]).'">
<button type="button" class="btn btn-warning btn-xs" onclick="disabilitaWidget(this)">
<i class="fa fa-power-off" title="'.tr('Disabilita').'"></i>
</button>
</div>';
} else {
echo '
<div class="tip" data-toggle="tooltip" title="'.tr('Questo _TYPE_ è disabilitato: clicca qui per abilitarlo', [
'_TYPE_' => $nome_tipo,
]).'">
<button type="button" class="btn btn-success btn-xs" onclick="abilitaWidget(this)">
<i class="fa fa-plug" title="'.tr('Abilita').'"></i>
</button>
</div>';
}
echo '
</td>
<td class="text-center">';
// Possibilità di spostare il widget
if (string_ends_with($widget['location'], 'top')) {
echo '
<div class="tip" data-toggle="tooltip" title="'.tr('Questo widget è posizionato nella parte superiore della pagina').'">
<i class="fa fa-arrow-up" title="'.tr('Parte superiore').'"></i>
</div>
<div class="tip" data-toggle="tooltip" title="'.tr('Clicca qui per spostare il widget nella parte laterale').'">
<button type="button" class="btn btn-info btn-xs" onclick="spostaWidget(this)">
<i class="fa fa-arrow-right" title="'.tr('Sposta').'"></i>
</button>
</div>';
} else {
echo '
<div class="tip" data-toggle="tooltip" title="'.tr('Clicca qui per spostare il widget nella parte superiore').'">
<button type="button" class="btn btn-info btn-xs" onclick="spostaWidget(this)">
<i class="fa fa-arrow-up" title="'.tr('Sposta').'"></i>
</button>
</div>
<div class="tip" data-toggle="tooltip" title="'.tr('Questo widget è posizionato nella parte laterale della pagina').'">
<i class="fa fa-arrow-right" title="'.tr('Parte laterale').'"></i>
</div>';
}
echo '
</td>
</tr>';
}
echo '
</tbody>';
}
echo '
</table>
<script>
function disabilitaWidget(button){
const riga = $(button).closest("tr");
const id = riga.data("id");
const nome = riga.data("nome");
const nome_tipo = "widget";
swal({
title: "'.tr('Disabilitare il _TYPE_?', [
'_TYPE_' => '" + nome_tipo + "',
]).'",
html: "'.tr('Sei sicuro di voler disabilitare il _TYPE_ _NAME_?', [
'_TYPE_' => '" + nome_tipo + "',
'_NAME_' => '" + nome + "',
]).'",
type: "warning",
showCancelButton: true,
confirmButtonText: "'.tr('Continua').'"
}).then(function (result) {
let restore = buttonLoading(button);
$.ajax({
url: globals.rootdir + "/actions.php",
type: "POST",
dataType: "JSON",
data: {
id_module: globals.id_module,
op: "disabilita-widget",
id: id,
},
success: function (response) {
caricaElencoWidget();
renderMessages();
},
error: function() {
buttonRestore(button, restore);
swal({
type: "error",
title: globals.translations.ajax.error.title,
text: globals.translations.ajax.error.text,
});
}
});
})
}
function abilitaWidget(button) {
const riga = $(button).closest("tr");
const id = riga.data("id");
const nome = riga.data("nome");
const nome_tipo = "widget";
swal({
title: "'.tr('Abilitare il _TYPE_?', [
'_TYPE_' => '" + nome_tipo + "',
]).'",
html: "'.tr('Sei sicuro di voler abilitare il _TYPE_ _NAME_?', [
'_TYPE_' => '" + nome_tipo + "',
'_NAME_' => '" + nome + "',
]).'",
type: "warning",
showCancelButton: true,
confirmButtonText: "'.tr('Continua').'"
}).then(function (result) {
let restore = buttonLoading(button);
$.ajax({
url: globals.rootdir + "/actions.php",
type: "POST",
dataType: "JSON",
data: {
id_module: globals.id_module,
op: "abilita-widget",
id: id,
},
success: function (response) {
caricaElencoWidget();
renderMessages();
},
error: function() {
buttonRestore(button, restore);
swal({
type: "error",
title: globals.translations.ajax.error.title,
text: globals.translations.ajax.error.text,
});
}
});
})
}
function spostaWidget(button) {
const riga = $(button).closest("tr");
const id = riga.data("id");
let restore = buttonLoading(button);
$.ajax({
url: globals.rootdir + "/actions.php",
type: "POST",
dataType: "JSON",
data: {
id_module: globals.id_module,
op: "sposta-widget",
id: id,
},
success: function (response) {
caricaElencoWidget();
renderMessages();
},
error: function() {
buttonRestore(button, restore);
swal({
type: "error",
title: globals.translations.ajax.error.title,
text: globals.translations.ajax.error.text,
});
}
});
}
</script>';

View File

@ -1,98 +0,0 @@
<?php
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
function submodules($list, $depth = 0)
{
$osm_version = Update::getVersion();
$id_module = Modules::getCurrent()['id'];
$result = '';
foreach ($list as $sub) {
$locked = in_array($sub['name'], ['Utenti e permessi', 'Stato dei servizi']);
// STATO
if (!empty($sub['enabled'])) {
$text = tr('Abilitato');
$text .= !$locked ? '. '.tr('Clicca per disabilitarlo').'...' : '';
$stato = '<i class="fa fa-cog fa-spin text-success tip" title="'.$text.'"></i>';
} else {
$stato = '<i class="fa fa-cog text-warning tip" title="'.tr('Non abilitato').'"></i>';
$class = 'warning';
}
// Possibilità di disabilitare o abilitare i moduli tranne quello degli aggiornamenti
if (!$locked) {
if ($sub['enabled']) {
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Disabilitare questo modulo?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'disable', id: '".$sub['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); }\">".$stato."</a>\n";
} else {
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Abilitare questo modulo?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'enable', id: '".$sub['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); }\"\">".$stato."</a>\n";
}
}
// COMPATIBILITA'
// Controllo per ogni versione se la regexp combacia per dire che è compatibile o meno
$compatibilities = explode(',', $sub['compatibility']);
$comp = false;
foreach ($compatibilities as $compatibility) {
$comp = (preg_match('/'.$compatibility.'/', $osm_version)) ? true : $comp;
}
if ($comp) {
$compatible = '<i class="fa fa-check-circle text-success tip" title="'.tr('Compatibile').'"></i>';
($sub['enabled']) ? $class = 'success' : $class = 'warning';
} else {
$compatible = '<i class="fa fa-warning text-danger tip" title="'.tr('Non compatibile!').' '.tr('Questo modulo è compatibile solo con le versioni').': '.$sub['compatibility'].'"></i>';
$class = 'danger';
}
$result .= '
<tr class="'.$class.'">
<td><small>'.str_repeat('&nbsp;', $depth * 4).'- '.$sub['title'].'</small></td>
<td align="left">'.$sub['version'].'</td>
<td align="center">'.$stato.'</td>
<td align="center">'.$compatible.'</td>';
$result .= '
<td align="center">';
// Possibilità di disinstallare solo se il modulo non è tra quelli predefiniti
if (empty($sub['default'])) {
$result .= '
<a href="javascript:;" class="tip" title="'.tr('Disinstalla')."...\" onclick=\"if( confirm('".tr('Vuoi disinstallare questo modulo?').' '.tr('Tutti i dati salvati andranno persi!')."') ){ if( confirm('".tr('Sei veramente sicuro?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'uninstall', id: '".$sub['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); } }\">
<i class='fa fa-trash'></i>
</a>";
} else {
$result .= "
<a class='disabled text-muted'>
<i class='fa fa-trash'></i>
</a>";
}
$result .= '
</td>
</tr>';
$result .= submodules($sub['all_children'], $depth + 1);
}
return $result;
}

View File

@ -32,44 +32,50 @@ class ServicesHook extends CachedManager
public function cacheData()
{
$response = Services::request('POST', 'informazioni_servizi');
$body = Services::responseBody($response);
$response = Services::request('GET', 'info');
return $body['services'];
return Services::responseBody($response);
}
public function response()
{
$servizi = $this->getCache()->content;
$limite_scadenze = (new Carbon())->addDays(60);
// Elaborazione dei servizi in scadenza
$limite_scadenze = (new Carbon())->addDays(60);
$servizi_in_scadenza = [];
foreach ($servizi as $servizio) {
// Gestione per data di scadenza
$scadenza = new Carbon($servizio['expiration_at']);
if (
(isset($servizio['expiration_at']) && $scadenza->lessThan($limite_scadenze))
) {
$servizi_in_scadenza[] = $servizio['name'].' ('.$scadenza->diffForHumans().')';
}
// Gestione per crediti
elseif (
(isset($servizio['credits']) && $servizio['credits'] < 100)
) {
$servizi_in_scadenza[] = $servizio['name'].' ('.$servizio['credits'].' crediti)';
}
}
$risorse_in_scadenza = self::getRisorseInScadenza($servizi['risorse-api'], $limite_scadenze);
$message = tr('I seguenti servizi sono in scadenza: _LIST_', [
'_LIST_' => implode(', ', $servizi_in_scadenza),
'_LIST_' => implode(', ', $risorse_in_scadenza->pluck('nome')->all()),
]);
return [
'icon' => 'fa fa-refresh text-warning',
'message' => $message,
'show' => !empty($servizi_in_scadenza),
'show' => !$risorse_in_scadenza->isEmpty(),
];
}
/**
* Restituisce l'elenco delle risorse API in scadenza, causa data oppure crediti.
*
* @param $servizi
*/
public static function getRisorseInScadenza($risorse, $limite_scadenze)
{
// Elaborazione dei servizi in scadenza
$risorse_in_scadenza = collect($risorse)
->filter(function ($item) use ($limite_scadenze) {
return (isset($item['expiration_at']) && Carbon::parse($item['expiration_at'])->lessThan($limite_scadenze))
|| (isset($item['credits']) && $item['credits'] < 100);
});
return $risorse_in_scadenza->transform(function ($item, $key) {
return [
'nome' => $item['name'],
'data_scadenza' => $item['expiration_at'],
'crediti' => $item['credits'],
];
});
}
}

View File

@ -82,4 +82,10 @@ INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`,
'(SELECT CONCAT(co_banche.nome, '' - '' , co_banche.iban) FROM co_banche WHERE co_banche.id = id_banca_azienda)', 6, 1, 0, 1);
-- Rimosso reversed sulle note di debito
UPDATE `co_tipidocumento` SET `reversed` = '0' WHERE `co_tipidocumento`.`descrizione` = 'Nota di debito';
UPDATE `co_tipidocumento` SET `reversed` = '0' WHERE `co_tipidocumento`.`descrizione` = 'Nota di debito';
-- Fix recupero informazioni sui servizi attivi
UPDATE `zz_cache` SET `expire_at` = NULL WHERE `zz_cache`.`name` = 'Informazioni su Services';
-- Fix flag default per i plugin
UPDATE `zz_plugins` SET `default` = 1, `version` = '' WHERE `zz_plugins`.`name` IN ('Impianti del cliente', 'Impianti', 'Referenti', 'Sedi', 'Statistiche', 'Interventi svolti', 'Componenti ini', 'Movimenti', 'Serial', 'Consuntivo', 'Consuntivo', 'Pianificazione interventi', 'Ddt del cliente', 'Fatturazione Elettronica', 'Fatturazione Elettronica', 'Revisioni', 'Ricevute FE', 'Giacenze', 'Rinnovi', 'Statistiche', 'Dichiarazioni d''Intento', 'Pianificazione fatturazione', 'Listino Clienti', 'Storico attività', 'Consuntivo', 'Allegati', 'Componenti', 'Listino Fornitori', 'Piani di sconto/maggiorazione', 'Varianti Articolo')