/// <summary> /// Agrega un pago tanto el pago como el doc relacionado es en variables /// El metodo se usa cuando el pago corresponde a una sola factura (doc relacionado) /// </summary> /// <param name="fechaP"></param> /// <param name="formaPagoP"></param> /// <param name="importeP"></param> /// <param name="monedaP"></param> /// <param name="tipoCambioP"></param> /// <param name="uuidDR"></param> /// <param name="monedaDR"></param> /// <param name="metodoPagoDR"></param> public void AddPago( DateTime fechaP, string formaPagoP, decimal importeP, string monedaP, decimal tipoCambioP, string uuidDR, string monedaDR, string metodoPagoDR) { pago = new PagosPago(); pago.FechaPago = fechaP.ToString("yyyy-MM-ddTHH:mm:ss"); pago.FormaDePagoP = formaPagoP; pago.Monto = Math.Round(importeP, decimalesItem, MidpointRounding.AwayFromZero); pago.MonedaP = monedaP; pago.TipoCambioP = tipoCambioP; pago.TipoCambioPSpecified = pago.TipoCambioP != 1; doctoRelacionado = new PagosPagoDoctoRelacionado(); doctoRelacionado.IdDocumento = uuidDR; doctoRelacionado.MonedaDR = monedaDR; doctoRelacionado.MetodoDePagoDR = metodoPagoDR; pago.DoctoRelacionado = doctosRelacionados.ToArray(); pagos.Add(pago); }
private void ComplementoGlobal() { try { cFDIHelper.Initialize("P"); paymentService.Initialize("P"); var certificatedb = context.SatFiles.FirstOrDefault(x => x.Type.ToLower().Equals("cer")); var privateKeydb = context.SatFiles.FirstOrDefault(x => x.Type.ToLower().Equals("key")); var passworddb = context.SatFiles.FirstOrDefault(x => x.Type.ToLower().Equals("pass")); var mxCertificate = new MxCertificate(certificatedb); var mxPrivateKey = new MxPrivateKey(privateKeydb); var password = cFDIHelper.DecodeFromBase64(passworddb.Base64File); cFDIHelper.CertificateBytes = mxCertificate.CertificateBytes(); cFDIHelper.PrivateKeyBytes = mxPrivateKey.PrivateKeyBytes(); cFDIHelper.Password = password; cFDIHelper.XSLTPath = Constants.XSLT_PATH; paymentService.Comprobante.Sello = "MiCadenaDeSello"; paymentService.Comprobante.NoCertificado = mxCertificate.CertificateNumber(); paymentService.Comprobante.Certificado = certificatedb.Base64File; paymentService.Comprobante.LugarExpedicion = "38020"; paymentService.Comprobante.Serie = "P"; //Emisor paymentService.AddEmisor("XIA190128J61", "XENON INDUSTRIAL ARTICLES S DE CV", "601"); //Receptor paymentService.AddReceptor("MEJJ940824C61", "JESUS MENDOZA JUAREZ", "P01"); var docs = new List <PagosPagoDoctoRelacionado>(); var doc1 = new PagosPagoDoctoRelacionado(); doc1.IdDocumento = "970e4f32-0fe0-11e7-93ae-92361f002671"; doc1.ImpPagado = 5000; doc1.ImpSaldoAnt = 10000; doc1.ImpSaldoInsoluto = 5000; doc1.MetodoDePagoDR = "PPD"; doc1.MonedaDR = "MXN"; doc1.NumParcialidad = "1"; var doc2 = new PagosPagoDoctoRelacionado(); doc2.IdDocumento = "970e5496-0fe0-11e7-93ae-92361f002672"; doc2.ImpPagado = 250.00m; doc2.ImpSaldoAnt = 250.00m; doc2.ImpSaldoInsoluto = 0.00m; doc2.MetodoDePagoDR = "PPD"; doc2.MonedaDR = "USD"; doc2.NumParcialidad = "2"; doc2.TipoCambioDR = 20.00m; docs.Add(doc1); docs.Add(doc2); paymentService.AddPago(docs, DateTime.Now, "06", 10000, "MXN", 1); paymentService.Comprobante = paymentService.CalculaComprobante(); //0 Set payment element to xml var xmldocument = paymentService.SetDocumentElement(); //1 var xmlStringFile = cFDIHelper.SerializeToXmlStringFile(paymentService.Comprobante); //2 var cadenaOriginal = cFDIHelper.GetOriginalStringByXmlStringFile(xmlStringFile); paymentService.Comprobante.Sello = cFDIHelper.Sign(cadenaOriginal); //3 xmlStringFile = cFDIHelper.SerializeToXmlStringFile(paymentService.Comprobante); File.WriteAllText("GlobalPaymentInvoice.XML", xmlStringFile); var response = wsHelperTest.Transmit(xmlStringFile); MessageBox.Show(response.Status); } catch (Exception e) { MessageBox.Show(e.ToString()); } }
//--------------------------------------------------------------------------------------------- public string ProcesarPago(Comprobante com, ServicioLocal.Business.Complemento.Pagos Pag, Pagoo.Comprobante c) { string result; if (com.TipoDeComprobante != "P") { result = "CRP101 - El valor del campo TipoDeComprobante debe ser \"P\""; } else if (c.SubTotal != "0") { result = "CRP102 - El valor del campo SubTotal debe ser cero \"0\"."; } else if (com.Moneda != "XXX") { result = "CRP103 - El valor del campo Moneda debe ser \"XXX\"."; } else if (com.FormaPagoSpecified) { result = "CRP104 - El campo FormaPago no se debe registrar en el CFDI."; } else if (com.MetodoPagoSpecified) { result = "CRP105 - El campo MetodoPago no se debe registrar en el CFDI."; } else if (!string.IsNullOrEmpty(com.CondicionesDePago)) { result = "CRP106 - El campo CondicionesDePago no se debe registrar en el CFDI."; } else if (com.DescuentoSpecified) { result = "CRP107 - El campo Descuento no se debe registrar en el CFDI."; } else if (com.TipoCambioSpecified) { result = "CRP108 - El campo TipoCambio no se debe registrar en el CFDI."; } else if (c.Total != "0") { result = "CRP109 - El valor del campo Total debe ser cero \"0\"."; } else if (com.Receptor != null && com.Receptor.UsoCFDI != "P01") { result = "CRP110 - El valor del campo UsoCFDI debe ser \"P01\"."; } else { if (com.Conceptos != null) { if (com.Conceptos.Count <ComprobanteConcepto>() != 1) { result = "CRP111 - Solo debe existir un Concepto en el CFDI. "; return(result); } foreach (ComprobanteConcepto conp in com.Conceptos) { if (conp.Impuestos != null) { result = "CRP112 - No se deben registrar apartados dentro de Conceptos"; return(result); } if (conp.ComplementoConcepto != null) { result = "CRP112 - No se deben registrar apartados dentro de Conceptos"; return(result); } if (conp.CuentaPredial != null) { result = "CRP112 - No se deben registrar apartados dentro de Conceptos"; return(result); } if (conp.InformacionAduanera != null) { result = "CRP112 - No se deben registrar apartados dentro de Conceptos"; return(result); } if (conp.Parte != null) { result = "CRP112 - No se deben registrar apartados dentro de Conceptos"; return(result); } if (conp.ClaveProdServ != "84111506") { result = "CRP113 - El valor del campo ClaveProdServ debe ser \"84111506\"."; return(result); } if (!string.IsNullOrEmpty(conp.NoIdentificacion)) { result = "CRP114 - El campo NoIdentificacion no se debe registrar en el CFDI."; return(result); } if (conp.Cantidad != 1m) { result = "CRP115 - El valor del campo Cantidad debe ser \"1\"."; return(result); } if (conp.ClaveUnidad != "ACT") { result = "CRP116 - El valor del campo ClaveUnidad debe ser \"ACT\"."; return(result); } if (!string.IsNullOrEmpty(conp.Unidad)) { result = "CRP117 - El campo Unidad no se debe registrar en el CFDI."; return(result); } if (conp.Descripcion != "Pago") { result = "CRP118 - El valor del campo Descripcion debe ser \"Pago\"."; return(result); } if (conp.ValorUnitario != 0m) { result = "CRP119 - El valor del campo ValorUnitario debe ser cero \"0\"."; return(result); } if (conp.Importe != 0m) { result = "CRP120 - El valor del campo Importe debe ser cero \"0\"."; return(result); } if (conp.DescuentoSpecified) { result = "CRP121 - El campo Descuento no se debe registrar en el CFDI."; return(result); } } foreach (Pagoo.ComprobanteConcepto conp2 in c.Conceptos) { if (conp2.ValorUnitario != "0") { result = "CRP119 - El valor del campo ValorUnitario debe ser cero \"0\"."; return(result); } if (conp2.Importe != "0") { result = "CRP120 - El valor del campo Importe debe ser cero \"0\"."; return(result); } if (conp2.Cantidad != "1") { result = "CRP115 - El valor del campo Cantidad debe ser \"1\"."; return(result); } } } if (com.Impuestos != null) { result = "CRP122 - No se debe registrar el apartado de Impuestos en el CFDI."; } else { foreach (PagosPago pagos in Pag.Pago) { if (pagos.FormaDePagoP == "99") { result = "CRP201 - El valor del campo FormaDePagoP debe ser distinto de \"99\"."; return(result); } if (pagos.MonedaP == "XXX") { result = "CRP202 - El campo MonedaP debe ser distinto de \"XXX\""; return(result); } if (pagos.MonedaP != "MXN") { if (!pagos.TipoCambioPSpecified) { result = "CRP203 - El campo TipoCambioP se debe registrar."; return(result); } } else if (pagos.TipoCambioPSpecified) { result = "CRP204 - El campo TipoCambioP no se debe registrar."; return(result); } OperacionesCatalogos o9 = new OperacionesCatalogos(); CatalogosSAT.c_Moneda mone = o9.Consultar_Moneda(pagos.MonedaP); if (mone != null) { string varia = mone.Variacion; OperacionesCatalogos o10 = new OperacionesCatalogos(); Divisas divisa = o10.Consultar_TipoDivisa(pagos.MonedaP); if (divisa != null) { decimal inferior = this.CalculoInferiorPorcentajeMoneda(divisa.PesosDivisa, (int)Convert.ToInt16(varia)); decimal superior = this.CalculoSuperiorPorcentajeMoneda(divisa.PesosDivisa, (int)Convert.ToInt16(varia)); if (pagos.TipoCambioP < inferior) { if (string.IsNullOrEmpty(com.Confirmacion)) { result = "CRP205 - Cuando el valor del campo TipoCambio se encuentre fuera de los límites establecidos, debe existir el campo Confirmacion."; return(result); } } if (pagos.TipoCambioP > superior) { if (string.IsNullOrEmpty(com.Confirmacion)) { result = "CRP205 - Cuando el valor del campo TipoCambioP se encuentre fuera de los límites establecidos, debe existir el campo Confirmacion"; return(result); } } } } decimal tot = 0m; if (pagos.DoctoRelacionado == null) { result = "CRP000 - El numero de elementos DoctoRelacionado debe ser mayor a cero"; return(result); } if (pagos.DoctoRelacionado.Count <PagosPagoDoctoRelacionado>() == 0) { result = "CRP000 - El numero de elementos DoctoRelacionado debe ser mayor a cero"; return(result); } PagosPagoDoctoRelacionado[] doctoRelacionado = pagos.DoctoRelacionado; for (int i = 0; i < doctoRelacionado.Length; i++) { PagosPagoDoctoRelacionado doc = doctoRelacionado[i]; if (doc.ImpPagadoSpecified) { tot += doc.ImpPagado; } } if (pagos.Monto <= 0m) { result = "CRP207 - El valor del campo Monto no es mayor que cero \"0\"."; return(result); } decimal MontoDocumentos = pagos.Monto; if (pagos.MonedaP != "MXN") { MontoDocumentos *= pagos.TipoCambioP; MontoDocumentos = decimal.Round(MontoDocumentos, mone.Decimales.Value, MidpointRounding.AwayFromZero); } if (tot > MontoDocumentos) { result = "CRP206 - La suma de los valores registrados en el campo ImpPagado de los apartados DoctoRelacionado no es menor o igual que el valor del campo Monto."; return(result); } string mon = pagos.Monto.ToString(); if (mon != null) { if (mon != "0") { string[] split = mon.Split(".".ToCharArray()); if (split.Count <string>() <= 1) { result = "CRP208 - El valor del campo Monto debe tener hasta la cantidad de decimales que soporte la moneda registrada en el campo MonedaP."; return(result); } if (split[1].Count <char>() != (int)Convert.ToInt16(mone.Decimales)) { result = "CRP208 - El valor del campo Monto debe tener hasta la cantidad de decimales que soporte la moneda registrada en el campo MonedaP."; return(result); } } } OperacionesCatalogos o11 = new OperacionesCatalogos(); CatalogosSAT.c_TipoDeComprobante TCP = o11.Consultar_TipoDeComprobante(com.TipoDeComprobante); if (TCP != null) { decimal monto = pagos.Monto; long? valor_máximo = TCP.Valor_máximo; if (monto > valor_máximo.GetValueOrDefault() && valor_máximo.HasValue) { if (string.IsNullOrEmpty(com.Confirmacion)) { result = "CRP209 - Cuando el valor del campo Monto se encuentre fuera de los límites establecidos, debe existir el campo Confirmacion"; return(result); } } } if (!string.IsNullOrEmpty(pagos.RfcEmisorCtaOrd)) { if (pagos.RfcEmisorCtaOrd != "XEXX010101000") { Operaciones_IRFC r = new Operaciones_IRFC(); vI_RFC t = r.Consultar_IRFC(pagos.RfcEmisorCtaOrd); if (t == null) { result = "CRP210 - El RFC del campo RfcEmisorCtaOrd no se encuentra en la lista de RFC."; return(result); } } else if (string.IsNullOrEmpty(pagos.NomBancoOrdExt)) { result = "CRP211 - El campo NomBancoOrdExt se debe registrar."; return(result); } } if (pagos.FormaDePagoP != "02" && pagos.FormaDePagoP != "03" && pagos.FormaDePagoP != "04" && pagos.FormaDePagoP != "05" && pagos.FormaDePagoP != "06" && pagos.FormaDePagoP != "28" && pagos.FormaDePagoP != "29" && !string.IsNullOrEmpty(pagos.CtaOrdenante)) { result = "CRP212 - El campo CtaOrdenante no se debe registrar."; return(result); } if (!string.IsNullOrEmpty(pagos.CtaOrdenante)) { OperacionesCatalogos o10 = new OperacionesCatalogos(); CatalogosSAT.c_FormaPago formaPago = o10.Consultar_FormaPago(pagos.FormaDePagoP); if (formaPago.PatroncuentaBeneficiaria != "No" && formaPago.PatroncuentaBeneficiaria != "Opcional") { if (!this.validarExpresion(formaPago.PatroncuentaBeneficiaria, pagos.CtaOrdenante)) { result = "CRP213 - El campo CtaOrdenante no cumple con el patrón requerido."; return(result); } } } if (pagos.FormaDePagoP != "02" && pagos.FormaDePagoP != "03" && pagos.FormaDePagoP != "04" && pagos.FormaDePagoP != "05" && pagos.FormaDePagoP != "28" && pagos.FormaDePagoP != "29") { if (!string.IsNullOrEmpty(pagos.RfcEmisorCtaBen)) { result = "CRP214 - El campo RfcEmisorCtaBen no se debe registrar."; return(result); } if (!string.IsNullOrEmpty(pagos.CtaBeneficiario)) { result = "CRP215 - El campo CtaBeneficiario no se debe registrar."; return(result); } } if (pagos.FormaDePagoP != "03" && pagos.TipoCadPagoSpecified) { result = "CRP216 - El campo TipoCadPago no se debe registrar. "; return(result); } int tDoc = 0; if (pagos.DoctoRelacionado != null) { tDoc = pagos.DoctoRelacionado.Count <PagosPagoDoctoRelacionado>(); } if (pagos.DoctoRelacionado != null) { doctoRelacionado = pagos.DoctoRelacionado; for (int i = 0; i < doctoRelacionado.Length; i++) { PagosPagoDoctoRelacionado doc = doctoRelacionado[i]; if (doc.MonedaDR == "XXX") { result = "CRP217 - El valor del campo MonedaDR debe ser distinto de \"XXX\""; return(result); } if (doc.MonedaDR != pagos.MonedaP) { if (!doc.TipoCambioDRSpecified) { result = "CRP218 - El campo TipoCambioDR se debe registrar."; return(result); } } else if (doc.TipoCambioDRSpecified) { result = "CRP219 - El campo TipoCambioDR no se debe registrar."; return(result); } if (doc.MonedaDR == "MXN" && pagos.MonedaP != "MXN" && doc.TipoCambioDR != 1m) { result = "CRP220 - El campo TipoCambioDR debe ser \"1\"."; return(result); } if (doc.MetodoDePagoDR == "PPD") { if (!doc.ImpSaldoAntSpecified) { result = "CRP234 - El campo ImpSaldoAnt se debe registrar."; return(result); } } if (tDoc > 1 && !doc.ImpPagadoSpecified) { result = "CRP235 - El campo ImpPagado se debe registrar. "; return(result); } if (tDoc == 1 && doc.TipoCambioDRSpecified && !doc.ImpPagadoSpecified) { result = "CRP235 - El campo ImpPagado se debe registrar. "; return(result); } if (doc.ImpSaldoAntSpecified) { if (doc.ImpSaldoAnt <= 0m) { result = "CRP221 - El campo ImpSaldoAnt debe mayor a cero."; return(result); } string impSal = doc.ImpSaldoAnt.ToString(); if (impSal != null) { if (impSal != "0") { string[] split = impSal.Split(".".ToCharArray()); if (split.Count <string>() <= 1) { result = "CRP222 - El valor del campo ImpSaldoAnt debe tener hasta la cantidad de decimales que soporte la moneda registrada en el campo MonedaDR."; return(result); } if (split[1].Count <char>() != (int)Convert.ToInt16(mone.Decimales)) { result = "CRP222 - El valor del campo ImpSaldoAnt debe tener hasta la cantidad de decimales que soporte la moneda registrada en el campo MonedaDR."; return(result); } } } } if (doc.ImpPagadoSpecified) { if (doc.ImpPagado <= 0m) { result = "CRP223 - El campo ImpPagado debe mayor a cero."; return(result); } string impPa = doc.ImpPagado.ToString(); if (impPa != null) { if (impPa != "0") { string[] split = impPa.Split(".".ToCharArray()); if (split.Count <string>() <= 1) { result = "CRP224 - El valor del campo ImpPagado debe tener hasta la cantidad de decimales que soporte la moneda registrada en el campo MonedaDR."; return(result); } if (split[1].Count <char>() != (int)Convert.ToInt16(mone.Decimales)) { result = "CRP224 - El valor del campo ImpPagado debe tener hasta la cantidad de decimales que soporte la moneda registrada en el campo MonedaDR."; return(result); } } } } if (doc.ImpSaldoInsolutoSpecified) { string impSalI = doc.ImpSaldoInsoluto.ToString(); if (impSalI != null) { if (impSalI != "0") { string[] split = impSalI.Split(".".ToCharArray()); if (split.Count <string>() <= 1) { result = "CRP225 - El valor del campo ImpSaldoInsoluto debe tener hasta la cantidad de decimales que soporte la moneda registrada en el campo MonedaDR."; return(result); } if (split[1].Count <char>() != (int)Convert.ToInt16(mone.Decimales)) { result = "CRP225 - El valor del campo ImpSaldoInsoluto debe tener hasta la cantidad de decimales que soporte la moneda registrada en el campo MonedaDR."; return(result); } } } if (doc.ImpSaldoInsoluto < 0m) { result = "CRP226 - El campo ImpSaldoInsoluto debe ser mayor o igual a cero y calcularse con la suma de los campos ImSaldoAnt menos el ImpPagado o el Monto."; return(result); } if (doc.ImpSaldoInsoluto != doc.ImpSaldoAnt - doc.ImpPagado) { result = "CRP226 - El campo ImpSaldoInsoluto debe ser mayor o igual a cero y calcularse con la suma de los campos ImSaldoAnt menos el ImpPagado o el Monto."; return(result); } } } } if (pagos.TipoCadPagoSpecified) { if (pagos.CertPago == null) { result = "CRP227 - El campo CertPago se debe registrar."; return(result); } if (string.IsNullOrEmpty(pagos.CadPago)) { result = "CRP229 - El campo CadPago se debe registrar."; return(result); } if (pagos.SelloPago == null) { result = "CRP231 - El campo SelloPago se debe registrar. "; return(result); } } else { if (pagos.CertPago != null) { result = "CRP228 - El campo CertPago no se debe registrar."; return(result); } if (!string.IsNullOrEmpty(pagos.CadPago)) { result = "CRP230 - El campo CadPago no se debe registrar."; return(result); } if (pagos.SelloPago != null) { result = "CRP232 - El campo SelloPago no se debe registrar."; return(result); } } if (pagos.DoctoRelacionado != null) { doctoRelacionado = pagos.DoctoRelacionado; for (int i = 0; i < doctoRelacionado.Length; i++) { PagosPagoDoctoRelacionado doc = doctoRelacionado[i]; if (doc.MetodoDePagoDR == "PPD") { if (string.IsNullOrEmpty(doc.NumParcialidad)) { result = "CRP233 - El campo NumParcialidad se debe registrar."; return(result); } if (!doc.ImpSaldoInsolutoSpecified) { result = "CRP236 - El campo ImpSaldoInsoluto se debe registrar."; return(result); } } } } if (pagos.Impuestos != null) { result = "CRP237 - No debe existir el apartado de Impuestos."; return(result); } if (pagos.FormaDePagoP != "02" && pagos.FormaDePagoP != "03" && pagos.FormaDePagoP != "04" && pagos.FormaDePagoP != "05" && pagos.FormaDePagoP != "06" && pagos.FormaDePagoP != "28" && pagos.FormaDePagoP != "29" && !string.IsNullOrEmpty(pagos.RfcEmisorCtaOrd)) { result = "CRP238 - El campo RfcEmisorCtaOrd no se debe registrar."; return(result); } if (!string.IsNullOrEmpty(pagos.CtaBeneficiario)) { OperacionesCatalogos o10 = new OperacionesCatalogos(); CatalogosSAT.c_FormaPago formaPago = o10.Consultar_FormaPago(pagos.FormaDePagoP); if (formaPago.PatroncuentaBeneficiaria != "No" && formaPago.PatroncuentaBeneficiaria != "Opcional") { if (!this.validarExpresion(formaPago.PatroncuentaBeneficiaria, pagos.CtaBeneficiario)) { result = "CRP239 - El campo CtaBeneficiario no cumple con el patrón requerido."; return(result); } } } } result = "0"; } } return(result); }//-------------------------------------------------------------------------------------
public double generarComplementoPago(decimal monto, string ctaEmisor, string ctaReceptor, string folio, string serie, string uuid, string moneda, string mPago, string rfcReceptor, int numPago, decimal saldoAnt, DataGridView dg) { monto = 0; Pagos oPagos = new Pagos(); List <PagosPago> lstPagos = new List <PagosPago>(); PagosPago oPago = new PagosPago(); oPago.MonedaP = c_Moneda.MXN; oPago.FormaDePagoP = mPago; oPago.FechaPago = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss"); int i = 0; PagosPagoDoctoRelacionado[] relacionado = new PagosPagoDoctoRelacionado[dg.Rows.Count]; foreach (DataGridViewRow r in dg.Rows) { relacionado[i] = new PagosPagoDoctoRelacionado(); relacionado[i].IdDocumento = r.Cells[0].Value.ToString(); relacionado[i].Serie = r.Cells[3].Value.ToString(); relacionado[i].Folio = r.Cells[4].Value.ToString(); relacionado[i].MonedaDR = c_Moneda.MXN; relacionado[i].MetodoDePagoDR = c_MetodoPago.PPD; relacionado[i].NumParcialidad = "1"; monto += Convert.ToDecimal(String.Format("{0:#.00}", Convert.ToDouble(r.Cells[2].Value))); relacionado[i].ImpSaldoAnt = Convert.ToDecimal(String.Format("{0:#.00}", Convert.ToDouble(r.Cells[2].Value))); //Monto de Factura relacionado[i].ImpSaldoAntSpecified = true; relacionado[i].ImpPagado = Convert.ToDecimal(String.Format("{0:#.00}", Convert.ToDouble(r.Cells[2].Value))); //Monto de factura relacionado[i].ImpPagadoSpecified = true; relacionado[i].ImpSaldoInsoluto = Convert.ToDecimal(String.Format("{0:#.00}", Convert.ToDouble(0))); relacionado[i].ImpSaldoInsolutoSpecified = true; i++; oPago.DoctoRelacionado = relacionado; } oPago.Monto = Convert.ToDecimal(String.Format("{0:#.00}", monto)); lstPagos.Add(oPago); oPagos.Pago = lstPagos.ToArray(); Comprobante comprobante = new Comprobante(); comprobante.Complemento = new ComprobanteComplemento[1]; comprobante.Complemento[0] = new ComprobanteComplemento(); XmlDocument docPago = new XmlDocument(); XmlSerializerNamespaces xmlNameSpacePago = new XmlSerializerNamespaces(); xmlNameSpacePago.Add("pago10", "http://www.sat.gob.mx/Pagos"); using (XmlWriter writer = docPago.CreateNavigator().AppendChild()) { new XmlSerializer(oPagos.GetType()).Serialize(writer, oPagos, xmlNameSpacePago); } comprobante.Receptor = new ComprobanteReceptor(); comprobante.Receptor.UsoCFDI = "P01"; comprobante.Receptor.Rfc = rfcReceptor; comprobante.Conceptos = new ComprobanteConcepto[1]; comprobante.Conceptos[0] = new ComprobanteConcepto(); comprobante.Conceptos[0].Cantidad = 1; comprobante.Conceptos[0].ClaveProdServ = "84111506"; comprobante.Conceptos[0].ClaveUnidad = "ACT"; comprobante.Conceptos[0].Descripcion = "Pago"; comprobante.Conceptos[0].ValorUnitario = 0; comprobante.Conceptos[0].Importe = 0; comprobante.Sello = ""; comprobante.Fecha = Convert.ToDateTime(DateTime.Now.ToString("s")); comprobante.NoCertificado = ConfigurationManager.AppSettings["noCertificado"]; X509Certificate2 certEmisor = new X509Certificate2(); byte[] byteCertData = ReadFile(ConfigurationManager.AppSettings["rutaCer"]); certEmisor.Import(byteCertData); comprobante.Certificado = Convert.ToBase64String(certEmisor.GetRawCertData()); //comprobante.TimbreFiscalDigital = null; comprobante.Complemento = new ComprobanteComplemento[1]; comprobante.Complemento[0] = new ComprobanteComplemento(); comprobante.Complemento[0].Any = new XmlElement[2]; comprobante.Complemento[0].Any[0] = docPago.DocumentElement; //var dom = new XmlDocument(); //XmlNamespaceManager nsmgr = new XmlNamespaceManager(dom.NameTable); //nsmgr.AddNamespace("tfd", "http://www.sat.gob.mx/TimbreFiscalDigital"); //var contact = dom.CreateElement("tfd:TimbreFiscalDigital", "http://www.sat.gob.mx/TimbreFiscalDigital"); //dom.AppendChild(contact); //comprobante.Complemento[0].Any[1] = dom.DocumentElement; comprobante.Impuestos = null; comprobante.Total = 0; comprobante.SubTotal = 0; comprobante.Moneda = c_Moneda.XXX; comprobante.FormaPagoSpecified = false; comprobante.TipoDeComprobante = c_TipoDeComprobante.P; comprobante.LugarExpedicion = ConfigurationManager.AppSettings["LugarExpedicion"]; comprobante.Emisor = new ComprobanteEmisor(); comprobante.Emisor.Rfc = ConfigurationManager.AppSettings["rfcEmisor"]; comprobante.Emisor.RegimenFiscal = c_RegimenFiscal.Item612; double ultimoFolio = 0; if (CreateXML(comprobante, mPago, serie, folio)) { ultimoFolio = guardarPago(uuid, c_MetodoPago.PPD, 0m, Convert.ToDecimal(String.Format("{0:#.00}", saldoAnt)), Convert.ToDecimal(String.Format("{0:#.00}", saldoAnt - monto)), Convert.ToDecimal(String.Format("{0:#.00}", monto)), Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")), Convert.ToDecimal(String.Format("{0:#.00}", monto)), mPago, dg); } return(ultimoFolio); }