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);
                }
            }
        }