From 6f9c084499320d75c3c1729ed55a49f59519ce13 Mon Sep 17 00:00:00 2001 From: "sanjeev.p" Date: Fri, 3 Apr 2026 17:24:25 +0530 Subject: [PATCH] FIX_CreateInvoice --- app/Controllers/InvoiceController.php | 139 +++++++++++++++----------- 1 file changed, 79 insertions(+), 60 deletions(-) diff --git a/app/Controllers/InvoiceController.php b/app/Controllers/InvoiceController.php index 660182e..816594c 100644 --- a/app/Controllers/InvoiceController.php +++ b/app/Controllers/InvoiceController.php @@ -157,10 +157,61 @@ class InvoiceController extends ResourceController try { $input = $this->request->getJSON(true); - // Normalize pos_id (client may send null/0/non-numeric like "w") + // Normalize pos_id $posIdRaw = $input['pos_id'] ?? 0; $posId = is_numeric($posIdRaw) ? (int)$posIdRaw : 0; + $payoutStatus = isset($input['payout_status']) ? (int) $input['payout_status'] : 1; + + $invoiceId = $input['id'] ?? null; + $isCreate = empty($invoiceId); + + // ───────────────────────────────────────────────────────────── + // PRE-SAVE VALIDATION: UTR checks (only on CREATE) + // Run BEFORE any insert/update so nothing is written on failure + // ───────────────────────────────────────────────────────────── + if ($isCreate && !empty($input['utrs']) && is_array($input['utrs'])) { + + $seenUtrs = []; + + foreach ($input['utrs'] as $utrRow) { + + $utrNo = trim((string)($utrRow['utr_no'] ?? '')); + + if ($utrNo === '') { + continue; + } + + // 1. Duplicate within the same request + if (in_array($utrNo, $seenUtrs, true)) { + $this->db->transRollback(); + return $this->respond([ + 'status' => 'failed', + 'code' => 400, + 'message' => "Duplicate UTR found: \"{$utrNo}\" appears more than once in your submission. Please remove the duplicate and try again.", + ], 400); + } + + $seenUtrs[] = $utrNo; + + // 2. Already exists in DB (used in another payout) + $exists = $this->InvoiceUtrModel + ->where('utr_no', $utrNo) + ->where('is_active', 1) + ->first(); + + if ($exists) { + $this->db->transRollback(); + return $this->respond([ + 'status' => 'failed', + 'code' => 400, + 'message' => "UTR \"{$utrNo}\" is already linked to another payout. Please verify the UTR number or contact support if you believe this is an error.", + ], 400); + } + } + } + // ───────────────────────────────────────────────────────────── + // Basic invoice data $invoiceData = [ 'invoice_amount' => $input['invoice_amount'] ?? 0, @@ -169,15 +220,12 @@ class InvoiceController extends ResourceController 'pos_id' => $posId, 'till_date' => $input['till_date'] ? date('Y-m-d', strtotime($input['till_date'])) : null, 'invoice_date' => $input['invoice_date'] ? date('Y-m-d', strtotime($input['invoice_date'])) : null, - 'payout_status' => 1, + 'payout_status' => $payoutStatus, 'is_active' => 1, 'updated_at' => date('Y-m-d H:i:s'), 'updated_by' => $input['updated_by'] ?? 0 ]; - $invoiceId = $input['id'] ?? null; - $isCreate = empty($invoiceId); - if (!$invoiceId) { // Generate invoice number only for CREATE @@ -189,6 +237,7 @@ class InvoiceController extends ResourceController $invoiceId = $this->InvoiceModel->insert($invoiceData); if ($invoiceId === false) { + $this->db->transRollback(); log_message('error', json_encode($this->InvoiceModel->errors())); return $this->respond(['status' => 'failed', 'message' => 'Failed to create invoice', 'error' => json_encode($this->InvoiceModel->errors())], 500); } @@ -227,73 +276,43 @@ class InvoiceController extends ResourceController $this->InvoiceItemModel->insert($itemData); //update pos_id to policy table - $this->PolicyModel->update($item['policy_id'], ['pos_id' => $input['pos_id'] ]); + $this->PolicyModel->update($item['policy_id'], ['pos_id' => $posId ]); } } } - - - /* - * UTR save (Tempa) - */ + // UTR save — validations already passed above, just insert if ($isCreate && !empty($input['utrs']) && is_array($input['utrs'])) { - $seenUtrs = []; - foreach ($input['utrs'] as $utrRow) { $utrNo = trim((string)($utrRow['utr_no'] ?? '')); - - if ($utrNo === '') continue; - - // if (in_array($utrNo, $seenUtrs, true)) { - // $this->db->transRollback(); - // return $this->respond([ - // 'status' => 'failed', - // 'code' => 400, - // 'message'=> "Duplicate UTR in request: {$utrNo}" - // ], 400); - // } + $utrDate = !empty($utrRow['utr_date']) + ? date('Y-m-d', strtotime($utrRow['utr_date'])) + : null; - $seenUtrs[] = $utrNo; + $amount = isset($utrRow['amount']) ? (float) $utrRow['amount'] : 0; - // $exists = $this->InvoiceUtrModel->where('utr_no', $utrNo)->where('is_active', 1)->first(); + $result_utr = $this->InvoiceUtrModel->insert([ + 'invoice_id' => $invoiceId, + 'utr_no' => $utrNo, + 'utr_date' => $utrDate, + 'amount' => $amount, + 'is_active' => 1, + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => $input['created_by'] ?? 0, + ]); - // if ($exists) { - // $this->db->transRollback(); - // return $this->respond([ - // 'status' => 'failed', - // 'code' => 400, - // 'message'=> "UTR already exists: {$utrNo}" - // ], 400); - // } - - // ✅ Format values - // $utrDate = !empty($utrRow['utr_date']) - // ? date('Y-m-d', strtotime($utrRow['utr_date'])) - // : null; - - // $amount = isset($utrRow['amount']) - // ? (float)$utrRow['amount'] - // : 0; - - $result_utr = $this->InvoiceUtrModel->insert([ - 'invoice_id' => $invoiceId, - 'utr_no' => $utrNo, - 'utr_date' => null, - 'amount' => 0, - 'is_active' => 1, - 'created_at' => date('Y-m-d H:i:s'), - 'created_by' => $input['created_by'] ?? 0 - ]); - - // if (!$result_utr) { - // print_r($this->InvoiceUtrModel->errors()); - // die; - // } + if ($result_utr === false) { + $this->db->transRollback(); + return $this->respond([ + 'status' => 'failed', + 'code' => 500, + 'message' => 'Could not save UTR details. Please try again.', + ], 500); + } } } @@ -402,8 +421,8 @@ class InvoiceController extends ResourceController ->join('partner_invoice pi', 'pi.id = pii.invoice_id AND pi.is_active = 1', 'left') ->join('partner_agent pa', 'pa.id = pe.agent_id', 'left') ->where('partner_policy.is_active', 1) - ->where('partner_policy.commission_amount >= 0') - // ->where('partner_policy.is_data_accuracy_checked', 1) + ->where('partner_policy.commission_amount > 0') + ->where('partner_policy.is_data_accuracy_checked', 1) ->where('partner_policy.manager_id', $input['manager_id']); // Apply agent_id filter (supports multiple agents)