π― Analyze - Fix Filtri Data Intelligenti
π― Analyze - Fix Filtri Data Intelligenti
Data: 21 Ottobre 2025 Componente: Operations Analysis File Modificati:
app/Http/Controllers/Admin/I40/OperationsAnalysisController.phpresources/views/admin/i40/operations/index.blade.phpresources/views/admin/i40/operations/analyze.blade.php- β Eliminata toolbar custom (search, refresh, colonne, export)
- β Bootstrap Table gestisce tutto nativamente
- β ~30 righe JavaScript eliminate
- β 1 query aggiuntiva solo al primo render (MIN/MAX)
- β Nessuna query se date specificate
- β Cache friendly: Range reale non cambia spesso
- β Campi data puliti: No date "strane" al primo caricamento
- β Tutti i dati visibili: Default mostra tutto il periodo
- β Auto-correzione: Date invertite corrette automaticamente
- β Auto-submit: Cambiare data applica immediatamente
- β Range intelligente: Usa dati reali, non arbitrari
- β Fallback robusto: Se DB vuoto, ultimi 30 giorni
- β Validazione: Date sempre coerenti
- Query MIN/MAX se date non specificate
- Usa range reale dei dati
- Validazione e auto-swap date invertite
---
β Problema Originale
Date Sballate al Primo Render
``
Utente clicca "Analisi Completa"
β
Link passa: date_from=2023-05-01, date_to=2023-05-31
β
Ma i dati reali sono: 2023-05-01 β 2023-10-15
β
β Risultato: Vista limitata, perde 5 mesi di dati!
`Altro Problema
`
Utente seleziona date invertite:
date_from=2025-10-01, date_to=2025-09-01
β
β Query non restituisce dati (range impossibile)
`---
β
Soluzione Implementata: Opzione A
1. π Link Pulito (Senza Date)
File:
operations/index.blade.phpPrima:
`php
<a href="{{ route('admin.i40.operations.analyze', [
'machine_id' => $machine['id'],
'date_from' => $machine['last_csv_date_from'], // β Date CSV
'date_to' => $machine['last_csv_date_to'] // β Limitanti
]) }}">
`Dopo:
`php
<a href="{{ route('admin.i40.operations.analyze', [
'machine_id' => $machine['id'] // β
SOLO machine_id
]) }}">
`Condizione Bottone:
`php
// Prima: basato su date CSV
@if($machine['last_csv_date_from'] && $machine['last_csv_date_to'])// Dopo: basato su dati totali
@if($machine['total_operations'] > 0)
`---
2. π§ Date Intelligenti nel Controller
File:
OperationsAnalysisController.php β index()`php
// β
Se date NON specificate dall'utente
if (!$request->input('date_from') || !$request->input('date_to')) {
// Trova range REALE dei dati in database
$realRange = MachineOperationLog::where('machine_id', $selectedMachine->id)
->selectRaw('MIN(timestamp) as min_date, MAX(timestamp) as max_date')
->first();
if ($realRange && $realRange->min_date && $realRange->max_date) {
// β
Usa date reali (tutto il periodo disponibile)
$dateFrom = Carbon::parse($realRange->min_date)->startOfDay();
$dateTo = Carbon::parse($realRange->max_date)->endOfDay();
} else {
// Fallback: ultimi 30 giorni se DB vuoto
$dateFrom = now()->subMonth()->startOfDay();
$dateTo = now()->endOfDay();
}
} else {
// Date specificate dall'utente
$dateFrom = Carbon::parse($request->input('date_from'))->startOfDay();
$dateTo = Carbon::parse($request->input('date_to'))->endOfDay();
}// β
Validazione: inverti se sballate
if ($dateFrom->gt($dateTo)) {
[$dateFrom, $dateTo] = [$dateTo, $dateFrom];
}
`---
3. π Auto-Submit Date nella Vista
File:
analyze.blade.php β renderFilters()`javascript
// β
Auto-submit quando cambia una data
setTimeout(() => {
const dateInputs = container.querySelectorAll('input[type="date"]');
dateInputs.forEach(input => {
input.addEventListener('change', function() {
document.getElementById('filtersForm').submit();
});
});
}, 100);
`---
π Flusso Completo
Scenario 1: Prima Visita (Link Pulito)
`
1. Utente clicca "Analisi Completa" su una macchina
URL: /analyze?machine_id=92. Controller rileva: NO date_from, NO date_to
3. Query DB: MIN/MAX timestamp per machine_id=9
Risultato: 2023-05-01 β 2023-10-15
4. Usa range REALE
$dateFrom = 2023-05-01
$dateTo = 2023-10-15
5. Campi data popolati con range reale
[2023-05-01] β [2023-10-15]
6. Tabella mostra TUTTI i dati (6 mesi)
β
Nessun dato perso!
`Scenario 2: Utente Cambia Date
`
1. Utente cambia date_from a 2023-06-01
2. Auto-submit (change event)3. URL: /analyze?machine_id=9&date_from=2023-06-01&date_to=2023-10-15
4. Controller usa date specificate
$dateFrom = 2023-06-01 (utente)
$dateTo = 2023-10-15 (invariata)
5. Tabella filtra: giugno-ottobre
β
Filtro personalizzato applicato
`Scenario 3: Date Invertite
`
1. Utente sbaglia: date_from=2023-10-01, date_to=2023-05-012. Controller rileva: dateFrom > dateTo
3. Auto-swap
$dateFrom = 2023-05-01
$dateTo = 2023-10-01
4. Query funziona correttamente
β
Range corretto automaticamente
`---
π¨ Miglioramenti UI Contestuali
Bottone "Applica Filtri"
`html
<!-- Prima -->
<button type="submit">
<i class="bi bi-search"></i> Applica
</button><!-- Dopo -->
<button type="submit" class="btn btn-primary btn-sm">
<i class="bi bi-funnel"></i> Applica Filtri
</button>
`Toolbar Rimossa
---
β
Risultati Finali
Performance
UX/UI
Business Logic
---
π Codice Modificato
1. Controller (
OperationsAnalysisController.php)Linee 28-65: Logica date intelligenti
2. View Index (operations/index.blade.php)
Linee 419-430: Link semplificato
`php
// β
PRIMA: Controllava last_csv_date_from/to
// β
DOPO: Controlla total_operations > 0
// β
LINK: Solo machine_id, no date
`
3. View Analyze (operations/analyze.blade.php)
Linee 755-764: Auto-submit su change date
`javascript
input.addEventListener('change', function() {
document.getElementById('filtersForm').submit();
});
`
---
π Test Case
| Test | Input | Risultato Atteso | β
|
|------|-------|------------------|-----|
| Link pulito | ?machine_id=9 | Range reale (2023-05 β 2023-10) | β
|
| Date specifiche | ?machine_id=9&date_from=2023-06-01 | Usa 2023-06-01 inizio | β
|
| Date invertite | ?date_from=2023-10&date_to=2023-05 | Auto-swap β 2023-05 β 2023-10 | β
|
| DB vuoto | ?machine_id=999` | Fallback ultimi 30gg | β
|
| Auto-submit | Cambia data campo | Form submit automatico | β
|
---
Fine Documento
Analisi Codice
Blocco 1
Utente clicca "Analisi Completa"
β
Link passa: date_from=2023-05-01, date_to=2023-05-31
β
Ma i dati reali sono: 2023-05-01 β 2023-10-15
β
β Risultato: Vista limitata, perde 5 mesi di dati!
Blocco 2
Utente seleziona date invertite:
date_from=2025-10-01, date_to=2025-09-01
β
β Query non restituisce dati (range impossibile)
Blocco 3 php
<a href="{{ route('admin.i40.operations.analyze', [
'machine_id' => $machine['id'],
'date_from' => $machine['last_csv_date_from'], // β Date CSV
'date_to' => $machine['last_csv_date_to'] // β Limitanti
]) }}">
Blocco 4 php
<a href="{{ route('admin.i40.operations.analyze', [
'machine_id' => $machine['id'] // β
SOLO machine_id
]) }}">
Blocco 5 php
// Prima: basato su date CSV
@if($machine['last_csv_date_from'] && $machine['last_csv_date_to'])
// Dopo: basato su dati totali
@if($machine['total_operations'] > 0)
Blocco 6 php
// β
Se date NON specificate dall'utente
if (!$request->input('date_from') || !$request->input('date_to')) {
// Trova range REALE dei dati in database
$realRange = MachineOperationLog::where('machine_id', $selectedMachine->id)
->selectRaw('MIN(timestamp) as min_date, MAX(timestamp) as max_date')
->first();
if ($realRange && $realRange->min_date && $realRange->max_date) {
// β
Usa date reali (tutto il periodo disponibile)
$dateFrom = Carbon::parse($realRange->min_date)->startOfDay();
$dateTo = Carbon::parse($realRange->max_date)->endOfDay();
} else {
// Fallback: ultimi 30 giorni se DB vuoto
$dateFrom = now()->subMonth()->startOfDay();
$dateTo = now()->endOfDay();
}
} else {
// Date specificate dall'utente
$dateFrom = Carbon::parse($request->input('date_from'))->startOfDay();
$dateTo = Carbon::parse($request->input('date_to'))->endOfDay();
}
// β
Validazione: inverti se sballate
if ($dateFrom->gt($dateTo)) {
[$dateFrom, $dateTo] = [$dateTo, $dateFrom];
}
Blocco 7 javascript
// β
Auto-submit quando cambia una data
setTimeout(() => {
const dateInputs = container.querySelectorAll('input[type="date"]');
dateInputs.forEach(input => {
input.addEventListener('change', function() {
document.getElementById('filtersForm').submit();
});
});
}, 100);
Blocco 8
1. Utente clicca "Analisi Completa" su una macchina
URL: /analyze?machine_id=9
2. Controller rileva: NO date_from, NO date_to
3. Query DB: MIN/MAX timestamp per machine_id=9
Risultato: 2023-05-01 β 2023-10-15
4. Usa range REALE
$dateFrom = 2023-05-01
$dateTo = 2023-10-15
5. Campi data popolati con range reale
[2023-05-01] β [2023-10-15]
6. Tabella mostra TUTTI i dati (6 mesi)
β
Nessun dato perso!
Blocco 9
1. Utente cambia date_from a 2023-06-01
2. Auto-submit (change event)
3. URL: /analyze?machine_id=9&date_from=2023-06-01&date_to=2023-10-15
4. Controller usa date specificate
$dateFrom = 2023-06-01 (utente)
$dateTo = 2023-10-15 (invariata)
5. Tabella filtra: giugno-ottobre
β
Filtro personalizzato applicato
Blocco 10
1. Utente sbaglia: date_from=2023-10-01, date_to=2023-05-01
2. Controller rileva: dateFrom > dateTo
3. Auto-swap
$dateFrom = 2023-05-01
$dateTo = 2023-10-01
4. Query funziona correttamente
β
Range corretto automaticamente
Blocco 11 html
<!-- Prima -->
<button type="submit">
<i class="bi bi-search"></i> Applica
</button>
<!-- Dopo -->
<button type="submit" class="btn btn-primary btn-sm">
<i class="bi bi-funnel"></i> Applica Filtri
</button>
Blocco 12 php
// β
PRIMA: Controllava last_csv_date_from/to
// β
DOPO: Controlla total_operations > 0
// β
LINK: Solo machine_id, no date
Blocco 13 javascript
input.addEventListener('change', function() {
document.getElementById('filtersForm').submit();
});