Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
ada:sicoferp:financiero:tesoreria:conciliacionbancaria:conciliacioncargadedatos [2026/03/26 14:32] 192.168.175.51 |
ada:sicoferp:financiero:tesoreria:conciliacionbancaria:conciliacioncargadedatos [2026/04/20 13:46] (actual) brahian.castaneda |
||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| + | |||
| + | |||
| + | |||
| ====== Conciliación (Carga de Datos) ====== | ====== Conciliación (Carga de Datos) ====== | ||
| Línea 43: | Línea 46: | ||
| - Se modifica la validación de errores al importar archivo de conciliacion bancaria, para que en caso de no tener ningúna linea con la estructura, el sistema posterior a esto no debe sacar error, y posterior a esto, traer las partidas conciliatoras del mes anterior. | - Se modifica la validación de errores al importar archivo de conciliacion bancaria, para que en caso de no tener ningúna linea con la estructura, el sistema posterior a esto no debe sacar error, y posterior a esto, traer las partidas conciliatoras del mes anterior. | ||
| - | ==== Documentación Técnica: Corrección de Estado en Conciliación Bancaria ==== | + | ===== Corrección de Estado en Conciliación Bancaria ===== |
| 1. Descripción del Problema | 1. Descripción del Problema | ||
| Se detectó un comportamiento inconsistente en la ventana w_conciliacion_bancos. Al realizar una conciliación (ya sea manual o por importación) que resultaba en un cuadre perfecto en la primera transacción, el sistema asignaba erróneamente el estado "Incompleto" (I) en lugar de "Completado" (C). | Se detectó un comportamiento inconsistente en la ventana w_conciliacion_bancos. Al realizar una conciliación (ya sea manual o por importación) que resultaba en un cuadre perfecto en la primera transacción, el sistema asignaba erróneamente el estado "Incompleto" (I) en lugar de "Completado" (C). | ||
| Línea 83: | Línea 86: | ||
| idw_det_bancos.SetItem(1, "estado", ls_estado) | idw_det_bancos.SetItem(1, "estado", ls_estado) | ||
| + | |||
| + | ===== Corrección del Proceso de Eliminación de Conciliaciones ===== | ||
| + | |||
| + | === 1. Resumen del Problema === | ||
| + | |||
| + | Módulo: Tesorería / Conciliación Bancaria. | ||
| + | |||
| + | Bug ID: [#53269] | ||
| + | |||
| + | Descripción: El sistema no permitía eliminar conciliaciones en estado "Incompleto" ('I'). Aunque el usuario ingresaba la descripción de eliminación y guardaba, el registro persistía en la base de datos con su estado original. Además | ||
| + | |||
| + | === 2. Análisis de Causa Raíz === | ||
| + | |||
| + | Se identificaron tres factores técnicos que provocaban el fallo: | ||
| + | |||
| + | Sobreescritura de Estado en Memoria: El evento ue_grabar de la ventana w_conciliacion_bancos recalculaba el estado de la conciliación basándose en los registros pendientes. Este cálculo ignoraba si el usuario había marcado el registro como "Eliminado" ('E'), sobreescribiendo el cambio justo antes de enviar los datos a la DB. | ||
| + | Persistencia de Buffers: La ventana de descripción no limpiaba los campos al inicializarse, mostrando datos residuales de sesiones previas. | ||
| + | |||
| + | === 3. Cambios Realizados === | ||
| + | |||
| + | B. Lógica de la Ventana (w_conciliacion_bancos.srw) | ||
| + | Evento ue_grabar | ||
| + | Se añadió una condicional para evitar que la lógica de cálculo automático de estado (Incompleto/Completo) se ejecute cuando el proceso actual es una eliminación. | ||
| + | |||
| + | |||
| + | |||
| + | // Solo recalcular estado si NO es una eliminación | ||
| + | If lista_elementos <> 'eliminar_conciliacion' Then | ||
| + | If idw_datos_incoincidentes.Find('conciliado = 0 AND conciliatoria = "N"', 1, idw_datos_incoincidentes.RowCount()) = 0 AND & | ||
| + | idw_incoincidentes.Find('conciliado = 0', 1, idw_incoincidentes.RowCount()) = 0 Then | ||
| + | ls_estado = 'C' | ||
| + | Else | ||
| + | ls_estado = 'I' | ||
| + | End If | ||
| + | |||
| + | idw_det_bancos.SetItem(1, "estado", ls_estado) | ||
| + | idw_det_bancos.accepttext( ) | ||
| + | End If | ||
| + | |||
| + | ===== Estándar de Persistencia y Manejo de Transacciones (Appeon) ===== | ||
| + | |||
| + | === 1. Contexto === | ||
| + | |||
| + | En aplicaciones desplegadas bajo la arquitectura Appeon PowerServer, el manejo de sesiones de base de datos es dinámico. Para garantizar que las operaciones de actualización (Update) y el SQL embebido se ejecuten dentro de la transacción correcta y no queden "colgadas" o se confirmen accidentalmente por otros procesos, es obligatorio sincronizar el contexto transaccional. | ||
| + | |||
| + | === 2. Definición: of_sql_embedded_context === | ||
| + | |||
| + | Esta función de objeto de usuario global (guo_app) establece el manejador de la base de datos para las sentencias que siguen en el script. Actúa como un "puente" que le dice al servidor de aplicaciones: "Todo lo que viene a continuación debe viajar por este túnel transaccional específico". | ||
| + | |||
| + | === 3. Directriz de Implementación === | ||
| + | |||
| + | Se establece como estándar obligatorio invocar la sentencia antes de cualquier operación de persistencia de DataWindows o DataStores que utilice objetos de transacción distintos a ts_transaccion o cuando se requiera asegurar la integridad en procesos críticos (como Conciliación Bancaria). | ||
| + | |||
| + | Patrón de Código Sugerido | ||
| + | Fragmento de código | ||
| + | // 1. Sincronizar el contexto antes de la persistencia | ||
| + | guo_app.of_sql_embedded_context(ts_transaccion) | ||
| + | |||
| + | // 2. Ejecutar la actualización con control de flags (Recomendado para visualización previa) | ||
| + | IF idw_datos_conciliacion.Update(True, False) = 1 THEN | ||
| + | // La operación fue exitosa en el contexto de ts_transaccion | ||
| + | // NOTA: El COMMIT se debe realizar solo cuando el usuario confirme la acción final | ||
| + | ELSE | ||
| + | // En caso de error, limpiar el contexto inmediatamente | ||
| + | ROLLBACK USING ts_transaccion; | ||
| + | MessageBox("Error", "Falla al actualizar el contexto de datos.") | ||
| + | END IF | ||
| + | |||
| + | === 4. Problemas que resuelve esta implementación === | ||
| + | Aislamiento de Transacciones: Evita que un COMMIT en una ventana B confirme datos cargados erróneamente en la ventana A (Conciliación). | ||
| + | |||
| + | Compatibilidad Appeon: Corrige errores donde el servidor de aplicaciones pierde el rastro de la transacción activa tras procesos largos de importación. | ||
| + | |||
| + | Integridad en el "Deshacer": Al estar el contexto correctamente mapeado, un ROLLBACK USING ts_transaccion limpiará efectivamente todas las inserciones temporales realizadas por las funciones de importación (wf_import_extracto, etc.). | ||
| + | |||
| + | ===== Optimización y Corrección del Proceso de Conciliación Bancaria ===== | ||
| + | |||
| + | Bug ID: [#53442] | ||
| + | |||
| + | === 1. Descripción del Problema === | ||
| + | |||
| + | Se detectó que movimientos contables de meses anteriores (ej. enero/febrero) reaparecían en la conciliación del mes de abril a pesar de haber sido conciliados previamente. Adicionalmente, se identificaron bloqueos en la interfaz de usuario que impedían la gestión ágil de partidas conciliatorias y errores en la determinación del estado final de la conciliación. | ||
| + | |||
| + | === 2. Causa Raíz === | ||
| + | |||
| + | Falta de Estampa de Tiempo: Las funciones de cruce (automático y manual) no estaban asignando el valor a la columna periodo_conciliado en la tabla DET_ASIENTO_CONTABLE, dejando el registro como "huérfano" para procesos futuros. | ||
| + | Limpieza Indiscriminada: La función de validación previa al guardado (wf_puede_guardar) realizaba una limpieza basada solo en periodo y banco, lo que bajo ciertas condiciones de concurrencia desmarcaba registros válidos. | ||
| + | Bloqueo de UI: La lógica de protección de columnas no incluía la columna conciliatoria, y el evento itemchanged de los cuadrantes no notificaba a la ventana la necesidad de habilitar el botón "Grabar". | ||
| + | |||
| + | === 3. Soluciones Implementadas === | ||
| + | |||
| + | A. Integridad de Datos (Periodo de Conciliación) | ||
| + | Se modificaron los procesos de cruce para asegurar que cada registro marcado como conciliado reciba el periodo actual: | ||
| + | |||
| + | Objeto n_cst_conciliacion_bancaria: En udf_conciliar_faltante, se añadió la asignación de is_periodo_conciliando. | ||
| + | Ventana w_conciliacion_bancos: En wf_conciliar, se añadió la asignación de is_periodo. | ||
| + | B. Lógica de Estado (Completa vs. Incompleta) | ||
| + | Se refinó la validación en el evento ue_grabar para evitar que una conciliación se marque como "Completa" si no hay actividad real. | ||
| + | |||
| + | Actividad Válida: Se considera actividad si existe al menos un registro con conciliado = 1 O una partida del extracto marcada como conciliatoria = 'S'. | ||
| + | C. Mejoras en la Interfaz de Usuario (UX) | ||
| + | Edición Fluida: Se actualizó wf_bloquea_campos_detalles para que la columna conciliatoria sea editable cuando el estado es 'I' (Incompleta). | ||
| + | Habilitación Dinámica: Se insertó el evento ue_enable_grabar en los itemchanged de los DataWindows de la pestaña 3. Esto elimina la necesidad de salir y volver a entrar a la ventana para guardar cambios manuales. | ||
| + | D. Seguridad Transaccional | ||
| + | Se ajustó el SQL de la función wf_puede_guardar para incluir el identificador único id_cconciliacion en las cláusulas de exclusión, garantizando que el proceso de guardado actual no borre accidentalmente sus propias marcas. | ||
| + | |||
| + | |||
| + | === 4. Objetos Modificados === | ||
| + | |||
| + | Objeto Tipo Método/Evento | ||
| + | n_cst_conciliacion_bancaria SRU udf_conciliar_faltante | ||
| + | w_conciliacion_bancos SRW wf_conciliar, ue_grabar, wf_puede_guardar, wf_bloquea_campos_detalles | ||
| + | d_incoincidentes SRD Evento itemchanged | ||
| + | d_incoincidentes_extracto SRD Evento itemchanged | ||
| + | |||
| + | === A continuación presento los cambios realizados en los archivos: === | ||
| + | |||
| + | |||
| + | if ll_encuentra_igual > 0 then | ||
| + | idw_incoincidentes.SetItem (ll_encuentra_igual,'conciliado',1) | ||
| + | idw_incoincidentes.SetItem (ll_encuentra_igual,'periodo_conciliado',is_periodo_conciliando) | ||
| + | idw_datos_incoincidentes.SetItem(ll_cont_ext,'conciliado',1) | ||
| + | idw_datos_incoincidentes.SetItem(ll_cont_ext,'usuario_concilia',cod_usuario) | ||
| + | idw_datos_incoincidentes.SetItem(ll_cont_ext,'fecha_conciliado',id_fecha) | ||
| + | |||
| + | w_conciliacion_bancos.srw | ||
| + | |||
| + | |||
| + | If ll_docto_lib = ll_docto_ext And ld_valor_lib = ld_valor_ext Then | ||
| + | idw_coincidentes.SetItem (ll_cont_lib,'conciliado',1) | ||
| + | idw_coincidentes.SetItem (ll_cont_lib,'periodo_conciliado',is_periodo) | ||
| + | idw_datos_coincidentes.SetItem(ll_cont_ext,'conciliado',1) | ||
| + | idw_datos_coincidentes.SetItem(ll_cont_ext,'usuario_concilia',cod_usuario) | ||
| + | idw_datos_coincidentes.SetItem(ll_cont_ext,'fecha_conciliado',id_fecha) | ||
| + | idw_det_bancos.accepttext( ) | ||
| + | |||
| + | If lista_elementos <> 'eliminar_conciliacion' Then | ||
| + | // Garantizar que no se guarde como completa si no hay ningún registro marcado en los cuadrantes de la pestaña 3 | ||
| + | // Garantizar que no se guarde como completa si no hay actividad (marcas de conciliado o partidas conciliatorias) | ||
| + | If idw_det_bancos.GetItemString(1, "estado") = 'C' Then | ||
| + | If idw_coincidentes.Find("conciliado = 1", 1, idw_coincidentes.RowCount()) <= 0 And & | ||
| + | idw_incoincidentes.Find("conciliado = 1", 1, idw_incoincidentes.RowCount()) <= 0 And & | ||
| + | idw_datos_coincidentes.Find("conciliado = 1", 1, idw_datos_coincidentes.RowCount()) <= 0 And & | ||
| + | idw_datos_incoincidentes.Find("conciliado = 1", 1, idw_datos_incoincidentes.RowCount()) <= 0 Then | ||
| + | idw_datos_incoincidentes.Find("conciliado = 1 OR conciliatoria = 'S'", 1, idw_datos_incoincidentes.RowCount()) <= 0 Then | ||
| + | idw_det_bancos.SetItem(1, "estado", 'I') | ||
| + | End If | ||
| + | End If | ||
| + | idw_datos_incoincidentes.Modify('ajuste.protect = ' + ps_protect) | ||
| + | End If | ||
| + | |||
| + | If not( isnull(idw_datos_incoincidentes)) And isvalid(idw_datos_incoincidentes) Then | ||
| + | idw_datos_incoincidentes.Modify('conciliatoria.protect = ' + ps_protect) | ||
| + | End If | ||
| + | |||
| + | end subroutine | ||
| + | |||
| + | public function boolean wf_puede_guardar () | ||
| + | (SELECT 1 | ||
| + | FROM TESORE01.MAE_CONCILIACION MC | ||
| + | WHERE MC.CODIGO_BANCO = :ld_cod_inter_banco | ||
| + | AND MC.PERIODO = :ls_periodo | ||
| + | AND MC.ESTADO <> 'E' | ||
| + | AND MC.ESTADO <> 'E' | ||
| + | OR MC.CODIGO_CONCILIACION = :id_cconciliacion | ||
| + | ) | ||
| + | USING sqlca; | ||
| + | |||