public KardexArticulos saldoInicial(KardexArticulos articulo, DateTime FechaInicio, List <InventariosSaldos> InventariosSaldosCompletoServer, MovimientosES mov, Detalles_ES detalle, int dia, int mes, int ano, EmpresaContext db) { try { //Se declaro asi por un conflico de nombre Servicios.Inventarios.Inventarios inventario = new Servicios.Inventarios.Inventarios(); articulo.Almacen = mov.Almacen; articulo.Folio = ""; articulo.Concepto = new Concepto { Nombre = "SI - SALDO INICIAL" }; //Caracteristicas del articulo articulo.Articulo = detalle.Articulo; articulo.SubgrupoComponente = detalle.Articulo.SubGrupoComponente; articulo.GrupoComponente = detalle.Articulo.SubGrupoComponente.GrupoComponente; ExistenciaValorInventario existencia = inventario.ExistenciaArticulo(detalle.Articulo._id, articulo.Almacen.id, FechaInicio, InventariosSaldosCompletoServer, detalle.Articulo, dia, mes, ano, db); articulo.EntradaUnidad = existencia.Existencia; articulo.EntradaCostoUnitario = 0.0; articulo.EntradaCostoTotal = existencia.CostoUnitario * existencia.Existencia; articulo.ExistenciaUnidades = existencia.Existencia; articulo.ExistenciaCostoTotal = articulo.EntradaCostoTotal; return(articulo); } catch (Exception) { throw; } }
public string aplicarInventario(string id) { try { EmpresaContext db = new EmpresaContext(); using (var session = db.client.StartSession()) { session.StartTransaction(); InventarioFisico DocumentoInventario = db.InventarioFisico.get(id, db); if (DocumentoInventario.Estado == "APLICADO") { throw new Exception("Esta toma de inventario ya se encuentra aplicada,no es posible continuar"); } MovimientosES documentoentrada = new MovimientosES(); documentoentrada.Concepto = db.Concepto.get("5d19676ba9c67230a05ebe7b", db); ////Concepto de entrada por toma de inventatario fisico documentoentrada.Almacen = DocumentoInventario.Almacen; documentoentrada.Fecha = DocumentoInventario.Fecha; documentoentrada.Descripcion = "Toma de inventario con el Folio" + DocumentoInventario.Folio; documentoentrada.Sistema_Origen = "IF"; documentoentrada.Cancelado = "NO"; MovimientosES documentosalida = new MovimientosES(); documentosalida.Concepto = db.Concepto.get("5d196788a9c67230a05ebe7c", db); ////Concepto de entrada por toma de inventatario fisico documentosalida.Almacen = DocumentoInventario.Almacen; documentosalida.Fecha = DocumentoInventario.Fecha; documentosalida.Descripcion = "Toma de inventario con el Folio " + DocumentoInventario.Folio; documentosalida.Sistema_Origen = "IF"; documentosalida.Cancelado = "NO"; Inventarios inv = new Inventarios(); //Separo la fecha del doumento en dia mes y año int dia = DocumentoInventario.Fecha.Day; int mes = DocumentoInventario.Fecha.Month; int ano = DocumentoInventario.Fecha.Year; //Recolectamos en una lista los ids que nos manda el cliente var Ids = (from an in DocumentoInventario.InventarioFisicoDetalle select an.Articulo._id).ToList(); //Selecciono los articulos que no estan incluido en el invetario fisico //var filtroArticulos = Builders<Articulo>.Filter.Nin("_id", Ids); //List<Articulo> LstArticulosNoIncluidos = db.Articulo.find(filtroArticulos, "_id,Nombre,Clave,UnidadInventario", db); //Genero el detalle para los articulso que no se encuntran /*foreach(Articulo art in LstArticulosNoIncluidos) * { * DocumentoInventario.InventarioFisicoDetalle.Add(new InventarioFisicoDetalle * { * ExistenciaFisica = 0, * Articulo = art * }); * }*/ //var builderSaldos = Builders<InventariosSaldos>.Filter.In("ArticuloId", Ids) & Builders<InventariosSaldos>.Filter.Eq("AlmacenId", DocumentoInventario.Almacen._id); var builderSaldos = Builders <InventariosSaldos> .Filter.Eq("AlmacenId", DocumentoInventario.Almacen._id); List <InventariosSaldos> InventariosSaldosCompletoServer = db.InventariosSaldos.find(builderSaldos, db); //var List = InventariosSaldosCompletoServer.GroupBy(a => a.ArticuloId).Select(a => a.ToList().First()).ToList(); foreach (InventariosSaldos saldo in InventariosSaldosCompletoServer.GroupBy(a => a.ArticuloId).Select(a => a.ToList().First()).ToList()) { bool ArticuloIncluido = true; //Controla si articulo venia capturado por el usuario InventarioFisicoDetalle detalle = DocumentoInventario.InventarioFisicoDetalle.Where(a => a.Articulo._id == saldo.ArticuloId).SingleOrDefault(); if (detalle == null) { ArticuloIncluido = false; detalle = new InventarioFisicoDetalle(); detalle.Articulo = new Articulo(); detalle.Articulo._id = saldo.ArticuloId; } ExistenciaValorInventario exitencia = inv.ExistenciaArticulo(detalle.Articulo._id, DocumentoInventario.Almacen.id, DocumentoInventario.Fecha, InventariosSaldosCompletoServer, detalle.Articulo, dia, mes, ano, db); detalle.ExistenciaTeorica = exitencia.Existencia; if (detalle.ExistenciaTeorica != 0.0 && detalle.ExistenciaFisica != 0) { if (ArticuloIncluido == false) { DocumentoInventario.InventarioFisicoDetalle.Add(new InventarioFisicoDetalle { ExistenciaFisica = 0, Articulo = db.Articulo.get(detalle.Articulo._id, "_id,Clave,Nombre,UnidadInventario", db) }); } detalle.Diferencia = detalle.ExistenciaTeorica - detalle.ExistenciaFisica; //Falta agregar el tipo de seguimiento al articulo InventarioNormal(detalle, documentoentrada, documentosalida, db); } } /*foreach (InventarioFisicoDetalle detalle in DocumentoInventario.InventarioFisicoDetalle) * { * ExistenciaValorInventario exitencia = inv.ExistenciaArticulo(detalle.Articulo._id, DocumentoInventario.Almacen.id, DocumentoInventario.Fecha, InventariosSaldosCompletoServer, detalle.Articulo, dia, mes, ano, db); * detalle.ExistenciaTeorica = exitencia.Existencia; * * if(detalle.ExistenciaTeorica != 0.0) * { * detalle.Diferencia = detalle.ExistenciaTeorica - detalle.ExistenciaFisica; * DocumentoInventario.InventarioFisicoDetalle.Add(new InventarioFisicoDetalle * { * ExistenciaFisica = 0, * Articulo = exitencia.Articulo * }); * } * * //Falta agregar el tipo de seguimiento al articulo * InventarioNormal(detalle, documentoentrada, documentosalida, db); * }*/ if (documentoentrada.Detalles_ES.Count > 0) { inv.add(documentoentrada, db, session); } if (documentosalida.Detalles_ES.Count > 0) { inv.add(documentosalida, db, session); } DocumentoInventario.Estado = "APLICADO"; DocumentoInventario.FechaHoraAplicacion = DateTime.Now; db.InventarioFisico.update(DocumentoInventario, DocumentoInventario._id, db, session); session.CommitTransaction(); } return(""); } catch (Exception ex) { Error(ex, ""); return(null); } }
//Obtiene la existencia de un articulo en una fecha especificia public ExistenciaValorInventario ExistenciaArticulo(string articuloId, string almacenId, DateTime date, List <InventariosSaldos> Inv, Articulo Art, int dia, int mes, int ano, EmpresaContext db) { try { DateTime ultimodiamesanterior = new DateTime(); double Entradas = 0; double Salidas = 0; double EntradasCostos = 0; double SalidasCostos = 0; double SaldoMesesAnteriores = 0; double ValorTotalMesesAnteriores = 0; List <MovimientosES> MovimientosEsCompletoServer = new List <MovimientosES>(); //revisamos el ultimo dia del mes dado en el reporte var ultimodia = Inv.Find(b => b.ArticuloId == Art._id && b.AlmacenId == almacenId && b.Ano <= date.Year && b.Mes == date.Month); // si la fecha del reporte es igual o mayor que el ultimo dia procedemos a sacar la existencia de la tabla inventarios saldos if ((ultimodia != null) && date.Day >= ultimodia.UltimoDia) { var saldomesesanteriores = Inv.FindAll(b => b.ArticuloId == articuloId && b.AlmacenId == almacenId && (b.Ano == date.Year && b.Mes <= date.Month || b.Ano < date.Year)).ToList(); SaldoMesesAnteriores = saldomesesanteriores.Sum(a => a.EntradaUnidades - a.SalidasUnidades); ValorTotalMesesAnteriores = saldomesesanteriores.Sum(a => a.EntradasCosto - a.SalidasCosto); } else // de lo contrario barremos los moviemiento de los detalles de las entradas y salidas { //ahora revisamos el ultimo dia del mes anterior ultimodia = Inv.Find(b => b.ArticuloId == Art._id && b.AlmacenId == almacenId && b.Ano <= date.Year && b.Mes < date.Month || b.Ano < date.Year); // date = new DateTime(date.Year, date.Month, date.Day, 11, 59, 59); if (ultimodia == null) // si no hay ningun movimiento en los meses anteriores { //builderMovimientos.Eq("Almacen._id", almacenId) & builderMovimientos.Where(a => a.Ano <= ano && a.Mes <= mes && a.Dia <= dia) var builderMovimientos = Builders <MovimientosES> .Filter.Eq("Almacen._id", almacenId) & Builders <MovimientosES> .Filter.Where(a => a.Ano <= ano && a.Mes <= mes && a.Dia <= dia); //MovimientosEsCompletoServer = CollectionMovimientosEs.Find(builderMovimientos).ToList(); MovimientosEsCompletoServer = db.MovimientosES.find(builderMovimientos, db); } else //si, si hay movimiento en meses anteriores { //(builderMovimientos & builderMovimientos.Where(a => a.Fecha > ultimodiamesanterior && (a.Ano <= ano && a.Mes <= mes && a.Dia <= dia)) var builderMovimientos = Builders <MovimientosES> .Filter.Eq("Almacen._id", almacenId) & Builders <MovimientosES> .Filter.Where(a => a.Fecha > ultimodiamesanterior && (a.Ano <= ano && a.Mes <= mes && a.Dia <= dia)); ultimodiamesanterior = new DateTime(ultimodia.Ano, ultimodia.Mes, ultimodia.UltimoDia, 23, 59, 59); //MovimientosEsCompletoServer = CollectionMovimientosEs.Find(builderMovimientos).ToList(); MovimientosEsCompletoServer = db.MovimientosES.find(builderMovimientos, db); } var me = MovimientosEsCompletoServer.Where(i => i.Concepto.Naturaleza == "ENTRADA").SelectMany(l => l.Detalles_ES).Where(p => p.Articulo._id == Art._id); var ms = MovimientosEsCompletoServer.Where(i => i.Concepto.Naturaleza == "SALIDA").SelectMany(l => l.Detalles_ES).Where(p => p.Articulo._id == Art._id); Entradas = me.Sum(o => o.Cantidad); EntradasCostos = me.Sum(o => o.CostoTotal); Salidas = ms.Sum(o => o.Cantidad); SalidasCostos = ms.Sum(o => o.CostoTotal); var saldomesesanteriores = Inv.FindAll(b => b.ArticuloId == articuloId && b.AlmacenId == almacenId && (b.Ano == date.Year && b.Mes < date.Month || b.Ano < date.Year)).ToList(); SaldoMesesAnteriores = saldomesesanteriores.Sum(a => a.EntradaUnidades - a.SalidasUnidades); ValorTotalMesesAnteriores = saldomesesanteriores.Sum(a => a.EntradasCosto - a.SalidasCosto); } var existencia = SaldoMesesAnteriores + Entradas - Salidas; var ValorTotal = ValorTotalMesesAnteriores + EntradasCostos - SalidasCostos; ExistenciaValorInventario existenciaInventario = new ExistenciaValorInventario(); existenciaInventario.Fecha = date.ToString(); existenciaInventario.Existencia = existencia; existenciaInventario.ValorTotal = ValorTotal; existenciaInventario.CostoUnitario = ValorTotal > 0 ? ValorTotal / existencia : 0.00; existenciaInventario.Articulo = Art; existenciaInventario.SubgrupoComponente = Art.SubGrupoComponente == null ? null : Art.SubGrupoComponente; existenciaInventario.GrupoComponente = Art.GrupoComponente == null ? null : Art.GrupoComponente; //existenciaInventario.UnidadInventario = Art.UnidadInventario.Abreviatura; existenciaInventario.UnidadInventario = Art.UnidadInventario == null ? null : Art.UnidadInventario.Abreviatura; existenciaInventario.TotalEntradas = SaldoMesesAnteriores + Entradas; existenciaInventario.TotalSalidas = Salidas; existenciaInventario.movimientos = MovimientosEsCompletoServer; return(existenciaInventario); } catch (Exception) { throw; } }
public List <ExistenciaValorInventario> Existencia(string Fecha, string AlmacenId, string ArticuloId, string GrupoId, string SubGrupoId, string Valoracion) { /*if (AlmacenId == "" && GrupoId == "") * return null;*/ try { //client = new MongoClient("mongodb://*****:*****@18.191.252.222:27017/PAMC861025DB7"); client = new MongoClient(ConfigurationManager.AppSettings["pathMongo"]); //db = client.GetDatabase("PAMC861025DB7"); db = client.GetDatabase(getKeyToken("empresa", "token")); Almacenes = db.GetCollection <Almacen>("Almacen"); Articulos = db.GetCollection <Articulo>("Articulo"); CollectionSaldos = db.GetCollection <InventariosSaldos>("InventariosSaldos"); CollectionMovimientosEs = db.GetCollection <MovimientosES>("MovimientosES"); ExistenciaValorInventario Existencia = new ExistenciaValorInventario(); Almacen almacen = new Almacen(); // EN ALMACEN PODRA MANDAR (1 ALMACEN O TODOS LOS ALMACENES (CONSOLIDADO)) almacen._id = AlmacenId; Articulo articulo = new Articulo(); //DATOS QUE OCUPO QUE ME MANDE EL CLIENTE. EN ARTICULOS PODRA MANDAR (1 ARTICULO O 1 SUBGRUPO O 1 GRUPO) articulo._id = ArticuloId; SubgrupoComponente subgrupo = new SubgrupoComponente(); subgrupo._id = SubGrupoId; GrupoComponente grupo = new GrupoComponente();; grupo._id = GrupoId; //DateTime date = new DateTime(2019,3,26,23,59,59); DateTime date = DateTime.Parse(Fecha); int ano = date.Year; int mes = date.Month; int dia = date.Day; List <Articulo> ArticulosCompletoServer = new List <Articulo>(); //Ningun filtro seleccionado if ((subgrupo._id == null || subgrupo._id == "") && (grupo._id == null || grupo._id == "") && (articulo._id == null || articulo._id == "")) { ArticulosCompletoServer = Articulos.Find <Articulo>(_ => true).Project <Articulo>(Builders <Articulo> .Projection.Include(p => p._id).Include(o => o.Nombre).Include(i => i.SubGrupoComponente).Include(y => y.GrupoComponente).Include(l => l.UnidadInventario)).ToList(); } //Selecciono el filtro subgrupo else if (subgrupo._id != null && subgrupo._id != "") { ArticulosCompletoServer = Articulos.Find <Articulo>(d => d.SubGrupoComponente._id == subgrupo._id).Project <Articulo>(Builders <Articulo> .Projection.Include(p => p._id).Include(o => o.Nombre).Include(i => i.SubGrupoComponente).Include(l => l.UnidadInventario)).ToList(); } //Selecciono el filtro grupo else if (grupo._id != null && grupo._id != "") { ArticulosCompletoServer = Articulos.Find <Articulo>(d => d.GrupoComponente._id == grupo._id).Project <Articulo>(Builders <Articulo> .Projection.Include(p => p._id).Include(o => o.Nombre).Include(i => i.SubGrupoComponente).Include(l => l.UnidadInventario)).ToList(); } //Selecciono el filtro articulo else if (articulo._id != null && articulo._id != "") { ArticulosCompletoServer = Articulos.Find <Articulo>(d => d._id == articulo._id).Project <Articulo>(Builders <Articulo> .Projection.Include(p => p._id).Include(o => o.Nombre).Include(i => i.SubGrupoComponente).Include(l => l.UnidadInventario)).ToList(); } var Ids = (from an in ArticulosCompletoServer select an._id).ToList(); //recolectamos en una lista los ids que nos manda el cliente var builderSaldos = Builders <InventariosSaldos> .Filter; List <InventariosSaldos> InventariosSaldosCompletoServer = CollectionSaldos.Find(builderSaldos.In("ArticuloId", Ids) & builderSaldos.Eq("AlmacenId", almacen._id)).ToList(); List <ExistenciaValorInventario> existenciaInventario = new List <ExistenciaValorInventario>(); foreach (Articulo art in ArticulosCompletoServer) { Existencia = ExistenciaArticulo(art._id, almacen._id, date, InventariosSaldosCompletoServer, art, dia, mes, ano); existenciaInventario.Add(Existencia); } return(existenciaInventario); } catch (Exception ex) { return(null); } }