Revize 982
Přidáno uživatelem Michal Kliment před více než 13 roky(ů)
freenetis/branches/search_filters/application/controllers/works.php | ||
---|---|---|
<?php
|
||
/**
|
||
*
|
||
* @author Michal Kliment
|
||
* @copyright (c) 2010 Kliment Michal
|
||
* @license GNU GPLv3
|
||
* @license http://www.gnu.org/licenses/gpl.txt
|
||
*/
|
||
|
||
class Works_Controller extends Controller
|
||
{
|
||
protected $user_id = false;
|
||
|
||
public function index()
|
||
{
|
||
url::redirect(url_lang::base().'works/pending');
|
||
}
|
||
|
||
/**
|
||
* @author Michal Kliment
|
||
* Function to show all pending works
|
||
* @param number $limit_results
|
||
* @param string $order_by
|
||
* @param string $order_by_direction
|
||
* @param string $page_word
|
||
* @param number $page
|
||
*/
|
||
public function pending($limit_results = 100, $order_by = 'id', $order_by_direction = 'ASC', $page_word = null, $page = 1)
|
||
{
|
||
// acccess control
|
||
if (!$this->acl_check_view('Users_Controller','work'))
|
||
Controller::error(ACCESS);
|
||
|
||
// gets new selector
|
||
if (is_numeric($this->input->get('record_per_page')))
|
||
$limit_results = (int) $this->input->get('record_per_page');
|
||
|
||
$work_model = new Job_Model();
|
||
$total_works = $work_model->count_all_pending_works();
|
||
|
||
if (($sql_offset = ($page - 1) * $limit_results) > $total_works)
|
||
$sql_offset = 0;
|
||
|
||
$works = $work_model->get_all_pending_works($sql_offset, (int)$limit_results, $order_by, $order_by_direction);
|
||
|
||
$approval_template_item_model = new Approval_template_item_Model();
|
||
|
||
// test if user can vote
|
||
$can_vote = FALSE;
|
||
foreach ($works as $work)
|
||
{
|
||
if ($approval_template_item_model->check_user_vote_rights($work->approval_template_id, Session::instance()->get('user_id'), $work->suggest_amount))
|
||
{
|
||
$can_vote = TRUE;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// create grid
|
||
$grid = new Grid(url_lang::base().'works/pending', url_lang::lang('texts.List of all pending works'), array(
|
||
//'separator' => '',
|
||
'use_paginator' => true,
|
||
'use_selector' => true,
|
||
'current' => $limit_results, //current selected 'records_per_page' value
|
||
'selector_increace' => 100, // increace
|
||
'selector_min' => 100, // minimum where selector start
|
||
'selector_max_multiplier' => 20,
|
||
'base_url' => Config::get('lang').'/works/pending/'.$limit_results.'/'.$order_by.'/'.$order_by_direction ,
|
||
'uri_segment' => 'page', // pass a string as uri_segment to trigger former 'label' functionality
|
||
'total_items' => $total_works, // use db count query here of course
|
||
'items_per_page' => $limit_results, // it may be handy to set defaults for stuff like this in config/pagination.php
|
||
'style' => 'classic',
|
||
'order_by' => $order_by,
|
||
'order_by_direction' => $order_by_direction,
|
||
'limit_results' => $limit_results,
|
||
//'query_string' => $query_string
|
||
));
|
||
|
||
if ($this->acl_check_new('Users_Controller','work'))
|
||
$grid->add_new_button(url_lang::base().'works/add', url_lang::lang('texts.Add new work'));
|
||
|
||
$grid->order_field('id')->label(url_lang::lang('texts.Id'));
|
||
$grid->order_callback_field('uname')->label(url_lang::lang('texts.User name'))->callback('Works_Controller::user_name');
|
||
$grid->order_field('description')->label(url_lang::lang('texts.Description'));
|
||
$grid->order_field('date')->label(url_lang::lang('texts.Date'));
|
||
$grid->order_field('hours')->label(url_lang::lang('texts.Hours'));
|
||
$grid->order_field('km')->label(url_lang::lang('texts.Km'));
|
||
$grid->order_callback_field('suggest_amount')->label(url_lang::lang('texts.Suggest amount'))->callback('Works_Controller::suggest_amount');
|
||
$grid->order_callback_field('approval_state')->label(url_lang::lang('texts.State'))->help(help::hint('approval_state'))->callback('callback::vote_state_field');
|
||
$grid->order_callback_field('comments_count')->label(url_lang::lang('texts.comments'))->callback('callback::comments_field');;
|
||
|
||
// user can vote -> show columns for form items
|
||
if ($can_vote)
|
||
{
|
||
$grid->order_form_field('vote')->label(url_lang::lang('texts.Vote'))->type('dropdown')->options(array(NULL => '--------', 1 => url_lang::lang('texts.Agree'), -1 => url_lang::lang('texts.Disagree'), 0 => url_lang::lang('texts.Abstain')))->callback('Works_Controller::vote_form_field');
|
||
$grid->order_form_field('comment')->label(url_lang::lang('texts.Comment'))->type('textarea')->callback('Works_Controller::comment_form_field');
|
||
}
|
||
|
||
// access control
|
||
if ($this->acl_check_view('Users_Controller','work'))
|
||
$grid->action_field('id')->label(url_lang::lang('texts.Show')) ->url(url_lang::base().'works/show') ->action(url_lang::lang('texts.Show'))->class('center');
|
||
|
||
$grid->datasource($works);
|
||
|
||
// form is submited
|
||
if (isset ($_POST) && count ($_POST))
|
||
{
|
||
$vote_model = new Vote_Model();
|
||
$post_votes = $_POST['vote'];
|
||
$comments = $_POST['comment'];
|
||
$approval_template_model = new Approval_template_Model();
|
||
$approval_template_item_model = new Approval_template_item_Model();
|
||
|
||
foreach ($post_votes as $id => $post_vote)
|
||
{
|
||
$work = $work_model->where('id',$id)->find();
|
||
|
||
// finding aro group of logged user
|
||
$aro_group = $approval_template_item_model->get_aro_group_by_approval_template_id_and_user_id($work->approval_template_id, $this->session->get('user_id'), $work->suggest_amount);
|
||
|
||
// user can vote
|
||
if ($aro_group && $aro_group->id)
|
||
{
|
||
// finding vote of user
|
||
$vote = $vote_model->where('user_id',$this->session->get('user_id'))->where('fk_id', $id)->where('type',Vote_Model::$work)->find();
|
||
|
||
// delete vote
|
||
if ($vote->id && $post_vote=="")
|
||
{
|
||
$vote->delete();
|
||
}
|
||
// edit vote
|
||
else if ($vote->id && $post_vote!="")
|
||
{
|
||
$vote->vote = $post_vote;
|
||
$vote->comment = $comments[$id];
|
||
$vote->time = date('Y-m-d H:i:s');
|
||
$vote->save();
|
||
}
|
||
// create vote
|
||
else if (!$vote->id && $post_vote!="")
|
||
{
|
||
$vote->clear();
|
||
$vote->user_id = $this->session->get('user_id');
|
||
$vote->fk_id = $id;
|
||
$vote->aro_group_id = $aro_group->id;
|
||
$vote->type = Vote_Model::$work;
|
||
$vote->vote = $post_vote;
|
||
$vote->comment = $comments[$id];
|
||
$vote->time = date('Y-m-d H:i:s');
|
||
$vote->save();
|
||
}
|
||
|
||
// set up state of work
|
||
$work->state = Votes_Controller::get_state($work, Vote_Model::$work);
|
||
|
||
// work is approved
|
||
if ($work->state == 3)
|
||
{
|
||
// creates new transfer
|
||
$account_model = new Account_Model();
|
||
|
||
/*
|
||
$transfer = new Transfer_Model();
|
||
// finding of operating account
|
||
$operating_account = $account_model->where('account_attribute_id', Account_attribute_Model::$operating)->find();
|
||
$transfer->origin_id = $operating_account->id;
|
||
// findind of account of member
|
||
$member_account = $account_model->where('member_id', $work->user->member_id)->where('account_attribute_id', Account_attribute_Model::$credit)->find();
|
||
$transfer->destination_id = $member_account->id;
|
||
$transfer->datetime = date('Y-m-d');
|
||
$transfer->creation_datetime = date('Y-m-d H:i:s');
|
||
$transfer->text = url_lang::lang('texts.Work approval');
|
||
$transfer->amount = $work->suggest_amount;
|
||
$transfer->user_id = $this->session->get('user_id');
|
||
$transfer->save();
|
||
*
|
||
*/
|
||
$operating_id = $account_model->where('account_attribute_id', Account_attribute_Model::$operating)->find()->id;
|
||
$credit_id = $account_model->where('member_id', $work->user->member_id)->where('account_attribute_id', Account_attribute_Model::$credit)->find()->id;
|
||
|
||
$transfer_id = Transfer_Model::insert_transfer(
|
||
$operating_id,
|
||
$credit_id,
|
||
null,
|
||
null,
|
||
$this->session->get('user_id'),
|
||
null,
|
||
date('Y-m-d'),
|
||
date('Y-m-d H:i:s'),
|
||
url_lang::lang('texts.Work approval'),
|
||
$work->suggest_amount
|
||
);
|
||
|
||
$work->transfer_id = $transfer_id;
|
||
}
|
||
|
||
$work->save();
|
||
|
||
// set up state of approval template
|
||
$approval_template = $approval_template_model->where('id',$work->approval_template_id)->find();
|
||
$approval_template->state = $approval_template_model->get_state($approval_template->id);
|
||
$approval_template->save();
|
||
}
|
||
}
|
||
$this->session->set_flash('message', url_lang::lang('texts.Votes has been successfully updated.'));
|
||
url::redirect(url::base().url::current(TRUE));
|
||
}
|
||
|
||
$view = new View('main');
|
||
$view->title = url_lang::lang('texts.Pending works');
|
||
$view->breadcrumbs = url_lang::lang('texts.Pending works');
|
||
$view->content = new View('works');
|
||
$view->content->grid = $grid;
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
/**
|
||
* @author Michal Kliment
|
||
* Function to show all approved works
|
||
* @param number Number of records to show
|
||
* @param string Column in database to ordering records
|
||
* @param string Direction of ordering
|
||
* @param string Unused variable
|
||
* @param number Number of page
|
||
*/
|
||
public function approved($limit_results = 100, $order_by = 'id', $order_by_direction = 'ASC', $page_word = null, $page = 1)
|
||
{
|
||
// acccess control
|
||
if (!$this->acl_check_view('Users_Controller','work'))
|
||
Controller::error(ACCESS);
|
||
|
||
// gets new selector
|
||
if (is_numeric($this->input->get('record_per_page')))
|
||
$limit_results = (int) $this->input->get('record_per_page');
|
||
|
||
// parameters control
|
||
//$allowed_order_type = array('id','user_name','description','date','hours','km','confirm_user','confirm_time','rating');
|
||
//if (!in_array(strtolower($order_by), $allowed_order_type)) $order_by = 'id';
|
||
//if (strtolower($order_by_direction) != 'asc' && strtolower($order_by_direction) != 'desc') $order_by_direction = 'asc';
|
||
|
||
$work_model = new Job_Model();
|
||
$total_works = $work_model->count_all_approved_works();
|
||
|
||
if (($sql_offset = ($page - 1) * $limit_results) > $total_works)
|
||
$sql_offset = 0;
|
||
|
||
$works = $work_model->get_all_approved_works($sql_offset, (int)$limit_results, $order_by, $order_by_direction);
|
||
|
||
// create grid
|
||
$grid = new Grid(url_lang::base().'works/approved', url_lang::lang('texts.List of all approved works'), array(
|
||
//'separator' => '',
|
||
'use_paginator' => true,
|
||
'use_selector' => true,
|
||
'current' => $limit_results, //current selected 'records_per_page' value
|
||
'selector_increace' => 100, // increace
|
||
'selector_min' => 100, // minimum where selector start
|
||
'selector_max_multiplier' => 20,
|
||
'base_url' => Config::get('lang').'/works/approved/'.$limit_results.'/'.$order_by.'/'.$order_by_direction ,
|
||
'uri_segment' => 'page', // pass a string as uri_segment to trigger former 'label' functionality
|
||
'total_items' => $total_works, // use db count query here of course
|
||
'items_per_page' => $limit_results, // it may be handy to set defaults for stuff like this in config/pagination.php
|
||
'style' => 'classic',
|
||
'order_by' => $order_by,
|
||
'order_by_direction' => $order_by_direction,
|
||
'limit_results' => $limit_results,
|
||
//'query_string' => $query_string
|
||
));
|
||
|
||
$grid->order_field('id')->label(url_lang::lang('texts.Id'));
|
||
$grid->order_callback_field('uname')->label(url_lang::lang('texts.User name'))->callback('Works_Controller::user_name');
|
||
$grid->order_field('description')->label(url_lang::lang('texts.Description'));
|
||
$grid->order_field('date')->label(url_lang::lang('texts.Date'));
|
||
$grid->order_field('hours')->label(url_lang::lang('texts.Hours'));
|
||
$grid->order_field('km')->label(url_lang::lang('texts.Km'));
|
||
$grid->order_callback_field('rating')->label(url_lang::lang('texts.Rating'))->callback('Works_Controller::rating');
|
||
$grid->order_callback_field('approval_state')->label(url_lang::lang('texts.State'))->help(help::hint('approval_state'))->callback('callback::vote_state_field');
|
||
$grid->order_callback_field('comments_count')->label(url_lang::lang('texts.comments'))->callback('callback::comments_field');
|
||
|
||
// access control
|
||
if ($this->acl_check_view('Users_Controller','work'))
|
||
$grid->action_field('id')->label(url_lang::lang('texts.Show')) ->url(url_lang::base().'works/show') ->action(url_lang::lang('texts.Show'))->class('center');
|
||
|
||
$grid->datasource($works);
|
||
|
||
$view = new View('main');
|
||
$view->title = url_lang::lang('texts.Approved works');
|
||
$view->breadcrumbs = url_lang::lang('texts.Approved works');
|
||
$view->content = new View('works');
|
||
$view->content->grid = $grid;
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
/**
|
||
* @author Michal Kliment
|
||
* Function to show all rejected works
|
||
* @param number $limit_results
|
||
* @param string $order_by
|
||
* @param string $order_by_direction
|
||
* @param string $page_word
|
||
* @param number $page
|
||
*/
|
||
public function rejected($limit_results = 100, $order_by = 'id', $order_by_direction = 'ASC', $page_word = null, $page = 1)
|
||
{
|
||
// acccess control
|
||
if (!$this->acl_check_view('Users_Controller','work'))
|
||
Controller::error(ACCESS);
|
||
|
||
// gets new selector
|
||
if (is_numeric($this->input->get('record_per_page')))
|
||
$limit_results = (int) $this->input->get('record_per_page');
|
||
|
||
// parameters control
|
||
//$allowed_order_type = array('id','user_name','description','date','hours','km','confirm_user','confirm_time','rating');
|
||
//if (!in_array(strtolower($order_by), $allowed_order_type)) $order_by = 'id';
|
||
//if (strtolower($order_by_direction) != 'asc' && strtolower($order_by_direction) != 'desc') $order_by_direction = 'asc';
|
||
|
||
$work_model = new Job_Model();
|
||
$total_works = $work_model->count_all_rejected_works();
|
||
|
||
if (($sql_offset = ($page - 1) * $limit_results) > $total_works)
|
||
$sql_offset = 0;
|
||
|
||
$works = $work_model->get_all_rejected_works($sql_offset, (int)$limit_results, $order_by, $order_by_direction);
|
||
|
||
// create grid
|
||
$grid = new Grid(url_lang::base().'works/rejected', url_lang::lang('texts.List of all rejected works'), array(
|
||
//'separator' => '',
|
||
'use_paginator' => true,
|
||
'use_selector' => true,
|
||
'current' => $limit_results, //current selected 'records_per_page' value
|
||
'selector_increace' => 100, // increace
|
||
'selector_min' => 100, // minimum where selector start
|
||
'selector_max_multiplier' => 20,
|
||
'base_url' => Config::get('lang').'/works/rejected/'.$limit_results.'/'.$order_by.'/'.$order_by_direction ,
|
||
'uri_segment' => 'page', // pass a string as uri_segment to trigger former 'label' functionality
|
||
'total_items' => $total_works, // use db count query here of course
|
||
'items_per_page' => $limit_results, // it may be handy to set defaults for stuff like this in config/pagination.php
|
||
'style' => 'classic',
|
||
'order_by' => $order_by,
|
||
'order_by_direction' => $order_by_direction,
|
||
'limit_results' => $limit_results,
|
||
//'query_string' => $query_string
|
||
));
|
||
|
||
$grid->order_field('id')->label(url_lang::lang('texts.Id'));
|
||
$grid->order_callback_field('uname')->label(url_lang::lang('texts.User name'))->callback('Works_Controller::user_name');
|
||
$grid->order_field('description')->label(url_lang::lang('texts.Description'));
|
||
$grid->order_field('date')->label(url_lang::lang('texts.Date'));
|
||
$grid->order_field('hours')->label(url_lang::lang('texts.Hours'));
|
||
$grid->order_field('km')->label(url_lang::lang('texts.Km'));
|
||
$grid->order_callback_field('suggest_amount')->label(url_lang::lang('texts.Suggest amount'))->callback('Works_Controller::suggest_amount');
|
||
$grid->order_callback_field('approval_state')->label(url_lang::lang('texts.State'))->help(help::hint('approval_state'))->callback('callback::vote_state_field');
|
||
$grid->order_callback_field('comments_count')->label(url_lang::lang('texts.comments'))->callback('callback::comments_field');
|
||
|
||
// access control
|
||
if ($this->acl_check_view('Users_Controller','work'))
|
||
$grid->action_field('id')->label(url_lang::lang('texts.Show')) ->url(url_lang::base().'works/show') ->action(url_lang::lang('texts.Show'))->class('center');
|
||
|
||
$grid->datasource($works);
|
||
|
||
$view = new View('main');
|
||
$view->title = url_lang::lang('texts.Rejected works');
|
||
$view->breadcrumbs = url_lang::lang('texts.Rejected works');
|
||
$view->content = new View('works');
|
||
$view->content->grid = $grid;
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
/**
|
||
* @author Michal Kliment
|
||
* Function to show all works of user
|
||
* @param number $user_id
|
||
*/
|
||
public function show_by_user ($user_id = NULL)
|
||
{
|
||
if (!$user_id || !is_numeric ($user_id))
|
||
Controller::warning (PARAMETER);
|
||
|
||
$user = new User_Model($user_id);
|
||
|
||
if (!$user->id)
|
||
Controller::error(RECORD);
|
||
|
||
if (!$this->acl_check_view('Users_Controller', 'work', $user->member_id))
|
||
Controller::error(ACCESS);
|
||
|
||
$work_model = new Job_Model();
|
||
|
||
$pending_works = $work_model->get_all_pending_works_by_user($user->id);
|
||
|
||
$approval_template_item_model = new Approval_template_item_Model();
|
||
|
||
// test if user can vote
|
||
$can_vote = FALSE;
|
||
foreach ($pending_works as $pending_work)
|
||
{
|
||
if ($approval_template_item_model->check_user_vote_rights($pending_work->approval_template_id, Session::instance()->get('user_id'), $pending_work->suggest_amount))
|
||
{
|
||
$can_vote = TRUE;
|
||
break;
|
||
}
|
||
}
|
||
|
||
$total_pending = array();
|
||
$total_pending['hours'] = 0;
|
||
$total_pending['kms'] = 0;
|
||
$total_pending['suggest_amount'] = 0;
|
||
|
||
foreach ($pending_works as $pending_work)
|
||
{
|
||
$total_pending['hours'] += $pending_work->hours;
|
||
$total_pending['kms'] += $pending_work->km;
|
||
$total_pending['suggest_amount'] += $pending_work->suggest_amount;
|
||
}
|
||
|
||
// create grid
|
||
$pending_works_grid = new Grid(url_lang::base().'works/rejected', '', array(
|
||
//'separator' => '',
|
||
'use_paginator' => false,
|
||
'use_selector' => false,
|
||
'total_items' => count ($pending_works)
|
||
));
|
||
|
||
if ($this->acl_check_new('Users_Controller','work', $user->member_id))
|
||
$pending_works_grid->add_new_button(url_lang::base().'works/add/'.$user->id, url_lang::lang('texts.Add new work'));
|
||
|
||
$pending_works_grid->field('id')->label(url_lang::lang('texts.Id'));
|
||
$pending_works_grid->field('description')->label(url_lang::lang('texts.Description'));
|
||
$pending_works_grid->field('date')->label(url_lang::lang('texts.Date'));
|
||
$pending_works_grid->field('hours')->label(url_lang::lang('texts.Hours'));
|
||
$pending_works_grid->field('km')->label(url_lang::lang('texts.Km'));
|
||
$pending_works_grid->callback_field('suggest_amount')->label(url_lang::lang('texts.Suggest amount'))->callback('Works_Controller::suggest_amount');
|
||
$pending_works_grid->callback_field('approval_state')->label(url_lang::lang('texts.State'))->help(help::hint('approval_state'))->callback('callback::vote_state_field');
|
||
$pending_works_grid->callback_field('comments_count')->label(url_lang::lang('texts.comments'))->callback('callback::comments_field');
|
||
|
||
// user can vote -> show columns for form items
|
||
if ($can_vote)
|
||
{
|
||
$pending_works_grid->form_field('vote')->label(url_lang::lang('texts.Vote'))->type('dropdown')->options(array(NULL => '--------', 1 => url_lang::lang('texts.Agree'), -1 => url_lang::lang('texts.Disagree'), 0 => url_lang::lang('texts.Abstain')))->callback('Works_Controller::vote_form_field');
|
||
$pending_works_grid->form_field('comment')->label(url_lang::lang('texts.Comment'))->type('textarea')->callback('Works_Controller::comment_form_field');
|
||
}
|
||
|
||
// access control
|
||
if ($this->acl_check_view('Users_Controller','work',$user->member_id))
|
||
$pending_works_grid->action_field('id')->label(url_lang::lang('texts.Show')) ->url(url_lang::base().'users/show_work') ->action(url_lang::lang('texts.Show'))->class('center');
|
||
|
||
$pending_works_grid->datasource($pending_works);
|
||
|
||
$approved_works = $work_model->get_all_approved_works_by_user($user->id);
|
||
|
||
$total_approved = array();
|
||
$total_approved['hours'] = 0;
|
||
$total_approved['kms'] = 0;
|
||
$total_approved['rating'] = 0;
|
||
|
||
foreach ($approved_works as $approved_work)
|
||
{
|
||
$total_approved['hours'] += $approved_work->hours;
|
||
$total_approved['kms'] += $approved_work->km;
|
||
$total_approved['rating'] += $approved_work->rating;
|
||
}
|
||
|
||
// create grid
|
||
$approved_works_grid = new Grid(url_lang::base().'works/rejected', '', array(
|
||
//'separator' => '',
|
||
'use_paginator' => false,
|
||
'use_selector' => false,
|
||
'total_items' => count ($approved_works)
|
||
));
|
||
|
||
$approved_works_grid->field('id')->label(url_lang::lang('texts.Id'));
|
||
$approved_works_grid->field('description')->label(url_lang::lang('texts.Description'));
|
||
$approved_works_grid->field('date')->label(url_lang::lang('texts.Date'));
|
||
$approved_works_grid->field('hours')->label(url_lang::lang('texts.Hours'));
|
||
$approved_works_grid->field('km')->label(url_lang::lang('texts.Km'));
|
||
$approved_works_grid->callback_field('rating')->label(url_lang::lang('texts.Rating'))->callback('Works_Controller::rating');
|
||
$approved_works_grid->callback_field('approval_state')->label(url_lang::lang('texts.State'))->help(help::hint('approval_state'))->callback('callback::vote_state_field');
|
||
$approved_works_grid->callback_field('comments_count')->label(url_lang::lang('texts.comments'))->callback('callback::comments_field');
|
||
|
||
// access control
|
||
if ($this->acl_check_view('Users_Controller','work', $user->member_id))
|
||
$approved_works_grid->action_field('id')->label(url_lang::lang('texts.Show')) ->url(url_lang::base().'users/show_work') ->action(url_lang::lang('texts.Show'))->class('center');
|
||
|
||
$approved_works_grid->datasource($approved_works);
|
||
|
||
$rejected_works = $work_model->get_all_rejected_works_by_user($user->id);
|
||
|
||
$total_rejected = array();
|
||
$total_rejected['hours'] = 0;
|
||
$total_rejected['kms'] = 0;
|
||
$total_rejected['suggest_amount'] = 0;
|
||
|
||
foreach ($rejected_works as $rejected_work)
|
||
{
|
||
$total_rejected['hours'] += $rejected_work->hours;
|
||
$total_rejected['kms'] += $rejected_work->km;
|
||
$total_rejected['suggest_amount'] += $rejected_work->suggest_amount;
|
||
}
|
||
|
||
// create grid
|
||
$rejected_works_grid = new Grid(url_lang::base().'works/rejected', '', array(
|
||
//'separator' => '',
|
||
'use_paginator' => false,
|
||
'use_selector' => false,
|
||
'total_items' => count ($rejected_works)
|
||
));
|
||
|
||
$rejected_works_grid->field('id')->label(url_lang::lang('texts.Id'));
|
||
$rejected_works_grid->field('description')->label(url_lang::lang('texts.Description'));
|
||
$rejected_works_grid->field('date')->label(url_lang::lang('texts.Date'));
|
||
$rejected_works_grid->field('hours')->label(url_lang::lang('texts.Hours'));
|
||
$rejected_works_grid->field('km')->label(url_lang::lang('texts.Km'));
|
||
$rejected_works_grid->callback_field('suggest_amount')->label(url_lang::lang('texts.Suggest amount'))->callback('Works_Controller::suggest_amount');
|
||
$rejected_works_grid->callback_field('approval_state')->label(url_lang::lang('texts.State'))->help(help::hint('approval_state'))->callback('callback::vote_state_field');
|
||
$rejected_works_grid->callback_field('comments_count')->label(url_lang::lang('texts.comments'))->callback('callback::comments_field');
|
||
|
||
// access control
|
||
if ($this->acl_check_view('Users_Controller','work', $user->member_id))
|
||
$rejected_works_grid->action_field('id')->label(url_lang::lang('texts.Show')) ->url(url_lang::base().'users/show_work') ->action(url_lang::lang('texts.Show'))->class('center');
|
||
|
||
$rejected_works_grid->datasource($rejected_works);
|
||
|
||
// form is submited
|
||
if (isset ($_POST) && count ($_POST))
|
||
{
|
||
$vote_model = new Vote_Model();
|
||
$post_votes = $_POST['vote'];
|
||
$comments = $_POST['comment'];
|
||
$approval_template_model = new Approval_template_Model();
|
||
$approval_template_item_model = new Approval_template_item_Model();
|
||
|
||
foreach ($post_votes as $id => $post_vote)
|
||
{
|
||
$work = $work_model->where('id',$id)->find();
|
||
|
||
// finding aro group of logged user
|
||
$aro_group = $approval_template_item_model->get_aro_group_by_approval_template_id_and_user_id($work->approval_template_id, $this->session->get('user_id'), $work->suggest_amount);
|
||
|
||
// user can vote
|
||
if ($aro_group && $aro_group->id)
|
||
{
|
||
// finding vote of user
|
||
$vote = $vote_model->where('user_id',$this->session->get('user_id'))->where('fk_id', $id)->where('type',Vote_Model::$work)->find();
|
||
|
||
// delete vote
|
||
if ($vote->id && $post_vote=="")
|
||
{
|
||
$vote->delete();
|
||
}
|
||
// edit vote
|
||
else if ($vote->id && $post_vote!="")
|
||
{
|
||
$vote->vote = $post_vote;
|
||
$vote->comment = $comments[$id];
|
||
$vote->time = date('Y-m-d H:i:s');
|
||
$vote->save();
|
||
}
|
||
// create vote
|
||
else if (!$vote->id && $post_vote!="")
|
||
{
|
||
$vote->clear();
|
||
$vote->user_id = $this->session->get('user_id');
|
||
$vote->fk_id = $id;
|
||
$vote->aro_group_id = $aro_group->id;
|
||
$vote->type = Vote_Model::$work;
|
||
$vote->vote = $post_vote;
|
||
$vote->comment = $comments[$id];
|
||
$vote->time = date('Y-m-d H:i:s');
|
||
$vote->save();
|
||
}
|
||
|
||
// set up state of work
|
||
$work->state = Votes_Controller::get_state($work, Vote_Model::$work);
|
||
|
||
// work is approved
|
||
if ($work->state == 3)
|
||
{
|
||
// creates new transfer
|
||
$account_model = new Account_Model();
|
||
|
||
/*
|
||
|
||
|
||
$transfer = new Transfer_Model();
|
||
|
||
// finding of operating account
|
||
$operating_account = $account_model->where('account_attribute_id', Account_attribute_Model::$operating)->find();
|
||
$transfer->origin_id = $operating_account->id;
|
||
// findind of account of member
|
||
$member_account = $account_model->where('member_id', $work->user->member_id)->where('account_attribute_id', Account_attribute_Model::$credit)->find();
|
||
$transfer->destination_id = $member_account->id;
|
||
$transfer->datetime = date('Y-m-d');
|
||
$transfer->creation_datetime = date('Y-m-d H:i:s');
|
||
$transfer->text = url_lang::lang('texts.Work approval');
|
||
$transfer->amount = $work->suggest_amount;
|
||
$transfer->user_id = $this->session->get('user_id');
|
||
$transfer->save();
|
||
*/
|
||
|
||
$operating_id = $account_model->where('account_attribute_id', Account_attribute_Model::$operating)->find()->id;
|
||
$credit_id = $account_model->where('member_id', $work->user->member_id)->where('account_attribute_id', Account_attribute_Model::$credit)->find()->id;
|
||
|
||
$transfer_id = Transfer_Model::insert_transfer(
|
||
$operating_id,
|
||
$credit_id,
|
||
null,
|
||
null,
|
||
$this->session->get('user_id'),
|
||
null,
|
||
date('Y-m-d'),
|
||
date('Y-m-d H:i:s'),
|
||
url_lang::lang('texts.Work approval'),
|
||
$work->suggest_amount
|
||
);
|
||
|
||
$work->transfer_id = $transfer_id;
|
||
}
|
||
|
||
$work->save();
|
||
|
||
// set up state of approval template
|
||
$approval_template = $approval_template_model->where('id',$work->approval_template_id)->find();
|
||
$approval_template->state = $approval_template_model->get_state($approval_template->id);
|
||
$approval_template->save();
|
||
|
||
}
|
||
|
||
}
|
||
$this->session->set_flash('message', url_lang::lang('texts.Votes has been successfully updated.'));
|
||
url::redirect(url::base().url::current(TRUE));
|
||
}
|
||
|
||
// breadcrumbs navigation
|
||
$breadcrumbs = array();
|
||
$breadcrumbs[] = ($this->acl_check_view('Members_Controller','members')) ? html::anchor (url_lang::base().'members/show_all', url_lang::lang('texts.Members')) : url_lang::lang('texts.Members');
|
||
$breadcrumbs[] = ($this->acl_check_view('Members_Controller','members', $user->member->id)) ? html::anchor(url_lang::base().'members/show/'.$user->member->id, "ID ".$user->member->id." - ".$user->member->name) : "ID ".$user->member->id." - ".$user->member->name;
|
||
$breadcrumbs[] = ($this->acl_check_view('Users_Controller', 'users',$user->member_id)) ? html::anchor (url_lang::base().'users/show_by_member/'.$user->member_id, url_lang::lang('texts.Users')) : url_lang::lang('texts.Users');
|
||
$breadcrumbs[] = ($this->acl_check_view('Users_Controller', 'users',$user->member_id)) ? html::anchor (url_lang::base().'users/show/'.$user->id, "$user->name $user->surname ($user->login)") : "$user->name $user->surname ($user->login)";
|
||
$breadcrumbs[] = url_lang::lang('texts.Works');
|
||
|
||
$view = new View('main');
|
||
$view->title = url_lang::lang('texts.List of works of user').' '.$user->name.' '.$user->surname;
|
||
$view->breadcrumbs = implode(' » ', $breadcrumbs);
|
||
$view->content = new View('works_show_by_user');
|
||
$view->content->headline = url_lang::lang('texts.List of works of user').' '.$user->name.' '.$user->surname;
|
||
$view->content->user = $user;
|
||
$view->content->pending_works_grid = $pending_works_grid;
|
||
$view->content->approved_works_grid = $approved_works_grid;
|
||
$view->content->rejected_works_grid = $rejected_works_grid;
|
||
$view->content->total_pending = $total_pending;
|
||
$view->content->total_approved = $total_approved;
|
||
$view->content->total_rejected = $total_rejected;
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
/**
|
||
* @author Michal Kliment
|
||
* Function to show work (by private functions show_opened and show_closed)
|
||
* @param number $work_id
|
||
*/
|
||
public function show($work_id = NULL)
|
||
{
|
||
// bad parameter
|
||
if (!$work_id || !is_numeric($work_id))
|
||
Controller::warning(PARAMETER);
|
||
|
||
$work = new Job_Model($work_id);
|
||
|
||
// record doesn't exist
|
||
if (!$work->id)
|
||
Controller::error(RECORD);
|
||
|
||
// access control
|
||
if (!$this->acl_check_view('Users_Controller','work',$work->user->member_id))
|
||
Controller::error(ACCESS);
|
||
|
||
// breadcrumbs navigation
|
||
$this->breadcrumbs = array();
|
||
|
||
if (url::slice(url_lang::uri(path::previous()),1,1) == 'show_by_user')
|
||
{
|
||
$this->breadcrumbs[] = ($this->acl_check_view('Members_Controller','members')) ? html::anchor (url_lang::base().'members/show_all', url_lang::lang('texts.Members')) : url_lang::lang('texts.Members');
|
||
$this->breadcrumbs[] = ($this->acl_check_view('Members_Controller','members', $work->user->member->id)) ? html::anchor(url_lang::base().'members/show/'.$work->user->member->id, "ID ".$work->user->member->id." - ".$work->user->member->name) : "ID ".$work->user->member->id." - ".$work->user->member->name;
|
||
$this->breadcrumbs[] = ($this->acl_check_view('Users_Controller', 'users',$work->user->member_id)) ? html::anchor (url_lang::base().'users/show_by_member/'.$work->user->member_id, url_lang::lang('texts.Users')) : url_lang::lang('texts.Users');
|
||
$this->breadcrumbs[] = ($this->acl_check_view('Users_Controller', 'users',$work->user->member_id)) ? html::anchor (url_lang::base().'users/show/'.$work->user->id, $work->user->name." ".$work->user->surname." (".$work->user->login.")") : $work->user->name." ".$work->user->surname." (".$work->user->login.")";
|
||
$this->breadcrumbs[] = ($this->acl_check_view('Users_Controller', 'work',$work->user->member_id)) ? html::anchor (url_lang::base().'works/show_by_user/'.$work->user->id, url_lang::lang('texts.Works')) : url_lang::lang('texts.Works');
|
||
}
|
||
else
|
||
{
|
||
switch ($work->state)
|
||
{
|
||
case 0:
|
||
case 1:
|
||
$this->breadcrumbs[] = ($this->acl_check_view('Users_Controller','work')) ? html::anchor (url_lang::base().'works/pending', url_lang::lang('texts.Pending works')) : url_lang::lang('texts.Pending works');
|
||
break;
|
||
case 2:
|
||
$this->breadcrumbs[] = ($this->acl_check_view('Users_Controller','work')) ? html::anchor (url_lang::base().'works/rejected', url_lang::lang('texts.Rejected works')) : url_lang::lang('texts.Rejected works');
|
||
break;
|
||
case 3:
|
||
$this->breadcrumbs[] = ($this->acl_check_view('Users_Controller','work')) ? html::anchor (url_lang::base().'works/approved', url_lang::lang('texts.Approved works')) : url_lang::lang('texts.Approved works');
|
||
break;
|
||
}
|
||
}
|
||
|
||
$this->breadcrumbs[] = url_lang::lang('texts.ID').' '.$work->id;
|
||
|
||
if ($work->state <= 1)
|
||
// work is opened
|
||
self::show_opened ($work);
|
||
else
|
||
// work is closed
|
||
self::show_closed ($work);
|
||
}
|
||
|
||
/**
|
||
* @author Michal Kliment
|
||
* Private function to show opened work
|
||
* @param object $work
|
||
*/
|
||
private function show_opened($work = NULL)
|
||
{
|
||
// bad parameter
|
||
if (!$work)
|
||
Controller::warning(PARAMETER);
|
||
|
||
$approval_template_item_model = new Approval_template_item_Model();
|
||
$aro_groups = $approval_template_item_model->get_aro_groups_by_approval_template_id($work->approval_template_id, $work->suggest_amount);
|
||
|
||
$user_aro_group = $approval_template_item_model->get_aro_group_by_approval_template_id_and_user_id($work->approval_template_id, $this->session->get('user_id'), $work->suggest_amount);
|
||
|
||
$i = 0;
|
||
$vote_groups = array();
|
||
$vote_grids = array();
|
||
$total_votes = array();
|
||
$sums = array();
|
||
$agrees = array();
|
||
$percents = array();
|
||
$user_vote = NULL;
|
||
|
||
foreach ($aro_groups as $aro_group)
|
||
{
|
||
$vote_groups[$i] = $aro_group->name;
|
||
|
||
$vote_model = new Vote_Model();
|
||
$votes = $vote_model->select('votes.id', 'votes.user_id', 'CONCAT(users.name,\' \',users.surname) as uname', 'vote', 'votes.comment', 'time')->join('users','users.id', 'votes.user_id')->where('votes.type',Vote_Model::$work)->where('fk_id',$work->id)->where('aro_group_id', $aro_group->id)->find_all();
|
||
|
||
$total_votes[$i] = count($votes);
|
||
$sums[$i] = 0;
|
||
$agrees[$i] = 0;
|
||
$user_vote = NULL;
|
||
|
||
foreach ($votes as $vote)
|
||
{
|
||
if ($this->session->get('user_id')==$vote->user_id)
|
||
$user_vote = $vote->vote;
|
||
|
||
$sums[$i] += $vote->vote;
|
||
|
||
if ($vote->vote == 0)
|
||
{
|
||
$total_votes[$i]--;
|
||
continue;
|
||
}
|
||
|
||
if ($vote->vote == 1)
|
||
{
|
||
$agrees[$i]++;
|
||
continue;
|
||
}
|
||
}
|
||
|
||
// create grid
|
||
$vote_grids[$i] = new Grid(url_lang::base().'works/show/'.$work->id, '', array(
|
||
//'separator' => '',
|
||
'use_paginator' => false,
|
||
'use_selector' => false,
|
||
'selector_increace' => 200, // increace
|
||
'selector_min' => 200,// minimum where selector start
|
||
'selector_max_multiplier' => 10,
|
||
'uri_segment' => 'page', // pass a string as uri_segment to trigger former 'label' functionality
|
||
'style' => 'classic',
|
||
));
|
||
|
||
if ($user_aro_group && $user_aro_group->id == $aro_group->id && !$work->job_report_id && !$user_vote)
|
||
$vote_grids[$i]->add_new_button(url_lang::base().'votes/add_to_work/'.$work->id, url_lang::lang('texts.Add vote'));
|
||
|
||
|
||
$vote_grids[$i]->field('id')->label('ID');
|
||
$vote_grids[$i]->callback_field('user_id')->label(url_lang::lang('texts.User'))->callback('Works_Controller::user_name');
|
||
$vote_grids[$i]->callback_field('vote')->label(url_lang::lang('texts.Vote'))->callback('Works_Controller::vote');
|
||
$vote_grids[$i]->callback_field('comment')->label(url_lang::lang('texts.Comment'))->callback('Works_Controller::comment_field');
|
||
$vote_grids[$i]->callback_field('time')->label(url_lang::lang('texts.Time'))->callback('Works_Controller::time_field');
|
||
$vote_grids[$i]->callback_field('id')->label(url_lang::lang('texts.Edit'))->callback('Works_Controller::edit_field');
|
||
$vote_grids[$i]->callback_field('id')->label(url_lang::lang('texts.Delete'))->callback('Works_Controller::delete_field');
|
||
|
||
$vote_grids[$i]->datasource($votes);
|
||
|
||
$percents[$i] = ($total_votes[$i]) ? round($agrees[$i] / $total_votes[$i] * 100, 1) : 0;
|
||
$i++;
|
||
}
|
||
|
||
$links = array();
|
||
|
||
$state_text = url_lang::lang('texts.Pending');
|
||
|
||
if (!$work->job_report_id)
|
||
{
|
||
//$links[] = html::anchor(url_lang::base().'works/pending', url_lang::lang('texts.of all pending works'));
|
||
//$links[] = html::anchor(url_lang::base().'works/show_by_user/'.$work->user_id, url_lang::lang('texts.of all users works'));
|
||
if ($this->acl_check_edit('Users_Controller','work',$work->user->member_id) && $work->state == 0)
|
||
$links[] = html::anchor(url_lang::base().'works/edit/'.$work->id,url_lang::lang('texts.Edit'));
|
||
if ($this->acl_check_delete('Users_Controller','work',$work->user->member_id) && $work->state == 0)
|
||
$links[] = html::anchor(url_lang::base().'works/delete/'.$work->id,url_lang::lang('texts.Delete'), array('class' => 'delete_link'));
|
||
$links = implode(" | ", $links);
|
||
}
|
||
else
|
||
{
|
||
$links = html::anchor(url_lang::base().'work_reports/show/'.$work->job_report_id, url_lang::lang('texts.Back to the work report'));
|
||
}
|
||
|
||
if ($this->acl_check_view('Comments_Controller', 'works', $work->user->member_id))
|
||
{
|
||
$comment_model = new Comment_Model();
|
||
$comments = $comment_model->get_all_comments_by_comments_thread($work->comments_thread_id);
|
||
|
||
$comments_grid = new Grid(url_lang::base().'members', null,array(
|
||
'separator' => '<br /><br />',
|
||
'use_paginator' => false,
|
||
'use_selector' => false,
|
||
));
|
||
|
||
$url = ($work->comments_thread_id) ? url_lang::base().'comments/add/'.$work->comments_thread_id : url_lang::base().'comments_threads/add/job/'.$work->id;
|
||
$comments_grid->add_new_button($url, url_lang::lang('texts.Add comment'));
|
||
|
||
$comments_grid->field('text')->label(url_lang::lang('texts.Text'));
|
||
$comments_grid->callback_field('user_id')->label(url_lang::lang('texts.User'))->callback('callback::user_field');
|
||
$comments_grid->field('datetime')->label(url_lang::lang('texts.Time'));
|
||
$comments_grid->callback_field('user_id')->label(url_lang::lang('texts.Edit'))->callback('callback::edit_field','comments');
|
||
$comments_grid->callback_field('user_id')->label(url_lang::lang('texts.Delete'))->callback('callback::delete_field','comments');
|
||
$comments_grid->datasource($comments);
|
||
}
|
||
|
||
$view = new View('main');
|
||
$view->title = url_lang::lang('texts.Show work');
|
||
$view->breadcrumbs = implode(' » ', $this->breadcrumbs);
|
||
$view->content = new View('works_show');
|
||
$view->content->work = $work;
|
||
$view->content->links = $links;
|
||
$view->content->vote_groups = $vote_groups;
|
||
$view->content->vote_grids = $vote_grids;
|
||
$view->content->total_votes = $total_votes;
|
||
$view->content->agrees = $agrees;
|
||
$view->content->sums = $sums;
|
||
$view->content->state_text = $state_text;
|
||
$view->content->percents = $percents;
|
||
if ($this->acl_check_view('Comments_Controller', 'works', $work->user->member_id))
|
||
$view->content->comments_grid = $comments_grid;
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
/**
|
||
* @author Michal Kliment
|
||
* Private function to show closed work
|
||
* @param object $work
|
||
*/
|
||
private function show_closed($work = NULL)
|
||
{
|
||
// bad parameter
|
||
if (!$work)
|
||
Controller::warning(PARAMETER);
|
||
|
||
$transfer = new Transfer_Model($work->transfer_id);
|
||
|
||
$vote_model = new Vote_Model();
|
||
|
||
$aro_group_model = new Aro_group_Model();
|
||
$aro_groups = $aro_group_model->get_aro_groups_by_fk_id($work->id, Vote_Model::$work);
|
||
|
||
//$user_aro_group = $approval_template_item_model->get_aro_group_by_approval_template_id_and_user_id($work->approval_template_id, $this->session->get('user_id'), $work->suggest_amount);
|
||
|
||
$i = 0;
|
||
$vote_groups = array();
|
||
$vote_grids = array();
|
||
$total_votes = array();
|
||
$sums = array();
|
||
$agrees = array();
|
||
$percents = array();
|
||
//$user_vote = NULL;
|
||
|
||
foreach ($aro_groups as $aro_group)
|
||
{
|
||
$vote_groups[$i] = $aro_group->name;
|
||
|
||
$votes = $vote_model->select('votes.id', 'votes.user_id', 'CONCAT(users.name,\' \',users.surname) as uname', 'vote', 'votes.comment', 'time')->join('users','users.id', 'votes.user_id')->where('votes.type',Vote_Model::$work)->where('fk_id',$work->id)->where('aro_group_id', $aro_group->id)->find_all();
|
||
|
||
$total_votes[$i] = count($votes);
|
||
$sums[$i] = 0;
|
||
$agrees[$i] = 0;
|
||
|
||
foreach ($votes as $vote)
|
||
{
|
||
$sums[$i] += $vote->vote;
|
||
|
||
if ($vote->vote == 0)
|
||
{
|
||
$total_votes[$i]--;
|
||
continue;
|
||
}
|
||
|
||
if ($vote->vote == 1)
|
||
{
|
||
$agrees[$i]++;
|
||
continue;
|
||
}
|
||
}
|
||
|
||
// create grid
|
||
$vote_grids[$i] = new Grid(url_lang::base().'works/show/'.$work->id, '', array(
|
||
//'separator' => '',
|
||
'use_paginator' => false,
|
||
'use_selector' => false,
|
||
'selector_increace' => 200, // increace
|
||
'selector_min' => 200,// minimum where selector start
|
||
'selector_max_multiplier' => 10,
|
||
'uri_segment' => 'page', // pass a string as uri_segment to trigger former 'label' functionality
|
||
'style' => 'classic',
|
||
));
|
||
|
||
$vote_grids[$i]->field('id')->label('ID');
|
||
$vote_grids[$i]->callback_field('user_id')->label(url_lang::lang('texts.User'))->callback('Works_Controller::user_name');
|
||
$vote_grids[$i]->callback_field('vote')->label(url_lang::lang('texts.Vote'))->callback('Works_Controller::vote');
|
||
$vote_grids[$i]->callback_field('comment')->label(url_lang::lang('texts.Comment'))->callback('Works_Controller::comment_field');
|
||
$vote_grids[$i]->callback_field('time')->label(url_lang::lang('texts.Time'))->callback('Works_Controller::time_field');
|
||
|
||
$vote_grids[$i]->datasource($votes);
|
||
|
||
$percents[$i] = ($total_votes[$i]) ? round($agrees[$i] / $total_votes[$i] * 100, 1) : 0;
|
||
$i++;
|
||
}
|
||
|
||
$links = array();
|
||
|
||
switch ($work->state)
|
||
{
|
||
case 2:
|
||
|
||
foreach ($sums as $i => $sum)
|
||
{
|
||
if ($sum <= 0)
|
||
{
|
||
$state_text = '<span style="color: red">'.url_lang::lang('texts.Rejected').' ('.url_lang::lang('texts.'.$vote_groups[$i]).')</span>';
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (!$work->job_report_id)
|
||
//$links[] = html::anchor(url_lang::base().'works/rejected', url_lang::lang('texts.of all rejected works'));
|
||
|
||
break;
|
||
case 3:
|
||
|
||
$state_text = '<span style="color: green">'.url_lang::lang('texts.Approved').'</span>';
|
||
|
||
//if (!$work->job_report_id)
|
||
//$links[] = html::anchor(url_lang::base().'works/approved', url_lang::lang('texts.of all approved works'));
|
||
|
||
break;
|
||
}
|
||
|
||
if (!$work->job_report_id)
|
||
{
|
||
//$links[] = html::anchor(url_lang::base().'works/show_by_user/'.$work->user_id, url_lang::lang('texts.of all users works'));
|
||
if ($this->acl_check_edit('Users_Controller','work',$work->user->member_id) && $work->state == 0)
|
||
$links[] = html::anchor(url_lang::base().'works/edit/'.$work->id,url_lang::lang('texts.Edit'));
|
||
$links =implode(" | ", $links);
|
||
}
|
||
else
|
||
{
|
||
$links = html::anchor(url_lang::base().'work_reports/show/'.$work->job_report_id, url_lang::lang('texts.Back to the work report'));
|
||
}
|
||
|
||
$view = new View('main');
|
||
$view->title = url_lang::lang('texts.Show work');
|
||
$view->breadcrumbs = implode(' » ', $this->breadcrumbs);
|
||
$view->content = new View('works_show');
|
||
$view->content->work = $work;
|
||
$view->content->transfer = $transfer;
|
||
$view->content->links = $links;
|
||
$view->content->vote_groups = $vote_groups;
|
||
$view->content->vote_grids = $vote_grids;
|
||
$view->content->total_votes = $total_votes;
|
||
$view->content->agrees = $agrees;
|
||
$view->content->sums = $sums;
|
||
$view->content->state_text = $state_text;
|
||
$view->content->percents = $percents;
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* @author Michal Kliment
|
||
* Adds new work to some user
|
||
*/
|
||
function add($user_id = null)
|
||
{
|
||
$breadcrumbs = array();
|
||
if(isset($user_id))
|
||
{
|
||
$user = new User_Model($user_id);
|
||
if ($user->id == 0)
|
||
Controller::error(RECORD);
|
||
// access control
|
||
if (!$this->acl_check_new('Users_Controller','work', $user->member_id))
|
||
Controller::error(ACCESS);
|
||
$selected = $user->id;
|
||
$arr_users[$user->id] = $user->surname.' '.$user->name.' - '.$user->login;
|
||
$breadcrumbs[] = ($this->acl_check_view('Members_Controller','members')) ? html::anchor (url_lang::base().'members/show_all', url_lang::lang('texts.Members')) : url_lang::lang('texts.Members');
|
||
$breadcrumbs[] = ($this->acl_check_view('Members_Controller','members', $user->member->id)) ? html::anchor(url_lang::base().'members/show/'.$user->member->id, "ID ".$user->member->id." - ".$user->member->name) : "ID ".$user->member->id." - ".$user->member->name;
|
||
$breadcrumbs[] = ($this->acl_check_view('Users_Controller', 'users',$user->member_id)) ? html::anchor (url_lang::base().'users/show_by_member/'.$user->member_id, url_lang::lang('texts.Users')) : url_lang::lang('texts.Users');
|
||
$breadcrumbs[] = ($this->acl_check_view('Users_Controller', 'users',$user->member_id)) ? html::anchor (url_lang::base().'users/show/'.$user->id, "$user->name $user->surname ($user->login)") : "$user->name $user->surname ($user->login)";
|
||
$breadcrumbs[] = ($this->acl_check_view('Users_Controller', 'work',$user->member_id)) ? html::anchor (url_lang::base().'works/show_by_user/'.$user->id, url_lang::lang('texts.Works')) : url_lang::lang('texts.Works');
|
||
}
|
||
else
|
||
{
|
||
// access control
|
||
if (!$this->acl_check_new('Users_Controller', 'work'))
|
||
Controller::error(ACCESS);
|
||
$user_model = new User_Model();
|
||
$users = $user_model->select('id','name','surname','login')->orderby('id')->find_all();
|
||
$selected = NULL;
|
||
foreach ($users as $user)
|
||
{
|
||
$arr_users[$user->id] = $user->surname.' '.$user->name.' - '.$user->login;
|
||
}
|
||
asort($arr_users, SORT_LOCALE_STRING);
|
||
$arr_users = arr::merge(array(NULL => '----- '.url_lang::lang('texts.select user').' -----'), $arr_users);
|
||
$breadcrumbs[] = ($this->acl_check_view('Users_Controller','work')) ? html::anchor (url_lang::base().'works/pending', url_lang::lang('texts.Pending works')) : url_lang::lang('texts.Pending works');
|
||
}
|
||
|
||
$breadcrumbs[] = url_lang::lang('texts.Add');
|
||
|
||
if ($this->acl_check_view('approval','templates'))
|
||
{
|
||
$approval_template_model = new Approval_template_Model();
|
||
$approval_templates = $approval_template_model->find_all();
|
||
|
||
// transforms array of objects to classic array
|
||
$arr_approval_templates = arr::from_objects($approval_templates);
|
||
$arr_approval_templates = arr::merge(array(NULL => '----- '.url_lang::lang('texts.select approval template').' -----'),$arr_approval_templates);
|
||
}
|
||
|
||
// form
|
||
$form = new Forge(url_lang::base().'works/add'.(isset($user_id)?'/'.$user_id:''), '', 'POST', array('id' => 'article_form'));
|
||
$form->set_attr('class', 'form_class')->set_attr('method', 'post');
|
||
|
||
$form->group('')->label(url_lang::lang('texts.Basic information'));
|
||
$form->dropdown('user_id')->label(url_lang::lang('texts.User').':')->options($arr_users)->rules('required')->selected($selected);
|
||
$form->textarea('description')->label(url_lang::lang('texts.Description').':')->rules('required|length[0,65535]');
|
||
$form->date('date')->label(url_lang::lang('texts.Date').':')->years(date('Y')-10, date('Y'))->rules('required');
|
||
$form->input('hours')->label(url_lang::lang('texts.Hours').':')->rules('required|length[0,250]|valid_numeric');
|
||
$form->input('km')->label(url_lang::lang('texts.Km').':')->rules('length[0,250]|valid_numeric');
|
||
$form->input('suggest_amount')->label(url_lang::lang('texts.Suggest amount').':')->rules('required|valid_numeric');
|
||
|
||
if ($this->acl_check_view('approval','templates'))
|
||
{
|
||
$form->group('')->label(url_lang::lang('texts.Advanced information'));
|
||
$form->dropdown('approval_template_id')->label(url_lang::lang('texts.Approval template').':')->rules('required')->options($arr_approval_templates)->selected($this->settings->get('default_work_approval_template'));
|
||
}
|
||
|
||
$form->submit('submit')->value(url_lang::lang('texts.Save'));
|
||
special::required_forge_style($form, ' *', 'required');
|
||
|
||
if (isset($user_id))
|
||
{
|
||
$link_back = url_lang::base().'works/show_by_user/'.$user_id;
|
||
$anchor = html::anchor($link_back, url_lang::lang('texts.Back to list of all users works'));
|
||
}
|
||
else
|
||
{
|
||
$link_back = url_lang::base().'works/pending';
|
||
$anchor = html::anchor($link_back, url_lang::lang('texts.Back to list of all pending works'));
|
||
}
|
||
|
||
if ($form->validate())
|
||
{
|
||
$form_data = $form->as_array();
|
||
|
||
// creates new work
|
||
$work = new Job_Model();
|
||
$work->user_id = $form_data['user_id'];
|
||
$work->added_by_id = $this->session->get('user_id');
|
||
$work->description = $form_data['description'];
|
||
$work->suggest_amount = $form_data['suggest_amount'];
|
||
$work->date = date('Y-m-d', $form_data['date']);
|
||
$work->create_date = date('Y-m-d H:i:s');
|
||
$work->hours = $form_data['hours'];
|
||
$work->km = $form_data['km'];
|
||
//$work->locked = 0;
|
||
|
||
if (isset($form_data['approval_template_id']) && $form_data['approval_template_id'])
|
||
$work->approval_template_id = $form_data['approval_template_id'];
|
||
else
|
||
$work->approval_template_id = $this->settings->get('default_work_approval_template');
|
||
|
||
$saved = $work->save();
|
||
|
||
// set up state of approval template
|
||
$approval_template = new Approval_template_Model($work->approval_template_id);
|
||
$approval_template->state = $approval_template->get_state($approval_template->id);
|
||
$saved = $saved && $approval_template->save();
|
||
|
||
// success
|
||
if ($saved)
|
||
{
|
||
$receivers = array();
|
||
|
||
$mail_message = new Mail_message_Model();
|
||
$user = new User_Model();
|
||
|
||
// work has been added by another user, sends message to user
|
||
if ($work->user_id != $this->session->get('user_id'))
|
||
{
|
||
$user->clear();
|
||
$user->where('id', $this->session->get('user_id'))->find();
|
||
|
||
$receivers[] = $work->user_id;
|
||
|
||
$mail_message->clear();
|
||
$mail_message->from_id = 1;
|
||
$mail_message->to_id = $form_data['user_id'];
|
||
$mail_message->subject = mail_message::format('your_work_add_subject');
|
||
$mail_message->body = mail_message::format('your_work_add', array($user->name.' '.$user->surname, url_lang::base().'works/show/'.$work->id));
|
||
$mail_message->time = date('Y-m-d H:i:s');
|
||
$mail_message->from_deleted = 1;
|
||
$mail_message->save();
|
||
}
|
||
|
||
// finds all aro ids assigned to vote about this work
|
||
$approval_template_item_model = new Approval_template_item_Model();
|
||
$aro_ids = $approval_template_item_model->get_aro_ids_by_approval_template_id($work->approval_template_id, $work->suggest_amount);
|
||
|
||
// count of aro ids is not null
|
||
if (count($aro_ids))
|
||
{
|
||
// finds user to whom belongs work
|
||
$user->clear();
|
||
$user->where('id', $work->user_id)->find();
|
||
|
||
$subject = mail_message::format('work_add_subject');
|
||
$body = mail_message::format('work_add', array($user->name.' '.$user->surname,url_lang::base().'works/show/'.$work->id));
|
||
|
||
foreach ($aro_ids as $aro)
|
||
{
|
||
// is not necessary send message to user who added work
|
||
if ($aro->id != $this->session->get('user_id'))
|
||
{
|
||
if (!in_array($aro->id, $receivers))
|
||
{
|
||
$receivers[] = $aro->id;
|
||
|
||
// sends message
|
||
$mail_message->clear();
|
||
$mail_message->from_id = 1;
|
||
$mail_message->to_id = $aro->id;
|
||
$mail_message->subject = $subject;
|
||
$mail_message->body = $body;
|
||
$mail_message->time = date('Y-m-d H:i:s');
|
||
$mail_message->from_deleted = 1;
|
||
$mail_message->save();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
$this->session->set_flash('message', url_lang::lang('texts.Work has been successfully added').'.');
|
||
url::redirect(url_lang::base().'works/show/'.$work->id);
|
||
}
|
||
url::redirect($link_back);
|
||
}
|
||
|
||
$headline = url_lang::lang('texts.Add new work');
|
||
$view = new View('main');
|
||
$view->title = $headline;
|
||
$view->breadcrumbs = implode(' » ', $breadcrumbs);
|
||
$view->content = new View('form');
|
||
$view->content->headline = $headline;
|
||
//$view->content->link_back = $anchor;
|
||
$view->content->link_back = '';
|
||
$view->content->form = $form->html();
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
/**
|
||
* @author Michal Kliment
|
||
* Edits work
|
||
* @param $work_id id of work to edit
|
||
*/
|
||
function edit($work_id = NULL)
|
||
{
|
||
// bad parameter
|
||
if (!$work_id || !is_numeric($work_id))
|
||
Controller::warning(PARAMETER);
|
||
|
||
$work = new Job_Model($work_id);
|
||
|
||
// record doesn't exist
|
||
if (!$work->id)
|
||
Controller::error(RECORD);
|
||
|
||
// access control
|
||
if (!$this->acl_check_edit('Users_Controller','work',$work->user->member_id))
|
||
Controller::error(ACCESS);
|
||
|
||
// work is locked
|
||
if ($work->state > 0)
|
||
{
|
||
$this->session->set_flash('message', url_lang::lang('texts.It is not possible edit locked work.'));
|
||
url::redirect(url_lang::base().'works/show/'.$work->id);
|
||
}
|
||
|
||
$user_model = new User_Model();
|
||
|
||
// check if user has access rights to edit work of all users
|
||
if ($this->acl_check_edit('Users_Controller','work'))
|
||
{
|
||
// gets all user's names
|
||
$users = $user_model->get_his_users_names($work->user_id);
|
||
}
|
||
else
|
||
{
|
||
$users = $user_model->get_his_username($work->user_id);
|
||
}
|
||
|
||
// transforms array of objects to classic array
|
||
$arr_users = arr::from_objects($users, 'username');
|
||
|
||
if ($this->acl_check_view('approval','templates'))
|
||
{
|
||
$approval_template_model = new Approval_template_Model();
|
||
$approval_templates = $approval_template_model->find_all();
|
||
|
||
// transforms array of objects to classic array
|
||
$arr_approval_templates = arr::from_objects($approval_templates);
|
||
$arr_approval_templates = arr::merge(array(NULL => '----- '.url_lang::lang('texts.select approval template').' -----'),$arr_approval_templates);
|
||
}
|
||
|
||
// creates form
|
||
$this->form = new Forge(url_lang::base().'works/edit/'.$work_id, '', 'POST', array('id' => 'article_form'));
|
||
$this->form->set_attr('class', 'form_class')->set_attr('method', 'post');
|
||
|
||
$this->form->group('')->label(url_lang::lang('texts.Basic information'));
|
||
$this->form->dropdown('user_id')->label(url_lang::lang('texts.User'))->options($arr_users)->rules('required')->selected($work->user_id);
|
||
$this->form->textarea('description')->label(url_lang::lang('texts.Description').':')->rules('required|length[0,65535]')->value($work->description);
|
||
$this->form->date('date')->label(url_lang::lang('texts.Date').':')->years(date('Y')-10, date('Y'))->rules('required')->value(strtotime($work->date));
|
||
$this->form->input('hours')->label(url_lang::lang('texts.Hours').':')->rules('required|length[0,250]|valid_numeric')->value($work->hours);
|
||
$this->form->input('km')->label(url_lang::lang('texts.Km').':')->rules('length[0,250]|valid_numeric')->value($work->km);
|
||
$this->form->input('suggest_amount')->label(url_lang::lang('texts.Suggest amount').':')->rules('required|valid_numeric')->value($work->suggest_amount);
|
||
|
||
if ($this->acl_check_view('approval','templates'))
|
||
{
|
||
$this->form->group('')->label(url_lang::lang('texts.Advanced information'));
|
||
$this->form->dropdown('approval_template_id')->label(url_lang::lang('texts.Approval template').':')->rules('required')->options($arr_approval_templates)->selected($work->approval_template_id);
|
||
}
|
||
|
||
$this->form->submit('submit')->value(url_lang::lang('texts.Save'));
|
||
special::required_forge_style($this->form, ' *', 'required');
|
||
|
||
// form is validate
|
||
if ($this->form->validate())
|
||
{
|
||
$form_data = $this->form->as_array();
|
||
|
||
// creates new work
|
||
$work = new Job_Model($work_id);
|
||
$work->user_id = $form_data['user_id'];
|
||
$work->added_by_id = $this->session->get('user_id');
|
||
$work->description = $form_data['description'];
|
||
$work->date = date('Y-m-d', $form_data['date']);
|
||
$work->hours = $form_data['hours'];
|
||
$work->km = $form_data['km'];
|
||
$work->suggest_amount = $form_data['suggest_amount'];
|
||
|
||
$old_approval_template_id = $work->approval_template_id;
|
||
|
||
if (isset($form_data['approval_template_id']) && $form_data['approval_template_id'])
|
||
$work->approval_template_id = $form_data['approval_template_id'];
|
||
else
|
||
$work->approval_template_id = $this->settings->get('default_work_approval_template');
|
||
|
||
$saved = $work->save();
|
||
|
||
// set up state of approval template
|
||
$approval_template = new Approval_template_Model($work->approval_template_id);
|
||
$approval_template->state = $approval_template->get_state($approval_template->id);
|
||
$saved = $saved && $approval_template->save();
|
||
|
||
if ($work->approval_template_id != $old_approval_template_id)
|
||
{
|
||
// set up state of old approval template
|
||
$approval_template = new Approval_template_Model($old_approval_template_id);
|
||
$approval_template->state = $approval_template->get_state($approval_template->id);
|
||
$saved = $saved && $approval_template->save();
|
||
}
|
||
|
||
// success
|
||
if ($saved)
|
||
{
|
||
$receivers = array();
|
||
|
||
$mail_message = new Mail_message_Model();
|
||
$user = new User_Model();
|
||
|
||
// work has been updated by another user, sends message to user
|
||
if ($work->user_id != $this->session->get('user_id'))
|
||
{
|
||
$user->clear();
|
||
$user->where('id', $this->session->get('user_id'))->find();
|
||
|
||
$receivers[] = $work->user_id;
|
||
|
||
$mail_message->clear();
|
||
$mail_message->from_id = 1;
|
||
$mail_message->to_id = $form_data['user_id'];
|
||
$mail_message->subject = mail_message::format('your_work_update_subject');
|
||
$mail_message->body = mail_message::format('your_work_update', array($user->name.' '.$user->surname, url_lang::base().'works/show/'.$work->id));
|
||
$mail_message->time = date('Y-m-d H:i:s');
|
||
$mail_message->from_deleted = 1;
|
||
$mail_message->save();
|
||
}
|
||
|
||
// finds all aro ids assigned to vote about this work
|
||
$approval_template_item_model = new Approval_template_item_Model();
|
||
$aro_ids = $approval_template_item_model->get_aro_ids_by_approval_template_id($work->approval_template_id, $work->suggest_amount);
|
||
|
||
// count of aro ids is not null
|
||
if (count($aro_ids))
|
||
{
|
||
// finds user to whom belongs work
|
||
$user->clear();
|
||
$user->where('id', $work->user_id)->find();
|
||
|
||
$subject = mail_message::format('work_update_subject');
|
||
$body = mail_message::format('work_update', array($user->name.' '.$user->surname, url_lang::base().'works/show/'.$work->id));
|
||
|
||
foreach ($aro_ids as $aro)
|
||
{
|
||
// is not necessary send message to user who added work
|
||
if ($aro->id != $this->session->get('user_id'))
|
||
{
|
||
if (!in_array($aro->id, $receivers))
|
||
{
|
||
$receivers[] = $aro->id;
|
||
|
||
// sends message
|
||
$mail_message->clear();
|
||
$mail_message->from_id = 1;
|
||
$mail_message->to_id = $aro->id;
|
||
$mail_message->subject = $subject;
|
||
$mail_message->body = $body;
|
||
$mail_message->time = date('Y-m-d H:i:s');
|
||
$mail_message->from_deleted = 1;
|
||
$mail_message->save();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
$this->session->set_flash('message', url_lang::lang('texts.Work has been successfully updated').'.');
|
||
}
|
||
|
||
url::redirect(url_lang::base().'works/show/'.$work->id);
|
||
}
|
||
|
||
$link_back = html::anchor(url_lang::base().'works/show/'.$work->id, url_lang::lang('texts.Back to the work'));
|
||
|
||
$view = new View('main');
|
||
$view->title = url_lang::lang('texts.Edit the work');
|
||
$view->content = new View('form');
|
||
$view->content->headline = url_lang::lang('texts.Edit the work');
|
||
$view->content->link_back = $link_back;
|
||
$view->content->form = $this->form->html();
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
/**
|
||
* @author Michal Kliment
|
||
* Function to delete work
|
||
* @param number $work_id
|
||
*/
|
||
public function delete($work_id = NULL)
|
||
{
|
||
// bad parameter
|
||
if (!$work_id || !is_numeric($work_id))
|
||
Controller::warning(PARAMETER);
|
||
|
||
$work = new Job_Model($work_id);
|
||
|
||
// record doesn't exist
|
||
if (!$work->id)
|
||
Controller::error(RECORD);
|
||
|
||
// access control
|
||
if (!$this->acl_check_delete('Users_Controller', 'work', $work->user->member_id))
|
||
Controller::error(ACCESS);
|
||
|
||
// work is locked
|
||
if ($work->state > 0)
|
||
{
|
||
$this->session->set_flash('message', url_lang::lang('texts.It is not possible delete locked work.'));
|
||
url::redirect(url_lang::base().'works/show/'.$work->id);
|
||
}
|
||
|
||
$approval_template_id = $work->approval_template_id;
|
||
$work_user_id= $work->user_id;
|
||
$work_description = $work->description;
|
||
$work_suggest_amount = $work->suggest_amount;
|
||
$saved = $work->delete();
|
||
|
||
// set up state of approval template
|
||
$approval_template = new Approval_template_Model($approval_template_id);
|
||
$approval_template->state = $approval_template->get_state($approval_template->id);
|
||
$saved = $saved && $approval_template->save();
|
||
|
||
if ($saved)
|
||
{
|
||
$receivers = array();
|
||
|
||
$mail_message = new Mail_message_Model();
|
||
$user = new User_Model();
|
||
|
||
// work has been updated by another user, sends message to user
|
||
if ($work_user_id != $this->session->get('user_id'))
|
||
{
|
||
$user->clear();
|
||
$user->where('id',$this->session->get('user_id'))->find();
|
||
|
||
$receivers[] = $work_user_id;
|
||
|
||
$mail_message = new Mail_message_Model();
|
||
$mail_message->from_id = 1;
|
||
$mail_message->to_id = $work_user_id;
|
||
$mail_message->subject = mail_message::format('your_work_delete_subject');
|
||
$mail_message->body = mail_message::format('your_work_delete', array($work_description, $user->name.' '.$user->surname));
|
||
$mail_message->time = date('Y-m-d H:i:s');
|
||
$mail_message->from_deleted = 1;
|
||
$mail_message->save();
|
||
}
|
||
|
||
// finds all aro ids assigned to vote about this work
|
||
$approval_template_item_model = new Approval_template_item_Model();
|
||
$aro_ids = $approval_template_item_model->get_aro_ids_by_approval_template_id($approval_template_id, $work_suggest_amount);
|
||
|
||
// count of aro ids is not null
|
||
if (count($aro_ids))
|
||
{
|
||
// finds user to whom belongs work
|
||
$user->clear();
|
||
$user->where('id', $work_user_id)->find();
|
||
|
||
$subject = mail_message::format('work_delete_subject');
|
||
$body = mail_message::format('work_delete', array($user->name.' '.$user->surname, $work_description));
|
||
|
||
foreach ($aro_ids as $aro)
|
||
{
|
||
// is not necessary send message to user who added work
|
||
if ($aro->id != $this->session->get('user_id'))
|
||
{
|
||
if (!in_array($aro->id, $receivers))
|
||
{
|
||
$receivers[] = $aro->id;
|
||
|
||
// sends message
|
||
$mail_message->clear();
|
||
$mail_message->from_id = 1;
|
||
$mail_message->to_id = $aro->id;
|
||
$mail_message->subject = $subject;
|
||
$mail_message->body = $body;
|
||
$mail_message->time = date('Y-m-d H:i:s');
|
||
$mail_message->from_deleted = 1;
|
||
$mail_message->save();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
$this->session->set_flash('message', url_lang::lang('texts.Work has been successfully deleted').'.');
|
||
}
|
||
url::redirect(url_lang::base().'works/show_by_user/'.$work_user_id);
|
||
}
|
||
|
||
/** CALLBACK FUNCTIONS **/
|
||
|
||
/**
|
||
* @author Michal Kliment
|
Také k dispozici: Unified diff
Nova vetev pro implementaci vyhledavani a filtrovani, implementace http://vyuka.slfree.net/mod/forum/discuss.php?d=1394 a http://vyuka.slfree.net/mod/forum/discuss.php?d=1646