Documentación Backend

Documentación Desarrollo Trexsas Backend

Arquitectura completa del sistema backend con Spring Boot y Java

Proyecto Transporte
Autor Elder Daniel Agudelo Pita
Fecha 4/12/2025
Versión 1.1
01

Tecnologías Utilizadas

Java

Versión 2.4.2

Spring Boot

Framework principal

MySQL

Base de datos

Maven

Gestor de dependencias

Swagger

Documentación API

JWT

Seguridad y autenticación

02

Arquitectura del Proyecto

Java Package

Calendarización Validación de fechas y notificaciones
Controladores Endpoints REST y lógica de controladores
Exception Manejo global de excepciones
Modelo Entidades JPA y modelos de datos
Repositorios Acceso a datos con Spring Data JPA
Servicios Lógica de negocio
Tareas Procesos programados
Utilidades Funciones reutilizables

Package Resources

  • Logos
  • QR
  • Static
  • Templates
  • Application Properties
  • Keystore.p12 (Certificación de seguridad página web)
03

Calendarización - Clases

RevisionPapeles

Descripción

Contiene la lógica para realizar las validaciones referentes a las fechas de los documentos registrados por los conductores, valida fechas de vencimiento y envía la notificación que el documento está vencido.

04

Controladores - Clases

AfiliacionControlador

Contiene la lógica para llamar todas personas que fueron registradas como afiliados en algún servicio de transporte.

ArchivoControlador

Contiene la lógica para subir los documentos de cada uno de los conductores o archivos que hacen parte del vehículo, soat, licencia de conducción y revisión preventiva. Este controlador tiene mapeadas las rutas (PATH) que deben apuntar a las carpetas correspondientes dentro del servidor y almacenarlas.

CapacitacionControlador

Contiene la lógica de creación de capacitaciones dentro del módulo de administración el cual funciona para crear alertas o enviar notificaciones al usuario para que realice algunas de estas.

ClienteControlador

Contiene la lógica para la creación en el módulo de Clientes, basado en arquitectura (MVC): crear, modificar, eliminar, obtener clientes.

ConductorControlador

Contiene la lógica para registrar los datos del conductor, asociar los documentos y mapeo de fechas de vigencia dentro del módulo de Usuarios.

ConfiguracionesControladores

Contiene la lógica de configuraciones para QR dentro del módulo de administración, edición de correo y actualización de datos generales.

ContratoControlador

Contiene la lógica que hace la creación del contrato, registra los datos generales del contrato, asocia el cliente, los pasajeros, las rutas ya creadas en el sistema, opción de cambiar estados del contrato, modificar y anular contrato.

CuentaCobroControlador

Contiene la lógica para creación de cuentas de cobro asociadas a los conductores que realizan los servicios, según el perfil y el usuario se listan todas las cuentas de cobro, cuenta con la arquitectura (CRUD).

CuentaControlador

Contiene la lógica para crear los usuarios en el sistema, se ingresan la información básica de las personas, asignación de perfiles en el módulo de usuarios.

EncuestaControlador

Contiene la lógica para crear encuestas desde el módulo de administración del usuario administrador, la encuesta es enviada por correo electrónico (Notificación).

EncuestaRespondidaControlador

Contiene la lógica para el registro de respuestas de las encuestas realizadas por las personas que adquirieron el servicio junto con la calificación.

FacturaControlador

Contiene la lógica para crear las facturas de los servicios realizados y completados. Es necesario que los servicios estén completados y cerrados para generar las facturas y poderlas descargar, lista las facturas generadas, al momento de crear las facturas lista los clientes y vehículos asociados al servicio.

FuecControlador

Contiene la lógica para crear el FUEC, lista los clientes, agregar los pasajeros a ese FUEC, lista los conductores y valida si los documentos de los vehículos o conductores se encuentra vigentes de lo contrario no es posible crear el FUEC, al generar el FUEC, es posible descargar, anular o editar.

HomeController

Contiene la lógica para listar los FUECs y consultarlos desde un template ya creado directamente desde el backend.

IngresoControlador

Contiene la lógica para ingreso y cierre de sesión a la plataforma mediante usuario y contraseña, la contraseña está encriptada en la base de datos tiene el algoritmo de MD5 SHA256.

MapeoDocumentos

Contiene la lógica para validar que los documentos que se suban sean tipo PDF.

NotificaciónController

Contiene la lógica para el envío de notificaciones de los eventos que se realicen en la plataforma, creación de usuarios, envío de contraseña por correo electrónico, asignación de servicio a los conductores y restablecimiento de contraseña.

OrdenServicioControlador

Contiene la lógica para creación de órdenes de servicio, registro de datos básicos, valor del servicio, generar documento PDF, filtro de órdenes por fechas, listado de órdenes de servicio y en este módulo es donde se asigna el conductor al servicio.

PasajeroContrato

Contiene la lógica de creación de pasajero dentro del módulo de usuarios, información básica, listado de los pasajeros creados dentro del sistema.

PerfilControlador

Contiene la lógica para crear los perfiles dentro del sistema, el perfil creado, nombre y los permisos en cuanto a módulos asignados, acciones que puede realizar: crear, listar, modificar, eliminar, ver.

PQRControlador

Contiene la lógica para crear PQR si el pasajero o el conductor lo desea para notificar sobre un comportamiento inusual y el cual debe ser atendido de forma oportuna.

PropietarioControlador

Contiene la lógica para creación de propietario dentro del módulo de usuarios, listado de propietarios dentro del módulo de vehículos, si el usuario es conductor y propietario se le asigna los dos perfiles para que se le pueda asignar después al vehículo.

RutaControlador

Contiene la lógica para crear las rutas, editarlas, eliminar, listado de las mismas, estas rutas luego serán asignadas en los contratos o en los FUECs o en los servicios según corresponda.

ServicioControlador

Contiene la lógica para crear los servicios, este módulo consiste en la creación de servicios mediante listado de clientes, fecha del servicio ruta o dirección donde se requiere el servicio y observaciones, también muestra el tiempo que llevará el realizar este servicio.

VehiculoControlador

Contiene la lógica para registrar los vehículos en el sistema información básica, cargue de documentos y asignación de conductores o propietarios, dentro del módulo permite realizar las acciones de eliminar, editar, crear.

05

Exception

GlobalExceptionHandler

Descripción

Este método contiene la lógica de las excepciones globales en Spring Boot, responde de manera personalizada a los errores de la API.

06

Modelo

El modelo de este proyecto está basado en las siguientes anotaciones:

Java Anotaciones
@Entity
@Table(name = "nombreTabladb")

Definen a la clase que es una entidad de modelado de datos y de tablas de la base de datos donde la anotación @Table debe apuntar a la tabla de la base de datos. Los nombres de las columnas de la tabla deben coincidir exactamente para poder mapearlos de forma correcta, también es posible renombrarlos con variables privadas.

Ejemplo de estructura de datos

Java Ejemplo de Entidad
@Entity
@Table(name = "afiliacion")
public class Afiliacion {
    
    @Id
    @GeneratedValue
    @Column(name = "id_afiliacion")
    private Long idAfiliacion;
    
    @Size(max = 10)
    @Column(name = "codigo_interno_afiliacion")
    private String codigoInternoAfiliacion;
}

Descripción de Anotaciones

Anotación Descripción
@Entity Indica que esta clase es una entidad JPA (se guardará en la BD)
@Table Le dice a JPA que la tabla se llama exactamente como se especifica en la base de datos
@Id + @GeneratedValue Define la clave primaria y genera el ID automáticamente
@Column Indica que el atributo corresponde a una columna específica
@Size Valida el tamaño máximo del campo (Bean Validation)
Importante

Para cada nueva tabla en la base de datos se debe construir con la estructura anteriormente mencionada.

07

Repositorios

Los repositorios forman parte de la capa de persistencia de datos del proyecto y está construido utilizando Spring Data JPA, un módulo que simplifica de forma significativa la interacción con la base de datos.

Esta interfaz es responsable de ejecutar todas las operaciones necesarias para consultar, almacenar, actualizar o eliminar información relacionada con las tablas.

Funcionalidades Automáticas

Al extender de JpaRepository<nombreModelo, Long>, el repositorio obtiene automáticamente:

  • Búsquedas por ID
  • Obtención de todos los registros
  • Creación y actualización de entidades
  • Eliminación de registros
  • Contadores y validación de existencia
  • Paginación y ordenamiento integrados

Consultas Personalizadas

Además de las operaciones básicas, el repositorio define consultas personalizadas mediante la anotación @Query. Estas consultas permiten obtener información más específica.

JPQL

Java Persistence Query Language - Orientado a entidades, permite consultar las entidades mapeadas en JPA como objetos.

SQL Nativo

Se usa cuando se necesita consultar tablas específicas que no están directamente mapeadas como entidades.

08

Servicios

La capa de servicio es una parte fundamental de la arquitectura de la aplicación, ya que se encarga de manejar la lógica de negocio y de coordinar las operaciones que involucran el acceso a datos.

El servicio actúa como un intermediario entre los controladores y los repositorios, garantizando una separación adecuada de responsabilidades.

Características del Servicio

Este servicio, marcado con la anotación @Service, encapsula todas las operaciones necesarias para gestionar una entidad del sistema.

Métodos Esenciales

Creación de registros Se asegura que el identificador se genere automáticamente antes de almacenar
Actualización Permite modificar información existente
Consulta de todos los registros Devuelve una lista completa de los elementos almacenados
Eliminación Elimina registros existentes utilizando los métodos del repositorio
Consulta por identificador Recupera un elemento específico de manera segura

Visión General del Servicio

  • Gestiona toda la lógica de negocio relacionada con una entidad específica
  • Aísla la interacción con la base de datos mediante el uso del repositorio
  • Facilita el mantenimiento y la escalabilidad del proyecto
  • Mantiene una arquitectura limpia al evitar colocar lógica innecesaria en los controladores
  • Proporciona métodos claros y reutilizables
09

Tareas

Descripción

Esta clase se tenía prevista para enviar diferentes notificaciones de forma personalizada a los usuarios, solo tiene definido los métodos.

10

Utilidades

Cifrador

Esta clase es una utilidad para convertir una contraseña en un hash usando SHA-256.

  • No cifra (como AES)
  • No encripta reversible
  • Hashea, o sea, transforma la contraseña en un valor irreversible

Es usada para guardar contraseñas de manera segura en bases de datos.

Java Cifrador.java
package com.itefs.trexsas.utilidades;

import org.apache.commons.codec.digest.DigestUtils;

public class Cifrador {
    
    public String cifrar(String clave) {
        String cifrada = DigestUtils.sha256Hex(clave);
        return cifrada;
    }
}

DigestUtils.sha256Hex():

  • Toma tu texto (ej: "123456")
  • Aplica algoritmo SHA-256
  • Convierte el resultado a formato hexadecimal

ConvertirNumeroLetra

Esta clase maneja cantidades grandes (miles, millones, miles de millones) y convierte números a texto en español.

Ejemplo

Entrada: "1234567"

Salida: "Un Millón Doscientos Treinta y Cuatro Mil Quinientos Sesenta y Siete"

Análisis del Método Principal

Java
public String cantidadConLetra(String s)

Recibe una cadena (ejemplo "1234.56") y devuelve la parte entera convertida a palabras.

Paso 1: Preparación del número

Java
BigDecimal totalBigDecimal = new BigDecimal(s).setScale(2, BigDecimal.ROUND_DOWN);
long parteEntera = totalBigDecimal.toBigInteger().longValue();

Convierte el texto a BigDecimal para manejar números grandes con precisión, redondea hacia abajo a 2 decimales y extrae la parte entera como número long.

Paso 2: Separación en grupos de tres cifras

El número se divide de derecha a izquierda en bloques de 3 cifras:

  1. Unidades (0 – 999)
  2. Miles (1,000 – 999,999)
  3. Millones (1,000,000 – 999,999,999)
  4. Mil millones (hasta 999,999,999,999)
Java
int triUnidades      = (int)((parteEntera % 1000));
int triMiles         = (int)((parteEntera / 1000) % 1000);
int triMillones      = (int)((parteEntera / 1000000) % 1000);
int triMilMillones   = (int)((parteEntera / 1000000000) % 1000);

Correo

Este fragmento pertenece a un servicio de envío de correos en Spring Boot. Su función es enviar un correo HTML cuando un usuario solicita recuperar su contraseña.

Inyección de dependencias

Java
@Autowired
private JavaMailSender mailSender;

Spring Boot inyecta automáticamente un objeto JavaMailSender, que es la clase responsable de enviar correos electrónicos.

Asuntos predefinidos

Java
private final String olvidoClave = "Olvidaste tu clave TREX.SAS";
private final String solicitudAfiliacion = "Solicitud de vinculación a TREX.SAS";
private final String reserva = "Reserva de transporte con TREX.SAS";

Método enviarCorreoRecuperacion

Java
@Async
public void enviarCorreoRecuperacion(...) {
    // Construcción del mensaje HTML
    String cuerpoMensaje = "<body style=...>" ... "</body>";
    
    // Configuración del mensaje
    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true);
    
    helper.setSubject(olvidoClave);
    helper.setTo(destinatario);
    helper.setText(cuerpoMensaje, true);
    
    // Envío del correo
    mailSender.send(message);
}

@Async indica que este método se ejecutará en segundo plano, es decir, sin bloquear la solicitud HTTP del usuario.

GeneradorCredenciales

Esta clase está diseñada para crear automáticamente credenciales (usuario y contraseña) que puedan asignarse a una persona al momento de registrarse en un sistema.

Método para generar un nombre de usuario

Java
public String generarUsuario(String nombres, String apellidos)

Crea un nombre de usuario combinando:

  • La primera inicial del nombre
  • El primer apellido completo
  • La inicial del segundo apellido (si la persona tiene dos apellidos)
Ejemplo

Nombres: Juan Carlos

Apellidos: Pérez Gómez

Usuario generado: JPérezG

Método para generar una contraseña aleatoria

Java
public String generarContraseña()

Crea una contraseña compuesta por 15 caracteres aleatorios, usando:

  • Letras mayúsculas
  • Letras minúsculas
  • Números

GeneradorNumeroFuec

Esta clase está diseñada para generar un código único siguiendo una estructura numérica fija. Este tipo de funcionalidad se usa cuando una organización necesita emitir identificadores oficiales o consecutivos con un formato estandarizado.

Componentes principales

La clase define varios valores constantes usados como partes del número final:

  • Un código territorial
  • Un código de habilitación
  • El año actual tomado del sistema
  • Un año base o referencia establecida previamente

Método para generar el número principal

Java
public String generarNumeroFuec(int consecutivoInternoContrato)

Este método recibe un número interno que representa un consecutivo, y lo transforma para cumplir un formato específico.

Ejemplos
  • Si recibe 5 → se convierte en 0005
  • Si recibe 42 → se convierte en 0042
  • Si recibe 380 → se convierte en 0380
  • Si recibe 1500 → queda igual

GeneradorToken

Esta clase está diseñada para generar y manipular tokens JWT, que son cadenas firmadas digitalmente usadas para autenticación, autorización o transporte seguro de información dentro de un sistema.

Los tokens JWT permiten incluir datos dentro de una estructura compacta y verificable sin necesidad de mantener una sesión en el servidor.

Funcionamiento general

Cada token incluye tres partes:

  1. El encabezado
  2. La información interna (claims)
  3. La firma, generada con una clave secreta

La firma garantiza que el token no pueda ser modificado sin invalidarse.

Métodos principales

Token básico Genera un token simple que solo incluye la fecha de creación
Token con subject Incluye un valor enviado como parámetro, almacenado como "subject"
Token con claims adicionales Agrega información extra en forma de "claims"
Token QR Variación que añade un campo específico destinado a ser recuperado mediante la lectura del código
Token con múltiples datos de usuario Construye un token más completo con varios campos adicionales numéricos
Decodificar token Divide un token en su estructura básica y decodifica las partes

Pdf

La clase Pdf es un servicio de Spring (@Service) encargado de generar diferentes documentos PDF (contratos, FUEC, facturas, órdenes de servicio, cuentas de cobro) usando la librería JasperReports.

Tecnologías utilizadas

  • JRXML → Plantillas diseñadas en iReport o Jaspersoft Studio
  • QR → Genera códigos QR (para el FUEC)
  • NumeroALetras → Convierte números a texto
  • Conexiones a base de datos → Para llenar reportes con datos desde MySQL

Flujo general

  1. Recibe datos desde tu sistema
  2. Carga un diseño .jrxml de JasperReports
  3. Inyecta los parámetros
  4. Genera un PDF en una carpeta del proyecto
  5. (Opcional) genera o elimina códigos QR
  6. (Opcional) llena reportes con bases de datos reales

Métodos principales

Método Descripción
crearContratoOcasional() Genera PDF de contrato ocasional con parámetros
crearFuec() Genera FUEC con QR embebido (el más importante)
crearFactura() Genera factura conectándose a base de datos real
crearOrdenServicio() Genera orden de servicio con parámetros
crearCuentaCobro() Genera cuenta de cobro con conversión de número a letras

PropertiesReader

La clase PropertiesReader funciona como un archivo de configuración centralizada dentro de tu aplicación.

Su objetivo principal es definir todas las rutas de carpetas donde se guardan y se leen los archivos utilizados por tu sistema.

Beneficios

  • Evita tener rutas "quemadas" en todas partes del código
  • Cambias la ruta en un solo lugar y toda la app se actualiza
  • Permite separar fácilmente entorno de pruebas y entorno de producción
  • Hace el código más limpio y mantenible

Atributo principal: ruta_raiz

Java
// Entorno de pruebas se utiliza el path de abajo
public static final String ruta_raiz = 
    "C:/Users/D.agudelo/Documents/archivos_trex/";

Esta es la carpeta base donde se guardan todos los archivos.

Subrutas generadas

FUEC pathFuecs, pathQR - Donde se guardan los PDFs FUEC y QR temporales
Datos del personal cedula, foto_persona, licencia_conduccion
Clientes y convenios convenio, logo_cliente
Vehículos y documentos vehiculo, tarjeta_propiedad, soat, polizas, revisiones
Reportes cuenta_cobro, factura, orden_servicio, diseños JRXML

URL para los QR del FUEC

Java
public static final String URL_FUEC_QR = 
    "http://127.0.0.1:4200/#/fuecInfo/";

El sistema genera códigos QR para los FUEC. El QR abre una URL que permite ver el documento desde el frontend (Angular).

QR

Esta clase tiene tres propósitos principales:

  1. Generar un código QR en formato PNG
  2. Borrar un QR previamente generado
  3. Construir un texto descriptivo para incluir en el QR o documentos asociados

Método generateQR

Java
public String generateQR(String text, int h, int w) throws Exception

Hace lo siguiente:

  1. Generar un nombre único para el archivo usando fecha y hora
  2. Crear el archivo destino
  3. Cifrar el valor que irá en el QR
  4. Construir el enlace final que quedará dentro del QR
  5. Generar el QR con ZXing
  6. Crear la imagen en memoria
  7. Guardar el archivo en disco
Ejemplo

Ejemplo final de lo que almacena el QR:

https://midominio.com/validar/fuec?token=AS923SDJ23JDS...

Método eliminarQR

Java
public void eliminarQR(String nombre)

Permite borrar un QR ya creado. Es útil para:

  • Limpieza de archivos temporales
  • Regenerar un QR actualizado

Método toString(...)

Este método construye un texto grande que describe todos los datos del FUEC (vehículo, conductores, fechas, contrato...).

Whatsapp

Esta clase es un servicio Spring (@Service) utilizado para enviar mensajes por WhatsApp usando la API de Twilio.

Riesgo de seguridad

Las claves ACCOUNT_SID y AUTH_TOKEN nunca deben estar en el código directamente. Lo correcto es guardarlas en application.properties o variables de entorno.

Atributos importantes

Java
public static final String ACCOUNT_SID = 
    "ACa53de39534fae34c11d90e2fa78b1200";
public static final String AUTH_TOKEN = 
    "d045770f3476eb51ce3518f9d421d834";

Método main - Prueba de integración

Java
Twilio.init(ACCOUNT_SID, AUTH_TOKEN);

Message message = Message.creator(
    new PhoneNumber("whatsapp:+573003103066"),
    new PhoneNumber("whatsapp:+14155238886"),
    "Esto es una prueba de envio desde la plataforma trex"
).create();

System.out.println("Mensaje enviado con SID: " + message.getSid());

Explicación:

  • El primer número es el destinatario real
  • El segundo es el número de sandbox de Twilio
  • El texto es el mensaje que llega por WhatsApp
11

RESOURCES

Logos

Contenido

Contiene las imágenes que se incluyen en los documentos generados de la plataforma, logos, firmas, asignaciones de QR temporal.

QR

Contenido

Contiene los QR generados que van dentro del FUEC generado. Este QR contiene o debe contener la información que tiene el FUEC pero en texto plano con el fin de validar que FUEC es válido.

Static

Contenido

Contiene un FUEC generado estáticamente para pruebas.

12

Package Templates

Home.html

Descripción

Contiene una página de consulta para FUECs. Esta página fue creada con el fin de que al escanear el código FUEC lleve a esta página y con el número de FUEC consultar directamente desde la base de datos.

application.properties

Descripción

Contiene la configuración de conexión a la base de datos, puertos e implementación de llaves de seguridad SSL, así como también configuración para Debug, configuraciones para envíos de correos electrónicos.