Ejemplo n.º 1
0
        private static Schemasv32.t_InformacionAduanera[] GetInformacionAduanera(IniFileHandler iniHandler, string seccion)
        {
            int cantidadPedimentos = Convert.ToInt32(iniHandler.Requerido(seccion, "cantidadPedimentos"));

            if (cantidadPedimentos == 0)
            {
                return(null);
            }

            Schemasv32.t_InformacionAduanera[] result = new Schemasv32.t_InformacionAduanera[cantidadPedimentos];
            for (int i = 0; i < cantidadPedimentos; i++)
            {
                string pedimentoSection = String.Format("InformacionAduaneranumero{0}", (i + 1));
                string fechaSection     = String.Format("InformacionAduanerafecha{0}", (i + 1));
                string aduanaSection    = String.Format("InformacionAduaneraaduana{0}", (i + 1));

                result[i] = new Schemasv32.t_InformacionAduanera
                {
                    numero = iniHandler.Requerido(seccion, pedimentoSection),
                    fecha  = iniHandler.RequeridoFecha(seccion, fechaSection),
                    aduana = iniHandler.Opcional(seccion, aduanaSection),
                };
            }
            return(result);
        }
Ejemplo n.º 2
0
        Schemasv33modif.ComprobanteConceptoParte[] GetConceptoPartes(IniFileHandler iniHandler, string seccion)
        {
            if (!iniHandler.Existe(seccion, "CantidadPartes"))
            {
                return(null);
            }

            int cantidadPartes = Convert.ToInt32(iniHandler.Requerido(seccion, "CantidadPartes"));

            if (cantidadPartes == 0)
            {
                return(null);
            }

            Schemasv33modif.ComprobanteConceptoParte[] result = new Schemasv33modif.ComprobanteConceptoParte[cantidadPartes];
            for (int i = 0; i < cantidadPartes; i++)
            {
                string parteSection            = string.Format("Parte{0}", (i + 1));
                string claveProdSection        = string.Format("{0}ClaveProdServ", parteSection);
                string noIdentificacionSection = string.Format("{0}NoIdentificacion", parteSection);
                string cantidadSection         = string.Format("{0}Cantidad", parteSection);
                string claveUnidadSection      = string.Format("{0}ClaveUnidad", parteSection);
                string unidadSection           = string.Format("{0}Unidad", parteSection);
                string descripcionSection      = string.Format("{0}Descripcion", parteSection);
                string valorUnitarioSection    = string.Format("{0}ValorUnitario", parteSection);
                string importeSection          = string.Format("{0}Importe", parteSection);

                result[i] = new Schemasv33modif.ComprobanteConceptoParte
                {
                    InformacionAduanera = GetParteInformacionAduanera(iniHandler, seccion, parteSection),
                    ClaveProdServ       = iniHandler.Requerido(seccion, claveProdSection),
                    NoIdentificacion    = iniHandler.Opcional(seccion, noIdentificacionSection),
                    Cantidad            = iniHandler.RequeridoDecimal(seccion, cantidadSection),
                    Unidad                 = iniHandler.Opcional(seccion, unidadSection),
                    Descripcion            = iniHandler.Requerido(seccion, descripcionSection),
                    ValorUnitario          = iniHandler.OpcionalDecimal(seccion, valorUnitarioSection),
                    ValorUnitarioSpecified = iniHandler.Existe(seccion, valorUnitarioSection),
                    Importe                = iniHandler.OpcionalDecimal(seccion, importeSection),
                    ImporteSpecified       = iniHandler.Existe(seccion, importeSection)
                };
            }
            return(result);
        }
Ejemplo n.º 3
0
        private void GeneraComprobante()
        {
            #region Información del comprobante
            _comprobante = new Schemasv33modif.Comprobante
            {
                Version             = "3.3",
                Serie               = _iniFac.Opcional("Generales", "Serie"),
                Folio               = _iniFac.Opcional("Generales", "Folio"),
                Fecha               = _iniFac.RequeridoFecha("Generales", "Fecha"),
                FormaPago           = _iniFac.OpcionalEnum <Schemasv33modif.c_FormaPago>("Generales", "FormaPago"),
                FormaPagoSpecified  = _iniFac.Existe("Generales", "FormaPago"),
                NoCertificado       = _iniFac.Requerido("Generales", "NoCertificado"),
                CondicionesDePago   = _iniFac.Opcional("Generales", "CondicionesDePago"),
                SubTotal            = _iniFac.RequeridoDecimal("Generales", "SubTotal"),
                Descuento           = _iniFac.OpcionalDecimal("Generales", "Descuento"),
                DescuentoSpecified  = _iniFac.Existe("Generales", "Descuento"),
                Moneda              = _iniFac.RequeridoEnum <Schemasv33modif.c_Moneda>("Generales", "Moneda"),
                TipoCambio          = _iniFac.OpcionalDecimal("Generales", "TipoCambio"),
                TipoCambioSpecified = _iniFac.Existe("Generales", "TipoCambio"),
                Total               = _iniFac.RequeridoDecimal("Generales", "Total"),
                TipoDeComprobante   = _iniFac.RequeridoEnum <Schemasv33modif.c_TipoDeComprobante>(
                    "Generales", "TipoDeComprobante"),
                MetodoPago          = _iniFac.OpcionalEnum <Schemasv33modif.c_MetodoPago>("Generales", "MetodoPago"),
                MetodoPagoSpecified = _iniFac.Existe("Generales", "MetodoPago"),
                //LugarExpedicion = _iniFac.RequeridoEnum<Schemasv33modif.c_CodigoPostal>("Generales", "LugarExpedicion"),
                LugarExpedicion = _iniFac.Requerido("Generales", "LugarExpedicion"),
                Confirmacion    = _iniFac.Opcional("Generales", "Confirmacion")
            };
            #endregion

            #region Cfdi Relacionados
            int CantidadCfdiRelacionados = Convert.ToInt32(_iniFac.Requerido("CfdiRelacionados", "CantidadCfdiRelacionados"));
            if (CantidadCfdiRelacionados > 0)
            {
                _comprobante.CfdiRelacionados = new Schemasv33modif.ComprobanteCfdiRelacionados
                {
                    CfdiRelacionado = GetCfdiRelacionados(_iniFac, CantidadCfdiRelacionados),
                    TipoRelacion    = _iniFac.RequeridoEnum <Schemasv33modif.c_TipoRelacion>("CfdiRelacionados", "TipoRelacion")
                };
            }
            #endregion

            #region Emisor
            _comprobante.Emisor = new Schemasv33modif.ComprobanteEmisor
            {
                Rfc           = _iniFac.Requerido("Emisor", "Rfc"),
                Nombre        = _iniFac.Opcional("Emisor", "Nombre"),
                RegimenFiscal = _iniFac.RequeridoEnum <Schemasv33modif.c_RegimenFiscal>("Emisor", "RegimenFiscal")
            };
            #endregion

            #region Receptor
            _comprobante.Receptor = new Schemasv33modif.ComprobanteReceptor
            {
                Rfc                       = _iniFac.Requerido("Receptor", "Rfc"),
                Nombre                    = _iniFac.Opcional("Receptor", "Nombre"),
                ResidenciaFiscal          = _iniFac.OpcionalEnum <Schemasv33modif.c_Pais>("Receptor", "ResidenciaFiscal"), // Requerido si se incluye Compl ComercExt
                ResidenciaFiscalSpecified = _iniFac.Existe("Receptor", "ResidenciaFiscal"),
                NumRegIdTrib              = _iniFac.Opcional("Receptor", "NumRegIdTrib"),                                  // Requerido si se incluye Compl ComercExt
                UsoCFDI                   = _iniFac.RequeridoEnum <Schemasv33modif.c_UsoCFDI>("Receptor", "UsoCFDI")
            };
            #endregion

            #region Conceptos
            int CantidadConceptos =
                Convert.ToInt32(_iniFac.Requerido("Conceptos", "CantidadConceptos"));
            _comprobante.Conceptos = new Schemasv33modif.ComprobanteConcepto[CantidadConceptos];
            for (int i = 0; i < CantidadConceptos; i++)
            {
                string conceptoSection = String.Format("Concepto{0}", (i + 1));
                _comprobante.Conceptos[i] = new Schemasv33modif.ComprobanteConcepto
                {
                    Impuestos           = GetConceptoImpuestos(_iniFac, conceptoSection),
                    InformacionAduanera = GetInformacionAduanera(_iniFac, conceptoSection),
                    Parte = GetConceptoPartes(_iniFac, conceptoSection),
                    //ClaveProdServ = _iniFac.RequeridoEnum<Schemasv33modif.c_ClaveProdServ>(conceptoSection, "ClaveProdServ"),
                    ClaveProdServ      = _iniFac.Requerido(conceptoSection, "ClaveProdServ"),
                    NoIdentificacion   = _iniFac.Opcional(conceptoSection, "NoIdentificacion"),  // CodBarras o SKU o similar
                    Cantidad           = _iniFac.RequeridoDecimal(conceptoSection, "Cantidad"),
                    ClaveUnidad        = _iniFac.RequeridoEnum <Schemasv33modif.c_ClaveUnidad>(conceptoSection, "ClaveUnidad"),
                    Unidad             = _iniFac.Opcional(conceptoSection, "Unidad"),
                    Descripcion        = _iniFac.Requerido(conceptoSection, "Descripcion"),
                    ValorUnitario      = _iniFac.RequeridoDecimal(conceptoSection, "ValorUnitario"),
                    Importe            = _iniFac.RequeridoDecimal(conceptoSection, "Importe"),
                    Descuento          = _iniFac.OpcionalDecimal(conceptoSection, "Descuento"),
                    DescuentoSpecified = _iniFac.Existe(conceptoSection, "Descuento")
                };
            }
            #endregion

            #region Impuestos
            int cantidadTraslados   = Convert.ToInt32(_iniFac.Requerido("Impuestos", "CantidadTraslados"));
            int cantidadRetenciones = Convert.ToInt32(_iniFac.Requerido("Impuestos", "CantidadRetenciones"));
            if (cantidadRetenciones > 0 || cantidadTraslados > 0)
            {
                _comprobante.Impuestos = new Schemasv33modif.ComprobanteImpuestos
                {
                    Retenciones                        = GetImpuestosRetencion(_iniFac, "Impuestos"),
                    Traslados                          = GetImpuestosTraslado(_iniFac, "Impuestos"),
                    TotalImpuestosRetenidos            = _iniFac.OpcionalDecimal("Impuestos", "TotalImpuestosRetenidos"),
                    TotalImpuestosRetenidosSpecified   = _iniFac.Existe("Impuestos", "TotalImpuestosRetenidos"),
                    TotalImpuestosTrasladados          = _iniFac.OpcionalDecimal("Impuestos", "TotalImpuestosTrasladados"),
                    TotalImpuestosTrasladadosSpecified = _iniFac.Existe("Impuestos", "TotalImpuestosTrasladados")
                };
            }
            #endregion
        }
Ejemplo n.º 4
0
        private void GeneraComprobante()
        {
            #region Información del comprobante

            _comprobante = new Schemasv32.Comprobante
            {
                version            = "3.2",
                serie              = _iniFac.Opcional("Generales", "serie"),
                folio              = _iniFac.Opcional("Generales", "folio"),
                fecha              = _iniFac.RequeridoFecha("Generales", "fecha"),
                formaDePago        = _iniFac.Requerido("Generales", "formaDePago"),
                noCertificado      = _iniFac.Requerido("Generales", "noCertificado"),
                condicionesDePago  = _iniFac.Opcional("Generales", "condicionesDePago"),
                subTotal           = _iniFac.RequeridoDecimal("Generales", "subTotal"),
                descuento          = _iniFac.OpcionalDecimal("Generales", "descuento"),
                descuentoSpecified = _iniFac.Existe("Generales", "descuento"),
                motivoDescuento    = null,
                // Opcional
                TipoCambio        = _iniFac.Opcional("Generales", "TipoCambio"),
                Moneda            = _iniFac.Opcional("Generales", "Moneda"),
                total             = _iniFac.RequeridoDecimal("Generales", "total"),
                tipoDeComprobante = _iniFac.RequeridoEnum <Schemasv32.ComprobanteTipoDeComprobante>(
                    "Generales", "tipoDeComprobante"),
                metodoDePago    = _iniFac.Requerido("Generales", "metodoDePago"),
                LugarExpedicion = _iniFac.Requerido("Generales", "LugarExpedicion"),
                // Datos opcionales para Ver32
                NumCtaPago           = _iniFac.Opcional("Generales", "NumCtaPago"),
                FolioFiscalOrig      = null,
                SerieFolioFiscalOrig = null,
                //FechaFolioFiscalOrig = null,
                FechaFolioFiscalOrigSpecified = false,
                MontoFolioFiscalOrig          = 0,
                MontoFolioFiscalOrigSpecified = false,
            };

            #endregion

            #region Emisor

            _comprobante.Emisor = new Schemasv32.ComprobanteEmisor
            {
                rfc    = _iniFac.Requerido("Emisor", "rfc"),
                nombre = _iniFac.Opcional("Emisor", "nombre"),     // de Requerido a Opcional

                DomicilioFiscal = new Schemasv32.t_UbicacionFiscal // Opcional
                {
                    calle      = _iniFac.Requerido("EmisorDomicilioFiscal", "calle"),
                    noExterior =
                        _iniFac.Opcional("EmisorDomicilioFiscal", "noExterior"),
                    noInterior =
                        _iniFac.Opcional("EmisorDomicilioFiscal", "noInterior"),
                    colonia   = _iniFac.Opcional("EmisorDomicilioFiscal", "colonia"),
                    localidad =
                        _iniFac.Opcional("EmisorDomicilioFiscal", "localidad"),
                    referencia =
                        _iniFac.Opcional("EmisorDomicilioFiscal", "referencia"),
                    municipio =
                        _iniFac.Requerido("EmisorDomicilioFiscal", "municipio"),
                    estado       = _iniFac.Requerido("EmisorDomicilioFiscal", "estado"),
                    pais         = _iniFac.Requerido("EmisorDomicilioFiscal", "pais"),
                    codigoPostal =
                        _iniFac.Requerido("EmisorDomicilioFiscal", "codigoPostal")
                },
                ExpedidoEn = new Schemasv32.t_Ubicacion // Opcional
                {
                    calle        = _iniFac.Opcional("EmisorExpedidoEn", "calle"),
                    noExterior   = _iniFac.Opcional("EmisorExpedidoEn", "noExterior"),
                    noInterior   = _iniFac.Opcional("EmisorExpedidoEn", "noInterior"),
                    colonia      = _iniFac.Opcional("EmisorExpedidoEn", "colonia"),
                    localidad    = _iniFac.Opcional("EmisorExpedidoEn", "localidad"),
                    referencia   = _iniFac.Opcional("EmisorExpedidoEn", "referencia"),
                    municipio    = _iniFac.Opcional("EmisorExpedidoEn", "municipio"),
                    estado       = _iniFac.Opcional("EmisorExpedidoEn", "estado"),
                    pais         = _iniFac.Requerido("EmisorExpedidoEn", "pais"),
                    codigoPostal = _iniFac.Opcional("EmisorExpedidoEn", "codigoPostal")
                }
            };
            int cantidadRegimenFiscal =     // Nuevo en Ver32
                                        Convert.ToInt32(_iniFac.Requerido("EmisorRegimenFiscal", "cantidadRegimenFiscal"));
            _comprobante.Emisor.RegimenFiscal = new Schemasv32.ComprobanteEmisorRegimenFiscal[cantidadRegimenFiscal];
            for (int i = 0; i < cantidadRegimenFiscal; i++)
            {
                string regimenFiscalSection = String.Format("regimenFiscal{0}", (i + 1));
                _comprobante.Emisor.RegimenFiscal[i] = new Schemasv32.ComprobanteEmisorRegimenFiscal
                {
                    Regimen = _iniFac.Requerido("EmisorRegimenFiscal", regimenFiscalSection)
                };
            }
            #endregion

            #region Receptor

            _comprobante.Receptor = new Schemasv32.ComprobanteReceptor
            {
                rfc       = _iniFac.Requerido("Receptor", "rfc"),
                nombre    = _iniFac.Opcional("Receptor", "nombre"),
                Domicilio = new Schemasv32.t_Ubicacion
                {
                    calle      = _iniFac.Opcional("ReceptorDomicilio", "calle"),
                    noExterior =
                        _iniFac.Opcional("ReceptorDomicilio", "noExterior"),
                    noInterior =
                        _iniFac.Opcional("ReceptorDomicilio", "noInterior"),
                    colonia      = _iniFac.Opcional("ReceptorDomicilio", "colonia"),
                    localidad    = _iniFac.Opcional("ReceptorDomicilio", "localidad"),
                    referencia   = _iniFac.Opcional("ReceptorDomicilio", "referencia"),
                    municipio    = _iniFac.Opcional("ReceptorDomicilio", "municipio"),
                    estado       = _iniFac.Opcional("ReceptorDomicilio", "estado"),
                    pais         = _iniFac.Requerido("ReceptorDomicilio", "pais"),
                    codigoPostal =
                        _iniFac.Opcional("ReceptorDomicilio", "codigoPostal")
                }
            };

            #endregion

            #region Conceptos

            int cantidadConceptos =
                Convert.ToInt32(_iniFac.Requerido("Conceptos", "cantidadConceptos"));
            _comprobante.Conceptos = new Schemasv32.ComprobanteConcepto[cantidadConceptos];
            for (int i = 0; i < cantidadConceptos; i++)
            {
                string conceptoSection = String.Format("Concepto{0}", (i + 1));
                _comprobante.Conceptos[i] = new Schemasv32.ComprobanteConcepto
                {
                    cantidad         = _iniFac.RequeridoDecimal(conceptoSection, "cantidad"),
                    unidad           = _iniFac.Requerido(conceptoSection, "unidad"),          // de Opcional a Requerido
                    noIdentificacion = _iniFac.Opcional(conceptoSection, "noIdentificacion"), // Opcional
                    descripcion      = _iniFac.Requerido(conceptoSection, "descripcion"),
                    valorUnitario    =
                        _iniFac.RequeridoDecimal(conceptoSection, "valorUnitario"),
                    importe = _iniFac.RequeridoDecimal(conceptoSection, "importe"),
                    Items   = GetInformacionAduanera(_iniFac, conceptoSection)
                };
            }

            #endregion

            #region Impuestos

            _comprobante.Impuestos = new Schemasv32.ComprobanteImpuestos
            {
                totalImpuestosRetenidos =
                    _iniFac.OpcionalDecimal("Impuestos", "totalImpuestosRetenidos"),
                totalImpuestosRetenidosSpecified =
                    _iniFac.Existe("Impuestos", "totalImpuestosRetenidos"),
                totalImpuestosTrasladados =
                    _iniFac.OpcionalDecimal("Impuestos", "totalImpuestosTrasladados"),
                totalImpuestosTrasladadosSpecified =
                    _iniFac.Existe("Impuestos", "totalImpuestosTrasladados"),
            };

            int cantidadRetenciones = _iniFac.OpcionalEntero("Traslados", "cantidadRetenciones");
            if (cantidadRetenciones > 0)
            {
                _comprobante.Impuestos.Retenciones =
                    new Schemasv32.ComprobanteImpuestosRetencion[cantidadRetenciones];

                for (int i = 0; i < cantidadRetenciones; i++)
                {
                    string retencionSection = String.Format("Retencion{0}", i + 1);
                    _comprobante.Impuestos.Retenciones[i] = new Schemasv32.ComprobanteImpuestosRetencion
                    {
                        impuesto = _iniFac.RequeridoEnum <Schemasv32.ComprobanteImpuestosRetencionImpuesto>
                                       (retencionSection, "impuesto"),
                        importe = _iniFac.RequeridoDecimal(retencionSection, "importe")
                    };
                }
            }

            int cantidadTraslados = _iniFac.OpcionalEntero("Traslados",
                                                           "cantidadTraslados");
            _comprobante.Impuestos.Traslados =
                new Schemasv32.ComprobanteImpuestosTraslado[cantidadTraslados];

            for (int i = 0; i < cantidadTraslados; i++)
            {
                string trasladoSection = String.Format("Traslado{0}", i + 1);
                _comprobante.Impuestos.Traslados[i] = new Schemasv32.ComprobanteImpuestosTraslado
                {
                    impuesto = _iniFac.RequeridoEnum <Schemasv32.ComprobanteImpuestosTrasladoImpuesto>
                                   (trasladoSection, "impuesto"),
                    tasa    = _iniFac.RequeridoDecimal(trasladoSection, "tasa"),
                    importe = _iniFac.RequeridoDecimal(trasladoSection, "importe")
                };
            }

            #endregion
        }
Ejemplo n.º 5
0
        private void GeneraComprobante()
        {
            #region Información del comprobante

            _comprobante = new Schemasv3.Comprobante
            {
                version           = "3.0",
                serie             = _iniFac.Opcional("Generales", "serie"),
                folio             = _iniFac.Opcional("Generales", "folio"),
                fecha             = _iniFac.RequeridoFecha("Generales", "fecha"),
                formaDePago       = _iniFac.Requerido("Generales", "formaDePago"),
                noCertificado     = _iniFac.Requerido("Generales", "noCertificado"),
                condicionesDePago = null,
                // Opcional
                subTotal           = _iniFac.RequeridoDecimal("Generales", "subTotal"),
                descuento          = _iniFac.OpcionalDecimal("Generales", "descuento"),
                descuentoSpecified = _iniFac.Existe("Generales", "descuento"),
                motivoDescuento    = null,
                // Opcional
                TipoCambio        = _iniFac.Opcional("Generales", "TipoCambio"),
                Moneda            = _iniFac.Opcional("Generales", "Moneda"),
                total             = _iniFac.RequeridoDecimal("Generales", "total"),
                tipoDeComprobante = _iniFac.RequeridoEnum <Schemasv3.ComprobanteTipoDeComprobante>(
                    "Generales", "tipoDeComprobante")
            };

            #endregion

            #region Emisor

            _comprobante.Emisor = new Schemasv3.ComprobanteEmisor
            {
                rfc    = _iniFac.Requerido("Emisor", "rfc"),
                nombre = _iniFac.Requerido("Emisor", "nombre"),

                DomicilioFiscal = new Schemasv3.t_UbicacionFiscal // Requerido
                {
                    calle      = _iniFac.Requerido("EmisorDomicilioFiscal", "calle"),
                    noExterior =
                        _iniFac.Opcional("EmisorDomicilioFiscal", "noExterior"),
                    noInterior =
                        _iniFac.Opcional("EmisorDomicilioFiscal", "noInterior"),
                    colonia   = _iniFac.Opcional("EmisorDomicilioFiscal", "colonia"),
                    localidad =
                        _iniFac.Opcional("EmisorDomicilioFiscal", "localidad"),
                    referencia =
                        _iniFac.Opcional("EmisorDomicilioFiscal", "referencia"),
                    municipio =
                        _iniFac.Requerido("EmisorDomicilioFiscal", "municipio"),
                    estado       = _iniFac.Requerido("EmisorDomicilioFiscal", "estado"),
                    pais         = _iniFac.Requerido("EmisorDomicilioFiscal", "pais"),
                    codigoPostal =
                        _iniFac.Requerido("EmisorDomicilioFiscal", "codigoPostal")
                },
                ExpedidoEn = new Schemasv3.t_Ubicacion // Opcional
                {
                    calle        = _iniFac.Opcional("EmisorExpedidoEn", "calle"),
                    noExterior   = _iniFac.Opcional("EmisorExpedidoEn", "noExterior"),
                    noInterior   = _iniFac.Opcional("EmisorExpedidoEn", "noInterior"),
                    colonia      = _iniFac.Opcional("EmisorExpedidoEn", "colonia"),
                    localidad    = _iniFac.Opcional("EmisorExpedidoEn", "localidad"),
                    referencia   = _iniFac.Opcional("EmisorExpedidoEn", "referencia"),
                    municipio    = _iniFac.Opcional("EmisorExpedidoEn", "municipio"),
                    estado       = _iniFac.Opcional("EmisorExpedidoEn", "estado"),
                    pais         = _iniFac.Requerido("EmisorExpedidoEn", "pais"),
                    codigoPostal = _iniFac.Opcional("EmisorExpedidoEn", "codigoPostal")
                }
            };

            #endregion

            #region Receptor

            _comprobante.Receptor = new Schemasv3.ComprobanteReceptor
            {
                rfc       = _iniFac.Requerido("Receptor", "rfc"),
                nombre    = _iniFac.Opcional("Receptor", "nombre"),
                Domicilio = new Schemasv3.t_Ubicacion
                {
                    calle      = _iniFac.Opcional("ReceptorDomicilio", "calle"),
                    noExterior =
                        _iniFac.Opcional("ReceptorDomicilio", "noExterior"),
                    noInterior =
                        _iniFac.Opcional("ReceptorDomicilio", "noInterior"),
                    colonia      = _iniFac.Opcional("ReceptorDomicilio", "colonia"),
                    localidad    = _iniFac.Opcional("ReceptorDomicilio", "localidad"),
                    referencia   = _iniFac.Opcional("ReceptorDomicilio", "referencia"),
                    municipio    = _iniFac.Opcional("ReceptorDomicilio", "municipio"),
                    estado       = _iniFac.Opcional("ReceptorDomicilio", "estado"),
                    pais         = _iniFac.Requerido("ReceptorDomicilio", "pais"),
                    codigoPostal =
                        _iniFac.Opcional("ReceptorDomicilio", "codigoPostal")
                }
            };

            #endregion

            #region Conceptos

            int cantidadConceptos =
                Convert.ToInt32(_iniFac.Requerido("Conceptos", "cantidadConceptos"));
            _comprobante.Conceptos = new Schemasv3.ComprobanteConcepto[cantidadConceptos];
            for (int i = 0; i < cantidadConceptos; i++)
            {
                string conceptoSection = String.Format("Concepto{0}", (i + 1));
                _comprobante.Conceptos[i] = new Schemasv3.ComprobanteConcepto
                {
                    cantidad         = _iniFac.RequeridoDecimal(conceptoSection, "cantidad"),
                    unidad           = _iniFac.Opcional(conceptoSection, "unidad"),
                    noIdentificacion = null,
                    // Opcional
                    descripcion   = _iniFac.Requerido(conceptoSection, "descripcion"),
                    valorUnitario =
                        _iniFac.RequeridoDecimal(conceptoSection, "valorUnitario"),
                    importe = _iniFac.RequeridoDecimal(conceptoSection, "importe"),
                    Items   = GetInformacionAduanera(_iniFac, conceptoSection)
                };
            }

            #endregion

            #region Impuestos

            _comprobante.Impuestos = new Schemasv3.ComprobanteImpuestos
            {
                totalImpuestosRetenidos =
                    _iniFac.OpcionalDecimal("Impuestos", "totalImpuestosRetenidos"),
                totalImpuestosRetenidosSpecified =
                    _iniFac.Existe("Impuestos", "totalImpuestosRetenidos"),
                totalImpuestosTrasladados =
                    _iniFac.OpcionalDecimal("Impuestos", "totalImpuestosTrasladados"),
                totalImpuestosTrasladadosSpecified =
                    _iniFac.Existe("Impuestos", "totalImpuestosTrasladados"),
            };

            int cantidadTraslados = _iniFac.OpcionalEntero("Traslados",
                                                           "cantidadTraslados");

            _comprobante.Impuestos.Traslados =
                new Schemasv3.ComprobanteImpuestosTraslado[cantidadTraslados];

            for (int i = 0; i < cantidadTraslados; i++)
            {
                string trasladoSection = String.Format("Traslado{0}", i + 1);
                _comprobante.Impuestos.Traslados[i] = new Schemasv3.ComprobanteImpuestosTraslado
                {
                    impuesto = _iniFac.RequeridoEnum <Schemasv3.ComprobanteImpuestosTrasladoImpuesto>
                                   (trasladoSection, "impuesto"),
                    tasa    = _iniFac.RequeridoDecimal(trasladoSection, "tasa"),
                    importe = _iniFac.RequeridoDecimal(trasladoSection, "importe")
                };
            }

            // TODO: Faltan los impuestos retenidos (opcional)

            #endregion
        }