|
35 | 35 | <div class="card card-primary card-outline"> |
36 | 36 | <div class="card-header"> |
37 | 37 | <div class="card-title"> |
38 | | - <i class="fa fa-cogs mr-2"></i>'.tr('Servizi OSMCloud').' |
| 38 | + <i class="fa fa-cogs mr-2"></i>'.tr('Servizi e Risorse OSMCloud').' |
39 | 39 | </div> |
40 | 40 | </div> |
41 | 41 |
|
42 | 42 | <div class="card-body p-0">'; |
| 43 | + |
| 44 | + // Recupero servizi e risorse |
43 | 45 | $servizi = Services::getServiziAttivi(true)->flatten(1); |
44 | | - if (!$servizi->isEmpty()) { |
45 | | - // Calcolo degli elementi in scadenza e scadut |
| 46 | + $risorse = Services::getRisorseAttive(true); |
| 47 | + |
| 48 | + // Combina servizi e risorse in un'unica collezione |
| 49 | + $tutti_elementi = collect(); |
| 50 | + |
| 51 | + // Aggiungi servizi (con flag per identificarli) |
| 52 | + foreach ($servizi as $servizio) { |
| 53 | + $servizio['tipo_elemento'] = 'servizio'; |
| 54 | + $tutti_elementi->push($servizio); |
| 55 | + } |
| 56 | + |
| 57 | + // Aggiungi risorse (con flag per identificarli) |
| 58 | + foreach ($risorse as $risorsa) { |
| 59 | + $risorsa['tipo_elemento'] = 'risorsa'; |
| 60 | + $tutti_elementi->push($risorsa); |
| 61 | + } |
| 62 | + |
| 63 | + if (!$tutti_elementi->isEmpty()) { |
| 64 | + // Calcolo degli elementi in scadenza e scaduti (servizi) |
46 | 65 | $servizi_in_scadenza = $servizi->filter(function ($item) use ($limite_scadenze) { |
47 | 66 | if (!is_array($item) || !isset($item['data_conclusione'])) { |
48 | 67 | return false; |
|
63 | 82 | return $is_expired; |
64 | 83 | }); |
65 | 84 |
|
66 | | - // Messaggi di avviso |
67 | | - if (!$servizi_scaduti->isEmpty()) { |
| 85 | + // Calcolo degli elementi in scadenza e scaduti (risorse) |
| 86 | + $risorse_in_scadenza = $risorse->filter(function ($item) use ($limite_scadenze) { |
| 87 | + if (!is_array($item) || !isset($item['expiration_at'])) { |
| 88 | + return false; |
| 89 | + } |
| 90 | + $scadenza = Carbon::parse($item['expiration_at']); |
| 91 | + $credits_warning = isset($item['credits']) && $item['credits'] < 100 && $item['credits'] !== null; |
| 92 | + $is_expiring = $scadenza->greaterThan(Carbon::now()) && $scadenza->lessThan($limite_scadenze); |
| 93 | + |
| 94 | + return $is_expiring || $credits_warning; |
| 95 | + }); |
| 96 | + |
| 97 | + $risorse_scadute = $risorse->filter(function ($item) { |
| 98 | + if (!is_array($item) || !isset($item['expiration_at'])) { |
| 99 | + return false; |
| 100 | + } |
| 101 | + $scadenza = Carbon::parse($item['expiration_at']); |
| 102 | + $credits_expired = isset($item['credits']) && $item['credits'] < 0; |
| 103 | + $is_expired = $scadenza->lessThan(Carbon::now()); |
| 104 | + |
| 105 | + return $is_expired || $credits_expired; |
| 106 | + }); |
| 107 | + |
| 108 | + // Totali unificati |
| 109 | + $totale_scaduti = $servizi_scaduti->count() + $risorse_scadute->count(); |
| 110 | + $totale_in_scadenza = $servizi_in_scadenza->count() + $risorse_in_scadenza->count(); |
| 111 | + |
| 112 | + // Messaggi di avviso unificati |
| 113 | + if ($totale_scaduti > 0) { |
68 | 114 | echo ' |
69 | 115 | <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(), |
| 116 | + <i class="fa fa-exclamation-triangle mr-2"></i>'.tr('Attenzione, alcuni elementi sono scaduti o hanno esaurito i crediti: _NUM_', [ |
| 117 | + '_NUM_' => $totale_scaduti, |
72 | 118 | ]).' |
73 | 119 | </div>'; |
74 | 120 | } |
75 | 121 |
|
76 | | - if (!$servizi_in_scadenza->isEmpty()) { |
| 122 | + if ($totale_in_scadenza > 0) { |
77 | 123 | echo ' |
78 | 124 | <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(), |
| 125 | + <i class="fa fa-clock-o mr-2"></i>'.tr('Attenzione, alcuni elementi sono in scadenza o stanno per esaurire i crediti: _NUM_', [ |
| 126 | + '_NUM_' => $totale_in_scadenza, |
81 | 127 | ]).' |
82 | 128 | </div>'; |
83 | 129 | } |
|
90 | 136 | <th>'.tr('Nome').'</th> |
91 | 137 | <th width="15%">'.tr('Tipo').'</th> |
92 | 138 | <th width="15%">'.tr('Scadenza').'</th> |
93 | | - <th width="20%" class="text-center"></th> |
| 139 | + <th width="20%" class="text-center">'.tr('Info').'</th> |
94 | 140 | </tr> |
95 | 141 | </thead> |
96 | 142 |
|
97 | 143 | <tbody>'; |
| 144 | + |
| 145 | + // Prima mostra i servizi |
98 | 146 | foreach ($servizi as $servizio) { |
99 | 147 | $scadenza = Carbon::parse($servizio['data_conclusione']); |
100 | 148 | $is_expired = $scadenza->lessThan(Carbon::now()); |
|
112 | 160 | '<i class="fa fa-check-circle text-success" title="'.tr('Attivo').'"></i>'); |
113 | 161 |
|
114 | 162 | $spazio_class = ($spazio_warning ? 'danger' : 'secondary'); |
115 | | - $spazio_icon = ($spazio_warning ? '<i class="fa fa-exclamation-triangle" title="'.tr('Attenzione').'"></i>' : ''); |
| 163 | + $spazio_icon = ($spazio_warning ? '<i class="fa fa-exclamation-triangle" style="font-size: 0.65rem; margin-left: 4px;" title="'.tr('Attenzione').'"></i>' : ''); |
116 | 164 | $utenti_class = ($utenti_warning ? 'danger' : 'secondary'); |
117 | | - $utenti_icon = ($utenti_warning ? '<i class="fa fa-exclamation-triangle" title="'.tr('Attenzione').'"></i>' : ''); |
| 165 | + $utenti_icon = ($utenti_warning ? '<i class="fa fa-exclamation-triangle" style="font-size: 0.65rem; margin-left: 4px;" title="'.tr('Attenzione').'"></i>' : ''); |
118 | 166 | echo ' |
119 | 167 | <tr class="'.$status_class.'"> |
120 | 168 | <td class="text-center">'.$status_icon.'</td> |
121 | 169 | <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> |
| 170 | + <td><span class="badge badge-primary">'.$servizio['sottocategoria'].'</span><br><small class="text-muted"> |
123 | 171 | <td>'.dateFormat($scadenza).' <br><small class="text-muted">'.$scadenza->diffForHumans().'</small></td> |
124 | 172 | <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>' : '').' |
| 173 | + '.($servizio['spazio_limite'] ? '<div class="mb-1"><span class="badge badge-'.$spazio_class.' d-inline-flex align-items-center" style="font-size: 0.7rem; padding: 0.25rem 0.5rem; line-height: 1.2;"><i class="fa fa-database" style="font-size: 0.65rem; margin-right: 4px;"></i>'.numberFormat($spazio_utilizzato,1).' / '.numberFormat($servizio['spazio_limite'],1).' '.tr('GB').$spazio_icon.'</span></div>' : '').' |
| 174 | + '.($servizio['utenti_limite'] ? '<div><span class="badge badge-'.$utenti_class.' d-inline-flex align-items-center" style="font-size: 0.7rem; padding: 0.25rem 0.5rem; line-height: 1.2;"><i class="fa fa-users" style="font-size: 0.65rem; margin-right: 4px;"></i>'.$utenti_attivi.' / '.$servizio['utenti_limite'].' '.tr('utenti').$utenti_icon.'</span></div>' : '').' |
127 | 175 | </td> |
128 | 176 | </tr>'; |
129 | 177 | } |
130 | 178 |
|
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> |
165 | | -
|
166 | | - <div class="card-body p-0">'; |
167 | | - |
168 | | - // Recupero di tutti i servizi e risorse attivi |
169 | | - $servizi = Services::getRisorseAttive(true); |
170 | | - if (!$servizi->isEmpty()) { |
171 | | - // Calcolo degli elementi in scadenza e scaduti |
172 | | - $servizi_in_scadenza = $servizi->filter(function ($item) use ($limite_scadenze) { |
173 | | - if (!is_array($item) || !isset($item['expiration_at'])) { |
174 | | - return false; |
175 | | - } |
176 | | - $scadenza = Carbon::parse($item['expiration_at']); |
177 | | - $credits_warning = isset($item['credits']) && $item['credits'] < 100 && $item['credits'] !== null; |
178 | | - $is_expiring = $scadenza->greaterThan(Carbon::now()) && $scadenza->lessThan($limite_scadenze); |
179 | | - |
180 | | - return $is_expiring || $credits_warning; |
181 | | - }); |
182 | | - |
183 | | - $servizi_scaduti = $servizi->filter(function ($item) { |
184 | | - if (!is_array($item) || !isset($item['expiration_at'])) { |
185 | | - return false; |
186 | | - } |
187 | | - $scadenza = Carbon::parse($item['expiration_at']); |
188 | | - $credits_expired = isset($item['credits']) && $item['credits'] < 0; |
189 | | - $is_expired = $scadenza->lessThan(Carbon::now()); |
190 | | - |
191 | | - return $is_expired || $credits_expired; |
192 | | - }); |
193 | | - |
194 | | - // Messaggi di avviso |
195 | | - if (!$servizi_scaduti->isEmpty()) { |
196 | | - echo ' |
197 | | - <div class="alert alert-danger m-3 mb-0"> |
198 | | - <i class="fa fa-exclamation-triangle mr-2"></i>'.tr('Attenzione, alcuni elementi sono scaduti o hanno esaurito i crediti: _NUM_', [ |
199 | | - '_NUM_' => $servizi_scaduti->count(), |
200 | | - ]).' |
201 | | - </div>'; |
202 | | - } |
203 | | - |
204 | | - if (!$servizi_in_scadenza->isEmpty()) { |
205 | | - echo ' |
206 | | - <div class="alert alert-warning m-3 mb-0"> |
207 | | - <i class="fa fa-clock-o mr-2"></i>'.tr('Attenzione, alcuni elementi sono in scadenza o stanno per esaurire i crediti: _NUM_', [ |
208 | | - '_NUM_' => $servizi_in_scadenza->count(), |
209 | | - ]).' |
210 | | - </div>'; |
211 | | - } |
212 | | - |
213 | | - echo ' |
214 | | - <table class="table table-hover table-striped table-sm mb-0"> |
215 | | - <thead> |
216 | | - <tr> |
217 | | - <th width="5%" class="text-center">'.tr('Stato').'</th> |
218 | | - <th>'.tr('Nome').'</th> |
219 | | - <th width="15%">'.tr('Tipo').'</th> |
220 | | - <th width="15%">'.tr('Scadenza').'</th> |
221 | | - <th width="20%" class="text-center">'.tr('#').'</th> |
222 | | - </tr> |
223 | | - </thead> |
224 | | -
|
225 | | - <tbody>'; |
226 | | - foreach ($servizi as $elemento) { |
| 179 | + // Poi mostra le risorse |
| 180 | + foreach ($risorse as $elemento) { |
227 | 181 | // Verifica che $elemento sia un array e contenga i campi necessari |
228 | 182 | if (!is_array($elemento) || !isset($elemento['expiration_at'])) { |
229 | 183 | continue; |
|
245 | 199 | $credits_class = ($credits_expired ? 'danger' : ($credits_warning ? 'warning' : 'secondary')); |
246 | 200 | $credits_icon = ($credits_warning || $credits_expired ? '<i class="fa fa-exclamation-triangle" title="'.tr('Attenzione').'"></i>' : ''); |
247 | 201 |
|
248 | | - |
249 | 202 | // Campi dell'elemento |
250 | | - $codice = $elemento['code'] ?? $elemento['name'] ?? 'N/A'; |
251 | | - $nome = $elemento['name'] ?? 'N/A'; |
252 | | - $tipo = $elemento['type'] ?? $elemento['category'] ?? 'N/A'; |
| 203 | + $codice = $elemento['code']; |
| 204 | + $nome = $elemento['name']; |
253 | 205 |
|
254 | 206 | // Gestione crediti: mostra solo se presenti, altrimenti "-" |
255 | | - $crediti_display = $has_credits ? |
256 | | - ($credits_warning || $credits_expired ? '<i class="fa fa-exclamation-triangle text-warning mr-1"></i>' : '').($elemento['credits'] ?? '-') : |
257 | | - '<span class="text-muted">-</span>'; |
| 207 | + $crediti_display = $has_credits ? ($elemento['credits'] ?? '-') : 'Infiniti'; |
| 208 | + $credits_warning_icon = ($credits_warning || $credits_expired) ? '<i class="fa fa-exclamation-triangle" style="font-size: 0.7rem; margin-left: 3px;"></i>' : ''; |
258 | 209 |
|
259 | 210 | echo ' |
260 | 211 | <tr class="'.$status_class.'"> |
261 | 212 | <td class="text-center">'.$status_icon.'</td> |
262 | | - <td><strong>'.$codice.'</strong><br><small class="text-muted">'.$nome.'</small></td> |
263 | | - <td><span class="badge badge-info">'.$tipo.'</span></td> |
| 213 | + <td><strong>'.$nome.'</strong><br><small class="text-muted">'.$codice.'</small></td> |
| 214 | + <td><span class="badge badge-info">'.tr('Risorsa').'</span></td> |
264 | 215 | <td>'.dateFormat($scadenza).' <br><small class="text-muted">'.$scadenza->diffForHumans().'</small></td> |
265 | 216 | <td class="text-center"> |
266 | | - <span class="badge badge-'.$credits_class.'">'.$crediti_display.' '.tr('Crediti').' '.$credits_icon.'</span> |
| 217 | + <span class="badge badge-'.$credits_class.' d-inline-flex align-items-center" style="font-size: 0.75rem;">'.$crediti_display.' '.tr('Crediti').' '.$credits_warning_icon.'</span> |
267 | 218 | </td> |
268 | 219 | </tr>'; |
269 | 220 | } |
270 | 221 |
|
271 | | - // Conteggio servizi e risorse |
272 | | - $count_servizi = $servizi->filter(fn ($item) => !isset($item['credits']))->count(); |
273 | | - |
274 | 222 | echo ' |
275 | 223 | </tbody> |
276 | 224 | <tfoot> |
277 | 225 | <tr class="table-light"> |
278 | 226 | <td colspan="4"> |
279 | | - <strong>'.tr('Totale elementi: _NUM_', ['_NUM_' => $servizi->count()]).'</strong> |
| 227 | + <strong>'.tr('Totale elementi: _NUM_ (_SERVIZI_ servizi, _RISORSE_ risorse)', [ |
| 228 | + '_NUM_' => $tutti_elementi->count(), |
| 229 | + '_SERVIZI_' => $servizi->count(), |
| 230 | + '_RISORSE_' => $risorse->count() |
| 231 | + ]).'</strong> |
280 | 232 | </td> |
281 | | - <td colspan="2" class="text-right">'; |
282 | | - if (!$servizi_in_scadenza->isEmpty() || !$servizi_scaduti->isEmpty()) { |
| 233 | + <td class="text-right">'; |
| 234 | + if ($totale_in_scadenza > 0 || $totale_scaduti > 0) { |
283 | 235 | 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 | 236 | } |
285 | 237 | echo ' |
|
291 | 243 | } else { |
292 | 244 | echo ' |
293 | 245 | <div class="alert alert-info m-3"> |
294 | | - <i class="fa fa-info-circle mr-2"></i>'.tr('Nessun servizio OSMCloud abilitato al momento').'. |
| 246 | + <i class="fa fa-info-circle mr-2"></i>'.tr('Nessun servizio o risorsa OSMCloud abilitato al momento').'. |
295 | 247 | </div>'; |
296 | 248 | } |
297 | 249 | echo ' |
|
0 commit comments