items back
This commit is contained in:
parent
259f6c425e
commit
8a346582bb
BIN
assets/pasted-20260221-173518-a5e18486.png
Normal file
BIN
assets/pasted-20260221-173518-a5e18486.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
4
db/migrations/20260221_fix_invoice_items_columns.sql
Normal file
4
db/migrations/20260221_fix_invoice_items_columns.sql
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
-- Fix missing columns in invoice_items table
|
||||||
|
-- Date: 2026-02-21
|
||||||
|
|
||||||
|
ALTER TABLE invoice_items ADD COLUMN IF NOT EXISTS vat_amount DECIMAL(15,3) DEFAULT 0.000 AFTER unit_price;
|
||||||
14
db/migrations/20260221_fix_pos_invoices_columns.sql
Normal file
14
db/migrations/20260221_fix_pos_invoices_columns.sql
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
-- Fix missing columns in invoices table for POS transactions
|
||||||
|
-- Date: 2026-02-21
|
||||||
|
|
||||||
|
ALTER TABLE invoices ADD COLUMN IF NOT EXISTS transaction_no VARCHAR(50) DEFAULT NULL AFTER id;
|
||||||
|
ALTER TABLE invoices ADD COLUMN IF NOT EXISTS register_session_id INT(11) DEFAULT NULL;
|
||||||
|
ALTER TABLE invoices ADD COLUMN IF NOT EXISTS is_pos TINYINT(1) DEFAULT 0;
|
||||||
|
ALTER TABLE invoices ADD COLUMN IF NOT EXISTS discount_amount DECIMAL(15,3) DEFAULT 0.000;
|
||||||
|
ALTER TABLE invoices ADD COLUMN IF NOT EXISTS loyalty_points_earned DECIMAL(15,3) DEFAULT 0.000;
|
||||||
|
ALTER TABLE invoices ADD COLUMN IF NOT EXISTS loyalty_points_redeemed DECIMAL(15,3) DEFAULT 0.000;
|
||||||
|
ALTER TABLE invoices ADD COLUMN IF NOT EXISTS created_by INT(11) DEFAULT NULL;
|
||||||
|
|
||||||
|
-- Ensure indexes for better performance
|
||||||
|
ALTER TABLE invoices ADD INDEX IF NOT EXISTS idx_transaction_no (transaction_no);
|
||||||
|
ALTER TABLE invoices ADD INDEX IF NOT EXISTS idx_register_session (register_session_id);
|
||||||
4
debug.log
Normal file
4
debug.log
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
2026-02-21 17:52:10 - Items case hit
|
||||||
|
2026-02-21 17:52:37 - Items case hit
|
||||||
|
2026-02-21 17:53:18 - Items case hit
|
||||||
|
2026-02-21 18:10:28 - Items case hit
|
||||||
17
debug_items.php
Normal file
17
debug_items.php
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
require_once 'db/config.php';
|
||||||
|
$whereSql = "1=1";
|
||||||
|
$params = [];
|
||||||
|
$stmt = db()->prepare("SELECT i.*, c.name_en as cat_en, c.name_ar as cat_ar, u.short_name_en as unit_en, u.short_name_ar as unit_ar, s.name as supplier_name
|
||||||
|
FROM stock_items i
|
||||||
|
LEFT JOIN stock_categories c ON i.category_id = c.id
|
||||||
|
LEFT JOIN stock_units u ON i.unit_id = u.id
|
||||||
|
LEFT JOIN suppliers s ON i.supplier_id = s.id
|
||||||
|
WHERE $whereSql
|
||||||
|
ORDER BY i.id DESC");
|
||||||
|
$stmt->execute($params);
|
||||||
|
$items = $stmt->fetchAll();
|
||||||
|
echo "Count: " . count($items) . "\n";
|
||||||
|
foreach ($items as $item) {
|
||||||
|
echo "ID: {$item['id']}, Name: {$item['name_en']}\n";
|
||||||
|
}
|
||||||
46
index.php
46
index.php
@ -2468,6 +2468,7 @@ switch ($page) {
|
|||||||
// Already fetched globally
|
// Already fetched globally
|
||||||
break;
|
break;
|
||||||
case 'items':
|
case 'items':
|
||||||
|
file_put_contents('debug.log', date('Y-m-d H:i:s') . " - Items case hit\n", FILE_APPEND);
|
||||||
$where = ["1=1"];
|
$where = ["1=1"];
|
||||||
$params = [];
|
$params = [];
|
||||||
if (!empty($_GET['search'])) {
|
if (!empty($_GET['search'])) {
|
||||||
@ -3795,8 +3796,8 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
<tbody>
|
<tbody>
|
||||||
<?php foreach ($data['customers'] as $c): ?>
|
<?php foreach ($data['customers'] as $c): ?>
|
||||||
<tr>
|
<tr>
|
||||||
<td><?= htmlspecialchars($c['name']) ?></td>
|
<td><?= htmlspecialchars((string)($c['name'] ?? '')) ?></td>
|
||||||
<td><?= htmlspecialchars($c['phone']) ?></td>
|
<td><?= htmlspecialchars((string)($c['phone'] ?? '')) ?></td>
|
||||||
<td class="text-end" data-en="OMR <?= number_format((float)$c['balance'], 3) ?>" data-ar="<?= number_format((float)$c['balance'], 3) ?> ر.ع."><?= $lang === 'ar' ? number_format((float)$c['balance'], 3) . ' ر.ع.' : 'OMR ' . number_format((float)$c['balance'], 3) ?></td>
|
<td class="text-end" data-en="OMR <?= number_format((float)$c['balance'], 3) ?>" data-ar="<?= number_format((float)$c['balance'], 3) ?> ر.ع."><?= $lang === 'ar' ? number_format((float)$c['balance'], 3) . ' ر.ع.' : 'OMR ' . number_format((float)$c['balance'], 3) ?></td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
@ -3900,10 +3901,10 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
<tbody>
|
<tbody>
|
||||||
<?php foreach ($data['customers'] as $c): ?>
|
<?php foreach ($data['customers'] as $c): ?>
|
||||||
<tr>
|
<tr>
|
||||||
<td><?= htmlspecialchars($c['name']) ?></td>
|
<td><?= htmlspecialchars((string)($c['name'] ?? '')) ?></td>
|
||||||
<td><?= htmlspecialchars($c['tax_id'] ?? '---') ?></td>
|
<td><?= htmlspecialchars((string)($c['tax_id'] ?? '---')) ?></td>
|
||||||
<td><?= htmlspecialchars($c['email']) ?></td>
|
<td><?= htmlspecialchars((string)($c['email'] ?? '')) ?></td>
|
||||||
<td><?= htmlspecialchars($c['phone']) ?></td>
|
<td><?= htmlspecialchars((string)($c['phone'] ?? '')) ?></td>
|
||||||
<td class="text-end" data-en="OMR <?= number_format((float)$c['balance'], 3) ?>" data-ar="<?= number_format((float)$c['balance'], 3) ?> ر.ع."><?= $lang === 'ar' ? number_format((float)$c['balance'], 3) . ' ر.ع.' : 'OMR ' . number_format((float)$c['balance'], 3) ?></td>
|
<td class="text-end" data-en="OMR <?= number_format((float)$c['balance'], 3) ?>" data-ar="<?= number_format((float)$c['balance'], 3) ?> ر.ع."><?= $lang === 'ar' ? number_format((float)$c['balance'], 3) . ' ر.ع.' : 'OMR ' . number_format((float)$c['balance'], 3) ?></td>
|
||||||
<td class="text-end">
|
<td class="text-end">
|
||||||
<div class="btn-group btn-group-sm">
|
<div class="btn-group btn-group-sm">
|
||||||
@ -4166,7 +4167,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
<?php elseif ($page === 'items'): ?>
|
<?php elseif ($page === 'items'): ?>
|
||||||
<div class="card p-4">
|
<div class="card p-4">
|
||||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||||
<h5 class="m-0" data-en="Stock Items" data-ar="أصناف المخزون">Stock Items</h5>
|
<h5 class="m-0" data-en="Stock Items" data-ar="أصناف المخزون">Stock Items (<?= count($data['items'] ?? []) ?>)</h5>
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<button class="btn btn-dark me-2" id="bulkBarcodeBtn" style="display:none;" onclick="openAveryModal()">
|
<button class="btn btn-dark me-2" id="bulkBarcodeBtn" style="display:none;" onclick="openAveryModal()">
|
||||||
<i class="bi bi-printer"></i> <span data-en="Avery Labels" data-ar="ملصقات إيفري">Avery Labels</span>
|
<i class="bi bi-printer"></i> <span data-en="Avery Labels" data-ar="ملصقات إيفري">Avery Labels</span>
|
||||||
@ -4252,15 +4253,15 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
<td><?= htmlspecialchars($item['sku']) ?></td>
|
<td><?= htmlspecialchars($item['sku']) ?></td>
|
||||||
<td>
|
<td>
|
||||||
<div class="fw-bold">
|
<div class="fw-bold">
|
||||||
<?= htmlspecialchars($item['name_en']) ?>
|
<?= htmlspecialchars((string)($item['name_en'] ?? '')) ?>
|
||||||
<?php if (isset($item['is_promotion']) && $item['is_promotion']): ?>
|
<?php if (isset($item['is_promotion']) && $item['is_promotion']): ?>
|
||||||
<span class="badge bg-success ms-1" style="font-size: 0.65rem;" data-en="Promo" data-ar="عرض">Promo</span>
|
<span class="badge bg-success ms-1" style="font-size: 0.65rem;" data-en="Promo" data-ar="عرض">Promo</span>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="small text-muted"><?= htmlspecialchars($item['name_ar']) ?></div>
|
<div class="small text-muted"><?= htmlspecialchars((string)($item['name_ar'] ?? '')) ?></div>
|
||||||
</td>
|
</td>
|
||||||
<td><span data-en="<?= htmlspecialchars($item['cat_en']) ?>" data-ar="<?= htmlspecialchars($item['cat_ar']) ?>"><?= htmlspecialchars($item['cat_en']) ?></span></td>
|
<td><span data-en="<?= htmlspecialchars((string)($item['cat_en'] ?? '')) ?>" data-ar="<?= htmlspecialchars((string)($item['cat_ar'] ?? '')) ?>"><?= htmlspecialchars((string)($item['cat_en'] ?? '')) ?></span></td>
|
||||||
<td><?= htmlspecialchars($item['supplier_name'] ?? '---') ?></td>
|
<td><?= htmlspecialchars((string)($item['supplier_name'] ?? '---')) ?></td>
|
||||||
<td>
|
<td>
|
||||||
<div class="text-end">
|
<div class="text-end">
|
||||||
<strong><?= number_format((float)$item['stock_quantity'], 3) ?></strong>
|
<strong><?= number_format((float)$item['stock_quantity'], 3) ?></strong>
|
||||||
@ -4288,13 +4289,13 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
<div class="modal-content border-0 shadow">
|
<div class="modal-content border-0 shadow">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<h5 class="modal-title"><?= htmlspecialchars($item['name_en']) ?></h5>
|
<h5 class="modal-title"><?= htmlspecialchars((string)($item['name_en'] ?? '')) ?></h5>
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div class="text-center mb-3">
|
<div class="text-center mb-3">
|
||||||
<?php if ($item['image_path']): ?>
|
<?php if ($item['image_path']): ?>
|
||||||
<img src="<?= htmlspecialchars($item['image_path']) ?>" class="img-fluid rounded shadow-sm" style="max-height: 200px;">
|
<img src="<?= htmlspecialchars((string)$item['image_path']) ?>" class="img-fluid rounded shadow-sm" style="max-height: 200px;">
|
||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
<div class="bg-light rounded d-flex align-items-center justify-content-center mx-auto" style="width: 150px; height: 150px;">
|
<div class="bg-light rounded d-flex align-items-center justify-content-center mx-auto" style="width: 150px; height: 150px;">
|
||||||
<i class="bi bi-image text-muted" style="font-size: 3rem;"></i>
|
<i class="bi bi-image text-muted" style="font-size: 3rem;"></i>
|
||||||
@ -4302,7 +4303,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
<table class="table table-sm">
|
<table class="table table-sm">
|
||||||
<tr><th class="text-muted">SKU</th><td><?= htmlspecialchars($item['sku']) ?></td></tr>
|
<tr><th class="text-muted">SKU</th><td><?= htmlspecialchars((string)($item['sku'] ?? '')) ?></td></tr>
|
||||||
<tr><th class="text-muted">Category</th><td><?= htmlspecialchars($item['cat_en'] ?? '---') ?></td></tr>
|
<tr><th class="text-muted">Category</th><td><?= htmlspecialchars($item['cat_en'] ?? '---') ?></td></tr>
|
||||||
<tr><th class="text-muted">Supplier</th><td><?= htmlspecialchars($item['supplier_name'] ?? '---') ?></td></tr>
|
<tr><th class="text-muted">Supplier</th><td><?= htmlspecialchars($item['supplier_name'] ?? '---') ?></td></tr>
|
||||||
<tr><th class="text-muted">Sale Price</th><td>OMR <?= number_format((float)$item['sale_price'], 3) ?></td></tr>
|
<tr><th class="text-muted">Sale Price</th><td>OMR <?= number_format((float)$item['sale_price'], 3) ?></td></tr>
|
||||||
@ -4333,12 +4334,27 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
|
|||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<label class="form-label">Name (EN)</label>
|
<label class="form-label">Name (EN)</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" name="name_en" id="editItemNameEn<?= $item['id'] ?>" class="form-control" value="<?= htmlspecialchars($item['name_en']) ?>" required>
|
<input type="text" name="name_en" id="editItemNameEn<?= $item['id'] ?>" class="form-control" value="<?= htmlspecialchars((string)($item['name_en'] ?? '')) ?>" required>
|
||||||
<button class="btn btn-outline-secondary btn-translate" type="button" data-source="editItemNameAr<?= $item['id'] ?>" data-target="editItemNameEn<?= $item['id'] ?>" data-to="en">
|
<button class="btn btn-outline-secondary btn-translate" type="button" data-source="editItemNameAr<?= $item['id'] ?>" data-target="editItemNameEn<?= $item['id'] ?>" data-to="en">
|
||||||
<i class="bi bi-translate"></i> EN
|
<i class="bi bi-translate"></i> EN
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label class="form-label">Name (AR)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="text" name="name_ar" id="editItemNameAr<?= $item['id'] ?>" class="form-control" value="<?= htmlspecialchars((string)($item['name_ar'] ?? '')) ?>" required>
|
||||||
|
<button class="btn btn-outline-secondary btn-translate" type="button" data-source="editItemNameEn<?= $item['id'] ?>" data-target="editItemNameAr<?= $item['id'] ?>" data-to="ar">
|
||||||
|
<i class="bi bi-translate"></i> AR
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
...
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label class="form-label">SKU</label>
|
||||||
|
<input type="text" name="sku" class="form-control" value="<?= htmlspecialchars((string)($item['sku'] ?? '')) ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<label class="form-label">Name (AR)</label>
|
<label class="form-label">Name (AR)</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
|
|||||||
@ -3,3 +3,5 @@
|
|||||||
2026-02-21 17:33:52 - POST: {"open_register":"1","register_id":"3","opening_balance":"2"}
|
2026-02-21 17:33:52 - POST: {"open_register":"1","register_id":"3","opening_balance":"2"}
|
||||||
2026-02-21 17:34:02 - POST: {"action":"save_pos_transaction","customer_id":"","payments":"[{\"method\":\"cash\",\"amount\":15.45}]","total_amount":"15.45","tax_amount":"0","discount_code_id":"","discount_amount":"0","loyalty_redeemed":"0","items":"[{\"id\":1,\"qty\":1,\"price\":0.45,\"vat_rate\":0,\"vat_amount\":0},{\"id\":8,\"qty\":1,\"price\":15,\"vat_rate\":0,\"vat_amount\":0}]"}
|
2026-02-21 17:34:02 - POST: {"action":"save_pos_transaction","customer_id":"","payments":"[{\"method\":\"cash\",\"amount\":15.45}]","total_amount":"15.45","tax_amount":"0","discount_code_id":"","discount_amount":"0","loyalty_redeemed":"0","items":"[{\"id\":1,\"qty\":1,\"price\":0.45,\"vat_rate\":0,\"vat_amount\":0},{\"id\":8,\"qty\":1,\"price\":15,\"vat_rate\":0,\"vat_amount\":0}]"}
|
||||||
2026-02-21 17:34:26 - POST: {"action":"save_pos_transaction","customer_id":"","payments":"[{\"method\":\"cash\",\"amount\":15.45}]","total_amount":"15.45","tax_amount":"0","discount_code_id":"","discount_amount":"0","loyalty_redeemed":"0","items":"[{\"id\":1,\"qty\":1,\"price\":0.45,\"vat_rate\":0,\"vat_amount\":0},{\"id\":8,\"qty\":1,\"price\":15,\"vat_rate\":0,\"vat_amount\":0}]"}
|
2026-02-21 17:34:26 - POST: {"action":"save_pos_transaction","customer_id":"","payments":"[{\"method\":\"cash\",\"amount\":15.45}]","total_amount":"15.45","tax_amount":"0","discount_code_id":"","discount_amount":"0","loyalty_redeemed":"0","items":"[{\"id\":1,\"qty\":1,\"price\":0.45,\"vat_rate\":0,\"vat_amount\":0},{\"id\":8,\"qty\":1,\"price\":15,\"vat_rate\":0,\"vat_amount\":0}]"}
|
||||||
|
2026-02-21 17:37:40 - POST: {"action":"save_pos_transaction","customer_id":"","payments":"[{\"method\":\"cash\",\"amount\":15.45}]","total_amount":"15.45","tax_amount":"0","discount_code_id":"","discount_amount":"0","loyalty_redeemed":"0","items":"[{\"id\":1,\"qty\":1,\"price\":0.45,\"vat_rate\":0,\"vat_amount\":0},{\"id\":8,\"qty\":1,\"price\":15,\"vat_rate\":0,\"vat_amount\":0}]"}
|
||||||
|
2026-02-21 18:11:19 - POST: {"action":"translate","text":"Tomato","target":"ar"}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user