diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 31453be4..8ff3f4ac 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -48,6 +48,7 @@ $routes->get("frontend_content", "AppContentManagementController::frontend_conte $routes->get('/test', 'Home::index'); $routes->get('/check_gemini', 'Home::check_Gemini'); $routes->get('/check_gemini2', 'Home::check_gemini_2'); +$routes->get('/checkPolicyDoc', 'Home::checkPolicyDoc'); $routes->get('/login', 'LoginController::index'); ///auth/google $routes->get('/loginPos', 'LoginController::loginPos'); //login POS team $routes->post('/getVerifyPosMobileNo', 'LoginController::getVerifyPosMobileNo'); //Verify POS team mobile no @@ -395,6 +396,10 @@ $routes->group("/util", ["filter" => "authMVC"], function ($routes) { $routes->get('getMemberDataExcelFileErrors', 'LeadsController::getMemberDataExcelFileErrors'); $routes->post('savePlacementDataAndValidateMemberDataFile', 'LeadsController::savePlacementDataAndValidateMemberDataFile'); $routes->get('checkMemberDataFileValidationStatus', 'LeadsController::checkMemberDataFileValidationStatus'); + $routes->match(['get', 'post', 'delete'], 'nhanceBranchMaster', 'MasterController::nhanceBranchMaster'); + $routes->match(['get', 'post', 'delete'], 'vehicleTypeMaster', 'MasterController::vehicleTypeMaster'); + $routes->match(['get', 'post', 'delete'], 'rtoMaster', 'MasterController::rtoMaster'); + $routes->get('checkDuplicateCdAccount', 'MasterController::checkDuplicateCdAccount'); }); $routes->post("policy_tranction/sendInstallmentRemainderMail","PolicyTransactionController::sendInstallmentRemainderMail"); @@ -422,6 +427,7 @@ $routes->group("policy_tranction", ["filter" => "authMVC"], function ($routes) { $routes->group("report", ["filter" => "authMVC"], function ($routes) { $routes->match(['get', 'post'],"list", "PolicyTransactionController::reportBDS"); + $routes->match(['get', 'post'],"listNew", "PolicyTransactionController::reportBDSNew"); $routes->get("report-varience-list", "PolicyTransactionController::reportVarience"); $routes->get("report-business-list", "PolicyTransactionController::reportBusinessList"); $routes->get("report-finance-list", "PolicyTransactionController::reportFinanceList"); @@ -711,6 +717,7 @@ $routes->group('test', function($routes) { $routes->get('mapping_client_id_and_branch_id','TestingController::mapping_client_id_and_branch_id'); $routes->get('membervalidation', 'TestingController::membervalidation'); $routes->get('generateExcel', 'TestingController::generateExcel'); + $routes->get('logo_renaming','TestingController::logo_renaming'); }); $routes->cli('cli/testcli', 'TestingController::testcli'); diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index ee7ae376..e09c74ec 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -518,8 +518,8 @@ class ClientController extends AdminController public function updateEmpAndPolicyStatus() { - $return = $this->clientPolicyModel->updateStatus(); + return $return; $this->myLogger->logme('error', 'Client Policy Status Update Count: {data}', ['data' => $return['client']]); $this->myLogger->logme('error', 'Employee Policy Status Update Count: {data}', ['data' => $return['emp']]); } @@ -1613,7 +1613,7 @@ class ClientController extends AdminController if ($update) { - $policy_transaction_update = $this->deactivatePolicyTransactionsPolicy($id); + // $policy_transaction_update = $this->deactivatePolicyTransactionsPolicy($id); return $this->respond(['status' => true, 'code' => 200], 200); } else { @@ -4669,7 +4669,7 @@ class ClientController extends AdminController // Additional logic for non-individual clients (client_type != 2) $branch_insert = null; if ($client_type != 2) { - $unit[] = $postData['short_name'] . '-' . $postData['branch_code'] ?? 001; + $unit[] = $postData['short_name'] . '-' . ($postData['branch_code'] ?? 001); $branch_data = [ 'client_id' => $client_insert, 'branch_name' => $postData['branch_name'], @@ -4816,6 +4816,7 @@ class ClientController extends AdminController 'vehicle_no' => $data['vehicle_no'], 'type' => $data['type'], 'rc' => $data['rc'], + 'rto_id' => $data['rto_id'], 'branch_id' => $branch_insert, 'owner' => $client_insert, ]; @@ -4861,6 +4862,7 @@ class ClientController extends AdminController 'vehicle_no' => $data['vehicle_no'], 'type' => $data['type'], 'rc' => $data['rc'], + 'rto_id' => $data['rto_id'], 'branch_id' => $data['branch_id'] ?? null, 'owner' => $data['owner'], ]; @@ -5064,10 +5066,12 @@ class ClientController extends AdminController ->where('policy_no', $policy_no) ->countAllResults(); + $client_policy_data = $this->clientPolicyModel->where('is_active', 1)->where('policy_status', 1)->where('policy_no', trim($policy_no))->first(); + if ($data > 0) { - return $this->respond(['status' => true, 'message' => 'This policy number is already linked to another client', 'data' => $data, 'code' => 409, 'received_data' => $received_data], 200); + return $this->respond(['status' => true, 'message' => 'This policy number is already linked to another client', 'data' => $data, 'code' => 409, 'received_data' => $received_data, 'client_policy_id' => $client_policy_data['id'] ?? null], 200); } else { - return $this->respond(['status' => false, 'message' => 'No Data Found', 'code' => 404, 'received_data' => $received_data], 200); + return $this->respond(['status' => false, 'message' => 'No Data Found', 'code' => 404, 'received_data' => $received_data, 'client_policy_id' => $client_policy_data['id'] ?? null], 200); } } @@ -7305,7 +7309,9 @@ class ClientController extends AdminController $pre_hr_id = $db2->table('client_branch cb') ->select('lc.id') ->join('level_contacts lc','lc.ref_id = cb.id') - ->where('cb.id',$pre_branch_id)->where('cb.is_Active',1)->where('lc.is_Active',1)->get()->getResultArray()[0]['id']??""; + ->where('lc.contact_type', 'client') + ->where('cb.id',$pre_branch_id)->where('cb.is_Active',1) + ->where('lc.is_Active',1)->get()->getResultArray()[0]['id']??""; return $pre_hr_id; } diff --git a/app/Controllers/DashboardController.php b/app/Controllers/DashboardController.php index 73c2e31a..369f9444 100755 --- a/app/Controllers/DashboardController.php +++ b/app/Controllers/DashboardController.php @@ -225,20 +225,23 @@ class DashboardController extends AdminController $pendingActionsController = new PendingActionsController; $pendingActionsData = $pendingActionsController->getPendingActionsForDashBoard(); - $businessTeamData = $this->policyTransactionModel->getBusinessReportList(); - $financeTeamData = $this->policyTransactionModel->getFinanceReportList(); - $businessTeamStatusData = $this->data_construct_for_bds($businessTeamData); - $financeTeamStatusData = $this->data_construct_for_bds($financeTeamData); + //BDS dashboard data + // $businessTeamData = $this->policyTransactionModel->getBusinessReportList(); + // $financeTeamData = $this->policyTransactionModel->getFinanceReportList(); + // $businessTeamStatusData = $this->data_construct_for_bds($businessTeamData); + // $financeTeamStatusData = $this->data_construct_for_bds($financeTeamData); + $businessTeamData = []; + $financeTeamData = []; + $businessTeamStatusData = []; + $financeTeamStatusData = []; $data['client_branch_emp_list'] = $results; $session = \Config\Services::session(); $session->set('enrollment_data', json_encode($data)); - // echo "
";
             $data['pendingActionsData'] = $pendingActionsData;
             $data['businessTeamCount'] = count($businessTeamData) ?? 0;
-            // dd($businessTeamData);
             $data['financeTeamCount'] = count($financeTeamData) ?? 0;
             $data['businessTeamStatusData'] = $businessTeamStatusData;
             $data['financeTeamStatusData'] = $financeTeamStatusData;
diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php
index a4666518..00d81e59 100755
--- a/app/Controllers/EmployeeController.php
+++ b/app/Controllers/EmployeeController.php
@@ -35,7 +35,7 @@ use App\Controllers\JobWorker;
 use App\Controllers\Jobs\SubJob;
 use App\Controllers\EmployeeServiceController;
 use App\Controllers\EmpDataServiceController;
-
+use App\Models\ThzMasterModel;
 use CodeIgniter\API\ResponseTrait;
 
 use PhpOffice\PhpSpreadsheet\Spreadsheet;
@@ -1193,7 +1193,7 @@ class EmployeeController extends AdminController
 
     // --------------- For E-Card Download -----------------------------------------------------------------------------------------------------
 
-    //E-CARD DOWNLOAD FUNCTION USING HTML PRINT
+    //E-CARD DOWNLOAD FUNCTION USING HTML PRINT ( Not in use ) do not delete
     public function generateIDCardForEmployeeUsingHtml($rand_string, $people = 0)
     {    
         // dd($rand_string, $people);
@@ -1418,7 +1418,7 @@ class EmployeeController extends AdminController
         echo $htmlContent;
     }
 
-    //E-CARD DOWNLOAD FUNCTION USING DOM PDF ( CURRENTLY USING THIS )
+    //E-CARD DOWNLOAD FUNCTION USING DOM PDF ( CURRENTLY USING THIS ) Dompdf
     public function generateIDCardForEmployee($rand_string, $people = 0, $mode = 0)
     {    
         // dd($rand_string, $people);
@@ -1470,7 +1470,8 @@ class EmployeeController extends AdminController
             // Step 3: Prepare template path
             $template_data_path = WRITEPATH . 'e_card_template/';
             // $tpa_short_name = strtolower(str_replace(' ', '_', $get_emp_code_and_client_policy_id['short_name'])) . '.html';
-            $tpa_short_name = 'common.html';
+            // $tpa_short_name = 'common.html';
+            $tpa_short_name = 'new_ecard.html';
             $final_path = $template_data_path . $tpa_short_name;
         
             $this->myLogger->logme('error', 'Checking if template file exists at: ' . $final_path);
@@ -1494,6 +1495,7 @@ class EmployeeController extends AdminController
                 $value['back_card'] = "Nhance_Ecard_working_1_Back.png";
         
                 $placeholders = [
+
                     '{CLIENT_NAME}' => $value['client_name'],
                     '{TPA_ID}' => $value['tpa_id'],
                     '{NAME}' => $value['name'],
@@ -1505,9 +1507,6 @@ class EmployeeController extends AdminController
                     '{POLICY_START_DATE}' => date('d-M-Y', strtotime($value['policy_start_date'])),
                     '{POLICY_NO}' => $value['policy_no'],
                     '{INSURER_NAME}' => strtoupper($value['insurer_name']),
-                    '{INSURER_LOGO}' => base_url() . 'public/uploads/logo/' . $value['insurer_logo'],
-                    '{FRONT_CARD}' => base_url() . 'public/uploads/template_bg/' . $value['front_card'],
-                    '{BACK_CARD}' => base_url() . 'public/uploads/template_bg/' . $value['back_card'],
                     '{EMP_ID}' => $value['emp_code'],
                     '{SI_AMT}' => $value['basic_cover_si'],
                     '{CORPORATE_NAME}' => $value['client_name'],
@@ -1515,18 +1514,38 @@ class EmployeeController extends AdminController
                     '{TPA_NAME}' => $value['tpa_name'],
                     '{INSURER_BRANCH}' => $value['insurer_branch_city'],
                     '{RELATION}' => $value['relationship'],
-                    '{TPA_LOGO}' => base_url() . 'public/uploads/logo/' . $value['tpa_logo'],
-                    '{MEDI_USER}' => base_url() . 'public/e_card_imgs/medi_uesr.jpg',
-                    '{MEDI_INSURER}' => base_url() . 'public/e_card_imgs/Magma.png',
-                    '{MEDI_BARCODE}' => base_url() . 'public/e_card_imgs/borcode.jpeg',
-                    '{QR_ANDROID}' => base_url() . 'public/e_card_imgs/android.png',
-                    '{QR_IOS}' => base_url() . 'public/e_card_imgs/ios.png',
-                    '{QR_ANDROID_2}' => base_url() . 'public/e_card_imgs/play_store.png',
-                    '{QR_IOS_2}' => base_url() . 'public/e_card_imgs/appstore.png',
+
+                    '{TPA_LOGO}'        => getFileIfExists('uploads/logo/' . $value['tpa_logo']),
+                    '{MEDI_USER}'       => getFileIfExists('e_card_imgs/medi_uesr.jpg'),
+                    '{MEDI_INSURER}'    => getFileIfExists('e_card_imgs/Magma.png'),
+                    '{MEDI_BARCODE}'    => getFileIfExists('e_card_imgs/borcode.jpeg'),
+                    '{QR_ANDROID}'      => getFileIfExists('e_card_imgs/android.png'),
+                    '{QR_IOS}'          => getFileIfExists('e_card_imgs/ios.png'),
+                    '{QR_ANDROID_2}'    => getFileIfExists('e_card_imgs/play_store.png'),
+                    '{QR_IOS_2}'        => getFileIfExists('e_card_imgs/appstore.png'),
+                    '{NHANCE_N_LOGO}'   => getFileIfExists('assets/images/Nhance_Favi.png'),
+                    '{INSURER_LOGO}'    => getFileIfExists('uploads/logo/' . $value['insurer_logo']),
+                    '{FRONT_CARD}'      => getFileIfExists('uploads/template_bg/' . $value['front_card']),
+                    '{BACK_CARD}'       => getFileIfExists('uploads/template_bg/' . $value['back_card']),
+
+                    // '{TPA_LOGO}' => base_url() . 'public/uploads/logo/' . $value['tpa_logo'],
+                    // '{MEDI_USER}' => base_url() . 'public/e_card_imgs/medi_uesr.jpg',
+                    // '{MEDI_INSURER}' => base_url() . 'public/e_card_imgs/Magma.png',
+                    // '{MEDI_BARCODE}' => base_url() . 'public/e_card_imgs/borcode.jpeg',
+                    // '{QR_ANDROID}' => base_url() . 'public/e_card_imgs/android.png',
+                    // '{QR_IOS}' => base_url() . 'public/e_card_imgs/ios.png',
+                    // '{QR_ANDROID_2}' => base_url() . 'public/e_card_imgs/play_store.png',
+                    // '{QR_IOS_2}' => base_url() . 'public/e_card_imgs/appstore.png',
+                    // '{NHANCE_N_LOGO}' => base_url() . 'public/assets/images/Nhance_Favi.png',
+                    // '{INSURER_LOGO}' => base_url() . 'public/uploads/logo/' . $value['insurer_logo'],
+                    // '{FRONT_CARD}' => base_url() . 'public/uploads/template_bg/' . $value['front_card'],
+                    // '{BACK_CARD}' => base_url() . 'public/uploads/template_bg/' . $value['back_card'],
+
                 ];
 
                 $placeholders['{LEVELS}'] = $this->generateAcmAndMForEcard($client_id);
-        
+                $placeholders['{NETWORK_HOSPITAL}'] = $this->generateNetworkHospitalsForEcard($value['network_hospitals']);
+       
                 foreach ($placeholders as $placeholder => $replaceValue) {
                     $htmlContent = str_replace($placeholder, $replaceValue, $htmlContent);
                 }
@@ -1534,13 +1553,23 @@ class EmployeeController extends AdminController
                 $html .= $htmlContent;
             }
 
+            // return $html;
             // DomPdf 
             $options = new Options();
             $options->set('isRemoteEnabled', true);
             $options->set('isHtml5ParserEnabled', true);
 
             $dompdf = new Dompdf($options);
-            $dompdf->loadHtml('' . $html); // remove the margin
+            // $dompdf->loadHtml('' . $html); // remove the margin
+            $dompdf->loadHtml('
+                
+                ' . $html
+            );
+
             $dompdf->setPaper('A4', 'portrait');
             $dompdf->render();
 
@@ -2939,20 +2968,43 @@ class EmployeeController extends AdminController
     
         // Generate the HTML content
         $html = '';
-    
+        
+        $level_index = 1;
         foreach ($levels as $level => $contacts) {
             $displayLevel = $level == 3 ? 1 : 2; // Switch levels for display
-            $html .= '
Level ' . $displayLevel . '
'; + if($level_index == 1){ + $html .= 'Level ' . $displayLevel . '
'; + }else{ + $html .= '
Level ' . $displayLevel . '
'; + } foreach ($contacts as $index => $contact) { $html .= ($index + 1) . '. ' . $contact['first_name'] . ' / ' . $contact['mobile'] . ' / ' . $contact['email'] . '
'; } + $level_index++; } - $html .= '


'; + $html .= '
'; return $html; } + public function generateNetworkHospitalsForEcard($network_hospitals) + { + $html = ""; + if (!empty($network_hospitals)) { + $html = '
+ Network Hospital: + ' . $network_hospitals . ' +
'; + } + + // For debugging + // print_r($html); die; + + return $html; + } + + public function getBatchFileData() { $file_id = $this->request->getGet('file_id'); @@ -3065,7 +3117,8 @@ class EmployeeController extends AdminController } else { $text = "create"; $data['created_by'] = get_session_userid(); - $this->thzMasterModel->insert($data); + $thzMasterModel = new ThzMasterModel(); + $thzMasterModel->insert($data); $insertID = $this->partnerEndorsementRequestModel->insertID(); $result = true; } diff --git a/app/Controllers/Home.php b/app/Controllers/Home.php index 68eb0402..84d0d8c9 100755 --- a/app/Controllers/Home.php +++ b/app/Controllers/Home.php @@ -60,6 +60,8 @@ class Home extends PublicController //print_rr($data); } + + //for insurer statement upload public function check_gemini_2() { @@ -158,6 +160,143 @@ class Home extends PublicController + // The final JSON payload + $data = [ + "contents" => [ + $content_parts + ] + ]; + + // Encode the data to a JSON string + $json_data = json_encode($data); + + // Initialize cURL + $ch = curl_init($url); + + // Set cURL options + curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); // Set the Content-Type header + curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data); // Set the JSON payload + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Return the response as a string + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Optional: to bypass SSL verification if needed (not recommended for production) + + // Execute the cURL request and get the response + $response = curl_exec($ch); + + // Check for cURL errors + if (curl_errno($ch)) { + echo 'cURL Error: ' . curl_error($ch); + } + + // Close the cURL handle + curl_close($ch); + + // Decode the JSON response + $responseData = json_decode($response, true); + echo '
';
+                print_r($responseData);
+            echo '
';
+            // Check if the response contains generated text
+            if (isset($responseData['candidates'][0]['content']['parts'][0]['text'])) {
+                $generatedText = $responseData['candidates'][0]['content']['parts'][0]['text'];
+                echo "Generated Text: " . $generatedText;
+            } else {
+                echo "Error or no text generated. Response: " . $response;
+            }
+
+    }
+
+
+    //for insurer policy doc upload
+    public function checkPolicyDoc()
+    {
+
+            // $this->convertToPdf();die();
+            // Replace with your actual Gemini API key
+           $apiKey = 'AIzaSyBbx-uotRBqkYhqLpmD60420E_a0G0duP8';
+
+            // The model to use and the API endpoint
+            $model = "gemini-pro";
+            $model = "gemini-2.5-flash";
+            // $model = "gemini-1.5-pro";
+            // $model = "gemini-1.5-pro";
+            $url = "https://generativelanguage.googleapis.com/v1beta/models/{$model}:generateContent?key={$apiKey}";
+
+            $filePath = 'C:\Users\Venba\AppData\Local\Programs\Python\pyenv\pdfreader\bike-0904023124P114268957.pdf';
+            $filePath = 'C:\Users\Venba\AppData\Local\Programs\Python\pyenv\pdfreader\car-insurance-0904023124P114213011.pdf';
+
+            // Check if the file exists
+            if (!file_exists($filePath)) {
+                die("Error: File not found at {$filePath}");
+            }
+
+            // Get the file's MIME type using the finfo extension
+            $finfo = finfo_open(FILEINFO_MIME_TYPE);
+            $mimeType = finfo_file($finfo, $filePath);
+            finfo_close($finfo);
+            // print_r($mimeType);die();
+             // Define supported inline MIME types
+             $supportedInlineMimeTypes = ['application/pdf','text/csv'];
+
+            // Read the file content and encode it to Base64
+            $fileContent = file_get_contents($filePath);
+            $base64Content = base64_encode($fileContent);
+            // The prompt you want to send to the model
+            // $prompt = "give me a json with emp data like name,age,dob,mobile and email. only json not any explanations";
+            $prompt = "Read the following motor policy pdf document and convert into JSON format as sample specified. Give me only JSON,not any explanations.";
+            $prompt .= '"{\"policy\":{\"policy_number\":\"\",\"issue_date\":\"\",\"period\":{\"start\":\"\",\"end\":\"\"},\"insurer\":\"\",\"previous_policy_number\":\"\"},\"insured\":{\"name\":\"\",\"father_name\":\"\",\"address\":[\"\"],\"mobile\":\"\",\"id_proofs\":{\"aadhaar\":\"\",\"pan\":\"\"}},\"vehicle\":{\"reg_no\":\"\",\"engine_no\":\"\",\"chassis_no\":\"\",\"make\":\"\",\"model\":\"\",\"year\":\"\",\"cubic_capacity\":\"\",\"vehicle_type\":\"\"},\"rto\":\"\",\"premium\":{\"tp\":0,\"od\":0,\"pa_od\":0,\"taxes\":{},\"total\":0,\"in_words\":\"\"},\"endorsements\":[{\"code\":\"\",\"desc\":\"\"}]}"';
+
+            $payloadPart = null;
+
+            // The text part of the prompt
+            $text_part = [
+                "text" => $prompt
+            ];
+            // Conditionally handle the file upload based on MIME type
+            if (in_array($mimeType, $supportedInlineMimeTypes)) {
+                 echo "Detected supported format inline MIME type ({$mimeType})";
+                // Handle PDF as inline data
+                $fileContent = file_get_contents($filePath);
+                $base64Content = base64_encode($fileContent);
+                $payloadPart = [
+                    "inlineData" => [
+                        "mimeType" => $mimeType,
+                        "data" => $base64Content
+                    ]
+                ];
+
+                 $content_parts = [
+                        "parts" => [
+                            $text_part,
+                            $payloadPart
+                        ]
+                ];
+            } else {
+                // Handle Excel/CSV using the Files API
+                echo "Detected unsupported inline MIME type ({$mimeType}). Uploading via Files API...\n";
+                $fileInfo = $this->uploadFileToGemini($filePath, $apiKey); // Pass apiKey
+
+                print_r($fileInfo);
+                 // The file part, using the URI from the Files API upload
+                    $file_part = [
+                        "fileData" => [
+                            "fileUri" => $fileInfo['uri'],
+                            "mimeType" => $fileInfo['mimeType']
+                        ]
+                    ];
+
+                    // The full content array, containing both parts
+                    $content_parts = [
+                        "parts" => [
+                            $text_part,
+                            $file_part
+                        ]
+                    ];
+            }
+
+           
+
+          
+
             // The final JSON payload
             $data = [
                 "contents" => [
diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php
index 59608e7e..6aeb4b73 100644
--- a/app/Controllers/LeadsController.php
+++ b/app/Controllers/LeadsController.php
@@ -1024,14 +1024,7 @@ class LeadsController extends BaseController
         // 3. Optimize lead data query with specific field selection
         $lead_data = $this->leadsModel
             ->select('
-                leads.id, 
-                leads.policy_type_id, 
-                leads.lead_type, 
-                leads.source_policy_id,
-                leads.policy_end_date, 
-                leads.lead_form_type, 
-                leads.created_by, 
-                leads.client_name,
+                leads.*, 
                 lead_files.status as demography_file_status,
                 policy_type.question_json, 
                 policy_type.policy_type, 
@@ -1776,6 +1769,24 @@ class LeadsController extends BaseController
 
         // dd($rfq_data, $lead_id, $type, $propsal_and_insurer);
         // print_r($propsal_and_insurer); die;
+        // print_r($is_placement); die;
+
+        $data = json_decode($rfq_data['json'], true);
+        $sheetName = 'Worksheet';
+        if ($type == 2) {
+            $sheetName = 'QCR';
+            // $propsal_and_insurer = "Proposal 1-ICICIPRU-ICICI001";
+            $data = $this->convertJsonForQCR($data, $type);
+            if ($propsal_and_insurer !== null) {
+                list($proposal_key, $insurer_key) = explode('-', $propsal_and_insurer, 2);
+                $data = $this->transformProposelData($data, $proposal_key, $insurer_key);
+                $is_placement = true;
+                $sheetName = 'Placement';
+            }
+        } else if ($type == 1) {
+            $sheetName = 'RFQ';
+            $data = $this->convertJsonForQCR($data, $type);
+        } //  dd($data);
 
         if ($rfq_data['lead_type'] == 1) {
 
@@ -1808,36 +1819,71 @@ class LeadsController extends BaseController
         } else {
 
             if (in_array($rfq_data['policy_type_id'], [2, 3, 4, 5])) {
-                $lead_data = [
+                if($is_placement == true){
+                    $lead_data = [
 
-                    'Insured' => $rfq_data['client_name'],
-                    'Policy Type' => $this->leadType[$rfq_data['lead_type']] ?? "",
+                        'Insured' => $rfq_data['client_name'],
+                        'Policy Type' => $this->leadType[$rfq_data['lead_type']] ?? "",
 
-                    // 'No of Employees at Inception' => $rfq_data['incept_emp_count'],
-                    // 'No of Dependents at Inception' => $rfq_data['incept_dept_count'],
-                    // 'Total Lives at Inception ' => $rfq_data['incept_no_of_lives'],
+                        // 'No of Employees at Inception' => $rfq_data['incept_emp_count'],
+                        // 'No of Dependents at Inception' => $rfq_data['incept_dept_count'],
+                        // 'Total Lives at Inception ' => $rfq_data['incept_no_of_lives'],
 
-                    // 'No of Employees at Expiry' => $rfq_data['exp_emp_count'],
-                    // 'No of Dependents at Expiry' => $rfq_data['exp_dept_count'],
-                    // 'Total Lives at Expiry ' => $rfq_data['exp_no_of_lives'],
+                        // 'No of Employees at Expiry' => $rfq_data['exp_emp_count'],
+                        // 'No of Dependents at Expiry' => $rfq_data['exp_dept_count'],
+                        // 'Total Lives at Expiry ' => $rfq_data['exp_no_of_lives'],
 
-                    'No of Employees at Renewal' => $rfq_data['renewal_emp_count'],
-                    'No of Dependents at Renewal' => $rfq_data['renewal_dept_count'],
-                    'Total Lives at Renewal ' => $rfq_data['renewal_no_of_lives'],
+                        'No of Employees at Renewal' => $rfq_data['renewal_emp_count'],
+                        'No of Dependents at Renewal' => $rfq_data['renewal_dept_count'],
+                        'Total Lives at Renewal ' => $rfq_data['renewal_no_of_lives'],
 
-                    'Period of Insurance ' => !empty($rfq_data['policy_start_date']) && !empty($rfq_data['policy_end_date']) ? date('d-m-Y', strtotime($rfq_data['policy_start_date'])) . ' to ' . date('d-m-Y', strtotime($rfq_data['policy_end_date'])) : "To be decided",
-                    'Insurer' => $rfq_data['insurer_name'] ?? " - ",
-                    'TPA' => $rfq_data['tpa_name'] ?? " - ",
+                        'Period of Insurance ' => !empty($rfq_data['policy_start_date']) && !empty($rfq_data['policy_end_date']) ? date('d-m-Y', strtotime($rfq_data['policy_start_date'])) . ' to ' . date('d-m-Y', strtotime($rfq_data['policy_end_date'])) : "To be decided",
+                        'Insurer' => $rfq_data['insurer_name'] ?? " - ",
+                        'TPA' => $rfq_data['tpa_name'] ?? " - ",
 
-                    // 'Policy Run Days' => $rfq_data['policy_run_days'],
-                    // 'Inception Premium' => formatIndianCurrency($rfq_data['premium_at_inception']),
-                    // 'Premium as on (' . date('d-m-Y', strtotime($rfq_data['incurred_claims_date'])) . ')' => formatIndianCurrency($rfq_data['premium_date']),
-                    // 'Earned Premium' => formatIndianCurrency(intval($rfq_data['earned_premium'])),
-                    // 'Incurred Claims as on (' . date('d-m-Y', strtotime($rfq_data['incurred_claims_date'])) . ')' => formatIndianCurrency($rfq_data['incurred_claims']),
-                    // 'Annualised Claims' => formatIndianCurrency(intval($rfq_data['annualised_claims'])),
-                    // 'Incurred Claims Ratio' => $rfq_data['incurred_claims_ratio'] . " %",
-                    // 'Earned Claims Ratio' => $rfq_data['earned_claims_ratio'] . " %",
-                ];
+                        // 'Policy Run Days' => $rfq_data['policy_run_days'],
+                        // 'Inception Premium' => formatIndianCurrency($rfq_data['premium_at_inception']),
+                        // 'Premium as on (' . date('d-m-Y', strtotime($rfq_data['incurred_claims_date'])) . ')' => formatIndianCurrency($rfq_data['premium_date']),
+                        // 'Earned Premium' => formatIndianCurrency(intval($rfq_data['earned_premium'])),
+                        // 'Incurred Claims as on (' . date('d-m-Y', strtotime($rfq_data['incurred_claims_date'])) . ')' => formatIndianCurrency($rfq_data['incurred_claims']),
+                        // 'Annualised Claims' => formatIndianCurrency(intval($rfq_data['annualised_claims'])),
+                        // 'Incurred Claims Ratio' => $rfq_data['incurred_claims_ratio'] . " %",
+                        // 'Earned Claims Ratio' => $rfq_data['earned_claims_ratio'] . " %",
+                    ];
+                }else{
+                    $lead_data = [
+                        'Insured' => $rfq_data['client_name'],
+                        'Policy Type' => $this->leadType[$rfq_data['lead_type']] ?? "",
+
+                        'No of Employees at Inception' => $is_placement ? '-' : $rfq_data['incept_emp_count'],
+                        'No of Dependents at Inception' => $is_placement ? '-' : $rfq_data['incept_dept_count'],
+                        'Total Lives at Inception ' => $is_placement ? '-' : $rfq_data['incept_no_of_lives'],
+
+                        'No of Employees at Expiry' => $is_placement ? '-' : $rfq_data['exp_emp_count'],
+                        'No of Dependents at Expiry' => $is_placement ? '-' : $rfq_data['exp_dept_count'],
+                        'Total Lives at Expiry ' => $is_placement ? '-' : $rfq_data['exp_no_of_lives'],
+
+                        'No of Employees at Renewal' => $rfq_data['renewal_emp_count'],
+                        'No of Dependents at Renewal' => $rfq_data['renewal_dept_count'],
+                        'Total Lives at Renewal ' => $rfq_data['renewal_no_of_lives'],
+
+                        'Period of Insurance ' => !empty($rfq_data['policy_start_date']) && !empty($rfq_data['policy_end_date'])
+                            ? date('d-m-Y', strtotime($rfq_data['policy_start_date'])) . ' to ' . date('d-m-Y', strtotime($rfq_data['policy_end_date']))
+                            : "To be decided",
+
+                        'Insurer' => $rfq_data['insurer_name'] ?? " - ",
+                        'TPA' => $rfq_data['tpa_name'] ?? " - ",
+
+                        'Policy Run Days' => $is_placement ? '-' : $rfq_data['policy_run_days'],
+                        'Inception Premium' => $is_placement ? '-' : formatIndianCurrency($rfq_data['premium_at_inception']),
+                        'Premium as on (' . date('d-m-Y', strtotime($rfq_data['incurred_claims_date'])) . ')' => $is_placement ? '-' : formatIndianCurrency($rfq_data['premium_date']),
+                        'Earned Premium' => $is_placement ? '-' : formatIndianCurrency(intval($rfq_data['earned_premium'])),
+                        'Incurred Claims as on (' . date('d-m-Y', strtotime($rfq_data['incurred_claims_date'])) . ')' => $is_placement ? '-' : formatIndianCurrency($rfq_data['incurred_claims']),
+                        'Annualised Claims' => $is_placement ? '-' : formatIndianCurrency(intval($rfq_data['annualised_claims'])),
+                        'Incurred Claims Ratio' => $is_placement ? '-' : $rfq_data['incurred_claims_ratio'] . " %",
+                        'Earned Claims Ratio' => $is_placement ? '-' : $rfq_data['earned_claims_ratio'] . " %",
+                    ];
+                }
             } else if (in_array($rfq_data['policy_type_id'], [1, 6, 7])) {
 
                 $lead_data = [
@@ -1857,27 +1903,8 @@ class LeadsController extends BaseController
                 ];
             }
         }
+        // print_r($lead_data); die;
 
-        $data = json_decode($rfq_data['json'], true);
-        // dd($data);
-
-        $sheetName = 'Worksheet';
-        if ($type == 2) {
-            $sheetName = 'QCR';
-            // $propsal_and_insurer = "Proposal 1-ICICIPRU-ICICI001";
-            $data = $this->convertJsonForQCR($data, $type);
-            if ($propsal_and_insurer !== null) {
-                list($proposal_key, $insurer_key) = explode('-', $propsal_and_insurer, 2);
-                $data = $this->transformProposelData($data, $proposal_key, $insurer_key);
-                $is_placement = true;
-                $sheetName = 'Placement';
-            }
-        } else if ($type == 1) {
-            $sheetName = 'RFQ';
-            $data = $this->convertJsonForQCR($data, $type);
-            // dd($data);
-        }
-        //  dd($data);
 
         $spreadsheet = new Spreadsheet();
         $sheet = $spreadsheet->getActiveSheet();
diff --git a/app/Controllers/MasterController.php b/app/Controllers/MasterController.php
index 013a9324..58618abf 100755
--- a/app/Controllers/MasterController.php
+++ b/app/Controllers/MasterController.php
@@ -33,8 +33,11 @@ use App\Models\ClientDepositModel;
 use App\Models\EmployeePolicyModel;
 use App\Models\FileModel;
 use App\Models\InsurerExcelExportTemplateModel;
+use App\Models\NhanceBranchModel;
 use App\Models\SettingsModel;
 use App\Models\VehicleModel;
+use App\Models\VehicleTypeModel;
+use App\Models\RTOModel;
 
 use CodeIgniter\CLI\CLI;
 
@@ -1347,6 +1350,16 @@ class MasterController extends AdminController
         // === INSERT ===
         if (empty($id)) {
 
+            $cd_acc_count = $this->CDMasterModel->where('is_active', 1)
+                ->where('client_id', $data['client_id'])
+                ->where('insurer_id', $data['insurer_id'])
+                ->where('insurer_branch_id', $data['insurer_branch_id'])
+                ->countAllResults();
+        
+            if($cd_acc_count > 0){
+                return $this->respond(['status' => false, 'message' => 'A CD account has already been created for this client, insurer, and insurer branch combination.'], 200);
+            }
+
             $this->myLogger->logme("error", 'Performing INSERT operation.');
             $insert = $this->CDMasterModel->insert($data);
             $this->myLogger->logme("error", 'Insert result: ' . json_encode($insert));
@@ -1571,6 +1584,15 @@ class MasterController extends AdminController
 
         $data['insurer_branch_id'] = $insurer_branch_id;
 
+        $cd_acc_count = $this->CDMasterModel->where('is_active', 1)
+                        ->where('client_id', $data['client_id'])
+                        ->where('insurer_id', $data['insurer_id'])
+                        ->where('insurer_branch_id', $data['insurer_branch_id'])
+                        ->countAllResults();
+        
+        if($cd_acc_count > 0){
+            return $this->respond(['status' => false, 'message' => 'A CD account has already been created for this client, insurer, and insurer branch combination.'], 200);
+        }
 
         // array with data for CD Traction table
         $cd_tranction_data = [
@@ -1614,11 +1636,30 @@ class MasterController extends AdminController
         }
     }
 
+    public function checkDuplicateCdAccount()
+    {   
+        $data = $this->request->getGet();
+
+        $cd_acc_count = $this->CDMasterModel
+            ->where('is_active', 1)
+            ->where('client_id', $data['client_id'])
+            ->where('insurer_id', $data['insurer_id'])
+            ->where('insurer_branch_id', $data['insurer_branch_id'])
+            ->countAllResults();
+    
+        if($cd_acc_count > 0){
+            return $this->respond(['status' => false, 'message' => 'A CD account has already been created for this client, insurer, and insurer branch combination.'], 200);
+        }else{
+            return $this->respond(['status' => true], 200);
+        }
+    }
+
 
     //Vehicle Master data Function
 
     public function VehicleMasterList()
-    {   $data['tab_name'] = 'Vehicle Master';
+    {   
+        $data['tab_name'] = 'Vehicle Master';
         $data['page_name'] = 'Vehicles';
         $data['vehicle_type'] = [
             'two_wheeler' => 'Two Wheeler',
@@ -2020,4 +2061,255 @@ class MasterController extends AdminController
         dd($result);
     }
 
+    //----------------------------------------------------------------------------------------------------------
+
+    public function nhanceBranchMaster()
+    {
+        $nhanceBranchModel = new NhanceBranchModel();
+        $method = $this->request->getMethod();
+        $data['tab_name'] = 'Nhance Branch';
+        $data['page_name'] = 'Nhance Branchs';
+
+        if ($method === 'post') {
+
+            $id = $this->request->getPost('pk') ?? null;
+            $data = $this->request->getPost();
+
+            if (empty($id)) {
+                $update_status = $nhanceBranchModel->insert($data);
+            } else {
+                $update_status = $nhanceBranchModel->where('id', $id)->set($data)->update();
+            }
+
+            if ($update_status) {
+                return $this->respond([
+                    'status'  => true,
+                    'code'    => 200,
+                    'message' => 'Nhance Branch Master updated successfully',
+                    'data'    => $data
+                ], 200);
+            } else {
+                return $this->respond([
+                    'status'  => false,
+                    'code'    => 400,
+                    'message' => 'Failed to update',
+                    'data'    => $data
+                ], 200);
+            }
+
+        } elseif ($method === 'get') {
+
+            $id = $this->request->getGet('pk') ?? null;
+
+            if (!empty($id)) {
+                $data = $nhanceBranchModel->where('is_active', 1)->where('id', $id)->findAll();
+                if (!empty($data)) {
+                    return $this->respond(['status' => true, 'code' => 200, 'data' => $data], 200);
+                } else {
+                    return $this->respond(['status' => false, 'code' => 400, 'message' => 'No data found'], 200);
+                }
+            }
+
+            $data = $nhanceBranchModel->where('is_active', 1)->orderBy('id', 'DESC')->findAll();
+            return $this->loadLayout('nhance_branch_list', ['data' => $data]);
+
+        } elseif ($method === 'delete') {
+
+            $input = $this->request->getRawInput();
+            $id = $input['pk'] ?? null;
+
+            if (empty($id)) {
+                return $this->respond([
+                    'status'  => false,
+                    'code'    => 404,
+                    'message' => 'No ID provided for deletion'
+                ], 200);
+            }
+
+            $update_status = $nhanceBranchModel->where('id', $id)->set(['is_active' => 0])->update();
+
+            if ($update_status) {
+                return $this->respond([
+                    'status'  => true,
+                    'code'    => 200,
+                    'message' => 'Data removed successfully',
+                    'pk'      => $id
+                ], 200);
+            } else {
+                return $this->respond([
+                    'status'  => false,
+                    'code'    => 400,
+                    'message' => 'Failed to remove data',
+                    'pk'      => $id
+                ], 200);
+            }
+        }
+    }
+
+
+    public function vehicleTypeMaster()
+    {
+        $vehicleTypeModel = new VehicleTypeModel();
+        $method = $this->request->getMethod();
+        $data['tab_name'] = 'Vehicle Type';
+        $data['page_name'] = 'Vehicle Types';
+        if ($method === 'post') {
+
+            $id = $this->request->getPost('pk') ?? null;
+            $data = $this->request->getPost();
+
+            if (empty($id)) {
+                $update_status = $vehicleTypeModel->insert($data);
+            } else {
+                $update_status = $vehicleTypeModel->where('id', $id)->set($data)->update();
+            }
+
+            if ($update_status) {
+                return $this->respond([
+                    'status'  => true,
+                    'code'    => 200,
+                    'message' => 'Vehicle Type Master updated successfully',
+                    'data'    => $data
+                ], 200);
+            } else {
+                return $this->respond([
+                    'status'  => false,
+                    'code'    => 400,
+                    'message' => 'Failed to update',
+                    'data'    => $data
+                ], 200);
+            }
+
+        } elseif ($method === 'get') {
+
+            $id = $this->request->getGet('pk') ?? null;
+
+            if (!empty($id)) {
+                $data = $vehicleTypeModel->where('is_active', 1)->where('id', $id)->findAll();
+                if (!empty($data)) {
+                    return $this->respond(['status' => true, 'code' => 200, 'data' => $data], 200);
+                } else {
+                    return $this->respond(['status' => false, 'code' => 400, 'message' => 'No data found'], 200);
+                }
+            }
+
+            $data = $vehicleTypeModel->where('is_active', 1)->orderBy('id', 'DESC')->findAll();
+            return $this->loadLayout('vehicle_type_master_list', ['data' => $data]);
+
+        } elseif ($method === 'delete') {
+
+            $input = $this->request->getRawInput();
+            $id = $input['pk'] ?? null;
+
+            if (empty($id)) {
+                return $this->respond([
+                    'status'  => false,
+                    'code'    => 404,
+                    'message' => 'No ID provided for deletion'
+                ], 200);
+            }
+
+            $update_status = $vehicleTypeModel->where('id', $id)->set(['is_active' => 0])->update();
+
+            if ($update_status) {
+                return $this->respond([
+                    'status'  => true,
+                    'code'    => 200,
+                    'message' => 'Data removed successfully',
+                    'pk'      => $id
+                ], 200);
+            } else {
+                return $this->respond([
+                    'status'  => false,
+                    'code'    => 400,
+                    'message' => 'Failed to remove data',
+                    'pk'      => $id
+                ], 200);
+            }
+        }
+    }
+
+    public function rtoMaster()
+    {
+        $rtoModel = new RTOModel();
+        $method = $this->request->getMethod();
+        $data['tab_name'] = 'RTO';
+        $data['page_name'] = 'RTO';
+
+        if ($method === 'post') {
+
+            $id = $this->request->getPost('pk') ?? null;
+            $data = $this->request->getPost();
+
+            if (empty($id)) {
+                $update_status = $rtoModel->insert($data);
+            } else {
+                $update_status = $rtoModel->where('id', $id)->set($data)->update();
+            }
+
+            if ($update_status) {
+                return $this->respond([
+                    'status'  => true,
+                    'code'    => 200,
+                    'message' => 'RTO Master updated successfully',
+                    'data'    => $data
+                ], 200);
+            } else {
+                return $this->respond([
+                    'status'  => false,
+                    'code'    => 400,
+                    'message' => 'Failed to update',
+                    'data'    => $data
+                ], 200);
+            }
+
+        } elseif ($method === 'get') {
+
+            $id = $this->request->getGet('pk') ?? null;
+
+            if (!empty($id)) {
+                $data = $rtoModel->where('is_active', 1)->where('id', $id)->findAll();
+                if (!empty($data)) {
+                    return $this->respond(['status' => true, 'code' => 200, 'data' => $data], 200);
+                } else {
+                    return $this->respond(['status' => false, 'code' => 400, 'message' => 'No data found'], 200);
+                }
+            }
+
+            $data = $rtoModel->where('is_active', 1)->orderBy('id', 'DESC')->findAll();
+            return $this->loadLayout('rto_master_list', ['data' => $data]);
+
+        } elseif ($method === 'delete') {
+
+            $input = $this->request->getRawInput();
+            $id = $input['pk'] ?? null;
+
+            if (empty($id)) {
+                return $this->respond([
+                    'status'  => false,
+                    'code'    => 404,
+                    'message' => 'No ID provided for deletion'
+                ], 200);
+            }
+
+            $update_status = $rtoModel->where('id', $id)->set(['is_active' => 0])->update();
+
+            if ($update_status) {
+                return $this->respond([
+                    'status'  => true,
+                    'code'    => 200,
+                    'message' => 'Data removed successfully',
+                    'pk'      => $id
+                ], 200);
+            } else {
+                return $this->respond([
+                    'status'  => false,
+                    'code'    => 400,
+                    'message' => 'Failed to remove data',
+                    'pk'      => $id
+                ], 200);
+            }
+        }
+    }
+
 }
\ No newline at end of file
diff --git a/app/Controllers/PolicyTransactionController.php b/app/Controllers/PolicyTransactionController.php
index db8be45b..9b39f41f 100644
--- a/app/Controllers/PolicyTransactionController.php
+++ b/app/Controllers/PolicyTransactionController.php
@@ -113,7 +113,8 @@ class PolicyTransactionController extends BaseController
 
     // Policy Transaction Inception
     public function viewInception()
-    {
+    {   
+        $bds_edit_pt_id = $this->request->getGet('pt_id') ?? null;
         $data['tab_name'] = 'Policy';
         $data['page_name'] = 'Policy';
 
@@ -151,6 +152,8 @@ class PolicyTransactionController extends BaseController
         //     'bicycle' => 'Bicycle'
         // ];
         $data['vehicle_type'] = db_connect()->table('vehicle_type')->where('is_active', 1)->get()->getResultArray();
+        $data['rto_details'] = db_connect()->table('rto_master')->where('is_active', 1)->get()->getResultArray();
+
         $data['vehicle_des'] = [
             'commercial' => 'Commercial',
             'private' => 'Private',
@@ -181,34 +184,38 @@ class PolicyTransactionController extends BaseController
         $issuer = empty($issuer) ? 0 : $issuer;
         $status = empty($status) ? 0 : $status;  // Corrected from `$issuer`
 
-        if ($this->request->is('get')) {
+        if(empty($bds_edit_pt_id)){
+            if ($this->request->is('get')) {
 
-            // Fetch inception data list
-            $data['inception_data_list'] = $this->policyTransactionModel->getInceptionTranctionListData(
-                $start_date,
-                $end_date,
-                $client_id,
-                $insurer_id,
-                $policy_type_id,
-                $date_type,
-                $issuer,
-                $status
-            );
-        } else {
+                // Fetch inception data list
+                $data['inception_data_list'] = $this->policyTransactionModel->getInceptionTranctionListData(
+                    $start_date,
+                    $end_date,
+                    $client_id,
+                    $insurer_id,
+                    $policy_type_id,
+                    $date_type,
+                    $issuer,
+                    $status
+                );
+            } else {
 
-            $ids = $this->request->getPost('ids');
-            $ids = array_filter(explode(',', $ids));
-            $data['inception_data_list'] = $this->policyTransactionModel->getInceptionTranctionListData(
-                $start_date = 0,
-                $end_date = 0,
-                $client_id = 0,
-                $insurer_id = 0,
-                $policy_type_id = 0,
-                $date_type = 0,
-                $issuer = 0,
-                $status = 0,
-                $ids
-            );
+                $ids = $this->request->getPost('ids');
+                $ids = array_filter(explode(',', $ids));
+                $data['inception_data_list'] = $this->policyTransactionModel->getInceptionTranctionListData(
+                    $start_date = 0,
+                    $end_date = 0,
+                    $client_id = 0,
+                    $insurer_id = 0,
+                    $policy_type_id = 0,
+                    $date_type = 0,
+                    $issuer = 0,
+                    $status = 0,
+                    $ids
+                );
+            }
+        }else{
+            $data['inception_data_list'] = [];
         }
 
 
@@ -261,6 +268,7 @@ class PolicyTransactionController extends BaseController
         $data = $this->preparePolicyData();
         $data['cd_ac_pk'] = $this->request->getPost('cd_ac_no');
         $data['issuer'] = 2;
+        $data['status'] = 'completed';
         $this->myLogger->logme('error', 'Policy Trancaction modified form data ( insert data ) : '. json_encode($data));
 
 
@@ -276,7 +284,6 @@ class PolicyTransactionController extends BaseController
         $data = $this->request->getPost();
 
         // print_r($data); die;
-        // var_dump($data); die;
 
         if (empty($data['policy_issue_date'])) {
             $data['policy_issue_date'] = null;
@@ -304,7 +311,6 @@ class PolicyTransactionController extends BaseController
             $data['last_action_date'] = change_date_format($data['last_action_date']);
         }
 
-
         // Separate Insurer and TPA Branch IDs and IDs
         if (isset($data['insurer_id']) && !empty($data['insurer_id'])) {
             list($data['insurer_branch_id'], $data['insurer_id']) = explode('-', $data['insurer_id']);
@@ -373,6 +379,7 @@ class PolicyTransactionController extends BaseController
 
                 $pt_co_share_details = $this->insertOrUpdateCoShareDetails($data, $insert);
 
+                $client_policy_id = null;
                 if ($data['ct_type'] == 2) {
                     $client_policy_insert_data = $this->prepareClientPolicyInsertData($data);
                     $client_policy_id = $this->clientPolicyModel->insert($client_policy_insert_data);
@@ -381,7 +388,7 @@ class PolicyTransactionController extends BaseController
                 }
 
                 if ($data['client_type'] == 1 && $data['status'] == 'completed' && $data['is_cd_reduce_from_bds'] == 1) {
-                    $this->processCompletedStatus($data, $client_policy_id, $data['insurer_id']);
+                    $this->processCompletedStatus($data, $client_policy_id, $data['insurer_id'], $insert);
                 }
             }
 
@@ -391,7 +398,6 @@ class PolicyTransactionController extends BaseController
             $clientController = new ClientController();
             $data['client_kyc_primary_table']  =  $clientController->generateKycPrimaryTable($data['client_id']);
             $data['client_kyc_other_table']  =  $clientController->generateKycOthersTable($data['client_id']);
-
             $data['entity_type_id'] =  $client_data['entity_type_id'];
 
             return $this->respondSuccess($insert, "Policy transaction created successfully", $data);
@@ -432,20 +438,20 @@ class PolicyTransactionController extends BaseController
                     }
                 }
 
-                if($old_pt_data['status'] != "completed"){
-                    if ($data['status'] == 'completed' && $data['ct_type'] == 2) {
-                        if ($data['client_type'] == 1 && $data['is_cd_reduce_from_bds'] == 1) {
-                            $this->processCompletedStatus($data, $data['client_policy_id'], $data['insurer_id']);
-                        }
-                    }
-                }
+                // if($old_pt_data['status'] != "completed"){
+                //     if ($data['status'] == 'completed' && $data['ct_type'] == 2) {
+                //         if ($data['client_type'] == 1 && $data['is_cd_reduce_from_bds'] == 1) {
+                //             $this->processCompletedStatus($data, $data['client_policy_id'], $data['insurer_id'], $id);
+                //         }
+                //     }
+                // }
 
                 $data['pt_co_share_details'] = $this->PTCOShareDetailsModel->where('pt_id', $id)->where('is_active', 1)->findAll();
             }
 
             if(isset($data['cd_amt_changed']) && !empty($data['cd_amt_changed'])){
                 $policy_data = $this->policyTransactionModel->where('is_active', 1)->where('id', $id)->first();
-                $this->cdCorrection($policy_data, $data['cd_amt_changed']);
+                $this->cdCorrection($policy_data, $data['cd_amt_changed'], $id);
             }
 
             $client_data = $this->clientModel->where('id', $data['client_id'])->first();
@@ -467,10 +473,6 @@ class PolicyTransactionController extends BaseController
     {
         // Prepare data for insertion and updating
         $coShareDetails = [];
-
-        // print_r($data); die;
-        // die;
-
         if (isset($data['co_share_id']) && !empty($data['co_share_id'])) {
             $this->removePtCoShareRecords($data['co_share_id'], $pt_id);
         }
@@ -564,7 +566,6 @@ class PolicyTransactionController extends BaseController
             }
 
             // print_r($this->PTCOShareDetailsModel->getLastQuery()); die;
-
             // print_r($coShareDetails); 
             // die;
 
@@ -594,6 +595,7 @@ class PolicyTransactionController extends BaseController
             'client_branch_id' => $data['client_branch_id'] ?? 0,
             'cd_ac_pk' => $data['cd_ac_no'] ?? null,
             'gst' => 18,
+            'policy_entry_from' => 2,
         ];
     }
 
@@ -609,7 +611,7 @@ class PolicyTransactionController extends BaseController
         $this->policyTransactionStatusModel->insert($statusData);
     }
 
-    private function processCompletedStatus($data, $client_policy_id, $insurer_id)
+    private function processCompletedStatus($data, $client_policy_id, $insurer_id, $policyTranId)
     {
         $totalAmount = (int)$data['total'][0] ?? 0;
         $description = 'The following amount of Rs. ' . $totalAmount . '/- has been debited for the ' . $data['emp_count'] . ' employees at Inception (BDS).';
@@ -627,13 +629,19 @@ class PolicyTransactionController extends BaseController
             'updated_by' => get_session_userid(),
             'event_name' => 'inception',
             'is_active' => 1,
-            'cd_ac_pk'  => $data['cd_ac_pk']
+            'cd_ac_pk'  => $data['cd_ac_pk'],
+            'pt_id' => $policyTranId ?? null,
         ];
 
-        DepositHelper::saveDeposit($cdTransactionData, get_session_userid());
+        $result = DepositHelper::saveDeposit($cdTransactionData, get_session_userid());
+
+        if(isset($result) && $result['success'] == true){
+            $update_data['ct_tran_id'] = $result['insert_id'];
+            $this->policyTransactionModel->where('id', $policyTranId)->set($update_data)->update();
+        }
     }
 
-    private function cdCorrection($data, $amt)
+    private function cdCorrection($data, $amt, $policyTranId)
     {
         $totalAmount = (int)($amt ?? 0);
         $description = 'The following amount of Rs. ' . $totalAmount . '/- has been debited towards the difference arising from the change in the BDS base premium.';
@@ -651,7 +659,8 @@ class PolicyTransactionController extends BaseController
             'updated_by' => get_session_userid(),
             'event_name' => 'inception',
             'is_active' => 1,
-            'cd_ac_pk'  => $data['cd_ac_pk']
+            'cd_ac_pk'  => $data['cd_ac_pk'],
+            'pt_id' => $policyTranId ?? null,
         ];
 
         DepositHelper::saveDeposit($cdTransactionData, get_session_userid());
@@ -1025,20 +1034,28 @@ class PolicyTransactionController extends BaseController
         }
     }
 
-    public function removePolicyTransaction($id)
-    {
+    public function removePolicyTransaction($id, $type = 0)
+    {   
         if ($id) {
-
             $data['is_active']  = 0;
             $policy_transaction_data = $this->policyTransactionModel->where('id', $id)->first();
-            if($policy_transaction_data['policy_type_id'] > 7){
+            if($policy_transaction_data['policy_type_id'] > 7 && $type == 0){
+
                 $this->policyTransactionModel->where('id', $id)->set($data)->update();
                 $this->PTCOShareDetailsModel->where('pt_id', $id)->set($data)->update();
                 $this->clientPolicyModel->where('id', $policy_transaction_data['client_policy_id'])->set($data)->update();
                 $this->policyTransactionModel->where('client_policy_id', $policy_transaction_data['client_policy_id'])->set($data)->update();
+
+                $cd_transaction_model = new ClientDepositModel();
+                $cd_transaction_model->where('policy_transaction_id', $id)->set($data)->update();
+
             }else{
                 $this->policyTransactionModel->where('id', $id)->set($data)->update();
                 $this->PTCOShareDetailsModel->where('pt_id', $id)->set($data)->update();
+                
+                $cd_transaction_model = new ClientDepositModel();
+                $cd_transaction_model->where('policy_transaction_id', $id)->set($data)->update();
+
             }
             return $this->respond(['status' => true, 'code' => 200, 'message' => 'Policy Transaction removed successfully'], 200);
         } else {
@@ -1075,7 +1092,7 @@ class PolicyTransactionController extends BaseController
     {
         // echo '
';
         // !dd($this->getEndorsementDataForEdit(17));
-
+        $bds_edit_pt_id = $this->request->getGet('pt_id') ?? null;
         $data['tab_name'] = 'Endorsement';
         $data['page_name'] = 'Endorsement';
         $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
@@ -1142,8 +1159,11 @@ class PolicyTransactionController extends BaseController
         $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
         $status = (!isset($issuer) || $status === '' || $status === null) ? 0 : $status;
 
-
-        $data['endorsement_data_list'] = $this->policyTransactionModel->getEndorsementTranctionListData($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer, $status);
+        if($bds_edit_pt_id == null){
+            $data['endorsement_data_list'] = $this->policyTransactionModel->getEndorsementTranctionListData($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer, $status);
+        }else{
+            $data['endorsement_data_list'] = [];
+        }
         $data['client'] = $this->clientModel->where('is_active', 1)->findAll();
         $data['policy_types'] = $this->policyTypeModel->where('is_active', 1)->findAll();
 
@@ -1166,6 +1186,7 @@ class PolicyTransactionController extends BaseController
     {
         $id = $this->request->getPost('id');
         $data = $this->preparePolicyTransactionData();
+        $data['status'] = 'completed';
         // print_r($data); die;
 
         if (!$id) {
@@ -1250,9 +1271,10 @@ class PolicyTransactionController extends BaseController
 
         $data['tsi'] = generate_tsi_code($issue_type['issue_type'] ?? 1);
 
-        $client_branch_id = $data['client_branch_id'];
-        if ($data['client_branch_id'] == "") {
+        if (!isset($data['client_branch_id']) || $data['client_branch_id'] == "") {
             $client_branch_id = $issue_type['client_branch_id'];
+        }else{
+            $client_branch_id = $data['client_branch_id'];
         }
 
         $data['is_cd_reduce_from_bds'] = (isset($issue_type['policy_type_id']) && $issue_type['policy_type_id'] > 7 && $data['client_type'] == 1) ? 1 : 0;
@@ -1333,9 +1355,9 @@ class PolicyTransactionController extends BaseController
         if ($update) {
 
             $this->insertTransactionStatus($id, $data, 1);
-            if($old_endorse_data['status'] != "completed"){
-                $this->handleCompletedStatus($data, $id);
-            }
+            // if($old_endorse_data['status'] != "completed"){
+            //     $this->handleCompletedStatus($data, $id);
+            // }
             $this->insertOrUpdateCoShareDetails($data, $id);
 
 
@@ -1346,30 +1368,40 @@ class PolicyTransactionController extends BaseController
     }
 
     private function handleCompletedStatus($data, $policy_tran_id)
-    {
+    {   
         if ($data['client_type'] == 1 && $data['status'] == 'completed' && $data['is_cd_reduce_from_bds'] == 1) {
 
             $tolamt = (int) $data['total'][0] ?? 0;
 
-            $description = 'The following amount of Rs. ' . round($tolamt, 2) . '/- has been' .
-                ($data['action_type'] == 'deletion' ? ' Credit ' : ' Debit ') . 'from the policy transaction (BDS)';
-            $cd_tranction_data = [
-                'amount' => $tolamt,
-                'sub_type_id' => $data['action_type'] == 'deletion' ? 3 : 4,
-                'client_id' => $data['client_id'],
-                'client_policy_id' => $data['client_policy_id'],
-                'endorsement_no' => null,
-                'cd_ac_no' => $data['cd_ac_no'] ?? null,
-                'insurer_id' => $data['insurer_id'],
-                'description' => $description,
-                'transaction_type' => $data['action_type'] == 'deletion' ? 'Credit' : 'Debit',
-                'updated_by' => get_session_userid(),
-                'event_name' => $data['action_type'],
-                'is_active' => 1,
-                'cd_ac_pk' => $data['cd_ac_pk'] ?? null,
-            ];
+            if(!empty($tolamt)){
+                $description = 'The following amount of Rs. ' . round($tolamt, 2) . '/- has been' .
+                    ($data['action_type'] == 'deletion' ? ' Credit ' : ' Debit ') . 'from the policy transaction (BDS)';
+                
+                $cd_tranction_data = [
+                    'amount' => abs($tolamt),
+                    'sub_type_id' => $data['action_type'] == 'deletion' ? 3 : 4,
+                    'client_id' => $data['client_id'],
+                    'client_policy_id' => $data['client_policy_id'],
+                    'endorsement_no' => null,
+                    'cd_ac_no' => $data['cd_ac_no'] ?? null,
+                    'insurer_id' => $data['insurer_id'],
+                    'description' => $description,
+                    'transaction_type' => $data['action_type'] == 'deletion' ? 'Credit' : 'Debit',
+                    'updated_by' => get_session_userid(),
+                    'event_name' => $data['action_type'],
+                    'is_active' => 1,
+                    'cd_ac_pk' => $data['cd_ac_pk'] ?? null,
+                    'pt_id' => $policy_tran_id ?? null,
+                ];
+
+                $result = DepositHelper::saveDeposit($cd_tranction_data, get_session_userid());
+
+                if(isset($result['success']) && $result['success']){
+                    $update_data['ct_tran_id'] = $result['insert_id'];
+                    $this->policyTransactionModel->where('id', $policy_tran_id)->set($update_data)->update();
+                }
+            }
 
-            DepositHelper::saveDeposit($cd_tranction_data, get_session_userid());
         }
     }
 
@@ -1397,6 +1429,16 @@ class PolicyTransactionController extends BaseController
             ->orderBy('id', 'asc')
             ->first();
 
+        $pt_id = null;   
+
+        if(!empty($data)){
+            $inception_data = $this->policyTransactionModel
+                    ->where('policy_no', $data['policy_no'])
+                    ->where('client_id', $data['client_id'])
+                    ->where('action_type', 'inception')
+                    ->first();
+            $pt_id = $inception_data['id'];
+        }    
 
         if (!empty($data['policy_start_date'])) {
             $data['policy_start_date'] =  change_date_format($data['policy_start_date'], 'Y-m-d', 'd/m/Y');
@@ -1558,8 +1600,18 @@ class PolicyTransactionController extends BaseController
 
         // print_r($data['endorse_eff_date']); die;
 
+        $pt_bp_amt = $this->PTCOShareDetailsModel
+            ->select('bp_amt, amount')
+            ->where('pt_id', $id)
+            ->where('co_share_type', 1)
+            ->where('is_active', 1)
+            ->first();
+
+        // dd(db_connect()->getLastQuery() ,$pt_bp_amt);
+        $data['base_cd_amount'] = $pt_bp_amt['amount'] ?? null;
+
         if ($data) {
-            return $this->respond(['status' => true, 'data' => $data], 200);
+            return $this->respond(['status' => true, 'data' => $data, 'pt_id' => $pt_id], 200);
         } else {
             return $this->respond(['status' => false], 200);
         }
@@ -1709,14 +1761,16 @@ class PolicyTransactionController extends BaseController
                 ")
             ->join('policy_transaction', 'policy_transaction.id = pt_co_share_details.pt_id')
             ->where('policy_transaction.client_id', $client_id)
-            ->where('policy_transaction.client_policy_id', $client_policy_id)
+            // ->where('policy_transaction.client_policy_id', $client_policy_id)
+            ->where('policy_transaction.id', $client_policy_id)
             ->where('policy_transaction.action_type', 'inception')
             ->where('policy_transaction.is_active', 1)
             ->findAll();
 
         $is_copay_yes = $this->policyTransactionModel
             ->where('client_id', $client_id)
-            ->where('client_policy_id', $client_policy_id)
+            // ->where('client_policy_id', $client_policy_id)
+            ->where('id', $client_policy_id)
             ->where('action_type', 'inception')
             ->where('is_active', 1)
             ->first();
@@ -2102,7 +2156,7 @@ class PolicyTransactionController extends BaseController
     //insurer statement list page
     public function statementList()
     {
-        // dd($this->validateInsurerStatement(['file_id' => 49])); // for check validateInsurerStatementfunction with hard coded file id always un command
+        // dd($this->updateInsurerStatement(['file_id' => 133])); // for check validateInsurerStatementfunction with hard coded file id always un command
         $data['insurers'] = $this->insurerModel->where('is_active',1)->findAll();
         $today = date('Y-m-d');
         $fromday = $from_date = date('Y-m-d', strtotime('-180 days', strtotime($today)));
@@ -2347,13 +2401,13 @@ class PolicyTransactionController extends BaseController
                 // $excel_row = ExcelSanitizeHelper::sanitizeArrayData($excel_row);
                 $is_source_found = 0;
                 // Kint::dump($excel_key,$excel_row[1],$excel_row[2]);
-                $policy_start_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[4]); //policy_start_date from excel
-                $policy_end_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[5]); //policy_end_date from excel
+                // $policy_start_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[4]); //policy_start_date from excel
+                // $policy_end_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[5]); //policy_end_date from excel
                 
                 $policy_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[1]); //policy_end_date from excel
                 $policy_no = preg_replace(  '/[\x{200B}\x{200C}\x{200D}\x{FEFF}\x{00A0}\x{200E}\x{200F}\x{202A}-\x{202E}]/u', '',  $excel_row[1]); //policy_end_date from excel
                 
-                $client_name = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[3]); //clientname from excel
+                // $client_name = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[3]); //clientname from excel
                 
                 $endorsement_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[2]); //policy_end_date from excel
                 $endorsement_no = preg_replace(  '/[\x{200B}\x{200C}\x{200D}\x{FEFF}\x{00A0}\x{200E}\x{200F}\x{202A}-\x{202E}]/u', '',  $excel_row[2]); //policy_end_date from excel
@@ -2459,11 +2513,11 @@ class PolicyTransactionController extends BaseController
             if (!$is_row_empty) {
 
                 $is_source_found = 0;
-                $policy_start_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[4]); //policy_start_date from excel
-                $policy_end_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[5]); //policy_end_date from excel
+                // $policy_start_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[4]); //policy_start_date from excel
+                // $policy_end_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[5]); //policy_end_date from excel
                 $policy_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[1]); //policy_end_date from excel
                 $policy_no = preg_replace('/[\x{200C}\x{200B}]/u', '',  $excel_row[1]); //
-                $client_name = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[3]); //clientname from excel
+                // $client_name = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[3]); //clientname from excel
                 $endorsement_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[2]); //policy_end_date from excel
 
                 foreach ($source_data as $source_key => $source_row) {
@@ -2476,9 +2530,10 @@ class PolicyTransactionController extends BaseController
                         //calculate percentage first
                         $total_amt = 0;
 
-                        $actual_bp_per = trim($excel_row[9]);
-                        $actual_bp_brokerage = trim($excel_row[12]);
-                        $actual_bp_amt = trim($excel_row[6]);
+                        // $actual_bp_per = trim($excel_row[9]); //commented becoz this filed removed tfrom excel file
+                        $actual_bp_per = 0; //set default value 0 for maintaining existing code flow
+                        $actual_bp_brokerage = trim($excel_row[5]);
+                        $actual_bp_amt = trim($excel_row[3]);
 
                         if (($actual_bp_brokerage && $actual_bp_brokerage != 0 && $actual_bp_brokerage != "")) {
                             $total_amt += $actual_bp_brokerage;
@@ -2491,9 +2546,10 @@ class PolicyTransactionController extends BaseController
                             $total_amt += $actual_bp_brokerage;
                         }
 
-                        $actual_tp_per = trim($excel_row[10]);
-                        $actual_tp_brokerage = trim($excel_row[13]);
-                        $actual_tp_amt = trim($excel_row[7]);
+                        // $actual_tp_per = trim($excel_row[10]);//commented becoz this filed removed tfrom excel file
+                        $actual_tp_per = 0;//set default value 0 for maintaining existing code flow
+                        $actual_tp_brokerage = trim($excel_row[6]);
+                        $actual_tp_amt = trim($excel_row[4]);
 
                         if ($actual_tp_brokerage && $actual_tp_brokerage != 0 && $actual_tp_brokerage != "") {
                             $total_amt += $actual_tp_brokerage;
@@ -2506,9 +2562,13 @@ class PolicyTransactionController extends BaseController
                             $total_amt += $actual_tp_brokerage;
                         }
 
-                        $actual_tep_per = trim($excel_row[11]);
-                        $actual_tep_brokerage = trim($excel_row[14]);
-                        $actual_tep_amt = trim($excel_row[8]);
+                        // $actual_tep_per = trim($excel_row[11]);
+                        // $actual_tep_brokerage = trim($excel_row[14]);
+                        // $actual_tep_amt = trim($excel_row[8]);
+
+                        $actual_tep_per = 0;
+                        $actual_tep_brokerage = 0;
+                        $actual_tep_amt = 0;
 
                         if ($actual_tep_brokerage && $actual_tep_brokerage != 0 && $actual_tep_brokerage != "") {
                             $total_amt += $actual_tep_brokerage;
@@ -2524,7 +2584,7 @@ class PolicyTransactionController extends BaseController
                         //find variance
                         $variance_amt = $source_row['exp_amt'] - $total_amt;
 
-                        $data_to_update[] = ['co_share_id' => $source_row['id'], 'actual_bp_amt' => $actual_bp_amt, 'actual_tp_amt' => $actual_tp_amt, 'actual_tep_amt' => $actual_tep_amt, 'actual_bp_per' => $actual_bp_per, 'actual_tp_per' => $actual_tp_per, 'actual_tep_per' => $actual_tep_per, 'variance' => $variance_amt, 'actual_tep_brokerage_amt' => $actual_tep_brokerage, 'actual_tp_brokerage_amt' => $actual_tp_brokerage, 'actual_bp_brokerage_amt' => $actual_bp_brokerage, 'reward' => trim($excel_row[15]), 'statement_id' => $file_id];
+                        $data_to_update[] = ['co_share_id' => $source_row['id'], 'actual_bp_amt' => $actual_bp_amt, 'actual_tp_amt' => $actual_tp_amt, 'actual_tep_amt' => $actual_tep_amt, 'actual_bp_per' => $actual_bp_per, 'actual_tp_per' => $actual_tp_per, 'actual_tep_per' => $actual_tep_per, 'variance' => $variance_amt, 'actual_tep_brokerage_amt' => $actual_tep_brokerage, 'actual_tp_brokerage_amt' => $actual_tp_brokerage, 'actual_bp_brokerage_amt' => $actual_bp_brokerage, 'reward' => trim($excel_row[7]), 'statement_id' => $file_id];
 
                         unset($source_data[$source_key]);
                         continue 2;
@@ -2627,6 +2687,10 @@ class PolicyTransactionController extends BaseController
             $gst = $gstTotal[$index];
             $paymentDate = $paymentDates[$index];
 
+            if($utrNo == "" && $tds == "" && $gst == "" && $receivedAmount == "")
+            {
+                continue;
+            }
             // Prepare data for insert/update
             $childData = [
                 'inv_amt' => $receivedAmount,
@@ -3113,4 +3177,116 @@ class PolicyTransactionController extends BaseController
 
         return [$policyList, $policyListByClient];
     }
+
+
+public function reportBDSNew()
+{
+    // 🧭 Basic Page Info
+    $data['tab_name']   = 'BDS Report';
+    $data['page_name']  = 'BDS Report';
+
+    // 📋 Dropdown Data
+    $data['issuer']         = [1 => 'JIBS', 2 => 'Nhance'];
+    $data['client_type']    = [1 => 'Group', 2 => 'Individual'];
+    $data['issuing_type']   = [1 => 'Fresh', 2 => 'Renewal', 3 => 'Roll Over'];
+    $data['policy_status']  = [
+        'pending'              => 'Pending',
+        'exported_to_insurer'  => 'Exported to Insurer',
+        'imported_from_insurer'=> 'Imported from Insurer',
+        'exported_to_tpa'      => 'Exported to TPA',
+        'imported_from_tpa'    => 'Imported from TPA',
+        'completed'            => 'Completed'
+    ];
+    $data['invoice_status_array'] = [
+        'yet_to_generate' => 'Yet to Generate',
+        'generated'       => 'Generated',
+        'send'            => 'Send',
+        'recived'         => 'Recived',
+    ];
+    $data['date_type'] = [
+        'policy_issue_date'  => 'Policy Issue Date',
+        'policy_start_date'  => 'Policy Start Date',
+        'policy_end_date'    => 'Policy End Date',
+        'data_received_date' => 'Data Received Date',
+        'closure_date'       => 'Closure Date',
+        'statement_month'    => 'Statement Month',
+    ];
+
+    // 🏢 Fetch Active Data
+    $data['insurer']       = $this->insurerModel->where('is_active', 1)->findAll();
+    $data['policy_types']  = $this->policyTypeModel->where('is_active', 1)->findAll();
+    $data['clients']       = $this->clientModel->where('is_active', 1)->findAll();
+    $data['users']         = $this->userModel->where('is_active', 1)->findAll();
+    $data['policy_count']  = $this->policyTransactionModel->where('is_active', 1)->countAllResults();
+
+    // 🕐 Filters
+    $start_date        = $this->request->getGet('start_date');
+    $end_date          = $this->request->getGet('end_date');
+    $client_id         = $this->request->getGet('client_id');
+    $insurer_id        = $this->request->getGet('insurer_id');
+    $policy_type_id    = $this->request->getGet('policy_type_id');
+    $date_type         = $this->request->getGet('date_type');
+    $issuer            = $this->request->getGet('issuer');
+    $client_branch_id  = $this->request->getGet('client_branch_id');
+    $insurer_branch_id = $this->request->getGet('insurer_branch_id');
+    $client_policy_id  = $this->request->getGet('client_policy_id');
+    $user_id           = $this->request->getGet('user_id');
+
+    // Handle statement month range
+    if ($date_type == 'statement_month') {
+        $start_date = (string) date('Y-m-01', strtotime($start_date));
+        $end_date   = (string) date('Y-m-31', strtotime($end_date));
+    }
+
+    // Ensure default values
+    $start_date        = $start_date        ?: 0;
+    $end_date          = $end_date          ?: 0;
+    $client_id         = $client_id         ?: 0;
+    $insurer_id        = $insurer_id        ?: 0;
+    $policy_type_id    = $policy_type_id    ?: 0;
+    $date_type         = $date_type         ?: 0;
+    $issuer            = $issuer            ?: 0;
+    $client_branch_id  = $client_branch_id  ?: 0;
+    $insurer_branch_id = $insurer_branch_id ?: 0;
+    $client_policy_id  = $client_policy_id  ?: 0;
+    $user_id           = $user_id           ?: 0;
+
+    // 🧾 Handle POST requests (Dashboard filters)
+    if ($this->request->is('post')) {
+        $isFromDashboard = $this->request->getPost('is_dashboard');
+
+        if (!empty($isFromDashboard) && $isFromDashboard == 1) {
+            $ids = array_filter(explode(',', $this->request->getPost('ids')));
+
+            if (!empty($ids)) {
+                $idsStr = implode(',', array_map('intval', $ids)); // sanitize IDs
+                $where  = "policy_transaction.id IN ($idsStr)";
+            } else {
+                $where = []; // No valid IDs
+            }
+        }
+    }
+
+    // 📊 Fetch report data
+    $data['report_list'] = $this->policyTransactionModel->reportBDSNew(
+        $start_date,
+        $end_date,
+        $client_id,
+        $insurer_id,
+        $policy_type_id,
+        $date_type,
+        $issuer,
+        $client_branch_id,
+        $insurer_branch_id,
+        $client_policy_id,
+        $user_id,
+        $where ?? ''
+    );
+
+    // 🧩 Load View
+    $this->loadLayout('report_bds_filter', $data);
+}
+
+
+
 }
diff --git a/app/Controllers/TestingController.php b/app/Controllers/TestingController.php
index e6f377c7..a7cdddd1 100644
--- a/app/Controllers/TestingController.php
+++ b/app/Controllers/TestingController.php
@@ -362,6 +362,17 @@ class TestingController extends BaseController
 
         $pre_clients_list  = $this->getNonDuplicatePreClients();
 
+        $log_post_clients_list = $post_clients_list ;
+
+        $log_pre_clients_list   = $pre_clients_list ;
+
+        log_message('error', 'Post Clients to be processed: ' . count($log_post_clients_list));
+        log_message('error', 'Pre Clients to be processed: ' . count($log_pre_clients_list));
+
+
+
+        $matched_Count = 0 ;
+        $expected_match_count = min(count($post_clients_list), count($pre_clients_list));
         
 
         if (
@@ -372,12 +383,18 @@ class TestingController extends BaseController
             $postDB = \Config\Database::connect();
             $preDB = \Config\Database::connect('preDB');
 
-            foreach ($post_clients_list as $post_client) {
+            foreach ($post_clients_list as $index => $post_client) {
 
-                foreach ($pre_clients_list as $pre_client) {
+                foreach ($pre_clients_list as $index =>  $pre_client) {
 
                     if (trim($post_client['short_name']) == trim($pre_client['short_name'])) {
 
+                        unset($log_post_clients_list[$index]);
+                        unset($log_pre_clients_list[$index]);
+
+                        $matched_Count++;
+
+
                         $postDB->table('clients')->where('id', $post_client['id'])->update(['pre_client_id' => $pre_client['id']]);
 
                         $preDB->table('clients')->where('id', $pre_client['id'])->update(['post_client_id' => $post_client['id']]);
@@ -426,7 +443,32 @@ class TestingController extends BaseController
                     }
                 }
             }
+
+            
+            log_message('error', 'Expected Match Count : ' . $expected_match_count);
+            log_message('error', 'Total Matched Count: ' . $matched_Count);
+            log_message('error', 'Total UnMatched Count: ' . $expected_match_count - $matched_Count);
+            
+           
+            log_message('error','unmatched_reocrds');
+
+            $log_post_clients_list = array_values($log_post_clients_list);
+            $log_pre_clients_list  = array_values($log_pre_clients_list);
+
+            if( (count($log_pre_clients_list) < count($log_post_clients_list))){
+                log_message('error',"unmatched records count from pre- ". count($log_pre_clients_list));
+                log_message('error',print_r($log_pre_clients_list,true));
+            } else {
+                log_message('error',"unmatched records count from post - ".count($log_post_clients_list));
+                log_message('error',print_r($log_post_clients_list,true));
+            }
+
+
         } 
+
+        return $this->response->setJSON(['status' => 'success', 'message' => 'Client and Branch mapping completed.'])->setStatusCode(200);
+
+
     }
 
 
@@ -673,4 +715,97 @@ class TestingController extends BaseController
         ];
     }
 
+
+    public function logo_renaming(){
+        
+            $directory = ROOTPATH . 'public/uploads/logo/'; 
+
+            if (!is_dir($directory)) {
+                die("Directory not found: $directory");
+            }
+
+            $files = scandir($directory);
+
+            $client_logo_files = $this->get_client_logo_files();
+
+            $rename_files = "";
+            $failed_rename_files = "";
+
+            foreach ($files as $file) {
+                // Skip system entries
+                if ($file === '.' || $file === '..' ) {
+                    continue;
+                }
+                
+
+                $oldPath = $directory . $file;
+
+                if (is_file($oldPath) && in_array(trim($file) , $client_logo_files)) {
+
+                    // Remove all spaces from filename
+                    $newFileName = preg_replace('/\s+|\x{00A0}|\x{200B}|\x{200C}|\x{200D}|\x{FEFF}/u', '', $file);
+
+                    $newPath = $directory . $newFileName;
+
+                    // Only rename if the name changed
+                    if ($oldPath !== $newPath) {
+                        if (rename($oldPath, $newPath)) {
+                            $rename_files .= "\n Renamed: $file → $newFileName \n";
+                        } else {
+                            $failed_rename_files .= "\n Failed file: $file \n";
+                        }
+                    }
+                }
+            }
+
+            $dbUpdated = $this->update_client_logo_files();
+
+           log_message('error', 'Renamed Files: ' . $rename_files);
+           log_message('error', 'Failed Renames: ' . $failed_rename_files); 
+           log_message('error', 'Database Update Status: ' . ($dbUpdated ? 'Success' : 'No changes made'));
+
+           return $this->response->setJSON(['status' => 'success', 
+            'message' => 'Logo renaming completed. kindly check backend logs for details',
+            'data' => [
+                'renamed_files' => $rename_files,
+                'failed_renames' => $failed_rename_files
+            ]
+           ])->setStatusCode(200);
+    }
+
+    public function get_client_logo_files(){
+
+        $db = \Config\Database::connect();
+
+        $sql = "SELECT client_logo FROM clients WHERE client_logo IS NOT NULL AND TRIM(client_logo) <> '' ";
+
+        $query = $db->query($sql);
+
+        $results = $query->getResultArray() ?? [];
+
+        $files = array_map(function($item) {
+            return trim($item['client_logo']);
+        }, $results);
+
+        return $files;
+    }
+
+        public function update_client_logo_files(){
+
+        $db = \Config\Database::connect();
+
+        $sql = "UPDATE clients 
+                SET client_logo = REPLACE(REPLACE(REPLACE(client_logo, CHAR(160), ''), ' ', ''), '\t', '')
+                WHERE client_logo IS NOT NULL 
+                AND TRIM(client_logo) <> ''
+                ";
+
+        $query = $db->query($sql);
+
+        return $db->affectedRows() > 0;
+
+
+    }
+
+
 }
diff --git a/app/Helpers/DepositHelper.php b/app/Helpers/DepositHelper.php
index 9549f8a1..495797f3 100755
--- a/app/Helpers/DepositHelper.php
+++ b/app/Helpers/DepositHelper.php
@@ -66,7 +66,8 @@ class DepositHelper
             'updated_by' => $data['updated_by'],
             'balance' => $newBalance, // Include the new balance in the data array
             'cd_ac_pk'=> isset($data['cd_ac_pk'])?$data['cd_ac_pk']:null,
-            'record_date' => $data['record_date'] ?? null
+            'record_date' => $data['record_date'] ?? null,
+            'policy_transaction_id' => $data['pt_id'] ?? null
         ];
 
         // Insert data and get the insert ID
diff --git a/app/Helpers/utility_helper.php b/app/Helpers/utility_helper.php
index c03ffcc9..86229e9d 100755
--- a/app/Helpers/utility_helper.php
+++ b/app/Helpers/utility_helper.php
@@ -57,6 +57,7 @@ if (!function_exists('file_Upload')) {
         if ($fileToUpload !== null && $fileToUpload->isValid() && !$fileToUpload->hasMoved()) {
             $fileToUpload->move($filepath);
             $fileName = $fileToUpload->getName();
+            $fileName = preg_replace('/[\s\x{00A0}\x{200B}-\x{200D}\x{FEFF}]/u', '', $fileName);
             return $fileName;
         } else {
             return "";
@@ -858,3 +859,10 @@ if (!function_exists('expected_amount_calc')) {
         return round($expectedAmount, 2); // Optional: round to 2 decimal places
     }
 }
+
+if (!function_exists('getFileIfExists')) {
+    function getFileIfExists($path)
+    {   
+        return file_exists(FCPATH . $path) ? base_url($path) : '';
+    }
+}
diff --git a/app/Models/ClientDepositModel.php b/app/Models/ClientDepositModel.php
index 9d45f38f..8a61b204 100755
--- a/app/Models/ClientDepositModel.php
+++ b/app/Models/ClientDepositModel.php
@@ -28,7 +28,8 @@ class ClientDepositModel extends Model
         "event_name",
         "unit",
         "cd_ac_pk",
-        "record_date"
+        "record_date",
+        "policy_transaction_id",
     ];
 
    
diff --git a/app/Models/ClientPolicyModel.php b/app/Models/ClientPolicyModel.php
index 132080de..152cad7f 100755
--- a/app/Models/ClientPolicyModel.php
+++ b/app/Models/ClientPolicyModel.php
@@ -55,6 +55,7 @@ class ClientPolicyModel extends Model
         "cd_ac_pk",
         "is_lgbtq",
         "placement_json",
+        "policy_entry_from",
     ];
 
     // Callbacks
diff --git a/app/Models/EmployeePolicyModel.php b/app/Models/EmployeePolicyModel.php
index 348d309d..394de340 100755
--- a/app/Models/EmployeePolicyModel.php
+++ b/app/Models/EmployeePolicyModel.php
@@ -1471,7 +1471,7 @@ class EmployeePolicyModel extends Model
 
                     ep.tpa_id, 
                     ep.uhid,
-                    ep.policy_end_date,
+                    cp.policy_end_date,
                     ep.basic_cover_si,
 
                     clients.client_name, 
@@ -1492,6 +1492,7 @@ class EmployeePolicyModel extends Model
                     tpa.tpa_logo AS tpa_logo, 
                     tpa.front_card, 
                     tpa.back_card, 
+                    tpa.network_hospitals, 
                     tpa.short_name AS tpa_short_name'
                 )
 
@@ -1531,12 +1532,19 @@ class EmployeePolicyModel extends Model
                     e.doj, 
                     e.band,
                     TIMESTAMPDIFF(YEAR, e.dob, CURDATE()) AS emp_age,
-                    (SELECT name FROM employees WHERE relationship = "Self" and emp_code = ' . $this->db->escape($emp_code) . ' and client_id = '.$client_id.' LIMIT 1) AS self,
-
+                    (
+                        SELECT name FROM employees 
+                        WHERE relationship = "Self" 
+                        and emp_code = ' . $this->db->escape($emp_code) . ' 
+                        and client_id = '.$client_id.'
+                        and is_active = 1
+                        and emp_status = "active"
+                        LIMIT 1
+                    ) AS self,
 
                     ep.tpa_id, 
                     ep.uhid,
-                    ep.policy_end_date,
+                    cp.policy_end_date,
                     ep.basic_cover_si,
 
                     clients.client_name, 
@@ -1557,6 +1565,7 @@ class EmployeePolicyModel extends Model
                     tpa.tpa_logo AS tpa_logo, 
                     tpa.front_card, 
                     tpa.back_card, 
+                    tpa.network_hospitals, 
                     tpa.short_name AS tpa_short_name'
                 )
 
diff --git a/app/Models/PolicyTransactionModel.php b/app/Models/PolicyTransactionModel.php
index 6ea94e65..a9629d73 100644
--- a/app/Models/PolicyTransactionModel.php
+++ b/app/Models/PolicyTransactionModel.php
@@ -305,7 +305,7 @@ class PolicyTransactionModel extends Model
 
         if ($client_id == 0 && $insurer_id == 0 && $policy_type_id == 0 && $date_type == 0 && $issuer == 0) {
 
-            $fromDate = date('Y-m-d', strtotime('-30 days'));
+            $fromDate = date('Y-m-d', strtotime('-90 days'));
             $toDate = date('Y-m-d 23:59:59');
 
             $builder->where('policy_transaction.created_at >=', $fromDate)
@@ -881,7 +881,7 @@ class PolicyTransactionModel extends Model
 
         if ($client_id == 0 && $insurer_id == 0 && $policy_type_id == 0 && $date_type == 0 && $issuer == 0) {
 
-            $fromDate = date('Y-m-d', strtotime('-60 days'));
+            $fromDate = date('Y-m-d', strtotime('-90 days'));
             $toDate = date('Y-m-d 23:59:59');
 
             if (empty($where)) {
@@ -1060,7 +1060,7 @@ class PolicyTransactionModel extends Model
 
         // Default to Last 30 Days if No Filters Are Applied
         if (empty($client_id) && empty($insurer_id) && empty($policy_type_id) && empty($date_type) && empty($issuer) && empty($where)) {
-            $fromDate = date('Y-m-d', strtotime('-60 days'));
+            $fromDate = date('Y-m-d', strtotime('-90 days'));
             $toDate = date('Y-m-d 23:59:59');
 
             $builder->where('policy_transaction.created_at >=', $fromDate)
@@ -1108,7 +1108,7 @@ class PolicyTransactionModel extends Model
             ->join('client_branch', 'policy_transaction.client_branch_id = client_branch.id', 'left')
             ->join('insurers', 'pt_co_share_details.insurer_id = insurers.id', 'left')
             ->join('client_policy', 'policy_transaction.client_policy_id = client_policy.id', 'left')
-            ->join('policy_type', 'client_policy.policy_type_id = policy_type.id', 'left')
+            ->join('policy_type', 'policy_transaction.policy_type_id = policy_type.id', 'left')
             ->where('policy_transaction.is_active', 1)
             ->where('policy_transaction.action_type !=', 'inception');
 
@@ -1163,7 +1163,7 @@ class PolicyTransactionModel extends Model
 
         if ($client_id == 0 && $insurer_id == 0 && $policy_type_id == 0 && $date_type == 0 && $issuer == 0) {
 
-            $fromDate = date('Y-m-d', strtotime('-60 days'));
+            $fromDate = date('Y-m-d', strtotime('-90 days'));
             $toDate = date('Y-m-d 23:59:59');
 
             $builder->where('policy_transaction.created_at >=', $fromDate)
@@ -1313,7 +1313,7 @@ class PolicyTransactionModel extends Model
                 ->where('policy_transaction.' . $date_type . '<=', $endDate);
         } else {
 
-            $fromDate = date('Y-m-d', strtotime('-30 days'));
+            $fromDate = date('Y-m-d', strtotime('-90 days'));
             $toDate = date('Y-m-d 23:59:59');
 
             $builder->where('policy_transaction.created_at >=', $fromDate)
@@ -1416,7 +1416,7 @@ class PolicyTransactionModel extends Model
                 ->where('policy_transaction.' . $date_type . '<=', $endDate);
         } else {
 
-            $fromDate = date('Y-m-d', strtotime('-30 days'));
+            $fromDate = date('Y-m-d', strtotime('-90 days'));
             $toDate = date('Y-m-d 23:59:59');
 
             $builder->where('policy_transaction.created_at >=', $fromDate)
@@ -1457,7 +1457,7 @@ class PolicyTransactionModel extends Model
 
     public function getFinanceReportList($start_date = 0, $end_date = 0, $client_id = 0, $insurer_id = 0, $policy_type_id = 0, $date_type = 0, $issuer = 0, $status = 0)
     {
-        $dateThreshold = date('Y-m-d H:i:s', strtotime("- 3 days"));
+        $dateThreshold = date('Y-m-d H:i:s', strtotime("-90 days"));
 
         $builder = $this->db->table('policy_transaction')
             ->select("
@@ -1519,7 +1519,7 @@ class PolicyTransactionModel extends Model
                 ->where('policy_transaction.' . $date_type . '<=', $endDate);
         } else {
 
-            $fromDate = date('Y-m-d', strtotime('-30 days'));
+            $fromDate = date('Y-m-d', strtotime('-90 days'));
             $toDate = date('Y-m-d 23:59:59');
 
             $builder->where('policy_transaction.created_at >=', $fromDate)
@@ -1624,7 +1624,7 @@ class PolicyTransactionModel extends Model
             $builder->where('policy_transaction.' . $date_type . '>=', $startDate)
                 ->where('policy_transaction.' . $date_type . '<=', $endDate);
         } else {
-            $fromDate = date('Y-m-d', strtotime('-30 days'));
+            $fromDate = date('Y-m-d', strtotime('-90 days'));
             $toDate = date('Y-m-d 23:59:59');
 
             $builder->where('policy_transaction.created_at >=', $fromDate)
@@ -1712,7 +1712,7 @@ class PolicyTransactionModel extends Model
     //function for fetch renewal report data
     public function getRenewalReportData($start_date = null, $end_date = null, $client_type = null, $client = null, $issuer = null)
     {
-        $fromDate = date('Y-m-d', strtotime('-60 days'));
+        $fromDate = date('Y-m-d', strtotime('-90 days'));
         $toDate = date('Y-m-d 23:59:59');
 
         if (!empty($start_date) && !empty($end_date)) {
@@ -1806,4 +1806,307 @@ class PolicyTransactionModel extends Model
 
         return $result[0];
     }
+
+    public function reportBDSNew(
+        $start_date = 0,
+        $end_date = 0,
+        $client_id = 0,
+        $insurer_id = 0,
+        $policy_type_id = 0,
+        $date_type = 0,
+        $issuer = 0,
+        $client_branch_id = 0,
+        $insurer_branch_id = 0,
+        $client_policy_id = 0,
+        $user_id = 0,
+        $where = []
+    ) {
+        
+        $date_condition = '';
+
+        // ==============================
+        // DATE FILTER FOR STATEMENT MONTH
+        // ==============================
+        if ($date_type == 'statement_month' && $start_date != 0 && $end_date != 0) {
+            $date_condition = "
+                AND insurer_statements.month >= '{$start_date}'
+                AND insurer_statements.month <= '{$end_date}'
+            ";
+        }
+
+        // ==============================
+        // BASE QUERY
+        // ==============================
+        $builder = $this->db->table('policy_transaction')
+            ->select("
+                policy_transaction.*,
+                DATE_FORMAT(policy_transaction.policy_issue_date, '%d %b %Y') AS policy_issue_date,
+                DATE_FORMAT(
+                    IF(policy_transaction.month IS NULL, 
+                        policy_transaction.policy_issue_date, 
+                        policy_transaction.month
+                    ), '%b %Y'
+                ) AS policy_issue_month,
+
+                CASE
+                    WHEN clients.client_type = 1 THEN 'Group'
+                    WHEN clients.client_type = 2 THEN 'Retail'
+                    ELSE '-'
+                END AS client_type,
+
+                CASE
+                    WHEN policy_transaction.revenue_type = 'NA' THEN 'Fresh'
+                    ELSE 'Renewal'
+                END AS revenue_type,
+
+                CASE
+                    WHEN policy_transaction.action_type = 'inception' THEN 'Policy'
+                    ELSE 'Endorsement'
+                END AS action_type,
+
+                clients.client_name AS client_name,
+                clients.short_name AS client_short_name,
+                client_branch.branch_name AS client_branch_name,
+                client_branch.address1 AS client_address,
+                policy_type.policy_type,
+                policy_type.bap,
+                insurers.name AS insurer_name,
+                insurers.short_name AS insurer_short_name,
+                insurer_branch.branch_name AS insurer_branch_name,
+                insurer_branch.branch_code AS insurer_branch_code,
+                user_profiles.first_name AS user_name,
+                vehicle.vehicle_no,
+                tpa.name AS tpa_name,
+                pt_co_share_details.remark AS remarks,
+                pt_co_share_details.cop_amt AS bp_amt,
+                pt_co_share_details.exp_amt,
+                pt_co_share_details.id AS pt_id,
+                sales_user.first_name AS salse_person_name,
+                service_user.first_name AS service_person_name,
+
+                ROUND(pt_co_share_details.cop_amt + pt_co_share_details.cotp_amt + pt_co_share_details.cotep_amt, 2) AS premium_wo_gst,
+                ROUND((ROUND(pt_co_share_details.cop_amt + pt_co_share_details.cotp_amt + pt_co_share_details.cotep_amt, 2) * 18 / 100), 2) AS gst_amount,
+                ROUND(
+                    ROUND(pt_co_share_details.cop_amt + pt_co_share_details.cotp_amt + pt_co_share_details.cotep_amt, 2) + 
+                    ROUND((ROUND(pt_co_share_details.cop_amt + pt_co_share_details.cotp_amt + pt_co_share_details.cotep_amt, 2) * 18 / 100), 2),
+                2) AS total_premium,
+
+                ROUND(pt_co_share_details.cotp_amt + pt_co_share_details.cotep_amt, 2) AS tp_or_ter,
+                DATEDIFF(policy_transaction.policy_end_date, CURDATE()) AS days,
+                (pt_co_share_details.agreed_tp_per + pt_co_share_details.agreed_tep_per) AS agreed_tp_or_ter_per,
+                pt_co_share_details.agreed_bp_per,
+
+                -- ==============================
+                -- SUBQUERY: Total IRDA Amount
+                -- ==============================
+                ROUND((
+                    SELECT (
+                        SUM(co_share_stmt_details.actual_bp_brokerage_amt) + 
+                        SUM(co_share_stmt_details.actual_tp_brokerage_amt) + 
+                        SUM(co_share_stmt_details.actual_tep_brokerage_amt) +
+                        SUM(co_share_stmt_details.reward)
+                    )
+                    FROM co_share_stmt_details
+                    JOIN insurer_statements ON co_share_stmt_details.statement_id = insurer_statements.id
+                    WHERE co_share_stmt_details.co_share_id = pt_co_share_details.id
+                    AND co_share_stmt_details.is_active = 1
+                    AND insurer_statements.is_active = 1
+                    {$date_condition}
+                ), 2) AS total_irda_amt,
+
+                -- Reward Only
+                ROUND((
+                    SELECT SUM(co_share_stmt_details.reward)
+                    FROM co_share_stmt_details
+                    JOIN insurer_statements ON co_share_stmt_details.statement_id = insurer_statements.id
+                    WHERE co_share_stmt_details.co_share_id = pt_co_share_details.id
+                    AND co_share_stmt_details.is_active = 1
+                    AND insurer_statements.is_active = 1
+                    {$date_condition}
+                ), 2) AS reward,
+
+                -- Billed Amount
+                ROUND((
+                    SELECT SUM(
+                        COALESCE(co_share_stmt_details.actual_bp_brokerage_amt, 0) +
+                        COALESCE(co_share_stmt_details.actual_tp_brokerage_amt, 0) +
+                        COALESCE(co_share_stmt_details.actual_tep_brokerage_amt, 0) +
+                        COALESCE(co_share_stmt_details.reward, 0)
+                    )
+                    FROM co_share_stmt_details
+                    JOIN pt_co_share_details AS pt_table ON co_share_stmt_details.co_share_id = pt_table.id
+                    JOIN insurer_statements ON co_share_stmt_details.statement_id = insurer_statements.id
+                    WHERE co_share_stmt_details.co_share_id = pt_co_share_details.id
+                    AND co_share_stmt_details.is_active = 1
+                    AND pt_table.is_active = 1
+                    AND insurer_statements.is_active = 1
+                    AND insurer_statements.invoice_status IS NOT NULL
+                    {$date_condition}
+                ), 2) AS billed_amt,
+
+                -- Unbilled Amount
+                ROUND(
+                (
+                    (
+                        SELECT 
+                            SUM(
+                                COALESCE(co_share_stmt_details.actual_bp_brokerage_amt, 0) +
+                                COALESCE(co_share_stmt_details.actual_tp_brokerage_amt, 0) +
+                                COALESCE(co_share_stmt_details.actual_tep_brokerage_amt, 0) +
+                                COALESCE(co_share_stmt_details.reward, 0)
+                            )
+                        FROM co_share_stmt_details
+                        JOIN insurer_statements ON co_share_stmt_details.statement_id = insurer_statements.id
+                        WHERE co_share_stmt_details.co_share_id = pt_co_share_details.id
+                        AND co_share_stmt_details.is_active = 1
+                        {$date_condition}
+                    ) 
+                        -
+                    (
+                        SELECT 
+                            SUM(
+                                COALESCE(co_share_stmt_details.actual_bp_brokerage_amt, 0) +
+                                COALESCE(co_share_stmt_details.actual_tp_brokerage_amt, 0) +
+                                COALESCE(co_share_stmt_details.actual_tep_brokerage_amt, 0) +
+                                COALESCE(co_share_stmt_details.reward, 0)
+                            )
+                        FROM co_share_stmt_details
+                        JOIN pt_co_share_details AS pt_table ON co_share_stmt_details.co_share_id = pt_table.id
+                        JOIN insurer_statements ON co_share_stmt_details.statement_id = insurer_statements.id
+                        WHERE co_share_stmt_details.co_share_id = pt_co_share_details.id
+                        AND co_share_stmt_details.is_active = 1
+                        AND pt_table.is_active = 1
+                        AND insurer_statements.is_active = 1
+                        AND insurer_statements.invoice_status IS NULL
+                        {$date_condition}
+                    )
+                ), 2) AS unbilled_amt,
+
+                created_user.first_name AS user_name,
+
+                CASE 
+                    WHEN pt_co_share_details.co_share_type IN (0, 1) THEN policy_transaction.policy_no
+                    WHEN pt_co_share_details.co_share_type > 1 THEN 
+                        CASE 
+                            WHEN pt_co_share_details.follower_policy_no IS NULL OR pt_co_share_details.follower_policy_no = '' 
+                            THEN policy_transaction.policy_no
+                            ELSE pt_co_share_details.follower_policy_no
+                        END
+                    ELSE policy_transaction.policy_no
+                END AS policy_no
+            ")
+
+            // ==============================
+            // JOINS
+            // ==============================
+            ->join('pt_co_share_details', 'policy_transaction.id = pt_co_share_details.pt_id', 'left')
+            ->join('clients', 'clients.id = policy_transaction.client_id')
+            ->join('client_branch', 'policy_transaction.client_branch_id = client_branch.id', 'left')
+            ->join('client_policy', 'policy_transaction.client_policy_id = client_policy.id', 'left')
+            ->join('user_profiles', 'policy_transaction.created_by = user_profiles.id', 'left')
+            ->join('vehicle', 'policy_transaction.vehicle_id = vehicle.id', 'left')
+            ->join('policy_type', 'policy_transaction.policy_type_id = policy_type.id', 'left')
+            ->join('insurers', 'pt_co_share_details.insurer_id = insurers.id', 'left')
+            ->join('insurer_branch', 'pt_co_share_details.insurer_branch_id = insurer_branch.id', 'left')
+            ->join('tpa', 'policy_transaction.tpa_id = tpa.id', 'left')
+            ->join('tpa_branch', 'policy_transaction.tpa_branch_id = tpa_branch.id', 'left')
+            ->join('user_profiles AS sales_user', 'policy_transaction.sales_generated_by = sales_user.id', 'left')
+            ->join('user_profiles AS service_user', 'policy_transaction.serviced_by = service_user.id', 'left')
+            ->join('user_profiles AS created_user', 'policy_transaction.created_by = created_user.id', 'left')
+            ->where('policy_transaction.is_active', 1)
+            ->where('pt_co_share_details.is_active', 1);
+
+        // ==============================
+        // ROLE-BASED FILTERS
+        // ==============================
+        if (
+            (!in_array(get_role_id(), [1, 5])) &&
+            !(
+                in_array(MANAGEMENT_TEAM_ID, user_team()) ||
+                in_array(FINANCE_TEAM_ID, user_team()) ||
+                in_array(BUSINESS_TEAM_ID, user_team())
+            )
+        ) {
+            if (get_role_id() == 4 && in_array(POS_TEAM_ID, user_team())) {
+                $builder->where('policy_transaction.created_by', get_session_userid());
+            }
+        }
+
+        // ==============================
+        // ADDITIONAL FILTERS
+        // ==============================
+        if (!empty($where)) {
+            log_message('info', 'Where condition: ' . json_encode($where));
+            $builder->where($where);
+        }
+
+        if ($start_date != 0 && $end_date != 0 && $date_type != 0 && $date_type != 'statement_month') {
+            $startDate = date('Y-m-d 00:00:00', strtotime($start_date));
+            $endDate   = date('Y-m-d 23:59:59', strtotime($end_date));
+
+            $builder->where("policy_transaction.{$date_type} >=", $startDate)
+                    ->where("policy_transaction.{$date_type} <=", $endDate);
+        }
+
+        // JOIN FOR STATEMENT MONTH FILTER
+        if ($date_type == 'statement_month' && $start_date != 0 && $end_date != 0) {
+            $startDate = date('Y-m-d', strtotime($start_date));
+            $endDate   = date('Y-m-d', strtotime($end_date));
+
+            $builder->join('co_share_stmt_details', 'pt_co_share_details.id = co_share_stmt_details.co_share_id', 'left')
+                    ->join('insurer_statements', 'co_share_stmt_details.statement_id = insurer_statements.id', 'left')
+                    ->where('insurer_statements.is_active', 1)
+                    ->where('insurer_statements.month >=', $startDate)
+                    ->where('insurer_statements.month <=', $endDate)
+                    ->groupBy('co_share_stmt_details.co_share_id');
+        }
+
+        // ==============================
+        // FILTER BY IDs
+        // ==============================
+        if ($client_id != 0) $builder->where('policy_transaction.client_id', $client_id);
+        if ($insurer_id != 0) $builder->where('policy_transaction.insurer_id', $insurer_id);
+        if ($client_branch_id != 0) $builder->where('policy_transaction.client_branch_id', $client_branch_id);
+        if ($insurer_branch_id != 0) $builder->where('policy_transaction.insurer_branch_id', $insurer_branch_id);
+        if ($client_policy_id != 0) $builder->where('policy_transaction.client_policy_id', $client_policy_id);
+        if ($user_id != 0) $builder->where('policy_transaction.created_by', $user_id);
+        if ($policy_type_id != 0) $builder->where('client_policy.policy_type_id', $policy_type_id);
+        if ($issuer != 0) $builder->where('policy_transaction.issuer', $issuer);
+
+        // ==============================
+        // DEFAULT 90-DAY FILTER
+        // ==============================
+        if (
+            $client_id == 0 && 
+            $insurer_id == 0 && 
+            $policy_type_id == 0 && 
+            $date_type == 0 && 
+            $issuer == 0
+        ) {
+            $fromDate = date('Y-m-d', strtotime('-90 days'));
+            $toDate   = date('Y-m-d 23:59:59');
+
+            if (empty($where)) {
+                $builder->where('policy_transaction.created_at >=', $fromDate)
+                        ->where('policy_transaction.created_at <=', $toDate);
+            }
+        }
+
+        // ==============================
+        // ORDER & EXECUTION
+        // ==============================
+        $builder->orderBy('policy_transaction.id', 'desc');
+
+        $result = $builder->get()->getResultArray();
+
+        // Uncomment if you need to debug SQL
+        // dd($this->db->getLastQuery());
+
+        return $result;
+    }
+
+
+ 
+
+
 }
diff --git a/app/Models/RTOModel.php b/app/Models/RTOModel.php
new file mode 100644
index 00000000..6f5abcab
--- /dev/null
+++ b/app/Models/RTOModel.php
@@ -0,0 +1,57 @@
+
 
-