Files

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);
}