From 6e5310e4dc0fd11421b4e8ab4b1134ca8b80c48c Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 24 Feb 2026 17:07:31 +0000 Subject: [PATCH] update pos --- admin/categories.php | 114 ++++++------ admin/includes/header.php | 172 +++++++++++------- admin/products.php | 79 ++++---- admin/profile.php | 81 +++++---- api/order.php | 6 +- assets/js/main.js | 40 ++-- assets/pasted-20260224-165424-865370bd.png | Bin 0 -> 14674 bytes includes/lang.php | 202 +++++++++++++++++++++ pos.php | 151 ++++++++++----- 9 files changed, 591 insertions(+), 254 deletions(-) create mode 100644 assets/pasted-20260224-165424-865370bd.png create mode 100644 includes/lang.php diff --git a/admin/categories.php b/admin/categories.php index 07ce466..79f760c 100644 --- a/admin/categories.php +++ b/admin/categories.php @@ -81,12 +81,12 @@ include 'includes/header.php';
-

Product Categories

+

Organize your menu and inventory

@@ -96,7 +96,7 @@ include 'includes/header.php';
-

No categories found

+

Start by adding your first category.

@@ -105,10 +105,10 @@ include 'includes/header.php'; - - - - + + + + @@ -124,18 +124,18 @@ include 'includes/header.php';
@@ -156,7 +156,7 @@ include 'includes/header.php'; @@ -205,7 +210,7 @@ include 'includes/header.php'; - \ No newline at end of file + diff --git a/admin/includes/header.php b/admin/includes/header.php index 66e8ad5..e8d8504 100644 --- a/admin/includes/header.php +++ b/admin/includes/header.php @@ -10,6 +10,29 @@ if (file_exists(__DIR__ . '/../../db/config.php')) { if (file_exists(__DIR__ . '/../../includes/functions.php')) { require_once __DIR__ . '/../../includes/functions.php'; } +if (file_exists(__DIR__ . '/../../includes/lang.php')) { + require_once __DIR__ . '/../../includes/lang.php'; +} + +// Handle language switching +if (isset($_GET['lang'])) { + $allowed_langs = ['en', 'ar']; + if (in_array($_GET['lang'], $allowed_langs)) { + $_SESSION['lang'] = $_GET['lang']; + } + // Remove lang from URL to prevent infinite redirect or messy URLs + $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 login for all admin pages if (function_exists('require_login')) { @@ -57,7 +80,7 @@ function can_view($module) { } ?> - + @@ -69,13 +92,13 @@ function can_view($module) { - + - + \ No newline at end of file diff --git a/admin/profile.php b/admin/profile.php index 772aae7..fd76caa 100644 --- a/admin/profile.php +++ b/admin/profile.php @@ -94,7 +94,7 @@ include 'includes/header.php'; ?>
-

My Profile

+

Manage your personal information and account settings.

@@ -107,17 +107,22 @@ include 'includes/header.php';
- - + +
- -
- - -
+ +
@@ -127,7 +132,7 @@ include 'includes/header.php';
- +
@@ -170,7 +175,7 @@ include 'includes/header.php';
- +
@@ -216,34 +221,38 @@ include 'includes/header.php'; - \ No newline at end of file + diff --git a/api/order.php b/api/order.php index bbcc8dd..f92ef9a 100644 --- a/api/order.php +++ b/api/order.php @@ -23,7 +23,7 @@ try { : 'dine-in'; // Get outlet_id from input, default to 1 if missing - $outlet_id = isset($data['outlet_id']) ? intval($data['outlet_id']) : 1; + $outlet_id = !empty($data['outlet_id']) ? intval($data['outlet_id']) : 1; $table_id = null; $table_number = null; @@ -66,7 +66,7 @@ try { } // Customer Handling - $customer_id = $data['customer_id'] ?? null; + $customer_id = !empty($data['customer_id']) ? intval($data['customer_id']) : null; $customer_name = $data['customer_name'] ?? null; $customer_phone = $data['customer_phone'] ?? null; @@ -137,7 +137,7 @@ try { // User/Payment info $user = get_logged_user(); $user_id = $user ? $user['id'] : null; - $payment_type_id = isset($data['payment_type_id']) ? intval($data['payment_type_id']) : null; + $payment_type_id = !empty($data['payment_type_id']) ? intval($data['payment_type_id']) : null; // VAT vs Discount: We repurpose the 'discount' column in the database to store VAT value. // If it's a positive value, it's VAT. If negative, it acts as a discount (loyalty). diff --git a/assets/js/main.js b/assets/js/main.js index 915c9a7..4a595d9 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -89,6 +89,9 @@ document.addEventListener('DOMContentLoaded', () => { let currentCategory = 'all'; let currentSearchQuery = ''; + // Translation helper check + const _t = (key) => (typeof t === 'function') ? t(key) : key; + function formatCurrency(amount) { const symbol = settings.currency_symbol || '$'; const decimals = parseInt(settings.currency_decimals || 2); @@ -100,8 +103,9 @@ document.addEventListener('DOMContentLoaded', () => { items.forEach(item => { const matchesCategory = (currentCategory == 'all' || item.dataset.category == currentCategory); const name = (item.dataset.name || '').toLowerCase(); + const name_ar = (item.dataset.nameAr || '').toLowerCase(); const sku = (item.dataset.sku || '').toLowerCase(); - const matchesSearch = name.includes(currentSearchQuery) || sku.includes(currentSearchQuery); + const matchesSearch = name.includes(currentSearchQuery) || name_ar.includes(currentSearchQuery) || sku.includes(currentSearchQuery); item.style.display = (matchesCategory && matchesSearch) ? 'block' : 'none'; }); @@ -165,11 +169,11 @@ document.addEventListener('DOMContentLoaded', () => { recallList.appendChild(item); }); } else { - recallList.innerHTML = '
No unpaid bills found.
'; + recallList.innerHTML = `
${_t('none')}
`; } }) .catch(() => { - recallList.innerHTML = '
Error fetching orders.
'; + recallList.innerHTML = `
${_t('error')}
`; }); } @@ -196,7 +200,7 @@ document.addEventListener('DOMContentLoaded', () => { if (recallModal) recallModal.hide(); showToast(`Order #${orderId} loaded!`, 'success'); } else { - showToast(data.error || 'Failed to load order', 'danger'); + showToast(data.error || _t('error'), 'danger'); } }); } @@ -230,7 +234,7 @@ document.addEventListener('DOMContentLoaded', () => { }); customerResults.style.display = 'block'; } else { - customerResults.innerHTML = '
No results found
'; + customerResults.innerHTML = `
${_t('none')}
`; customerResults.style.display = 'block'; } }); @@ -316,14 +320,15 @@ document.addEventListener('DOMContentLoaded', () => { if (!variantSelectionModal) return; const list = document.getElementById('variant-list'); const title = document.getElementById('variantModalTitle'); - if (title) title.textContent = `Option: ${product.name}`; + if (title) title.textContent = `${_t('variant')}: ${LANG === 'ar' && product.name_ar ? product.name_ar : product.name}`; if (!list) return; list.innerHTML = ''; variants.forEach(v => { const btn = document.createElement('button'); btn.className = 'list-group-item list-group-item-action d-flex justify-content-between align-items-center'; const finalPrice = parseFloat(product.price) + parseFloat(v.price_adjustment); - btn.innerHTML = `${v.name}${formatCurrency(finalPrice)}`; + const vName = (LANG === 'ar' && v.name_ar) ? v.name_ar : v.name; + btn.innerHTML = `${vName}${formatCurrency(finalPrice)}`; btn.onclick = () => { addToCart({ id: product.id, name: product.name, name_ar: product.name_ar || "", @@ -369,11 +374,11 @@ document.addEventListener('DOMContentLoaded', () => { function updateCart() { if (!cartItemsContainer) return; if (cart.length === 0) { - cartItemsContainer.innerHTML = '

Cart is empty

'; + cartItemsContainer.innerHTML = `

${_t('cart_empty')}

`; if (cartSubtotal) cartSubtotal.innerText = formatCurrency(0); if (cartTotalPrice) cartTotalPrice.innerText = formatCurrency(0); - if (quickOrderBtn) quickOrderBtn.disabled = true; - if (placeOrderBtn) placeOrderBtn.disabled = true; + if (quickOrderBtn) { quickOrderBtn.disabled = true; quickOrderBtn.innerText = _t('quick_pay'); } + if (placeOrderBtn) { placeOrderBtn.disabled = true; placeOrderBtn.innerText = _t('save_bill'); } return; } @@ -384,10 +389,13 @@ document.addEventListener('DOMContentLoaded', () => { subtotal += itemTotal; const row = document.createElement('div'); row.className = 'd-flex justify-content-between align-items-center mb-3 border-bottom pb-2'; + const itemName = (LANG === 'ar' && item.name_ar) ? item.name_ar : item.name; + const otherName = (LANG === 'ar') ? item.name : item.name_ar; + row.innerHTML = `
-
${item.name}
- ${item.name_ar ? `
${item.name_ar}
` : ''} +
${itemName}
+ ${otherName ? `
${otherName}
` : ''}
${formatCurrency(item.price)}
@@ -397,7 +405,7 @@ document.addEventListener('DOMContentLoaded', () => {
${formatCurrency(itemTotal)}
- +
`; cartItemsContainer.appendChild(row); @@ -409,8 +417,8 @@ document.addEventListener('DOMContentLoaded', () => { if (cartVatInput) cartVatInput.value = vat.toFixed(2); const total = subtotal + vat; if (cartTotalPrice) cartTotalPrice.innerText = formatCurrency(total); - if (quickOrderBtn) quickOrderBtn.disabled = false; - if (placeOrderBtn) placeOrderBtn.disabled = false; + if (quickOrderBtn) { quickOrderBtn.disabled = false; quickOrderBtn.innerText = _t('quick_pay'); } + if (placeOrderBtn) { placeOrderBtn.disabled = false; placeOrderBtn.innerText = _t('save_bill'); } } if (quickOrderBtn) { @@ -463,7 +471,7 @@ document.addEventListener('DOMContentLoaded', () => { .then(res => res.json()) .then(data => { if (data.success) { - showToast(`Order #${data.order_id} placed!`, 'success'); + showToast(`${_t('order_placed')} #${data.order_id}`, 'success'); clearCart(); if (paymentSelectionModal) paymentSelectionModal.hide(); if (clearCustomerBtn) clearCustomerBtn.click(); diff --git a/assets/pasted-20260224-165424-865370bd.png b/assets/pasted-20260224-165424-865370bd.png new file mode 100644 index 0000000000000000000000000000000000000000..659a5dac3db8e5dd15e115ab7625a05724d57d82 GIT binary patch literal 14674 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 oo*C@_JInR|pw|9( [ + 'dashboard' => 'Dashboard', + 'pos_operations' => 'POS & Operations', + 'pos_terminal' => 'POS Terminal', + 'orders_pos' => 'Orders (POS)', + 'kitchen_view' => 'Kitchen View', + 'ads_management' => 'Ads Management', + 'menu_management' => 'Menu Management', + 'products' => 'Products', + 'categories' => 'Categories', + 'restaurant_setup' => 'Restaurant Setup', + 'outlets' => 'Outlets', + 'areas' => 'Areas', + 'tables' => 'Tables', + 'people_partners' => 'People & Partners', + 'customers' => 'Customers', + 'suppliers' => 'Suppliers', + 'loyalty' => 'Loyalty', + 'financials' => 'Financials', + 'purchases' => 'Purchases', + 'expenses' => 'Expenses', + 'expense_categories' => 'Expense Categories', + 'reports_analytics' => 'Reports & Analytics', + 'daily_reports' => 'Daily Reports', + 'user_management' => 'User Management', + 'users' => 'Users', + 'roles_groups' => 'Roles / Groups', + 'attendance' => 'Attendance', + 'staff_ratings' => 'Staff Ratings', + 'settings' => 'Settings', + 'payment_types' => 'Payment Types', + 'integrations' => 'Integrations', + 'company' => 'Company', + 'backup_restore' => 'Backup & Restore', + 'view_site' => 'View Site', + 'theme' => 'Theme', + 'language' => 'Language', + 'logout' => 'Logout', + 'my_profile' => 'My Profile', + 'company_settings' => 'Company Settings', + 'signed_in_as' => 'Signed in as', + 'welcome_back' => 'Welcome back', + 'select_theme' => 'Select Theme', + 'select_language' => 'Select Language', + 'default' => 'Default', + 'dark' => 'Dark', + 'ocean' => 'Ocean', + 'forest' => 'Forest', + 'grape' => 'Grape', + 'english' => 'English', + 'arabic' => 'Arabic', + 'search' => 'Search', + 'filter' => 'Filter', + 'add' => 'Add', + 'edit' => 'Edit', + 'delete' => 'Delete', + 'save' => 'Save', + 'cancel' => 'Cancel', + 'close' => 'Close', + 'actions' => 'Actions', + 'name' => 'Name', + 'arabic_name' => 'Arabic Name', + 'description' => 'Description', + 'status' => 'Status', + 'active' => 'Active', + 'inactive' => 'Inactive', + 'all' => 'All', + 'none' => 'None', + 'price' => 'Price', + 'quantity' => 'Quantity', + 'total' => 'Total', + 'date' => 'Date', + 'customer' => 'Customer', + 'phone' => 'Phone', + 'email' => 'Email', + 'address' => 'Address', + 'points' => 'Points', + 'stock' => 'Stock', + 'category' => 'Category', + 'variant' => 'Variant', + 'table' => 'Table', + 'outlet' => 'Outlet', + 'order_no' => 'Order No', + 'payment' => 'Payment', + 'type' => 'Type', + 'commission' => 'Commission', + 'preparing' => 'Preparing', + 'ready' => 'Ready', + 'completed' => 'Completed', + 'cancelled' => 'Cancelled', + 'takeaway' => 'Takeaway', + 'dine_in' => 'Dine-In', + 'delivery' => 'Delivery', + 'auto_translate' => 'Auto-translate', + ], + 'ar' => [ + 'dashboard' => 'لوحة القيادة', + 'pos_operations' => 'نقطة البيع والعمليات', + 'pos_terminal' => 'جهاز نقطة البيع', + 'orders_pos' => 'الطلبات (نقطة البيع)', + 'kitchen_view' => 'عرض المطبخ', + 'ads_management' => 'إدارة الإعلانات', + 'menu_management' => 'إدارة القائمة', + 'products' => 'المنتجات', + 'categories' => 'الفئات', + 'restaurant_setup' => 'إعداد المطعم', + 'outlets' => 'المنافذ', + 'areas' => 'المناطق', + 'tables' => 'الطاولات', + 'people_partners' => 'الأشخاص والشركاء', + 'customers' => 'العملاء', + 'suppliers' => 'الموردين', + 'loyalty' => 'الولاء', + 'financials' => 'المالية', + 'purchases' => 'المشتريات', + 'expenses' => 'المصاريف', + 'expense_categories' => 'فئات المصاريف', + 'reports_analytics' => 'التقارير والتحليلات', + 'daily_reports' => 'التقارير اليومية', + 'user_management' => 'إدارة المستخدمين', + 'users' => 'المستخدمين', + 'roles_groups' => 'الأدوار / المجموعات', + 'attendance' => 'الحضور', + 'staff_ratings' => 'تقييمات الموظفين', + 'settings' => 'الإعدادات', + 'payment_types' => 'أنواع الدفع', + 'integrations' => 'التكاملات', + 'company' => 'الشركة', + 'backup_restore' => 'النسخ الاحتياطي والاستعادة', + 'view_site' => 'عرض الموقع', + 'theme' => 'المظهر', + 'language' => 'اللغة', + 'logout' => 'تسجيل الخروج', + 'my_profile' => 'ملفي الشخصي', + 'company_settings' => 'إعدادات الشركة', + 'signed_in_as' => 'تم تسجيل الدخول بصفتك', + 'welcome_back' => 'مرحباً بعودتك', + 'select_theme' => 'اختر المظهر', + 'select_language' => 'اختر اللغة', + 'default' => 'الافتراضي', + 'dark' => 'داكن', + 'ocean' => 'محيط', + 'forest' => 'غابة', + 'grape' => 'عنب', + 'english' => 'الإنجليزية', + 'arabic' => 'العربية', + 'search' => 'بحث', + 'filter' => 'تصفية', + 'add' => 'إضافة', + 'edit' => 'تعديل', + 'delete' => 'حذف', + 'save' => 'حفظ', + 'cancel' => 'إلغاء', + 'close' => 'إغلاق', + 'actions' => 'إجراءات', + 'name' => 'الاسم', + 'arabic_name' => 'الاسم بالعربية', + 'description' => 'الوصف', + 'status' => 'الحالة', + 'active' => 'نشط', + 'inactive' => 'غير نشط', + 'all' => 'الكل', + 'none' => 'لا يوجد', + 'price' => 'السعر', + 'quantity' => 'الكمية', + 'total' => 'الإجمالي', + 'date' => 'التاريخ', + 'customer' => 'العميل', + 'phone' => 'الهاتف', + 'email' => 'البريد الإلكتروني', + 'address' => 'العنوان', + 'points' => 'النقاط', + 'stock' => 'المخزون', + 'category' => 'الفئة', + 'variant' => 'النوع', + 'table' => 'الطاولة', + 'outlet' => 'المنفذ', + 'order_no' => 'رقم الطلب', + 'payment' => 'الدفع', + 'type' => 'النوع', + 'commission' => 'العمولة', + 'preparing' => 'قيد التحضير', + 'ready' => 'جاهز', + 'completed' => 'مكتمل', + 'cancelled' => 'ملغي', + 'takeaway' => 'سفري', + 'dine_in' => 'محلي', + 'delivery' => 'توصيل', + 'auto_translate' => 'ترجمة تلقائية', + ] + ]; + + return $translations[$lang][$key] ?? $translations['en'][$key] ?? $key; +} diff --git a/pos.php b/pos.php index 481e50b..316a211 100644 --- a/pos.php +++ b/pos.php @@ -2,6 +2,30 @@ 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'); @@ -39,7 +63,7 @@ if (!has_permission('all')) { } $categories = $pdo->query("SELECT * FROM categories ORDER BY sort_order")->fetchAll(); -$all_products = $pdo->query("SELECT p.*, c.name as category_name FROM products p JOIN categories c ON p.category_id = c.id")->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 @@ -56,7 +80,7 @@ $order_type = $_GET['order_type'] ?? 'takeaway'; $current_outlet_name = 'Unknown Outlet'; foreach ($outlets as $o) { if ($o['id'] == $outlet_id) { - $current_outlet_name = $o['name']; + $current_outlet_name = ($isRTL && !empty($o['name_ar'])) ? $o['name_ar'] : $o['name']; break; } } @@ -69,7 +93,7 @@ if (!$loyalty_settings) { } ?> - + @@ -88,15 +112,15 @@ if (!$loyalty_settings) { 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-right: 1px solid #e0e0e0; } + .pos-categories { background: #fff; height: 100%; border-: 1px solid #e0e0e0; } .pos-products { background: #f8fafc; height: 100%; display: flex; flex-direction: column; } - .pos-cart { background: #fff; height: 100%; border-left: 1px solid #e0e0e0; display: flex; flex-direction: column; } + .pos-cart { background: #fff; height: 100%; border-: 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: 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 { text-align: ; 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; } @@ -104,17 +128,13 @@ if (!$loyalty_settings) { /* 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-card:hover .card-img-container img { transform: scale(1.05); } .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 8 columns */ + /* Custom Grid for 7 columns */ @media (min-width: 1200px) { - .row-cols-xl-8 > * { flex: 0 0 auto; width: 12.5%; } - } - @media (min-width: 1400px) { - .row-cols-xxl-10 > * { flex: 0 0 auto; width: 10%; } + .row-cols-xl-7 > *, .row-cols-xxl-7 > * { flex: 0 0 auto; width: 14.285714%; } } @media (max-width: 576px) { @@ -132,6 +152,7 @@ if (!$loyalty_settings) { body { overflow: visible !important; height: auto !important; } } .print-only { display: none; } + .dropdown-menu { } @@ -150,21 +171,32 @@ if (!$loyalty_settings) {
+ + + 1): ?> - Kitchen - Orders - + + +
@@ -175,12 +207,12 @@ if (!$loyalty_settings) {
@@ -192,7 +224,7 @@ if (!$loyalty_settings) {
@@ -216,14 +248,14 @@ if (!$loyalty_settings) { - + 1): ?>
@@ -233,12 +265,13 @@ if (!$loyalty_settings) {
-
+
@@ -258,8 +291,10 @@ if (!$loyalty_settings) {
-
- +
+ +
+
@@ -277,19 +312,19 @@ if (!$loyalty_settings) {
> - + > - + > - +
- - + + - +
@@ -299,24 +334,24 @@ if (!$loyalty_settings) {
-

Cart is empty

+

- Subtotal +
- Total Payable +
- +
- - + +
@@ -329,7 +364,7 @@ if (!$loyalty_settings) {
CategoryArabic NameDescriptionActions
-
+
+ onclick='prepareEditForm()'> - Delete +