151 lines
7.2 KiB
PHP
151 lines
7.2 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
require_once __DIR__ . '/includes/layout.php';
|
|
|
|
ensure_schema();
|
|
|
|
$shipmentId = (int) ($_GET['id'] ?? 0);
|
|
$shipment = null;
|
|
|
|
if ($shipmentId > 0) {
|
|
$stmt = db()->prepare("SELECT * FROM shipments WHERE id = :id");
|
|
$stmt->execute([':id' => $shipmentId]);
|
|
$shipment = $stmt->fetch();
|
|
}
|
|
|
|
$errors = [];
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'submit_offer') {
|
|
$offerOwner = trim($_POST['offer_owner'] ?? '');
|
|
$offerPrice = trim($_POST['offer_price'] ?? '');
|
|
if ($offerOwner === '' || $offerPrice === '') {
|
|
$errors[] = t('error_required');
|
|
} elseif (!is_numeric($offerPrice)) {
|
|
$errors[] = t('error_invalid');
|
|
} else {
|
|
$stmt = db()->prepare(
|
|
"UPDATE shipments SET offer_owner = :offer_owner, offer_price = :offer_price, status = 'offered'
|
|
WHERE id = :id"
|
|
);
|
|
$stmt->execute([
|
|
':offer_owner' => $offerOwner,
|
|
':offer_price' => $offerPrice,
|
|
':id' => $shipmentId,
|
|
]);
|
|
set_flash('success', t('success_offer'));
|
|
header('Location: ' . url_with_lang('shipment_detail.php', ['id' => $shipmentId]));
|
|
exit;
|
|
}
|
|
}
|
|
|
|
$flash = get_flash();
|
|
$isAdmin = ($_SESSION['user_role'] ?? '') === 'admin';
|
|
|
|
render_header(t('shipment_detail'));
|
|
?>
|
|
|
|
<?php if (!$shipment): ?>
|
|
<div class="panel p-4">
|
|
<p class="muted mb-0"><?= e(t('no_shipments')) ?></p>
|
|
<div class="mt-3">
|
|
<?php if ($isAdmin): ?>
|
|
<a href="<?= e(url_with_lang('admin_shipments.php')) ?>" class="btn btn-outline-primary">Back to Shipments</a>
|
|
<?php else: ?>
|
|
<a href="<?= e(url_with_lang('index.php')) ?>" class="btn btn-outline-primary"><?= e(t('nav_home')) ?></a>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
<?php else: ?>
|
|
<div class="row g-4">
|
|
<div class="col-lg-7">
|
|
<div class="panel p-4">
|
|
<div class="d-flex justify-content-between align-items-start mb-3">
|
|
<div>
|
|
<h2 class="section-title mb-1"><?= e(t('shipment_detail')) ?> #<?= e($shipment['id']) ?></h2>
|
|
<p class="muted mb-0"><?= e(t('created_at')) ?>: <?= e($shipment['created_at']) ?></p>
|
|
</div>
|
|
<span class="badge-status <?= e($shipment['status']) ?>"><?= e(status_label($shipment['status'])) ?></span>
|
|
</div>
|
|
<div class="row g-3">
|
|
<div class="col-md-6">
|
|
<div class="small text-muted"><?= e(t('shipper_company')) ?></div>
|
|
<div class="fw-semibold"><?= e($shipment['shipper_company']) ?></div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="small text-muted"><?= e(t('shipper_name')) ?></div>
|
|
<div class="fw-semibold"><?= e($shipment['shipper_name']) ?></div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="small text-muted"><?= e(t('origin')) ?></div>
|
|
<div class="fw-semibold"><?= e($shipment['origin_city']) ?></div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="small text-muted"><?= e(t('destination')) ?></div>
|
|
<div class="fw-semibold"><?= e($shipment['destination_city']) ?></div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="small text-muted"><?= e(t('cargo')) ?></div>
|
|
<div class="fw-semibold"><?= e($shipment['cargo_description']) ?></div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="small text-muted"><?= e(t('weight')) ?></div>
|
|
<div class="fw-semibold"><?= e($shipment['weight_tons']) ?></div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="small text-muted"><?= e(t('pickup_date')) ?></div>
|
|
<div class="fw-semibold"><?= e($shipment['pickup_date']) ?></div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="small text-muted"><?= e(t('delivery_date')) ?></div>
|
|
<div class="fw-semibold"><?= e($shipment['delivery_date']) ?></div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="small text-muted"><?= e(t('payment_method')) ?></div>
|
|
<div class="fw-semibold"><?= e($shipment['payment_method'] === 'bank_transfer' ? t('payment_bank') : t('payment_thawani')) ?></div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="small text-muted"><?= e(t('best_offer')) ?></div>
|
|
<div class="fw-semibold"><?= $shipment['offer_price'] ? e($shipment['offer_price'] . ' / ' . ($shipment['offer_owner'] ?? '')) : e(t('no_offers')) ?></div>
|
|
</div>
|
|
</div>
|
|
<div class="mt-4 d-flex gap-2">
|
|
<?php if ($isAdmin): ?>
|
|
<a class="btn btn-outline-dark" href="<?= e(url_with_lang('admin_shipments.php')) ?>">
|
|
<i class="bi bi-arrow-left me-2"></i>Back to Shipments
|
|
</a>
|
|
<a class="btn btn-primary" href="<?= e(url_with_lang('admin_shipment_edit.php', ['id' => $shipmentId])) ?>">
|
|
<i class="bi bi-pencil me-2"></i>Edit Shipment
|
|
</a>
|
|
<?php else: ?>
|
|
<a class="btn btn-outline-dark" href="<?= e(url_with_lang('truck_owner_dashboard.php')) ?>"><?= e(t('nav_owner')) ?></a>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-5">
|
|
<div class="panel p-4">
|
|
<h3 class="section-title"><?= e(t('submit_offer')) ?></h3>
|
|
<?php if ($flash): ?>
|
|
<div class="alert alert-success" data-auto-dismiss="true"><?= e($flash['message']) ?></div>
|
|
<?php endif; ?>
|
|
<?php if ($errors): ?>
|
|
<div class="alert alert-warning"><?= e(implode(' ', $errors)) ?></div>
|
|
<?php endif; ?>
|
|
<form method="post">
|
|
<input type="hidden" name="action" value="submit_offer">
|
|
<div class="mb-3">
|
|
<label class="form-label"><?= e(t('offer_owner')) ?></label>
|
|
<input class="form-control" name="offer_owner" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label"><?= e(t('offer_price')) ?></label>
|
|
<input class="form-control" name="offer_price" type="number" step="0.01" min="0.1" required>
|
|
</div>
|
|
<button class="btn btn-primary w-100" type="submit"><?= e(t('submit_offer')) ?></button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<?php render_footer(); ?>
|