private string GetXmlTimbre(ServicioLocal.Business.TimbreRetenciones.TimbreFiscalDigital p) { XmlSerializer ser = new XmlSerializer(typeof(ServicioLocal.Business.TimbreRetenciones.TimbreFiscalDigital)); string result; using (MemoryStream memStream = new MemoryStream()) { StreamWriter sw = new StreamWriter(memStream, Encoding.UTF8); using (XmlWriter xmlWriter = XmlWriter.Create(sw, new XmlWriterSettings { Indent = false, Encoding = Encoding.UTF8 })) { XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); namespaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance"); namespaces.Add("tfd", "http://www.sat.gob.mx/TimbreFiscalDigital"); ser.Serialize(xmlWriter, p, namespaces); string xml = Encoding.UTF8.GetString(memStream.GetBuffer()); xml = xml.Substring(xml.IndexOf(Convert.ToChar(60))); xml = xml.Substring(0, xml.LastIndexOf(Convert.ToChar(62)) + 1); result = xml; } } return(result); }
public Dictionary <int, string> ProcesarCadenaRetencion(string cadenaXml, ref string res, ref ServicioLocal.Business.TimbreRetenciones.TimbreFiscalDigital timbre, ref string acuseSat, ref string hash) { Dictionary <int, string> result; try { string ruta = Path.Combine(this._rutaEntrada, DateTime.Now.Year.ToString(), DateTime.Now.Month.ToString().PadLeft(2, '0'), DateTime.Now.Day.ToString().PadLeft(2, '0')); if (!Directory.Exists(ruta)) { Directory.CreateDirectory(ruta); } Guid uid = Guid.NewGuid(); string archivo = Path.Combine(ruta, uid.ToString() + ".xml"); File.WriteAllText(archivo, cadenaXml, Encoding.UTF8); XElement xe = XElement.Load(new StringReader(cadenaXml)); acuseSat = ""; Dictionary <int, string> x = this.Procesar(xe, "WS", null, uid, ref res, ref timbre, ref acuseSat, ref hash); NtLinkBusiness.Logger.Debug(x); result = x; } catch (Exception eee) { NtLinkBusiness.Logger.Error(eee); result = this.CrearArchivoROE(new List <int> { 666 }, "WS", eee.Message); } return(result); }
private Dictionary <int, string> Procesar(XElement xe, string archivoEntrada, XElement addenda, Guid uuid, ref string res, ref ServicioLocal.Business.TimbreRetenciones.TimbreFiscalDigital timbre, ref string acuseSat, ref string hash) { Dictionary <int, string> erroresPac = new Dictionary <int, string>(); Dictionary <int, string> result; try { string strContent = xe.ToString(); List <int> errores = new List <int>(); string version = (xe.Attribute("Version") == null) ? "" : xe.Attribute("Version").Value; if (version == "") { errores.Add(1002); List <int> errorRoe = (from p in errores where p != 0 select p).ToList <int>(); erroresPac = this.CrearArchivoROE(errorRoe, archivoEntrada, ""); result = erroresPac; return(result); } ValidadorEstructuraRetenciones validadorEstructura = ValidadorDatosRetencion._validadorEstructura.Clone() as ValidadorEstructuraRetenciones; ValidacionEstructuraRetencion errorXmlValidacion = validadorEstructura.Validar(strContent); errores.Add(errorXmlValidacion.Valido ? 0 : 1003); if (!errorXmlValidacion.Valido) { erroresPac = this.CrearArchivoROE(errores, archivoEntrada, errorXmlValidacion.ErrorList.ToString()); result = erroresPac; return(result); } string sello = (xe.Attribute("Sello") == null) ? "" : xe.Attribute("Sello").Value; string serieCert = (xe.Attribute("NumCert") == null) ? string.Empty : xe.Attribute("NumCert").Value; string fecha = (xe.Attribute("FechaExp") == null) ? "" : xe.Attribute("FechaExp").Value; DateTime fechaEmisionCfdi = Convert.ToDateTime(fecha); string rfc = (((XElement)xe.FirstNode).Attribute("RFCEmisor") == null) ? "" : ((XElement)xe.FirstNode).Attribute("RFCEmisor").Value; string cadenaOriginal; lock (this._lock) { cadenaOriginal = ValidadorDatosRetencion._genCadenas.GenerarCadenaOriginal(strContent); } X509Certificate2 certificado = null; byte[] cert = (xe.Attribute("Cert") == null || string.IsNullOrEmpty(xe.Attribute("Cert").Value)) ? new byte[0] : Convert.FromBase64String(xe.Attribute("Cert").Value); if (cert.Length == 0) { errores.Add(399); erroresPac = this.CrearArchivoROE(errores, archivoEntrada, ""); result = erroresPac; return(result); } try { certificado = new X509Certificate2(cert); } catch (Exception ex) { NtLinkBusiness.Logger.Error(ex); errores.Add(399); erroresPac = this.CrearArchivoROE(errores, archivoEntrada, ""); result = erroresPac; return(result); } DateTime datFechaExpiracionCSD = Convert.ToDateTime(certificado.GetExpirationDateString()); DateTime datFechaEfectivaCSD = Convert.ToDateTime(certificado.GetEffectiveDateString()); ValidadorDatos validadorDatos = new ValidadorDatos(); errores.Add(validadorDatos.ValidaCertificadoAc(certificado)); DateTime fechaFiel = new DateTime(2015, 3, 4); if (fechaEmisionCfdi >= fechaFiel) { errores.Add(validadorDatos.ValidaCertificadoCSDnoFIEL(certificado)); } byte[] firma = null; try { firma = Convert.FromBase64String(sello); } catch (Exception ee) { NtLinkBusiness.Logger.Error(ee); errores.Add(302); } if (firma != null) { errores.Add(validadorDatos.ValidarSelloRetencion(cadenaOriginal, firma, certificado, ref hash)); } NtLinkBusiness.Logger.Debug(hash); errores.Add(validadorDatos.ValidaRFCEmisor(rfc, certificado.SubjectName.Name)); errores.Add(validadorDatos.VerificaCSDRevocado(serieCert, fecha)); errores.Add(validadorDatos.ValidaFechaEmisionXml(fechaEmisionCfdi, datFechaExpiracionCSD, datFechaEfectivaCSD)); string cfdiTimbrado = null; string uuidDuplicado = null; int duplicado = validadorDatos.ValidaTimbrePrevio(xe, hash, ref cfdiTimbrado, ref uuidDuplicado); errores.Add(duplicado); if (duplicado == 307) { timbre = new ServicioLocal.Business.TimbreRetenciones.TimbreFiscalDigital { UUID = uuidDuplicado }; res = cfdiTimbrado; result = new Dictionary <int, string>(); return(result); } errores.Add(validadorDatos.ValidaRangoFecha(fechaEmisionCfdi)); errores.Add(validadorDatos.ValidaRFCLCO(rfc)); errores.Add(validadorDatos.ValidaFechaEmision2011(fechaEmisionCfdi)); IEnumerable <int> erroresReales = from l in errores where l != 0 select l; if (erroresReales.Any <int>()) { erroresPac = this.CrearArchivoROE(erroresReales.ToList <int>(), archivoEntrada, ""); result = erroresPac; return(result); } GeneradorTimbreFiscalDigital genTimbre = new GeneradorTimbreFiscalDigital("SLOT", 666); string serieCertPac = ConfigurationManager.AppSettings["NoSerieCertPac"]; string RFCPac = ConfigurationManager.AppSettings["RFCPac"]; timbre = genTimbre.GeneraTimbreFiscalDigitalRetencionesCadenas(rfc, serieCertPac, sello, xe, uuid); if (timbre != null) { string strTimbre = this.GetXmlTimbre(timbre); string xmlCompleto = this.ConcatenaTimbreRet(xe, strTimbre, addenda, rfc, uuid.ToString()); res = xmlCompleto; result = erroresPac; return(result); } } catch (Exception ex) { NtLinkBusiness.Logger.Error(ex); this.CrearArchivoROE(new List <int> { 666 }, archivoEntrada, ex.Message); throw; } result = erroresPac; return(result); }
public static string TimbraRetencionString(string comprobante, empresa emp, bool consumeSaldo, bool vaidarUsuario) { ValidadorDatosRetencion val = new ValidadorDatosRetencion(); string result = null; ServicioLocal.Business.TimbreRetenciones.TimbreFiscalDigital timbre = null; string acuseSat = ""; string hash = null; XElement element = XElement.Parse(comprobante); Retenciones.Retenciones comp = TimbradoUtils.DesSerializarRetenciones(element); if (vaidarUsuario) { TimbradoUtils.ValidarUsuario(comp.Emisor.RFCEmisor); } Dictionary <int, string> dict = val.ProcesarCadenaRetencion(comprobante, ref result, ref timbre, ref acuseSat, ref hash); string result2; if (timbre != null && timbre.selloSAT != null && dict.Count == 0) { SerializadorTimbres sert = new SerializadorTimbres(); if (ConfigurationManager.AppSettings["Pruebas"] == "true") { timbre.selloSAT = "Inválido, Ambiente de pruebas"; } string res = sert.GetTimbreRenecionesXml(timbre); string cfdiTimbrado = result; string fecha = comp.FechaExp; string rfcReceptor = string.Empty; if (comp.Receptor.Nacionalidad == RetencionesReceptorNacionalidad.Nacional) { RetencionesReceptorNacional rec = (RetencionesReceptorNacional)comp.Receptor.Item; rfcReceptor = rec.RFCRecep; } else { rfcReceptor = "XEXX010101000"; } if (!TimbradoUtils.GuardaFactura(fecha, comp.Emisor.RFCEmisor, rfcReceptor, timbre.UUID, cfdiTimbrado, hash, emp, consumeSaldo, true)) { throw new Exception("Error al abrir el comprobante"); } result2 = res; } else { if (timbre != null && timbre.selloSAT == null && dict.Count == 0) { XElement el = XElement.Parse(result); XElement complemento = el.Elements(Constantes.RetencionNamesPace + "Complemento").FirstOrDefault <XElement>(); if (complemento != null) { XElement t = complemento.Elements(Constantes.CFDTimbreFiscalVersionNamespace + "TimbreFiscalDigital").FirstOrDefault <XElement>(); if (t != null) { SidetecStringWriter sw = new SidetecStringWriter(Encoding.UTF8); t.Save(sw, SaveOptions.DisableFormatting); result2 = sw.ToString(); return(result2); } } } if (dict.Count > 0) { StringBuilder res2 = new StringBuilder(); foreach (KeyValuePair <int, string> d in dict) { res2.AppendLine(d.Key.ToString() + " - " + d.Value.ToString()); } result2 = res2.ToString(); } else { TimbradoUtils.Logger.Error("Error al abrir el comprobante:" + comprobante); result2 = "Error al abrir el comprobante"; } } return(result2); }