1.8.109 Ene-2025 PK00 Incidencias: #Y-15486; Nuevo modelo SII con las últimas modificaciones que incorpora la aeat. Entre otras la actualización de las urls para los servidores de pruebas. [03/07/2024] - #Y-15486; com.Bo2A.validators.gestion.aeat.SII; getSII_BO2A_Version(); Se incorpora este nuevo método utilizado para determinar la versión del modelo que se utiliza internamente. La versión del modelo aeat es la versión actualmente publicada y se obtiene con getSII_Version; [03/07/2024] - #Y-15486; com.Bo2A.validators.gestion.aeat.SII.enviarComunicacionSOAP; Se incorpora el nuevo modelo de los disponibles. [30/12/2024] - #Y-15486; com.Bo2A.aeat.Bo2A_AEAT; Nuevo modelo para el SII. La versión se incorpora con las últimas definiciones de aeat para el SII. public static final String SII_VERSION_BO2A_2025_01 = "v2025_01_v1_1_v0_13"; [30/12/2024] - #Y-15486; com.Bo2A.validators.gestion.aeat.SII_2025_01_v1_1; Nueva clase que implemente la nueva versión del modelo SII. Se empezo el 03/07/2024 con la clase 2024_06_v1_1 que ahora se ha eliminado. [30/12/2024] - #Y-15486; com.Bo2A.net.ssl.Bo2a_SSL_UTILS.setPasswordKeyStoreTrustedClientCerts; Comprueba que la password indicada sea la del almacen de claves. (Opcionalmente se puede utilizar para seleccionar el certificado que se tiene que usar). [30/12/2024] - #Y-15486; List get_CERTIFICADOS; * Obtener los certificados de un almacen de claves. [30/12/2024] - #Y-15486; com.Bo2A.validators.gestion.aeat.SII.enviarComunicacionSOAP; Si no se especifica la password correcta para el almacen de claves se devuelve un error. [30/12/2024] - #Y-15486; com.Bo2A.validators.gestion.aeat.SII_2025_01_v1_1.enviarComunicacionSOAP_FE; enviarComunicacionSOAP_FR; enviarComunicacionSOAP_BI;; Se informa de la url del portal de aeat sii para producción y pruebas. Se utilizan los parámetros definidos en com.Bo2A.aeat.Bo2A_AEAT; : public static final String PARAM_RECOPILACION_AEAT_SII_WEB_PREPRODUCCION = "RECOPILACION.AEAT.SII.WEB.PREPRODUCCION"; public static final String PARAM_RECOPILACION_AEAT_SII_WEB_PRODUCCION = "RECOPILACION.AEAT.SII.WEB.PRODUCCION"; [02/01/2025] - #Y-15486; com.Bo2A.cliente.window.Bo2aWindow; VERSION_SERVIDOR_MINIMA = "20250102_PK00"; VERSION_SERVIDOR_MAXIMA = "20250102_PK99"; 1.8.109 Ene-2025 PK01 Incidencias: [09/01/2025]; Cuando se ha devuelto un error de un servidor de ficheros NO erpsi. El cliente no ha sabido parsearlo y por lo tanto mostrarlo. [16/01/2025]; com.Bo2A.net.Bdata; se utiliza la lógica estandar com.Bo2A.sql.FormateaSQL para dar formato a los valores. [20/01/2025]; Ampliado la versión de servidor hasta 20250120_PK99; Esta nueva versión soporte los camposNOUpdate del ObjQuery [09/01/2025]; com.Bo2A.net.Bo2aGestionFileServer.ChequeaErrorHTTP; com.Bo2A.net.Bo2aHTTPUpload.chequeaErrorHTTP; En caso de Excepcion (normalmente parseando el error devuelto, si no es el error estandar), se muestra el errorOrigen enviado por el servidor. Se utiliza el nuevo método ErrorSQLXML.getErrorSource para esto. [09/01/2025]; com.Bo2A.sql.SQLSERVER.ErrorSQLXML.AnalizaError; Se quita el throws IOException y se captura aqui la excepción para devolver siempre mensajes. Se utiliza ErrorSQLXML.getErrorSource para devolver lo que ha ocurrido en la exception. [09/01/2025]; com.Bo2A.sql.SQLSERVER.ErrorSQLXML.ParseaErrorSQL_LEGACY; ParseaErrorSQL_XML; Por legibilidad se aisla estos métodos. Anteriormente estaban dentro de ParseaErrorSQL; Uno es el primer método usado por el sistema y el otro es el que utiliza el parser SAX para obtener los errores (método nuevo). [09/01/2025]; com.Bo2A.sql.SQLSERVER.ErrorSQLXML.getErrorSource; Devuelve el error original enviado al método ParseaErrorSQL_XXX; // Si se producen errores en el parser no se puede obtener el texto original. Se guarda aqui. // Por ej. puede ser util cuando se utilicen servidores de ficheros externos. // Se utiliza la variable a nivel de clase. private byte[] array_source = null; [16/01/2025]; com.Bo2A.net.Bdata.getValorCampo; Se utiliza Bo2Util.formateaFechaString(nLong) en lugar del formato propio en este método. [16/01/2025]; com.Bo2A.net.Bdata.formateaDatoInterno; Se utiliza formateaSQL.DameValorConFormato en lugar del formato interno que se hacía en este método. [16/01/2025]; com.Bo2A.net.Bdata.formateaDatoXML; Se utiliza formateaSQL.DameDatoParaXML(formateaSQL.DameValorConFormato; en lugar de la lógica interna de este método. [16/01/2025]; com.Bo2A.sql.FormateaSQL.DameValorConFormato; Se devuelve throw new java.lang.IllegalArgumentException("El tipo: " + nTipo + ", NO está soportado"); [16/01/2025]; com.Bo2A.Util.Bo2Util.parseaFechaFromString; Nuevo método. * Parsea una fecha desde string, normalmente desde la bd. Son menos formatos. * Solo los que estaban definidos en: Bdata.formateaDatoXML, Bdata.formateaDatoInterno [16/01/2025]; com.Bo2A.Util.Bo2Util.diferenciaFechaMeses; Nuevo método para calcular la diff. en meses. Se utiliza los métodos de la nueva api date. Period.between; [20/01/2025]; com.Bo2A.validators.GAN.gestion.almacen.Bascula; Corregido error de null cuando se establece el tipo de letra y no está activo el envío de email // Es null si no está activo el "muestraEmail" 1.8.109 Ene-2025 PK02 Incidencias: #Y-15649; Los combo-box cuando tienen datos que provienen de otra tabla tienen un problema cuando no se ha seleccionado ningún valor, y es que provocan una modificación de la línea. Esto en algunas ocasiones puede ser un problema, porque se incluye en la lista de grabaciones. La idea es que siempre tenga un valor y sino existe entonces erá un valor por defecto que se pueda indicar. [21/01/2025]; com.Bo2A.sql.FormateaSQL.DameValorConFormato; Se ha incluido un nuevo parámetro "porDefecto" si es true y el valor es null se devuelve el valor por defecto según el tipo de dato. En caso contrario se devuelve null. Esto se hace así para evitar que los Registros XML se llenen con valores cuando en la bbdd no existen. Por ej. una fecha que esté en el servidor estará como "" (porque se formatea con DameDatoParaXML), si se devolveria el valor por defecto todas estarían inicializadas al día actual. El método DameValorConFormato( String sClase, Object oValor ), llama al método anterior con "porDefecto = false", mientras que DameValorPorDefecto lo hace con "porDefecto = true" [28/01/2025] - #Y-15649; com.Bo2A.cliente.base.edicion.Bo2Editor.creaTablaComboBox; Utiliza Bo2aAnalizaCadenas.analiza_EDITOR_CB para obtener los parámetros del combobox y construir la clase Bo2Editor_ObjTablaCombo; Además se ha refactorizado para simplificar el método. También se ha incluido un valor por defecto (si no se indica en el parametro _BO2A_VALOR_DEFECTO), que incluye "(sin determinar);1" si el tipo de datos es String,Integer automáticamente. En otro caso se utiliza el valor anterior ";" [28/01/2025] - #Y-15649; com.Bo2A.cliente.base.Bo2aAnalizaCadenas.analiza_EDITOR_CB; Nuevo método utilizado para analizar la cadena que parametriza los combo-box; Incluido un nuevo parámetro a esta cadena, _BO2A_VALOR_DEFECTO que define el valor no definido y que se coloca en primer lugar. Un ej. sería: _BO2A_VALOR_DEFECTO(sin determinar);1 (valor;id) [29/01/2025] - 15649; com.Bo2A.cliente.base.edicion.Bo2Editor_ObjTablaCombo.build_Tabla; Nuevo método usado en la construcción de esta clase. * La creación de tabla / tabla_valores / elementos está relacionada. * Solamente con la primera (tabla) se pueden construir los otros. Las propiedades tabla, tabla_valores, elementos se derivan del primer hash (tabla). tabla es ID;VALOR; tablaValores es VALOR;ID (justo al contrario) elementos (VALOR) (son solo los valores para pasarselos al combo) Además se han eliminado tablaValores, elementos de los constructores de la clase. 1.8.109 Ene-2025 PK03 Incidencias: #Y-15658; Nuevo tipo de editor, de tipo Long. #Y-15657; Las modificaciones de cambios ahora se comprueba en el modelo de datos de TablaFormulario formateando el dato previamente. Ocurría que el editor tiene un valor formateado y el modelo tiene otro sin formato. Por ej. una fecha sin segundos en editor y completa en el modelo. [31/01/2025][03/02/2025] - #Y-15658; com.Bo2A.cliente.base.edicion.Bo2Editor; Creado un nuevo tipo de editor que es de tipo Long. Será como el number pero formateando a datos Long. [31/01/2025] - #Y-15658; com.Bo2A.cliente.base.edicion.Bo2EditorLongField; Nueva clase que encapsula el editor de tipo Long. [31/01/2025] - #Y-15657; com.Bo2A.cliente.tablaformulario.Bo2aTablaModeloDatos.DameDatoFormateado; com.Bo2A.cliente.tree.Bo2aTreeModeloDatos.DameDatoFormateado; Las fechas se formatean con el editor (que incluye la plantilla utilizada). [31/01/2025] - #Y-15657; com.Bo2A.cliente.tablaformulario.Bo2aTablaModeloDatos.estableceValueAt; Se formatea el "valor_nuevo" (que viene desde el editor) y el "valor_viejo" (que viene desde el modelo); Para comprobar si ha habido cambios. (Anteriormente solo estaba formateado el "valor_nuevo" el "valor_viejo" podría estar aun siendo el mismo tipo de dato en un formato distinto) [31/01/2025] - #Y-15658; com.Bo2A.cliente.tablaformulario.Bo2aTablaModeloDatos.DameDatoFormateado; com.Bo2A.cliente.tree.Bo2aTreeModeloDatos.DameDatoFormateado; Incluido el nuevo tipo de dato long que se formatea con su editor. [31/01/2025]; com.Bo2A.cliente.tree.Bo2aTreeModeloDatos.estableceValueAt; Detectado un problema de recursividad. Con este método del interface ObjModeloDatosExtensible; En esta clase no es usado este método con la parametrización que provocaba la recursividad (consultar código) [31/01/2025] - #Y-15657; com.Bo2A.cliente.base.edicion.Bo2EditorDateField.dameDatoFormateado; Implementación de este método. Anteriormente solo devolvía valor tal cual. Ahora se formatea según el formato definido. 1.8.109 Ene-2025 PK04 Incidencias: #Y-15665; No se estaban procesando las respuestas desde el AEAT SIIN. [06/02/2025] - 15665; com.Bo2A.validators.gestion.aeat.SII; Creado un nuevo botón para copiar el contenido de la traza de comunicación del SII. Puede ocurrir que si hay errores y no se puede grabar esas trazas no quedan almacenadas. [06/02/2025] - 15665; com.Bo2A.validators.gestion.aeat.SII.enviarComunicacionSOAP_ZIP; Las respuestas del SII no se estaban procesando correctamente porque el nombre del fichero de respuesta no estaba bien formado. El nombre del fichero de respuesta tiene que tener un formato concreto para que el servidor pueda procesarlo y marcar las líneas como comunicadas o con errores. //"SII__R_"+Bo2A_AEAT.SII_MODELO+"_"+Bo2A_AEAT.SII_PREFIJO_FE "R_"+entrada.getName()+"_", ".xml" 1.8.109 Ene-2025 PK05 Incidencias: #Y-15593; El patrón contable rápido no rellena el concepto si ya está inicializado. #Y-15584; Tamaño de los campos en los formularios. #Y-15668; Los filtros sobre los combo-box ahora incluyen todos los valores si se ha indicado un * o % [11/02/2025] - #Y-15593; com.Bo2A.validators.gestion.contabilidad.PatronIntroduccionRapida.startEventCoordinator; terminaEdicion; No se rellena el concepto si el patrón contable ya lo tiene inicializado por el usuario. Además en los eventos de la pantalla se incluye la copia de las observaciones del patrón contable al diario contable. [11/02/2025] - #Y-15584; com.Bo2A.cliente.base.edicion.Bo2Editor.dameEditor_JComponentFormulario; Adaptar el tamaño máximo de los campos en modo formulario al tamaño de la pantalla y reservar solo un 10% para labels. [12/02/2025] - #Y-15668; com.Bo2A.cliente.tablaformulario.Bo2aTablaModeloDatos.convierteValorComboFromValorToID; En los campos combo-box si son varios valores los que encajan con el filtro se devuelven todos para que el filtro sea completo anteriormente solo se devolvía el primero. El filtro será una correlación de OR(s) También se incluye un nuevo parámetro para devolver todos los valores posibles o solo la primera coincidencia. Esto será útil para el método estableceValueAt; [12/02/2025] - #Y-15668; com.Bo2A.cliente.tablaformulario.Bo2aTablaModeloDatos.parseaValorFiltro; Al parsear el filtro del filtro si es un combo, se incluyen todos los valores posibles en el String[] para que el filtro generado sea un OR [12/02/2025] - #Y-15668; com.Bo2A.cliente.tablaformulario.Bo2aTablaModeloDatos.isFiltroComboNotExacto; Devuelve todos los valores obtenidos para que se pueda informar al usuario. Anteriormente era un valor lógico. Si es null es el equivalente anterior a false [12/02/2025] - #Y-15668; com.Bo2A.cliente.tablaformulario.Bo2aTablaPopUp.acc_Filtrado; acc_Filtrado_Ordenacion; acc_Filtrado; Se informa al usuario de todos los valores que se van a utilizar en un filtro sobre un combo. SE ha modificado el mensaje 0x21047 [13/02/2025] - #Y-15688; com.Bo2A.cliente.base.edicion.Bo2Editor_ObjTablaCombo.getTablaKey; getTablaKeyOrAddKey; getTablaContainsKey; getTablaValoresKey; getTablaValoresKeySet; Encapsulación del acceso a los hash (Tabla, TablaValores) en esta clase. [13/02/2025] - #Y-15688; com.Bo2A.cliente.base.edicion.Bo2Editor_ObjTablaCombo.isStringTipoDatosKeyValor; getValorDefectoKey; isTipoKeyString; isTipoKeyInteger; isTipoKeyDate; isTipoKeyDouble; isTipoKeyBoolean; Encapsulación del acceso a los tipos de datos de Key/Valor; en esta clase. [13/02/2025] - #Y-15688; com.Bo2A.cliente.tablaformulario.Bo2aTablaModeloDatos.setaTablaCombo; Este método además de guardar la tablacombo, estaba creando entradas en la tablaValores en mayúsculas que no se muy bien porque se estaba haciendo. Porque después las comparaciones son case insensitive. SE ha comentado. El código estaba desde [29/01/2004] [13/02/2025]; com.Bo2A.cliente.tablaformulario.Bo2aTablaPopUp.acc_Busqueda; Hasta ahora en las búsquedas de los combo-box se estaba mostrando incialmente el valor del key, aunque después se pudiera buscar por valores mostrados. Ahora eso se ha solucionado y se muestra el valor mostrado y no el valor del key, en columnas combo-box. 1.8.109 Ene-2025 PK06 Incidencias: #Y-15448; Muestra errores de querys internos (nInd > 1) ordenandolos por fecha de Creacion. Normalmente solo se muestran los del nInd 0; #Y-15669; Corrige problema relacionado con la #Y-15668; [13/02/2025] - #Y-15548; com.Bo2A.sql.ObjError.creationTime; getCreationTime; Tiempo de creación. Usado para ordenar errores/mensajes en la parte servidor [14/02/2025] - #Y-15669; com.Bo2A.cliente.tablaformulario.Bo2aTablaModeloDatos.convierteValorComboFromIDToValor; Detectado problema en este método en la aplicación del parámetero lAplicaNoVisibles = false; (cuando se trata del modelo internamente y no de la visualializacion) Está relacionado con #Y-15668