app mobile allarmi prima

This commit is contained in:
2025-10-20 19:17:45 +02:00
commit 300912ee02
159 changed files with 11755 additions and 0 deletions

111
lib/models/allarme.dart Normal file
View File

@@ -0,0 +1,111 @@
class Allarme {
final int id;
final int sitoId;
final String tipo;
final String severita;
final String stato;
final String titolo;
final String? descrizione;
final double? valoreRilevato;
final double? valoreSoglia;
final String? unitaMisura;
final Map<String, dynamic>? datiSensori;
final DateTime timestampRilevamento;
final DateTime createdAt;
Allarme({
required this.id,
required this.sitoId,
required this.tipo,
required this.severita,
required this.stato,
required this.titolo,
this.descrizione,
this.valoreRilevato,
this.valoreSoglia,
this.unitaMisura,
this.datiSensori,
required this.timestampRilevamento,
required this.createdAt,
});
factory Allarme.fromJson(Map<String, dynamic> json) {
return Allarme(
id: json['id'] as int,
sitoId: json['sito_id'] as int,
tipo: json['tipo'] as String,
severita: json['severita'] as String,
stato: json['stato'] as String,
titolo: json['titolo'] as String,
descrizione: json['descrizione'] as String?,
valoreRilevato: json['valore_rilevato'] != null
? (json['valore_rilevato'] as num).toDouble()
: null,
valoreSoglia: json['valore_soglia'] != null
? (json['valore_soglia'] as num).toDouble()
: null,
unitaMisura: json['unita_misura'] as String?,
datiSensori: json['dati_sensori'] as Map<String, dynamic>?,
timestampRilevamento: DateTime.parse(json['timestamp_rilevamento'] as String),
createdAt: DateTime.parse(json['created_at'] as String),
);
}
bool get isCritical => severita == 'critical';
bool get isWarning => severita == 'warning';
bool get isRisolto => stato == 'risolto';
String get tipoReadable {
final labels = {
'movimento_terreno': 'Movimento Terreno',
'deformazione': 'Deformazione',
'altro': 'Altro',
};
return labels[tipo] ?? tipo;
}
String get statoReadable {
final labels = {
'nuovo': 'Nuovo',
'in_gestione': 'In Gestione',
'risolto': 'Risolto',
};
return labels[stato] ?? stato;
}
String get severitaReadable {
final labels = {
'critical': 'CRITICO',
'warning': 'AVVISO',
'info': 'INFO',
};
return labels[severita] ?? severita.toUpperCase();
}
}
class AllarmeListResponse {
final int total;
final List<Allarme> items;
final int page;
final int pageSize;
AllarmeListResponse({
required this.total,
required this.items,
required this.page,
required this.pageSize,
});
factory AllarmeListResponse.fromJson(Map<String, dynamic> json) {
return AllarmeListResponse(
total: json['total'] as int,
items: (json['items'] as List)
.map((item) => Allarme.fromJson(item as Map<String, dynamic>))
.toList(),
page: json['page'] as int,
pageSize: json['page_size'] as int,
);
}
bool get hasMore => items.length < total;
}

81
lib/models/sito.dart Normal file
View File

@@ -0,0 +1,81 @@
class Sito {
final int id;
final int clienteId;
final String nome;
final String tipo;
final String? descrizione;
final double? latitudine;
final double? longitudine;
final double? altitudine;
final String? comune;
final String? provincia;
final String? regione;
final String? codiceIdentificativo;
final DateTime createdAt;
final DateTime? updatedAt;
Sito({
required this.id,
required this.clienteId,
required this.nome,
required this.tipo,
this.descrizione,
this.latitudine,
this.longitudine,
this.altitudine,
this.comune,
this.provincia,
this.regione,
this.codiceIdentificativo,
required this.createdAt,
this.updatedAt,
});
factory Sito.fromJson(Map<String, dynamic> json) {
return Sito(
id: json['id'] as int,
clienteId: json['cliente_id'] as int,
nome: json['nome'] as String,
tipo: json['tipo'] as String,
descrizione: json['descrizione'] as String?,
latitudine: json['latitudine'] != null
? (json['latitudine'] as num).toDouble()
: null,
longitudine: json['longitudine'] != null
? (json['longitudine'] as num).toDouble()
: null,
altitudine: json['altitudine'] != null
? (json['altitudine'] as num).toDouble()
: null,
comune: json['comune'] as String?,
provincia: json['provincia'] as String?,
regione: json['regione'] as String?,
codiceIdentificativo: json['codice_identificativo'] as String?,
createdAt: DateTime.parse(json['created_at'] as String),
updatedAt: json['updated_at'] != null
? DateTime.parse(json['updated_at'] as String)
: null,
);
}
String get tipoReadable {
final labels = {
'ponte': 'Ponte',
'galleria': 'Galleria',
'diga': 'Diga',
'frana': 'Frana',
'versante': 'Versante',
'edificio': 'Edificio',
};
return labels[tipo] ?? tipo;
}
String get localita {
final parts = <String>[];
if (comune != null) parts.add(comune!);
if (provincia != null) parts.add('($provincia)');
return parts.isNotEmpty ? parts.join(' ') : 'N/D';
}
bool get hasCoordinates => latitudine != null && longitudine != null;
}

103
lib/models/statistiche.dart Normal file
View File

@@ -0,0 +1,103 @@
class Statistiche {
final int totaleAllarmi;
final int totaleSiti;
final int allarmiAperti;
final int allarmiRecenti7gg;
// Per severità
final int allarmiCritical;
final int allarmiWarning;
final int allarmiInfo;
// Per stato
final int allarmiNuovo;
final int allarmiInGestione;
final int allarmiRisolto;
// Siti per tipo
final int sitiPonte;
final int sitiGalleria;
final int sitiDiga;
final int sitiFrana;
final int sitiVersante;
final int sitiEdificio;
Statistiche({
required this.totaleAllarmi,
required this.totaleSiti,
required this.allarmiAperti,
required this.allarmiRecenti7gg,
required this.allarmiCritical,
required this.allarmiWarning,
required this.allarmiInfo,
required this.allarmiNuovo,
required this.allarmiInGestione,
required this.allarmiRisolto,
required this.sitiPonte,
required this.sitiGalleria,
required this.sitiDiga,
required this.sitiFrana,
required this.sitiVersante,
required this.sitiEdificio,
});
factory Statistiche.fromJson(Map<String, dynamic> json) {
return Statistiche(
totaleAllarmi: json['totale_allarmi'] as int,
totaleSiti: json['totale_siti'] as int,
allarmiAperti: json['allarmi_aperti'] as int,
allarmiRecenti7gg: json['allarmi_recenti_7gg'] as int,
allarmiCritical: json['allarmi_critical'] as int,
allarmiWarning: json['allarmi_warning'] as int,
allarmiInfo: json['allarmi_info'] as int,
allarmiNuovo: json['allarmi_nuovo'] as int,
allarmiInGestione: json['allarmi_in_gestione'] as int,
allarmiRisolto: json['allarmi_risolto'] as int,
sitiPonte: json['siti_ponte'] as int,
sitiGalleria: json['siti_galleria'] as int,
sitiDiga: json['siti_diga'] as int,
sitiFrana: json['siti_frana'] as int,
sitiVersante: json['siti_versante'] as int,
sitiEdificio: json['siti_edificio'] as int,
);
}
int get totaleSeverita => allarmiCritical + allarmiWarning + allarmiInfo;
int get totaleStato => allarmiNuovo + allarmiInGestione + allarmiRisolto;
double get percentualeCritici =>
totaleAllarmi > 0 ? (allarmiCritical / totaleAllarmi) * 100 : 0;
double get percentualeAperti =>
totaleAllarmi > 0 ? (allarmiAperti / totaleAllarmi) * 100 : 0;
}
class AllarmePerGiorno {
final DateTime data;
final int count;
AllarmePerGiorno({
required this.data,
required this.count,
});
factory AllarmePerGiorno.fromJson(Map<String, dynamic> json) {
return AllarmePerGiorno(
data: DateTime.parse(json['data'] as String),
count: json['count'] as int,
);
}
}
class AllarmiPerGiornoResponse {
final List<AllarmePerGiorno> dati;
AllarmiPerGiornoResponse({required this.dati});
factory AllarmiPerGiornoResponse.fromJson(Map<String, dynamic> json) {
return AllarmiPerGiornoResponse(
dati: (json['dati'] as List)
.map((item) => AllarmePerGiorno.fromJson(item as Map<String, dynamic>))
.toList(),
);
}
}

41
lib/models/user.dart Normal file
View File

@@ -0,0 +1,41 @@
class User {
final int id;
final String email;
final String nome;
final String cognome;
final String ruolo;
final int clienteId;
User({
required this.id,
required this.email,
required this.nome,
required this.cognome,
required this.ruolo,
required this.clienteId,
});
factory User.fromJson(Map<String, dynamic> json) {
return User(
id: json['id'] as int,
email: json['email'] as String,
nome: json['nome'] as String,
cognome: json['cognome'] as String,
ruolo: json['ruolo'] as String,
clienteId: json['cliente_id'] as int,
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'email': email,
'nome': nome,
'cognome': cognome,
'ruolo': ruolo,
'cliente_id': clienteId,
};
}
String get nomeCompleto => '$nome $cognome';
}