private ResultadoValidacion Validar(ValidadorInput entrada) { var generadorCadenas = new GeneradorCadenasCfdi(entrada.Version); try { string cadenaOriginal; string strContent = entrada.XmlString; var errores = new Dictionary<string,int>(); errores.Add("Estructura del archivo XML: " ,0); string version = entrada.Version; if (version == "") { errores.Add("Versión del comprobante: " ,301); return CrearArchivoRoe(errores, entrada.FileName, entrada); } lock (generadorCadenas) { cadenaOriginal = generadorCadenas.CadenaOriginal(strContent); } entrada.CadenaOriginal = cadenaOriginal; DateTime datFechaExpiracionCSD = entrada.Certificate.NotAfter; DateTime datFechaEfectivaCSD = entrada.Certificate.NotBefore; var validadorDatos = new ValidadorDatos32(); var certificado = new X509Certificate2(entrada.Certificate.GetEncoded()); errores.Add("Certificado emitido por el SAT: ",validadorDatos.ValidaCertificadoAc(certificado)); errores.Add("El certificado es un CSD: " ,validadorDatos.ValidaCertificadoCSDnoFIEL(certificado)); //-Que el sello del Emisor sea válido string hash = null; byte[] firma = null; try { firma = Convert.FromBase64String(entrada.Sello); } catch (Exception ee) { Logger.Error(ee); errores.Add("Sello del comprobante válido: ",302); } if (firma != null) { errores.Add("Sello del comprobante válido: ",validadorDatos.ValidarSello(cadenaOriginal, firma, certificado, ref hash)); } Logger.Debug(hash); errores.Add("RFC del emisor coincide con el RFC del certificado: ",validadorDatos.ValidaRFCEmisor(entrada.RfcEmisor, certificado.SubjectName.Name)); errores.Add("Fecha de emisión del comprobante dentro del rango de validéz del certificado: ",validadorDatos.ValidaFechaEmisionXml(entrada.Fecha, datFechaExpiracionCSD, datFechaEfectivaCSD)); if (entrada.Version == "3.2") { //errores.Add("Fecha de timbrado del comprobante posterior a la fecha de emisión: ", validadorDatos.ValidaRangoFecha(entrada.Fecha, entrada.FechaTimbrado)); errores.Add("Comprobante emitido después de 2011: ", validadorDatos.ValidaFechaEmision2011(entrada.Fecha)); errores.Add("No. de Certificado del PAC: " + entrada.NoCertificadoSat, 0); errores.Add("Verificacion del sello del PAC", validadorCertificado.VerificaSelloPac(entrada.NoCertificadoSat, entrada.SelloSat, entrada.CadenaTimbre)); } else { errores.Add("Serie y Folio :" , validadorDatos.VerificaFolioSerieCfd(entrada.Folio, entrada.Serie,entrada.NoAprobacion, entrada.AnoAprobacion)); } //int suma = 0; //if (Math.Abs(entrada.SubTotal - entrada.SumaConceptos) > 0.01) //{ // suma = 100; //} //errores.Add("La suma de conceptos coincide con el subtotal", suma); return CrearArchivoRoe(errores, entrada.FileName, entrada); } catch (Exception ex) { Logger.Error(ex); this.CrearArchivoRoe(new Dictionary<string, int> {{"Error de validacion ", 000}}, entrada.FileName,entrada, ex.Message); throw; } }
public ValidadorInput Validate2(XmlReader reader, string content) { var result = new ValidadorInput() { }; result.XmlString = content; try { result.Errores = new List <string>(); settings.ValidationEventHandler += (s, a) => { XmlReader r = (XmlReader)s; result.Errores.Add(r.Name + " - " + a.Message); }; double totalImpuestos = 0; double totalConceptos = 0; double totalRetenciones = 0; while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (reader.LocalName == "Concepto") { totalConceptos = totalConceptos + double.Parse(reader.GetAttribute("importe")); } if (reader.LocalName == "Traslado") { totalImpuestos = totalImpuestos + double.Parse(reader.GetAttribute("importe")); } if (reader.LocalName == "Retencion") { totalRetenciones = totalRetenciones + double.Parse(reader.GetAttribute("importe")); } if (reader.LocalName == "Emisor") { result.RfcEmisor = reader.GetAttribute("rfc"); } if (reader.LocalName == "TimbreFiscalDigital") { result.CadenaTimbre = "||" + reader.GetAttribute("version").Trim() + "|" + reader.GetAttribute("UUID").Trim() + "|" + reader.GetAttribute("FechaTimbrado") + "|" + reader.GetAttribute("selloCFD").Trim() + "|" + reader.GetAttribute("noCertificadoSAT").Trim() + "||"; result.SelloSat = reader.GetAttribute("selloSAT").Trim(); try { result.FechaTimbrado = Convert.ToDateTime(reader.GetAttribute("FechaTimbrado")); } catch (Exception ee) { result.Errores.Add("Formato incorrecto de fecha"); Logger.Error("FechaTimbrado->" + reader.GetAttribute("FechaTimbrado"), ee); result.Valido = false; break; } result.NoCertificadoSat = reader.GetAttribute("noCertificadoSAT"); } if (reader.LocalName == "Comprobante") { var fecha = reader.GetAttribute("fecha"); try { result.Fecha = Convert.ToDateTime(fecha); } catch (Exception ee) { result.Errores.Add("Formato incorrecto de fecha"); Logger.Error("Fecha->" + fecha, ee); result.Valido = false; break; } result.Total = double.Parse(reader.GetAttribute("total")); result.SubTotal = double.Parse(reader.GetAttribute("subTotal")); result.Sello = reader.GetAttribute("sello"); result.NoCertificado = reader.GetAttribute("noCertificado"); result.Certificado = reader.GetAttribute("certificado"); X509CertificateParser parser = new X509CertificateParser(); result.Certificate = parser.ReadCertificate(Convert.FromBase64String(result.Certificado)); result.Version = reader.GetAttribute("version"); if (result.Version == "2.2") { result.Folio = reader.GetAttribute("folio"); result.Serie = reader.GetAttribute("serie"); result.NoAprobacion = reader.GetAttribute("noAprobacion"); result.AnoAprobacion = reader.GetAttribute("anoAprobacion"); } } } } if (result.Errores.Count == 0) { result.SumaImpuestos = totalImpuestos; result.SumaRetenciones = totalRetenciones; result.SumaConceptos = totalConceptos; result.Valido = true; } } catch (Exception ee) { Logger.Error(ee); } return(result); }
private ResultadoValidacion CrearArchivoRoe(Dictionary<string, int> errores, string archivoEntrada, ValidadorInput input, string extraInfo = "") { var resultado = new List<Validacion>(); var errorOutput = new StringBuilder(); errorOutput.AppendLine("Archivo Invalido"); errorOutput.AppendLine("Path: " + archivoEntrada); foreach (KeyValuePair<string, int> error in errores) { resultado.Add(new Validacion { Descripcion = error.Key, Valido = (error.Value == 0), Error = (error.Value == 0 ? "OK" : _erroresValidacion[error.Value]) }); } bool valido = errores.All(p => p.Value == 0); ValidadorContract c = new ValidadorContract(); foreach (PropertyInfo propertyInfo in input.GetType().GetProperties()) { var property = c.GetType().GetProperties().Where(p => p.Name == propertyInfo.Name).FirstOrDefault(); if (property != null) { property.SetValue(c,propertyInfo.GetValue(input, new object[0]),new object[0]); } } return new ResultadoValidacion() {Valido = valido, Detalles = resultado, Entrada = c}; }