40087-vm/order_status.php
2026-05-26 08:29:37 +00:00

223 lines
12 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/store.php';
$lookupOrder = store_sanitize_line((string)($_GET['order'] ?? ''), 30);
$lookupEmail = trim(store_lower((string)($_GET['email'] ?? '')));
$created = (string)($_GET['created'] ?? '') === '1';
$lastLookup = store_last_order_lookup();
$currentUser = store_current_user();
if ($lookupOrder !== '' && $lookupEmail === '' && ($lastLookup['order_number'] ?? '') === $lookupOrder) {
$lookupEmail = (string)($lastLookup['email'] ?? '');
}
if ($lookupEmail === '' && $currentUser) {
$lookupEmail = (string)($currentUser['email'] ?? '');
}
$order = null;
$searchError = '';
if ($lookupOrder !== '') {
if ($lookupEmail === '') {
$searchError = 'Masukkan email yang dipakai saat checkout untuk membuka detail pesanan.';
} else {
$order = store_find_order($lookupOrder, $lookupEmail);
if (!$order) {
$searchError = 'Pesanan tidak ditemukan. Pastikan kode pesanan dan email sudah benar.';
}
}
}
store_page_start('Status Pesanan', 'Lacak status pesanan menggunakan order number dan email.', ['noindex' => true]);
?>
<section class="section-block pt-0">
<div class="section-heading mb-4">
<span class="eyebrow">Status Pesanan</span>
<h1 class="section-title">Lacak progress pesanan pelanggan.</h1>
<p class="section-copy mb-0">Masukkan kode pesanan dan email untuk melihat item, total, metode pembayaran, dan status terbaru.</p>
</div>
<?php if ($created && ($lastLookup['order_number'] ?? '') !== ''): ?>
<div class="alert alert-success border-0 shadow-sm mb-4 d-flex flex-column flex-lg-row align-items-lg-center justify-content-between gap-3" role="alert">
<div>
<strong>Pesanan berhasil dibuat.</strong>
<div class="small mt-1">Simpan kode <strong><?= h((string)$lastLookup['order_number']) ?></strong> untuk pelacakan status.</div>
</div>
<button type="button" class="btn btn-outline-success btn-sm" data-copy-text="<?= h((string)$lastLookup['order_number']) ?>">Salin kode pesanan</button>
</div>
<?php endif; ?>
<div class="row g-4 align-items-start">
<div class="col-lg-4">
<form action="order_status.php" method="get" class="surface-panel p-4 sticky-summary">
<div class="card-kicker">Cek pesanan</div>
<h2 class="h5 mb-3">Cari berdasarkan kode & email</h2>
<div class="mb-3">
<label class="form-label" for="order">Kode pesanan</label>
<input id="order" name="order" type="text" class="form-control" value="<?= h($lookupOrder) ?>" placeholder="contoh: SB260526-1234" required>
</div>
<div class="mb-3">
<label class="form-label" for="email">Email checkout</label>
<input id="email" name="email" type="email" class="form-control" value="<?= h($lookupEmail) ?>" required>
</div>
<div class="d-grid gap-2">
<button class="btn btn-dark" type="submit">Tampilkan status</button>
<a class="btn btn-outline-secondary" href="index.php#catalog">Belanja lagi</a>
</div>
<div class="info-box mt-4 mb-0">
<div class="card-kicker">Status default</div>
<div class="status-legend">
<?php foreach (store_status_steps() as $step): ?>
<div class="status-legend__item">
<span class="<?= h(store_status_class($step['value'])) ?>"><?= h($step['label']) ?></span>
<p class="mb-0"><?= h($step['description']) ?></p>
</div>
<?php endforeach; ?>
</div>
</div>
</form>
</div>
<div class="col-lg-8">
<?php if ($searchError !== ''): ?>
<div class="alert alert-warning border-0 shadow-sm mb-4" role="alert">
<?= h($searchError) ?>
</div>
<?php endif; ?>
<?php if ($order): ?>
<section class="surface-panel p-4 p-lg-5 mb-4">
<div class="d-flex flex-column flex-lg-row align-items-lg-start justify-content-between gap-3 mb-4">
<div>
<div class="card-kicker">Order detail</div>
<h2 class="section-title mb-2"><?= h((string)$order['order_number']) ?></h2>
<p class="section-copy mb-0">Dibuat pada <?= h(store_format_datetime((string)$order['created_at'])) ?></p>
</div>
<span class="<?= h(store_status_class((string)$order['status'])) ?>"><?= h((string)$order['status']) ?></span>
</div>
<div class="row g-3 mb-4">
<div class="col-md-4">
<div class="metric-card h-100">
<div class="metric-value metric-value--small"><?= h(store_money((float)$order['grand_total'])) ?></div>
<div class="metric-label">total pembayaran</div>
</div>
</div>
<div class="col-md-4">
<div class="metric-card h-100">
<div class="metric-value metric-value--small"><?= h((string)$order['payment_method_label']) ?></div>
<div class="metric-label">metode bayar</div>
</div>
</div>
<div class="col-md-4">
<div class="metric-card h-100">
<div class="metric-value metric-value--small"><?= h((string)count($order['items'])) ?> item</div>
<div class="metric-label">jumlah item di order</div>
</div>
</div>
</div>
<div class="row g-4">
<div class="col-lg-7">
<h3 class="h6 text-uppercase text-muted mb-3">Item pesanan</h3>
<div class="table-responsive">
<table class="table align-middle table-borderless order-table mb-0">
<thead>
<tr>
<th>Produk</th>
<th class="text-center">Qty</th>
<th class="text-end">Total</th>
</tr>
</thead>
<tbody>
<?php foreach ($order['items'] as $item): ?>
<tr>
<td>
<strong><?= h((string)$item['name']) ?></strong>
<div class="small text-muted"><?= h(store_money((float)$item['price'])) ?> / item</div>
</td>
<td class="text-center"><?= h((string)$item['quantity']) ?></td>
<td class="text-end"><?= h(store_money((float)$item['line_total'])) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
<tfoot>
<tr>
<td colspan="2">Subtotal</td>
<td class="text-end"><?= h(store_money((float)$order['subtotal'])) ?></td>
</tr>
<tr>
<td colspan="2">Ongkir</td>
<td class="text-end"><?= h(store_money((float)$order['shipping_fee'])) ?></td>
</tr>
<tr class="fw-semibold">
<td colspan="2">Grand total</td>
<td class="text-end"><?= h(store_money((float)$order['grand_total'])) ?></td>
</tr>
</tfoot>
</table>
</div>
</div>
<div class="col-lg-5">
<div class="info-box mb-3">
<div class="card-kicker">Data penerima</div>
<p class="mb-1"><strong><?= h((string)$order['customer_name']) ?></strong></p>
<p class="mb-1"><?= h((string)$order['email']) ?></p>
<p class="mb-1"><?= h((string)$order['phone']) ?></p>
<p class="mb-0"><?= nl2br(h((string)$order['address'])) ?></p>
</div>
<div class="info-box mb-0">
<div class="card-kicker">Instruksi pembayaran</div>
<p class="mb-2"><?= h((string)$order['payment_instruction']) ?></p>
<?php if (!empty($order['note'])): ?>
<div class="note-copy"><strong>Catatan pelanggan:</strong> <?= h((string)$order['note']) ?></div>
<?php endif; ?>
</div>
</div>
</div>
</section>
<?php if ((string)$order['status'] !== 'Batal'): ?>
<?php $currentIndex = store_status_index((string)$order['status']); ?>
<section class="surface-panel p-4 p-lg-5">
<div class="card-kicker">Progress pesanan</div>
<div class="timeline-list mt-3">
<?php foreach (store_status_steps() as $index => $step): ?>
<?php
$stateClass = 'timeline-step';
if ($index < $currentIndex) {
$stateClass .= ' is-complete';
} elseif ($index === $currentIndex) {
$stateClass .= ' is-current';
}
?>
<div class="<?= h($stateClass) ?>">
<div class="timeline-step__dot"></div>
<div>
<div class="timeline-step__title"><?= h($step['label']) ?></div>
<p class="timeline-step__copy mb-0"><?= h($step['description']) ?></p>
</div>
</div>
<?php endforeach; ?>
</div>
</section>
<?php endif; ?>
<?php else: ?>
<section class="empty-state-card">
<span class="eyebrow">Belum ada detail</span>
<h2 class="section-title">Masukkan kode pesanan untuk melihat status.</h2>
<p class="section-copy">Setelah checkout berhasil, halaman ini akan menampilkan ringkasan item, total pembayaran, dan progress status order.</p>
<ul class="list-clean compact-list mt-4 mb-0">
<li><span class="list-index">1</span><span>Masuk dari checkout otomatis akan mengisi kode pesanan terbaru.</span></li>
<li><span class="list-index">2</span><span>Untuk kunjungan berikutnya, pelanggan cukup ingat order number dan email.</span></li>
<li><span class="list-index">3</span><span>Status pesanan kini bisa diperbarui lewat admin lite internal.</span></li>
</ul>
</section>
<?php endif; ?>
</div>
</div>
</section>
<?php store_page_end(); ?>