Beispiel #1
0
        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;
            }

        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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};
        }