public class SalonBelleza { final static Descuento oro = new Descuento("Oro", 15f); final static Descuento plata = new Descuento("Plata", 10f); final static Descuento premium = new Descuento("Premium", 20f); public static void main(String[] args) { Cliente horacio = new Cliente("Horacio",oro); Cliente platz = new Cliente("Platz",plata); Cliente mario = new Cliente("Mario",premium); Cliente juan = new Cliente("Juan",null); Producto [] productos = {new Producto("Shampo", 5.f), new Producto("Gel", 3.f), new Producto("Crema para la cara", 8.f)}; Servicio [] servicios = {new Servicio("Corte",10.f), new Servicio("Lavado",8.f), new Servicio("Pedicure",8.f)}; Visita visitaOro = new Visita("2020-10-05", horacio, new DetalleProducto[]{productos[0],servicios[1],servicios[2]}); Visita visitaPlata = new Visita("2020-10-06", platz, new DetalleProducto[]{productos[2],servicios[0]}); Visita visitaPremium = new Visita("2020-10-07", juan, new DetalleProducto[]{servicios[1]}); Visita visitaComun = new Visita("2020-10-08", mario, new DetalleProducto[]{productos[2],productos[1],servicios[0]}); Visita [] visitas = {visitaOro, visitaPlata, visitaPremium, visitaComun}; for (Visita visita : visitas) { System.out.printf("La visita del dia %s del cliente %s con membresia %s hizo las siguientes compras\n",visita.getFecha(),visita.getCliente().getNombre(),visita.getCliente().getDescuento()!=null?visita.getCliente().getDescuento().tipoMembresia:"ninguna"); System.out.println(visita.getCliente().getDescuento()!=null?visita.getCliente().getDescuento().getDescuento():"nada"); for (DetalleProducto detalle : visita.getDetalle()) { System.out.printf("Desc: %s, precio: %.2f\n",detalle.getDescripcion(),detalle.getPrecio()); } System.out.printf("Monto total %.2f\n",visita.montoTotal()); } for(int i=0;i<51;i++){ new Visita("2020-10-09",juan,new DetalleProducto[]{servicios[1]}); } System.out.println("Juan es del tipo "+juan.getDescuento().getTipoMembresia()); } } interface DetalleProducto{ String getDescripcion(); float getPrecio(); boolean isServicio(); } class Producto implements DetalleProducto{ String descripcion; float precio; public Producto(String descripcion, float precio) { this.descripcion = descripcion; this.precio = precio; } public void setDescripcion(String descripcion) { this.descripcion = descripcion; } public void setPrecio(float precio) { this.precio = precio; } @Override public String getDescripcion() { // TODO Auto-generated method stub return descripcion; } @Override public float getPrecio() { // TODO Auto-generated method stub return precio; } @Override public boolean isServicio() { return false; } } class Descuento{ String tipoMembresia; float descuento; public Descuento(String tipoMembresia, float descuento) { this.tipoMembresia = tipoMembresia; this.descuento = descuento; } public float getDescuento() { return descuento; } public String getTipoMembresia() { return tipoMembresia; } public void setTipoMembresia(String tipoMembresia) { this.tipoMembresia = tipoMembresia; } public void setDescuento(float descuento) { this.descuento = descuento; } } class Servicio implements DetalleProducto{ String descripcion; float precio; public Servicio(String descripcion, float precio) { this.descripcion = descripcion; this.precio = precio; } public void setDescripcion(String descripcion) { this.descripcion = descripcion; } public void setPrecio(float precio) { this.precio = precio; } @Override public String getDescripcion() { // TODO Auto-generated method stub return descripcion; } @Override public float getPrecio() { // TODO Auto-generated method stub return precio; } @Override public boolean isServicio() { return true; } } class Cliente { String nombre; Descuento descuento; int cantidadVisitas; public Cliente(String nombre, Descuento descuento) { this.nombre = nombre; this.cantidadVisitas = 0; this.descuento = descuento; } public void setNombre(String nombre) { this.nombre = nombre; } public String getNombre() { return nombre; } public Descuento getDescuento() { return descuento; } public void setDescuento(Descuento descuento) { this.descuento = descuento; } } class Visita{ String fecha; Cliente cliente; DetalleProducto [] detalle; public Visita(String fecha, Cliente cliente, DetalleProducto [] detalle) { this.fecha = fecha; this.cliente = cliente; this.detalle = detalle; this.concretarVisita();//en teoria solo se debe hacer cuando la visita se concreta } private void concretarVisita(){ int visitas = this.cliente.cantidadVisitas + 1; if(visitas >= 20 && visitas <=50){ cliente.setDescuento(SalonBelleza.plata); } else{ if (visitas>50 && visitas<=100) { cliente.setDescuento(SalonBelleza.oro); } else { if (visitas>=100) { cliente.setDescuento(SalonBelleza.premium); } } } this.cliente.cantidadVisitas += 1; } public void setCliente(Cliente cliente) { this.cliente = cliente; } public Cliente getCliente() { return cliente; } public void setFecha(String fecha) { this.fecha = fecha; } public String getFecha() { return fecha; } public void setDetalle(DetalleProducto[] detalle) { this.detalle = detalle; } public DetalleProducto[] getDetalle() { return detalle; } public float montoTotal() { float monto = 0f; for(DetalleProducto det: detalle){ if(cliente.getDescuento() == null || !det.isServicio()){ monto += det.getPrecio(); continue; } monto += (det.getPrecio() * (100-cliente.getDescuento().getDescuento()) / 100); } return monto; } }