0 || $data['stats']['near_expiry_items'] > 0 || $data['stats']['low_stock_items_count'] > 0): ?>
Inventory Alert: 0): ?> items have expired. 0): ?> items are expiring soon (within 30 days). 0): ?> items are below minimum level.
OMR
OMR
OMR
OMR
OMR
OMR
Total Items
Sales Performance
Recent Customers
View All
Name Phone Balance
OMR
Quick Links
Sales Tax Invoices Purchase Tax Invoices
Management
Export
Name Tax ID Email Phone Balance Actions
OMR
Stock Categories
ID Name (EN) Name (AR)
Stock Units
Name (EN) Short (EN) Name (AR) Short (AR)
Stock Items
Promo Catalog
Export
Image SKU Name Category Supplier Stock Level Expiry VAT Actions
item
Promo
Min:
Low Stock
%
Expiry Report
SKU Item Name Category Stock Level Expiry Date Status
No items found.
Expired Near Expiry Good
Low Stock Report
SKU Item Name Category Supplier Min Level Current Stock Shortage
All items are above minimum levels.
Loyalty Transaction History
Date Customer Tier Type Points Description
No transactions found.
Current Balance: pts
0 ? '+' : '' ?>
prepare("SELECT * FROM register_sessions WHERE user_id = ? AND status = 'open'"); $stmt->execute([$_SESSION['user_id']]); $active_session = $stmt->fetch(PDO::FETCH_ASSOC); $_SESSION['register_session_id'] = $active_session['id'] ?? null; $registers = db()->query("SELECT * FROM cash_registers WHERE status = 'active'")->fetchAll(); $allow_zero_stock_sell = ($data['settings']['allow_zero_stock_sell'] ?? '1') === '1'; $sql = "SELECT * FROM stock_items ORDER BY name_en ASC"; $products_raw = db()->query($sql)->fetchAll(PDO::FETCH_ASSOC); $products = []; foreach ($products_raw as $p) { $p['original_price'] = (float)$p['sale_price']; $p['sale_price'] = getPromotionalPrice($p); $products[] = $p; } $customers = db()->query("SELECT * FROM customers WHERE type = 'customer' ORDER BY name ASC")->fetchAll(PDO::FETCH_ASSOC); ?>
<?= htmlspecialchars($p['name_en']) ?>
OMR OMR
left
Cart

Cart is empty

Subtotal (Excl. VAT) 0.000
VAT 0.000
Total 0.000
Quotations
Clear
prepare("SELECT qi.*, i.name_en, i.name_ar, i.vat_rate FROM quotation_items qi JOIN stock_items i ON qi.item_id = i.id WHERE qi.quotation_id = ?"); $items->execute([$q['id']]); $q['items'] = $items->fetchAll(PDO::FETCH_ASSOC); ?>
Quotation # Date Valid Until Customer Status Total Actions
QUO- OMR
No quotations found
prepare("SELECT ii.*, i.name_en, i.name_ar, i.vat_rate FROM invoice_items ii JOIN stock_items i ON ii.item_id = i.id WHERE ii.invoice_id = ?"); $items->execute([$inv['id']]); $inv['items'] = $items->fetchAll(PDO::FETCH_ASSOC); ?>
Invoice # Date Status Total Paid Balance Actions
INV- OMR OMR OMR

Statement of Account

|
Period: to

Date Reference Description Debit Credit Balance
0 ? number_format($debit, 3) : '' ?> 0 ? number_format($credit, 3) : '' ?>
Closing Balance OMR

Please select an entity and date range to generate the statement.

Cashflow Statement

Cashflow Statement

Period: to

0) $op_inflow += $amt; else $op_outflow += abs($amt); } elseif ($t['other_type'] === 'asset' && !in_array($t['other_account'], ['Accounts Receivable', 'Inventory'])) { // Fixed assets etc if ($amt > 0) $inv_inflow += $amt; else $inv_outflow += abs($amt); } elseif ($t['other_type'] === 'equity' || $t['other_type'] === 'liability') { if ($amt > 0) $fin_inflow += $amt; else $fin_outflow += abs($amt); } else { // Default to operating if unsure if ($amt > 0) $op_inflow += $amt; else $op_outflow += abs($amt); } } ?>
Description Amount (OMR)
Opening Cash Balance
Operating Activities
Cash Received from Customers & Others
Cash Paid to Suppliers & Expenses ()
Net Cash from Operating Activities
Investing Activities
Net Cash from Investing Activities
Financing Activities
Net Cash from Financing Activities
Net Change in Cash
Closing Cash Balance

___________________
Prepared By

___________________
Approved By

Payment Methods
ID Name (EN) Name (AR) Actions
Expense Categories
ID Name (EN) Name (AR) Actions
Accounting Module

Date Description Reference Amount Action
Code Name Type Parent Balance

VAT Summary Report

VAT Input (Purchases)
VAT Output (Sales)
Net VAT Payable / (Refundable)
This report calculates the difference between VAT collected on sales and VAT paid on purchases for the selected period.
Code Account Name Debit Credit
Total

Profit & Loss Statement

Revenue
Total Revenue
Expenses
Total Expenses
Net Profit / Loss

Balance Sheet

Assets
Total Assets
Liabilities & Equity
query("SELECT code FROM acc_accounts WHERE type='revenue' AND parent_id IS NOT NULL")->fetchAll() as $a) $rev += getAccountBalance($a['code']); $exp = 0; foreach(db()->query("SELECT code FROM acc_accounts WHERE type='expense' AND parent_id IS NOT NULL")->fetchAll() as $a) $exp += getAccountBalance($a['code']); $earnings = $rev - $exp; $total_equity += $earnings; ?>
Liabilities
Equity
Retained Earnings (Current)
Total Liab. & Equity
Expenses List
Date Reference Category Description Amount Actions
OMR
Expense Report
Total Expenses

OMR

Period: to
0 ? ($row['total'] / $data['total_expenses'] * 100) : 0; ?>
Category Total Amount % of Total
No expenses found for this period.
OMR %
Sales Returns
Return # Date Invoice # Customer Total Amount Actions
RET- INV- OMR
No returns found
Purchase Returns
Return # Date Invoice # Supplier Total Amount Actions
PRET- INV- OMR
No returns found
HR Departments
ID Department Name Actions
HR Employees
Name Biometric ID Department Position Salary Status Actions
OMR
HR Attendance
Employee Department Status Clock In Clock Out Action
Not Marked
HR Payroll
Employee Basic Bonus Deductions Net Salary Status Actions
OMR + OMR - OMR OMR
Biometric Devices
Device Name IP / IO Address Port Serial Last Sync Status Actions
IP:
IO:
POS Devices
Device Name Type Connection Details Status Actions
: Baud: USB Interface
Profile Picture
Profile

Edit Profile
Company Profile
Logo
Favicon
Signature
Loyalty Configuration
Role Groups

Manage access levels and permissions

Group Name Created Date Status Actions
Active
Customer Display Settings
Greeting Message
Slideshow Images

Upload images for the customer display slideshow (1920x1080 recommended).

Slide 1
Slide 2
Slide 3
Backup Settings
>
Requires a cron job running cron_backup.php every minute to respect the scheduled time.
Manual Backup

Create a database backup immediately.

Available Backups
Filename Size Date Actions
No backups found.
User Management

Maintain your team accounts and security

User Info Access Level Contact Status Actions
Avatar
ID: #
Active Suspended
Cash Registers Management

Define your shop counters and registers.

ID Name Status Created At Actions
#
Register Sessions ()

Manage daily opening and closing of cash registers.

prepare("SELECT s.*, r.name as register_name FROM register_sessions s JOIN cash_registers r ON s.register_id = r.id WHERE s.user_id = ? AND s.status = 'open'"); $active_session->execute([$_SESSION['user_id']]); $session = $active_session->fetch(); ?>
Current Open Register: | Opened At: | Opening Balance: OMR
Go to POS
Clear
prepare("SELECT SUM(CASE WHEN LOWER(p.payment_method) = 'cash' THEN p.amount ELSE 0 END) as cash_total, SUM(CASE WHEN LOWER(p.payment_method) IN ('card', 'credit card', 'visa', 'mastercard') THEN p.amount ELSE 0 END) as card_total, SUM(CASE WHEN LOWER(p.payment_method) = 'credit' THEN p.amount ELSE 0 END) as credit_total, SUM(CASE WHEN LOWER(p.payment_method) LIKE '%transfer%' OR LOWER(p.payment_method) LIKE '%bank%' THEN p.amount ELSE 0 END) as transfer_total, SUM(p.amount) as total_sales FROM pos_payments p JOIN pos_transactions t ON p.transaction_id = t.id WHERE t.register_session_id = ? AND t.status = 'completed'"); $stats_stmt->execute([$s['id']]); $st = $stats_stmt->fetch(); $c_total = (float)($st['cash_total'] ?? 0); $cd_total = (float)($st['card_total'] ?? 0); $cr_total = (float)($st['credit_total'] ?? 0); $tr_total = (float)($st['transfer_total'] ?? 0); $t_sales = (float)($st['total_sales'] ?? 0); $row_expected_cash = (float)$s['opening_balance'] + $c_total; ?>
ID Register Cashier Opened At Closed At Opening Bal. Cash Sale Credit Card Credit Total Sale Balance Status Report
# OMR OMR OMR OMR OMR 0 ? 'text-info' : 'text-danger'); ?> OMR ---
System Logs

Monitor system activity and errors

--- " . htmlspecialchars(basename($file)) . " ---
"; $lines = shell_exec("tail -n 50 " . escapeshellarg($path)); echo "
" . htmlspecialchars((string)$lines) . "
"; } } if (!$found_logs) { echo "

No accessible log files found.

"; } ?>