public Impuesto Single(int idImpuesto) { try { return(repository.Single(idImpuesto)); } catch (Exception ex) { throw new Exception(ex.Message); } }
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); } }