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); }