Files
thetool/application/HistoricTicket/HistoricTicketModel.php
2024-03-12 16:17:23 +01:00

174 lines
7.3 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['first_name']) ? self::generateFilterCondition($filters['first_name'], "first_name") : "";
$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") : "";
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"],
"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"],
"ticket_message" => $message["content"],
];
}
return $return;
}
}