Skip to content

Commit b5d5f79

Browse files
fix: Informazioni services
1 parent 75c7c85 commit b5d5f79

2 files changed

Lines changed: 215 additions & 49 deletions

File tree

modules/stato_servizi/edit.php

Lines changed: 141 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
use API\Services;
2222
use Carbon\Carbon;
23+
use Models\User;
24+
use Util\FileSystem;
2325

2426
include_once __DIR__.'/../../core.php';
2527

@@ -38,10 +40,133 @@
3840
</div>
3941
4042
<div class="card-body p-0">';
43+
$servizi = Services::getServiziAttivi(true)->flatten(1);
44+
if (!$servizi->isEmpty()) {
45+
// Calcolo degli elementi in scadenza e scadut
46+
$servizi_in_scadenza = $servizi->filter(function ($item) use ($limite_scadenze) {
47+
if (!is_array($item) || !isset($item['data_conclusione'])) {
48+
return false;
49+
}
50+
$scadenza = Carbon::parse($item['data_conclusione']);
51+
$is_expiring = $scadenza->greaterThan(Carbon::now()) && $scadenza->lessThan($limite_scadenze);
4152

42-
// Recupero di tutti i servizi e risorse attivi
43-
$servizi = Services::getServiziAttivi(true);
53+
return $is_expiring;
54+
});
55+
56+
$servizi_scaduti = $servizi->filter(function ($item) {
57+
if (!is_array($item) || !isset($item['data_conclusione'])) {
58+
return false;
59+
}
60+
$scadenza = Carbon::parse($item['data_conclusione']);
61+
$is_expired = $scadenza->lessThan(Carbon::now());
62+
63+
return $is_expired;
64+
});
65+
66+
// Messaggi di avviso
67+
if (!$servizi_scaduti->isEmpty()) {
68+
echo '
69+
<div class="alert alert-danger m-3 mb-0">
70+
<i class="fa fa-exclamation-triangle mr-2"></i>'.tr('Attenzione, alcuni elementi sono scaduti: _NUM_', [
71+
'_NUM_' => $servizi_scaduti->count(),
72+
]).'
73+
</div>';
74+
}
75+
76+
if (!$servizi_in_scadenza->isEmpty()) {
77+
echo '
78+
<div class="alert alert-warning m-3 mb-0">
79+
<i class="fa fa-clock-o mr-2"></i>'.tr('Attenzione, alcuni elementi sono in scadenza: _NUM_', [
80+
'_NUM_' => $servizi_in_scadenza->count(),
81+
]).'
82+
</div>';
83+
}
84+
85+
echo '
86+
<table class="table table-hover table-striped table-sm mb-0">
87+
<thead>
88+
<tr>
89+
<th width="5%" class="text-center">'.tr('Stato').'</th>
90+
<th>'.tr('Nome').'</th>
91+
<th width="15%">'.tr('Tipo').'</th>
92+
<th width="15%">'.tr('Scadenza').'</th>
93+
<th width="20%" class="text-center"></th>
94+
</tr>
95+
</thead>
96+
97+
<tbody>';
98+
foreach ($servizi as $servizio) {
99+
$scadenza = Carbon::parse($servizio['data_conclusione']);
100+
$is_expired = $scadenza->lessThan(Carbon::now());
101+
$is_expiring = $scadenza->greaterThan(Carbon::now()) && $scadenza->lessThan($limite_scadenze);
102+
103+
$spazio_utilizzato = FileSystem::folderSize(base_dir(), ['htaccess']) / (1024 ** 3);
104+
$utenti_attivi = User::where('enabled', 1)->count();
105+
$spazio_warning = $servizio['spazio_limite'] && $spazio_utilizzato >= $servizio['spazio_limite'];
106+
$utenti_warning = $servizio['utenti_limite'] && $utenti_attivi >= $servizio['utenti_limite'];
107+
108+
// Determinazione dello stato
109+
$status_class = $is_expired ? 'table-danger' : ($is_expiring ? 'table-warning' : '');
110+
$status_icon = $is_expired ? '<i class="fa fa-times-circle text-danger" title="'.tr('Scaduto/Esaurito').'"></i>' :
111+
($is_expiring ? '<i class="fa fa-exclamation-triangle text-warning" title="'.tr('Attenzione').'"></i>' :
112+
'<i class="fa fa-check-circle text-success" title="'.tr('Attivo').'"></i>');
113+
114+
$spazio_class = ($spazio_warning ? 'danger' : 'secondary');
115+
$spazio_icon = ($spazio_warning ? '<i class="fa fa-exclamation-triangle" title="'.tr('Attenzione').'"></i>' : '');
116+
$utenti_class = ($utenti_warning ? 'danger' : 'secondary');
117+
$utenti_icon = ($utenti_warning ? '<i class="fa fa-exclamation-triangle" title="'.tr('Attenzione').'"></i>' : '');
118+
echo '
119+
<tr class="'.$status_class.'">
120+
<td class="text-center">'.$status_icon.'</td>
121+
<td><strong>'.$servizio['codice'].'</strong><br><small class="text-muted">'.$servizio['nome'].'</small></td>
122+
<td><span class="badge badge-info">'.$servizio['sottocategoria'].'</span></td>
123+
<td>'.dateFormat($scadenza).' <br><small class="text-muted">'.$scadenza->diffForHumans().'</small></td>
124+
<td class="text-center">
125+
'.($servizio['spazio_limite'] ? '<span class="badge badge-'.$spazio_class.'"><i class="fa fa-database mr-1"></i> '.numberFormat($spazio_utilizzato,1).' / '.numberFormat($servizio['spazio_limite'],1).' '.tr('GB').' '.$spazio_icon.'</span>' : '').'
126+
'.($servizio['utenti_limite'] ? '<br><span class="badge badge-'.$utenti_class.'"><i class="fa fa-users mr-1"></i> '.$utenti_attivi.' / '.$servizio['utenti_limite'].' '.tr('utenti').' '.$utenti_icon.'</span>' : '').'
127+
</td>
128+
</tr>';
129+
}
130+
131+
// Conteggio servizi e risorse
132+
$count_servizi = $servizi->filter(fn ($item) => !isset($item['credits']))->count();
133+
echo '
134+
</tbody>
135+
<tfoot>
136+
<tr class="table-light">
137+
<td colspan="4">
138+
<strong>'.tr('Totale elementi: _NUM_', ['_NUM_' => $servizi->count()]).'</strong>
139+
</td>
140+
<td colspan="2" class="text-right">';
141+
if (!$servizi_in_scadenza->isEmpty() || !$servizi_scaduti->isEmpty()) {
142+
echo '<a href="https://marketplace.devcode.it/" target="_blank" id="btn_rinnova" class="btn btn-sm btn-warning"><i class="fa fa-shopping-cart mr-1"></i>'.tr('Rinnova').'</a>';
143+
}
144+
echo '
145+
</td>
146+
</tr>
147+
</tfoot>
148+
</table>';
149+
} else {
150+
echo '
151+
<div class="alert alert-info m-3">
152+
<i class="fa fa-info-circle mr-2"></i>'.tr('Nessun servizio abilitato al momento').'.
153+
</div>';
154+
}
155+
echo '
156+
</div>
157+
</div>
158+
159+
<div class="card card-primary card-outline">
160+
<div class="card-header">
161+
<div class="card-title">
162+
<i class="fa fa-cubes mr-2"></i>'.tr('Risorse').'
163+
</div>
164+
</div>
44165
166+
<div class="card-body p-0">';
167+
168+
// Recupero di tutti i servizi e risorse attivi
169+
$servizi = Services::getRisorseAttive(true);
45170
if (!$servizi->isEmpty()) {
46171
// Calcolo degli elementi in scadenza e scadut
47172
$servizi_in_scadenza = $servizi->filter(function ($item) use ($limite_scadenze) {
@@ -90,11 +215,10 @@
90215
<thead>
91216
<tr>
92217
<th width="5%" class="text-center">'.tr('Stato').'</th>
93-
<th width="35%">'.tr('Nome').'</th>
218+
<th>'.tr('Nome').'</th>
94219
<th width="15%">'.tr('Tipo').'</th>
95-
<th width="15%">'.tr('Crediti').'</th>
96-
<th width="20%">'.tr('Scadenza').'</th>
97-
<th width="10%" class="text-center">'.tr('#').'</th>
220+
<th width="15%">'.tr('Scadenza').'</th>
221+
<th width="20%" class="text-center">'.tr('#').'</th>
98222
</tr>
99223
</thead>
100224
@@ -118,6 +242,10 @@
118242
(($is_expiring || $credits_warning) ? '<i class="fa fa-exclamation-triangle text-warning" title="'.tr('Attenzione').'"></i>' :
119243
'<i class="fa fa-check-circle text-success" title="'.tr('Attivo').'"></i>');
120244

245+
$credits_class = ($credits_expired ? 'danger' : ($credits_warning ? 'warning' : 'secondary'));
246+
$credits_icon = ($credits_warning || $credits_expired ? '<i class="fa fa-exclamation-triangle" title="'.tr('Attenzione').'"></i>' : '');
247+
248+
121249
// Campi dell'elemento
122250
$codice = $elemento['code'] ?? $elemento['name'] ?? 'N/A';
123251
$nome = $elemento['name'] ?? 'N/A';
@@ -132,11 +260,10 @@
132260
<tr class="'.$status_class.'">
133261
<td class="text-center">'.$status_icon.'</td>
134262
<td><strong>'.$codice.'</strong><br><small class="text-muted">'.$nome.'</small></td>
135-
<td><span class="badge badge-secondary">'.$tipo.'</span></td>
136-
<td>'.$crediti_display.'</td>
263+
<td><span class="badge badge-info">'.$tipo.'</span></td>
137264
<td>'.dateFormat($scadenza).' <br><small class="text-muted">'.$scadenza->diffForHumans().'</small></td>
138265
<td class="text-center">
139-
<input type="checkbox" class="check_rinnova '.($is_expiring || $is_expired || $credits_warning || $credits_expired ? '' : 'hide').'" name="rinnova[]" value="'.$codice.'">
266+
<span class="badge badge-'.$credits_class.'">'.$crediti_display.' '.tr('Crediti').' '.$credits_icon.'</span>
140267
</td>
141268
</tr>';
142269
}
@@ -152,12 +279,11 @@
152279
<strong>'.tr('Totale elementi: _NUM_', ['_NUM_' => $servizi->count()]).'</strong>
153280
</td>
154281
<td colspan="2" class="text-right">';
155-
156-
if (!$servizi_in_scadenza->isEmpty() || !$servizi_scaduti->isEmpty()) {
157-
echo '<a href="https://marketplace.devcode.it/" target="_blank" id="btn_rinnova" class="btn btn-sm btn-primary"><i class="fa fa-shopping-cart mr-1"></i>'.tr('Rinnova').'</a>';
158-
}
159-
160-
echo ' </td>
282+
if (!$servizi_in_scadenza->isEmpty() || !$servizi_scaduti->isEmpty()) {
283+
echo '<a href="https://marketplace.devcode.it/" target="_blank" id="btn_rinnova" class="btn btn-sm btn-warning"><i class="fa fa-shopping-cart mr-1"></i>'.tr('Rinnova').'</a>';
284+
}
285+
echo '
286+
</td>
161287
</tr>
162288
</tfoot>
163289
</table>';
@@ -168,7 +294,6 @@
168294
<i class="fa fa-info-circle mr-2"></i>'.tr('Nessun servizio OSMCloud abilitato al momento').'.
169295
</div>';
170296
}
171-
172297
echo '
173298
</div>
174299
</div>
@@ -319,24 +444,6 @@
319444
</div>
320445
</div>
321446
<script>
322-
323-
$(".check_rinnova").each(function() {
324-
325-
var len = 0;
326-
327-
input(this).change(function() {
328-
329-
len = $("input[type=checkbox]:checked.check_rinnova").length;
330-
331-
if (len>0){
332-
$("#btn_rinnova").removeClass("disabled");
333-
}else{
334-
$("#btn_rinnova").addClass("disabled");
335-
}
336-
337-
});
338-
});
339-
340447
function aggiornaStatisticheFE(){
341448
$.ajax({
342449
url: globals.rootdir + "/actions.php",
@@ -358,7 +465,6 @@ function aggiornaStatisticheFE(){
358465
if (response.avviso_spazio) {
359466
360467
$("#spazio-fe").removeClass("hidden");
361-
$("input.check_rinnova").addClass("disabled");
362468
363469
response.spazio_occupato = parseFloat(response.spazio_occupato);
364470
response.spazio_totale = parseFloat(response.spazio_totale);
@@ -386,10 +492,8 @@ function aggiornaStatisticheFE(){
386492
if (response.history.length) {
387493
388494
for (let i = 0; i < response.history.length; i++) {
389-
390495
const data = response.history[i];
391496
if (data["year"] == '.date('Y').'){
392-
393497
var highlight = "<tr class=\"info\" >";
394498
var number = data["number"];
395499
@@ -403,10 +507,7 @@ function aggiornaStatisticheFE(){
403507
$("#numero-fe-totale").html(response.maxNumber);
404508
405509
if (response.avviso_numero) {
406-
407510
$("#numero-fe").removeClass("hidden");
408-
$("input.check_rinnova").addClass("disabled");
409-
410511
if (number<response.maxNumber){
411512
$("#numero-fe-icon").addClass("fa fa-clock-o");
412513
$("#numero-fe").addClass("alert-warning");

src/API/Services.php

Lines changed: 74 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
use Carbon\Carbon;
2424
use GuzzleHttp\Client;
2525
use Models\Cache;
26+
use Models\User;
27+
use Util\FileSystem;
2628

2729
/**
2830
* Classe per l'interazione con API esterne.
@@ -51,13 +53,24 @@ public static function isEnabled()
5153
public static function getInformazioni($force = false)
5254
{
5355
try {
54-
$response = self::request('GET', 'info');
55-
$content = self::responseBody($response);
56+
// Calcolo spazio occupato
57+
$spazio_occupato = self::calcolaSpazioOccupato();
5658

57-
// Verifica che la risposta contenga i dati attesi
58-
if (!is_array($content) || !isset($content['risorse-api'])) {
59-
return ['risorse-api' => []];
60-
}
59+
// Conteggio utenti attivi
60+
$utenti_attivi = self::contaUtentiAttivi();
61+
62+
// Recupero ultimi 100 accessi
63+
$ultimi_accessi = self::getUltimiAccessi();
64+
65+
$response = self::request('GET', 'info', [
66+
'spazio_occupato' => $spazio_occupato,
67+
'utenti_attivi' => $utenti_attivi,
68+
'versione' => \Update::getVersion(),
69+
'ultimi_accessi' => $ultimi_accessi,
70+
'sync_at' => Carbon::now()->toDateTimeString(),
71+
'url_installazione' => base_url()
72+
]);
73+
$content = self::responseBody($response);
6174

6275
return $content;
6376
} catch (\Exception $e) {
@@ -78,7 +91,7 @@ public static function getInformazioni($force = false)
7891
*/
7992
public static function getServiziAttivi($force = false)
8093
{
81-
return collect(self::getInformazioni($force)['risorse-api']);
94+
return collect(self::getInformazioni($force)['servizi']);
8295
}
8396

8497
/**
@@ -91,7 +104,7 @@ public static function getServiziAttivi($force = false)
91104
public static function getServiziInScadenza($limite_scadenze)
92105
{
93106
return self::getServiziAttivi()
94-
->filter(fn ($item) => is_array($item) && isset($item['expiration_at']) && Carbon::parse($item['expiration_at'])->greaterThan(Carbon::now()) && Carbon::parse($item['expiration_at'])->lessThan($limite_scadenze));
107+
->filter(fn ($item) => is_array($item) && isset($item['data_conclusione']) && Carbon::parse($item['data_conclusione'])->greaterThan(Carbon::now()) && Carbon::parse($item['data_conclusione'])->lessThan($limite_scadenze));
95108
}
96109

97110
/**
@@ -102,7 +115,7 @@ public static function getServiziInScadenza($limite_scadenze)
102115
public static function getServiziScaduti()
103116
{
104117
return self::getServiziAttivi()
105-
->filter(fn ($item) => is_array($item) && isset($item['expiration_at']) && Carbon::parse($item['expiration_at'])->lessThan(Carbon::now()));
118+
->filter(fn ($item) => is_array($item) && isset($item['data_conclusione']) && Carbon::parse($item['data_conclusione'])->lessThan(Carbon::now()));
106119
}
107120

108121
/**
@@ -209,4 +222,56 @@ protected static function getClient()
209222

210223
return self::$client;
211224
}
225+
226+
/**
227+
* Calcola lo spazio occupato dal sistema.
228+
*
229+
* @return int Spazio occupato in bytes
230+
*/
231+
protected static function calcolaSpazioOccupato()
232+
{
233+
try {
234+
// Prova a recuperare dalla cache
235+
$cache = Cache::where('name', 'Spazio utilizzato')->first();
236+
if ($cache && $cache->isValid()) {
237+
return (int) $cache->content;
238+
}
239+
$osm_size = FileSystem::folderSize(base_dir(), ['htaccess']);
240+
241+
return $osm_size;
242+
} catch (\Exception $e) {
243+
// In caso di errore, restituisce 0
244+
return 0;
245+
}
246+
}
247+
248+
/**
249+
* Conta gli utenti attivi nel sistema.
250+
*
251+
* @return int Numero di utenti attivi
252+
*/
253+
protected static function contaUtentiAttivi()
254+
{
255+
try {
256+
$result = User::where('enabled', 1)->count();
257+
258+
return (int) $result;
259+
} catch (\Exception $e) {
260+
// In caso di errore, restituisce 0
261+
return 0;
262+
}
263+
}
264+
265+
/**
266+
* Recupera gli ultimi 100 accessi.
267+
*
268+
* @return string JSON
269+
*/
270+
protected static function getUltimiAccessi()
271+
{
272+
$database = database();
273+
$logs = $database->fetchArray('SELECT username, ip, created_at FROM zz_logs ORDER BY created_at DESC LIMIT 100');
274+
275+
return json_encode($logs);
276+
}
212277
}

0 commit comments

Comments
 (0)