/home/smartonegroup/public_html/veroserv/system/controllers/tickets.php
<?php
$ui->assign('selected_navigation', 'support');
$ui->assign('_title', 'Tickets' . ' - ' . $config['CompanyName']);
$user = authenticate_admin();
$action = route(2);
if (!has_access($user->roleid, 'support', 'view')) {
permissionDenied();
}
$data = request()->all();
switch ($action) {
case 'departments':
$ui->assign('selected_navigation', 'settings');
$app->emit('tickets/admin/departments');
$ds = ORM::for_table('sys_ticketdepartments')
->order_by_asc('sorder')
->find_array();
$ui->assign('ds', $ds);
view('tickets_departments');
break;
case 'departments_post':
$msg = '';
$dname = _post('department_name');
$email = _post('email');
if ($dname == '') {
$msg .= 'Department Name is Required';
}
if ($email != '' && filter_var($email, FILTER_VALIDATE_EMAIL) != true) {
$msg .= 'Invalid Email Address';
}
if ($msg == '') {
$d = ORM::for_table('sys_ticketdepartments')->create();
$d->dname = $dname;
$d->email = $email;
$d->hidden = _post('hidden', '0');
$d->host = _post('host');
$d->port = _post('port');
$d->username = $email;
$d->password = _post('password');
$d->encryption = _post('encryption', 'no');
$d->delete_after_import = _post('delete_after_import', '0');
$d->sorder = 1;
$d->save();
_msglog('s', 'Department Added Successfully');
echo $d->id();
} else {
echo $msg;
}
break;
case 'delete_department':
$id = route(3);
$id = str_replace('d', '', $id);
$d = ORM::for_table('sys_ticketdepartments')->find($id);
if ($d) {
$d->delete();
r2(U . 'tickets/admin/departments/', 's', 'Deleted Successfully');
}
break;
case 'edit_department':
$id = route(3);
$id = str_replace('e', '', $id);
$d = ORM::for_table('sys_ticketdepartments')->find($id);
if ($d) {
echo '<form id="edit_form">
<div class="modal-body">
<div class="mb-3">
<label for="department_name">' .
$_L['Name'] .
'</label>
<input type="text" name="department_name" class="form-control" id="department_name" value="' .
$d->dname .
'">
</div>
<div class="mb-3">
<label for="email">' .
$_L['Email'] .
'</label>
<input type="email" class="form-control" id="email" name="email" value="' .
$d->email .
'">
</div>
</div>
<div class="modal-footer">
<input type="hidden" name="edit_dep" id="edit_dep" value="' .
$d->id .
'">
<button type="button" data-dismiss="modal" class="btn btn-danger">Close</button>
<button type="button" id="btn_modal_edit_action" class="btn btn-primary edit_submit">Save</button>
</div></form>';
}
break;
case 'departments_edit':
$msg = '';
$edit_dep = _post('edit_dep');
$d = ORM::for_table('sys_ticketdepartments')->find($edit_dep);
if ($d) {
$dname = _post('department_name');
$email = _post('email');
if ($dname == '') {
$msg .= 'Department Name is Required';
}
if (
$email != '' &&
filter_var($email, FILTER_VALIDATE_EMAIL) != true
) {
$msg .= 'Invalid Email Address';
}
if ($msg == '') {
$d->dname = $dname;
$d->email = $email;
$d->hidden = _post('hidden', '0');
$d->host = _post('host');
$d->port = _post('port');
$d->username = $email;
$d->password = _post('password');
$d->encryption = _post('encryption', 'no');
$d->delete_after_import = _post('delete_after_import', '0');
$d->save();
_msglog('s', 'Department Edited Successfully');
echo $edit_dep;
} else {
echo $msg;
}
} else {
echo $edit_dep . 'dd';
}
break;
case 'departments_reorder':
$d = ORM::for_table('sys_ticketdepartments')
->order_by_asc('sorder')
->find_array();
$ui->assign('ritem', 'Support Ticket Departments');
$ui->assign('d', $d);
$ui->assign('display_name', 'dname');
$ui->display('reorder.tpl', [
'action' => 'sys_ticketdepartments',
]);
break;
case 'predefined_replies':
$ui->assign(
'replies',
db_find_array('sys_canned_responses', ['id', 'title'], 'asc:sorder')
);
view('tickets_predefined_replies');
break;
case 'predefined_replies_post':
$data = sp_purify_data($request->all());
$ret = Tickets::addPredefinedReply($data);
if ($ret['success'] == 'Yes') {
echo $ret['id'];
} else {
echo $ret['msg'];
}
break;
case 'predefined_replies_reorder':
$d = ORM::for_table('sys_canned_responses')
->order_by_asc('sorder')
->find_array();
$ui->assign('ritem', 'Predefined Replies');
$ui->assign('d', $d);
$ui->assign('display_name', 'title');
$ui->display('reorder.tpl', [
'action' => 'sys_canned_responses',
]);
break;
case 'predefined_replies_delete':
$id = route(3);
$id = str_replace('d', '', $id);
Tickets::deletePredefinedReply($id);
r2(
U . 'tickets/admin/predefined_replies/',
's',
'Deleted Successfully'
);
break;
case 'predefined_reply_edit':
$id = route(3);
$reply = TicketPredefinedReply::find($id);
if ($reply) {
view('predefined_reply_edit', [
'reply' => $reply,
]);
}
break;
case 'predefined_reply_edit_post':
$id = _post('id');
$reply = TicketPredefinedReply::find($id);
$title = _post('title');
$message = $data['message'];
if ($reply) {
if ($title == '' || $message == '') {
r2(
U . 'tickets/admin/predefined_reply_edit/' . $id,
'e',
$_L['All Fields are Required']
);
}
$reply->title = $title;
$reply->message = $message;
$reply->save();
r2(
U . 'tickets/admin/predefined_reply_edit/' . $id,
's',
$_L['Data Updated']
);
}
break;
case 'create':
$app->emit('tickets/admin/create');
if (isset($routes['3']) && $routes['3'] != '') {
$p_cid = $routes['3'];
$p_d = ORM::for_table('crm_accounts')->find($p_cid);
if ($p_d) {
$ui->assign('p_cid', $p_cid);
}
} else {
$ui->assign('p_cid', '');
}
$customers = ORM::for_table('crm_accounts')
->select('id')
->select('account')
->select('company')
->select('email')
->order_by_desc('id')
->find_array();
$ui->assign('customers', $customers);
$ui->assign(
'xheader',
Asset::css(['s2/css/select2.min', 'dropzone/dropzone', 'modal'])
);
$deps = ORM::for_table('sys_ticketdepartments')
->order_by_asc('sorder')
->find_array();
$ui->assign('deps', $deps);
view('tickets_admin_create', []);
break;
case 'upload_file':
$uploader = new Uploader();
$uploader->setDir('storage/tickets/');
$uploader->sameName(false);
$uploader->setExtensions(['zip', 'jpg', 'jpeg', 'png', 'gif']); //allowed extensions list//
if ($uploader->uploadFile('file')) {
$uploaded = $uploader->getUploadName(); //get uploaded file name, renames on upload//
$file = $uploaded;
$msg = 'Uploaded Successfully';
$success = 'Yes';
} else {
//upload failed
$file = '';
$msg = $uploader->getMessage();
$success = 'No';
}
$a = [
'success' => $success,
'msg' => $msg,
'file' => $file,
];
header('Content-Type: application/json');
echo json_encode($a);
break;
case 'add_post':
header('Content-Type: application/json');
$cid = _post('cid');
if ($cid == '') {
echo json_encode([
"success" => "No",
"msg" => 'Please Select Customer',
]);
exit();
}
$tickets = new Tickets();
$t = $tickets->create($cid, $user->id);
echo json_encode($t);
break;
case 'view':
$id = route(3);
$app->emit('tickets/admin/view', [
'tid' => $id,
]);
$can_edit_sales = has_access($user->roleid, 'sales', 'edit');
$d = ORM::for_table('sys_tickets')->find($id);
if ($d) {
if ($d->ttotal == '') {
$timeSpent = 0;
$hh = '00';
$mm = '00';
} else {
$timeSpent = strtotime($d->ttotal) - strtotime('TODAY');
$timeSpent = (int) $timeSpent;
$hhmmss = $d->ttotal;
$hhmmss_split = explode(':', $hhmmss);
$hh = $hhmmss_split[0];
$mm = $hhmmss_split[1];
}
$ui->assign('d', $d);
$c = ORM::for_table('crm_accounts')->find($d->userid);
$ui->assign('c', $c);
$a = $d->admin != '0' ? db_find_one('sys_users', $d->admin) : false;
$ui->assign('a', $a);
$replies = ORM::for_table('sys_ticketreplies')
->where('tid', $d->id)
->find_array();
$ui->assign('replies', $replies);
$departments = ORM::for_table('sys_ticketdepartments')
->select('id')
->select('dname')
->find_array();
$ui->assign('departments', $departments);
$deps = [];
$d_x = 0;
foreach ($departments as $dep) {
$deps[$d_x]['value'] = $dep['id'];
$deps[$d_x]['text'] = $dep['dname'];
$d_x++;
}
$jed = json_encode($deps);
$ads = ORM::for_table('sys_users')
->select('id')
->select('fullname')
->find_array();
$ui->assign('ads', $ads);
$aas = [];
$a_x = 0;
foreach ($ads as $ad) {
$aas[$a_x]['value'] = $ad['id'];
$aas[$a_x]['text'] = $ad['fullname'];
$a_x++;
}
$jaa = json_encode($aas);
$dd = ORM::for_table('sys_ticketdepartments')
->select('dname')
->find($d->did);
$department = $dd ? $dd->dname : '';
$ui->assign('department', $department);
$o_tickets = ORM::for_table('sys_tickets')
->where('email', $d->email)
->select('status')
->select('subject')
->select('urgency')
->select('created_at')
->select('id')
->find_array();
$ui->assign('o_tickets', $o_tickets);
$invoice = Invoice::where('ticket_id', $d->id)->first();
$predefined_replies = TicketPredefinedReply::orderBy(
'sorder',
'asc'
)
->select(['id', 'title'])
->get();
view('tickets_admin_view', [
'invoice' => $invoice,
'ticket' => $d,
'timeSpent' => $timeSpent,
'can_edit_sales' => $can_edit_sales,
'predefined_replies' => $predefined_replies,
'hh' => $hh,
'mm' => $mm,
]);
} else {
echo 'Ticket not found';
}
break;
case 'imap_test':
$host = _post('host');
$port = _post('port');
$username = _post('email');
$password = _post('password');
$enc = _post('encryption');
$imap = imap_open(
'{' . $host . ':' . $port . '/imap/' . $enc . '}INBOX',
$username,
$password
);
if ($imap) {
echo 1;
} else {
echo imap_last_error();
}
break;
case 'list':
$staffs = User::all();
view('tickets_admin_list', [
'staffs' => $staffs,
]);
break;
case 'tickets':
$staffs = User::all();
$contacts = Contact::all()->keyBy('id')->all();
$companies = Company::all();
$tickets = Ticket::select([
'id',
'tid',
'did',
'aid',
'pid',
'sid',
'lid',
'oid',
'company_id',
'dname',
'userid',
'account',
'email',
'cc',
'bcc',
'subject',
'status',
'urgency',
'admin',
'attachments',
'last_reply',
'flag',
'escalated',
'replying',
'is_spam',
'client_read',
'admin_read',
'source',
'created_at',
'updated_at',
])->orderBy('id', 'desc')
->get();
view('admin-tickets', [
'staffs' => $staffs,
'contacts' => $contacts,
'companies' => $companies,
'tickets' => $tickets,
]);
break;
case 'add_reply':
$tickets = new Tickets();
$t = $tickets->add_reply($user->id);
header('Content-Type: application/json');
echo json_encode($t);
break;
case 'save_note':
$tid = _post('tid');
$notes = $data['notes'];
$ticket = db_find_one('sys_tickets', $tid);
if ($ticket) {
$ticket->notes = $notes;
$ticket->save();
}
break;
case 'delete':
$tid = route(3);
$tid = str_replace('t', '', $tid);
$ticket = db_find_one('sys_tickets', $tid);
if ($ticket) {
$ticket->delete();
}
$replies = ORM::for_table('sys_ticketreplies')
->where('tid', $tid)
->find_many();
foreach ($replies as $reply) {
$reply->delete();
}
$tasks = Task::where('tid', $tid)->get();
foreach ($tasks as $task) {
$task->delete();
}
r2(U . 'tickets/admin/list/', 's', $_L['delete_successful']);
break;
case 'view_modal':
view('tickets_admin_view_modal');
break;
case 'edit_modal':
$tid = route(3);
$tid = str_replace('et', '', $tid);
$tid = str_replace('er', '', $tid);
$type = route(4);
if ($type == 'reply') {
$ui->assign('type', 'reply');
$ticket = db_find_one('sys_ticketreplies', $tid);
} else {
$ui->assign('type', 'ticket');
$ticket = db_find_one('sys_tickets', $tid);
}
if ($ticket) {
$ui->assign('ticket', $ticket);
view('tickets_admin_edit_modal');
}
break;
case 'edit_modal_post':
$tid = _post('tid');
$type = _post('type');
$message = $data['message'];
$ticket = $type == 'reply' ? db_find_one('sys_ticketreplies', $tid) : db_find_one('sys_tickets', $tid);
if ($ticket) {
$ticket->message = $message;
$ticket->save();
echo '1';
} else {
echo 'Ticket Not Found';
}
break;
case 'delete_reply':
$tid = route(3);
$tid = str_replace('dr', '', $tid);
$ticket = db_find_one('sys_ticketreplies', $tid);
if ($ticket) {
$t = $ticket->tid;
$ticket->delete();
r2(U . 'tickets/admin/view/' . $t, 's', $_L['delete_successful']);
}
break;
case 'json_list':
$columns = [];
$columns[] = 'tid';
$columns[] = 'img';
$columns[] = 'subject';
$columns[] = 'account';
$columns[] = 'account';
$columns[] = 'admin';
$order_by = $data['order'];
$o_c_id = $order_by[0]['column'];
$o_type = $order_by[0]['dir'];
$a_order_by = $columns[$o_c_id];
$staffs = User::all()
->keyBy('id')
->all();
$account = _post('account');
$tickets = Ticket::select([
'id',
'tid',
'userid',
'account',
'subject',
'status',
'aid',
]);
if ($user->roleid) {
$assigned_departments = Relation::where('type', 'staff_departments')
->where('source_id', $user->id)
->get()
->keyBy('target_id')
->keys();
$tickets = $tickets->whereIn('did', $assigned_departments);
}
if ($account != '') {
$tickets = $tickets->where('account', 'like', "%$account%");
}
$email = _post('email');
if ($email != '') {
$tickets = $tickets->where('email', 'like', "%$email%");
}
$subject = _post('subject');
if ($subject != '') {
$tickets = $tickets->where('subject', 'like', "%$subject%");
}
$company = _post('company');
if ($company != '') {
$contacts_under_companies = Contact::where(
'company',
'like',
'%' . $company . '%'
)->get();
$contact_ids = [];
$contact_ids[] = 0;
foreach ($contacts_under_companies as $contacts_under_company) {
$contact_ids[] = $contacts_under_company->id;
}
$tickets = $tickets->whereIn('userid', $contact_ids);
}
$status = _post('status');
if ($status != '') {
$tickets = $tickets->where('status', 'like', "%$status%");
}
$staff = _post('staff');
if ($staff != '') {
$tickets = $tickets->where('aid', $staff);
}
$x = $tickets->get()->toArray();
$iTotalRecords = $tickets->count();
$iDisplayLength = (int) $_REQUEST['length'];
$iDisplayLength =
$iDisplayLength < 0 ? $iTotalRecords : $iDisplayLength;
$iDisplayStart = (int) $_REQUEST['start'];
$sEcho = (int) $_REQUEST['draw'];
$records = [];
$records["data"] = [];
$end = $iDisplayStart + $iDisplayLength;
$end = $end > $iTotalRecords ? $iTotalRecords : $end;
$tickets = $o_type == 'desc' ? $tickets->orderBy($a_order_by, 'desc') : $tickets->orderBy($a_order_by);
$tickets = $tickets->limit($iDisplayLength);
$tickets = $tickets->offset($iDisplayStart);
$x = $tickets->get()->toArray();
$i = $iDisplayStart;
$colors = Colors::colorNames();
$contacts = Contact::select(['id', 'account', 'company'])
->get()
->keyBy('id')
->toArray();
$i = 0;
foreach ($x as $xs) {
$i++;
$full_name = $xs['account'];
$css_bg = $colors[array_rand($colors)];
$full_name_e = explode(' ', $full_name);
$first_name = $full_name_e[0];
$first_name_letter = $first_name[0] ?? '';
if (isset($full_name_e[1])) {
$last_name = $full_name_e[1];
$last_name_letter = $last_name[0];
} else {
$last_name_letter = '';
}
$img =
'<span class="clx-avatar ib_bg_' .
$css_bg .
'">' .
$first_name_letter .
$last_name_letter .
'</span>';
$staff_name = '';
if (isset($staffs[$xs['aid']])) {
$staff_name = $staffs[$xs['aid']]->fullname;
}
$account = mb_convert_encoding($xs['account'], 'UTF-8', 'UTF-8');
$company = '';
if (
isset($contacts[$xs['userid']]) &&
$contacts[$xs['userid']]['company'] != ''
) {
$company .= mb_convert_encoding(
$contacts[$xs['userid']]['company'],
'UTF-8',
'UTF-8'
);
}
$records["data"][] = [
0 => $i,
1 =>
'<a href="' .
U .
'contacts/view/' .
$xs['userid'] .
'">' .
$img .
'</a>',
2 =>
mb_convert_encoding($xs['subject'], 'UTF-8', 'UTF-8') .
' <br>' .
$xs['tid'],
3 => mb_convert_encoding($account, 'UTF-8', 'UTF-8'),
4 => mb_convert_encoding($company, 'UTF-8', 'UTF-8'),
5 => mb_convert_encoding($staff_name, 'UTF-8', 'UTF-8'),
6 =>
'
<span class="label label-default inline-block"> ' .
$xs['status'] .
' </span>
',
7 => $xs['id'],
8 => $xs['userid'],
"DT_RowId" => 'row_' . $xs['id'],
];
}
$records["draw"] = $sEcho;
$records["recordsTotal"] = $iTotalRecords;
$records["recordsFiltered"] = $iTotalRecords;
header("Content-type: application/json; charset=utf-8");
echo json_encode($records);
break;
case 'update_cc':
$id = _post('id');
$d = db_find_one('sys_tickets', $id);
$value = _post('value');
if ($value != '' && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
i_close($_L['Invalid Email']);
}
if ($d) {
$d->cc = $value;
$d->save();
}
echo '1';
break;
case 'update_hour':
$id = _post('id');
$d = db_find_one('sys_tickets', $id);
$value = _post('value');
if (!is_numeric($value)) {
exit('Invalid data');
}
if ($d) {
$hh = '00';
$mm = '00';
$ss = '00';
if ($d->ttotal != '') {
$hhmmss = $d->ttotal;
$hhmmss_split = explode(':', $hhmmss);
$hh = $hhmmss_split[0];
$mm = $hhmmss_split[1];
$ss = $hhmmss_split[2];
}
$new_hh = $value;
$new_total = $new_hh . ':' . $mm . ':' . $ss;
$d->ttotal = $new_total;
$d->save();
}
echo '1';
break;
case 'update_minute':
$id = _post('id');
$d = db_find_one('sys_tickets', $id);
$value = _post('value');
if (!is_numeric($value)) {
exit('Invalid data');
}
if ($d) {
$hh = '00';
$mm = '00';
$ss = '00';
if ($d->ttotal != '') {
$hhmmss = $d->ttotal;
$hhmmss_split = explode(':', $hhmmss);
$hh = $hhmmss_split[0];
$mm = $hhmmss_split[1];
$ss = $hhmmss_split[2];
}
$new_mm = $value;
$new_total = $hh . ':' . $new_mm . ':' . $ss;
$d->ttotal = $new_total;
$d->save();
}
echo '1';
break;
case 'update_bcc':
$id = _post('id');
$d = db_find_one('sys_tickets', $id);
$value = _post('value');
if ($value != '' && !filter_var($value, FILTER_VALIDATE_EMAIL)) {
i_close($_L['Invalid Email']);
}
if ($d) {
$d->bcc = $value;
$d->save();
}
echo '1';
break;
case 'update_status':
$id = _post('id');
$d = db_find_one('sys_tickets', $id);
$value = _post('value');
if ($d) {
$d->status = $value;
$d->save();
_log(
'Ticket - <a href="' .
U .
'tickets/admin/view/' .
$d->id .
'">' .
$d->tid .
'</a> updated By- ' .
$user->fullname .
' Value: ' .
$value,
'Ticket',
$user->id
);
// check related tasks
$tasks = Task::where('tid', $id)->get();
foreach ($tasks as $task) {
$task->status = 'Completed';
$task->save();
}
}
echo '1';
break;
case 'update_department':
$id = _post('id');
$d = db_find_one('sys_tickets', $id);
$value = _post('value');
if ($d) {
$d->did = $value;
$d->save();
}
echo '1';
break;
case 'update_assigned_to':
$id = _post('id');
$d = db_find_one('sys_tickets', $id);
$value = _post('value');
// Find the user
$staff = User::find($value);
if ($staff) {
Email::sendEmail(
$config,
$_L,
'',
$staff->username,
'Ticket assigned: ' . $d->tid,
'View Ticket- ' . U . 'tickets/admin/view/' . $d->id
);
if (
isset($config['tickets_assigned_sms_notification']) &&
$config['tickets_assigned_sms_notification'] == 1 &&
$staff->phonenumber != ''
) {
require APP_SYSTEM_PATH . '/lib/misc/smsdriver.php';
$tpl = SMSTemplate::where(
'tpl',
'Ticket Assigned: Admin Notification'
)->first();
if ($tpl) {
$message = new Template($tpl->sms);
$message->set('ticket_id', $d->tid);
$message_o = $message->output();
spSendSMS($staff->phonenumber, $message_o);
}
}
}
if ($d) {
$d->aid = $value;
$d->save();
_log(
'Ticket assigned By- ' .
$user->fullname .
' Assigned To: ' .
$staff->fullname,
'Ticket',
$user->id
);
jsonResponse([
'id' => $d->id,
'fullname' => $staff->fullname,
'success' => true,
]);
}
break;
case 'update_email':
$id = _post('id');
$d = db_find_one('sys_tickets', $id);
$value = _post('value');
if ($d && filter_var($value, FILTER_VALIDATE_EMAIL)) {
$d->email = $value;
$d->save();
echo '1';
} else {
echo 'Invalid Email';
}
break;
case 'reply_make_public':
$id = route(3);
$id = str_replace('rp', '', $id);
$d = db_find_one('sys_ticketreplies', $id);
if ($d) {
$d->reply_type = 'public';
$d->save();
Tickets::sendReplyNotification($d->tid, $d->message);
r2(
U . 'tickets/admin/view/' . $d->tid,
's',
'Updated Successfully'
);
}
break;
case 'tasks_list':
$tid = route(3);
$tasks = ORM::for_table('sys_tasks')
->where('rel_type', 'Ticket')
->where('rel_id', $tid)
->select('title')
->select('id')
->select('status')
->order_by_desc('id')
->find_array();
$li = '';
foreach ($tasks as $task) {
$li .=
'<li class="task_item' .
($task['status'] == 'Completed' ? ' completed' : '') .
'" id="t_tasks_' .
$task['id'] .
'">
<input class="custom-checkbox task-checkbox" id="s_tasks_' .
$task['id'] .
'" type="checkbox" value="" name="" ' .
($task['status'] == 'Completed' ? ' checked' : '') .
' class="i-checks"/>
<span class="m-l-xs">' .
$task['title'] .
'</span>
</li>';
}
if ($li == '') {
} else {
echo '<ul class="todo-list my-3">
' .
$li .
'
</ul>';
}
break;
case 'do_task':
$ids = $data['ids'];
$do = _post('action');
if ($do == 'completed') {
foreach ($ids as $id) {
$id = str_replace('t_tasks_', '', $id);
$d = ORM::for_table('sys_tasks')->find($id);
if ($d) {
$d->status = 'Completed';
$d->save();
}
}
} elseif ($do == 'not_started') {
foreach ($ids as $id) {
$id = str_replace('t_tasks_', '', $id);
$d = ORM::for_table('sys_tasks')->find($id);
if ($d) {
$d->status = 'Not Started';
$d->save();
}
}
} elseif ($do == 'delete') {
foreach ($ids as $id) {
$id = str_replace('t_tasks_', '', $id);
$d = ORM::for_table('sys_tasks')->find($id);
if ($d) {
$d->delete();
}
}
} else {
}
echo 'ok';
break;
case 'set_task_completed':
$id = route(3);
$id = str_replace('s_tasks_', '', $id);
$d = ORM::for_table('sys_tasks')->find($id);
if ($d) {
$d->status = 'Completed';
$d->save();
echo 'ok';
}
break;
case 'set_task_not_started':
$id = route(3);
$id = str_replace('s_tasks_', '', $id);
$d = ORM::for_table('sys_tasks')->find($id);
if ($d) {
$d->status = 'Not Started';
$d->save();
echo 'ok';
}
break;
case 'update_phone':
$id = _post('id');
$d = db_find_one('sys_tickets', $id);
if ($d) {
$customer = db_find_one('crm_accounts', $d->userid);
if ($customer) {
$customer->phone = _post('value');
$customer->save();
}
}
echo '1';
break;
case 'available_status':
echo '<div class="mb-3">
<label for="bulk_status">Status</label>
<select class="form-control" id="bulk_status" name="bulk_status" size="1">
<option value="Open">Open</option>
<option value="On Hold">On Hold</option>
<option value="Escalated">Escalated</option>
<option value="Closed">Closed</option>
</select>
</div>';
break;
case 'set_status':
$ids_raw = $data['ids'];
$status = _post('status');
foreach ($ids_raw as $id_single) {
$id = str_replace('row_', '', $id_single);
$t = ORM::for_table('sys_tickets')
->select('id')
->find($id);
if ($t) {
$t->status = $status;
$t->save();
}
}
echo $_L['Data Updated'];
break;
case 'settings':
view('tickets_admin_edit_modal');
break;
case 'delete_multiple':
if (!isset($data['ids'])) {
exit();
}
$ids_raw = $data['ids'];
$ids = [];
foreach ($ids_raw as $id_single) {
$id = str_replace('row_', '', $id_single);
$ids[] = $id;
}
$tickets = ORM::for_table('sys_tickets')
->where_id_in($ids)
->delete_many();
foreach ($ids as $id) {
$tasks = Task::where('tid', $id)->get();
foreach ($tasks as $task) {
$task->delete();
}
}
r2(U . 'tickets/admin/list/', 's', $_L['Deleted Successfully']);
break;
case 'log_time':
$ticket_id = _post('ticket_id');
$ticket = Ticket::find($ticket_id);
if ($ticket) {
$ticket->ttotal = _post('total_time');
$ticket->save();
}
break;
case 'get-predefined-reply':
$id = route(3);
$reply = TicketPredefinedReply::find($id);
if ($reply) {
echo $reply->message;
}
break;
case 'generate-reply':
if(empty($config['openai_api_key'])){
echo 'OpenAI API Key is not set';
exit;
}
$ticket_id = _post('ticket_id');
$ticket = Ticket::find($ticket_id);
$prompt = $ticket->subject. PHP_EOL;
//Find the last customer reply
$last_reply = TicketReply::where('tid', $ticket_id)->where('admin', '0')->orderBy('id', 'desc')->first();
if($last_reply)
{
$prompt .= $last_reply->message. PHP_EOL;
}
else{
$prompt .= $ticket->message. PHP_EOL;
}
$client = OpenAI::client($config['openai_api_key']);
try{
$response = $client->completions()->create([
'model' => 'text-davinci-003',
'prompt' => $prompt,
'max_tokens' => 255,
'temperature' => 0
]);
$content = '';
foreach ($response->choices as $result) {
$content .= $result->text;
}
$content = trim($content);
echo $content;
}
catch(Exception $e){
echo $e->getMessage();
exit;
}
break;
}