public void GenerarComprobanteVenta() { if (Comprobante != null) { throw new UserFriendlyException( string.Format( "No se puede pasar al estado {0}. El documento aún no tiene comprobante generado.\nEsto puede deberse a una configuración inválida. Comunique el error al Administrador.", Estado.Nombre)); } if (Cuotas.Count == 0) { throw new UserFriendlyException("Debe ingresar al menos una cuota."); } if (EmitidaFecha == null) { throw new UserFriendlyException("Debe ingresar la Fecha de Emisión."); } var talonario = Identificadores.GetInstance(Session).TalonarioDocumentos; if (talonario == null) { throw new UserFriendlyException( "Debe indicar el talonario asignado para los comprobantes de venta de documentos."); } var nuevoComprobante = new Comprobante(Session) { Propio = false, Destinatario = Poliza.Tomador.Interviniente, Fecha = EmitidaFecha.Value, Tipo = talonario.ComprobanteTipo, Sector = talonario.Sector, Especie = Poliza.Especie, Cambio = Poliza.Cambio, CantidadCuotas = CantidadCuotas, Estado = ComprobanteEstado.Confirmado }; ActualizarComprobanteVenta(nuevoComprobante); Comprobante = nuevoComprobante; }
public void ActualizarComprobanteVenta(Comprobante comprobante) { comprobante.Items.Empty(); foreach (var nuevoItem in from importe in Importes where importe.Tipo != null && importe.Tipo.ConceptoFacturacion != null select new ComprobanteItem(Session) { Concepto = importe.Tipo.ConceptoFacturacion, Cantidad = 1, PrecioUnitario = importe.Importe }) { nuevoItem.ActualizarDescripcion(); nuevoItem.ActualizarImporteTotal(); comprobante.Items.Add(nuevoItem); } comprobante.Cuotas.Empty(); foreach (var cuota in Cuotas) { var nuevaCuota = new ComprobanteCuota(Session) { Numero = cuota.Numero, Fecha = cuota.Fecha, Importe = cuota.Importe }; cuota.ComprobanteCuota = nuevaCuota; comprobante.Cuotas.Add(nuevaCuota); } //Si se llegó a este punto, desde una sesión hija (ej. modificando una cuota puntual), no se debe guardar el comprobante aún //(porque la validación podría fallar, si estamos variando el total del monto de cuotas) //Solo guardar y validar cuando se guarda la sesión principal (documento) if (!(Session is NestedUnitOfWork)) { comprobante.Save(); } }
public static ComprobanteType GetComprobanteType(Comprobante comprobante) { var req = new ComprobanteType( ); if (comprobante.Tipo != null) { req.codigoTipoComprobante = (( ComprobanteTipo )comprobante.Tipo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)).Codigo; } if (comprobante.ConceptosIncluidos == ConceptosIncluidos.Otro) { throw new UserFriendlyException("La autorización electrónica por AFIP solo permite comprobantes de Productos, Servicios, o Prod. y Serv."); } req.codigoConcepto = ( short )comprobante.ConceptosIncluidos; req.numeroPuntoVenta = ( short )comprobante.Sector; req.numeroComprobante = comprobante.Numero; req.fechaEmision = comprobante.Fecha; req.fechaServicioDesde = comprobante.InicioPrestacion; req.fechaServicioHasta = comprobante.FinPrestacion; if (comprobante.Vencimiento != null) { req.fechaVencimientoPago = comprobante.Vencimiento.Value; } req.cotizacionMoneda = comprobante.Cambio; if (comprobante.Especie != null) { req.codigoMoneda = (( Moneda )comprobante.Especie.Moneda.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)).Codigo; } if (comprobante.IdentificacionTipo != null) { req.codigoTipoDocumento = (( IdentificacionTipo )comprobante.IdentificacionTipo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)).Codigo; req.codigoTipoDocumentoSpecified = true; } if (!string.IsNullOrEmpty(comprobante.IdentificacionNro)) { req.numeroDocumento = Convert.ToInt64(comprobante.IdentificacionNro); req.numeroDocumentoSpecified = true; } decimal impGrav = 0, impIVA = 0, impTrib = 0, impNoGrav = 0, impExento = 0; var arraySubtotalesIVA = new List <SubtotalIVAType>( ); var arrayOtrosTributos = new List <OtroTributoType>( ); var arrayItems = new List <ItemType>( ); foreach (var item in comprobante.Items) { if (item.Concepto.Clase != ConceptoClase.Impuesto) { var itemType = new ItemType( ); itemType.descripcion = item.Detalle; itemType.cantidad = item.Cantidad; itemType.cantidadSpecified = true; if (comprobante.Tipo.DiscriminaImpuestos) { itemType.precioUnitario = item.PrecioUnitario; itemType.importeBonificacion = item.ImporteDescuento; itemType.importeIVA = Math.Round(item.ImporteImpuestos, 2); itemType.importeIVASpecified = true; } else { itemType.precioUnitario = item.PrecioUnitarioConImpuesto; itemType.importeBonificacion = item.ImporteDescuentoConImpuesto; } itemType.precioUnitarioSpecified = true; itemType.importeBonificacionSpecified = true; itemType.importeItem = Math.Round(item.ImporteTotalConImpuesto, 2); itemType.codigoCondicionIVA = Convert.ToInt16(item.Concepto.AlicuotaImpuesto.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)); if (item.UnidadMedida == null) { throw new UserFriendlyException("Debe indicar unidad de medida para todos los items."); } itemType.codigoUnidadMedida = ( short )item.UnidadMedida.GetMemberValue(AFIPModule.PropertyNameCodigoAfip); itemType.unidadesMtx = ( int )item.UnidadMedida.UnidadesFraccionamiento; itemType.unidadesMtxSpecified = true; if (item.Articulo != null) { itemType.codigo = item.Articulo.Codigo; itemType.codigoMtx = item.Articulo.CodigoLegal; } if (string.IsNullOrEmpty(itemType.codigoMtx)) { itemType.codigoMtx = item.Concepto.CodigoLegal; } arrayItems.Add(itemType); } switch (( ConceptosGrupos )item.Concepto.Grupo) { case ConceptosGrupos.NoGrav: impNoGrav += item.ImporteTotal; break; case ConceptosGrupos.Exento: impExento += item.ImporteTotal; break; case ConceptosGrupos.Grav0: case ConceptosGrupos.Grav105: case ConceptosGrupos.Grav21: case ConceptosGrupos.Grav27: impGrav += item.ImporteTotal; break; case ConceptosGrupos.IVA0: case ConceptosGrupos.IVA105: case ConceptosGrupos.IVA21: case ConceptosGrupos.IVA27: impIVA += item.ImporteTotal; arraySubtotalesIVA.Add(new SubtotalIVAType { codigo = Convert.ToInt16(item.Concepto.Grupo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)), importe = Math.Round(item.ImporteTotal, 2) }); break; default: if (!string.IsNullOrWhiteSpace(Convert.ToString(item.Concepto.Grupo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)))) { impTrib += item.ImporteTotal; arrayOtrosTributos.Add(new OtroTributoType { baseImponible = item.BaseImponible, codigo = Convert.ToInt16(item.Concepto.Grupo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)), importe = Math.Round(item.ImporteTotal, 2) }); } break; } } req.arrayItems = arrayItems.Count > 0 ? arrayItems.ToArray( ) : null; req.arraySubtotalesIVA = arraySubtotalesIVA.Count > 0 ? arraySubtotalesIVA.ToArray( ) : null; req.arrayOtrosTributos = arrayOtrosTributos.Count > 0 ? arrayOtrosTributos.ToArray( ) : null; req.importeGravado = Math.Round(impGrav, 2); req.importeGravadoSpecified = true; req.importeNoGravado = Math.Round(impNoGrav, 2); req.importeNoGravadoSpecified = true; req.importeExento = Math.Round(impExento, 2); req.importeExentoSpecified = true; req.importeSubtotal = req.importeGravado + req.importeNoGravado + req.importeExento; req.importeOtrosTributos = Math.Round(impTrib, 2); req.importeOtrosTributosSpecified = arrayOtrosTributos.Count > 0; req.importeTotal = req.importeSubtotal + req.importeOtrosTributos + Math.Round(impIVA, 2); return(req); }
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); }