예제 #1
0
 public Impuesto Single(int idImpuesto)
 {
     try
     {
         return(repository.Single(idImpuesto));
     }
     catch (Exception ex)
     {
         throw new Exception(ex.Message);
     }
 }
예제 #2
0
        public void Costear(Transaccion transaccion, DbTransaction transaction)
        {
            try
            {
                var igv          = impuestoRepository.Single((int)TipoImpuesto.IGV);
                var listasPrecio = listaPrecioRepository.GetByEmpresa(transaccion.IdEmpresa);

                foreach (var movimientoProducto in transaccion.MovimientoProducto)
                {
                    var producto           = productoRepository.Single(movimientoProducto.IdProducto);
                    var presentacionActual = presentacionRepository.Single(movimientoProducto.IdPresentacion);

                    var cantidadCompra = movimientoProducto.Cantidad.Redondear();
                    var costoCompra    = movimientoProducto.Costo.Redondear();
                    var equivalencia   = presentacionActual.Equivalencia.Redondear();

                    var costoActual = productoPrecioRepository.GetCostoByPresentacion(transaccion.IdEmpresa, transaccion.IdSucursal, presentacionActual.IdPresentacion, transaction);
                    var stockActual = productoStockRepository.GetStockByPresentacion(transaccion.IdSucursal, presentacionActual.IdPresentacion, transaction);

                    if (costoActual <= 0 || stockActual <= 0)
                    {
                        costoActual = costoCompra;
                        stockActual = cantidadCompra;
                    }

                    var costoPonderadoMovimiento = (((stockActual * costoActual) + (costoCompra * cantidadCompra)) / (stockActual + cantidadCompra)).Redondear();
                    var costoPonderado           = (costoPonderadoMovimiento / equivalencia).Redondear();

                    var presentaciones = presentacionRepository.GetByIdProducto(movimientoProducto.IdProducto);
                    var precios        = productoPrecioRepository.GetPreciosBySucursalAndProducto(transaccion.IdSucursal, movimientoProducto.IdProducto, transaction);

                    foreach (var presentacion in presentaciones)
                    {
                        var costo = (costoPonderado * presentacion.Equivalencia).Redondear();

                        foreach (var listaPrecio in listasPrecio)
                        {
                            costo = tipoCambioRepository.GetMontoEnMonedaLocal(listaPrecio.IdMoneda, costo, transaccion.FechaDocumento, transaccion.IdEmpresa, true);
                            var productoPrecio = precios.FirstOrDefault(p => p.IdListaPrecio == listaPrecio.IdListaPrecio && p.IdPresentacion == presentacion.IdPresentacion);

                            if (productoPrecio == null)
                            {
                                #region Insertar en ProductoPrecio

                                var precioVenta = producto.EsExonerado ? costo : (costo * (1 + (igv.Monto / 100))).Redondear();

                                productoPrecio = new ProductoPrecio
                                {
                                    IdSucursal         = transaccion.IdSucursal,
                                    IdPresentacion     = presentacion.IdPresentacion,
                                    IdListaPrecio      = listaPrecio.IdListaPrecio,
                                    Costo              = costo,
                                    PorcentajeGanancia = 0m,
                                    Ganancia           = 0m,
                                    Valor              = costo,
                                    PrecioVenta        = precioVenta,
                                    UsuarioCreacion    = transaccion.UsuarioCreacion
                                };

                                productoPrecioRepository.Add(productoPrecio);

                                #endregion
                            }
                            else
                            {
                                if (listaPrecio.AutoActualizar)
                                {
                                    var ganancia    = costo * productoPrecio.PorcentajeGanancia.Redondear();
                                    var valor       = costo + ganancia;
                                    var precioVenta = producto.EsExonerado ? valor : (valor * (1 + (igv.Monto / 100m))).Redondear();

                                    #region Actualizar Costo, Ganancia, Valor y Precio de Venta

                                    productoPrecio.Costo = costo;
                                    productoPrecio.PorcentajeGanancia = 0;
                                    productoPrecio.Ganancia           = ganancia;
                                    productoPrecio.Valor               = valor;
                                    productoPrecio.PrecioVenta         = precioVenta;
                                    productoPrecio.UsuarioModificacion = transaccion.UsuarioModificacion;

                                    productoPrecioRepository.UpdateCostoGananciaValorPrecioVenta(productoPrecio, transaction);

                                    #endregion
                                }
                                else
                                {
                                    #region Actualizar sólo Costo

                                    productoPrecio.Costo           = costo;
                                    productoPrecio.UsuarioCreacion = transaccion.UsuarioCreacion;

                                    productoPrecioRepository.UpdateCostoProductoPrecio(productoPrecio, transaction);

                                    #endregion
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Ocurrio un error mientras se realizaba el Costeo, detalles: " + ex.Message);
            }
        }