File manager - Edit - /home/webapp69.cm.in.th/u69319090037/Shop/views/stock.php
Back
<?php /** * Stock Management Page * CMTC Shopping */ require_once __DIR__ . '/../includes/header.php'; require_once __DIR__ . '/../includes/navbar.php'; require_login(); require_permission($db, 'manage_stock'); $error = ""; $success = ""; // Handle Stock Adjustment if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['adjust_stock'])) { if (!validate_csrf_token($_POST['csrf_token'] ?? '')) { $error = "โทเค็นความปลอดภัยไม่ถูกต้อง"; } else { $stock_id = intval($_POST['stock_id'] ?? 0); $type = $_POST['type'] ?? 'in'; // in = stock in, out = stock out, set = absolute adjust $quantity = intval($_POST['quantity'] ?? 0); if ($stock_id <= 0 || $quantity <= 0) { $error = "กรุณาระบุข้อมูลที่ถูกต้อง"; } else { try { $stmt = $db->prepare("SELECT ps.*, p.name as prod_name, p.sku FROM product_stock ps JOIN products p ON ps.product_id = p.id WHERE ps.id = ?"); $stmt->execute([$stock_id]); $stock = $stmt->fetch(); if (!$stock) { throw new Exception("ไม่พบข้อมูลสต๊อกนี้"); } $old_qty = $stock['quantity']; if ($type === 'in') { $new_qty = $old_qty + $quantity; } elseif ($type === 'out') { if ($old_qty < $quantity) { throw new Exception("จำนวนคงเหลือไม่พอสำหรับการเบิกออก"); } $new_qty = $old_qty - $quantity; } else { $new_qty = $quantity; } $stmt_upd = $db->prepare("UPDATE product_stock SET quantity = ? WHERE id = ?"); $stmt_upd->execute([$new_qty, $stock_id]); log_activity($db, 'stock', "ปรับปรุงสต๊อกสินค้า SKU {$stock['sku']} เป็น $new_qty ชิ้น"); $success = "ปรับปรุงสต๊อกสินค้าเรียบร้อยแล้ว"; } catch (Exception $e) { $error = "เกิดข้อผิดพลาด: " . $e->getMessage(); } } } } // Fetch all stocks $stmt_stk = $db->query(" SELECT ps.id as stock_id, ps.quantity, ps.product_id, p.sku, p.name as prod_name, p.min_stock, pc.color_name, psz.size_name, (SELECT image_path FROM product_images WHERE product_id = p.id ORDER BY is_main DESC, id ASC LIMIT 1) as main_image FROM product_stock ps JOIN products p ON ps.product_id = p.id LEFT JOIN product_colors pc ON ps.color_id = pc.id LEFT JOIN product_sizes psz ON ps.size_id = psz.id ORDER BY ps.quantity ASC, p.name ASC "); $stocks = $stmt_stk->fetchAll(); ?> <div class="d-flex"> <?php require_once __DIR__ . '/../includes/sidebar.php'; ?> <main class="flex-grow-1 p-4" style="background-color: var(--bs-body-bg);"> <div class="d-flex justify-content-between align-items-center mb-4"> <div> <h3 class="fw-bold mb-0"><i class="bi bi-box-arrow-in-down text-primary me-2"></i>จัดการคลังสินค้า (Stock)</h3> <p class="text-muted small mb-0">ตรวจสอบจำนวนสินค้าคงคลัง ปรับยอดเข้า-ออก และแจ้งเตือนสต๊อกต่ำ</p> </div> <div> <a href="<?php echo base_url('views/products.php'); ?>" class="btn btn-outline-primary btn-sm"><i class="bi bi-box-seam me-1"></i>ไปจัดการสินค้า</a> </div> </div> <?php if (!empty($error)): ?> <div class="alert alert-danger mb-4"><?php echo $error; ?></div> <?php endif; ?> <?php if (!empty($success)): ?> <div class="alert alert-success mb-4"><?php echo $success; ?></div> <?php endif; ?> <div class="card border-0 shadow-sm glass-card p-4"> <div class="table-responsive"> <table class="table table-hover align-middle datatable"> <thead> <tr> <th>สินค้า</th> <th>SKU</th> <th>สี</th> <th>ไซส์/ขนาด</th> <th class="text-center">คงเหลือ</th> <th class="text-center">ขั้นต่ำ</th> <th>สถานะ</th> <th class="text-center">จัดการ</th> </tr> </thead> <tbody> <?php foreach ($stocks as $s): $is_low = $s['quantity'] <= $s['min_stock']; ?> <tr class="<?php echo $is_low ? 'table-warning-subtle' : ''; ?>"> <td> <div class="d-flex align-items-center gap-2"> <?php $img_src = !empty($s['main_image']) ? product_image_url($s['main_image']) : base_url('assets/images/no-image.png'); ?> <img src="<?php echo $img_src; ?>" class="rounded border" width="40" height="40" style="object-fit: cover;" onerror="this.onerror=null; this.src='<?php echo base_url('assets/images/no-image.png'); ?>';"> <div class="fw-semibold"><?php echo sanitize($s['prod_name']); ?></div> </div> </td> <td><code><?php echo sanitize($s['sku']); ?></code></td> <td><?php echo sanitize($s['color_name'] ?? '-'); ?></td> <td><span class="badge bg-secondary"><?php echo sanitize($s['size_name'] ?? '-'); ?></span></td> <td class="text-center fw-bold <?php echo $is_low ? 'text-danger' : 'text-success'; ?> fs-6"> <?php echo number_format($s['quantity']); ?> ชิ้น </td> <td class="text-center text-muted"><?php echo number_format($s['min_stock']); ?></td> <td> <?php if ($is_low): ?> <span class="badge bg-danger"><i class="bi bi-exclamation-triangle"></i> ใกล้หมด</span> <?php else: ?> <span class="badge bg-success"><i class="bi bi-check-circle"></i> ปกติ</span> <?php endif; ?> </td> <td class="text-center"> <button class="btn btn-sm btn-primary btn-adjust-stock" data-id="<?php echo $s['stock_id']; ?>" data-name="<?php echo sanitize($s['prod_name'] . ' (' . ($s['color_name'] ?? '') . ' / ' . ($s['size_name'] ?? '') . ')'); ?>" data-qty="<?php echo $s['quantity']; ?>" data-bs-toggle="modal" data-bs-target="#adjustModal"> <i class="bi bi-pencil-square"></i> ปรับยอด </button> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> </div> </main> </div> <!-- Adjust Stock Modal --> <div class="modal fade" id="adjustModal" tabindex="-1"> <div class="modal-dialog"> <form method="POST"> <input type="hidden" name="csrf_token" value="<?php echo get_csrf_token(); ?>"> <input type="hidden" name="stock_id" id="modal_stock_id"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title"><i class="bi bi-arrow-left-right text-primary me-2"></i>ปรับปรุงจำนวนสต๊อก</h5> <button type="button" class="btn-close" data-bs-dismiss="modal"></button> </div> <div class="modal-body"> <p class="fw-bold mb-2 text-primary" id="modal_stock_name"></p> <p class="text-muted small mb-3">จำนวนปัจจุบัน: <span class="fw-bold text-dark" id="modal_current_qty"></span> ชิ้น</p> <div class="mb-3"> <label class="form-label">ประเภทการปรับปรุง *</label> <select name="type" class="form-select" required> <option value="in">นำเข้าสินค้า (+ เพิ่มสต๊อก)</option> <option value="out">เบิกออกสินค้า (- ลดสต๊อก)</option> <option value="set">กำหนดจำนวนใหม่โดยตรง</option> </select> </div> <div class="mb-3"> <label class="form-label">จำนวน (ชิ้น) *</label> <input type="number" name="quantity" class="form-control" min="1" required placeholder="ระบุจำนวน"> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">ยกเลิก</button> <button type="submit" name="adjust_stock" class="btn btn-primary">บันทึก</button> </div> </div> </form> </div> </div> <script> $(document).ready(function() { $('.btn-adjust-stock').on('click', function() { $('#modal_stock_id').val($(this).data('id')); $('#modal_stock_name').text($(this).data('name')); $('#modal_current_qty').text($(this).data('qty')); }); }); </script> <?php require_once __DIR__ . '/../includes/footer.php'; ?>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.23 |
proxy
|
phpinfo
|
Settings