public static string TimbrarFactura(string Id, string Token, Dictionary <string, object> Comprobante, string RFC, string RefID, string NoCertificado, string Formato, string Correos, string RutaCFDI) { JObject Respuesta = new JObject(); string Xml = ""; CComprobante comprobante = new CComprobante();; try { comprobante = GenerarComprobante(Comprobante); } catch (Exception ex) { } Xml = FacturacionXML.XML(comprobante); // Save file XML in System.IO.Directory.CreateDirectory(@"" + RutaCFDI + @"\Facturacion\in\" + RFC); System.IO.File.WriteAllText(@"" + RutaCFDI + @"\Facturacion\in\" + RFC + @"\" + RefID + ".xml", Xml); string encode = Base64.Encode(Xml); JObject Request = new JObject(); JObject Credenciales = new JObject(); JObject Issuer = new JObject(); JObject Receivers = new JObject(); JObject Document = new JObject(); Credenciales.Add("id", Id); Credenciales.Add("token", Token); Issuer.Add("rfc", RFC); Document.Add("ref-id", RefID); Document.Add("certificate-number", NoCertificado); Document.Add("section", "all"); Document.Add("format", Formato); Document.Add("template", "letter"); Document.Add("type", "application/vnd.diverza.cfdi_3.3+xml"); Document.Add("content", encode); Request.Add("credentials", Credenciales); Request.Add("issuer", Issuer); Request.Add("receiver", Conector.ObtenerDestinatarios(Correos.Split(',').ToList())); Request.Add("document", Document); string response = Conector.Emitir(Request); //return response.ToString(); Dictionary <string, object> Response = (Dictionary <string, object>)JSON.Parse(response); //return Response.ToString(); string uuid = ""; string ref_id = ""; string content = ""; string message = "Error en el timbrado"; int Error = 0; if (!Response.ContainsKey("message")) { try { message = ""; uuid = (Response.ContainsKey("uuid")) ? (string)Response["uuid"] : ""; ref_id = (Response.ContainsKey("uuid")) ? (string)Response["ref_id"] : ""; content = (Response.ContainsKey("content")) ? (string)Response["content"] : ""; // Save file ZIP out GuardarContenido(RutaCFDI, content, comprobante.Receptor.RFC, comprobante.Serie, comprobante.Folio); } catch (Exception ex) { message = ex.Message; Error = 1; } } else { message = (string)Response["message"]; Error = 1; } Respuesta.Add("Error", Error); Respuesta.Add("message", message); Respuesta.Add("uuid", uuid); Respuesta.Add("ref_id", ref_id); Respuesta.Add("certificado", NoCertificado); Respuesta.Add("content", content); Respuesta.Add("request", Request); Respuesta.Add("response", response); return(Respuesta.ToString()); }
public static string XML(CComprobante Comprobante) { string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + System.Environment.NewLine + "<cfdi:Comprobante" + System.Environment.NewLine + " Certificado=\"\"" + System.Environment.NewLine + " NoCertificado=\"" + Comprobante.NoCertificado + "\"" + System.Environment.NewLine + " FormaPago=\"" + Comprobante.FormaPago + "\"" + System.Environment.NewLine + " Sello=\"" + Comprobante.Sello + "\"" + System.Environment.NewLine + " Fecha=\"" + Comprobante.Fecha + "\"" + System.Environment.NewLine + " Folio=\"" + Comprobante.Folio + "\"" + System.Environment.NewLine + " Serie=\"" + Comprobante.Serie + "\"" + System.Environment.NewLine + " Version=\"3.3\"" + System.Environment.NewLine + " LugarExpedicion=\"" + Comprobante.LugarExpedicion + "\"" + System.Environment.NewLine + " CondicionesDePago=\"" + Comprobante.CondicionDePago + "\"" + System.Environment.NewLine + " MetodoPago=\"" + Comprobante.MetodoPago + "\"" + System.Environment.NewLine + " TipoDeComprobante=\"" + Comprobante.TipoDeComprobante + "\"" + System.Environment.NewLine + " Total=\"" + Comprobante.Total.ToString("0.##") + "\"" + System.Environment.NewLine + " SubTotal=\"" + Comprobante.Subtotal.ToString("0.##") + "\"" + System.Environment.NewLine; if (Comprobante.Descuento != "") { xml += " Descuento=\"" + Comprobante.Descuento + "\"" + System.Environment.NewLine; } xml += " Moneda=\"" + Comprobante.Moneda + "\"" + System.Environment.NewLine + " TipoCambio=\"" + Comprobante.TipoCambio.ToString("0.##") + "\"" + System.Environment.NewLine + " xmlns:cfdi=\"http://www.sat.gob.mx/cfd/3\"" + System.Environment.NewLine + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + System.Environment.NewLine + " xsi:schemaLocation=\"http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd\">" + System.Environment.NewLine; if (Comprobante.CFDIRelacionado.TipoRelacion != "") { xml += " <cfdi:CfdiRelacionados " + System.Environment.NewLine + " TipoRelacion = \"" + Comprobante.CFDIRelacionado.TipoRelacion + "\" >" + System.Environment.NewLine + " <cfdi:CfdiRelacionado UUID = \"" + Comprobante.CFDIRelacionado.UUID + "\" /> " + System.Environment.NewLine + " </cfdi:CfdiRelacionados> " + System.Environment.NewLine; } xml += " <cfdi:Emisor" + System.Environment.NewLine + " Nombre=\"" + Comprobante.Emisor.Nombre + "\"" + System.Environment.NewLine + " Rfc=\"" + Comprobante.Emisor.RFC + "\"" + System.Environment.NewLine + " RegimenFiscal=\"" + Comprobante.Emisor.RegimenFiscal + "\"/>" + System.Environment.NewLine + " <cfdi:Receptor" + System.Environment.NewLine + " Nombre=\"" + Comprobante.Receptor.Nombre + "\"" + System.Environment.NewLine + " Rfc=\"" + Comprobante.Receptor.RFC + "\"" + System.Environment.NewLine + " UsoCFDI=\"" + Comprobante.Receptor.UsoCFDI + "\"/>" + System.Environment.NewLine + " <cfdi:Conceptos>" + System.Environment.NewLine; foreach (CConcepto Concepto in Comprobante.Conceptos) { xml += " <cfdi:Concepto" + System.Environment.NewLine + " Importe=\"" + Concepto.Importe + "\"" + System.Environment.NewLine + " ValorUnitario=\"" + Concepto.ValorUnitario.ToString("0.##") + "\"" + System.Environment.NewLine + " Descripcion=\"" + Concepto.Descripcion + "\"" + System.Environment.NewLine + " ClaveUnidad=\"" + Concepto.ClaveUnidad + "\"" + System.Environment.NewLine + " Cantidad=\"" + Concepto.Cantidad.ToString("0.######") + "\"" + System.Environment.NewLine; if (Comprobante.Descuento != "")//if (Concepto.Descuento != 0) // Si existe un descuento TOTAL, se aplica el descuento a cada uno { xml += " Descuento=\"" + Concepto.Descuento + "\"" + System.Environment.NewLine; } xml += " ClaveProdServ=\"" + Concepto.ClaveProdServ + "\">" + System.Environment.NewLine; if (Concepto.Impuestos.Traslados[0].Traslado.Contenido.Importe != 0) { xml += " <cfdi:Impuestos>" + System.Environment.NewLine + " <cfdi:Traslados>" + System.Environment.NewLine + " <cfdi:Traslado Base=\"" + Concepto.Impuestos.Traslados[0].Traslado.Contenido.Base.ToString("0.##") + "\"" + System.Environment.NewLine + " TipoFactor=\"" + Concepto.Impuestos.Traslados[0].Traslado.Contenido.TipoFactor + "\"" + System.Environment.NewLine + " TasaOCuota=\"" + "0.160000" + "\"" + System.Environment.NewLine + " Impuesto=\"" + Concepto.Impuestos.Traslados[0].Traslado.Contenido.Impuesto + "\"" + System.Environment.NewLine + " Importe=\"" + Concepto.Impuestos.Traslados[0].Traslado.Contenido.Importe.ToString("0.##") + "\"/>" + System.Environment.NewLine + " </cfdi:Traslados>" + System.Environment.NewLine + " </cfdi:Impuestos>" + System.Environment.NewLine; } xml += " </cfdi:Concepto>" + System.Environment.NewLine; } xml += " </cfdi:Conceptos>" + System.Environment.NewLine; if (Comprobante.Impuestos.TotalImpuestosTraslados != 0) { xml += " <cfdi:Impuestos TotalImpuestosTrasladados=\"" + Comprobante.Impuestos.TotalImpuestosTraslados + "\">" + System.Environment.NewLine + " <cfdi:Traslados>" + System.Environment.NewLine + " <cfdi:Traslado" + System.Environment.NewLine + " Importe=\"" + Comprobante.Impuestos.Traslados[0].Traslado.Contenido.Importe.ToString("0.##") + "\"" + System.Environment.NewLine + " TipoFactor=\"" + Comprobante.Impuestos.Traslados[0].Traslado.Contenido.TipoFactor + "\"" + System.Environment.NewLine + " TasaOCuota=\"" + "0.160000" + "\"" + System.Environment.NewLine + " Impuesto=\"" + Comprobante.Impuestos.Traslados[0].Traslado.Contenido.Impuesto + "\"/>" + System.Environment.NewLine + " </cfdi:Traslados>" + System.Environment.NewLine + " </cfdi:Impuestos>" + System.Environment.NewLine; } xml += "</cfdi:Comprobante>"; return(xml); }
private static CComprobante GenerarComprobante(Dictionary <string, object> Comprobante) { CComprobante comprobante = new CComprobante(); comprobante.Serie = Convert.ToString(Comprobante["Serie"]); comprobante.Folio = Convert.ToString(Comprobante["Folio"]); comprobante.Fecha = Comprobante["Fecha"].ToString(); comprobante.FormaPago = Comprobante["FormaPago"].ToString(); comprobante.CondicionDePago = Convert.ToString(Comprobante["CondicionDePago"]); comprobante.NoCertificado = Convert.ToString(Comprobante["NoCertificado"]); comprobante.Certificado = Convert.ToString(Comprobante["Certificado"]); comprobante.Subtotal = Convert.ToDecimal(Comprobante["SubTotal"]); comprobante.Descuento = Convert.ToString(Comprobante["Descuento"]); comprobante.TipoCambio = Convert.ToDecimal(Comprobante["TipoCambio"]); comprobante.Moneda = Convert.ToString(Comprobante["Moneda"]); comprobante.Total = Convert.ToDecimal(Comprobante["Total"]); comprobante.TipoDeComprobante = Convert.ToString(Comprobante["TipoDeComprobante"]); comprobante.MetodoPago = Convert.ToString(Comprobante["MetodoPago"]); comprobante.LugarExpedicion = Convert.ToString(Comprobante["LugarExpedicion"]); comprobante.Sello = Convert.ToString(Comprobante["Sello"]); Dictionary <string, object> CFDIRelacionado = (Dictionary <string, object>)Comprobante["CFDIRelacionado"]; comprobante.CFDIRelacionado.TipoRelacion = Convert.ToString(CFDIRelacionado["TipoRelacion"]); comprobante.CFDIRelacionado.UUID = Convert.ToString(CFDIRelacionado["UUID"]); Dictionary <string, object> Emisor = (Dictionary <string, object>)Comprobante["Emisor"]; Dictionary <string, object> Receptor = (Dictionary <string, object>)Comprobante["Receptor"]; comprobante.Emisor.Nombre = Convert.ToString(Emisor["Nombre"]); comprobante.Emisor.RFC = Convert.ToString(Emisor["RFC"]); comprobante.Emisor.RegimenFiscal = Convert.ToString(Emisor["RegimenFiscal"]); comprobante.Receptor.Nombre = Convert.ToString(Receptor["Nombre"]); comprobante.Receptor.RFC = Convert.ToString(Receptor["RFC"]); comprobante.Receptor.UsoCFDI = Convert.ToString(Receptor["UsoCFDI"]); Object[] Conceptos = (Object[])Comprobante["Conceptos"]; if (Conceptos.Length > 0) { int i = 0; CConcepto[] conceptos = new CConcepto[Conceptos.Length]; foreach (Dictionary <string, object> Concepto in Conceptos) { Dictionary <string, object> Impuestos = (Dictionary <string, object>)Concepto["Impuestos"]; Object[] Traslados = (Object[])Impuestos["Traslados"]; CImpuestoConcepto impuestos = new CImpuestoConcepto(); CTrasladosConcepto[] traslados = new CTrasladosConcepto[Traslados.Length]; int j = 0; foreach (Dictionary <string, object> Traslado in Traslados) { Dictionary <string, object> Contenido = (Dictionary <string, object>)Traslado["Traslado"]; CTrasladoConcepto traslado = new CTrasladoConcepto(); CTrasladoConceptoContenido contenido = new CTrasladoConceptoContenido(); contenido.Base = Convert.ToDecimal(Contenido["Base"]); contenido.TipoFactor = Convert.ToString(Contenido["TipoFactor"]); contenido.TasaOCuota = Convert.ToDecimal(Contenido["TasaOCuota"]); contenido.Impuesto = Convert.ToString(Contenido["Impuesto"]); contenido.Importe = Convert.ToDecimal(Contenido["Importe"]); traslado.Contenido = contenido; traslados[j] = new CTrasladosConcepto { Traslado = traslado }; } impuestos.Traslados = traslados; conceptos[i] = new CConcepto { Importe = Convert.ToString(Concepto["Importe"]), ValorUnitario = Convert.ToDecimal(Concepto["ValorUnitario"]), Descripcion = Convert.ToString(Concepto["Descripcion"]), Cantidad = Convert.ToDecimal(Concepto["Cantidad"]), ClaveUnidad = Convert.ToString(Concepto["ClaveUnidad"]), ClaveProdServ = Convert.ToString(Concepto["ClaveProdServ"]), Descuento = Convert.ToString(Concepto["Descuento"]), Impuestos = impuestos }; conceptos[i].Importe = Convert.ToString(Concepto["Importe"]); conceptos[i].ValorUnitario = Convert.ToDecimal(Concepto["ValorUnitario"]); conceptos[i].Descripcion = Convert.ToString(Concepto["Descripcion"]); conceptos[i].Cantidad = Convert.ToDecimal(Concepto["Cantidad"]); conceptos[i].ClaveProdServ = Convert.ToString(Concepto["ClaveProdServ"]); conceptos[i].Descuento = Convert.ToString(Concepto["Descuento"]); i++; } comprobante.Conceptos = conceptos; } else { } Dictionary <string, object> ImpuestosGlobales = (Dictionary <string, object>)Comprobante["Impuestos"]; Object[] TrasladosGlobales = (Object[])ImpuestosGlobales["Traslados"]; comprobante.Impuestos.TotalImpuestosTraslados = Convert.ToDecimal(ImpuestosGlobales["TotalImpuestosTrasladados"]); CTrasladosComprobante[] trasladosglobales = new CTrasladosComprobante[TrasladosGlobales.Length]; int h = 0; foreach (Dictionary <string, object> TrasladoGlobal in TrasladosGlobales) { Dictionary <string, object> ContenidoTrasladoGlobal = (Dictionary <string, object>)TrasladoGlobal["Traslado"]; CTrasladoComprobante traslado = new CTrasladoComprobante(); CTrasladoComprobanteContenido contenido = new CTrasladoComprobanteContenido(); contenido.Importe = Convert.ToDecimal(ContenidoTrasladoGlobal["Importe"]); contenido.Impuesto = Convert.ToString(ContenidoTrasladoGlobal["Impuesto"]); contenido.TasaOCuota = Convert.ToDecimal(ContenidoTrasladoGlobal["TasaOCuota"]); contenido.TipoFactor = Convert.ToString(ContenidoTrasladoGlobal["TipoFactor"]); traslado.Contenido = contenido; trasladosglobales[h] = new CTrasladosComprobante { Traslado = traslado }; } comprobante.Impuestos.Traslados = trasladosglobales; return(comprobante); }