/// <summary> /// Obtiene la lista de errore de un sobre recibido /// </summary> /// <param name="docEntry"></param> /// <returns></returns> public List <ErrorValidarSobre> ObtenerErroresSobre(string docEntry) { List <ErrorValidarSobre> listaErrores = new List <ErrorValidarSobre>(); ErrorValidarSobre error = null; string consulta = ""; //Obtener objeto estadar de record set Recordset recSet = null; try { recSet = ProcConexion.Comp.GetBusinessObject(BoObjectTypes.BoRecordset); consulta = "SELECT U_Motivo, U_Glosa, U_Detalle FROM [@TFEESTCFER] WHERE U_ConsRec = '" + docEntry + "'"; //Ejecutar consulta recSet.DoQuery(consulta); //Validar que se hayan obtenido resultado recSet.MoveFirst(); if (recSet.RecordCount > 0) { int i = 0; while (i < recSet.RecordCount) { error = new ErrorValidarSobre(); error.CodigoRechazo = recSet.Fields.Item("U_Motivo").Value + ""; error.DetalleRechazo = recSet.Fields.Item("U_Detalle").Value + ""; error.GlosaRechazo = recSet.Fields.Item("U_Glosa").Value + ""; listaErrores.Add(error); recSet.MoveNext(); i++; } } } catch (Exception) { } finally { if (recSet != null) { //Se libera de memoria el objeto recSet System.Runtime.InteropServices.Marshal.ReleaseComObject(recSet); GC.Collect(); } } return(listaErrores); }
/// <summary> /// Valida que la cantidad Cfes especificados en la linea DGICFE:CantCFE /// corresponda con la cantidad de Cfes dentro del sobre /// </summary> /// <param name="documento"></param> /// <returns></returns> public bool validarCantidadCfe(XmlDocument documento, List <ErrorValidarSobre> listaErrores, string tag) { bool salida = true; int cantCfe = 0, cfesEncontrados = 0; XmlNodeList listaFacturas = null; XmlNodeList listaTickets = null; XmlNodeList listaRemito = null; XmlNodeList listaResguardo = null; try { //Se obtiene el rucEmisor del sobre XmlNodeList cantCfeNL = documento.GetElementsByTagName("CantCFE"); if (cantCfeNL.Count > 0) { cantCfe = Convert.ToInt16(documento.GetElementsByTagName("CantCFE").Item(0).InnerText); tag = ""; } else { cantCfeNL = documento.GetElementsByTagName("DGICFE:CantCFE"); if (cantCfeNL.Count > 0) { cantCfe = Convert.ToInt16(documento.GetElementsByTagName("DGICFE:CantCFE").Item(0).InnerText); tag = "DGICFE:"; } cantCfeNL = documento.GetElementsByTagName("cfe:CantCFE"); if (cantCfeNL.Count > 0) { cantCfe = Convert.ToInt16(documento.GetElementsByTagName("cfe:CantCFE").Item(0).InnerText); tag = "cfe:"; } } tag = ""; if (contieneComprobantes(documento, tag + "eFact")) { listaFacturas = documento.GetElementsByTagName(tag + "eFact"); foreach (XmlElement factura in listaFacturas) { cfesEncontrados++; } } tag = "ns0:"; if (contieneComprobantes(documento, tag + "eFact")) { listaFacturas = documento.GetElementsByTagName(tag + "eFact"); foreach (XmlElement factura in listaFacturas) { cfesEncontrados++; } } tag = "DGICFE:"; if (contieneComprobantes(documento, tag + "eFact")) { listaFacturas = documento.GetElementsByTagName(tag + "eFact"); foreach (XmlElement factura in listaFacturas) { cfesEncontrados++; } } tag = ""; if (contieneComprobantes(documento, tag + "eTck")) { listaTickets = documento.GetElementsByTagName(tag + "eTck"); foreach (XmlElement ticket in listaTickets) { cfesEncontrados++; } } tag = "ns0:"; if (contieneComprobantes(documento, tag + "eTck")) { listaTickets = documento.GetElementsByTagName(tag + "eTck"); foreach (XmlElement ticket in listaTickets) { cfesEncontrados++; } } tag = "DGICFE:"; if (contieneComprobantes(documento, tag + "eTck")) { listaTickets = documento.GetElementsByTagName(tag + "eTck"); foreach (XmlElement ticket in listaTickets) { cfesEncontrados++; } } tag = ""; if (contieneComprobantes(documento, tag + "eRem")) { listaRemito = documento.GetElementsByTagName(tag + "eRem"); foreach (XmlElement remito in listaRemito) { cfesEncontrados++; } } tag = "ns0:"; if (contieneComprobantes(documento, tag + "eRem")) { listaRemito = documento.GetElementsByTagName(tag + "eRem"); foreach (XmlElement remito in listaRemito) { cfesEncontrados++; } } tag = "DGICFE:"; if (contieneComprobantes(documento, tag + "eRem")) { listaRemito = documento.GetElementsByTagName(tag + "eRem"); foreach (XmlElement remito in listaRemito) { cfesEncontrados++; } } tag = ""; if (contieneComprobantes(documento, tag + "eResg")) { listaResguardo = documento.GetElementsByTagName(tag + "eResg"); foreach (XmlElement resguardo in listaResguardo) { cfesEncontrados++; } } tag = "ns0:"; if (contieneComprobantes(documento, tag + "eResg")) { listaResguardo = documento.GetElementsByTagName(tag + "eResg"); foreach (XmlElement resguardo in listaResguardo) { cfesEncontrados++; } } tag = "DGICFE:"; if (contieneComprobantes(documento, tag + "eResg")) { listaResguardo = documento.GetElementsByTagName(tag + "eResg"); foreach (XmlElement resguardo in listaResguardo) { cfesEncontrados++; } } if (cfesEncontrados != cantCfe) { salida = false; ErrorValidarSobre error = new ErrorValidarSobre(); error.CodigoRechazo = Mensaje.errSobValCantCfeCod; error.DetalleRechazo = Mensaje.errSobValCantCfeDetGlo; error.GlosaRechazo = Mensaje.errSobValCantCfeDetGlo; listaErrores.Add(error); } } catch (Exception ex) { app.MessageBox("ValidarSobre/ValidarCantCfe/Error: " + ex.ToString()); salida = false; } return(salida); }
/// <summary> /// Valida el ruc del sobre contra los ruc de los comprobantes /// </summary> /// <param name="documento"></param> /// <returns></returns> public bool validarRucSobreContraComprobante(XmlDocument documento, List <ErrorValidarSobre> listaErrores, string tag) { string rucSobre = ""; bool salida = true; try { //Se obtiene el rucEmisor del sobre //rucSobre = documento.GetElementsByTagName("DGICFE:RUCEmisor").Item(0).InnerText; XmlNodeList rucSobreXNL = documento.GetElementsByTagName("RUCEmisor"); if (rucSobreXNL.Count > 0) { rucSobre = documento.GetElementsByTagName("RUCEmisor").Item(0).InnerText; } else { rucSobreXNL = documento.GetElementsByTagName("DGICFE:RUCEmisor"); if (rucSobreXNL.Count > 0) { rucSobre = documento.GetElementsByTagName("DGICFE:RUCEmisor").Item(0).InnerText; } rucSobreXNL = documento.GetElementsByTagName("cfe:RUCEmisor"); if (rucSobreXNL.Count > 0) { rucSobre = documento.GetElementsByTagName("cfe:RUCEmisor").Item(0).InnerText; } } tag = ""; XmlNodeList listaRucEmisores = documento.GetElementsByTagName(tag + "RUCEmisor"); if (listaRucEmisores.Count == 0) { listaRucEmisores = documento.GetElementsByTagName("ns0:RUCEmisor"); } foreach (XmlElement rucEmisor in listaRucEmisores) { if (!rucSobre.Equals(rucEmisor.InnerText)) { ErrorValidarSobre error = new ErrorValidarSobre(); error.CodigoRechazo = Mensaje.errSobValRucCod; error.DetalleRechazo = Mensaje.errSobValRucDetGlo; error.GlosaRechazo = Mensaje.errSobValRucDetGlo; listaErrores.Add(error); salida = false; } } } catch (Exception ex) { app.MessageBox("ValidarSobre/ValRucContrasobre/Error: " + ex.ToString()); salida = false; } return(salida); }
/// <summary> /// Metodo para realizar las validaciones de los comprobantes fiscales /// </summary> /// <returns></returns> public bool ValidarComprobanteFiscal(XmlDocument documento, int tipo, int numeroCFE, string serieCFE, int inicioCAE, int finCAE, string fechaFirma, string fechaCAE, int docEntry) { bool resultado = true, error = false; //Lista que contiene los errores List <ErrorValidarSobre> listaErrores = new List <ErrorValidarSobre>(); List <string> listaCfe = ObtenerCFEs(documento); foreach (string cfe in listaCfe) { if (ValidarCFESeleccionado(tipo.ToString(), serieCFE, numeroCFE.ToString(), cfe)) { if (!ValidarXsdCFE(cfe)) { //Se activa bandera de error error = true; //Agrega los errores encontrados en la validacion de los foreach (string errorXsd in erroresEncontrados) { //Se crea objeto de error ErrorValidarSobre errorValidar = new ErrorValidarSobre(); errorValidar.CodigoRechazo = Mensaje.errCompValXsdCod; errorValidar.DetalleRechazo = Mensaje.errCompValXsdDet; errorValidar.GlosaRechazo = errorXsd; //Se agrega el error a la lista de errores listaErrores.Add(errorValidar); } } } } if (!ValidarNumeroTipoCFE(tipo, numeroCFE)) { //Se activa bandera de error error = true; ErrorValidarSobre errorValidar = new ErrorValidarSobre(); errorValidar.CodigoRechazo = Mensaje.errCompValNumCFECod; errorValidar.DetalleRechazo = Mensaje.errCompValNumCFEDetGlo; errorValidar.GlosaRechazo = Mensaje.errCompValNumCFEDetGlo; //Se agrega el error a la lista de errores listaErrores.Add(errorValidar); } if (!ValidarNumeroCFEContraCAE(numeroCFE, inicioCAE, finCAE)) { //Se activa bandera de error error = true; //Se crea objeto de error ErrorValidarSobre errorValidar = new ErrorValidarSobre(); errorValidar.CodigoRechazo = Mensaje.errCompValNumCAECFECod; errorValidar.DetalleRechazo = Mensaje.errCompValNumCAECFEDetGlo; errorValidar.GlosaRechazo = Mensaje.errCompValNumCAECFEDetGlo; //Se agrega el error a la lista de errores listaErrores.Add(errorValidar); } //if (ValidarFimaElectronica(documento.InnerXml)) //{ // //Se activa bandera de error // error = true; // //Se crea objeto de error // ErrorValidarSobre errorValidar = new ErrorValidarSobre(); // errorValidar.CodigoRechazo = Mensaje.errCompValFirmaCod; // errorValidar.DetalleRechazo = Mensaje.errCompValFirmaDetGlo; // errorValidar.GlosaRechazo = Mensaje.errCompValFirmaDetGlo; // //Se agrega el error a la lista de errores // listaErrores.Add(errorValidar); //} if (ValidarFechaFirmaContraCAE(fechaFirma, fechaCAE)) { //Se activa bandera de error error = true; //Se crea objeto de error ErrorValidarSobre errorValidar = new ErrorValidarSobre(); errorValidar.CodigoRechazo = Mensaje.errCompValFechaCAECod; errorValidar.DetalleRechazo = Mensaje.errCompValFechaCAEDetGlo; errorValidar.GlosaRechazo = Mensaje.errCompValFechaCAEDetGlo; //Se agrega el error a la lista de errores listaErrores.Add(errorValidar); } if (error == true) { resultado = false; AlmacenarErrores(listaErrores, docEntry); } return(resultado); }
/// <summary> /// Metodo para cargar sobres con facturas desde un archivo xml a la tabla TFESOBFAC y TFESOBFACDET /// </summary> /// <param name="rutaRespuesta"></param> public void GenerarXML(string rutaSobre, string nombreSobre, string correoEmisor) { string contenido = "", tag = "", tag2 = "DGICFE:", tag3 = "cfe:"; bool dgiActivado = false, tag3Activado = false; ValidarSobre validaSobre = new ValidarSobre(); ValidarCFE validaCfe = new ValidarCFE(); ManteUdoConsecutivo manteUdoConsecutivo = new ManteUdoConsecutivo(); ManteUdoCertificadoRecibido manteUdoSobreRecibido = new ManteUdoCertificadoRecibido(); try { XmlDocument documento = new XmlDocument(); List <CertificadoRecibido> listaCertificadosRecibidos = new List <CertificadoRecibido>(); CertificadoRecibido certificadoRecibido; documento.Load(rutaSobre + nombreSobre); //Obtiene el contenido del xml en string contenido = documento.InnerXml; //Se obtiene el nodo princicpal XmlNodeList sobre = documento.GetElementsByTagName("DGICFE:EnvioCFE"); if (sobre.Count == 0) { sobre = documento.GetElementsByTagName("EnvioCFE_entreEmpresas"); } if (sobre.Count == 0) { sobre = documento.GetElementsByTagName("DGICFE:EnvioCFE_entreEmpresas"); dgiActivado = true; } if (sobre.Count == 0) { sobre = documento.GetElementsByTagName("cfe:EnvioCFE_entreEmpresas"); dgiActivado = true; tag3Activado = true; } //Se valida el tipo de tag if (ValidarNSTag(documento)) { tag = "ns0:"; } XmlNodeList caratula = documento.GetElementsByTagName("Caratula"); if (caratula.Count == 0) { caratula = documento.GetElementsByTagName(tag2 + "Caratula"); } if (caratula.Count == 0) { caratula = documento.GetElementsByTagName(tag3 + "Caratula"); } foreach (XmlElement nodoCaratula in caratula) { certificadoRecibido = new CertificadoRecibido(); if (!dgiActivado) { tag2 = ""; } if (tag3Activado) { tag2 = tag3; tag = ""; } //Se obtienen los datos de la caratula certificadoRecibido.RucReceptor = nodoCaratula.GetElementsByTagName(tag2 + "RutReceptor")[0].InnerText; certificadoRecibido.RucEmisor = nodoCaratula.GetElementsByTagName(tag2 + "RUCEmisor")[0].InnerText; certificadoRecibido.IdEmisor = nodoCaratula.GetElementsByTagName(tag2 + "Idemisor")[0].InnerText; certificadoRecibido.FechaSobre = nodoCaratula.GetElementsByTagName(tag2 + "Fecha")[0].InnerText; certificadoRecibido.CantCFE = nodoCaratula.GetElementsByTagName(tag2 + "CantCFE")[0].InnerText; XmlNodeList listaCfes = documento.GetElementsByTagName(tag + "CFE"); foreach (XmlElement nodoCfe in listaCfes) { certificadoRecibido.FechaFirma = nodoCfe.GetElementsByTagName(tag + "TmstFirma")[0].InnerText; certificadoRecibido.TipoCFE = nodoCfe.GetElementsByTagName(tag + "TipoCFE")[0].InnerText; certificadoRecibido.SerieComprobante = nodoCfe.GetElementsByTagName(tag + "Serie")[0].InnerText; certificadoRecibido.NumeroComprobante = nodoCfe.GetElementsByTagName(tag + "Nro")[0].InnerText; certificadoRecibido.FechaEmision = nodoCfe.GetElementsByTagName(tag + "FchEmis")[0].InnerText; certificadoRecibido.RazonSocial = nodoCfe.GetElementsByTagName(tag + "RznSoc")[0].InnerText; //Datos del CAE certificadoRecibido.DNroCAE = nodoCfe.GetElementsByTagName(tag + "DNro")[0].InnerText; certificadoRecibido.HNroCAE = nodoCfe.GetElementsByTagName(tag + "HNro")[0].InnerText; if (!certificadoRecibido.TipoCFE.Equals("182")) { if (!certificadoRecibido.TipoCFE.Equals("282")) { certificadoRecibido.FVenCAE = nodoCfe.GetElementsByTagName(tag + "FecVenc")[0].InnerText; } } //Se inicializa una nueva lista para el detalle de la factura del sobre certificadoRecibido.DetalleCertificadoRecibido = new List <DetCertificadoRecibido>(); string tipoMoneda = ""; foreach (XmlElement totales in nodoCfe.GetElementsByTagName(tag + "Totales")) { tipoMoneda = totales.GetElementsByTagName(tag + "TpoMoneda")[0].InnerText; } foreach (XmlElement detalle in nodoCfe.GetElementsByTagName(tag + "Detalle")) { //Se crea un elemento de detalle de factura DetCertificadoRecibido detalleCertificadoRecibido; foreach (XmlElement item in detalle.GetElementsByTagName(tag + "Item")) { detalleCertificadoRecibido = new DetCertificadoRecibido(); detalleCertificadoRecibido.NumeroComprobante = certificadoRecibido.NumeroComprobante; detalleCertificadoRecibido.SerieComprobante = certificadoRecibido.SerieComprobante; detalleCertificadoRecibido.TipoCFE = certificadoRecibido.TipoCFE; detalleCertificadoRecibido.PrecioUnitario = item.GetElementsByTagName(tag + "PrecioUnitario")[0].InnerText; detalleCertificadoRecibido.MontoItem = item.GetElementsByTagName(tag + "MontoItem")[0].InnerText; detalleCertificadoRecibido.NombreItem = item.GetElementsByTagName(tag + "NomItem")[0].InnerText; string cantidad = item.GetElementsByTagName(tag + "Cantidad")[0].InnerText; cantidad = cantidad.Replace(".", ","); detalleCertificadoRecibido.Cantidad = double.Parse(cantidad); detalleCertificadoRecibido.TipoMoneda = tipoMoneda; //Se agregan los detalles al sobre certificadoRecibido.DetalleCertificadoRecibido.Add(detalleCertificadoRecibido); } } } listaCertificadosRecibidos.Add(certificadoRecibido); } ValidarSobre valida = new ValidarSobre(); List <ErrorValidarSobre> listaErrores = new List <ErrorValidarSobre>(); bool estadoSobre = true; if (!valida.validarRucSobreContraComprobante(documento, listaErrores, tag)) { estadoSobre = false; } if (!valida.validarCantidadCfe(documento, listaErrores, tag)) { estadoSobre = false; } //Valida el sobre con el XSD if (!valida.ValidarXsdSobre(contenido)) { estadoSobre = false; foreach (string rechazo in ValidarSobre.erroresEncontrados) { ErrorValidarSobre error = new ErrorValidarSobre(); error.CodigoRechazo = Mensaje.errSobValXsdCod; error.DetalleRechazo = Mensaje.errSobValXsdDet; error.GlosaRechazo = rechazo; listaErrores.Add(error); } } if (estadoSobre) { //Sobre validado foreach (CertificadoRecibido certRecibido in listaCertificadosRecibidos) { certRecibido.IdConsecutio = ""; //Se insertan los datos en la tabla de la BD manteUdoSobreRecibido.AlmacenarMaestro(certRecibido, correoEmisor, nombreSobre); } } else { //Sobre rechazado if (listaCertificadosRecibidos.Count > 0) { GenerarACK("BS", listaCertificadosRecibidos[0], correoEmisor, listaErrores, nombreSobre); } } } catch (Exception) { //SAPbouiCOM.Framework.Application.SBO_Application.MessageBox("RespuestaSobre/GenerarXml/Error:" + ex.ToString()); } }