PROJECT_001 / CASO TÉCNICO

PLATAFORMA DE ALQUILER DE VEHÍCULOS

IPARRENT

Aplicación web Java para gestionar vehículos, clientes y alquileres con arquitectura por capas, API REST, validación, polimorfismo, cálculo de precios y facturación.

JAVA 21JERSEY 4RESTMAVENJAKARTAJSP
Recurso visual real del proyecto IparRent

01 / RETO

LÓGICA REAL.
NO SOLO UNA INTERFAZ.

01

DISPONIBILIDAD

Validar que el vehículo exista y esté disponible antes de alquilar.

02

POLIMORFISMO

Modelar Coche, Moto, Furgoneta y CocheElectrico a partir de Vehiculo.

03

ALQUILER / DEVOLUCIÓN

Cambiar disponibilidad y registrar el ciclo del alquiler.

04

FACTURACIÓN

Calcular importes y agrupar facturación por tipo de vehículo.

02 / ARQUITECTURA

DE LA INTERFAZ
A LA LÓGICA Y LOS DATOS.

↓↓↓↓

Selecciona un nodo para revisar su responsabilidad.

03 / EVIDENCIA DEL PROYECTO

QUÉ HAY
REALMENTE IMPLEMENTADO.

POO

Vehiculo + subtipos

Clase abstracta Vehiculo con calcularPrecio(dias) y subtipos especializados.

REST

AlquilerResource

POST de alquiler y PUT /{id}/devolucion.

VALIDACIÓN

Jakarta Validation

Restricciones de matrícula, campos obligatorios y valores positivos.

INFORMES

InformeResource

GET /informes/facturacion agrupado por tipo de vehículo.

CONSTRUIR

Maven WAR

Java 21, Jersey 4, Jackson, Bean Validation, JSP/JSTL y Tomcat 11.

04 / IMPLEMENTACIÓN Y DECISIONES

DECISIONES EN CÓDIGO
RESPALDADAS POR EL PROYECTO.

Fragmentos seleccionados directamente de los archivos que componen el proyecto adjuntado.

JAVARegla de alquiler
public Alquiler alquilar(Long idCliente, Long idVehiculo, int dias) {

		if (idCliente == null) {
			throw new AlquilerException(Tipo.SOLICITUD_INVALIDA, "El id del cliente es obligatorio");
		}

		if (idVehiculo == null) {
			throw new AlquilerException(Tipo.SOLICITUD_INVALIDA, "El id del vehículo es obligatorio");
		}

		Cliente cliente = daoCliente.obtenerPorId(idCliente).orElseThrow(
				() -> new AlquilerException(Tipo.RECURSO_NO_ENCONTRADO, "No existe el cliente con id " + idCliente));

		Vehiculo vehiculo = daoVehiculo.obtenerPorId(idVehiculo).orElseThrow(
				() -> new AlquilerException(Tipo.RECURSO_NO_ENCONTRADO, "No existe el vehículo con id " + idVehiculo));

		if (!vehiculo.isDisponible()) {
			throw new AlquilerException(Tipo.VEHICULO_NO_DISPONIBLE,
					"El vehículo con id " + idVehiculo + " no está disponible");
		}

		Alquiler alquiler = new Alquiler(null, cliente, vehiculo, LocalDate.now(), dias);

		validador.validar(cliente);
		validador.validar(vehiculo);
		validador.validar(alquiler);

		BigDecimal importe = vehiculo.calcularPrecio(dias);

		alquiler.setImporte(importe);

		vehiculo.setDisponible(false);

		daoVehiculo.modificar(vehiculo);

		return daoAlquiler.insertar(alquiler);

Comprueba IDs, existencia y disponibilidad; valida entidades, calcula el importe, bloquea el vehículo y persiste el alquiler.

RESTEndpoint de alta
@POST
	@Consumes(MediaType.APPLICATION_JSON)
	public Response alquilar(@NotNull(message = "La solicitud es obligatoria") @Valid SolicitudAlquiler solicitud,
			@Context UriInfo uriInfo) {

		Alquiler alquiler = negocio.alquilar(solicitud.getIdCliente(), solicitud.getIdVehiculo(), solicitud.getDias());

		URI location = uriInfo.getAbsolutePathBuilder().path(alquiler.getId().toString()).build();

		return Response.created(location).entity(alquiler).build();

La API recibe una solicitud validada, crea el alquiler y devuelve HTTP 201 con Location y la entidad creada.

PROJECT_001 / CIERRE

IPARRENT

JAVA 21 × JERSEY 4 × REST × MAVEN