private void CargarComprobantesYaAutorizados(FEAuthRequest feAuthRequest, FECAERequest feCAERequest)
        {
            // Agregar comprobantes que fueron autorizados pero que no fueron cargados
            // por problemas en la comunicacion (devolucion de datos por parte de la AFIP)
            FERecuperaLastCbteResponse ultimoCbteAutorizadoAfip = this.ObtenerUltimoComprobanteAutorizado(feAuthRequest, feCAERequest);
            ComprobanteDto             ultimoCbteCargado        = this.ObtenerUltimoComprobanteCargado(feCAERequest);

            if (ultimoCbteCargado == null ||
                ultimoCbteCargado.CbteHasta < ultimoCbteAutorizadoAfip.CbteNro)
            {
                // Cargarlo en la base los comprobantes faltantes
                long           cbteNro = ultimoCbteCargado != null ? (long)ultimoCbteCargado.CbteHasta + 1 : 1;
                ComprobanteDto cbteDto = null;
                while (cbteNro <= ultimoCbteAutorizadoAfip.CbteNro)
                {
                    FECompConsResponse cbteAfip = this.ObtenerComprobanteAfip(feAuthRequest, feCAERequest, cbteNro).ResultGet;
                    if (cbteAfip == null)
                    {
                        break;
                    }

                    if (cbteAfip.EmisionTipo == "CAE")
                    {
                        cbteDto     = new ComprobanteDto();
                        cbteDto.CAE = cbteAfip.CodAutorizacion;
                        cbteDto.CAEFechaVencimiento = DateTimeHelper.ConvertyyyyMMddToDate(cbteAfip.FchVto);
                        cbteDto.CbteDesde           = cbteAfip.CbteDesde;
                        cbteDto.CbteHasta           = cbteAfip.CbteHasta;
                        cbteDto.CbteFecha           = DateTimeHelper.ConvertyyyyMMddToDate(cbteAfip.CbteFch);
                        cbteDto.PtoVta            = cbteAfip.PtoVta;
                        cbteDto.TipoComprobanteId = cbteAfip.CbteTipo;
                        TipoComprobanteDto tipoCbteDto = this.comprobanteSvc.ObtenerTipoComprobantePorCodigoAfip(cbteDto.TipoComprobanteId);
                        if (tipoCbteDto != null)
                        {
                            cbteDto.TipoComprobanteId = tipoCbteDto.Id;
                        }
                        if (cbteAfip.DocTipo == 80) // CUIT
                        {
                            ClienteDto clienteDto = this.clienteSvc.ObtenerClientePorCuit(cbteAfip.DocNro);
                            if (clienteDto != null)
                            {
                                cbteDto.ClienteId = clienteDto.Id;
                            }
                        }
                        // #TODO: borrar
                        //EstadoComprobanteDto estadoDto = this.comprobanteSvc.ObtenerEstado(CodigoEstadoCbte.NoVisualizado);
                        //if (estadoDto != null)
                        //{
                        //    cbteDto.EstadoId = estadoDto.Id;
                        //}
                        this.comprobanteSvc.CrearComprobante(cbteDto);
                        cbteNro = (long)cbteDto.CbteHasta + 1;
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
        private string RemoverComprobantesAutorizados(FEAuthRequest feAuthRequest, FECAERequest feCAERequest)
        {
            StringBuilder comprobanteAutorizados = new StringBuilder();

            // Remover comprobantes que ya tienen CAE
            if (feCAERequest.FeDetReq.Length > 0)
            {
                FERecuperaLastCbteResponse ultimoCbteAutorizadoAfip = this.ObtenerUltimoComprobanteAutorizado(feAuthRequest, feCAERequest);
                List <FECAEDetRequest>     feDetReqList             = new List <FECAEDetRequest>();
                TipoComprobanteDto         tipoCbteDto = this.comprobanteSvc.ObtenerTipoComprobantePorCodigoAfip(feCAERequest.FeCabReq.CbteTipo);
                foreach (var cbte in feCAERequest.FeDetReq)
                {
                    if (ultimoCbteAutorizadoAfip != null && cbte.CbteDesde <= ultimoCbteAutorizadoAfip.CbteNro)
                    {
                        // En el archivo hay comprobantes ya autorizados
                        // se debe remover del pedido y reportar la advertencia
                        comprobanteAutorizados.AppendFormat("ADVERTENCIA: {0} Pto Venta: {1} Nro Desde: {2} Hasta: {3} ya ha sido autorizado", tipoCbteDto.Descripcion
                                                            , feCAERequest.FeCabReq.PtoVta
                                                            , cbte.CbteDesde
                                                            , cbte.CbteHasta);
                    }
                    else
                    {
                        feDetReqList.Add(cbte);
                    }
                }
                feCAERequest.FeDetReq = feDetReqList.ToArray();
            }
            return(comprobanteAutorizados.ToString());
        }
Exemple #3
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);
        }
Exemple #4
0
        private void btnConsultar_Click(object sender, EventArgs e)
        {
            this.txtResultados.Text = string.Empty;
            if (cbWebService.SelectedItem != null)
            {
                string selectedValue = (cbWebService.SelectedItem as WebServiceAfipDto).Nombre.Trim();
                if (selectedValue == GetTiposMonedasNombre)
                {
                    this.gridResultados.DataSource = this.client.GetTiposMonedas(this.ticket).ResultGet;
                }
                else if (selectedValue == GetTiposCbtesNombre)
                {
                    this.gridResultados.DataSource = this.client.GetTiposCbte(this.ticket).ResultGet;
                }
                else if (selectedValue == GetTiposTributosNombre)
                {
                    this.gridResultados.DataSource = this.client.GetTiposTributos(this.ticket).ResultGet;
                }
                else if (selectedValue == GetTiposIvaNombre)
                {
                    this.gridResultados.DataSource = this.client.GetTiposIva(this.ticket).ResultGet;
                }
                else if (selectedValue == GetTiposOpcionalNombre)
                {
                    this.gridResultados.DataSource = this.client.GetTiposOpcional(this.ticket).ResultGet;
                }
                else if (selectedValue == CompTotXRequestNombre)
                {
                    this.txtResultados.Text = this.client.CompTotXRequest(this.ticket).RegXReq.ToString();
                }
                else if (selectedValue == GetTiposDocNombre)
                {
                    this.gridResultados.DataSource = this.client.GetTiposDoc(this.ticket).ResultGet;
                }
                else if (selectedValue == CompUltimoAutorizadoNombre)
                {
                    if (string.IsNullOrEmpty(this.txtPtoVta.Text))
                    {
                        MessageBox.Show("Debe ingresar un valor para el Punto de Venta", "Validación campos", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }

                    int ptoVtaInt = int.Parse(this.txtPtoVta.Text);
                    int cbteTipo  = int.Parse(this.cbTiposCbte.SelectedValue.ToString());
                    FERecuperaLastCbteResponse result = this.client.CompUltimoAutorizado(this.ticket, ptoVtaInt, cbteTipo);

                    var tiposDeComprobante = ComprobanteService.ObtenerTiposComprobantes();

                    string tipoComprobanteStr = result.CbteTipo.ToString();
                    var    tipoDeComprobante  = tiposDeComprobante.Where(t => t.CodigoAfip.HasValue && t.CodigoAfip.Value == result.CbteTipo).SingleOrDefault();
                    if (tipoDeComprobante != null)
                    {
                        tipoComprobanteStr = string.Format("{0}, AFIP {1} {2}", tipoDeComprobante.Codigo, tipoDeComprobante.CodigoAfip, tipoDeComprobante.Descripcion);
                    }

                    this.txtResultados.Text = string.Format(@"CbteNro: {0}{1}CbteTipo: {2}{3}PtoVta: {4}{5}",
                                                            result.CbteNro,
                                                            Environment.NewLine,
                                                            tipoComprobanteStr,
                                                            Environment.NewLine,
                                                            result.PtoVta,
                                                            Environment.NewLine);
                }
                else if (selectedValue == GetTiposConceptoNombre)
                {
                    this.gridResultados.DataSource = this.client.GetTiposConcepto(this.ticket).ResultGet;
                }
                else if (selectedValue == GetCotizacionNombre)
                {
                    string     monId      = this.cbMoneda.SelectedValue.ToString();
                    Cotizacion cotizacion = this.client.GetCotizacion(this.ticket, monId).ResultGet;
                    if (cotizacion != null)
                    {
                        this.txtResultados.Text = string.Format(@"Fecha: {0}{1}Cotizacion: ${2}{3}",
                                                                DateTime.ParseExact(cotizacion.FchCotiz, "yyyyMMdd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
                                                                Environment.NewLine,
                                                                cotizacion.MonCotiz,
                                                                Environment.NewLine);
                    }
                    else
                    {
                        this.txtResultados.Text = "No hay cotizacion disponible";
                    }
                }
                else if (selectedValue == FEXGetLast_ID)
                {
                    this.gridResultados.DataSource = this.client.GetLastId(this.ticketFex).FEXResultGet;
                }
                else if (selectedValue == FEXGetPARAM_Cbte_Tipo)
                {
                    this.gridResultados.DataSource = this.client.GetTiposComprobantes(this.ticketFex).FEXResultGet;
                }
                else if (selectedValue == FEXGetPARAM_DST_CUIT)
                {
                    this.gridResultados.DataSource =
                        this.client.GetCuits(this.ticketFex).FEXResultGet.OrderBy(c => c.DST_Ds).ToList();
                }
                else if (selectedValue == FEXGetPARAM_DST_pais)
                {
                    this.gridResultados.DataSource = this.client.GetPaises(this.ticketFex).FEXResultGet.OrderBy(p => p.DST_Ds).ToList();
                }
                else if (selectedValue == FEXGetPARAM_Idiomas)
                {
                    this.gridResultados.DataSource = this.client.GetIdiomas(this.ticketFex).FEXResultGet;
                }
                else if (selectedValue == FEXGetPARAM_Incoterms)
                {
                    this.gridResultados.DataSource = this.client.GetIncoterms(this.ticketFex).FEXResultGet;
                }
                else if (selectedValue == FEXGetPARAM_MON)
                {
                    this.gridResultados.DataSource = this.client.GetMonedas(this.ticketFex).FEXResultGet.OrderBy(m => m.Mon_Ds).ToList();
                }
                else if (selectedValue == FEXGetPARAM_PtoVenta)
                {
                    this.gridResultados.DataSource = this.client.GetPuntosDeVenta(this.ticketFex).FEXResultGet;
                }
                else if (selectedValue == FEXGetPARAM_Tipo_Expo)
                {
                    this.gridResultados.DataSource = this.client.GetTiposDeExportacion(this.ticketFex).FEXResultGet;
                }
                else if (selectedValue == FEXGetPARAM_UMed)
                {
                    this.gridResultados.DataSource = this.client.GetUnidadesDeMedida(this.ticketFex).FEXResultGet.Where(u => u != null).OrderBy(u => u.Umed_Ds).ToList();
                }
                if (selectedValue == GetTiposMonedasNombre ||
                    selectedValue == GetTiposCbtesNombre ||
                    selectedValue == GetTiposTributosNombre ||
                    selectedValue == GetTiposIvaNombre ||
                    selectedValue == GetTiposOpcionalNombre ||
                    selectedValue == GetTiposDocNombre ||
                    selectedValue == GetTiposConceptoNombre)
                {
                    this.lblResultados.Text = string.Format("Resultados: {0} registros", this.gridResultados.RowCount);
                }
                else if (selectedValue == FEXGetCMP)
                {
                    if (string.IsNullOrEmpty(this.txtNroCbteFex.Text.Trim()) ||
                        string.IsNullOrEmpty(this.cbTiposCbteFex.SelectedValue.ToString()) ||
                        string.IsNullOrEmpty(this.cbPtosVtaFex.SelectedValue.ToString()))
                    {
                        MensajeValidarParametros();
                        return;
                    }
                    ClsFEXGetCMP fexGetCmp = new ClsFEXGetCMP();
                    fexGetCmp.Cbte_nro  = long.Parse(this.txtNroCbteFex.Text.Trim());
                    fexGetCmp.Cbte_tipo = short.Parse(this.cbTiposCbteFex.SelectedValue.ToString());
                    fexGetCmp.Punto_vta = short.Parse(this.cbPtosVtaFex.SelectedValue.ToString());
                    FEXGetCMPResponse result = this.client.GetComprobante(this.ticketFex, fexGetCmp);
                    // TODO: mostrar resultado
                }
                else if (selectedValue == FEXGetLast_CMP)
                {
                    if (string.IsNullOrEmpty(this.cbTiposCbteFex.SelectedValue.ToString()) ||
                        string.IsNullOrEmpty(this.cbPtosVtaFex.SelectedValue.ToString()))
                    {
                        MensajeValidarParametros();
                        return;
                    }
                    ClsFEX_LastCMP fexLastCmp = new ClsFEX_LastCMP();
                    fexLastCmp.Cbte_Tipo = short.Parse(this.cbTiposCbteFex.SelectedValue.ToString());
                    fexLastCmp.Pto_venta = short.Parse(this.cbPtosVtaFex.SelectedValue.ToString());
                    fexLastCmp.Cuit      = this.ticketFex.Cuit;
                    fexLastCmp.Sign      = this.ticketFex.Sign;
                    fexLastCmp.Token     = this.ticketFex.Token;
                    FEXResponseLast_CMP result = this.client.GetUltimoComprobanteAutorizado(fexLastCmp);
                    // TODO: mostrar resultado
                }
                else if (selectedValue == FEXGetLast_ID)
                {
                    FEXResponse_LastID result = this.client.GetLastId(this.ticketFex);
                    this.txtResultados.Text = result.FEXResultGet.Id.ToString();
                }
                else if (selectedValue == FEXGetPARAM_Ctz)
                {
                    if (string.IsNullOrEmpty(this.cbMoneda.SelectedValue.ToString()))
                    {
                        MensajeValidarParametros();
                        return;
                    }
                    string          monId      = this.cbMoneda.SelectedValue.ToString();
                    FEXResponse_Ctz cotizacion = this.client.GetFexCotizacion(this.ticketFex, monId);
                    if (cotizacion != null)
                    {
                        this.txtResultados.Text = string.Format(@"Fecha: {0}{1}Cotizacion: ${2}{3}",
                                                                DateTime.ParseExact(cotizacion.FEXResultGet.Mon_fecha, "yyyyMMdd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
                                                                Environment.NewLine,
                                                                cotizacion.FEXResultGet.Mon_ctz,
                                                                Environment.NewLine);
                    }
                    else
                    {
                        this.txtResultados.Text = "No hay cotizacion disponible";
                    }
                }
            }
        }
        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;
        }