diff --git a/assets/images/outlet_logo_1772093707_383.png b/assets/images/outlet_logo_1772093707_383.png new file mode 100644 index 0000000..71f746a Binary files /dev/null and b/assets/images/outlet_logo_1772093707_383.png differ diff --git a/assets/images/outlet_logo_1772093757_895.png b/assets/images/outlet_logo_1772093757_895.png new file mode 100644 index 0000000..41bb768 Binary files /dev/null and b/assets/images/outlet_logo_1772093757_895.png differ diff --git a/debug.log b/debug.log index fcf3c53..d09aadd 100644 --- a/debug.log +++ b/debug.log @@ -1 +1,2 @@ [INFO] AI agent editing: index.php +2026-02-26 08:18:16 - Items case hit diff --git a/help.php b/help.php new file mode 100644 index 0000000..48569b0 --- /dev/null +++ b/help.php @@ -0,0 +1,194 @@ + +
+
+ + + + +
+
+
+

User Manual / دليل المستخدم

+ + +
+
+
+

1. Introduction

+

Welcome to the Accounting & Admin Panel. This system is designed to help you manage your retail business, inventory, and finances efficiently. It supports multiple outlets, bilingual entries (English/Arabic), and full accounting cycles.

+
+
+

1. مقدمة

+

مرحباً بك في لوحة تحكم المحاسبة والإدارة. تم تصميم هذا النظام لمساعدتك في إدارة أعمال التجزئة والمخزون والشؤون المالية بكفاءة. يدعم النظام منافذ بيع متعددة، وإدخالات ثنائية اللغة (الإنجليزية/العربية)، ودورات محاسبية كاملة.

+
+
+
+ + +
+
+
+

2. Dashboard

+

The dashboard provides a real-time overview of your business performance, including total sales, stock alerts, and financial charts.

+
    +
  • Total Sales: Sum of all sales in the selected period.
  • +
  • Alerts: Notifications for low stock or expired items.
  • +
+
+
+

2. لوحة القيادة

+

توفر لوحة القيادة نظرة عامة فورية على أداء عملك، بما في ذلك إجمالي المبيعات وتنبيهات المخزون والرسوم البيانية المالية.

+
    +
  • إجمالي المبيعات: مجموع جميع المبيعات في الفترة المختارة.
  • +
  • التنبيهات: إشعارات للمخزون المنخفض أو الأصناف منتهية الصلاحية.
  • +
+
+
+
+ +

[Screenshot: Dashboard Overview / لقطة شاشة: نظرة عامة على لوحة القيادة]

+
+
+ + +
+
+
+

3. Point of Sale (POS)

+

The POS interface is optimized for fast transactions. You can search for items by name or SKU, apply discounts, and handle multiple payment methods.

+
    +
  • Search: Type in the search box to find items.
  • +
  • Payments: Choose between Cash, Card, or Credit.
  • +
+
+
+

3. نقطة البيع (POS)

+

واجهة نقطة البيع محسنة للمعاملات السريعة. يمكنك البحث عن الأصناف بالاسم أو الرمز (SKU)، وتطبيق الخصومات، والتعامل مع طرق دفع متعددة.

+
    +
  • البحث: اكتب في صندوق البحث للعثور على الأصناف.
  • +
  • المدفوعات: اختر بين النقدي أو البطاقة أو الآجل.
  • +
+
+
+
+ +

[Screenshot: POS Interface / لقطة شاشة: واجهة نقطة البيع]

+
+
+ + +
+
+
+

4. Inventory Management

+

Manage your products, categories, and units. You can track stock levels and set minimum alerts.

+
+
+

4. إدارة المخزون

+

إدارة منتجاتك وفئاتك ووحداتك. يمكنك تتبع مستويات المخزون وضبط تنبيهات الحد الأدنى.

+
+
+
+ +

[Screenshot: Item List / لقطة شاشة: قائمة الأصناف]

+
+
+ + +
+
+
+

5. Sales & Purchases

+

Record detailed tax invoices, quotations, and purchase orders. The system automatically updates inventory and records journal entries.

+
+
+

5. المبيعات والمشتريات

+

تسجيل الفواتير الضريبية المفصلة وعروض الأسعار وأوامر الشراء. يقوم النظام تلقائياً بتحديث المخزون وتسجيل قيود اليومية.

+
+
+
+ + +
+
+
+

6. Accounting & Reports

+

Access financial statements like Trial Balance, Profit & Loss, and Balance Sheet. VAT reports are also available for tax compliance.

+
    +
  • Reports: Various reports like Expiry Report, Low Stock, and Customer Statements.
  • +
  • Accounting: Journal entries are automatically created for sales and purchases.
  • +
+
+
+

6. المحاسبة والتقارير

+

الوصول إلى البيانات المالية مثل ميزان المراجعة، والأرباح والخسائر، والميزانية العمومية. تتوفر أيضاً تقارير ضريبة القيمة المضافة للامتثال الضريبي.

+
    +
  • التقارير: تقارير متنوعة مثل تقرير الصلاحية، ونواقص المخزون، وكشوفات حساب العملاء.
  • +
  • المحاسبة: يتم إنشاء قيود اليومية تلقائياً للمبيعات والمشتريات.
  • +
+
+
+
+ + +
+
+
+

8. HR & Administration

+

Manage employees, departments, attendance, and payroll in the HR section. Use the Admin section to manage users, roles, and system backups.

+
+
+

8. الموارد البشرية والإدارة

+

إدارة الموظفين والأقسام والحضور والرواتب في قسم الموارد البشرية. استخدم قسم الإدارة لإدارة المستخدمين والأدوار والنسخ الاحتياطي للنظام.

+
+
+
+ + +
+
+
+

7. Settings & Administration

+

Configure your company details, manage users and roles, and setup backup schedules.

+
+
+

7. الإعدادات والإدارة

+

تهيئة تفاصيل شركتك، وإدارة المستخدمين والأدوار، وضبط جداول النسخ الاحتياطي.

+
+
+
+ +
+
+
+
+
+ + diff --git a/includes/lang.php b/includes/lang.php index b75b43d..ebea861 100644 --- a/includes/lang.php +++ b/includes/lang.php @@ -48,6 +48,7 @@ $translations = [ 'scale_devices' => 'Scale Devices', 'customer_display' => 'Customer Display', 'backups' => 'Backups', + 'help' => 'Help', 'logout' => 'Logout', 'welcome_back' => 'Welcome Back', 'sign_in' => 'Sign In', @@ -143,6 +144,7 @@ $translations = [ 'scale_devices' => 'أجهزة الميزان', 'customer_display' => 'شاشة العميل', 'backups' => 'النسخ الاحتياطي', + 'help' => 'المساعدة', 'logout' => 'تسجيل الخروج', 'welcome_back' => 'مرحباً بعودتك', 'sign_in' => 'تسجيل الدخول', diff --git a/index.php b/index.php index 32e179f..5d253b8 100644 --- a/index.php +++ b/index.php @@ -420,7 +420,8 @@ if (isset($_GET['action']) || isset($_POST['action'])) { header('Content-Type: application/json'); $payment_id = (int)$_GET['payment_id']; $stmt = db()->prepare("SELECT p.*, i.customer_id, i.id as inv_id, c.name as customer_name, - o.name as outlet_name, o.address as outlet_address, o.phone as outlet_phone + o.name as outlet_name, o.address as outlet_address, o.phone as outlet_phone, + o.ctr_number as outlet_ctr_number, o.vat_number as outlet_vat_number, o.logo as outlet_logo FROM payments p JOIN invoices i ON p.invoice_id = i.id LEFT JOIN customers c ON i.customer_id = c.id @@ -545,7 +546,7 @@ if (isset($_GET['action']) || isset($_POST['action'])) { $outlet = []; if (!empty($_SESSION['outlet_id'])) { - $stmtO = $db->prepare("SELECT name, phone, address FROM outlets WHERE id = ?"); + $stmtO = $db->prepare("SELECT name, phone, address, ctr_number, vat_number, logo FROM outlets WHERE id = ?"); $stmtO->execute([$_SESSION['outlet_id']]); $outlet = $stmtO->fetch(PDO::FETCH_ASSOC); } @@ -556,7 +557,10 @@ if (isset($_GET['action']) || isset($_POST['action'])) { 'transaction_no' => $transaction_no, 'outlet_name' => $outlet['name'] ?? null, 'outlet_phone' => $outlet['phone'] ?? null, - 'outlet_address' => $outlet['address'] ?? null + 'outlet_address' => $outlet['address'] ?? null, + 'outlet_ctr_number' => $outlet['ctr_number'] ?? null, + 'outlet_vat_number' => $outlet['vat_number'] ?? null, + 'outlet_logo' => $outlet['logo'] ?? null ]); } catch (Exception $e) { $db->rollBack(); @@ -2920,10 +2924,29 @@ if (isset($_POST['add_hr_department'])) { $name = $_POST['name'] ?? ''; $phone = $_POST['phone'] ?? ''; $address = $_POST['address'] ?? ''; + $ctr_number = $_POST['ctr_number'] ?? ''; + $vat_number = $_POST['vat_number'] ?? ''; $status = $_POST['status'] ?? 'active'; + $logo = null; + + if (isset($_FILES['logo']) && $_FILES['logo']['error'] === UPLOAD_ERR_OK) { + $ext = strtolower(pathinfo($_FILES['logo']['name'], PATHINFO_EXTENSION)); + $allowed = ['jpg', 'jpeg', 'png', 'gif']; + if (in_array($ext, $allowed)) { + $filename = 'outlet_logo_' . time() . '_' . rand(100, 999) . '.' . $ext; + $dest = __DIR__ . '/assets/images/' . $filename; + if (!is_dir(__DIR__ . '/assets/images/')) { + mkdir(__DIR__ . '/assets/images/', 0777, true); + } + if (move_uploaded_file($_FILES['logo']['tmp_name'], $dest)) { + $logo = 'assets/images/' . $filename; + } + } + } + if ($name) { - $stmt = db()->prepare("INSERT INTO outlets (name, phone, address, status) VALUES (?, ?, ?, ?)"); - $stmt->execute([$name, $phone, $address, $status]); + $stmt = db()->prepare("INSERT INTO outlets (name, phone, address, ctr_number, vat_number, logo, status) VALUES (?, ?, ?, ?, ?, ?, ?)"); + $stmt->execute([$name, $phone, $address, $ctr_number, $vat_number, $logo, $status]); redirectWithMessage("Outlet added successfully!", "index.php?page=outlets"); } } @@ -2932,10 +2955,34 @@ if (isset($_POST['add_hr_department'])) { $name = $_POST['name'] ?? ''; $phone = $_POST['phone'] ?? ''; $address = $_POST['address'] ?? ''; + $ctr_number = $_POST['ctr_number'] ?? ''; + $vat_number = $_POST['vat_number'] ?? ''; $status = $_POST['status'] ?? 'active'; + + $logo_query_part = ""; + $params = [$name, $phone, $address, $ctr_number, $vat_number, $status, $id]; + + if (isset($_FILES['logo']) && $_FILES['logo']['error'] === UPLOAD_ERR_OK) { + $ext = strtolower(pathinfo($_FILES['logo']['name'], PATHINFO_EXTENSION)); + $allowed = ['jpg', 'jpeg', 'png', 'gif']; + if (in_array($ext, $allowed)) { + $filename = 'outlet_logo_' . time() . '_' . rand(100, 999) . '.' . $ext; + $dest = __DIR__ . '/assets/images/' . $filename; + if (!is_dir(__DIR__ . '/assets/images/')) { + mkdir(__DIR__ . '/assets/images/', 0777, true); + } + if (move_uploaded_file($_FILES['logo']['tmp_name'], $dest)) { + $logo = 'assets/images/' . $filename; + $logo_query_part = ", logo=?"; + // Insert logo before ID in params + array_splice($params, 6, 0, [$logo]); + } + } + } + if ($name) { - $stmt = db()->prepare("UPDATE outlets SET name=?, phone=?, address=?, status=? WHERE id=?"); - $stmt->execute([$name, $phone, $address, $status, $id]); + $stmt = db()->prepare("UPDATE outlets SET name=?, phone=?, address=?, ctr_number=?, vat_number=?, status=? $logo_query_part WHERE id=?"); + $stmt->execute($params); redirectWithMessage("Outlet updated successfully!", "index.php?page=outlets"); } } @@ -3631,7 +3678,7 @@ switch ($page) { $data['total_pages'] = ceil($total_records / $limit); $data['current_page'] = $page_num; - $stmt = db()->prepare("SELECT q.*, c.name as customer_name, o.name as outlet_name, o.address as outlet_address, o.phone as outlet_phone + $stmt = db()->prepare("SELECT q.*, c.name as customer_name, o.name as outlet_name, o.address as outlet_address, o.phone as outlet_phone, o.ctr_number as outlet_ctr_number, o.vat_number as outlet_vat_number, o.logo as outlet_logo FROM quotations q JOIN customers c ON q.customer_id = c.id LEFT JOIN outlets o ON q.outlet_id = o.id @@ -4745,6 +4792,11 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System'; + + + + +