public ValidadorDatosRetencion()
 {
     lock (this._lock)
     {
         if (ValidadorDatosRetencion._genCadenas == null)
         {
             ValidadorDatosRetencion._genCadenas = new CadenaOriginal("retenciones.xslt");
         }
         if (ValidadorDatosRetencion._validadorEstructura == null)
         {
             ValidadorDatosRetencion._validadorEstructura = new ValidadorEstructuraRetenciones();
         }
     }
 }
        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);
        }