Aplicación PWA para generar actas de visita de fidelización con firma electrónica, PDF y Excel maestro
Acta Express es una Progressive Web App (PWA) diseñada específicamente para ejecutivos de campo de Emcali que necesitan documentar visitas de fidelización con clientes. La aplicación incluye:
- ✅ Formulario estructurado para visitas de fidelización
- ✅ Captura de datos del ejecutivo y ubicación (zona, barrio, dirección)
- ✅ Datos completos del cliente/negocio (contrato, NIT, actividad económica)
- ✅ Registro de temas tratados con el cliente (energía eficiente, RETIQ, etc.)
- ✅ Registro de incidencias (variaciones, cortes de suministro)
- ✅ Firma manuscrita en pantalla (touch/stylus)
- ✅ Generación de PDF profesional con QR y hash SHA-256
- ✅ Compartir directo a Outlook/WhatsApp
- ✅ Historial local en IndexedDB
- ✅ Exportación a Excel maestro con 32 columnas
- ✅ Modo offline (una vez instalada como PWA)
- ✅ Geolocalización opcional
acta-express/
├─ index.html # UI principal
├─ app.js # Lógica completa
├─ dashboard.html # Dashboard de análisis
├─ dashboard.js # Lógica del dashboard
├─ styles.css # Estilos móviles
├─ manifest.webmanifest # Configuración PWA
├─ service-worker.js # Cache offline
├─ icon-192.png # Ícono PWA 192x192
├─ icon-512.png # Ícono PWA 512x512
├─ Actas_Master (3).xlsx # Ejemplo de Excel maestro
└─ README.md # Este archivo
# En PowerShell, desde la carpeta acta-express:
python -m http.server 8000Luego abre en tu navegador:
http://localhost:8000
Sube los archivos a:
- GitHub Pages (gratuito, HTTPS automático)
- Netlify (gratuito, HTTPS, drag & drop)
- Vercel (gratuito, HTTPS)
- Tu servidor con HTTPS
⚠️ Importante: Para que funcione como PWA instalable y offline, necesitas HTTPS o localhost.
- Abre la URL en Chrome para Android
- Toca el menú (⋮) → Agregar a pantalla de inicio
- La app se instalará como aplicación nativa
- Ábrela desde el launcher de Android
- Abre la app
- En la sección Configuración:
- Ingresa tu nombre (Ejecutivo)
- Ingresa tu correo corporativo
- (Opcional) Activa geolocalización para incluir coordenadas GPS
- Clic en Guardar configuración
Opción A - Android/Chrome con File System Access:
- Clic en Elegir/crear Excel maestro
- Selecciona o crea el archivo
Actas_Master.xlsx - La app podrá agregar registros directamente al archivo
Opción B - Modo regenerado (todos los navegadores):
- Si no configuras el Excel, cada vez que guardes se descargará un archivo completo actualizado
- Simplemente sobrescribe el anterior con el mismo nombre
-
Completa los datos del ejecutivo y ubicación:
- Zona (Norte, Sur, Centro, etc.)
- Barrio
- Dirección completa
-
Datos del Cliente/Negocio:
- Número de Contrato
- NIT
- Actividad Económica
- Exención de Contribución (Sí/No)
-
Datos de la Persona Encargada:
- Nombre del contacto
- Cargo
- Correo electrónico
- Celular
-
Temas Tratados con el Cliente:
- Marca los temas que se trataron durante la visita y describe cada uno:
- ☑ Energía eficiente → (campo de texto para descripción)
- ☑ Conexión directa con Emcali → (campo de texto para descripción)
- ☑ Etiqueta RETIQ → (campo de texto para descripción)
- ☑ Ahorro de energía → (campo de texto para descripción)
- ☑ Consumo de energía → (campo de texto para descripción)
- Marca los temas que se trataron durante la visita y describe cada uno:
-
Incidencias:
- ¿Ha tenido variaciones y fluctuaciones? (Sí/No)
- Si es Sí, indica cuántas
- ¿Ha tenido cortes de suministro de energía? (Sí/No)
- Si es Sí, indica cuántas
- ¿Ha tenido variaciones y fluctuaciones? (Sí/No)
-
Observaciones Generales:
- Describe cualquier observación adicional de la visita
-
Firma del cliente:
- El cliente firma con el dedo en el recuadro blanco
- Si se equivoca, clic en Limpiar
- Ingresa nombre del firmante
-
Marca el checkbox de consentimiento
-
Clic en Generar PDF
Opción 1 - Descarga automática:
- Clic en Compartir (Outlook)
- El PDF se descarga automáticamente
- Adjúntalo manualmente en tu correo
Opción 2 - Web Share (bonus):
- Si tu dispositivo lo soporta, se abrirá el menú de compartir nativo
- Selecciona la app (Outlook, Gmail, WhatsApp, etc.)
Guardar todas las actas:
- Clic en Actualizar Excel maestro
- Se generará/actualizará el archivo con la hoja Actas (37 columnas)
Guardar una sola acta:
- En el Historial, clic en Añadir a Excel junto a la acta deseada
- Todas las actas se guardan en el dispositivo (IndexedDB)
- Desde el historial puedes:
- Compartir cualquier acta anterior
- Añadir a Excel actas individuales
| # | Columna | Descripción |
|---|---|---|
| 1 | id_acta | ID único (ej: AX-20251011203045) |
| 2 | fecha_local | Fecha/hora local del dispositivo |
| 3 | fecha_utc | Fecha/hora UTC (ISO 8601) |
| 4 | ejecutivo_nombre | Nombre del ejecutivo |
| 5 | ejecutivo_correo | Correo del ejecutivo |
| 6 | zona | Zona de la visita |
| 7 | barrio | Barrio |
| 8 | direccion | Dirección completa |
| 9 | nombre_empresa | Nombre de la empresa o razón social |
| 10 | numero_contrato | Número de contrato del cliente |
| 11 | nit | NIT del cliente |
| 12 | actividad_economica | Actividad económica del negocio |
| 13 | exencion_contribucion | Exención de contribución (Sí/No) |
| 14 | contacto_nombre | Nombre de la persona encargada |
| 15 | contacto_cargo | Cargo del contacto |
| 16 | contacto_correo | Correo del contacto |
| 17 | contacto_celular | Celular del contacto |
| 18 | tema_energia_eficiente | Se trató energía eficiente (Sí/No) |
| 19 | desc_energia_eficiente | Descripción del tema energía eficiente |
| 20 | tema_conexion_emcali | Se trató conexión con Emcali (Sí/No) |
| 21 | desc_conexion_emcali | Descripción del tema conexión Emcali |
| 22 | tema_etiqueta_retiq | Se trató etiqueta RETIQ (Sí/No) |
| 23 | desc_etiqueta_retiq | Descripción del tema etiqueta RETIQ |
| 24 | tema_ahorro_energia | Se trató ahorro de energía (Sí/No) |
| 25 | desc_ahorro_energia | Descripción del tema ahorro de energía |
| 26 | tema_consumo_energia | Se trató consumo de energía (Sí/No) |
| 27 | desc_consumo_energia | Descripción del tema consumo de energía |
| 28 | incidencias_variaciones | Tuvo variaciones (Sí/No/vacío) |
| 29 | incidencias_variaciones_cant | Cantidad de variaciones |
| 30 | incidencias_cortes | Tuvo cortes (Sí/No/vacío) |
| 31 | incidencias_cortes_cant | Cantidad de cortes |
| 32 | observaciones | Observaciones generales |
| 33 | firmante_nombre | Nombre del firmante |
| 34 | geo_lat | Latitud (si geo está activo) |
| 35 | geo_lng | Longitud (si geo está activo) |
| 36 | hash_sha256 | Hash SHA-256 de verificación |
| 37 | pdf_filename | Nombre del archivo PDF |
Cada acta incluye un hash criptográfico que:
- Se calcula sobre todos los datos (excepto la imagen de firma)
- Aparece en el PDF
- Se incluye en el código QR
- Permite verificar que el documento no fue alterado
Contiene:
{
"id": "AX-20251011203045",
"hash": "base64_hash_sha256"
}- Se captura como imagen PNG (base64)
- Se incluye en el PDF y en el historial
- No sustituye firma electrónica avanzada certificada
Edita en index.html (líneas ~127-150) para agregar o modificar los checkboxes:
<label class="flex items-center gap-2 text-sm">
<input type="checkbox" id="temaPersonalizado" class="accent-sky-600" />
<span>Tu tema personalizado</span>
</label>Luego actualiza app.js en la función buildActaJSON() para capturar el nuevo campo.
Edita app.js, en la función buildPDF(), después de la línea del encabezado (línea ~297):
// Después de doc.text('ACTA DE VISITA...', L, T);
const logoImg = 'data:image/png;base64,TU_LOGO_BASE64...';
doc.addImage(logoImg, 'PNG', 420, 30, 100, 40); // Ajusta posición/tamañoEdita styles.css:
:root{
--sky:#0ea5e9; /* Color principal (azul cielo) */
--ink:#0f172a; /* Color texto oscuro */
}O en manifest.webmanifest:
"theme_color": "#0ea5e9" /* Color de barra en Android */- Chrome/Edge (Android/Desktop): Soporte completo
- Safari (iOS): Funciona, pero File System Access limitado
- Firefox: Funciona, sin File System Access
| Función | Chrome Android | Safari iOS | Edge Desktop |
|---|---|---|---|
| Formulario | ✅ | ✅ | ✅ |
| Firma táctil | ✅ | ✅ | ✅ |
| Generar PDF | ✅ | ✅ | ✅ |
| Web Share API | ✅ | ✅ | |
| Instalar PWA | ✅ | ✅ | ✅ |
| Offline (SW) | ✅ | ✅ | |
| Excel Append | ✅ | ❌ | ✅ |
| Excel Regenerado | ✅ | ✅ | ✅ |
✅ Completo |
La app usa estas librerías vía CDN (no requiere npm/instalación):
- Tailwind CSS - Estilos utility-first
- Signature Pad - Captura de firma manuscrita
- jsPDF - Generación de PDF en cliente
- QRCode.js - Códigos QR
- SheetJS (xlsx) - Lectura/escritura Excel
💡 Si quieres que funcione 100% offline sin internet, descarga las librerías localmente y actualiza las rutas en
index.htmlyservice-worker.js.
- Asegúrate de firmar dentro del recuadro blanco
- Usa el dedo o stylus, no el cursor del mouse en mobile
- Si la línea es muy delgada, aumenta el grosor en
app.js:state.firmaPad = new SignaturePad(canvas, { backgroundColor: 'rgb(255,255,255)', penColor: 'rgb(0,0,0)', minWidth: 1.5, maxWidth: 3 });
- Verifica que estés usando HTTPS o localhost
- En Chrome Android: Menú → Agregar a pantalla de inicio
- Asegúrate de tener los iconos en
/assets/
- El modo "Append directo" solo funciona en Chrome/Edge con File System Access API
- En otros casos, usa el modo "regenerado" (descarga y sobrescribe)
- Si Web Share no funciona, el PDF se descarga
- Adjúntalo manualmente desde tu app de correo
- Primero debes acceder online para que se instale el Service Worker
- Verifica en Chrome DevTools → Application → Service Workers
- Comprueba que las rutas en
service-worker.jssean correctas
Esta solución genera acuse de recibido documental con:
- Firma manuscrita digital
- Hash SHA-256 de verificación
- Timestamp local y UTC
- Código QR con datos de verificación
Este sistema NO sustituye servicios de firma electrónica avanzada/cualificada según normativas locales (ej: eIDAS en UE, Ley 527 en Colombia).
Para firmas con validez legal plena, integra servicios certificados como:
- DocuSign, Adobe Sign, SignNow
- Certicámara (Colombia), EDICOM, etc.
- Todos los datos se almacenan localmente en el dispositivo (IndexedDB)
- No hay servidor backend ni transmisión de datos
- El usuario es responsable de la seguridad del dispositivo
- Agregar tus iconos personalizados (192x192 y 512x512 px) reemplazando los existentes
- Personalizar el logo de Emcali en el PDF
- Ajustar los temas a tratar según necesidades específicas
- Probar en Android con casos reales de visitas de fidelización
- Subir a GitHub Pages o Netlify para HTTPS y acceso remoto
- Capacitar al equipo en el uso de la app
- Integrar con dashboard para análisis de datos (archivo dashboard.html incluido)
Para personalizaciones adicionales o integración con sistemas empresariales:
- Bases de datos backend (Firebase, Supabase)
- API REST para sincronización
- Firma electrónica certificada
- Personalización de plantillas PDF
- Módulos adicionales (fotos, audios, geofencing)
Este código es un prototipo funcional. Úsalo y modifícalo según tus necesidades.
¡Listo para capturar actas en campo! 🚀