187 lines
7.9 KiB
Dart
187 lines
7.9 KiB
Dart
// ── USER ──────────────────────────────────────────────────────────────────
|
|
class UserModel {
|
|
final int? id;
|
|
final String nombre;
|
|
final String email;
|
|
final String password;
|
|
final String rol;
|
|
|
|
UserModel({this.id, required this.nombre, required this.email,
|
|
required this.password, required this.rol});
|
|
|
|
Map<String, dynamic> toMap() =>
|
|
{'id':id,'nombre':nombre,'email':email,'password':password,'rol':rol};
|
|
|
|
factory UserModel.fromMap(Map<String, dynamic> m) => UserModel(
|
|
id:m['id'], nombre:m['nombre'], email:m['email'],
|
|
password:m['password'], rol:m['rol']);
|
|
}
|
|
|
|
// ── DOMICILIO (User → Domicilio → Zona → Ruta) ────────────────────────────
|
|
class DomicilioModel {
|
|
final int? id;
|
|
final int userId;
|
|
final String alias; // "Casa", "Trabajo", etc.
|
|
final String calle;
|
|
final String colonia; // Zona de cobertura
|
|
final String routeId; // Ruta asignada
|
|
final String horarioEstimado;
|
|
final bool isPrimary;
|
|
|
|
DomicilioModel({this.id, required this.userId, this.alias = 'Casa',
|
|
required this.calle, required this.colonia, required this.routeId,
|
|
required this.horarioEstimado, this.isPrimary = true});
|
|
|
|
Map<String, dynamic> toMap() => {'id':id,'user_id':userId,'alias':alias,
|
|
'calle':calle,'colonia':colonia,'route_id':routeId,
|
|
'horario_estimado':horarioEstimado,'is_primary':isPrimary?1:0};
|
|
|
|
factory DomicilioModel.fromMap(Map<String, dynamic> m) => DomicilioModel(
|
|
id:m['id'], userId:m['user_id'], alias:m['alias']??'Casa',
|
|
calle:m['calle'], colonia:m['colonia'], routeId:m['route_id'],
|
|
horarioEstimado:m['horario_estimado'], isPrimary:m['is_primary']==1);
|
|
}
|
|
|
|
// ── RUTA DINÁMICA (creada por admin) ──────────────────────────────────────
|
|
class RouteDefinitionModel {
|
|
final int? id;
|
|
final String routeId;
|
|
final String nombre;
|
|
final List<String> dias; // ['LUNES','MIERCOLES','VIERNES']
|
|
final String horaInicio; // '06:00'
|
|
final String horaFin; // '08:00'
|
|
final String turno; // MATUTINO|VESPERTINO|NOCTURNO
|
|
final List<String> colonias; // colonias que cubre
|
|
final bool activa;
|
|
|
|
RouteDefinitionModel({this.id, required this.routeId, required this.nombre,
|
|
required this.dias, required this.horaInicio, required this.horaFin,
|
|
required this.turno, required this.colonias, this.activa = true});
|
|
|
|
Map<String, dynamic> toMap() => {
|
|
'id':id,'route_id':routeId,'nombre':nombre,
|
|
'dias':dias.join(','),'hora_inicio':horaInicio,'hora_fin':horaFin,
|
|
'turno':turno,'colonias':colonias.join('|'),'activa':activa?1:0,
|
|
};
|
|
|
|
factory RouteDefinitionModel.fromMap(Map<String, dynamic> m) =>
|
|
RouteDefinitionModel(
|
|
id:m['id'], routeId:m['route_id'], nombre:m['nombre'],
|
|
dias:(m['dias']??'').toString().split(',').where((s)=>s.isNotEmpty).toList(),
|
|
horaInicio:m['hora_inicio']??'06:00', horaFin:m['hora_fin']??'08:00',
|
|
turno:m['turno']??'MATUTINO',
|
|
colonias:(m['colonias']??'').toString().split('|').where((s)=>s.isNotEmpty).toList(),
|
|
activa:m['activa']==1,
|
|
);
|
|
}
|
|
|
|
// ── RESEÑA DEL SERVICIO ───────────────────────────────────────────────────
|
|
class ReviewModel {
|
|
final int? id;
|
|
final int userId;
|
|
final String colonia;
|
|
final String routeId;
|
|
final int estrellas; // 1-5
|
|
final String comentario;
|
|
final String fecha;
|
|
final String nombreUsuario;
|
|
|
|
ReviewModel({this.id, required this.userId, required this.colonia,
|
|
required this.routeId, required this.estrellas, required this.comentario,
|
|
required this.fecha, this.nombreUsuario = ''});
|
|
|
|
Map<String, dynamic> toMap() => {'id':id,'user_id':userId,'colonia':colonia,
|
|
'route_id':routeId,'estrellas':estrellas,'comentario':comentario,
|
|
'fecha':fecha,'nombre_usuario':nombreUsuario};
|
|
|
|
factory ReviewModel.fromMap(Map<String, dynamic> m) => ReviewModel(
|
|
id:m['id'], userId:m['user_id'], colonia:m['colonia'],
|
|
routeId:m['route_id'], estrellas:m['estrellas'],
|
|
comentario:m['comentario']??'', fecha:m['fecha'],
|
|
nombreUsuario:m['nombre_usuario']??'Ciudadano');
|
|
}
|
|
|
|
// ── ASSIGNMENT ────────────────────────────────────────────────────────────
|
|
class AssignmentModel {
|
|
final int? id;
|
|
final int conductorId;
|
|
final String routeId;
|
|
final String diaSemana;
|
|
final String turno;
|
|
|
|
AssignmentModel({this.id, required this.conductorId, required this.routeId,
|
|
required this.diaSemana, required this.turno});
|
|
|
|
Map<String, dynamic> toMap() => {'id':id,'conductor_id':conductorId,
|
|
'route_id':routeId,'dia_semana':diaSemana,'turno':turno};
|
|
|
|
factory AssignmentModel.fromMap(Map<String, dynamic> m) => AssignmentModel(
|
|
id:m['id'], conductorId:m['conductor_id'], routeId:m['route_id'],
|
|
diaSemana:m['dia_semana'], turno:m['turno']);
|
|
}
|
|
|
|
// ── ROUTE STATUS ──────────────────────────────────────────────────────────
|
|
class RouteStatusModel {
|
|
final String routeId;
|
|
final String status;
|
|
final String? mensaje;
|
|
final String updatedAt;
|
|
|
|
RouteStatusModel({required this.routeId, required this.status,
|
|
this.mensaje, required this.updatedAt});
|
|
|
|
Map<String, dynamic> toMap() => {'route_id':routeId,'status':status,
|
|
'mensaje':mensaje,'updated_at':updatedAt};
|
|
|
|
factory RouteStatusModel.fromMap(Map<String, dynamic> m) => RouteStatusModel(
|
|
routeId:m['route_id'], status:m['status'],
|
|
mensaje:m['mensaje'], updatedAt:m['updated_at']);
|
|
}
|
|
|
|
// ── ALERTA ────────────────────────────────────────────────────────────────
|
|
class AlertaModel {
|
|
final int? id;
|
|
final String tipo;
|
|
final String routeId;
|
|
final String mensaje;
|
|
final String fecha;
|
|
final bool resuelta;
|
|
|
|
AlertaModel({this.id, required this.tipo, required this.routeId,
|
|
required this.mensaje, required this.fecha, this.resuelta=false});
|
|
|
|
Map<String, dynamic> toMap() => {'id':id,'tipo':tipo,'route_id':routeId,
|
|
'mensaje':mensaje,'fecha':fecha,'resuelta':resuelta?1:0};
|
|
|
|
factory AlertaModel.fromMap(Map<String, dynamic> m) => AlertaModel(
|
|
id:m['id'], tipo:m['tipo'], routeId:m['route_id'],
|
|
mensaje:m['mensaje'], fecha:m['fecha'], resuelta:m['resuelta']==1);
|
|
}
|
|
|
|
// ── REPORTE ───────────────────────────────────────────────────────────────
|
|
class ReporteModel {
|
|
final int? id;
|
|
final int userId;
|
|
final String tipo;
|
|
final String descripcion;
|
|
final String colonia;
|
|
final String routeId;
|
|
final String fecha;
|
|
final String estado;
|
|
final int calificacion;
|
|
|
|
ReporteModel({this.id, required this.userId, required this.tipo,
|
|
required this.descripcion, required this.colonia, required this.routeId,
|
|
required this.fecha, this.estado='PENDIENTE', this.calificacion=5});
|
|
|
|
Map<String, dynamic> toMap() => {'id':id,'user_id':userId,'tipo':tipo,
|
|
'descripcion':descripcion,'colonia':colonia,'route_id':routeId,
|
|
'fecha':fecha,'estado':estado,'calificacion':calificacion};
|
|
|
|
factory ReporteModel.fromMap(Map<String, dynamic> m) => ReporteModel(
|
|
id:m['id'], userId:m['user_id'], tipo:m['tipo'],
|
|
descripcion:m['descripcion'], colonia:m['colonia'],
|
|
routeId:m['route_id']??'', fecha:m['fecha'],
|
|
estado:m['estado'], calificacion:m['calificacion']??5);
|
|
}
|