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); } }