connect_error) { log_message("Connection failed: " . $conn->connect_error); echo json_encode([ 'success' => false, 'message' => 'Database connection failed: ' . $conn->connect_error ]); exit; } log_message("Connected to database successfully"); log_message("POST data: " . json_encode($_POST)); // Check if we have all required data if (!isset($_POST['action']) || $_POST['action'] != 'transfer_product' || !isset($_POST['id_barang']) || !isset($_POST['quantity'])) { log_message("Missing required parameters"); echo json_encode([ 'success' => false, 'message' => 'Missing required parameters' ]); exit; } $id_barang = $_POST['id_barang']; $quantity = (int)$_POST['quantity']; log_message("Processing transfer for product ID: $id_barang, quantity: $quantity"); // Validate inputs if (empty($id_barang) || $quantity <= 0) { log_message("Invalid input data"); echo json_encode([ 'success' => false, 'message' => 'ID barang atau jumlah tidak valid' ]); exit; } // Get product details with a simple query without JOIN to minimize errors $stmt = $conn->prepare("SELECT * FROM barang WHERE id_barang = ?"); $stmt->bind_param("s", $id_barang); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows == 0) { log_message("Product not found"); echo json_encode([ 'success' => false, 'message' => 'Barang tidak ditemukan' ]); $stmt->close(); exit; } $product = $result->fetch_assoc(); log_message("Product found: " . json_encode($product)); // Get the id_jenis directly from the database $jenis_stmt = $conn->prepare("SELECT id_jenis FROM jenis_barang WHERE id_jenis = ?"); $jenis_stmt->bind_param("i", $product['id_jenis']); $jenis_stmt->execute(); $jenis_result = $jenis_stmt->get_result(); if ($jenis_result->num_rows == 0) { log_message("Product category not found"); echo json_encode([ 'success' => false, 'message' => 'Kategori barang tidak ditemukan' ]); $stmt->close(); $jenis_stmt->close(); exit; } $jenis_data = $jenis_result->fetch_assoc(); $id_jenis = $jenis_data['id_jenis']; $jenis_stmt->close(); // Check stock if ($quantity > $product['stok']) { log_message("Insufficient stock"); echo json_encode([ 'success' => false, 'message' => 'Stok tidak mencukupi' ]); $stmt->close(); exit; } // Begin transaction $conn->begin_transaction(); try { // 1. Update stock in barang table $new_stock = $product['stok'] - $quantity; $update_stmt = $conn->prepare("UPDATE barang SET stok = ? WHERE id_barang = ?"); $update_stmt->bind_param("is", $new_stock, $id_barang); if (!$update_stmt->execute()) { throw new Exception("Failed to update product stock: " . $update_stmt->error); } log_message("Updated barang stock to: $new_stock"); $update_stmt->close(); // 2. Check if product exists in barang_kasir $check_stmt = $conn->prepare("SELECT * FROM barang_kasir WHERE kode_barang = ?"); $check_stmt->bind_param("s", $product['kode_barang']); if (!$check_stmt->execute()) { throw new Exception("Failed to check if product exists in cashier: " . $check_stmt->error); } $check_result = $check_stmt->get_result(); $timestamp = date('Y-m-d H:i:s'); if ($check_result->num_rows > 0) { // 3a. Update existing product $kasir_product = $check_result->fetch_assoc(); $new_kasir_stock = $kasir_product['stok'] + $quantity; log_message("Product exists in cashier, updating stock to: $new_kasir_stock"); $kasir_update_stmt = $conn->prepare("UPDATE barang_kasir SET stok = ?, update_at = ? WHERE id_barangK = ?"); $kasir_update_stmt->bind_param("isi", $new_kasir_stock, $timestamp, $kasir_product['id_barangK']); if (!$kasir_update_stmt->execute()) { throw new Exception("Failed to update cashier stock: " . $kasir_update_stmt->error); } $kasir_update_stmt->close(); } else { // 3b. Insert new product log_message("Product does not exist in cashier, inserting new record"); // Set default empty string for image $image = $product['image'] ?? ''; $insert_stmt = $conn->prepare("INSERT INTO barang_kasir (kode_barang, nama_barang, id_jenis, harga, stok, gambar, created_at, update_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); $insert_stmt->bind_param("ssisissss", $product['kode_barang'], $product['nama_barang'], $id_jenis, $product['harga'], $quantity, $image, $timestamp, $timestamp ); if (!$insert_stmt->execute()) { throw new Exception("Failed to insert product into cashier: " . $insert_stmt->error); } $insert_stmt->close(); } $check_stmt->close(); // Commit the transaction $conn->commit(); log_message("Transfer completed successfully"); echo json_encode([ 'success' => true, 'message' => 'Berhasil memindahkan ' . $quantity . ' item ke kasir' ]); } catch (Exception $e) { // Rollback on error $conn->rollback(); log_message("Error during transfer: " . $e->getMessage()); echo json_encode([ 'success' => false, 'message' => 'Terjadi kesalahan: ' . $e->getMessage() ]); } $stmt->close(); } catch (Exception $e) { log_message("Unexpected error: " . $e->getMessage()); echo json_encode([ 'success' => false, 'message' => 'Terjadi kesalahan tidak terduga: ' . $e->getMessage() ]); } // Close database connection if (isset($conn)) { $conn->close(); } log_message('Script completed'); ?>