Autosave: 20260221-100021
This commit is contained in:
parent
b5a80b944c
commit
ac96fe49de
@ -22,6 +22,39 @@ body.theme-dark {
|
||||
--border: #334155;
|
||||
}
|
||||
|
||||
body.theme-nord {
|
||||
--primary: #2e3440;
|
||||
--primary-light: #3b4252;
|
||||
--accent: #88c0d0;
|
||||
--bg: #eceff4;
|
||||
--surface: #ffffff;
|
||||
--text: #2e3440;
|
||||
--text-muted: #4c566a;
|
||||
--border: #d8dee9;
|
||||
}
|
||||
|
||||
body.theme-dracula {
|
||||
--primary: #282a36;
|
||||
--primary-light: #44475a;
|
||||
--accent: #bd93f9;
|
||||
--bg: #1e1f29;
|
||||
--surface: #282a36;
|
||||
--text: #f8f8f2;
|
||||
--text-muted: #6272a4;
|
||||
--border: #44475a;
|
||||
}
|
||||
|
||||
body.theme-citrus {
|
||||
--primary: #365314;
|
||||
--primary-light: #4d7c0f;
|
||||
--accent: #84cc16;
|
||||
--bg: #f7fee7;
|
||||
--surface: #ffffff;
|
||||
--text: #1a2e05;
|
||||
--text-muted: #65a30d;
|
||||
--border: #ecfccb;
|
||||
}
|
||||
|
||||
body.theme-ocean {
|
||||
--primary: #083344;
|
||||
--primary-light: #164e63;
|
||||
@ -79,9 +112,13 @@ body {
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
/* Base positioning for desktop */
|
||||
@media (min-width: 1200px) {
|
||||
[dir="ltr"] .sidebar { left: 0; }
|
||||
[dir="rtl"] .sidebar { right: 0; }
|
||||
[dir="ltr"] .sidebar { left: 0 !important; right: auto !important; }
|
||||
[dir="rtl"] .sidebar { right: 0 !important; left: auto !important; }
|
||||
|
||||
[dir="ltr"] .main-content { margin-left: var(--sidebar-width) !important; margin-right: 0 !important; }
|
||||
[dir="rtl"] .main-content { margin-left: 0 !important; margin-right: var(--sidebar-width) !important; }
|
||||
}
|
||||
|
||||
.sidebar-header {
|
||||
@ -157,7 +194,7 @@ body {
|
||||
}
|
||||
.pos-cart {
|
||||
width: 400px;
|
||||
background: #fff;
|
||||
background: var(--surface);
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 4px 15px rgba(0,0,0,0.05);
|
||||
display: flex;
|
||||
@ -170,9 +207,9 @@ body {
|
||||
gap: 15px;
|
||||
}
|
||||
.product-card {
|
||||
background: #fff;
|
||||
background: var(--surface);
|
||||
border-radius: 10px;
|
||||
border: 1px solid #edf2f7;
|
||||
border: 1px solid var(--border);
|
||||
padding: 15px;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
@ -184,7 +221,7 @@ body {
|
||||
.product-card:hover {
|
||||
transform: translateY(-5px);
|
||||
box-shadow: 0 10px 20px rgba(0,0,0,0.05);
|
||||
border-color: #3b82f6;
|
||||
border-color: var(--accent);
|
||||
}
|
||||
.product-card img {
|
||||
width: 100%;
|
||||
@ -195,7 +232,7 @@ body {
|
||||
}
|
||||
.product-card .price {
|
||||
font-weight: 700;
|
||||
color: #2d3748;
|
||||
color: var(--text);
|
||||
}
|
||||
.cart-items {
|
||||
flex: 1;
|
||||
@ -208,11 +245,11 @@ body {
|
||||
align-items: center;
|
||||
margin-bottom: 15px;
|
||||
padding-bottom: 15px;
|
||||
border-bottom: 1px solid #edf2f7;
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
.cart-total {
|
||||
padding: 20px;
|
||||
background: #f8fafc;
|
||||
background: var(--bg);
|
||||
border-bottom-left-radius: 12px;
|
||||
border-bottom-right-radius: 12px;
|
||||
}
|
||||
@ -225,16 +262,17 @@ body {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
border-radius: 50%;
|
||||
border: 1px solid #e2e8f0;
|
||||
background: #fff;
|
||||
border: 1px solid var(--border);
|
||||
background: var(--surface);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
color: var(--text);
|
||||
}
|
||||
.qty-btn:hover {
|
||||
background: #edf2f7;
|
||||
background: var(--bg);
|
||||
}
|
||||
|
||||
[dir="rtl"] .nav-link i {
|
||||
@ -244,7 +282,6 @@ body {
|
||||
|
||||
/* Main Content */
|
||||
.main-content {
|
||||
margin-left: var(--sidebar-width);
|
||||
padding: 2rem;
|
||||
transition: all 0.3s;
|
||||
min-height: 100vh;
|
||||
@ -252,26 +289,24 @@ body {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
[dir="rtl"] .main-content {
|
||||
margin-left: 0;
|
||||
margin-right: var(--sidebar-width);
|
||||
}
|
||||
/* Desktop margins handled in the top @media block */
|
||||
|
||||
@media (max-width: 1199.98px) {
|
||||
[dir="ltr"] .sidebar {
|
||||
left: calc(-1 * var(--sidebar-width));
|
||||
left: calc(-1 * var(--sidebar-width)) !important;
|
||||
}
|
||||
[dir="ltr"] .sidebar.show {
|
||||
left: 0;
|
||||
box-shadow: 0 0 50px rgba(0,0,0,0.3);
|
||||
left: 0 !important;
|
||||
box-shadow: 0 0 50px rgba(0,0,0,0.3) !important;
|
||||
}
|
||||
[dir="rtl"] .sidebar {
|
||||
right: calc(-1 * var(--sidebar-width));
|
||||
left: auto;
|
||||
right: calc(-1 * var(--sidebar-width)) !important;
|
||||
left: auto !important;
|
||||
}
|
||||
[dir="rtl"] .sidebar.show {
|
||||
right: 0;
|
||||
box-shadow: 0 0 50px rgba(0,0,0,0.3);
|
||||
right: 0 !important;
|
||||
left: auto !important;
|
||||
box-shadow: 0 0 50px rgba(0,0,0,0.3) !important;
|
||||
}
|
||||
.main-content {
|
||||
margin-left: 0 !important;
|
||||
@ -348,6 +383,75 @@ body {
|
||||
}
|
||||
|
||||
/* RTL Adjustments */
|
||||
/* Theme Compatibility Overrides */
|
||||
body.theme-dark, body.theme-dracula {
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
||||
body:not(.theme-default) .text-dark {
|
||||
color: var(--text) !important;
|
||||
}
|
||||
|
||||
body:not(.theme-default) .bg-light,
|
||||
body:not(.theme-default) .bg-white {
|
||||
background-color: var(--surface) !important;
|
||||
}
|
||||
|
||||
body:not(.theme-default) .border-dark {
|
||||
border-color: var(--border) !important;
|
||||
}
|
||||
|
||||
body:not(.theme-default) .list-group-item {
|
||||
background-color: var(--surface);
|
||||
color: var(--text);
|
||||
border-color: var(--border);
|
||||
}
|
||||
|
||||
body:not(.theme-default) .list-group-item-action:hover {
|
||||
background-color: var(--bg);
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
body:not(.theme-default) .dropdown-menu {
|
||||
background-color: var(--surface);
|
||||
border-color: var(--border);
|
||||
}
|
||||
|
||||
body:not(.theme-default) .dropdown-item {
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
body:not(.theme-default) .dropdown-item:hover {
|
||||
background-color: var(--primary-light);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
body:not(.theme-default) .alert-warning {
|
||||
background-color: var(--primary-light);
|
||||
border-color: var(--accent);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
body:not(.theme-default) .modal-content {
|
||||
background-color: var(--surface);
|
||||
color: var(--text);
|
||||
border-color: var(--border);
|
||||
}
|
||||
|
||||
body:not(.theme-default) .form-control,
|
||||
body:not(.theme-default) .form-select {
|
||||
background-color: var(--bg);
|
||||
border-color: var(--border);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
body:not(.theme-default) .form-control:focus,
|
||||
body:not(.theme-default) .form-select:focus {
|
||||
background-color: var(--bg);
|
||||
border-color: var(--accent);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
[dir="rtl"] .ms-auto {
|
||||
margin-right: auto !important;
|
||||
margin-left: 0 !important;
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const langToggle = document.getElementById('langToggle');
|
||||
|
||||
// Check for saved language
|
||||
const currentLang = localStorage.getItem('lang') || 'en';
|
||||
setLanguage(currentLang);
|
||||
// Use the language set by PHP as initial source of truth
|
||||
const initialLang = document.documentElement.lang || 'ar';
|
||||
localStorage.setItem('lang', initialLang);
|
||||
|
||||
if (langToggle) {
|
||||
langToggle.addEventListener('click', function() {
|
||||
@ -63,7 +63,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
const theme = this.getAttribute('data-theme');
|
||||
|
||||
// Remove all existing theme classes
|
||||
const themes = ['theme-default', 'theme-dark', 'theme-ocean', 'theme-forest', 'theme-sunset'];
|
||||
const themes = ['theme-default', 'theme-dark', 'theme-ocean', 'theme-forest', 'theme-sunset', 'theme-nord', 'theme-dracula', 'theme-citrus'];
|
||||
document.body.classList.remove(...themes);
|
||||
|
||||
// Add new theme class
|
||||
@ -92,6 +92,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
function setLanguage(lang) {
|
||||
document.documentElement.lang = lang;
|
||||
document.documentElement.dir = lang === 'ar' ? 'rtl' : 'ltr';
|
||||
document.body.dir = lang === 'ar' ? 'rtl' : 'ltr';
|
||||
localStorage.setItem('lang', lang);
|
||||
|
||||
// Update UI text
|
||||
|
||||
2
db/migrations/20260221_add_theme_to_users.sql
Normal file
2
db/migrations/20260221_add_theme_to_users.sql
Normal file
@ -0,0 +1,2 @@
|
||||
-- Add theme column to users table
|
||||
ALTER TABLE users ADD COLUMN theme VARCHAR(20) DEFAULT 'default' AFTER profile_pic;
|
||||
145
index.php
145
index.php
@ -463,7 +463,7 @@ if (isset($_GET['action']) || isset($_POST['action'])) {
|
||||
exit;
|
||||
}
|
||||
$theme = $_POST['theme'] ?? 'default';
|
||||
$allowed = ['default', 'dark', 'ocean', 'forest', 'sunset'];
|
||||
$allowed = ['default', 'dark', 'ocean', 'forest', 'sunset', 'nord', 'dracula', 'citrus'];
|
||||
if (!in_array($theme, $allowed)) $theme = 'default';
|
||||
|
||||
$stmt = db()->prepare("UPDATE users SET theme = ? WHERE id = ?");
|
||||
@ -2095,67 +2095,67 @@ $data = [
|
||||
];
|
||||
|
||||
$permission_groups = [
|
||||
'General' => ['dashboard' => 'Dashboard'],
|
||||
'General' => ['dashboard' => __('dashboard')],
|
||||
'Inventory' => [
|
||||
'items' => 'Items',
|
||||
'categories' => 'Categories',
|
||||
'units' => 'Units'
|
||||
'items' => __('items'),
|
||||
'categories' => __('categories'),
|
||||
'units' => __('units')
|
||||
],
|
||||
'Customers' => [
|
||||
'customers' => 'Customers'
|
||||
'customers' => __('customers')
|
||||
],
|
||||
'Suppliers' => [
|
||||
'suppliers' => 'Suppliers'
|
||||
'suppliers' => __('suppliers')
|
||||
],
|
||||
'POS' => [
|
||||
'pos' => 'POS'
|
||||
'pos' => __('pos')
|
||||
],
|
||||
'Sales' => [
|
||||
'sales' => 'Sales',
|
||||
'sales_returns' => 'Sales Returns',
|
||||
'quotations' => 'Quotations'
|
||||
'sales' => __('sales'),
|
||||
'sales_returns' => __('sales_returns'),
|
||||
'quotations' => __('quotations')
|
||||
],
|
||||
'Purchases' => [
|
||||
'purchases' => 'Purchases',
|
||||
'lpos' => 'LPOs',
|
||||
'purchase_returns' => 'Purchase Returns'
|
||||
'purchases' => __('purchases'),
|
||||
'lpos' => __('lpos'),
|
||||
'purchase_returns' => __('purchase_returns')
|
||||
],
|
||||
'Expenses' => [
|
||||
'expense_categories' => 'Expense Categories',
|
||||
'expenses' => 'Expenses'
|
||||
'expense_categories' => __('expense_categories'),
|
||||
'expenses' => __('expenses')
|
||||
],
|
||||
'Accounting' => [
|
||||
'accounting' => 'Journal Entries',
|
||||
'trial_balance' => 'Trial Balance',
|
||||
'profit_loss' => 'Profit & Loss',
|
||||
'balance_sheet' => 'Balance Sheet',
|
||||
'vat_report' => 'VAT Report'
|
||||
'accounting' => __('accounting'),
|
||||
'trial_balance' => __('trial_balance'),
|
||||
'profit_loss' => __('profit_loss'),
|
||||
'balance_sheet' => __('balance_sheet'),
|
||||
'vat_report' => __('vat_report')
|
||||
],
|
||||
'HR' => [
|
||||
'hr_departments' => 'Departments',
|
||||
'hr_employees' => 'Employees',
|
||||
'hr_attendance' => 'Attendance',
|
||||
'hr_payroll' => 'Payroll'
|
||||
'hr_departments' => __('departments'),
|
||||
'hr_employees' => __('employees'),
|
||||
'hr_attendance' => __('attendance'),
|
||||
'hr_payroll' => __('payroll')
|
||||
],
|
||||
'Reports' => [
|
||||
'customer_statement' => 'Customer Statement',
|
||||
'supplier_statement' => 'Supplier Statement',
|
||||
'expense_report' => 'Expense Report',
|
||||
'cashflow_report' => 'Cashflow Report',
|
||||
'expiry_report' => 'Expiry Report',
|
||||
'low_stock_report' => 'Low Stock Report',
|
||||
'loyalty_history' => 'Loyalty History'
|
||||
'customer_statement' => __('customer_statement'),
|
||||
'supplier_statement' => __('supplier_statement'),
|
||||
'expense_report' => __('expense_report'),
|
||||
'cashflow_report' => __('cashflow_report'),
|
||||
'expiry_report' => __('expiry_report'),
|
||||
'low_stock_report' => __('low_stock_report'),
|
||||
'loyalty_history' => __('loyalty_history')
|
||||
],
|
||||
'Settings' => [
|
||||
'payment_methods' => 'Payment Methods',
|
||||
'devices' => 'Biometric Devices',
|
||||
'settings' => 'Company Settings'
|
||||
'payment_methods' => __('payment_methods'),
|
||||
'devices' => __('devices'),
|
||||
'settings' => __('settings')
|
||||
],
|
||||
'Administration' => [
|
||||
'role_groups' => 'Role Groups',
|
||||
'users' => 'Users',
|
||||
'cash_registers' => 'Cash Registers',
|
||||
'register_sessions' => 'Register Sessions',
|
||||
'role_groups' => __('role_groups'),
|
||||
'users' => __('users'),
|
||||
'cash_registers' => __('cash_registers'),
|
||||
'register_sessions' => __('register_sessions'),
|
||||
'logs' => 'System Logs'
|
||||
]
|
||||
];
|
||||
@ -2992,6 +2992,30 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="assets/css/custom.css?v=<?= time() ?>">
|
||||
<style>
|
||||
/* Force RTL Sidebar Position */
|
||||
[dir="rtl"] .sidebar {
|
||||
right: 0 !important;
|
||||
left: auto !important;
|
||||
}
|
||||
[dir="rtl"] .main-content {
|
||||
margin-left: 0 !important;
|
||||
margin-right: 210px !important;
|
||||
}
|
||||
@media (max-width: 1199.98px) {
|
||||
[dir="rtl"] .sidebar {
|
||||
right: -210px !important;
|
||||
left: auto !important;
|
||||
}
|
||||
[dir="rtl"] .sidebar.show {
|
||||
right: 0 !important;
|
||||
left: auto !important;
|
||||
}
|
||||
[dir="rtl"] .main-content {
|
||||
margin-right: 0 !important;
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media print {
|
||||
.sidebar, .topbar, .d-print-none, .no-print, .btn-group, .btn, .badge i { display: none !important; }
|
||||
.main-content { margin: 0 !important; padding: 0 !important; background: white !important; width: 100% !important; }
|
||||
@ -3362,6 +3386,9 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
<li><a class="dropdown-item d-flex align-items-center theme-select" href="#" data-theme="ocean"><span class="rounded-circle me-2" style="width:12px; height:12px; background:#083344;"></span> <?= $lang === 'ar' ? 'محيط' : 'Ocean' ?></a></li>
|
||||
<li><a class="dropdown-item d-flex align-items-center theme-select" href="#" data-theme="forest"><span class="rounded-circle me-2" style="width:12px; height:12px; background:#064e3b;"></span> <?= $lang === 'ar' ? 'غابة' : 'Forest' ?></a></li>
|
||||
<li><a class="dropdown-item d-flex align-items-center theme-select" href="#" data-theme="sunset"><span class="rounded-circle me-2" style="width:12px; height:12px; background:#451a03;"></span> <?= $lang === 'ar' ? 'غروب' : 'Sunset' ?></a></li>
|
||||
<li><a class="dropdown-item d-flex align-items-center theme-select" href="#" data-theme="nord"><span class="rounded-circle me-2" style="width:12px; height:12px; background:#88c0d0;"></span> <?= $lang === 'ar' ? 'نورد' : 'Nord' ?></a></li>
|
||||
<li><a class="dropdown-item d-flex align-items-center theme-select" href="#" data-theme="dracula"><span class="rounded-circle me-2" style="width:12px; height:12px; background:#bd93f9;"></span> <?= $lang === 'ar' ? 'دراكولا' : 'Dracula' ?></a></li>
|
||||
<li><a class="dropdown-item d-flex align-items-center theme-select" href="#" data-theme="citrus"><span class="rounded-circle me-2" style="width:12px; height:12px; background:#84cc16;"></span> <?= $lang === 'ar' ? 'حمضيات' : 'Citrus' ?></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a href="?lang=<?= $lang === 'ar' ? 'en' : 'ar' ?>" class="btn btn-outline-secondary btn-sm me-3">
|
||||
@ -5988,9 +6015,9 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
<?php elseif ($page === 'customer_statement' || $page === 'supplier_statement'): ?>
|
||||
<div class="card p-4">
|
||||
<div class="d-flex justify-content-between align-items-center mb-4 d-print-none">
|
||||
<h5 class="m-0" data-en="<?= $currTitle['en'] ?>" data-ar="<?= $currTitle['ar'] ?>"><?= $currTitle['en'] ?></h5>
|
||||
<h5 class="m-0" data-en="<?= $currTitle['en'] ?>" data-ar="<?= $currTitle['ar'] ?>"><?= $lang === 'ar' ? $currTitle['ar'] : $currTitle['en'] ?></h5>
|
||||
<button class="btn btn-outline-secondary d-print-none" onclick="window.print()">
|
||||
<i class="bi bi-printer"></i> <span data-en="Print" data-ar="طباعة">Print</span>
|
||||
<i class="bi bi-printer"></i> <span data-en="Print" data-ar="طباعة"><?= $lang === 'ar' ? 'طباعة' : 'Print' ?></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@ -5998,7 +6025,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
<form method="GET" class="row g-3 align-items-end">
|
||||
<input type="hidden" name="page" value="<?= $page ?>">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label small fw-bold" data-en="Select <?= $page === 'customer_statement' ? 'Customer' : 'Supplier' ?>" data-ar="اختر <?= $page === 'customer_statement' ? 'العميل' : 'المورد' ?>">Select <?= $page === 'customer_statement' ? 'Customer' : 'Supplier' ?></label>
|
||||
<label class="form-label small fw-bold" data-en="Select <?= $page === 'customer_statement' ? 'Customer' : 'Supplier' ?>" data-ar="اختر <?= $page === 'customer_statement' ? 'العميل' : 'المورد' ?>"><?= $lang === 'ar' ? ($page === 'customer_statement' ? 'اختر العميل' : 'اختر المورد') : 'Select ' . ($page === 'customer_statement' ? 'Customer' : 'Supplier') ?></label>
|
||||
<select name="entity_id" class="form-select select2" required>
|
||||
<option value="">---</option>
|
||||
<?php foreach ($data['entities'] as $e): ?>
|
||||
@ -6007,16 +6034,16 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label small fw-bold" data-en="From Date" data-ar="من تاريخ">From Date</label>
|
||||
<label class="form-label small fw-bold" data-en="From Date" data-ar="من تاريخ"><?= $lang === 'ar' ? 'من تاريخ' : 'From Date' ?></label>
|
||||
<input type="date" name="start_date" class="form-control" value="<?= htmlspecialchars($_GET['start_date'] ?? date('Y-m-01')) ?>">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label small fw-bold" data-en="To Date" data-ar="إلى تاريخ">To Date</label>
|
||||
<label class="form-label small fw-bold" data-en="To Date" data-ar="إلى تاريخ"><?= $lang === 'ar' ? 'إلى تاريخ' : 'To Date' ?></label>
|
||||
<input type="date" name="end_date" class="form-control" value="<?= htmlspecialchars($_GET['end_date'] ?? date('Y-m-d')) ?>">
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<button type="submit" class="btn btn-primary w-100">
|
||||
<i class="bi bi-search"></i> <span data-en="View Report" data-ar="عرض التقرير">View Report</span>
|
||||
<i class="bi bi-search"></i> <span data-en="View Report" data-ar="عرض التقرير"><?= $lang === 'ar' ? 'عرض التقرير' : 'View Report' ?></span>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
@ -6030,21 +6057,21 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
<p class="text-muted small"><?= nl2br(htmlspecialchars($data['settings']['company_address'] ?? '')) ?></p>
|
||||
</div>
|
||||
<div class="col-6 text-end">
|
||||
<h2 class="text-uppercase text-muted" data-en="Statement of Account" data-ar="كشف حساب">Statement of Account</h2>
|
||||
<h2 class="text-uppercase text-muted" data-en="Statement of Account" data-ar="كشف حساب"><?= $lang === 'ar' ? 'كشف حساب' : 'Statement of Account' ?></h2>
|
||||
<p class="mb-0"><strong><?= htmlspecialchars($data['selected_entity']['name']) ?></strong></p>
|
||||
<p class="text-muted small"><?= htmlspecialchars($data['selected_entity']['email']) ?> | <?= htmlspecialchars($data['selected_entity']['phone']) ?><br><span data-en="Period" data-ar="الفترة">Period</span>: <?= $_GET['start_date'] ?> <span data-en="to" data-ar="إلى">to</span> <?= $_GET['end_date'] ?></p>
|
||||
<p class="text-muted small"><?= htmlspecialchars($data['selected_entity']['email']) ?> | <?= htmlspecialchars($data['selected_entity']['phone']) ?><br><span data-en="Period" data-ar="الفترة"><?= $lang === 'ar' ? 'الفترة' : 'Period' ?></span>: <?= $_GET['start_date'] ?> <span data-en="to" data-ar="إلى"><?= $lang === 'ar' ? 'إلى' : 'to' ?></span> <?= $_GET['end_date'] ?></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-sm">
|
||||
<thead class="bg-light">
|
||||
<tr>
|
||||
<th data-en="Date" data-ar="التاريخ">Date</th>
|
||||
<th data-en="Reference" data-ar="المرجع">Reference</th>
|
||||
<th data-en="Description" data-ar="الوصف">Description</th>
|
||||
<th data-en="Debit" data-ar="مدين" class="text-end">Debit</th>
|
||||
<th data-en="Credit" data-ar="دائن" class="text-end">Credit</th>
|
||||
<th data-en="Balance" data-ar="الرصيد" class="text-end">Balance</th>
|
||||
<th data-en="Date" data-ar="التاريخ"><?= $lang === 'ar' ? 'التاريخ' : 'Date' ?></th>
|
||||
<th data-en="Reference" data-ar="المرجع"><?= $lang === 'ar' ? 'المرجع' : 'Reference' ?></th>
|
||||
<th data-en="Description" data-ar="الوصف"><?= $lang === 'ar' ? 'الوصف' : 'Description' ?></th>
|
||||
<th data-en="Debit" data-ar="مدين" class="text-end"><?= $lang === 'ar' ? 'مدين' : 'Debit' ?></th>
|
||||
<th data-en="Credit" data-ar="دائن" class="text-end"><?= $lang === 'ar' ? 'دائن' : 'Credit' ?></th>
|
||||
<th data-en="Balance" data-ar="الرصيد" class="text-end"><?= $lang === 'ar' ? 'الرصيد' : 'Balance' ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -6064,20 +6091,20 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
<td><?= $t['trans_type'] === 'invoice' ? ($page === 'supplier_statement' ? 'PUR-' : 'INV-').str_pad((string)$t['ref_no'], 5, '0', STR_PAD_LEFT) : 'RCP-'.str_pad((string)$t['id'], 5, '0', STR_PAD_LEFT) ?></td>
|
||||
<td>
|
||||
<?php if ($t['trans_type'] === 'invoice'): ?>
|
||||
<span data-en="Tax Invoice" data-ar="فاتورة ضريبية">Tax Invoice</span>
|
||||
<span data-en="Tax Invoice" data-ar="فاتورة ضريبية"><?= $lang === 'ar' ? 'فاتورة ضريبية' : 'Tax Invoice' ?></span>
|
||||
<?php else: ?>
|
||||
<span data-en="Payment" data-ar="دفع">Payment</span> - <span data-en="<?= $t['payment_method'] ?>" data-ar="<?= $t['payment_method'] === 'cash' ? 'نقد' : ($t['payment_method'] === 'card' ? 'بطاقة ائتمان' : 'آجل') ?>"><?= $t['payment_method'] ?></span>
|
||||
<span data-en="Payment" data-ar="دفع"><?= $lang === 'ar' ? 'دفع' : 'Payment' ?></span> - <span data-en="<?= $t['payment_method'] ?>" data-ar="<?= $t['payment_method'] === 'cash' ? 'نقد' : ($t['payment_method'] === 'card' ? 'بطاقة ائتمان' : 'آجل') ?>"><?= $lang === 'ar' ? ($t['payment_method'] === 'cash' ? 'نقد' : ($t['payment_method'] === 'card' ? 'بطاقة ائتمان' : 'آجل')) : $t['payment_method'] ?></span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td class="text-end"><?= $debit > 0 ? number_format($debit, 3) : '' ?></td>
|
||||
<td class="text-end"><?= $credit > 0 ? number_format($credit, 3) : '' ?></td>
|
||||
<td class="text-end fw-bold"><?= number_format($running_balance, 3) ?></td>
|
||||
<td class="text-end"><?= number_format($debit, 3) ?></td>
|
||||
<td class="text-end"><?= number_format($credit, 3) ?></td>
|
||||
<td class="text-end"><?= number_format($running_balance, 3) ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
<tfoot class="bg-light fw-bold">
|
||||
<tr>
|
||||
<td colspan="5" class="text-end" data-en="Closing Balance" data-ar="رصيد الإقفال">Closing Balance</td>
|
||||
<td colspan="5" class="text-end" data-en="Closing Balance" data-ar="رصيد الإقفال"><?= $lang === 'ar' ? 'رصيد الإقفال' : 'Closing Balance' ?></td>
|
||||
<td class="text-end">OMR <?= number_format($running_balance, 3) ?></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
|
||||
@ -180,3 +180,16 @@
|
||||
2026-02-21 08:21:09 - POST: {"text":"Hello","target":"ar"}
|
||||
2026-02-21 08:22:20 - POST: {"text":"Hello","target":"ar"}
|
||||
2026-02-21 08:24:11 - POST: {"name_en":"green onion","name_ar":"\u0628\u0635\u0644 \u0627\u062e\u0636\u0631","category_id":"2","unit_id":"1","supplier_id":"8","sku":"778690168233","sale_price":"0.1","purchase_price":"0.08","stock_quantity":"0.000","min_stock_level":"0.000","vat_rate":"5","expiry_date":"","promotion_start":"","promotion_end":"","promotion_percent":"0.00","add_item":""}
|
||||
2026-02-21 09:33:25 - POST: {"name_en":"green onion","name_ar":"\u0628\u0635\u0644 \u0627\u062e\u0636\u0631","category_id":"2","unit_id":"1","supplier_id":"8","sku":"778690168233","sale_price":"0.1","purchase_price":"0.08","stock_quantity":"0.000","min_stock_level":"0.000","vat_rate":"5","expiry_date":"","promotion_start":"","promotion_end":"","promotion_percent":"0.00","add_item":""}
|
||||
2026-02-21 09:53:07 - POST: {"action":"save_theme","theme":"dark"}
|
||||
2026-02-21 09:53:13 - POST: {"action":"save_theme","theme":"default"}
|
||||
2026-02-21 09:57:48 - POST: {"action":"save_theme","theme":"dark"}
|
||||
2026-02-21 09:57:59 - POST: {"action":"save_theme","theme":"citrus"}
|
||||
2026-02-21 09:58:03 - POST: {"action":"save_theme","theme":"nord"}
|
||||
2026-02-21 09:58:06 - POST: {"action":"save_theme","theme":"nord"}
|
||||
2026-02-21 09:58:08 - POST: {"action":"save_theme","theme":"dracula"}
|
||||
2026-02-21 09:58:11 - POST: {"action":"save_theme","theme":"ocean"}
|
||||
2026-02-21 09:58:17 - POST: {"action":"save_theme","theme":"default"}
|
||||
2026-02-21 09:58:21 - POST: {"action":"save_theme","theme":"forest"}
|
||||
2026-02-21 09:58:24 - POST: {"action":"save_theme","theme":"dracula"}
|
||||
2026-02-21 09:58:32 - POST: {"action":"save_theme","theme":"default"}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user