Esempio n. 1
0
        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);
                }
            }
        }