/home/smartonegroup/www/veroserv/system/autoload/Tickets.php
<?php
require APP_SYSTEM_PATH . '/lib/misc/smsdriver.php';

class Tickets
{
    public function get_department($did)
    {
        $dname = '';

        $d = ORM::for_table('sys_ticketdepartments')->find($did);

        if ($d) {
            $dname = $d->dname;
        }

        return $dname;
    }

    public static function sendReplyNotification($tid, $message)
    {
        $d = ORM::for_table('sys_tickets')->find($tid);

        if ($d && $d->email == '') {
            return false;
        }

        return false;
    }

    public function create(
        $cid = 0,
        $admin = 0,
        $flag = 0,
        $source = 'Web',
        $data = false,
        $extras = false,
        $ticket_prefix = false,
        $send_email = true
    ) {
        global $config, $_L;
        $msg = '';

        $ib_now = date('Y-m-d H:i:s');

        if (!$ticket_prefix) {
            $ticket_prefix = $config['ticket_code_prefix'] != '' ? $config['ticket_code_prefix'] : strtoupper(Str::random(3));
        }

        if ($config['ticket_code_current_number'] != '') {
            $ticket_code_number = str_pad(
                $config['ticket_code_current_number'],
                $config['number_pad'],
                '0',
                STR_PAD_LEFT
            );
            update_option(
                'ticket_code_current_number',
                current_number_would_be($config['ticket_code_current_number'])
            );
        } else {
            $ticket_code_number = _raid(8);
        }

        $tid = $ticket_prefix . '-' . $ticket_code_number;

        if (isset($data['did'])) {
            $did = $data['did'] == '' ? 0 : $data['did'];
        } else {
            $did = _post('department');
        }

        $dname = $this->get_department($did);

        $account = '';
        $email = '';
        $last_reply = '';

        if ($cid != 0) {
            $d = ORM::for_table('crm_accounts')->find($cid);

            if ($d) {
                $account = $d->account;
                $email = $d->email;
                $last_reply = $d->account;
            }
        } else {
            $account = _post('account');

            $first_name = '';
            $middle_name = '';
            $last_name = '';

            $email = _post('email');
            $last_reply = $account;
            if ($account == '') {
                $account = 'Web';
            }

            $account_e = explode(' ', $account);

            if (isset($account_e[0])) {
                $first_name = $account_e[0];
            }

            if (isset($account_e[1])) {
                $last_name = $account_e[1];
            }

            if (isset($account_e[3])) {
                $middle_name = $last_name;
                $last_name = $account_e[3];
            }

            if ($last_name == '') {
                $last_name = $first_name;
            }

            $e_user = ORM::for_table('crm_accounts')
                ->where('email', $email)
                ->first();

            if ($e_user && $email != '') {
                $cid = $e_user->id;
            } else {
                $l_add['first_name'] = $first_name;
                $l_add['last_name'] = $last_name;
                $l_add['middle_name'] = $middle_name;
                $l_add['email'] = _post('email');
                $l_add['phone'] = _post('phone');
            }
        }

        $message = isset($data['message']) ? $data['message'] : ib_post('message');

        $subject = isset($data['subject']) ? $data['subject'] : ib_post('subject');

        if ($subject == '') {
            $msg .= 'Subject is required. <br>';
        }

        if ($message == '') {
            $msg .= 'Message is required. <br>';
        }

        $urgency = isset($data['urgency']) ? $data['urgency'] : _post('urgency');

        if ($msg == '') {
            $d = ORM::for_table('sys_tickets')->create();
            $d->tid = $tid;
            $d->did = $did;
            $d->dname = $dname;
            $d->userid = $cid;
            $d->account = $account;
            $d->email = $email;
            $d->created_at = $ib_now;
            $d->updated_at = $ib_now;
            $d->subject = $subject;
            $d->message = $message;
            $d->status = 'Open';
            $d->urgency = $urgency;
            $d->admin = $admin;
            $d->attachments = ib_post('attachments');
            $d->last_reply = $last_reply;
            $d->flag = $flag;
            $d->is_spam = 0;
            $d->client_read = 'No';
            $d->admin_read = 'No';
            $d->source = $source;
            $d->ttype = _post('ttype'); //  Question Incident Problem Feature Request
            $d->tstart = '';
            $d->tend = '';
            $d->ttotal = '';
            $d->todo = '';
            $d->tags = '';
            $d->notes = '';
            $d->c1 = _post('c1');
            $d->c2 = _post('c2');

            if ($extras) {
                foreach ($extras as $key => $value) {
                    $d->$key = $value;
                }
            }

            $d->save();

            $ticket_id = $d->id();

            $admin_view_link = U . 'tickets/admin/view/' . $d->id;

            if (
                isset($config['create_task_from_ticket']) &&
                $config['create_task_from_ticket'] == 1
            ) {
                Tasks::create([
                    'title' => $tid,
                    'description' => $message,
                    'cid' => $cid,
                    'priority' => $urgency,
                    'rel_type' => 'Ticket',
                    'rel_id' => $ticket_id,
                    'tid' => $ticket_id,
                ]);
            }

            $ret_val = [
                "success" => "Yes",
                "msg" => "Ticket Created Successfully",
                "account" => $account,
                "email" => $email,
                "subject" => $subject,
                "body" => $message,
                "id" => $d->id(),
                "tid" => $tid,
                "urgency" => $urgency,
            ];

            $eml = ORM::for_table('sys_email_templates')
                ->where('tplname', 'Tickets:Client Ticket Created')
                ->where('send', 'Yes')
                ->first();
            if ($eml) {
                $client_view_link = U . 'client/tickets/view/' . $d->tid . '/';

                $eml_subject = new Template($eml->subject);
                $eml_subject->set('business_name', $config['CompanyName']);
                $eml_subject->set('subject', $subject);
                $eml_subject->set('ticket_subject', $subject);
                $subj = $eml_subject->output();

                $eml_message = new Template($eml->message);
                $eml_message->set('client_name', $account);
                $eml_message->set('client_email', $email);
                $eml_message->set('priority', $urgency);
                $eml_message->set('urgency', $urgency);
                $eml_message->set('subject', $subject);
                $eml_message->set('subject', $subject);
                $eml_message->set('ticket_subject', $subject);
                $eml_message->set('status', $urgency);
                $eml_message->set('ticket_status', $d->status);
                $eml_message->set('ticket_urgency', $urgency);
                $eml_message->set('ticket_priority', $urgency);
                $eml_message->set('ticket_id', '#' . $tid);
                $eml_message->set('message', $message);
                $eml_message->set('business_name', $config['CompanyName']);
                $eml_message->set('ticket_link', $client_view_link);
                $message_o = $eml_message->output();

                if ($send_email) {
                }
            }

            $eml = ORM::for_table('sys_email_templates')
                ->where('tplname', 'Tickets:Admin Ticket Created')
                ->where('send', 'Yes')
                ->first();

            if ($eml) {
                $eml_subject = new Template($eml->subject);
                $eml_subject->set('business_name', $config['CompanyName']);
                $eml_subject->set('subject', $subject);
                $eml_subject->set('ticket_subject', $subject);
                $subj = $eml_subject->output();

                $eml_message = new Template($eml->message);
                $eml_message->set('client_name', $account);
                $eml_message->set('client_email', $email);
                $eml_message->set('priority', $urgency);
                $eml_message->set('urgency', $urgency);
                $eml_message->set('status', $urgency);
                $eml_message->set('ticket_status', $d->status);
                $eml_message->set('ticket_urgency', $urgency);
                $eml_message->set('ticket_priority', $urgency);
                $eml_message->set('ticket_id', '#' . $tid);
                $eml_message->set('message', $message);
                $eml_message->set('business_name', $config['CompanyName']);
                $eml_message->set('admin_view_link', $admin_view_link);
                $message_o = $eml_message->output();

                $users = User::all();

                foreach ($users as $user) {
                    if ($user->email_notify) {
                    }
                }
            }

            $staffs = User::all();

            $sms_message =
                $account .
                ' | ' .
                $subject .
                '. ' .
                $_L['View'] .
                ': ' .
                $admin_view_link;

            foreach ($staffs as $staff) {
                if (
                    $staff->sms_notify &&
                    $staff->phonenumber != '' &&
                    has_access($staff->roleid, 'support', 'view')
                ) {
                    spSendSMS($staff->phonenumber, $sms_message);
                }
            }

            if (
                isset($config['ticket_create_task_automatically']) &&
                $config['ticket_create_task_automatically'] == 1
            ) {
                $data['aid'] = $admin;

                $user = User::find($admin);

                if ($user) {
                    $data['created_by'] = $user->fullname;
                }

                $task = Tasks::create($data);
            }

            Event::trigger('tickets/created/', $ret_val);
        } else {
            $ret_val = [
                "success" => "No",
                "msg" => $msg,
            ];
        }

        return $ret_val;
    }

    public static function gen_link_attachments($attachments)
    {
        $html = '';

        $a = explode(',', $attachments);

        foreach ($a as $l) {
            $html .=
                '<img src="' .
                APP_URL .
                '/storage/tickets/' .
                $l .
                '" class="img-thumbnail" alt="Cinque Terre" width="300"> ';
        }

        return $html;
    }

    public function add_reply($admin = 0, $sendEmail = true)
    {
        global $config;
        global $_L;
        $msg = '';
        $is_admin = false;

        $ib_now = date('Y-m-d H:i:s');

        $tid = _post('f_tid');

        $ret_val = [
            "success" => "No",
        ];

        $account = '';
        $email = '';
        $last_reply = false;
        $replied_by = '';
        $reply_type = _post('reply_type', 'Public');

        $message = ib_post('message');
        if ($message == '') {
            $msg .= 'Message is required. <br>';
        }

        $t = ORM::for_table('sys_tickets')->find($tid);
        if ($t) {
            $t->updated_at = $ib_now;

            $t->save();

            $cid = $t->userid;
        } else {
            $cid = 0;
        }

        $adm = ORM::for_table('sys_users')->find($admin);
        if ($adm) {
            $is_admin = true;
            $email = $t->email;
            $account = $t->account;
            $replied_by = $adm->fullname;

            $last_reply = $adm->fullname;
            $reply_account = $adm->fullname;
            $reply_email = $adm->email;
        } else {
            $d = ORM::for_table('sys_ticketdepartments')->find($t->did);

            $email = $d->email;
            $account = '';

            $reply_account = $t->account;
            $reply_email = $t->email;
            $last_reply = $t->account;
        }

        if ($msg == '') {
            $d = ORM::for_table('sys_ticketreplies')->create();
            $d->tid = $tid;
            $d->userid = $cid;
            $d->account = $reply_account;
            $d->reply_type = $reply_type;
            $d->email = $reply_email;
            $d->created_at = $ib_now;
            $d->updated_at = $ib_now;
            $d->message = $message;
            $d->replied_by = $last_reply;
            $d->admin = $admin;
            $d->attachments = ib_post('attachments');
            $d->client_read = '';
            $d->admin_read = '';
            $d->save();

            $ret_val = [
                "success" => "Yes",
                "msg" => "Ticket Updated Successfully",
                "id" => $d->id(),
                "tid" => $tid,
            ];

            if ($sendEmail) {
                if ($is_admin) {
                    $eml = ORM::for_table('sys_email_templates')
                        ->where('tplname', 'Tickets:Admin Response')
                        ->where('send', 'Yes')
                        ->first();

                    $email = $t->email;

                    if ($eml) {
                        $client_view_link =
                            U . 'client/tickets/view/' . $t->tid . '/';

                        $eml_subject = new Template($eml->subject);
                        $eml_subject->set(
                            'business_name',
                            $config['CompanyName']
                        );
                        $eml_subject->set('subject', $t->subject);
                        $eml_subject->set('ticket_subject', $t->subject);
                        $subj = $eml_subject->output();

                        $eml_message = new Template($eml->message);
                        $eml_message->set('client_name', $account);
                        $eml_message->set('client_email', $email);
                        $eml_message->set('priority', $t->urgency);
                        $eml_message->set('urgency', $t->urgency);
                        $eml_message->set('ticket_subject', $t->subject);
                        $eml_message->set('status', $t->urgency);
                        $eml_message->set('ticket_status', $t->status);
                        $eml_message->set('ticket_urgency', $t->urgency);
                        $eml_message->set('ticket_priority', $t->urgency);
                        $eml_message->set('ticket_id', $t->tid);
                        $eml_message->set('ticket_message', $message);
                        $eml_message->set(
                            'business_name',
                            $config['CompanyName']
                        );
                        $eml_message->set('ticket_link', $client_view_link);
                        $message_o = $eml_message->output();

                        if ($reply_type !== 'internal') {
                            Email::sendEmail(
                                $config,
                                $_L,
                                $t->account,
                                $email,
                                $subj,
                                $message_o,
                                $cid
                            );
                        }
                    }
                } else {
                    $eml = ORM::for_table('sys_email_templates')
                        ->where('tplname', 'Tickets:Client Response')
                        ->where('send', 'Yes')
                        ->first();

                    if (APP_STAGE == 'Dev') {
                        Logger::write('Sending email to admin.');
                    }

                    if ($eml) {
                        if (APP_STAGE == 'Dev') {
                            Logger::write('Sending email to admin..');
                        }

                        $client_view_link =
                            U . 'client/tickets/view/' . $t->tid . '/';

                        $ticket_link = U . 'tickets/admin/view/' . $t->id;

                        $eml_subject = new Template($eml->subject);
                        $eml_subject->set(
                            'business_name',
                            $config['CompanyName']
                        );
                        $eml_subject->set('subject', $t->subject);
                        $eml_subject->set('ticket_subject', $t->subject);
                        $subj = $eml_subject->output();

                        $eml_message = new Template($eml->message);
                        $eml_message->set('client_name', $account);
                        $eml_message->set('client_email', $email);
                        $eml_message->set('priority', $t->urgency);
                        $eml_message->set('urgency', $t->urgency);
                        $eml_message->set('ticket_subject', $t->subject);
                        $eml_message->set('status', $t->urgency);
                        $eml_message->set('ticket_status', $t->status);
                        $eml_message->set('ticket_urgency', $t->urgency);
                        $eml_message->set('ticket_priority', $t->urgency);
                        $eml_message->set('ticket_id', $t->tid);
                        $eml_message->set('ticket_message', $message);
                        $eml_message->set(
                            'business_name',
                            $config['CompanyName']
                        );
                        $eml_message->set('ticket_link', $ticket_link);
                        $message_o = $eml_message->output();

                        $users = User::all();

                        foreach ($users as $user) {
                            if ($user->email_notify) {
                                Email::sendEmail(
                                    $config,
                                    $_L,
                                    '',
                                    $user->username,
                                    $subj,
                                    $message_o,
                                    $cid
                                );
                            }
                        }
                    }
                }
            }
        } else {
            $ret_val = [
                "success" => "No",
                "msg" => $msg,
            ];
        }

        return $ret_val;
    }

    public static function addPredefinedReply($data = [])
    {
        $msg = '';

        $id = '';

        $success = 'No';

        if (!isset($data['title']) || $data['title'] == '') {
            $msg .= 'Title is required. <br>';
        }

        if (!isset($data['message']) || $data['message'] == '') {
            $msg .= 'Message is required. <br>';
        }

        if ($msg == '') {
            $d = ORM::for_table('sys_canned_responses')->create();

            $d->title = $data['title'];
            $d->message = $data['message'];
            $d->save();

            $success = 'Yes';

            $id = $d->id();

            $msg = 'Added Successfully';
        }

        return [
            "success" => $success,
            "msg" => $msg,
            "id" => $id,
        ];
    }

    public static function deletePredefinedReply($id)
    {
        $d = ORM::for_table('sys_canned_responses')->find($id);

        if ($d) {
            $d->delete();

            return true;
        }

        return false;
    }

    public static function departments()
    {
        return ORM::for_table('sys_ticketdepartments')
            ->select('dname', 'value')
            ->find_array();
    }
}