base de datos centralizada
db104_ADA = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.140.101)(PORT = 1521)) (CONNECT_DATA = SERVER = DEDICATED) (SERVICE_NAME = db104)))
base de datos de configuración
db101_NE = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.140.101)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = db101)))
En la base de datos db101 que va ser utilizada para liquidar la nomina y realizar el envió de los documentos se debe parametrizar el cliente según la empresa que se requiera habilitar
Antes de iniciar con el paso 1, el ticket sobre el cual se realizó la solicitud de la habilitación se debe enviar al área de fabrica con el fin de que se cree la carpeta en el servidor de pruebas y producción de nómina electrónica y se deben enviar los siguientes documentos.
Con el siguiente UPDATE se va realizar la actualización de la configuración de la base datos, se ingresa el nit del la empresa a realiza el set de pruebas sin digito de verificación. El tipo de ambiente siempre es 2
Tener presente que siempre para nomina electrónica el nombre debe de ser {cliente}_NE_PROD con el fin de identificar el servicio de nómina y facturación. ejemplo FALVA_NE_PROD
UPDATE NOMINA.NE_PARAMETROS_VISTAS NPV SET NPV.NIT_PROVEEDOR_XML = 901273165 , --nit cliente que se requiere habilitar sin DV NPV.DV_NIT_PROVEEDOR_XML = 6 , -- dv del nit del cliente NPV.NIT_CLIENTE = 901273165 , -- nit del cliente que se requiere habilitar sin dv NPV.DV_NIT_CLIENTE = 6 , -- dv del nit del cliente NPV.CODIGO_CLIENTE = 'MADASS_TEST' -- nombre del cliente con el sinónimo _TEST para identificar que es habilitación WHERE AMBIENTE_ID = 2 -- ID 1 = producción 2 = pruebas o habilitación ; COMMIT;
Se debe crear el tercero de la empresa que se va habilitar En el modulo de nomina esta el maestro de terceros para realizar la creación del tercero - empresa
* Nomina / administrador del sistema / maestro de terceros
Se debe realizar la actualización del nit de la empresa en las tablas de configuración de nomina
UPDATE NOMINA.PARAMETROS_SISTEMA PS SET PS.NIT_EMPRESA = 901273165 -- Nit sin DV ; UPDATE NOMINA.EMPRESAS E SET E.K_N_NIT = 901273165 ,-- Nit sin DV E.SC_DIGITO_VERIFICACION = 6 --DV del nit ; UPDATE NOMINA.EMPRESAS_NOMINA EN SET EN.K_N_NIT = 901273165 -- Nit sin DV ; COMMIT;
Se deben ejecutar los ACL de habilitación solo si no están ejecutados
la ip de habilitación de nomina electrónica es 10.1.140.102:8081
La petición de validacion se debe realizar con el usuario SYS
SELECT UTL_HTTP.REQUEST('http://10.1.140.102:8081/NominaElectronica') FROM DUAL
La subconsulta debe visualizar la siguiente información
si la respuesta del servicio es diferente a la de la imagen se deben ejecutar los ACL con el usuario SYS
Inicialmente se debe validar que ACL hay creados en la base de datos solo se realiza en la db101
En la siguiente consulta se pueden visualizar; si ya existe un registro con el HOST 10.1.140.102 y LOWER_PORT 8081 no hay que ejecutarlos
SELECT * FROM DBA_NETWORK_ACLS
Si en la tabla no hay registros se ejecuta el siguiente query
grant execute on utl_http to NOMINA; grant execute on dbms_lock to NOMINA; ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN'; ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,'; BEGIN DBMS_NETWORK_ACL_ADMIN.create_acl ( acl => 'acls_ne_test.xml', description => 'Lista de control de acceso a los servicios de nomina electrónica', principal => 'NOMINA', is_grant => TRUE, privilege => 'connect', start_date => SYSDATE, end_date => NULL); COMMIT; end; BEGIN DBMS_NETWORK_ACL_ADMIN.add_privilege ( acl => 'acls_ne_test.xml', principal => 'NOMINA', is_grant => TRUE, privilege => 'connect', start_date => SYSTIMESTAMP, end_date => null ); COMMIT; END; BEGIN DBMS_NETWORK_ACL_ADMIN.add_privilege ( acl => 'acls_ne_test.xml', principal => 'NOMINA', is_grant => TRUE, privilege => 'resolve', start_date => SYSTIMESTAMP, end_date => null ); COMMIT; END; begin DBMS_NETWORK_ACL_ADMIN.assign_acl ( acl => 'acls_ne_test.xml', host => '10.1.140.102', lower_port => 8081, upper_port => NULL); COMMIT; end;
en la db104_ADA se debe parametrizar la empresa que va realizar el set de pruebas
En el siguiente INSERT solo se deben de modificar los datos que tienen comentarios y realizar el insert
INSERT INTO INTEGRACION.TBL_FE_CONEXION_CLIENTE (CODIGO_CLIENTE, NIT_CLIENTE, CODIGO_MEMPRESA, TYPE_SERVICE, TYPE_CLIENT, DB_PORT, DB_IP, DB_NAME, DB_USER, DB_PSWD, ESTADO, FECHA_REGISTRO, USUARIO_REGISTRO, ENVIRONMENT_SERVICE, DIAN_ID_SOFTWARE, DIAN_PIN, DIAN_NOMBRE_SOFTWARE, DIAN_ESTADO, DIAN_URL, DIAN_FECHA, PROFILEEXECUTIONID, HASH_SET_PRUEBAS, MODO_VALIDACION_PRUEBAS, URL_VAL_ACEPTACION, URL_VAL_ACEPTACION_FORM, EMAIL_NOTIFY, FORM_USER_LOGIN, FORM_USER_PASSWORD, MULTIEMPRESA, TIPO_SOFTWARE, NE_URL, NEV_URL, NUMERACION_URL, NOTIFICACION_ELECTRONICA) VALUES ( 'MADASS_TEST_1', --CODIGO CLIENTE QUE VA A REALIZAR EL SET DE PRUEBAS 901273165, -- NIT DE LA EMPRESA SIN DV '9999999999', 'WS-SOAP', 'DIAN', 1521, '10.1.140.101', 'db101', 'NOMINA', 'nomina',--CLAVE DEL USUARIO NOMINA DE LA BASE DE DATOS 'A', SYSDATE, 'INTEGRACION', 'DEVELOPMENT', '47099f8c-899d-4978-a4b0-1b2a85defede' --SOFTWARE ID DEL SET DE PRUEBAS || CHR (13) || CHR (10) || '', '73165', -- PIN DEL SET DE PRUEBAS 'SICOF', 'En Proceso', 'https://vpfe-hab.dian.gov.co/WcfDianCustomerServices.svc?wsdl', SYSDATE, 2, '30932093-9364-4919-8149-31988cb22a49',-- HAST DEL SET DE PRUEBAS 0, 'http://10.1.140.102:8080/ADAFE/webresources/forms/efevento/{codigo_cliente}/{nit_empresa}/{pst}/{cufe}', 'http://10.1.140.102:8080/ADAFE/webresources/forms/formulario/{codigo_cliente}/{nit_empresa}/{pst}/{cufe}', 'mesaservicios@ada.co', 'MADASS_TEST_1',--CODIGO CLIENTE QUE VA A REALIZAR EL SET DE PRUEBAS '50459d2dd34cad16a1de85e6a39d7a338539158cefa1d5d6edfbb13acaadcfdc1a9f7abe990729eb8867f54350160363', 'N', 'NE', 'http://127.0.0.1:8081/dianWsRest/v1/nomina', 'http://127.0.0.1:8081/dianWsRest/v1/habilitacion', 'http://127.0.0.1:8081/dianWsRest/v1/numeracion', 'S'); COMMIT;
Insertar el certificado en la tabla de la db104_ADA
Solo se deben modificar los campos comentariados
INSERT INTO PRESUP01.FE_CERTIFICATE_INFO ( FECHA_INICIO_VIGENCIA, FECHA_FIN_VIGENCIA, EMISOR_NIT, EMISOR_NOMBRE, EMISOR_DIRECCION, EMISOR_CORREO, EMISOR_CONTACTO, EMISOR_CEL_TEL, NOTIFICACION_EMAIL_WS, NOTIFICACION_EMAIL_ERP, NOTIFICACION_FRECU_DIAS, NOTIFICACION_FRECU_ENVIO, NOTIFICACION_MSG_PREVIO, NOTIFICACION_MSG_VENCIDO, ESTADO, FECHA_REGISTRO, CODIGO_USUARIO, CODIGO_MEMPRESA, NOTIFICACION_TRAS_VENCER, PATH_CLIENT_PROPERTIES, NIT_CLIENTE, TIPO_SOFTWARE, CODIGO_CLIENTE) VALUES ( TO_DATE ('21/02/2023 19:00:00', 'DD/MM/YYYY HH24:MI:SS'),--TENER PRESENTE LAS FECHA DE INICIO(LA FECHA REAL DE HABILITACION DEBE ESTAR EN EL RANGO) TO_DATE ('21/02/2025 19:00:00', 'DD/MM/YYYY HH24:MI:SS'),--TENER PRESENTE LA FECHA FINAL (LA FECHA REAL DE HABILITACION DEBE ESTAR EN EL RANGO) 900204272, 'GESTION DE SEGURIDAD ELECTRONICA S.A', 'CL 73 7 31 P3 TO B ED EL CAMINO', 'info@gse.com.co', 'ALVARO CARRERAS AMOROS', '4050082', 'contratosprogresar@gmail.com', 'contratosprogresar@gmail.com', 1, 2, 'Proximo a vencer', ' ', 'A', TO_DATE ('27/02/2023 15:51:38', 'DD/MM/YYYY HH24:MI:SS'), 1, '228', '0', 'adafe_home/com/ada/adafe/certificado/901273165/Cliente_NE.properties',--EN LA RUTA QUE ESTA EN LA LINEA SE DEBE REEMPLAZAR EL NIT DE LA EMPRESA 901273165,--NIT DE LA EMPRESA A REALIZAR EL SET DE PRUEBAS SIN DV 'NE', 'MADASS_TEST_1');--INGRESAR EL CODIGO DEL CLIENTE PREVIAMENTE SELECCIONADO E INSERTADO EN LA TABLA TBL_FE_CONEXION_CLIENTE COMMIT;
Se deben borrar los registros de las dos tablas que tienen la sentencia DELETE y actualizar el periodo 202401 a estado borrador con el UPDATE
En caso de que en la tabla NE_PERIODOS_GENERADOS no exista el periodo 202401 se ejecuta el insert
DELETE FROM NOMINA.NE_WS_INFORME_ERROR ; DELETE FROM NOMINA.NE_ENVIADOS_WS ; UPDATE NOMINA.NE_PERIODOS_GENERADOS SET ESTADO = 'B' WHERE PERIODO = 202401 ; COMMIT ; --El insert solo se debe ejecutar si en NE_PERIODOS_GENERADOS no esta el periodo 202401 INSERT INTO NOMINA.NE_PERIODOS_GENERADOS (ID, PERIODO, ANO, MES, FECHA_INICIAL, FECHA_FINAL, TIPO_ARCHIVO, ESTADO, CODIGO_MEMPRESA, FECHA_REGISTRO, USUARIO_REGISTRO) VALUES (2, '202401', 2024, 1, TO_DATE ('01/01/2024', 'DD/MM/YYYY'), TO_DATE ('31/01/2024', 'DD/MM/YYYY'), 1, 'B', '9999999999', SYSDATE, 'NOMINA') ; COMMIT
En la base de datos existe una nómina liquidada en el periodo 202401 con el número de nómina 10628 con el tipo liquidación denominado NOMINA ELECTRONICA TEST la cual tiene 11 empleados, la nómina está en estado aprobada ya que lo requiere el proceso para poder que se visualice en las vistas de envió.
para validar que la nómina si este correcta ejecutar la consulta y debe retomar datos de los empleados y conceptos
SELECT MT.CODIGO_TERCERO, MT.NIT AS NUMERO_DOCUMENTO, MT.NOMBRE AS NOMBRE, TL.SS_TIPO_LIQUIDACION AS TIPO_LIQUIDACION, MN.KA_NL_DCTO_NOMINA AS NUMERO_NOMINA, CPTO.SS_CODIGO AS CODIGO_CONCEPTO, CPTO.SS_CONCEPTO AS DESCRIPCION_CONCEPTO, NETC.TIPO, NETC.DESCRIPCION AS DESCRIPCION_TIPO_CONCEPTO, CPTO.SC_SIGNO AS SIGNO, SUM (ROUND (MNCC.ND_VALOR)) AS VALOR FROM NOMINA.MOVIMIENTOS_NOMINA MN, NOMINA.MOVIMIENTOS_NOMINA_DETALLE MND, NOMINA.CONCEPTOS CPTO, NOMINA.MAESTRO_TERCEROS MT, NOMINA.TIPOS_LIQUIDACIONES TL, NOMINA.NE_TIPOS_CONCEPTO NETC, NOMINA.NE_CONCEPTOS_RELACION NECR, NOMINA.EMPLEADOS E, NOMINA.MOVIMIENTOS_NOMINA_CCOSTO MNCC WHERE MN.KA_NL_MOVIMIENTO = MND.KA_NL_MOVIMIENTO AND MND.KA_NL_MOVIMIENTO_NOMINA = MNCC.KA_NL_MOVIMIENTO_DETALLE AND MN.SC_ESTADO = 'A' AND CPTO.KA_NL_CONCEPTO = MND.KA_NL_CONCEPTO AND MN.KA_NL_TERCERO = MT.CODIGO_TERCERO AND MN.KA_NL_TIPO_LIQUIDACION = TL.KA_NL_TIPO_LIQUIDACION AND MN.KA_NL_TERCERO = E.KA_NL_TERCERO AND TO_CHAR (MN.DD_DESDE, 'yyyymm') = 202401 AND MND.KA_NL_CONCEPTO = NECR.CONCEPTO_ID(+) AND NECR.TIPO_CONCEPTO_ID = NETC.ID(+) AND MN.KA_NL_TERCERO NOT IN (SELECT CODIGO_EMPLEADO FROM NOMINA.NE_ENVIADOS_WS WHERE PERIODO = 202401 AND TIPO_ARCHIVO = 1 AND ERROR = 0) GROUP BY MT.CODIGO_TERCERO, MT.NIT, MT.NOMBRE, TL.SS_TIPO_LIQUIDACION, MN.KA_NL_DCTO_NOMINA, CPTO.SS_CODIGO, CPTO.SS_CONCEPTO, NETC.TIPO, NETC.DESCRIPCION, CPTO.SC_SIGNO ORDER BY MT.NIT
Cuando se esté realizando el envió y se generan errores se deben consultar en la siguiente tabla la cual tiene la descripción del error generado por el envió.
SELECT * FROM NOMINA.NE_WS_INFORME_ERROR
Después de validado los errores se deben eliminar para poder continuar con el proceso.
1. inicialmente validar que el periodo que se está enviando exista en la siguiente tabla
SELECT T.*,ROWID FROM NOMINA.NE_PERIODOS_GENERADOS T ORDER BY PERIODO DESC
Al validar el registro el ESTADO tiene que ser B y se ejecuta el siguiente query.
DECLARE v_periodo NUMBER; BEGIN SELECT PERIODO INTO v_periodo FROM NOMINA.NE_PERIODOS_GENERADOS WHERE ESTADO = 'B'; MODIFICA.SP_ELIMINAR_ERRORES_NE(v_periodo, 1); END;COMMIT;
Si se genera error por que el procedimiento esta invalido
Se debe ejecutar el query que crea el procedimiento SP_ELIMINAR_ERRORES_NE y volver a ejecutar el proceso
CREATE OR REPLACE PROCEDURE MODIFICA.SP_ELIMINAR_ERRORES_NE ( AS_PERIODO VARCHAR2, AN_CEDULA NUMBER) /*1 si es todos los empleados*/ AS LL_REG NUMBER; LL_COD_EMPLEADO NUMBER; LS_ERROR VARCHAR2 (1000); /*------------------------------------- Se crea procedimiento ---------- Autor: Brahian Castañeda brahian.castañeda@ada.co Fecha: 12/10/2022 ---------- Descripcion: Se crea procedimiento, este procedimiento elimina uno o todos los registros de nomina electronica en un periodo, los cuales tienen un error durante su ejecucion (error tipo 1 o 2) -------------------------------------- Nota: la clasificacion de los errores es el siguiente: (Error: 0): Significa que proceso sin ningun percance. (Error: 1): Este error significa que nomina electronica no pudo ejecutarse ni en el inicio, por lo tanto no pudo generar un CUNE y no se proceso en la DIAN. (Error: 2): Este error significa 2 cosas: 1.Durante la ejecución se consume un CUNE, el llamado a la DIAN es exitoso, pero en la DIAN se encontro una inconsistencia, pero aun asi se recibio la informacion correctamente. 2.Durante la ejecución se consume un CUNE, pero al llamar a la DIAN no es exitoso, debido a que el certificado no esta vigente, los servicios estan caidos, el servidor demoro en responder, el servidor esta caido, ETC., debido a esto la DIAN no recibe la informacion del empleado enviado. -------------------------------------- */ BEGIN /*Si el parametro AN_CEDULA es 1 entonces es para hacer una limpieza general*/ IF AN_CEDULA = 1 THEN /*Validamos que si se ha procesado el periodo seleccionado*/ SELECT COUNT (*) INTO LL_REG FROM NOMINA.NE_ENVIADOS_WS WHERE PERIODO = AS_PERIODO; IF LL_REG = 0 THEN ROLLBACK; LS_ERROR := 'Error: El periodo ' || AS_PERIODO || ' no existe en los periodos procesados en Nomina Electronica (NE_ENVIADOS_WS)'; DBMS_OUTPUT.PUT_LINE (LS_ERROR); raise_application_error (-20001, LS_ERROR); ELSE /*Verificamos si hay errores en el periodo seleccionado*/ SELECT COUNT (*) INTO LL_REG FROM NOMINA.NE_ENVIADOS_WS WHERE PERIODO = AS_PERIODO AND ERROR IN (1, 2); IF LL_REG = 0 THEN ROLLBACK; LS_ERROR := 'Error: En el periodo ' || AS_PERIODO || ' no se registran errores en Nomina Electronica (NE_ENVIADOS_WS)'; DBMS_OUTPUT.PUT_LINE (LS_ERROR); raise_application_error (-20001, LS_ERROR); ELSE /*Borramos los registros con error tipo 1 y 2*/ DELETE FROM NOMINA.NE_ENVIADOS_WS WHERE PERIODO = AS_PERIODO AND ERROR IN (1, 2); END IF; END IF; ELSE /*Validamos que el empleado exista*/ SELECT NVL (CODIGO_TERCERO, 0) INTO LL_COD_EMPLEADO FROM TESORE01.MAESTRO_TERCEROS WHERE NITSD = AN_CEDULA; IF LL_COD_EMPLEADO = 0 THEN ROLLBACK; LS_ERROR := 'Error: El empleado con cedula ' || AN_CEDULA || ' no existe (MAESTRO_TERCEROS)'; DBMS_OUTPUT.PUT_LINE (LS_ERROR); raise_application_error (-20001, LS_ERROR); ELSE /*Validamos que durante el periodo el empleado si sse haya procesado al menos una vez en nomina electronica*/ SELECT COUNT (*) INTO LL_REG FROM NOMINA.NE_ENVIADOS_WS WHERE PERIODO = AS_PERIODO AND CODIGO_EMPLEADO = LL_COD_EMPLEADO; IF LL_REG = 0 THEN ROLLBACK; LS_ERROR := 'Error: El empleado con cedula ' || AN_CEDULA || ' no ha sido procesado en nomina electronica (NE_ENVIADOS_WS) en el periodo ' || AS_PERIODO; DBMS_OUTPUT.PUT_LINE (LS_ERROR); raise_application_error (-20001, LS_ERROR); ELSE /*Validamos si el empleado tuvo errores durante el periodo ejecutado*/ SELECT COUNT (*) INTO LL_REG FROM NOMINA.NE_ENVIADOS_WS WHERE PERIODO = AS_PERIODO AND CODIGO_EMPLEADO = LL_COD_EMPLEADO AND ERROR IN (1, 2); IF LL_REG = 0 THEN ROLLBACK; LS_ERROR := 'Error: El empleado con cedula ' || AN_CEDULA || ' no tiene registro de errores en nomina electronica (NE_ENVIADOS_WS) en el periodo ' || AS_PERIODO; DBMS_OUTPUT.PUT_LINE (LS_ERROR); raise_application_error (-20001, LS_ERROR); ELSE /*Borramos los registros con errores*/ DELETE FROM NOMINA.NE_ENVIADOS_WS WHERE PERIODO = AS_PERIODO AND CODIGO_EMPLEADO = LL_COD_EMPLEADO AND ERROR IN (1, 2); END IF; END IF; END IF; END IF; EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE ( 'Error durante la ejecucion del procedimiento SP_ELIMINAR_ERRORES_NE'); END; /
Para enviar la nómina de ajuste (Eliminar un registro el cual ya esta en al Dian)
UPDATE NOMINA.NE_PERIODOS_GENERADOS SET TIPO_ARCHIVO = 2 , ESTADO = 'B' WHERE PERIODO = /*Ingrese el periodo correspondiente al ajuste*/
UPDATE NOMINA.NE_ENVIADOS_WS SET TIPO_ARCHIVO = 2 , TIPO_NOTA = 2 WHERE PERIODO = /*Ingrese el periodo correspondiente al ajuste*/ AND CODIGO_TERCERO = /*Ingrese el codigo del empleado del cual se va realizar la eliminacion del registro en la dian*/
Después de enviados los registros se debe restablecer los registros modificados con el siguiente update
UPDATE NOMINA.NE_ENVIADOS_WS SET TIPO_ARCHIVO = 1 , TIPO_NOTA = 9 WHERE PERIODO = /*Ingrese el periodo correspondiente al ajuste*/ AND CODIGO_TERCERO = /*Ingrese el codigo del empleado del cual se va realizar la eliminacion del registro en la dian*/ AND TIPO_XML = 102
UPDATE NOMINA.NE_PERIODOS_GENERADOS SET TIPO_ARCHIVO = 1 , ESTADO = 'T' WHERE PERIODO = /*Ingrese el periodo correspondiente al ajuste*/