Merge branch 'feature/add-historic-tickets' into 'master'
Feature/add historic tickets See merge request fronk/thetool!292
This commit is contained in:
9
application/HistoricTicket/HistoricTicket.php
Normal file
9
application/HistoricTicket/HistoricTicket.php
Normal file
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @property mixed|null $name
|
||||
*/
|
||||
class HistoricTicket extends mfBaseModel
|
||||
{
|
||||
|
||||
}
|
||||
103
application/HistoricTicket/HistoricTicketController.php
Normal file
103
application/HistoricTicket/HistoricTicketController.php
Normal 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)
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
174
application/HistoricTicket/HistoricTicketModel.php
Normal file
174
application/HistoricTicket/HistoricTicketModel.php
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user