// ── 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 toMap() => {'id':id,'nombre':nombre,'email':email,'password':password,'rol':rol}; factory UserModel.fromMap(Map 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 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 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 dias; // ['LUNES','MIERCOLES','VIERNES'] final String horaInicio; // '06:00' final String horaFin; // '08:00' final String turno; // MATUTINO|VESPERTINO|NOCTURNO final List 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 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 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 toMap() => {'id':id,'user_id':userId,'colonia':colonia, 'route_id':routeId,'estrellas':estrellas,'comentario':comentario, 'fecha':fecha,'nombre_usuario':nombreUsuario}; factory ReviewModel.fromMap(Map 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 toMap() => {'id':id,'conductor_id':conductorId, 'route_id':routeId,'dia_semana':diaSemana,'turno':turno}; factory AssignmentModel.fromMap(Map 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 toMap() => {'route_id':routeId,'status':status, 'mensaje':mensaje,'updated_at':updatedAt}; factory RouteStatusModel.fromMap(Map 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 toMap() => {'id':id,'tipo':tipo,'route_id':routeId, 'mensaje':mensaje,'fecha':fecha,'resuelta':resuelta?1:0}; factory AlertaModel.fromMap(Map 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 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 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); }