Entradas

Por qué no debes editar un CAF al generar un DTE

  Cuando desarrollamos un sistema de facturación electrónica en Chile, una de las piezas fundamentales para generar un DTE es el CAF (Código de Autorización de Folios) entregado por el SII. A simple vista, el CAF es XML y puede resultar tentador tratarlo igual que cualquier otro XML de nuestra aplicación: leer sus nodos, normalizar textos, limitar largos o incluso cambiar su codificación. Ese es un error. Me encontré con este problema mientras trabajaba en la generación y envío de DTE. En mi caso, el error concreto fue aparentemente muy pequeño: estaba acortando el contenido del nodo RS del CAF . El resultado fue suficiente para invalidar la información firmada. ¿Qué contiene el CAF? Dentro del CAF encontramos información que autoriza a un determinado contribuyente a utilizar un rango de folios para un tipo específico de documento. Simplificando su estructura, podemos encontrar algo parecido a: <CAF version="1.0"> <DA> <RE>76040308-3</RE...

Cómo mapear una consulta SQL compleja a un objeto JSON usando JDBC

  Cuando desarrollamos una aplicación empresarial, no siempre podemos obtener la información que necesitamos desde una sola tabla. Es habitual que un documento dependa de datos almacenados en distintas entidades relacionadas. Un ejemplo es la construcción de un documento electrónico. Para generar su representación como JSON necesitamos recuperar información de la empresa, receptor, tipo de documento, forma de pago, totales y detalle de productos. En este ejemplo veremos cómo hacerlo utilizando Java, JDBC y SQL , sin utilizar un ORM. El problema Nuestro objetivo es construir un objeto DTEJson con una estructura similar a: DTEJson └── DocumentoJSON ├── EncabezadoJson │ ├── IdDteJson │ ├── EmisorJson │ ├── ReceptorJson │ └── TotalesJson └── DetalleDteJson[] Sin embargo, la información necesaria se encuentra distribuida entre varias tablas: Movimiento ├── Empresa ├── CliProv ├── TipoDocumentos ├── FPago ├── Despacho ├── Traslado ├── Referencia ...

Validación backend de un movimiento de venta con Java Servlets

  Cuando desarrollamos un sistema de ventas, una de las partes más importantes no es solamente capturar los datos ingresados por el usuario, sino comprobar que la operación sea válida antes de procesarla. En una aplicación web podemos utilizar JavaScript para realizar cálculos y entregar validaciones inmediatas en la interfaz. Sin embargo, las reglas importantes deben comprobarse nuevamente en el backend. En este ejemplo veremos cómo estructurar la validación de un movimiento comercial utilizando Java Servlets , una capa de servicios y excepciones específicas. El controlador utilizado en el ejemplo recibe una operación que posteriormente puede utilizarse para procesar distintos tipos de documentos, como facturas, facturas exentas, boletas, guías de despacho, notas de crédito o notas de débito. 1. El problema Una operación de venta contiene bastante más información que un formulario tradicional. Por ejemplo, necesitamos recibir: Cliente o proveedor. Tipo de documento. Bodega. Tipo ...

Saber Spring Boot no es lo mismo que saber desarrollar sistemas

 En los últimos años se ha vuelto común encontrar rutas de aprendizaje que llevan rápidamente a una persona desde los fundamentos básicos de programación hacia tecnologías como Spring Boot, React, Docker o servicios en la nube. No considero que esto sea necesariamente negativo. El problema aparece cuando confundimos el conocimiento de estas herramientas con una formación completa en desarrollo de sistemas. Una persona que recién termina la enseñanza secundaria puede perfectamente aprender Java, construir una API REST con Spring Boot, conectarla a una base de datos y desarrollar una interfaz web. Incluso puede llegar a trabajar profesionalmente con estas tecnologías. Pero saber utilizar un framework no significa necesariamente comprender todos los conceptos que existen detrás de él. La formación no consiste solamente en aprender tecnologías Una tecnicatura o una ingeniería relacionada con informática normalmente no busca enseñar únicamente las herramientas que demanda el mercado en...

Usar fetch con Servlets para enviar parámetros POST y devolver HTML

  En el artículo anterior vimos que es posible construir aplicaciones web dinámicas con Java, Servlets, Thymeleaf y JavaScript sin necesidad de incorporar obligatoriamente un framework frontend como React o Angular. En esta entrada vamos a llevar esa idea a un ejemplo práctico. Si estamos trabajando con Servlets, Thymeleaf y JavaScript, podemos utilizar fetch() para enviar datos al servidor y hacer que el Servlet responda directamente con HTML. En este ejemplo vamos a implementar una búsqueda dinámica de productos. La idea es sencilla: Usuario escribe el nombre ↓ JavaScript ejecuta fetch() ↓ Servlet recibe parámetros POST ↓ ProductoService realiza la búsqueda ↓ Servlet genera HTML ↓ fetch recibe el HTML ↓ Se reemplaza una sección de la página La página inicial La página de administración de productos se genera inicialmente utilizando Thymeleaf. Tenemos un campo de búsqueda: <input oninput="cargarSeccion('BUSCAR_NOMBRE...

Cómo reemplazar Node.js y React por Java y AJAX

Actualmente es bastante común asociar el desarrollo de una aplicación web moderna con una arquitectura formada por React en el frontend y Node.js en el backend. Algo parecido a esto: Navegador | React | API REST | Node.js | Base de datos Esta arquitectura es válida y tiene muchos casos de uso. Sin embargo, no significa que sea necesaria para todas las aplicaciones web. Un sistema administrativo, un punto de venta, un sistema de inventario o una aplicación de facturación pueden necesitar una interfaz dinámica sin que eso implique necesariamente construir una SPA completa. Podemos hacerlo utilizando Java: HTML + CSS | JavaScript / AJAX | Java | Servlets o Spring Boot | Servicios | JDBC | Base de datos La idea no consiste en eliminar JavaScript. La idea es utilizar JavaScript solamente para interactuar con el navegador y realizar peticiones asíncronas, dejando la construcción de la aplicación y la lógica del servidor en Java. AJAX no necesi...

Construyendo XML en Java: desde DOM hasta JAXB

 Cuando comencé a trabajar con XML en Java, una de las primeras alternativas que utilicé fue la API DOM incluida en Java. En ese momento desconocía JAXB, por lo que construir un documento XML significaba crear explícitamente cada elemento y agregarlo al árbol del documento. Con el tiempo conocí JAXB y una forma bastante diferente de enfrentar el mismo problema: representar la estructura XML mediante objetos Java y dejar que una biblioteca realice la transformación. En esta entrada veremos ambas alternativas y las diferencias que existen entre ellas. El XML que queremos construir Utilizaremos un ejemplo sencillo: <?xml version="1.0" encoding="UTF-8"?> <Producto> <Codigo>1001</Codigo> <Nombre>Teclado USB</Nombre> <Precio>15990</Precio> </Producto> Nuestro objetivo será generar este documento desde una aplicación Java. 1. Construcción utilizando DOM Java dispone de una API estándar para manipular docume...