| Server IP : 72.60.21.38 / Your IP : 216.73.216.25 Web Server : LiteSpeed System : Linux uk-fast-web1372.main-hosting.eu 4.18.0-553.121.1.lve.el8.x86_64 #1 SMP Thu Apr 30 16:40:41 UTC 2026 x86_64 User : u390967363 ( 390967363) PHP Version : 8.2.30 Disable Function : system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail MySQL : OFF | cURL : ON | WGET : ON | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /home/u390967363/domains/aibenproperties.com/public_html/app/ |
Upload File : |
<?php
include 'includes/header.php';
require_once 'includes/db.php';
require_once 'includes/functions.php';
// Access Control
if (!in_array($_SESSION['user_role'], ['admin', 'super_admin', 'estate_manager', 'sales_agent', 'agent', 'client'])) {
header("Location: dashboard.php");
exit;
}
$lease_id = $_GET['id'] ?? null;
if (!$lease_id) {
header("Location: rentals.php");
exit;
}
// Fetch Lease Details
$stmt = $pdo->prepare("
SELECT l.*,
p.title as property_title,
p.property_code,
p.address as property_address,
t.name as tenant_name,
t.email as tenant_email,
t.phone as tenant_phone,
a.name as agent_name
FROM leases l
JOIN properties p ON l.property_id = p.id
JOIN users t ON l.tenant_id = t.id
LEFT JOIN users a ON l.agent_id = a.id
WHERE l.id = ?
");
$stmt->execute([$lease_id]);
$lease = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$lease) {
echo "<div class='container mt-5'><div class='alert alert-danger'>Lease not found.</div></div>";
include 'includes/footer.php';
exit;
}
// Permission Check: Agent can only view their own leases, Client can only view their own
if ($_SESSION['user_role'] == 'agent' && $lease['agent_id'] != $_SESSION['user_id']) {
echo "<div class='container mt-5'><div class='alert alert-danger'>Access Denied.</div></div>";
include 'includes/footer.php';
exit;
}
if ($_SESSION['user_role'] == 'client' && $lease['tenant_id'] != $_SESSION['user_id']) {
echo "<div class='container mt-5'><div class='alert alert-danger'>Access Denied.</div></div>";
include 'includes/footer.php';
exit;
}
// Handle Lease Actions (Terminate, Renew - Admin/Manager Only)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && in_array($_SESSION['user_role'], ['admin', 'super_admin', 'estate_manager'])) {
if (isset($_POST['terminate_lease'])) {
$reason = trim($_POST['reason'] ?? '');
if ($reason === '') {
$success_msg = null;
$error_msg = "Reason is required to terminate a lease.";
} else {
$old = $lease['status'];
$stmt = $pdo->prepare("UPDATE leases SET status = 'terminated', updated_at = NOW() WHERE id = ?");
$stmt->execute([$lease_id]);
// Update Property Status
$stmt = $pdo->prepare("UPDATE properties SET status = 'available' WHERE id = ?");
$stmt->execute([$lease['property_id']]);
auditLogDetailed('lease', $lease_id, $old, 'terminated', $reason);
$success_msg = "Lease terminated successfully.";
$lease['status'] = 'terminated'; // Refresh local
}
}
if (isset($_POST['renew_lease'])) {
$new_end_date = $_POST['new_end_date'];
$reason = trim($_POST['reason'] ?? '');
if ($reason === '') {
$success_msg = null;
$error_msg = "Reason is required to renew a lease.";
} else {
$old = $lease['status'];
$stmt = $pdo->prepare("UPDATE leases SET end_date = ?, status = 'active', updated_at = NOW() WHERE id = ?");
$stmt->execute([$new_end_date, $lease_id]);
auditLogDetailed('lease', $lease_id, $old, 'active', $reason);
$success_msg = "Lease renewed successfully.";
$lease['end_date'] = $new_end_date;
$lease['status'] = 'active';
}
}
}
// Fetch Payments
$stmt = $pdo->prepare("SELECT * FROM payments WHERE lease_id = ? ORDER BY date DESC");
$stmt->execute([$lease_id]);
$payments = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Fetch Documents
$stmt = $pdo->prepare("
SELECT d.*,
(SELECT MAX(version_number) FROM document_versions WHERE document_id = d.id) as latest_version
FROM documents d
WHERE d.property_id = ? OR (d.user_id = ? AND d.type IN ('contract', 'receipt'))
ORDER BY d.created_at DESC
");
// Note: This fetches docs related to the property or the tenant.
// A better link might be needed if we had a direct 'lease_id' in documents,
// but currently we link via property or user.
$stmt->execute([$lease['property_id'], $lease['tenant_id']]);
$documents = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<div class="container-fluid px-4">
<div class="d-flex justify-content-between align-items-center mt-4 mb-4">
<div>
<h2 class="text-navy fw-bold">Lease Details</h2>
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="rentals.php" class="text-decoration-none">Rentals</a></li>
<li class="breadcrumb-item active" aria-current="page"><?= htmlspecialchars($lease['property_title']) ?></li>
</ol>
</nav>
</div>
<div class="d-flex gap-2">
<?php if (in_array($_SESSION['user_role'], ['admin', 'super_admin', 'estate_manager', 'finance'])): ?>
<a href="rent-payment.php?lease_id=<?= $lease_id ?>" class="btn btn-success">
<i class="fa-solid fa-money-bill-wave me-2"></i>Record Payment
</a>
<?php endif; ?>
<?php if (in_array($_SESSION['user_role'], ['admin', 'super_admin', 'estate_manager'])): ?>
<div class="dropdown">
<button class="btn btn-primary dropdown-toggle" type="button" data-bs-toggle="dropdown">
<i class="fa-solid fa-gear me-2"></i>Actions
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#" data-bs-toggle="modal" data-bs-target="#renewModal">Renew Lease</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item text-danger" href="#" data-bs-toggle="modal" data-bs-target="#terminateModal">Terminate Lease</a></li>
</ul>
</div>
<?php endif; ?>
</div>
</div>
<?php if (isset($success_msg)): ?>
<div class="alert alert-success alert-dismissible fade show"><?= $success_msg ?><button type="button" class="btn-close" data-bs-dismiss="alert"></button></div>
<?php endif; ?>
<?php if (isset($error_msg)): ?>
<div class="alert alert-danger alert-dismissible fade show"><?= htmlspecialchars($error_msg) ?><button type="button" class="btn-close" data-bs-dismiss="alert"></button></div>
<?php endif; ?>
<div class="row">
<!-- Main Info -->
<div class="col-xl-8">
<!-- Property & Lease Info -->
<div class="card border-0 shadow-sm mb-4">
<div class="card-header bg-white fw-bold text-navy py-3">
<i class="fa-solid fa-house-chimney me-2"></i>Property & Lease Information
</div>
<div class="card-body">
<div class="row mb-4">
<div class="col-md-6">
<h5 class="fw-bold"><?= htmlspecialchars($lease['property_title']) ?></h5>
<p class="text-muted mb-1"><?= htmlspecialchars($lease['property_address']) ?></p>
<span class="badge bg-light text-dark border"><?= htmlspecialchars($lease['property_code']) ?></span>
</div>
<div class="col-md-6 text-md-end">
<div class="mb-1">Status: <span class="badge <?= getStatusBadgeClass($lease['status']) ?> fs-6"><?= ucfirst($lease['status']) ?></span></div>
<div class="text-muted small">Created: <?= formatDate($lease['created_at']) ?></div>
</div>
</div>
<div class="row g-3">
<div class="col-md-3">
<div class="p-3 bg-light rounded">
<small class="text-muted d-block text-uppercase">Rent Amount</small>
<span class="fw-bold fs-5"><?= formatCurrency($lease['rent_amount']) ?></span>
<small class="text-muted d-block">per <?= $lease['payment_frequency'] ?></small>
</div>
</div>
<div class="col-md-3">
<div class="p-3 bg-light rounded">
<small class="text-muted d-block text-uppercase">Start Date</small>
<span class="fw-bold fs-5"><?= date('M d, Y', strtotime($lease['start_date'])) ?></span>
</div>
</div>
<div class="col-md-3">
<div class="p-3 bg-light rounded">
<small class="text-muted d-block text-uppercase">End Date</small>
<span class="fw-bold fs-5"><?= date('M d, Y', strtotime($lease['end_date'])) ?></span>
</div>
</div>
<div class="col-md-3">
<div class="p-3 bg-light rounded">
<small class="text-muted d-block text-uppercase">Deposit</small>
<span class="fw-bold fs-5"><?= formatCurrency($lease['deposit_amount']) ?></span>
</div>
</div>
</div>
</div>
</div>
<!-- Payment History -->
<div class="card border-0 shadow-sm mb-4">
<div class="card-header bg-white fw-bold text-navy py-3 d-flex justify-content-between align-items-center">
<span><i class="fa-solid fa-history me-2"></i>Payment History</span>
<span class="badge bg-secondary rounded-pill"><?= count($payments) ?></span>
</div>
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead class="table-light">
<tr>
<th>Date</th>
<th>Ref</th>
<th>Method</th>
<th>Amount</th>
<th>Status</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php if (count($payments) > 0): ?>
<?php foreach ($payments as $p): ?>
<tr>
<td><?= date('M d, Y', strtotime($p['date'])) ?></td>
<td><small class="text-muted"><?= htmlspecialchars($p['reference']) ?></small></td>
<td><?= ucfirst($p['method']) ?></td>
<td class="fw-bold"><?= formatCurrency($p['amount']) ?></td>
<td>
<?php
$badgeClass = match($p['status']) {
'approved' => 'bg-success',
'verified' => 'bg-info',
'pending_confirmation' => 'bg-warning text-dark',
'failed' => 'bg-danger',
default => 'bg-secondary'
};
?>
<span class="badge <?= $badgeClass ?>"><?= ucfirst(str_replace('_', ' ', $p['status'])) ?></span>
</td>
<td>
<a href="#" class="btn btn-sm btn-light" title="View Receipt"><i class="fa-solid fa-file-invoice"></i></a>
</td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr><td colspan="6" class="text-center py-4 text-muted">No payments recorded yet.</td></tr>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
<!-- Documents -->
<div class="card border-0 shadow-sm mb-4">
<div class="card-header bg-white fw-bold text-navy py-3 d-flex justify-content-between align-items-center">
<span><i class="fa-solid fa-folder-open me-2"></i>Documents</span>
<a href="documents.php" class="btn btn-sm btn-outline-primary">Manage Docs</a>
</div>
<div class="card-body">
<?php if (count($documents) > 0): ?>
<div class="list-group list-group-flush">
<?php foreach ($documents as $doc): ?>
<div class="list-group-item d-flex justify-content-between align-items-center px-0">
<div class="d-flex align-items-center">
<div class="me-3 text-danger fs-4"><i class="fa-solid fa-file-pdf"></i></div>
<div>
<h6 class="mb-0 fw-bold"><?= htmlspecialchars($doc['title']) ?></h6>
<small class="text-muted">v<?= $doc['latest_version'] ?? '1.0' ?> • <?= formatDate($doc['created_at']) ?></small>
</div>
</div>
<div>
<span class="badge <?= getStatusBadgeClass($doc['status']) ?> me-2"><?= ucfirst($doc['status']) ?></span>
<a href="<?= htmlspecialchars($doc['file_path']) ?>" target="_blank" class="btn btn-sm btn-light"><i class="fa-solid fa-download"></i></a>
</div>
</div>
<?php endforeach; ?>
</div>
<?php else: ?>
<p class="text-muted text-center py-3 mb-0">No documents found for this lease.</p>
<?php endif; ?>
</div>
</div>
</div>
<!-- Sidebar -->
<div class="col-xl-4">
<!-- Tenant Card -->
<div class="card border-0 shadow-sm mb-4">
<div class="card-header bg-white fw-bold text-navy py-3">
<i class="fa-solid fa-user me-2"></i>Tenant Information
</div>
<div class="card-body text-center py-4">
<div class="avatar-circle bg-navy text-white mx-auto mb-3 fs-2 d-flex align-items-center justify-content-center" style="width: 80px; height: 80px; border-radius: 50%;">
<?= strtoupper(substr($lease['tenant_name'], 0, 1)) ?>
</div>
<h5 class="fw-bold mb-1"><?= htmlspecialchars($lease['tenant_name']) ?></h5>
<p class="text-muted mb-3"><?= htmlspecialchars($lease['tenant_email']) ?></p>
<div class="d-grid gap-2">
<a href="mailto:<?= htmlspecialchars($lease['tenant_email']) ?>" class="btn btn-outline-secondary btn-sm"><i class="fa-solid fa-envelope me-2"></i>Send Email</a>
<?php if(!empty($lease['tenant_phone'])): ?>
<a href="tel:<?= htmlspecialchars($lease['tenant_phone']) ?>" class="btn btn-outline-secondary btn-sm"><i class="fa-solid fa-phone me-2"></i>Call Tenant</a>
<?php endif; ?>
</div>
</div>
<div class="card-footer bg-light">
<small class="text-muted">Agent:</small>
<span class="fw-bold text-navy float-end"><?= htmlspecialchars($lease['agent_name'] ?? 'Unassigned') ?></span>
</div>
</div>
<!-- Reminder / Notes (Placeholder) -->
<div class="card border-0 shadow-sm">
<div class="card-header bg-white fw-bold text-navy py-3">
<i class="fa-solid fa-note-sticky me-2"></i>Quick Notes
</div>
<div class="card-body">
<textarea class="form-control mb-2" rows="4" placeholder="Add a private note about this lease..."></textarea>
<button class="btn btn-sm btn-primary float-end">Save Note</button>
</div>
</div>
</div>
</div>
</div>
<!-- Renew Modal -->
<div class="modal fade" id="renewModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Renew Lease</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<form method="POST">
<div class="modal-body">
<input type="hidden" name="renew_lease" value="1">
<div class="mb-3">
<label class="form-label">New End Date</label>
<input type="date" name="new_end_date" class="form-control" required min="<?= date('Y-m-d') ?>">
</div>
<div class="mb-3">
<label class="form-label">Reason</label>
<textarea name="reason" class="form-control" rows="3" required placeholder="Reason for renewal"></textarea>
</div>
<div class="alert alert-info small">
This will extend the lease and set status to Active.
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-primary">Renew Lease</button>
</div>
</form>
</div>
</div>
</div>
<!-- Terminate Modal -->
<div class="modal fade" id="terminateModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title text-danger">Terminate Lease</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<form method="POST">
<div class="modal-body">
<input type="hidden" name="terminate_lease" value="1">
<p>Are you sure you want to terminate this lease? This action cannot be undone.</p>
<div class="mb-3">
<label class="form-label">Reason</label>
<textarea name="reason" class="form-control" rows="3" required placeholder="Reason for termination"></textarea>
</div>
<div class="alert alert-warning small">
The property status will be set to 'Available'.
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-danger">Terminate</button>
</div>
</form>
</div>
</div>
</div>
<?php include 'includes/footer.php'; ?>