Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo n.º 2
0
        /// <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
                });
            }
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
 /// <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);
     }
 }
Exemplo n.º 5
0
        /// <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);
            }
        }
Exemplo n.º 6
0
        /// <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);
            }
        }
Exemplo n.º 7
0
        /// <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);
            }
        }
Exemplo n.º 8
0
        /// <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
                });
            }
        }
Exemplo n.º 9
0
        /// <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
                });
            }
        }