From 923a8e50e796c547c13a2492ce0075697bf76e38 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Thu, 26 Feb 2026 13:39:23 +0000 Subject: [PATCH] adding help file --- assets/images/outlet_logo_1772093707_383.png | Bin 0 -> 1101 bytes assets/images/outlet_logo_1772093757_895.png | Bin 0 -> 4173 bytes debug.log | 1 + help.php | 194 +++++++++++++++++++ includes/lang.php | 2 + index.php | 122 ++++++++++-- post_debug.log | 5 + 7 files changed, 306 insertions(+), 18 deletions(-) create mode 100644 assets/images/outlet_logo_1772093707_383.png create mode 100644 assets/images/outlet_logo_1772093757_895.png create mode 100644 help.php diff --git a/assets/images/outlet_logo_1772093707_383.png b/assets/images/outlet_logo_1772093707_383.png new file mode 100644 index 0000000000000000000000000000000000000000..71f746ad507acc8488910ec44873e147e4b62320 GIT binary patch literal 1101 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 a4 +
+
+ + + + +
+
+
+

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'; + + + + +