Migration SVN

This commit is contained in:
2016-02-21 14:28:40 +01:00
commit df45f10305
1455 changed files with 20440 additions and 0 deletions

515
system/api/support.api.php Executable file
View File

@@ -0,0 +1,515 @@
<?php
/**
* @class support
* @brief Manage support tickets
* @author Xavier Perrissoud
* @modified Benjamin Mercier
* @date 29/04/2009
* @version 0.1
*
*/
class support{
/**
* @brief Cache variable with total of tickets for the current user
*/
private $user_tickets = null;
/**
* @brief Cache variable with total of tickets waiting for a support reply
*/
private $waiting_tickets = null;
/**
* @brief Cache variable with total of tickets for witch the support made a reply
*/
private $replied_tickets = null;
/**
* @brief Cache array with total of messages for each tickets
*/
private $ticket_messages = array();
/**
* @brief List all tickets of a given user
* @param user_id -> id of the user for witch we want the tickets list (must be specified)
* @param start -> First ticket to extract (can be NULL)
* @param extract -> Number of tickets to extract (can be NULL)
* @return array of tickets informations (NULL if empty)
*/
public function getUserTickets($user_id, $start = NULL, $extract = NULL)
{
$user_id = $_SESSION['database']->clearString($user_id);
// if paging informations are given, create the LIMIT clause
if ( !is_null($start) and !is_null($extract) ) {
$start = $_SESSION['database']->clearString($start);
$extract = $_SESSION['database']->clearString($extract);
$limit = "LIMIT $start, $extract";
} else $limit = NULL;
$req = "SELECT
t.id AS ticket_id,
t.subject,
UNIX_TIMESTAMP(t.open_date) AS open_date,
t.status,
h.base_name AS hosting_name
FROM tickets AS t
LEFT JOIN hostings AS h
ON h.id = t.hosting_id
WHERE t.user_id = '$user_id'
ORDER BY t.open_date DESC $limit";
$tickets_list = $_SESSION['database']->fetchObject($req);
foreach ($tickets_list as $item) {
$item->subject=stripslashes($item->subject);
}
return $tickets_list;
} // End of getUserTickets
/**
* @brief List all tickets of the current user
* @param start -> First ticket to extract (can be NULL)
* @param extract -> Number of tickets to extract (can be NULL)
* @return array of tickets informations (NULL if empty)
*/
public function userGetTickets($start = NULL, $extract = NULL)
{
$user_id=$_SESSION['user']->information_user->userid;
return $this->getUserTickets($user_id, $start, $extract);
} // End of userGetTickets
/**
* @brief List all "waiting for a reply" tickets, sorted by last message date, older in first position
* @param start -> First ticket to extract (can be NULL)
* @param extract -> Number of tickets to extract (can be NULL)
* @return array of tickets informations (NULL if empty)
*/
public function getWaitingTickets($start = NULL, $extract = NULL)
{
// if paging informations are given, create the LIMIT clause
if ( !is_null($start) and !is_null($extract) ) {
$start = $_SESSION['database']->clearString($start);
$extract = $_SESSION['database']->clearString($extract);
$limit = "LIMIT $start, $extract";
} else $limit = NULL;
$sql = "SELECT
t.id AS ticket_id,
t.subject,
UNIX_TIMESTAMP(t.open_date) AS open_date,
t.status,
UNIX_TIMESTAMP(t.last_msg_date) AS last_msg_date,
h.base_name AS hosting_name
FROM tickets AS t
LEFT JOIN hostings AS h
ON h.id = t.hosting_id
WHERE t.status = 'asked'
ORDER BY t.last_msg_date ASC $limit";
$tickets_list = $_SESSION['database']->fetchObject($sql);
// Check if tickets list is not empty
if ( !isset($tickets_list[0]) ) return NULL;
foreach ($tickets_list as $item) {
$item->subject=stripslashes($item->subject);
}
return $tickets_list;
}
/**
* @brief List all "replied but not closed" tickets, sorted by last message date, older in first position
* @param start -> First ticket to extract (can be NULL)
* @param extract -> Number of tickets to extract (can be NULL)
* @return array of tickets informations (NULL if empty)
*/
public function getRepliedTickets($start = NULL, $extract = NULL)
{
// if paging informations are given, create the LIMIT clause
if ( !is_null($start) and !is_null($extract) ) {
$start = $_SESSION['database']->clearString($start);
$extract = $_SESSION['database']->clearString($extract);
$limit = "LIMIT $start, $extract";
} else $limit = NULL;
$sql = "SELECT
t.id AS ticket_id,
t.subject,
UNIX_TIMESTAMP(t.open_date) AS open_date,
t.status,
UNIX_TIMESTAMP(t.last_msg_date) AS last_msg_date,
h.base_name AS hosting_name
FROM tickets AS t
LEFT JOIN hostings AS h
ON h.id = t.hosting_id
WHERE t.status = 'replied'
ORDER BY t.last_msg_date ASC $limit";
$tickets_list = $_SESSION['database']->fetchObject($sql);
// Check if tickets list is not empty
if ( !isset($tickets_list[0]) ) return NULL;
foreach ($tickets_list as $item) {
$item->subject=stripslashes($item->subject);
}
return $tickets_list;
}
/**
* @brief Extract messages related to a given ticket
* @param ticket_id -> id of the ticket for witch we want to see the messages
* @param start -> First message to extract
* @param extract -> Number of messages to extract
* @return an array (NULL if ticket_id was an invalid number) with first element = ticket summary, and others = messages
*/
public function getTicketDetails($ticket_id, $start = NULL, $extract = NULL)
{
$ticket_id = $_SESSION['database']->clearString($ticket_id);
if ( !is_null($start) and !is_null($extract) ) {
$start = $_SESSION['database']->clearString($start);
$extract = $_SESSION['database']->clearString($extract);
$limit = "LIMIT $start, $extract";
} else $limit = NULL;
// Extract ticket's summary
$req = "SELECT
t.*,
h.base_name AS hosting_name,
u.username AS user_name
FROM tickets AS t
LEFT JOIN hostings AS h
ON h.id = t.hosting_id
LEFT JOIN users AS u
ON u.id = t.user_id
WHERE t.id = '$ticket_id'";
$summary = $_SESSION['database']->fetchObject($req);
// Check if ticket id was a valid number
if ( !isset($summary[0]) ) return NULL;
$summary[0]->subject = stripslashes($summary[0]->subject);
$summary[0]->open_date = strtotime($summary[0]->open_date);
// Extract messages
$req = "SELECT
m.id AS msg_id,
UNIX_TIMESTAMP(m.posted) AS posted,
m.is_reply,
m.message
FROM tickets_msg AS m
WHERE m.ticket_id = '$ticket_id'
ORDER BY m.posted DESC
$limit";
$messages = $_SESSION['database']->fetchObject($req);
foreach ($messages as $item) {
$item->message=stripslashes($item->message);
}
// if messages list is not empty, append it to results
if ( !is_null($messages) )
$results = array_merge((array)$summary, $messages);
else
$results = (array)$summary;
return $results;
} // End of getTicketDetails
/**
* @brief Create a new ticket from a user request
* @param subject -> subject of the ticket
* @param message -> content of the ticket
* @param hosting_id -> id of the hosting entry to associate with this ticket (can be NULL)
* @return True if successfull, false otherwise
*/
public function userCreateTicket($subject, $message, $hosting_id=NULL)
{
$subject = $_SESSION['database']->clearString($subject);
$message = $_SESSION['database']->clearString($message);
$date_msg = time();
$user_id=$_SESSION['user']->information_user->userid;
$ticket_id = 0; // we actually don't know this value
if ( is_null($hosting_id) ) {
$hosting_entry='';
} else {
$hosting_id = $_SESSION['database']->clearString($hosting_id);
$hosting_entry="hosting_id = '$hosting_id',";
}
// Addind message into database
$sql1 = "INSERT INTO tickets_msg
SET
ticket_id = '$ticket_id',
posted = FROM_UNIXTIME($date_msg),
is_reply = 'false',
message = '$message'";
$_SESSION['database']->execRequest($sql1);
$msg_id = $_SESSION['database']->getInsertId();
// Adding ticket infos in database
$sql2 = "INSERT INTO tickets
SET
user_id = '$user_id',
open_date = FROM_UNIXTIME($date_msg),
first_msg_id = '$msg_id',
last_msg_date = FROM_UNIXTIME($date_msg),
last_msg_id = '$msg_id',
status = 'asked',
$hosting_entry
subject = '$subject'";
$_SESSION['database']->execRequest($sql2);
$ticket_id = $_SESSION['database']->getInsertId();
// Updating cache variable if needed
if ( !is_null($this->user_tickets) ) {
$this->user_tickets++;
}
// Updating ticket id for the message
$sql3 = "UPDATE tickets_msg
SET
ticket_id = '$ticket_id'
WHERE
id = '$msg_id'";
return $_SESSION['database']->execRequest($sql3);
} // End of userCreateTicket
/**
* @brief Check if a ticket delong to the current user
* @param ticket_id -> id of the ticket to check
* @return true if ticket if current user's one, false otherwise
*/
public function userCheckTicketId($ticket_id)
{
$user_id = $_SESSION['user']->information_user->userid;
$ticket_id = $_SESSION['database']->clearString($ticket_id);
$sql = "SELECT id FROM tickets
WHERE id = '$ticket_id'
AND user_id = '$user_id'";
$result = $_SESSION['database']->fetchObject($sql);
return ( isset($result[0]));
} // End of userCheckTicketId
/**
* @brief Add a response to a ticket (from the user)
* @param ticket_id -> id of the ticket to associate to the response
* @param message -> content of the response
* @return true if successfull, false otherwise
*/
public function userAddResponse($ticket_id, $message)
{
if ( !$this->userCheckTicketId($ticket_id) ) return false;
return $this->addResponse($ticket_id, $message, true);
} // end of userAddResponse
/**
* @brief Add a response to a ticket
* @param ticket_id -> id of the ticket to associate to the response
* @param message -> content of the response
* @param from_user -> true if the response comes from the user, false otherwise
* @return true if successfull, false otherwise
*/
public function addResponse($ticket_id, $message, $from_user)
{
$ticket_id = $_SESSION['database']->clearString($ticket_id);
$message = $_SESSION['database']->clearString($message);
$from_user = $_SESSION['database']->clearString($from_user);
$is_reply=( $from_user==true ? 'false' : 'true' );
$status = ( $is_reply=='true' ? 'replied' : 'asked' );
$date_msg = time();
$sql = "INSERT INTO tickets_msg SET
ticket_id = '$ticket_id',
posted = FROM_UNIXTIME($date_msg),
is_reply = '$is_reply',
message = '$message'";
$_SESSION['database']->execRequest($sql);
$msg_id = $_SESSION['database']->getInsertId();
if ( !$msg_id) return false;
$sql2 = "UPDATE tickets SET
last_msg_date = FROM_UNIXTIME($date_msg),
last_msg_id = '$msg_id',
status = '$status'
WHERE id='$ticket_id'";
return $_SESSION['database']->execRequest($sql2);
} // end of addResponse
/**
* @brief Close a support ticket
* @param ticket_id -> id of the ticket to close
* @param fromUser -> true if called from a user's page, false otherwise
* @return true if successfull, false otherwise
*/
public function closeTicket($ticket_id, $from_user)
{
$ticket_id = $_SESSION['database']->clearString($ticket_id);
$from_user = $_SESSION['database']->clearString($from_user);
$status = ( $from_user==true ? 'closed_by_user' : 'closed_by_support' );
$close_date = time();
$sql = "UPDATE tickets SET
status = '$status',
closed_date = FROM_UNIXTIME($close_date)
WHERE id='$ticket_id'";
return $_SESSION['database']->execRequest($sql);
} // end of closeTicket
/**
* @brief Close a support ticket (from the user)
* @param ticket_id -> id of the ticket to close
* @return true if successfull, false otherwise
*/
public function userCloseTicket($ticket_id)
{
if ( !$this->userCheckTicketId($ticket_id) ) return false;
return $this->closeTicket($ticket_id, true);
} // end of userCloseTicket
/**
* @brief Get number of tickets for the current user
* @param None
* @return number of tickets for the user
*
* Get the total of support tickets for the current user.<br />
* This value is got the first time from the database (generating a SQL request) and is then stocked in a cache variable, so, other calls to this method won't generate another SQL request.
*/
public function userCountTickets()
{
// Try to get the value from the cache
if( !is_null($this->user_tickets) ) {
return $this->user_tickets;
}
$user_id = $_SESSION['user']->information_user->userid;
$req = "SELECT COUNT(id) AS total FROM tickets WHERE user_id='$user_id'";
$result = $_SESSION['database']->fetchObject($req);
$this->user_tickets = $result[0]->total;
return $this->user_tickets;
}
/**
* @brief Get number of tickets pages for the current user, regarding the total count of tickets and the count of items to be shown per page
* @param None
* @return number of pages availables
*
* Calculate the total pages needed to show all the support tickets for the current user.
*/
public function userCountTotalPages()
{
$items_count = $this->userCountTickets();
$pages_count = intval($items_count / RECORD_BY_PAGE);
if ( ($items_count % RECORD_BY_PAGE) != 0 ) {
$pages_count++;
}
return $pages_count;
}
/**
* @brief Get the total of messages for a given ticket
* @param ticket_id Id of the ticket for witch we want to count the messages
* @return number of messages
*/
public function countTicketMessages( $ticket_id )
{
$ticket_id = $_SESSION['database']->clearString($ticket_id);
if ( isset($this->ticket_messages[$ticket_id]) ) {
return $this->ticket_messages[$ticket_id];
}
$req = "SELECT COUNT(id) AS total FROM tickets_msg WHERE ticket_id='$ticket_id'";
$result = $_SESSION['database']->fetchObject($req);
$this->ticket_messages[$ticket_id] = $result[0]->total;
return $this->ticket_messages[$ticket_id];
}
/**
* @brief Get total of details pages for a given ticket, regarding the total count of messages and the count of items to be shown per page
* @param ticket_id Id of the ticket for witch we want the total of pages
* @return number of pages availables
*/
public function countTicketTotalPages( $ticket_id )
{
$items_count = $this->countTicketMessages( $ticket_id );
$pages_count = intval($items_count / RECORD_BY_PAGE);
if ( ($items_count % RECORD_BY_PAGE) != 0 ) {
$pages_count++;
}
return $pages_count;
}
/**
* @brief Get total of tickets waiting for a support reply
* @param None
* @return number of tickets waiting for a support reply
*
* Get the total of support tickets waiting for a support reply.<br />
* This value is got the first time from the database (generating a SQL request) and is then stocked in a cache variable, so, other calls to this method won't generate another SQL request.
*/
public function countWaitingTickets()
{
// Try to get the value from the cache
if( !is_null($this->waiting_tickets) ) {
return $this->waiting_tickets;
}
$req = "SELECT COUNT(id) AS total FROM tickets WHERE status = 'asked'";
$result = $_SESSION['database']->fetchObject($req);
$this->waiting_tickets = $result[0]->total;
return $this->waiting_tickets;
}
/**
* @brief Get total of pages for tickets waiting for a supoprt reply, regarding the total count of messages and the count of items to be shown per page
* @param None
* @return number of pages availables
*/
public function countWaitingTicketsTotalPages()
{
$items_count = $this->countWaitingTickets();
$pages_count = intval($items_count / RECORD_BY_PAGE);
if ( ($items_count % RECORD_BY_PAGE) != 0 ) {
$pages_count++;
}
return $pages_count;
}
/**
* @brief Get total of tickets for witch the support made a reply
* @param None
* @return number of tickets for witch the support made a reply
*
* Get the total of support tickets for witch the support made a reply.<br />
* This value is got the first time from the database (generating a SQL request) and is then stocked in a cache variable, so, other calls to this method won't generate another SQL request.
*/
public function countRepliedTickets()
{
// Try to get the value from the cache
if( !is_null($this->replied_tickets) ) {
return $this->replied_tickets;
}
$req = "SELECT COUNT(id) AS total FROM tickets WHERE status = 'replied'";
$result = $_SESSION['database']->fetchObject($req);
$this->replied_tickets = $result[0]->total;
return $this->replied_tickets;
}
/**
* @brief Get total of pages for tickets for witch the support made a reply, regarding the total count of messages and the count of items to be shown per page
* @param None
* @return number of pages availables
*/
public function countRepliedTicketsTotalPages()
{
$items_count = $this->countRepliedTickets();
$pages_count = intval($items_count / RECORD_BY_PAGE);
if ( ($items_count % RECORD_BY_PAGE) != 0 ) {
$pages_count++;
}
return $pages_count;
}
} // End of class