From 552d635c19fb682f67b945a721072cab2774a044 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Thu, 19 Feb 2026 11:20:36 +0000 Subject: [PATCH] updating labels price --- assets/pasted-20260219-104108-ada41fa8.png | Bin 0 -> 40623 bytes .../20260219_add_vat_to_pos_items.sql | 16 ++ debug_sessions.log | 1 + includes/lang.php | 4 +- index.php | 231 +++++++++++++----- post_debug.log | 15 ++ 6 files changed, 208 insertions(+), 59 deletions(-) create mode 100644 assets/pasted-20260219-104108-ada41fa8.png create mode 100644 db/migrations/20260219_add_vat_to_pos_items.sql create mode 100644 debug_sessions.log diff --git a/assets/pasted-20260219-104108-ada41fa8.png b/assets/pasted-20260219-104108-ada41fa8.png new file mode 100644 index 0000000000000000000000000000000000000000..ea98252fafdfe85cfd76d7dec49c7dccbf9a81d1 GIT binary patch literal 40623 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 'Walk-in Customer', 'currency' => 'ر.ع / OMR', 'cash' => 'Cash', - 'card' => 'Card', + 'card' => 'Credit Card', 'credit' => 'Credit', ], 'ar' => [ @@ -183,7 +183,7 @@ $translations = [ 'walk_in_customer' => 'عميل نقدي', 'currency' => 'ر.ع / OMR', 'cash' => 'نقد', - 'card' => 'بطاقة', + 'card' => 'بطاقة ائتمان', 'credit' => 'آجل', ] ]; diff --git a/index.php b/index.php index 9b14ede..18b94dc 100644 --- a/index.php +++ b/index.php @@ -258,6 +258,7 @@ if (isset($_GET['action']) || isset($_POST['action'])) { $payments = json_decode($_POST['payments'] ?? '[]', true); $items = json_decode($_POST['items'] ?? '[]', true); $total_amount = (float)($_POST['total_amount'] ?? 0); + $tax_amount = (float)($_POST['tax_amount'] ?? 0); $discount_code_id = !empty($_POST['discount_code_id']) ? (int)$_POST['discount_code_id'] : null; $discount_amount = (float)($_POST['discount_amount'] ?? 0); $loyalty_redeemed = (float)($_POST['loyalty_redeemed'] ?? 0); @@ -266,18 +267,30 @@ if (isset($_GET['action']) || isset($_POST['action'])) { $transaction_no = 'POS-' . time() . rand(10, 99); $session_id = $_SESSION['register_session_id'] ?? null; + if (!$session_id) { + // Fallback: try to find an open session for this user + $check_session = $db->prepare("SELECT id FROM register_sessions WHERE user_id = ? AND status = 'open' LIMIT 1"); + $check_session->execute([$_SESSION['user_id']]); + $session_id = $check_session->fetchColumn() ?: null; + if ($session_id) { + $_SESSION['register_session_id'] = $session_id; + } + } + // Insert Transaction - $stmt = $db->prepare("INSERT INTO pos_transactions (transaction_no, customer_id, total_amount, discount_code_id, discount_amount, loyalty_points_redeemed, net_amount, register_session_id, created_by, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'completed')"); - $stmt->execute([$transaction_no, $customer_id, $total_amount, $discount_code_id, $discount_amount, $loyalty_redeemed, $net_amount, $session_id, $_SESSION['user_id']]); + $stmt = $db->prepare("INSERT INTO pos_transactions (transaction_no, customer_id, total_amount, tax_amount, discount_code_id, discount_amount, loyalty_points_redeemed, net_amount, register_session_id, created_by, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'completed')"); + $stmt->execute([$transaction_no, $customer_id, $total_amount, $tax_amount, $discount_code_id, $discount_amount, $loyalty_redeemed, $net_amount, $session_id, $_SESSION['user_id']]); $transaction_id = (int)$db->lastInsertId(); // Insert Items & Update Stock - $stmtItem = $db->prepare("INSERT INTO pos_items (transaction_id, product_id, quantity, unit_price, subtotal) VALUES (?, ?, ?, ?, ?)"); + $stmtItem = $db->prepare("INSERT INTO pos_items (transaction_id, product_id, quantity, unit_price, vat_rate, vat_amount, subtotal) VALUES (?, ?, ?, ?, ?, ?, ?)"); $stmtStock = $db->prepare("UPDATE stock_items SET stock_quantity = stock_quantity - ? WHERE id = ?"); foreach ($items as $item) { $sub = (float)$item['price'] * (float)$item['qty']; - $stmtItem->execute([$transaction_id, $item['id'], $item['qty'], $item['price'], $sub]); + $vr = (float)($item['vat_rate'] ?? 0); + $va = (float)($item['vat_amount'] ?? 0); + $stmtItem->execute([$transaction_id, $item['id'], $item['qty'], $item['price'], $vr, $va, $sub]); $stmtStock->execute([$item['qty'], $item['id']]); } @@ -1911,10 +1924,30 @@ switch ($page) { case 'register_sessions': $where = ["1=1"]; $params = []; + + // Filter by user if provided and user has permission + if (isset($_GET['user_id']) && !empty($_GET['user_id'])) { + if (can('users_view')) { + $where[] = "s.user_id = ?"; + $params[] = $_GET['user_id']; + } + } + if (!can('users_view')) { $where[] = "s.user_id = ?"; $params[] = $_SESSION['user_id']; } + + // Filter by date range + if (isset($_GET['date_from']) && !empty($_GET['date_from'])) { + $where[] = "s.opened_at >= ?"; + $params[] = $_GET['date_from'] . ' 00:00:00'; + } + if (isset($_GET['date_to']) && !empty($_GET['date_to'])) { + $where[] = "s.opened_at <= ?"; + $params[] = $_GET['date_to'] . ' 23:59:59'; + } + $whereSql = implode(" AND ", $where); $stmt = db()->prepare("SELECT s.*, r.name as register_name, u.username FROM register_sessions s @@ -1925,6 +1958,7 @@ switch ($page) { $stmt->execute($params); $data['sessions'] = $stmt->fetchAll(); $data['cash_registers'] = db()->query("SELECT * FROM cash_registers WHERE status = 'active'")->fetchAll(); + $data['users'] = db()->query("SELECT id, username FROM users ORDER BY username ASC")->fetchAll(); break; default: $data['customers'] = db()->query("SELECT * FROM customers WHERE type = 'customer' ORDER BY id DESC LIMIT 5")->fetchAll(); @@ -2802,7 +2836,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System'; - + item @@ -2839,7 +2873,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
- +
@@ -2874,7 +2908,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System';
@@ -3376,7 +3410,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System'; const totalVat = this.items.reduce((sum, item) => { const price = parseFloat(item.price) || 0; const qty = parseFloat(item.qty) || 0; - const vatRate = item.vatRate || 5; + const vatRate = (item.vatRate !== undefined && item.vatRate !== null) ? item.vatRate : 5; return sum + (price * qty * (vatRate / (100 + vatRate))); }, 0); let discountAmount = 0; @@ -3395,7 +3429,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System'; items: this.items.map(i => { const price = parseFloat(i.price) || 0; const qty = parseFloat(i.qty) || 0; - const vatRate = i.vatRate || 5; + const vatRate = (i.vatRate !== undefined && i.vatRate !== null) ? i.vatRate : 5; const vatAmount = price * qty * (vatRate / (100 + vatRate)); return { name: (document.documentElement.lang === 'ar' ? (i.nameAr || i.nameEn) : (i.nameEn || i.nameAr)) || 'Unknown Item', @@ -3680,7 +3714,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System'; const qty = parseFloat(item.qty) || 0; const itemTotal = price * qty; subtotal += itemTotal; - const vatRate = item.vatRate || 5; + const vatRate = (item.vatRate !== undefined && item.vatRate !== null) ? item.vatRate : 5; const itemVat = itemTotal * (vatRate / (100 + vatRate)); totalVat += itemVat; const displayName = (lang === 'ar' ? (item.nameAr || item.nameEn) : (item.nameEn || item.nameAr)) || 'Unknown Item'; @@ -3850,10 +3884,16 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System'; }, renderPayments() { const container = document.getElementById('paymentList'); + const methodLabels = { + 'cash': 'Cash', + 'card': 'Credit Card', + 'credit': 'Credit', + 'transfer': 'Bank Transfer' + }; container.innerHTML = this.payments.map((p, i) => `
- ${p.method} + ${methodLabels[p.method] || p.method} ${p.amount.toFixed(3)}
+ + Clear + +
+ + + + +
@@ -7040,14 +7133,11 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System'; - - - + + - - - - + + @@ -7082,11 +7172,8 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System'; ?> - - - + + + + +
Opened At Closed At Opening Bal.Cash SalesCard SalesTransferCash SaleCredit Card CreditTotal SalesExpected CashActual CashShortageTotal SaleBalance Status Report
OMR OMR OMR OMR OMR OMR OMR - - -
+
+ + + + + + @@ -7225,9 +7337,10 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System'; Time - Order # - Customer - Method + Order # + Customer + Items + Method Amount @@ -7240,9 +7353,19 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System'; ?> - - - + + + + prepare("SELECT i.name_en, ti.quantity FROM pos_items ti JOIN stock_items i ON ti.item_id = i.id WHERE ti.transaction_id = ?"); + $items_stmt->execute([$tx['id']]); + $items = $items_stmt->fetchAll(); + foreach ($items as $item) { + echo "" . htmlspecialchars($item['name_en']) . " x " . (float)$item['quantity'] . ""; + } + ?> + + @@ -7272,13 +7395,7 @@ $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Accounting System'; - - - - - - - + @@ -10044,7 +10161,7 @@ document.addEventListener('DOMContentLoaded', function() {
- Card + Credit Card
@@ -10052,7 +10169,7 @@ document.addEventListener('DOMContentLoaded', function() {
- Transfer + Bank Transfer
@@ -10385,7 +10502,7 @@ document.addEventListener('DOMContentLoaded', function() { const uniqueId = Math.random().toString(36).substr(2, 9); const svgId = `bc-${sku}-${uniqueId}`; label.innerHTML = ` -
${name}
+
${name}
OMR ${price}
`; @@ -10493,7 +10610,7 @@ document.addEventListener('DOMContentLoaded', function() { padding: 1mm; } .label-container:last-child { page-break-after: avoid; } - .label-name { font-size: 10px; font-weight: bold; margin-bottom: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; } + .label-name { font-size: 9px; font-weight: bold; margin-bottom: 2px; line-height: 1.1; overflow: hidden; text-overflow: ellipsis; max-width: 100%; } .label-price { font-size: 12px; font-weight: bold; margin-top: 2px; } svg { max-width: 100%; height: auto; max-height: 70%; display: block; } @@ -10629,7 +10746,7 @@ document.addEventListener('DOMContentLoaded', function() { const container = document.getElementById('posReceiptContent'); const itemsHtml = inv.items.map(item => { const itemTotal = item.unit_price * item.quantity; - const vatRate = parseFloat(item.vat_rate || 5); + const vatRate = parseFloat(item.vat_rate !== undefined && item.vat_rate !== null ? item.vat_rate : 5); const vatAmount = itemTotal * (vatRate / (100 + vatRate)); return ` @@ -10642,7 +10759,7 @@ document.addEventListener('DOMContentLoaded', function() { const totalVat = inv.items.reduce((sum, item) => { const itemTotal = item.unit_price * item.quantity; - const vatRate = parseFloat(item.vat_rate || 5); + const vatRate = parseFloat(item.vat_rate !== undefined && item.vat_rate !== null ? item.vat_rate : 5); return sum + (itemTotal * (vatRate / (100 + vatRate))); }, 0); const subtotal = inv.items.reduce((sum, item) => sum + (item.unit_price * item.quantity), 0); diff --git a/post_debug.log b/post_debug.log index 0281ed3..1e51d2b 100644 --- a/post_debug.log +++ b/post_debug.log @@ -74,3 +74,18 @@ 2026-02-19 07:58:34 - POST: {"open_register":"1","register_id":"1","opening_balance":"11"} 2026-02-19 07:58:46 - POST: {"action":"save_pos_transaction","customer_id":"","payments":"[{\"method\":\"cash\",\"amount\":0.845}]","total_amount":"0.8450000000000001","discount_code_id":"","discount_amount":"0","loyalty_redeemed":"0","items":"[{\"id\":1,\"qty\":1,\"price\":0.3825},{\"id\":3,\"qty\":1,\"price\":0.25},{\"id\":2,\"qty\":1,\"price\":0.2125}]"} 2026-02-19 07:59:08 - POST: {"close_register":"1","session_id":"7","cash_in_hand":"13","notes":""} +2026-02-19 08:20:34 - POST: {"open_register":"1","register_id":"1","opening_balance":"12"} +2026-02-19 08:20:44 - POST: {"action":"save_pos_transaction","customer_id":"","payments":"[{\"method\":\"cash\",\"amount\":0.845}]","total_amount":"0.8450000000000001","discount_code_id":"","discount_amount":"0","loyalty_redeemed":"0","items":"[{\"id\":1,\"qty\":1,\"price\":0.3825},{\"id\":3,\"qty\":1,\"price\":0.25},{\"id\":2,\"qty\":1,\"price\":0.2125}]"} +2026-02-19 08:20:57 - POST: {"close_register":"1","session_id":"8","cash_in_hand":"14","notes":""} +2026-02-19 10:20:51 - POST: {"open_register":"1","register_id":"1","opening_balance":"22"} +2026-02-19 10:21:00 - POST: {"action":"save_pos_transaction","customer_id":"","payments":"[{\"method\":\"cash\",\"amount\":0.845}]","total_amount":"0.8450000000000001","discount_code_id":"","discount_amount":"0","loyalty_redeemed":"0","items":"[{\"id\":1,\"qty\":1,\"price\":0.3825},{\"id\":3,\"qty\":1,\"price\":0.25},{\"id\":2,\"qty\":1,\"price\":0.2125}]"} +2026-02-19 10:21:15 - POST: {"close_register":"1","session_id":"9","cash_in_hand":"10","notes":""} +2026-02-19 10:50:12 - POST: {"open_register":"1","register_id":"2","opening_balance":"10"} +2026-02-19 10:50:49 - POST: {"action":"save_pos_transaction","customer_id":"","payments":"[{\"method\":\"cash\",\"amount\":0.845}]","total_amount":"0.8450000000000001","discount_code_id":"","discount_amount":"0","loyalty_redeemed":"0","items":"[{\"id\":1,\"qty\":1,\"price\":0.3825},{\"id\":3,\"qty\":1,\"price\":0.25},{\"id\":2,\"qty\":1,\"price\":0.2125}]"} +2026-02-19 10:51:45 - POST: {"id":"3","name_en":"Tissue","name_ar":"\u0645\u062d\u0627\u0631\u0645 \u0648\u0631\u0642\u064a\u0629","category_id":"2","unit_id":"2","supplier_id":"6","sale_price":"0.25","purchase_price":"0.2","stock_quantity":"-4","min_stock_level":"0","sku":"760115926272","vat_rate":"0","promotion_start":"","promotion_end":"","promotion_percent":"0","edit_item":""} +2026-02-19 10:52:25 - POST: {"action":"save_pos_transaction","customer_id":"","payments":"[{\"method\":\"cash\",\"amount\":0.845}]","total_amount":"0.8450000000000001","discount_code_id":"","discount_amount":"0","loyalty_redeemed":"0","items":"[{\"id\":1,\"qty\":1,\"price\":0.3825},{\"id\":3,\"qty\":1,\"price\":0.25},{\"id\":2,\"qty\":1,\"price\":0.2125}]"} +2026-02-19 10:54:21 - POST: {"open_register":"1","register_id":"1","opening_balance":"5"} +2026-02-19 10:54:24 - POST: {"open_register":"1","register_id":"1","opening_balance":"5"} +2026-02-19 10:54:25 - POST: {"open_register":"1","register_id":"2","opening_balance":"5"} +2026-02-19 10:54:25 - POST: {"open_register":"1","register_id":"2","opening_balance":"5"} +2026-02-19 10:54:26 - POST: {"open_register":"1","register_id":"2","opening_balance":"5"}