0 || $data['stats']['near_expiry_items'] > 0 || $data['stats']['low_stock_items_count'] > 0 || $purchaseAlertsCount > 0): ?>
Administrative Alerts: 0): ?> items have expired. 0): ?> items are expiring soon. 0): ?> items are below minimum level. 0): ?> purchase invoices are due or overdue.
OMR
OMR
OMR
OMR
OMR
OMR
Total Items
Sales Performance
No completed sales recorded for this outlet yet.
Recent Customers
View All
Name Phone Balance
Quick Links
Sales Tax Invoices Purchase Tax Invoices
Company Logo

Management
Export to Excel
Limit
Name Tax ID Email Phone Balance Actions
Stock Categories Management
Export
ID Name (EN) Name (AR) Actions
Units ()

Manage the English and Arabic unit names used across items, invoices, and reports.

Export
Name (EN) Name (AR) Actions
No units yet

Add your first unit so items can reuse the same labels in invoices and reports.

Stock Items ()
Promo Catalog
Export to Excel
Limit
Image SKU Name Category Supplier Sale Price Stock Level Expiry VAT Actions
item
Promo
Incl. VAT:
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'; $oid = current_outlet_id(); $sql = "SELECT * FROM stock_items WHERE outlet_id = $oid ORDER BY name_en ASC LIMIT 100"; $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 ORDER BY name ASC")->fetchAll(PDO::FETCH_ASSOC); ?>
<?= htmlspecialchars($p['name_en']) ?>
OMR OMR

0.000
0.000
0.000
Quotations
Limit
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
Local Purchase Orders (LPO)
Limit
Clear
prepare("SELECT li.*, i.name_en, i.name_ar, i.vat_rate FROM lpo_items li JOIN stock_items i ON li.item_id = i.id WHERE li.lpo_id = ?"); $items->execute([$q['id']]); $q['items'] = $items->fetchAll(PDO::FETCH_ASSOC); ?>
LPO # Date Delivery Date Supplier Status Total Actions
LPO- OMR
No LPOs found
'view', 'page' => (string)$page]); ?>
Limit

-

|
:

-

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

Cashflow Statement
Limit

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
No payment methods found yet. Add one to get started.
Expense Categories
ID Name (EN) Name (AR) Actions
'view', 'page' => (string)$page]); ?>
Expenses List
Date Reference Category Description Amount Actions
OMR
Expense Report
Total Expenses

OMR

For the selected period
0 ? ($row['total'] / $data['total_expenses'] * 100) : 0; ?>
Category Total Amount % of Total
No expenses found for this period.
OMR
%
Sales Returns
Export
Return # Date Invoice # Customer Total Amount Actions
RET- INV- OMR
No returns found
Purchase Returns
Export
Return # Date Invoice # Supplier Total Amount Actions
PRET- PUR- 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
'view', 'page' => (string)$page]); ?> 'view', 'page' => (string)$page]); ?> 'view', 'page' => (string)$page]); ?>
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.
'view', 'page' => (string)$page]); ?>
Cash Registers Management

Define your shop counters and registers.

License Limit: / 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
Clear
prepare("SELECT SUM(CASE WHEN LOWER(payment_method) = 'cash' THEN amount ELSE 0 END) as cash_total, SUM(CASE WHEN LOWER(payment_method) IN ('card', 'credit card', 'visa', 'mastercard') THEN amount ELSE 0 END) as card_total, SUM(CASE WHEN LOWER(payment_method) = 'credit' THEN amount ELSE 0 END) as credit_total, SUM(CASE WHEN LOWER(payment_method) LIKE '%transfer%' OR LOWER(payment_method) LIKE '%bank%' THEN amount ELSE 0 END) as transfer_total, SUM(amount) as total_sales FROM ( SELECT p.payment_method, p.amount FROM payments p JOIN invoices i ON p.invoice_id = i.id WHERE i.register_session_id = ? AND i.status = 'paid' AND i.is_pos = 1 ) as combined_payments"); $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 ---
'script', 'page' => (string)$page]); ?> 'view', 'page' => (string)$page]); ?>
'view', 'page' => (string)$page]); ?>
Powered By Accounting • omanapp.cloud • aalabry@gmail.com • Whatsapp: +968 99359472
'script', 'page' => (string)$page]); ?>