public static cfdi33.Comprobante TranslateToCFDI(BindingModels.Comprobante from)
        {
            bool MetodoPagoSpecified = false;
            bool formaPagoSpecified  = false;

            var cfdi33 = new cfdi33.Comprobante()
            {
                // TODO: revisar si se aplican descuento,
                Emisor = new Invoicing.cfdi33.ComprobanteEmisor()
                {
                    Rfc           = from.Emisor.RFC,
                    RegimenFiscal = TranslateModelsToCatalogosCFDI.TranslateRegimenFiscal(from.Emisor.RegimenFiscal),
                    Nombre        = from.Emisor.Nombre
                },
                Receptor = new Invoicing.cfdi33.ComprobanteReceptor()
                {
                    Rfc     = from.Receptor.RFC,
                    Nombre  = from.Receptor.Nombre,
                    UsoCFDI = TranslateModelsToCatalogosCFDI.TranslateUsoCFDI(from.UsoCFDI),
                    ResidenciaFiscalSpecified = false
                                                // TODO : Revisar si se implementa la resencia fiscal y el No. de registro tributario para extranjeros
                },
                Complemento = new Invoicing.cfdi33.ComprobanteComplemento()
                {
                    Items = new object[] { TranslateModelsValesDeDespensa.TranslateTo(from.ValesDespensa), TranslatesModelsToPagos.TranslateTo((from).Pagos) }
                },
                Impuestos                  = TranslateModelsToTotalImpuestos.TranslateCuadroImpuesto(from.Conceptos),
                Conceptos                  = TranslateModelConceptosToCFDI.TranslateConceptos(from.Conceptos).ToArray(),
                LugarExpedicion            = from.LugarExpedicion, // TranslateModelsToCatalogosCFDI.TranslateCodigoPostal(from.LugarExpedicion),
                TipoDeComprobante          = TranslateModelsToCatalogosCFDI.TranslateTipoComprobante(from.TipoComprobante),
                FormaPago                  = TranslateModelsToCatalogosCFDI.TranslateFormaPago(from.FormaPago, ref formaPagoSpecified),
                FormaPagoSpecified         = formaPagoSpecified,
                Certificado                = from.Certificado,
                NoCertificado              = from.noCertificado,
                CondicionesDePago          = from.CondicionesDePago,
                CondicionesDePagoSpecified = !String.IsNullOrEmpty(from.CondicionesDePago),
                Serie               = from.Serie,
                Folio               = from.Folio,
                Moneda              = TranslateModelsToCatalogosCFDI.TranslateMoneda(from.Moneda),
                MetodoPago          = TranslateModelsToCatalogosCFDI.TranslateMetodoPago(from.MetodoPago, ref MetodoPagoSpecified),
                MetodoPagoSpecified = MetodoPagoSpecified,
                Version             = "3.3",
                SubTotal            = from.SubTotal,
                Total               = from.Total,
                Fecha               = TranslateModelsToCatalogosCFDI.TranslateFecha(from.Fecha),
            };

            return(cfdi33);
        }
        public static cfdi33.PagosPago TranslateToPago(BindingModels.Pago from)
        {
            bool formaPagoSpecified = false;

            byte[] certPago  = null;
            byte[] selloPago = null;


            if (!String.IsNullOrEmpty(from.CertPago))
            {
                certPago = Encoding.ASCII.GetBytes(from.CertPago);
            }
            if (!String.IsNullOrEmpty(from.SelloPago))
            {
                selloPago = Encoding.ASCII.GetBytes(from.SelloPago);
            }

            var listaDoctosRelacionados = new List <PagosPagoDoctoRelacionado>();

            if (from.ListaDocumentos != null)
            {
                foreach (var item in from.ListaDocumentos)
                {
                    listaDoctosRelacionados.Add(TranslateToDoctosRelacionados(item));
                }
            }
            else
            {
                throw new Exception("No existen facturas relacionadas con el pago");
            }

            var to = new cfdi33.PagosPago()
            {
                FechaPago            = TranslateModelsToCatalogosCFDI.TranslateFecha(from.FechaPago.LocalDateTime), // from.FechaPago.LocalDateTime,
                MonedaP              = TranslateModelsToCatalogosCFDI.TranslateMoneda(from.MonedaP),
                FormaDePagoP         = TranslateModelsToCatalogosCFDI.TranslateFormaPago(from.FormaDePagoP, ref formaPagoSpecified),
                Monto                = from.Monto,
                CtaBeneficiario      = from.CtaBeneficiario,
                CadPago              = from.CadPago,
                CertPago             = certPago,
                CtaOrdenante         = from.CtaOrdenante,
                NomBancoOrdExt       = from.NomBancoOrdExt,
                NumOperacion         = from.NumOperation,
                RfcEmisorCtaBen      = from.RfcEmisorCtaBen,
                RfcEmisorCtaOrd      = from.RfcEmisorCtaOrd,
                SelloPago            = selloPago,
                TipoCadPagoSpecified = !String.IsNullOrEmpty(from.TipoCadPago),
                TipoCambioP          = from.TipoCambioP,
                TipoCambioPSpecified = (from.TipoCambioP > 0),
                DoctoRelacionado     = listaDoctosRelacionados.ToArray()
                                       // Impuestos = from.ListaImpuestos
            };

            var TipoCadPago = TranslateModelsToCatalogosCFDI.TranslateToCadenaPago(from.TipoCadPago, out bool isNullValue);

            if (!isNullValue)
            {
                to.TipoCadPago = TipoCadPago;
            }
            return(to);
        }