Add cost breakdown for project budget

This commit is contained in:
Frederic Guillot
2015-03-15 17:28:46 -04:00
parent 253996901a
commit 084272c60e
7 changed files with 142 additions and 6 deletions

View File

@@ -45,6 +45,66 @@ class Budget extends Base
return isset($result['total']) ? (float) $result['total'] : 0;
}
/**
* Get breakdown by tasks/subtasks/users
*
* @access public
* @param integer $project_id
* @return \PicoDb\Table
*/
public function getBreakdown($project_id)
{
return $this->db
->table(SubtaskTimeTracking::TABLE)
->columns(
SubtaskTimeTracking::TABLE.'.id',
SubtaskTimeTracking::TABLE.'.user_id',
SubtaskTimeTracking::TABLE.'.subtask_id',
SubtaskTimeTracking::TABLE.'.start',
SubtaskTimeTracking::TABLE.'.time_spent',
Subtask::TABLE.'.task_id',
Subtask::TABLE.'.title AS subtask_title',
Task::TABLE.'.title AS task_title',
Task::TABLE.'.project_id',
User::TABLE.'.username',
User::TABLE.'.name'
)
->join(Subtask::TABLE, 'id', 'subtask_id')
->join(Task::TABLE, 'id', 'task_id', Subtask::TABLE)
->join(User::TABLE, 'id', 'user_id')
->eq(Task::TABLE.'.project_id', $project_id)
->filter(array($this, 'applyUserRate'));
}
/**
* Filter callback to apply the rate according to the effective date
*
* @access public
* @param array $records
* @return array
*/
public function applyUserRate(array $records)
{
$rates = $this->hourlyRate->getAllByProject($records[0]['project_id']);
foreach ($records as &$record) {
$hourly_price = 0;
foreach ($rates as $rate) {
if ($rate['user_id'] == $record['user_id'] && date('Y-m-d', $rate['date_effective']) <= date('Y-m-d', $record['start'])) {
$hourly_price = $rate['rate'];
break;
}
}
$record['cost'] = $hourly_price * $record['time_spent'];
}
return $records;
}
/**
* Add a new budget line in the database
*

View File

@@ -20,6 +20,24 @@ class HourlyRate extends Base
*/
const TABLE = 'hourly_rates';
/**
* Get all user rates for a given project
*
* @access public
* @param integer $project_id
* @return array
*/
public function getAllByProject($project_id)
{
$members = $this->projectPermission->getMembers($project_id);
if (empty($members)) {
return array();
}
return $this->db->table(self::TABLE)->in('user_id', array_keys($members))->desc('date_effective')->findAll();
}
/**
* Get all rates for a given user
*