$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, $order = null): array { $db = FronkDB::singleton(); $sql = "SELECT * FROM `HistoricTicket` WHERE 1 " . self::getSqlFilter($filters); $sql .= $order === null || $order['key'] === null ? " ORDER BY `ticket_number` DESC " : " ORDER BY `" . $order['key'] . "` " . $order['order']; $sql .= $limit === null ? "" : " LIMIT " . $limit . " OFFSET " . $offset; // die($sql); $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" => intval($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" => intval($message["ctime"]), "ticket_message" => $message["content"], ]; } return $return; } }