C1 - Demo ERP
Estado Actual
Credenciales ya obtenidas
Propósito: Desarrollo y validación de estructura XML
Limitación: Solo validación, sin firma real
Este plan detalla todas las actividades necesarias para implementar la integración completa con Facturatech, desde la base de datos hasta el módulo visual, pasando por las diferentes fases de credenciales (C1 → C2 → C3).
C1 - Demo ERP
Estado Actual
Credenciales ya obtenidas
Propósito: Desarrollo y validación de estructura XML
Limitación: Solo validación, sin firma real
C2 - Demo con Consumo
Próximo Paso
Solicitar al área de soporte WS
Propósito: Pruebas con rate limiting real
Responsable: Líder técnico o PO
C3 - Producción
Meta Final
Emisión real ante DIAN
Propósito: Operación productiva
Requisito: Validación exitosa en C2
Objetivo: Crear la estructura completa de tablas para almacenar nóminas electrónicas y su trazabilidad.
Componentes principales:
CREATE TABLE nomina_electronica ( id INT PRIMARY KEY AUTO_INCREMENT, empresa_id INT NOT NULL, empleado_id INT NOT NULL, periodo_id INT NOT NULL,
-- Identificación del documento prefijo VARCHAR(10) NOT NULL, consecutivo VARCHAR(20) NOT NULL, numero VARCHAR(30) NOT NULL UNIQUE, tipo_documento ENUM( 'INDIVIDUAL', 'NOVEDAD', 'AJUSTE_REEMPLAZO', 'AJUSTE_ELIMINACION' ) DEFAULT 'INDIVIDUAL',
-- Relaciones con documentos previos nomina_original_id INT, cune_original VARCHAR(64),
-- Estado del proceso estado ENUM( 'PENDIENTE_ENVIO', 'EN_COLA', 'ENVIADO', 'EN_PROCESO', 'AUTORIZADO', 'ERROR', 'DESCARGADO', 'ELIMINADA' ) NOT NULL DEFAULT 'PENDIENTE_ENVIO',
-- Tracking Facturatech transaction_id VARCHAR(255), cune VARCHAR(64),
-- Almacenamiento de documentos xml_original MEDIUMBLOB, xml_firmado MEDIUMBLOB, pdf_documento MEDIUMBLOB, xml_firmado_hash VARCHAR(64), xml_firmado_path VARCHAR(500),
-- Valores para consulta rápida devengados_total DECIMAL(15,2), deducciones_total DECIMAL(15,2), comprobante_total DECIMAL(15,2),
-- Fechas del proceso fecha_liquidacion DATE NOT NULL, periodo_inicio DATE NOT NULL, periodo_fin DATE NOT NULL, fecha_envio DATETIME, fecha_autorizacion DATETIME, fecha_descarga_xml DATETIME, fecha_descarga_pdf DATETIME,
-- Control de errores intentos_envio INT DEFAULT 0, intentos_consulta INT DEFAULT 0, ultimo_error TEXT, detalle_error TEXT,
-- Flags de control requiere_atencion BOOLEAN DEFAULT FALSE,
-- Auditoría created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, created_by INT, updated_by INT,
-- Índices INDEX idx_empresa (empresa_id), INDEX idx_empleado (empleado_id), INDEX idx_periodo (periodo_id), INDEX idx_estado (estado), INDEX idx_numero (numero), INDEX idx_transaction (transaction_id), INDEX idx_cune (cune), INDEX idx_fecha_liquidacion (fecha_liquidacion),
FOREIGN KEY (empresa_id) REFERENCES empresas(id), FOREIGN KEY (empleado_id) REFERENCES empleados(id), FOREIGN KEY (periodo_id) REFERENCES periodos_nomina(id), FOREIGN KEY (nomina_original_id) REFERENCES nomina_electronica(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;CREATE TABLE nomina_electronica_log ( id INT PRIMARY KEY AUTO_INCREMENT, nomina_electronica_id INT NOT NULL, operacion ENUM( 'UPLOAD_DOCUMENT', 'DOCUMENT_STATUS', 'DOWNLOAD_XML', 'DOWNLOAD_PDF', 'DOWNLOAD_CUNE' ) NOT NULL, codigo_respuesta INT, mensaje TEXT, mensaje_error TEXT, request_soap MEDIUMTEXT, response_soap MEDIUMTEXT, tiempo_respuesta DECIMAL(10,3), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_nomina (nomina_electronica_id), INDEX idx_operacion (operacion),
FOREIGN KEY (nomina_electronica_id) REFERENCES nomina_electronica(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE nomina_electronica_cola ( id INT PRIMARY KEY AUTO_INCREMENT, nomina_electronica_id INT NOT NULL, prioridad ENUM('ALTA', 'MEDIA', 'BAJA') DEFAULT 'MEDIA', estado_cola ENUM( 'PENDIENTE', 'PROCESANDO', 'COMPLETADO', 'ERROR' ) DEFAULT 'PENDIENTE', fecha_agregado TIMESTAMP DEFAULT CURRENT_TIMESTAMP, fecha_procesamiento DATETIME, fecha_completado DATETIME, intentos INT DEFAULT 0, error_mensaje TEXT,
INDEX idx_estado (estado_cola), INDEX idx_prioridad (prioridad), UNIQUE KEY uk_nomina (nomina_electronica_id),
FOREIGN KEY (nomina_electronica_id) REFERENCES nomina_electronica(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE nomina_electronica_auditoria ( id INT PRIMARY KEY AUTO_INCREMENT, nomina_electronica_id INT NOT NULL, accion ENUM( 'CREACION', 'ENVIO', 'AUTORIZACION', 'DESCARGA_XML', 'DESCARGA_PDF', 'NOVEDAD', 'REEMPLAZO', 'ELIMINACION', 'ERROR' ) NOT NULL, descripcion TEXT, datos_antes JSON, datos_despues JSON, usuario_id INT, ip_address VARCHAR(45), user_agent TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_nomina (nomina_electronica_id), INDEX idx_accion (accion), INDEX idx_usuario (usuario_id),
FOREIGN KEY (nomina_electronica_id) REFERENCES nomina_electronica(id), FOREIGN KEY (usuario_id) REFERENCES usuarios(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;Entregables:
Objetivo: Implementar lógica de negocio reutilizable a nivel de base de datos.
Procedimientos a crear:
-- Encolar nómina para procesamientoDELIMITER $$CREATE PROCEDURE sp_encolar_nomina( IN p_nomina_id INT, IN p_prioridad ENUM('ALTA', 'MEDIA', 'BAJA'))BEGIN INSERT INTO nomina_electronica_cola (nomina_electronica_id, prioridad) VALUES (p_nomina_id, p_prioridad) ON DUPLICATE KEY UPDATE prioridad = p_prioridad;END$$
-- Actualizar estado de nóminaCREATE PROCEDURE sp_actualizar_estado_nomina( IN p_nomina_id INT, IN p_estado VARCHAR(50), IN p_transaction_id VARCHAR(255), IN p_mensaje TEXT)BEGIN UPDATE nomina_electronica SET estado = p_estado, transaction_id = COALESCE(p_transaction_id, transaction_id), updated_at = NOW() WHERE id = p_nomina_id;
-- Registrar en auditoría INSERT INTO nomina_electronica_auditoria ( nomina_electronica_id, accion, descripcion ) VALUES ( p_nomina_id, 'CAMBIO_ESTADO', CONCAT('Estado: ', p_estado, '. ', COALESCE(p_mensaje, '')) );END$$
-- Obtener siguiente consecutivoCREATE FUNCTION fn_siguiente_consecutivo( p_empresa_id INT, p_prefijo VARCHAR(10)) RETURNS VARCHAR(20)DETERMINISTICBEGIN DECLARE v_ultimo INT;
SELECT MAX(CAST(consecutivo AS UNSIGNED)) INTO v_ultimo FROM nomina_electronica WHERE empresa_id = p_empresa_id AND prefijo = p_prefijo;
RETURN LPAD(COALESCE(v_ultimo, 0) + 1, 5, '0');END$$
DELIMITER ;Entregables:
Objetivo: Preparar datos iniciales y scripts de migración.
Tareas:
Objetivo: Organizar el código backend según arquitectura propuesta.
Estructura:
application/├── models/│ └── Nomina/│ ├── Electronica.php│ └── ElectronicaTable.php├── services/│ └── Facturatech/│ ├── SoapClient.php│ ├── XMLGenerator.php│ ├── XMLValidator.php│ ├── QueueManager.php│ ├── StatusPoller.php│ └── DownloadManager.php└── library/ └── Dataemunah/ └── Facturatech/ ├── Config.php ├── RateLimiter.php └── Logger.phpObjetivo: Implementar la clase base para comunicación SOAP.
Archivo: application/services/Facturatech/SoapClient.php
Métodos principales:
uploadDocument($xmlBase64): arraydocumentStatus($transaccionID): arraydownloadXML($prefijo, $folio): arraydownloadPDF($prefijo, $folio): arraydownloadCUNE($prefijo, $folio): arrayCaracterísticas:
Objetivo: Crear servicio que genere XMLs según estructura DIAN.
Archivo: application/services/Facturatech/XMLGenerator.php
Métodos:
public function generarNominaIndividual($datosNomina): stringpublic function generarNominaNovedadmonetaria($nominaOriginal, $correcciones): stringpublic function generarAjusteReemplazo($nominaOriginal, $datosCorregidos): stringpublic function generarAjusteEliminacion($nominaOriginal, $motivo): stringValidaciones incluidas:
Objetivo: Validar XMLs contra esquema XSD.
Archivo: application/services/Facturatech/XMLValidator.php
Validaciones:
Método principal:
public function validar($xmlContent): array// Retorna: ['valido' => bool, 'errores' => array]Objetivo: Implementar procesamiento por lotes respetando rate limiting.
Archivo: application/services/Facturatech/QueueManager.php
Características:
Métodos principales:
public function encolarNomina($nominaId, $prioridad = 'MEDIA'): boolpublic function procesarSiguienteLote(): arraypublic function obtenerEstadoCola(): arrayObjetivo: Consultar estado hasta obtener autorización.
Archivo: application/services/Facturatech/StatusPoller.php
Características:
Método principal:
public function esperarAutorizacion($transactionID): array// Retorna cuando estado = 200 o timeoutObjetivo: Descargar y almacenar documentos firmados.
Archivo: application/services/Facturatech/DownloadManager.php
Métodos:
public function descargarYAlmacenarXML($prefijo, $folio): boolpublic function descargarYAlmacenarPDF($prefijo, $folio): boolpublic function obtenerCUNE($prefijo, $folio): stringResponsabilidades:
Objetivo: Controlar velocidad de peticiones.
Archivo: library/Dataemunah/Facturatech/RateLimiter.php
Implementación:
Objetivo: Gestionar credenciales y configuración.
Archivo: library/Dataemunah/Facturatech/Config.php
Métodos:
public static function getWsdl(): stringpublic static function getUsuario(): stringpublic static function getPassword(): string // SHA256public static function isProduccion(): boolObjetivo: Agregar entrada en menú de empresa.
Ubicación: Menú lateral contextual de empresa
Estructura propuesta:
Empresa XYZ ├── Dashboard ├── Empleados ├── Nómina │ ├── Liquidación │ ├── Reportes │ └── Nómina Electrónica ← NUEVO │ ├── Dashboard │ ├── Listado │ ├── Emitir │ ├── Cola │ └── Reportes └── ConfiguraciónPermisos:
Ruta: /empresa/{empresaId}/nomina-electronica/dashboard
Componentes:
Resumen Numérico
Gráficos
Alertas
Acciones Rápidas
Ruta: /empresa/{empresaId}/nomina-electronica/listado
Funcionalidades:
Filtros:
Tabla:
Acciones por fila:
Búsqueda global:
Ruta: /empresa/{empresaId}/nomina-electronica/detalle/{id}
Secciones (tabs):
Acciones disponibles (botones superiores):
Ruta: /empresa/{empresaId}/nomina-electronica/emitir
Flujo:
Seleccionar Período
Lista de Empleados
Validaciones Previas
Confirmación
Procesamiento
Resultado Final
Ruta: /empresa/{empresaId}/nomina-electronica/novedad/{id}
Secciones:
1. Información de Nómina Original (readonly):
2. Correcciones (editable):
3. Justificación:
4. Vista Previa:
5. Confirmación y Envío:
Ruta: /empresa/{empresaId}/nomina-electronica/ajuste/{id}
Restricción: Solo editar información NO monetaria
Campos editables:
Bloqueado (readonly):
Advertencia visible:
Flujo de confirmación:
Ruta: /empresa/{empresaId}/nomina-electronica/eliminar/{id}
Advertencia prominente:
Formulario:
1. Información del Documento (readonly):
2. Justificación de Eliminación:
3. Autorización:
4. Confirmación de Seguridad:
CONFIRMO ELIMINACION5. Envío:
Después de eliminar:
Ruta: /empresa/{empresaId}/nomina-electronica/cola
Funcionalidad principal: Monitoreo en tiempo real del procesamiento
Secciones:
1. Resumen Numérico (cards):
2. Progreso General:
3. Estado Actual:
4. Lista de Nóminas en Cola:
Actualización:
Acciones:
Ruta: /empresa/{empresaId}/nomina-electronica/reportes
Reportes disponibles:
Resumen Mensual
Exportar: PDF, Excel
Estadísticas de Emisión
Exportar: PDF, Excel
Por Empleado
Exportar: Excel, CSV
Auditoría
Exportar: PDF, Excel
Filtros globales:
Objetivo: Completar todo el desarrollo usando credenciales C1 actuales.
Validaciones:
Criterio de completitud: Todo el código implementado y funcionando en ambiente C1
Objetivo: Obtener credenciales C2 del área de soporte WS de Facturatech.
Responsable: Líder técnico o Product Owner
Información a enviar:
Canal: Email a soporte WS de Facturatech
Objetivo: Integrar credenciales C2 en el sistema.
Tareas:
application.ini con credenciales C2Validación:
Objetivo: Crear batería completa de pruebas automatizadas.
Tests Unitarios:
tests/unit/├── XMLGeneratorTest.php├── XMLValidatorTest.php├── RateLimiterTest.php├── ConfigTest.php└── CalculosTest.phpTests de Integración:
tests/integration/├── SoapClientTest.php├── QueueManagerTest.php├── StatusPollerTest.php├── DownloadManagerTest.php└── FlowCompletoTest.phpTests de Carga:
tests/load/├── Batch100NominasTest.php├── Batch500NominasTest.php└── Batch1000NominasTest.phpMeta: Cobertura de código >= 80%
Herramientas:
Objetivo: Validar todos los flujos con credenciales C2.
Casos de prueba mandatorios:
Emisión Individual
Emisión por Lotes
Novedad
Ajuste de Reemplazo
Eliminación
Procesamiento Masivo
Recuperación de Errores
Timeout Handling
Entregables:
Objetivo: Emitir nómina real de empleados Conectera en C2.
Preparación:
Ejecución:
Validación:
Feedback:
Objetivo: Corregir cualquier issue encontrado en pruebas C2.
Proceso:
Objetivo: Completar toda la documentación necesaria.
Documentos a crear/actualizar:
Objetivo: Confirmar que todo está listo para producción.
Checklist de validación:
Objetivo: Obtener credenciales productivas.
Responsable: Product Owner o Gerente de Proyecto
Requisitos para solicitar:
Documentos a presentar a Facturatech:
Información adicional requerida:
Objetivo: Preparar configuración para C3.
Tareas:
Objetivo: Definir estrategia de migración a producción.
Fases de migración:
Pre-Migración (Día -1)
Migración (Día 0 - Madrugada)
Validación (Día 0 - Mañana)
Go-Live Parcial (Día 0 - Tarde)
Go-Live Completo (Día 1+)
Plan de Rollback:
Objetivo: Preparar a los usuarios finales.
Audiencias:
Material de capacitación:
Temas a cubrir:
Objetivo: Monitoreo intensivo primera semana.
Métricas a vigilar:
Reuniones diarias (primera semana):
Guardia 24/7 (primera semana):
Objetivo: Mejoras basadas en uso real.
Áreas de optimización:
Monitoreo continuo:
| Rol | Responsabilidades | Actividades Clave |
|---|---|---|
| Líder Técnico | Arquitectura, decisiones técnicas, calidad código | Diseño, code reviews, solicitud C2/C3 |
| Product Owner | Priorización, validación funcional, aprobaciones | Validación de flujos, aprobación go-live |
| Desarrollador Backend | Implementación servicios, APIs, lógica negocio | Generador XML, sistema cola, polling |
| Desarrollador Frontend | Implementación UI, integración con backend | Módulo visual, formularios, reportes |
| QA/Tester | Pruebas, validación, documentación bugs | Ejecución tests, pruebas C2, evidencias |
| DBA | Diseño BD, optimización, backups | Tablas, índices, stored procedures |
| DevOps | Despliegue, configuración, monitoreo | Setup C3, alertas, backups |
Al finalizar la implementación, el sistema debe cumplir:
Funcional
Performance
Confiable
Usable