Merge branch 'feature/add-historic-tickets' into 'master'

Feature/add historic tickets

See merge request fronk/thetool!292
This commit is contained in:
Frank Schubert
2024-03-12 15:53:46 +00:00
7 changed files with 810 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
<?php
/**
* @property mixed|null $name
*/
class HistoricTicket extends mfBaseModel
{
}

View File

@@ -0,0 +1,103 @@
<?php
class HistoricTicketController extends mfBaseController {
private User $me;
protected function init(): void {
$me = new User();
$me->loadMe();
$this->layout()->set("me", $me);
$this->me = $me;
}
protected function indexAction(): void {
if (!$this->me->is("employee")) {
$this->redirect("dashboard");
}
$this->layout()->setTemplate("HistoricTicket/Index");
}
protected function apiAction() {
$do = $this->request->do;
if ($do !== "getConfig" && !$this->me->is("employee")) {
$this->redirect("dashboard");
}
switch ($do) {
case "getHistoricTickets":
$return = $this->getHistoricTickets();
break;
case "getHistoricTicketMessages":
$return = $this->getHistoricTicketMessages();
break;
case "findHistoricTicket":
$return = $this->findHistoricTicket();
break;
default:
$return = false;
break;
}
if (!$return) {
$return = [
"status" => "error",
"message" => "Invalid request."
];
}
die(json_encode($return));
}
private function getHistoricTickets(): array {
$json = json_decode(file_get_contents('php://input'), true);
$filters = $json['filters'] ?? [];
$page = $json['pagination']['page'] ?? 1;
$perPage = $json['pagination']['per_page'] ?? 10;
$historicTickets = HistoricTicketModel::getAllHistoricTickets($filters, $perPage, ($page - 1) * $perPage);
$total = HistoricTicketModel::countHistoricTickets($filters);
return [
"rows" => $historicTickets,
"pagination" => [
"page" => $page,
"total_pages" => ceil($total / $perPage),
"per_page" => $perPage,
"total_rows" => intval($total)
]
];
}
private function getHistoricTicketMessages(): array {
$json = json_decode(file_get_contents('php://input'), true);
$ticketNumber = $json['ticketNumber'];
return HistoricTicketModel::findHistoricTicket($ticketNumber);
}
private function findHistoricTicket(): array {
$query = $this->request->query;
if (empty($query)) {
return [
"status" => "error",
"message" => "No query provided."
];
}
$rows = HistoricTicketModel::findTicket($query);
return [
"rows" => $rows,
"pagination" => [
"page" => 1,
"total_pages" => 1,
"per_page" => count($rows),
"total_rows" => count($rows)
]
];
}
}

View File

@@ -0,0 +1,174 @@
<?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;
}
}