38929-vm/order_details.php
2026-03-02 10:30:11 +00:00

238 lines
12 KiB
PHP

<?php
// ACTION HANDLING FIRST
require_once __DIR__ . '/db/config.php';
require_once __DIR__ . '/includes/lang.php';
$order_id = $_GET['id'] ?? null;
if (!$order_id) {
header('Location: orders.php');
exit;
}
$stmt = db()->prepare("SELECT o.*, c.name_en as customer_name_en, c.name_ar as customer_name_ar, c.phone as customer_phone, c.address_en as customer_address_en, c.address_ar as customer_address_ar
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.id
WHERE o.id = ?");
$stmt->execute([$order_id]);
$order = $stmt->fetch();
if (!$order) {
echo "Order not found";
exit;
}
// Handle status updates
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) {
if ($_POST['action'] === 'update_status') {
$new_status = $_POST['status'];
$stmt = db()->prepare("UPDATE orders SET status = ? WHERE id = ?");
$stmt->execute([$new_status, $order_id]);
header("Location: order_details.php?id=$order_id");
exit;
} elseif ($_POST['action'] === 'add_payment') {
$amount = $_POST['amount'];
$method = $_POST['payment_method'];
$stmt = db()->prepare("INSERT INTO payments (order_id, amount, payment_method) VALUES (?, ?, ?)");
$stmt->execute([$order_id, $amount, $method]);
$stmt = db()->prepare("SELECT SUM(amount) as total_paid FROM payments WHERE order_id = ?");
$stmt->execute([$order_id]);
$total_paid = $stmt->fetch()['total_paid'] ?? 0;
$payment_status = $total_paid >= $order['total_price'] ? 'paid' : ($total_paid > 0 ? 'partially_paid' : 'unpaid');
$stmt = db()->prepare("UPDATE orders SET payment_status = ? WHERE id = ?");
$stmt->execute([$payment_status, $order_id]);
header("Location: order_details.php?id=$order_id");
exit;
}
}
// NOW Include header
$title = 'order_details';
require_once __DIR__ . '/includes/header.php';
$stmt = db()->prepare("SELECT oi.*, i.name_en as item_en, i.name_ar as item_ar,
s.name_en as service_en, s.name_ar as service_ar,
v.name_en as variant_en, v.name_ar as variant_ar
FROM order_items oi
JOIN items i ON oi.item_id = i.id
JOIN services s ON oi.service_id = s.id
LEFT JOIN item_variants v ON oi.variant_id = v.id
WHERE oi.order_id = ?");
$stmt->execute([$order_id]);
$order_items = $stmt->fetchAll();
$stmt = db()->prepare("SELECT * FROM payments WHERE order_id = ?");
$stmt->execute([$order_id]);
$payments = $stmt->fetchAll();
?>
<div class="row">
<div class="col-md-8">
<div class="card p-4 mb-4">
<div class="d-flex justify-content-between align-items-center mb-4">
<h5 class="fw-bold mb-0"><?= __('order') ?> #<?= $order['order_number'] ?></h5>
<span class="badge bg-<?= getStatusColor($order['status']) ?> fs-6 px-3 py-2"><?= __($order['status']) ?></span>
</div>
<div class="table-responsive mb-4">
<table class="table align-middle">
<thead>
<tr>
<th><?= __('item') ?></th>
<th><?= __('service') ?></th>
<th><?= __('quantity') ?></th>
<th class="text-end"><?= __('price') ?></th>
<th class="text-end"><?= __('vat') ?></th>
<th class="text-end"><?= __('subtotal') ?></th>
</tr>
</thead>
<tbody>
<?php
$subtotal_sum = 0;
foreach($order_items as $item):
$subtotal_sum += $item['subtotal'];
?>
<tr>
<td>
<?= $lang === 'ar' ? ($item['item_ar'] ?: $item['item_en']) : $item['item_en'] ?>
<?php if($item['variant_id']): ?>
<br><small class="text-muted"><?= $lang === 'ar' ? $item['variant_ar'] : $item['variant_en'] ?></small>
<?php endif; ?>
</td>
<td><?= $lang === 'ar' ? ($item['service_ar'] ?: $item['service_en']) : $item['service_en'] ?></td>
<td><?= $item['quantity'] ?></td>
<td class="text-end"><?= number_format($item['unit_price'], 2) ?> SAR</td>
<td class="text-end"><?= number_format($item['vat_amount'] * $item['quantity'], 2) ?> SAR</td>
<td class="text-end"><?= number_format($item['subtotal'] + ($item['vat_amount'] * $item['quantity']), 2) ?> SAR</td>
</tr>
<?php endforeach; ?>
</tbody>
<tfoot>
<tr>
<th colspan="5" class="text-end"><?= __('subtotal') ?></th>
<th class="text-end"><?= number_format($subtotal_sum, 2) ?> SAR</th>
</tr>
<tr>
<th colspan="5" class="text-end"><?= __('vat_total') ?? 'VAT Total' ?></th>
<th class="text-end"><?= number_format($order['vat_total'], 2) ?> SAR</th>
</tr>
<tr>
<th colspan="5" class="text-end"><?= __('total') ?></th>
<th class="text-end fs-5 text-primary"><?= number_format($order['total_price'], 2) ?> SAR</th>
</tr>
</tfoot>
</table>
</div>
<div class="row mt-4">
<div class="col-md-6">
<h6 class="fw-bold"><?= __('customer_details') ?></h6>
<p class="mb-1"><strong><?= $lang === 'ar' ? ($order['customer_name_ar'] ?: $order['customer_name_en']) : $order['customer_name_en'] ?></strong></p>
<p class="mb-1"><?= $order['customer_phone'] ?></p>
<p class="mb-0 text-muted"><?= $lang === 'ar' ? ($order['customer_address_ar'] ?: $order['customer_address_en']) : $order['customer_address_en'] ?></p>
</div>
<div class="col-md-6 text-md-end">
<h6 class="fw-bold"><?= __('order_date') ?></h6>
<p><?= date('d M Y, h:i A', strtotime($order['created_at'])) ?></p>
</div>
</div>
</div>
<div class="card p-4">
<h5 class="fw-bold mb-4"><?= __('payments') ?></h5>
<div class="table-responsive">
<table class="table">
<thead>
<tr>
<th><?= __('date') ?></th>
<th><?= __('method') ?></th>
<th class="text-end"><?= __('amount') ?></th>
</tr>
</thead>
<tbody>
<?php foreach($payments as $p): ?>
<tr>
<td><?= date('d M Y, h:i A', strtotime($p['created_at'])) ?></td>
<td><?= __($p['payment_method']) ?></td>
<td class="text-end"><?= number_format($p['amount'], 2) ?> SAR</td>
</tr>
<?php endforeach; ?>
<?php if (empty($payments)): ?>
<tr>
<td colspan="3" class="text-center text-muted"><?= __('no_payments') ?></td>
</tr>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card p-4 mb-4">
<h5 class="fw-bold mb-4"><?= __('actions') ?></h5>
<form method="POST" class="mb-4">
<input type="hidden" name="action" value="update_status">
<label class="form-label small text-muted"><?= __('update_status') ?></label>
<div class="input-group">
<select name="status" class="form-select" style="border-radius: 12px 0 0 12px;">
<option value="received" <?= $order['status'] == 'received' ? 'selected' : '' ?>><?= __('received') ?></option>
<option value="processing" <?= $order['status'] == 'processing' ? 'selected' : '' ?>><?= __('processing') ?></option>
<option value="ready" <?= $order['status'] == 'ready' ? 'selected' : '' ?>><?= __('ready') ?></option>
<option value="delivered" <?= $order['status'] == 'delivered' ? 'selected' : '' ?>><?= __('delivered') ?></option>
<option value="cancelled" <?= $order['status'] == 'cancelled' ? 'selected' : '' ?>><?= __('cancelled') ?></option>
</select>
<button type="submit" class="btn btn-primary" style="border-radius: 0 12px 12px 0;"><?= __('update') ?></button>
</div>
</form>
<hr>
<?php
$stmt = db()->prepare("SELECT SUM(amount) as total_paid FROM payments WHERE order_id = ?");
$stmt->execute([$order_id]);
$total_paid = $stmt->fetch()['total_paid'] ?? 0;
$remaining = $order['total_price'] - $total_paid;
?>
<div class="alert alert-<?= $remaining <= 0 ? 'success' : 'warning' ?> p-2 px-3 small rounded-4">
<?= __('remaining_amount') ?>: <strong><?= number_format(max(0, $remaining), 2) ?> SAR</strong>
</div>
<?php if ($remaining > 0): ?>
<form method="POST">
<input type="hidden" name="action" value="add_payment">
<div class="mb-3">
<label class="form-label small text-muted"><?= __('amount') ?></label>
<input type="number" step="0.01" name="amount" class="form-control" value="<?= $remaining ?>" required style="border-radius: 12px;">
</div>
<div class="mb-3">
<label class="form-label small text-muted"><?= __('payment_method') ?></label>
<select name="payment_method" class="form-select" style="border-radius: 12px;">
<option value="cash"><?= __('cash') ?></option>
<option value="card"><?= __('card') ?></option>
<option value="transfer"><?= __('transfer') ?></option>
</select>
</div>
<button type="submit" class="btn btn-success w-100 py-2" style="border-radius: 12px;"><?= __('add_payment') ?></button>
</form>
<?php endif; ?>
<button class="btn btn-outline-dark w-100 mt-3 py-2" style="border-radius: 12px;" onclick="window.print()">
<i class="bi bi-printer me-1"></i> <?= __('print_invoice') ?>
</button>
</div>
</div>
</div>
<?php
function getStatusColor($status) {
return [
'received' => 'secondary',
'processing' => 'primary',
'ready' => 'success',
'delivered' => 'dark',
'cancelled' => 'danger',
][$status] ?? 'info';
}
require_once __DIR__ . '/includes/footer.php';
?>