From 0746931e3d1c3e811fed9c03fd25f518e053146e Mon Sep 17 00:00:00 2001
From: Tim Steiner <tsteiner2@unl.edu>
Date: Thu, 8 Apr 2010 20:23:08 +0000
Subject: [PATCH] Change vote recording to keep track of votes on a per queue
 period basis in additon to per request and user.  This will allow for much
 more accurate voting reports.

---
 .../models/ApprovalActionQueueModel.php       | 32 +++++++++++--------
 .../models/ApprovalActionVoteModel.php        |  3 ++
 .../requests/models/ApproverVoteModel.php     | 12 ++++---
 3 files changed, 29 insertions(+), 18 deletions(-)

diff --git a/application/modules/requests/models/ApprovalActionQueueModel.php b/application/modules/requests/models/ApprovalActionQueueModel.php
index 6606c458..85be456c 100644
--- a/application/modules/requests/models/ApprovalActionQueueModel.php
+++ b/application/modules/requests/models/ApprovalActionQueueModel.php
@@ -9,6 +9,9 @@ class Requests_ApprovalActionQueueModel extends Requests_ApprovalActionModel
         $select = new Zend_Db_Select($db);
         $select->from(array('a' => 'creqApprovalActions'));
         $select->join(array('q' => 'creqApprovalActionsQueue'), 'a.approvalActionId = q.approvalActionId');
+        $select->join(array('p' => 'creqApprovalActionsQueuePeriods'),
+                      'a.approvalActionId = p.approvalAction AND p.endTime IS NULL',
+                      array('startTime', 'currentPeriod' => 'approvalActionsQueuePeriodId'));
         if (Unl_Util::isArray($id)) {
             $select->where('a.approvalActionId IN(?)', $id);
         } else {
@@ -304,21 +307,12 @@ class Requests_ApprovalActionQueueModel extends Requests_ApprovalActionModel
     public function userMadeDecisions($requests, $requestDecisions)
     {
         $user = Auth_UserModel::findCurrentUser();
-        $votes = Requests_ApproverVoteModel::findUsersVotesForRequests($user, $requests, $this);
-        $requestHistories = Requests_ApprovalHistoryModel::findByRequest($requests);
+        $votes = Requests_ApproverVoteModel::findUsersVotesForRequests($user, $requests, $this->getCurrentPeriodId());
         foreach ($requests as $request) {
-        	$histories = $requestHistories[$request->getId()];
-        	$histories->orderBy('getUnixtime', SORT_DESC);
-        	$lastEndTime = new Zend_Date(0);
-        	foreach ($histories as $history) {
-        		if ($history->getApprovalAction() == $this->getId()) {
-        			$lastEndTime = $history->getTime();
-        			break;
-        		}
-        	}
-            if ($votes[$request->getId()] && $votes[$request->getId()]->getApprovalAction() == $this->getId()) {
-                $vote = $votes[$request->getId()];
-                if (!$this->getCanChangeVote() && $lastEndTime->isEarlier($vote->getTime())) {
+            if ($votes[$request->getId()]) {
+            	if ($this->getCanChangeVote()) {
+                    $vote = $votes[$request->getId()];
+            	} else {
                     continue;
                 }
             } else {
@@ -383,5 +377,15 @@ class Requests_ApprovalActionQueueModel extends Requests_ApprovalActionModel
         
         $this->setDates($dates);
     }
+    
+    public function getCurrentPeriodStartTime()
+    {
+    	return new Zend_Date($this->_data['startTime']);
+    }
+    
+    public function getCurrentPeriodId()
+    {
+    	return $this->_data['currentPeriod'];
+    }
 }
 
diff --git a/application/modules/requests/models/ApprovalActionVoteModel.php b/application/modules/requests/models/ApprovalActionVoteModel.php
index 48194cff..2427f594 100644
--- a/application/modules/requests/models/ApprovalActionVoteModel.php
+++ b/application/modules/requests/models/ApprovalActionVoteModel.php
@@ -10,6 +10,9 @@ class Requests_ApprovalActionVoteModel extends Requests_ApprovalActionQueueModel
         $select->from(array('a' => 'creqApprovalActions'));
         $select->join(array('q' => 'creqApprovalActionsQueue'), 'a.approvalActionId = q.approvalActionId');
         $select->join(array('v' => 'creqApprovalActionsVote'), 'a.approvalActionId = v.approvalActionId');
+        $select->join(array('p' => 'creqApprovalActionsQueuePeriods'),
+                      'a.approvalActionId = p.approvalAction AND p.endTime IS NULL',
+                      array('startTime', 'currentPeriod' => 'approvalActionsQueuePeriodId'));
         if (Unl_Util::isArray($id)) {
             $select->where('a.approvalActionId IN(?)', $id);
         } else {
diff --git a/application/modules/requests/models/ApproverVoteModel.php b/application/modules/requests/models/ApproverVoteModel.php
index c1918b0f..e4f3f54d 100644
--- a/application/modules/requests/models/ApproverVoteModel.php
+++ b/application/modules/requests/models/ApproverVoteModel.php
@@ -79,7 +79,7 @@ class Requests_ApproverVoteModel extends Unl_Model
         return $requestVotes;
     }
     
-    static public function findUsersVotesForRequests(Auth_UserModel $user, $requests, $approvalAction = null)
+    static public function findUsersVotesForRequests(Auth_UserModel $user, $requests, $queuePeriodId = null)
     {
         $db = Zend_Registry::get('db');
 
@@ -94,10 +94,14 @@ class Requests_ApproverVoteModel extends Unl_Model
             $select->where('a.request = ?', $requests->getId());
         }
         $select->where('user = ?', $user->getId());
-        if ($approvalAction instanceof Requests_ApprovalActionModel) {
-        	$select->where('approvalAction = ?', $approvalAction->getId());
-        }
         $select->order('time');
+       
+        if ($queuePeriodId) {
+            $select->join(array('p' => 'creqApprovalActionsQueuePeriods'),
+                          'a.approvalAction = p.approvalAction AND a.time >= p.startTime AND (a.time <= p.endTime OR p.endTime IS NULL)',
+                          array());
+            $select->where('p.approvalActionsQueuePeriodId = ?', $queuePeriodId);
+        }
 
         $records = $db->query($select)->fetchAll();
         $requestVoteIds = array();
-- 
GitLab