Herramientas de usuario

Herramientas del sitio


ada:sicoferp:financiero:tesoreria:conciliacionbancaria:conciliacioncargadedatos

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
ada:sicoferp:financiero:tesoreria:conciliacionbancaria:conciliacioncargadedatos [2024/02/02 13:32]
192.168.175.136
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 26: Línea 29:
  
 {{:​ada:​sicoferp:​financiero:​tesoreria:​conciliacionbancaria:​2018-06-15_09h43_23.png?​400|}} {{:​ada:​sicoferp:​financiero:​tesoreria:​conciliacionbancaria:​2018-06-15_09h43_23.png?​400|}}
 +
 +
 +Cuando se suben los datos de la conciliación de forma manual se puede agregar un NIT de terceros, para identificación posterior, en los reportes.
 +
 +{{:​ada:​sicoferp:​financiero:​tesoreria:​conciliacionbancaria:​conciliacion_manual_terceros_001.png?​600|}}
  
  
Línea 32: Línea 40:
 - Cuando el mes de la anulación sea mayor al mes del documento, y ambos meses sean menores o iguales al mes a conciliar entonces se muestren ambos documentos. - Cuando el mes de la anulación sea mayor al mes del documento, y ambos meses sean menores o iguales al mes a conciliar entonces se muestren ambos documentos.
  
 +- Los datos del extracto de la conciliación bancaria puede incluir terceros; en este momento, solamente se puede agregar terceros cuando se ingresan manualmente los datos de información del extracto.
 +
 +- Las partidas conciliatorias se pueden conciliar así sean de meses anteriores.
 +
 +- 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.
 +
 +===== Corrección de Estado en Conciliación Bancaria =====
 +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).
 +
 +Para corregir esto, el usuario debía:
 +Salir de la conciliación.
 +Volver a entrar al registro.
 +Realizar un cambio manual trivial (desmarcar y marcar algo) para que el sistema recalculara el estado a "​Completado"​.
 +
 +== 2. Causa Raíz (Análisis Técnico) ==
 +Desincronización de Buffers: El código realizaba validaciones de totales antes de ejecutar AcceptText(),​ lo que causaba que el motor de PowerBuilder evaluara valores antiguos en los campos calculados del DataWindow.
 +Campos Calculados no Refrescados:​ Al usar grupos y totales en el pie del DataWindow, estos no siempre se recalculan inmediatamente. Se requería una llamada explícita a GroupCalc().
 +Lógica de Estado Fragmentada:​ El evento ue_grabar contenía múltiples bloques IF y bucles FOR redundantes para evaluar si la conciliación estaba completa. Si el flujo de importación automática terminaba el proceso, estos bloques no siempre se ejecutaban en el orden correcto o con los datos frescos.
 +
 +== 3. Solución Implementada ==
 +Se reestructuró el evento ue_grabar bajo los siguientes pilares:
 +
 +Sincronización Total: Se agregaron llamadas a AcceptText() y GroupCalc() para todos los DataWindows involucrados (idw_det_bancos,​ idw_coincidentes,​ idw_incoincidentes,​ etc.) al inicio del evento.
 +
 +Unificación de la Lógica de Estado: ​
 +
 +Se reemplazaron los bucles manuales por una función .Find() de alto rendimiento que busca registros pendientes (conciliado = 0) que no sean partidas conciliatorias.
 +
 +Aseguramiento de Transacción: ​
 +Se garantiza que el cambio de estado a '​C'​ ocurra dentro del mismo bloque atómico antes del Update() y el COMMIT.
 +
 +4. Cambios en el Código (w_conciliacion_bancos.srw)
 +A continuación se detalla el cambio realizado en el evento ue_grabar:
 +
 +// Si no hay registros pendientes (conciliado=0) que NO sean partidas conciliatorias, ​
 +// el estado es Completo ('​C'​),​ de lo contrario es Incompleto ('​I'​)
 +
 +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)
 +
 +===== 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;
  
ada/sicoferp/financiero/tesoreria/conciliacionbancaria/conciliacioncargadedatos.1706880750.txt.gz · Última modificación: 2024/02/02 13:32 por 192.168.175.136