public void Insertar(DtoBase dtoEntidad) { using (var tran = new TransactionScope()) { try { var dto = (ArticuloCrudDto)dtoEntidad; var entidad = new Dominio.Entidades.Articulo { MarcaId = dto.MarcaId, RubroId = dto.RubroId, UnidadMedidaId = dto.UnidadMedidaId, IvaId = dto.IvaId, Codigo = dto.Codigo, CodigoBarra = dto.CodigoBarra, Abreviatura = dto.Abreviatura, Descripcion = dto.Descripcion, Detalle = dto.Detalle, Ubicacion = dto.Ubicacion, ActivarLimiteVenta = dto.ActivarLimiteVenta, LimiteVenta = dto.LimiteVenta, ActivarHoraVenta = dto.ActivarHoraVenta, HoraLimiteVentaDesde = dto.HoraLimiteVentaDesde, HoraLimiteVentaHasta = dto.HoraLimiteVentaHasta, PermiteStockNegativo = dto.PermiteStockNegativo, DescuentaStock = dto.DescuentaStock, StockMinimo = dto.StockMinimo, Foto = dto.Foto, EstaEliminado = false }; _unidadDeTrabajo.ArticuloRepositorio.Insertar(entidad); var listasDePrecios = _unidadDeTrabajo.ListaPrecioRepositorio.Obtener(x => !x.EstaEliminado); if (!listasDePrecios.Any()) { throw new Exception("Por favor cargue primeramente las listas de Precios"); } var fecha = DateTime.Now; foreach (var listasDePrecio in listasDePrecios) { var precioArticulo = new Dominio.Entidades.Precio { FechaActualizacion = fecha, ListaPrecioId = listasDePrecio.Id, ArticuloId = entidad.Id, PrecioCosto = dto.PrecioCosto, PrecioPublico = dto.PrecioCosto + CalcularGanancia(dto.PrecioCosto, listasDePrecio.PorcentajeGanancia), EstaEliminado = false }; _unidadDeTrabajo.PrecioRepositorio.Insertar(precioArticulo); } var configSistema = _unidadDeTrabajo.ConfiguracionRepositorio.Obtener().FirstOrDefault(); if (configSistema == null) { throw new Exception("Ocurrió un error al Obtener la configuracion del sistema"); } var depositos = _unidadDeTrabajo.DepositoRepositorio.Obtener(); foreach (var deposito in depositos) { _unidadDeTrabajo.StockRepositorio.Insertar(new Stock { DepositoId = deposito.Id, ArticuloId = entidad.Id, Cantidad = deposito.Id == configSistema.DepositoStockId ? dto.StockActual : 0, EstaEliminado = false }); } _unidadDeTrabajo.Commit(); tran.Complete(); } catch (Exception ex) { tran.Dispose(); throw new Exception(ex.Message); } } }
public void ActualizarPrecio(decimal valor, bool esPorcentaje, long?marcaId = null, long?rubroId = null, long?listaPrecioId = null, int?codigoDesde = null, int?codigoHasta = null) { using (var tran = new TransactionScope()) { try { Expression <Func <Dominio.Entidades.Articulo, bool> > filtro = x => true; if (marcaId.HasValue) { filtro = filtro.And(x => x.MarcaId == marcaId.Value); } if (rubroId.HasValue) { filtro = filtro.And(x => x.RubroId == rubroId.Value); } if (codigoDesde.HasValue && codigoHasta.HasValue) { filtro = filtro.And(x => x.Codigo >= codigoDesde && x.Codigo <= codigoHasta); } var listaDeArticulosParaActualizar = _unidadDeTrabajo .ArticuloRepositorio.Obtener(filtro, "Precios"); // Recorrer la lista de Articulos buscando sus Precios Actualizados para // una o todas las listas de precios. var listasPrecios = _unidadDeTrabajo.ListaPrecioRepositorio.Obtener(); var fechaActual = DateTime.Now; foreach (var articulo in listaDeArticulosParaActualizar) { if (listaPrecioId.HasValue) // Solo voy a manejarme con un lista de Precios { var ultimoPrecioArticulo = articulo.Precios .FirstOrDefault(x => x.ListaPrecioId == listaPrecioId.Value && x.FechaActualizacion <= fechaActual && x.FechaActualizacion == articulo.Precios.Where(p => p.ListaPrecioId == listaPrecioId.Value && x.FechaActualizacion <= fechaActual) .Max(f => f.FechaActualizacion)); // Calcular Precio Costo var precioCosto = esPorcentaje ? ultimoPrecioArticulo.PrecioCosto + (ultimoPrecioArticulo.PrecioCosto * (valor / 100m)) : ultimoPrecioArticulo.PrecioCosto + valor; var listaSeleccionada = listasPrecios .FirstOrDefault(x => x.Id == listaPrecioId.Value); var precioPublico = precioCosto + (precioCosto * (listaSeleccionada.PorcentajeGanancia / 100m)); var nuevoPrecio = new Dominio.Entidades.Precio { ArticuloId = articulo.Id, ListaPrecioId = listaPrecioId.Value, // Entra por parametro FechaActualizacion = fechaActual, PrecioCosto = precioCosto, PrecioPublico = precioPublico, EstaEliminado = false, }; _unidadDeTrabajo.PrecioRepositorio.Insertar(nuevoPrecio); } else // Van todas las listas de Precios { foreach (var lista in listasPrecios) { var ultimoPrecioArticulo = articulo.Precios .FirstOrDefault(x => x.ListaPrecioId == lista.Id && x.FechaActualizacion <= fechaActual && x.FechaActualizacion == articulo.Precios.Where(p => p.ListaPrecioId == lista.Id && x.FechaActualizacion <= fechaActual) .Max(f => f.FechaActualizacion)); // Calcular Precio Costo var precioCosto = esPorcentaje ? ultimoPrecioArticulo.PrecioCosto + (ultimoPrecioArticulo.PrecioCosto * (valor / 100m)) : ultimoPrecioArticulo.PrecioCosto + valor; var precioPublico = precioCosto + (precioCosto * (lista.PorcentajeGanancia / 100m)); var nuevoPrecio = new Dominio.Entidades.Precio { ArticuloId = articulo.Id, ListaPrecioId = lista.Id, // Esta es la del Foreach FechaActualizacion = fechaActual, PrecioCosto = precioCosto, PrecioPublico = precioPublico, EstaEliminado = false, }; _unidadDeTrabajo.PrecioRepositorio.Insertar(nuevoPrecio); } } } _unidadDeTrabajo.Commit(); tran.Complete(); } catch (Exception e) { tran.Dispose(); throw new Exception(e.Message); } } }