This commit is contained in:
2025-10-16 13:17:19 +00:00
parent 1256daecd4
commit 36e4935a98
2 changed files with 298 additions and 126 deletions

View File

@@ -84,12 +84,12 @@ function report_view($type, $dt) {
<thead class="table-light">
<tr>
<th>Transaction ID</th>
'.($_SESSION['type'] === 'admin' ? "<th>Agent</th>" : "").'
'.($_SESSION['type'] === 'admin' || $_SESSION['type'] === 'bm' ? "<th>Agent</th>" : "").'
<th>Time</th>
<th>AC No</th>
<th>Name</th>
<th>Amount</th>
'.($_SESSION['type'] === 'admin' ? "<th>Remarks</th>" : "").'
'.($_SESSION['type'] === 'admin' || $_SESSION['type'] === 'bm' ? "<th>Remarks</th>" : "").'
</tr>
</thead>
<tbody>';
@@ -103,7 +103,7 @@ function report_view($type, $dt) {
}
// ----- if admin filter option -----
if($_SESSION['type'] === 'admin' && isset($_GET['agent']) && $_GET['agent']!="") {
if($_SESSION['type'] === 'admin' || $_SESSION['type'] === 'bm' && isset($_GET['agent']) && $_GET['agent']!="") {
$agentId = $conn->real_escape_string($_GET['agent']);
$sql .= " AND `AA_AGENT`='".$agentId."'";
}
@@ -117,12 +117,12 @@ function report_view($type, $dt) {
echo "
<tr>
<td>".$row["AT_ID"]."</td>
".($_SESSION['type'] === 'admin' ? "<td>".$row["AA_AGENT"]."</td>" : "")."
".($_SESSION['type'] === 'admin' || $_SESSION['type'] === 'bm' ? "<td>".$row["AA_AGENT"]."</td>" : "")."
<td>".$kolkataTime."</td>
<td>".$row["AT_ACID"]."</td>
<td>".$row["AA_NAME"]."</td>
<td>".$row["AT_AMOUNT"]."</td>
".($_SESSION['type'] === 'admin' ? "<td style='font-size: 12px;'>".($row["REMARKS"] ?? '')."</td>" : "")."
".($_SESSION['type'] === 'admin' || $_SESSION['type'] === 'bm' ? "<td style='font-size: 12px;'>".($row["REMARKS"] ?? '')."</td>" : "")."
</tr>";
$totalAmount += $row["AT_AMOUNT"];
$rowsData[] = [$row["AT_ID"], $row["AT_TIMESTAMP"], $row["AT_ACID"], $row["AA_NAME"], $row["AT_AMOUNT"]];

View File

@@ -5,14 +5,298 @@ $monthStart = date("Y-m-01");
$dFrom = $_GET['dFrom'] ?? $monthStart;
$dTo = $_GET['dTo'] ?? $today;
// Get login user type
$loginType = $_SESSION['type'] ?? '';
$isAgent = ($loginType === 'agent');
function calculateOpeningCommission($accountCycle, $accountType, $totalAmount, $installmentAmount, $refferTo, $totalPayments) {
// Commission chart data - Account Opening Commission
$commissionChart = [
'180' => ['50' => 10, '100' => 25, '200' => 60, '500' => 100, 'above' => 150],
'360' => ['50' => 25, '100' => 60, '200' => 150, '500' => 200, 'above' => 250],
'25' => ['50' => 10, '100' => 25, '200' => 60, '500' => 100, 'above' => 150],
'50' => ['50' => 20, '100' => 50, '200' => 120, '500' => 170, 'above' => 200],
'6' => ['50' => 10, '100' => 25, '200' => 60, '500' => 100, 'above' => 150],
'12' => ['50' => 20, '100' => 50, '200' => 120, '500' => 170, 'above' => 200]
];
$commission = 0;
// Loan account commission (0.5% of total amount)
if ($accountType === 'Loan') {
$commission = $totalAmount * 0.005;
return $commission;
}
// Recurring account commission - ONLY for exact amounts in chart (50, 100, 200, 500, above 500)
if ($accountType === 'Recurring') {
$planKey = '';
if ($accountCycle === 'D') {
$planKey = ($totalPayments <= 180) ? '180' : '360';
}
elseif ($accountCycle === 'W') {
$planKey = ($totalPayments <= 25) ? '25' : '50';
}
elseif ($accountCycle === 'M') {
$planKey = ($totalPayments <= 6) ? '6' : '12';
}
if (isset($commissionChart[$planKey])) {
$plan = $commissionChart[$planKey];
// ONLY give commission for exact amounts that are in the chart
if ($installmentAmount == 50) {
$commission = $plan['50'];
} elseif ($installmentAmount == 100) {
$commission = $plan['100'];
} elseif ($installmentAmount == 200) {
$commission = $plan['200'];
} elseif ($installmentAmount == 500) {
$commission = $plan['500'];
} elseif ($installmentAmount > 500) {
$commission = $plan['above'];
}
// For amounts like 20, 30, 40, 70, 150, 300 etc. - NO COMMISSION (commission remains 0)
}
}
return $commission;
}
function calculateCollectionCommission($agentId, $dateFrom, $dateTo) {
$conn = new mysqli($GLOBALS['host'], $GLOBALS['user'], $GLOBALS['pass'], $GLOBALS['db']);
// Get agent's commission rate
$agentSql = "SELECT comi_rate FROM `".$GLOBALS['arif_users']."` WHERE user_id = '$agentId'";
$agentResult = $conn->query($agentSql);
$comiRate = 0;
if ($agentResult && $agentResult->num_rows > 0) {
$agentData = $agentResult->fetch_assoc();
$comiRate = $agentData['comi_rate'];
}
// Get total collection amount for this agent's accounts
$collectionSql = "SELECT COALESCE(SUM(t.AT_AMOUNT),0) as total_collection
FROM `".$GLOBALS['arif_tran']."` t
JOIN `".$GLOBALS['arif_ac']."` a ON t.AT_ACID = a.AA_ACNO
WHERE a.AA_AGENT = '$agentId'
AND t.AT_TIMESTAMP BETWEEN '$dateFrom 00:00:00' AND '$dateTo 23:59:59'";
$collectionResult = $conn->query($collectionSql);
$totalCollection = 0;
if ($collectionResult && $collectionResult->num_rows > 0) {
$collectionData = $collectionResult->fetch_assoc();
$totalCollection = $collectionData['total_collection'];
}
$conn->close();
// Calculate collection commission
$collectionCommission = ($totalCollection * $comiRate) / 100;
return [
'total_collection' => $totalCollection,
'comi_rate' => $comiRate,
'collection_commission' => $collectionCommission
];
}
function dual_commission_report($dateFrom, $dateTo) {
echo '<div class="container mt-4">
<div class="alert alert-primary shadow-sm">
<h5 class="mb-0">Dual Commission Report: '.$dateFrom."".$dateTo.'</h5>
<small class="text-muted">Showing both Account Opening Commission and Collection Commission</small>
</div>
</div>';
$conn = new mysqli($GLOBALS['host'], $GLOBALS['user'], $GLOBALS['pass'], $GLOBALS['db']);
if ($conn->connect_error) die("Connection failed: " . $conn->connect_error);
// ---- Login user type check ----
$loginType = $_SESSION['type'] ?? '';
$loginId = $_SESSION['user_id'] ?? '';
// ---- Get ALL agents first ----
$agentsSql = "SELECT user_id, user_name, comi_rate FROM `".$GLOBALS['arif_users']."` WHERE type = 'agent'";
// ---- If Agent then filter only themselves ----
if ($loginType === 'agent') {
$agentsSql .= " AND user_id = '".$loginId."'";
}
$agentsResult = $conn->query($agentsSql);
$agentCommissions = [];
if ($agentsResult && $agentsResult->num_rows > 0) {
while($agent = $agentsResult->fetch_assoc()) {
$agentId = $agent['user_id'];
// Initialize agent data with collection commission
$collectionData = calculateCollectionCommission($agentId, $dateFrom, $dateTo);
$agentCommissions[$agentId] = [
'agent_name' => $agent['user_name'],
'opening_commission' => 0,
'collection_commission' => $collectionData['collection_commission'],
'total_collection' => $collectionData['total_collection'],
'account_count' => 0,
'comi_rate' => $collectionData['comi_rate']
];
}
}
// ---- Now get accounts created in the date range and add opening commission ----
$accountsSql = "SELECT * FROM `".$GLOBALS['arif_ac']."` WHERE `AA_TIMESTAMP` BETWEEN '".$dateFrom." 00:00:00' AND '".$dateTo." 23:59:59'";
// ---- if Agent then filter only their accounts ----
if ($loginType === 'agent') {
$accountsSql .= " AND `refferTo` = '".$loginId."'";
}
$accountsResult = $conn->query($accountsSql);
if ($accountsResult && $accountsResult->num_rows > 0) {
while($account = $accountsResult->fetch_assoc()) {
// Calculate OPENING commission
$openingCommission = calculateOpeningCommission(
$account['AA_ACTYPE'],
$account['AA_TYPE'],
$account['AA_AMOUNT'] ?? 0,
$account['AA_INSTALLMENT'],
$account['refferTo'],
$account['AA_NO_OF_PAYMENT']
);
$commissionAgent = $account['refferTo'];
// If agent exists in our list, add opening commission
if (isset($agentCommissions[$commissionAgent])) {
$agentCommissions[$commissionAgent]['opening_commission'] += $openingCommission;
$agentCommissions[$commissionAgent]['account_count']++;
}
}
}
echo '
<div class="container mt-3">
<div class="card shadow-sm rounded-3">
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered table-hover align-middle">
<thead class="table-light">
<tr>
<th>Agent ID</th>
<th>Agent Name</th>
<th>Accounts</th>
<th>Collection Amount</th>
<th>Collection Rate</th>
<th>Acc Opening Commission</th>
<th>Collection Commission</th>
<th>Total Commission</th>
</tr>
</thead>
<tbody>';
$grandTotalOpening = 0;
$grandTotalCollection = 0;
$grandTotalCommission = 0;
$grandTotalCollectionAmount = 0;
if (!empty($agentCommissions)) {
foreach($agentCommissions as $agentId => $agentData) {
$totalCommission = $agentData['opening_commission'] + $agentData['collection_commission'];
$grandTotalOpening += $agentData['opening_commission'];
$grandTotalCollection += $agentData['collection_commission'];
$grandTotalCommission += $totalCommission;
$grandTotalCollectionAmount += $agentData['total_collection'];
echo "
<tr>
<td>".$agentId."</td>
<td>".$agentData['agent_name']."</td>
<td class='text-center'>".$agentData['account_count']."</td>
<td class='text-end'>".number_format($agentData['total_collection'], 2)."</td>
<td class='text-center'>".$agentData['comi_rate']."%</td>
<td class='text-end text-primary'>".number_format($agentData['opening_commission'], 2)."</td>
<td class='text-end text-success'>".number_format($agentData['collection_commission'], 2)."</td>
<td class='text-end fw-bold'>".number_format($totalCommission, 2)."</td>
</tr>";
}
} else {
echo "<tr><td colspan='8' class='text-center text-muted'>No commission data found</td></tr>";
}
echo '
</tbody>
</table>';
// ---- Show grand totals ----
if ($loginType !== 'agent' && !empty($agentCommissions)) {
echo '<div class="row mt-4">
<div class="col-md-4">
<div class="card bg-primary text-white">
<div class="card-body text-center">
<h6>Opening Commission</h6>
<h4>'.number_format($grandTotalOpening, 2).'</h4>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card bg-success text-white">
<div class="card-body text-center">
<h6>Collection Commission</h6>
<h4>'.number_format($grandTotalCollection, 2).'</h4>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card bg-info text-white">
<div class="card-body text-center">
<h6>Total Commission</h6>
<h4>'.number_format($grandTotalCommission, 2).'</h4>
</div>
</div>
</div>
</div>';
} elseif ($loginType === 'agent' && !empty($agentCommissions)) {
// Show individual agent summary
$agentData = reset($agentCommissions); // Get first (and only) agent data
$totalCommission = $agentData['opening_commission'] + $agentData['collection_commission'];
echo '<div class="row mt-4">
<div class="col-md-6">
<div class="card bg-light">
<div class="card-body text-center">
<h6>My Summary</h6>
<p>Total Accounts: <b>'.$agentData['account_count'].'</b></p>
<p>Total Collection: <b>'.number_format($agentData['total_collection'], 2).'</b></p>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card bg-info text-white">
<div class="card-body text-center">
<h6>My Total Commission</h6>
<h4>'.number_format($totalCommission, 2).'</h4>
</div>
</div>
</div>
</div>';
}
echo '
</div>
</div>
</div>
</div>';
$conn->close();
}
?>
<div class="container mt-4">
<div class="card shadow-lg p-4 rounded-3">
<h4 class="mb-3">Commission Report</h4>
<h4 class="mb-3">Dual Commission Report</h4>
<form method="get" class="row g-3">
<div class="col-md-3">
<label class="form-label">From</label>
@@ -22,126 +306,14 @@ $isAgent = ($loginType === 'agent');
<label class="form-label">To</label>
<input value="<?= $dTo ?>" type="date" name="dTo" class="form-control" required>
</div>
<div class="col-md-3 d-flex align-items-end" style="margin-top: 25px;">
<button type="submit" class="btn btn-info w-100">Generate Report</button>
<div class="col-md-3 d-flex align-items-end">
<button type="submit" class="btn btn-info w-100" style="margin-top: 25px;">Generate Report</button>
</div>
</form>
</div>
</div>
<?php
function commission_report($dateFrom, $dateTo, $isAgent) {
echo '<div class="container mt-4">
<div class="alert alert-primary shadow-sm">
<h5 class="mb-0">Commission Report: '.$dateFrom." → ".$dateTo.'</h5>
</div>
</div>';
$conn = new mysqli($GLOBALS['host'], $GLOBALS['user'], $GLOBALS['pass'], $GLOBALS['db']);
if ($conn->connect_error) die("Connection failed: " . $conn->connect_error);
$loginId = $_SESSION['user_id'] ?? 0;
// ---- Slab setup for ACC opening commission ----
$daysDiff = (strtotime($dateTo) - strtotime($dateFrom)) / (60*60*24);
if ($daysDiff >= 300) { // 1 year
$slabs = [
['min'=>50, 'max'=>99, 'commission'=>45],
['min'=>100,'max'=>199, 'commission'=>70],
['min'=>200,'max'=>499, 'commission'=>110],
['min'=>500,'max'=>1000, 'commission'=>150],
['min'=>1001,'max'=>9999999,'commission'=>200],
];
} else { // 6 months
$slabs = [
['min'=>50, 'max'=>99, 'commission'=>20],
['min'=>100,'max'=>199, 'commission'=>30],
['min'=>200,'max'=>499, 'commission'=>50],
['min'=>500,'max'=>1000, 'commission'=>70],
['min'=>1001,'max'=>9999999,'commission'=>100],
];
}
// ---- Base Query for collection ----
$sql = "SELECT u.user_id, u.user_name, u.comi_rate, COALESCE(SUM(t.AT_AMOUNT),0) as total_amount FROM `".$GLOBALS['arif_users']."` u LEFT JOIN `".$GLOBALS['arif_ac']."` a ON u.user_id = a.AA_AGENT LEFT JOIN `".$GLOBALS['arif_tran']."` t ON a.AA_ACNO = t.AT_ACID AND t.AT_TIMESTAMP BETWEEN '".$dateFrom." 00:00:00' AND '".$dateTo." 23:59:59' WHERE u.type = 'agent'";
if ($isAgent) $sql .= " AND u.user_id = '".$loginId."'";
$sql .= " GROUP BY u.user_id, u.user_name, u.comi_rate ORDER BY u.user_name ASC";
$result = $conn->query($sql);
echo '
<div class="container mt-3">
<div class="card shadow-sm rounded-3">
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered table-hover align-middle">
<thead class="table-light">
<tr>';
if (!$isAgent) echo '<th>Agent ID</th><th>Agent Name</th>';
echo '<th>Total Collection</th><th>Collection Commission</th><th>ACC Open Commission</th><th>Total Commission</th></tr>
</thead>
<tbody>';
$grandCollection = $grandSelfCom = $grandReferCom = 0;
if ($result && $result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$agentId = $row['user_id'];
$collection = floatval($row['total_amount']);
$selfCom = ($collection * floatval($row["comi_rate"]))/100;
// ---- ACC Open Commission ----
$refQuery = "SELECT COALESCE(SUM(t.AT_AMOUNT),0) AS refer_total
FROM `".$GLOBALS['arif_ac']."` a
LEFT JOIN `".$GLOBALS['arif_tran']."` t ON a.AA_ACNO = t.AT_ACID AND t.AT_TIMESTAMP BETWEEN '".$dateFrom." 00:00:00' AND '".$dateTo." 23:59:59'
WHERE a.AA_AGENT = '".$agentId."'";
$refRes = $conn->query($refQuery);
$referCollection = 0;
if ($refRes && $refRes->num_rows > 0) $referCollection = floatval($refRes->fetch_assoc()['refer_total']);
$referCom = 0;
foreach ($slabs as $s) {
if ($referCollection >= $s['min'] && $referCollection <= $s['max']) {
$referCom = $s['commission'];
break;
}
}
$totalCom = $selfCom + $referCom;
$grandCollection += $collection;
$grandSelfCom += $selfCom;
$grandReferCom += $referCom;
echo "<tr>";
if (!$isAgent) echo "<td>{$agentId}</td><td>{$row['user_name']}</td>";
echo "<td>".number_format($collection,2)."</td>
<td>".number_format($selfCom,2)."</td>
<td>".number_format($referCom,2)."</td>
<td><b>".number_format($totalCom,2)."</b></td>
</tr>";
}
} else {
$colspan = $isAgent ? 4 : 6;
echo "<tr><td colspan='$colspan' class='text-center text-muted'>No agents found</td></tr>";
}
if (!$isAgent) {
echo "<tr class='table-secondary fw-bold'>
<td colspan='2' class='text-end'>Grand Total:</td>
<td>".number_format($grandCollection,2)."</td>
<td>".number_format($grandSelfCom,2)."</td>
<td>".number_format($grandReferCom,2)."</td>
<td>".number_format($grandSelfCom+$grandReferCom,2)."</td>
</tr>";
}
echo '</tbody></table></div></div></div></div>';
$conn->close();
}
// ---- Call commission function ----
commission_report($dFrom, $dTo, $isAgent);
?>
// ---- Call dual commission function ----
dual_commission_report($dFrom, $dTo);
?>