238 lines
12 KiB
PHP
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';
|
|
?>
|