39 lines
2.1 KiB
PHP
39 lines
2.1 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
require_once __DIR__ . '/app.php';
|
|
require_permission('stock');
|
|
|
|
$movements = fetch_records('stock_movement');
|
|
render_header('حركات المخزون', 'سجل مركزي لكل خصم وإضافة على المخزون من المبيعات والمشتريات.', 'stock');
|
|
?>
|
|
<div class="panel-card">
|
|
<div class="section-header">
|
|
<div>
|
|
<h1 class="section-title">سجل حركات المخزون</h1>
|
|
<p class="section-copy">كل حركة تعرض الكمية قبل وبعد العملية مع المرجع المرتبط بها.</p>
|
|
</div>
|
|
</div>
|
|
<?php if ($movements): ?>
|
|
<div class="table-responsive">
|
|
<table class="table align-middle app-table">
|
|
<thead><tr><th>المرجع</th><th>الصنف</th><th>نوع الحركة</th><th>التغيير</th><th>قبل / بعد</th><th>المنشئ</th></tr></thead>
|
|
<tbody>
|
|
<?php foreach ($movements as $movement): $payload = $movement['payload_data']; $delta = (float)($payload['qty_change'] ?? 0); ?>
|
|
<tr>
|
|
<td><div class="fw-semibold"><?= e($payload['reference_code'] ?? $movement['code']) ?></div><div class="small text-secondary"><?= e(substr((string)($movement['created_at'] ?? ''), 0, 16)) ?></div></td>
|
|
<td><?= e($payload['product_name'] ?? '') ?><div class="small text-secondary"><?= e($payload['sku'] ?? '') ?></div></td>
|
|
<td><?= e($payload['movement_type'] ?? '') ?></td>
|
|
<td><span class="badge <?= e(movement_badge_class($delta)) ?>"><?= e(movement_direction_label($delta)) ?></span><div class="small mt-1"><?= e((string)$delta) ?> <?= e($payload['unit'] ?? '') ?></div></td>
|
|
<td><?= e((string)($payload['qty_before'] ?? 0)) ?> → <?= e((string)($payload['qty_after'] ?? 0)) ?></td>
|
|
<td><?= e($payload['created_by'] ?? '') ?></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<?php else: ?>
|
|
<div class="empty-inline">لا توجد حركات مخزون بعد. أنشئ أمر شراء أو أمر بيع لتظهر هنا.</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php render_footer(); ?>
|