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