private ImpuestosLocales DesSerializarImpuestosLocales(XElement element) { IEnumerable <XElement> ImpL = element.Elements(this._ns + "Complemento"); ImpuestosLocales result; if (ImpL != null) { IEnumerable <XElement> pag = ImpL.Elements(this._ns8 + "ImpuestosLocales"); using (IEnumerator <XElement> enumerator = pag.GetEnumerator()) { if (enumerator.MoveNext()) { XElement e = enumerator.Current; XmlSerializer ser = new XmlSerializer(typeof(ImpuestosLocales)); string xml = e.ToString(); StringReader reader = new StringReader(xml); ImpuestosLocales comLXMLComprobante = (ImpuestosLocales)ser.Deserialize(reader); result = comLXMLComprobante; return(result); } } result = null; } else { result = null; } return(result); }
public bool GenerarXML(out String XML, out String Errores) { XML = String.Empty; Errores = String.Empty; bool Resultado = false; try { if (Pagos != null) { XmlDocument doc = new XmlDocument(); String XMLPago = String.Empty; String ErroresPago = String.Empty; if (Pagos.GenerarXML(out XMLPago, out ErroresPago)) { doc.LoadXml(XMLPago); ComprobanteComplemento ComPago = new ComprobanteComplemento(); ComPago.Any.Add(doc.DocumentElement); if (Complemento == null) { Complemento = new List <ComprobanteComplemento>(); } Complemento.Add(ComPago); } else { Errores += ErroresPago; } } if (ImpuestosLocales != null) { XmlDocument doc = new XmlDocument(); String XMLImpLoc = String.Empty; String ErroresImpLoc = String.Empty; if (ImpuestosLocales.GenerarXML(out XMLImpLoc, out ErroresImpLoc)) { doc.LoadXml(XMLImpLoc); ComprobanteComplemento ComImpLoc = new ComprobanteComplemento(); ComImpLoc.Any.Add(doc.DocumentElement); if (Complemento == null) { Complemento = new List <ComprobanteComplemento>(); } Complemento.Add(ComImpLoc); } else { Errores += ErroresImpLoc; } } if (Nomina != null) { schemaLocation += " http://www.sat.gob.mx/nomina12 http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina12.xsd"; XmlDocument doc = new XmlDocument(); String XMLNomina = String.Empty; String ErroresNomina = String.Empty; if (Nomina.GenerarXML(out XMLNomina, out ErroresNomina)) { doc.LoadXml(XMLNomina); ComprobanteComplemento ComNomina = new ComprobanteComplemento(); ComNomina.Any.Add(doc.DocumentElement); if (Complemento == null) { Complemento = new List <ComprobanteComplemento>(); } Complemento.Add(ComNomina); } else { Errores += ErroresNomina; } } if (String.IsNullOrEmpty(Errores)) { XML = Serialize(System.Text.Encoding.UTF8); XML = XML.Replace("&apos;", "'").Replace("&quot;", """).Replace("&lt;", "<").Replace("&gt;", ">").Replace("&amp;", "&"); return(!String.IsNullOrEmpty(XML)); } else { return(false); } } catch (Exception ex) { if (ex.InnerException != null) { Errores += ex.Message + " innerex: " + ex.InnerException.Message; } else { Errores += ex.Message; } } return(Resultado); }
public TimbradoResponse TimbraCfdiMovil(string userName, string password, string comprobante) { TimbradoResponse result2; try { string erroresNomina = "0"; ServicioTimbradoMovil.Logger.Debug(userName); MembershipUser x = NtLinkLogin.ValidateUser(userName, password); if (x == null) { throw new FaultException("Nombre de usuario o contraseña incorrecta"); } XElement element = XElement.Load(new StringReader(comprobante)); ServicioLocal.Business.Comprobante comp = this.DesSerializar(element); ImpuestosLocales IL = null; if (comprobante.Contains("<ine:INE ")) { string erroINE = ""; INE I = this.DesSerializarINE(element, ref erroINE); ValidarINE VI = new ValidarINE(); erroINE = VI.ProcesarINE(I); if (erroINE != "0") { result2 = new TimbradoResponse { Valido = false, DescripcionError = erroINE }; return(result2); } } if (comprobante.Contains("<ecc11:EstadoDeCuentaCombustible")) { string erroECC = ""; EstadoDeCuentaCombustible E = this.DesSerializarECC(element, ref erroECC); ValidarECC VE = new ValidarECC(); erroECC = VE.ProcesarECC(E, comp.TipoDeComprobante, comp.Version); if (erroECC != "0") { result2 = new TimbradoResponse { Valido = false, DescripcionError = erroECC }; return(result2); } } if (comprobante.Contains("<implocal:ImpuestosLocales")) { IL = this.DesSerializarImpuestosLocales(element); } bool pago10 = comprobante.Contains("pago10:Pagos"); if (pago10) { ServicioLocal.Business.Pagoo.Comprobante pagoDatos = this.DesSerializarP(element); ServicioLocal.Business.Complemento.Pagos pagoss = this.DesSerializarPagos(element); ValidarPago VP = new ValidarPago(); string ErrorPagos = VP.ProcesarPago(comp, pagoss, pagoDatos); if (ErrorPagos != "0") { result2 = new TimbradoResponse { Valido = false, DescripcionError = ErrorPagos }; return(result2); } } NtLinkClientes nlc = new NtLinkClientes(); clientes cliente = nlc.GetCliente(comp.Receptor.Rfc); bool nomin12 = comprobante.Contains("nomina12:Nomina"); List <Nomina> nom = new List <Nomina>(); if (nomin12) { string erroresNom = null; var nomx = this.DesSerializarNomina12(element, ref erroresNom); nom.Add(nomx); if (erroresNom != null) { result2 = new TimbradoResponse { Valido = false, DescripcionError = erroresNom }; return(result2); } } bool ComerExt = comprobante.Contains("cce11:ComercioExterior"); if (comp.Emisor != null && comp.Emisor.Rfc != null) { empresa empresa = new empresa(); if (!TimbradoUtils.EmpresaMultipleRFC(comp.Emisor.Rfc)) { empresa = TimbradoUtils.ValidarUsuario(comp.Emisor.Rfc); } else { empresa = NtLinkUsuarios.GetEmpresaByUserId(x.ProviderUserKey.ToString()); empresa = TimbradoUtils.ValidarUsuarioMultiple(empresa); } if (empresa == null) { result2 = null; } else { string result = null; TimbreFiscalDigital timbre = null; string acuseSat = ""; string hash = null; if (ComerExt && erroresNomina == "0") { string erroresComer = null; ValidarComercioExterior val = new ValidarComercioExterior(); ComercioExterior Comer = this.DesSerializarComercioExterior(element, ref erroresComer); if (erroresComer != null) { result2 = new TimbradoResponse { Valido = false, DescripcionError = erroresComer }; return(result2); } erroresNomina = val.ProcesarComercioExterior(Comer, comp); } if (nomin12 && erroresNomina == "0") { erroresNomina = this._val.ProcesarNomina(nom, comp); } if (erroresNomina == "0") { try { string path = Path.Combine(ConfigurationManager.AppSettings["Resources"], empresa.RFC, "Certs"); X509Certificate2 cert = new X509Certificate2(Path.Combine(path, "csd.cer")); string rutaLlave = Path.Combine(path, "csd.key"); if (File.Exists(rutaLlave + ".pem")) { rutaLlave += ".pem"; } ServicioTimbradoMovil.Logger.Debug("Ruta Llave " + rutaLlave); if (!File.Exists(rutaLlave)) { result2 = new TimbradoResponse { Valido = false, DescripcionError = "Error certificado de la empresa no está cargado en el sistema" }; return(result2); } GeneradorCfdi gen = new GeneradorCfdi(); string sellado = gen.GenerarCfdSinTimbre(comp, cert, rutaLlave, empresa.PassKey, comprobante); if (sellado == null) { result2 = new TimbradoResponse { Valido = false, DescripcionError = "Error al sellar el comprobante: al sellar" }; return(result2); } comprobante = sellado; } catch (FaultException ex) { ServicioTimbradoMovil.Logger.Error(ex); result2 = new TimbradoResponse { Valido = false, DescripcionError = ex.Message }; return(result2); } ValidarCFDI33 valida = new ValidarCFDI33(); string errorCFDI33 = valida.ProcesarCFDI33(comp, comprobante, pago10, ComerExt, IL); if (errorCFDI33 != "0") { result2 = new TimbradoResponse { Valido = false, DescripcionError = errorCFDI33 }; } else { Dictionary <int, string> dict = this._val.ProcesarCadena(comp.Emisor.Rfc, comprobante, ref result, ref timbre, ref acuseSat, ref hash); if (timbre != null && timbre.SelloSAT != null && dict.Count == 0) { if (!string.IsNullOrEmpty(comp.Confirmacion)) { using (NtLinkLocalServiceEntities db = new NtLinkLocalServiceEntities()) { ConfirmacionTimbreWs33 C = db.ConfirmacionTimbreWs33.FirstOrDefault((ConfirmacionTimbreWs33 p) => p.Folio == comp.Folio && p.RfcEmisor == comp.Emisor.Rfc && p.RfcReceptor == comp.Receptor.Rfc); C.procesado = new bool?(true); db.ConfirmacionTimbreWs33.ApplyCurrentValues(C); db.SaveChanges(); } } if (ConfigurationManager.AppSettings["Pruebas"] == "true") { timbre.SelloSAT = "Inválido, Ambiente de pruebas"; } string cfdiTimbrado = result; if (ConfigurationManager.AppSettings["EnvioSat"] == "false") { if (!TimbradoUtils.GuardaFactura(comp.Fecha, comp.Emisor.Rfc, comp.Receptor.Rfc, timbre.UUID, cfdiTimbrado, hash, empresa, true, false)) { throw new Exception("Error al abrir el comprobante"); } NtLinkFactura fac = new NtLinkFactura(0); if (string.IsNullOrEmpty(empresa.RegimenFiscal)) { throw new FaultException("Debes capturar el regimen fiscal de la empresa"); } fac.Emisor = empresa; fac.Receptor = cliente; fac.Factura = this.CrearFactura(comp, empresa.IdEmpresa, cliente.idCliente); fac.Factura.Uid = timbre.UUID; fac.Save(); comp.Complemento = new ComprobanteComplemento(); comp.Complemento.timbreFiscalDigital = timbre; comp.XmlString = cfdiTimbrado; comp.CadenaOriginalTimbre = timbre.cadenaOriginal; string saldo = comp.Total.ToString(CultureInfo.InvariantCulture); comp.CantidadLetra = CantidadLetra.Enletras(saldo.ToString(), comp.Moneda); comp.Regimen = empresa.RegimenFiscal; if (comp.TipoDeComprobante.ToString() == "ingreso") { comp.Titulo = "Factura"; } else if (comp.TipoDeComprobante.ToString() == "egreso") { comp.Titulo = "Nota de Crédito"; } string ruta = Path.Combine(ConfigurationManager.AppSettings["Salida"], empresa.RFC); if (!Directory.Exists(ruta)) { Directory.CreateDirectory(ruta); } string xmlFile = Path.Combine(ruta, timbre.UUID + ".xml"); ServicioTimbradoMovil.Logger.Debug(comp.XmlString); StreamWriter sw = new StreamWriter(xmlFile, false, Encoding.UTF8); sw.Write(comp.XmlString); sw.Close(); byte[] pdf = new byte[0]; try { long id = 0L; GeneradorCfdi gen = new GeneradorCfdi(); pdf = gen.GetPdfFromComprobante(comp, empresa.Orientacion, fac.Factura.TipoDocumento, ref id, fac.Factura.Metodo); string pdfFile = Path.Combine(ruta, timbre.UUID + ".pdf"); File.WriteAllBytes(pdfFile, pdf); } catch (Exception ee) { ServicioTimbradoMovil.Logger.Error(ee); if (ee.InnerException != null) { ServicioTimbradoMovil.Logger.Error(ee.InnerException); } } } string totalLetra = comp.Total.ToString(CultureInfo.InvariantCulture); string enteros; string decimales; if (totalLetra.IndexOf('.') == -1) { enteros = "0"; decimales = "0"; } else { enteros = totalLetra.Substring(0, totalLetra.IndexOf('.')); decimales = totalLetra.Substring(totalLetra.IndexOf('.') + 1); } string total = enteros.PadLeft(18, '0') + "." + decimales.PadRight(6, '0'); int tam_var = comp.Sello.Length; string Var_Sub = comp.Sello.Substring(tam_var - 8, 8); string URL = "https://verificacfdi.facturaelectronica.sat.gob.mx/default.aspx"; string cadenaCodigo = string.Concat(new string[] { URL, "?&id=", timbre.UUID, "&fe=", Var_Sub, "&re=", comp.Emisor.Rfc, "&rr=", comp.Receptor.Rfc, "&tt=", total }); string qr = this.GetQrCode(cadenaCodigo); result2 = new TimbradoResponse { Valido = true, QrCodeBase64 = qr, CadenaTimbre = timbre.cadenaOriginal, Cfdi = cfdiTimbrado }; } else if (timbre != null && timbre.SelloSAT == null && dict.Count == 0) { string totalLetra = comp.Total.ToString(CultureInfo.InvariantCulture); string enteros; string decimales; if (totalLetra.IndexOf('.') == -1) { enteros = "0"; decimales = "0"; } else { enteros = totalLetra.Substring(0, totalLetra.IndexOf('.')); decimales = totalLetra.Substring(totalLetra.IndexOf('.') + 1); } string total = enteros.PadLeft(18, '0') + "." + decimales.PadRight(6, '0'); int tam_var = comp.Sello.Length; string Var_Sub = comp.Sello.Substring(tam_var - 8, 8); string URL = "https://verificacfdi.facturaelectronica.sat.gob.mx/default.aspx"; string cadenaCodigo = string.Concat(new string[] { URL, "?&id=", timbre.UUID, "&fe=", Var_Sub, "&re=", comp.Emisor.Rfc, "&rr=", comp.Receptor.Rfc, "&tt=", total }); string qr = this.GetQrCode(cadenaCodigo); result2 = new TimbradoResponse { Valido = true, QrCodeBase64 = qr, CadenaTimbre = timbre.cadenaOriginal, Cfdi = result }; } else if (dict.Count > 0) { StringBuilder res = new StringBuilder(); foreach (KeyValuePair <int, string> d in dict) { res.AppendLine(d.Key.ToString() + " - " + d.Value.ToString()); } result2 = new TimbradoResponse { Valido = false, DescripcionError = res.ToString() }; } else { ServicioTimbradoMovil.Logger.Error("Error al abrir el comprobante:" + comprobante); result2 = new TimbradoResponse { Valido = false, DescripcionError = "Error al abrir el comprobante" }; } } } else { ServicioTimbradoMovil.Logger.Error("Error al abrir el comprobante: " + erroresNomina); result2 = new TimbradoResponse { Valido = false, DescripcionError = erroresNomina }; } } } else { ServicioTimbradoMovil.Logger.Error("Error al abrir el comprobante:" + comprobante); result2 = new TimbradoResponse { Valido = false, DescripcionError = "Error al abrir el comprobante" }; } } catch (FaultException ex) { ServicioTimbradoMovil.Logger.Error(ex); result2 = new TimbradoResponse { Valido = false, DescripcionError = ex.Message }; } catch (Exception ex2) { ServicioTimbradoMovil.Logger.Error(ex2); throw new FaultException("Error al abrir el comprobante"); } return(result2); }
private void btnTimbraCfdiEntidad_Click(object sender, EventArgs e) { //Este ejemplo está dirigido a aquellos integradores que aún no generan el xml (CFDI) //Inicializamos el conector el parámetro indica el ambiente en el que se utilizará //Fasle = Ambiente de pruebas //True = Ambiente de producción Conector conector = new Conector(false); //Establecemos las credenciales para el permiso de conexión //Ambiente de pruebas = mvpNUXmQfK8= //Ambiente de producción = Esta será asignado por el proveedor al salir a productivo conector.EstableceCredenciales("mvpNUXmQfK8="); //Creamos un comprobante por medio de la entidad Comprobante Comprobante comprobante = new Comprobante(); //Llenamos datos del comprobante comprobante.serie = "F"; comprobante.folio = "1"; comprobante.fecha = DateTime.Now; comprobante.formaDePago = "Pago en una sola exhibición"; comprobante.metodoDePago = "Transferencia bancaria"; comprobante.subTotal = 100; comprobante.total = 116; //TIPO DE COMPROBANTE //Ingreso: Factura 1, Rec honorarios 4, rec de arrendamiento 5, Rec donativos 7, Nota de cargo 3 //Egreso: Nota de credito 2 //Traslado: Carta porte 6 comprobante.tipoDeComprobante = ComprobanteTipoDeComprobante.ingreso; comprobante.LugarExpedicion = "Mexico, Distrito Federal"; //Llenamos datos del emisor comprobante.Emisor = new ComprobanteEmisor(); comprobante.Emisor.rfc = "AAA010101AAA"; comprobante.Emisor.nombre = "Empresa de pruebas S.A. de C.V."; //Llenamos domicilio fiscal del emisor comprobante.Emisor.DomicilioFiscal = new t_UbicacionFiscal(); comprobante.Emisor.DomicilioFiscal.calle = "Calle pruebas"; comprobante.Emisor.DomicilioFiscal.noExterior = "1"; comprobante.Emisor.DomicilioFiscal.noInterior = "A"; comprobante.Emisor.DomicilioFiscal.colonia = "Colonia pruebas"; comprobante.Emisor.DomicilioFiscal.municipio = "Municipio pruebas"; comprobante.Emisor.DomicilioFiscal.estado = "Estado pruebas"; comprobante.Emisor.DomicilioFiscal.pais = "Mexico"; comprobante.Emisor.DomicilioFiscal.codigoPostal = "53125"; //Llenamos regimen fiscal del emisor comprobante.Emisor.RegimenFiscal = new ComprobanteEmisorRegimenFiscal[1]; comprobante.Emisor.RegimenFiscal[0] = new ComprobanteEmisorRegimenFiscal(); comprobante.Emisor.RegimenFiscal[0].Regimen = "Regimen general de ley personas morales"; //Llena datos de expedido en (Solo en caso de que el comprobante haya sido expedido en una sucursal y no en la matriz comprobante.Emisor.ExpedidoEn = new t_Ubicacion(); comprobante.Emisor.ExpedidoEn.calle = "Calle expedido en"; comprobante.Emisor.ExpedidoEn.noExterior = "2"; comprobante.Emisor.ExpedidoEn.noInterior = "B"; comprobante.Emisor.ExpedidoEn.colonia = "Colonia expedido en"; comprobante.Emisor.ExpedidoEn.municipio = "Municipio expedido en"; comprobante.Emisor.ExpedidoEn.estado = "Estado expedido en"; comprobante.Emisor.ExpedidoEn.pais = "Mexico"; comprobante.Emisor.ExpedidoEn.codigoPostal = "53120"; //Llena datos del receptor comprobante.Receptor = new ComprobanteReceptor(); comprobante.Receptor.rfc = "BBB010101BBB"; comprobante.Receptor.nombre = "Cliente de prueba S.A. de C.V."; //Llena domicilio del receptor comprobante.Receptor.Domicilio = new t_Ubicacion(); comprobante.Receptor.Domicilio.calle = "Calle cliente"; comprobante.Receptor.Domicilio.noExterior = "3"; comprobante.Receptor.Domicilio.noInterior = "C"; comprobante.Receptor.Domicilio.colonia = "Colonia cliente"; comprobante.Receptor.Domicilio.municipio = "Municipio cliente"; comprobante.Receptor.Domicilio.estado = "Estado cliente"; comprobante.Receptor.Domicilio.pais = "México"; comprobante.Receptor.Domicilio.codigoPostal = "5"; //Llenamos los conceptos comprobante.Conceptos = new ComprobanteConcepto[2]; //Concepto 1 comprobante.Conceptos[0] = new ComprobanteConcepto(); comprobante.Conceptos[0].cantidad = 1; comprobante.Conceptos[0].unidad = "PZA"; comprobante.Conceptos[0].noIdentificacion = "1"; comprobante.Conceptos[0].descripcion = "Prueba concepto 1"; comprobante.Conceptos[0].valorUnitario = 50; comprobante.Conceptos[0].importe = 50; //Concepto 2 comprobante.Conceptos[1] = new ComprobanteConcepto(); comprobante.Conceptos[1].cantidad = 1; comprobante.Conceptos[1].unidad = "PZA"; comprobante.Conceptos[1].noIdentificacion = "1"; comprobante.Conceptos[1].descripcion = "Prueba concepto 2"; comprobante.Conceptos[1].valorUnitario = 50; comprobante.Conceptos[1].importe = 50; //Llenamos impuestos comprobante.Impuestos = new ComprobanteImpuestos(); comprobante.Impuestos.Traslados = new ComprobanteImpuestosTraslado[1]; comprobante.Impuestos.Traslados[0] = new ComprobanteImpuestosTraslado(); comprobante.Impuestos.Traslados[0].importe = 16; comprobante.Impuestos.Traslados[0].impuesto = ComprobanteImpuestosTrasladoImpuesto.IVA; comprobante.Impuestos.Traslados[0].tasa = 16; List <XmlElement> LXmlComplementos = new List <XmlElement>(); ImpuestosLocales impLocales = new ImpuestosLocales(); List <ImpuestosLocalesTrasladosLocales> traslados = new List <ImpuestosLocalesTrasladosLocales>(); //Agregamos una retención local ImpuestosLocalesTrasladosLocales traslado = new ImpuestosLocalesTrasladosLocales(); traslado.Importe = 12; traslado.ImpLocTrasladado = "Impuesto sobre hospedaje"; traslado.TasadeTraslado = 2; traslados.Add(traslado); impLocales.TrasladosLocales = traslados.ToArray <ImpuestosLocalesTrasladosLocales>(); impLocales.version = "1.0"; //Totales impLocales.TotaldeRetenciones = 0; impLocales.TotaldeTraslados = 20; XmlSerializerNamespaces nsImpLocales = new XmlSerializerNamespaces(); nsImpLocales.Add("implocal", "http://www.sat.gob.mx/implocal"); string xmlImpLocales = XMLUtilerias.SerializaObjeto(impLocales, typeof(ImpuestosLocales), nsImpLocales); XmlDocument docImpuestosLocales = new XmlDocument(); docImpuestosLocales.LoadXml(xmlImpLocales); comprobante.ImpLocalSpecified = true; LXmlComplementos.Add(docImpuestosLocales.DocumentElement); comprobante.Complemento = new ComprobanteComplemento(); comprobante.Complemento.Any = LXmlComplementos.ToArray <XmlElement>(); ////INICIA EJEMPLO PARA COMPLEMENTO NÓMINA ////Descomentar esta sección para utilizar el complemento nómina ////Declaramos arreglo de complementos //List<XmlElement> LXmlComplementos = new List<XmlElement>(); ////Lenamos clase Nomina con datos //Nomina nomina = new Nomina(); //nomina.RegistroPatronal = "1234567890"; //nomina.NumEmpleado = "1"; //nomina.CURP = "AAAA800101HDFTRN04"; //nomina.TipoRegimen = 1; //nomina.NumSeguridadSocial = "1234567890"; //nomina.FechaPago = DateTime.Now; //nomina.FechaInicialPago = DateTime.Now; //nomina.FechaFinalPago = DateTime.Now; //nomina.NumDiasPagados = 15; //nomina.Departamento = "DESARROLLO"; //nomina.CLABE = "123456789012345678"; //nomina.Banco = "001"; //if (nomina.Banco != null) // nomina.BancoSpecified = true; //else // nomina.BancoSpecified = false; //nomina.FechaInicioRelLaboral = DateTime.Now; //if (nomina.FechaInicioRelLaboral != null) // nomina.FechaInicioRelLaboralSpecified = true; //else // nomina.FechaInicioRelLaboralSpecified = false; //nomina.Antiguedad = 45; //if (nomina.Antiguedad != 0) // nomina.AntiguedadSpecified = true; //else // nomina.AntiguedadSpecified = false; //nomina.Puesto = "PROGRAMADOR"; //nomina.TipoContrato = "BASE"; //nomina.TipoJornada = "DIURNA"; //nomina.PeriodicidadPago = "QUINCENAL"; //nomina.SalarioBaseCotApor = 1000; //if (nomina.SalarioBaseCotApor != 0) // nomina.SalarioBaseCotAporSpecified = true; //else // nomina.SalarioBaseCotAporSpecified = false; //nomina.RiesgoPuesto = 1; //if (nomina.RiesgoPuesto != 0) // nomina.RiesgoPuestoSpecified = true; //else // nomina.RiesgoPuestoSpecified = false; //nomina.SalarioDiarioIntegrado = 150; //if (nomina.SalarioDiarioIntegrado != 0) // nomina.SalarioDiarioIntegradoSpecified = true; //else // nomina.SalarioDiarioIntegradoSpecified = false; //nomina.Percepciones = new NominaPercepciones(); //nomina.Percepciones.Percepcion = new NominaPercepcionesPercepcion[1]; //nomina.Percepciones.TotalExento = 100; //nomina.Percepciones.TotalGravado = 200; //nomina.Percepciones.Percepcion[0] = new NominaPercepcionesPercepcion(); //nomina.Percepciones.Percepcion[0].TipoPercepcion = "001"; //nomina.Percepciones.Percepcion[0].Clave = "1"; //nomina.Percepciones.Percepcion[0].Concepto = "SALARIO"; //nomina.Percepciones.Percepcion[0].ImporteGravado = 1000; //nomina.Percepciones.Percepcion[0].ImporteExento = 500; //System.Xml.Serialization.XmlSerializerNamespaces nsNominas = new System.Xml.Serialization.XmlSerializerNamespaces(); //nsNominas.Add("nomina", "http://www.sat.gob.mx/nomina"); //string xmlNomina = XMLUtilerias.SerializaObjeto(nomina, typeof(Nomina), nsNominas); //XmlDocument docNominas = new XmlDocument(); //docNominas.LoadXml(xmlNomina); //comprobante.NominasSpecified = true; //LXmlComplementos.Add(docNominas.DocumentElement); ////FIN EJEMPLO PARA COMPLEMENTO NÓMINA ////INICIA EJEMPLO PARA COMPLEMENTO IMPUESTOS LOCALES ////Descomentar esta sección para utilizar el complemento impuestos locales ////Declaramos arreglo de complementos //List<XmlElement> LXmlComplementos = new List<XmlElement>(); //ImpuestosLocales impLocales = new ImpuestosLocales(); //List<ImpuestosLocalesTrasladosLocales> traslado = new List<ImpuestosLocalesTrasladosLocales>(); //ImpuestosLocalesTrasladosLocales tras = new ImpuestosLocalesTrasladosLocales(); //tras.Importe = 13; //tras.ImpLocTrasladado = "Traslado local ejemplo"; //tras.TasadeTraslado = 13; //traslado.Add(tras); //impLocales.TrasladosLocales = traslado.ToArray<ImpuestosLocalesTrasladosLocales>(); //impLocales.version = "1.0"; ////Totales //impLocales.TotaldeTraslados = 13; //impLocales.TotaldeRetenciones = 0; //XmlSerializerNamespaces nsImpLocales = new XmlSerializerNamespaces(); //nsImpLocales.Add("implocal", "http://www.sat.gob.mx/implocal"); //string xmlImpLocales = XMLUtilerias.SerializaObjeto(impLocales, typeof(ImpuestosLocales), nsImpLocales); //XmlDocument docImpuestosLocales = new XmlDocument(); //docImpuestosLocales.LoadXml(xmlImpLocales); //comprobante.ImpLocalSpecified = true; //LXmlComplementos.Add(docImpuestosLocales.DocumentElement); ////FIN EJEMPLO PARA COMPLEMENTO IMPUESTOS LOCALES ////COMPLEMENTOS UTILIZADOS? ////Descomentar esta sección si utilizaste algún complemento como nóminas, impuestos locales, donativos, estados de cuenta etc.. //comprobante.Complemento = new ComprobanteComplemento(); //comprobante.Complemento.Any = LXmlComplementos.ToArray<XmlElement>(); ////INICIA EJEMPLO PARA ADDENDAS ////Descomentar esta sección para agregar una addenda al comprobante ////Creamos nuestra addenda //string miAddendaEjemplo = "<Documento><Cabezero dato=\"valor\" dato2=\"valor2\"><Cuerpo datoCuerpo=\"valorCuerpo\" datoCuerpo2=\"valorCuerpo2\"/></Cabezero></Documento>"; ////Transformamos a XmlElement //System.Xml.XmlDocument docAddenda = new System.Xml.XmlDocument(); //docAddenda.LoadXml(miAddendaEjemplo); //XmlElement xmlAdenda = docAddenda.DocumentElement; ////Agregamos addenda //comprobante.Addenda = new ComprobanteAddenda(); //comprobante.Addenda.Any = new XmlElement[1]; //comprobante.Addenda.Any[0] = xmlAdenda; //Timbramos el CFDI por medio del conector y guardamos resultado ResultadoTimbre resultadoTimbre; resultadoTimbre = conector.TimbraCFDI(comprobante); //Verificamos el resultado if (resultadoTimbre.Exitoso) { //El comprobante fue timbrado exitosamente //Guardamos xml cfdi if (resultadoTimbre.GuardaXml("C:\\", "timbrado")) { MessageBox.Show("El xml fue guardado correctamente"); } else { MessageBox.Show("Ocurrió un error al guardar el comprobante"); } //Los siguientes datos deberán ir en la respresentación impresa ó PDF //1.- Código bidimensional if (resultadoTimbre.GuardaCodigoBidimensional("C:\\", "codigo")) { MessageBox.Show("El código bidimensional fue guardado correctamente"); } else { MessageBox.Show("Ocurrió un error al guardar el código bidimensional"); } //2.- Folio fiscal string folioFiscal = resultadoTimbre.FolioUUID; //3.- No. Certificado del Emisor string noCertificado = resultadoTimbre.No_Certificado; //4.- No. Certificado del SAT string noCertificadoSAT = resultadoTimbre.No_Certificado_SAT; //5.- Fecha y Hora de certificación string fechaCert = resultadoTimbre.FechaCertificacion; //6.- Sello del cfdi string selloCFDI = resultadoTimbre.SelloCFDI; //7.- Sello del SAT string selloSAT = resultadoTimbre.SelloSAT; //8.- Cadena original de complemento de certificación string cadena = resultadoTimbre.CadenaTimbre; MessageBox.Show("Timbrado Exitoso"); } else { //No se pudo timbrar, mostramos respuesta MessageBox.Show(resultadoTimbre.Descripcion); } }
/// <summary> /// Timbra un comprobante /// </summary> /// <param name="comprobante">Documento para validar y timbrar</param> /// <returns>Una cadena con el timbre fiscal digital (TFD)</returns> public string TimbraCfdi(string comprobante, string userName, string password, string LLave, string aplicacion) { string result2; try { if (string.IsNullOrEmpty(userName)) { return("Nombre de usuario o contraseña incorrecta"); } CertificadorService.Logger.Debug(userName); if (aplicacion == "CON") { var Licencia = ValidarLicencia(LLave); if (Licencia == false) { return("Licencia no valida"); } } MembershipUser x = NtLinkLogin.ValidateUser(userName, password); if (x == null) { throw new FaultException("Nombre de usuario o contraseña incorrecta"); } XElement element = XElement.Load(new StringReader(comprobante)); ServicioLocal.Business.Comprobante comp = this.DesSerializar(element); empresa empres = new empresa(); if (comp.Emisor != null && comp.Emisor.Rfc != null) { string vemp = ValidarUsuario(comp.Emisor.Rfc, x, ref empres); if (vemp != "OK") { return(vemp); } } else { return("Error: Los datos del emisor incompletos"); } //------------------------- if (comprobante.Contains("<ieeh:IngresosHidrocarburos")) { string erroIH = ""; IngresosHidrocarburos I = this.DesSerializarIH(element, ref erroIH); ValidarIngresoHidrocarburos VI = new ValidarIngresoHidrocarburos(); erroIH = VI.ProcesarIngresoHidrocarburos(I, comp.Version, comp.TipoDeComprobante, comp.Total); if (erroIH != "0") { result2 = erroIH; return(result2); } } if (comprobante.Contains("<gceh:GastosHidrocarburos")) { string erroGH = ""; GastosHidrocarburos I2 = this.DesSerializarGH(element, ref erroGH); ValidarGastosHidrocarburos VI2 = new ValidarGastosHidrocarburos(); erroGH = VI2.ProcesarGastosHidrocarburos(I2, comp.Version, comp.TipoDeComprobante); if (erroGH != "0") { result2 = erroGH; return(result2); } } ImpuestosLocales IL = null; if (comprobante.Contains("<implocal:ImpuestosLocales")) { IL = this.DesSerializarImpuestosLocales(element); } bool pago10 = comprobante.Contains("pago10:Pagos"); if (comp.TipoDeComprobante == "P" && !pago10) { result2 = "CFDI no contiene el complemento PAGO"; return(result2); } if (pago10) { ServicioLocal.Business.Pagoo.Comprobante pagoDatos = this.DesSerializarP(element); ServicioLocal.Business.Complemento.Pagos pagoss = this.DesSerializarPagos(element); ValidarPago VP = new ValidarPago(); string ErrorPagos = VP.ProcesarPago(comp, pagoss, pagoDatos); if (ErrorPagos != "0") { result2 = ErrorPagos; return(result2); } } bool ComerExt = comprobante.Contains("cce11:ComercioExterior"); ValidarCFDI33 valida = new ValidarCFDI33(); string errorCFDI33 = valida.ProcesarCFDI33(comp, comprobante, pago10, ComerExt, IL); if (errorCFDI33 != "0") { CertificadorService.Logger.Error("Error al abrir el comprobante: " + errorCFDI33); return(errorCFDI33); } bool nomin12 = comprobante.Contains("nomina12:Nomina"); List <Nomina> nom = new List <Nomina>(); if (nomin12) { string erroresNom = null; var nomx = this.DesSerializarNomina12(element, ref erroresNom); nom.Add(nomx); if (erroresNom != null) { result2 = erroresNom; return(result2); } } NtLinkSistema nls = new NtLinkSistema(); string result = null; TimbreFiscalDigital timbre = null; string acuseSat = ""; string hash = null; string erroresNomina = "0"; if (ComerExt && erroresNomina == "0") { string erroresComer = null; ValidarComercioExterior val = new ValidarComercioExterior(); ComercioExterior Comer = this.DesSerializarComercioExterior(element, ref erroresComer); if (erroresComer != null) { result2 = erroresComer; return(result2); } erroresNomina = val.ProcesarComercioExterior(Comer, comp); } if (nomin12 && erroresNomina == "0") { erroresNomina = this.val.ProcesarNomina(nom, comp); if (erroresNomina != "0") { return(erroresNomina); } } Dictionary <int, string> dict = this.val.ProcesarCadena(comp.Emisor.Rfc, comprobante, ref result, ref timbre, ref acuseSat, ref hash); if (timbre != null && timbre.SelloSAT != null && dict.Count == 0) { SerializadorTimbres sert = new SerializadorTimbres(); if (ConfigurationManager.AppSettings["Pruebas"] == "true") { timbre.SelloSAT = "Inválido, Ambiente de pruebas"; } string res = sert.GetTimbreXml(timbre); string cfdiTimbrado = result; if (ConfigurationManager.AppSettings["EnvioSat"] == "false") { if (!TimbradoUtils.GuardaFactura(comp.Fecha, comp.Emisor.Rfc, comp.Receptor.Rfc, timbre.UUID, cfdiTimbrado, hash, empres, true, false)) { throw new Exception("Error al abrir el comprobante"); } } result2 = res; } else { if (timbre != null && timbre.SelloSAT == null && dict.Count == 0) { XElement el = XElement.Parse(result); XElement complemento = el.Elements(Constantes.CFDVersionNamespace + "Complemento").FirstOrDefault <XElement>(); if (complemento != null) { XElement t = complemento.Elements(Constantes.CFDTimbreFiscalVersionNamespace + "TimbreFiscalDigital").FirstOrDefault <XElement>(); if (t != null) { SidetecStringWriter sw = new SidetecStringWriter(Encoding.UTF8); t.Save(sw, SaveOptions.DisableFormatting); result2 = sw.ToString(); return(result2); } } } if (dict.Count > 0) { StringBuilder res2 = new StringBuilder(); foreach (KeyValuePair <int, string> d in dict) { res2.AppendLine(d.Key.ToString() + " - " + d.Value.ToString()); } result2 = res2.ToString(); } else { CertificadorService.Logger.Error("Error al abrir el comprobante: " + comprobante); result2 = "Error al abrir el comprobante"; } } } catch (Exception ex) { CertificadorService.Logger.Error(ex); result2 = "Error al abrir el comprobante: " + ex.Message; } return(result2); }
public string ValidaTimbraCfdi(string comprobante) { string result; try { XElement element = XElement.Load(new StringReader(comprobante)); ServicioLocal.Business.Comprobante comp = this.DesSerializar(element); if (comprobante.Contains("<ieeh:IngresosHidrocarburos")) { string erroIH = ""; IngresosHidrocarburos I = this.DesSerializarIH(element, ref erroIH); ValidarIngresoHidrocarburos VI = new ValidarIngresoHidrocarburos(); erroIH = VI.ProcesarIngresoHidrocarburos(I, comp.Version, comp.TipoDeComprobante, comp.Total); if (erroIH != "0") { result = erroIH; return(result); } } if (comprobante.Contains("<gceh:GastosHidrocarburos")) { string erroGH = ""; GastosHidrocarburos I2 = this.DesSerializarGH(element, ref erroGH); ValidarGastosHidrocarburos VI2 = new ValidarGastosHidrocarburos(); erroGH = VI2.ProcesarGastosHidrocarburos(I2, comp.Version, comp.TipoDeComprobante); if (erroGH != "0") { result = erroGH; return(result); } } ImpuestosLocales IL = null; if (comprobante.Contains("<implocal:ImpuestosLocales")) { IL = this.DesSerializarImpuestosLocales(element); } bool pago10 = comprobante.Contains("pago10:Pagos"); if (pago10) { } bool ComerExt = comprobante.Contains("cce11:ComercioExterior"); ValidarCFDI33 valida = new ValidarCFDI33(); string errorCFDI33 = valida.ProcesarCFDI33(comp, comprobante, pago10, ComerExt, IL); if (errorCFDI33 != "0") { CertificadorService.Logger.Error("Error al abrir el comprobante: " + errorCFDI33); result = errorCFDI33; } else { result = "OK"; } } catch (Exception ex) { CertificadorService.Logger.Error(ex); result = "Error al abrir el comprobante"; } return(result); }
public string TimbraCfdi(string userName, string password, string comprobante) { string erroresNomina = "0"; if (!this.ValidCredentials(userName, password)) { throw new UnauthorizedAccessException("Invalid Ntlink internal user and password combination"); } string result2; try { XElement element = XElement.Load(new StringReader(comprobante)); ServicioLocal.Business.Comprobante comp = this.DesSerializar(element); if (comprobante.Contains("<ieeh:IngresosHidrocarburos")) { string erroIH = ""; IngresosHidrocarburos I = this.DesSerializarIH(element, ref erroIH); ValidarIngresoHidrocarburos VI = new ValidarIngresoHidrocarburos(); erroIH = VI.ProcesarIngresoHidrocarburos(I, comp.Version, comp.TipoDeComprobante, comp.Total); if (erroIH != "0") { result2 = erroIH; return(result2); } } if (comprobante.Contains("<gceh:GastosHidrocarburos")) { string erroGH = ""; GastosHidrocarburos I2 = this.DesSerializarGH(element, ref erroGH); ValidarGastosHidrocarburos VI2 = new ValidarGastosHidrocarburos(); erroGH = VI2.ProcesarGastosHidrocarburos(I2, comp.Version, comp.TipoDeComprobante); if (erroGH != "0") { result2 = erroGH; return(result2); } } ImpuestosLocales IL = null; if (comprobante.Contains("<implocal:ImpuestosLocales")) { IL = this.DesSerializarImpuestosLocales(element); } bool pago10 = comprobante.Contains("pago10:Pagos"); if (pago10) { ServicioLocal.Business.Pagoo.Comprobante pagoDatos = this.DesSerializarP(element); ServicioLocal.Business.Complemento.Pagos pagoss = this.DesSerializarPagos(element); ValidarPago VP = new ValidarPago(); string ErrorPagos = VP.ProcesarPago(comp, pagoss, pagoDatos); if (ErrorPagos != "0") { result2 = ErrorPagos; return(result2); } } if (comprobante.Contains("<ine:INE ")) { string erroINE = ""; INE I3 = this.DesSerializarINE(element, ref erroINE); ValidarINE VI3 = new ValidarINE(); erroINE = VI3.ProcesarINE(I3); if (erroINE != "0") { result2 = erroINE; return(result2); } } bool ComerExt = comprobante.Contains("cce11:ComercioExterior"); ValidarCFDI33 valida = new ValidarCFDI33(); string errorCFDI33 = valida.ProcesarCFDI33(comp, comprobante, pago10, ComerExt, IL); if (errorCFDI33 != "0") { CertificadorApps.Logger.Error("Error al abrir el comprobante: " + errorCFDI33); result2 = errorCFDI33; } else { if (comprobante.Contains("<ecc12:EstadoDeCuentaCombustible")) { string erroECC = ""; EstadoDeCuentaCombustible E = this.DesSerializarECC(element, ref erroECC); ValidarECC VE = new ValidarECC(); erroECC = VE.ProcesarECC(E, comp.TipoDeComprobante, comp.Version); if (erroECC != "0") { result2 = erroECC; return(result2); } } if (comp.Emisor != null && comp.Emisor.Rfc != null) { empresa empresa = TimbradoUtils.ValidarUsuarioSinSaldo(comp.Emisor.Rfc); if (empresa == null) { CertificadorApps.Logger.Info(comp.Emisor.Rfc + " No encontrado"); result2 = "300 - El usuario con el que se quiere conectar es inválido"; } else { string result = null; TimbreFiscalDigital timbre = null; string acuseSat = ""; string hash = null; bool nomin12 = comprobante.Contains("nomina12:Nomina"); List <Nomina> nom = new List <Nomina>(); if (nomin12) { string erroresNom = null; var nomx = this.DesSerializarNomina12(element, ref erroresNom); nom.Add(nomx); if (erroresNom != null) { result2 = erroresNom; return(result2); } } if (ComerExt && erroresNomina == "0") { string erroresComer = null; ValidarComercioExterior val = new ValidarComercioExterior(); ComercioExterior Comer = this.DesSerializarComercioExterior(element, ref erroresComer); if (erroresComer != null) { CertificadorApps.Logger.Error("Error al abrir el comprobante: " + erroresComer); result2 = erroresComer; return(result2); } erroresNomina = val.ProcesarComercioExterior(Comer, comp); } if (nomin12 && erroresNomina == "0") { erroresNomina = this._val.ProcesarNomina(nom, comp); } if (erroresNomina == "0") { Dictionary <int, string> dict = this._val.ProcesarCadena(comp.Emisor.Rfc, comprobante, ref result, ref timbre, ref acuseSat, ref hash); if (timbre != null && timbre.SelloSAT != null && dict.Count == 0) { if (!string.IsNullOrEmpty(comp.Confirmacion)) { using (NtLinkLocalServiceEntities db = new NtLinkLocalServiceEntities()) { ConfirmacionTimbreWs33 C = db.ConfirmacionTimbreWs33.FirstOrDefault((ConfirmacionTimbreWs33 p) => p.Folio == comp.Folio && p.RfcEmisor == comp.Emisor.Rfc && p.RfcReceptor == comp.Receptor.Rfc); C.procesado = new bool?(true); db.ConfirmacionTimbreWs33.ApplyCurrentValues(C); db.SaveChanges(); } } SerializadorTimbres sert = new SerializadorTimbres(); if (ConfigurationManager.AppSettings["Pruebas"] == "true") { timbre.SelloSAT = "Inválido, Ambiente de pruebas"; } string res = sert.GetTimbreXml(timbre); string cfdiTimbrado = result; if (ConfigurationManager.AppSettings["EnvioSat"] == "false") { if (!TimbradoUtils.GuardaFactura(comp.Fecha, comp.Emisor.Rfc, comp.Receptor.Rfc, timbre.UUID, cfdiTimbrado, hash, empresa, false, false)) { throw new Exception("Error al abrir el comprobante"); } } result2 = res; } else { if (timbre != null && timbre.SelloSAT == null && dict.Count == 0) { XElement el = XElement.Parse(result); XElement complemento = el.Elements(Constantes.CFDVersionNamespace + "Complemento").FirstOrDefault <XElement>(); if (complemento != null) { XElement t = complemento.Elements(Constantes.CFDTimbreFiscalVersionNamespace + "TimbreFiscalDigital").FirstOrDefault <XElement>(); if (t != null) { SidetecStringWriter sw = new SidetecStringWriter(Encoding.UTF8); t.Save(sw, SaveOptions.DisableFormatting); result2 = sw.ToString(); return(result2); } } } if (dict.Count > 0) { StringBuilder res2 = new StringBuilder(); foreach (KeyValuePair <int, string> d in dict) { res2.AppendLine(d.Key.ToString() + " - " + d.Value.ToString()); } result2 = res2.ToString(); } else { CertificadorApps.Logger.Error("Error al abrir el comprobante: " + comprobante); result2 = "Error al abrir el comprobante"; } } } else { CertificadorApps.Logger.Error("Error al abrir el comprobante: " + erroresNomina); result2 = erroresNomina; } } } else { CertificadorApps.Logger.Error("Error al abrir el comprobante: " + comprobante); result2 = "Error al abrir el comprobante"; } } } catch (Exception ex) { CertificadorApps.Logger.Error(ex); result2 = "Error al abrir el comprobante"; } return(result2); }
/// <summary> /// Función que lee los nodos XML de un documento CFDI /// </summary> /// <param name="padre"></param> private void LeerNodos(XmlNode padre) { // Procesamos el nodo switch (padre.Prefix) { case "cfdi": { switch (padre.LocalName) { case "Comprobante": cfdi = new Comprobante(); cfdi.atributos = leerAtributos(padre); break; case "Emisor": cfdi.Emisor = new Emisor(); cfdi.Emisor.atributos = leerAtributos(padre); break; case "DomicilioFiscal": cfdi.Emisor.DomicilioFiscal = new DomicilioFiscal(); cfdi.Emisor.DomicilioFiscal.atributos = leerAtributos(padre); break; case "ExpedidoEn": cfdi.Emisor.ExpedidoEn = new ExpedidoEn(); cfdi.Emisor.ExpedidoEn.atributos = leerAtributos(padre); break; case "RegimenFiscal": cfdi.Emisor.RegimenFiscal = padre.Attributes["Regimen"].Value; break; case "Receptor": cfdi.Receptor = new Receptor(); cfdi.Receptor.atributos = leerAtributos(padre); break; case "Domicilio": cfdi.Receptor.Domicilio = new Domicilio(); cfdi.Receptor.Domicilio.atributos = leerAtributos(padre); break; case "Conceptos": cfdi.Conceptos = new Conceptos(); break; case "Concepto": Concepto concepto = new Concepto(); concepto.atributos = leerAtributos(padre); cfdi.Conceptos.Agregar(concepto); break; case "Impuestos": cfdi.Impuestos = new Impuestos(); cfdi.Impuestos.atributos = leerAtributos(padre); break; case "Traslados": cfdi.Impuestos.Traslados = new Traslados(); break; case "Traslado": Traslado traslado = new Traslado(); traslado.atributos = leerAtributos(padre); cfdi.Impuestos.Traslados.Agregar(traslado); break; case "Retenciones": cfdi.Impuestos.Retenciones = new Retenciones(); break; case "Retencion": Retencion retencion = new Retencion(); retencion.atributos = leerAtributos(padre); cfdi.Impuestos.Retenciones.Agregar(retencion); break; } break; } case "tfd": { switch (padre.LocalName) { case "TimbreFiscalDigital": TimbreFiscalDigital timbre = new TimbreFiscalDigital(); timbre.atributos = leerAtributos(padre); cfdi.AgregarComplemento(timbre); break; } break; } case "nomina": { switch (padre.LocalName) { case "Nomina": Nomina nomina = new Nomina(); nomina.atributos = leerAtributos(padre); cfdi.AgregarComplemento(nomina); break; case "Percepciones": Percepciones percepciones = new Percepciones(); percepciones.atributos = leerAtributos(padre); nomina = cfdi.Complemento("nomina") as Nomina; nomina.Percepciones = new Percepciones(); break; case "Percepcion": Percepcion percepcion = new Percepcion(); percepcion.atributos = leerAtributos(padre); nomina = cfdi.Complemento("nomina") as Nomina; nomina.Percepciones.Agregar(percepcion); break; case "Deducciones": Deducciones deducciones = new Deducciones(); deducciones.atributos = leerAtributos(padre); nomina = cfdi.Complemento("nomina") as Nomina; nomina.Deducciones = deducciones; break; case "Deduccion": Deduccion deduccion = new Deduccion(); deduccion.atributos = leerAtributos(padre); nomina = cfdi.Complemento("nomina") as Nomina; nomina.Deducciones.Agregar(deduccion); break; case "Incapacidades": nomina = cfdi.Complemento("nomina") as Nomina; nomina.Incapacidades = new Incapacidades(); break; case "Incapacidad": Incapacidad incapacidad = new Incapacidad(); incapacidad.atributos = leerAtributos(padre); nomina = cfdi.Complemento("nomina") as Nomina; nomina.Incapacidades.Agregar(incapacidad); break; case "HorasExtras": nomina = cfdi.Complemento("nomina") as Nomina; nomina.HorasExtras = new HorasExtras(); break; case "HorasExtra": HorasExtra horasExtra = new HorasExtra(); horasExtra.atributos = leerAtributos(padre); nomina = cfdi.Complemento("nomina") as Nomina; nomina.HorasExtras.Agregar(horasExtra); break; } break; } case "ecc": { switch (padre.LocalName) { case "EstadoDeCuentaCombustible": EstadoDeCuentaCombustible edoCta = new EstadoDeCuentaCombustible(); edoCta.atributos = leerAtributos(padre); cfdi.AgregarComplemento(edoCta); break; case "Conceptos": EstadoDeCuentaCombustible combustible = cfdi.Complemento("combustible") as EstadoDeCuentaCombustible; combustible.conceptos = new ConceptosEstadoDeCuentaCombustibles(); break; case "ConceptoEstadoDeCuentaCombustible": ConceptoEstadoDeCuenta concepto = new ConceptoEstadoDeCuenta(); concepto.atributos = leerAtributos(padre); combustible = cfdi.Complemento("combustible") as EstadoDeCuentaCombustible; combustible.Agregar(concepto); break; case "Traslados": combustible = cfdi.Complemento("combustible") as EstadoDeCuentaCombustible; combustible.conceptos[combustible.conceptos.Elementos - 1].traslados = new TrasladosConceptosEstadoDeCuentaCombustible(); break; case "Traslado": TrasladoEstadoDeCuentaCombustible traslado = new TrasladoEstadoDeCuentaCombustible(); traslado.atributos = leerAtributos(padre); combustible = cfdi.Complemento("combustible") as EstadoDeCuentaCombustible; combustible.conceptos[combustible.conceptos.Elementos - 1].AgregaTraslado(traslado); break; } break; } case "implocal": { switch (padre.LocalName) { case "ImpuestosLocales": ImpuestosLocales implocal = new ImpuestosLocales(); implocal.atributos = leerAtributos(padre); cfdi.AgregarComplemento(implocal); break; } break; } } // Procesamos los nodos hijos for (int i = 0; i < padre.ChildNodes.Count; i++) { if (padre.ChildNodes[i].NodeType == XmlNodeType.Element) { LeerNodos(padre.ChildNodes[i]); } } }