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);
        }
Ejemplo n.º 2
0
        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("&amp;apos;", "&apos;").Replace("&amp;quot;", "&quot;").Replace("&amp;lt;", "&lt;").Replace("&amp;gt;", "&gt;").Replace("&amp;amp;", "&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);
        }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 8
0
        /// <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]);
                }
            }
        }