Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

implemento mi solucion #4

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 20 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,30 @@
IMPORTANTE: Leer [Versión de herramientas](#versión-de-herramientas)
# Alquiler de autos (abreviado)
# Alquiler de Vehículos (completo)

Se pretende desarrollar una aplicación que permita calcular los precios de alquiler de una empresa de alquiler de vehículos. Cada vehículo se identifica unívocamente por medio de su patente.
Descripción general
Se pretende desarrollar una aplicación que permita calcular los precios de alquileres de una agencia de alquiler de vehículos. Cada vehículo se identifica unívocamente por medio de su patente.

La agencia alquila a sus clientes distintos tipos de vehículos, tanto para transporte de personas como de carga. En la actualidad los vehículos alquilados por la agencia son coches, microbuses, furgoneta de carga y camiones.

La empresa alquila a sus clientes distintos tipos de vehículos, tanto para transporte de personas como de carga. En la actualidad los vehículos alquilados por la empresa son coches, microbuses, furgoneta de carga y camiones.
El precio del alquiler de cualquier vehículo tiene un precio base que depende de los días de alquiler a razón de $500 por día.

En el caso de un coche , al precio base se le suma la cantidad de $100 por plaza disponible por día. Así por ejemplo un Chery QQ con 4 cinturones de seguridad posee 4 plazas. Mientras que un Honda Civic con 5 cinturones de seguridad otorga 5 plazas.
Si el coche pertenece a una categoría premium el precio de las plazas es de $150.
Cualquier coche puede ser blindado, en tal caso al precio total de dicho coche se le suma un 15%.
El precio de los microbuses se calcula como el de todos los vehículos pero con base $1500 por día más un monto extra fijo de $500 independientemente de los días de alquiler.
Para los vehículos de carga se cobra el precio base más $300 * PMA (PMA = peso máximo autorizado en toneladas).
Los camiones no tienen precio base sino que cuestan un costo fijo de $30000 independientemente de los días de alquiler.

El precio del alquiler de cualquier vehículo tiene un componente base que depende los días de alquiler a razón de $500 por día.
Se pide para la agencia de vehículos:
Poder registrar vehículos con su patente para que se puedan alquilar. No se pueden registrar 2 vehículos con igual patente.
Poder agregarle clientes (Los mismos tendrán un número de cliente autogenerado e incremental desde 1)
Dado un cliente, asignarle un alquiler. Se alquila un vehículo en una cantidad de días determinados (mínimamente 1 día y no se pueden alquilar de forma fraccionada, es decir se alquilan 1,2,3,4 ó X días. Son valores enteros)
Luego se le debe poder pedir el precio de dicho alquiler.
El precio total de todos los alquileres de un cliente.
El precio total de todos los alquileres de la empresa.
Hacer a MANO ALZADA: Diagrama de Clases del Modelo de Dominio resultante.
Hacer a MANO ALZADA: Diagrama de Secuencias del punto 5.

1. Si el coche pertenece a una categoría premium (BMW, AUDI modelos superiores al 2016) el precio de las plazas es de $150.
2. Para los vehículos de carga se cobra el precio base más $300 * PMA (PMA = peso máximo autorizado en toneladas).

Se pide calcular el valor de alquiler para los siguientes casos:
1. Un cliente alquila un BMW con 5 plazas modelo 2018 2 días.
2. Cliente alquila un camión con PMA = 1000 unos 10 días.

## Versión de herramientas

Expand Down
98 changes: 98 additions & 0 deletions src/main/java/ar/edu/uba/fi/Agencia.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package ar.edu.uba.fi;

import java.util.ArrayList;

import ar.edu.uba.fi.Alquilable;
import ar.edu.uba.fi.Inmueble;
import ar.edu.uba.fi.InmuebleYaRegistradoException;

public class Agencia {
private ArrayList<Vehiculo> vehiculos = new ArrayList<Vehiculo>();
private ArrayList<Cliente> clientes = new ArrayList<Cliente>();
private ArrayList<Inmueble> inmuebles = new ArrayList<Inmueble>();
Comment on lines +10 to +12

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

La idea de la implementación de la interfaz Alquilable es justamente abstraer esto para no tener multiples listas con distintos tipos de Alquilables (imaginate que tenes 10 tipos de Alquilables distintos, tendrías 10 listas?)


public void registrarVehiculo(Vehiculo unVehiculo) {
for(Vehiculo vehiculo: vehiculos){
if(vehiculo.esIgualA(unVehiculo)){
throw new VehiculoYaRegistradoException();
}
}
vehiculos.add(unVehiculo);
}

void registrarInmueble(Inmueble unInmueble) {
for(Inmueble inmueble: inmuebles){
if(inmueble.esIgualA(unInmueble)){
throw new InmuebleYaRegistradoException();
}
}
inmuebles.add(unInmueble);
}
Comment on lines +14 to +30

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lo mismo acá, si tenés muchos alquilables? Serían muchos métodos para lo mismo



public void registrarCliente(Cliente cliente) {
clientes.add(cliente);
}

public Double calcularAlquilerParaCliente(Cliente unCliente) {
for (Cliente cliente: clientes){
if(cliente.esIgualA(unCliente)){
return cliente.calcularPrecioAlquileres();
}
}
throw new ClienteNoRegistradoException();
}

public void registrarAlquiler(Cliente unCliente, Alquilable unAlquilable, int dias) {
Cliente cliente = buscarCliente(unCliente);
Alquilable alquilable = buscarAlquilable(unAlquilable);
cliente.registrarAlquiler(alquilable, dias);
}

private Vehiculo buscarVehiculo(Vehiculo unVehiculo) {
for(Vehiculo vehiculo: vehiculos){
if(vehiculo.esIgualA(unVehiculo)){
return vehiculo;
}
}
throw new VehiculoNoRegistradoException();
}

private Inmueble buscarInmueble(Inmueble unInmueble){
for(Inmueble inmueble: inmuebles){
if(inmueble.esIgualA(unInmueble)){
return inmueble;
}
}
throw new VehiculoNoRegistradoException();
}
Comment on lines +52 to +68

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

También acá


private Alquilable buscarAlquilable(Alquilable unAlquilable) {
if (unAlquilable instanceof Vehiculo) {
return buscarVehiculo((Vehiculo) unAlquilable);
} else if (unAlquilable instanceof Inmueble) {
return buscarInmueble((Inmueble) unAlquilable);
}
throw new AlquilableNoRegistradoException();
}
Comment on lines +70 to +77
Copy link

@laldonate96 laldonate96 Oct 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Acá primero que nada instanceof está rompiendo tell dont ask, y la idea es usar polimorfismo con la abstrancción que te permite la implementación del alquilable.



private Cliente buscarCliente(Cliente unCliente) {
for(Cliente cliente: clientes){
if(cliente.esIgualA(unCliente)){
return cliente;
}
}
throw new ClienteNoRegistradoException();
}

public Double calcularAlquilerTotal() {
double suma = 0;
for(Cliente cliente: clientes){
suma += cliente.calcularPrecioAlquileres();
}
return suma;
}


}
5 changes: 5 additions & 0 deletions src/main/java/ar/edu/uba/fi/Alquilable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ar.edu.uba.fi;

public interface Alquilable{
public abstract Double alquilarPorDias(int dias);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package ar.edu.uba.fi;

public class AlquilableNoRegistradoException extends RuntimeException{}
18 changes: 18 additions & 0 deletions src/main/java/ar/edu/uba/fi/Alquiler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ar.edu.uba.fi;


public class Alquiler {


private final Alquilable alquilable;
private final int dias;

public Alquiler(Alquilable alquilable, int dias) {
this.alquilable = alquilable;
this.dias = dias;
}

public double calcularPrecio() {
return alquilable.alquilarPorDias(dias);
}
}
8 changes: 8 additions & 0 deletions src/main/java/ar/edu/uba/fi/Blindado.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ar.edu.uba.fi;

public class Blindado implements Blindaje {
@Override
public Double modificarPrecio(int precio) {
return precio * 1.15;
}
}
5 changes: 5 additions & 0 deletions src/main/java/ar/edu/uba/fi/Blindaje.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ar.edu.uba.fi;

public interface Blindaje {
Double modificarPrecio(int precio);
}
22 changes: 22 additions & 0 deletions src/main/java/ar/edu/uba/fi/Cabaña.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/

package ar.edu.uba.fi;


class Cabaña extends Inmueble{
private final Double cantidadDeInquilinos;

public Cabaña(Double cantidadDeInquilinos, String direccion){
super(direccion);
this.cantidadDeInquilinos = cantidadDeInquilinos;
}

@Override
public Double alquilarPorDias(int dias){
return dias * Math.pow(this.cantidadDeInquilinos, 2);

}
}
12 changes: 12 additions & 0 deletions src/main/java/ar/edu/uba/fi/Camion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ar.edu.uba.fi;

public class Camion extends Vehiculo {

public Camion(String patente) {
super(patente);
}

public Double alquilarPorDias(int dias) {
return 30000.00;
}
}
5 changes: 5 additions & 0 deletions src/main/java/ar/edu/uba/fi/Categoria.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ar.edu.uba.fi;

public interface Categoria {
int precioPlazas(int plazas);
}
8 changes: 8 additions & 0 deletions src/main/java/ar/edu/uba/fi/CategoriaNormal.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ar.edu.uba.fi;

public class CategoriaNormal implements Categoria {
@Override
public int precioPlazas(int plazas) {
return plazas * 100;
}
}
8 changes: 8 additions & 0 deletions src/main/java/ar/edu/uba/fi/CategoriaPremium.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ar.edu.uba.fi;

public class CategoriaPremium implements Categoria {
@Override
public int precioPlazas(int plazas) {
return plazas * 150;
}
}
33 changes: 33 additions & 0 deletions src/main/java/ar/edu/uba/fi/Cliente.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package ar.edu.uba.fi;

import java.util.ArrayList;
import java.util.List;

public class Cliente {
private final String nombre;
private ArrayList<Alquiler> alquileres = new ArrayList<Alquiler>();

public Cliente(String nombre) {
this.nombre = nombre;
}

public void registrarAlquiler(Alquilable alquilable, int dias) {
alquileres.add(new Alquiler(alquilable,dias));
}

public Double calcularPrecioAlquileres() {
double suma = 0;
for (Alquiler alquiler: alquileres){
suma += alquiler.calcularPrecio();
}
return suma;
}

public boolean esIgualA(Cliente unCliente) {
return unCliente.tieneNombre(nombre);
}

private boolean tieneNombre(String unNombre) {
return (unNombre == nombre);
}
}
4 changes: 4 additions & 0 deletions src/main/java/ar/edu/uba/fi/ClienteNoRegistradoException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package ar.edu.uba.fi;

public class ClienteNoRegistradoException extends RuntimeException {
}
19 changes: 19 additions & 0 deletions src/main/java/ar/edu/uba/fi/Coche.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ar.edu.uba.fi;

public class Coche extends Vehiculo {

private final int plazas;
private final Categoria categoria;
private final Blindaje blindaje;

public Coche(String patente, int plazas, Categoria categoria, Blindaje blindaje) {
super(patente);
this.plazas = plazas;
this.categoria = categoria;
this.blindaje = blindaje;
}

public Double alquilarPorDias(int dias) {
return blindaje.modificarPrecio((500 + categoria.precioPlazas(plazas)) * dias);
}
}
19 changes: 19 additions & 0 deletions src/main/java/ar/edu/uba/fi/Departamento.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ar.edu.uba.fi;

public class Departamento extends Inmueble{

private final Double metrosCuadrados;

public Departamento(Double metrosCuadrados, String direccion){
super(direccion);
this.metrosCuadrados = metrosCuadrados;
}

@Override
public Double alquilarPorDias(int dias){
return dias * metrosCuadrados;

}
}


14 changes: 14 additions & 0 deletions src/main/java/ar/edu/uba/fi/Furgoneta.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ar.edu.uba.fi;

public class Furgoneta extends Vehiculo {
private final double pma;

public Furgoneta(String patente, double pma) {
super(patente);
this.pma = pma;
}

public Double alquilarPorDias(int dias) {
return ((300 * pma ) + 500 ) * dias;
}
}
22 changes: 22 additions & 0 deletions src/main/java/ar/edu/uba/fi/Habitacion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/

package ar.edu.uba.fi;


class Habitacion extends Inmueble{
private final Double cantidadDeCamas;

public Habitacion(Double cantidadDeCamas, String direccion) {
super(direccion);
this.cantidadDeCamas = cantidadDeCamas;
}

@Override
public Double alquilarPorDias(int dias) {
return this.cantidadDeCamas * (dias + 500);
}

}
23 changes: 23 additions & 0 deletions src/main/java/ar/edu/uba/fi/Inmueble.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ar.edu.uba.fi;

import ar.edu.uba.fi.Vehiculo;

public abstract class Inmueble implements Alquilable{
protected String direccion;

public Inmueble(String direccion){
this.direccion = direccion;
}

@Override
public abstract Double alquilarPorDias(int dias);

public boolean esIgualA(Inmueble unInmueble){
return unInmueble.tieneMismaDireccion(this.direccion);
}

private boolean tieneMismaDireccion(String direccion){
return (this.direccion == direccion);
}

}
10 changes: 10 additions & 0 deletions src/main/java/ar/edu/uba/fi/InmuebleYaRegistradoException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/

package ar.edu.uba.fi;


public class InmuebleYaRegistradoException extends RuntimeException {
}
Loading