public function action_load() { $id = $this->request->param('id'); $items = Enums::get_values($id); header('Content-type: application/json'); die(json_encode(array('multi' => Enums::is_multi($id) ? true : false, 'items' => array_values($items)))); }
public function action_index() { define('JOB_STATUS_COLUMN', 'data.44'); if (!rand(0, 1000)) { Database_Mongo::collection('search')->remove(array('expires' => array('$lt' => time()))); } if ($_POST) { $data = array('request' => $_POST, 'expires' => time() + 3600); Database_Mongo::collection('search')->insert($data); $search_id = strval($data['_id']); Session::instance()->set('search-settings', $search_id); header('Content-type: application/json'); die(json_encode(array('success' => true, 'id' => $search_id))); } elseif (!$_GET && Session::instance()->get('search-settings')) { $params = Session::instance()->get('search-settings'); if (!is_array($params)) { $params = json_decode($params); } if ($params !== NULL) { $data = array('request' => $params, 'expires' => time() + 3600); Database_Mongo::collection('search')->insert($data); $search_id = strval($data['_id']); Session::instance()->set('search-settings', $search_id); } else { $search_id = Session::instance()->get('search-settings'); } if ($search_id) { $this->redirect('search?id=' . $search_id); } } elseif (isset($_GET['clear'])) { Session::instance()->delete('search-settings'); $_GET = array(); } elseif (isset($_GET['id'])) { $data = Database_Mongo::collection('search')->findOne(array('_id' => new MongoId($_GET['id']))); if ($data) { Session::instance()->set('search-settings', $_GET['id']); $_GET = $data['request']; } else { Session::instance()->delete('search-settings'); } } $actions = array('contain', 'does not contain', '=', '<', '<=', '>', '>=', '<>', 'empty', 'not empty'); $actions_mongo = array('=' => '$eq', '<' => '$lt', '<=' => '$lte', '>' => '$gt', '>=' => '$gte', '<>' => '$ne'); $columns = Columns::get_visible(); $reports = Columns::get_static(); $regs = DB::select('region_id')->from('user_regions')->where('user_id', '=', User::current('id'))->execute()->as_array('region_id', 'region_id'); $regions = DB::select('id', 'name')->from('regions'); if ($regs) { $regions->where('id', 'IN', $regs); } $regions = $regions->execute()->as_array('id', 'name'); $query = array(); $list_query = array(); if (Arr::get($_GET, 'submissions')) { $result = Database_Mongo::collection('submissions')->aggregate(array(array('$match' => array('active' => 1)), array('$group' => array('_id' => '$job_key')))); $result = array_column($result['result'], '_id'); $query['_id'] = array('$in' => $result); } if (Group::current('show_all_jobs')) { if (Arr::get($_GET, 'company')) { $companies = explode(',', $_GET['company']); if (count($companies) > 1) { $companies = array('$in' => array_map("intval", $companies)); } else { $companies = intval($_GET['company']); } if (Arr::get($_GET, 'ex')) { $list_query['$or'] = $query['$or'] = array(array('companies' => $companies), array('ex' => $companies)); } else { $list_query['companies'] = $query['companies'] = $companies; } } } else { if (Arr::get($_GET, 'status', -1) == 0) { $list_query['ex'] = $query['ex'] = intval(User::current('company_id')); } else { $list_query['companies'] = $query['companies'] = intval(User::current('company_id')); } } if (Group::current('allow_assign')) { foreach (Columns::$settings as $key => $value) { if (isset($_GET['settings'][$key])) { if ($_GET['settings'][$key]) { $query[$key] = array('$exists' => 1); } else { $query[$key] = array('$exists' => 0); } } } } if (Arr::get($_GET, 'ticket')) { $tickets = explode(',', $_GET['ticket']); $q = array(); foreach ($tickets as $ticket) { $ticket = preg_replace('/[^a-z0-9]/i', '', strval($ticket)); if (!$ticket) { continue; } if (preg_match('/^T1W[0-9]{12}$/', $ticket)) { $q[] = $ticket; } else { $q[] = new MongoRegex('/.*' . $ticket . '.*/i'); } } if (count($q) > 1) { $query['_id'] = array('$in' => $q); } elseif ($q) { $query['_id'] = $q[0]; } } if (Arr::get($_GET, 'start')) { $query['last_update']['$gt'] = Columns::parse($_GET['start'], 'date'); } if (Arr::get($_GET, 'end')) { $query['last_update']['$lt'] = Columns::parse($_GET['end'], 'date'); } if (Arr::get($_GET, 'submit-start')) { $query['last_submit']['$gt'] = Columns::parse($_GET['submit-start'], 'date'); } if (Arr::get($_GET, 'submit-end')) { $query['last_submit']['$lt'] = Columns::parse($_GET['submit-end'], 'date'); } $status = Arr::get($_GET, 'status', Group::current('allow_assign') ? -1 : Enums::STATUS_ALLOC); $_GET['status'] = intval($status); if ($status != -1 && (Group::current('show_all_jobs') || $status)) { $query['status'] = intval($status) ?: array('$exists' => 0); } if (!isset($_GET['region'])) { $_GET['region'] = User::current('default_region'); } if (Arr::get($_GET, 'region') && (!$regs || isset($regs[$_GET['region']]))) { $list_query['region'] = $query['region'] = strval($_GET['region']); } elseif ($regs) { $list_query['region'] = $query['region'] = array('$in' => array_values($regs)); } if (Arr::get($_GET, 'type')) { $query['assigned.' . $_GET['type']] = array('$exists' => 1); } foreach (Arr::get($_GET, 'columns', array()) as $id => $column) { if ($column) { $op = Arr::get($actions, Arr::path($_GET, 'actions.' . $id), 0); $value = Arr::path($_GET, 'values.' . $id, ''); $value = Columns::parse($value, Columns::get_type($column)); if (substr(Columns::get_type($column), 0, 4) == 'enum' && Enums::is_multi(substr(Columns::get_type($column), 5)) && $op == '=' && $value) { $op = 'contain'; } if (Columns::get_type($column) == 'date') { if ($op === 'contain') { $op = '='; } elseif ($op === 'does not contain') { $op = '<>'; } elseif ($op == '<=') { $value += 86399; } if ($op == '=' && date('His', $value) === '000000') { $query['data.' . $column]['$lte'] = $value + 86399; $op = '>='; } } if ($op === 'contain') { $op = '$eq'; $value = new MongoRegex('/.*' . preg_replace('/[^a-z0-9,.+:;!? -]/i', '', $value) . '.*/i'); } elseif ($op === 'does not contain') { $op = '$not'; $value = new MongoRegex('/.*' . preg_replace('/[^a-z0-9,.+:;!? -]/i', '', $value) . '.*/i'); } elseif ($op === 'empty') { $op = '$in'; $value = array(NULL, '', 0); } elseif ($op === 'not empty') { $op = '$nin'; $value = array(NULL, '', 0); } else { $op = Arr::get($actions_mongo, $op, '$eq'); } if ($op == '$eq' && !$value) { $value = NULL; } if (isset($query['data.' . $column]) && $op == '$eq') { if (isset($query['data.' . $column]['$in'])) { $query['data.' . $column]['$in'][] = $value; } elseif (isset($query['data.' . $column]['$eq'])) { $query['data.' . $column] = array('$in' => array($query['data.' . $column]['$eq'], $value)); } else { $query['data.' . $column]['$in'] = array($value); } } else { $query['data.' . $column][$op] = $value; } } } foreach ($query as $key => $ops) { if (substr($key, 0, 5) == 'data.' && count($ops) == 1 && key($ops) == '$eq') { $query[$key] = array_shift($ops); } } $jobs = Database_Mongo::collection('jobs'); $list_values = array(); foreach (Columns::get_search() as $key => $value) { if ($value == 2) { $list_values[$key] = $jobs->distinct('data.' . $key, $query ?: NULL) ?: array(); if (substr(Columns::get_type($key), 0, 4) == 'enum') { $list = array(); foreach ($list_values[$key] as $values) { if ($values) { $values = explode(', ', $values); foreach ($values as $value) { $list[$value] = 1; } } else { $list[''] = 1; } } $list_values[$key] = array_keys($list); } if ($list_values[$key]) { sort($list_values[$key]); } } } Pager::$count = $jobs->count($query); $show = array('region' => 1, 'status' => 1, 'created' => 1, 'last_update' => 1, 'last_submit' => 1, 'assigned' => 1, 'companies' => 1, 'ex' => 1); foreach (Columns::$settings as $key => $value) { $show[$key] = 1; } foreach (Columns::get_search() as $column => $type) { $show['data.' . $column] = 1; } $result = $jobs->find($query, $show); $sort = Arr::get($_GET, 'sort'); if (is_array($sort)) { $save = implode('|', $sort); DB::update('users')->set(array('default_sort' => $save))->where('id', '=', User::current('id'))->execute(); } else { $sort = explode('|', User::current('default_sort') ?: '-update'); $_GET['sort'] = $sort; } $sorting = array(); foreach ($sort as $order) { $dir = substr($order, 0, 1) == '-' ? -1 : 1; $order = substr($order, 1); switch ($order) { case 'id': $order = '_id'; break; case 'update': $order = 'last_update'; break; case 'submit': $order = 'last_submit'; break; case 'status': $order = 'status'; break; case 'data-8': $sorting['address'] = $dir; $order = false; break; default: if (substr($order, 0, 5) == 'data-') { $order = 'data.' . intval(substr($order, 5)); } else { $order = false; } } if ($order) { $sorting[$order] = $dir; } } $result->sort($sorting)->limit(Pager::limit())->skip(Pager::offset()); $tickets = array(); while ($row = $result->next()) { $tickets[] = $row; } $ids = array_column($tickets, '_id'); $types = DB::select('id', 'name')->from('job_types')->execute()->as_array('id', 'name'); $companies = DB::select('id', 'name')->from('companies')->execute()->as_array('id', 'name'); if ($ids) { $attachments = DB::select('job_id', DB::expr('COUNT(*) as cnt'))->from('attachments')->where('job_id', 'IN', $ids)->and_where('uploaded', '>', 0)->and_where('folder', '<>', 'Signatures')->group_by('job_id')->execute()->as_array('job_id', 'cnt'); } else { $attachments = array(); } if (Group::current('allow_assign')) { $result = Database_Mongo::collection('submissions')->aggregate(array(array('$match' => array('job_key' => array('$in' => $ids), 'active' => 1)), array('$group' => array('_id' => '$job_key', 'count' => array('$sum' => 1))))); $submissions = array(); foreach (Arr::get($result, 'result', array()) as $value) { $submissions[$value['_id']] = $value['count']; } } $result = Database_Mongo::collection('forms')->find(array(), array('_id' => 1, 'type' => 1, 'name' => 1)); $forms = array(); foreach ($result as $form) { $forms[$form['type']][strval($form['_id'])] = $form['name']; } $view = View::factory('Jobs/Search')->bind('reports', $reports)->bind('regions', $regions)->bind('columns', $columns)->bind('actions', $actions)->bind('tickets', $tickets)->bind('submissions', $submissions)->bind('attachments', $attachments)->bind('list_values', $list_values)->bind('types', $types)->bind('sort', $sort)->bind('companies', $companies)->bind('forms', $forms)->bind('query', $query); $this->response->body($view); }
public function action_index() { if (!Group::current('allow_assign')) { throw new HTTP_Exception_403('Forbidden'); } header('Content-type: application/json'); $action = $this->request->param('id'); $result = array(); $columns = DB::select('id')->from('job_columns')->where('editable', '=', 1)->execute()->as_array('id', 'id'); switch ($action) { case 'get': $data = array(); $result['columns'] = array(); foreach ($columns as $column) { $value = array('id' => intval($column), 'name' => Columns::get_name($column)); $type = Columns::get_type($column); if (substr($type, 0, 4) == 'enum') { $id = substr($type, 5); $type = Enums::is_multi($id) ? 'multi' : 'list'; $value['values'] = array_values(Enums::get_values($id)); } $value['type'] = $type ?: 'string'; $result['columns'][] = $value; $data[] = 'data.' . $column; } $ids = explode(',', strval(Arr::get($_GET, 'id', ''))); $values = array(); if ($ids) { $query = array('_id' => array('$in' => $ids)); if (!Group::current('show_all_jobs')) { $query['companies'] = intval(User::current('company_id')); } $jobs = Database_Mongo::collection('jobs')->find($query, $data); foreach ($jobs as $job) { foreach ($job['data'] as $key => $value) { $job['data'][$key] = Columns::output($value, Columns::get_type($key), true); } $job['id'] = $job['_id']; unset($job['_id']); $values[] = $job; } } $result['jobs'] = $values; break; case 'set': if (User::current('login') !== Arr::get($_POST, 'username')) { die('Wrong username! Please, check it and submit data again.'); } $data = Arr::get($_POST, 'jobs'); $values = array(); foreach ($data as $job) { $id = strval(Arr::get($job, 'id', '')); foreach (Arr::get($job, 'data') as $key => $value) { if (isset($columns[$key])) { $values[$id][$key] = strval($value); } } } $query = array('_id' => array('$in' => array_keys($values))); if (!Group::current('show_all_jobs')) { $query['companies'] = intval(User::current('company_id')); } $data = array(); foreach ($columns as $column) { $data['data.' . $column] = 1; } $count = 0; $jobs = Database_Mongo::collection('jobs')->find($query, $data); foreach ($jobs as $job) { if (isset($values[$job['_id']])) { $id = $job['_id']; $new = array(); $archive = array(); foreach ($values[$id] as $key => $value) { $value = $value ? Columns::parse($value, Columns::get_type($key)) : ''; $old = Arr::path($job, 'data.' . $key); if (($value || $old) && $value != $old) { if ($value) { $new['$set']['data.' . $key] = $value; } else { $new['$unset']['data.' . $key] = 1; } $archive['data'][$key] = array('old_value' => $old, 'new_value' => $value); } } if ($new) { $new['$set']['last_update'] = time(); Database_Mongo::collection('jobs')->update(array('_id' => $id), $new); $archive['fields'] = array_keys($archive['data']); $archive['job_key'] = $id; $archive['user_id'] = User::current('id'); $archive['update_time'] = time(); $archive['update_type'] = 2; $archive['filename'] = 'MANUAL'; Database_Mongo::collection('archive')->insert($archive); $count++; } } } $result = array('success' => true, 'count' => $count); break; } die(json_encode($result)); }
public static function input($name, $id, $type, $value, $title = '', $required = false) { if (strpos($type, 'enum') !== false) { $enum = substr($type, 5); if (Enums::is_multi($enum)) { $class = array('class' => 'form-control multiselect', 'multiple' => 'multiple'); if ($required) { $class['data-validation'] = 'required'; } return Form::select($name . ($id ? '[' . $id . '][]' : '[]'), Enums::get_values($enum), explode(', ', $value), $class); // $values = explode(', ', $value); // $result = ''; // foreach (Enums::get_values($enum) as $value) // $result .= Form::label(NULL, Form::checkbox($name . ($id ? '[' . $id . ']' : '') . '[]', $value, in_array($value, $values, true)) . $value, array('class' => 'control-label')) . '<br/>'; // return $result; } else { return Form::select($name . ($id ? '[' . $id . ']' : ''), array('' => '') + Enums::get_values($enum, $value), $value, array('class' => 'form-control')); } } else { switch ($type) { case 'bool': return '<input type="hidden" value="0" name="' . $name . ($id ? '[' . $id . ']' : '') . '" /><label class="control-label"><input type="checkbox" name="' . $name . ($id ? '[' . $id . ']' : '') . '" id="' . $name . '-' . $id . '" ' . ($value ? 'checked' : '') . '/>' . $title . '</label>'; case 'text': return '<textarea rows="10" id="' . $name . ($id ? '-' . $id : '') . '" class="form-control" name="' . $name . ($id ? '[' . $id . ']' : '') . '">' . HTML::chars($value) . '</textarea>'; break; case 'date': return '<input type="text" id="' . $name . ($id ? '-' . $id : '') . '" class="form-control datepicker" name="' . $name . ($id ? '[' . $id . ']' : '') . '" value="' . ($value ? date('d-m-Y', $value) : '') . '" />'; break; case 'datetime': return '<input type="text" id="' . $name . ($id ? '-' . $id : '') . '" class="form-control datetimepicker" name="' . $name . ($id ? '[' . $id . ']' : '') . '" value="' . ($value ? date('d-m-Y H:i', $value) : '') . '" />'; break; case 'float': return '<input class="form-control input-float" id="' . $name . ($id ? '-' . $id : '') . '" name="' . $name . ($id ? '[' . $id . ']' : '') . '" type="text" value="' . HTML::chars($value) . '" />'; break; case 'int': return '<input class="form-control input-int" id="' . $name . ($id ? '-' . $id : '') . '" name="' . $name . ($id ? '[' . $id . ']' : '') . '" type="text" value="' . HTML::chars($value) . '" />'; break; default: return '<input class="form-control" id="' . $name . ($id ? '-' . $id : '') . '" name="' . $name . ($id ? '[' . $id . ']' : '') . '" type="text" value="' . HTML::chars($value) . '" />'; } } }
public function action_columns() { $list = array(array('id' => 0, 'name' => 'Ticket ID')); foreach (Columns::get_all() as $key => $value) { $column = array('id' => $key, 'name' => $value); $type = Columns::get_type($key); if (substr($type, 0, 4) == 'enum') { $id = substr($type, 5); $column['type'] = Enums::is_multi($id) ? 'multi' : 'enum'; $column['values'] = Enums::get_values($id); } else { $column['type'] = $type ?: 'string'; } $list[] = $column; } die(json_encode($list)); }
elseif ($id > 161 && $id < 182 && $value != (isset($values['data' . ($id + 28)]) ? $values['data' . ($id+28)]: Arr::path($job, 'data.' . ($id+28), ''))) $class = 'bg-warning'; elseif ($id > 189 && $id < 210 && $value != (isset($values['data' . ($id - 28)]) ? $values['data' . ($id-28)]: Arr::path($job, 'data.' . ($id-28), ''))) $class = 'bg-warning'; else $class = ''; ?> <td class="<?=$class?>" <?= $id > 161 && $id < 182 ? "data-has-actual-relation='$relation_id'" : ''?> <?= $id > 189 && $id < 210 ? "data-has-variation-relation='$relation_id'" : ''?><?= $id > 242 && $id < 255 ? "data-has-additional-relation='$relation_id'" : ''?>> <label class="left-label"><?=HTML::chars($name)?><?=isset($values['data' . $id]) ? '*' : ''?>: </label> <div class=""> <?php $type = Columns::get_type($id); if (Columns::allowed($id) == Columns::COLUMN_WRITE && !Columns::get_readonly($id)):?> <?php echo Columns::input('data', $id, $type, $value); if (isset($submissions['data.' . $id])):?> <ul class="list-unstyled radio-container"> <li><label><input type="radio" class="submission-select" data-id="data-<?=$id?>" name="submission-data[<?=$id?>]" value="0" />Keep current</label></li> <?php $multi = substr($type, 0, 4) == 'enum' && Enums::is_multi(substr($type, 5)); if (Group::current('allow_assign')) foreach ($submissions['data.' . $id] as $submission): $user = User::get($submission['user_id']);?> <li><label> <input type="radio" class="submission-select" data-id="data-<?=$id?>" name="submission-data[<?=$id?>]" value="<?=$submission['id']?>" /> <?=$type == 'date' ? date('Y-m-d H:i:s', $submission['value']) :HTML::chars($submission['value']) ? : '<span class="glyphicon glyphicon-remove"></span>'?> (<?=date('d-m-Y H:i', $submission['time']) . ' - ' . Arr::get($user, 'login', 'Unknown user') . ' / ' . Arr::get($companies, Arr::get($user, 'company_id'), 'Unknown company')?>) </label></li> <?php endforeach;?> </ul> <?php endif; else:?> <p class="form-control-static"> <?=Columns::output($value, $type)?> </p> <?php endif;?> </div>
public function action_index() { $token = Arr::get($_REQUEST, 'token'); if (!API::check($token)) { die(json_encode(array('success' => false, 'error' => 'forbidden'))); } $regs = DB::select('region_id')->from('user_regions')->where('user_id', '=', User::current('id'))->execute()->as_array(NULL, 'region_id'); $query = array('companies' => intval(User::current('company_id'))); if ($regs) { $query['region'] = array('$in' => $regs); } $result = Database_Mongo::collection('jobs')->find($query, array('created' => '1', 'last_update' => 1)); $jobs = array(); Form::$static_title[] = 245; $columns = array_flip(array_merge(array_keys(Columns::get_static()), Form::$static_title)); $columns[8] = 1; $columns[12] = 1; $columns[13] = 1; $columns[14] = 1; foreach (Form::$columns as $type => $list) { foreach ($list as $keys => $name) { foreach (explode(',', $keys) as $key) { if (is_numeric($key)) { $columns[$key] = 1; } } } } foreach ($result as $job) { $jobs[$job['_id']] = Arr::get($job, 'last_update') ?: Arr::get($job, 'created'); } $list = array(); foreach ($columns as $column => $value) { $value = array('n' => Columns::get_name($column)); $type = Columns::get_type($column); if ($type) { if (substr($type, 0, 4) == 'enum') { $value['t'] = 'enum'; $value['m'] = Enums::is_multi(substr($type, 5)); $value['v'] = array_values(Enums::get_values(substr($type, 5))); } else { $value['t'] = Columns::get_type($column); } } $list[$column] = $value; } $columns = $list; ksort($columns); $form = array(); foreach (Form::$columns as $id => $list) { foreach ($list as $key => $value) { $form[$id][] = array('k' => $key, 'v' => $value); } } if (isset($_GET['gzip'])) { die(gzcompress(json_encode(array('success' => true, 'columns' => $columns, 'static' => Form::$static_title, 'form' => $form, 'jobs' => $jobs)), 9)); } else { header('Content-type: application/json'); die(json_encode(array('success' => true, 'columns' => $columns, 'static' => Form::$static_title, 'form' => $form, 'jobs' => $jobs))); } }
case 'int': echo 'Number'; break; case 'float': echo 'Floating-point'; break; case 'date': echo 'Date'; break; case 'datetime': echo 'Date and Time'; break; default: if (strpos($column['type'], 'enum') === 0) { $id = substr($column['type'], 5); echo '<span title="' . (Enums::is_multi($id) ? 'MULTIPLE VALUES:' : 'SINGLE VALUE:') . "\n\n" . implode("\n", Enums::get_values($id)) . '">Enum (' . Arr::get($enums, $id, 'Unknown') . ')</span>'; } else echo 'Default (string)'; endswitch; ?> </td> <td class="column-financial"><?=$column['financial'] ? : ''?></td> <td class="column-export" data-val="<?=$column['csv'] ? 'checked' : ''?>"><?=Utils::bool_icon($column['csv'])?></td> <td class="column-report" data-val="<?=$column['show_reports'] ? 'checked' : ''?>"><?=Utils::bool_icon($column['show_reports'])?></td> <td class="column-direct" data-val="<?=$column['direct'] ? 'checked' : ''?>"><?=Utils::bool_icon($column['direct'])?></td> <td class="column-track" data-val="<?=$column['track'] ? 'checked' : ''?>"><?=Utils::bool_icon($column['track'])?></td> <td class="column-persistent" data-val="<?=$column['persistent'] ? 'checked' : ''?>"><?=Utils::bool_icon($column['persistent'])?></td> <td class="column-editable" data-val="<?=$column['editable'] ? 'checked' : ''?>"><?=Utils::bool_icon($column['editable'])?></td> <td class="column-readonly" data-val="<?=$column['read_only'] ? 'checked' : ''?>"><?=Utils::bool_icon($column['read_only'])?></td> </tr> <?php endforeach;?> </table>