Files
2026-09-16 23:20:08 +07:00

140 lines
6.0 KiB
PHP

<?php
session_start();
$scriptName = $_SERVER['SCRIPT_NAME'];
$baseDir = dirname(dirname($scriptName));
if ($baseDir === '/' || $baseDir === '\\') $baseDir = '';
define('BASE_URL', $baseDir);
// Simple PSR-4 Autoloader
spl_autoload_register(function ($class) {
// Project-specific namespace prefix
$prefix = 'App\\';
// Base directory for the namespace prefix
$base_dir = __DIR__ . '/../src/';
// Does the class use the namespace prefix?
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
// No, move to the next registered autoloader
return;
}
// Get the relative class name
$relative_class = substr($class, $len);
// Replace the namespace prefix with the base directory, replace namespace
// separators with directory separators in the relative class name, append
// with .php
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
// If the file exists, require it
if (file_exists($file)) {
require $file;
}
});
// Setup Global Error & Exception Handling
set_error_handler(function($severity, $message, $file, $line) {
if (!(error_reporting() & $severity)) {
return;
}
throw new \ErrorException($message, 0, $severity, $file, $line);
});
set_exception_handler(function($exception) {
error_log($exception->getMessage() . " in " . $exception->getFile() . " on line " . $exception->getLine());
$isAjax = !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
if ($isAjax || (isset($_SERVER['HTTP_ACCEPT']) && strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false)) {
http_response_code(500);
header('Content-Type: application/json');
echo json_encode([
'status' => 'error',
'message' => 'เกิดข้อผิดพลาดในระบบ โปรดติดต่อผู้ดูแลระบบ'
]);
exit;
}
http_response_code(500);
$error_message = 'เกิดข้อผิดพลาด: ' . $exception->getMessage() . ' ในไฟล์ ' . $exception->getFile() . ' บรรทัดที่ ' . $exception->getLine();
// Check if error view exists
$errorView = __DIR__ . '/../views/error.php';
if (file_exists($errorView)) {
require $errorView;
} else {
echo "<h1>500 Internal Server Error</h1><p>{$error_message}</p>";
}
exit;
});
// Load Router
use App\Core\Router;
$router = new Router();
// Routes definition
$router->add('GET', '/', 'DashboardController', 'index');
$router->add('GET', '/login', 'AuthController', 'login');
$router->add('POST', '/login', 'AuthController', 'authenticate');
$router->add('GET', '/logout', 'AuthController', 'logout');
$router->add('GET', '/trip/create', 'TripController', 'create');
$router->add('POST', '/trip/create', 'TripController', 'store');
$router->add('GET', '/trip/search-docs', 'TripController', 'searchDocs');
$router->add('GET', '/trip/edit', 'TripController', 'edit');
$router->add('POST', '/trip/edit', 'TripController', 'update');
$router->add('POST', '/trip/delete', 'TripController', 'delete');
$router->add('POST', '/trip/request-cancel', 'TripController', 'requestCancel');
$router->add('POST', '/trip/request-revise', 'TripController', 'requestRevise');
$router->add('GET', '/trip/approvals', 'ApprovalController', 'index');
$router->add('POST', '/trip/approvals/process', 'ApprovalController', 'process');
$router->add('GET', '/report', 'ReportController', 'index');
$router->add('GET', '/report/export', 'ReportController', 'export');
$router->add('GET', '/settings', 'SettingsController', 'index');
$router->add('GET', '/settings/google-sheets', 'SettingsController', 'googleSheets');
$router->add('POST', '/settings/google-sheets/save', 'SettingsController', 'googleSheetsSave');
$router->add('GET', '/settings/google-sheets/sync', 'SettingsController', 'googleSheetsSync');
$router->add('POST', '/settings/google-sheets/test', 'SettingsController', 'googleSheetsTest');
$router->add('GET', '/settings/hierarchy', 'SettingsController', 'approvalHierarchy');
$router->add('GET', '/settings/search-user', 'SettingsController', 'searchUser');
$router->add('POST', '/settings/hierarchy/add', 'SettingsController', 'addHierarchy');
$router->add('POST', '/settings/hierarchy/remove', 'SettingsController', 'removeHierarchy');
$router->add('GET', '/settings/line-notify', 'SettingsController', 'lineNotify');
$router->add('POST', '/settings/line-notify/save', 'SettingsController', 'saveLineNotify');
$router->add('POST', '/settings/line-notify/test', 'SettingsController', 'lineNotifyTest');
$router->add('GET', '/settings/telegram-notify', 'SettingsController', 'telegramNotify');
$router->add('POST', '/settings/telegram-notify/save', 'SettingsController', 'saveTelegramNotify');
$router->add('POST', '/settings/telegram-notify/test', 'SettingsController', 'telegramNotifyTest');
$router->add('GET', '/settings/pdf-designer', 'SettingsController', 'pdfDesigner');
$router->add('GET', '/settings/pdf-designer/preview', 'SettingsController', 'previewPdf');
$router->add('POST', '/settings/pdf-designer/upload', 'SettingsController', 'uploadPdfTemplate');
$router->add('POST', '/settings/pdf-designer/save', 'SettingsController', 'savePdfLayout');
$router->add('POST', '/settings/pdf-designer/delete', 'SettingsController', 'deletePdfTemplate');
$router->add('GET', '/trip/print', 'TripController', 'printPdf');
// Roles
$router->add('GET', '/roles', 'RoleController', 'index');
$router->add('GET', '/roles/search', 'RoleController', 'search');
$router->add('POST', '/roles/assign', 'RoleController', 'assign');
$router->add('POST', '/roles/remove', 'RoleController', 'remove');
$router->add('GET', '/reports', 'ReportController', 'index');
$router->add('GET', '/reports/export', 'ReportController', 'export');
$router->add('GET', '/audit', 'AuditController', 'index');
$router->add('GET', '/manual', 'ManualController', 'index');
$router->dispatch($_SERVER['REQUEST_URI'], $_SERVER['REQUEST_METHOD']);