183 lines
7.6 KiB
PHP
183 lines
7.6 KiB
PHP
<?php
|
|
|
|
class HistoricTicketModel {
|
|
public $id;
|
|
public $ticket_number;
|
|
public $ticket_verifier;
|
|
public $priority;
|
|
public $status_id;
|
|
public $status;
|
|
public $type_id;
|
|
public $type;
|
|
public $user_id;
|
|
public $agent_id;
|
|
public $contact_id;
|
|
public $company;
|
|
public $company_id;
|
|
public $first_name;
|
|
public $middle_name;
|
|
public $last_name;
|
|
public $email;
|
|
public $phone;
|
|
public $subject;
|
|
public $ctime;
|
|
public $mtime;
|
|
public $muser_id;
|
|
public $files_folder_id;
|
|
public $unseen;
|
|
public $group_id;
|
|
public $order_id;
|
|
public $last_response_time;
|
|
public $cc_addresses;
|
|
|
|
|
|
public function __construct($data = []) {
|
|
foreach ($data as $field => $value) {
|
|
if (property_exists(get_called_class(), $field)) {
|
|
$this->$field = $value;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function generateFilterCondition(?string $filterValue, string $columnName): string {
|
|
$sql = "";
|
|
if (!empty($filterValue)) {
|
|
$filterItems = explode(" ", $filterValue);
|
|
foreach ($filterItems as $item) {
|
|
$sql .= " AND `$columnName` LIKE '%" . $item . "%'";
|
|
}
|
|
}
|
|
|
|
return $sql;
|
|
}
|
|
|
|
public static function getSqlFilter($filters): string {
|
|
$sql = isset($filters['subject']) ? self::generateFilterCondition($filters['subject'], "subject") : "";
|
|
$sql .= isset($filters['ticket_number']) ? self::generateFilterCondition($filters['ticket_number'], "ticket_number") : "";
|
|
$sql .= isset($filters['priority']) ? " AND `priority` = " . $filters['priority'] : "";
|
|
$sql .= isset($filters['status']) ? self::generateFilterCondition($filters['status'], "status") : "";
|
|
$sql .= isset($filters['status_id']) ? " AND `status_id` = " . $filters['status_id'] : "";
|
|
$sql .= isset($filters['type']) ? self::generateFilterCondition($filters['type'], "type") : "";
|
|
$sql .= isset($filters['type_id']) ? " AND `type_id` = " . $filters['type_id'] : "";
|
|
$sql .= isset($filters['user_id']) ? " AND `user_id` = " . $filters['user_id'] : "";
|
|
$sql .= isset($filters['agent_id']) ? " AND `agent_id` = " . $filters['agent_id'] : "";
|
|
$sql .= isset($filters['contact_id']) ? " AND `contact_id` = " . $filters['contact_id'] : "";
|
|
$sql .= isset($filters['company']) ? self::generateFilterCondition($filters['company'], "company") : "";
|
|
$sql .= isset($filters['company_id']) ? " AND `company_id` = " . $filters['company_id'] : "";
|
|
$sql .= isset($filters['middle_name']) ? self::generateFilterCondition($filters['middle_name'], "middle_name") : "";
|
|
$sql .= isset($filters['last_name']) ? self::generateFilterCondition($filters['last_name'], "last_name") : "";
|
|
$sql .= isset($filters['email']) ? " AND `email` LIKE '%" . $filters['email'] . "%'" : "";
|
|
$sql .= isset($filters['phone']) ? " AND `phone` LIKE '%" . $filters['phone'] . "%'" : "";
|
|
$sql .= isset($filters['ctime']) ? " AND `ctime` = " . $filters['ctime'] : "";
|
|
$sql .= isset($filters['mtime']) ? " AND `mtime` = " . $filters['mtime'] : "";
|
|
$sql .= isset($filters['muser_id']) ? " AND `muser_id` = " . $filters['muser_id'] : "";
|
|
$sql .= isset($filters['files_folder_id']) ? " AND `files_folder_id` = " . $filters['files_folder_id'] : "";
|
|
$sql .= isset($filters['unseen']) ? " AND `unseen` = " . $filters['unseen'] : "";
|
|
$sql .= isset($filters['group_id']) ? " AND `group_id` = " . $filters['group_id'] : "";
|
|
$sql .= isset($filters['order_id']) ? " AND `order_id` = " . $filters['order_id'] : "";
|
|
$sql .= isset($filters['last_response_time']) ? " AND `last_response_time` = " . $filters['last_response_time'] : "";
|
|
$sql .= isset($filters['cc_addresses']) ? self::generateFilterCondition($filters['cc_addresses'], "cc_addresses") : "";
|
|
|
|
if (isset($filters['first_name'])) {
|
|
$filterItems = explode(" ", $filters['first_name']);
|
|
foreach ($filterItems as $item) {
|
|
$sql .= " AND (`first_name` LIKE '%" . $item . "%' OR `middle_name` LIKE '%" . $item . "%' OR `last_name` LIKE '%" . $item . "%')";
|
|
}
|
|
}
|
|
|
|
return $sql;
|
|
}
|
|
|
|
public static function getAllHistoricTickets($filters, $limit = null, $offset = 0): array {
|
|
$db = FronkDB::singleton();
|
|
$sql = "SELECT * FROM `HistoricTicket` WHERE 1 " . self::getSqlFilter($filters) . " ORDER BY `ticket_number` DESC";
|
|
$sql .= $limit === null ? "" : " LIMIT " . $limit . " OFFSET " . $offset;
|
|
|
|
$result = $db->query($sql);
|
|
$rows = [];
|
|
while ($row = $result->fetch_assoc()) {
|
|
$rows[] = $row;
|
|
}
|
|
|
|
return $rows;
|
|
}
|
|
|
|
public static function countHistoricTickets($filters) {
|
|
$db = FronkDB::singleton();
|
|
$sql = "SELECT COUNT(*) as `total_rows` FROM `HistoricTicket` WHERE 1 " . self::getSqlFilter($filters);
|
|
$result = $db->query($sql);
|
|
return $result->fetch_assoc()['total_rows'];
|
|
}
|
|
|
|
public static function findHistoricTicket($ticketNumber): array {
|
|
$db = FronkDB::singleton();
|
|
|
|
$ticketSql = "SELECT * FROM `HistoricTicket` WHERE `ticket_number` = " . $ticketNumber;
|
|
$ticketResult = $db->query($ticketSql);
|
|
$ticket = $ticketResult->fetch_assoc();
|
|
|
|
$messagesSql = "SELECT * FROM `HistoricTicketMessage` WHERE `ticket_id` = " . $ticket["id"];
|
|
$messagesResult = $db->query($messagesSql);
|
|
$messages = [];
|
|
while ($message = $messagesResult->fetch_assoc()) {
|
|
$messages[] = $message;
|
|
}
|
|
|
|
return [
|
|
"ticket" => $ticket,
|
|
"messages" => $messages
|
|
];
|
|
}
|
|
|
|
public static function findTicket($query): array {
|
|
$db = FronkDB::singleton();
|
|
$ticketSql = "SELECT * FROM `HistoricTicket` WHERE `ticket_number` LIKE '%" . $query . "%' OR `subject` LIKE '%" . $query . "%' OR `first_name` LIKE '%" . $query . "%' OR `last_name` LIKE '%" . $query . "%'";
|
|
$ticketResult = $db->query($ticketSql);
|
|
$tickets = [];
|
|
while ($ticket = $ticketResult->fetch_assoc()) {
|
|
$tickets[] = $ticket;
|
|
}
|
|
|
|
//explore $query by space and add each word to the sql query with and
|
|
$query = explode(" ", $query);
|
|
|
|
$whereStr = "";
|
|
foreach ($query as $word) {
|
|
$whereStr .= " AND `content` LIKE '%" . $word . "%'";
|
|
}
|
|
|
|
$messagesSql = "SELECT * FROM `HistoricTicketMessage`
|
|
LEFT JOIN `HistoricTicket` ON `HistoricTicket`.`id` = `HistoricTicketMessage`.`ticket_id`
|
|
WHERE 1 AND `content` " . $whereStr;
|
|
$messagesResult = $db->query($messagesSql);
|
|
$messages = [];
|
|
while ($message = $messagesResult->fetch_assoc()) {
|
|
$messages[] = $message;
|
|
}
|
|
|
|
$return = [];
|
|
|
|
foreach ($tickets as $ticket) {
|
|
$return[] = [
|
|
"table_entry" => "ticket",
|
|
"ticket_id" => $ticket["id"],
|
|
"ticket_number" => $ticket["ticket_number"],
|
|
"ctime" => $ticket["ctime"],
|
|
"ticket_subject" => $ticket["subject"],
|
|
];
|
|
}
|
|
|
|
foreach ($messages as $message) {
|
|
$return[] = [
|
|
"table_entry" => "message",
|
|
"ticket_id" => $message["ticket_id"],
|
|
"ticket_number" => $message["ticket_number"],
|
|
"ticket_subject" => $message["subject"],
|
|
"ctime" => $message["ctime"],
|
|
"ticket_message" => $message["content"],
|
|
];
|
|
}
|
|
|
|
return $return;
|
|
}
|
|
} |