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/04/15 16:02] 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 157: | Línea 160: | ||
| 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.). | 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; | ||
| + | |||