38682-vm/pos.php
Flatlogic Bot 6e5310e4dc update pos
2026-02-24 17:07:31 +00:00

458 lines
25 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/db/config.php';
require_once __DIR__ . '/includes/functions.php';
require_once __DIR__ . '/includes/lang.php';
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
// Handle language switching
if (isset($_GET['lang'])) {
$allowed_langs = ['en', 'ar'];
if (in_array($_GET['lang'], $allowed_langs)) {
$_SESSION['lang'] = $_GET['lang'];
}
$current_url = strtok($_SERVER["REQUEST_URI"], '?');
$query = $_GET;
unset($query['lang']);
if (count($query) > 0) {
$current_url .= '?' . http_build_query($query);
}
header("Location: $current_url");
exit;
}
$currentLang = $_SESSION['lang'] ?? 'en';
$isRTL = ($currentLang === 'ar');
require_permission('pos_view');
$pdo = db();
$currentUser = get_logged_user();
// Fetch outlets based on user assignment
if (has_permission('all')) {
$outlets = $pdo->query("SELECT * FROM outlets ORDER BY name")->fetchAll();
} else {
$stmt = $pdo->prepare("
SELECT o.* FROM outlets o
JOIN user_outlets uo ON o.id = uo.outlet_id
WHERE uo.user_id = ?
ORDER BY o.name
");
$stmt->execute([$currentUser['id']]);
$outlets = $stmt->fetchAll();
}
$outlet_id = isset($_GET['outlet_id']) ? (int)$_GET['outlet_id'] : (count($outlets) > 0 ? (int)$outlets[0]['id'] : 1);
// Security check: ensure user has access to this outlet
if (!has_permission('all')) {
$has_access = false;
foreach ($outlets as $o) {
if ($o['id'] == $outlet_id) {
$has_access = true;
break;
}
}
if (!$has_access && count($outlets) > 0) {
$outlet_id = (int)$outlets[0]['id'];
}
}
$categories = $pdo->query("SELECT * FROM categories ORDER BY sort_order")->fetchAll();
$all_products = $pdo->query("SELECT p.*, c.name as category_name, c.name_ar as category_name_ar FROM products p JOIN categories c ON p.category_id = c.id")->fetchAll();
$payment_types = $pdo->query("SELECT * FROM payment_types WHERE is_active = 1 ORDER BY id")->fetchAll();
// Fetch variants
$variants_raw = $pdo->query("SELECT * FROM product_variants ORDER BY price_adjustment ASC")->fetchAll();
$variants_by_product = [];
foreach ($variants_raw as $v) {
$variants_by_product[$v['product_id']][] = $v;
}
$table_id = $_GET['table'] ?? '1'; // Default table
$settings = get_company_settings();
$order_type = $_GET['order_type'] ?? 'takeaway';
$current_outlet_name = 'Unknown Outlet';
foreach ($outlets as $o) {
if ($o['id'] == $outlet_id) {
$current_outlet_name = ($isRTL && !empty($o['name_ar'])) ? $o['name_ar'] : $o['name'];
break;
}
}
// Fetch Loyalty Settings
$loyalty_stmt = $pdo->query("SELECT * FROM loyalty_settings WHERE id = 1");
$loyalty_settings = $loyalty_stmt->fetch(PDO::FETCH_ASSOC);
if (!$loyalty_settings) {
$loyalty_settings = ['is_enabled' => 0, 'points_per_order' => 0, 'points_for_free_meal' => 0];
}
?>
<!doctype html>
<html lang="<?= $currentLang ?>" dir="<?= $isRTL ? 'rtl' : 'ltr' ?>">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title><?= htmlspecialchars($settings['company_name']) ?> - POS</title>
<?php if (!empty($settings['favicon_url'])): ?>
<link rel="icon" href="<?= htmlspecialchars($settings['favicon_url']) ?>">
<?php endif; ?>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css" rel="stylesheet">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&family=Noto+Sans+Arabic:wght@400;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="assets/css/custom.css?v=<?= time() ?>">
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<style>
body { height: 100vh; overflow: hidden; font-family: 'Inter', 'Noto Sans Arabic', sans-serif; background: #f4f7f6; }
.scrollable-y { overflow-y: auto; height: 100%; scrollbar-width: thin; }
.pos-layout { height: calc(100vh - 60px); }
.pos-categories { background: #fff; height: 100%; border-<?= $isRTL ? 'left' : 'right' ?>: 1px solid #e0e0e0; }
.pos-products { background: #f8fafc; height: 100%; display: flex; flex-direction: column; }
.pos-cart { background: #fff; height: 100%; border-<?= $isRTL ? 'right' : 'left' ?>: 1px solid #e0e0e0; display: flex; flex-direction: column; }
.product-card { transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); cursor: pointer; border: 1px solid transparent !important; background: #fff; }
.product-card:active { transform: scale(0.95); }
.product-card:hover { border-color: #0d6efd !important; box-shadow: 0 4px 12px rgba(0,0,0,0.08) !important; }
.category-btn { text-align: <?= $isRTL ? 'right' : 'left' ?>; border: none; background: none; padding: 10px 12px; width: 100%; display: flex; align-items: center; gap: 10px; border-radius: 12px; color: #64748b; font-weight: 700; transition: all 0.2s; }
.category-btn:hover { background-color: #f1f5f9; color: #0f172a; }
.category-btn.active { background-color: #0d6efd; color: white; box-shadow: 0 4px 6px -1px rgba(13, 110, 253, 0.3); }
.search-dropdown { position: absolute; width: 100%; z-index: 1000; max-height: 200px; overflow-y: auto; display: none; }
/* Compact Card adjustments */
.card-img-container { height: 75px; position: relative; background: #f1f5f9; }
.card-img-container img { height: 100%; width: 100%; object-fit: cover; transition: transform 0.3s; }
.product-title { font-size: 0.75rem; line-height: 1.2; height: 1.8rem; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; font-weight: 700; color: #1e293b; }
.product-price-tag { font-size: 0.85rem; color: #0d6efd; font-weight: 700; }
.product-cat-name { font-size: 0.65rem; color: #94a3b8; }
/* Custom Grid for 7 columns */
@media (min-width: 1200px) {
.row-cols-xl-7 > *, .row-cols-xxl-7 > * { flex: 0 0 auto; width: 14.285714%; }
}
@media (max-width: 576px) {
.card-img-container { height: 65px; }
.pos-categories { width: 65px !important; flex: 0 0 65px !important; }
.category-btn span { display: none; }
.category-btn i { font-size: 1.4rem !important; margin-bottom: 0 !important; }
.category-btn img { width: 28px !important; height: 28px !important; margin-bottom: 0 !important; }
.pos-products { flex: 1; }
}
@media print {
.no-print { display: none !important; }
.print-only { display: block !important; }
body { overflow: visible !important; height: auto !important; }
}
.print-only { display: none; }
.dropdown-menu { <?= $isRTL ? 'text-align: right;' : '' ?> }
</style>
</head>
<body>
<div class="print-only" id="print-section"></div>
<div class="container-fluid p-0 no-print">
<!-- Header/Navbar -->
<nav class="navbar navbar-expand-lg border-bottom px-3 py-0 bg-white sticky-top" style="height: 60px;">
<div class="container-fluid p-0">
<a class="navbar-brand fw-bold d-flex align-items-center" href="pos.php">
<?php if (!empty($settings['logo_url'])): ?>
<img src="<?= htmlspecialchars($settings['logo_url']) ?>" alt="Logo" height="28" class="me-2">
<?php endif; ?>
<span class="d-none d-sm-inline" style="letter-spacing: -0.5px;"><?= htmlspecialchars($settings['company_name']) ?></span>
<span class="badge bg-primary-subtle text-primary ms-2 fs-7 fw-semibold rounded-pill px-2 border border-primary-subtle"><?= htmlspecialchars($current_outlet_name) ?></span>
</a>
<div class="ms-auto d-flex align-items-center gap-2">
<!-- Language Switcher -->
<div class="dropdown me-1">
<button class="btn btn-outline-secondary btn-sm rounded-pill px-3 border-0 bg-light" type="button" data-bs-toggle="dropdown">
<i class="bi bi-translate me-1"></i> <span class="d-none d-sm-inline"><?= $isRTL ? 'العربية' : 'English' ?></span>
</button>
<ul class="dropdown-menu dropdown-menu-end shadow border-0 mt-2">
<li><a class="dropdown-item" href="?lang=en">English</a></li>
<li><a class="dropdown-item" href="?lang=ar">العربية</a></li>
</ul>
</div>
<?php if (count($outlets) > 1): ?>
<div class="dropdown me-1 d-none d-md-block">
<button class="btn btn-outline-secondary btn-sm rounded-pill px-3 border-0 bg-light" type="button" data-bs-toggle="dropdown">
<i class="bi bi-shop me-1"></i> <?= t('switch') ?>
</button>
<ul class="dropdown-menu dropdown-menu-end shadow border-0 mt-2">
<?php foreach ($outlets as $o): ?>
<li><a class="dropdown-item <?= $o['id'] == $outlet_id ? 'active' : '' ?>" href="?outlet_id=<?= $o['id'] ?>&order_type=<?= $order_type ?>"><?= htmlspecialchars(($isRTL && !empty($o['name_ar'])) ? $o['name_ar'] : $o['name']) ?></a></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<a href="kitchen.php" class="btn btn-outline-primary btn-sm rounded-pill px-2 px-sm-3 border-0"><i class="bi bi-fire me-1"></i> <?= t('kitchen_view') ?></a>
<a href="admin/orders.php" class="btn btn-outline-secondary btn-sm rounded-pill px-2 px-sm-3 border-0"><i class="bi bi-receipt me-1"></i> <?= t('orders_pos') ?></a>
<button class="btn btn-outline-warning btn-sm rounded-pill px-2 px-sm-3 border-0" onclick="openRecallOrderModal()"><i class="bi bi-arrow-counterclockwise me-1"></i> <?= t('recall') ?></button>
<div class="vr mx-1 h-25 d-none d-sm-block"></div>
<div class="dropdown">
<button class="btn btn-light btn-sm rounded-circle p-0 border" type="button" data-bs-toggle="dropdown" style="width: 32px; height: 32px;">
<img src="<?= !empty($currentUser['profile_pic']) ? htmlspecialchars($currentUser['profile_pic']) : 'https://ui-avatars.com/api/?name=' . urlencode($currentUser['username']) ?>" alt="User" width="32" height="32" class="rounded-circle">
</button>
<ul class="dropdown-menu dropdown-menu-end shadow border-0 mt-2">
<li class="px-3 py-2 border-bottom">
<div class="fw-bold small"><?= htmlspecialchars($currentUser['username']) ?></div>
<div class="text-muted" style="font-size: 0.7rem;"><?= t('signed_in_as') ?> <?= htmlspecialchars($currentUser['group_name'] ?? 'User') ?></div>
</li>
<?php if (has_permission('dashboard_view')): ?>
<li><a class="dropdown-item py-2" href="admin/index.php"><i class="bi bi-speedometer2 me-2"></i> <?= t('dashboard') ?></a></li>
<?php endif; ?>
<li><a class="dropdown-item py-2 text-danger" href="logout.php"><i class="bi bi-box-arrow-right me-2"></i> <?= t('logout') ?></a></li>
</ul>
</div>
</div>
</div>
</nav>
<div class="row g-0 pos-layout">
<!-- Left Sidebar: Categories -->
<div class="col-md-2 col-auto pos-categories scrollable-y p-2" style="max-width: 170px;">
<button class="category-btn active mb-2" data-category="all">
<i class="bi bi-grid fs-5 text-inherit"></i>
<span style="font-size: 0.85rem; font-weight: 700;"><?= t('all') ?></span>
</button>
<?php foreach ($categories as $cat): ?>
<button class="category-btn mb-2" data-category="<?= $cat['id'] ?>">
<?php if (!empty($cat['image_url'])): ?>
<img src="<?= htmlspecialchars($cat['image_url']) ?>" alt="<?= htmlspecialchars($cat['name']) ?>" class="rounded-3" style="width: 24px; height: 24px; object-fit: cover; flex-shrink: 0;">
<?php else: ?>
<i class="bi bi-tag fs-5 text-inherit"></i>
<?php endif; ?>
<span class="text-truncate" style="font-size: 0.85rem; font-weight: 700;"><?= htmlspecialchars(($isRTL && !empty($cat['name_ar'])) ? $cat['name_ar'] : $cat['name']) ?></span>
</button>
<?php endforeach; ?>
</div>
<!-- Center Area: Product Grid -->
<div class="col pos-products">
<!-- Search Bar -->
<div class="px-3 py-2 border-bottom bg-white">
<div class="row g-2 align-items-center">
<div class="col">
<div class="position-relative">
<span class="position-absolute top-50 start-0 translate-middle-y ms-3 text-muted">
<i class="bi bi-search small"></i>
</span>
<input type="text" id="product-search" class="form-control form-control-sm ps-5 border-0 bg-light rounded-3" placeholder="<?= t('search') ?>...">
</div>
</div>
<?php if (count($outlets) > 1): ?>
<div class="col-auto">
<select class="form-select form-select-sm border-0 bg-light rounded-3 fw-bold text-primary" style="min-width: 120px;" onchange="location.href='?outlet_id=' + this.value + '&order_type=<?= $order_type ?>'">
<?php foreach ($outlets as $o): ?>
<option value="<?= $o['id'] ?>" <?= $o['id'] == $outlet_id ? 'selected' : '' ?>><?= htmlspecialchars(($isRTL && !empty($o['name_ar'])) ? $o['name_ar'] : $o['name']) ?></option>
<?php endforeach; ?>
</select>
</div>
<?php endif; ?>
</div>
</div>
<!-- Grid Container -->
<div class="flex-grow-1 scrollable-y p-2">
<div class="row g-2 row-cols-3 row-cols-sm-4 row-cols-md-5 row-cols-lg-6 row-cols-xl-7 row-cols-xxl-7" id="product-grid">
<?php foreach ($all_products as $product): ?>
<?php $has_variants = !empty($variants_by_product[$product['id']]); ?>
<div class="col product-item"
data-category="<?= $product['category_id'] ?>"
data-name="<?= htmlspecialchars(strtolower($product['name'])) ?>"
data-name-ar="<?= htmlspecialchars(strtolower($product['name_ar'] ?? '')) ?>"
data-sku="<?= htmlspecialchars(strtolower($product['sku'] ?? '')) ?>"
onclick="handleProductClick(<?= htmlspecialchars(json_encode($product), ENT_QUOTES) ?>, <?= htmlspecialchars(json_encode($variants_by_product[$product['id']] ?? []), ENT_QUOTES) ?>)">
<div class="card h-100 border-0 shadow-sm product-card rounded-3 overflow-hidden">
<div class="card-img-container">
<?php if (!empty($product['image_url'])): ?>
<img src="<?= htmlspecialchars($product['image_url']) ?>?v=<?= time() ?>" alt="<?= htmlspecialchars($product['name']) ?>">
<?php else: ?>
<div class="d-flex align-items-center justify-content-center h-100">
<i class="bi bi-image text-muted opacity-25 fs-4"></i>
</div>
<?php endif; ?>
<?php if ($has_variants): ?>
<div class="position-absolute top-0 end-0 p-1">
<span class="badge bg-warning text-dark p-0 rounded-circle d-flex align-items-center justify-content-center" style="width: 14px; height: 14px; font-size: 0.5rem;"><i class="bi bi-plus"></i></span>
</div>
<?php endif; ?>
</div>
<div class="card-body p-1 text-center d-flex flex-column justify-content-between">
<div>
<h6 class="card-title product-title mb-0"><?= htmlspecialchars(($isRTL && !empty($product['name_ar'])) ? $product['name_ar'] : $product['name']) ?></h6>
<?php if ($isRTL && !empty($product['name'])): ?>
<div class="text-muted product-cat-name text-truncate" style="margin-top: -2px;"><?= htmlspecialchars($product['name']) ?></div>
<?php elseif (!$isRTL && !empty($product['name_ar'])): ?>
<div class="text-primary product-cat-name text-truncate" dir="rtl" style="margin-top: -2px;"><?= htmlspecialchars($product['name_ar']) ?></div>
<?php endif; ?>
</div>
<div class="product-price-tag mt-1"><?= format_currency((float)$product['price']) ?></div>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
<!-- Right Sidebar: Cart -->
<div class="col-md-3 col-12 pos-cart shadow-sm">
<div class="p-2 border-bottom bg-white">
<div class="btn-group w-100 mb-2" role="group">
<input type="radio" class="btn-check" name="order_type" id="ot-takeaway" value="takeaway" <?= $order_type === 'takeaway' ? 'checked' : '' ?>>
<label class="btn btn-outline-primary btn-sm py-1 rounded-start-pill" for="ot-takeaway" style="font-size: 0.75rem; font-weight: 700;"><?= t('takeaway') ?></label>
<input type="radio" class="btn-check" name="order_type" id="ot-dine-in" value="dine-in" <?= $order_type === 'dine-in' ? 'checked' : '' ?>>
<label class="btn btn-outline-primary btn-sm py-1" for="ot-dine-in" style="font-size: 0.75rem; font-weight: 700;"><?= t('dine_in') ?></label>
<input type="radio" class="btn-check" name="order_type" id="ot-delivery" value="delivery" <?= $order_type === 'delivery' ? 'checked' : '' ?>>
<label class="btn btn-outline-primary btn-sm py-1 rounded-end-pill" for="ot-delivery" style="font-size: 0.75rem; font-weight: 700;"><?= t('delivery') ?></label>
</div>
<div class="position-relative">
<div class="input-group input-group-sm">
<span class="input-group-text bg-light border-0 rounded-<?= $isRTL ? 'end' : 'start' ?>-pill ps-3"><i class="bi bi-person text-muted"></i></span>
<input type="text" class="form-control border-0 bg-light ps-1" id="customer-search" placeholder="<?= t('customer') ?>..." autocomplete="off" style="font-weight: 600;">
<button class="btn btn-light border-0 d-none" type="button" id="clear-customer"><i class="bi bi-x"></i></button>
<button class="btn btn-light border-0 rounded-<?= $isRTL ? 'start' : 'end' ?>-pill pe-3 text-primary" type="button" data-bs-toggle="modal" data-bs-target="#addCustomerModal"><i class="bi bi-plus-lg"></i></button>
</div>
<div class="list-group shadow border-0 search-dropdown" id="customer-results" style="border-radius: 12px; margin-top: 5px;"></div>
<input type="hidden" id="selected-customer-id">
</div>
</div>
<div class="flex-grow-1 overflow-auto p-2 bg-white" id="cart-items">
<div class="text-center text-muted mt-5 opacity-50">
<i class="bi bi-basket3 fs-1 d-block mb-2"></i>
<p class="small"><?= t('none') ?></p>
</div>
</div>
<div class="p-3 border-top bg-light mt-auto rounded-top-4">
<div class="d-flex justify-content-between mb-1">
<span class="text-muted small"><?= t('total') ?></span>
<span class="fw-bold small" id="cart-subtotal"><?= format_currency(0) ?></span>
</div>
<div class="d-flex justify-content-between mb-3">
<span class="fs-6 fw-bold"><?= t('total') ?></span>
<span class="fs-5 fw-bold text-primary" id="cart-total-price"><?= format_currency(0) ?></span>
</div>
<button class="btn btn-link text-danger w-100 py-0 fw-semibold mb-3 btn-sm text-decoration-none" onclick="clearCart()" style="font-size: 0.75rem;"><?= t('close') ?></button>
<div class="d-flex gap-2">
<button class="btn btn-primary w-50 btn-sm shadow-sm fw-bold py-2 rounded-3" id="quick-order-btn" disabled><?= t('save') ?></button>
<button class="btn btn-outline-warning w-50 btn-sm shadow-sm fw-bold py-2 rounded-3" id="place-order-btn" disabled><?= t('save') ?></button>
</div>
</div>
</div>
</div>
</div>
<!-- Modals -->
<div class="no-print">
<div class="modal fade" id="recallOrderModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content border-0 shadow-lg" style="border-radius: 20px;">
<div class="modal-header border-0 pb-0">
<h6 class="modal-title fw-bold"><?= t('recall') ?></h6>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-3"><div id="recall-orders-list" class="list-group list-group-flush"></div></div>
</div>
</div>
</div>
<div class="modal fade" id="variantSelectionModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-sm">
<div class="modal-content border-0 shadow-lg" style="border-radius: 20px;">
<div class="modal-header border-0 pb-0">
<h6 class="modal-title fw-bold" id="variantModalTitle"><?= t('variant') ?></h6>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-3"><div id="variant-list" class="list-group list-group-flush"></div></div>
</div>
</div>
</div>
<div class="modal fade" id="addCustomerModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-sm">
<div class="modal-content border-0 shadow-lg" style="border-radius: 20px;">
<div class="modal-header border-0 pb-0">
<h6 class="modal-title fw-bold"><?= t('add') ?> <?= t('customer') ?></h6>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-3">
<div class="mb-2">
<label class="small text-muted mb-1"><?= t('name') ?></label>
<input type="text" class="form-control form-control-sm rounded-3" id="new-customer-name">
</div>
<div class="mb-3">
<label class="small text-muted mb-1"><?= t('phone') ?></label>
<input type="text" class="form-control form-control-sm rounded-3" id="new-customer-phone">
</div>
<button type="button" class="btn btn-primary btn-sm w-100 py-2 rounded-3" id="save-new-customer"><?= t('add') ?></button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="paymentSelectionModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-sm">
<div class="modal-content border-0 shadow-lg" style="border-radius: 20px;">
<div class="modal-header border-0 pb-0">
<h6 class="modal-title fw-bold"><?= t('payment') ?></h6>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-3"><div class="row g-2" id="payment-methods-container"></div></div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script>
const COMPANY_SETTINGS = <?= json_encode($settings) ?>;
const PRODUCT_VARIANTS = <?= json_encode($variants_by_product) ?>;
const PAYMENT_TYPES = <?= json_encode($payment_types) ?>;
const BASE_URL = '<?= get_base_url() ?>';
const CURRENT_OUTLET = { id: <?= $outlet_id ?>, name: '<?= addslashes($current_outlet_name) ?>' };
const CURRENT_USER = { id: <?= $currentUser['id'] ?>, name: '<?= addslashes($currentUser['username']) ?>' };
const LOYALTY_SETTINGS = <?= json_encode($loyalty_settings) ?>;
const LANG = '<?= $currentLang ?>';
// JS Translations
const translations = {
'en': {
'cart_empty': 'Cart is empty',
'remove': 'Remove',
'order_placed': 'Order Placed',
'order_success': 'Order processed successfully!',
'error': 'Error',
'quick_pay': 'QUICK PAY',
'save_bill': 'SAVE BILL'
},
'ar': {
'cart_empty': 'السلة فارغة',
'remove': 'إزالة',
'order_placed': 'تم تقديم الطلب',
'order_success': 'تم معالجة الطلب بنجاح!',
'error': 'خطأ',
'quick_pay': 'دفع سريع',
'save_bill': 'حفظ الفاتورة'
}
};
const t = (key) => translations[LANG][key] || key;
</script>
<script src="assets/js/main.js?v=<?= time() ?>"></script>
</body>
</html>