From d65aa81c2a43e5f6649cf222be0fa291ce3b8755 Mon Sep 17 00:00:00 2001
From: Tim Steiner <tsteiner2@unl.edu>
Date: Fri, 18 Oct 2013 12:51:25 -0500
Subject: [PATCH] Create a unified major router as well. @1h30

---
 .../modules/bulletin/models/UtilityModel.php  | 13 ++++
 .../modules/courses/models/UtilityModel.php   | 10 +++
 .../edit-action/collegeRouter.phtml           |  1 -
 .../models/FourYearPlanModel.php              | 65 ++++++++++++++++---
 .../fouryearplans/models/UtilityModel.php     | 17 +++++
 .../ApprovalActionMajorRouterModel.php}       | 45 ++++++-------
 .../edit-action/majorRouter.phtml             |  0
 library/Creq/Model/UtilityInterface.php       | 10 +++
 8 files changed, 130 insertions(+), 31 deletions(-)
 delete mode 100644 application/modules/courses/views/scripts/approval-chain-manager/edit-action/collegeRouter.phtml
 rename application/modules/{courses/models/ApprovalActionCollegeRouterModel.php => requests/models/ApprovalActionMajorRouterModel.php} (76%)
 create mode 100644 application/modules/requests/views/scripts/approval-chain-manager/edit-action/majorRouter.phtml

diff --git a/application/modules/bulletin/models/UtilityModel.php b/application/modules/bulletin/models/UtilityModel.php
index 22377a12..ee74b4b3 100644
--- a/application/modules/bulletin/models/UtilityModel.php
+++ b/application/modules/bulletin/models/UtilityModel.php
@@ -31,6 +31,19 @@ class Bulletin_UtilityModel implements Creq_Model_UtilityInterface
         return $requestColleges;
     }
 
+    static public function getMajorsForRequests($requests)
+    {
+        $requestMajors = array();
+
+        $requestSections = Bulletin_SectionModel::findWithRequest($requests);
+        foreach ($requests as $request) {
+            $section = $requestSections[$request->getId()];
+            $requestMajors[$request->getId()] = $section->getMajor();
+        }
+
+        return $requestMajors;
+    }
+
     static public function getTextBetweenTokens($text, $start_token, $end_token)
     {
         $content_start = strpos($text, $start_token);
diff --git a/application/modules/courses/models/UtilityModel.php b/application/modules/courses/models/UtilityModel.php
index 83f4615a..19d40126 100644
--- a/application/modules/courses/models/UtilityModel.php
+++ b/application/modules/courses/models/UtilityModel.php
@@ -40,4 +40,14 @@ class Courses_UtilityModel implements Creq_Model_UtilityInterface
 
         return $requestColleges;
     }
+
+    static public function getMajorsForRequests($requests)
+    {
+        $requestMajors = array();
+        foreach ($requests as $request) {
+            $requestMajors[$request->getId()] = NULL;
+        }
+
+        return $requestMajors;
+    }
 }
diff --git a/application/modules/courses/views/scripts/approval-chain-manager/edit-action/collegeRouter.phtml b/application/modules/courses/views/scripts/approval-chain-manager/edit-action/collegeRouter.phtml
deleted file mode 100644
index f0bcdf3e..00000000
--- a/application/modules/courses/views/scripts/approval-chain-manager/edit-action/collegeRouter.phtml
+++ /dev/null
@@ -1 +0,0 @@
-<!-- No options for this action -->
\ No newline at end of file
diff --git a/application/modules/fouryearplans/models/FourYearPlanModel.php b/application/modules/fouryearplans/models/FourYearPlanModel.php
index b734a928..8fe540e1 100644
--- a/application/modules/fouryearplans/models/FourYearPlanModel.php
+++ b/application/modules/fouryearplans/models/FourYearPlanModel.php
@@ -913,33 +913,82 @@ class FourYearPlans_FourYearPlanModel extends Unl_Model
         }
     }
 
+    static protected $_majorCollegeMap = array();
+    static protected function _getMajorCollegeMap()
+    {
+        if (!self::$_majorCollegeMap) {
+            $db = Zend_Registry::get('db');
+            $select = new Zend_Db_Select($db);
+
+            $select->from(array('c' => 'creqColleges'), array(
+                'collegeId',
+                'college'     => 'name',
+                'collegeLong' => 'description'
+            ));
+            $select->join(array('m' => 'creqMajors'), 'c.collegeId = m.college', array(
+                'majorId',
+                'major' => 'name'
+            ));
+
+            foreach ($select->query()->fetchAll() as $row) {
+                self::$_majorCollegeMap[$row['majorId']] = $row;
+            }
+        }
+        return self::$_majorCollegeMap;
+    }
+
+    public function getCollege()
+    {
+        $majorCollegeMap = self::_getMajorCollegeMap();
+        if (!isset($majorCollegeMap[$this->_data['majorId']])) {
+            return NULL;
+        }
+
+        return $majorCollegeMap[$this->_data['majorId']]['college'];
+    }
+
+    public function getCollegeLong()
+    {
+        $majorCollegeMap = self::_getMajorCollegeMap();
+        if (!isset($majorCollegeMap[$this->_data['majorId']])) {
+            return NULL;
+        }
+
+        return $majorCollegeMap[$this->_data['majorId']]['collegeLong'];
+    }
+
     public function getMajor()
     {
         if (!$this->_data['majorId'] && $this->_data['major']) {
             return $this->_data['major'];
         }
 
-        $majors = Bulletin_UtilityModel::getAllMajors();
-        if (isset($majors[$this->_data['majorId']])) {
-            return $majors[$this->_data['majorId']];
+        $majorCollegeMap = self::_getMajorCollegeMap();
+        if (!isset($majorCollegeMap[$this->_data['majorId']])) {
+            return NULL;
         }
 
-        return NULL;
+        return $majorCollegeMap[$this->_data['majorId']]['major'];
     }
 
     public function setMajorId($majorId)
     {
-        $majors = Bulletin_UtilityModel::getAllMajors();
-        if (!isset($majors[$majorId])) {
+        $majorCollegeMap = self::_getMajorCollegeMap();
+        if (!isset($majorCollegeMap[$majorId])) {
             throw new Exception('Major not found.');
         }
+
         $this->_data['majorId'] = $majorId;
     }
 
     public function setMajor($major)
     {
-        $majors = Bulletin_UtilityModel::getAllMajors();
-        $majorId = array_search($major, $majors);
+        $majorId = NULL;
+        foreach (self::_getMajorCollegeMap() as $item) {
+            if ($item['major'] == $major) {
+                $majorId = $item['majorId'];
+            }
+        }
 
         if (!$majorId) {
             throw new Exception ('The major "' . $major . '" does not exist.');
diff --git a/application/modules/fouryearplans/models/UtilityModel.php b/application/modules/fouryearplans/models/UtilityModel.php
index 5d681f75..1ae3165d 100644
--- a/application/modules/fouryearplans/models/UtilityModel.php
+++ b/application/modules/fouryearplans/models/UtilityModel.php
@@ -33,4 +33,21 @@ class FourYearPlans_UtilityModel implements Creq_Model_UtilityInterface
 
         return $requestColleges;
     }
+
+    static public function getMajorsForRequests($requests)
+    {
+        $requestMajors = array();
+
+        $requestParentFyps = FourYearPlans_FourYearPlanModel::findParentOfRequest($requests);
+        $requestCurrentFyps = FourYearPlans_FourYearPlanModel::findLatestOfRequest($requests);
+        foreach ($requests as $request) {
+            $fyp = $requestParentFyps[$request->getId()];
+            if (!$fyp) {
+                $fyp = $requestCurrentFyps[$request->getId()];
+            }
+            $requestMajors[$request->getId()] = $fyp->getMajor();
+        }
+
+        return $requestMajors;
+    }
 }
diff --git a/application/modules/courses/models/ApprovalActionCollegeRouterModel.php b/application/modules/requests/models/ApprovalActionMajorRouterModel.php
similarity index 76%
rename from application/modules/courses/models/ApprovalActionCollegeRouterModel.php
rename to application/modules/requests/models/ApprovalActionMajorRouterModel.php
index 5f3647e8..d88cecb4 100644
--- a/application/modules/courses/models/ApprovalActionCollegeRouterModel.php
+++ b/application/modules/requests/models/ApprovalActionMajorRouterModel.php
@@ -1,8 +1,8 @@
 <?php
 
-class Courses_ApprovalActionCollegeRouterModel extends Requests_ApprovalActionModel
+class Requests_ApprovalActionMajorRouterModel extends Requests_ApprovalActionModel
 {
-    protected $_colleges = array();
+    protected $_majors = array();
 
     public static function find($id)
     {
@@ -10,7 +10,7 @@ class Courses_ApprovalActionCollegeRouterModel extends Requests_ApprovalActionMo
 
         $select = new Zend_Db_Select($db);
         $select->from(array('a' => 'creqApprovalActions'));
-        $select->join(array('d' => 'creqApprovalActionsCollegeRouter'), 'a.approvalActionId = d.approvalActionId');
+        $select->join(array('d' => 'creqApprovalActionsMajorRouter'), 'a.approvalActionId = d.approvalActionId');
         if (Unl_Util::isArray($id)) {
             $select->where('a.approvalActionId IN(?)', $id);
         } else {
@@ -32,7 +32,7 @@ class Courses_ApprovalActionCollegeRouterModel extends Requests_ApprovalActionMo
         }
 
     }
-    
+
     static public function fetchNew()
     {
         $data = array(
@@ -43,12 +43,12 @@ class Courses_ApprovalActionCollegeRouterModel extends Requests_ApprovalActionMo
             'participatingRoles'  => array(),
             'editingRoles'        => array()
         );
-        
+
         $new = new self($data);
         $new->_setClean();
-        
-        $new->_data['className'] = 'ApprovalActionCollegeRouter';
-        
+
+        $new->_data['className'] = 'ApprovalActionMajorRouter';
+
         return $new;
     }
 
@@ -91,7 +91,7 @@ class Courses_ApprovalActionCollegeRouterModel extends Requests_ApprovalActionMo
     {
         $db = Zend_Registry::get('db');
 
-        $sql = 'INSERT INTO creqApprovalActionsCollegeRouter (approvalActionId) VALUES ';
+        $sql = 'INSERT INTO creqApprovalActionsMajorRouter (approvalActionId) VALUES ';
         $sqlParts = array();
         foreach ($models as $model) {
             $sqlParts[] = $db->quoteInto('(?) ', $model->_data['approvalActionId']);
@@ -102,16 +102,17 @@ class Courses_ApprovalActionCollegeRouterModel extends Requests_ApprovalActionMo
 
     public function consider($requests)
     {
-        $requestParentCourses = Courses_CourseModel::findParentOfRequest($requests);
-        $requestCurrentCourses = Courses_CourseModel::findLatestOfRequest($requests);
+        $modulesRequests = array();
         foreach ($requests as $request) {
-            $course = $requestParentCourses[$request->getId()];
-            if (!$course) {
-                $course = $requestCurrentCourses[$request->getId()];
+            $modulesRequests[$request->getModule()][$request->getId()] = $request;
+        }
+        foreach ($modulesRequests as $module => $moduleRequests) {
+            $model = ucfirst($module) . '_UtilityModel';
+            foreach ($model::getMajorsForRequests($moduleRequests) as $requestId => $major) {
+                $moduleRequests[$requestId]->setState($major);
             }
-            $college = $course->getCollege();
-            $request->setState($college);
         }
+
         Requests_RequestModel::save($requests);
         Requests_ApprovalChainModel::advance($requests);
         return $requests;
@@ -129,11 +130,11 @@ class Courses_ApprovalActionCollegeRouterModel extends Requests_ApprovalActionMo
 
     public function getResultStatusStrings()
     {
-    	$colleges = array();
-    	foreach (Courses_CourseModel::getColleges() as $college) {
-    		$colleges[$college] = $college;
-    	}
-    	
-    	return $colleges;
+        $majors = array();
+        foreach (Bulletin_UtilityModel::getAllMajors() as $major) {
+            $majors[$major] = $major;
+        }
+
+        return $majors;
     }
 }
diff --git a/application/modules/requests/views/scripts/approval-chain-manager/edit-action/majorRouter.phtml b/application/modules/requests/views/scripts/approval-chain-manager/edit-action/majorRouter.phtml
new file mode 100644
index 00000000..e69de29b
diff --git a/library/Creq/Model/UtilityInterface.php b/library/Creq/Model/UtilityInterface.php
index ebda84a3..fbb67be0 100644
--- a/library/Creq/Model/UtilityInterface.php
+++ b/library/Creq/Model/UtilityInterface.php
@@ -27,4 +27,14 @@ interface Creq_Model_UtilityInterface
      * if not applicable.
      */
     static public function getCollegesForRequests($requests);
+
+    /**
+     * @param $requests
+     * @return array
+     *
+     * Given an array of requests, return an array where each key is the requestId
+     * and the value is the name of the major associated with the request, or NULL
+     * if not applicable.
+     */
+    static public function getMajorsForRequests($requests);
 }
-- 
GitLab