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); } } }
public void Actualizar(bool marca, bool rubro, bool articulo, bool listaPrecio, decimal valor, bool porcentaje, long marcaId, long rubroId, long codigoDesde, long codigoHasta, long listaPrecioId) { using (var transaccion = new TransactionScope()) { try { Expression <Func <Dominio.Entidades.Articulo, bool> > filtro = x => true; if (marca) { filtro = filtro.And(x => x.MarcaId == marcaId); } if (rubro) { filtro = filtro.And(x => x.RubroId == rubroId); } if (articulo) { filtro = filtro.And(x => (x.Id >= codigoDesde && x.Id <= codigoHasta)); } var resultado = _unidaDeTrabajo.ArticuloRepositorio.Obtener(filtro, "Precios"); var listaDePrecio = _unidaDeTrabajo.ListaPrecioRepositorio.Obtener(); var fechaActual = DateTime.Now; foreach (var producto in resultado) { if (listaPrecioId != 0) { var precios = producto.Precios.FirstOrDefault(x => x.ListaPrecioId == listaPrecioId && x.FechaActualizacion <= fechaActual && x.FechaActualizacion == producto.Precios.Where(p => p.ListaPrecioId == listaPrecioId && x.FechaActualizacion <= fechaActual).Max(f => f.FechaActualizacion)); var precioCosto = porcentaje ? precios.PrecioCosto + (precios.PrecioCosto * (valor / 100m)) : precios.PrecioCosto + valor; var listaSeleccionada = listaDePrecio.FirstOrDefault(x => x.Id == listaPrecioId); var precioPublico = precioCosto + (precioCosto * (listaSeleccionada.PorcentajeGanancia / 100m)); var nuevoPrecio = new Dominio.Entidades.Precio { ArticuloId = producto.Id, ListaPrecioId = listaPrecioId, FechaActualizacion = fechaActual, PrecioCosto = precioCosto, PrecioPublico = precioPublico, EstaEliminado = false }; _unidaDeTrabajo.PrecioRepositorio.Insertar(nuevoPrecio); } else { foreach (var listas in listaDePrecio) { var precios = producto.Precios.FirstOrDefault(x => x.ListaPrecioId == listas.Id && x.FechaActualizacion <= fechaActual && x.FechaActualizacion == producto.Precios.Where(p => p.ListaPrecioId == listas.Id && x.FechaActualizacion <= fechaActual).Max(f => f.FechaActualizacion)); var precioCosto = porcentaje ? precios.PrecioCosto + (precios.PrecioCosto * (valor / 100m)) : precios.PrecioCosto + valor; var precioPublico = precioCosto + (precioCosto * (listas.PorcentajeGanancia / 100m)); var nuevoPrecio = new Dominio.Entidades.Precio { ArticuloId = producto.Id, ListaPrecioId = listas.Id, FechaActualizacion = fechaActual, PrecioCosto = precioCosto, PrecioPublico = precioPublico, EstaEliminado = false }; _unidaDeTrabajo.PrecioRepositorio.Insertar(nuevoPrecio); } } } _unidaDeTrabajo.Commit(); transaccion.Complete(); } catch (Exception e) { transaccion.Dispose(); throw new Exception(e.Message); } } }