/// <summary>
        /// Devuelve la suma de los importes totales de todos los comprobantes.
        /// </summary>
        public double ImporteTotal()
        {
            double Res = 0;

            foreach (ComprobanteAsociado Comprob in this)
            {
                Res += decimal.ToDouble(Comprob.ImporteTotal());
            }
            return(Res);
        }
        /// <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);
            }
        }