Esempio n. 1
0
        public static Afip.Ws.FacturaElectronica.SolicitudCae CrearSolicitudCae(Lbl.Comprobantes.ComprobanteConArticulos comprobante, int numero)
        {
            // Crear la solicitud de CAE
            var SolCae = new Afip.Ws.FacturaElectronica.SolicitudCae()
            {
                PuntoDeVenta    = comprobante.PV,
                TipoComprobante = Afip.Ws.FacturaElectronica.Tablas.ComprobantesTiposPorLetra[comprobante.Tipo.Nomenclatura]
            };

            // Crear el comprobante asociado
            var ComprobanteAsociado = new Afip.Ws.FacturaElectronica.ComprobanteAsociado()
            {
                Conceptos = (Afip.Ws.FacturaElectronica.Tablas.Conceptos)comprobante.Articulos.ConceptosAfip(),
                Numero    = numero,
            };

            if ((ComprobanteAsociado.Conceptos | Tablas.Conceptos.Servicios) == Tablas.Conceptos.Servicios)
            {
                foreach (var Art in comprobante.Articulos)
                {
                    if (Art.Articulo != null)
                    {
                        switch (Art.Articulo.Periodicidad)
                        {
                        case Lbl.Articulos.Periodicidad.PorSemana:
                            DateTime SemanaPasada = DateTime.Now;
                            SemanaPasada.AddDays(-7);
                            ComprobanteAsociado.ServicioFechaDesde = new DateTime(SemanaPasada.Year, SemanaPasada.Month, SemanaPasada.Day);
                            ComprobanteAsociado.ServicioFechaHasta = DateTime.Now;
                            break;

                        case Lbl.Articulos.Periodicidad.PorMes:
                            DateTime MesPasado = DateTime.Now;
                            MesPasado.AddMonths(-1);
                            ComprobanteAsociado.ServicioFechaDesde = new DateTime(MesPasado.Year, MesPasado.Month, 1);
                            ComprobanteAsociado.ServicioFechaHasta = new DateTime(MesPasado.Year, MesPasado.Month, DateTime.DaysInMonth(MesPasado.Year, MesPasado.Month));
                            break;

                        case Lbl.Articulos.Periodicidad.PorBimestre:
                            DateTime MesPasado1 = DateTime.Now;
                            MesPasado1.AddMonths(-1);
                            DateTime MesPasado2 = DateTime.Now;
                            MesPasado2.AddMonths(-2);
                            ComprobanteAsociado.ServicioFechaDesde = new DateTime(MesPasado2.Year, MesPasado2.Month, 1);
                            ComprobanteAsociado.ServicioFechaHasta = new DateTime(MesPasado1.Year, MesPasado1.Month, DateTime.DaysInMonth(MesPasado1.Year, MesPasado1.Month));
                            break;

                        case Lbl.Articulos.Periodicidad.PorOcasion:
                        case Lbl.Articulos.Periodicidad.PorMinuto:
                        case Lbl.Articulos.Periodicidad.PorHora:
                        case Lbl.Articulos.Periodicidad.PorDia:
                        default:
                            ComprobanteAsociado.ServicioFechaDesde = DateTime.Now;
                            ComprobanteAsociado.ServicioFechaHasta = ComprobanteAsociado.ServicioFechaDesde;
                            break;
                        }
                        break;
                    }
                }

                ComprobanteAsociado.FechaVencimientoPago = DateTime.Now;
            }

            // Asignar cliente al comprobante
            if (comprobante.Cliente.SituacionTributaria == null || comprobante.Cliente.SituacionTributaria.EsConsumidorFinal)
            {
                if (string.IsNullOrEmpty(comprobante.Cliente.NumeroDocumento))
                {
                    ComprobanteAsociado.Cliente = new Afip.Ws.FacturaElectronica.Cliente()
                    {
                        DocumentoTipo   = Afip.Ws.FacturaElectronica.Tablas.DocumentoTipos.SinIdentificar,
                        DocumentoNumero = Lfx.Types.Parsing.ParseInt(comprobante.Cliente.NumeroDocumento)
                    };
                }
                else
                {
                    ComprobanteAsociado.Cliente = new Afip.Ws.FacturaElectronica.Cliente()
                    {
                        DocumentoTipo   = Afip.Ws.FacturaElectronica.Tablas.DocumentoTipos.Dni,
                        DocumentoNumero = Lfx.Types.Parsing.ParseInt(comprobante.Cliente.NumeroDocumento)
                    };
                }
            }
            else
            {
                long DocNro = 0;
                long.TryParse(comprobante.Cliente.Cuit.ToString().Replace("-", "").Replace(" ", "").Replace("/", "").Replace(".", ""), System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out DocNro);
                ComprobanteAsociado.Cliente = new Afip.Ws.FacturaElectronica.Cliente()
                {
                    DocumentoTipo   = Afip.Ws.FacturaElectronica.Tablas.DocumentoTipos.Cuit,
                    DocumentoNumero = DocNro
                };
            }

            // Agregar conceptos al comprobante, agrupados por alícuota
            if (comprobante.Tipo.Letra == "C")
            {
                // El comprobante C lleva características especiales
                ComprobanteAsociado.ImporteNetoGravado = comprobante.Total;
            }
            else if (comprobante.Cliente.ObtenerSituacionIva() == Lbl.Impuestos.SituacionIva.Exento)
            {
                // Cliente exento... una sóla alícuota al 0% por el total
                ComprobanteAsociado.ImportesAlicuotas.Add(new Afip.Ws.FacturaElectronica.ImporteAlicuota()
                {
                    Alicuota      = Afip.Ws.FacturaElectronica.Tablas.Alicuotas.Iva0,
                    BaseImponible = comprobante.Total,
                    Importe       = 0m
                });
                ComprobanteAsociado.ImporteNetoGravado = ComprobanteAsociado.ImportesAlicuotas.ImporteNetoGravado();
            }
            else
            {
                // Agregar una o más alícuotas de IVA
                var Alicuotas = comprobante.AlicuotasUsadas();
                foreach (Lbl.Impuestos.Alicuota Alic in Alicuotas.Values)
                {
                    decimal ImporteIva     = comprobante.TotalIvaAlicuota(Alic.Id);
                    decimal ImporteGravado = comprobante.ImporteGravadoAlicuota(Alic.Id);

                    ComprobanteAsociado.ImportesAlicuotas.Add(new Afip.Ws.FacturaElectronica.ImporteAlicuota()
                    {
                        Alicuota      = (Afip.Ws.FacturaElectronica.Tablas.Alicuotas)Lbl.Archivos.Salida.CitiTablas.Alicuotas[Alic.Id],
                        BaseImponible = ImporteGravado,
                        Importe       = ImporteIva
                    });
                }
                ComprobanteAsociado.ImporteNetoGravado = ComprobanteAsociado.ImportesAlicuotas.ImporteNetoGravado();
            }

            // Agregar el comprobante asociado a la solicitud de CAE
            SolCae.Comprobantes = new Afip.Ws.FacturaElectronica.ColeccionComprobantesAsociados()
            {
                ComprobanteAsociado
            };

            return(SolCae);
        }
        /// <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);
            }
        }