package factura40;

import java.io.Serializable;
import java.math.BigDecimal;
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.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"informacionGlobal", "cfdiRelacionados",
    "emisor", "receptor", "conceptos", "impuestos", "complemento", "addenda"})
@XmlRootElement(name = "cfdi:Comprobante")
public class ComplementoPago40 implements Cloneable, Serializable {

    //Se crean los cabezaces del XML
    @XmlAttribute(name = "xmlns:cfdi")
    protected String xmlnsCfdi;
    @XmlAttribute(name = "xmlns:xsi")
    protected String xmlnsXsi;
    @XmlAttribute(name = "xsi:schemaLocation")
    protected String xsiSchemaLocation;
    @XmlAttribute(name = "xmlns:pago20")
    protected String xmlnsPago20;
    //Se termina la creacion de los cabezales XML
    private static final long serialVersionUID = 1L;
    @XmlElement(name = "cfdi:InformacionGlobal")
    protected ComplementoPago40.InformacionGlobal informacionGlobal;
    @XmlElement(name = "cfdi:CfdiRelacionados")
    protected List<ComplementoPago40.CfdiRelacionados> cfdiRelacionados;
    @XmlElement(name = "cfdi:Emisor", required = true)
    protected ComplementoPago40.Emisor emisor;
    @XmlElement(name = "cfdi:Receptor", required = true)
    protected ComplementoPago40.Receptor receptor;
    @XmlElement(name = "cfdi:Conceptos", required = true)
    protected ConceptosComplemento conceptos;
    @XmlElement(name = "cfdi:Impuestos")
    protected ComplementoPago40.Impuestos impuestos;
    @XmlElement(name = "cfdi:Complemento", required = true)
    protected ComplementoPago40.Complemento complemento;
    @XmlElement(name = "cfdi:Addenda")
    protected ComplementoPago40.Addenda addenda;
    @XmlAttribute(name = "Version", required = true)
    protected String version;
    @XmlAttribute(name = "Serie")
    protected String serie;
    @XmlAttribute(name = "Folio")
    protected String folio;
    @XmlAttribute(name = "Fecha", required = true)
    protected String fecha;
    @XmlAttribute(name = "Sello", required = true)
    protected String sello;
    @XmlAttribute(name = "FormaPago")
    protected String formaPago;
    @XmlAttribute(name = "NoCertificado", required = true)
    protected String noCertificado;
    @XmlAttribute(name = "Certificado", required = true)
    protected String certificado;
    @XmlAttribute(name = "CondicionesDePago")
    protected String condicionesDePago;
    @XmlAttribute(name = "SubTotal", required = true)
    protected String subTotal;
    @XmlAttribute(name = "Moneda", required = true)
    protected CMoneda moneda;
    @XmlAttribute(name = "Total", required = true)
    protected String total;
    @XmlAttribute(name = "TipoDeComprobante", required = true)
    protected CTipoDeComprobante tipoDeComprobante;
    @XmlAttribute(name = "Exportacion", required = true)
    protected String exportacion;
    @XmlAttribute(name = "MetodoPago")
    protected CMetodoPago metodoPago;
    @XmlAttribute(name = "LugarExpedicion", required = true)
    protected String lugarExpedicion;
    @XmlAttribute(name = "Confirmacion")
    protected String confirmacion;

    public ComplementoPago40() {
    }

    public String getXmlnsCfdi() {
        return xmlnsCfdi;
    }

    public void setXmlnsCfdi(String xmlnsCfdi) {
        this.xmlnsCfdi = xmlnsCfdi;
    }

    public String getXmlnsXsi() {
        return xmlnsXsi;
    }

    public void setXmlnsXsi(String xmlnsXsi) {
        this.xmlnsXsi = xmlnsXsi;
    }

    public String getXsiSchemaLocation() {
        return xsiSchemaLocation;
    }

    public void setXsiSchemaLocation(String xsiSchemaLocation) {
        this.xsiSchemaLocation = xsiSchemaLocation;
    }

    public ComplementoPago40.InformacionGlobal getInformacionGlobal() {
        return informacionGlobal;
    }

    public void setInformacionGlobal(ComplementoPago40.InformacionGlobal value) {
        this.informacionGlobal = value;
    }

    public List<ComplementoPago40.CfdiRelacionados> getCfdiRelacionados() {
        if (cfdiRelacionados == null) {
            cfdiRelacionados = new ArrayList<ComplementoPago40.CfdiRelacionados>();
        }
        return this.cfdiRelacionados;
    }

    public ComplementoPago40.Emisor getEmisor() {
        return emisor;
    }

    public void setEmisor(ComplementoPago40.Emisor value) {
        this.emisor = value;
    }

    public ComplementoPago40.Receptor getReceptor() {
        return receptor;
    }

    public void setReceptor(ComplementoPago40.Receptor value) {
        this.receptor = value;
    }

    public ConceptosComplemento getConceptos() {
        return conceptos;
    }

    public void setConceptos(ConceptosComplemento value) {
        this.conceptos = value;
    }

    public ComplementoPago40.Impuestos getImpuestos() {
        return impuestos;
    }

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

    public ComplementoPago40.Complemento getComplemento() {
        return complemento;
    }

    public void setComplemento(ComplementoPago40.Complemento value) {
        this.complemento = value;
    }

    public ComplementoPago40.Addenda getAddenda() {
        return addenda;
    }

    public void setAddenda(ComplementoPago40.Addenda value) {
        this.addenda = value;
    }

    public String getVersion() {
        if (version == null) {
            return "4.0";
        } else {
            return version;
        }
    }

    public void setVersion(String value) {
        this.version = value;
    }

    public String getSerie() {
        return serie == null ? "" : serie;
    }

    public void setSerie(String value) {
        this.serie = value;
    }

    public String getFolio() {
        return folio == null ? "" : folio;
    }

    public void setFolio(String value) {
        this.folio = value;
    }

    public String getFechaComprobante() {
        return fecha;
    }

    public void setFecha(String value) {
        this.fecha = value;
    }

    public String getSello() {
        return sello == null ? "" : sello;
    }

    public void setSello(String value) {
        this.sello = value;
    }

    public String getFormaPago() {
        return formaPago == null ? "" : formaPago;
    }

    public void setFormaPago(String value) {
        this.formaPago = value;
    }

    public String getNoCertificado() {
        return noCertificado == null ? "" : noCertificado;
    }

    public void setNoCertificado(String value) {
        this.noCertificado = value;
    }

    public String getCertificado() {
        return certificado == null ? "" : certificado;
    }

    public void setCertificado(String value) {
        this.certificado = value;
    }

    public String getCondicionesDePago() {
        return condicionesDePago == null ? "" : condicionesDePago;
    }

    public void setCondicionesDePago(String value) {
        this.condicionesDePago = value;
    }

    public String getSubTotal() {
        return subTotal;
    }

    public void setSubTotal(String value) {
        this.subTotal = value;
    }

    public CMoneda getMonedaComprobante() {
        return moneda;
    }

    public void setMonedaComprobante(CMoneda value) {
        this.moneda = value;
    }
    public String getTotal() {
        return total;
    }

    public void setTotal(String value) {
        this.total = value;
    }

    public CTipoDeComprobante getTipoDeComprobante() {
        return tipoDeComprobante;
    }

    public void setTipoDeComprobante(CTipoDeComprobante value) {
        this.tipoDeComprobante = value;
    }

    public String getExportacion() {
        return exportacion;
    }

    public void setExportacion(String value) {
        this.exportacion = value;
    }

    public CMetodoPago getMetodoPago() {
        return metodoPago;
    }

    public void setMetodoPago(CMetodoPago value) {
        this.metodoPago = value;
    }

    public String getLugarExpedicion() {
        return lugarExpedicion == null ? "" : lugarExpedicion;
    }

    public void setLugarExpedicion(String value) {
        this.lugarExpedicion = value;
    }

    public String getConfirmacion() {
        return confirmacion == null ? "" : confirmacion;
    }

    public void setConfirmacion(String value) {
        this.confirmacion = value;
    }

    public String getXmlnsPago20() {
        return xmlnsPago20;
    }

    public void setXmlnsPago20(String xmlnsPago20) {
        this.xmlnsPago20 = xmlnsPago20;
    }

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

        private static final long serialVersionUID = 1L;
        @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 = "", propOrder = {"cfdiRelacionado"})
    public static class CfdiRelacionados implements Serializable {

        private static final long serialVersionUID = 1L;
        @XmlElement(name = "CfdiRelacionado", required = true)
        protected List<ComplementoPago40.CfdiRelacionados.CfdiRelacionado> cfdiRelacionado;
        @XmlAttribute(name = "TipoRelacion", required = true)
        protected String tipoRelacion;

        public List<ComplementoPago40.CfdiRelacionados.CfdiRelacionado> getCfdiRelacionado() {
            if (cfdiRelacionado == null) {
                cfdiRelacionado = new ArrayList<ComplementoPago40.CfdiRelacionados.CfdiRelacionado>();
            }
            return this.cfdiRelacionado;
        }

        public String getTipoRelacion() {
            return tipoRelacion == null ? "" : tipoRelacion;
        }

        public void setTipoRelacion(String value) {
            this.tipoRelacion = value;
        }

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

            private static final long serialVersionUID = 1L;
            @XmlAttribute(name = "UUID", required = true)
            protected String uuid;

            public String getUUID() {
                return uuid == null ? "" : uuid;
            }

            public void setUUID(String value) {
                this.uuid = value;
            }

        }

    }

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

        private static final long serialVersionUID = 1L;
        @XmlElement(name = "tfd:TimbreFiscalDigital")
        protected ComplementoPago40.Complemento.TimbreFiscalDigital timbreFiscal;

        @XmlElement(name = "pago20:Pagos")
        protected ComplementoPago40.Complemento.Pagos pagos;

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

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

        public TimbreFiscalDigital getTimbreFiscal() {
            return timbreFiscal;
        }

        public void setTimbreFiscal(TimbreFiscalDigital timbreFiscal) {
            this.timbreFiscal = timbreFiscal;
        }

        public Pagos getPagos() {
            return pagos;
        }

        public void setPagos(Pagos pagos) {
            this.pagos = pagos;
        }
        
        
        

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

            @XmlAttribute(name = "xmlns:tfd", required = true)
            protected String xmlnsFtd;
            @XmlAttribute(name = "xsi:schemaLocation", required = true)
            protected String xsiSchemaLocation;
            @XmlAttribute(name = "Version", required = true)
            protected String version;
            @XmlAttribute(name = "UUID")
            protected String uuid;
            @XmlAttribute(name = "FechaTimbrado")
            protected String fechaTimbrado;
            @XmlAttribute(name = "RfcProvCertif", required = true)
            protected String rfcProvCertif;
            @XmlAttribute(name = "SelloCFD", required = true)
            protected String selloCFD;
            @XmlAttribute(name = "NoCertificadoSAT", required = true)
            protected String noCertificadoSAT;
            @XmlAttribute(name = "SelloSAT")
            protected String selloSAT;

            public String getXmlnsFtd() {
                return xmlnsFtd;
            }

            public void setXmlnsFtd(String xmlnsFtd) {
                this.xmlnsFtd = xmlnsFtd;
            }

            public String getXsiSchemaLocation() {
                return xsiSchemaLocation;
            }

            public void setXsiSchemaLocation(String xsiSchemaLocation) {
                this.xsiSchemaLocation = xsiSchemaLocation;
            }

            public String getVersion() {
                return version;
            }

            public void setVersion(String version) {
                this.version = version;
            }

            public String getUuid() {
                return uuid;
            }

            public void setUuid(String uuid) {
                this.uuid = uuid;
            }

            public String getRfcProvCertif() {
                return rfcProvCertif;
            }

            public void setRfcProvCertif(String rfcProvCertif) {
                this.rfcProvCertif = rfcProvCertif;
            }

            public String getSelloCFD() {
                return selloCFD;
            }

            public void setSelloCFD(String selloCFD) {
                this.selloCFD = selloCFD;
            }

            public String getNoCertificadoSAT() {
                return noCertificadoSAT;
            }

            public void setNoCertificadoSAT(String noCertificadoSAT) {
                this.noCertificadoSAT = noCertificadoSAT;
            }

            public String getSelloSAT() {
                return selloSAT;
            }

            public void setSelloSAT(String selloSAT) {
                this.selloSAT = selloSAT;
            }

            public String getFechaTimbrado() {
                return fechaTimbrado;
            }

            public void setFechaTimbrado(String fechaTimbrado) {
                this.fechaTimbrado = fechaTimbrado;
            }
        }

        //---------------Fin timbre fiscal
        //Inicio de Pagos
        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {"totales", "pago"})
        public static class Pagos implements Serializable {

            private static final long serialVersionUID = 1L;
            @XmlAttribute(name = "Version", required = true)
            protected String version;

            @XmlElement(name = "pago20:Totales")
            protected ComplementoPago40.Complemento.Pagos.Totales totales;

            @XmlElement(name = "pago20:Pago")
            protected ComplementoPago40.Complemento.Pagos.Pago pago;

            public String getVersion() {
                return version;
            }

            public void setVersion(String version) {
                this.version = version;
            }

            public Totales getTotales() {
                return totales;
            }

            public void setTotales(Totales totales) {
                this.totales = totales;
            }

            public Pago getPago() {
                return pago;
            }

            public void setPago(Pago pago) {
                this.pago = pago;
            }
            
            

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

                private static final long serialVersionUID = 1L;

                @XmlAttribute(name = "TotalTrasladosBaseIVA16")
                protected String TotalTrasladosBaseIVA16;

                @XmlAttribute(name = "TotalTrasladosImpuestoIVA16")
                protected String TotalTrasladosImpuestoIVA16;

                @XmlAttribute(name = "MontoTotalPagos")
                protected String MontoTotalPagos;

                public String getTotalTrasladosBaseIVA16() {
                    return TotalTrasladosBaseIVA16;
                }

                public void setTotalTrasladosBaseIVA16(String TotalTrasladosBaseIVA16) {
                    this.TotalTrasladosBaseIVA16 = TotalTrasladosBaseIVA16;
                }

                public String getTotalTrasladosImpuestoIVA16() {
                    return TotalTrasladosImpuestoIVA16;
                }

                public void setTotalTrasladosImpuestoIVA16(String TotalTrasladosImpuestoIVA16) {
                    this.TotalTrasladosImpuestoIVA16 = TotalTrasladosImpuestoIVA16;
                }

                public String getMontoTotalPagos() {
                    return MontoTotalPagos;
                }

                public void setMontoTotalPagos(String MontoTotalPagos) {
                    this.MontoTotalPagos = MontoTotalPagos;
                }
                
                
            }

            //Termina Totales
            //Empieza Pago
            @XmlAccessorType(XmlAccessType.FIELD)
            @XmlType(name = "", propOrder = {"documentoRelacionado", "impuestosP"})
            public static class Pago implements Serializable {

                private static final long serialVersionUID = 1L;

                @XmlAttribute(name = "FechaPago")
                protected String fechaPago;
                @XmlAttribute(name ="NumParcialidad")
                protected String mumParcialidad;
                @XmlAttribute(name = "FormaDePagoP")
                protected String formaDePagoP;
                @XmlAttribute(name = "MonedaP")
                protected CMoneda monedaP;
                @XmlAttribute(name = "TipoCambioP")
                protected String tipoCambioP;
                @XmlAttribute(name = "Monto")
                protected String monto;

                @XmlElement(name = "pago20:DoctoRelacionado")
                protected List<ComplementoPago40.Complemento.Pagos.Pago.DocumentoRelacionado> documentoRelacionado;
                
                @XmlElement(name ="pago20:ImpuestosP")
                protected ComplementoPago40.Complemento.Pagos.Pago.ImpuestosP impuestosP;
                
                public String getFechaPago() {
                    return fechaPago;
                }

                public void setFechaPago(String fechaPago) {
                    this.fechaPago = fechaPago;
                }

                public String getMumParcialidad() {
                    return mumParcialidad;
                }

                public void setMumParcialidad(String mumParcialidad) {
                    this.mumParcialidad = mumParcialidad;
                }

                public String getFormaDePagoP() {
                    return formaDePagoP;
                }

                public void setFormaDePagoP(String formaDePagoP) {
                    this.formaDePagoP = formaDePagoP;
                }

                public CMoneda getMonedaP() {
                    return monedaP;
                }

                public void setMonedaP(CMoneda monedaP) {
                    this.monedaP = monedaP;
                }

                public String getTipoCambioP() {
                    return tipoCambioP;
                }

                public void setTipoCambioP(String tipoCambioP) {
                    this.tipoCambioP = tipoCambioP;
                }

                public String getMonto() {
                    return monto;
                }

                public void setMonto(String monto) {
                    this.monto = monto;
                }

                public List<DocumentoRelacionado> getDocumentoRelacionado() {
                    return documentoRelacionado;
                }

                public void setDocumentoRelacionado(List<DocumentoRelacionado> documentoRelacionado) {
                    this.documentoRelacionado = documentoRelacionado;
                }
                
                

                public ImpuestosP getImpuestosP() {
                    return impuestosP;
                }

                public void setImpuestosP(ImpuestosP impuestosP) {
                    this.impuestosP = impuestosP;
                }
                
                
                
                //Empieza ImpuestosP
                @XmlAccessorType(XmlAccessType.FIELD)
                @XmlType(name = "", propOrder = {"trasladosP"})
                public static class ImpuestosP implements Serializable{
                    
                    private static final long serialVersionUID = 1L;
                    @XmlElement(name ="pago20:TrasladosP")
                    protected ComplementoPago40.Complemento.Pagos.Pago.ImpuestosP.TrasladosP trasladosP;

                    public TrasladosP getTrasladosP() {
                        return trasladosP;
                    }

                    public void setTrasladosP(TrasladosP trasladosP) {
                        this.trasladosP = trasladosP;
                    }
                    
                    
                    
                @XmlAccessorType(XmlAccessType.FIELD)
                @XmlType(name = "", propOrder = {"listaTraslados"})
                public static class TrasladosP implements Serializable{
                    
                    private static final long serialVersionUID = 1L;
                    @XmlElement(name ="pago20:TrasladoP")
                    protected List<ComplementoPago40.Complemento.Pagos.Pago.ImpuestosP.TrasladosP.TrasladoP> listaTraslados;

                        public List<TrasladoP> getListaTraslados() {
                            return listaTraslados;
                        }

                        public void setListaTraslados(List<TrasladoP> listaTraslados) {
                            this.listaTraslados = listaTraslados;
                        }
                    
                    
                    
                    //Empieza TrasladoP
                    @XmlAccessorType(XmlAccessType.FIELD)
                    @XmlType(name = "")
                    public static class TrasladoP implements Serializable{
                        
                         private static final long serialVersionUID = 1L;
                         @XmlAttribute(name ="BaseP")
                         protected String baseP;
                         @XmlAttribute(name ="ImpuestoP")
                         protected String impuestoP;
                         @XmlAttribute(name ="TipoFactorP")
                         protected String tipoFactorP;
                         @XmlAttribute(name ="TasaOCuotaP")
                         protected String tasaOCuotaP;
                         @XmlAttribute(name ="ImporteP")
                         protected String importeP;

                            public String getBaseP() {
                                return baseP;
                            }

                            public void setBaseP(String baseP) {
                                this.baseP = baseP;
                            }

                            public String getImpuestoP() {
                                return impuestoP;
                            }

                            public void setImpuestoP(String impuestoP) {
                                this.impuestoP = impuestoP;
                            }

                            public String getTipoFactorP() {
                                return tipoFactorP;
                            }

                            public void setTipoFactorP(String tipoFactorP) {
                                this.tipoFactorP = tipoFactorP;
                            }

                            public String getTasaOCuotaP() {
                                return tasaOCuotaP;
                            }

                            public void setTasaOCuotaP(String tasaOCuotaP) {
                                this.tasaOCuotaP = tasaOCuotaP;
                            }

                            public String getImporteP() {
                                return importeP;
                            }

                            public void setImporteP(String importeP) {
                                this.importeP = importeP;
                            }
                         
                         
                         
                    }
                }
                
                    
                }
                
                
                //Empieza documentoRelacionado
                @XmlAccessorType(XmlAccessType.FIELD)
                @XmlType(name = "", propOrder = {"impuestosDR"})
                public static class DocumentoRelacionado implements Serializable {

                    private static final long serialVersionUID = 1L;

                    @XmlAttribute(name = "IdDocumento")
                    protected String idDocumento;
                    @XmlAttribute(name = "Folio")
                    protected String folio;
                    @XmlAttribute(name = "MonedaDR")
                    protected CMoneda monedaDR;
                    @XmlAttribute(name = "EquivalenciaDR")
                    protected String equivalenciaDR;
                    @XmlAttribute(name = "NumParcialidad")
                    protected String numParcialidad;
                    @XmlAttribute(name = "ImpSaldoAnt")
                    protected String impSaldoAnt;
                    @XmlAttribute(name = "ImpPagado")
                    protected String impPagado;
                    @XmlAttribute(name = "ImpSaldoInsoluto")
                    protected String impSaldoInsoluto;
                    @XmlAttribute(name = "ObjetoImpDR")
                    protected String objetoImpDR;

                    @XmlElement(name = "pago20:ImpuestosDR")
                    protected ComplementoPago40.Complemento.Pagos.Pago.DocumentoRelacionado.ImpuestosDR impuestosDR;

                    public String getIdDocumento() {
                        return idDocumento;
                    }

                    public void setIdDocumento(String idDocumento) {
                        this.idDocumento = idDocumento;
                    }

                    public String getFolio() {
                        return folio;
                    }

                    public void setFolio(String folio) {
                        this.folio = folio;
                    }

                    public CMoneda getMonedaDR() {
                        return monedaDR;
                    }

                    public void setMonedaDR(CMoneda monedaDR) {
                        this.monedaDR = monedaDR;
                    }

                    public String getEquivalenciaDR() {
                        return equivalenciaDR;
                    }

                    public void setEquivalenciaDR(String equivalenciaDR) {
                        this.equivalenciaDR = equivalenciaDR;
                    }

                    public String getNumParcialidad() {
                        return numParcialidad;
                    }

                    public void setNumParcialidad(String numParcialidad) {
                        this.numParcialidad = numParcialidad;
                    }

                    public String getImpSaldoAnt() {
                        return impSaldoAnt;
                    }

                    public void setImpSaldoAnt(String impSaldoAnt) {
                        this.impSaldoAnt = impSaldoAnt;
                    }

                    public String getImpPagado() {
                        return impPagado;
                    }

                    public void setImpPagado(String impPagado) {
                        this.impPagado = impPagado;
                    }

                    public String getImpSaldoInsoluto() {
                        return impSaldoInsoluto;
                    }

                    public void setImpSaldoInsoluto(String impSaldoInsoluto) {
                        this.impSaldoInsoluto = impSaldoInsoluto;
                    }

                    public String getObjetoImpDR() {
                        return objetoImpDR;
                    }

                    public void setObjetoImpDR(String objetoImpDR) {
                        this.objetoImpDR = objetoImpDR;
                    }

                    public ImpuestosDR getImpuestosDR() {
                        return impuestosDR;
                    }

                    public void setImpuestosDR(ImpuestosDR impuestosDR) {
                        this.impuestosDR = impuestosDR;
                    }

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

                        private static final long serialVersionUID = 1L;

                        @XmlElement(name = "pago20:TrasladosDR")
                        protected ComplementoPago40.Complemento.Pagos.Pago.DocumentoRelacionado.ImpuestosDR.TrasladosDR trasladosDR;

                        public TrasladosDR getTrasladosDR() {
                            return trasladosDR;
                        }

                        public void setTrasladosDR(TrasladosDR trasladosDR) {
                            this.trasladosDR = trasladosDR;
                        }

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

                            private static final long serialVersionUID = 1L;

                            @XmlElement(name = "pago20:TrasladoDR")
                            protected List<ComplementoPago40.Complemento.Pagos.Pago.DocumentoRelacionado.ImpuestosDR.TrasladosDR.TrasladoDR> trasladoDR;

                            public List<TrasladoDR> getTrasladoDR() {
                                return trasladoDR;
                            }

                            public void setTrasladoDR(List<TrasladoDR> trasladoDR) {
                                this.trasladoDR = trasladoDR;
                            }
                            
                            
                            
                            @XmlAccessorType(XmlAccessType.FIELD)
                            @XmlType(name = "")
                            public static class TrasladoDR{
                                @XmlAttribute(name ="BaseDR")
                                protected String baseDR;
                                @XmlAttribute(name ="ImpuestoDR")
                                protected String impuestoDR;
                                @XmlAttribute(name ="TipoFactorDR")
                                protected String tipoFactorDR;
                                @XmlAttribute(name ="TasaOCuotaDR")
                                protected String tasaOCuotaDR;
                                @XmlAttribute(name ="ImporteDR")
                                protected String importeDR;

                                public String getBaseDR() {
                                    return baseDR;
                                }

                                public void setBaseDR(String baseDR) {
                                    this.baseDR = baseDR;
                                }

                                public String getImpuestoDR() {
                                    return impuestoDR;
                                }

                                public void setImpuestoDR(String impuestoDR) {
                                    this.impuestoDR = impuestoDR;
                                }

                                public String getTipoFactorDR() {
                                    return tipoFactorDR;
                                }

                                public void setTipoFactorDR(String tipoFactorDR) {
                                    this.tipoFactorDR = tipoFactorDR;
                                }

                                public String getTasaOCuotaDR() {
                                    return tasaOCuotaDR;
                                }

                                public void setTasaOCuotaDR(String tasaOCuotaDR) {
                                    this.tasaOCuotaDR = tasaOCuotaDR;
                                }

                                public String getImporteDR() {
                                    return importeDR;
                                }

                                public void setImporteDR(String importeDR) {
                                    this.importeDR = importeDR;
                                }
                                
                                
                                
                            }
                        }
                    }

                }
            }

        }

    }

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

        private static final long serialVersionUID = 1L;
        @XmlAttribute(name = "Rfc", required = true)
        protected String rfc;
        @XmlAttribute(name = "Nombre", required = true)
        protected String nombre;
        @XmlAttribute(name = "RegimenFiscal", required = true)
        protected String regimenFiscal;
        @XmlAttribute(name = "FacAtrAdquirente")
        protected String facAtrAdquirente;

        public String getRfc() {
            return rfc == null ? "" : rfc;
        }

        public void setRfc(String value) {
            this.rfc = value;
        }

        public String getNombre() {
            return nombre == null ? "" : nombre;
        }

        public void setNombre(String value) {
            this.nombre = value;
        }

        public String getRegimenFiscal() {
            return regimenFiscal == null ? "" : regimenFiscal;
        }

        public void setRegimenFiscal(String value) {
            this.regimenFiscal = value;
        }

        public String getFacAtrAdquirente() {
            return facAtrAdquirente == null ? "" : facAtrAdquirente;
        }

        public void setFacAtrAdquirente(String value) {
            this.facAtrAdquirente = value;
        }

    }

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

        private static final long serialVersionUID = 1L;
        @XmlElement(name = "Retenciones")
        protected ComplementoPago40.Impuestos.Retenciones retenciones;
        @XmlElement(name = "cfdi:Traslados")
        protected ComplementoPago40.Impuestos.Traslados traslados;
        @XmlAttribute(name = "TotalImpuestosRetenidos")
        protected BigDecimal totalImpuestosRetenidos;
        @XmlAttribute(name = "TotalImpuestosTrasladados")
        protected BigDecimal totalImpuestosTrasladados;

        public ComplementoPago40.Impuestos.Retenciones getRetenciones() {
            return retenciones;
        }

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

        public ComplementoPago40.Impuestos.Traslados getTraslados() {
            return traslados;
        }

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

        public BigDecimal getTotalImpuestosRetenidos() {
            return totalImpuestosRetenidos;
        }

        public void setTotalImpuestosRetenidos(BigDecimal value) {
            this.totalImpuestosRetenidos = value;
        }

        public BigDecimal getTotalImpuestosTrasladados() {
            return totalImpuestosTrasladados;
        }

        public void setTotalImpuestosTrasladados(BigDecimal value) {
            this.totalImpuestosTrasladados = value;
        }

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

            private static final long serialVersionUID = 1L;
            @XmlElement(name = "Retencion", required = true)
            protected List<ComplementoPago40.Impuestos.Retenciones.Retencion> retencion;

            public List<ComplementoPago40.Impuestos.Retenciones.Retencion> getRetencion() {
                if (retencion == null) {
                    retencion = new ArrayList<ComplementoPago40.Impuestos.Retenciones.Retencion>();
                }
                return this.retencion;
            }

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

                private static final long serialVersionUID = 1L;
                @XmlAttribute(name = "Impuesto", required = true)
                protected String impuesto;
                @XmlAttribute(name = "Importe", required = true)
                protected BigDecimal importe;

                public String getImpuesto() {
                    return impuesto == null ? "" : impuesto;
                }

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

                public BigDecimal getImporte() {
                    return importe;
                }

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

            }

        }

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

            private static final long serialVersionUID = 1L;
            @XmlElement(name = "cfdi:Traslado", required = true)
            protected List<ComplementoPago40.Impuestos.Traslados.Traslado> traslado;

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

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

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

                private static final long serialVersionUID = 1L;
                @XmlAttribute(name = "Base", required = true)
                protected BigDecimal base;
                @XmlAttribute(name = "Impuesto", required = true)
                protected String impuesto;
                @XmlAttribute(name = "TipoFactor", required = true)
                protected CTipoFactor tipoFactor;
                @XmlAttribute(name = "TasaOCuota", required = true)
                protected BigDecimal tasaOCuota;
                @XmlAttribute(name = "Importe", required = true)
                protected BigDecimal importe;

                public BigDecimal getBase() {
                    return base;
                }

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

                public String getImpuesto() {
                    return impuesto == null ? "" : impuesto;
                }

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

                public CTipoFactor getTipoFactor() {
                    return tipoFactor;
                }

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

                public BigDecimal getTasaOCuota() {
                    return tasaOCuota;
                }

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

                public BigDecimal getImporte() {
                    return importe;
                }

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

            }

        }

    }

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

        private static final long serialVersionUID = 1L;
        @XmlAttribute(name = "Periodicidad", required = true)
        protected String periodicidad;
        @XmlAttribute(name = "Meses", required = true)
        protected String meses;
        @XmlAttribute(name = "Año", required = true)
        protected short año;

        public String getPeriodicidad() {
            return periodicidad == null ? "" : periodicidad;
        }

        public void setPeriodicidad(String value) {
            this.periodicidad = value;
        }

        public String getMeses() {
            return meses == null ? "" : meses;
        }

        public void setMeses(String value) {
            this.meses = value;
        }

        public short getAño() {
            return año;
        }

        public void setAño(short value) {
            this.año = value;
        }

    }

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

        private static final long serialVersionUID = 1L;
        @XmlAttribute(name = "Rfc", required = true)
        protected String rfc;
        @XmlAttribute(name = "Nombre", required = true)
        protected String nombre;
        @XmlAttribute(name = "DomicilioFiscalReceptor", required = true)
        protected String domicilioFiscalReceptor;
        @XmlAttribute(name = "ResidenciaFiscal")
        protected CPais residenciaFiscal;
        @XmlAttribute(name = "NumRegIdTrib")
        protected String numRegIdTrib;
        @XmlAttribute(name = "RegimenFiscalReceptor", required = true)
        protected String regimenFiscalReceptor;
        @XmlAttribute(name = "UsoCFDI", required = true)
        protected CUsoCFDI usoCFDI;

        public String getRfc() {
            return rfc == null ? "" : rfc;
        }

        public void setRfc(String value) {
            this.rfc = value;
        }

        public String getNombre() {
            return nombre == null ? "" : nombre;
        }

        public void setNombre(String value) {
            this.nombre = value;
        }

        public String getDomicilioFiscalReceptor() {
            return domicilioFiscalReceptor == null ? "" : domicilioFiscalReceptor;
        }

        public void setDomicilioFiscalReceptor(String value) {
            this.domicilioFiscalReceptor = value;
        }

        public CPais getResidenciaFiscal() {
            return residenciaFiscal;
        }

        public void setResidenciaFiscal(CPais value) {
            this.residenciaFiscal = value;
        }

        public String getNumRegIdTrib() {
            return numRegIdTrib == null ? "" : numRegIdTrib;
        }

        public void setNumRegIdTrib(String value) {
            this.numRegIdTrib = value;
        }

        public String getRegimenFiscalReceptor() {
            return regimenFiscalReceptor == null ? "" : regimenFiscalReceptor;
        }

        public void setRegimenFiscalReceptor(String value) {
            this.regimenFiscalReceptor = value;
        }

        public CUsoCFDI getUsoCFDI() {
            return usoCFDI;
        }

        public void setUsoCFDI(CUsoCFDI value) {
            this.usoCFDI = value;
        }

    }

    public Object clone() {
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {

            e.printStackTrace();
        }
        return clone;
    }

    public void setNeto(String value) {
        this.subTotal = value;
    }

}
