diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 685dadc..d22dd0b 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -138,6 +138,7 @@ $routes->group('api', ['filter' => ["jwtAuth:1,2,3,4,agent","appSignature"] ], f $routes->get('policy/downloadCommissionUploadSampleExcel', 'PolicyController::downloadCommissionUploadSampleExcel'); $routes->post('policy/uploadCommissionExcel', 'PolicyController::uploadCommissionExcel'); $routes->post('policy/payoutInilneEditUpdate', 'PolicyController::payoutInilneEditUpdate'); + $routes->get('policy/commissionPayoutReport', 'PolicyController::commissionPayoutReport'); //claims $routes->get('claim/ClaimList', 'ClaimController::ClaimList'); diff --git a/app/Controllers/PolicyController.php b/app/Controllers/PolicyController.php index 30e0ed9..f0285b5 100644 --- a/app/Controllers/PolicyController.php +++ b/app/Controllers/PolicyController.php @@ -1641,6 +1641,96 @@ class PolicyController extends ResourceController } } + /** + * GET: commission / payout rows with filters. Invoice "raised" = active row in partner_invoice_items for policy_id. + * + * Query: from_date, to_date (issued_date), agent_id (partner_policy.agent_id), payout_raised=yes|no + * At least one filter required among: from_date, to_date, agent_id, payout_raised. + * + * List columns also include: reg_no, weight, fuel_type, vehicle_type, utr_no (from partner_invoice_utr via invoice). + */ + public function commissionPayoutReport() + { + try { + $fromDate = $this->request->getGet('from_date'); + $toDate = $this->request->getGet('to_date'); + $agentIdRaw = $this->request->getGet('agent_id'); + $payoutRaised = $this->request->getGet('payout_raised'); + + $fromDate = ($fromDate !== null && $fromDate !== '') ? trim((string) $fromDate) : null; + $toDate = ($toDate !== null && $toDate !== '') ? trim((string) $toDate) : null; + + $agentId = null; + if ($agentIdRaw !== null && $agentIdRaw !== '') { + $agentId = (int) $agentIdRaw; + } + + if ($payoutRaised !== null && $payoutRaised !== '') { + $payoutRaised = strtolower(trim((string) $payoutRaised)); + if (! in_array($payoutRaised, ['yes', 'no'], true)) { + return $this->respond([ + 'status' => 'failed', + 'code' => 400, + 'data' => 'payout_raised must be yes or no', + ], 400); + } + } else { + $payoutRaised = null; + } + + $hasDateFilter = $fromDate !== null || $toDate !== null; + if (! $hasDateFilter && $agentId === null && $payoutRaised === null) { + return $this->respond([ + 'status' => 'failed', + 'code' => 400, + 'data' => 'Provide at least one filter: from_date, to_date, agent_id, or payout_raised', + ], 400); + } + + $db = \Config\Database::connect(); + $builder = $db->table('partner_policy pp'); + $builder->select('pa.agent_code, pp.policy_number AS policy_no, pp.premium_amount AS premium, pp.commission_amount, pe.reg_no, pp.weight, pp.fuel_type, pp.vehicle_type'); + $builder->select('COALESCE((SELECT GROUP_CONCAT(piu.utr_no ORDER BY piu.id SEPARATOR ", ") FROM partner_invoice_items pii_utr INNER JOIN partner_invoice pi_u ON pi_u.id = pii_utr.invoice_id AND pi_u.is_active = 1 INNER JOIN partner_invoice_utr piu ON piu.invoice_id = pii_utr.invoice_id AND piu.is_active = 1 WHERE pii_utr.policy_id = pp.id AND pii_utr.is_active = 1), "") AS utr_no', false); + $builder->select("(CASE WHEN EXISTS (SELECT 1 FROM partner_invoice_items pii INNER JOIN partner_invoice pi ON pi.id = pii.invoice_id AND pi.is_active = 1 WHERE pii.policy_id = pp.id AND pii.is_active = 1) THEN 'yes' ELSE 'no' END) AS received_or_not", false); + $builder->join('partner_agent pa', 'pa.id = pp.agent_id', 'left'); + $builder->join('partner_enquiry pe', 'pe.id = pp.enquiry_id', 'left'); + $builder->where('pp.is_active', 1); + + if ($fromDate !== null) { + $builder->where('pp.issued_date >=', date('Y-m-d', strtotime($fromDate))); + } + if ($toDate !== null) { + $builder->where('pp.issued_date <=', date('Y-m-d', strtotime($toDate))); + } + if ($agentId !== null) { + $builder->where('pp.agent_id', $agentId); + } + if ($payoutRaised === 'yes') { + $builder->where('EXISTS (SELECT 1 FROM partner_invoice_items pii2 INNER JOIN partner_invoice pi2 ON pi2.id = pii2.invoice_id AND pi2.is_active = 1 WHERE pii2.policy_id = pp.id AND pii2.is_active = 1)', null, false); + } elseif ($payoutRaised === 'no') { + $builder->where('NOT EXISTS (SELECT 1 FROM partner_invoice_items pii2 INNER JOIN partner_invoice pi2 ON pi2.id = pii2.invoice_id AND pi2.is_active = 1 WHERE pii2.policy_id = pp.id AND pii2.is_active = 1)', null, false); + } + + $builder->orderBy('pa.agent_code', 'ASC'); + $builder->orderBy('pp.policy_number', 'ASC'); + + $rows = $builder->get()->getResultArray(); + + return $this->respond([ + 'status' => 'success', + 'code' => 200, + 'data' => $rows, + 'count' => count($rows), + ], 200); + } catch (\Throwable $e) { + return $this->respond([ + 'status' => 'failed', + 'code' => 500, + 'message' => $e->getMessage(), + ], 500); + } + } + /** * POST multipart field: commission_excel (xlsx). Updates partner_policy.commission_amount by policy number. */