package factura40;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
import factura40.CTipoFactor;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"concepto"})
public class Conceptos implements Serializable {

    @XmlElement(name = "cfdi:Concepto", required = true)
    protected List<Conceptos.Concepto> concepto;

    public List<Conceptos.Concepto> getConcepto() {
        if (concepto == null) {
            concepto = new ArrayList<Conceptos.Concepto>();
        }
        return this.concepto;
    }

    public void setConcepto(Conceptos.Concepto concepto) {
        getConcepto().add(concepto);
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {"impuestos", "aCuentaTerceros",
        "informacionAduanera", "cuentaPredial", "complementoConcepto", "parte"})
    public static class Concepto implements Serializable {

        @XmlElement(name = "cfdi:Impuestos")
        protected Conceptos.Concepto.Impuestos impuestos;
        @XmlElement(name = "ACuentaTerceros")
        protected Conceptos.Concepto.ACuentaTerceros aCuentaTerceros;
        @XmlElement(name = "InformacionAduanera")
        protected List<Conceptos.Concepto.InformacionAduanera> informacionAduanera;
        @XmlElement(name = "CuentaPredial")
        protected List<Conceptos.Concepto.CuentaPredial> cuentaPredial;
        @XmlElement(name = "ComplementoConcepto")
        protected Conceptos.Concepto.ComplementoConcepto complementoConcepto;
        @XmlElement(name = "Parte")
        protected List<Conceptos.Concepto.Parte> parte;
        @XmlAttribute(name = "ClaveProdServ", required = true)
        protected String claveProdServ;
        @XmlAttribute(name = "NoIdentificacion")
        protected String noIdentificacion;
        @XmlAttribute(name = "Cantidad", required = true)
        protected double cantidad;
        @XmlAttribute(name = "ClaveUnidad", required = true)
        protected String claveUnidad;
        @XmlAttribute(name = "Unidad")
        protected String unidad;
        @XmlAttribute(name = "Descripcion", required = true)
        protected String descripcion;
        @XmlAttribute(name = "ValorUnitario", required = true)
        protected String valorUnitario;
        @XmlAttribute(name = "Importe", required = true)
        protected double importe;
        @XmlAttribute(name = "Descuento")
        protected double descuento;
        @XmlAttribute(name = "ObjetoImp", required = true)
        protected String objetoImp;

        public void setImpuestos(Conceptos.Concepto.Impuestos value) {
            this.impuestos = value;
        }

        public Conceptos.Concepto.ACuentaTerceros getACuentaTerceros() {
            return aCuentaTerceros;
        }

        public void setACuentaTerceros(Conceptos.Concepto.ACuentaTerceros value) {
            this.aCuentaTerceros = value;
        }

        public List<Conceptos.Concepto.InformacionAduanera> getInformacionAduanera() {
            if (informacionAduanera == null) {
                informacionAduanera = new ArrayList<Conceptos.Concepto.InformacionAduanera>();
            }
            return this.informacionAduanera;
        }

        public List<Conceptos.Concepto.CuentaPredial> getCuentaPredial() {
            if (cuentaPredial == null) {
                cuentaPredial = new ArrayList<Conceptos.Concepto.CuentaPredial>();
            }
            return this.cuentaPredial;
        }

        public Conceptos.Concepto.ComplementoConcepto getComplementoConcepto() {
            return complementoConcepto;
        }

        public void setComplementoConcepto(
                Conceptos.Concepto.ComplementoConcepto value) {
            this.complementoConcepto = value;
        }

        public List<Conceptos.Concepto.Parte> getParte() {
            if (parte == null) {
                parte = new ArrayList<Conceptos.Concepto.Parte>();
            }
            return this.parte;
        }

        public String getClaveProdServ() {
            return claveProdServ;
        }

        public void setClaveProdServ(String value) {
            this.claveProdServ = value;
        }

        public String getNoIdentificacion() {
            return noIdentificacion;
        }

        public void setNoIdentificacion(String value) {
            this.noIdentificacion = value;
        }

        public double getCantidad() {
            return cantidad;
        }

        public void setCantidad(double value) {
            this.cantidad = value;
        }

        public String getClaveUnidad() {
            return claveUnidad;
        }

        public void setClaveUnidad(String value) {
            this.claveUnidad = value;
        }

        public String getUnidad() {
            return unidad;
        }

        public void setUnidad(String value) {
            this.unidad = value;
        }

        public String getDescripcion() {
            return descripcion;
        }

        public void setDescripcion(String value) {
            this.descripcion = value;
        }

        public String getValorUnitario() {
            return valorUnitario;
        }

        public void setValorUnitario(String value) {
            this.valorUnitario = value;
        }

        public double getImporte() {
            return importe;
        }

        public void setImporte(double value) {
            this.importe = value;
        }

        public double getDescuento() {
            return descuento;
        }

        public void setDescuento(double value) {
            this.descuento = value;
        }

        public String getObjetoImp() {
            return objetoImp;
        }

        public void setObjetoImp(String value) {
            this.objetoImp = value;
        }

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "")
        public static class ACuentaTerceros implements Serializable {

            @XmlAttribute(name = "RfcACuentaTerceros", required = true)
            protected String rfcACuentaTerceros;
            @XmlAttribute(name = "NombreACuentaTerceros", required = true)
            protected String nombreACuentaTerceros;
            @XmlAttribute(name = "RegimenFiscalACuentaTerceros", required = true)
            protected String regimenFiscalACuentaTerceros;
            @XmlAttribute(name = "DomicilioFiscalACuentaTerceros", required = true)
            protected String domicilioFiscalACuentaTerceros;

            public String getRfcACuentaTerceros() {
                return rfcACuentaTerceros;
            }

            public void setRfcACuentaTerceros(String value) {
                this.rfcACuentaTerceros = value;
            }

            public String getNombreACuentaTerceros() {
                return nombreACuentaTerceros;
            }

            public void setNombreACuentaTerceros(String value) {
                this.nombreACuentaTerceros = value;
            }

            public String getRegimenFiscalACuentaTerceros() {
                return regimenFiscalACuentaTerceros;
            }

            public void setRegimenFiscalACuentaTerceros(String value) {
                this.regimenFiscalACuentaTerceros = value;
            }

            public String getDomicilioFiscalACuentaTerceros() {
                return domicilioFiscalACuentaTerceros;
            }

            public void setDomicilioFiscalACuentaTerceros(String value) {
                this.domicilioFiscalACuentaTerceros = value;
            }

        }

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {"any"})
        public static class ComplementoConcepto implements Serializable {

            @XmlAnyElement(lax = true)
            protected List<Object> any;

            public List<Object> getAny() {
                if (any == null) {
                    any = new ArrayList<Object>();
                }
                return this.any;
            }

        }

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "")
        public static class CuentaPredial implements Serializable {

            @XmlAttribute(name = "Numero", required = true)
            protected String numero;

            public String getNumero() {
                return numero;
            }

            public void setNumero(String value) {
                this.numero = value;
            }

        }

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {"traslados", "retenciones"})
        public static class Impuestos implements Serializable {

            @XmlElement(name = "cfdi:Traslados")
            protected Conceptos.Concepto.Impuestos.Traslados traslados;
            @XmlElement(name = "Retenciones")
            protected Conceptos.Concepto.Impuestos.Retenciones retenciones;

            public void setTraslados(Conceptos.Concepto.Impuestos.Traslados value) {
                this.traslados = value;
            }

            public void setRetenciones(Conceptos.Concepto.Impuestos.Retenciones value) {
                this.retenciones = value;
            }

            @XmlAccessorType(XmlAccessType.FIELD)
            @XmlType(name = "", propOrder = {"retencion"})
            public static class Retenciones implements Serializable {

                @XmlElement(name = "Retencion", required = true)
                protected List<Conceptos.Concepto.Impuestos.Retenciones.Retencion> retencion;

                @XmlAccessorType(XmlAccessType.FIELD)
                @XmlType(name = "")
                public static class Retencion implements Serializable {

                    @XmlAttribute(name = "Base", required = true)
                    protected double base;
                    @XmlAttribute(name = "Impuesto", required = true)
                    protected String impuesto;
                    @XmlAttribute(name = "TipoFactor", required = true)
                    protected CTipoFactor tipoFactor;
                    @XmlAttribute(name = "TasaOCuota", required = true)
                    protected double tasaOCuota;
                    @XmlAttribute(name = "Importe", required = true)
                    protected double importe;

                    public double getBase() {
                        return base;
                    }

                    public void setBase(double value) {
                        this.base = value;
                    }

                    public String getImpuesto() {
                        return impuesto;
                    }

                    public void setImpuesto(String value) {
                        this.impuesto = value;
                    }

                    public CTipoFactor getTipoFactor() {
                        return tipoFactor;
                    }

                    public void setTipoFactor(CTipoFactor value) {
                        this.tipoFactor = value;
                    }

                    public double getTasaOCuota() {
                        return tasaOCuota;
                    }

                    public void setTasaOCuota(double value) {
                        this.tasaOCuota = value;
                    }

                    public double getImporte() {
                        return importe;
                    }

                    public void setImporte(double value) {
                        this.importe = value;
                    }

                }

            }

            @XmlAccessorType(XmlAccessType.FIELD)
            @XmlType(name = "", propOrder = {"traslado"})
            public static class Traslados implements Serializable {

                @XmlElement(name = "cfdi:Traslado", required = true)
                protected List<Conceptos.Concepto.Impuestos.Traslados.Traslado> traslado;

                public List<Conceptos.Concepto.Impuestos.Traslados.Traslado> getTraslado() {
                    if (traslado == null) {
                        traslado = new ArrayList<Conceptos.Concepto.Impuestos.Traslados.Traslado>();
                    }
                    return this.traslado;
                }

                public int getSizeTraslado() {
                    return getTraslado().size();
                }
                
                public Conceptos.Concepto.Impuestos.Traslados.Traslado getTrasladoEnLista(Integer valor){
                    return getTraslado().get(valor);
                }

                public void setTranslado(Conceptos.Concepto.Impuestos.Traslados.Traslado traslado) {
                    getTraslado().add(traslado);
                }

                @XmlAccessorType(XmlAccessType.FIELD)
                @XmlType(name = "")
                public static class Traslado implements Serializable {

                    @XmlAttribute(name = "Base", required = true)
                    protected String base;
                    @XmlAttribute(name = "Impuesto")
                    protected String impuesto;
                    @XmlAttribute(name = "TipoFactor", required = true)
                    protected CTipoFactor tipoFactor;
                    @XmlAttribute(name = "TasaOCuota")
                    protected String tasaOCuota;
                    @XmlAttribute(name = "Importe")
                    protected String importe;

                    public String getBase() {
                        return base;
                    }

                    public void setBase(String value) {
                        this.base = value;
                    }

                    public String getImpuesto() {
                        return impuesto;
                    }

                    public void setImpuesto(String value) {
                        this.impuesto = value;
                    }

                    public CTipoFactor getTipoFactor() {
                        return tipoFactor;
                    }

                    public void setTipoFactor(CTipoFactor value) {
                        this.tipoFactor = value;
                    }

                    public String getTasaOCuota() {
                        return tasaOCuota;
                    }

                    public void setTasaOCuota(String value) {
                        this.tasaOCuota = value;
                    }

                    public String getImporte() {
                        return importe;
                    }

                    public void setImporte(String value) {
                        this.importe = value;
                    }

                }

            }

        }

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "")
        public static class InformacionAduanera implements Serializable {

            @XmlAttribute(name = "NumeroPedimento", required = true)
            protected String numeroPedimento;

            public String getNumeroPedimento() {
                return numeroPedimento;
            }

            public void setNumeroPedimento(String value) {
                this.numeroPedimento = value;
            }

        }

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {"informacionAduanera"})
        public static class Parte implements Serializable {

            @XmlElement(name = "InformacionAduanera")
            protected List<Conceptos.Concepto.Parte.InformacionAduanera> informacionAduanera;
            @XmlAttribute(name = "ClaveProdServ", required = true)
            protected String claveProdServ;
            @XmlAttribute(name = "NoIdentificacion")
            protected String noIdentificacion;
            @XmlAttribute(name = "Cantidad", required = true)
            protected double cantidad;
            @XmlAttribute(name = "Unidad")
            protected String unidad;
            @XmlAttribute(name = "Descripcion", required = true)
            protected String descripcion;
            @XmlAttribute(name = "ValorUnitario")
            protected double valorUnitario;
            @XmlAttribute(name = "Importe")
            protected double importe;

            public List<Conceptos.Concepto.Parte.InformacionAduanera> getInformacionAduanera() {
                if (informacionAduanera == null) {
                    informacionAduanera = new ArrayList<Conceptos.Concepto.Parte.InformacionAduanera>();
                }
                return this.informacionAduanera;
            }

            public String getClaveProdServ() {
                return claveProdServ;
            }

            public void setClaveProdServ(String value) {
                this.claveProdServ = value;
            }

            public String getNoIdentificacion() {
                return noIdentificacion;
            }

            public void setNoIdentificacion(String value) {
                this.noIdentificacion = value;
            }

            public double getCantidad() {
                return cantidad;
            }

            public void setCantidad(double value) {
                this.cantidad = value;
            }

            public String getUnidad() {
                return unidad;
            }

            public void setUnidad(String value) {
                this.unidad = value;
            }

            public String getDescripcion() {
                return descripcion;
            }

            public void setDescripcion(String value) {
                this.descripcion = value;
            }

            public double getValorUnitario() {
                return valorUnitario;
            }

            public void setValorUnitario(double value) {
                this.valorUnitario = value;
            }

            public double getImporte() {
                return importe;
            }

            public void setImporte(double value) {
                this.importe = value;
            }

            @XmlAccessorType(XmlAccessType.FIELD)
            @XmlType(name = "")
            public static class InformacionAduanera implements Serializable {

                @XmlAttribute(name = "NumeroPedimento", required = true)
                protected String numeroPedimento;

                public String getNumeroPedimento() {
                    return numeroPedimento;
                }

                public void setNumeroPedimento(String value) {
                    this.numeroPedimento = value;
                }

            }

        }

    }

}
