Heray-Was-Here
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
Directory :  /home/u390967363/domains/aibenproperties.com/public_html/app/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/u390967363/domains/aibenproperties.com/public_html/app/client-registrations.php
<?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'; ?>

Hry