Select Git revision
IndexController.php
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');
}
}