JM Checador — Sistema de checadas / asistencia Joyerías Meza
Contexto
Sistema de registro de asistencia (checador) del cliente personal Joyerías Meza. Las empleadas de cada sucursal checan entrada/salida/comida desde una pantalla del POS de la tienda. Admin (Lidia) administra empleadas y horarios desde el mismo portal.
Aplicación CakePHP 3.x hosteada en Plesk en checador.joyeriameza.com. Es un proyecto antiguo (2017-2019), sin tests activos, sin CI.
Sergio lo clonó al hub el 2026-05-14 cuando Lidia reportó que no podía checar los domingos.
Tareas pendientes
Fix permanente — descanso editable por admin de sucursal (revisión 2026-08-14)
-
#111 📅 2026-08-14 — (cierre condicional) Sacar los campos
descanso,dia_extra,tipo_extra(y opcionalmente los horarios semanales) del bloqueif($usuario->admin)ensrc/Template/Element/forma_empleados.ctp:15para que admins de sucursal también puedan editarlos. Alternativa: agregarlo al form de jm-contabilidad (empleados/forma.blade.php), que hoy no lo expone.Condición de cierre: si para el 2026-08-14 la administradora de Joyerías Meza no ha vuelto a reportar problema de descansos asignados, se cierra esta tarea sin fix permanente. Razón: Sergio cree que ya no manejan días de descanso fijos en JM; Lidia era rezago del modelo anterior. Lidia ya fue resuelta vía UPDATE en BD el 2026-05-14.
Si vuelve a salir antes del 2026-08-14, aplicar el fix de UI en lugar de seguir parchando casos sueltos en BD.
-
#286 📅 sin-fecha — (Si aplica) Validar si otras empleadas de cualquier sucursal tienen
empleados.descanso != 0como rezago del modelo viejo:SELECT id, nombres, apellidos, sucursal_id, descanso FROM empleados WHERE descanso != 0 AND deleted_at IS NULL. Si son pocas, limpiar igual que Lidia; si son muchas, justifica el fix permanente.
En progreso
(Nada activo — pendiente confirmación de Sergio antes de tocar producción.)
Notas técnicas
Stack y hosting
- Framework: CakePHP 3.8 (PHP 5.6/7.0/7.1 en
.travis.yml; producción corre PHP 7.4 —~/.php-version). - DB: MySQL
jmeza_checadorenlocalhostdel shared hosting (Plesk). - Hosting:
checador.joyeriameza.com(Plesk, userjmeza). - Working dir:
~/checador.joyeriameza.com/en el servidor (no es repo git — solo working tree). - Plantillas: CakePHP
.ctp+ Foundation/Bootstrap mezclado, jQuery.
Deploy
git push production masterempuja al bare repo~/git/checador.giten el servidor.- El
post-receivehook hacecurl POSTal webhook de Plesk Git (http://localhost:8880/modules/git/public/web-hook.php?uuid=...). - Plesk hace pull en
~/checador.joyeriameza.com/.
Branch único: master. Origin y producción están sincronizados (último commit: 87ade8d No mostrar sucursales eliminadas).
Remotes locales
origin git@github.com:sevaor/jm-checador.git
production jmeza@checador.joyeriameza.com:~/git/checador.git
Topología real de DB (importante)
La tabla empleados NO está en jmeza_checador. Vive en la DB de jm-contabilidad y se accede vía la conexión nombrada admin (definida en config/app.php de producción). Evidencia:
EmpleadosTable.php:97-100→defaultConnectionName() { return 'admin'; }.- No existe migración
CreateEmpleadosenconfig/Migrations/. beforeFindfiltradeleted_at IS null(Laravel soft delete style), consistente con la tabla de Laravel en jm-contabilidad.
Las tablas que sí viven en jmeza_checador (default connection del checador): checadas, horarios_empleadas, horarios_nomina, horas_checadas, sucursales, sucursales_empleados, usuarios, variables, zonas_horarias.
Consecuencia para el bug de Lidia: el campo descanso que la bloquea está en <DB-contabilidad>.empleados, no en jmeza_checador.empleados (que no existe). El UPDATE del fix corto se hace contra la BD de jm-contabilidad.
Modelos clave
Empleados(connectionadmin→ jm-contabilidad.empleados). Campos importantes para checada:descanso(int) — día de descanso semanal:0=ninguno, 1=Lun..7=Dom, 8=Sab-Dom(verEmpleado::nombreDia()).dia_extra(int) — día que sobrescribe el descanso si la empleada trabaja ese día extra.tipo_extra(int) —1=Entrada, 2=Salida, 3=Descanso(verforma_empleados.ctp:46).lunes_entrada..domingo_salida— horario semanal (también enempleados).
HorariosEmpleadas— tabla paralelahorarios_empleadascon la misma estructura (también tienedescanso). Aparentemente usada porforma_horario_semanal.ctppara edición tipo grid. Coexistencia con campos enempleadoses confusa.Checadas— registros del día. Camposentrada, salida, descanso, falta, retardo. Una Checada condescanso=truesignifica “este día es descanso de la empleada, no checa”.HorasChecadas— agregado semanal de horas por empleada.Sucursales— tiendas (Sendero, etc.). Tienen flaghorario_libre(no usado hoy — todo el cálculo de horario lo tienen comentado).
Flujo de “checar” — relevante para el bug actual
UsuariosController::login()→ al hacer login llamadescansos()(línea 36).UsuariosController::descansos()(línea 184) recorre TODAS las empleadas y, si no tienen Checada hoy:- si
empleado.descanso == dia_de_hoyydia_extra != dia_de_hoy→ crea Checada condescanso=true. - si hoy es sábado (6) o domingo (7) y
empleado.descanso == 8→ crea Checada condescanso=true.
- si
- Después, cuando la empleada presiona “Checar” (
PrincipalController::checar()):- Si ya hay Checada hoy y
descanso==true→ muestra “El empleado descansa este día” y la bloquea (PrincipalController:61-65).
- Si ya hay Checada hoy y
Consecuencia: el campo empleados.descanso es la única fuente de verdad y solo lo edita un superadmin (forma_empleados.ctp:15 envuelve toda la sección de horario/descanso en if($usuario->admin)). Lidia es admin de sucursal pero no superadmin, por eso “no hay un apartado donde se asigna un día de descanso” — sí existe, pero está oculto para ella.
Acceso a DB (producción)
- Credenciales en
~/checador.joyeriameza.com/config/app.php→Datasources.default(DBjmeza_checador, userjmeza, hostlocalhost). - Consulta directa requiere SSH al servidor y leer credenciales — pedir confirmación a Sergio antes.
ANTIGRAVITY.md
No tiene. Es un proyecto pre-Laravel/Boost; convenciones de boilerplate no aplican.
Bitácora
2026-05-14
- Pidió Sergio: descargar el proyecto, documentarlo y revisar el reporte de la admin Joyerías Meza: “Lidia de Sendero es la única que trabaja domingo (que es su descanso) y no la deja checar; según nosotros no hay apartado donde se asigna día de descanso”.
- Hice:
- Cloné
git@github.com:sevaor/jm-checador.giten~/code/jm-checador. - Agregué remote
productionapuntando ajmeza@checador.joyeriameza.com:~/git/checador.git. Fetch OK; origin y producción están sincronizados en87ade8d. - Confirmé acceso SSH read-only al servidor (mismo workflow que otros JM).
- Diagnostiqué el bug — sí existe un apartado pero solo lo ve el superadmin (
forma_empleados.ctp:15). El campo esempleados.descanso; valor8significa “Sab-Dom” → la rutinadescansos()crea Checada bloqueante cada sábado Y domingo.
- Cloné
- Falta:
- Sergio corrió el fix corto:
UPDATE empleados SET descanso = 0 WHERE id = <lidia>contra la DB de jm-contabilidad +DELETE FROM checadas WHERE empleados_id = <lidia> AND descanso = 1 AND entrada IS NULL AND salida IS NULLcontrajmeza_checador. Lidia hace logout/login y prueba. - Fix permanente queda pendiente con condición de cierre 2026-08-14 — si no vuelve a salir el tema en 3 meses, se cierra sin tocar código (probablemente ya no usan descansos fijos en JM).
- Sergio corrió el fix corto: