| Server IP : 72.60.21.38 / Your IP : 216.73.217.154 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
if (session_status() === PHP_SESSION_NONE) { session_start(); }
require_once __DIR__ . '/includes/db.php';
require_once __DIR__ . '/includes/functions.php';
include __DIR__ . '/includes/header.php';
global $pdo;
$companyId = function_exists('getCurrentCompanyId') ? getCurrentCompanyId() : 0;
$q = isset($_GET['q']) ? trim($_GET['q']) : '';
$st = isset($_GET['status']) ? trim($_GET['status']) : '';
$d = isset($_GET['d']) ? trim($_GET['d']) : '';
$success_msg = '';
$error_msg = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['approve_dashboard'])) {
$cid = (int)($_POST['approve_dashboard'] ?? 0);
try {
$hasClients = function_exists('tableHasColumn') && tableHasColumn('clients','id');
if ($hasClients && $cid > 0) {
$sel = "SELECT * FROM clients WHERE id = ?";
if ($companyId > 0 && tableHasColumn('clients','company_id')) { $sel .= " AND company_id = " . (int)$companyId; }
$stt = $pdo->prepare($sel);
$stt->execute([$cid]);
$row = $stt->fetch(PDO::FETCH_ASSOC) ?: null;
$verified = false;
if ($row) {
$ps = '';
if (tableHasColumn('clients','payment_status')) { $ps = strtolower(trim($row['payment_status'] ?? '')); }
elseif (tableHasColumn('clients','finance_status')) { $ps = strtolower(trim($row['finance_status'] ?? '')); }
$pv = 0;
if (tableHasColumn('clients','payment_verified')) { $pv = (int)($row['payment_verified'] ?? 0); }
$verified = ($ps === 'verified' || $ps === 'payment verified' || $pv === 1);
if (!$verified) {
try {
$em = (string)($row['email'] ?? '');
$uid = 0;
if ($em !== '') {
$qe = $pdo->prepare("SELECT id FROM users WHERE email = ? LIMIT 1");
$qe->execute([$em]);
$uid = (int)($qe->fetchColumn() ?: 0);
}
if ($uid > 0) {
$ok = false;
if (function_exists('tableHasColumn') && tableHasColumn('payments','user_id')) {
$qs = "SELECT COUNT(*) FROM payments WHERE user_id = ? AND status IN ('verified','approved','completed','paid','success')";
if (tableHasColumn('payments','reference')) { $qs .= " AND reference IN ('FORM_FEE','FORM FEE','form_fee')"; }
$qp = $pdo->prepare($qs);
$qp->execute([$uid]);
$ok = ((int)$qp->fetchColumn() > 0);
}
if (!$ok) {
try {
$hasTx = $pdo->query("SHOW TABLES LIKE 'transactions'")->rowCount() > 0;
if ($hasTx) {
$qt = $pdo->prepare("SELECT COUNT(*) FROM transactions WHERE user_id = ? AND transaction_type = 'form_fee' AND status IN ('approved','verified')");
$qt->execute([$uid]);
$ok = ((int)$qt->fetchColumn() > 0);
}
} catch (Throwable $e2) {}
}
if ($ok) { $verified = true; }
}
} catch (Throwable $e1) {}
}
}
if ($verified) {
$fields = [];
$values = [];
if (tableHasColumn('clients','dashboard_status')) { $fields[] = "dashboard_status = ?"; $values[] = 'active'; }
if (tableHasColumn('clients','is_active')) { $fields[] = "is_active = 1"; }
if (tableHasColumn('clients','activated_at')) { $fields[] = "activated_at = NOW()"; }
if (!$fields && tableHasColumn('clients','status')) { $fields[] = "status = ?"; $values[] = 'active'; }
if ($fields) {
$sql = "UPDATE clients SET " . implode(", ", $fields) . " WHERE id = ?";
$values[] = $cid;
$upd = $pdo->prepare($sql);
$upd->execute($values);
if (function_exists('logActivity')) { logActivity($_SESSION['user_id'] ?? 0, 'Approve Dashboard', 'Client ID '.$cid.' activated'); }
$success_msg = 'Client dashboard successfully activated.';
} else {
$error_msg = 'Activation not supported by current schema.';
}
} else {
$error_msg = 'Payment not verified. Activation blocked.';
}
}
} catch (Throwable $e) {
$error_msg = 'Activation failed.';
}
}
$pendingCount = 0;
$approvedToday = 0;
try {
if (function_exists('tableHasColumn') && tableHasColumn('clients','id')) {
$baseWhere = [];
$params = [];
if ($companyId > 0 && tableHasColumn('clients','company_id')) { $baseWhere[] = "company_id = ?"; $params[] = $companyId; }
$w = $baseWhere ? (" WHERE " . implode(" AND ", $baseWhere)) : "";
if (tableHasColumn('clients','payment_status')) {
$sqlP = "SELECT COUNT(*) FROM clients{$w}" . ($w ? " AND " : " WHERE ") . "LOWER(payment_status) IN ('pending','sent to finance')";
$stp = $pdo->prepare($sqlP);
$stp->execute($params);
$pendingCount = (int)$stp->fetchColumn();
}
if (tableHasColumn('clients','activated_at')) {
$sqlA = "SELECT COUNT(*) FROM clients{$w}" . ($w ? " AND " : " WHERE ") . "DATE(activated_at) = CURDATE()";
$sta = $pdo->prepare($sqlA);
$sta->execute($params);
$approvedToday = (int)$sta->fetchColumn();
}
}
} catch (Throwable $e) {}
$conds = [];
$params = [];
if ($companyId > 0 && function_exists('tableHasColumn') && tableHasColumn('clients','company_id')) { $conds[]="company_id = ?"; $params[]=$companyId; }
if ($q !== '') {
$like = '%' . $q . '%';
$nameExpr = (tableHasColumn('clients','first_name') || tableHasColumn('clients','last_name')) ? "CONCAT(IFNULL(first_name,''),' ',IFNULL(last_name,''))" : (tableHasColumn('clients','name') ? "name" : "''");
$emailExpr = tableHasColumn('clients','email') ? "email" : "''";
$phoneExpr = tableHasColumn('clients','phone') ? "phone" : "''";
$conds[] = "(".$nameExpr." LIKE ? OR ".$emailExpr." LIKE ? OR ".$phoneExpr." LIKE ?)";
$params[] = $like; $params[] = $like; $params[] = $like;
}
if ($d !== '') {
if (tableHasColumn('clients','created_at')) { $conds[] = "DATE(created_at) = ?"; $params[] = $d; }
elseif (tableHasColumn('clients','registration_date')) { $conds[] = "DATE(registration_date) = ?"; $params[] = $d; }
}
if ($st !== '') {
if ($st === 'Pending Verification' && tableHasColumn('clients','payment_status')) { $conds[]="LOWER(payment_status) = 'pending'"; }
elseif ($st === 'Sent to Finance' && tableHasColumn('clients','payment_status')) { $conds[]="LOWER(payment_status) = 'sent to finance'"; }
elseif ($st === 'Payment Verified' && tableHasColumn('clients','payment_status')) { $conds[]="LOWER(payment_status) IN ('verified','payment verified')"; }
elseif ($st === 'Approved') {
if (tableHasColumn('clients','dashboard_status')) { $conds[]="LOWER(dashboard_status) = 'active'"; }
elseif (tableHasColumn('clients','is_active')) { $conds[]="is_active = 1"; }
elseif (tableHasColumn('clients','status')) { $conds[]="LOWER(status) = 'active'"; }
}
}
$nameSel = (tableHasColumn('clients','first_name') || tableHasColumn('clients','last_name')) ? "CONCAT(IFNULL(first_name,''),' ',IFNULL(last_name,'')) AS client_name" : (tableHasColumn('clients','name') ? "name AS client_name" : "'' AS client_name");
$emailSel = tableHasColumn('clients','email') ? "email" : "NULL";
$phoneSel = tableHasColumn('clients','phone') ? "phone" : "NULL";
$estateSel = tableHasColumn('clients','estate_interest') ? "estate_interest" : "NULL";
$regDateSel = tableHasColumn('clients','created_at') ? "created_at" : (tableHasColumn('clients','registration_date') ? "registration_date" : "NULL");
$paySel = tableHasColumn('clients','payment_status') ? "payment_status" : (tableHasColumn('clients','finance_status') ? "finance_status" : "NULL");
$dashSel = tableHasColumn('clients','dashboard_status') ? "dashboard_status" : (tableHasColumn('clients','is_active') ? "IF(is_active=1,'Active','Pending Approval')" : (tableHasColumn('clients','status') ? "status" : "NULL"));
$sql = "SELECT id, {$nameSel}, {$emailSel} AS email, {$phoneSel} AS phone, {$estateSel} AS estate, {$regDateSel} AS reg_date, {$paySel} AS pay_status, {$dashSel} AS dash_status FROM clients";
if ($conds) { $sql .= " WHERE " . implode(" AND ", $conds); }
$orderCol = tableHasColumn('clients','created_at') ? "created_at" : "id";
$sql .= " ORDER BY {$orderCol} DESC LIMIT 20";
$rows = [];
try { $stm = $pdo->prepare($sql); $stm->execute($params); $rows = $stm->fetchAll(PDO::FETCH_ASSOC) ?: []; } catch (Throwable $e) { $rows = []; }
?>
<div class="container-fluid px-4">
<div class="d-flex justify-content-between align-items-center mt-4 mb-4">
<h1 class="h3 mb-0 text-gray-800"><i class="fa-solid fa-user-check me-2"></i>Client Registrations <span class="badge bg-secondary ms-2">Pending Registrations</span></h1>
</div>
<?php if (!empty($success_msg)): ?><div class="alert alert-success"><?= htmlspecialchars($success_msg) ?></div><?php endif; ?>
<?php if (!empty($error_msg)): ?><div class="alert alert-danger"><?= htmlspecialchars($error_msg) ?></div><?php endif; ?>
<div class="row gy-2 mb-3">
<div class="col-xl-3 col-md-6">
<div class="card shadow-sm rounded-3 h-100">
<div class="card-body">
<div class="d-flex align-items-center justify-content-between">
<div>
<div class="text-uppercase small text-muted mb-1">Pending Registrations</div>
<div class="fs-5 fw-bold"><?= (int)$pendingCount ?></div>
</div>
<div class="text-warning"><i class="fa-solid fa-hourglass-half"></i></div>
</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6">
<div class="card shadow-sm rounded-3 h-100">
<div class="card-body">
<div class="d-flex align-items-center justify-content-between">
<div>
<div class="text-uppercase small text-muted mb-1">Approved Today</div>
<div class="fs-5 fw-bold"><?= (int)$approvedToday ?></div>
</div>
<div class="text-success"><i class="fa-solid fa-check-double"></i></div>
</div>
</div>
</div>
</div>
</div>
<div class="card shadow-sm rounded-3 mb-3">
<div class="card-body">
<div class="row g-2 align-items-center">
<div class="col-md-4">
<div class="input-group input-group-sm">
<span class="input-group-text bg-light border-end-0"><i class="fa-solid fa-search"></i></span>
<input type="text" class="form-control border-start-0 bg-light" id="regSearch" placeholder="Search clients... (name, email, phone)" value="<?= htmlspecialchars($q) ?>">
</div>
</div>
<div class="col-md-3">
<select class="form-select form-select-sm" id="regStatus">
<option value="">All</option>
<option <?= $st==='Pending Verification'?'selected':'' ?>>Pending Verification</option>
<option <?= $st==='Sent to Finance'?'selected':'' ?>>Sent to Finance</option>
<option <?= $st==='Payment Verified'?'selected':'' ?>>Payment Verified</option>
<option <?= $st==='Approved'?'selected':'' ?>>Approved</option>
</select>
</div>
<div class="col-md-3">
<input type="date" class="form-control form-control-sm" id="regDate" value="<?= htmlspecialchars($d) ?>">
</div>
<div class="col-md-2">
<button class="btn btn-sm btn-outline-secondary w-100" id="applyFilters"><i class="fa-solid fa-filter me-1"></i>Apply</button>
</div>
</div>
</div>
</div>
<div class="card shadow-sm rounded-3 mb-4">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-navy">Recent Registrations</h6>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover align-middle" width="100%">
<thead class="table-light">
<tr>
<th>Client Name</th>
<th>Email</th>
<th>Phone</th>
<th>Estate Interest</th>
<th>Registration Date</th>
<th>Payment Status</th>
<th>Dashboard Status</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php if (empty($rows)): ?>
<tr><td colspan="8" class="text-center py-4">No client registrations yet.</td></tr>
<?php else: foreach ($rows as $r): ?>
<tr>
<td><?= htmlspecialchars($r['client_name'] ?? '-') ?></td>
<td><?= htmlspecialchars($r['email'] ?? '-') ?></td>
<td><?= htmlspecialchars($r['phone'] ?? '-') ?></td>
<td><?= htmlspecialchars($r['estate'] ?? '-') ?></td>
<td><?= $r['reg_date'] ? htmlspecialchars(date('M j, Y', strtotime($r['reg_date']))) : '-' ?></td>
<td>
<?php
$ps = strtolower(trim($r['pay_status'] ?? ''));
$pcls = 'bg-secondary'; $plabel = 'Unknown';
if ($ps === 'pending') { $pcls = 'bg-warning text-dark'; $plabel = 'Pending'; }
elseif ($ps === 'sent to finance') { $pcls = 'bg-primary'; $plabel = 'Sent to Finance'; }
elseif ($ps === 'verified' || $ps === 'payment verified') { $pcls = 'bg-success'; $plabel = 'Payment Verified'; }
?>
<span class="badge <?= $pcls ?>"><?= $plabel ?></span>
</td>
<td>
<?php
$ds = strtolower(trim($r['dash_status'] ?? ''));
$dcls = 'bg-warning text-dark'; $dlabel = 'Pending Approval';
if ($ds === 'active' || $ds === 'approved' || $ds === 'Active') { $dcls = 'bg-success'; $dlabel = 'Active'; }
?>
<span class="badge <?= $dcls ?>"><?= $dlabel ?></span>
</td>
<td>
<div class="d-flex gap-1">
<?php
$formDataB64 = '';
$formReceipt = '';
$formAmount = '';
try {
$em = (string)($r['email'] ?? '');
if ($em !== '') {
$stf = $pdo->prepare("SELECT cf.form_data, cf.receipt_path, cf.amount_due FROM client_forms cf LEFT JOIN users u ON cf.client_id = u.id WHERE u.email = ? ORDER BY cf.created_at DESC LIMIT 1");
$stf->execute([$em]);
$fr = $stf->fetch(PDO::FETCH_ASSOC) ?: [];
if (!empty($fr)) {
$formDataB64 = base64_encode((string)($fr['form_data'] ?? '{}'));
$formReceipt = (string)($fr['receipt_path'] ?? '');
$formAmount = (string)($fr['amount_due'] ?? '');
}
}
} catch (Throwable $e) {}
?>
<button class="btn btn-sm btn-outline-primary" data-bs-toggle="modal" data-bs-target="#viewRegModal"
data-name="<?= htmlspecialchars($r['client_name'] ?? '-') ?>"
data-email="<?= htmlspecialchars($r['email'] ?? '-') ?>"
data-phone="<?= htmlspecialchars($r['phone'] ?? '-') ?>"
data-estate="<?= htmlspecialchars($r['estate'] ?? '-') ?>"
data-date="<?= htmlspecialchars($r['reg_date'] ?? '') ?>"
data-pay="<?= htmlspecialchars($ps ?: '') ?>"
data-dash="<?= htmlspecialchars($ds ?: '') ?>"
data-receipt="<?= htmlspecialchars($formReceipt) ?>"
data-amount="<?= htmlspecialchars($formAmount) ?>"
data-form="<?= htmlspecialchars($formDataB64) ?>">
<i class="fa-solid fa-eye"></i>
</button>
<?php $canApprove = ($ps === 'verified' || $ps === 'payment verified'); ?>
<form method="post" class="d-inline">
<input type="hidden" name="approve_dashboard" value="<?= (int)($r['id'] ?? 0) ?>">
<button class="btn btn-sm btn-success" <?= $canApprove ? '' : 'disabled' ?> title="Approve Dashboard"><i class="fa-solid fa-check"></i></button>
</form>
</div>
</td>
</tr>
<?php endforeach; endif; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="modal fade" id="viewRegModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><i class="fa-solid fa-id-card me-2"></i>Registration Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="mb-2"><span class="text-muted">Client:</span> <span id="vrName"></span></div>
<div class="mb-2"><span class="text-muted">Email:</span> <span id="vrEmail"></span></div>
<div class="mb-2"><span class="text-muted">Phone:</span> <span id="vrPhone"></span></div>
<div class="mb-2"><span class="text-muted">Estate Interest:</span> <span id="vrEstate"></span></div>
<div class="mb-2"><span class="text-muted">Registration Date:</span> <span id="vrDate"></span></div>
<div class="mb-2"><span class="text-muted">Payment Status:</span> <span id="vrPay"></span></div>
<div class="mb-2"><span class="text-muted">Dashboard Status:</span> <span id="vrDash"></span></div>
<div class="mt-3">
<div class="text-muted small">Uploaded payment receipt</div>
<div id="vrReceipt" class="border rounded p-2 bg-light">Receipt preview not available</div>
</div>
<div class="mt-3">
<div class="text-muted small">Transaction</div>
<div id="vrTxn" class="border rounded p-2 bg-light">Not available</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<script>
(function(){
var apply = document.getElementById('applyFilters');
if (apply) {
apply.addEventListener('click', function(){
var q = document.getElementById('regSearch').value || '';
var st = document.getElementById('regStatus').value || '';
var d = document.getElementById('regDate').value || '';
var url = new URL(window.location.href);
if (q) url.searchParams.set('q', q); else url.searchParams.delete('q');
if (st) url.searchParams.set('status', st); else url.searchParams.delete('status');
if (d) url.searchParams.set('d', d); else url.searchParams.delete('d');
window.location.href = url.toString();
});
}
var modal = document.getElementById('viewRegModal');
if (modal) {
modal.addEventListener('show.bs.modal', function (event) {
var btn = event.relatedTarget;
if (!btn) return;
var name = btn.getAttribute('data-name') || '';
var email = btn.getAttribute('data-email') || '';
var phone = btn.getAttribute('data-phone') || '';
var estate = btn.getAttribute('data-estate') || '';
var date = btn.getAttribute('data-date') || '';
var pay = btn.getAttribute('data-pay') || '';
var dash = btn.getAttribute('data-dash') || '';
var receipt = btn.getAttribute('data-receipt') || '';
var amount = btn.getAttribute('data-amount') || '';
var formB64 = btn.getAttribute('data-form') || '';
var data = {};
try { data = JSON.parse(atob(formB64)); } catch(e) { data = {}; }
document.getElementById('vrName').textContent = name;
document.getElementById('vrEmail').textContent = email;
document.getElementById('vrPhone').textContent = phone;
document.getElementById('vrEstate').textContent = estate;
document.getElementById('vrDate').textContent = date ? new Date(date).toLocaleDateString() : '';
document.getElementById('vrPay').textContent = pay;
document.getElementById('vrDash').textContent = dash;
var rc = document.getElementById('vrReceipt');
if (receipt) { rc.innerHTML = '<a href=\"'+receipt+'\" target=\"_blank\">Open Receipt</a>'; } else { rc.textContent = 'Receipt not uploaded'; }
var tx = document.getElementById('vrTxn');
var lines = [];
if (amount) { lines.push('Form Fee: ' + amount); }
if (data.payment_mode) { lines.push('Payment Mode: ' + data.payment_mode); }
tx.textContent = lines.join(' | ') || 'Not available';
if (Object.keys(data).length) {
var extra = document.createElement('div');
extra.className = 'mt-3';
var tbl = '<div class=\"table-responsive\"><table class=\"table table-sm\"><tbody>';
Object.keys(data).forEach(function(k){
var v = data[k];
if (v && typeof v === 'object') { v = JSON.stringify(v); }
tbl += '<tr><th class=\"w-25\">'+k.replace(/_/g,' ')+'</th><td>'+ (v || '-') +'</td></tr>';
});
tbl += '</tbody></table></div>';
tx.insertAdjacentHTML('afterend', tbl);
}
});
}
})();
</script>
<?php include __DIR__ . '/includes/footer.php'; ?>