<?php
include_once ('engine/ui.php');
// Check user authorization to access this page
UserAuth::singleton()-> tryAccess('transporter');
// Load design
HtStyleLink::linkUserStyle();
$layout= new BasicLayout;
$canvas= HtBlock::factory ('div', $layout, '#pageContent');
StupidIe::patchIfNeeded();
// menu initialization
$page= @$_GET['page'];
new MenuTransporter ($layout, 'routes');
pageRoutes();
/*new MenuTransporter ($layout, $page);
switch ($page) {
default:
case 'routes':
pageRoutes();
break;
}*/
$layout-> draw();
// end of main()
function pageRoutes() {
$layout= $GLOBALS['layout'];
$canvas= $GLOBALS['canvas'];
$szHrefBase= Page::linkToWebRoot()."/transporter".Page::phpFileExt()."?page=routes";
$szUser= UserAuth::singleton()-> getUser();
$q= new DbQuery ("SELECT ico FROM users WHERE user='$szUser'");
$res= $q->fetchArray();
$ico= $res['ico'];
if (@$_GET['op']=='addRoute') {
addRoute($ico, $szHrefBase);
return;
}
if (isset ($_GET['route'])) {
routeDetail ($ico, $szHrefBase);
return;
}
define('TITLE', 'Přehled spojů');
HtTitle::singleton()-> setTitle(TITLE);
HtInline::factory ('h1', $canvas)-> addText(TITLE);
$q= new DbQuery (
"SELECT routes.route_id, UNIX_TIMESTAMP(route_date) AS route_date, UNIX_TIMESTAMP(route_date) AS route_time,".
"route_from, route_to, duration, ".
"COUNT(DISTINCT tickets.seat_id) AS cap, COUNT(DISTINCT order_items.seat_id) AS util, ".
"SUM(IF(order_items.seat_id IS NOT NULL AND order_items.seat_id=tickets.seat_id, tickets.price, 0)) AS sale ".
"FROM routes LEFT JOIN tickets USING (route_id) LEFT JOIN order_items USING (route_id) ".
"WHERE ico='$ico' ".
"GROUP BY routes.route_id ".
"ORDER BY route_date"
);
define('ALIGN_RIGHT','text-align:right;');
define('BOLD', 'font-weight:bold;');
$resTable= new QueryResult ($canvas,
Array ('č.','Datum','Odjezd','Z','Do','Doba jízdy','Kapacita','Vytížení','Tržba','Jízdenky',''),
Array (ALIGN_RIGHT, ALIGN_RIGHT, ALIGN_RIGHT, 5=>ALIGN_RIGHT, ALIGN_RIGHT, ALIGN_RIGHT, ALIGN_RIGHT.BOLD)
);
for ($i=0; $i< $q->getNumRows(); $i++) {
$row= $q->fetchArray();
$row['route_date']= date ("j.n.Y", $row["route_date"]);
$row['route_time']= date ("H:i", $row["route_time"]);
if ($row['duration'])
$row['duration'].= ' min';
if ($row['cap'] && $row['util'])
$row['util']= number_format((float)$row['util']/$row['cap']*100,2).' %';
else
$row['util']= '';
if ($row['sale'])
$row['sale']= number_format($row['sale'],0,'.',' ').' Kč';
else
$row['sale']= '';
$row []= '<a href="'.$szHrefBase.'&route='.$row['route_id'].'">zobrazit</a>';
$row []= '<a href="'.$szHrefBase.'&route='.$row['route_id'].'&op=addTickets">přidat</a>';
$resTable->addRow($row);
}
$menu= new Menu ('Spoje');
$menu-> addItem ($szHrefBase.'&op=addRoute', 'Přidat spoj');
$layout-> addToBegin($menu);
}
function routeDetail($ico, $szHrefBase) {
$route= $_GET['route'];
if (!ini_get ("magic_quotes_gpc")) {
// Security..
$route= addslashes($route);
}
$q= new DbQuery (
"SELECT route_id, UNIX_TIMESTAMP(route_date) AS route_date, route_from, route_to, duration ".
"FROM routes WHERE ico='$ico' AND route_id='$route'"
);
if ($q->getNumRows() !=1) {
// navigation error, possible attack
Header ('Location: '.$szHrefBase);
exit();
}
$bAddTickets= (@$_GET['op']=='addTickets');
$layout= $GLOBALS['layout'];
$canvas= $GLOBALS['canvas'];
define('TITLE','Detail spoje');
HtTitle::singleton()-> setTitle(TITLE);
HtInline::factory ('h1', $canvas)-> addText(TITLE);
$szHrefAddTickets= $szHrefBase.'&route='.$route.'&op=addTickets';
$menu= new Menu('Jízdenky');
$menu-> addItem ($szHrefAddTickets, 'Přidat jízdenky', $bAddTickets ? '.menuItemSelected':'');
$menu-> addItem ($szHrefBase, 'Zpět na přehled spojů');
$layout-> addToBegin($menu);
$row= $q->fetchArray();
$info= new SimpleInfoMulticol($canvas, 2);
$info-> setStyle ('.infoFrame');
$info-> addPair (0, 'Číslo spoje', $row['route_id']);
$info-> addPair (0, 'Datum', date ('j.n.Y', $row['route_date']));
$info-> addPair (0, 'Odjezd', date ('H:i', $row['route_date']));
$info-> addPair (1, 'Z', $row['route_from']);
$info-> addPair (1, 'Do', $row['route_to']);
$info-> addPair (1, 'Doba jízdy', $row['duration'].' min');
if ($bAddTickets) {
HtInline::factory ('h2', $canvas)-> addText('Přidat jízdenky');
$priceInput= new PriceInput ('price');
$price= SimpleForm::lastValue('price');
$count= SimpleForm::lastValue('count');
$bErrCount= !CustomInput::chkNum ($count) || (!$count);
$bErrPrice= !$priceInput->isValid();
$bErr= $bErrCount || $bErrPrice;
$state= @$_POST['addTickets'];
if ($bErr && !empty ($state))
$state='errInput';
switch ($state) {
case 'request':
$block= HtBlock::factory ('div', $canvas, '.infoFrame');
HtInline::factory ('p', $block)-> addText('Chcete přidat <b>'.$count.'</b> jízdenek, každou za <b>'.$price.' Kč</b>?');
$yesno= HtBlock::factory ('div', $block, '.yesno');
$form= HtInline::factory ('form', $yesno, '', Array(
'method' => 'post',
'action' => $szHrefAddTickets
));
$div= HtInline::factory ('div', $form);
HtSingle::factory ('input', $div, '', Array (
'name' => 'addTickets',
'type' => 'hidden',
'value' => 'confirmed'
));
HtSingle::factory ('input', $div, '', Array (
'name' => 'price',
'type' => 'hidden',
'value' => $price
));
HtSingle::factory ('input', $div, '', Array (
'name' => 'count',
'type' => 'hidden',
'value' => $count
));
HtSingle::factory ('input', $div, '', Array (
'type' => 'submit',
'value' => 'Ano'
));
$form= HtInline::factory ('form', $yesno, '', Array(
'method' => 'post',
'action' => $szHrefBase.'&route='.$route
));
$div= HtInline::factory ('div', $form);
HtSingle::factory ('input', $div, '', Array (
'type' => 'submit',
'value' => 'Ne'
));
break;
case 'confirmed':
$q= new DbQuery (
"SELECT MAX(seat_id) AS last_id FROM tickets ".
"WHERE route_id=$route"
);
$last_id=0;
if ($q->getNumRows()) {
$row= $q->fetchArray();
$last_id= $row['last_id'];
}
for ($i=0, $last_id++; $i<$count; $i++, $last_id++) {
new DbQuery (
"INSERT INTO tickets SET ".
"route_id=$route, seat_id=$last_id, price=$price"
);
}
redirTo ($szHrefBase.'&route='.$route);
//HtInline::factory ('p', $canvas)-> addText ('Bylo přidáno <b>'.$count.'</b> jízdenek za celkem <b>'.($count*$price).' Kč</b>.');
break;
default:
$p= HtInline::factory ('p', $canvas, '')-> addText('[ <a href="'.$szHrefBase.'&route='.$route.'">Zrušit</a> ]');
$form= new SimpleForm ($canvas,
$szHrefAddTickets,
'Přidat jízdenky',
Array ('addTickets'=>'request'),
$bErr && !empty ($_POST['addTickets'])
);
$form-> addInput ('Počet', 'count', 'text', $count, 2, 'width:2em;', $bErrCount);
$form-> addCustomInput ('Cena', $priceInput, $bErrPrice);
}
}
$q= new DbQuery (
"SELECT tickets.seat_id, price ".
"FROM tickets LEFT JOIN order_items USING (route_id,seat_id) ".
"WHERE tickets.route_id='$route' AND order_items.seat_id IS NOT NULL ".
"ORDER BY tickets.seat_id"
);
if ($q->getNumRows()) {
HtInline::factory ('h2', $canvas)-> addText('Objednané jízdenky');
displayTickets ($canvas, $q);
}
$q= new DbQuery (
"SELECT tickets.seat_id, price ".
"FROM tickets LEFT JOIN order_items USING (route_id,seat_id) ".
"WHERE tickets.route_id='$route' AND order_items.seat_id IS NULL ".
"ORDER BY tickets.seat_id"
);
if ($q->getNumRows()) {
HtInline::factory ('h2', $canvas)-> addText('Volné jízdenky');
displayTickets ($canvas, $q);
}
}
function displayTickets ($canvas, $q) {
$numRows= $q->getNumRows();
$resTable= new QueryResultMulticol ($canvas,
Array('Číslo sedadla','Cena'),
Array('text-align:right;','text-align:right'),
$numRows, 3
);
for ($i=0; $i< $numRows; $i++) {
$rowArray= $q->fetchArray();
$rowArray['price'].= ' Kč';
$resTable-> addRow($rowArray);
}
}
function addRoute($ico, $szHrefBase) {
$canvas= $GLOBALS['canvas'];
$layout= $GLOBALS['layout'];
define ('TITLE', 'Přidat spoj');
HtTitle::singleton()-> setTitle(TITLE);
HtInline::factory ('h1', $canvas)-> addText(TITLE);
$dateInput= new DateInput ('date');
$timeInput= new TimeInput ('time');
$durationInput= new DurationInput ('duration');
if (@$_POST['addRoute']=='true') {
$route_from= addslashes(SimpleForm::lastValue ('from'));
if (empty ($route_from))
$bErrFrom= true;
$route_from= strip_tags($route_from);
$route_to= addslashes(SimpleForm::lastValue ('to'));
if (empty ($route_to))
$bErrTo= true;
$route_to= strip_tags($route_to);
$bErrTime= !$timeInput->isValid();
$bErrDate= !$dateInput->isValid();
$bErrDuration= !$durationInput->isValid();
$duration= (SimpleForm::lastValue ('duration'));
settype ($duration, 'int');
$bErr= @$bErrFrom || @$bErrTo || @$bErrDuration || @$bErrDate || @$bErrTime;
$hour= SimpleForm::lastValue ('time_hour');
$min= SimpleForm::lastValue ('time_minutte');
$month= SimpleForm::lastValue ('date_month');
$day= SimpleForm::lastValue ('date_day');
$year= SimpleForm::lastValue ('date_year');
$route_date= @mktime($hour, $min, 0, $month, $day, $year);
$bErrPast= $route_date < strtotime('+1 weeks');
if (!$bErr && !$bErrPast) {
//echo $route_from.', '.$route_to.', '.date ('d.m.Y H:i', $route_date).', '.$duration;
new DbQuery (
"INSERT INTO routes SET ".
"ico=$ico, route_date=FROM_UNIXTIME($route_date), ".
"route_from='$route_from', route_to='$route_to', ".
"duration='$duration'"
);
$q= new DbQuery (
"SELECT MAX(route_id) AS route_id ".
"FROM routes WHERE ico='$ico'"
);
$row= $q->fetchArray();
$route_id= $row['route_id'];
/*HtInline::factory ('p', $canvas)-> addText('Přidání spoje proběhlo <b>úspěšně</b>.');
$p= HtInline::factory ('p', $canvas);
$p-> addText('Pokračujte, prosím, ');
HtInline::factory ('a', $p, '',
Array('href'=>$szHrefBase.'&route='.$route_id.'&op=addTickets')
)-> addText ('přidáním jízdenek');
$p-> addText('.');*/
redirTo ($szHrefBase.'&route='.$route_id.'&op=addTickets');
return;
}
if ($bErr)
HtInline::factory ('p', $canvas)-> addText('Některá políčka formuláře jsou špatně zadána. Vyplňte je prosím znovu:');
if ($bErrPast)
HtInline::factory ('p', $canvas)-> addText('Spoje je potřeba zadávat <b>aspoň týden dopředu</b>. Děkujeme za pochopení.');
}
$form= new SimpleForm ($canvas,
$szHrefBase.'&op=addRoute',
TITLE,
Array('addRoute'=>'true'),
@$bErr
);
$form-> addInput ('Z', 'from', 'text', NULL, 64, 'width:320px;', @$bErrFrom);
$form-> addInput ('Do', 'to', 'text', NULL, 64, 'width:320px;', @$bErrTo);
$form-> addCustomInput ('Datum', new DateInput ('date'), @$bErrDate);
$form-> addCustomInput ('Odjezd', new TimeInput ('time'), @$bErrTime);
$form-> addCustomInput ('Doba jízdy', new DurationInput ('duration'), @$bErrDuration);
$menu= new Menu(TITLE);
$menu-> addItem($szHrefBase, 'Storno');
$layout-> addToBegin($menu);
}
function redirTo($to)
{
Header ('Location: '.$to);
exit();
}
?>