<?php
session_start();
require 'koneksi.php';
// Cek koneksi database
if (!$kon) {
die("Koneksi database gagal: " . mysqli_connect_error());
}
$resto = isset($_SESSION['resto']) ? $_SESSION['resto'] : null;
// === PROSES PRINT ===
if (isset($_POST['submit'])) {
$cashier = $_SESSION['user'];
$tanggal = date('Y-m-d');
$realtotal = $_POST['realtotal'];
$total = $_POST['total'];
$bayar = $_POST['bayar'];
$kembali = $_POST['kembali'];
$nama = $_POST['nama'];
$meja = $_POST['meja'];
$wallet = $_POST['wallet'];
// Promo
$promo = $_POST['promo'];
$jmlpotongan = trim($_POST['jmlpotongan']);
// Kupon
$kupon = $_POST['kupon'];
$jmlpotongankupon = $_POST['jmlpotongankupon'];
$id_trx = $_POST['id_trx'];
$_SESSION['sudahdiprint'] = 'sudah';
} else {
unset($_SESSION['keranjang_belanja']);
header('location: /cart');
die;
}
// Cek keranjang
if (empty($_SESSION['keranjang_belanja'])) {
header('location: /cart');
die;
}
// Cek id_trx
$check_trx_query = "SELECT * FROM invoice WHERE id_trx = '$id_trx'";
$l_trx = mysqli_query($kon, $check_trx_query);
if (mysqli_num_rows($l_trx) > 0) {
unset($_SESSION['keranjang_belanja']);
}
// Ambil pengaturan resto
$stmt = $kon->prepare("SELECT * FROM pengaturan WHERE resto = ? ORDER BY id DESC LIMIT 1");
$stmt->bind_param("s", $resto);
$stmt->execute();
$result = $stmt->get_result();
$data = $result->fetch_assoc();
if (!$data) {
die("Data pengaturan resto tidak ditemukan!");
}
// Generate kupon acak
$random = "";
for ($i = 0; $i < 10; $i++) {
$randomChar = chr(rand(49, 122));
if (is_numeric($randomChar) || preg_match("/[a-z]/", $randomChar)) {
$random .= $randomChar;
} else {
$i--;
}
}
// Simpan kupon
$insert_kupon_query = "INSERT INTO kupon (kode, resto, potongan, tipe, status) VALUES ('$random', '$_SESSION[resto]', '$data[potongan]', '$data[tipe]', 'aktif')";
mysqli_query($kon, $insert_kupon_query);
// Proses setiap item di keranjang
$total_provit = 0;
foreach ($_SESSION["keranjang_belanja"] as $item) {
$sub_total = $item["jumlah"] * $item['harga'];
// Insert array session_keranjang_belanja ke db transaksi
$insert_trx_query = "INSERT INTO transaksi
(tanggal, id_trx, resto, nama, kategori, varian, harga, qty, catatan, sub_total)
VALUES
('$tanggal', '$id_trx', '$_SESSION[resto]', '$item[nama_produk]', '$item[kategori]', '$item[varian]', '$item[harga]', '$item[jumlah]', '$item[catatan]', '$sub_total')";
mysqli_query($kon, $insert_trx_query);
// Ambil kode_produk dari nama produk
$get_produk_query = "SELECT kode_produk FROM produk WHERE nama = '" . mysqli_real_escape_string($kon, $item['nama_produk']) . "' LIMIT 1";
$get_produk = mysqli_query($kon, $get_produk_query);
// Ambil provit dari nama produk
$get_prov_query = "SELECT provit FROM produk WHERE nama = '" . mysqli_real_escape_string($kon, $item['nama_produk']) . "' LIMIT 1";
$get_prov = mysqli_query($kon, $get_prov_query);
$provit = mysqli_fetch_assoc($get_prov);
if ($provit) {
// Hasilkan provit dalam invoice ini
$t_prov = $provit['provit'] * $item["jumlah"];
$total_provit += $t_prov;
}
if ($get_produk && mysqli_num_rows($get_produk) > 0) {
$data_produk = mysqli_fetch_assoc($get_produk);
$kode_produk = $data_produk['kode_produk'];
// Ambil semua ingredient dari produk_ingredient
$get_ingredients_query = "SELECT id_bahan_baku, jumlah FROM produk_ingredient WHERE kode_produk = '$kode_produk'";
$get_ingredients = mysqli_query($kon, $get_ingredients_query);
while ($ingredient = mysqli_fetch_assoc($get_ingredients)) {
$id_bahan_baku = $ingredient['id_bahan_baku'];
$jumlah_per_porsi = $ingredient['jumlah'];
$total_pengurangan = $jumlah_per_porsi * $item['jumlah'];
// Ambil nama_bahan berdasarkan id_bahan_baku
$get_bahan_query = "SELECT nama_bahan FROM bahan_baku WHERE id = '$id_bahan_baku' LIMIT 1";
$get_bahan = mysqli_query($kon, $get_bahan_query);
if ($get_bahan && mysqli_num_rows($get_bahan) > 0) {
$data_bahan = mysqli_fetch_assoc($get_bahan);
$nama_bahan = $data_bahan['nama_bahan'];
// Update stok bahan baku
$update_stok_query = "UPDATE bahan_baku SET jumlah_stok = jumlah_stok - $total_pengurangan WHERE id = $id_bahan_baku";
mysqli_query($kon, $update_stok_query);
// Insert ke tabel bahan_terpakai
$insert_bahan_query = "INSERT INTO bahan_terpakai (id_bahan_baku, nama_bahan, kode_produk, total_pengurangan, jumlah_terpakai, tanggal, transaksi_id) VALUES ('$id_bahan_baku', '$nama_bahan', '$kode_produk', '$total_pengurangan', '$total_pengurangan', '$tanggal', '$id_trx')";
mysqli_query($kon, $insert_bahan_query);
}
}
}
// Update kupon yang sudah terpakai menjadi kadaluarsa
if (!empty($kupon)) {
$update_kupon_query = "UPDATE kupon SET status ='nonaktif' WHERE kode='$kupon'";
mysqli_query($kon, $update_kupon_query);
}
}
// Insert invoice dengan pengecekan error yang ketat
$insert_invoice_query = "INSERT INTO invoice VALUES (NULL,'$tanggal','$id_trx','$cashier','$nama','$meja','$realtotal','$jmlpotongan','$jmlpotongankupon','$total','$wallet','$_SESSION[resto]','tidak','Proses','$total_provit')";
$masukin_inv = mysqli_query($kon, $insert_invoice_query);
if (!$masukin_inv) {
die("Error insert invoice: " . mysqli_error($kon));
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Print Receipt</title>
<style>
/* Atur ukuran body sesuai kertas thermal 58mm */
@media print {
body {
width: 58mm;
margin: 0;
padding: 0;
font-family: monospace, Courier, monospace;
font-size: 14px; /* diperbesar dari 12px */
color: #000;
}
.receipt-container {
width: 58mm;
padding: 1px 1px; /* padding sedikit lebih lega */
}
}
/* Style umum agar rapi */
body {
font-family: monospace, Courier, monospace;
font-size: 14px; /* diperbesar */
width: 58mm;
margin: 10px auto;
color: #000;
}
.receipt-container {
width: 100%;
padding: 8px 10px;
box-sizing: border-box;
/* border dihapus */
}
.logo img {
display: block;
margin: 0 auto 8px auto;
max-width: 80px;
}
.restaurant-name {
text-align: center;
font-weight: bold;
font-size: 16px; /* diperbesar */
margin-bottom: 5px;
}
.transaction-id {
font-size: 12px; /* diperbesar */
margin-bottom: 12px;
}
table.info-table, table.info-table td {
width: 100%;
border-collapse: collapse;
font-size: 13px; /* diperbesar */
}
table.info-table td {
padding: 3px 0;
vertical-align: top;
}
table.info-table tr td:nth-child(1) {
width: 30%;
}
table.info-table tr td:nth-child(2) {
width: 5%;
}
table.info-table tr td:nth-child(3) {
width: 65%;
text-align: left;
}
.divider {
border-top: 1px dashed #000;
margin: 10px 0;
}
.item-row {
font-size: 13px; /* diperbesar */
margin-bottom: 7px;
}
.item-name {
font-weight: bold;
}
.item-details {
font-size: 12px; /* diperbesar */
margin-left: 6px;
}
.total-section {
font-weight: bold;
font-size: 15px; /* diperbesar */
}
.total-section td {
padding: 4px 0;
}
.total-section tr td:nth-child(3) {
text-align: right;
}
.footer-info {
font-size: 11px; /* diperbesar */
margin-top: 15px;
}
.barcode img {
display: block;
margin: 6px auto;
max-width: 100%;
height: auto;
}
.wifi-info {
margin-top: 7px;
font-size: 11px; /* diperbesar */
}
</style>
</head>
<body>
<div class="receipt-container">
<!-- Header -->
<div class="logo">
<?php if (!empty($data['urlgambar'])): ?>
<img src="<?= htmlspecialchars($data['urlgambar']) ?>" alt="Logo" />
<?php endif; ?>
</div>
<div class="restaurant-name"><?= htmlspecialchars($data['resto']) ?></div>
<div class="transaction-id">No.Trx: <?= htmlspecialchars($id_trx) ?></div>
<!-- Info transaksi -->
<table class="info-table">
<tr><td>Tanggal</td><td>:</td><td><?= date('d/m/Y H:i:s') ?></td></tr>
<tr><td>No Meja</td><td>:</td><td><?= !empty($meja) ? htmlspecialchars($meja) : '-' ?></td></tr>
<tr><td>Nama</td><td>:</td><td><?= htmlspecialchars($nama) ?></td></tr>
<tr><td>Cashier</td><td>:</td><td><?= htmlspecialchars($_SESSION['user']) ?></td></tr>
</table>
<div class="divider"></div>
<!-- Daftar item -->
<?php foreach ($_SESSION["keranjang_belanja"] as $item):
$sub_total = $item["jumlah"] * $item['harga'];
?>
<div class="item-row">
<div class="item-name"><?= htmlspecialchars($item['nama_produk']) ?></div>
<div class="item-details">
<?= $item["jumlah"] ?> x Rp <?= number_format($item['harga'], 0, ',', '.') ?> = Rp <?= number_format($sub_total, 0, ',', '.') ?>
<?php if (!empty($item['catatan'])): ?>
<br><small>Catatan: <?= htmlspecialchars($item['catatan']) ?></small>
<?php endif; ?>
</div>
</div>
<?php endforeach; ?>
<div class="divider"></div>
<!-- Total -->
<table class="info-table total-section">
<tr><td>Subtotal</td><td>:</td><td>Rp <?= number_format($realtotal, 0, ',', '.') ?></td></tr>
<?php if (!empty($promo) && $jmlpotongan > 0): ?>
<tr><td>Promo (<?= htmlspecialchars($promo) ?>)</td><td>:</td><td>- Rp <?= number_format($jmlpotongan, 0, ',', '.') ?></td></tr>
<?php endif; ?>
<?php if (!empty($kupon) && $jmlpotongankupon > 0): ?>
<tr><td>Kupon (<?= htmlspecialchars($kupon) ?>)</td><td>:</td><td>- Rp <?= number_format($jmlpotongankupon, 0, ',', '.') ?></td></tr>
<?php endif; ?>
<tr style="border-top:1px solid #000;">
<td><strong>TOTAL</strong></td><td>:</td><td>Rp <?= number_format($total, 0, ',', '.') ?></td>
</tr>
<?php if (!empty($wallet)): ?>
<tr><td>Bayar (<?= htmlspecialchars($wallet) ?>)</td><td>:</td><td>Rp <?= number_format($bayar, 0, ',', '.') ?></td></tr>
<tr><td>Kembali</td><td>:</td><td>Rp <?= number_format($kembali, 0, ',', '.') ?></td></tr>
<?php endif; ?>
</table>
<div class="divider"></div>
<!-- Footer -->
<div class="footer-info">
<?= nl2br(htmlspecialchars($data['alamat'])) ?>
<?php if (!empty($data['wifi'])): ?>
<div class="wifi-info">
<strong>WiFi Password:</strong><br />
<?= htmlspecialchars($data['wifi']) ?>
</div>
<?php endif; ?>
<?php if ($data['koded'] == 'yes' && empty($kupon)): ?>
<div style="margin-top:10px; font-size:12px; text-align:center;">
<strong>Kupon Diskon Berikutnya</strong>
<div class="barcode">
<img src="php-barcode-master/barcode.php?text=<?= htmlspecialchars($random) ?>&print=true&size=45" alt="Barcode Kupon" />
</div>
Kode: <?= htmlspecialchars($random) ?>
</div>
<?php endif; ?>
<div style="margin-top: 12px; font-size: 12px;">
Terima kasih atas kunjungan Anda!<br />
Selamat menikmati!
</div>
</div>
</div>
<script>
// Otomatis print saat halaman load
window.onload = function() {
window.print();
};
</script>
</body>
</html>