Programación Orientada a Objetos

Parciales de Objetos 1

Parcial Primera Fecha

Nos contratan de la agencia de recaudación de la provincia de Buenos Aires para hacer un sistema para el cálculo del impuesto que deben pagar los contribuyentes.

El sistoma ofrece la siguiente funcionalidad:

Su tarea es diseñar y programar en Java lo que sea necesario para ofrecer la funcionalidad antes descrita. Se espera que entregue lo siguiente:

Notas


Uml (Click derecho y abrir en la web para el zoom)

Texto alternativo de la imagen

Objetos



Sistema

public class Sistema(){
  private List<Contribuyente> contribuyentes;

  public Sistema(){
    this.contribuyentes = new ArrayList();
  }

  public Contribuyente agregarContribuyente(String nombre, String localidad, String email, int dni){
    Contribuyente nuevo = new Contribuyentes(nombre, localidad, email, dni);
    contribuyentes.add(nuevo);
    return nuevo;
  }

  public Inmueble agregarInmueble(Contribuyente c, int nroPartida, double valorLote, double valorEdificacion){
    Inmueble nuevo = new Inmueble(nroPartida, valorLote, valorEdificacion);
    c.agregarPropiedad(nuevo);
    return nuevo;
  }

  public Automotor agregarAutomotor(Contribuyente c, String patente, LocalDate fechaFabricacion, double valor, String marca, String modelo){
    Automotor nuevo = nuevo new Automotor(patente, fechaFabricacion, valor, marca, modelo);
    c.agregarPropiedad(nuevo);
    return nuevo;
  }

  public Embarcacion agregarEmbarcacion(Contribuyente c, String patente, LocalDate fechaFabricacion, double valor, String nombre){
    Embarcacion nuevo = new Embarcacion(patente, fechaFabricacion, valor, nombre);
    c.agregarPropiedad(nuevo);
    return nuevo;
  }

  public List<Contribuyente> masPagan (String localidad, int N){
    return contribuyentes.stream().
      filter(c->c.viveEn(localidad))
      .sorted((ex1, ex2) -> Double.compare(ex2.calcularImpuesto(), ex1.calcularImpuestos()))
      .limit(N)
      .collect(Collectors.toList());
    //Se ordena de mayor a menor
  }

  public double calcularImpuesto(Contribuyente c){
    return c.calcularImpuesto();
  }

}

Contribuyente

public class Contribuyente{
  private String nombre, localidad, mail;
  private int dni;
  private List<Propiedad> propiedades;

  public Contribuyente(String nombre, String localidad, String email, int dni){
    this.nombre = nombre;
    this.localidad = localidad;
    this.email = email;
    this.dni = dni;
    this.propiedades = new ArrayList<>();
  }

  public void agregarPropiedad(Propiedad p){
    propiedades.add(p);
  }

  public boolean viveEn(String localidad){
    return this.localidad.equals(localidad);
  }

  public double calcularImpuestos(){
    return propiedades.stream()
      .mapToDouble(p->p.calcularImpuesto()).sum();
  }
}

Propiedad

public interface Propiedad{
  double calcularImpuesto();
}

Vehiculo

public abstract class Vehiculo implements Propiedad{
  private String patente;
  private LocalDate fechaFabricacion;
  private double valor;
  
  public Vehiculo(String patente, LocalDate fechaFabricacion, double valor){
    this.patente = patente;
    this.fechaFabricacion = fechaFabricacion;
    this.valor = valor;
  }

  public double getValor(){
    return valor;
  }

  abstract public double getPorcentaje();

  public int getAntiguedad(){
    return (int) ChronoUnit.YEARS.between(fechaFabricaciom, LocalDate.now());
  }
  
  public double calcularImpuesto(){
    if (getAntiguedad() > 10){
      return 0;
    }
    return getPorcentaje() * valor;
  }
}

Embarcacion

public class Embarcacion extends Vehiculo{
  private String nombre;

  public Embarcacion(String patente, LocalDate fechaFabricacion, double valor, String nombre){
    super(patente, fechaFabricacion, valor);
    this.nombre = nombre;
  }

  public double getPorcentaje(){
    if (this.getValor() < 1000000){
      return 0.1;
    }
    return 0.15;
  }
}

Automotor

public class Automotor extends Vehiculo(){
  private String marca, modelo;

  public Automotor(String patente, LocalDate fechaFabricaciom, double valor, String marca, String modelo){
    super(patente, fechaFabricacion, valor);
    this.marca = marca;
    this.modelo = modelo;
  }

  public double getPorcentaje(){
    return 0.5;
  }
}

Inmueble

public class Inmueble implements Propiedad{
  private int nroPartida;
  private double valorLote, valorEdificacion;

  public Inmueble(int nroPartida, double valorLote, double, valorEdificacion){
    this.nroPartida = nroPartida;
    this.valorEdificacion = valorEdificacion;
    this.valorLote = valorLote;
  }

  public double calcularImpuesto(){
    return (this.valorLote + this.valorEdificacion) * 0.01;
  }
}

Parcial Segunda Fecha

MyCarBoxes es una empresa que vernde repuestos y ofrece servicios de reparación a vehiculos. El sistema registra órdenes de compra de repuestos y órdenes de reparación. Las reparaciones son llevadas a cabo por personal de MyCarBoxes, quienes cobran por hora sus tareas de reparación. Cada empleado puede cobrar un valor por hora distinto. Implemente la siguiente funcionalidad:

Tareas

Notas

Objetos

Sistema2

public class Sistema{
  private List<Repuesto> repuestos;
  private List<Empleado> empleados;
  private List<Orden> ordenes;


  public Sistema(){
    this.repuestos = new ArrayList();
    this.empelados = new ArrayList();
    this.ordenes = new ArrayList();
  }

  public Repuesto agregarRepuesto(String nombre, LocalDate fechaFabricacion, Real costo){
    Repuesto nuevo = new Repuesto(nombre, fechaFabricacion, costo);
    repuestos.add(nuevo);
    return nuevo;
  }

  public Repuesto agregarEmpleado(String nombreC,  double valorH){
    Repuesto nuevo = new Empleado(nombreC, valorH);
    empleados.add(nuevo);
    return nuevo;
  }

  public Orden agregarRepuesto(String patente,  List<Repuesto> repuestos){
    Orden nuevo = new CompraRepuesto(patente , repuestos);
    ordenes.add(nuevo);
    return nuevo;
  }

  public Orden agregarReparacion(String patente, String descripcion,  List<Repuesto> repuestos, List<Empleado> empleados){
    Orden nuevo = new Orden(patente, descripcion, repuestos, empleados);
    ordenes.add(nuevo);
    return nuevo;
  }

  public List<Factura> facturarOrdenes(){
    return ordenes.Stream()
      .map(orden -> orden.generarFactura(aplicaDescuento(orden))
      .collect(Collectors.toList());
  }

  public boolean aplicaDescuento(Orden ord){
    return this.ordenes.stream()
      .anyMatch(orden -> orden.getPatente().equals(ord.getPatente())
      && orden.getAntiguedad() = 0 && !(orden.equals(ord)))
  }

}

Repuesto

public class Repuesto{
  private String nombre;
  private LocalDate fechaFabricación;
  private double costo;

  public void Repuesto(String nombre, LocalDate fechaFabricación, double valor){
    this.nombre = nombre;
    this.fechaFabricacion = fechaFabricacion;
    this.valor = valor;
  }

  public int getAntiguedad(){
    return ChronoUnit.YEARS.between(this.fechaFabricación, LocalDateTime.now());
  }

  public int getCosto(){return this.costo}

Empleado

public class Empleado{
  private String nombreC;
  private double valorH;

  public Empleado(String nombreC, double valorH){
    this.nombreC = nombre;
    this.valorH = valorH;
  }

  public double getValorH(){return this.valorH;}

  public double  calcularCostoHora(int cantH){
    return getValorH() * cantH;
  }
}

Orden

public class abstract Orden{
  private String patente;
  protected List<Repuesto> repuestos;
  private LocalDate fecha = LocalDateTime.now();

  public Orden(String patente,List<Repuesto> repuestos){
    this.patente = patente;
    this.repuestos = repuestos;
  }

  public Factura generarFactura(boolean aplicaDescuento){
    Factura nuevo = new Factura(LocalDateTime.now(), this.patente, montoTotal(aplicaDescuento));
    return nuevo;
  }
  public double montoTotal(boolean aplicaDescuento){
    if !(aplicaDescuento){
      return calcularMonto() * calcularIncremento();
    }
    return (calcularMonto() * calcularIncremento()) * 0.05;
    
  }
  

  public double calcularCostoRepuestos(){
    return this.repuestos.Stream()
      .map(repuesto -> repuesto.getCosto())
      .sum();
  }

  public int getAntiguedad(){
    return ChronoUnit.YEARS.between(this.fecha, LocalDateTime.now(););
  }


  abstract public double calcularMonto();
  abstract public int calcularIncremento();
  public String getPatente(){return this.patente;}
}

CompraRepuesto

public class CompraRepuesto{
  public CompraRepuesto(String patente, List<Repuesto> repuestos){
      super(patente, repuestos);
    }

  public boolean alguno5Anios(){
    return this.repuestos.stream()
      .anyMatch(repuesto -> repuesto.getAntiguedad() > 5)
  }
  public Integer calcularIncremento(){
    if (alguno5Anios) {
      return 0.08;
    }
    return 0.15;
  }

  public double calcularMonto(){
    return calcularCostoRepuestos();
  }
  
}

Reparacion

public class Reparacion{
  private String descripcion;
  private Integer cantHoras;
  private List<Empleado> empleados;

  public Reparacion(String patente, String descripcion, List<Repuesto> repuestos, List<Empleado> empleados){
      super(patente, repuestos)
      this.descripcion = descripcion;
      this.empleados = empleados;
    }

    public double calcularCostoEmpleado(){
    return this.empleados.Stream()
      .map(empleado -> empleado.calcularCostoHora(this.cantHoras))
      .sum();
  }

  public int calcularIncremento(){return 0.1;};
  public double calcularMonto(){
    return calcularCostoEmpleado() + calcularCostoRepuestos();
  }
  
  
}

Factura

public class Factura{
  private LocalDate fecha;
  private String patente; 
  private double montoFinal; 
  private Integer descuento;

  public void Factura(fLocalDate fecha, String patente, double montoFinal, int descuento){
    this.fecha = fecha;
    this.patente = patente;
    this.montoFinal = montoFinal;
    this.descuento = descuento;
  }
  //Generar getter y setters :D

}

Test

Parcial Objetos2