Página 1 de 1

Ayuda Sello Invalido No encuentro el error

Publicado: Sab Dic 15, 2012 8:25 am
por dacanetdev
Les agradeceria colegas que me ayudaran a ver que tiene incorrecto este XML y/o sello

Dado ya intente en ValidaCFD y en SAT y en los dos me dice que el Sello es Invalido pero en CFD no recibo ningun mensaje de error.

Si me pudieran ayudar se los agradeceria, mi cliente no puede cobrar unas facturas y es raro porque otras facturas si le validan.

Saludos

Re: Ayuda Sello Invalido No encuentro el error

Publicado: Sab Dic 15, 2012 8:35 am
por Dado
Checa tu cadena original para ver como interpretas esas comillas

Tu cadena original deberia tener el dato asi :
BROCA TRUPER TIPO MANITA 1/2" #BPT-1/2
Pero es posible que erroneamente lo estes tomando asi :
BROCA TRUPER TIPO MANITA 1/2" #BPT-1/2
Es solo una posibilidad, no significa que este sea el problema

Re: Ayuda Sello Invalido No encuentro el error

Publicado: Sab Dic 15, 2012 8:51 am
por dacanetdev
La cadena la estoy formando antes del XML y uso el dato de descripcion de mi catalogo de productos y cuando formo el XML hago las conversiones de " a "

Tengo este metodo

Código: Seleccionar todo

 private string CleanValue(string value)
        {
            string result = value;

            while (result.Contains("  "))
                result = result.Replace("  ", " ");

            result = result.Replace("|", "");
            result = result.Replace("\n", " ").Replace("\r", " ").Replace("\t", " ");

            result = result.Replace("&", "&");
            result = result.Replace("\"", """);
            result = result.Replace("<", "<");
            result = result.Replace(">", ">");
            result = result.Replace("\"", """);

            return result;
        }
Me faltara algun encode? Alguna otra sugerencia?

Re: Ayuda Sello Invalido No encuentro el error

Publicado: Sab Dic 15, 2012 9:48 am
por mauricio
La cadena original... ¿la generas tu o usas XSLT?

Re: Ayuda Sello Invalido No encuentro el error

Publicado: Sab Dic 15, 2012 11:13 am
por dacanetdev
Yo la genero

Re: Ayuda Sello Invalido No encuentro el error

Publicado: Sab Dic 15, 2012 3:59 pm
por mauricio
Te recomiendo fehacientemente que uses XSLT... aunque sea solo para que pruebes si por ahí esta el error...

Saludos

Re: Ayuda Sello Invalido No encuentro el error

Publicado: Sab Dic 15, 2012 5:46 pm
por Dado
Tambien me parece poco practico generar la cadena ANTES del XML

Deberias crear una funcion en la que le envies un XML cualquiera y te genere la cadena, en ese orden

Re: Ayuda Sello Invalido No encuentro el error

Publicado: Dom Dic 16, 2012 9:30 pm
por dacanetdev
Yo soy programador de .NET, que tanto recomiendan el approach de XMLSerialize usando la clase generada a partir del xsd?

Re: Ayuda Sello Invalido No encuentro el error

Publicado: Lun Dic 17, 2012 4:02 am
por dacanetdev
Gracias Dado, Mauricio

Sus sugerencias fueron de mucha ayuda, efectivamente opté por seguir su consejo y con XMLSerialize de la clase apartir del xsd pude generar el XML, con xslt sacar la cadena original y a recomendación de Dado usé 4 decimales y con eso ya me validaron todos mis CFD

Incluyo mi Unit Test

Código: Seleccionar todo

[TestClass]
    public class CFDServiceTest
    {
        [TestMethod]
        public void CanCreateCFD()
        {
            int facturaId = 24359;

            FacturaRepository facturaRepo = new FacturaRepository(new UnitOfWork());

            var factura = facturaRepo.GetById(facturaId); 
            
            Comprobante comprobante = GetComprobante(factura);
            
            string cfd = CFDService.CreateCFD(comprobante, factura.Certificado);

            Assert.IsTrue(!string.IsNullOrEmpty(cfd));
        }

        private Comprobante GetComprobante(Factura factura)
        {
            Comprobante comprobante = new Comprobante();
            UnitOfWork unitOfWork = new UnitOfWork();

            CatalogosRepository catalogRepo = new CatalogosRepository(unitOfWork);
            DatosNegocio datosNegocio = catalogRepo.GetDatosNegocio();

            comprobante.version = "2.2";
            comprobante.anoAprobacion = factura.Folio.AprobacionFoliosDetalle.AprobacionFolio.YearAprobacion.ToString();
            comprobante.noAprobacion = factura.Folio.AprobacionFoliosDetalle.AprobacionFolio.NumAprobacion.ToString();
            comprobante.fecha = Convert.ToDateTime(factura.FechaEmision).ToString("yyyy-MM-ddThh:mm:ss");
            comprobante.serie = "F";
            comprobante.folio = factura.Folio.FolioConsecutivo.ToString();
            comprobante.metodoDePago = factura.MetodoDePago;
            comprobante.NumCtaPago = factura.NumeroCuenta;
            comprobante.noCertificado = factura.Certificado.NumCertificado;
            comprobante.tipoDeComprobante = ComprobanteTipoDeComprobante.ingreso;
            comprobante.formaDePago = factura.FormaPago;
            comprobante.LugarExpedicion = string.Format("{0}, {1}", datosNegocio.MunicipioExpedido, datosNegocio.EstadoExpedido);

            comprobante.Emisor = new ComprobanteEmisor();
            comprobante.Emisor.rfc = datosNegocio.RFC;
            comprobante.Emisor.nombre = datosNegocio.Nombre;
            comprobante.Emisor.DomicilioFiscal = new t_UbicacionFiscal();
            comprobante.Emisor.DomicilioFiscal.calle = datosNegocio.Calle;
            comprobante.Emisor.DomicilioFiscal.noExterior = datosNegocio.NumExterior;
            comprobante.Emisor.DomicilioFiscal.colonia = datosNegocio.Colonia;
            comprobante.Emisor.DomicilioFiscal.localidad = datosNegocio.Localidad;
            comprobante.Emisor.DomicilioFiscal.referencia = datosNegocio.Referencia;
            comprobante.Emisor.DomicilioFiscal.municipio = datosNegocio.Municipio;
            comprobante.Emisor.DomicilioFiscal.estado = datosNegocio.Estado;
            comprobante.Emisor.DomicilioFiscal.pais = datosNegocio.Pais;
            comprobante.Emisor.DomicilioFiscal.codigoPostal = datosNegocio.CP;

            comprobante.Receptor = new ComprobanteReceptor();
            comprobante.Receptor.rfc = factura.RFCCliente;

            comprobante.Emisor.RegimenFiscal = new ComprobanteEmisorRegimenFiscal[] {
                new ComprobanteEmisorRegimenFiscal() { Regimen = "Regimen General de Persona Moral" }
            };

            List<ComprobanteConcepto> conceptos = new List<ComprobanteConcepto>();

            List<VentaDetalle> ventaDetalle = new List<VentaDetalle>();

            foreach (var facturaDocumentoVenta in factura.FacturaDocumentoVentas)
            {
                ventaDetalle.AddRange(facturaDocumentoVenta.DocumentoVenta.Venta.VentaDetalles);
            }

            decimal tasaIVA = 0;
            decimal importe = 0;
            decimal importeIVA = 0;
            decimal subTotal = 0;

            foreach (var item in ventaDetalle)
            {
                ComprobanteConcepto concepto = new ComprobanteConcepto();

                if (tasaIVA == 0)
                    tasaIVA = (decimal)item.TasaIVA;

                concepto.cantidad = (decimal)item.Cantidad;
                concepto.descripcion = item.Producto.Descripcion;
                concepto.valorUnitario = Decimal.Round((decimal)item.PrecioSinIVA, 4);
                concepto.unidad = item.Producto.Unidad;
                concepto.noIdentificacion = item.ProductoId.ToString();
                concepto.importe = Decimal.Round((decimal)item.ImporteSinIVA, 4);

                importe += decimal.Round((decimal)item.Importe, 4);
                importeIVA += decimal.Round((decimal)item.MontoIVA, 4);
                subTotal += decimal.Round((decimal)item.ImporteSinIVA, 4);

                conceptos.Add(concepto);
            }

            comprobante.Conceptos = conceptos.ToArray();
            
            comprobante.Impuestos = new ComprobanteImpuestos();

            ComprobanteImpuestosTraslado traslado = new ComprobanteImpuestosTraslado();
            traslado.tasa = tasaIVA;
            traslado.importe = importeIVA;
            traslado.impuesto = ComprobanteImpuestosTrasladoImpuesto.IVA;

            comprobante.Impuestos.Traslados = new ComprobanteImpuestosTraslado[] { traslado };
            comprobante.Impuestos.totalImpuestosTrasladados = importeIVA;

            comprobante.subTotal = subTotal;
            comprobante.total = importe;
            comprobante.FolioFiscalOrig = factura.FolioComprobanteDigital;

            return comprobante;
        }

       
    }