Lumbre Software / Personal y asistencia / Biometrik
Qué firma cada fichado, y qué no
La firma es WebAuthn con el autenticador del propio teléfono. Al vincularse, el aparato crea una clave; el servidor se queda con la clave pública y con el identificador de la credencial. La plantilla de huella o de rostro nunca sale del teléfono y en la base de la empresa no hay imagen ni rasgo que proteger: hay una llave que alguien tuvo que desbloquear para firmar.
Eso cambia la conversación de cumplimiento. Tratar datos biométricos de trabajadores es delicado justamente porque la empresa pasa a guardar una parte del cuerpo de su personal. Aquí no: se guarda una credencial, y con ella se puede demostrar quién fichó, cuándo y desde qué aparato.
Cada fichado guarda además la vía con la que se hizo: biometría del dispositivo, código QR del gafete, PIN personal o registro manual de un supervisor con su motivo. Las alternativas no son un parche: están activas por omisión y se pueden apagar en el panel, porque un sistema que sólo admite biométrico no deja opción menos invasiva y esa es la objeción que tumba estos proyectos.
Por qué el reto lo da el servidor
Si el navegador inventara el reto, un fichaje “biométrico” sería un fetch falsificable desde la consola: cualquiera podría repetir la firma de otro o fabricarla. El centro emite un reto de un solo uso con caducidad de tres minutos, el autenticador lo firma, y el servidor verifica la firma contra la clave pública registrada, comprueba el origen, el tipo de operación, los flags de presencia y de verificación de usuario, y que el contador haya avanzado.
Ese verificador está aislado del resto del sistema y tiene su propia prueba con claves reales: 19 casos, entre ellos una aserción bien firmada que pasa y doce mutaciones que deben fallar (otro reto, otro origen, otra operación, sin verificación de usuario, sin presencia, rpIdHash ajeno, firma de otra llave, llave vacía, JSON roto, authenticatorData corto, clientData intercambiado y contador que no avanza). La salida MFkwEwYHKoZIzj0C… del DER generado se cotejó byte a byte contra un SPKI de OpenSSL.
Si la verificación llega tarde porque el teléfono estaba sin señal, el fichado se guarda igual y queda pendiente; si el centro la rechaza, la línea baja a dudosa y abre incidencia con el motivo escrito. Ninguna de las dos situaciones borra lo que la persona registró.
Geocercas que se dibujan, no que se teclean
El perímetro donde se puede fichar se traza en el mapa: un círculo para la caseta arrastrando el centro y el maneral del radio, un polígono para el patio de maniobras tocando los vértices. Los vértices viajan en la base y se comparten con el resto de los equipos, así que el capataz y Recursos Humanos ven la misma obra.
Cada fichado guarda latitud, longitud, precisión en metros, la geocerca que lo contuvo y a cuántos metros quedó del borde si no lo contuvo. Con esa información, la app puede decirle a quien ficha «estás a 240 m de la caseta» en lugar de negarle el registro, y puede abrir la incidencia correspondiente sin borrar nada.
El mapa es un lienzo propio con cartografía de OpenStreetMap debajo, servida por el propio portal con caché, para no abrir la política de contenido a un tercero ni depender de una llave de proveedor. Si las teselas no llegan, las geocercas y los fichados se siguen viendo.
Lo que Recursos Humanos administra
| Superficie | Qué hace |
|---|---|
| Expediente | Alta, edición y baja de personal con puesto, área, equipo, sede, turno habitual, jornada legal, teléfono, correo, fecha de ingreso, sueldo diario y constancia de consentimiento biométrico con su fecha. |
| Turnos y calendario | Turnos con entrada, salida, pausa y jornada (diurna, mixta, nocturna); reparto por día en una cuadrícula semanal; festivos declarables. Un turno nocturno que sale a las 06:00 se calcula correctamente: no da horas negativas ni deja la jornada abierta. |
| Sedes y geocercas | Una o varias geocercas por sede, con radio, vértices y si exigen estar dentro. |
| Permisos | Vacaciones, incapacidad, permiso con o sin goce, licencia y comisión, con solicitud, aprobación o rechazo, comentario para el interesado y constancia de quién respondió. |
| Incidencias | Retardo, salida anticipada, falta, jornada sin salida, fichado fuera de geocerca, ubicación con precisión insuficiente, sin turno asignado y firma rechazada por el centro. Se pueden justificar o descartar con autor. |
| Cierre del día | Un botón recorre el personal: quien no fichó sin permiso aprobado queda con falta; quien no cerró la jornada queda como pendiente. Lo que ya estaba registrado no se reescribe. |
| Correcciones | Corregir la hora de un fichado no modifica la fila original: se crea una corrección que apunta al original, con motivo y con el nombre de quien la hizo. El original sigue intacto en la base y en el respaldo. |
| Auditoría | Correcciones, aprobaciones, revocaciones de credencial y cierres de día quedan con actor, fecha y detalle. |
Reportes y base de horas
Los reportes se calculan con reglas explícitas y se pueden descargar en CSV con las mismas cifras que muestra la pantalla:
- Asistencia del día por sede y por equipo, ordenada por lo que requiere atención.
- Horas trabajadas frente a horas debidas, con pausas fichadas o, si no se ficharon, con la pausa del turno.
- Horas dobles y triples por semana según el artículo 68 de la LFT: hasta el tope configurado se pagan como dobles y lo que pasa de ahí, al triple. Se clasifican por semana porque la ley pone el límite ahí, no por día.
- Aviso de exceso diario: la prolongación máxima legal es de dos horas por día (artículo 67) y el reporte marca los días que lo rebasan.
- Minutos en la franja nocturna (20:00 a 06:00) para la prima correspondiente.
- Retardos, faltas, días sin salida, permisos y detalle de cada fichado con vía, ubicación, geocerca y veredicto.
No Timbra. La base de horas se exporta para que el área de nómina o el contador la use; el CFDI de nómina no entra en este producto y quien lo necesite lo conecta con su sistema de nómina.
Avisos
Dentro de la app: confirmación de cada fichado, respuesta a las solicitudes y avisos del tablero, con contador de no leídos. Hacia afuera, el proyecto puede usar la cola de avisos de Lumbre Espacios (correo con reintento, copia y baja) y WhatsApp donde esté configurado.
Aún no hay Web Push ni recordatorio en la pantalla bloqueada del teléfono: una PWA puede notificar con el servicio del navegador, pero ese canal todavía no está implementado en este producto. Se dice aquí en lugar de prometerlo en la portada.
Lo que un navegador no puede hacer, y por tanto Biometrik no finge hacer
| Capacidad | En la PWA | Consecuencia |
|---|---|---|
| Firmar con huella o rostro | Sí | WebAuthn con autenticador de plataforma; la plantilla no sale del teléfono. |
| Ubicación en el momento del fichado | Sí | Se pide permiso del navegador y se guarda precisión. |
| Trazar y validar geocercas | Sí | Radio y polígono, evaluados al fichar. |
| Trabajar sin señal y sincronizar después | Sí | Base local en el navegador y cola de cambios por fila. |
| Traectoria continua de la jornada | No | Al cerrar la pestaña el navegador suelta la posición y no existe servicio de fondo en una PWA. Se registran fichados geolocalizados, no un recorrido del día. |
| Reconocimiento facial automático | No | Existe un prototipo propio, pero sin detector de presentación medido: una fotografía impresa pasaría. Mientras no se mida, no se vende como control de acceso. |
| Nómina Timbrada | No | Se entrega la base de horas en CSV. |
| App de tienda con huella nativa | No | Es una PWA instalable; en escritorio la firma la hace el autenticador del equipo cuando el navegador lo ofrece. |
Cómo acceder a la demo
Abrir la liga de invitación
Desde el teléfono, mejor con el bloqueo por huella o rostro activado:
https://biometrik.lumbre.lat/app/#/unirse?portal=https%3A%2F%2Fbiometrik.lumbre.lat&i=d4q877ydv9bjetw8rs3z6bz4ggdmrdy9etzm7dsd
Aceptar unirse al proyecto
La pantalla muestra el proyecto «Construcciones del Bajío (demo)» y el papel que recibirá (miembro). Se escribe el nombre y listo: no hay código que teclear ni correo que verificar.
Declarar qué ficha en ese teléfono
Al abrir la app, elija una de las ocho personas sembradas (Sofía, Marco, Ana…). Con la ficha declarada, el botón grande dice ENTRADA, SALIDA o pausa según lo que corresponda.
Vincular la biometría del aparato
En «Mi ubicación / Biometría` pulse Vincular mi huella o rostro. El teléfono pide su bloqueo y la app registra la credencial. Si prefiere no hacerlo, puede fichar con el código del gafete (por ejemplo BK0003DEMO) o con el PIN que asigna Recursos Humanos.
Ver el resultado
Con las fichas de Sofía (RRHH) o Marco (supervisor) aparece el Tablero del día con la siembra: un retardo de 22 minutos, un fichado a 420 m de la geocerca marcado como dudoso, una jornada sin salida y una solicitud de vacaciones esperando respuesta. En el Panel están Reportes, Personal, Sedes y geocercas, Turnos, Reglas, Solicitudes y Auditoría.
La liga vence el 14 de diciembre de 2026 y admite 50 uniones. Los datos de la demo son ficticios y compartidos entre quienes entren: no meta información real de su personal. Si la liga se agota, pida una nueva escribiendo a soporte.
Lo que la demo no puede simular
- Los fichados sembrados se hicieron con QR y PIN. La firma biométrica sólo existe si la vincula en su teléfono: una muestra no puede firmar por usted.
- La verificación del centro ocurre en vivo contra la llave registrada; por eso mismo la demo no muestra una firma «de archivo».
- El correo y WhatsApp de avisos dependen del servidor de correo de esa instalación; en la demo están encendidos pero no se envían mensajes fuera.
Instalación en su servidor
Biometrik se entrega como un portal PHP autocontenido: una sola aplicación, una sola base de datos, una sola sesión de administrador y la PWA servida dentro del propio dominio.
Requisitos
PHP 8.2 o superior con OpenSSL, MariaDB o MySQL, Apache con AllowOverride All y HTTPS. Cualquier hosting con cPanel alcanza; no hace falta SSH.
Subir el ZIP
Descomprima paquete-biometrik-0.1.0.zip en la carpeta del dominio. La PWA viene compilada con base /app/: instale en la raíz del dominio.
Abrir /instalar
El asistente escribe config.php con clave generada en el servidor, crea el esquema, el administrador y el primer proyecto, y muestra el código con el que los teléfonos se unen. config.php y datos/ quedan fuera del alcance público.
Revisar el estado
/salud responde el estado de la base y de la carpeta de datos. El panel en /panel concentra uso, compartición, licencia y avisos; la app en /app/.
Si prefiere no administrar el servidor, puede usar la instalación de demostración como punto de partida y contratar la puesta en marcha; el precio y los planes se consultan en lumbre.lat.
Preguntas que hacen siempre
| Pregunta | Respuesta |
|---|---|
| ¿Hay que comprar lectores biométricos? | No. El lector es el teléfono que ya trae la persona, o la tableta de la caseta con su cámara y su bloqueo. |
| ¿Y si el trabajador no quiere dar su huella? | Puede fichar con el código del gafete o con su PIN, con la misma traza y el mismo costo de tiempo. El sistema registra la vía usada en cada línea. |
| ¿Se puede perder el derecho a impugnar un fichado? | La persona ve su semana y sus incidencias desde la app, y el supervisor corrige con motivo y autor. La fila original no se destruye. |
| ¿Qué pasa si se cae internet en la obra? | El fichado se guarda en el teléfono y se sincroniza al recuperar señal. Los retos y las verificaciones pendientes se resuelven después. |
| ¿Dónde viven los datos? | En la base de su instalación. Sin Biometrik, el proyecto no tiene una nube ajena: es el mismo servidor que administran. |
| ¿Cobran por usuario? | No. El plan se contrata por aplicación; el número de personal y de aparatos no cambia el precio. |
Ficha técnica
| Componente | Detalle |
|---|---|
| Aplicación | PWA en Flutter 3.44 / Dart 3.12. Base SQLite en WebAssembly dentro del almacenamiento del origen. |
| Portal | PHP 8.2 con Lumbre Espacios (sincronía por filas, proyecto multiusuario, permisos por persona) y DataCollector (formularios y solicitudes) en una sola base. |
| Firma | WebAuthn con autenticador de plataforma y userVerification: required. Reto de un solo uso emitido por el servidor; verificador propio con prueba de 19 casos. |
| Geocercas | Círculo y polígono con vértices compartidos; distancia al borde y precisión de la posición registradas en cada fichado. |
| Reportes | Asistencia, retardos, faltas, horas dobles y triples por semana, minutos nocturnos y detalle de fichados; exportación CSV. |
| Versión publicada | 0.1.0 · bloque 1 (fichado, geocercas, reportes y avisos). Bloques pendientes: modo kiosco con autorretrato como evidencia, aprobación de permisos con niveles, notificaciones push del navegador. |