Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 982

Přidáno uživatelem Michal Kliment před více než 13 roky(ů)

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

Zobrazit rozdíly:

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
... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.

Také k dispozici: Unified diff