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
Arquitectura completa del sistema backend con Spring Boot y Java
Versión 2.4.2
Framework principal
Base de datos
Gestor de dependencias
Documentación API
Seguridad y autenticació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.
Contiene la lógica para llamar todas personas que fueron registradas como afiliados en algún servicio de transporte.
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.
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.
Contiene la lógica para la creación en el módulo de Clientes, basado en arquitectura (MVC): crear, modificar, eliminar, obtener clientes.
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.
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.
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.
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).
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.
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).
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.
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.
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.
Contiene la lógica para listar los FUECs y consultarlos desde un template ya creado directamente desde el backend.
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.
Contiene la lógica para validar que los documentos que se suban sean tipo PDF.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Este método contiene la lógica de las excepciones globales en Spring Boot, responde de manera personalizada a los errores de la API.
El modelo de este proyecto está basado en las siguientes 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.
@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;
}
| 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) |
Para cada nueva tabla en la base de datos se debe construir con la estructura anteriormente mencionada.
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.
Al extender de
JpaRepository<nombreModelo, Long>, el
repositorio obtiene automáticamente:
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.
Java Persistence Query Language - Orientado a entidades, permite consultar las entidades mapeadas en JPA como objetos.
Se usa cuando se necesita consultar tablas específicas que no están directamente mapeadas como entidades.
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.
Este servicio, marcado con la anotación @Service,
encapsula todas las operaciones necesarias para gestionar una
entidad del sistema.
Esta clase se tenía prevista para enviar diferentes notificaciones de forma personalizada a los usuarios, solo tiene definido los métodos.
Esta clase es una utilidad para convertir una contraseña en un hash usando SHA-256.
Es usada para guardar contraseñas de manera segura en bases de datos.
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():
Esta clase maneja cantidades grandes (miles, millones, miles de millones) y convierte números a texto en español.
Entrada: "1234567"
Salida: "Un Millón Doscientos Treinta y Cuatro Mil Quinientos Sesenta y Siete"
public String cantidadConLetra(String s)
Recibe una cadena (ejemplo "1234.56") y devuelve la parte entera convertida a palabras.
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.
El número se divide de derecha a izquierda en bloques de 3 cifras:
int triUnidades = (int)((parteEntera % 1000));
int triMiles = (int)((parteEntera / 1000) % 1000);
int triMillones = (int)((parteEntera / 1000000) % 1000);
int triMilMillones = (int)((parteEntera / 1000000000) % 1000);
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.
@Autowired
private JavaMailSender mailSender;
Spring Boot inyecta automáticamente un objeto
JavaMailSender, que es la clase responsable de enviar
correos electrónicos.
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";
@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.
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.
public String generarUsuario(String nombres, String apellidos)
Crea un nombre de usuario combinando:
Nombres: Juan Carlos
Apellidos: Pérez Gómez
Usuario generado: JPérezG
public String generarContraseña()
Crea una contraseña compuesta por 15 caracteres aleatorios, usando:
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.
La clase define varios valores constantes usados como partes del número final:
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.
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.
Cada token incluye tres partes:
La firma garantiza que el token no pueda ser modificado sin invalidarse.
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.
| 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 |
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.
// 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.
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).
Esta clase tiene tres propósitos principales:
public String generateQR(String text, int h, int w) throws Exception
Hace lo siguiente:
Ejemplo final de lo que almacena el QR:
https://midominio.com/validar/fuec?token=AS923SDJ23JDS...
public void eliminarQR(String nombre)
Permite borrar un QR ya creado. Es útil para:
Este método construye un texto grande que describe todos los datos del FUEC (vehículo, conductores, fechas, contrato...).
Esta clase es un servicio Spring (@Service) utilizado
para enviar mensajes por WhatsApp usando la API de
Twilio.
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.
public static final String ACCOUNT_SID =
"ACa53de39534fae34c11d90e2fa78b1200";
public static final String AUTH_TOKEN =
"d045770f3476eb51ce3518f9d421d834";
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:
Contiene las imágenes que se incluyen en los documentos generados de la plataforma, logos, firmas, asignaciones de QR temporal.
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.
Contiene un FUEC generado estáticamente para pruebas.
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.
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.