Пример #1
0
        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;
        }
Пример #2
0
        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);
        }