示例#1
0
        public InventariosSaldos LlenarObjetoInventartiosSaldos(MovimientosES item, Detalles_ES mov, List <Articulo> ArticuloCompletoServer, List <InventariosSaldos> InventariosSaldosCompletoServer)
        {
            ////////////////////////////////////PARA LA TABLA SALDOS//////////////////////////////////////////////////////
            try
            {
                InventariosSaldos Saldo       = new InventariosSaldos();
                InventariosSaldos SaldoActual = new InventariosSaldos();

                mov.Articulo = ArticuloCompletoServer.Find(b => b._id == mov.Articulo._id);
                SaldoActual  = InventariosSaldosCompletoServer.Find(b => b.ArticuloId == mov.Articulo._id && b.AlmacenId == item.Almacen._id && b.Ano == item.Fecha.Year && b.Mes == item.Fecha.Month);

                if (SaldoActual == null)
                {//SI ES UN NUEVO  REGITRO EN LA TABLA INVENTARIOS SALDOS, ES UNO POR CADA MES DEL AÑO EN LA COMBINACION ARTICULO ALMACEN
                    Saldo.ArticuloId = mov.Articulo._id;
                    Saldo.AlmacenId  = item.Almacen._id;
                    Saldo.Ano        = item.Fecha.Year;
                    Saldo.Mes        = item.Fecha.Month;
                    Saldo.UltimoDia  = item.Fecha.Day;


                    if (item.Concepto.Naturaleza == "ENTRADA")
                    {
                        Saldo.EntradaUnidades = mov.Cantidad;
                        Saldo.EntradasCosto   = mov.Costo * mov.Cantidad;
                    }
                    else if (item.Concepto.Naturaleza == "SALIDA")
                    {
                        Saldo.SalidasUnidades = mov.Cantidad;
                        Saldo.SalidasCosto    = mov.Costo * mov.Cantidad;
                    }

                    return(Saldo);
                }
                else
                {
                    if (item.Fecha.Day > SaldoActual.UltimoDia)
                    {
                        SaldoActual.UltimoDia = item.Fecha.Day;
                    }



                    if (item.Concepto.Naturaleza == "ENTRADA")
                    {
                        SaldoActual.EntradaUnidades += mov.Cantidad;
                        SaldoActual.EntradasCosto   += mov.Costo * mov.Cantidad;
                    }
                    else if (item.Concepto.Naturaleza == "SALIDA")
                    {
                        SaldoActual.SalidasUnidades += mov.Cantidad;
                        SaldoActual.SalidasCosto    += mov.Costo * mov.Cantidad;
                    }
                    return(SaldoActual);
                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }
示例#2
0
        public MovimientosES add(MovimientosES item, EmpresaContext db, IClientSessionHandle session = null)
        {
            try
            {
                item.Concepto = db.Concepto.getbyFields(item.Concepto.id, "_id,Clave,Nombre,Naturaleza,CostoAutomatico,FolioAutomatico", db);
                item.Almacen  = db.Almacen.getbyFields(item.Almacen.id, "_id,Nombre", db);

                if (item.Concepto.FolioAutomatico == "SI")
                {
                    if (item.Concepto.Clave == null)
                    {
                        throw new Exception("El concepto seleccionado no tiene una clave asignada");
                    }

                    item.Folio = AutoIncrement(item.Concepto.Clave, db.db, session).ToString();
                }


                //Genera filtros para busqueda
                var builderSaldos = Builders <InventariosSaldos> .Filter;
                var builderCostos = Builders <InventariosCostos> .Filter;

                var Ids    = (from an in item.Detalles_ES select an.Articulo).ToList().Select(ab => ab._id); //recolectamos en una lista los ids que nos manda el cliente
                var filter = Builders <Articulo> .Filter.In(myClass => myClass._id, Ids);                    //creamos un filtro con la clapsula In

                //Realizamos una sola query a la bd obteniendo solo datos necesarios (en este caso solo el nombre,id y unidad de inventario) para hacerla lo mas liviana
                List <Articulo> ArticuloCompletoServer = db.Articulo.Filters(filter, "Nombre,Clave,UnidadInventario.Abreviatura,SubGrupoComponente");

                List <InventariosSaldos> InventariosSaldosCompletoServer = db.InventariosSaldos.Filters(builderSaldos.In("ArticuloId", Ids) & builderSaldos.Eq("AlmacenId", item.Almacen._id));
                List <InventariosCostos> InventariosCostosCompletoServer = db.InventariosCostos.Filters(builderCostos.In("ArticuloId", Ids) & builderCostos.Eq("AlmacenId", item.Almacen._id));

                item.Sistema_Origen = "IN";
                item.Cancelado      = "NO";
                item.Fecha          = item.Fecha.Date < DateTime.Now.Date ? item.Fecha.AddHours(DateTime.Now.Hour).AddMinutes(DateTime.Now.Minute).AddSeconds(DateTime.Now.Second) : item.Fecha;
                item.Ano            = item.Fecha.Year;
                item.Mes            = item.Fecha.Month;
                item.Dia            = item.Fecha.Day;

                var updatesSaldos = new List <WriteModel <InventariosSaldos> >();
                var updatesCostos = new List <WriteModel <InventariosCostos> >();

                item.ValidarModel(item); //Revisar reglas de validacion para el documento

                foreach (Detalles_ES mov in item.Detalles_ES)
                {
                    mov.Articulo = ArticuloCompletoServer.Find(b => b._id == mov.Articulo._id);

                    //PRIMERO SE SE LLENA LA COLECCION INVENTARIOS COSTOS ANTES QUE INVENTARIOS SALDOS.
                    InventariosCostos invcosto = LlenarObjetoInventartiosCostos(item, mov, ArticuloCompletoServer, InventariosCostosCompletoServer);
                    InventariosSaldos invsaldo = LlenarObjetoInventartiosSaldos(item, mov, ArticuloCompletoServer, InventariosSaldosCompletoServer);

                    var filtercostos = Builders <InventariosCostos> .Filter.Eq(s => s._id, invcosto._id);

                    var filtersaldos = Builders <InventariosSaldos> .Filter.Eq(s => s._id, invsaldo._id);

                    if (!(invcosto._id == null || invcosto._id == ""))
                    {
                        updatesCostos.Add(new ReplaceOneModel <InventariosCostos>(filtercostos, invcosto)
                        {
                            IsUpsert = true
                        });
                    }
                    else
                    {
                        updatesCostos.Add(new InsertOneModel <InventariosCostos>(invcosto));
                    }

                    //si  no existe un registro en la coleccion inventarios saldos de la combinacion articulo almacen crea uno nuevo de lo contrario hace un update al existente
                    if (!(invsaldo._id == null || invsaldo._id == ""))
                    {
                        updatesSaldos.Add(new ReplaceOneModel <InventariosSaldos>(filtersaldos, invsaldo)
                        {
                            IsUpsert = true
                        });
                    }
                    else
                    {
                        updatesSaldos.Add(new InsertOneModel <InventariosSaldos>(invsaldo));
                    }
                }

                db.InventariosCostos.updateMany(updatesCostos, db, session);
                db.InventariosSaldos.updateMany(updatesSaldos, db, session);

                db.MovimientosES.add(item, db, session);

                // SI ES UN TRASPASO DE SALIDA VOLVEMOS A LLAMAR EL METODO ADD PARA DAR ENTRADA AL ALMACEN DE DESTINO
                if (item.Concepto._id == "5c59c84f6886742388d9bbcc")
                {
                    item.Almacen_Destino = db.Almacen.getbyFields(item.Almacen_Destino._id, "_id,Nombre", db);

                    item._id             = null;
                    item.Concepto._id    = "5c59d6c16886742450e4527f";
                    item.Almacen._id     = item.Almacen_Destino._id;
                    item.Almacen_Destino = item.Almacen;
                    add(item, db, session);
                }


                return(item);
            }
            catch (Exception)
            {
                throw;
            }
        }