166 lines
6.4 KiB
PHP
166 lines
6.4 KiB
PHP
<?php
|
|
// report_handler.php - Updated to handle multiple products
|
|
// Place this file in the same directory as your productlist.php
|
|
|
|
// Koneksi ke database
|
|
$servername = "localhost";
|
|
$username = "root"; // Sesuaikan dengan username database kamu
|
|
$password = ""; // Sesuaikan dengan password database kamu
|
|
$database = "ayula_store"; // Sesuaikan dengan nama database kamu
|
|
|
|
$conn = new mysqli($servername, $username, $password, $database);
|
|
|
|
// Function for logging
|
|
function log_debug($message) {
|
|
file_put_contents('report_debug.log', date('[Y-m-d H:i:s] ') . $message . "\n", FILE_APPEND);
|
|
}
|
|
|
|
log_debug('Report script started');
|
|
log_debug('POST data: ' . json_encode($_POST));
|
|
log_debug('FILES data: ' . json_encode($_FILES));
|
|
|
|
// Periksa koneksi
|
|
if ($conn->connect_error) {
|
|
log_debug("Connection failed: " . $conn->connect_error);
|
|
die(json_encode(['success' => false, 'message' => 'Koneksi database gagal: ' . $conn->connect_error]));
|
|
}
|
|
|
|
// Cek action yang diminta
|
|
if (isset($_POST['action']) && $_POST['action'] == 'create_report') {
|
|
createReport($conn);
|
|
} else {
|
|
log_debug("Invalid action");
|
|
echo json_encode(['success' => false, 'message' => 'Aksi tidak valid']);
|
|
}
|
|
|
|
function createReport($conn) {
|
|
// Ambil data dari form
|
|
$id_barang_array = isset($_POST['id_barang']) ? (is_array($_POST['id_barang']) ? $_POST['id_barang'] : [$_POST['id_barang']]) : [];
|
|
$jumlah_array = isset($_POST['jumlah']) ? (is_array($_POST['jumlah']) ? $_POST['jumlah'] : [$_POST['jumlah']]) : [];
|
|
$harga_array = isset($_POST['harga']) ? (is_array($_POST['harga']) ? $_POST['harga'] : [$_POST['harga']]) : [];
|
|
|
|
log_debug("Processing products: " . json_encode($id_barang_array));
|
|
|
|
// Validasi data
|
|
if (empty($id_barang_array) || empty($jumlah_array) || empty($harga_array)) {
|
|
log_debug("Missing required data");
|
|
echo json_encode(['success' => false, 'message' => 'Semua field harus diisi']);
|
|
return;
|
|
}
|
|
|
|
if (count($id_barang_array) != count($jumlah_array) || count($id_barang_array) != count($harga_array)) {
|
|
log_debug("Data count mismatch");
|
|
echo json_encode(['success' => false, 'message' => 'Jumlah data tidak sesuai']);
|
|
return;
|
|
}
|
|
|
|
// Handle upload gambar nota
|
|
$upload_dir = '../uploads/nota/';
|
|
|
|
// Buat direktori jika belum ada
|
|
if (!file_exists($upload_dir)) {
|
|
mkdir($upload_dir, 0777, true);
|
|
}
|
|
|
|
$image_name = '';
|
|
|
|
if (isset($_FILES['receipt_image']) && $_FILES['receipt_image']['error'] == 0) {
|
|
// Generate nama file unik
|
|
$file_extension = pathinfo($_FILES['receipt_image']['name'], PATHINFO_EXTENSION);
|
|
$image_name = 'nota_' . time() . '_' . mt_rand(1000, 9999) . '.' . $file_extension;
|
|
$target_file = $upload_dir . $image_name;
|
|
|
|
// Validasi tipe file
|
|
$allowed_types = ['jpg', 'jpeg', 'png', 'gif'];
|
|
if (!in_array(strtolower($file_extension), $allowed_types)) {
|
|
log_debug("Invalid file type: " . $file_extension);
|
|
echo json_encode(['success' => false, 'message' => 'Format file tidak didukung. Gunakan JPG, JPEG, PNG, atau GIF']);
|
|
return;
|
|
}
|
|
|
|
// Validasi ukuran file (max 5MB)
|
|
if ($_FILES['receipt_image']['size'] > 5 * 1024 * 1024) {
|
|
log_debug("File too large: " . $_FILES['receipt_image']['size']);
|
|
echo json_encode(['success' => false, 'message' => 'Ukuran file terlalu besar (maksimum 5MB)']);
|
|
return;
|
|
}
|
|
|
|
// Upload file
|
|
if (!move_uploaded_file($_FILES['receipt_image']['tmp_name'], $target_file)) {
|
|
log_debug("Failed to upload file");
|
|
echo json_encode(['success' => false, 'message' => 'Gagal mengunggah gambar']);
|
|
return;
|
|
}
|
|
|
|
log_debug("File uploaded successfully: " . $image_name);
|
|
} else {
|
|
log_debug("No image file uploaded");
|
|
echo json_encode(['success' => false, 'message' => 'Gambar nota harus diunggah']);
|
|
return;
|
|
}
|
|
|
|
// Mulai transaksi
|
|
$conn->begin_transaction();
|
|
|
|
try {
|
|
// Buat ID report otomatis (format: RPT-YYYYMMDDxxx)
|
|
$date = date('Ymd');
|
|
$query = "SELECT MAX(SUBSTRING(id_report, 12)) as last_id FROM report WHERE id_report LIKE 'RPT-$date%'";
|
|
$result = $conn->query($query);
|
|
$row = $result->fetch_assoc();
|
|
$last_id = $row['last_id'] ?? 0;
|
|
$report_id = 'RPT-' . $date . str_pad(intval($last_id) + 1, 3, '0', STR_PAD_LEFT);
|
|
|
|
log_debug("Generated report ID: " . $report_id);
|
|
|
|
// Loop through each product and insert into report table
|
|
for ($i = 0; $i < count($id_barang_array); $i++) {
|
|
$id_barang = $id_barang_array[$i];
|
|
$jumlah = $jumlah_array[$i];
|
|
$harga = $harga_array[$i];
|
|
|
|
log_debug("Inserting product: ID=$id_barang, Qty=$jumlah, Price=$harga");
|
|
|
|
// Simpan data ke tabel report
|
|
$query = "INSERT INTO report (id_report, id_barang, tanggal, jumlah, harga, image)
|
|
VALUES (?, ?, NOW(), ?, ?, ?)";
|
|
$stmt = $conn->prepare($query);
|
|
$stmt->bind_param('sssss', $report_id, $id_barang, $jumlah, $harga, $image_name);
|
|
$stmt->execute();
|
|
|
|
if ($stmt->affected_rows <= 0) {
|
|
throw new Exception("Gagal menyimpan data report untuk produk ID: $id_barang");
|
|
}
|
|
|
|
$stmt->close();
|
|
}
|
|
|
|
// Commit transaksi
|
|
$conn->commit();
|
|
|
|
log_debug("Transaction committed successfully");
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'message' => 'Data berhasil ditambahkan ke laporan',
|
|
'report_id' => $report_id,
|
|
'product_count' => count($id_barang_array),
|
|
'image_url' => '/ayula-store/uploads/nota/' . $image_name
|
|
]);
|
|
|
|
} catch (Exception $e) {
|
|
// Rollback transaksi jika terjadi kesalahan
|
|
$conn->rollback();
|
|
|
|
log_debug("Error: " . $e->getMessage());
|
|
|
|
// Hapus file gambar jika upload sudah terjadi
|
|
if (!empty($image_name) && file_exists($upload_dir . $image_name)) {
|
|
unlink($upload_dir . $image_name);
|
|
log_debug("Deleted uploaded file due to error");
|
|
}
|
|
|
|
echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]);
|
|
}
|
|
}
|
|
?>
|