mirror of
https://port.numenaute.org/aleajactaest/khanat-opennel-code.git
synced 2024-12-29 20:30:54 +00:00
Fix #180
This commit is contained in:
parent
011869167d
commit
fdc514b039
6 changed files with 249 additions and 253 deletions
|
@ -6,12 +6,12 @@
|
|||
*/
|
||||
class Assigned{
|
||||
|
||||
private $user; /**< The id of the user being assigned */
|
||||
private $ticket; /**< The id of the ticket being assigned */
|
||||
|
||||
|
||||
private $user; /**< The id of the user being assigned */
|
||||
private $ticket; /**< The id of the ticket being assigned */
|
||||
|
||||
|
||||
////////////////////////////////////////////Functions////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* Assigns a ticket to a user or returns an error message.
|
||||
* It will first check if the ticket isn't already assigned, if not, it will create a new 'assigned' entry.
|
||||
|
@ -30,10 +30,10 @@ class Assigned{
|
|||
}else{
|
||||
return "ALREADY_ASSIGNED";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Unassign a ticket being coupled to a user or return an error message.
|
||||
* It will first check if the ticket is assigned, if this is indeed the case it will delete the 'assigned' entry.
|
||||
|
@ -52,9 +52,9 @@ class Assigned{
|
|||
}else{
|
||||
return "NOT_ASSIGNED";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the (external) id of the user assigned to a ticket
|
||||
* @param $ticket_id the Id of the ticket that's being queried
|
||||
|
@ -65,11 +65,11 @@ class Assigned{
|
|||
$statement = $dbl->execute("SELECT ticket_user.ExternId FROM `assigned` JOIN `ticket_user` ON assigned.User = ticket_user.TUserId WHERE `Ticket` = :ticket_id", Array('ticket_id' => $ticket_id));
|
||||
$user_id = $statement->fetch();
|
||||
return $user_id['ExternId'];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if a ticket is already assigned (in case the user_id param is used, it will check if it's assigned to that user)
|
||||
* @param $ticket_id the Id of the ticket that's being queried
|
||||
|
@ -79,26 +79,26 @@ class Assigned{
|
|||
public static function isAssigned( $ticket_id, $user_id = 0) {
|
||||
$dbl = new DBLayer("lib");
|
||||
//check if ticket is already assigned
|
||||
|
||||
|
||||
if($user_id == 0 && $dbl->select("`assigned`", array('ticket_id' => $ticket_id), "`Ticket` = :ticket_id")->rowCount() ){
|
||||
return true;
|
||||
}else if( $dbl->select("`assigned`", array('ticket_id' => $ticket_id, 'user_id' => $user_id), "`Ticket` = :ticket_id and `User` = :user_id")->rowCount() ){
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////Methods////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* A constructor.
|
||||
* Empty constructor
|
||||
*/
|
||||
public function __construct() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* sets the object's attributes.
|
||||
* @param $values should be an array of the form array('User' => user_id, 'Ticket' => ticket_id).
|
||||
|
@ -107,25 +107,25 @@ class Assigned{
|
|||
$this->setUser($values['User']);
|
||||
$this->setTicket($values['Ticket']);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* creates a new 'assigned' entry.
|
||||
* this method will use the object's attributes for creating a new 'assigned' entry in the database.
|
||||
*/
|
||||
public function create() {
|
||||
$dbl = new DBLayer("lib");
|
||||
$dbl->insert("`assigned`", Array('User' => $this->getUser(), 'Ticket' => $this->getTicket());
|
||||
$dbl->insert("`assigned`", Array('User' => $this->getUser(), 'Ticket' => $this->getTicket()));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* deletes an existing 'assigned' entry.
|
||||
* this method will use the object's attributes for deleting an existing 'assigned' entry in the database.
|
||||
*/
|
||||
public function delete() {
|
||||
$dbl = new DBLayer("lib");
|
||||
$dbl->delete("`assigned`", array('user_id' => $this->getUser() ,'ticket_id' => $this->getTicket(), "`User` = :user_id and `Ticket` = :ticket_id");
|
||||
$dbl->delete("`assigned`", array('user_id' => $this->getUser() ,'ticket_id' => $this->getTicket(), "`User` = :user_id and `Ticket` = :ticket_id"));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -139,25 +139,25 @@ class Assigned{
|
|||
$row = $statement->fetch();
|
||||
$this->set($row);
|
||||
}
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////Getters////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* get user attribute of the object.
|
||||
*/
|
||||
public function getUser(){
|
||||
return $this->user;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* get ticket attribute of the object.
|
||||
*/
|
||||
public function getTicket(){
|
||||
return $this->ticket;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////Setters////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
|
@ -167,7 +167,7 @@ class Assigned{
|
|||
public function setUser($u){
|
||||
$this->user = $u;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set ticket attribute of the object.
|
||||
* @param $t integer id of the ticket
|
||||
|
@ -175,6 +175,6 @@ class Assigned{
|
|||
public function setTicket($t){
|
||||
$this->ticket = $t;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -240,30 +240,26 @@ class DBLayer {
|
|||
* @param array $data array of data to insert in format('fieldname' => $value,....). 'fieldname' must be a field in that table.
|
||||
* @throws error in inserting.
|
||||
*/
|
||||
public function insert( $tb_name, $data ) {
|
||||
public function insert($tb_name, $data, $datafunc = array()) {
|
||||
$this->useDb();
|
||||
$field_values = ':' . implode( ',:', array_keys( $data ) );
|
||||
$field_options = implode( ',', array_keys( $data ) );
|
||||
$field_options = implode(',', array_merge(array_keys($data), array_keys($datafunc)));
|
||||
$field_values = implode(',', array_merge(array(':' . implode(',:', array_keys($data))), array_values($datafunc)));
|
||||
try {
|
||||
$sth = $this -> PDO -> prepare( "INSERT INTO $tb_name ($field_options) VALUE ($field_values)" );
|
||||
foreach ( $data as $key => $value )
|
||||
{
|
||||
|
||||
$sth -> bindValue( ":$key", $value );
|
||||
}
|
||||
$this -> PDO -> beginTransaction();
|
||||
$sth = $this->PDO->prepare("INSERT INTO $tb_name ($field_options) VALUE ($field_values)");
|
||||
foreach ($data as $key => $value) {
|
||||
$sth->bindValue(":$key", $value);
|
||||
}
|
||||
$this->PDO->beginTransaction();
|
||||
// execution
|
||||
$sth -> execute();
|
||||
$this -> PDO -> commit();
|
||||
|
||||
}
|
||||
catch ( Exception $e )
|
||||
{
|
||||
// for rolling back the changes during transaction
|
||||
$this -> PDO -> rollBack();
|
||||
throw new Exception( "error in inserting" );
|
||||
}
|
||||
$sth->execute();
|
||||
$this->PDO->commit();
|
||||
}
|
||||
catch (Exception $e) {
|
||||
// for rolling back the changes during transaction
|
||||
$this->PDO->rollBack();
|
||||
throw $e; // new Exception("error in inserting");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete database entery using prepared statement.
|
||||
|
|
|
@ -3,16 +3,16 @@
|
|||
* Handles the forwarding of a ticket to a support_group. This is being used to transfer tickets to different groups (eg Developers, Website-Team, SupportGroup etc..)
|
||||
* The idea is that someone can easily forward a ticket to a group and by doing that, the moderators that are in that group will receive the ticket in their todo queue.
|
||||
* @author Daan Janssens, mentored by Matthew Lagoe
|
||||
*
|
||||
*
|
||||
*/
|
||||
class Forwarded{
|
||||
|
||||
private $group; /**< The id of the group to which the ticket is being forwarded */
|
||||
private $ticket; /**< The id of the ticket being forwarded */
|
||||
|
||||
|
||||
private $group; /**< The id of the group to which the ticket is being forwarded */
|
||||
private $ticket; /**< The id of the ticket being forwarded */
|
||||
|
||||
////////////////////////////////////////////Functions////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Forward a ticket to a group, also removes the previous group where it was forwarded to.
|
||||
* It will first check if the ticket is already forwarded, if that's the case, it will delete that entry.
|
||||
|
@ -32,10 +32,10 @@ class Forwarded{
|
|||
$forward->set(array('Group' => $group_id, 'Ticket' => $ticket_id));
|
||||
$forward->create();
|
||||
return "SUCCESS_FORWARDED";
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* get the id of the group a ticket is forwarded to.
|
||||
* @param $ticket_id the id of the ticket.
|
||||
|
@ -46,8 +46,8 @@ class Forwarded{
|
|||
$forw->load($ticket_id);
|
||||
return $forw->getGroup();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* check if the ticket is forwarded
|
||||
* @param $ticket_id the id of the ticket.
|
||||
|
@ -59,21 +59,21 @@ class Forwarded{
|
|||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////Methods////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* A constructor.
|
||||
* Empty constructor
|
||||
*/
|
||||
public function __construct() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* sets the object's attributes.
|
||||
* @param $values should be an array of the form array('Group' => group_id, 'Ticket' => ticket_id).
|
||||
|
@ -82,8 +82,8 @@ class Forwarded{
|
|||
$this->setGroup($values['Group']);
|
||||
$this->setTicket($values['Ticket']);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* creates a new 'forwarded' entry.
|
||||
* this method will use the object's attributes for creating a new 'forwarded' entry in the database.
|
||||
|
@ -92,15 +92,15 @@ class Forwarded{
|
|||
$dbl = new DBLayer("lib");
|
||||
$dbl->insert("`forwarded`", Array('Group' => $this->getGroup(), 'Ticket' => $this->getTicket()));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* deletes an existing 'forwarded' entry.
|
||||
* this method will use the object's attributes for deleting an existing 'forwarded' entry in the database.
|
||||
*/
|
||||
public function delete() {
|
||||
$dbl = new DBLayer("lib");
|
||||
$dbl->delete("`forwarded`", array('group_id' => $this->getGroup() ,'ticket_id' => $this->getTicket(), "`Group` = :group_id and `Ticket` = :ticket_id");
|
||||
$dbl->delete("`forwarded`", array('group_id' => $this->getGroup() ,'ticket_id' => $this->getTicket(), "`Group` = :group_id and `Ticket` = :ticket_id"));
|
||||
}
|
||||
|
||||
|
||||
|
@ -115,24 +115,24 @@ class Forwarded{
|
|||
$row = $statement->fetch();
|
||||
$this->set($row);
|
||||
}
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////Getters////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* get group attribute of the object.
|
||||
*/
|
||||
public function getGroup(){
|
||||
return $this->group;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get ticket attribute of the object.
|
||||
*/
|
||||
public function getTicket(){
|
||||
return $this->ticket;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////Setters////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
|
@ -142,7 +142,7 @@ class Forwarded{
|
|||
public function setGroup($g){
|
||||
$this->group = $g;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set ticket attribute of the object.
|
||||
* @param $t integer id of the ticket
|
||||
|
@ -150,6 +150,6 @@ class Forwarded{
|
|||
public function setTicket($t){
|
||||
$this->ticket = $t;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -6,19 +6,19 @@
|
|||
* @author Daan Janssens, mentored by Matthew Lagoe
|
||||
*/
|
||||
class Ticket{
|
||||
|
||||
private $tId; /**< The id of ticket */
|
||||
private $timestamp; /**< Timestamp of the ticket */
|
||||
private $title; /**< Title of the ticket */
|
||||
private $status; /**< Status of the ticket (0 = waiting on user reply, 1 = waiting on support, (2= not used atm), 3 = closed */
|
||||
private $queue; /**< (not in use atm) */
|
||||
private $ticket_category; /**< the id of the category belonging to the ticket */
|
||||
private $author; /**< The ticket_users id */
|
||||
private $priority; /**< The priority of the ticket where 0 = low, 3= supadupahigh */
|
||||
|
||||
|
||||
private $tId; /**< The id of ticket */
|
||||
private $timestamp; /**< Timestamp of the ticket */
|
||||
private $title; /**< Title of the ticket */
|
||||
private $status; /**< Status of the ticket (0 = waiting on user reply, 1 = waiting on support, (2= not used atm), 3 = closed */
|
||||
private $queue; /**< (not in use atm) */
|
||||
private $ticket_category; /**< the id of the category belonging to the ticket */
|
||||
private $author; /**< The ticket_users id */
|
||||
private $priority; /**< The priority of the ticket where 0 = low, 3= supadupahigh */
|
||||
|
||||
////////////////////////////////////////////Functions////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* check if a ticket exists.
|
||||
* @param $id the id of the ticket to be checked.
|
||||
|
@ -31,10 +31,10 @@ class Ticket{
|
|||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* return an array of the possible statuses
|
||||
* @return an array containing the string values that represent the different statuses.
|
||||
|
@ -51,8 +51,8 @@ class Ticket{
|
|||
public static function getPriorityArray() {
|
||||
return Array("Low","Normal","High","Super Dupa High");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* return an entire ticket.
|
||||
* returns the ticket object and an array of all replies to that ticket.
|
||||
|
@ -64,10 +64,10 @@ class Ticket{
|
|||
$ticket = new Ticket();
|
||||
$ticket->load_With_TId($id);
|
||||
$reply_array = Ticket_Reply::getRepliesOfTicket($id, $view_as_admin);
|
||||
return Array('ticket_obj' => $ticket,'reply_array' => $reply_array);
|
||||
return Array('ticket_obj' => $ticket,'reply_array' => $reply_array);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* return all tickets of a specific user.
|
||||
* an array of all tickets created by a specific user are returned by this function.
|
||||
|
@ -90,11 +90,11 @@ class Ticket{
|
|||
$instance->setAuthor($ticket['Author']);
|
||||
$result[] = $instance;
|
||||
}
|
||||
return $result;
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* function that creates a new ticket.
|
||||
* A new ticket will be created, in case the extra_info != 0 and the http request came from ingame, then a ticket_info page will be created.
|
||||
|
@ -117,13 +117,13 @@ class Ticket{
|
|||
$ticket->set($values);
|
||||
$ticket->create();
|
||||
$ticket_id = $ticket->getTId();
|
||||
|
||||
|
||||
//if ingame then add an extra info
|
||||
if(Helpers::check_if_game_client() && $extra_info != 0){
|
||||
$extra_info['Ticket'] = $ticket_id;
|
||||
Ticket_Info::create_Ticket_Info($extra_info);
|
||||
}
|
||||
|
||||
|
||||
//write a log entry
|
||||
if ( $author == $real_author){
|
||||
Ticket_Log::createLogEntry( $ticket_id, $author, 1);
|
||||
|
@ -131,18 +131,18 @@ class Ticket{
|
|||
Ticket_Log::createLogEntry( $ticket_id, $real_author, 2, $author);
|
||||
}
|
||||
Ticket_Reply::createReply($content, $author, $ticket_id, 0, $author);
|
||||
|
||||
|
||||
//forwards the ticket directly after creation to the supposed support group
|
||||
if($for_support_group){
|
||||
Ticket::forwardTicket(0, $ticket_id, $for_support_group);
|
||||
}
|
||||
|
||||
|
||||
//send email that new ticket has been created
|
||||
Mail_Handler::send_ticketing_mail($ticket->getAuthor(), $ticket, $content, "NEW", $ticket->getForwardedGroupId());
|
||||
return $ticket_id;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* updates the ticket's status.
|
||||
|
@ -152,7 +152,7 @@ class Ticket{
|
|||
* @param $author the user (id) that performed the update status action
|
||||
*/
|
||||
public static function updateTicketStatus( $ticket_id, $newStatus, $author) {
|
||||
|
||||
|
||||
$ticket = new Ticket();
|
||||
$ticket->load_With_TId($ticket_id);
|
||||
if ($ticket->getStatus() != $newStatus){
|
||||
|
@ -160,10 +160,10 @@ class Ticket{
|
|||
Ticket_Log::createLogEntry( $ticket_id, $author, 5, $newStatus);
|
||||
}
|
||||
$ticket->update();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* updates the ticket's status & priority.
|
||||
* A log entry about this will be created only if the newStatus is different from the current status and also when the newPriority is different from the current priority.
|
||||
|
@ -174,7 +174,7 @@ class Ticket{
|
|||
* @param $author the user (id) that performed the update
|
||||
*/
|
||||
public static function updateTicketStatusAndPriority( $ticket_id, $newStatus, $newPriority, $author) {
|
||||
|
||||
|
||||
$ticket = new Ticket();
|
||||
$ticket->load_With_TId($ticket_id);
|
||||
if ($ticket->getStatus() != $newStatus){
|
||||
|
@ -186,10 +186,10 @@ class Ticket{
|
|||
Ticket_Log::createLogEntry( $ticket_id, $author, 6, $newPriority);
|
||||
}
|
||||
$ticket->update();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* return the latest reply of a ticket
|
||||
* @param $ticket_id the id of the ticket.
|
||||
|
@ -202,8 +202,8 @@ class Ticket{
|
|||
$reply->set($statement->fetch());
|
||||
return $reply;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* create a new reply for a ticket.
|
||||
* A reply will only be added if the content isn't empty and if the ticket isn't closed.
|
||||
|
@ -222,13 +222,13 @@ class Ticket{
|
|||
//if status is not closed
|
||||
if($ticket->getStatus() != 3){
|
||||
Ticket_Reply::createReply($content, $author, $ticket_id, $hidden, $ticket->getAuthor());
|
||||
|
||||
|
||||
//notify ticket author that a new reply is added!
|
||||
if($ticket->getAuthor() != $author){
|
||||
Mail_Handler::send_ticketing_mail($ticket->getAuthor(), $ticket, $content, "REPLY", $ticket->getForwardedGroupId());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}else{
|
||||
//TODO: Show error message that ticket is closed
|
||||
}
|
||||
|
@ -236,8 +236,8 @@ class Ticket{
|
|||
//TODO: Show error content is empty
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* assign a ticket to a user.
|
||||
* Checks if the ticket exists, if so then it will try to assign the user to it, a log entry will be written about this.
|
||||
|
@ -254,8 +254,8 @@ class Ticket{
|
|||
return "TICKET_NOT_EXISTING";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* unassign a ticket of a user.
|
||||
* Checks if the ticket exists, if so then it will try to unassign the user of it, a log entry will be written about this.
|
||||
|
@ -272,8 +272,8 @@ class Ticket{
|
|||
return "TICKET_NOT_EXISTING";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* forward a ticket to a specific support group.
|
||||
* Checks if the ticket exists, if so then it will try to forward the ticket to the support group specified, a log entry will be written about this.
|
||||
|
@ -288,7 +288,7 @@ class Ticket{
|
|||
if(isset($group_id) && $group_id != ""){
|
||||
//forward the ticket
|
||||
$returnvalue = Forwarded::forwardTicket($group_id, $ticket_id);
|
||||
|
||||
|
||||
if($user_id != 0){
|
||||
//unassign the ticket incase the ticket is assined to yourself
|
||||
self::unAssignTicket($user_id, $ticket_id);
|
||||
|
@ -303,12 +303,12 @@ class Ticket{
|
|||
return "TICKET_NOT_EXISTING";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////Methods////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* A constructor.
|
||||
* Empty constructor
|
||||
|
@ -335,18 +335,18 @@ class Ticket{
|
|||
$this->author = $values['Author'];
|
||||
$this->priority = $values['Priority'];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* creates a new 'ticket' entry.
|
||||
* this method will use the object's attributes for creating a new 'ticket' entry in the database.
|
||||
*/
|
||||
public function create(){
|
||||
$dbl = new DBLayer("lib");
|
||||
$this->tId = $dbl->executeReturnId("ticket", Array('Timestamp'=>now(), 'Title' => $this->title, 'Status' => $this->status, 'Queue' => $this->queue, 'Ticket_Category' => $this->ticket_category, 'Author' => $this->author, 'Priority' => $this->priority));
|
||||
$this->tId = $dbl->executeReturnId("ticket", Array('Title' => $this->title, 'Status' => $this->status, 'Queue' => $this->queue, 'Ticket_Category' => $this->ticket_category, 'Author' => $this->author, 'Priority' => $this->priority), array('Timestamp'=>'now()'));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* loads the object's attributes.
|
||||
* loads the object's attributes by giving a TId (ticket id).
|
||||
|
@ -365,8 +365,8 @@ class Ticket{
|
|||
$this->author = $row['Author'];
|
||||
$this->priority = $row['Priority'];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* update the objects attributes to the db.
|
||||
*/
|
||||
|
@ -374,8 +374,8 @@ class Ticket{
|
|||
$dbl = new DBLayer("lib");
|
||||
$dbl->update("ticket", Array('Timestamp' => $this->timestamp, 'Title' => $this->title, 'Status' => $this->status, 'Queue' => $this->queue, 'Ticket_Category' => $this->ticket_category, 'Author' => $this->author, 'Priority' => $this->priority), "TId=$this->tId");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* check if a ticket has a ticket_info page or not.
|
||||
* @return true or false
|
||||
|
@ -383,38 +383,38 @@ class Ticket{
|
|||
public function hasInfo(){
|
||||
return Ticket_Info::TicketHasInfo($this->getTId());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////Getters////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* get tId attribute of the object.
|
||||
*/
|
||||
public function getTId(){
|
||||
return $this->tId;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get timestamp attribute of the object in the format defined in the outputTime function of the Helperclass.
|
||||
*/
|
||||
public function getTimestamp(){
|
||||
return Helpers::outputTime($this->timestamp);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get title attribute of the object.
|
||||
*/
|
||||
public function getTitle(){
|
||||
return $this->title;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get status attribute of the object.
|
||||
*/
|
||||
public function getStatus(){
|
||||
return $this->status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get status attribute of the object in the form of text (string).
|
||||
*/
|
||||
|
@ -422,43 +422,43 @@ class Ticket{
|
|||
$statusArray = Ticket::getStatusArray();
|
||||
return $statusArray[$this->getStatus()];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get category attribute of the object in the form of text (string).
|
||||
*/
|
||||
public function getCategoryName(){
|
||||
$category = Ticket_Category::constr_TCategoryId($this->getTicket_Category());
|
||||
return $category->getName();
|
||||
return $category->getName();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get queue attribute of the object.
|
||||
*/
|
||||
public function getQueue(){
|
||||
return $this->queue;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get ticket_category attribute of the object (int).
|
||||
*/
|
||||
public function getTicket_Category(){
|
||||
return $this->ticket_category;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get author attribute of the object (int).
|
||||
*/
|
||||
public function getAuthor(){
|
||||
return $this->author;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get priority attribute of the object (int).
|
||||
*/
|
||||
public function getPriority(){
|
||||
return $this->priority;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get priority attribute of the object in the form of text (string).
|
||||
*/
|
||||
|
@ -466,7 +466,7 @@ class Ticket{
|
|||
$priorityArray = Ticket::getPriorityArray();
|
||||
return $priorityArray[$this->getPriority()];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get the user assigned to the ticket.
|
||||
* or return 0 in case not assigned.
|
||||
|
@ -479,7 +479,7 @@ class Ticket{
|
|||
return $user_id;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get the name of the support group to whom the ticket is forwarded
|
||||
* or return 0 in case not forwarded.
|
||||
|
@ -492,7 +492,7 @@ class Ticket{
|
|||
return Support_Group::getGroup($group_id)->getName();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get the id of the support group to whom the ticket is forwarded
|
||||
* or return 0 in case not forwarded.
|
||||
|
@ -506,7 +506,7 @@ class Ticket{
|
|||
}
|
||||
}
|
||||
////////////////////////////////////////////Setters////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* set tId attribute of the object.
|
||||
* @param $id integer id of the ticket
|
||||
|
@ -514,7 +514,7 @@ class Ticket{
|
|||
public function setTId($id){
|
||||
$this->tId = $id;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set timestamp attribute of the object.
|
||||
* @param $ts timestamp of the ticket
|
||||
|
@ -522,7 +522,7 @@ class Ticket{
|
|||
public function setTimestamp($ts){
|
||||
$this->timestamp = $ts;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set title attribute of the object.
|
||||
* @param $t title of the ticket
|
||||
|
@ -530,7 +530,7 @@ class Ticket{
|
|||
public function setTitle($t){
|
||||
$this->title = $t;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set status attribute of the object.
|
||||
* @param $s status of the ticket(int)
|
||||
|
@ -538,7 +538,7 @@ class Ticket{
|
|||
public function setStatus($s){
|
||||
$this->status = $s;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set queue attribute of the object.
|
||||
* @param $q queue of the ticket
|
||||
|
@ -546,7 +546,7 @@ class Ticket{
|
|||
public function setQueue($q){
|
||||
$this->queue = $q;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set ticket_category attribute of the object.
|
||||
* @param $tc ticket_category id of the ticket(int)
|
||||
|
@ -554,7 +554,7 @@ class Ticket{
|
|||
public function setTicket_Category($tc){
|
||||
$this->ticket_category = $tc;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set author attribute of the object.
|
||||
* @param $a author of the ticket
|
||||
|
@ -562,7 +562,7 @@ class Ticket{
|
|||
public function setAuthor($a){
|
||||
$this->author = $a;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set priority attribute of the object.
|
||||
* @param $p priority of the ticket
|
||||
|
@ -570,5 +570,5 @@ class Ticket{
|
|||
public function setPriority($p){
|
||||
$this->priority = $p;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* Class that handles the logging. The logging will be used when a ticket is created, a reply is added, if someone views a ticket,
|
||||
* if someone assigns a ticket to him or if someone forwards a ticket. This class provides functions to get retrieve those logs and also make them.
|
||||
*
|
||||
*
|
||||
*-the Action IDs being used are:
|
||||
* -# User X Created ticket
|
||||
* -# Admin X created ticket for arg
|
||||
|
@ -18,13 +18,13 @@
|
|||
*/
|
||||
|
||||
class Ticket_Log{
|
||||
|
||||
private $tLogId; /**< The id of the log entry */
|
||||
private $timestamp; /**< The timestamp of the log entry */
|
||||
private $query; /**< The query (json encoded array containing action id & argument) */
|
||||
private $author; /**< author of the log */
|
||||
private $ticket; /**< the id of the ticket related to the log entry */
|
||||
|
||||
|
||||
private $tLogId; /**< The id of the log entry */
|
||||
private $timestamp; /**< The timestamp of the log entry */
|
||||
private $query; /**< The query (json encoded array containing action id & argument) */
|
||||
private $author; /**< author of the log */
|
||||
private $ticket; /**< the id of the ticket related to the log entry */
|
||||
|
||||
/****************************************
|
||||
*Action ID's:
|
||||
* 1: User X Created Ticket
|
||||
|
@ -38,10 +38,10 @@ class Ticket_Log{
|
|||
* 9: unassigned to the ticket
|
||||
*
|
||||
****************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////Functions////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* return all log entries related to a ticket.
|
||||
* @param $ticket_id the id of the ticket of which we want all related log entries returned.
|
||||
|
@ -65,10 +65,10 @@ class Ticket_Log{
|
|||
$instanceLog->setQuery($log['Query']);
|
||||
$result[] = $instanceLog;
|
||||
}
|
||||
return $result;
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* create a new log entry.
|
||||
* It will check if the $TICKET_LOGGING global var is true, this var is used to turn logging on and off. In case it's on, the log message will be stored.
|
||||
|
@ -82,8 +82,8 @@ class Ticket_Log{
|
|||
global $TICKET_LOGGING;
|
||||
if($TICKET_LOGGING){
|
||||
$dbl = new DBLayer("lib");
|
||||
$values = Array('Timestamp'=>now(), 'Query' => json_encode(array($action,$arg)), 'Ticket' => $ticket_id, 'Author' => $author_id);
|
||||
$dbl->insert("ticket_log", $values);
|
||||
$values = Array('Query' => json_encode(array($action,$arg)), 'Ticket' => $ticket_id, 'Author' => $author_id);
|
||||
$dbl->insert("ticket_log", $values, array('Timestamp'=>'now()'));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -98,7 +98,7 @@ class Ticket_Log{
|
|||
$instance->setTLogId($id);
|
||||
return $instance;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* return all log entries related to a ticket.
|
||||
* @param $ticket_id the id of the ticket of which we want all related log entries returned.
|
||||
|
@ -115,19 +115,19 @@ class Ticket_Log{
|
|||
$instance->set($log);
|
||||
$result[] = $instance;
|
||||
}
|
||||
return $result;
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////Methods////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* A constructor.
|
||||
* Empty constructor
|
||||
*/
|
||||
public function __construct() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* sets the object's attributes.
|
||||
* @param $values should be an array.
|
||||
|
@ -138,7 +138,7 @@ class Ticket_Log{
|
|||
$this->setQuery($values['Query']);
|
||||
$this->setTicket($values['Ticket']);
|
||||
$this->setAuthor($values['Author']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* loads the object's attributes.
|
||||
|
@ -151,56 +151,56 @@ class Ticket_Log{
|
|||
$row = $statement->fetch();
|
||||
$this->set($row);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* update attributes of the object to the DB.
|
||||
*/
|
||||
public function update(){
|
||||
$dbl = new DBLayer("lib");
|
||||
|
||||
|
||||
$values = Array('timestamp' => $this->getTimestamp(), 'query' => $this->getQuery(), 'author' => $this->getAuthor(), 'ticket' => $this->getTicket() );
|
||||
$dbl->update("ticket_log", $values, "TLogId = $this->getTLogId()");
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////Getters////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* get tLogId attribute of the object.
|
||||
*/
|
||||
public function getTLogId(){
|
||||
return $this->tLogId;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get timestamp attribute of the object.
|
||||
*/
|
||||
public function getTimestamp(){
|
||||
return Helpers::outputTime($this->timestamp);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get query attribute of the object.
|
||||
*/
|
||||
public function getQuery(){
|
||||
return $this->query;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get author attribute of the object.
|
||||
*/
|
||||
public function getAuthor(){
|
||||
return $this->author;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get ticket attribute of the object.
|
||||
*/
|
||||
public function getTicket(){
|
||||
return $this->ticket;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get the action id out of the query by decoding it.
|
||||
*/
|
||||
|
@ -208,7 +208,7 @@ class Ticket_Log{
|
|||
$decodedQuery = json_decode($this->query);
|
||||
return $decodedQuery[0];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get the argument out of the query by decoding it.
|
||||
*/
|
||||
|
@ -216,7 +216,7 @@ class Ticket_Log{
|
|||
$decodedQuery = json_decode($this->query);
|
||||
return $decodedQuery[1];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get the action text(string) array.
|
||||
* this is being read from the language .ini files.
|
||||
|
@ -229,9 +229,9 @@ class Ticket_Log{
|
|||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////Setters////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* set tLogId attribute of the object.
|
||||
* @param $id integer id of the log entry
|
||||
|
@ -239,7 +239,7 @@ class Ticket_Log{
|
|||
public function setTLogId($id){
|
||||
$this->tLogId = $id;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set timestamp attribute of the object.
|
||||
* @param $t timestamp of the log entry
|
||||
|
@ -247,7 +247,7 @@ class Ticket_Log{
|
|||
public function setTimestamp($t){
|
||||
$this->timestamp = $t;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set query attribute of the object.
|
||||
* @param $q the encoded query
|
||||
|
@ -255,7 +255,7 @@ class Ticket_Log{
|
|||
public function setQuery($q){
|
||||
$this->query = $q;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set author attribute of the object.
|
||||
* @param $a integer id of the user who created the log entry
|
||||
|
@ -263,7 +263,7 @@ class Ticket_Log{
|
|||
public function setAuthor($a){
|
||||
$this->author = $a;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set ticket attribute of the object.
|
||||
* @param $t integer id of ticket of which the log entry is related to.
|
||||
|
@ -271,6 +271,6 @@ class Ticket_Log{
|
|||
public function setTicket($t){
|
||||
$this->ticket = $t;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -4,15 +4,15 @@
|
|||
* @author Daan Janssens, mentored by Matthew Lagoe
|
||||
*/
|
||||
class Ticket_Reply{
|
||||
private $tReplyId; /**< The id of the reply */
|
||||
private $ticket; /**< the ticket id related to the reply */
|
||||
private $content; /**< the content of the reply */
|
||||
private $author; /**< The id of the user that made the reply */
|
||||
private $timestamp; /**< The timestamp of the reply */
|
||||
private $hidden; /**< indicates if reply should be hidden for normal users or not */
|
||||
|
||||
private $tReplyId; /**< The id of the reply */
|
||||
private $ticket; /**< the ticket id related to the reply */
|
||||
private $content; /**< the content of the reply */
|
||||
private $author; /**< The id of the user that made the reply */
|
||||
private $timestamp; /**< The timestamp of the reply */
|
||||
private $hidden; /**< indicates if reply should be hidden for normal users or not */
|
||||
|
||||
////////////////////////////////////////////Functions////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* return constructed element based on TReplyId.
|
||||
* @param $id the Id the reply we want to load.
|
||||
|
@ -23,8 +23,8 @@ class Ticket_Reply{
|
|||
$instance->setTReplyId($id);
|
||||
return $instance;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* return all replies on a specific ticket.
|
||||
* @param $ticket_id the id of the ticket of which we want the replies.
|
||||
|
@ -43,12 +43,12 @@ class Ticket_Reply{
|
|||
$instanceAuthor = Ticket_User::constr_TUserId($tReply['Author']);
|
||||
$instanceAuthor->setExternId($tReply['ExternId']);
|
||||
$instanceAuthor->setPermission($tReply['Permission']);
|
||||
|
||||
|
||||
//load content
|
||||
$instanceContent = new Ticket_Content();
|
||||
$instanceContent->setTContentId($tReply['TContentId']);
|
||||
$instanceContent->setContent($tReply['Content']);
|
||||
|
||||
|
||||
//load reply and add the author and content object in it.
|
||||
$instanceReply = new self();
|
||||
$instanceReply->setTReplyId($tReply['TReplyId']);
|
||||
|
@ -60,9 +60,9 @@ class Ticket_Reply{
|
|||
$result[] = $instanceReply;
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* creates a new reply on a ticket.
|
||||
* Creates a ticket_content entry and links it with a new created ticket_reply, a log entry will be written about this.
|
||||
|
@ -78,19 +78,19 @@ class Ticket_Reply{
|
|||
$ticket_content->setContent($content);
|
||||
$ticket_content->create();
|
||||
$content_id = $ticket_content->getTContentId();
|
||||
|
||||
|
||||
$ticket_reply = new Ticket_Reply();
|
||||
$ticket_reply->set(Array('Ticket' => $ticket_id,'Content' => $content_id,'Author' => $author, 'Hidden' => $hidden));
|
||||
$ticket_reply->create();
|
||||
$reply_id = $ticket_reply->getTReplyId();
|
||||
|
||||
|
||||
if($ticket_creator == $author){
|
||||
Ticket::updateTicketStatus( $ticket_id, 1, $author);
|
||||
}
|
||||
|
||||
|
||||
Ticket_Log::createLogEntry( $ticket_id, $author, 4, $reply_id);
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////Methods////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
|
@ -116,14 +116,14 @@ class Ticket_Reply{
|
|||
$this->setHidden($values['Hidden']);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* creates a new 'ticket_reply' entry.
|
||||
* this method will use the object's attributes for creating a new 'ticket_reply' entry in the database (the now() function will create the timestamp).
|
||||
*/
|
||||
public function create(){
|
||||
$dbl = new DBLayer("lib");
|
||||
$this->tReplyId = $dbl->executeReturnId("ticket_reply", Array('Ticket' => $this->ticket, 'Content' => $this->content, 'Author' => $this->author,'Timestamp'=>now(), 'Hidden' => $this->hidden));
|
||||
$this->tReplyId = $dbl->executeReturnId("ticket_reply", Array('Ticket' => $this->ticket, 'Content' => $this->content, 'Author' => $this->author, 'Hidden' => $this->hidden), array('Timestamp'=>'now()'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -142,7 +142,7 @@ class Ticket_Reply{
|
|||
$this->timestamp = $row['Timestamp'];
|
||||
$this->hidden = $row['Hidden'];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* updates a ticket_reply entry based on the objects attributes.
|
||||
*/
|
||||
|
@ -150,16 +150,16 @@ class Ticket_Reply{
|
|||
$dbl = new DBLayer("lib");
|
||||
$dbl->update("ticket", Array('Ticket' => $this->ticket, 'Content' => $this->content, 'Author' => $this->author, 'Timestamp' => $this->timestamp, 'Hidden' => $this->hidden), "TReplyId=$this->tReplyId, ");
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////Getters////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* get ticket attribute of the object.
|
||||
*/
|
||||
public function getTicket(){
|
||||
return $this->ticket;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get content attribute of the object.
|
||||
*/
|
||||
|
@ -173,7 +173,7 @@ class Ticket_Reply{
|
|||
public function getAuthor(){
|
||||
return $this->author;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get timestamp attribute of the object.
|
||||
* The output format is defined by the Helpers class function, outputTime().
|
||||
|
@ -181,23 +181,23 @@ class Ticket_Reply{
|
|||
public function getTimestamp(){
|
||||
return Helpers::outputTime($this->timestamp);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get tReplyId attribute of the object.
|
||||
*/
|
||||
public function getTReplyId(){
|
||||
return $this->tReplyId;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get hidden attribute of the object.
|
||||
*/
|
||||
public function getHidden(){
|
||||
return $this->hidden;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////Setters////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* set ticket attribute of the object.
|
||||
* @param $t integer id of the ticket
|
||||
|
@ -205,7 +205,7 @@ class Ticket_Reply{
|
|||
public function setTicket($t){
|
||||
$this->ticket = $t;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set content attribute of the object.
|
||||
* @param $c integer id of the ticket_content entry
|
||||
|
@ -213,7 +213,7 @@ class Ticket_Reply{
|
|||
public function setContent($c){
|
||||
$this->content = $c;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set author attribute of the object.
|
||||
* @param $a integer id of the user
|
||||
|
@ -221,7 +221,7 @@ class Ticket_Reply{
|
|||
public function setAuthor($a){
|
||||
$this->author = $a;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set timestamp attribute of the object.
|
||||
* @param $t timestamp of the reply
|
||||
|
@ -229,7 +229,7 @@ class Ticket_Reply{
|
|||
public function setTimestamp($t){
|
||||
$this->timestamp = $t;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set tReplyId attribute of the object.
|
||||
* @param $i integer id of the ticket_reply
|
||||
|
@ -237,7 +237,7 @@ class Ticket_Reply{
|
|||
public function setTReplyId($i){
|
||||
$this->tReplyId = $i;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set hidden attribute of the object.
|
||||
* @param $h should be 0 or 1
|
||||
|
|
Loading…
Reference in a new issue