adding help file

This commit is contained in:
Flatlogic Bot 2026-02-26 13:39:23 +00:00
parent ca71e892ec
commit 923a8e50e7
7 changed files with 306 additions and 18 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -1 +1,2 @@
[INFO] AI agent editing: index.php
2026-02-26 08:18:16 - Items case hit

194
help.php Normal file
View 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>

View File

@ -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' => 'تسجيل الدخول',

122
index.php
View File

@ -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';
</div>
<?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 -->
<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>
@ -5163,11 +5215,11 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
<thead class="table-light">
<tr>
<th>ID</th>
<th>Logo</th>
<th>Name</th>
<th>Details</th>
<th>Address</th>
<th>Phone</th>
<th>Status</th>
<th>Created At</th>
<th class="text-end">Actions</th>
</tr>
</thead>
@ -5175,11 +5227,21 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
<?php foreach ($data['outlets'] as $o): ?>
<tr>
<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="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><?= 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 class="small text-muted"><?= htmlspecialchars($o['created_at']) ?></td>
<td class="text-end">
<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>
@ -5205,7 +5267,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
<div class="modal fade" id="addOutletModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<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">
<div class="modal-header border-bottom-0 pb-0">
<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>
<input type="text" name="name" id="outlet_name" class="form-control rounded-3" required>
</div>
<div class="mb-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 class="row">
<div class="col-md-6 mb-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 class="mb-3">
<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_name').value = o.name;
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_status').value = o.status;
document.getElementById('outlet_logo').value = '';
document.getElementById('outletModalTitle').innerText = 'Edit Outlet';
document.getElementById('outletSubmitBtn').name = 'edit_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_name').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_logo').value = '';
document.getElementById('outlet_status').value = 'active';
document.getElementById('outletModalTitle').innerText = 'Add Outlet';
document.getElementById('outletSubmitBtn').name = 'add_outlet';
@ -7024,7 +7108,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
if (result.success) {
const payModal = bootstrap.Modal.getInstance(document.getElementById('posPaymentModal'));
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 {
Swal.fire('Error', result.error, 'error');
btn.disabled = false;
@ -7037,7 +7121,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
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 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'] ?>';
@ -11184,6 +11268,8 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
</div>
</div>
</div>
<?php elseif ($page === 'help'): ?>
<?php include 'help.php'; ?>
<?php endif; ?>
</div>

View File

@ -22,3 +22,8 @@
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 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"}