Skip to content
Snippets Groups Projects
Select Git revision
  • 959f211a319aae619d6bd7b64d41a3b97ad650ad
  • master default
  • disable-new-requests
  • fix-bulletin-view-missing-notes-error
  • add-missing-queue-managers
  • projects-task-53
  • projects-task-51
  • projects-task-43
  • projects-task-24
  • projects-task-31
  • projects-task-32
  • projects-task-8
  • project-setup-docs
  • projects-task-28
  • projects-task-27
  • projects-task-9
  • projects-task-7
  • mass-update-course-codes-in-sections
  • wdn-four
  • learning-outcomes
  • additional-bulletin-pages
  • svn-redesign
  • svn-popups
  • svn-trunk
  • svn-performance
  • svn-tim
26 results

IndexController.php

Blame
  • IndexController.php 13.65 KiB
    <?php
    
    /**
     * IndexController
     *
     * @author
     * @version
     */
    
    require_once 'Zend/Controller/Action.php';
    
    class Requests_IndexController extends App_Controller_Action
    {
    	/**
    	 * The default action - show the home page
    	 */
    	public function indexAction()
    	{
    		$in = $this->getRequest()->getParams();
    
    		$user = Auth_UserModel::findCurrentUser();
    		$userRoles = Requests_ApprovalRoleModel::findByUser($user);
    		$userRequests = Requests_RequestModel::findByUser($user);
    		$roleRequests = Requests_RequestModel::findByRole($userRoles);
    		$watchingRequests = Requests_RequestModel::findByWatchingRole($userRoles);
    		$allRequests = new Unl_Model_Collection(Requests_RequestModel);
    		$allRequests->merge($userRequests);
            foreach ($roleRequests as $requests) {
                $allRequests->merge($requests);
            }
            foreach ($watchingRequests as $requests) {
                $allRequests->merge($requests);
            }
    		$requestParentCourses = Courses_CourseModel::findParentOfRequest($allRequests);
    		$requestCurrentCourses = Courses_CourseModel::findLatestOfRequest($allRequests);
    		$requestActions = Requests_ApprovalActionModel::findByRequest($allRequests);
    		$requestComments = Requests_CommentsModel::findByRequest($allRequests, true);
    		$requestViewTimes = Requests_ViewTimeModel::findByUserAndRequest($user, $allRequests);
    		$requestVotes = Requests_ApproverVoteModel::findUsersVotesForRequests($user, $allRequests);
    		$requestHistories = Requests_ApprovalHistoryModel::findByRequest($allRequests);
    
    		$session = new Zend_Session_Namespace('Edit Request');
    		$savedRequests = RegistryModel::findByNamespaceAndKey($user->getId(), 'savedRequests')->getData();
    
    		if (!Unl_Util::isArray($savedRequests)) {
                $savedRequests = array();
    		}
    
    		
    		if (!Unl_Util::isArray($session->sortBy)) {
    			$session->sortBy = array('courseCode');
    		}
    		if ($in['sortBy']) {
    			$oldSortByKey = array_search($in['sortBy'], $session->sortBy);
    			if ($oldSortByKey !== false) {
                    unset($session->sortBy[$oldSortByKey]);
    			}
    			array_unshift($session->sortBy, $in['sortBy']);
    		}
    		
    		
    		$sortKeys = array();
    		$userRequestsData = array();
    		foreach ($userRequests as $requestId => $userRequest)
    		{
                $request = array();
                $requestType = $userRequest->getTypeDescription();
                $request['request'] = $userRequest;
                $request['parentCourse'] = $requestParentCourses[$requestId];
                $request['currentCourse'] = $requestCurrentCourses[$requestId];
                $request['action'] = $requestActions[$requestId];
                $request['comments'] = $requestComments[$requestId];
                if ($requestViewTimes[$requestId] instanceof Requests_ViewTimeModel) {
                    $request['viewTime'] = $requestViewTimes[$requestId]->getTime();
                    $request['hidden'] = $requestViewTimes[$requestId]->isHidden();
                } else {
                	$request['viewTime'] = 0;
                	$request['hidden'] = false;
                }
                if ($requestVotes[$requestId] instanceof Requests_ApproverVoteModel) {
                    $request['vote'] = $requestVotes[$requestId];
                }
                $request['lastApprovalTime'] = new Zend_Date(0);
                $histories = $requestHistories[$requestId];
                $histories->orderBy('getUnixtime', SORT_DESC);
                foreach ($histories as $history) {
                	$request['lastApprovalTime'] = $history->getTime();
                	break;
                }
                foreach ($session->sortBy as $key => $sortBy) {
    	            if ($sortBy == 'courseCode') {
    	            	if ($request['parentCourse']) {
                            $sortKeys[$requestType][$key][] = $request['parentCourse']->getCourseCode();
    	            	} else {
    	            		$sortKeys[$requestType][$key][] = $request['currentCourse']->getCourseCode();
    	            	}
    	            } else if ($sortBy == 'college') {
    	                $sortKeys[$requestType][$key][] = $request['currentCourse']->getCollege();
    	            } else if ($sortBy == 'requestType') {
    	                $sortKeys[$requestType][$key][] = $request['request']->getTypeDescription();
    	            }
                }
                $userRequestsData[$requestType][] = $request;
    		}
    		foreach ($userRequestsData as $requestType => &$requestList) {
                $sortKeys[$requestType][] =& $requestList;
                call_user_func_array('array_multisort', &$sortKeys[$requestType]);
                unset($requestList);
    		}
    
    		$roleData = array();
    		foreach ($userRoles as $roleId => $userRole) {
    			$role = array();
    			$role['role'] = $userRole;
    			$role['requests'] = array();
    
    		    if (Unl_Util::isArray($roleRequests[$roleId])) {
    		    	$sortKeys = array();
                    foreach($roleRequests[$roleId] as $requestId => $roleRequest) {
                        $request = array();
                        $requestType = $roleRequest->getTypeDescription();
                        $request['request'] = $roleRequest;
                        $request['parentCourse'] = $requestParentCourses[$requestId];
                        $request['currentCourse'] = $requestCurrentCourses[$requestId];
                        $request['action'] = $requestActions[$requestId];
                        $request['comments'] = $requestComments[$requestId];
                        if ($requestViewTimes[$requestId] instanceof Requests_ViewTimeModel) {
                            $request['viewTime'] = $requestViewTimes[$requestId]->getTime();
                        } else {
                            $request['viewTime'] = 0;
                        }
                        if ($requestVotes[$requestId] instanceof Requests_ApproverVoteModel) {
                            $request['vote'] = $requestVotes[$requestId];
                        }
                        $request['lastApprovalTime'] = new Zend_Date(0);
    		            $histories = $requestHistories[$requestId];
    		            $histories->orderBy('getUnixtime', SORT_DESC);
    		            foreach ($histories as $history) {
    		                $request['lastApprovalTime'] = $history->getTime();
    		                break;
    		            }
    		            foreach ($session->sortBy as $key => $sortBy) {
    		                if ($sortBy == 'courseCode') {
    		                    if ($request['parentCourse']) {
    		                        $sortKeys[$requestType][$key][] = $request['parentCourse']->getCourseCode();
    		                    } else {
    		                        $sortKeys[$requestType][$key][] = $request['currentCourse']->getCourseCode();
    		                    }
    		                } else if ($sortBy == 'college') {
    		                    $sortKeys[$requestType][$key][] = $request['currentCourse']->getCollege();
    		                } else if ($sortBy == 'requestType') {
    		                    $sortKeys[$requestType][$key][] = $request['request']->getTypeDescription();
    		                } else if ($sortBy == 'pendingAction') {
    		                	$sortKeys[$requestType][$key][] = $request['action']->getName();
    		                }
    		            }
                        $role['requests'][$roleRequest->getTypeDescription()][] = $request;
                    }
                    foreach ($role['requests'] as $requestType => &$requestList) {
                        $sortKeys[$requestType][] =& $requestList;
                        call_user_func_array('array_multisort', &$sortKeys[$requestType]);
                        unset($requestList);
                    }
                }
    
    		    if (Unl_Util::isArray($watchingRequests[$roleId])) {
    		    	$sortKeys = array();
                    foreach($watchingRequests[$roleId] as $requestId => $watchingRequest) {
                        $request = array();
                        $requestType = $watchingRequest->getTypeDescription();
                        $request['request'] = $watchingRequest;
                        $request['parentCourse'] = $requestParentCourses[$requestId];
                        $request['currentCourse'] = $requestCurrentCourses[$requestId];
                        $request['action'] = $requestActions[$requestId];
                        $request['comments'] = $requestComments[$requestId];
                        if ($requestViewTimes[$requestId] instanceof Requests_ViewTimeModel) {
                            $request['viewTime'] = $requestViewTimes[$requestId]->getTime();
                            $request['hidden'] = $requestViewTimes[$requestId]->isHidden();
                        } else {
                            $request['viewTime'] = 0;
                            $request['hidden'] = false;
                        }
    		            foreach ($session->sortBy as $key => $sortBy) {
    		                if ($sortBy == 'courseCode') {
    		                    if ($request['parentCourse']) {
    		                        $sortKeys[$requestType][$key][] = $request['parentCourse']->getCourseCode();
    		                    } else {
    		                        $sortKeys[$requestType][$key][] = $request['currentCourse']->getCourseCode();
    		                    }
    		                } else if ($sortBy == 'college') {
    		                    $sortKeys[$requestType][$key][] = $request['currentCourse']->getCollege();
    		                } else if ($sortBy == 'requestType') {
    		                    $sortKeys[$requestType][$key][] = $request['request']->getTypeDescription();
    		                }
    		            }
                        $role['watchingRequests'][$requestType][] = $request;
                    }
                    foreach ($role['watchingRequests'] as $requestType => &$requestList) {
                        $sortKeys[$requestType][] =& $requestList;
                        call_user_func_array('array_multisort', &$sortKeys[$requestType]);
                        unset($requestList);
                    }
                }
    			$roleData[] = $role;
    		}
    
    		$this->view->savedRequests = $savedRequests;
    		$this->view->roles = $roleData;
    		$this->view->user = $user;
    		$this->view->userRequests = $userRequestsData;
    		
    		$decisionSession = new Zend_Session_Namespace('decidePostAction');
            $this->view->decisionMessage = $decisionSession->message;
            unset($decisionSession->message);
    		
    		// save the order of requests to the session so we can have next/previous links on other pages.
    		$session = new Zend_Session_Namespace('My Requests');
            $session->requestOrder = array();
    		foreach ($roleData as $role) {
    			$roleId = $role['role']->getId();
    			$session->requestOrder[$roleId] = array();
    			$session->requestOrder[$roleId]['normal'];
    			if (Unl_Util::isArray($role['requests'])) {
    				foreach ($role['requests'] as $requestType => $requestList) {
    				    foreach ($requestList as $request) {
        	                $requestId = $request['request']->getId();
        	                $session->requestOrder[$roleId]['normal'][] = $requestId;
    				    }
    				}
    			}
                $session->requestOrder[$roleId]['watching'];
                if (Unl_Util::isArray($role['watchingRequests'])) {
    				foreach ($role['watchingRequests'] as $requestType => $requestList) {
    				    foreach ($requestList as $request) {
        	                $requestId = $request['request']->getId();
        	                $session->requestOrder[$roleId]['watching'][] = $requestId;
    				    }
    				}
                }
    		}
    		
    		$this->view->xsrfToken = Unl_XsrfToken::getInstance()->create();
    	}
    
    	public function decidePostAction()
    	{
    	    $in = $this->getRequest()->getParams();
    	    
    	    if (!Unl_XsrfToken::getInstance()->verify($in['xsrfToken'])) {
    	    	throw new Zend_Exception('Invalid XSRF Token! Please go back click the Refresh button while holding Shift.');
    	    }
    
    	    $requestDecisions = array();
    	    foreach ($in['decisions'] as $requestId => $decision) {
    	        if ($decision == '_null') {
    	            continue;
    	        }
    	        $requestDecisions[$requestId] = $decision;
    	    }
    	    $requests = Requests_RequestModel::find(array_keys($requestDecisions));
            $requestActions = Requests_ApprovalActionModel::findByRequest($requests);
    
            $actions = new Unl_Model_Collection('Requests_ApprovalActionModel');
            foreach ($requestActions as $requestAction) {
                $actions[$requestAction->getId()] = $requestAction;
            }
    
            $actionRequests = array();
            foreach ($requests as $request) {
                $actionId = $requestActions[$request->getId()]->getId();
                if (!$actionRequests[$actionId] instanceof Unl_Model_Collection) {
                    $actionRequests[$actionId] = new Unl_Model_Collection('Requests_RequestModel');
                }
                $actionRequests[$actionId][$request->getId()] = $request;
            }
    
            foreach ($actionRequests as $actionId => $myRequests)
            {
                $actions[$actionId]->userMadeDecisions($myRequests, $requestDecisions);
            }
    
            Requests_ApprovalChainModel::consider($requests);
            
            $session = new Zend_Session_Namespace('decidePostAction');
            if (count($requests) == 1) {
                $session->message = 'Successfully submitted decision for 1 request.';
            } else {
                $session->message = 'Successfully submitted decisions for ' . count($requests) . ' requests.';
            }
    
            if (array_key_exists('returnUrl', $in)) {
                $this->_redirect($in['returnUrl']);
            } else {
                $this->_redirect('/requests');
            }
    	}
    
    	public function hideRequestPostAction()
    	{
    		$requestId = $this->getRequest()->getParam('id');
    		
    		$user = Auth_UserModel::findCurrentUser();
    		$request = Requests_RequestModel::find($requestId);
    		if ($request && $user) {
                $viewTime = Requests_ViewTimeModel::findByUserAndRequest($user, $request);
                if (!$viewTime) {
                	$viewTime = Requests_ViewTimeModel::fetchNew();
                	$viewTime->setUser($user);
                	$viewTime->setRequest($request);
                }
                $viewTime->setHidden();
                
                $collection = new Unl_Model_Collection('Requests_ViewTimeModel');
                $collection[] = $viewTime;
                Requests_ViewTimeModel::save($collection);
    		}
    		
    		$this->_redirect('/requests');
    	}
    }