<?php
include_once ("engine/ui.php");
// Check user authorization to access this page
UserAuth::singleton()-> tryAccess("manager");
// Load design
HtStyleLink::linkUserStyle();
$layout= new BasicLayout;
$canvas= HtBlock::factory ("div", $layout, "#pageContent");
StupidIe::patchIfNeeded();
// menu initialization
$page= @$_GET["page"];
new MenuManager ($layout, $page);
// page mode switching
switch ($page) {
case "dealers":
pageDealers();
break;
case "transporters":
pageTransporters();
break;
case "users":
pageUsers();
break;
case 'firms':
pageFirms();
break;
default:
define ('TITLE', 'Chráněná zóna T-Shop');
HtTitle::singleton()-> setTitle (TITLE);
HtInline::factory ("h1", $canvas)-> addText(TITLE);
HtInline::factory ("p", $canvas)-> addText("Vítejte v chráněné zóně informačního systému T-shop. Před odchodem z informačního systému se nezapomeňte odhlásit.");
}
$layout-> draw();
// end of main()
function pageUsers()
{
$canvas= $GLOBALS["canvas"];
$szHrefBase= $szHrefBuilder= (Page::linkToWebRoot())."/manager".Page::phpFileExt()."?page=users";
if (isset ($_GET["firm"])) {
if (!ini_get ("magic_quotes_gpc")) {
// Security..
$_GET["firm"]= addslashes ($_GET["firm"]);
}
$ico= $_GET["firm"];
$q= new DbQuery (
"SELECT name FROM firms WHERE ico='$ico'"
);
if ($q->getNumRows() !=1)
Page::redirTo($szHrefBase);
$q->fetchArray();
$firm= $q->getElement ("name");
$szHrefBuilder.= "&firm=$ico";
}
switch (@$_GET["op"]) {
case "setPasswd":
setPasswd($szHrefBuilder);
return;
case "addUser":
/*if (!isset($ico)) {
// Navigation error (possible user attack)
Header ('Location: '.ereg_replace("&", "&", $szHrefBase));
exit();
}*/
addUser($szHrefBuilder, $ico, $firm);
return;
case "accountBlock":
accountBlock(ereg_replace("&", "&", $szHrefBuilder));
return;
case "accountUnblock":
accountUnblock(ereg_replace("&", "&", $szHrefBuilder));
return;
}
if (isset($ico)) {
HtInline::factory ("h2", $canvas)-> addText("Informace o firmě");
$q= new DbQuery (
"SELECT firms.name, firms.address, firms.tel, firms.www, firms.email, ".
"dealers.ico IS NOT NULL AS dealer, ".
"transporters.ico IS NOT NULL AS transporter, ".
"COUNT(users.user) AS cnt ".
"FROM firms ".
"LEFT JOIN dealers ON firms.ico=dealers.ico ".
"LEFT JOIN transporters ON firms.ico=transporters.ico ".
"LEFT JOIN users ON firms.ico=users.ico ".
"WHERE firms.ico=$ico ".
"GROUP BY firms.ico"
);
$row= $q->fetchArray();
//print_r ($row);
if ($row['dealer'])
$type= 'Prodejce';
else if ($row['transporter'])
$type= 'Dopravce';
else
$type= 'Vlastník IS';
$info= new SimpleInfoMulticol ($canvas, 2);
$info-> setStyle ('.infoFrame');
$info-> addPair (0, 'Zařazení', $type);
$info-> addPair (0, 'Jméno', $row['name']);
if ($ico)
$info-> addPair (0, 'IČO', $ico);
$info-> addPair (0, NULL, NULL);
$info-> addPair (0, 'Uživatelů', $row['cnt']);
$info-> addPair (1, 'Adresa', $row['address']);
$info-> addPair (1, NULL, NULL);
$info-> addPair (1, 'Telefon', $row['tel']);
$info-> addPair (1, 'www', $row['www']);
$info-> addPair (1, 'E-mail', $row['email']);
}
define ('TITLE', 'Správa uživatelů');
HtTitle::singleton()-> setTitle (TITLE);
$h1= HtInline::factory ("h1", $canvas);
$h1-> addText(TITLE);
if (isset ($ico)) {
$h1-> addText(' - '.$firm);
//HtInline::factory ("p", $canvas)-> addText("Uživatelé firmy <b>$firm</b>:");
$if= "users.ico='$ico' AND firms.ico='$ico'";
} else {
HtInline::factory ("h2", $canvas)-> addText("Přehled všech uživatelů");
$if= "users.ico=firms.ico";
}
$q= new DbQuery (
"SELECT user,users.name AS name,firms.ico AS ico, firms.name AS firm,last_access,expiration ".
"FROM users,firms WHERE $if ORDER BY user"
);
$numRows= $q->getNumRows();
if ($numRows) {
$resTable= new QueryResult ($canvas,
Array("Uživatel", "Jméno", "Firma", "Poslední přístup", "Heslo", "Stav účtu"),
Array ("font-weight:bold;", 3=>"text-align:right;")
);
for ($i=0; $i<$numRows; $i++) {
$row= $q->fetchArray ();
$szUser= $row["user"];
if (!isset($ico)) {
$szFirmLink= $szHrefBase."&firm=".$row["ico"];
$row["firm"]= "<a href=\"$szFirmLink\">".$row["firm"]."</a>";
}
if (!$row["last_access"])
$row["last_access"]= "<i>nikdy</i>";
else
$row["last_access"]= date ("j.n.Y H:i", $row["last_access"]);
$bExpired= $row["expiration"]<0 || $row["expiration"]>time();
unset($row["expiration"], $row["ico"]);
$szBase= $szHrefBuilder."&user=".urlencode($szUser);
$row["passwd"]= "<a href=\"${szBase}&op=setPasswd\">změnit</a>";
if ($szUser== "root")
$row["account"]= "<b>Aktivní</b>";
else if ($bExpired)
$row["account"]= "Blokovaný, <a href=\"${szBase}&op=accountUnblock\">odblokovat</a>";
else
$row["account"]= "<b>Aktivní</b>, <a href=\"${szBase}&op=accountBlock\">blokovat</a>";
$resTable-> addRow($row);
}
} else {
$p= HtInline::factory ('p', $canvas);
$p-> addText('K umožnění přístupu do IS musíte firmě ');
HtInline::factory ('a', $p, '',
Array('href'=>$szHrefBuilder.'&op=addUser')
)-> addText('vytvořit uživatele');
$p-> addText('.');
}
$menu= new Menu ("Uživatelé");
if (isset($ico)) {
$menu->addItem ($szHrefBuilder."&op=addUser", "Přidat uživatele");
$menu->addItem ($szHrefBase, "Zobrazit všechny uživatele");
} else {
$li= HtInline::factory ("li", $menu->getInnerList());
HtInline::factory ("p", $li)-> addText("Pro přidání uživatele klikněte nejprve na název firmy.");
}
$GLOBALS["layout"]-> addToBegin ($menu);
}
function accountBlock($szJumpToPage)
{
if (!ini_get ("magic_quotes_gpc")) {
// Security..
$_GET["user"]= addslashes ($_GET["user"]);
}
$szUser= $_GET["user"];
new DbQuery ("UPDATE users SET expiration=-1 WHERE user='$szUser'");
Page::redirTo ($szJumpToPage);
}
function accountUnblock($szJumpToPage)
{
if (!ini_get ("magic_quotes_gpc")) {
// Security..
$_GET["user"]= addslashes ($_GET["user"]);
}
DbConnection::singleton();
$szUser= $_GET["user"];
new DbQuery ("UPDATE users SET expiration=0 WHERE user='$szUser'");
Header ("Location: ".$szJumpToPage);
exit();
}
function setPasswd($szHrefBase)
{
define ('TITLE', 'Změna hesla');
$szUser= @$_GET["user"];
if (!ini_get ("magic_quotes_gpc")) {
$szUser= addslashes ($szUser);
}
$q= new DbQuery ("SELECT user FROM users WHERE user='$szUser'");
if ($q-> getNumRows() !=1)
// Navigation error (possible user attack)
Page::redirTo(ereg_replace("&", "&", $szHrefBase));
// context menu
$menu= new Menu(TITLE);
$menu-> addItem ($szHrefBase, 'Zpět na správu uživatelů');
$layout= $GLOBALS["layout"];
$layout-> addToBegin ($menu);
// page title
$canvas= $GLOBALS["canvas"];
HtTitle::singleton()-> setTitle(TITLE);
HtInline::factory ("h1", $canvas)-> addText(TITLE.' - '.htmlspecialchars(strip_tags($szUser)));
$szHrefBase.= "&user=$szUser";
if (@$_POST["setPasswd"]== "true" && isset($_POST["passwd1"], $_POST["passwd2"])) {
// request handling
$szPasswd1= $_POST["passwd1"];
$szPasswd2= $_POST["passwd2"];
if (!ini_get ("magic_quotes_gpc")) {
$szPasswd1= addslashes ($szPasswd1);
$szPasswd2= addslashes ($szPasswd2);
}
if (empty($szPasswd1)) {
HtInline::factory ("p", $canvas)-> addText("Heslo nesmí být <b>prázdné</b>.");
} else if ($szPasswd1 != $szPasswd2) {
HtInline::factory ("p", $canvas)-> addText("Heslo pro kontrolu se <b>neshoduje</b> s původním heslem.");
} else {
new DbQuery("UPDATE users SET passwd=password('$szPasswd1') WHERE user='$szUser';");
HtInline::factory ("p", $canvas)-> addText("Změna hesla uživatele <b>".htmlentities(stripslashes($szUser))."</b> provedena.");
$p= HtInline::factory ("p", $canvas)-> addText("Pokračujte <a href=\"$szHrefBase\">zde</a>.");
return;
}
}
// build form
new SetPasswdWidget ($canvas, $szHrefBase.'&op=setPasswd', false);
}
function addUser($szHrefBase, $ico, $szFirm)
{
// context menu
$menu= new Menu('Přidání uživatele');
$menu-> addItem ($szHrefBase, 'Storno');
$layout= $GLOBALS["layout"];
$layout-> addToBegin ($menu);
// page title
$canvas= $GLOBALS["canvas"];
define('TITLE', 'Přidání uživatele');
HtTitle::singleton()-> setTitle(TITLE);
$h1= HtInline::factory("h1", $canvas)-> addText (TITLE.' - '.$szFirm);
//HtInline::factory("h2", $canvas)-> addText ("Firma '$szFirm'");
// read input values
$szUser= @$_POST["user"];
$szName= @$_POST["name"];
$szPasswd1= @$_POST["passwd1"];
$szPasswd2= @$_POST["passwd2"];
if (!ini_get ("magic_quotes_gpc")) {
$szUser= addslashes ($szUser);
$szName= addslashes ($szName);
$szPasswd1= addslashes ($szPasswd1);
$szPasswd2= addslashes ($szPasswd2);
}
// truncate input values
$szUser= substr($szUser, 0, 16);
$szName= substr($szName, 0, 64);
$szPasswd1= substr($szPasswd1, 0, 16);
$szPasswd2= substr($szPasswd2, 0, 16);
// request handling
if (@$_POST["addUser"]=="true" && isset($_POST["user"], $_POST["name"], $_POST["passwd1"], $_POST["passwd2"])) {
$q= new DbQuery ("SELECT user FROM users WHERE user='$szUser'");
if ($q-> getNumRows()) {
// user exists
HtInline::factory ('p', $canvas)-> addText ('Uživatel <b>'.htmlentities(stripslashes($szUser)).'</b> již existuje.');
} else if (empty ($szUser)) {
HtInline::factory ('p', $canvas)-> addText ('Uživatel nesmí být <b>prázdný</b>.');
} else if (empty ($szPasswd1)) {
// empty password
HtInline::factory ("p", $canvas)-> addText("Heslo nesmí být <b>prázdné</b>.");
} else if ($szPasswd1 != $szPasswd2) {
// passwords differs
HtInline::factory ("p", $canvas)-> addText("Heslo pro kontrolu se <b>neshoduje</b> s původním heslem.");
} else {
$q= new DbQuery (
"INSERT INTO users (user,name,passwd,ico,last_access,expiration)".
"VALUES ('$szUser','$szName',password('$szPasswd1'),$ico,NULL,0)"
);
$szUser= htmlentities (stripslashes ($szUser));
HtInline::factory ("p", $canvas)-> addText("Přidání uživatele <b>$szUser</b> proběhlo vpořádku.");
$p= HtInline::factory ("p", $canvas)-> addText("Pokračujte <a href=\"$szHrefBase\">zde</a>.");
// all ok
return;
}
}
// build form
$form= new SimpleForm ($canvas,
$szHrefBase.'&op=addUser',
'Přidat uživatele',
Array ('addUser'=>'true')
);
$form-> addInput ('<b>Uživatel</b>', 'user', 'text', stripslashes($szUser), 16, 'width:180px;');
$form-> addInput ('Jméno', 'name', 'text', stripslashes($szName), 64, 'width:180px;');
$form-> addInput ('Heslo', 'passwd1', 'password', '', 16, 'width:180px;');
$form-> addInput ('Heslo pro kontrolu', 'passwd2', 'password', '', 16, 'width:180px;');
}
function pageDealers()
{
$canvas= $GLOBALS["canvas"];
$layout= $GLOBALS['layout'];
define ('TITLE', 'Prodejci');
HtTitle::singleton()-> setTitle(TITLE);
HtInline::factory ("h1", $canvas)-> addText(TITLE);
$q= new DbQuery (
"SELECT D.ico AS ico, F.name AS firm, COUNT(DISTINCT U.user) AS cnt_user, ".
"COUNT(DISTINCT O.order_id) AS cnt_order, SUM(tickets.price) AS sale ".
"FROM dealers D JOIN firms F ON D.ico=F.ico ".
"LEFT JOIN users U ON D.ico=U.ico ".
"LEFT JOIN orders O ON U.user=O.user ".
"LEFT JOIN order_items ON O.order_id=order_items.order_id ".
"LEFT JOIN tickets USING (route_id,seat_id) ".
"GROUP BY D.ico"
);
define ('RIGHT', 'text-align:right;');
define ('BOLD', 'font-weight:bold;');
$table= new QueryResult ($canvas,
Array ('Firma','Objednávek','Celková tržba','Uživatelé'),
Array (1=>RIGHT, RIGHT.BOLD)
);
for ($i=0; $i< $q->getNumRows(); $i++) {
$row= $q->fetchArray();
$szLinkToFirm=
Page::linkToWebRoot().'/manager'.Page::phpFileExt().
'?page=users&firm='.$row['ico'];
unset ($row['ico']);
$row['firm']= '<a href="'.$szLinkToFirm.'">'.$row['firm'].'</a>';
if (empty ($row['sale']))
$row['sale']= 0;
$row['sale'].= ' Kč';
$row []= '<a href="'.$szLinkToFirm.'">zobrazit</a> ('.$row['cnt_user'].')';
unset ($row['cnt_user']);
$table-> addRow($row);
}
$menu= new Menu(TITLE);
$li= HtInline::factory ("li", $menu->getInnerList());
HtInline::factory ("p", $li)-> addText('Klikněte na název firmy pro zabrezení detailních informací.');
$layout-> addToBegin($menu);
}
function pageTransporters()
{
$canvas= $GLOBALS["canvas"];
$layout= $GLOBALS['layout'];
define ('TITLE', 'Dopravci');
HtTitle::singleton()-> setTitle(TITLE);
HtInline::factory ("h1", $canvas)-> addText(TITLE);
$q= new DbQuery (
"SELECT T.ico AS ico, F.name AS firm, COUNT(DISTINCT U.user) AS cnt_user, ".
"COUNT(DISTINCT IF(R.route_date>NOW(), R.route_id, NULL)) AS cnt_route, ".
"SUM(tickets.price) AS sale ".
"FROM transporters T JOIN firms F ON T.ico=F.ico ".
"LEFT JOIN users U ON T.ico=U.ico ".
"LEFT JOIN routes R ON T.ico=R.ico ".
"LEFT JOIN order_items ON R.route_id=order_items.route_id ".
"LEFT JOIN tickets ON order_items.route_id=tickets.route_id AND order_items.seat_id=tickets.seat_id ".
"GROUP BY T.ico"
);
define ('RIGHT', 'text-align:right;');
define ('BOLD', 'font-weight:bold;');
$table= new QueryResult ($canvas,
Array ('Firma','Aktivních spojů','Celková tržba','Uživatelé'),
Array (1=>RIGHT, RIGHT.BOLD)
);
for ($i=0; $i< $q->getNumRows(); $i++) {
$row= $q->fetchArray();
$szLinkToFirm=
Page::linkToWebRoot().'/manager'.Page::phpFileExt().
'?page=users&firm='.$row['ico'];
unset ($row['ico']);
$row['firm']= '<a href="'.$szLinkToFirm.'">'.$row['firm'].'</a>';
if (empty($row['sale']))
$row['sale']= 0;
$row['sale'].= ' Kč';
$row []= '<a href="'.$szLinkToFirm.'">Správa uživatelů</a> ('.$row['cnt_user'].')';
unset ($row['cnt_user']);
$table-> addRow($row);
}
$menu= new Menu(TITLE);
$li= HtInline::factory ("li", $menu->getInnerList());
HtInline::factory ("p", $li)-> addText('Klikněte na název firmy pro zabrezení detailních informací.');
$layout-> addToBegin($menu);
}
function pageFirms()
{
$szHrefBase= Page::linkToWebRoot().'/manager'.Page::phpFileExt().'?page=firms';
$canvas= $GLOBALS["canvas"];
define ('TITLE', 'Import/export firem');
HtTitle::singleton()-> setTitle(TITLE);
//HtInline::factory ("h1", $canvas)-> addText(TITLE);
HtInline::factory ('h1', $canvas)-> addText('Upozorněnní');
HtInline::factory ('p', $canvas)-> addText('Před importem, vždy proveďte <b>zálohu</b> pomocí exportu a uložení na disk.');
HtInline::factory ('h2', $canvas)-> addText('Importovat firmy');
$block= HtBlock::factory ('div', $canvas, '.infoFrame');
if (@$_GET['op']=='import' && @$_POST['import']=='true')
importFirms($block);
HtInline::factory ('p', $block)-> addText('Importovat firmy ze souboru XML:');
$form= HtBlock::factory ('form', $block, '', Array (
'action' => $szHrefBase.'&op=import',
'method' => 'post',
'enctype' => 'multipart/form-data'
));
$p= HtInline::factory ('div', $form, '.indented');
HtSingle::factory ('input', $p, '', Array(
'name' => 'MAX_FILE_SIZE',
'type' => 'hidden',
'value' => '65536'
));
HtSingle::factory ('input', $p, '', Array(
'name' => 'xml_file',
'type' => 'file'
));
$p= HtInline::factory ('div', $form, '.indented');
HtSingle::factory ('input', $p, '', Array(
'name' => 'import',
'type' => 'hidden',
'value' => 'true'
));
HtSingle::factory ('input', $p, '', Array (
'type' => 'submit',
'value' => 'Importovat'
));
HtInline::factory ('h2', $canvas)-> addText('Exportovat firmy');
if (@$_GET['op']=='export' && @$_POST['export']=='true') {
exportFirms();
} else {
$block= HtBlock::factory ('div', $canvas, '.infoFrame');
HtInline::factory ('p', $block)-> addText('Exportovat firmy do souboru XML?');
$form= HtBlock::factory ('form', $block, '', Array (
'action' => $szHrefBase.'&op=export',
'method' => 'post'
));
$p= HtInline::factory ('div', $form, '.indented');
HtSingle::factory ('input', $p, '', Array(
'name' => 'export',
'type' => 'hidden',
'value' => 'true'
));
HtSingle::factory ('input', $p, '', Array (
'type' => 'submit',
'value' => 'Exportovat'
));
}
}
function exportFirms()
{
header('Content-Description: File Transfer');
header('Content-Type: application/xml');
header('Content-Disposition: attachment; filename="firms.xml"');
echo "<?xml version=\"1.0\" encoding=\"iso8859-2\" ?>\n";
$export= HtBlock::factory ('firms', NULL);
$q= new DbQuery (
"SELECT F.*, D.ico IS NOT NULL AS isD, T.ico IS NOT NULL AS isT ".
"FROM firms F ".
"LEFT JOIN dealers D ON F.ico=D.ico ".
"LEFT JOIN transporters T ON F.ico=T.ico "
);
for ($i=0; $i< $q->getNumRows(); $i++) {
$row= $q->fetchArray();
if ($row['isD'])
$row['role']='dealer';
else if ($row['isT'])
$row['role']='transporter';
else
continue;
unset ($row['isD'], $row['isT']);
foreach ($row as $key => $value)
$attrMap[$key]= htmlspecialchars($row[$key]);
HtSingle::factory ('firm', $export, '', $attrMap);
}
$export->draw();
exit();
}
function u_decode ($utf8)
{
return iconv('utf-8', 'iso8859-2', $utf8);
}
function importFirms($block)
{
if (!(@$_FILES['xml_file']['error']===0)) {
HtInline::factory ('p', $block)-> addText('Soubor <b>nelze nahrát</b> na server.');
return;
}
$upload= $_FILES['xml_file'];
if ($upload['size']>65536) {
HtInline::factory ('p', $block)-> addText('Překročen <b>limit</b> pro velikost nahrávaného souboru.');
return;
}
$dom= new DomDocument;
if (!@$dom->load ($upload['tmp_name'])) {
HtInline::factory ('p', $block)-> addText('Chyba při <b>parsování XML souboru</b>.');
return;
}
$root= $dom->documentElement;
if ($root->tagName !='firms') {
HtInline::factory ('p', $block)-> addText('<b>Kořenový element</b> XML souboru neodpovídá. Pravděpodobně se nejedná o exportovaná data.');
return;
}
$nodes= $root->childNodes;
$iTotal=0;
$iAdded=0;
$iUpdated=0;
foreach ($nodes as $node) {
$attrMap= $node->attributes;
if (!$attrMap)
continue;
$iTotal++;
$ico= (int) ($attrMap->getNamedItem('ico')->nodeValue);
if (!$ico)
continue;
$role= $attrMap->getNamedItem('role')->nodeValue;
if ($role !='dealer' && $role !='transporter')
continue;
$name= substr (u_decode($attrMap->getNamedItem('name')->nodeValue), 0, 32);
$address= substr (u_decode($attrMap->getNamedItem('address')->nodeValue), 0, 64);
$tel= substr (u_decode($attrMap->getNamedItem('tel')->nodeValue), 0, 32);
$www= substr (u_decode($attrMap->getNamedItem('www')->nodeValue), 0, 64);
$email= substr (u_decode($attrMap->getNamedItem('email')->nodeValue), 0, 32);
if ($role =='dealer')
$q= new DbQuery ("SELECT firms.ico FROM dealers NATURAL JOIN firms WHERE dealers.ico=$ico");
else
$q= new DbQuery ("SELECT firms.ico FROM transporters NATURAL JOIN firms WHERE transporters.ico=$ico");
if ($q->getNumRows()) {
$q= new DbQuery ("UPDATE firms SET name='$name', address='$address', tel='$tel', www='$www', email='$email' WHERE ico=$ico");
if ($q->getAffectedRows())
$iUpdated++;
} else {
$q= new DbQuery ("INSERT INTO firms SET ico=$ico, name='$name', address='$address', tel='$tel', www='$www', email='$email'");
if (!$q->getAffectedRows())
continue;
if ($role =='dealer')
$q= new DbQuery ("INSERT INTO dealers (ico) VALUES ($ico)");
else
$q= new DbQuery ("INSERT INTO transporters (ico) VALUES ($ico)");
if ($q->getAffectedRows())
$iAdded++;
}
}
HtInline::factory ('p', $block)-> addText('Import firem byl <b>úspěšně dokončen</b>.');
HtInline::factory ('p', $block)-> addText(' ');
HtInline::factory ('p', $block)-> addText('Celkem bylo zpracováno <b>'.$iTotal.' záznamů</b>.');
HtInline::factory ('p', $block)-> addText('<b>'.$iAdded.' záznamů</b> bylo přidáno.');
HtInline::factory ('p', $block)-> addText('<b>'.$iUpdated.' záznamů</b> bylo aktualizováno.');
$layout= $GLOBALS['layout'];
$layout-> draw();
exit();
}
?>