//Terminar
        public FECAEResponse AutorizarFactura(Venta ventaFactura)
        {
            var FECabeceraReq = new FECAECabRequest();

            FECabeceraReq.CantReg  = 1;                                             // Cantidad de Registros.
            FECabeceraReq.CbteTipo = (int)ventaFactura.Comprobante.TipoComprobante; //tipo de factura
            FECabeceraReq.PtoVta   = ventaFactura.PtoDeVenta.NroPuntoDeVenta;       // Numero del Punto de venta.

            var FEDetalleReq = new FECAEDetRequest();

            FEDetalleReq.DocTipo    = (int)ventaFactura.Cliente.DocTipo;                                   //Tipo de Identificación del comprado.
            FEDetalleReq.DocNro     = ventaFactura.Cliente.Cuil;                                           //Nro. De identificación del comprador
            FEDetalleReq.MonId      = ServiceConect.FEParamGetTiposMonedas(AuthAutorizar).ResultGet[0].Id; //Codigo Moneda (PES)
            FEDetalleReq.MonCotiz   = 1;                                                                   //Cotización de la moneda informada. Para PES, pesos argentinos la misma debe ser 1
            FEDetalleReq.CbteDesde  = ventaFactura.Comprobante.NroComprobante + 1;                         //Nro. De comprobante desde
            FEDetalleReq.CbteHasta  = ventaFactura.Comprobante.NroComprobante + 1;                         //Nro. De comprobante registrado hasta
            FEDetalleReq.Concepto   = (int)ventaFactura.TipoConcepto;                                      //Concepto (De producto)
            FEDetalleReq.ImpTotal   = ventaFactura.Total;                                                  // Importe total del comprobante
            FEDetalleReq.ImpNeto    = ventaFactura.Total;                                                  //Para comprobantes tipo C este campo corresponde al Importe del Sub Total (SIN IMPUESTO)
            FEDetalleReq.ImpTotConc = 0;                                                                   //Para comprobantes tipo C debe ser igual a cero(0).
            FEDetalleReq.ImpOpEx    = 0;                                                                   //Importe Externo. Para comprobantes tipo C debe ser igual a cero (0).
            FEDetalleReq.ImpIVA     = 0;                                                                   //Importes Array IVa. Para comprobantes tipo C debe ser igual a cero (0).
            FEDetalleReq.ImpTrib    = 0;                                                                   //Suma importes Array tributo.

            var FECAEreq = new FECAERequest();

            FECAEreq.FeCabReq = FECabeceraReq;
            FECAEreq.FeDetReq = new FECAEDetRequest[] { FEDetalleReq };

            return(ServiceConect.FECAESolicitar(AuthAutorizar, FECAEreq));
        }
Example #2
0
 public void agregaTributo(int id, string desc, double baseImp, double alic, double importe)
 {
     if (mFECAERequest.FeDetReq.Length > 0)
     {
         FECAEDetRequest lDetRequest = mFECAERequest.FeDetReq[mFECAERequest.FeDetReq.GetUpperBound(0)];
         Tributo[]       tributos    = lDetRequest.Tributos;
         if (lDetRequest.Tributos == null)
         {
             Array.Resize(ref tributos, 1);
         }
         else
         {
             Array.Resize(ref tributos, tributos.Length + 1);
         }
         lDetRequest.Tributos = tributos;
         lDetRequest.Tributos[lDetRequest.Tributos.GetUpperBound(0)] = new FEAFIPLib.wsfev1.Tributo();
         var _with3 = lDetRequest.Tributos[lDetRequest.Tributos.GetUpperBound(0)];
         _with3.Alic    = alic;
         _with3.BaseImp = baseImp;
         _with3.Desc    = desc;
         _with3.Id      = (short)id;
         _with3.Importe = importe;
         decimal decImp = (decimal)(lDetRequest.ImpTrib + importe);
         lDetRequest.ImpTrib = (double)decImp;
     }
 }
 private double CalcularTributos( FECAEDetRequest feCaeDet )
 {
     double totalesTributos = 0;
     if ( feCaeDet.Tributos != null )
     {
         totalesTributos = Redondeo.SumarDoubles( (from x in feCaeDet.Tributos select x.Importe).ToArray() );
     }
     return totalesTributos;
 }
        private double CalcularIva( FECAEDetRequest feCaeDet )
        {
            double totalesIva = 0;

            if ( feCaeDet.Iva != null )
            {
                totalesIva = Redondeo.SumarDoubles( (from x in feCaeDet.Iva select x.Importe).ToArray() );
            }
            return totalesIva;
        }
        public FECAEDetRequest Convertir( FeDetalle detalle, bool arreglar )
        {
            FECAEDetRequest feCaeDet = new FECAEDetRequest();
            feCaeDet.Concepto = (int)detalle.Concepto;
            feCaeDet.DocTipo = (int)detalle.DocumentoTipo;
            feCaeDet.DocNro = detalle.DocumentoNumero;
            feCaeDet.CbteDesde = detalle.ComprobanteDesde;
            feCaeDet.CbteHasta = detalle.ComprobanteDesde;
            feCaeDet.CbteFch = detalle.ComprobanteFecha;

            feCaeDet.ImpTotal = Redondeo.Aplicar(detalle.ImporteTotal);
            feCaeDet.ImpTotConc = Redondeo.Aplicar(detalle.ImporteNetoNoGravado);
            feCaeDet.ImpNeto = Redondeo.Aplicar(detalle.ImporteNeto);
            feCaeDet.ImpOpEx = Redondeo.Aplicar(detalle.ImporteExento);
            feCaeDet.ImpTrib = Redondeo.Aplicar(detalle.ImporteTributos);

            feCaeDet.FchServDesde = detalle.FechaServicioDesde;
            feCaeDet.FchServHasta = detalle.FechaServicioHasta;
            feCaeDet.FchVtoPago = detalle.FechaVencimientoDePago;
            feCaeDet.MonId = detalle.MonedaId;
            feCaeDet.MonCotiz = detalle.MonedaCotizacion;

            this.ConvertirComprobantesAsociados( detalle, feCaeDet );
            this.ConvertirTributos( detalle, feCaeDet );
            this.ConvertirIVA( detalle, feCaeDet );

            feCaeDet.ImpIVA = this.CalcularIva( feCaeDet );
            feCaeDet.ImpTrib = this.CalcularTributos( feCaeDet );

            this.ConvertirDatosAdicionales( detalle, feCaeDet );

            if ( arreglar )
            {
                if ( !this.ValidarSumaImporteTotal( feCaeDet ) )
                {
                    this.TratarDeArreglarRedondeando( feCaeDet, detalle );
                }

                if ( !this.ValidarSumaImporteTotal( feCaeDet ) )
                {
                    this.TratarDeArreglarCocinando( feCaeDet, detalle );
                }

                if ( !this.ValidarSumaImporteTotal( feCaeDet ) )
                {
                    // fallo todo, dejo como estaba
                    feCaeDet = this.Convertir( detalle, false );
                }
            }
            return feCaeDet;
        }
        public FECAERequest Convertir( FeCabecera cabFe )
        {
            FECAECabRequest cab = this.ConvertirCabecera( cabFe );

            int i = 0;
            FECAEDetRequest[] detalleComprobantes = new FECAEDetRequest[cabFe.DetalleComprobantes.Count];
            WrapperDetalleFe wdf = new WrapperDetalleFe();
            foreach ( FeDetalle detalle in cabFe.DetalleComprobantes )
            {
                detalleComprobantes[i] = wdf.Convertir( detalle );
                i++;
            }

            FECAERequest feCaeRequest = new FECAERequest();
            feCaeRequest.FeCabReq = cab;
            feCaeRequest.FeDetReq = detalleComprobantes;

            return feCaeRequest;
        }
Example #7
0
 public void agregaOpcional(string id, string valor)
 {
     if (mFECAERequest.FeDetReq.Length > 0)
     {
         FECAEDetRequest lDetRequest = mFECAERequest.FeDetReq[mFECAERequest.FeDetReq.GetUpperBound(0)];
         Opcional[]      opcionales  = lDetRequest.Opcionales;
         if (lDetRequest.Opcionales == null)
         {
             Array.Resize(ref opcionales, 1);
         }
         else
         {
             Array.Resize(ref opcionales, opcionales.Length + 1);
         }
         lDetRequest.Opcionales = opcionales;
         lDetRequest.Opcionales[lDetRequest.Opcionales.GetUpperBound(0)] = new FEAFIPLib.wsfev1.Opcional();
         var _with4 = lDetRequest.Opcionales[lDetRequest.Opcionales.GetUpperBound(0)];
         _with4.Id    = id;
         _with4.Valor = valor;
     }
 }
Example #8
0
 public void agregaCbteAsoc(int tipo, int ptoVta, long nro)
 {
     if (mFECAERequest.FeDetReq.Length > 0)
     {
         FECAEDetRequest lDetRequest = mFECAERequest.FeDetReq[mFECAERequest.FeDetReq.GetUpperBound(0)];
         CbteAsoc[]      cbteAsoc    = lDetRequest.CbtesAsoc;
         if (lDetRequest.Opcionales == null)
         {
             Array.Resize(ref cbteAsoc, 1);
         }
         else
         {
             Array.Resize(ref cbteAsoc, cbteAsoc.Length + 1);
         }
         lDetRequest.CbtesAsoc = cbteAsoc;
         lDetRequest.CbtesAsoc[lDetRequest.CbtesAsoc.GetUpperBound(0)] = new FEAFIPLib.wsfev1.CbteAsoc();
         var _with5 = lDetRequest.CbtesAsoc[lDetRequest.CbtesAsoc.GetUpperBound(0)];
         _with5.Nro    = nro;
         _with5.PtoVta = ptoVta;
         _with5.Tipo   = tipo;
     }
 }
 private void ConvertirIVA( FeDetalle detalle, FECAEDetRequest feCaeDet )
 {
     if ( detalle.Iva.Count > 0 )
     {
         int i = 0;
         feCaeDet.Iva = new AlicIva[detalle.Iva.Count];
         WrapperIvaFe wic = new WrapperIvaFe();
         foreach ( IVA iva in detalle.Iva )
         {
             feCaeDet.Iva[i] = wic.Convertir( iva );
             i++;
         }
     }
 }
Example #10
0
        public static void SolicitarCAE(this IComprobanteElectronico comprobante, string ta_path, Hamekoz.Core.ICallBack callback)
        {
            var service = new Service();

            //HACK para cambiar de produccion a homologacion
                        #if DEBUG
            service = new Service(homo_url);
                        #endif
            var ta = TA(ta_path);

            //TODO ahora podria utilizar comprobante.Tipo.Codigo validando que sea un valor adecuado
            int tipo           = ComprobanteTipo(comprobante);
            int punto_de_venta = int.Parse(comprobante.Tipo.Pre);

            var fECompUltimoAutorizado = service.FECompUltimoAutorizado(ta, punto_de_venta, tipo);
            int numero = fECompUltimoAutorizado.CbteNro;
            numero++;

            var feCabReq = new FECAECabRequest {
                CantReg  = 1,
                CbteTipo = tipo,
                PtoVta   = punto_de_venta
            };

            var fEDetRequest = new FECAEDetRequest {
                CbteDesde   = numero,
                CbteFch     = comprobante.Emision.ToString("yyyyMMdd"),
                CbteHasta   = numero,
                CbtesAsoc   = null,               //TODO en caso de que sean comprobantes vinculados
                Compradores = null,               //TODO revisar porque no encuentro documentacion
                //HACK producto
                Concepto = 1,
                DocNro   = long.Parse(comprobante.Responsable.CUIT.Limpiar()),
                //HACK CUIT
                DocTipo  = 80,
                ImpIVA   = (double)comprobante.IVA,               //TODO debe excluirse el importe exento, para tipo C debe ser 0
                ImpNeto  = (double)(comprobante.Gravado - comprobante.Exento),
                ImpOpEx  = (double)comprobante.Exento,
                ImpTotal = (double)comprobante.Total,
                //TODO en caso de ser de tipo C debe ser siempre 0
                ImpTotConc = (double)comprobante.NoGravado,
                ImpTrib    = (double)comprobante.Tributos,
                Iva        = comprobante.FEIVAS().ToArray(),
                MonCotiz   = 1,               //TODO pasar la cotizacion correcta
                MonId      = "PES",           //TODO pasar la moneda correcta
                Opcionales = null,
                Tributos   = comprobante.Tributos > 0 ? comprobante.FETributos().ToArray() : null,
            };

            var feDetReq = new List <FECAEDetRequest> ();
            feDetReq.Add(fEDetRequest);

            var solicitud = new  FECAERequest {
                FeCabReq = feCabReq,
                FeDetReq = feDetReq.ToArray()
            };

            FECAEResponse fECAEResponse = service.FECAESolicitar(ta, solicitud);

            if (fECAEResponse.Events != null)
            {
                foreach (var evento in fECAEResponse.Events)
                {
                    string mensaje = string.Format("Código: {0}. Mensaje: {1}", evento.Code, evento.Msg);
                    callback.CallBack.OnMessage("Evento AFIP", mensaje);
                }
            }

            if (fECAEResponse.Errors != null)
            {
                var errores = new StringBuilder();
                foreach (var error in fECAEResponse.Errors)
                {
                    errores.AppendFormat("Código: {0}. Mensaje: {1}", error.Code, error.Msg);
                    errores.AppendLine();
                }
                throw new AFIPException(errores.ToString());
            }

            //TODO refactorizar para soportar un lote de comprobantes

            var observaciones = new StringBuilder();
            if (fECAEResponse.FeDetResp [0].Observaciones != null)
            {
                foreach (var observacion in fECAEResponse.FeDetResp[0].Observaciones)
                {
                    observaciones.AppendFormat("Código: {0}. Mensaje: {1}", observacion.Code, observacion.Msg);
                    observaciones.AppendLine();
                }

                callback.CallBack.OnWarning("Comprobante con observaciones", observaciones.ToString());
            }

            if (fECAEResponse.FeDetResp [0].Resultado == "R")
            {
                string errorAfip = string.Format("Comprobante rechazado.\n{0}", observaciones);
                throw new AFIPException(errorAfip);
            }

            //TODO ver si el formato seria correcto
            comprobante.Tipo.UltimoNumero = numero;
            comprobante.NumeroAFIP        = string.Format("{0:0000}-{1:00000000}", punto_de_venta, numero);
            comprobante.Numero            = comprobante.NumeroAFIP;
            comprobante.CAE             = fECAEResponse.FeDetResp [0].CAE;
            comprobante.VencimientoCAE  = fECAEResponse.FeDetResp [0].CAEFchVto;
            comprobante.ComentariosAFIP = observaciones.ToString();
        }
 /// <summary>
 /// Validacion para anticipar error 10048 - El campo "Importe Total" (ImpTotal), debe ser igual  a la  suma de ImpTotConc + ImpNeto + ImpOpEx + ImpTrib + ImpIva 
 /// </summary>
 /// <param name="detalle">detalle del request a la ADIP</param>
 private bool ValidarSumaImporteTotal( FECAEDetRequest detalle )
 {
     return this.ObtenerDiferenciaTotales( detalle ) == 0;
 }
        /// <summary>
        /// Pone los valores redondeados
        /// </summary>
        /// <param name="feCaeDet">detalle del request a la ADIP</param>
        /// <param name="detalle">detalle wrappeado, con los valores de Organic/Lince</param>
        private void TratarDeArreglarRedondeando( FECAEDetRequest feCaeDet, FeDetalle detalle )
        {
            Decimal ivaOriginal = (Decimal)feCaeDet.ImpIVA;
            Decimal tributosOriginal = (Decimal)feCaeDet.ImpTrib;

            // Total no se toca
            // feCaeDet.ImpTotal = Redondeo.Aplicar( detalle.ImporteTotal );

            feCaeDet.ImpTotConc = Redondeo.Redondear( detalle.ImporteNetoNoGravado );
            feCaeDet.ImpNeto = Redondeo.Redondear( detalle.ImporteNeto );
            feCaeDet.ImpOpEx = Redondeo.Redondear( detalle.ImporteExento );
            feCaeDet.ImpTrib = Redondeo.Redondear( detalle.ImporteTributos );
            feCaeDet.ImpIVA = Redondeo.Redondear( detalle.ImporteIVA );

            #region Arreglo IVA. Si cambia, la suma de la coleccion debe dar lo mismo
                if ( (Decimal)feCaeDet.ImpIVA != ivaOriginal )
            {
                // le pego a algun IVA para que no falle
                // validacion 10023  La suma de los campos <importe> en  <IVA>   debe  ser igual al valor ingresado en  ImpIVA.
                Decimal diferencia = (Decimal)feCaeDet.ImpIVA - ivaOriginal;

                try
                {
                    feCaeDet.Iva[0].Importe = Redondeo.SumarDoubles( new double[] { feCaeDet.Iva[0].Importe, (double)diferencia } );
                }
                finally
                {
                }
            }
            #endregion

            #region Arreglo Tributos. Si cambia, la suma de la coleccion debe dar lo mismo
            if ( (Decimal)feCaeDet.ImpTrib != tributosOriginal )
            {
                // le pego a alguno para que no falle
                // validacion 10029  La suma de los importes en  <Tributo>   debe  ser igual al valor ingresado  en  ImpTrib
                Decimal diferencia = (Decimal)feCaeDet.ImpTrib - tributosOriginal;

                try
                {
                    feCaeDet.Tributos[0].Importe = Redondeo.SumarDoubles( new double[] { feCaeDet.Tributos[0].Importe, (double)diferencia } );
                }
                finally
                {
                }
            }
            #endregion
        }
        public string comprobante_electronico(int tipocomprobante, long nrodoc, double total, double neto21, double civa21, double neto105, double civa105, ref string cae, ref string fechavto, ref string tipofactura, ref string puntoventa)
        {
            try
            {
                LoginClass miloginclase = new LoginClass("wsfe", NegocioConfigEmpresa.urllogin, @"C:\CertificadodonVito\certificado.pfx", "");
                miloginclase.hacerLogin(miloginclase);
                int doctipoid = 96;
                authRequest       = new FEAuthRequest();
                authRequest.Cuit  = NegocioConfigEmpresa.emcuit;
                authRequest.Sign  = miloginclase.Sing;
                authRequest.Token = miloginclase.Token;

                Service servicio = new Service();
                servicio     = getServicio();
                servicio.Url = NegocioConfigEmpresa.urlservicio;
                //servicio.ClientCertificates.Add(certificado);

                //ver conceptoid
                int conceptoid = CONCEPTO_PRODUCTO;
                if (nrodoc.ToString().Length == 11)
                {
                    doctipoid = 80;
                }


                //  Service service = getServicio();
                servicio.ClientCertificates.Add(miloginclase.Certificado);
                FECAERequest    req = new FECAERequest();
                FECAECabRequest cab = new FECAECabRequest();
                FECAEDetRequest det = new FECAEDetRequest();

                cab.CantReg  = 1;
                cab.PtoVta   = Convert.ToInt32(NegocioConfigEmpresa.puntoventa);
                cab.CbteTipo = tipocomprobante;
                req.FeCabReq = cab;

                det.Concepto = conceptoid;
                det.DocTipo  = doctipoid;
                det.DocNro   = nrodoc;

                // ultimo comprobante autorizado

                FERecuperaLastCbteResponse lastres = servicio.FECompUltimoAutorizado(authRequest, 3, tipocomprobante);
                int last = lastres.CbteNro;
                det.CbteDesde = last + 1;
                det.CbteHasta = last + 1;
                int nrocomprobante = last + 1;

                det.CbteFch = DateTime.Now.ToString("yyyyMMdd");
                if (tipocomprobante == 1 || tipocomprobante == 6)
                {
                    decimal totalneto = decimal.Round(Convert.ToDecimal(neto21 + neto105), 2);
                    decimal totaliva  = decimal.Round(Convert.ToDecimal(civa21 + civa105), 2);
                    det.ImpNeto = Convert.ToDouble(totalneto);
                    det.ImpIVA  = Convert.ToDouble(totaliva);
                }
                else
                {
                    det.ImpNeto = total;
                    det.ImpIVA  = 0;
                }

                det.ImpTotal = total;

                det.ImpTotConc = 0.00;
                det.ImpOpEx    = 0.00;
                det.ImpTrib    = 0.00;

                det.MonId    = "PES";
                det.MonCotiz = 1;
                int     tipoalicuota = ID_TASA_IVA_NINGUNO;
                AlicIva alicuota     = new AlicIva();
                if (tipocomprobante == TIPOCOMPROBANTE_FACTURA_A || tipocomprobante == TIPOCOMPROBANTE_FACTURA_B)
                {
                    tipoalicuota     = ID_TASA_IVA_21_00;
                    alicuota.Id      = tipoalicuota;
                    alicuota.BaseImp = neto21;
                    alicuota.Importe = civa21;
                    if (neto105 > 0)
                    {
                        AlicIva alicuota2 = new AlicIva();
                        tipoalicuota      = ID_TASA_IVA_10_50;
                        alicuota2.Id      = tipoalicuota;
                        alicuota2.BaseImp = neto105;
                        alicuota2.Importe = civa105;
                        det.Iva           = new[] { alicuota, alicuota2 };
                    }
                    else
                    {
                        det.Iva = new[] { alicuota };
                    }
                }
                else
                {
                    alicuota.Id      = tipoalicuota;
                    alicuota.BaseImp = 0;
                    alicuota.Importe = 0;
                    det.Iva          = new[] { alicuota };
                }



                req.FeDetReq = new[] { det };

                FECAEResponse r = servicio.FECAESolicitar(authRequest, req);
                cae = r.FeDetResp[0].CAE; //string CAE
                string ESTADO    = r.FeCabResp.Resultado;
                string resultado = r.FeDetResp[0].Resultado;
                fechavto = r.FeDetResp[0].CAEFchVto;//string vto

                puntoventa  = NegocioConfigEmpresa.puntoventa;
                tipofactura = tipocomprobante.ToString("00");


                string m = "ok";

                {
                    if (r.FeDetResp[0].Observaciones is object)
                    {
                        foreach (var o in r.FeDetResp[0].Observaciones)
                        {
                            m += string.Format("Obs: {0} ({1})", o.Msg, o.Code) + Constants.vbCrLf;
                        }
                    }
                }
                {
                    if (r.Errors is object)
                    {
                        foreach (var er in r.Errors)
                        {
                            m += string.Format("Er: {0}: {1}", er.Code, er.Msg) + Constants.vbCrLf;
                        }
                    }
                }
                {
                    if (r.Events is object)
                    {
                        foreach (var ev in r.Events)
                        {
                            m += string.Format("Ev: {0}: {1}", ev.Code, ev.Msg) + Constants.vbCrLf;
                        }
                    }
                }
                if (m == "ok")
                {
                    m = m + nrocomprobante.ToString();
                }
                return(m);
            }
            catch (Exception)
            {
                throw;
            }


            // string error = r.error;
            //  string desde = r.FeDetResp[0].CbteDesde;
            //  string hasta = r.FeDetResp[0].CbteHasta;
            // string OBSERVACION = r.FeDetResp[0].Observaciones;
        }
Example #14
0
        private bool GetCae()
        {
            try
            {
                lblStatus.Text      = @"Importando registros";
                barProgress.Style   = ProgressBarStyle.Continuous;
                barProgress.Maximum = _dataAfip.Facturas.Count;

                _db.Connect();

                var wsaa = new WsaaClient();

                var pass = new SecureString();

                foreach (var c in ConfigInfo.PfxPass)
                {
                    pass.AppendChar(c);
                }

                pass.MakeReadOnly();

                wsaa.ObtenerLoginTicketResponse("wsfe", ConfigInfo.WsaaUrl, ConfigInfo.PfxPath, pass, null, null, null, true);

                var authRequest = new FEAuthRequest
                {
                    Token = wsaa.Token,
                    Sign  = wsaa.Sign,
                    Cuit  = ConfigInfo.CUIT
                };

                var svcWsfe = new Afip.Wsfe.Service
                {
                    Url = ConfigInfo.WsfeUrl
                };

                var sb = new StringBuilder();

                foreach (var f in _dataAfip.Facturas)
                {
                    var cab = new FECAECabRequest
                    {
                        CantReg  = 1,
                        PtoVta   = f.PuntoVenta,
                        CbteTipo = f.TipoComprobante
                    };

                    var det = new FECAEDetRequest
                    {
                        Concepto     = 1,
                        DocTipo      = f.CodigoDocumento,
                        DocNro       = f.IdComprador,
                        CbteDesde    = f.NumeroComprobante,
                        CbteHasta    = f.NumeroComprobanteRegistrado,
                        CbteFch      = f.FechaComprobante.ToString(),
                        ImpTotal     = f.ImporteTotal,
                        ImpTotConc   = f.ImporteTotalSinNetoGravado,
                        ImpNeto      = f.ImporteNetoGravado,
                        ImpOpEx      = f.ImporteOperacionesExentas,
                        ImpTrib      = f.ImportePagosCuentaImpuestos,
                        ImpIVA       = f.ImpuestoLiquidado,
                        FchServDesde = f.FechaDesde.ToString(),
                        FchServHasta = f.FechaHasta.ToString(),
                        FchVtoPago   = f.FechaVencimientoPago.ToString(),
                        MonId        = "PES",
                        MonCotiz     = 1
                    };

                    var req = new FECAERequest
                    {
                        FeCabReq = cab,
                        FeDetReq = new[]
                        {
                            det
                        }
                    };

                    var response = svcWsfe.FECAESolicitar(authRequest, req);

                    var saveData = true;

                    if (response.FeDetResp[0].Observaciones != null)
                    {
                        foreach (var o in response.FeDetResp[0].Observaciones)
                        {
                            sb.AppendLine($"Obs: {o.Code} - {o.Msg}");
                        }

                        saveData = false;
                    }

                    if (response.Errors != null)
                    {
                        foreach (var o in response.Errors)
                        {
                            sb.AppendLine($"Err: {o.Code} - {o.Msg}");
                        }

                        saveData = false;
                    }

                    if (response.Events != null)
                    {
                        foreach (var o in response.Events)
                        {
                            sb.AppendLine($"Evt: {o.Code} - {o.Msg}");
                        }

                        saveData = false;
                    }

                    if (saveData)
                    {
                        var query = "UPDATE Facturas SET Cae = @Cae, CaeVto = @CaeVto WHERE IdArchivo = @IdArchivo AND Id = @Id";

                        var parameters = new Hashtable
                        {
                            { "@Cae", response.FeDetResp[0].CAE },
                            { "@CaeVto", response.FeDetResp[0].CAEFchVto },
                            { "@IdArchivo", f.IdArchivo },
                            { "@Id", f.Id }
                        };

                        _db.ExecuteNonQuery(query, parameters);
                    }

                    lblStatus.Text = $@"Registro {barProgress.Value}/{barProgress.Maximum}";
                    barProgress.PerformStep();

                    Application.DoEvents();
                }

                if (sb.Length > 0)
                {
                    throw new ApplicationException(sb.ToString());
                }

                return(true);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

                return(false);
            }
            finally
            {
                lblStatus.Text    = string.Empty;
                barProgress.Value = 0;

                _db.Disconnect();
            }
        }
        public static FECAERequest GetDetRequest(Comprobante comprobante)
        {
            var req = new FECAERequest {
                FeCabReq = new FECAECabRequest {
                    CantReg = 1, PtoVta = comprobante.Sector
                }
            };

            if (comprobante.Tipo != null)
            {
                req.FeCabReq.CbteTipo = (( ComprobanteTipo )comprobante.Tipo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)).Codigo;
            }

            var detReq = new FECAEDetRequest( );

            detReq.CbteDesde    = detReq.CbteHasta = comprobante.Numero;
            detReq.CbteFch      = comprobante.Fecha.ToString("yyyyMMdd");
            detReq.FchServDesde = comprobante.InicioPrestacion.ToString("yyyyMMdd");
            detReq.FchServHasta = comprobante.FinPrestacion.ToString("yyyyMMdd");
            if (comprobante.Vencimiento != null)
            {
                detReq.FchVtoPago = comprobante.Vencimiento.Value.ToString("yyyyMMdd");
            }
            detReq.MonCotiz = ( double )comprobante.Cambio;
            if (comprobante.Especie != null)
            {
                detReq.MonId = (( Moneda )comprobante.Especie.Moneda.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)).Codigo;
            }

            if (comprobante.IdentificacionTipo != null)
            {
                detReq.DocTipo = (( IdentificacionTipo )comprobante.IdentificacionTipo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)).Codigo;
            }
            detReq.DocNro = Convert.ToInt64(comprobante.IdentificacionNro);

            double impGrav = 0, impIva = 0, impTrib = 0, impNoGrav = 0, impExento = 0;

            foreach (var item in comprobante.Items)
            {
                switch (( ConceptosGrupos )item.Concepto.Grupo)
                {
                case ConceptosGrupos.NoGrav:
                    impNoGrav += ( double )item.ImporteTotal;
                    break;

                case ConceptosGrupos.Exento:
                    impExento += ( double )item.ImporteTotal;
                    break;

                case ConceptosGrupos.Grav0:
                case ConceptosGrupos.Grav105:
                case ConceptosGrupos.Grav21:
                case ConceptosGrupos.Grav27:
                    impGrav += ( double )item.ImporteTotal;
                    break;

                case ConceptosGrupos.IVA0:
                case ConceptosGrupos.IVA105:
                case ConceptosGrupos.IVA21:
                case ConceptosGrupos.IVA27:
                    impIva += ( double )item.ImporteTotal;
                    if (detReq.Iva == null)
                    {
                        detReq.Iva = new List <AlicIva>( );
                    }
                    detReq.Iva.Add(new AlicIva {
                        BaseImp = ( double )item.BaseImponible, Id = Convert.ToInt32(item.Concepto.Grupo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)), Importe = ( double )item.ImporteTotal
                    });
                    break;

                default:
                    if (!string.IsNullOrWhiteSpace(Convert.ToString(item.Concepto.Grupo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip))))
                    {
                        impTrib += ( double )item.ImporteTotal;
                        if (detReq.Tributos == null)
                        {
                            detReq.Tributos = new List <Tributo>( );
                        }
                        detReq.Tributos.Add(new Tributo {
                            BaseImp = ( double )item.BaseImponible, Id = Convert.ToInt16(item.Concepto.Grupo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)), Importe = ( double )item.ImporteTotal
                        });
                    }
                    break;
                }
            }

            detReq.ImpNeto    = impGrav;
            detReq.ImpOpEx    = impExento;
            detReq.ImpTotConc = impNoGrav;
            detReq.ImpIVA     = impIva;
            detReq.ImpTrib    = impTrib;
            detReq.Concepto   = 2;

            detReq.ImpTotal = Math.Round(detReq.ImpNeto + detReq.ImpOpEx + detReq.ImpTotConc + detReq.ImpIVA + detReq.ImpTrib, 2);

            req.FeDetReq = new List <FECAEDetRequest> {
                detReq
            };

            return(req);
        }
Example #16
0
        public static void ConectarAfip(int cantReg,
                                        TextBox txtTOTALFactura,
                                        TextBox txtSubTotalFactura)
        {
            var codigoAfipService      = "C88DFF36-99E6-4BF6-8A98-31FDCB8E016B";
            var fechaActual            = DateTime.Now;
            var numeroUltimoAutorizado = 0;

            FEAuthRequest feAuth = new FEAuthRequest();

            using (var service = new LoginServiceClient())
            {
                var auth = service.SolicitarAutorizacion(codigoAfipService);

                feAuth.Cuit  = auth.Cuit;
                feAuth.Sign  = auth.Sign;
                feAuth.Token = auth.Token;
            }

            FECAERequest    FECAEReq = new FECAERequest();
            FECAECabRequest FeCabReq = new FECAECabRequest();
            FECAEDetRequest FeDetReq = new FECAEDetRequest();

            FeCabReq.CantReg  = cantReg;
            FeCabReq.CbteTipo = 11; //Factura C
            FeCabReq.PtoVta   = 1;

            FeDetReq.Concepto  = 1;  //Productos
            FeDetReq.DocTipo   = 99; //Sin identificar/Venta global diaria
            FeDetReq.DocNro    = 5;  //PREGUNTAR PROFE
            FeDetReq.CbteDesde = 1;
            FeDetReq.CbteHasta = 99999999;
            //FeDetReq.CbteFch = string.Format("{0}{1}{2}", fechaActual.Year, fechaActual.Month, fechaActual.Day);
            FeDetReq.ImpTotal   = double.Parse(txtTOTALFactura.Text);
            FeDetReq.ImpTotConc = 0;
            FeDetReq.ImpNeto    = double.Parse(txtSubTotalFactura.Text);
            FeDetReq.ImpOpEx    = 0;
            FeDetReq.ImpIVA     = 0;
            FeDetReq.ImpTrib    = 0; //PREGUNTAR PROFE
            FeDetReq.MonId      = "PES";
            FeDetReq.MonCotiz   = 1;

            FECAEReq.FeCabReq = FeCabReq;
            //Este es el error. No en la instanciación del servicio. La colección FeDetReq es nula.
            //FECAEReq.FeDetReq[0] = FeDetReq;
            FECAEReq.FeDetReq = new FECAEDetRequest[] { FeDetReq };

            using (var service2 = new ServiceSoapClient())
            {
                var ultimoAutorizado = service2.FECompUltimoAutorizado(feAuth, 1, 11);

                if (ultimoAutorizado.Errors == null)
                {
                    numeroUltimoAutorizado = ultimoAutorizado.CbteNro + 1;

                    //caeSolicitar
                    service2.FECAESolicitar(feAuth, FECAEReq);
                }
                else
                {
                    MessageBox.Show("Error conexión Afip Service");
                }
            }
        }
 private void ConvertirComprobantesAsociados( FeDetalle detalle, FECAEDetRequest feCaeDet )
 {
     if ( detalle.ComprobantesAsociados.Count > 0 )
     {
         int i = 0;
         feCaeDet.CbtesAsoc = new CbteAsoc[detalle.ComprobantesAsociados.Count];
         WrapperComprobanteAsociadoFe wcaf = new WrapperComprobanteAsociadoFe();
         foreach ( ComprobanteAsociado comprobante in detalle.ComprobantesAsociados )
         {
             feCaeDet.CbtesAsoc[i] = wcaf.Convertir( comprobante );
             i++;
         }
     }
 }
        private void ConvertirDatosAdicionales(FeDetalle detalle, FECAEDetRequest feCaeDet)
        {
            if ( !String.IsNullOrEmpty( detalle.DA_NumeroDocumento ) && detalle.DA_NumeroDocumento != "0" )
            {
                feCaeDet.Opcionales = new Opcional[4];

                feCaeDet.Opcionales[0] = new Opcional();
                feCaeDet.Opcionales[0].Id = "7";
                feCaeDet.Opcionales[0].Valor = detalle.DA_CondicionTitular.ToString().PadLeft( 2, '0' );

                feCaeDet.Opcionales[1] = new Opcional();
                feCaeDet.Opcionales[1].Id = "61";
                feCaeDet.Opcionales[1].Valor = detalle.DA_TipoDocumento.ToString().PadLeft(2, '0');

                feCaeDet.Opcionales[2] = new Opcional();
                feCaeDet.Opcionales[2].Id = "62";
                feCaeDet.Opcionales[2].Valor = detalle.DA_NumeroDocumento.ToString();

                feCaeDet.Opcionales[3] = new Opcional();
                feCaeDet.Opcionales[3].Id = "5";
                feCaeDet.Opcionales[3].Valor = detalle.DA_Motivo.ToString().PadLeft(2, '0');
             }
        }
        /// <summary>
        /// Solicitar un CAE para uno o más comprobantes.
        /// </summary>
        /// <param name="solCae">Los datos para la solicitud del CAE.</param>
        /// <returns>La cantidad de comprobantes aprobados, o 0 si todos fueron rechazados.</returns>
        public int SolictarCae(SolicitudCae solCae)
        {
            using (var Clie = new ServiceSoapClient()) {
                var DetallesComprobantes = new FECAEDetRequest[solCae.Comprobantes.Count];

                var i = 0;
                foreach (ComprobanteAsociado Comprob in solCae.Comprobantes)
                {
                    var DetalleComprobante = new FECAEDetRequest
                    {
                        Concepto   = (int)Comprob.Conceptos,
                        DocTipo    = (int)Comprob.Cliente.DocumentoTipo,
                        DocNro     = Comprob.Cliente.DocumentoNumero,
                        CbteDesde  = Comprob.Numero,
                        CbteHasta  = Comprob.Numero,
                        CbteFch    = DateTime.Now.ToString("yyyyMMdd"),
                        ImpTotal   = Math.Round(decimal.ToDouble(Comprob.ImporteTotal()), 2),
                        ImpTotConc = Math.Round(decimal.ToDouble(Comprob.ImporteNetoNoGravado), 2),
                        ImpNeto    = Math.Round(decimal.ToDouble(Comprob.ImporteNetoGravado), 2),
                        ImpOpEx    = Math.Round(decimal.ToDouble(Comprob.ImporteExento), 2),
                        ImpIVA     = Math.Round(decimal.ToDouble(Comprob.ImporteIva()), 2),
                        //ImpTrib = Comprob.TotalTributos(),
                        MonId    = "PES",
                        MonCotiz = 1,

                        /* CbtesAsoc = new CbteAsoc[1]
                         * {
                         *      new CbteAsoc()
                         *      {
                         *              Nro = 0,
                         *              PtoVta = 0,
                         *              Tipo = Tablas.ComprobantesTipos.NotaDeCreditoA
                         *      }
                         * } */
                    };

                    // Si es un comprobante con servicios, agregar los campos obligatorios
                    if ((Comprob.Conceptos | Tablas.Conceptos.Servicios) == Tablas.Conceptos.Servicios)
                    {
                        DetalleComprobante.FchServDesde = Comprob.ServicioFechaDesde.ToString("yyyyMMdd");
                        DetalleComprobante.FchServHasta = Comprob.ServicioFechaHasta.ToString("yyyyMMdd");
                        DetalleComprobante.FchVtoPago   = Comprob.FechaVencimientoPago.ToString("yyyyMMdd");
                    }

                    // Agregar la tabla de alícuotas
                    if (Comprob.ImportesAlicuotas != null && Comprob.ImportesAlicuotas.Count > 0)
                    {
                        DetalleComprobante.Iva = new AlicIva[Comprob.ImportesAlicuotas.Count];
                        var j = 0;
                        foreach (ImporteAlicuota Alic in Comprob.ImportesAlicuotas)
                        {
                            DetalleComprobante.Iva[j++] = new AlicIva
                            {
                                Id      = (int)Alic.Alicuota,
                                BaseImp = Math.Round(decimal.ToDouble(Alic.BaseImponible), 2),
                                Importe = Math.Round(decimal.ToDouble(Alic.Importe), 2)
                            };
                        }
                    }

                    DetallesComprobantes[i++] = DetalleComprobante;
                }


                // Crear la solicitud
                var CaeReq = new FECAERequest
                {
                    FeCabReq = new FECAECabRequest
                    {
                        CantReg  = solCae.Comprobantes.Count,
                        PtoVta   = solCae.PuntoDeVenta,
                        CbteTipo = (int)solCae.TipoComprobante,
                    },
                    FeDetReq = DetallesComprobantes
                };

                // Llamar al WS para hacer la solicitud
                var Res       = Clie.FECAESolicitar(this.CrearFEAuthRequest(), CaeReq);
                var Aprobados = 0;

                solCae.Observaciones = new List <Observacion>();

                /* if (Res.FeCabResp.Resultado == "R") {
                 *      // Todo el lote rechazado
                 *      foreach (var Er in Res.Errors) {
                 *              solCae.Observaciones.Add(new Observacion(Er.Code, Er.Msg));
                 *      }
                 * } else { */
                // Aprobado total o parcial
                var ci = 0;
                foreach (var De in Res.FeDetResp)
                {
                    var Comprob = solCae.Comprobantes[ci++];
                    Comprob.Cae = new Cae();
                    if (De.Resultado == "A")
                    {
                        // Aprobado
                        Comprob.Cae.CodigoCae   = De.CAE;
                        Comprob.Cae.Vencimiento = DateTime.ParseExact(De.CAEFchVto, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);
                        Comprob.Numero          = System.Convert.ToInt32(De.CbteDesde);
                        Aprobados++;
                    }

                    if (De.Observaciones != null && De.Observaciones.Count <Obs>() > 0)
                    {
                        Comprob.Obs = new Observacion(De.Observaciones[0].Code, De.Observaciones[0].Msg, Comprob);
                        foreach (var Er in De.Observaciones)
                        {
                            solCae.Observaciones.Add(new Observacion(Er.Code, Er.Msg, Comprob));
                        }
                    }
                }
                /* } */

                return(Aprobados);
            }
        }
 private void ConvertirTributos( FeDetalle detalle, FECAEDetRequest feCaeDet )
 {
     if ( detalle.Tributos.Count > 0 )
     {
         int i = 0;
         feCaeDet.Tributos = new Tributo[detalle.Tributos.Count];
         WrapperTributoFe wtc = new WrapperTributoFe();
         foreach ( TributoComprobante item in detalle.Tributos )
         {
             feCaeDet.Tributos[i] = wtc.Convertir( item );
             i++;
         }
     }
 }
        private WSFE.FECAEDetRequest[] GetDetalles(FacturaTemplate factura, WSFE.Service servicio, WSFE.FEAuthRequest authRequest)
        {
            WSFE.FECAEDetRequest[] fedetreq = new WSFE.FECAEDetRequest[1];

            try
            {
                WSFE.FECAEDetRequest detalle = new FECAEDetRequest();
                List<WSFE.AlicIva> alicuota_iva = new List<AlicIva>();

                Commons commonsUtilities = new Commons(servicio, authRequest);

                int tipo_comprobante = commonsUtilities.GetTipoComprobanteId(factura.Comprobante, factura.TipoComprobante).Value;
                int ptoVta = factura.PuntoDeVenta;
                int conceptoTipo = commonsUtilities.GetTipoConceptoId(factura.Concepto).Value;
                int documetoTipo = commonsUtilities.GetTipoDocumentoId(factura.TipoDocumento).Value;

                detalle.CbteDesde = commonsUtilities.GetComprobanteProximoAAtutorizar(ptoVta, tipo_comprobante) + 1; //numero de comprobante desde
                detalle.CbteHasta = detalle.CbteDesde; //numero de comprobante hasta
                detalle.CbteFch = factura.FechaFactura.ToString("yyyyMMdd");
                detalle.Concepto = conceptoTipo;
                detalle.DocTipo = documetoTipo;
                detalle.DocNro = factura.Cuit;
                detalle.MonId = "PES";//Siempre pesos
                detalle.MonCotiz = 1;//Cotizacion de la moneda es siempre 1 porque es pesos

                if (factura.Concepto.Equals("S"))
                {
                    detalle.FchServDesde = factura.FechaDesde.ToString("yyyyMMdd");
                    detalle.FchServHasta = factura.FechaHasta.ToString("yyyyMMdd");
                    detalle.FchVtoPago = factura.FechaVencimiento.ToString("yyyyMMdd");
                }

                double importeSinIVA = 0;
                double totalIVA = 0;

                //Sumamos y calculamos
                //Como observacion hay que aclarar que el tema de los decimales es bastante complicado y pueden existir
                //situaciones donde la AFIP rechace las solicitudes por redondeos que se efectuan de distinta manera
                foreach (FacturaItemsTemplate item in factura.GetItems())
                {
                    importeSinIVA += item.Unitario;
                    totalIVA += (item.Unitario * (item.TasaIVA / 100));

                    WSFE.AlicIva iva = new AlicIva();
                    iva.BaseImp = item.Unitario;
                    iva.Importe = (item.Unitario * (item.TasaIVA / 100));
                    iva.Id = commonsUtilities.GetTipoIVAId(item.TasaIVA);
                    alicuota_iva.Add(iva);
                }

                detalle.ImpIVA = Math.Round(totalIVA, 2);
                detalle.ImpNeto = Math.Round(importeSinIVA, 2);
                detalle.ImpTotal = detalle.ImpIVA + detalle.ImpNeto;
                detalle.ImpTrib = 0.0;
                detalle.Iva = alicuota_iva.GroupBy(x => x.Id).Select(x => new WSFE.AlicIva
                {
                    Id = x.Key,
                    Importe = Math.Round(x.Sum(i => i.Importe), 2),
                    BaseImp = Math.Round(x.Sum(i => i.BaseImp), 2)
                }).ToArray();
                fedetreq[0] = detalle;
            }
            catch (Exception ex)
            {
                LoggerManager.Error("Ha ocurrido un error al generar el detalle", ex);
            }

            return fedetreq;
        }
        private Decimal ObtenerDiferenciaTotales( FECAEDetRequest requestAfip )
        {
            double sumaTotales = Redondeo.SumarDoubles( new double[] { requestAfip.ImpTotConc, requestAfip.ImpNeto, requestAfip.ImpOpEx, requestAfip.ImpTrib, requestAfip.ImpIVA } );

            Decimal diferencia = (Decimal)requestAfip.ImpTotal - (Decimal)sumaTotales;

            return diferencia;
        }
Example #23
0
        private static string consultarAfip(int p_pv, int p_codigo, double p_importe, double p_iva, double p_total, DateTime p_fecha, long doc, int concepto, int tipo_doc, int tipo_iva, string moneda)
        {
            numero_comprobante = 0;
            cae_comprobante    = "";
            cae_vencimiento    = "";
            mensaje_afip       = "";
            mensaje_obs        = "";
            mensaje_error      = "";
            string m = "";

            resultado = "R";

            try
            {
                if (Main.authRequest == null)
                {
                    Main.authRequest       = new FEAuthRequest();
                    Main.authRequest.Cuit  = Main.CUIT;
                    Main.authRequest.Sign  = Main.SING;
                    Main.authRequest.Token = Main.TOKEN;
                }

                AFIP.TEST.WSFE.Service service = getServicio();
                service.ClientCertificates.Add(Main.certificado);

                /*
                 * if (Main.Testing == 1)
                 * {
                 *  AFIP.TEST.WSFE.Service service = getServicioTest();
                 *  service.ClientCertificates.Add(Main.certificado);
                 * }
                 * else
                 * {
                 *  AFIP.WSFE.Service service = getServicioProducion();
                 *  service.ClientCertificates.Add(Main.certificado);
                 * }*/
                //PtoVenta pvObj = ptos_venta_cm.SelectedItem;
                //int pv = p_pv;//pvObj.Nro;
                //CbteTipo cm = p_codigo;//TiposComprobantesCMB.SelectedItem;

                FECAERequest    req = new FECAERequest();
                FECAECabRequest cab = new FECAECabRequest();
                FECAEDetRequest det = new FECAEDetRequest();

                cab.CantReg  = 1;
                cab.PtoVta   = p_pv;
                cab.CbteTipo = p_codigo;//cm.Id;
                req.FeCabReq = cab;

                FECAEDetRequest bar = det;
                //ConceptoTipo concepto = TipoConcepto.SelectedItem;
                bar.Concepto = concepto; //concepto.ID;
                //DocTipo doctipo = TipoDocCMB.SelectedItem;
                bar.DocTipo = tipo_doc;  //doctipo.Id
                bar.DocNro  = doc;       //long.Parse(DocTX.Text)

                //Buscar el ultimo numero
                try
                {
                    FERecuperaLastCbteResponse lastRes = service.FECompUltimoAutorizado(Main.authRequest, p_pv, p_codigo);
                    int last = lastRes.CbteNro;

                    bar.CbteDesde = last + 1;
                    bar.CbteHasta = last + 1;
                }
                catch
                {
                    bar.CbteDesde = p_codigo;
                    bar.CbteHasta = p_codigo;
                }

                bar.CbteFch = p_fecha.ToString("yyyyMMdd");              //FechaDTP.Value.ToString("yyyyMMdd");

                bar.ImpNeto  = Double.Parse(p_importe.ToString("0.00")); //NetoTX.Text;
                bar.ImpIVA   = Double.Parse(p_iva.ToString("0.00"));     // ImpIvaTx.Text;
                bar.ImpTotal = Double.Parse(p_total.ToString("0.00"));   // TotalTx.Text;

                bar.ImpTotConc = 0;
                bar.ImpOpEx    = 0;
                bar.ImpTrib    = 0;

                //Moneda mon = MonedaCMB.SelectedItem;
                bar.MonId    = moneda;// mon.Id
                bar.MonCotiz = 1;

                AlicIva alicuota = new AlicIva();
                //IvaTipo ivat = TipoIVACmb.SelectedItem;
                alicuota.Id      = tipo_iva;                             // ivat.Id
                alicuota.BaseImp = p_importe;                            // NetoTX.Text
                alicuota.Importe = Double.Parse(p_iva.ToString("0.00")); // ImpIvaTx.Text

                bar.Iva = new AlicIva[] { alicuota };
                //bar.Iva.Append(alicuota);

                req.FeDetReq = new FECAEDetRequest[] { bar };
                //req.FeDetReq.Append(bar);


                try
                {
                    FECAEResponse r      = service.FECAESolicitar(Main.authRequest, req);
                    string        vbCrLf = "\n";

                    resultado = r.FeDetResp[0].Resultado;

                    m  = "Estado Cabecera: " + r.FeCabResp.Resultado + vbCrLf;
                    m += "Estado Detalle: " + r.FeDetResp[0].Resultado;
                    m += vbCrLf;
                    m += "CAE: " + r.FeDetResp[0].CAE;
                    m += vbCrLf;
                    m += "Vto: " + r.FeDetResp[0].CAEFchVto;
                    m += vbCrLf;
                    m += "Numero de comprobante: " + r.FeDetResp[0].CbteDesde;
                    m += vbCrLf;

                    numero_comprobante = r.FeDetResp[0].CbteDesde;
                    cae_comprobante    = r.FeDetResp[0].CAE;
                    cae_vencimiento    = r.FeDetResp[0].CAEFchVto;

                    if (r.FeDetResp[0].Observaciones != null)
                    {
                        foreach (var o in r.FeDetResp[0].Observaciones)
                        {
                            mensaje_obs += string.Format("Obs: {0} ({1})", o.Msg, o.Code) + vbCrLf;
                            m           += mensaje_obs;
                        }
                    }
                    if (r.Errors != null)
                    {
                        foreach (var er in r.Errors)
                        {
                            mensaje_error += string.Format("Er: {0}: {1}", er.Code, er.Msg) + vbCrLf;
                            m             += mensaje_error;
                        }
                    }
                    if (r.Events != null)
                    {
                        foreach (var ev in r.Events)
                        {
                            mensaje_afip += string.Format("Ev: {0}: {1}", ev.Code, ev.Msg) + vbCrLf;
                            m            += mensaje_afip;
                        }
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Log(LogTarget.File, DateTime.Now.ToString() + " - ERROR COMPROBANTE AFIP: " + e.Message + " - " + e.StackTrace);
                    m = "ERROR";
                    return(m);
                }



                //Resultado.Text = m
                LogHelper.Log(LogTarget.File, DateTime.Now.ToString() + " - Consultando en AFIP: " + resultado);
            }
            catch (Exception e)
            {
                LogHelper.Log(LogTarget.File, DateTime.Now.ToString() + " - ERROR COMPROBANTE AFIP: " + e.Message + " - " + e.StackTrace);
                //MessageBox.Show("ERROR: "+e.Message+"\n"+e.StackTrace);
            }

            return(m);
        }
        /// <summary>
        /// Cocina para que cierren los valores
        /// </summary>
        /// <param name="feCaeDet"></param>
        /// <param name="detalle"></param>
        private void TratarDeArreglarCocinando( FECAEDetRequest requestAfip, FeDetalle detalle )
        {
            Decimal diferencia = this.ObtenerDiferenciaTotales( requestAfip );

            // Tolerancia de 2 ctvos
            if ( Math.Abs( diferencia ) <= 0.02M )
            {
                // Suma De Totales Es Menor al total
                if ( diferencia > 0 )
                {
                    if ( requestAfip.ImpIVA > 0 )
                    {
                        // La ligó el IVA
                        requestAfip.ImpIVA = Redondeo.SumarDoubles( new double[]{ requestAfip.ImpIVA , (double)diferencia } );
                        requestAfip.Iva[0].Importe = Redondeo.SumarDoubles( new double[] { requestAfip.Iva[0].Importe, (double)diferencia } );
                    }
                    else if ( requestAfip.ImpTrib > 0 )
                    {
                        // sin IVA, le pego a los impuestos...
                        requestAfip.ImpTrib = Redondeo.SumarDoubles( new double[] { requestAfip.ImpTrib, (double)diferencia } );
                        requestAfip.Tributos[0].Importe = Redondeo.SumarDoubles( new double[] { requestAfip.Tributos[0].Importe, (double)diferencia } );
                    }
                    else if ( requestAfip.ImpOpEx > 0 )
                    {
                        // nada, al exento
                        requestAfip.ImpOpEx = Redondeo.SumarDoubles( new double[] { requestAfip.ImpOpEx, (double)diferencia } );
                    }
                    else if ( requestAfip.ImpTotConc > 0 )
                    {
                        // nada, al Neto NG
                        requestAfip.ImpTotConc = Redondeo.SumarDoubles( new double[] { requestAfip.ImpTotConc, (double)diferencia } );
                    }
                }

                // Suma De Totales Es Mayor al total
                if ( diferencia < 0 )
                {
                    if ( requestAfip.ImpOpEx > 0 )
                    {
                        // Tiene exento, lo pongo ahi
                        requestAfip.ImpOpEx = Redondeo.SumarDoubles( new double[] { requestAfip.ImpOpEx, (double)diferencia } );
                    }
                    else if ( requestAfip.ImpTotConc > 0 )
                    {
                        // Tiene Neto NG, lo pongo ahi
                        requestAfip.ImpTotConc = Redondeo.SumarDoubles( new double[] { requestAfip.ImpTotConc, (double)diferencia } );
                    }
                    else if ( requestAfip.ImpNeto > 0 )
                    {
                        // Importe Neto
                        requestAfip.ImpNeto = Redondeo.SumarDoubles( new double[] { requestAfip.ImpNeto, (double)diferencia } );
                        requestAfip.Iva[0].BaseImp = Redondeo.SumarDoubles( new double[] { requestAfip.Iva[0].BaseImp, (double)diferencia } );
                    }
                }
            }
        }