freenetis-github/application/models/request.php @ 5de08689
31ca0a32 | Michal Kliment | <?php defined('SYSPATH') or die('No direct script access.');
|
|
/*
|
|||
* This file is part of open source system FreenetIS
|
|||
* and it is released under GPLv3 licence.
|
|||
*
|
|||
* More info about licence can be found:
|
|||
* http://www.gnu.org/licenses/gpl-3.0.html
|
|||
*
|
|||
* More info about project can be found:
|
|||
* http://www.freenetis.org/
|
|||
*
|
|||
*/
|
|||
/**
|
|||
* Requests of an user to leader if the association. Request is specified by
|
|||
* type that defines what user who create it want to achieve with it,
|
|||
* description, date and optionaly with suggested amount mony that are
|
|||
* required for full filling of request.
|
|||
* Each request is accepted/declined by association by voting that is define
|
|||
* by related approval template.
|
|||
*
|
|||
* @author Michal Kliment, Ondřej Fibich
|
|||
* @package Model
|
|||
*
|
|||
* @property integer $type
|
|||
* @property integer $user_id
|
|||
* @property User_Model $user
|
|||
* @property integer $approval_template_id
|
|||
* @property Approval_template_Model $approval_template
|
|||
* @property string $description
|
|||
* @property double $suggest_amount
|
|||
* @property string $date
|
|||
*/
|
|||
class Request_Model extends ORM
|
|||
{
|
|||
protected $belongs_to = array
|
|||
(
|
|||
'user', 'approval_template'
|
|||
);
|
|||
/**
|
|||
* request is made for support (a member what to help with a thing that he
|
|||
* do not undestand or he/she is not authorised to do it)
|
|||
*/
|
|||
const TYPE_SUPPORT = 0;
|
|||
/**
|
|||
* request is an proposal on the association that may contains information
|
|||
* about proposal cost
|
|||
*/
|
|||
const TYPE_PROPOSAL = 1;
|
|||
/** new request, one votes about it, can be edited */
|
|||
const STATE_NEW = 0;
|
|||
/** open request, approval already started, cannot be edited */
|
|||
const STATE_OPEN = 1;
|
|||
/** rejected request */
|
|||
const STATE_REJECTED = 2;
|
|||
/** approved request */
|
|||
const STATE_APPROVED = 3;
|
|||
/** types */
|
|||
private static $types = array
|
|||
(
|
|||
self::TYPE_SUPPORT => 'support request',
|
|||
self::TYPE_PROPOSAL => 'proposal to association'
|
|||
);
|
|||
/** states */
|
|||
private static $states = array
|
|||
(
|
|||
self::STATE_NEW => 'pending',
|
|||
self::STATE_OPEN => 'pending',
|
|||
self::STATE_REJECTED => 'rejected',
|
|||
self::STATE_APPROVED => 'approved'
|
|||
);
|
|||
/**
|
|||
* Gets mane to a type
|
|||
*
|
|||
* @param integer $type
|
|||
* @param boolean $translate Translate types? [default: TRUE]
|
|||
* @return string
|
|||
*/
|
|||
public static function get_type_name($type, $translate = TRUE)
|
|||
{
|
|||
if (isset(self::$types[$type]))
|
|||
{
|
|||
if ($translate)
|
|||
{
|
|||
return __(self::$types[$type]);
|
|||
}
|
|||
else
|
|||
{
|
|||
return self::$types[$type];
|
|||
}
|
|||
}
|
|||
return NULL;
|
|||
}
|
|||
/**
|
|||
* Gets possible types of a proposal
|
|||
*
|
|||
* @param boolean $translate Translate types? [default: TRUE]
|
|||
* @return array
|
|||
*/
|
|||
public static function get_types($translate = TRUE)
|
|||
{
|
|||
if ($translate)
|
|||
{
|
|||
return array_map('__', self::$types);
|
|||
}
|
|||
return self::$types;
|
|||
}
|
|||
/**
|
|||
* Indicate whether a request with a type that is given by a param may
|
|||
* contains data in suggest_amount attribute.
|
|||
*
|
|||
* @param integer $type Request type constant
|
|||
* @return boolean
|
|||
*/
|
|||
public static function has_suggest_amount($type)
|
|||
{
|
|||
return ($type == self::TYPE_PROPOSAL);
|
|||
}
|
|||
/**
|
|||
* Returns state name
|
|||
*
|
|||
* @author Michal Kliment
|
|||
* @param integer $state
|
|||
* @return string
|
|||
*/
|
|||
public static function get_state_name($state)
|
|||
{
|
|||
if (array_key_exists($state, self::$states))
|
|||
{
|
|||
return __(self::$states[$state]);
|
|||
}
|
|||
else
|
|||
{
|
|||
return '';
|
|||
}
|
|||
}
|
|||
/**
|
|||
* Returns all requests
|
|||
*
|
|||
* @param integer $limit_from
|
|||
* @param integer $limit_results
|
|||
* @param string $order_by
|
|||
* @param string $order_by_direction
|
|||
* @param string $filter_sql
|
|||
* @return MySQL_Iterator
|
|||
*/
|
|||
public function get_all_requests($limit_from = 0, $limit_results = 50,
|
|||
$order_by = 'id', $order_by_direction = 'ASC', $filter_sql = '')
|
|||
{
|
|||
$limit = '';
|
|||
if ($limit_from && $limit_results)
|
|||
{
|
|||
$limit = 'LIMIT '.intval($limit_from).', '.$limit_results;
|
|||
}
|
|||
$where = '';
|
|||
if ($filter_sql != '')
|
|||
{
|
|||
$where = 'WHERE '.$filter_sql;
|
|||
}
|
|||
return $this->db->query("
|
|||
SELECT
|
|||
r.id, r.user_id, uname, description, suggest_amount, date, state,
|
|||
(
|
|||
SELECT COUNT(*)
|
|||
FROM votes
|
|||
WHERE vote = ? AND votes.fk_id = r.id AND votes.type = ?
|
|||
) AS agree_count,
|
|||
(
|
|||
SELECT COUNT(*)
|
|||
FROM votes
|
|||
WHERE vote = ? AND votes.fk_id = r.id AND votes.type = ?
|
|||
) AS disagree_count,
|
|||
(
|
|||
SELECT COUNT(*)
|
|||
FROM votes
|
|||
WHERE vote = ? AND votes.fk_id = r.id AND votes.type = ?
|
|||
) AS abstain_count,
|
|||
SUM(r.vote) AS approval_state,
|
|||
GROUP_CONCAT(vote_comment SEPARATOR '\n\n') AS vote_comments,
|
|||
COUNT(comment_id) AS comments_count,
|
|||
GROUP_CONCAT(r.comment SEPARATOR '\n\n') AS comments,
|
|||
v.vote, v.comment, r.type
|
|||
FROM
|
|||
(
|
|||
SELECT r.*, CONCAT(u.name,' ',u.surname) AS uname,
|
|||
IFNULL(vote,0) AS vote,
|
|||
CONCAT(
|
|||
vu.name, ' ',vu.surname,' (',
|
|||
SUBSTRING(v.time,1,10),'): \n',vn.name,
|
|||
IF(v.comment NOT LIKE '', '-',''),v.comment
|
|||
) AS vote_comment,
|
|||
c.id AS comment_id,
|
|||
CONCAT(
|
|||
cu.name,' ', cu.surname,' (',
|
|||
SUBSTRING(c.datetime, 1, 10),'): \n', c.text
|
|||
) AS comment
|
|||
FROM requests r
|
|||
JOIN users u ON r.user_id = u.id
|
|||
LEFT JOIN votes v ON v.fk_id = r.id AND v.type = ?
|
|||
LEFT JOIN
|
|||
(
|
|||
SELECT ? AS name, ? AS value
|
|||
UNION
|
|||
SELECT ? AS name, ? AS value
|
|||
UNION
|
|||
SELECT ? AS name, ? AS value
|
|||
) vn ON v.vote = vn.value
|
|||
LEFT JOIN users vu ON v.user_id = vu.id
|
|||
LEFT JOIN comments_threads ct ON r.comments_thread_id = ct.id
|
|||
LEFT JOIN comments c ON c.comments_thread_id = ct.id
|
|||
LEFT JOIN users cu ON c.user_id = cu.id
|
|||
) r
|
|||
LEFT JOIN votes v ON v.fk_id = r.id AND v.type = ? AND v.user_id = ?
|
|||
$where
|
|||
GROUP BY r.id
|
|||
$limit
|
|||
", array
|
|||
(
|
|||
Vote_Model::AGREE, Vote_Model::REQUEST,
|
|||
Vote_Model::DISAGREE, Vote_Model::REQUEST,
|
|||
Vote_Model::ABSTAIN, Vote_Model::REQUEST,
|
|||
Vote_Model::REQUEST,
|
|||
Vote_Model::get_vote_option_name(Vote_Model::AGREE), Vote_Model::AGREE,
|
|||
Vote_Model::get_vote_option_name(Vote_Model::DISAGREE), Vote_Model::DISAGREE,
|
|||
Vote_Model::get_vote_option_name(Vote_Model::ABSTAIN), Vote_Model::ABSTAIN,
|
|||
Vote_Model::REQUEST, Session::instance()->get('user_id'),
|
|||
));
|
|||
}
|
|||
/**
|
|||
* Counts all requests
|
|||
*
|
|||
* @author Michal Kliment
|
|||
* @param string $filter_sql
|
|||
* @return integer
|
|||
*/
|
|||
public function count_all_requests($filter_sql = '')
|
|||
{
|
|||
return count($this->get_all_requests(NULL, NULL, NULL, NULL, $filter_sql));
|
|||
}
|
|||
/**
|
|||
* Only returns suggest amount of work
|
|||
*
|
|||
* @author Michal Kliment
|
|||
* @return integer
|
|||
*/
|
|||
public function get_suggest_amount()
|
|||
{
|
|||
return $this->suggest_amount;
|
|||
}
|
|||
/**
|
|||
* Function to return all requests of user
|
|||
* @author Michal Kliment
|
|||
*
|
|||
* @param number $user_id
|
|||
* @return Mysql_Result
|
|||
*/
|
|||
public function get_all_requests_by_user($user_id, $state = '')
|
|||
{
|
|||
$where = '';
|
|||
switch ($state)
|
|||
{
|
|||
case 'pending':
|
|||
$where = ' AND (state = '.Vote_Model::STATE_NEW.' OR state = '.Vote_Model::STATE_OPEN.')';
|
|||
break;
|
|||
case 'approved':
|
|||
$where = ' AND state = '.Vote_Model::STATE_APPROVED;
|
|||
break;
|
|||
case 'rejected':
|
|||
$where = ' AND state = '.Vote_Model::STATE_REJECTED;
|
|||
break;
|
|||
}
|
|||
// query
|
|||
return $this->db->query("
|
|||
SELECT
|
|||
r.id, description, suggest_amount, date, state, r.type,
|
|||
(
|
|||
SELECT COUNT(*)
|
|||
FROM votes
|
|||
WHERE vote = ? AND votes.fk_id = r.id AND votes.type = ?
|
|||
) AS agree_count,
|
|||
(
|
|||
SELECT COUNT(*)
|
|||
FROM votes
|
|||
WHERE vote = ? AND votes.fk_id = r.id AND votes.type = ?
|
|||
) AS disagree_count,
|
|||
(
|
|||
SELECT COUNT(*)
|
|||
FROM votes
|
|||
WHERE vote = ? AND votes.fk_id = r.id AND votes.type = ?
|
|||
) AS abstain_count,
|
|||
SUM(r.vote) AS approval_state,
|
|||
GROUP_CONCAT(vote_comment SEPARATOR '\n\n') AS vote_comments,
|
|||
COUNT(comment_id) AS comments_count,
|
|||
GROUP_CONCAT(r.comment SEPARATOR '\n\n') AS comments
|
|||
FROM
|
|||
(
|
|||
SELECT r.*, CONCAT(u.name,' ',u.surname) AS uname,
|
|||
IFNULL(vote,0) AS vote,
|
|||
CONCAT(
|
|||
vu.name, ' ',vu.surname,' (',
|
|||
SUBSTRING(v.time,1,10),'): \n',vn.name,
|
|||
IF(v.comment NOT LIKE '', '-',''),v.comment
|
|||
) AS vote_comment,
|
|||
c.id AS comment_id,
|
|||
CONCAT(
|
|||
cu.name,' ', cu.surname,' (',
|
|||
SUBSTRING(c.datetime, 1, 10),'): \n', c.text
|
|||
) AS comment
|
|||
FROM requests r
|
|||
JOIN users u ON r.user_id = u.id
|
|||
LEFT JOIN votes v ON v.fk_id = r.id AND v.type = ?
|
|||
LEFT JOIN
|
|||
(
|
|||
SELECT ? AS name, ? AS value
|
|||
UNION
|
|||
SELECT ? AS name, ? AS value
|
|||
UNION
|
|||
SELECT ? AS name, ? AS value
|
|||
) vn ON v.vote = vn.value
|
|||
LEFT JOIN users vu ON v.user_id = vu.id
|
|||
LEFT JOIN comments_threads ct ON r.comments_thread_id = ct.id
|
|||
LEFT JOIN comments c ON c.comments_thread_id = ct.id
|
|||
LEFT JOIN users cu ON c.user_id = cu.id
|
|||
) r
|
|||
WHERE r.user_id = ? $where
|
|||
GROUP BY r.id
|
|||
", array
|
|||
(
|
|||
Vote_Model::AGREE, Vote_Model::REQUEST,
|
|||
Vote_Model::DISAGREE, Vote_Model::REQUEST,
|
|||
Vote_Model::ABSTAIN, Vote_Model::REQUEST,
|
|||
Vote_Model::REQUEST,
|
|||
Vote_Model::get_vote_option_name(Vote_Model::AGREE), Vote_Model::AGREE,
|
|||
Vote_Model::get_vote_option_name(Vote_Model::DISAGREE), Vote_Model::DISAGREE,
|
|||
Vote_Model::get_vote_option_name(Vote_Model::ABSTAIN), Vote_Model::ABSTAIN,
|
|||
$user_id
|
|||
));
|
|||
}
|
|||
}
|