//Grupos de materiales a partir del id de familia
        public List <GrupoMaterialesModel> getGruposMateriales(ConsultaVisualFullModel modelo)
        {
            List <GrupoMaterialesModel> grupos = new List <GrupoMaterialesModel>();

            //Todos los [distintos] id de materiales que hay en el stock actual //001,002,004,009, etc
            var materialesStock =
                _db.Stockactual.Where(f => f.empresa == modelo.Empresa && f.fkalmacenes == modelo.idAlmacen && f.fkarticulos.Substring(0, 2) == modelo.idFamilia).Select(f => f.fkarticulos.Substring(2, 3)).ToList().Distinct();

            if (materialesStock.Any())
            {
                //Obtenemos el grupo de material a partir del id del material
                foreach (var material in materialesStock)
                {
                    var MaterialAsociado = _db.Materiales.Where(f => f.empresa == modelo.Empresa && f.id == material).SingleOrDefault();
                    if (MaterialAsociado != null)
                    {
                        var GrupoMaterialAsociado = _db.GrupoMateriales.Where(f => f.empresa == modelo.Empresa && f.cod == MaterialAsociado.fkgruposmateriales).SingleOrDefault();

                        if (GrupoMaterialAsociado != null)
                        {
                            GrupoMaterialesModel grupo = new GrupoMaterialesModel();
                            grupo.Empresa     = modelo.Empresa;
                            grupo.Cod         = GrupoMaterialAsociado.cod ?? "";
                            grupo.Descripcion = GrupoMaterialAsociado.descripcion ?? "";
                            grupo.Ficheros    = obtenerFicherosGaleria(GrupoMaterialAsociado.fkcarpetas.ToString() ?? "");
                            grupos.Add(grupo);
                        }
                    }
                }
            }

            return(grupos.Distinct(new GrupoMaterialesComparerModel()).ToList());
        }
        //Familias que tienen ese Id de almacen en Stock
        public List <FamiliasproductosModel> getFamilias(ConsultaVisualFullModel modelo)
        {
            //Familias que tienen el campo visible en la web a true
            var familias = _db.Familiasproductos.Where(f => f.empresa == modelo.Empresa && f.web == true).ToList();
            List <FamiliasproductosModel> familiasDevolver = new List <FamiliasproductosModel>();

            if (familias.Any())
            {
                foreach (var familia in familias)
                {
                    if (_db.Stockactual.Any(f => f.empresa == familia.empresa && f.fkalmacenes == modelo.idAlmacen && f.fkarticulos.Substring(0, 2) == familia.id))
                    {
                        familiasDevolver.Add(new FamiliasproductosModel
                        {
                            Empresa              = modelo.Empresa,
                            Id                   = familia.id ?? "",
                            Descripcion          = familia.descripcion ?? "",
                            Descripcionabreviada = familia.descripcionabreviada ?? "",
                            Ficheros             = obtenerFicherosGaleria(familia.fkcarpetas.ToString() ?? "")
                        });
                    }
                }
            }

            return(familiasDevolver.Distinct().ToList());
        }
        //Ultima pantalla
        public List <ConsultaVisualModel> getMaterialEspecifico(ConsultaVisualFullModel modelo)
        {
            List <ConsultaVisualModel> productos = new List <ConsultaVisualModel>();

            //Sacamos todos los articulos en Stock que hay con EMPRESA, ALMACEN, FAMILIA, MATERIAL
            var posibleStock = _db.Stockactual.Where(f => f.empresa == modelo.Empresa && f.fkalmacenes == modelo.idAlmacen &&
                                                     f.fkarticulos.Substring(0, 2) == modelo.idFamilia && f.fkarticulos.Substring(2, 3) == modelo.idMaterial).GroupBy(f => new { f.lote, f.fkarticulos, f.fkalmacenes, f.empresa }).ToList();

            if (posibleStock.Any())
            {
                foreach (var loteproducto in posibleStock)
                {
                    ConsultaVisualModel c = new ConsultaVisualModel();

                    c.Empresa = loteproducto.Select(f => f.empresa).First();
                    var idArticulo = loteproducto.Select(x => x.fkarticulos).First();
                    c.Descripcion          = _db.Articulos.Where(f => f.empresa == modelo.Empresa && f.id == idArticulo).Select(f => f.descripcion).SingleOrDefault() ?? "";
                    c.DescripcionAbreviada = _db.Articulos.Where(f => f.empresa == modelo.Empresa && f.id == idArticulo).Select(f => f.descripcionabreviada).SingleOrDefault() ?? "";
                    c.Id       = loteproducto.Select(f => f.fkarticulos).First();
                    c.MetrosCV = Math.Round(loteproducto.Where(f => f.metros != null).Select(f => f.metros.Value).Sum(), 3);
                    c.DescLote = loteproducto.Select(f => f.lote).First();
                    c.PiezasCV = loteproducto.Count();
                    var lote  = loteproducto.Select(f => f.lote).First().ToString();
                    var lotes = _db.Stockhistorico.Where(f => f.empresa == modelo.Empresa && f.fkarticulos.Substring(0, 2) == modelo.idFamilia && f.fkarticulos.Substring(2, 3) == modelo.idMaterial && f.lote == lote).ToList();
                    c.Ficheros = obtenerFicherosGaleria(lotes.Select(f => f.fkcarpetas).First().ToString() ?? "");
                    productos.Add(c);
                }
            }

            return(productos);
        }
        //Materiales
        public List <MaterialesModel> getMateriales(ConsultaVisualFullModel modelo)
        {
            //Todos los materiales con fkgrupos materiales(3) y empresa(0)
            var materialesDB = _db.Materiales.Where(f => f.empresa == modelo.Empresa && f.fkgruposmateriales == modelo.idGrupoMateriales).ToList();
            List <MaterialesModel> materiales = new List <MaterialesModel>();

            if (materialesDB.Any())
            {
                foreach (var material in materialesDB)
                {
                    //Sacamos todos los articulos en Stock que hay con EMPRESA, ALMACEN, FAMILIA, MATERIAL
                    var posibleStock = _db.Stockactual.Where(f => f.empresa == modelo.Empresa && f.fkalmacenes == modelo.idAlmacen && f.fkarticulos.Substring(0, 2) == modelo.idFamilia && f.fkarticulos.Substring(2, 3) == material.id).ToList();
                    if (posibleStock.Any())
                    {
                        var metros = Math.Round(posibleStock.Where(f => f.metros != null).Select(f => f.metros.Value).Sum(), 3); //La suma de los metros de las filas
                        var lotes  = posibleStock.GroupBy(f => new { f.lote }).Count();                                          //Lotes agrupados
                        var piezas = posibleStock.Count();                                                                       //Cantidad de filas de stock

                        materiales.Add(new MaterialesModel
                        {
                            Empresa              = material.empresa,
                            Id                   = material.id,
                            Descripcion          = material.descripcion ?? "",
                            Descripcionabreviada = material.descripcionabreviada ?? "",
                            Ficheros             = obtenerFicherosGaleria(material.fkcarpetas.ToString() ?? ""),
                            MetrosCV             = metros,
                            LotesCV              = lotes,
                            PiezasCV             = piezas
                        });
                    }
                }
            }

            return(materiales);
        }
        //Almacenes BD
        public List <AlmacenesModel> obtenerAlmacenes(ConsultaVisualFullModel modelo)
        {
            var almacenesBD = _db.Almacenes.Where(f => f.empresa == modelo.Empresa && f.privado == false).ToList(); //Los privados no
            List <AlmacenesModel> almacenes = new List <AlmacenesModel>();

            if (almacenesBD.Any())
            {
                foreach (var almacen in almacenesBD)
                {
                    almacenes.Add(new AlmacenesModel
                    {
                        Empresa     = _context.Empresa,
                        Id          = almacen.id ?? "",
                        Descripcion = almacen.descripcion ?? "",
                        Coordenadas = almacen.coordenadas ?? "",
                        numFamilias = _db.Stockactual.Where(f => f.empresa == modelo.Empresa && f.fkalmacenes == almacen.id).
                                      Select(f => f.fkarticulos.Substring(0, 2)).Distinct().ToList().Count(),
                        Ficheros = obtenerFicherosGaleria(almacen.fkcarpetas.ToString() ?? "")
                    });
                }
            }

            return(almacenes);
        }