Commit final

This commit is contained in:
2026-05-23 09:31:45 -06:00
parent 8fe3665ffb
commit 14a6498c83
18 changed files with 102 additions and 102 deletions

View File

@@ -117,8 +117,8 @@ class _AdminHomeTabState extends State<_AdminHomeTab> {
updatedAt: DateTime.now().toIso8601String()));
if (status == RouteStatus.cancelada || status == RouteStatus.fallaMecanica || status == RouteStatus.retrasada) {
final emoji = status == RouteStatus.cancelada ? ''
: status == RouteStatus.fallaMecanica ? '🔧' : '⏱️';
final emoji = status == RouteStatus.cancelada ? ''
: status == RouteStatus.fallaMecanica ? '' : '';
final titulo = status == RouteStatus.cancelada ? 'Ruta Cancelada'
: status == RouteStatus.fallaMecanica ? 'Falla Mecánica' : 'Servicio con Retraso';
final cuerpo = (msg != null && msg.isNotEmpty)
@@ -172,7 +172,7 @@ class _AdminHomeTabState extends State<_AdminHomeTab> {
final status = _getStatus(r.routeId);
final mensaje = _getMensaje(r.routeId);
final gpsOk = widget.sim.isGpsActive(r.routeId);
final nightIcon = r.turno == 'NOCTURNO' ? '🌙 ' : r.turno == 'VESPERTINO' ? '🌅 ' : '🌄 ';
final nightIcon = r.turno == 'NOCTURNO' ? ' ' : r.turno == 'VESPERTINO' ? ' ' : ' ';
final incidentes = _getIncidentesPorRuta(r.routeId);
return Card(margin: const EdgeInsets.only(bottom: 10),
@@ -190,7 +190,7 @@ class _AdminHomeTabState extends State<_AdminHomeTab> {
Text(RouteStatus.label(status),
style: TextStyle(fontSize: 11, color: RouteStatus.color(status), fontWeight: FontWeight.w600)),
if (!gpsOk)
const Text('📡 Sin GPS', style: TextStyle(fontSize: 10, color: AppColors.rojoError)),
const Text(' Sin GPS', style: TextStyle(fontSize: 10, color: AppColors.rojoError)),
Text(nightIcon + r.turno, style: const TextStyle(fontSize: 10, color: AppColors.grisTexto)),
]),
trailing: PopupMenuButton<String>(
@@ -213,13 +213,13 @@ class _AdminHomeTabState extends State<_AdminHomeTab> {
await _changeStatus(r.routeId, v, msg);
},
itemBuilder: (_) => [
const PopupMenuItem(value: 'EN_RUTA', child: Text(' En Ruta — Continúa')),
const PopupMenuItem(value: 'RETRASADA', child: Text('⏱️ Marcar Retrasada')),
const PopupMenuItem(value: 'CANCELADA', child: Text('Cancelar y Notificar')),
const PopupMenuItem(value: 'FALLA_MECANICA', child: Text('🔧 Falla Mecánica')),
const PopupMenuItem(value: 'EN_RUTA', child: Text(' En Ruta — Continúa')),
const PopupMenuItem(value: 'RETRASADA', child: Text('Marcar Retrasada')),
const PopupMenuItem(value: 'CANCELADA', child: Text('Cancelar y Notificar')),
const PopupMenuItem(value: 'FALLA_MECANICA', child: Text(' Falla Mecánica')),
const PopupMenuDivider(),
const PopupMenuItem(value: 'GPS', child: Text('📡 Simular GPS Perdido')),
const PopupMenuItem(value: 'RESTORE', child: Text('📶 Restaurar GPS')),
const PopupMenuItem(value: 'GPS', child: Text('Simular GPS Perdido')),
const PopupMenuItem(value: 'RESTORE', child: Text('Restaurar GPS')),
],
),
),
@@ -325,10 +325,10 @@ class _AdminHomeTabState extends State<_AdminHomeTab> {
const SizedBox(height: 8),
Row(children: [
Expanded(child: RadioListTile<String>(dense: true, value: 'MATUTINO',
groupValue: turno, title: const Text('🌄 Matutino'),
groupValue: turno, title: const Text('Matutino'),
onChanged: (v) => setSt(() => turno = v!))),
Expanded(child: RadioListTile<String>(dense: true, value: 'VESPERTINO',
groupValue: turno, title: const Text('🌅 Vespertino'),
groupValue: turno, title: const Text('Vespertino'),
onChanged: (v) => setSt(() => turno = v!))),
]),
const SizedBox(height: 8),
@@ -360,10 +360,10 @@ class _AdminHomeTabState extends State<_AdminHomeTab> {
const SizedBox(height: 6),
Row(children: [
Expanded(child: RadioListTile<String>(dense: true, value: 'MATUTINO',
groupValue: turnoSeleccionado, title: const Text('🌄 Matutino', style: TextStyle(fontSize: 12)),
groupValue: turnoSeleccionado, title: const Text('Matutino', style: TextStyle(fontSize: 12)),
onChanged: (v) => setDialogState(() => turnoSeleccionado = v!))),
Expanded(child: RadioListTile<String>(dense: true, value: 'VESPERTINO',
groupValue: turnoSeleccionado, title: const Text('🌅 Vespertino', style: TextStyle(fontSize: 12)),
groupValue: turnoSeleccionado, title: const Text('Vespertino', style: TextStyle(fontSize: 12)),
onChanged: (v) => setDialogState(() => turnoSeleccionado = v!))),
]),
const SizedBox(height: 4),
@@ -603,8 +603,8 @@ class _AdminRoutesTabState extends State<_AdminRoutesTab> {
itemCount: _routes.length,
itemBuilder: (_, i) {
final r = _routes[i];
final turnoEmoji = r.turno == 'MATUTINO' ? '🌄'
: r.turno == 'VESPERTINO' ? '🌅' : '🌙';
final turnoEmoji = r.turno == 'MATUTINO' ? ''
: r.turno == 'VESPERTINO' ? '' : '';
return Card(margin: const EdgeInsets.only(bottom: 10),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10),
side: BorderSide(color: AppColors.guindaPrimary.withOpacity(0.3))),
@@ -631,7 +631,7 @@ class _AdminRoutesTabState extends State<_AdminRoutesTab> {
style: const TextStyle(fontSize: 11, color: AppColors.grisTexto)),
const SizedBox(height: 6),
// Colonias
Text('📍 ${r.colonias.length} colonias:',
Text(' ${r.colonias.length} colonias:',
style: const TextStyle(fontWeight: FontWeight.w600, fontSize: 12)),
const SizedBox(height: 4),
Wrap(spacing: 4, runSpacing: 4, children: r.colonias.take(8).map((c) =>
@@ -715,7 +715,7 @@ class _AdminReviewsTabState extends State<_AdminReviewsTab> {
: prom >= 3.5 ? Colors.amber.shade700
: prom >= 2.5 ? AppColors.naranjaAlerta
: AppColors.rojoError;
final emoji = prom >= 4.5 ? '🟢' : prom >= 3.5 ? '🟡' : prom >= 2.5 ? '🟠' : '🔴';
final emoji = prom >= 4.5 ? 'Excelente' : prom >= 3.5 ? 'Bueno' : prom >= 2.5 ? 'Regular' : 'Deficiente';
return Card(margin: const EdgeInsets.only(bottom: 8),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10),
side: BorderSide(color: color.withOpacity(0.3))),
@@ -757,7 +757,7 @@ class _AdminReviewsTabState extends State<_AdminReviewsTab> {
crossAxisAlignment: CrossAxisAlignment.start, children: [
Row(children: [
CircleAvatar(backgroundColor: AppColors.guindaPrimary.withOpacity(0.1), radius: 18,
child: Text('${r.estrellas}', style: const TextStyle(fontSize: 11))),
child: Text('${r.estrellas}', style: const TextStyle(fontSize: 11))),
const SizedBox(width: 10),
Expanded(child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Text(r.nombreUsuario, style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 13)),

View File

@@ -197,7 +197,7 @@ class _AdminReporteDetalleScreenState extends State<AdminReporteDetalleScreen>
// Evidencias del admin
Row(children: [
const Expanded(child: Text('Evidencias del Ayuntamiento',
const Expanded(child: Text('Evidencias dla Direccion General',
style: TextStyle(fontWeight: FontWeight.bold,
color: AppColors.guindaPrimary, fontSize: 14))),
Text('${_evidencias.length}',

View File

@@ -142,7 +142,7 @@ class _CreateRouteScreenState extends State<CreateRouteScreen> {
borderRadius: BorderRadius.circular(8),
border: Border.all(color: Colors.blue.shade200)),
child: const Text(
'📅 Selecciona Grupo A (L/M/V) o Grupo B (M/J/S), o días individuales.',
' Selecciona Grupo A (L/M/V) o Grupo B (M/J/S), o días individuales.',
style: TextStyle(fontSize: 12, color: AppColors.azulInfo)),
),
const SizedBox(height: 8),
@@ -265,8 +265,8 @@ class _CreateRouteScreenState extends State<CreateRouteScreen> {
]),
])));
String _turnoLabel(String t) => t == 'MATUTINO' ? '🌄 Matutino'
: t == 'VESPERTINO' ? '🌅 Vespertino' : '🌙 Nocturno';
String _turnoLabel(String t) => t == 'MATUTINO' ? 'Matutino'
: t == 'VESPERTINO' ? 'Vespertino' : 'Nocturno';
@override void dispose() { _nombreCtrl.dispose(); _routeIdCtrl.dispose(); super.dispose(); }
}

View File

@@ -46,10 +46,10 @@ class _ExportPdfScreenState extends State<ExportPdfScreen> {
header: (ctx) => pw.Column(children: [
pw.Row(mainAxisAlignment: pw.MainAxisAlignment.spaceBetween, children: [
pw.Column(crossAxisAlignment: pw.CrossAxisAlignment.start, children: [
pw.Text('H. AYUNTAMIENTO DE CELAYA', style: pw.TextStyle(
pw.Text('DIR. GRAL. DE SERVICIOS MUNICIPALES', style: pw.TextStyle(
fontSize: 14, fontWeight: pw.FontWeight.bold,
color: PdfColor.fromHex('6D1E3A'))),
pw.Text('Direccion de Servicios Publicos',
pw.Text('Direccion de Servicios Municipales',
style: const pw.TextStyle(fontSize: 11, color: PdfColors.grey700)),
pw.Text('Sistema de Recoleccion de Residuos',
style: const pw.TextStyle(fontSize: 10, color: PdfColors.grey600)),
@@ -163,7 +163,7 @@ class _ExportPdfScreenState extends State<ExportPdfScreen> {
],
pw.Divider(color: PdfColor.fromHex('C9A84C')),
pw.Text('Celaya Limpia - H. Ayuntamiento de Celaya, Gto. - ${now.year}',
pw.Text('Celaya Limpia - Dir. Gral. Servicios Municipales - ${now.year}',
style: const pw.TextStyle(fontSize: 8, color: PdfColors.grey500),
textAlign: pw.TextAlign.center),
],