adding low level items report
This commit is contained in:
parent
17c3515c4a
commit
05f00caf70
@ -253,6 +253,21 @@ body {
|
||||
text-align: right !important;
|
||||
}
|
||||
|
||||
[dir="rtl"] .me-3 {
|
||||
margin-right: 0 !important;
|
||||
margin-left: 1rem !important;
|
||||
}
|
||||
|
||||
[dir="rtl"] .me-2 {
|
||||
margin-right: 0 !important;
|
||||
margin-left: 0.5rem !important;
|
||||
}
|
||||
|
||||
[dir="rtl"] .ms-2 {
|
||||
margin-left: 0 !important;
|
||||
margin-right: 0.5rem !important;
|
||||
}
|
||||
|
||||
/* Thermal Receipt Styles */
|
||||
.thermal-receipt {
|
||||
width: 80mm;
|
||||
|
||||
108
index.php
108
index.php
@ -2021,6 +2021,16 @@ switch ($page) {
|
||||
$stmt->execute($params);
|
||||
$data['expiry_items'] = $stmt->fetchAll();
|
||||
break;
|
||||
case 'low_stock_report':
|
||||
$stmt = db()->prepare("SELECT i.*, c.name_en as cat_en, c.name_ar as cat_ar, s.name as supplier_name
|
||||
FROM stock_items i
|
||||
LEFT JOIN stock_categories c ON i.category_id = c.id
|
||||
LEFT JOIN customers s ON i.supplier_id = s.id AND s.type = 'supplier'
|
||||
WHERE i.stock_quantity <= i.min_stock_level
|
||||
ORDER BY (i.min_stock_level - i.stock_quantity) DESC");
|
||||
$stmt->execute();
|
||||
$data['low_stock_items'] = $stmt->fetchAll();
|
||||
break;
|
||||
case 'cashflow_report':
|
||||
$start_date = $_GET['start_date'] ?? date('Y-m-01');
|
||||
$end_date = $_GET['end_date'] ?? date('Y-m-d');
|
||||
@ -2096,6 +2106,7 @@ switch ($page) {
|
||||
'total_paid' => db()->query("SELECT SUM(amount) FROM payments p JOIN invoices i ON p.invoice_id = i.id WHERE i.type = 'purchase'")->fetchColumn() ?: 0,
|
||||
'expired_items' => db()->query("SELECT COUNT(*) FROM stock_items WHERE expiry_date IS NOT NULL AND expiry_date <= CURDATE()")->fetchColumn(),
|
||||
'near_expiry_items' => db()->query("SELECT COUNT(*) FROM stock_items WHERE expiry_date IS NOT NULL AND expiry_date > CURDATE() AND expiry_date <= DATE_ADD(CURDATE(), INTERVAL 30 DAY)")->fetchColumn(),
|
||||
'low_stock_items_count' => db()->query("SELECT COUNT(*) FROM stock_items WHERE stock_quantity <= min_stock_level")->fetchColumn(),
|
||||
];
|
||||
$data['stats']['total_receivable'] = $data['stats']['total_sales'] - $data['stats']['total_received'];
|
||||
$data['stats']['total_payable'] = $data['stats']['total_purchases'] - $data['stats']['total_paid'];
|
||||
@ -2128,6 +2139,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/jsbarcode@3.11.5/dist/JsBarcode.all.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||
<script src="assets/js/main.js?v=<?php echo time(); ?>"></script>
|
||||
<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=<?php echo time(); ?>">
|
||||
<style>
|
||||
@ -2259,6 +2271,9 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
<a href="index.php?page=expiry_report" class="nav-link <?= isset($_GET['page']) && $_GET['page'] === 'expiry_report' ? 'active' : '' ?>">
|
||||
<i class="bi bi-calendar-x"></i> <span data-en="Expiry Report" data-ar="تقرير الانتهاء">Expiry Report</span>
|
||||
</a>
|
||||
<a href="index.php?page=low_stock_report" class="nav-link <?= isset($_GET['page']) && $_GET['page'] === 'low_stock_report' ? 'active' : '' ?>">
|
||||
<i class="bi bi-graph-down-arrow"></i> <span data-en="Low Stock Report" data-ar="تقرير نواقص المخزون">Low Stock Report</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Configuration Section -->
|
||||
@ -2320,6 +2335,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
'customer_statement' => ['en' => 'Customer Statement', 'ar' => 'كشف حساب عميل'],
|
||||
'supplier_statement' => ['en' => 'Supplier Statement', 'ar' => 'كشف حساب مورد'],
|
||||
'expiry_report' => ['en' => 'Expiry Report', 'ar' => 'تقرير انتهاء الصلاحية'],
|
||||
'low_stock_report' => ['en' => 'Low Stock Report', 'ar' => 'تقرير نواقص المخزون'],
|
||||
'settings' => ['en' => 'Company Profile', 'ar' => 'ملف الشركة'],
|
||||
'devices' => ['en' => 'Biometric Devices', 'ar' => 'أجهزة البصمة'],
|
||||
'hr_departments' => ['en' => 'HR Departments', 'ar' => 'أقسام الموارد البشرية'],
|
||||
@ -2375,7 +2391,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
|
||||
<?php if ($page === 'dashboard'): ?>
|
||||
|
||||
<?php if ($data['stats']['expired_items'] > 0 || $data['stats']['near_expiry_items'] > 0): ?>
|
||||
<?php if ($data['stats']['expired_items'] > 0 || $data['stats']['near_expiry_items'] > 0 || $data['stats']['low_stock_items_count'] > 0): ?>
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<div class="alert alert-warning border-0 shadow-sm d-flex align-items-center mb-0">
|
||||
@ -2388,8 +2404,14 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
<?php if ($data['stats']['near_expiry_items'] > 0): ?>
|
||||
<span data-en="<?= $data['stats']['near_expiry_items'] ?> items are expiring soon (within 30 days)." data-ar="هنالك <?= $data['stats']['near_expiry_items'] ?> صنف ستنتهي صلاحيتها قريباً (خلال 30 يوم)."><?= $data['stats']['near_expiry_items'] ?> items are expiring soon (within 30 days).</span>
|
||||
<?php endif; ?>
|
||||
<?php if ($data['stats']['low_stock_items_count'] > 0): ?>
|
||||
<span data-en="<?= $data['stats']['low_stock_items_count'] ?> items are below minimum level." data-ar="هنالك <?= $data['stats']['low_stock_items_count'] ?> صنف تحت الحد الأدنى للمخزون."><?= $data['stats']['low_stock_items_count'] ?> items are below minimum level.</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="d-flex gap-2">
|
||||
<a href="index.php?page=expiry_report" class="btn btn-warning btn-sm" data-en="Expiry Report" data-ar="تقرير الانتهاء">Expiry Report</a>
|
||||
<a href="index.php?page=low_stock_report" class="btn btn-danger btn-sm" data-en="Low Stock Report" data-ar="تقرير النواقص">Low Stock Report</a>
|
||||
</div>
|
||||
<a href="index.php?page=expiry_report" class="btn btn-warning btn-sm" data-en="View Report" data-ar="عرض التقرير">View Report</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -3055,6 +3077,57 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php elseif ($page === 'low_stock_report'): ?>
|
||||
<div class="card p-4">
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h5 class="m-0" data-en="Low Stock Report" data-ar="تقرير نواقص المخزون">Low Stock Report</h5>
|
||||
<button class="btn btn-outline-primary btn-sm d-print-none" onclick="window.print()">
|
||||
<i class="bi bi-printer"></i> <span data-en="Print" data-ar="طباعة">Print</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover align-middle">
|
||||
<thead>
|
||||
<tr>
|
||||
<th data-en="SKU" data-ar="الباركود">SKU</th>
|
||||
<th data-en="Item Name" data-ar="اسم الصنف">Item Name</th>
|
||||
<th data-en="Category" data-ar="الفئة">Category</th>
|
||||
<th data-en="Supplier" data-ar="المورد">Supplier</th>
|
||||
<th data-en="Min Level" data-ar="أدنى مستوى">Min Level</th>
|
||||
<th data-en="Current Stock" data-ar="المخزون الحالي">Current Stock</th>
|
||||
<th data-en="Shortage" data-ar="النقص">Shortage</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if (empty($data['low_stock_items'])): ?>
|
||||
<tr>
|
||||
<td colspan="7" class="text-center text-muted p-4" data-en="All items are above minimum levels." data-ar="جميع الأصناف فوق الحد الأدنى.">All items are above minimum levels.</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($data['low_stock_items'] as $item): ?>
|
||||
<?php $shortage = (float)$item['min_stock_level'] - (float)$item['stock_quantity']; ?>
|
||||
<tr class="<?= (float)$item['stock_quantity'] <= 0 ? 'table-danger' : 'table-warning' ?>">
|
||||
<td><?= htmlspecialchars($item['sku']) ?></td>
|
||||
<td>
|
||||
<div class="fw-bold"><?= htmlspecialchars($item['name_en']) ?></div>
|
||||
<div class="small text-muted"><?= htmlspecialchars($item['name_ar']) ?></div>
|
||||
</td>
|
||||
<td><?= htmlspecialchars($item['cat_en'] ?? '---') ?></td>
|
||||
<td><?= htmlspecialchars($item['supplier_name'] ?? '---') ?></td>
|
||||
<td><?= number_format((float)$item['min_stock_level'], 2) ?></td>
|
||||
<td>
|
||||
<span class="badge <?= (float)$item['stock_quantity'] <= 0 ? 'bg-danger' : 'bg-warning text-dark' ?>">
|
||||
<?= number_format((float)$item['stock_quantity'], 3) ?>
|
||||
</span>
|
||||
</td>
|
||||
<td class="fw-bold text-danger"><?= number_format($shortage, 3) ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php elseif ($page === 'pos'): ?>
|
||||
<?php
|
||||
$products = db()->query("SELECT * FROM stock_items WHERE stock_quantity > 0 ORDER BY name_en ASC")->fetchAll(PDO::FETCH_ASSOC);
|
||||
@ -4439,6 +4512,9 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
<a href="index.php?page=accounting&view=balance_sheet" class="btn <?= isset($_GET['view']) && $_GET['view'] === 'balance_sheet' ? 'btn-primary' : 'btn-outline-primary' ?>" data-en="Balance Sheet" data-ar="الميزانية">Balance Sheet</a>
|
||||
<a href="index.php?page=accounting&view=vat_report" class="btn <?= isset($_GET['view']) && $_GET['view'] === 'vat_report' ? 'btn-primary' : 'btn-outline-primary' ?>" data-en="VAT Report" data-ar="تقرير الضريبة">VAT Report</a>
|
||||
</div>
|
||||
<button class="btn btn-outline-secondary" onclick="window.print()">
|
||||
<i class="bi bi-printer"></i> <span data-en="Print" data-ar="طباعة">Print</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -4453,25 +4529,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<form method="POST" onsubmit="return confirm('This will re-calculate all automatic journal entries from scratch. Continue?')">
|
||||
<button type="submit" name="sync_accounting" class="btn btn-outline-warning">
|
||||
<i class="bi bi-arrow-repeat"></i> <span data-en="Sync All" data-ar="مزامنة الكل">Sync All</span>
|
||||
</button>
|
||||
</form>
|
||||
<button class="btn btn-success" data-bs-toggle="modal" data-bs-target="#addManualJournalModal">
|
||||
<i class="bi bi-plus-lg"></i> <span data-en="Manual Entry" data-ar="قيد يدوي">Manual Entry</span>
|
||||
</button>
|
||||
<div class="btn-group">
|
||||
<a href="index.php?page=accounting" class="btn <?= !isset($_GET['view']) ? 'btn-primary' : 'btn-outline-primary' ?>" data-en="Journal" data-ar="اليومية">Journal</a>
|
||||
<a href="index.php?page=accounting&view=coa" class="btn <?= isset($_GET['view']) && $_GET['view'] === 'coa' ? 'btn-primary' : 'btn-outline-primary' ?>" data-en="Accounts" data-ar="الحسابات">Accounts</a>
|
||||
<a href="index.php?page=accounting&view=trial_balance" class="btn <?= isset($_GET['view']) && $_GET['view'] === 'trial_balance' ? 'btn-primary' : 'btn-outline-primary' ?>" data-en="Trial Balance" data-ar="ميزان المراجعة">Trial Balance</a>
|
||||
<a href="index.php?page=accounting&view=profit_loss" class="btn <?= isset($_GET['view']) && $_GET['view'] === 'profit_loss' ? 'btn-primary' : 'btn-outline-primary' ?>" data-en="P&L" data-ar="الأرباح">P&L</a>
|
||||
<a href="index.php?page=accounting&view=balance_sheet" class="btn <?= isset($_GET['view']) && $_GET['view'] === 'balance_sheet' ? 'btn-primary' : 'btn-outline-primary' ?>" data-en="Balance Sheet" data-ar="الميزانية">Balance Sheet</a>
|
||||
<a href="index.php?page=accounting&view=vat_report" class="btn <?= isset($_GET['view']) && $_GET['view'] === 'vat_report' ? 'btn-primary' : 'btn-outline-primary' ?>" data-en="VAT Report" data-ar="تقرير الضريبة">VAT Report</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<?php if (!isset($_GET['view'])): ?>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover align-middle">
|
||||
@ -4538,7 +4596,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
<?php elseif ($_GET['view'] === 'vat_report'): ?>
|
||||
<div class="row">
|
||||
<div class="col-md-6 mx-auto">
|
||||
<div class="bg-light p-3 rounded mb-4">
|
||||
<div class="bg-light p-3 rounded mb-4 d-print-none">
|
||||
<form method="GET" class="row g-2">
|
||||
<input type="hidden" name="page" value="accounting">
|
||||
<input type="hidden" name="view" value="vat_report">
|
||||
@ -4555,7 +4613,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
</div>
|
||||
<div class="card shadow-sm border-0">
|
||||
<div class="card-body">
|
||||
<h4 class="text-center mb-4">VAT Summary Report</h4>
|
||||
<h4 class="text-center mb-4 d-print-none">VAT Summary Report</h4>
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th data-en="VAT Input (Purchases)" data-ar="ضريبة المدخلات (المشتريات)">VAT Input (Purchases)</th>
|
||||
@ -4619,7 +4677,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
<div class="col-md-8 mx-auto">
|
||||
<div class="card bg-light">
|
||||
<div class="card-body">
|
||||
<h4 class="text-center mb-4" data-en="Profit & Loss Statement" data-ar="قائمة الأرباح والخسائر">Profit & Loss Statement</h4>
|
||||
<h4 class="text-center mb-4 d-print-none" data-en="Profit & Loss Statement" data-ar="قائمة الأرباح والخسائر">Profit & Loss Statement</h4>
|
||||
<table class="table">
|
||||
<tr class="table-primary"><th colspan="2" data-en="Revenue" data-ar="الإيرادات">Revenue</th></tr>
|
||||
<?php
|
||||
@ -4671,7 +4729,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
||||
<div class="col-md-10 mx-auto">
|
||||
<div class="card bg-light">
|
||||
<div class="card-body">
|
||||
<h4 class="text-center mb-4" data-en="Balance Sheet" data-ar="الميزانية العمومية">Balance Sheet</h4>
|
||||
<h4 class="text-center mb-4 d-print-none" data-en="Balance Sheet" data-ar="الميزانية العمومية">Balance Sheet</h4>
|
||||
<div class="row">
|
||||
<div class="col-md-6 border-end">
|
||||
<h5 class="text-primary border-bottom pb-2" data-en="Assets" data-ar="الأصول">Assets</h5>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user