/// <summary> /// Convertir Modelo Comprobante a string XML /// </summary> /// <param name="comprobante">Modelo Comprobante</param> /// <returns>Cadena XML</returns> private string ConvertirComprobanteString(Comprobante comprobante) { try { var xmlNameSpace = new XmlSerializerNamespaces(); xmlNameSpace.Add("cfdi", "http://www.sat.gob.mx/cfd/3"); xmlNameSpace.Add("tfd", "http://www.sat.gob.mx/TimbreFiscalDigital"); xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance"); if (comprobante.TipoDeComprobante == "P") { xmlNameSpace.Add("pago10", "http://www.sat.gob.mx/Pagos"); } XmlSerializer oXmlSerializar = new XmlSerializer(typeof(Comprobante)); string sXml = string.Empty; using (var sww = new StringWriterUtf8()) { using (XmlWriter writter = XmlWriter.Create(sww)) { oXmlSerializar.Serialize(writter, comprobante, xmlNameSpace); sXml = sww.ToString(); } } return(!string.IsNullOrWhiteSpace(sXml) ? sXml : string.Empty); } catch (Exception ex) { return(string.Empty); } }
/// <summary> /// Timbrado de Comprobante /// </summary> /// <param name="comprobante">Modelo Comprobante</param> /// <returns>Modelo GenericResponse</returns> public GenericResponse TimbrarComprobante(Comprobante comprobante) { try { var firmaComprobante = ObtenerFirmaComprobante(comprobante); if (!string.IsNullOrWhiteSpace(firmaComprobante)) { return(TimbrarXML(firmaComprobante)); } else { return(new GenericResponse() { Codigo = 2, Mensaje = "" }); } } catch (Exception ex) { return(new GenericResponse() { Codigo = 0, Mensaje = ex.Message }); } }
/// <summary> /// Obtener modelo Comprobante desde un Archivo XML /// </summary> /// <param name="rutaArchivoXml">Ubicación del archivo XML</param> /// <returns>Modelo Comprobante</returns> public Comprobante ObtenerComprobanteArchivoXml(string rutaArchivoXml) { Comprobante respuesta = new Comprobante(); XmlSerializer oSerializer = new XmlSerializer(typeof(Comprobante)); try { using (StreamReader reader = new StreamReader(rutaArchivoXml)) { var oComprobante = (Comprobante)oSerializer.Deserialize(reader); //complementos foreach (var oComplemento in oComprobante.Complemento) { foreach (var oComplementoInterior in oComplemento.Any) { if (oComplementoInterior.Name.Contains("TimbreFiscalDigital")) { XmlSerializer oSerializerTimbreFiscal = new XmlSerializer(typeof(TimbreFiscalDigital)); using (var readerComplemento = new StringReader(oComplementoInterior.OuterXml)) { oComprobante.TimbreFiscalDigital = (TimbreFiscalDigital)oSerializerTimbreFiscal.Deserialize(readerComplemento); } } if (oComplementoInterior.Name.Contains("Pagos")) { XmlSerializer oSerializerPagos = new XmlSerializer(typeof(Pagos)); using (var readerComplemento = new StringReader(oComplementoInterior.OuterXml)) { oComprobante.Pagos = (Pagos)oSerializerPagos.Deserialize(readerComplemento); } } } } respuesta = oComprobante; } } catch (Exception ex) { respuesta = null; } return(respuesta); }
/// <summary> /// Obtener cadena de Moneda en Letra /// </summary> /// <param name="comprobante">Modelo Comprobante</param> /// <returns>Cadena de Moneda en Letra</returns> private string ObtenerMonedaLetra(Comprobante comprobante) { try { if (comprobante.TipoDeComprobante == "P") { return(_monedaLetra.Convertir(comprobante.Pagos.Pago[0].Monto.ToString("#.00"), true)); } else { return(_monedaLetra.Convertir(comprobante.Total.ToString("#.00"), true)); } } catch (Exception ex) { return(string.Empty); } }
/// <summary> /// Obtener cadena Código QR /// </summary> /// <param name="comprobante">Modelo Comprobante</param> /// <returns>Cadena código QR</returns> private string ObtenerQr(Comprobante comprobante) { try { var url = "https://verificacfdi.facturaelectronica.sat.gob.mx/default.aspx?" + "id=" + comprobante.TimbreFiscalDigital.UUID + "&re=" + comprobante.Emisor.Rfc + "&rr=" + comprobante.Receptor.Rfc + "&tt=" + comprobante.Total.ToString() + "&fe=" + comprobante.Sello.Substring(comprobante.Sello.Length - 9, 8); return(_qr.GenerarQR(url)); } catch (Exception ex) { return(string.Empty); } }
/// <summary> /// Obtener cadena XML Firmada de un Comprobante /// </summary> /// <param name="comprobante">Modelo Comprobante</param> /// <returns>Cadena de XML Firmada</returns> private string ObtenerFirmaComprobante(Comprobante comprobante) { try { var xmlRutaTemp = Task.Run(() => GenerarComprobanteXmlTemp(comprobante)).Result; if (string.IsNullOrWhiteSpace(xmlRutaTemp)) { throw new ArgumentNullException($"GenerarComprobanteXmlTemp, no se pudo Generar XML Temporal"); } var cadenaXmlXslt = ObtenerCadenaOriginal(xmlRutaTemp); if (string.IsNullOrWhiteSpace(cadenaXmlXslt)) { throw new ArgumentNullException($"CadenaXmlXslt, no se pudo obtener Cadena Original del Comprobante"); } comprobante.Certificado = _facturaCertificado; comprobante.Sello = ObtenerSello(cadenaXmlXslt); if (string.IsNullOrWhiteSpace(comprobante.Sello)) { throw new ArgumentNullException($"Sello, no se pudo obtener Sello del Comprobante, la contraseña del archivo .key es incorrecta"); } if (comprobante.TipoDeComprobante == "P") { comprobante.xsiSchemaLocation = "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd http://www.sat.gob.mx/Pagos http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos10.xsd"; } var firmadoXml = ConvertirComprobanteString(comprobante); if (File.Exists(xmlRutaTemp)) { File.Delete(xmlRutaTemp); } return(!string.IsNullOrWhiteSpace(firmadoXml) ? firmadoXml : string.Empty); } catch (Exception ex) { return(string.Empty); } }
/// <summary> /// Convertir Modelo Comprobante a XML Reader /// </summary> /// <param name="comprobante">Modelo Comprobante</param> /// <returns>Objeto XmlReader</returns> private async Task <string> GenerarComprobanteXmlTemp(Comprobante comprobante) { string sXml; string rutaXmlTemp; try { var xmlNameSpace = new XmlSerializerNamespaces(); xmlNameSpace.Add("cfdi", "http://www.sat.gob.mx/cfd/3"); xmlNameSpace.Add("tfd", "http://www.sat.gob.mx/TimbreFiscalDigital"); xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance"); if (comprobante.TipoDeComprobante == "P") { xmlNameSpace.Add("pago10", "http://www.sat.gob.mx/Pagos"); } var oXmlSerializar = new XmlSerializer(typeof(Comprobante)); using (var sww = new StringWriterUtf8()) { using (XmlWriter writter = XmlWriter.Create(sww)) { oXmlSerializar.Serialize(writter, comprobante, xmlNameSpace); sXml = sww.ToString(); } } var carpeta = $@"Temp\"; var directorio = $@"{_facturaRutaTimbrado}\{carpeta}"; var archivo = $@"{_facturaRutaTimbrado}\{carpeta}{comprobante.Emisor.Rfc}_{comprobante.TipoDeComprobante}_{comprobante.Serie}_{comprobante.Folio}.xml"; if (!string.IsNullOrEmpty(sXml)) { rutaXmlTemp = archivo; } else { return(string.Empty); } if (!Directory.Exists(directorio)) { DirectoryInfo di = Directory.CreateDirectory(directorio); } using (StreamWriter outputFile = new StreamWriter(archivo, false, Encoding.UTF8)) { await outputFile.WriteAsync(sXml); } if (File.Exists(archivo)) { return(archivo); } else { return(string.Empty); } } catch (Exception ex) { return(string.Empty); } }
/// <summary> /// Generar archivo XML /// </summary> /// <param name="comprobanteTimbrado">Cadena XML Timbrado</param> /// <param name="comprobante">Modelo Comprobante</param> /// <returns>Modelo GenericResponse</returns> public async Task <GenericResponse <RutaArchivo> > GenerarArchivoXML(string comprobanteTimbrado, Comprobante comprobante, string idComprobante) { try { string poliza = ObtenerPoliza(int.Parse(idComprobante)); var anioMes = DateTime.Now.ToString("yyyyMM"); var carpeta = $@"{poliza}\{anioMes}\"; var directorio = $@"{_facturaRutaTimbrado}\{carpeta}"; var archivo = $@"{_facturaRutaTimbrado}\{carpeta}{comprobante.Emisor.Rfc}_{comprobante.TipoDeComprobante}_{comprobante.Serie}_{comprobante.Folio}.xml"; var rutaRelativa = $@"{carpeta}{comprobante.Emisor.Rfc}_{comprobante.TipoDeComprobante}_{comprobante.Serie}_{comprobante.Folio}.xml"; if (!Directory.Exists(directorio)) { DirectoryInfo di = Directory.CreateDirectory(directorio); } using (StreamWriter outputFile = new StreamWriter(archivo, false, Encoding.UTF8)) { outputFile.Write(comprobanteTimbrado); } if (File.Exists(archivo)) { return new GenericResponse <RutaArchivo>() { Data = new RutaArchivo() { RutaAbsoluta = archivo, RutaRelativa = rutaRelativa } } } ; else { return new GenericResponse <RutaArchivo>() { Codigo = 2, Mensaje = "XML no Generado", Descripcion = "XML no Generado" } }; } catch (Exception ex) { return(new GenericResponse <RutaArchivo>() { Codigo = 0, Mensaje = ex.Message, Descripcion = ex.HelpLink }); } }
/// <summary> /// Generar archivo PDF a partir de Modelo Comprobante /// </summary> /// <param name="comprobante">Modelo Comprobante</param> /// <returns>Modelo GenericResponse</returns> public async Task <GenericResponse <RutaArchivo> > GenerarPDF(Comprobante comprobante, string idComprobante) { try { if (comprobante != null) { var qr = ObtenerQr(comprobante); if (string.IsNullOrWhiteSpace(qr)) { return new GenericResponse <RutaArchivo>() { Codigo = 2, Mensaje = "No se pudo obtener código QR del comprobante", Descripcion = "No se pudo obtener código QR del comprobante" } } ; var monedaLetra = ObtenerMonedaLetra(comprobante); if (string.IsNullOrWhiteSpace(monedaLetra)) { return new GenericResponse <RutaArchivo>() { Codigo = 2, Mensaje = "No se pudo obtener moneda en letra", Descripcion = "No se pudo obtener moneda en letra" } } ; //Se complementa información al modelo de Comprobante comprobante.logo = _logo; comprobante.qr = qr; comprobante.monedaLetra = monedaLetra; string poliza = ObtenerPoliza(int.Parse(idComprobante)); if (string.IsNullOrWhiteSpace(poliza)) { return new GenericResponse <RutaArchivo>() { Codigo = 2, Mensaje = "No se pudo obtener la poliza", Descripcion = "No se pudo obtener la poliza" } } ; comprobante.poliza = poliza; if (!string.IsNullOrWhiteSpace(comprobante.FormaPago)) { string formaPagoLetra = ObtenerFormaPagoLetra(comprobante.FormaPago); if (string.IsNullOrWhiteSpace(formaPagoLetra)) { return new GenericResponse <RutaArchivo>() { Codigo = 2, Mensaje = "No se pudo obtener la forma de pago letra", Descripcion = "No se pudo obtener la forma de pago letra" } } ; comprobante.formaPagoLetra = formaPagoLetra; } int vrow = 0; if (comprobante.Pagos != null) { foreach (PagosPago row in comprobante.Pagos.Pago) { string formaPagoLetra = ObtenerFormaPagoLetra(row.FormaDePagoP); if (string.IsNullOrWhiteSpace(formaPagoLetra)) { return new GenericResponse <RutaArchivo>() { Codigo = 2, Mensaje = "No se pudo obtener la forma de pago letra del comprobante de pago", Descripcion = "No se pudo obtener la forma de pago letra del comprobante de pago" } } ; comprobante.Pagos.Pago[vrow].formaDePagoPLetra = formaPagoLetra; vrow++; } } string pdf = string.Empty; using (_razorEngine = RazorEngineService.Create(_templateService)) { pdf = _razorEngine.RunCompile(_plantilla, "plantilla", null, comprobante); } if (!string.IsNullOrEmpty(pdf)) { var anioMes = DateTime.Now.ToString("yyyyMM"); var carpeta = $@"{poliza}\{anioMes}\"; var directorio = $@"{_facturaRutaTimbrado}\{carpeta}"; var archivo = $@"{_facturaRutaTimbrado}\{carpeta}{comprobante.Emisor.Rfc}_{comprobante.TipoDeComprobante}_{comprobante.Serie}_{comprobante.Folio}.pdf"; var rutaRelativa = $@"{carpeta}{comprobante.Emisor.Rfc}_{comprobante.TipoDeComprobante}_{comprobante.Serie}_{comprobante.Folio}.pdf"; if (!Directory.Exists(directorio)) { DirectoryInfo di = Directory.CreateDirectory(directorio); } _pdfDocument = _htmlToPdf.ConvertHtmlString(pdf); _pdfDocument.Save(archivo); _pdfDocument.Close(); if (File.Exists(archivo)) { return new GenericResponse <RutaArchivo>() { Data = new RutaArchivo { RutaAbsoluta = archivo, RutaRelativa = rutaRelativa } } } ; else { return new GenericResponse <RutaArchivo>() { Codigo = 2, Mensaje = "PDF no Generado", Descripcion = "PDF no Generado" } }; } else { return new GenericResponse <RutaArchivo>() { Codigo = 2, Mensaje = "No se pudo obtener HTML del Comprobante", Descripcion = "No se pudo obtener HTML del Comprobante" } }; } else { return(new GenericResponse <RutaArchivo>() { Codigo = 2, Mensaje = "Módelo Comprobante NULL", Descripcion = "Módelo Comprobante NULL" }); } } catch (Exception ex) { return(new GenericResponse <RutaArchivo>() { Codigo = 0, Mensaje = ex.Message, Descripcion = ex.Message }); } }