ayula-storeee/views/transaction/get_product_by_barcode.php

245 lines
9.1 KiB
PHP

<?php
// Pencegahan error tampil di output (sangat penting untuk AJAX)
ini_set('display_errors', 0);
error_reporting(E_ALL);
// Pastikan output hanya JSON, bukan error PHP
header('Content-Type: application/json');
// Include transaction functions
require_once 'configtrans.php';
// Fungsi untuk mengirim respons JSON dan keluar
function sendResponse($data) {
echo json_encode($data);
exit;
}
// Tangkap semua error untuk mencegah tampil di output
function handleErrors($errno, $errstr, $errfile, $errline) {
error_log("PHP Error ($errno): $errstr in $errfile on line $errline");
sendResponse([
'success' => false,
'message' => 'Terjadi kesalahan internal. Silakan coba lagi.',
'product' => null,
'cart_html' => '',
'cart_totals' => [
'items' => 0,
'total' => 0,
'formatted_total' => '0'
]
]);
return true;
}
set_error_handler('handleErrors');
// Try-catch untuk menangkap semua exception
try {
// Pastikan sesi dimulai
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
// Log request untuk debugging
error_log("Barcode scan request received: " . json_encode($_POST));
// Initialize response
$response = [
'success' => false,
'message' => 'Barcode tidak valid',
'product' => null,
'cart_html' => '',
'cart_totals' => [
'items' => 0,
'total' => 0,
'formatted_total' => '0'
]
];
// Check if barcode is provided
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['barcode'])) {
$barcode = trim($_POST['barcode']);
// Validate barcode
if (empty($barcode)) {
$response['message'] = "Barcode tidak boleh kosong";
sendResponse($response);
}
// Get product by barcode (kode_barang)
$product = getProductByBarcode($barcode);
if (!$product) {
$response['message'] = "Produk tidak ditemukan untuk barcode: " . htmlspecialchars($barcode);
sendResponse($response);
}
// Check stock availability
if ($product['stok'] <= 0) {
$response['message'] = "Produk " . htmlspecialchars($product['nama_barang']) . " stok habis";
sendResponse($response);
}
// Initialize cart if not exists
if (!isset($_SESSION['cart']) || !is_array($_SESSION['cart'])) {
$_SESSION['cart'] = [];
error_log("Cart initialized");
}
$productId = $product['id_barangK'];
$quantity = 1; // Default quantity is 1
// Check if product already in cart, update quantity if exists
$exists = false;
foreach ($_SESSION['cart'] as $key => $item) {
if ($item['id'] == $productId) {
// Only add if it won't exceed stock
if ($item['quantity'] < $product['stok']) {
$_SESSION['cart'][$key]['quantity'] += 1;
} else {
// Stock limit reached
$response['success'] = false;
$response['message'] = "Tidak dapat menambahkan unit lagi. Batas stok tercapai.";
sendResponse($response);
}
$exists = true;
break;
}
}
// If not exists, add to cart
if (!$exists) {
$_SESSION['cart'][] = [
'id' => $productId,
'name' => $product['nama_barang'],
'code' => $product['kode_barang'],
'price' => $product['harga'],
'quantity' => $quantity,
'max_stock' => $product['stok']
];
}
// Set success response
$response['success'] = true;
$response['message'] = 'Produk ditambahkan ke keranjang';
$response['product'] = [
'id' => $product['id_barangK'],
'name' => $product['nama_barang'],
'code' => $product['kode_barang'],
'price' => $product['harga'],
'stock' => $product['stok']
];
// Generate cart HTML
$response['cart_html'] = generateCartHTML();
// Calculate cart totals
$cartItems = count($_SESSION['cart']);
$total = 0;
foreach ($_SESSION['cart'] as $item) {
$total += $item['price'] * $item['quantity'];
}
$response['cart_totals'] = [
'items' => $cartItems,
'total' => $total,
'formatted_total' => number_format($total, 0, ',', '.')
];
// Log cart state for debugging
error_log("Cart updated. Items: " . $cartItems . ", Total: " . $total);
}
// Send the response
sendResponse($response);
} catch (Exception $e) {
// Log exception
error_log("Exception in get_product_by_barcode.php: " . $e->getMessage());
// Return error response
sendResponse([
'success' => false,
'message' => 'Terjadi kesalahan: ' . $e->getMessage(),
'product' => null,
'cart_html' => '',
'cart_totals' => [
'items' => 0,
'total' => 0,
'formatted_total' => '0'
]
]);
}
/**
* Generate HTML for cart items
*
* @return string HTML content for cart
*/
function generateCartHTML() {
if (isset($_SESSION['cart']) && !empty($_SESSION['cart'])) {
$html = '';
foreach ($_SESSION['cart'] as $index => $item) {
$html .= '
<ul class="product-lists">
<li>
<div class="productimg">
<div class="productimgs">
<img src="../../bootstrap/assets/img/product/product30.jpg" alt="img" />
</div>
<div class="productcontet">
<h4>' . htmlspecialchars($item['name']) . '</h4>
<div class="productlinkset">
<h5>' . htmlspecialchars($item['code']) . '</h5>
</div>
<div class="increment-decrement">
<div class="input-groups">
<form method="post" action="index.php" class="cart-item-form">
<input type="hidden" name="product_id" value="' . intval($item['id']) . '">
<input type="hidden" name="update_cart" value="1">
<div class="quantity-control-container">
<button type="button" class="btn btn-sm btn-light quantity-btn decrement">-</button>
<input type="text" name="quantity" value="' . intval($item['quantity']) . '"
class="quantity-field form-control mx-1"
style="width: 45px; text-align: center;"
data-max-stock="' . intval($item['max_stock']) . '" />
<button type="button" class="btn btn-sm btn-light quantity-btn increment">+</button>
<button type="submit" class="btn btn-sm btn-primary ms-1 update-cart-btn">
<i class="fa fa-check"></i>
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</li>
<li>Rp. ' . number_format($item['price'] * $item['quantity'], 0, ',', '.') . '</li>
<li>
<a href="javascript:void(0);" class="delete-cart-item" data-index="' . $index . '">
<img src="../../bootstrap/assets/img/icons/delete-2.svg" alt="img" />
</a>
</li>
</ul>';
}
// Add script to enable functionalities
$html .= '
<script>
// Setup event handlers for the new cart items
if (typeof setupQuantityControls === "function") {
setupQuantityControls();
}
if (typeof setupCartDeletionConfirmation === "function") {
setupCartDeletionConfirmation();
}
// Dispatch custom event to notify that cart was updated
document.dispatchEvent(new CustomEvent("cartUpdated"));
</script>';
return $html;
} else {
return '<p class="text-center">Keranjang Anda kosong.</p>';
}
}