68 lines
1.8 KiB
Dart
68 lines
1.8 KiB
Dart
// lib/features/admin/models/admin_incident.dart
|
|
|
|
class AdminIncidentModel {
|
|
final String id;
|
|
final int unitId;
|
|
final String? routeId;
|
|
// Mapea a `incidents.category` en la base de datos.
|
|
final String type;
|
|
final String? description;
|
|
final String? driverName;
|
|
final String status; // open | in_review | resolved
|
|
final String? photoUrl;
|
|
final DateTime createdAt;
|
|
|
|
const AdminIncidentModel({
|
|
required this.id,
|
|
required this.unitId,
|
|
this.routeId,
|
|
required this.type,
|
|
this.description,
|
|
this.driverName,
|
|
this.status = 'open',
|
|
this.photoUrl,
|
|
required this.createdAt,
|
|
});
|
|
|
|
factory AdminIncidentModel.fromJson(Map<String, dynamic> json) =>
|
|
AdminIncidentModel(
|
|
// El id en DB es BIGSERIAL; el backend lo serializa como string,
|
|
// pero por defensa aceptamos number también.
|
|
id: json['id'].toString(),
|
|
unitId: (json['unit_id'] as num).toInt(),
|
|
routeId: json['route_id'] as String?,
|
|
type: (json['type'] as String?) ?? 'otro',
|
|
description: json['description'] as String?,
|
|
driverName: json['driver_name'] as String?,
|
|
status: (json['status'] as String?) ?? 'open',
|
|
photoUrl: json['photo_url'] as String?,
|
|
createdAt: DateTime.parse(json['created_at'] as String),
|
|
);
|
|
|
|
String get typeLabel {
|
|
switch (type) {
|
|
case 'derrame':
|
|
return 'Derrame';
|
|
case 'dano_propiedad':
|
|
return 'Daño a propiedad';
|
|
case 'conducta':
|
|
return 'Conducta';
|
|
case 'no_recoleccion':
|
|
return 'No recolección';
|
|
default:
|
|
return 'Otro';
|
|
}
|
|
}
|
|
|
|
String get statusLabel {
|
|
switch (status) {
|
|
case 'in_review':
|
|
return 'En revisión';
|
|
case 'resolved':
|
|
return 'Resuelta';
|
|
default:
|
|
return 'Abierta';
|
|
}
|
|
}
|
|
}
|