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 [2026/04/14 20:00]
brahian.castaneda
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 121: Línea 124:
  idw_det_bancos.accepttext( )  idw_det_bancos.accepttext( )
  End If  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.1776196802.txt.gz · Última modificación: 2026/04/14 20:00 por brahian.castaneda