adding help file
This commit is contained in:
parent
ca71e892ec
commit
923a8e50e7
BIN
assets/images/outlet_logo_1772093707_383.png
Normal file
BIN
assets/images/outlet_logo_1772093707_383.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
BIN
assets/images/outlet_logo_1772093757_895.png
Normal file
BIN
assets/images/outlet_logo_1772093757_895.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.1 KiB |
@ -1 +1,2 @@
|
|||||||
[INFO] AI agent editing: index.php
|
[INFO] AI agent editing: index.php
|
||||||
|
2026-02-26 08:18:16 - Items case hit
|
||||||
|
|||||||
194
help.php
Normal file
194
help.php
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
<?php
|
||||||
|
if (!defined('PDO_MYSQL')) { // Simple check to prevent direct access if needed, though index.php defines it indirectly or just check session
|
||||||
|
if (session_status() === PHP_SESSION_NONE) session_start();
|
||||||
|
if (!isset($_SESSION['user_id'])) die('Access Denied');
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<div class="container-fluid py-4">
|
||||||
|
<div class="row">
|
||||||
|
<!-- Help Navigation Sidebar -->
|
||||||
|
<div class="col-md-3 d-none d-md-block">
|
||||||
|
<div class="card shadow-sm sticky-top" style="top: 20px;">
|
||||||
|
<div class="card-header bg-primary text-white">
|
||||||
|
<i class="bi bi-book me-2"></i> <?= __('help') ?>
|
||||||
|
</div>
|
||||||
|
<div class="list-group list-group-flush">
|
||||||
|
<a href="#intro" class="list-group-item list-group-item-action">Introduction / مقدمة</a>
|
||||||
|
<a href="#dashboard" class="list-group-item list-group-item-action">Dashboard / لوحة القيادة</a>
|
||||||
|
<a href="#pos" class="list-group-item list-group-item-action">POS / نقطة البيع</a>
|
||||||
|
<a href="#inventory" class="list-group-item list-group-item-action">Inventory / المخزون</a>
|
||||||
|
<a href="#sales" class="list-group-item list-group-item-action">Sales & Purchases / المبيعات والمشتريات</a>
|
||||||
|
<a href="#accounting" class="list-group-item list-group-item-action">Accounting / المحاسبة</a>
|
||||||
|
<a href="#hr" class="list-group-item list-group-item-action">HR & Admin / الموارد البشرية والإدارة</a>
|
||||||
|
<a href="#settings" class="list-group-item list-group-item-action">Settings / الإعدادات</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Help Content -->
|
||||||
|
<div class="col-md-9">
|
||||||
|
<div class="card shadow-sm">
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="border-bottom pb-2 mb-4">User Manual / دليل المستخدم</h2>
|
||||||
|
|
||||||
|
<!-- Introduction -->
|
||||||
|
<section id="intro" class="mb-5">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<h3>1. Introduction</h3>
|
||||||
|
<p>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.</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 text-end" dir="rtl">
|
||||||
|
<h3>1. مقدمة</h3>
|
||||||
|
<p>مرحباً بك في لوحة تحكم المحاسبة والإدارة. تم تصميم هذا النظام لمساعدتك في إدارة أعمال التجزئة والمخزون والشؤون المالية بكفاءة. يدعم النظام منافذ بيع متعددة، وإدخالات ثنائية اللغة (الإنجليزية/العربية)، ودورات محاسبية كاملة.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Dashboard -->
|
||||||
|
<section id="dashboard" class="mb-5">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<h3>2. Dashboard</h3>
|
||||||
|
<p>The dashboard provides a real-time overview of your business performance, including total sales, stock alerts, and financial charts.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Total Sales:</strong> Sum of all sales in the selected period.</li>
|
||||||
|
<li><strong>Alerts:</strong> Notifications for low stock or expired items.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 text-end" dir="rtl">
|
||||||
|
<h3>2. لوحة القيادة</h3>
|
||||||
|
<p>توفر لوحة القيادة نظرة عامة فورية على أداء عملك، بما في ذلك إجمالي المبيعات وتنبيهات المخزون والرسوم البيانية المالية.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>إجمالي المبيعات:</strong> مجموع جميع المبيعات في الفترة المختارة.</li>
|
||||||
|
<li><strong>التنبيهات:</strong> إشعارات للمخزون المنخفض أو الأصناف منتهية الصلاحية.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bg-light p-5 text-center border rounded mb-3">
|
||||||
|
<i class="bi bi-image text-muted display-1"></i>
|
||||||
|
<p class="text-muted mt-2">[Screenshot: Dashboard Overview / لقطة شاشة: نظرة عامة على لوحة القيادة]</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- POS -->
|
||||||
|
<section id="pos" class="mb-5">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<h3>3. Point of Sale (POS)</h3>
|
||||||
|
<p>The POS interface is optimized for fast transactions. You can search for items by name or SKU, apply discounts, and handle multiple payment methods.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Search:</strong> Type in the search box to find items.</li>
|
||||||
|
<li><strong>Payments:</strong> Choose between Cash, Card, or Credit.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 text-end" dir="rtl">
|
||||||
|
<h3>3. نقطة البيع (POS)</h3>
|
||||||
|
<p>واجهة نقطة البيع محسنة للمعاملات السريعة. يمكنك البحث عن الأصناف بالاسم أو الرمز (SKU)، وتطبيق الخصومات، والتعامل مع طرق دفع متعددة.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>البحث:</strong> اكتب في صندوق البحث للعثور على الأصناف.</li>
|
||||||
|
<li><strong>المدفوعات:</strong> اختر بين النقدي أو البطاقة أو الآجل.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bg-light p-5 text-center border rounded mb-3">
|
||||||
|
<i class="bi bi-image text-muted display-1"></i>
|
||||||
|
<p class="text-muted mt-2">[Screenshot: POS Interface / لقطة شاشة: واجهة نقطة البيع]</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Inventory -->
|
||||||
|
<section id="inventory" class="mb-5">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<h3>4. Inventory Management</h3>
|
||||||
|
<p>Manage your products, categories, and units. You can track stock levels and set minimum alerts.</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 text-end" dir="rtl">
|
||||||
|
<h3>4. إدارة المخزون</h3>
|
||||||
|
<p>إدارة منتجاتك وفئاتك ووحداتك. يمكنك تتبع مستويات المخزون وضبط تنبيهات الحد الأدنى.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bg-light p-5 text-center border rounded mb-3">
|
||||||
|
<i class="bi bi-image text-muted display-1"></i>
|
||||||
|
<p class="text-muted mt-2">[Screenshot: Item List / لقطة شاشة: قائمة الأصناف]</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Sales -->
|
||||||
|
<section id="sales" class="mb-5">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<h3>5. Sales & Purchases</h3>
|
||||||
|
<p>Record detailed tax invoices, quotations, and purchase orders. The system automatically updates inventory and records journal entries.</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 text-end" dir="rtl">
|
||||||
|
<h3>5. المبيعات والمشتريات</h3>
|
||||||
|
<p>تسجيل الفواتير الضريبية المفصلة وعروض الأسعار وأوامر الشراء. يقوم النظام تلقائياً بتحديث المخزون وتسجيل قيود اليومية.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Accounting -->
|
||||||
|
<section id="accounting" class="mb-5">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<h3>6. Accounting & Reports</h3>
|
||||||
|
<p>Access financial statements like Trial Balance, Profit & Loss, and Balance Sheet. VAT reports are also available for tax compliance.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Reports:</strong> Various reports like Expiry Report, Low Stock, and Customer Statements.</li>
|
||||||
|
<li><strong>Accounting:</strong> Journal entries are automatically created for sales and purchases.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 text-end" dir="rtl">
|
||||||
|
<h3>6. المحاسبة والتقارير</h3>
|
||||||
|
<p>الوصول إلى البيانات المالية مثل ميزان المراجعة، والأرباح والخسائر، والميزانية العمومية. تتوفر أيضاً تقارير ضريبة القيمة المضافة للامتثال الضريبي.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>التقارير:</strong> تقارير متنوعة مثل تقرير الصلاحية، ونواقص المخزون، وكشوفات حساب العملاء.</li>
|
||||||
|
<li><strong>المحاسبة:</strong> يتم إنشاء قيود اليومية تلقائياً للمبيعات والمشتريات.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- HR & Admin -->
|
||||||
|
<section id="hr" class="mb-5">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<h3>8. HR & Administration</h3>
|
||||||
|
<p>Manage employees, departments, attendance, and payroll in the HR section. Use the Admin section to manage users, roles, and system backups.</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 text-end" dir="rtl">
|
||||||
|
<h3>8. الموارد البشرية والإدارة</h3>
|
||||||
|
<p>إدارة الموظفين والأقسام والحضور والرواتب في قسم الموارد البشرية. استخدم قسم الإدارة لإدارة المستخدمين والأدوار والنسخ الاحتياطي للنظام.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Settings -->
|
||||||
|
<section id="settings" class="mb-5">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<h3>7. Settings & Administration</h3>
|
||||||
|
<p>Configure your company details, manage users and roles, and setup backup schedules.</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 text-end" dir="rtl">
|
||||||
|
<h3>7. الإعدادات والإدارة</h3>
|
||||||
|
<p>تهيئة تفاصيل شركتك، وإدارة المستخدمين والأدوار، وضبط جداول النسخ الاحتياطي.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
section { scroll-margin-top: 80px; }
|
||||||
|
.sticky-top { z-index: 1020; }
|
||||||
|
h3 { color: var(--bs-primary); font-weight: bold; }
|
||||||
|
.bg-light { border-style: dashed !important; border-width: 2px !important; }
|
||||||
|
[dir="rtl"] p, [dir="rtl"] li { font-size: 1.1rem; }
|
||||||
|
</style>
|
||||||
@ -48,6 +48,7 @@ $translations = [
|
|||||||
'scale_devices' => 'Scale Devices',
|
'scale_devices' => 'Scale Devices',
|
||||||
'customer_display' => 'Customer Display',
|
'customer_display' => 'Customer Display',
|
||||||
'backups' => 'Backups',
|
'backups' => 'Backups',
|
||||||
|
'help' => 'Help',
|
||||||
'logout' => 'Logout',
|
'logout' => 'Logout',
|
||||||
'welcome_back' => 'Welcome Back',
|
'welcome_back' => 'Welcome Back',
|
||||||
'sign_in' => 'Sign In',
|
'sign_in' => 'Sign In',
|
||||||
@ -143,6 +144,7 @@ $translations = [
|
|||||||
'scale_devices' => 'أجهزة الميزان',
|
'scale_devices' => 'أجهزة الميزان',
|
||||||
'customer_display' => 'شاشة العميل',
|
'customer_display' => 'شاشة العميل',
|
||||||
'backups' => 'النسخ الاحتياطي',
|
'backups' => 'النسخ الاحتياطي',
|
||||||
|
'help' => 'المساعدة',
|
||||||
'logout' => 'تسجيل الخروج',
|
'logout' => 'تسجيل الخروج',
|
||||||
'welcome_back' => 'مرحباً بعودتك',
|
'welcome_back' => 'مرحباً بعودتك',
|
||||||
'sign_in' => 'تسجيل الدخول',
|
'sign_in' => 'تسجيل الدخول',
|
||||||
|
|||||||
122
index.php
122
index.php
@ -420,7 +420,8 @@ if (isset($_GET['action']) || isset($_POST['action'])) {
|
|||||||
header('Content-Type: application/json');
|
header('Content-Type: application/json');
|
||||||
$payment_id = (int)$_GET['payment_id'];
|
$payment_id = (int)$_GET['payment_id'];
|
||||||
$stmt = db()->prepare("SELECT p.*, i.customer_id, i.id as inv_id, c.name as customer_name,
|
$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
|
FROM payments p
|
||||||
JOIN invoices i ON p.invoice_id = i.id
|
JOIN invoices i ON p.invoice_id = i.id
|
||||||
LEFT JOIN customers c ON i.customer_id = c.id
|
LEFT JOIN customers c ON i.customer_id = c.id
|
||||||
@ -545,7 +546,7 @@ if (isset($_GET['action']) || isset($_POST['action'])) {
|
|||||||
|
|
||||||
$outlet = [];
|
$outlet = [];
|
||||||
if (!empty($_SESSION['outlet_id'])) {
|
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']]);
|
$stmtO->execute([$_SESSION['outlet_id']]);
|
||||||
$outlet = $stmtO->fetch(PDO::FETCH_ASSOC);
|
$outlet = $stmtO->fetch(PDO::FETCH_ASSOC);
|
||||||
}
|
}
|
||||||
@ -556,7 +557,10 @@ if (isset($_GET['action']) || isset($_POST['action'])) {
|
|||||||
'transaction_no' => $transaction_no,
|
'transaction_no' => $transaction_no,
|
||||||
'outlet_name' => $outlet['name'] ?? null,
|
'outlet_name' => $outlet['name'] ?? null,
|
||||||
'outlet_phone' => $outlet['phone'] ?? 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) {
|
} catch (Exception $e) {
|
||||||
$db->rollBack();
|
$db->rollBack();
|
||||||
@ -2920,10 +2924,29 @@ if (isset($_POST['add_hr_department'])) {
|
|||||||
$name = $_POST['name'] ?? '';
|
$name = $_POST['name'] ?? '';
|
||||||
$phone = $_POST['phone'] ?? '';
|
$phone = $_POST['phone'] ?? '';
|
||||||
$address = $_POST['address'] ?? '';
|
$address = $_POST['address'] ?? '';
|
||||||
|
$ctr_number = $_POST['ctr_number'] ?? '';
|
||||||
|
$vat_number = $_POST['vat_number'] ?? '';
|
||||||
$status = $_POST['status'] ?? 'active';
|
$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) {
|
if ($name) {
|
||||||
$stmt = db()->prepare("INSERT INTO outlets (name, phone, address, status) VALUES (?, ?, ?, ?)");
|
$stmt = db()->prepare("INSERT INTO outlets (name, phone, address, ctr_number, vat_number, logo, status) VALUES (?, ?, ?, ?, ?, ?, ?)");
|
||||||
$stmt->execute([$name, $phone, $address, $status]);
|
$stmt->execute([$name, $phone, $address, $ctr_number, $vat_number, $logo, $status]);
|
||||||
redirectWithMessage("Outlet added successfully!", "index.php?page=outlets");
|
redirectWithMessage("Outlet added successfully!", "index.php?page=outlets");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2932,10 +2955,34 @@ if (isset($_POST['add_hr_department'])) {
|
|||||||
$name = $_POST['name'] ?? '';
|
$name = $_POST['name'] ?? '';
|
||||||
$phone = $_POST['phone'] ?? '';
|
$phone = $_POST['phone'] ?? '';
|
||||||
$address = $_POST['address'] ?? '';
|
$address = $_POST['address'] ?? '';
|
||||||
|
$ctr_number = $_POST['ctr_number'] ?? '';
|
||||||
|
$vat_number = $_POST['vat_number'] ?? '';
|
||||||
$status = $_POST['status'] ?? 'active';
|
$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) {
|
if ($name) {
|
||||||
$stmt = db()->prepare("UPDATE outlets SET name=?, phone=?, address=?, status=? WHERE id=?");
|
$stmt = db()->prepare("UPDATE outlets SET name=?, phone=?, address=?, ctr_number=?, vat_number=?, status=? $logo_query_part WHERE id=?");
|
||||||
$stmt->execute([$name, $phone, $address, $status, $id]);
|
$stmt->execute($params);
|
||||||
redirectWithMessage("Outlet updated successfully!", "index.php?page=outlets");
|
redirectWithMessage("Outlet updated successfully!", "index.php?page=outlets");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3631,7 +3678,7 @@ switch ($page) {
|
|||||||
$data['total_pages'] = ceil($total_records / $limit);
|
$data['total_pages'] = ceil($total_records / $limit);
|
||||||
$data['current_page'] = $page_num;
|
$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
|
FROM quotations q
|
||||||
JOIN customers c ON q.customer_id = c.id
|
JOIN customers c ON q.customer_id = c.id
|
||||||
LEFT JOIN outlets o ON q.outlet_id = o.id
|
LEFT JOIN outlets o ON q.outlet_id = o.id
|
||||||
@ -4745,6 +4792,11 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<!-- Help Section -->
|
||||||
|
<a href="index.php?page=help" class="nav-link <?= $page === 'help' ? 'active' : '' ?>">
|
||||||
|
<i class="fas fa-question-circle"></i> <span><?= __('help') ?></span>
|
||||||
|
</a>
|
||||||
|
|
||||||
<!-- Version & Logs -->
|
<!-- Version & Logs -->
|
||||||
<div class="mt-5 px-4 pb-4 border-top pt-4 sidebar-footer">
|
<div class="mt-5 px-4 pb-4 border-top pt-4 sidebar-footer">
|
||||||
<div class="text-muted small fw-bold mb-1">Accounting System</div>
|
<div class="text-muted small fw-bold mb-1">Accounting System</div>
|
||||||
@ -5163,11 +5215,11 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
<thead class="table-light">
|
<thead class="table-light">
|
||||||
<tr>
|
<tr>
|
||||||
<th>ID</th>
|
<th>ID</th>
|
||||||
|
<th>Logo</th>
|
||||||
<th>Name</th>
|
<th>Name</th>
|
||||||
|
<th>Details</th>
|
||||||
<th>Address</th>
|
<th>Address</th>
|
||||||
<th>Phone</th>
|
|
||||||
<th>Status</th>
|
<th>Status</th>
|
||||||
<th>Created At</th>
|
|
||||||
<th class="text-end">Actions</th>
|
<th class="text-end">Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@ -5175,11 +5227,21 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
<?php foreach ($data['outlets'] as $o): ?>
|
<?php foreach ($data['outlets'] as $o): ?>
|
||||||
<tr>
|
<tr>
|
||||||
<td>#<?= $o['id'] ?></td>
|
<td>#<?= $o['id'] ?></td>
|
||||||
|
<td>
|
||||||
|
<?php if ($o['logo']): ?>
|
||||||
|
<img src="<?= htmlspecialchars($o['logo']) ?>" alt="Logo" class="rounded" style="max-height: 40px; max-width: 80px; object-fit: contain;">
|
||||||
|
<?php else: ?>
|
||||||
|
<span class="text-muted small">-</span>
|
||||||
|
<?php endif; ?>
|
||||||
|
</td>
|
||||||
<td class="fw-semibold text-dark"><?= htmlspecialchars($o['name']) ?></td>
|
<td class="fw-semibold text-dark"><?= htmlspecialchars($o['name']) ?></td>
|
||||||
|
<td class="text-muted small">
|
||||||
|
<div><i class="bi bi-telephone text-muted"></i> <?= htmlspecialchars($o['phone'] ?: '-') ?></div>
|
||||||
|
<?php if ($o['ctr_number']): ?><div><strong>CTR:</strong> <?= htmlspecialchars($o['ctr_number']) ?></div><?php endif; ?>
|
||||||
|
<?php if ($o['vat_number']): ?><div><strong>VAT:</strong> <?= htmlspecialchars($o['vat_number']) ?></div><?php endif; ?>
|
||||||
|
</td>
|
||||||
<td class="text-muted small"><?= htmlspecialchars($o['address'] ?: '-') ?></td>
|
<td class="text-muted small"><?= htmlspecialchars($o['address'] ?: '-') ?></td>
|
||||||
<td><?= htmlspecialchars($o['phone'] ?: '-') ?></td>
|
|
||||||
<td><span class="badge bg-<?= $o['status'] === 'active' ? 'success' : 'secondary' ?> bg-opacity-10 text-<?= $o['status'] === 'active' ? 'success' : 'secondary' ?> rounded-pill px-2"><?= ucfirst($o['status']) ?></span></td>
|
<td><span class="badge bg-<?= $o['status'] === 'active' ? 'success' : 'secondary' ?> bg-opacity-10 text-<?= $o['status'] === 'active' ? 'success' : 'secondary' ?> rounded-pill px-2"><?= ucfirst($o['status']) ?></span></td>
|
||||||
<td class="small text-muted"><?= htmlspecialchars($o['created_at']) ?></td>
|
|
||||||
<td class="text-end">
|
<td class="text-end">
|
||||||
<button class="btn btn-light btn-sm rounded-circle me-1" onclick="editOutlet(<?= htmlspecialchars(json_encode($o)) ?>)" title="Edit">
|
<button class="btn btn-light btn-sm rounded-circle me-1" onclick="editOutlet(<?= htmlspecialchars(json_encode($o)) ?>)" title="Edit">
|
||||||
<i class="bi bi-pencil"></i>
|
<i class="bi bi-pencil"></i>
|
||||||
@ -5205,7 +5267,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
<div class="modal fade" id="addOutletModal" tabindex="-1">
|
<div class="modal fade" id="addOutletModal" tabindex="-1">
|
||||||
<div class="modal-dialog modal-dialog-centered">
|
<div class="modal-dialog modal-dialog-centered">
|
||||||
<div class="modal-content border-0 shadow rounded-4">
|
<div class="modal-content border-0 shadow rounded-4">
|
||||||
<form method="POST">
|
<form method="POST" enctype="multipart/form-data">
|
||||||
<input type="hidden" name="id" id="outlet_id">
|
<input type="hidden" name="id" id="outlet_id">
|
||||||
<div class="modal-header border-bottom-0 pb-0">
|
<div class="modal-header border-bottom-0 pb-0">
|
||||||
<h5 class="modal-title fw-bold" id="outletModalTitle">Add Outlet</h5>
|
<h5 class="modal-title fw-bold" id="outletModalTitle">Add Outlet</h5>
|
||||||
@ -5216,9 +5278,25 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
<label class="form-label small fw-semibold text-muted">Name</label>
|
<label class="form-label small fw-semibold text-muted">Name</label>
|
||||||
<input type="text" name="name" id="outlet_name" class="form-control rounded-3" required>
|
<input type="text" name="name" id="outlet_name" class="form-control rounded-3" required>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="row">
|
||||||
<label class="form-label small fw-semibold text-muted">Phone</label>
|
<div class="col-md-6 mb-3">
|
||||||
<input type="text" name="phone" id="outlet_phone" class="form-control rounded-3">
|
<label class="form-label small fw-semibold text-muted">Phone</label>
|
||||||
|
<input type="text" name="phone" id="outlet_phone" class="form-control rounded-3">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-3">
|
||||||
|
<label class="form-label small fw-semibold text-muted">CTR Number</label>
|
||||||
|
<input type="text" name="ctr_number" id="outlet_ctr_number" class="form-control rounded-3">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mb-3">
|
||||||
|
<label class="form-label small fw-semibold text-muted">VAT Number</label>
|
||||||
|
<input type="text" name="vat_number" id="outlet_vat_number" class="form-control rounded-3">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-3">
|
||||||
|
<label class="form-label small fw-semibold text-muted">Logo Image</label>
|
||||||
|
<input type="file" name="logo" id="outlet_logo" class="form-control rounded-3" accept="image/*">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label small fw-semibold text-muted">Address</label>
|
<label class="form-label small fw-semibold text-muted">Address</label>
|
||||||
@ -5245,8 +5323,11 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
document.getElementById('outlet_id').value = o.id;
|
document.getElementById('outlet_id').value = o.id;
|
||||||
document.getElementById('outlet_name').value = o.name;
|
document.getElementById('outlet_name').value = o.name;
|
||||||
document.getElementById('outlet_phone').value = o.phone || '';
|
document.getElementById('outlet_phone').value = o.phone || '';
|
||||||
|
document.getElementById('outlet_ctr_number').value = o.ctr_number || '';
|
||||||
|
document.getElementById('outlet_vat_number').value = o.vat_number || '';
|
||||||
document.getElementById('outlet_address').value = o.address || '';
|
document.getElementById('outlet_address').value = o.address || '';
|
||||||
document.getElementById('outlet_status').value = o.status;
|
document.getElementById('outlet_status').value = o.status;
|
||||||
|
document.getElementById('outlet_logo').value = '';
|
||||||
document.getElementById('outletModalTitle').innerText = 'Edit Outlet';
|
document.getElementById('outletModalTitle').innerText = 'Edit Outlet';
|
||||||
document.getElementById('outletSubmitBtn').name = 'edit_outlet';
|
document.getElementById('outletSubmitBtn').name = 'edit_outlet';
|
||||||
document.getElementById('outletSubmitBtn').innerText = 'Update Outlet';
|
document.getElementById('outletSubmitBtn').innerText = 'Update Outlet';
|
||||||
@ -5256,7 +5337,10 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
document.getElementById('outlet_id').value = '';
|
document.getElementById('outlet_id').value = '';
|
||||||
document.getElementById('outlet_name').value = '';
|
document.getElementById('outlet_name').value = '';
|
||||||
document.getElementById('outlet_phone').value = '';
|
document.getElementById('outlet_phone').value = '';
|
||||||
|
document.getElementById('outlet_ctr_number').value = '';
|
||||||
|
document.getElementById('outlet_vat_number').value = '';
|
||||||
document.getElementById('outlet_address').value = '';
|
document.getElementById('outlet_address').value = '';
|
||||||
|
document.getElementById('outlet_logo').value = '';
|
||||||
document.getElementById('outlet_status').value = 'active';
|
document.getElementById('outlet_status').value = 'active';
|
||||||
document.getElementById('outletModalTitle').innerText = 'Add Outlet';
|
document.getElementById('outletModalTitle').innerText = 'Add Outlet';
|
||||||
document.getElementById('outletSubmitBtn').name = 'add_outlet';
|
document.getElementById('outletSubmitBtn').name = 'add_outlet';
|
||||||
@ -7024,7 +7108,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
if (result.success) {
|
if (result.success) {
|
||||||
const payModal = bootstrap.Modal.getInstance(document.getElementById('posPaymentModal'));
|
const payModal = bootstrap.Modal.getInstance(document.getElementById('posPaymentModal'));
|
||||||
if (payModal) payModal.hide();
|
if (payModal) payModal.hide();
|
||||||
this.showReceipt(result.invoice_id, discountAmount, loyaltyRedeemed, result.transaction_no, result.outlet_name, result.outlet_phone, result.outlet_address);
|
this.showReceipt(result.invoice_id, discountAmount, loyaltyRedeemed, result.transaction_no, result.outlet_name, result.outlet_phone, result.outlet_address, result.outlet_vat_number, result.outlet_ctr_number, result.outlet_logo);
|
||||||
} else {
|
} else {
|
||||||
Swal.fire('Error', result.error, 'error');
|
Swal.fire('Error', result.error, 'error');
|
||||||
btn.disabled = false;
|
btn.disabled = false;
|
||||||
@ -7037,7 +7121,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
btn.innerText = originalText;
|
btn.innerText = originalText;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
showReceipt(invId, discountAmount, loyaltyRedeemed, transactionNo, outletName, outletPhone, outletAddress) {
|
showReceipt(invId, discountAmount, loyaltyRedeemed, transactionNo, outletName, outletPhone, outletAddress, outletVatNumber, outletCtrNumber, outletLogo) {
|
||||||
const container = document.getElementById('posReceiptContent');
|
const container = document.getElementById('posReceiptContent');
|
||||||
const customerSelect = document.getElementById('posCustomer');
|
const customerSelect = document.getElementById('posCustomer');
|
||||||
const customerName = (customerSelect && customerSelect.selectedIndex >= 0 && customerSelect.value !== '') ? customerSelect.options[customerSelect.selectedIndex].text : '<?= $translations['ar']['walk_in_customer'] ?> / <?= $translations['en']['walk_in_customer'] ?>';
|
const customerName = (customerSelect && customerSelect.selectedIndex >= 0 && customerSelect.value !== '') ? customerSelect.options[customerSelect.selectedIndex].text : '<?= $translations['ar']['walk_in_customer'] ?> / <?= $translations['en']['walk_in_customer'] ?>';
|
||||||
@ -11184,6 +11268,8 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<?php elseif ($page === 'help'): ?>
|
||||||
|
<?php include 'help.php'; ?>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@ -22,3 +22,8 @@
|
|||||||
2026-02-26 05:17:47 - POST: {"action":"save_theme","theme":"default"}
|
2026-02-26 05:17:47 - POST: {"action":"save_theme","theme":"default"}
|
||||||
2026-02-26 05:47:24 - POST: {"action":"save_pos_transaction","customer_id":"","payments":"[{\"method\":\"cash\",\"amount\":2.6}]","total_amount":"2.6","tax_amount":"0","discount_code_id":"","discount_amount":"0","loyalty_redeemed":"0","items":"[{\"id\":19,\"qty\":1,\"price\":1.2,\"vat_rate\":0,\"vat_amount\":0},{\"id\":12,\"qty\":1,\"price\":1.2,\"vat_rate\":0,\"vat_amount\":0},{\"id\":13,\"qty\":1,\"price\":0.2,\"vat_rate\":0,\"vat_amount\":0}]"}
|
2026-02-26 05:47:24 - POST: {"action":"save_pos_transaction","customer_id":"","payments":"[{\"method\":\"cash\",\"amount\":2.6}]","total_amount":"2.6","tax_amount":"0","discount_code_id":"","discount_amount":"0","loyalty_redeemed":"0","items":"[{\"id\":19,\"qty\":1,\"price\":1.2,\"vat_rate\":0,\"vat_amount\":0},{\"id\":12,\"qty\":1,\"price\":1.2,\"vat_rate\":0,\"vat_amount\":0},{\"id\":13,\"qty\":1,\"price\":0.2,\"vat_rate\":0,\"vat_amount\":0}]"}
|
||||||
2026-02-26 06:03:42 - POST: {"device_name":"scale 1","device_type":"scale","connection_type":"network","ip_address":"192.168.1.10","port":"9100","baud_rate":"","add_pos_device":""}
|
2026-02-26 06:03:42 - POST: {"device_name":"scale 1","device_type":"scale","connection_type":"network","ip_address":"192.168.1.10","port":"9100","baud_rate":"","add_pos_device":""}
|
||||||
|
2026-02-26 08:15:07 - POST: {"id":"2","name":"Nizwa Branch","phone":"9689555","ctr_number":"5012641","vat_number":"OM1254","address":"Nizwa","status":"active","edit_outlet":""}
|
||||||
|
2026-02-26 08:15:57 - POST: {"id":"1","name":"Moosa Ali Al-Abri","phone":"99359472","ctr_number":"514899","vat_number":"OM99888","address":"AL Hamra\r\n","status":"active","edit_outlet":""}
|
||||||
|
2026-02-26 08:16:37 - POST: {"id":"1","name":"Main Branch","phone":"99359472","ctr_number":"514899","vat_number":"OM99888","address":"AL Hamra\r\n","status":"active","edit_outlet":""}
|
||||||
|
2026-02-26 08:17:31 - POST: {"name":"Counter1","add_cash_register":""}
|
||||||
|
2026-02-26 08:17:56 - POST: {"open_register":"1","register_id":"4","opening_balance":"0"}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user