Hub

joyerias-meza

jm-checador

active medium work
Creado
2026-05-14
Actualizado
2026-05-29
Directorios
  • /home/sergio/code/jm-checador

Pendientes abiertos (2)

Ver todos →

🎯 Top de ataque (2)

  • #111 📅 2026-08-14 (cierre condicional) Sacar los campos descanso, dia_extra, tipo_extra (y opcionalmente los horarios semanales) del bloque if($usuario->admin) en src/Template/Element/forma_empleados.ctp:15 para que admins de sucursal también puedan editarlos. Alternativa: agregarlo al form de jm-contabilidad (empleados/forma.blade.php), que hoy no lo expone.
  • #286 sin fecha (Si aplica) Validar si otras empleadas de cualquier sucursal tienen empleados.descanso != 0 como 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.

Actividad en bitácora 1 día

jun
jul
ago
sep
oct
nov
dic
ene
feb
mar
abr
may
L
X
V
Menos
Más

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 bloque if($usuario->admin) en src/Template/Element/forma_empleados.ctp:15 para 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 != 0 como 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_checador en localhost del shared hosting (Plesk).
  • Hosting: checador.joyeriameza.com (Plesk, user jmeza).
  • Working dir: ~/checador.joyeriameza.com/ en el servidor (no es repo git — solo working tree).
  • Plantillas: CakePHP .ctp + Foundation/Bootstrap mezclado, jQuery.

Deploy

  1. git push production master empuja al bare repo ~/git/checador.git en el servidor.
  2. El post-receive hook hace curl POST al webhook de Plesk Git (http://localhost:8880/modules/git/public/web-hook.php?uuid=...).
  3. 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-100defaultConnectionName() { return 'admin'; }.
  • No existe migración CreateEmpleados en config/Migrations/.
  • beforeFind filtra deleted_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 (connection admin → jm-contabilidad.empleados). Campos importantes para checada:
    • descanso (int) — día de descanso semanal: 0=ninguno, 1=Lun..7=Dom, 8=Sab-Dom (ver Empleado::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 (ver forma_empleados.ctp:46).
    • lunes_entrada..domingo_salida — horario semanal (también en empleados).
  • HorariosEmpleadas — tabla paralela horarios_empleadas con la misma estructura (también tiene descanso). Aparentemente usada por forma_horario_semanal.ctp para edición tipo grid. Coexistencia con campos en empleados es confusa.
  • Checadas — registros del día. Campos entrada, salida, descanso, falta, retardo. Una Checada con descanso=true significa “este día es descanso de la empleada, no checa”.
  • HorasChecadas — agregado semanal de horas por empleada.
  • Sucursales — tiendas (Sendero, etc.). Tienen flag horario_libre (no usado hoy — todo el cálculo de horario lo tienen comentado).

Flujo de “checar” — relevante para el bug actual

  1. UsuariosController::login() → al hacer login llama descansos() (línea 36).
  2. UsuariosController::descansos() (línea 184) recorre TODAS las empleadas y, si no tienen Checada hoy:
    • si empleado.descanso == dia_de_hoy y dia_extra != dia_de_hoy → crea Checada con descanso=true.
    • si hoy es sábado (6) o domingo (7) y empleado.descanso == 8 → crea Checada con descanso=true.
  3. 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).

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.phpDatasources.default (DB jmeza_checador, user jmeza, host localhost).
  • 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.git en ~/code/jm-checador.
    • Agregué remote production apuntando a jmeza@checador.joyeriameza.com:~/git/checador.git. Fetch OK; origin y producción están sincronizados en 87ade8d.
    • 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 es empleados.descanso; valor 8 significa “Sab-Dom” → la rutina descansos() crea Checada bloqueante cada sábado Y domingo.
  • 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 NULL contra jmeza_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).