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