{"id":13,"date":"2026-05-06T09:58:11","date_gmt":"2026-05-06T09:58:11","guid":{"rendered":"https:\/\/portfolio.hotelkore.com\/?post_type=projects&#038;p=13"},"modified":"2026-05-06T10:02:58","modified_gmt":"2026-05-06T10:02:58","slug":"nodefichajeremoto","status":"publish","type":"projects","link":"https:\/\/portfolio.hotelkore.com\/index.php\/projects\/nodefichajeremoto\/","title":{"rendered":"NodeFichajeRemoto"},"content":{"rendered":"\n<p><strong>Sistema local de gesti\u00f3n de fichajes para flota VTC (\u2248140 conductores)<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcf1 Worker de WhatsApp (procesamiento autom\u00e1tico)<\/h2>\n\n\n\n<p>El worker escucha mensajes entrantes con el formato <strong>FICHAJE VTC<\/strong> y realiza:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Extracci\u00f3n por <strong>Regex<\/strong> (ubicaci\u00f3n, conductor, acci\u00f3n).<\/li>\n\n\n\n<li>Registro en PostgreSQL con deduplicaci\u00f3n por ID de mensaje.<\/li>\n\n\n\n<li>Recuperaci\u00f3n de mensajes recientes tras reinicios.<\/li>\n\n\n\n<li>Confirmaci\u00f3n autom\u00e1tica al conductor.<\/li>\n\n\n\n<li>Sesi\u00f3n persistente con LocalAuth.<\/li>\n\n\n\n<li>Manejo robusto de errores (try\/catch global).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Acciones soportadas<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>INICIO<\/li>\n\n\n\n<li>FIN<\/li>\n\n\n\n<li>DESCANSO<\/li>\n\n\n\n<li>REPOSTAJE<\/li>\n\n\n\n<li>LIMPIEZA<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udee1\ufe0f Custodia autom\u00e1tica de reportes (PDF\/XLSX)<\/h2>\n\n\n\n<p>Cumple RDL 8\/2019:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Detecta archivos cuyo nombre contiene <strong>\u201creporte\u201d<\/strong>.<\/li>\n\n\n\n<li>Descarga, calcula <strong>SHA\u2011256<\/strong>, deduplica y archiva por: <strong>\/reportes\/{conductorId}\/{a\u00f1o}\/{mes}\/<\/strong><\/li>\n\n\n\n<li>Registra metadatos en DB.<\/li>\n\n\n\n<li>Volumen persistente con retenci\u00f3n m\u00ednima de 4 a\u00f1os.<\/li>\n\n\n\n<li>Acceso de solo lectura desde el frontend.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd14 Alertas autom\u00e1ticas<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Anomal\u00edas de jornada<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Detecta conductores con <strong>INICIO sin FIN<\/strong> al cierre del d\u00eda.<\/li>\n\n\n\n<li>Env\u00eda aviso por WhatsApp al admin.<\/li>\n\n\n\n<li>Hora configurable v\u00eda variables de entorno.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Horas extra (opt\u2011in)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Detecta jornadas que superan l\u00edmites diarios\/semanales.<\/li>\n\n\n\n<li>Env\u00eda alerta autom\u00e1tica al admin.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Descanso m\u00ednimo (opt\u2011in)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Comprueba descanso entre FIN \u2192 siguiente INICIO.<\/li>\n\n\n\n<li>Avisa si es inferior al umbral legal.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udda5\ufe0f Panel CRM web<\/h2>\n\n\n\n<p>Acceso restringido a IPs internas + JWT HttpOnly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">M\u00f3dulos principales<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dashboard:<\/strong> KPIs, fichajes recientes, refresco cada 10 s.<\/li>\n\n\n\n<li><strong>Fichajes:<\/strong> filtros avanzados + exportaci\u00f3n CSV.<\/li>\n\n\n\n<li><strong>Conductores:<\/strong> estado de jornada en tiempo real.<\/li>\n\n\n\n<li><strong>RRHH > Horas:<\/strong> c\u00e1lculo de horas, jornadas abiertas, horas extra.<\/li>\n\n\n\n<li><strong>RRHH > Reportes:<\/strong> descarga directa de PDFs\/XLSX custodiados.<\/li>\n\n\n\n<li><strong>Comunicaciones > Anuncios:<\/strong> CRUD con prioridades.<\/li>\n\n\n\n<li><strong>Admin > Usuarios:<\/strong> gesti\u00f3n de cuentas CRM.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Push Web<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Suscripci\u00f3n v\u00eda Service Worker.<\/li>\n\n\n\n<li>Env\u00edo autom\u00e1tico al crear anuncios <strong>IMPORTANTE<\/strong> o <strong>URGENTE<\/strong>.<\/li>\n\n\n\n<li>El worker notifica por WhatsApp anuncios urgentes no le\u00eddos.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddea Pruebas y CI\/CD<\/h2>\n\n\n\n<p>Incluye scripts PowerShell para:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Smoke test del stack.<\/li>\n\n\n\n<li>Test de integraci\u00f3n API + DB.<\/li>\n\n\n\n<li>Limpieza de base de datos.<\/li>\n\n\n\n<li>Backup\/restore con SHA\u2011256.<\/li>\n\n\n\n<li>Auditor\u00eda de seguridad.<\/li>\n\n\n\n<li>Simulacro completo de recuperaci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<p>CI\/CD en GitHub Actions con:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Unit tests (frontend + worker).<\/li>\n\n\n\n<li>Auditor\u00eda de dependencias.<\/li>\n\n\n\n<li>Arranque Docker + smoke test.<\/li>\n\n\n\n<li>Gate estricto en main.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Sistema local de gesti\u00f3n de fichajes para flota VTC (\u2248140 conductores) \ud83d\udcf1 Worker de WhatsApp (procesamiento autom\u00e1tico) El worker escucha mensajes entrantes con el formato FICHAJE VTC y realiza: Acciones soportadas \ud83d\udee1\ufe0f Custodia autom\u00e1tica de reportes (PDF\/XLSX) Cumple RDL 8\/2019: \ud83d\udd14 Alertas autom\u00e1ticas Anomal\u00edas de jornada Horas extra (opt\u2011in) Descanso m\u00ednimo (opt\u2011in) \ud83d\udda5\ufe0f Panel CRM [&hellip;]<\/p>\n","protected":false},"featured_media":15,"template":"","tipo":[],"estado":[],"class_list":["post-13","projects","type-projects","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/portfolio.hotelkore.com\/index.php\/wp-json\/wp\/v2\/projects\/13","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/portfolio.hotelkore.com\/index.php\/wp-json\/wp\/v2\/projects"}],"about":[{"href":"https:\/\/portfolio.hotelkore.com\/index.php\/wp-json\/wp\/v2\/types\/projects"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/portfolio.hotelkore.com\/index.php\/wp-json\/wp\/v2\/media\/15"}],"wp:attachment":[{"href":"https:\/\/portfolio.hotelkore.com\/index.php\/wp-json\/wp\/v2\/media?parent=13"}],"wp:term":[{"taxonomy":"tipo","embeddable":true,"href":"https:\/\/portfolio.hotelkore.com\/index.php\/wp-json\/wp\/v2\/tipo?post=13"},{"taxonomy":"estado","embeddable":true,"href":"https:\/\/portfolio.hotelkore.com\/index.php\/wp-json\/wp\/v2\/estado?post=13"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}