From d83cffc80aacb5f0d4e6ea10f3f653889f47f5be Mon Sep 17 00:00:00 2001
From: Tim Steiner <tsteiner2@unl.edu>
Date: Wed, 7 Apr 2010 19:27:14 +0000
Subject: [PATCH] Have queue approvalActions create "periods" between each
 advance in order to better keep track of votes.

---
 .../models/ApprovalActionQueueModel.php       | 47 ++++++++++++++++++-
 1 file changed, 46 insertions(+), 1 deletion(-)

diff --git a/application/modules/requests/models/ApprovalActionQueueModel.php b/application/modules/requests/models/ApprovalActionQueueModel.php
index f9fa8577..6606c458 100644
--- a/application/modules/requests/models/ApprovalActionQueueModel.php
+++ b/application/modules/requests/models/ApprovalActionQueueModel.php
@@ -154,7 +154,8 @@ class Requests_ApprovalActionQueueModel extends Requests_ApprovalActionModel
     static protected function _insert(Unl_Model_Collection $models)
     {
         $db = Zend_Registry::get('db');
-
+        
+        // Insert the queue row
         $sql = 'INSERT INTO creqApprovalActionsQueue (approvalActionId, canChangeVote) VALUES ';
         $sqlParts = array();
         foreach ($models as $model) {
@@ -163,6 +164,18 @@ class Requests_ApprovalActionQueueModel extends Requests_ApprovalActionModel
         }
         $sql .= implode(', ', $sqlParts);
         $db->query($sql);
+        
+        
+        
+        // Insert the initial queue period starting at the current time.
+        $sql = 'INSERT INTO creqApprovalActionsQueuePeriods (approvalAction, startTime) VALUES ';
+        $sqlParts = array();
+        foreach ($models as $model) {
+            $sqlParts[] = $db->quoteInto('(?, ', $model->_data['approvalActionId'])
+                        . $db->quoteInto('?)'  , time());
+        }
+        $sql .= implode(', ', $sqlParts);
+        $db->query($sql);
     }
     
     static protected function _insertDates(array $models)
@@ -248,6 +261,38 @@ class Requests_ApprovalActionQueueModel extends Requests_ApprovalActionModel
         Requests_ApprovalChainModel::advance($requests);
         Requests_ApprovalChainModel::consider($requests);
 
+        
+        
+        $select = new Zend_Db_Select($db);
+        $select->from(array('q' => 'creqApprovalActionsQueueDates'), array('approvalAction'));
+        $select->where('q.date <= ?', time());
+        
+        $queueIds = array();
+        $records = $select->query()->fetchAll();
+        if (count($records) == 0) {
+        	return;
+        }
+        foreach ($records as $record) {
+        	$queueIds[] = $record['approvalAction'];
+        }
+        
+        
+        $sql = 'UPDATE creqApprovalActionsQueuePeriods '
+             . $db->quoteInto('SET endTime = ? ', time())
+             . 'WHERE endTime IS NULL '
+             . $db->quoteInto('AND approvalAction IN (?) ', $queueIds);
+        $db->query($sql);
+        
+        $sql = 'INSERT INTO creqApprovalActionsQueuePeriods (approvalAction, startTime) VALUES ';
+        $sqlParts = array();
+        foreach ($queueIds as $queueId) {
+        	$sqlParts[] = $db->quoteInto('(?, ', $queueId)
+        	            . $db->quoteInto('?)'  , time());
+        }
+        $sql .= implode(', ', $sqlParts);
+        $db->query($sql);
+        
+        
         $db->query($db->quoteInto('DELETE FROM creqApprovalActionsQueueDates WHERE date <= ?', time()));
     }
 
-- 
GitLab