/// <summary>
        /// Obtiene una solicitud de productos por su ID.
        /// </summary>
        /// <param name="solicitudProductoID"></param>
        /// <returns></returns>
        private static SolicitudProductoInfo ObtenerSolicitudPorId(int solicitudProductoID)
        {
            SolicitudProductoInfo solicitud;

            using (var solicitudProductoBL = new SolicitudProductoBL())
            {
                solicitud =
                    solicitudProductoBL.ObtenerPorID(new SolicitudProductoInfo {
                    SolicitudProductoID = solicitudProductoID
                });
            }
            return(solicitud);
        }
        /// <summary>
        /// Obtiene una solicitud de productos por su folio de solicitud.
        /// </summary>
        /// <param name="solicitudId"></param>
        /// <returns></returns>
        private SolicitudProductoInfo ObtenerSolicitudPorId(int solicitudId)
        {
            SolicitudProductoInfo solicitud =
                solicitudProductoBL.ObtenerPorID(new SolicitudProductoInfo {
                SolicitudProductoID = solicitudId
            });

            solicitud.Solicitud                = InicializaContextoSolicitud();
            solicitud.Solicitud.FolioID        = solicitud.SolicitudProductoID;
            solicitud.Solicitud.FolioSolicitud = solicitud.FolioSolicitud;
            solicitud.Solicitud.Descripcion    = string.Format("{0}", solicitud.FolioSolicitud);
            return(solicitud);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="solicitud"></param>
        /// <param name="solicitudProductoBL"></param>
        /// <returns></returns>
        private static List <SolicitudProductoDetalleModel> ValidaDisponibilidad(SolicitudProductoInfo solicitud, SolicitudProductoBL solicitudProductoBL)
        {
            dynamic result;

            IEnumerable <int> idsProductos = solicitud.Detalle
                                             .Where(d => d.Producto.FamiliaId != (int)FamiliasEnum.HerramientaYEquipo || d.Producto.FamiliaId != (int)FamiliasEnum.Combustibles)
                                             .Select(d => d.ProductoID).Distinct().ToList();
            SolicitudProductoInfo solicitudGuardar = solicitudProductoBL.ObtenerPorID(solicitud);
            var filtro = new FolioSolicitudInfo
            {
                OrganizacionID = solicitudGuardar.OrganizacionID,
                IdsProductos   = idsProductos.ToList(),
                EstatusID      = Estatus.SolicitudProductoAutorizado.GetHashCode(),
                Activo         = EstatusEnum.Activo
            };

            IList <AlmacenInventarioInfo> existencia             = ObtenerExistencia(idsProductos);
            IList <SolicitudProductoInfo> solicitudesAutorizadas = solicitudProductoBL.ObtenerSolicitudesAutorizadas(filtro);

            var productosValidar = solicitud.Detalle.Select(d => new
            {
                d.ProductoID,
                d.Cantidad,
                d.Producto.FamiliaId
            }).ToList();

            var autorizadas = (from p in solicitudesAutorizadas.SelectMany(sd => sd.Detalle)
                               where p.EstatusID == Estatus.SolicitudProductoAutorizado.GetHashCode()
                               group p by p.ProductoID
                               into pg
                               select new
            {
                ProductoID = pg.Key,
                Autorizada = pg.Sum(c => c.Cantidad)
            }).ToList();
            List <SolicitudProductoDetalleModel> query = (from p in productosValidar
                                                          join a in autorizadas on p.ProductoID equals a.ProductoID into gj
                                                          from pa in gj.DefaultIfEmpty()
                                                          select new SolicitudProductoDetalleModel
            {
                ProductoID = p.ProductoID,
                Cantidad = p.Cantidad,
                Existencia = ObtenerCantidadExistencia(p.ProductoID, p.FamiliaId, p.Cantidad, existencia, (pa == null ? 0 : pa.Autorizada)),            /* Para los  */
                Autorizada = (pa == null ? 0 : pa.Autorizada),
                IsDisponible = (ObtenerCantidadExistencia(p.ProductoID, p.FamiliaId, p.Cantidad, existencia, (pa == null ? 0 : pa.Autorizada)) - (pa == null ? 0 : pa.Autorizada)) >= 0
            }).ToList();

            return(query);
        }
        public static bool Guardar(SolicitudProductoInfo solicitud)
        {
            using (var solicitudProductoBL = new SolicitudProductoBL())
            {
                SolicitudProductoInfo solicitudGuardar = solicitudProductoBL.ObtenerPorID(solicitud);
                solicitudGuardar.EstatusID                  = Estatus.SolicitudProductoAutorizado.GetHashCode();
                solicitudGuardar.UsuarioIDAutoriza          = Usuario.UsuarioID;
                solicitudGuardar.FechaAutorizado            = DateTime.Now;
                solicitudGuardar.UsuarioModificacionID      = Usuario.UsuarioID;
                solicitudGuardar.ObservacionUsuarioAutoriza = solicitud.ObservacionUsuarioAutoriza;

                foreach (var det in solicitudGuardar.Detalle)
                {
                    var renglon =
                        solicitud.Detalle.FirstOrDefault(d => d.SolicitudProductoDetalleID == det.SolicitudProductoDetalleID);
                    if (renglon != null)
                    {
                        if (renglon.Activo == EstatusEnum.Activo)
                        {
                            det.EstatusID = Estatus.SolicitudProductoAutorizado.GetHashCode();
                        }
                        else
                        {
                            det.Activo = EstatusEnum.Inactivo;
                        }
                    }
                }
                bool inactivar = solicitudGuardar.Detalle.All(e => e.Activo != EstatusEnum.Activo);
                if (inactivar)
                {
                    solicitudGuardar.Activo = EstatusEnum.Inactivo;
                }

                solicitudProductoBL.Guardar(solicitudGuardar);
            }
            return(true);
        }