false, 'message' => 'Invalid ID']);
exit;
}
header('Location: admin_truck_owners.php');
exit;
}
$errors = [];
$flash = null;
// Fetch Truck Owner Profile
$stmt = db()->prepare("
SELECT u.id, u.email, u.full_name, u.status, u.role,
p.phone, p.address_line, p.country_id, p.city_id,
p.truck_type, p.load_capacity, p.plate_no, p.bank_account, p.bank_name, p.bank_branch,
p.id_card_path, p.truck_pic_path, p.registration_path
FROM users u
LEFT JOIN truck_owner_profiles p ON u.id = p.user_id
WHERE u.id = ? AND u.role = 'truck_owner'
");
$stmt->execute([$userId]);
$owner = $stmt->fetch();
if (!$owner) {
if ($isAjax) {
echo json_encode(['success' => false, 'message' => 'Owner not found']);
exit;
}
header('Location: admin_truck_owners.php');
exit;
}
$countries = db()->query("SELECT id, name_en, name_ar FROM countries ORDER BY name_en ASC")->fetchAll();
$cities = db()->query("SELECT id, country_id, name_en, name_ar FROM cities ORDER BY name_en ASC")->fetchAll();
if ($_SERVER['REQUEST_METHOD'] === 'POST') { validate_csrf_token();
$fullName = trim($_POST['full_name'] ?? '');
$email = trim($_POST['email'] ?? '');
$phone = trim($_POST['phone'] ?? '');
$countryId = (int)($_POST['country_id'] ?? 0);
$cityId = (int)($_POST['city_id'] ?? 0);
$addressLine = trim($_POST['address_line'] ?? '');
$truckType = trim($_POST['truck_type'] ?? '');
$loadCapacity = trim($_POST['load_capacity'] ?? '');
$plateNo = trim($_POST['plate_no'] ?? '');
$status = trim($_POST['status'] ?? '');
$password = $_POST['password'] ?? '';
$bankAccount = trim($_POST['bank_account'] ?? '');
$bankName = trim($_POST['bank_name'] ?? '');
$bankBranch = trim($_POST['bank_branch'] ?? '');
if ($fullName === '') $errors[] = 'Full name is required.';
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $errors[] = 'Valid email is required.';
if ($phone === '') $errors[] = 'Phone number is required.';
if (!in_array($status, ['pending', 'active', 'rejected'], true)) $errors[] = 'Invalid status.';
if ($truckType === '' || $loadCapacity === '' || $plateNo === '') {
$errors[] = 'Truck type, load capacity, and plate number are required.';
} elseif (!is_numeric($loadCapacity) || (float)$loadCapacity <= 0) {
$errors[] = 'Load capacity must be a positive number.';
}
if ($countryId <= 0 || $cityId <= 0) {
$errors[] = 'Please select country and city.';
} else {
$cityCheck = db()->prepare("SELECT COUNT(*) FROM cities WHERE id = ? AND country_id = ?");
$cityCheck->execute([$cityId, $countryId]);
if ((int)$cityCheck->fetchColumn() === 0) {
$errors[] = 'Selected city does not belong to selected country.';
}
}
if (!$errors) {
try {
db()->beginTransaction();
$stmtUser = db()->prepare("UPDATE users SET full_name = ?, email = ?, status = ? WHERE id = ? AND role = 'truck_owner'");
$stmtUser->execute([$fullName, $email, $status, $userId]);
if ($password !== '') {
$stmtPass = db()->prepare("UPDATE users SET password = ? WHERE id = ? AND role = 'truck_owner'");
$stmtPass->execute([password_hash($password, PASSWORD_DEFAULT), $userId]);
}
$stmtProfile = db()->prepare("
UPDATE truck_owner_profiles
SET phone = ?, address_line = ?, country_id = ?, city_id = ?,
truck_type = ?, load_capacity = ?, plate_no = ?,
bank_account = ?, bank_name = ?, bank_branch = ?
WHERE user_id = ?
");
$stmtProfile->execute([$phone, $addressLine, $countryId, $cityId, $truckType, $loadCapacity, $plateNo, $bankAccount, $bankName, $bankBranch, $userId]);
db()->commit();
$flash = 'Truck Owner profile updated successfully.';
// If AJAX, return success immediately
if ($isAjax) {
header('Content-Type: application/json');
echo json_encode(['success' => true, 'message' => $flash]);
exit;
}
// Refresh data for non-ajax
$owner['full_name'] = $fullName;
$owner['email'] = $email;
$owner['status'] = $status;
$owner['phone'] = $phone;
$owner['address_line'] = $addressLine;
$owner['country_id'] = $countryId;
$owner['city_id'] = $cityId;
$owner['truck_type'] = $truckType;
$owner['load_capacity'] = $loadCapacity;
$owner['plate_no'] = $plateNo;
$owner['bank_account'] = $bankAccount;
$owner['bank_name'] = $bankName;
$owner['bank_branch'] = $bankBranch;
} catch (Throwable $e) {
db()->rollBack();
if (stripos($e->getMessage(), 'Duplicate entry') !== false) {
$errors[] = 'This email is already in use by another account.';
} else {
$errors[] = 'Failed to update truck owner profile. Please try again.';
}
}
}
if ($isAjax && $errors) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => implode('
', $errors)]);
exit;
}
}
$idCards = json_decode($owner['id_card_path'] ?? '[]', true) ?: [];
$regs = json_decode($owner['registration_path'] ?? '[]', true) ?: [];
$pic = $owner['truck_pic_path'];
// -- OUTPUT START --
if (!$isAjax):
render_header('Edit Truck Owner', 'admin', true);
?>