package models; import java.util.Collection; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import play.data.validation.*; import play.db.jpa.Model; @Entity public class Comprobante extends Model { public enum tiposDeComprobantes {FACTURA, RECIBO_HONORARIOS, RECIBO_ARRENDAMIENTO} public tiposDeComprobantes tipo; @Required @Valid @OneToOne(targetEntity = Emisor.class, cascade = CascadeType.ALL) public Emisor emisor; @Required @Valid @OneToOne(targetEntity = Cliente.class, cascade = CascadeType.ALL) public Cliente cliente; @Required @Valid @OneToOne(targetEntity = CBB.class, cascade = CascadeType.ALL) public CBB cbb; public String serie; public Integer folio; @Required @OneToMany(targetEntity = Concepto.class, cascade = CascadeType.ALL) public Collection<Concepto> conceptos; private Double subTotal = 0.00; private Double totalImpuestosRetenidos = 0.00; private Double totalImpuestosTrasladados = 0.00; private Double total; public Comprobante() { } public Comprobante(Emisor emisor, Cliente cliente, Collection<Concepto> conceptos, CBB cbb, String Serie, Integer folio){ this.emisor = emisor; this.cliente = cliente; this.conceptos = conceptos; this.cbb = cbb; this.tipo = tiposDeComprobantes.FACTURA; this.serie = Serie; this.folio = folio; this.subTotal = getSubTotal(); this.totalImpuestosRetenidos = getTotalImpuestosRetenidos(); this.totalImpuestosTrasladados = getTotalImpuestosTrasladados(); this.total = getTotal(); } public Comprobante(Emisor emisor, Cliente cliente, Collection<Concepto> conceptos, CBB cbb, String Serie, Integer folio, tiposDeComprobantes tipo){ this.emisor = emisor; this.cliente = cliente; this.conceptos = conceptos; this.cbb = cbb; this.tipo = tipo; this.serie = Serie; this.folio = folio; this.subTotal = getSubTotal(); this.totalImpuestosRetenidos = getTotalImpuestosRetenidos(); this.totalImpuestosTrasladados = getTotalImpuestosTrasladados(); this.total = getTotal(); } public Double getTotalImpuestosRetenidos(){ // No Implementado return 0.00; } public Double getTotalImpuestosTrasladados(){ Double sumaImpuestosTrasladados = 0.00; for(Concepto concepto : this.conceptos){ sumaImpuestosTrasladados += concepto.getImporteIVATrasladado(); } return sumaImpuestosTrasladados; } public Double getSubTotal(){ Double sumaImportes = 0.0; for(Concepto concepto : this.conceptos ){ sumaImportes += concepto.getImporte(); } return sumaImportes; } public Double getTotal(){ return getSubTotal() + getTotalImpuestosTrasladados() - getTotalImpuestosRetenidos(); } public String getTipoAsString(){ switch(this.tipo){ case FACTURA: return "FACTURA"; case RECIBO_HONORARIOS: return "RECIBO DE HONORARIOS"; case RECIBO_ARRENDAMIENTO: return "RECIBO DE ARRENDAMIENTO"; default: return ""; } } public boolean esValido() throws Exception{ for(Concepto concepto : this.conceptos){ if(!concepto.esValido()) return false; } if (this.emisor.rfc != this.cbb.obtenerRFC()) return false; return (getTotal() > 0 && this.conceptos.size() > 0 && this.cliente.esValido() && this.emisor.esValido() && this.cbb.esValido()); } }