From eeb8d0977cd96e3a322055e5555057bafde4e194 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 10 Mar 2026 17:57:34 +0000 Subject: [PATCH] add reports --- admin_reports_shippers.php | 254 ++++++++++++++++++ admin_reports_truck_owners.php | 254 ++++++++++++++++++ assets/css/custom.css | 150 ++++++++++- .../update_report_permission_description.php | 16 ++ includes/layout.php | 48 +++- 5 files changed, 720 insertions(+), 2 deletions(-) create mode 100644 admin_reports_shippers.php create mode 100644 admin_reports_truck_owners.php create mode 100644 db/migrations/update_report_permission_description.php diff --git a/admin_reports_shippers.php b/admin_reports_shippers.php new file mode 100644 index 0000000..b7a3105 --- /dev/null +++ b/admin_reports_shippers.php @@ -0,0 +1,254 @@ +
Access Denied. You do not have permission to view reports.
'; + render_footer(); + exit; +} + +$shipperId = (int)($_GET['shipper_id'] ?? 0); +$startDate = $_GET['start_date'] ?? ''; +$endDate = $_GET['end_date'] ?? ''; + +$shipper = null; +$shipments = []; +$totalAmount = 0.00; + +// Fetch all shippers for the dropdown +$allShippers = db()->query(" + SELECT u.id, u.full_name, p.company_name + FROM users u + LEFT JOIN shipper_profiles p ON u.id = p.user_id + WHERE u.role = 'shipper' + ORDER BY u.full_name ASC +")->fetchAll(); + +if ($shipperId) { + // Fetch selected shipper details + $stmt = db()->prepare(" + SELECT u.id, u.full_name, u.email, p.company_name, p.phone, p.address_line, + c.name_en as country, ci.name_en as city + FROM users u + LEFT JOIN shipper_profiles p ON u.id = p.user_id + LEFT JOIN countries c ON p.country_id = c.id + LEFT JOIN cities ci ON p.city_id = ci.id + WHERE u.id = ? AND u.role = 'shipper' + "); + $stmt->execute([$shipperId]); + $shipper = $stmt->fetch(); + + if ($shipper) { + // Build Query with Date Filter + $sql = "SELECT * + FROM shipments + WHERE shipper_id = ? + AND status IN ('confirmed', 'in_transit', 'delivered')"; + $params = [$shipperId]; + + if (!empty($startDate)) { + $sql .= " AND created_at >= ?"; + $params[] = $startDate . ' 00:00:00'; + } + + if (!empty($endDate)) { + $sql .= " AND created_at <= ?"; + $params[] = $endDate . ' 23:59:59'; + } + + $sql .= " ORDER BY created_at DESC"; + + $stmt = db()->prepare($sql); + $stmt->execute($params); + $shipments = $stmt->fetchAll(); + + foreach ($shipments as $s) { + $totalAmount += (float)($s['total_price'] ?? 0); + } + } +} + +render_header(t('shippers_statements') ?: 'Shippers Statements', 'reports_shippers', true); +?> + + + +
+
+ +
+
+ +
+
+

Shipper Statements

+

View and print financial statements for shippers.

+
+ + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ + +
Shipper not found.
+ +
+ + + + +
+
+
Billed To / إلى السيد
+

+
+
+
+ ,
+ +
+
+
+
Summary / ملخص
+
Statement Date:
+ +
Period: to
+ +
Period: All Time
+ +
Total Shipments:
+
+ OMR +
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Date
التاريخ
Ref #
رقم الشحنة
Route
المسار
Status
الحالة
Amount (OMR)
المبلغ
No completed shipments found for this period.
# + +
+
+ + + +
Total Balance / الإجمالي OMR
+
+ + + +
+ +
+
+ + \ No newline at end of file diff --git a/admin_reports_truck_owners.php b/admin_reports_truck_owners.php new file mode 100644 index 0000000..632c0de --- /dev/null +++ b/admin_reports_truck_owners.php @@ -0,0 +1,254 @@ +
Access Denied. You do not have permission to view reports.
'; + render_footer(); + exit; +} + +$ownerId = (int)($_GET['owner_id'] ?? 0); +$startDate = $_GET['start_date'] ?? ''; +$endDate = $_GET['end_date'] ?? ''; + +$owner = null; +$shipments = []; +$totalEarnings = 0.00; + +// Fetch all truck owners for the dropdown +$allOwners = db()->query(" + SELECT u.id, u.full_name, p.plate_no + FROM users u + LEFT JOIN truck_owner_profiles p ON u.id = p.user_id + WHERE u.role = 'truck_owner' + ORDER BY u.full_name ASC +")->fetchAll(); + +if ($ownerId) { + // Fetch selected owner details + $stmt = db()->prepare(" + SELECT u.id, u.full_name, u.email, p.phone, p.plate_no, p.truck_type, + c.name_en as country, ci.name_en as city + FROM users u + LEFT JOIN truck_owner_profiles p ON u.id = p.user_id + LEFT JOIN countries c ON p.country_id = c.id + LEFT JOIN cities ci ON p.city_id = ci.id + WHERE u.id = ? AND u.role = 'truck_owner' + "); + $stmt->execute([$ownerId]); + $owner = $stmt->fetch(); + + if ($owner) { + // Build Query with Date Filter + $sql = "SELECT * + FROM shipments + WHERE truck_owner_id = ? + AND status IN ('confirmed', 'in_transit', 'delivered')"; + $params = [$ownerId]; + + if (!empty($startDate)) { + $sql .= " AND created_at >= ?"; + $params[] = $startDate . ' 00:00:00'; + } + + if (!empty($endDate)) { + $sql .= " AND created_at <= ?"; + $params[] = $endDate . ' 23:59:59'; + } + + $sql .= " ORDER BY created_at DESC"; + + $stmt = db()->prepare($sql); + $stmt->execute($params); + $shipments = $stmt->fetchAll(); + + foreach ($shipments as $s) { + $totalEarnings += (float)($s['offer_price'] ?? 0); + } + } +} + +render_header(t('truck_owners_statements') ?: 'Truck Owner Statements', 'reports_truck_owners', true); +?> + + + +
+
+ +
+
+ +
+
+

Truck Owner Statements

+

View and print financial statements for truck owners.

+
+ + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ + +
Truck Owner not found.
+ +
+ + + + +
+
+
Pay To / إلى السيد
+

+
Truck Plate:
+
+
+ ,
+ +
+
+
+
Summary / ملخص
+
Statement Date:
+ +
Period: to
+ +
Period: All Time
+ +
Total Trips:
+
+ OMR +
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Date
التاريخ
Ref #
رقم الشحنة
Route
المسار
Status
الحالة
Earnings (OMR)
المبلغ
No completed shipments found for this period.
# + +
+
+ + + +
Total Earnings / الإجمالي OMR
+
+ + + +
+ +
+
+ + \ No newline at end of file diff --git a/assets/css/custom.css b/assets/css/custom.css index 6db30d1..69668dd 100644 --- a/assets/css/custom.css +++ b/assets/css/custom.css @@ -20,6 +20,67 @@ --sidebar-border: rgba(255, 255, 255, 0.1); } +/* Theme: Dark */ +[data-theme="dark"] { + --bg: #0f172a; + --surface: #1e293b; + --text: #f1f5f9; + --muted: #94a3b8; + --border: #334155; + --primary: #60a5fa; + --primary-hover: #3b82f6; + --accent: #38bdf8; + --shadow: 0 10px 30px rgba(0, 0, 0, 0.3); + + --sidebar-bg: #0f172a; + --sidebar-text: #e2e8f0; + --sidebar-text-hover: #ffffff; + --sidebar-active-bg: #334155; + --sidebar-border: #334155; +} + +/* Theme: Blue (Corporate) */ +[data-theme="blue"] { + --primary: #2563eb; + --primary-hover: #1d4ed8; + --sidebar-bg: #1e3a8a; +} + +/* Theme: Green (Nature) */ +[data-theme="green"] { + --primary: #10b981; + --primary-hover: #059669; + --sidebar-bg: #064e3b; +} + +/* Theme: Purple (Creative) */ +[data-theme="purple"] { + --primary: #8b5cf6; + --primary-hover: #7c3aed; + --sidebar-bg: #4c1d95; +} + +/* Theme: Red (Bold) */ +[data-theme="red"] { + --primary: #ef4444; + --primary-hover: #dc2626; + --sidebar-bg: #7f1d1d; +} + +/* Theme: Orange (Warm) */ +[data-theme="orange"] { + --primary: #f97316; + --primary-hover: #ea580c; + --sidebar-bg: #7c2d12; +} + +/* Theme: Teal (Calm) */ +[data-theme="teal"] { + --primary: #14b8a6; + --primary-hover: #0d9488; + --sidebar-bg: #134e4a; +} + body.app-body { background: radial-gradient(circle at top left, rgba(59, 130, 246, 0.05), transparent 40%), @@ -31,6 +92,66 @@ body.app-body { line-height: 1.6; } +/* Dark mode specific adjustments */ +[data-theme="dark"] body.app-body { + background: var(--bg); /* Simplify background for dark mode */ +} + +[data-theme="dark"] .navbar { + background: rgba(30, 41, 59, 0.85) !important; + border-bottom: 1px solid var(--border) !important; +} + +[data-theme="dark"] .navbar-brand { + color: var(--text) !important; +} + +[data-theme="dark"] .navbar-light .navbar-nav .nav-link { + color: var(--muted); +} + +[data-theme="dark"] .navbar-light .navbar-nav .nav-link.active, +[data-theme="dark"] .navbar-light .navbar-nav .nav-link:hover { + color: var(--text); +} + +[data-theme="dark"] .bg-white { + background-color: var(--surface) !important; +} + +[data-theme="dark"] .text-dark { + color: var(--text) !important; +} + +[data-theme="dark"] .text-muted { + color: var(--muted) !important; +} + +[data-theme="dark"] .form-control, +[data-theme="dark"] .form-select { + background-color: #0f172a; + color: var(--text); + border-color: var(--border); +} + +[data-theme="dark"] .form-control:focus, +[data-theme="dark"] .form-select:focus { + background-color: #1e293b; +} + +[data-theme="dark"] .dropdown-menu { + background-color: var(--surface); + border-color: var(--border); +} + +[data-theme="dark"] .dropdown-item { + color: var(--text); +} + +[data-theme="dark"] .dropdown-item:hover { + background-color: var(--border); +} + .navbar { backdrop-filter: blur(10px); background: rgba(255, 255, 255, 0.85) !important; @@ -195,10 +316,23 @@ body.app-body { border-bottom: 1px solid #f8fafc; } +[data-theme="dark"] .table tbody td { + border-bottom-color: var(--border); +} + .table tbody tr:hover { background: #f8fafc; } +[data-theme="dark"] .table tbody tr:hover { + background: #334155; + color: #fff; +} + +[data-theme="dark"] .table { + color: var(--text); +} + .form-control, .form-select { border-radius: 12px; @@ -220,6 +354,10 @@ body.app-body { margin-bottom: 8px; } +[data-theme="dark"] .form-label { + color: var(--text); +} + .btn-primary { background: var(--primary); border-color: var(--primary); @@ -252,6 +390,16 @@ body.app-body { border-color: #cbd5e1; } +[data-theme="dark"] .btn-outline-dark { + color: var(--text); + border-color: var(--border); +} + +[data-theme="dark"] .btn-outline-dark:hover { + background-color: var(--border); + color: #fff; +} + .section-title { font-size: 22px; font-weight: 700; @@ -370,4 +518,4 @@ body.app-body { overflow-y: visible; background-color: var(--sidebar-bg); /* Keep dark on mobile too */ } -} \ No newline at end of file +} diff --git a/db/migrations/update_report_permission_description.php b/db/migrations/update_report_permission_description.php new file mode 100644 index 0000000..ecd9956 --- /dev/null +++ b/db/migrations/update_report_permission_description.php @@ -0,0 +1,16 @@ +prepare("UPDATE permissions SET description = ? WHERE slug = ?"); + $stmt->execute([ + 'Access to all reports, including Shipper and Truck Owner statements.', + 'view_reports' + ]); + + echo "Updated 'view_reports' permission description."; +} catch (PDOException $e) { + echo "Error updating permission: " . $e->getMessage(); +} diff --git a/includes/layout.php b/includes/layout.php index 8be5bf1..558bc78 100644 --- a/includes/layout.php +++ b/includes/layout.php @@ -19,6 +19,12 @@ function render_header(string $title, string $active = '', bool $isFluid = false <?= e($title) ?> | <?= e($appName) ?> + @@ -70,6 +76,24 @@ function render_header(string $title, string $active = '', bool $isFluid = false
+ + + +