<?php
session_start();
require 'sam.php';
load('tracker', 'status', 'validation');
// Globals
$tk = new Tracker();
$st = new Status();
$THEME = array(
'site_name' => getSiteName(),
'path' => '',
'page' => 'tracker',
'page_title' => _('Tracker'),
'theme_path' => getTheme(),
'modules' => getModules(),
);
control();
exit();
/**
* control
*
* @return void
*/
function control ()
{
if (isset($_POST['submit-edit']))
{
displayEditTicketSubmit();
}
elseif (isset($_GET['add']))
{
displayAddTicket();
}
elseif (isset($_POST['submit-ticket']))
{
displayAddTicketSubmit();
}
elseif (isset($_GET['ticket']))
{
displayTicket();
}
else
{
displayTickets();
}
}
/**
* displayHeader
*
* @return void
*/
function displayHeader ()
{
global $THEME;
include $THEME['theme_path'].'header.php';
}
/**
* displayFooter
*
* @return void
*/
function displayFooter ()
{
global $THEME;
include $THEME['theme_path'].'footer.php';
}
/**
* displayEditTicketSubmit
*
* @return void
*/
function displayEditTicketSubmit ()
{
global $st, $db, $tk;
displayHeader();
$tk->displayTrackerMenu();
if (!isset($_POST['name']) || !isset($_POST['description']))
{
$message = array('error', _('Name and description are required.'));
$tk->displayTicket($_POST['id'], $message);
displayFooter();
return;
}
// Do any status validation needed
$_POST = $st->statusValidation($_POST);
// Create the update statement
$set_vals = array();
$types = 'ss';
$set_fields[] = 'name';
$set_fields[] = 'description';
$set_vals[] = $_POST['name'];
$set_vals[] = $_POST['description'];
if (isset($_POST['status']))
{
$types .= 'i';
$set_fields[] = 'status';
$set_vals[] = $_POST['status'];
}
if (isset($_POST['assigned']) && $_POST['assigned'] > 0)
{
$types .= 'i';
$set_fields[] = 'assigned';
$set_vals[] = $_POST['assigned'];
}
if (isset($_POST['resolution']) && $_POST['resolution'] > 0)
{
$types .= 'i';
$set_fields[] = 'resolution';
$set_vals[] = $_POST['resolution'];
}
if (isset($_POST['type']))
{
$types .= 'i';
$set_fields[] = 'type';
$set_vals[] = $_POST['type'];
}
if (isset($_POST['priority']))
{
$types .= 'i';
$set_fields[] = 'priority';
$set_vals[] = $_POST['priority'];
}
if (isset($_POST['project']))
{
$types .= 'i';
$set_fields[] = 'project';
$set_vals[] = $_POST['project'];
}
if (isset($_POST['component']))
{
$types .= 'i';
$set_fields[] = 'component';
$set_vals[] = $_POST['component'];
}
if (isset($_POST['start']))
{
$types .= 's';
$set_fields[] = 'start';
$set_vals[] = $_POST['start'];
}
if (isset($_POST['due']))
{
$types .= 's';
$set_fields[] = 'due';
$set_vals[] = $_POST['due'];
}
if (isset($_POST['discovered']))
{
$types .= 'i';
$set_fields[] = 'discovered';
$set_vals[] = $_POST['discovered'];
}
if (isset($_POST['target']))
{
$types .= 'i';
$set_fields[] = 'target';
$set_vals[] = $_POST['target'];
}
if (isset($_POST['fixed']))
{
$types .= 'i';
$set_fields[] = 'fixed';
$set_vals[] = $_POST['fixed'];
}
if (isset($_POST['progress']))
{
$types .= 'i';
$set_fields[] = 'progress';
$set_vals[] = $_POST['progress'];
}
if (isset($_POST['est_hours']))
{
$types .= 'i';
$set_fields[] = 'est_hours';
$set_vals[] = $_POST['est_hours'];
}
if (isset($_POST['dev_hours']))
{
$types .= 'i';
$set_fields[] = 'dev_hours';
$set_vals[] = $_POST['dev_hours'];
}
if (isset($_POST['tested']))
{
$types .= 'i';
$set_fields[] = 'tested';
$set_vals[] = $_POST['tested'];
}
$types .= 'i';
$bind_vals = array_merge($set_vals, (array)$_POST['id']);
// number of types must match bind_vals
if (strlen($types) !== count($bind_vals))
{
logError(__FILE__, __LINE__, 'Bind param error. Types count does not match vals count.');
$message = array('error', _('Cannot edit ticket.'));
$tk->displayTicket($_POST['id'], $message);
displayFooter();
return;
}
// setup set part of sql statement
$set_stmt = '';
foreach ($set_fields as $field)
{
$set_stmt .= "`$field` = ?, ";
}
$set_stmt = substr($set_stmt, 0, -2);
$sql = "UPDATE `sam_ticket`
SET $set_stmt
WHERE `id` = ?";
$stmt = $db->prepare($sql);
if (!$stmt)
{
logSqlError(__FILE__, __LINE__, $db->error, $sql);
$message = array('error', _('Cannot edit ticket.'));
$tk->displayTicket($_POST['id'], $message);
displayFooter();
return;
}
$bind_params = array_merge((array)$types, $bind_vals);
call_user_func_array(array(&$stmt, 'bind_param'), $bind_params);
$stmt->execute();
$message = array('ok', _('Ticket updated.'));
$tk->displayTicket($_POST['id'], $message);
displayFooter();
return;
}
/**
* displayAddTicket
*
* @return void
*/
function displayAddTicket ()
{
global $tk;
displayHeader();
$tk->displayTrackerMenu('add');
$tk->displayAddTicket('');
displayFooter();
}
/**
* displayAddTicketSubmit
*
* @return void
*/
function displayAddTicketSubmit ()
{
global $db, $tk;
displayHeader();
if (!isset($_POST['name']) || !isset($_POST['description']))
{
$tk->displayTrackerMenu('add');
$message = array('error', _('Name and description are required.'));
$tk->displayAddTicket($message);
return;
}
$name = $_POST['name'];
$description = $_POST['description'];
if (strlen($_POST['name']) < 1 || strlen($_POST['description']) < 1)
{
$tk->displayTrackerMenu('add');
$message = array('error', _('Name and description are required.'));
$tk->displayAddTicket($message);
return;
}
$reported = gmdate('Y-m-d H:i:s');
$reporter = $_POST['reporter'];
$assigned = $_POST['assigned'];
$status = 1;
$type = isset($_POST['type']) ? $_POST['type'] : '0';
$priority = isset($_POST['priority']) ? $_POST['priority'] : '0';
$project = isset($_POST['project']) ? $_POST['project'] : '0';
$component = isset($_POST['component']) ? $_POST['component'] : '0';
$discovered = isset($_POST['discovered']) ? $_POST['discovered'] : '0';
$target = isset($_POST['target']) ? $_POST['target'] : '0';
$start = isset($_POST['start']) ? $_POST['start'] : '0';
$due = isset($_POST['due']) ? $_POST['due'] : '0';
$est_time = isset($_POST['est_time']) ? $_POST['est_time'] : '0';
$sql = "INSERT INTO `sam_ticket` (
`name`,
`description`,
`reporter`,
`assigned`,
`reported`,
`type`,
`status`,
`priority`,
`project`,
`component`,
`discovered`,
`target`,
`start`,
`due`,
`est_hours`
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
$stmt = $db->prepare($sql);
if (!$stmt)
{
logSqlError(__FILE__, __LINE__, mysql_error(), $sql);
return array('error', _('Cannot add ticket.'));
}
$stmt->bind_param(
'sssssssssssssss',
$name,
$description,
$reporter,
$assigned,
$reported,
$type,
$status,
$priority,
$project,
$component,
$discovered,
$target,
$start,
$due,
$est_time
);
$stmt->execute();
$last_insert_id = $db->insert_id;
$message = array('ok', _('Ticket was added successfully'));
$tk->displayTrackerMenu();
$tk->displayTicket($last_insert_id, $message);
displayFooter();
}
function displayTicket ()
{
global $tk;
displayHeader();
if (!ctype_digit($_GET['ticket']))
{
// TODO : display error?
return;
}
$tk->displayTrackerMenu();
$tk->displayTicket($_GET['ticket']);
displayFooter();
}
/**
* displayTickets
*
* @return void
*/
function displayTickets ()
{
global $tk, $db;
displayHeader();
// Get Report
$url = $_SERVER["REQUEST_URI"];
$pos = strpos($url, '?');
// We have params
if ($pos !== false)
{
// don't include the ?
$url = substr($url, $pos+1);
$reportParams = $tk->convertUrlParams($url);
}
// Show the default one
else
{
$reportParams = $tk->getDefaultReportParams();
}
// Get Sort
$sort = 'id';
if (isset($reportParams['sort']))
{
$sort = $db->escape_string($reportParams['sort']);
unset($reportParams['sort']);
}
// Get Order
$order = 'ASC';
if (isset($reportParams['order']))
{
$order = $db->escape_string($reportParams['order']);
unset($reportParams['order']);
}
// Get Selected Fields
if (isset($reportParams['field']))
{
foreach ($reportParams['field'] AS $key => $value)
{
$fields[] = $value;
}
unset($reportParams['field']);
}
else
{
$fields = array('due', 'type', 'status', 'priority', 'reporter', 'assigned', 'reported');
}
// Get Options
$options = array();
if (count($reportParams))
{
// Everything left is an option
$options = $reportParams;
}
// Get Page
$page = isset($_GET['page']) ? $_GET['page'] : 1;
// Display Menu
$tk->displayTrackerMenu();
// Display Ticket List
echo '
<div id="tickets-container">';
$tk->displayTicketList($fields, $options, $page, $sort, $order);
echo '
</div>';
displayFooter();
}