LibreDTE versión 21.10

Si tuviera que definir esta versión en una palabra, sería ORDEN. Si bien no es el resultado final que busco para LibreDTE (aún tengo muchas ideas) se acerca bastante a ser la primera versión donde el foco estuvo puesto en ordenar las cosas.

Ordenar para nosotros significa poder ofrecer un mejor servicio. Como empresa, hemos estado todo este año 2021 enfocados en mejorar para que a nuestros clientes les sea cada día más sencillo trabajar con LibreDTE. Que puedan resolver sus dudas rápidamente y con la mayor información disponible de nuestra parte.

Imagen de nueva versión de LibreDTE 21.10

¿Reconoces la imagen de fondo? Acá más de detalles.

Pasó 1 año entero desde que publiqué la versión 20.10 de LibreDTE, el tiempo más largo sin publicar código nuevo para este proyecto. No porque no estuviese programando, todo lo contrario, hemos estado trabajando harto. Sólo que con LibreDTE los cambios no eran “tan” relevantes, o eso pensaba yo (malo malo yo, que pensaba eso…).

Quizás sólo era que no estaba conforme con el resultado. Y de cierta forma fue así, pensaba publicar algo a fin de mes, pero a finales de la semana pasada me iluminé y tomé una de las decisiones más drásticas del último tiempo. Me puse a eliminar repositorios de Github.

En algún momento, cuando empecé a subir código a Github (tanto el público, como los repositorios privados) pensé que era una buena idea separar mucho la aplicación, a tal nivel, que cada módulo era un repositorio. Al principio era una buena idea, porque los módulos eran pequeños. Pero con el tiempo, eso cambio.

Justo la semana pasada vi, por 2da vez (la primera fue hace tiempo), esta genial charla de Andrés Marinkovic (de Fintual) donde habla por qué separar mucho las cosas en ciertos proyectos puede traer más dolores de cabeza que beneficios. Y dije ¡ya sé cuál será la guinda de esta versión!


Ya ya, mucha introducción, ¿cierto? En resumen, junté repositorios y dejé obsoletos otros. Esto con el fin de simplificar la administración del código y de facilitar la instalación y actualización de los proyectos (SPOILER: ahora si hay versiones reales).

Framework SowerPHP

Se requerían 3 proyectos diferentes para que funcionara el framework (dejando fuera lo de composer):

  • sowerphp
  • sowerphp-extension-general
  • sowerphp-extension-app

Los enlaces de las extensiones no los coloco a propósito, porque ya no son relevantes. Hoy todo el código está en un único repositorio. Y además, está con un tag de versión específico. De esta forma, si ahora quieres instalar el framework en su versión 21.10, sólo debes ejecutar:

git clone -b 21.10.0 https://github.com/SowerPHP/sowerphp.git /usr/share/sowerphp

Seguimos usando git por ahora, pero con tags. Así que ya no más dolores de cabeza para ustedes cuando a mi se me ocurre subir código al framework que no es compatible con la versión liberada de LibreDTE (pasó una vez, por poco menos de 1 mes, era muy difícil instalar LibreDTE).

Además, al tener sólo un repositorio, se simplifica la administración del código (forks, issues y pull requests). Finalmente, el framework en la actualidad existe, principalmente, por y para LibreDTE. Por lo que tiene sentido además versionarlo igual que LibreDTE.

Aplicación Web de LibreDTE Versión Comunidad

Con la versión comunidad pasaba algo similar. Se requerían 2 proyectos diferentes para instalar (dejando fuera lo de composer):

Lo mismo que con el framework, ya no tiene sentido el módulo Dte, porque fue unido al proyecto principal.

¿La instalación? Casi igual (aquí no cambia mucho):

git clone -b 21.10.0 https://github.com/LibreDTE/libredte-webapp.git www/htdocs

Lo que si cambia, es lo que se obtiene con las ventajas. Hoy es posible “fijar” la versión de LibreDTE a instalar.

Vamos a los cambios…

Esta versión incluye 7 mejoras importantes más 3 bonus:

  1. Nueva forma de actualizar, fijando versiones.
  2. Mucha documentación nueva y mejora en errores, alertas y bloques de ayuda.
  3. Se cambió el diseño por defecto al estándar de Bootstrap 4, dejando de lado el antiguo con harbour.
  4. Posibilidad de asignar sucursal por defecto a los usuarios.
  5. Cambio de ambientes por sesión de usuario (útil para pruebas de integraciones).
  6. Nuevas validaciones, mejoras en vistas, filtros y formularios en general.
  7. Eliminación masiva de DTE temporales.
  8. Bonus: más de 200 preguntas y respuestas frecuentes.
  9. Bonus: Academia LibreDTE (ver anexo)
  10. Bonus: se publicó un nuevo manual de instalación de LibreDTE, con muchos detalles. Se recomienda que lo revisen, por si se les pasó algo cuando instalaron.
El listado completo de los cambios más relevantes es:
  • Biblioteca:
    • Subtotal, descuentos y recargos se alinean a la derecha en papel contínuo.
    • Se agrega referencia MLE de Fonasa.
    • Se corrige un problema cuando pueden venir documentos (fuera de LibreDTE) con más de un código de item.
    • Se fuerzan los decimales en los totales según tipo de monedas.
    • Se agregó método para validar vigencia de la firma.
    • Se mejoró el método que valida la vigencia del CAF.
    • Se agrega la normalización de items con montos no facturables.
    • Se muestran los decimales en el precio del item en papel contínuo.
  • Aplicación web:
    • Mejoras en documentación en general en la aplicación, con mejores mensajes, enlaces a FAQ en errores y bloques con FAQ más relevantes según secciones (ver anexo).
    • Se muestra alerta con máximo de 40 referencias en la emisión de un DTE.
    • Es posible obtener la estadística de envío de correos al consultar vía API la información de un DTE.
    • Se agregó servicio web para obtener el XML de un DTE temporal.
    • La carga de XML permite indicar la sucursal y asignar el track ID en 0, en cuyo caso se podrá enviar al SII.
    • La sucursal del DTE se muestra en la pestaña avanzado.
    • Se pueden eliminar boletas rechazadas.
    • Corrección en condición de envío de boletas.
    • Se corrigieron condiciones de consulta de estado para boletas.
    • Se aumentaron los estados rechazados que se deben detectar.
    • Se agregó mensaje de “cargando” en más vistas para evitar doble clic.
    • Se permite descuento global con decimales.
    • Por defecto se hará 1 intento de envío al SII (se puede personalizar por empresa).
    • Se agregaron todos los mensajes de ayuda a DTE rechazados comunes y documentos en las FAQ.
    • Se habilita la generación de ESCPOS mediante una app (por ahora sin configuración).
    • Se agregó un reporte para obtener DTE recibidos sin XML. Útil para hacer seguimiento con proveedores y pedir que envíen el XML.
    • En el mantenedor de usuarios ahora se puede asignar una sucursal por defecto. Y esta se usará como dato por defecto al crear un DTE (ver anexo).
    • Se agrega enlace para consultar validez de una boleta en el SII.
    • Se agrega una alerta por vencimiento de folios.
    • Se agrega formato de PDF para Servicios Básicos (ej: APR).
    • Los PDF de intercambio ahora pueden usar la configuración del emisor, si dicho emisor está registrado en LibreDTE.
    • Se recuerda la sucursal de las boletas como dato “extra”.
    • Se borran referencias de la base de datos al borrar un DTE emitido.
    • Se agregó reporte para mostrar boletas sin enviar por correo al receptor.
    • El envío automático al correo de intercambio omitirá los estados no finales (antes omitía sólo los rechazados).
    • Al CSV de DTE recibidos se agregan columnas con: monto no facturable, monto del período, saldo anterior y valor a pagar.
    • Se permite borrar el mantenedor de folios si está sin CAF.
    • Se permite borrar el XML del CAF si está vencido o está sin uso.
    • El servicio web de consulta de estado de un DTE ahora permite consultar el estado de boletas.
    • Se agrega servicio web para actualizar el Track ID de un DTE.
    • Se agrega el tipo de referencia MLE usada por Fonasa.
    • Se separó el comando de actualización de DTE emitidos en “actualización de estado y envío al SII” y “actualización de eventos del receptor” (ver anexo).
    • Se puede forzar el ambiente mediante una configuración y también se puede seleccionar el ambiente por sesión de usuario (ver anexo).
    • Se reducen los correos que se envían al encontrar documentos rechazados. Ahora sólo se enviará un correo con el resumen.
    • Se agregaron las referencias del DTE al informe de DTE emitidos en CSV.
    • Se creó el módulo “Honorarios” (ver anexo).
    • Se cambiaron varios campos de totales de INT a BIGINT en la base de datos.
    • Se agrega alerta por RCOF con reparo por secuencia inválida.
    • Se agrega validación para saber si un DTE puede ser referenciado. Se requiere que esté enviado al SII, con estado y que dicho estado no sea rechazado (ver anexo).
    • Si la firma electrónica está vencida no se puede usar. Tampoco se podrá cargar.
    • Se agrega una gran alerta en la página del DTE emitido cuando está rechazado.
    • Se agrega un retraso en los envíos automáticos de DTE sin enviar, para no enviar justo un DTE cuando se está generando (y evitar error por “DTE Repetido”).
    • Y no es necesario subir la firma al sistema de archivos para actualizar los contribuyentes. Se puede usar la firma de una empresa registrada en LibreDTE (ver anexo).
    • Se agregaron validaciones para la asignación de folio. No es posible asignar un folio a un número ya usado o de un CAF vencido.
    • Al consultar los datos de un DTE emitido vía API ahora se puede obtener: listado de enlaces públicos del DTE, datos del receptor, datos de la sucursal, datos del usuario que emitió el DTE. Además se obtiene el tipo del DTE (con sus datos) y el estado macro: Rechazado, No final y Final.
    • Los borradores también entregan más datos vía API, como lo indicado antes para los DTE emitidos.
    • Al enviar por correo el DTE emitido usando la API, si el receptor no tiene correo, se guardará el correo usado como correo del receptor.
    • La API permite ahora buscar los documentos emitidos y borradores usando el nombre del usuario.
    • Se creó un servicio web para actualizar los datos de un DTE temporal. Esto permite, actualmente, actualizar la fecha del DTE temporal y recalcular sus precios si corresponde.
    • Se agrega soporte para montos no facturables en la pantalla estándar de emisión de DTE.
    • Se modificaron todos los inputs de “períodos” (formato AAAAMM) para usar un calendario. Así disminuir errores al ingresar mal el formato.
    • PPM puede tener 3 decimales en la propuesta del F29 de LibreDTE.
    • Se agregan ciertos montos, como la base imponible, al resumen de ventas y compras. Útil para revisar y cuadrar con la propuesta del F29 del SII.
    • Por defecto ya no es posible transferir empresas entre usuarios (ver anexo).
    • Se crearon nuevos instaladores para impresión directa, para Windows y Mac (ver anexo).
    • Se corrigieron los reportes en CSV de DTE emitidos, no estaban mostrando las mismas columnas en ambos reportes. Además se agregaron nuevas columnas.
    • Por defecto ya no se muestran los datos asociados a servicios períodicos (ver anexo).
    • Se pueden bajar los PDF de intercambio en papel contínuo.
    • Se refactorizó todo los asociado a los “listar” de borradores, emitidos, recibidos e intercambios (ver anexo).
    • Se pueden eliminar masivamente los documentos temporales (ver anexo).
    • Se agregaron popover al emitir, el más relevante informa del “doble click” para agrandar el campo.
    • Se agregaron validaciones varias en archivos que se cargan, o en ciertos inputs (númericos, períodos y otros).

Hay cambios en la base de datos, revisar script de actualización 21.10.sql en website/Module/Dte/Model/Sql/updates

Recuerden actualizar el framework SowerPHP. Wait… aquí tengo que ser más específico, ver el anexo inferior.

Si tienen dudas pueden escribir al foro. Si son clientes con soporte oficial de SASCO SpA pueden abrir un ticket de soporte.


Anexo: Actualización a las nuevas versiones

La actualización a esta versión cambia, no sirve lo mismo que se hacía antes. El proceso sigue siendo sencillo, pero tiene diferencias en este cambio de versión. Los pasos asumen una instalación en los directorios estándares, si usan otros, corregir.

Primero, actualizar el framework SowerPHP:

sudo mkdir /usr/share/sowerphp-new
sudo chown $(whoami): /usr/share/sowerphp-new
git clone -b 21.10.0 https://github.com/SowerPHP/sowerphp.git /usr/share/sowerphp-new
cd /usr/share/sowerphp-new
composer install
cd $HOME
sudo mv /usr/share/sowerphp /usr/share/sowerphp-old
sudo mv /usr/share/sowerphp-new /usr/share/sowerphp
sudo rm -rf /usr/share/sowerphp-old
rm bin/sowerpkg
rm -rf app/sowerpkg

Segundo, actualizar LibreDTE:

cd $HOME/www/htdocs

rm -rf app website/Module/Dte
rm -rf .git/modules/app
rm -rf .git/modules/website
git pull https://github.com/LibreDTE/libredte-webapp.git 21.10.0
cd website
composer install

Tercero, ahora si, cargar el script SQL de actualización. Esto no varía a como se hacía antes, pero lo dejo igual para que queden los pasos completos:

psql libredte < Module/Dte/Model/Sql/updates/PostgreSQL/2021/21.10.sql

Cuarto, hay que corregir el enlace a documentos temporales en core.php agregando /listar, debe quedar así:

'/dte/dte_tmps/listar' => '<span class="far fa-file"></span> Documentos temporales',

Anexo: documentación mediante FAQ en alertas y bloques en vistas

Como mencioné al inicio, en el 2do párrafo (¿te lo saltaste?), lo más importante para nosotros este año ha sido mejorar las alertas e información que se entrega al usuario a través de LibreDTE. Con el fin de que pueda resolver sus consultas lo más rápido posible, incluso adelantarnos como más de algún cliente nos ha dicho que hacemos.

Puntualmente aquí hay 2 cambios. Primero, los mensajes de alertas entregan un código en el formato [faq:#] donde # es el número de una pregunta frecuente de nuestro listado. Esto permite, mediante una configuración, añadir un mensaje al usuario y que vea esto:

Aviso de subir un archivo CAF

Lo importante, es el “Revise aquí para más detalles” que llevará al usuario a la FAQ que lo orientará.

En nuevas instalaciones de LibreDTE esto ya viene activo por defecto, pero en las existentes se debe agregar lo siguiente a la configuración:

// configuración para FAQ (preguntas frecuentes)

\sowerphp\core\Configure::write('faq', [
'url' => 'https://soporte.sasco.cl/kb/faq.php?id=',
'text' => 'Revise aquí para más detalles',
]);

Segundo, se añadieron muchos bloques con ayudas. Los que también enlazan a las preguntas frecuentes. Así, por ejemplo, en el mantenedor de folios ahora el usuario encontrará estos bloques:

Mantenedor de folio de LibreDTE

Esto se repite en diferentes vistas de LibreDTE.

Anexo: sucursal por defecto en usuarios

En el mantenedor de usuarios, ahora es posible asignar una sucursal por defecto a los usuarios. Esto es algo que existía desde hace mucho tiempo en la versión oficial, a través del módulo de RRHH. Sin embargo, quienes no usan ese módulo se veían obligados a configurarlo sólo para asignar la sucursal por defecto. Agregué el cambio en el mantenedor, de esta forma, sin el módulo de RRHH, se puede asignar sucursales por defecto.

Cuadro de Mantenedor de usuarios

Anexo: nueva tarea para eventos de receptores de DTE emitidos

El comando que actualizaba los documentos emitidos, tenía una tarea que actualizaba los eventos de receptores (siempre y cuando se tengan las funcionalidades extras de LibreDTE). Esto hacía que dicha tarea se demorara bastante en ejecutarse. Se separó esa funcionalidad a un nuevo comando. Si desean mantener esa tarea, deben agregarla a CRON, por ejemplo con:

# Sincronizar eventos del receptor de los DTE emitidos (requiere funcionalidades extras)
0 4 * * * /home/libredte/www/htdocs/website/Shell/shell.php Dte.DteEmitidos_EventosReceptor dte_plus -v

Anexo: forzar ambiente en configuración y vía sesión de usuario

Ahora es posible definir el ambiente para toda la instancia de LibreDTE. Esto permite, por ejemplo, tener un servidor de LibreDTE sólo para pruebas, donde las empresas que se registren, sólo podrán usar el ambiente de certificación. Esto se fuerza de la siguiente forma en la configuración:

\sowerphp\core\Configure::write('dte.certificacion', 1); // =1 CERTIFICACIÓN, =0 PRODUCCIÓN

Adicionalmente, es posible que un usuario cambie temporalmente (y sólo por su sesión) el ambiente de la empresa. Detalles de esto aquí.

Anexo: módulo de Honorarios

Desde hace mucho tiempo existían en el módulo de facturación 2 funcionalidades asociadas a honorarios. Las boletas de honorarios y las boletas de terceros. ¿Por qué las puse en el módulo de facturación si no tienen nada que ver con eso? No lo sé. Lo que si sé, es que ahora lo separé.

Si quieren mantener el módulo de Honorarios, deben cargarlo en la configuración en esta sección:

\sowerphp\core\Module::uses([
// [...]
'Honorarios',
// [...]
]);


Además, en el archivo de rutas agregar:

\sowerphp\core\Routing_Router::connect('/api/honorarios/:controller/*', [
'module' => 'Honorarios',
'action' => 'api',
]);

Anexo: referencias a DTE requieren estado del SII

Esto es más una justificación de por qué el cambio, ya que no es algo configurable y a más de algún usuario le podría “incomodar”. Supongamos el siguiente caso:

  1. Se emite una factura.
  2. Es enviada al SII.
  3. El SII aún no la procesa.
  4. En pocos minutos (o segundos), se emite una nota de crédito.
  5. La nota de crédito es rechazada por “DTE referenciado no recibido en el SII”.
  6. A los minutos la factura está aceptada por el SII.


¿Qué pasó? Se creó la nota de crédito con una referencia a una factura que el SII aún no procesaba (aceptaba). Y al ser procesada primero la nota de crédito, fue rechazada.

    Un escenario similar ocurre cuando la factura nunca es aceptada y es rechazada.

    Para evitar estos casos se decidió no permitir referencias a documentos que:

  • No estén enviados al SII.
  • Estén enviados pero sin estado.
  • Estén con estado rechazado.

Con este cambio se evitará la situación anterior y es un problema menos para los usuarios.

El usuario, para referenciar un documento, debe primero corroborar que el documento de referencia esté aceptado por el SII. Esto fuerza a que haga eso.

Anexo: firma de “proveedor” para actualizar contribuyentes

Para actualizar el listado de contribuyentes se utiliza una funcionalidad extra que requería, hasta antes de esto, tener la firma instalada en el servidor (subir el archivo). Esto implica, en la mayoría de los casos, tener la firma en el sistema de archivos y en la base de datos (porque alguna de las empresas registradas la usa).

En la versión oficial, existe el concepto de “proveedor de LibreDTE”, el que permite varias acciones. Entre ellas, usar la firma que está en la base de datos asociada a SASCO en el proceso de actualización de contribuyentes.

Para usar esto, sólo debes asignar el RUT (sin DV) de una empresa registrada en la instancia que tenga una firma vigente:

\sowerphp\core\Configure::write('libredte', [
'proveedor' => [
'rut' => 76192083,
],
]);


Anexo: transferencia de empresas

En la versión oficial, hace un tiempo notamos que permitir a los usuarios que transfieran la empresa a otros usuarios es más un problema que un beneficio. Por eso, esto está desactivado por defecto ahora. Si quieren volver al comportamiento antiguo deben agregar esto a la configuración:

\sowerphp\core\Configure::write('dte.transferir_contribuyente', true);

Anexo: Impresión directa del PDF o ESCPOS desde Windows o Mac

Hemos creado 2 instaladores para la impresión directa desde Windows y Mac. Más detalles aquí.

Anexo: datos de servicios períodicos

En la versión oficial, hace un tiempo notamos que los campos asociados a servicios períodicos, estos:

Campos Servicios periódicos

Generaban problemas en usuarios que los asignaban erróneamente.

Se decidió quitarlos por defecto y si el usuario desea tener esos campos debe activarlos en la configuración de la empresa, pestaña Facturación:

Datos de servicio periódicos

Anexo: refactorización listados

Los “listar” de las principales secciones se mejoraron:

  • Documentos temporales (de hecho este no existía, se creó).
  • Documentos emitidos
  • Documentos recibidos
  • Bandeja de intercambio

Lo principal realizado fue:

  • Permitir hacer búsqueda en los emisores y receptores por RUT (con DV y sin DV) y con el nombre (razón social).
  • Validar los campos numéricos.
  • Validar que los “montos” puedan ser “copiados” así “$10.000” y es el sistema el que lo deja como número.
  • Acortar los mensajes en “selects” para tener más espacio en columnas.

Además, se mejoraron filtros en otros “listar” como el de consumo de folios. Evitando que la aplicación llegue al error “¡Lo sentimos! Encontramos un problema y la aplicación dejó de ejecutarse.” Que tanto miedo le da a algunos usuarios.

Anexo: eliminar masivamente documentos temporales

De vez en cuando, los usuarios piden eliminar masivamente los documentos temporales, pero no había una opción en la web. Ahora se agregó, y cualquier administrador podrá borrar masivamente los documentos temporales.

Botón para borrar masivamente los documentos temporales

Sin embargo, considero que es una funcionalidad peligrosa, por lo que se debe configurar previamente en la pestaña Facturación de la configuración de la empresa:

Pestaña de facturación Eliminar temporales

Anexo: Academia LibreDTE

Hemos diseñado talleres y capacitaciones que están en lo que hemos llamado Academia LibreDTE. Todo es online y el material está publicado de manera gratuita. ¿Y lo mejor? Los talleres que se hacen los miércoles son para cualquier usuario, ya sea cliente o no de SASCO SpA. ¡Participa!

Actualmente tenemos estos talleres:

4 talleres gratuitos LibreDTE

Y 2 capacitaciones, que si bien están orientadas a servicios de pago de la versión oficial, enseñan temas que son aplicables a la versión comunidad. Te recomendamos la Capacitación Inicial del Servicio Plus.

Cuadro informativo de Capacitación incial Servicio Plus

Anexo: ¿Y qué se viene para el futuro?

Varias cosas… la siguiente versión al menos debería incluir:

  • Migración a Bootstrap 5.
  • Migración a Font Awesome 6.
  • Migración a Debian GNU/Linux 11.
  • Migración a PHP 7.4

Y eso sólo las migraciones que son obligatorias. El resto, sorpresa para la siguiente versión.

LibreDTE versión 21.10
SASCO SpA, Francisca Gallegos Núñez 19 de octubre de 2021
Compartir
Etiquetas
Nuestros blogs
Archivar
Identificarse dejar un comentario
Round 6 – Nuevo cumpleaños.