From 387d0d1c3efe8d0c27b46febcbdead98f3e118c2 Mon Sep 17 00:00:00 2001 From: Srinivas-Saravanan Date: Fri, 9 May 2025 09:24:21 +0530 Subject: [PATCH 01/12] FIX_PROPOSAL_CHANGE --- app/Views/policyRegisterModel.php | 23 ++++--- app/Views/view_rfq_non_eb.php | 104 +++++++++++++----------------- 2 files changed, 60 insertions(+), 67 deletions(-) diff --git a/app/Views/policyRegisterModel.php b/app/Views/policyRegisterModel.php index f9b1ee91..c5f41032 100644 --- a/app/Views/policyRegisterModel.php +++ b/app/Views/policyRegisterModel.php @@ -655,12 +655,18 @@ }else{ // alert("you got ir"); - policyRiskAddress.forEach(function() { - // console.log("increment count is ", increment2) - addHTMLInputForRiskSplitUP(); - validatePolicyBasedOnProductSelection(); - hideAndShowBurglary(); - }) + console.log("increment2",increment2); + console.log("policyRiskAddress.length",policyRiskAddress.length); + if (increment2 <= policyRiskAddress.length) { + policyRiskAddress.forEach(function() { + // console.log("increment count is ", increment2) + addHTMLInputForRiskSplitUP(); + validatePolicyBasedOnProductSelection(); + hideAndShowBurglary(); + }) + }else { + alert("fdg"); + } } } else { if (contianertoCheck.innerHTML == "") { @@ -714,7 +720,8 @@ const newRowRisk = document.createElement("div"); // // console.log("Risk Split Up for address : ", policyRiskAddress.length) // policyRiskAddress - + console.log(increment2); + console.log(policyRiskAddress[increment2-1]) newRowRisk.innerHTML += `
Fire Details
Risk Split Up for Address : ${policyRiskAddress[increment2-1].address1} ${policyRiskAddress[increment2-1].address2}
@@ -1043,7 +1050,7 @@ $('[class*="single_location"]').show(); $("#locationNoDIV").hide(); $("#location_no").removeAttr("required", false); - $('[class*="duplicate-btn"]').hide(); + // $('[class*="duplicate-btn"]').hide(); $("[id^='select_location']").hide(); $('[id^="select_location"]').hide().prev('label').hide(); $("[id^='select_location']").removeAttr('required', false); diff --git a/app/Views/view_rfq_non_eb.php b/app/Views/view_rfq_non_eb.php index e0abbc8c..508961e8 100644 --- a/app/Views/view_rfq_non_eb.php +++ b/app/Views/view_rfq_non_eb.php @@ -1056,6 +1056,7 @@ newQuoteHeader.textContent = "Liability Limit"; } newQuoteHeader.style.backgroundColor = randomColor; + newQuoteHeader.setAttribute('data-proposal', proposalCount); headerRow2.insertBefore(newQuoteHeader, headerRow2.querySelector('th:last-child')); // Add new cells to all rows @@ -1108,6 +1109,8 @@ hideProposalOptionsForChild(); showOrHideFieldsBasedOnRFQorQCR(); // styleTableColumns(); + + monitorTableChanges(); }); // ################################################################################# @@ -4968,71 +4971,54 @@ } function monitorTableChanges() { - console.log("monitoring table changes"); - var proposalValue = ""; - // Get the first table - const table = document.querySelector("table"); - if (!table) return; + console.log("monitoring table changes"); + const table = document.querySelector("table"); + if (!table) return; - // Get the first row in the tbody - const firstRow = table.querySelector("tbody tr"); - if (!firstRow) return; + const firstRow = table.querySelector("tbody tr"); + if (!firstRow) return; - // console.log("firstRow : ",firstRow); + const cells = firstRow.querySelectorAll("td"); + const headerRow1 = table.querySelector("thead tr:nth-child(1)"); + const headerRow2 = table.querySelector("thead tr:nth-child(2)"); + if (!headerRow1 || !headerRow2) return; - // Get all cells in the first row - const cells = firstRow.querySelectorAll("td"); - - // Get header rows to identify which columns are "Sum Insured" - const headerRow1 = table.querySelector("thead tr:nth-child(1)"); - const headerRow2 = table.querySelector("thead tr:nth-child(2)"); - - if (!headerRow1 || !headerRow2) return; + const mainHeaders = headerRow1.querySelectorAll("th"); + const subHeaders = headerRow2.querySelectorAll("th"); - // console.log("headerRow1 : ",headerRow1); - // console.log("headerRow2 : ",headerRow2); - // Find which column is the "Sum Insured" column - let sumInsuredColumnIndex = -1; - const subHeaders = headerRow2.querySelectorAll("th"); - - subHeaders.forEach((th, index) => { - if (th.textContent.trim() === "Sum Insured") { - proposalValue = th.getAttribute("data-proposal"); - sumInsuredColumnIndex = index; + subHeaders.forEach((subHeader, index) => { + const subHeaderText = subHeader.textContent.trim(); + const mainHeaderText = mainHeaders[index]?.textContent.trim(); + + // Check if subheader is "Sum Insured" and main header starts with "Proposal" or "Exis" + if (subHeaderText === "Sum Insured" && /^(Proposal|Exis)/i.test(mainHeaderText)) { + const proposalValue = subHeader.getAttribute("data-proposal"); + + if (index < cells.length) { + const cell = cells[index]; + let previousValue = ""; + + cell.addEventListener("focus", function () { + previousValue = this.textContent.trim(); + }); + + cell.addEventListener("blur", function () { + const newValue = this.textContent.trim(); + if (newValue !== previousValue) { + tdChanged = true; + changedNewSI = newValue; + $("#policySI").val(newValue); + console.log("new Value proposalValue", changedNewSI); + console.log("proposalValue",proposalValue); + updateAddON(newValue, proposalValue); + console.log("Sum Insured value changed to:", newValue); + } + }); } - }); - - // console.log("sumInsuredColumnIndex : ",sumInsuredColumnIndex); - - if (sumInsuredColumnIndex === -1) return; - - // Check if we have a cell at that index - if (cells.length > sumInsuredColumnIndex) { - console.log("It is there"); - const sumInsuredCell = cells[sumInsuredColumnIndex]; - - let previousValue = ""; - // Add event listener for changes - sumInsuredCell.addEventListener("focus", function () { - previousValue = this.textContent.trim(); - }); - - sumInsuredCell.addEventListener("blur", function () { - const newValue = this.textContent.trim(); - if (newValue !== previousValue) { - tdChanged = true; - changedNewSI = newValue; - $("#policySI").val(newValue); - console.log("new Value",changedNewSI); - // alert(newValue); - updateAddON(newValue,proposalValue); - console.log("Sum Insured value changed to:", newValue); - } - }); - }else{ - console.log("Sum Insured column not found"); } - } + }); +} + function updateAddON(newValue,proposalValue = null) { console.log("Function called"); From 9fd830f21d5424f5463a783a0076f939cc27872a Mon Sep 17 00:00:00 2001 From: Srinivas-Saravanan Date: Fri, 9 May 2025 10:49:14 +0530 Subject: [PATCH 02/12] FIX_VALIDATION_FOR_RISK_SPLITUP --- app/Views/policyRegisterModel.php | 57 +++++++++++++++++++------------ 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/app/Views/policyRegisterModel.php b/app/Views/policyRegisterModel.php index c5f41032..1e12dbbe 100644 --- a/app/Views/policyRegisterModel.php +++ b/app/Views/policyRegisterModel.php @@ -425,10 +425,10 @@ } // console.log("form from : ", formDataSplitUp); - if (productSelectionData.multipleProduct == 'on') { - let selectionType = productSelectionData.multilocation_type; + // if (productSelectionData.multipleProduct == 'on') { + // let selectionType = productSelectionData.multilocation_type; - if (selectionType == 'multiFloater') { + // if (selectionType == 'multiFloater') { let InProcess = [...document.querySelectorAll('[id^="stockInProcess_"]')].map(el => Number(el.value) || 0); let rawMaterial = [...document.querySelectorAll('[id^="rawMaterial_"]')].map(el => Number(el.value) || 0); let findMaterial = [...document.querySelectorAll('[id^="finishedStock_"]')].map(el => Number(el.value) || 0); @@ -456,16 +456,16 @@ return false; } // console.log("Total SI: ", totalSI); - } else { - let InProcess = [...document.querySelectorAll('[id^="stockInProcess_"]')].map(el => Number(el.value) || 0); - let rawMaterial = [...document.querySelectorAll('[id^="rawMaterial_"]')].map(el => Number(el.value) || 0); - let findMaterial = [...document.querySelectorAll('[id^="finishedStock_"]')].map(el => Number(el.value) || 0); + // } else { + // let InProcess = [...document.querySelectorAll('[id^="stockInProcess_"]')].map(el => Number(el.value) || 0); + // let rawMaterial = [...document.querySelectorAll('[id^="rawMaterial_"]')].map(el => Number(el.value) || 0); + // let findMaterial = [...document.querySelectorAll('[id^="finishedStock_"]')].map(el => Number(el.value) || 0); - totalSI = InProcess.reduce((acc, val) => acc + val, 0) + - rawMaterial.reduce((acc, val) => acc + val, 0) + - findMaterial.reduce((acc, val) => acc + val, 0); - } - } + // totalSI = InProcess.reduce((acc, val) => acc + val, 0) + + // rawMaterial.reduce((acc, val) => acc + val, 0) + + // findMaterial.reduce((acc, val) => acc + val, 0); + // } + // } // console.log("Form is trying to submit : ", formDataSplitUp); @@ -657,17 +657,32 @@ // alert("you got ir"); console.log("increment2",increment2); console.log("policyRiskAddress.length",policyRiskAddress.length); - if (increment2 <= policyRiskAddress.length) { + policyRiskAddress.forEach(function() { - // console.log("increment count is ", increment2) - addHTMLInputForRiskSplitUP(); - validatePolicyBasedOnProductSelection(); - hideAndShowBurglary(); + if (increment2 <= policyRiskAddress.length) { + // console.log("increment count is ", increment2) + addHTMLInputForRiskSplitUP(); + validatePolicyBasedOnProductSelection(); + hideAndShowBurglary(); + } + }) - }else { - alert("fdg"); - } - } + // else { + // const container = document.getElementById("addRiskSplitUp"); + // container.innerHTML = ""; + // increment2 = 1; + // if (increment2 <= policyRiskAddress.length) { + // policyRiskAddress.forEach(function() { + // // console.log("increment count is ", increment2) + // addHTMLInputForRiskSplitUP(); + // validatePolicyBasedOnProductSelection(); + // hideAndShowBurglary(); + // // increment2++; + // }) + // // alert("fdg"); + // } + // } + } } else { if (contianertoCheck.innerHTML == "") { addHTMLInputForRiskSplitUpWarninig(); From ecf73da0d67f84f361a2730dc4c8d35be8f067f5 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Fri, 9 May 2025 14:23:05 +0530 Subject: [PATCH 03/12] FIX_PLACEMENT_INSTALLMENT_DATA : RV --- app/Views/view_rfq.php | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/Views/view_rfq.php b/app/Views/view_rfq.php index 1396be13..7ddfa80a 100644 --- a/app/Views/view_rfq.php +++ b/app/Views/view_rfq.php @@ -525,14 +525,12 @@ > - +
+ + +
-
- - "> -
- - From 0e4e24fd7af1b11184e2992185729ee319816044 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Fri, 9 May 2025 17:15:53 +0530 Subject: [PATCH 04/12] CHANGE_CLAIMS_CR_AND_LIVE_SUPPORT : RV --- app/Config/Routes.php | 1 + app/Controllers/ClientController.php | 5 ++ .../PolicyTransactionController.php | 6 +-- app/Controllers/TicketController.php | 23 +++++++-- app/Views/insurer_statement_list.php | 2 +- app/Views/ticket_form_gmc.php | 15 +++++- app/Views/ticket_form_gpa.php | 6 +++ app/Views/ticket_list.php | 50 ++++++++++++++++++- 8 files changed, 99 insertions(+), 9 deletions(-) diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 9c1b388e..1527b8cc 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -545,6 +545,7 @@ $routes->group("/bdsReport", ["filter" => "authMVC"], function ($routes) { $routes->group("/ticket", ["filter" => "authMVC"], function ($routes) { $routes->match( ['get', 'post'], 'list','TicketController::ticketList'); $routes->get('feedback-list','TicketController::feedbackList'); + $routes->get('remove','TicketController::removeTicket'); $routes->get('new/(:any)','TicketController::ticket_form/$1'); $routes->post('create','TicketController::createTicket'); $routes->post('update','TicketController::updateTicket'); diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index 39440f05..a490bddc 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -44,6 +44,7 @@ use App\Models\ClientApiModel; use App\Controllers\EmpDataServiceController; use App\Controllers\GoogleDriveController; +use App\Controllers\PolicyTransactionController; use App\Helpers\sendMailNotification; use App\Models\PTCOShareDetailsModel; @@ -4608,6 +4609,10 @@ class ClientController extends AdminController // $res = $empServiceController->excelFileDataValidation(['file_id' => '865']); // $res = $empServiceController->employeesSIEnhanceProcess(['file_id' => '829']); // $res = $empServiceController->employeeDisembark(['file_id' => '858']); + + $policyTransactionController = new PolicyTransactionController(); + // $res = $policyTransactionController->validateInsurerStatement(['file_id' => '17']); + // $res = $policyTransactionController->updateInsurerStatement(['file_id' => '22']); // dd('-----', $res); diff --git a/app/Controllers/PolicyTransactionController.php b/app/Controllers/PolicyTransactionController.php index 310cc939..d0242215 100644 --- a/app/Controllers/PolicyTransactionController.php +++ b/app/Controllers/PolicyTransactionController.php @@ -2380,7 +2380,7 @@ class PolicyTransactionController extends BaseController if (($actual_bp_brokerage && $actual_bp_brokerage != 0 && $actual_bp_brokerage != "")) { $total_amt += $actual_bp_brokerage; //percentage reverse calculation - if ($actual_bp_per == 0 || $actual_bp_per == "") { + if (($actual_bp_per == 0 || $actual_bp_per == 0) && !empty($actual_bp_amt)) { $actual_bp_per = round(($actual_bp_brokerage / $actual_bp_amt) * 100, 2); } } else { @@ -2395,7 +2395,7 @@ class PolicyTransactionController extends BaseController if ($actual_tp_brokerage && $actual_tp_brokerage != 0 && $actual_tp_brokerage != "") { $total_amt += $actual_tp_brokerage; //percentage reverse calculation - if ($actual_tp_per == 0 || $actual_tp_per == "") { + if (($actual_tp_per == 0 || $actual_tp_per == "") && !empty($actual_tp_amt)) { $actual_tp_per = ($actual_tp_brokerage / $actual_tp_amt) * 100; } } else { @@ -2410,7 +2410,7 @@ class PolicyTransactionController extends BaseController if ($actual_tep_brokerage && $actual_tep_brokerage != 0 && $actual_tep_brokerage != "") { $total_amt += $actual_tep_brokerage; //percentage reverse calculation - if ($actual_tep_per == 0 || $actual_tep_per == "") { + if (($actual_tep_per == 0 || $actual_tep_per == "") && !empty($actual_tep_amt)) { $actual_tep_per = ($actual_tep_brokerage / $actual_tep_amt) * 100; } } else { diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php index 37685b55..7cbf5766 100644 --- a/app/Controllers/TicketController.php +++ b/app/Controllers/TicketController.php @@ -954,10 +954,27 @@ class TicketController extends BaseController } public function convertHtmlToText($html) + { + if(!empty($html)){ + $dom = new DOMDocument(); + @$dom->loadHTML($html); + return strip_tags($dom->saveHTML()); + }else{ + return ''; + } + } + + public function removeTicket() { - $dom = new DOMDocument(); - @$dom->loadHTML($html); - return strip_tags($dom->saveHTML()); + $ticket_id = $this->request->getGet('ticket_id'); + if(!empty($ticket_id)){ + $data['is_active'] = 0; + $this->ticketMasterModel->where('id', $ticket_id)->set($data)->update(); + return $this->respond(['status' => true, 'code' => 200, 'message' => 'Claim removed successfully'], 200); + }else{ + return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to remove Claim'], 200); + } + } //---- Email Trigger Part---------------------------------------------------------------------------------------------- diff --git a/app/Views/insurer_statement_list.php b/app/Views/insurer_statement_list.php index be2954d7..fed5f122 100644 --- a/app/Views/insurer_statement_list.php +++ b/app/Views/insurer_statement_list.php @@ -1004,7 +1004,7 @@ maxDate.setDate(today.getDate() + 180); // Request failed, handle error console.error("Request failed:", status, error); toastr.error('Something went wrong! Try later', 'Error'); - $('#uploadForm')[0].reset(); + // $('#uploadForm')[0].reset(); $('.close').click() $('.loader').fadeOut(); $('.loader-mask').delay(10).fadeOut('slow'); diff --git a/app/Views/ticket_form_gmc.php b/app/Views/ticket_form_gmc.php index 8eb8c494..a9779a33 100644 --- a/app/Views/ticket_form_gmc.php +++ b/app/Views/ticket_form_gmc.php @@ -180,7 +180,15 @@

-
Claim Details
+ +
+
+ Claim Details + + +
+
+
@@ -594,6 +602,11 @@ }); } + + $field = $('#approved_description') + $field.prop('required', false); + var $parentDiv = $field.closest("div"); + $parentDiv.find("label[for='approved_description'] .text-danger").remove(); } $('#claim_status_id').on('change', function() { diff --git a/app/Views/ticket_form_gpa.php b/app/Views/ticket_form_gpa.php index 3618d1f1..0ae537f8 100644 --- a/app/Views/ticket_form_gpa.php +++ b/app/Views/ticket_form_gpa.php @@ -432,6 +432,12 @@ } else if (value == 48 || value == 54 || value == 59) { // RETURNED $('.returned').show(); } + + $field = $('#approved_description') + $field.prop('required', false); + var $parentDiv = $field.closest("div"); + $parentDiv.find("label[for='approved_description'] .text-danger").remove(); + } $('#claim_status_id').on('change', function() { diff --git a/app/Views/ticket_list.php b/app/Views/ticket_list.php index 6f49c545..d3408054 100644 --- a/app/Views/ticket_list.php +++ b/app/Views/ticket_list.php @@ -109,12 +109,13 @@ table.dataTable tbody td { TAT + ACTION $row){ ?> - + + + + @@ -294,4 +305,41 @@ function viewTicket(ticket_id){ } +function removeClaim(input, ticket_id) { + + confirmActionSweertAlert("Do you want to delete this Claim?", "Yes, Proceed!", "No, Cancel").then((confirmed) => { + if (confirmed) { + let url = ''; + + // Include `pt_id` in the AJAX request if necessary + let requestData = { ticket_id: ticket_id }; + + sendAjaxRequestForGlobal(url, 'GET', requestData, function(response) { + console.log('Data fetched successfully:', response); + + if (response.status === true) { + toastr.success(response.message, 'SUCCESS'); + window.location.reload(); + } else { + toastr.warning(response.message, 'WARNING'); + } + }, function(xhr, status, error) { + console.error('Error fetching data:', error); + console.error(xhr.responseText); + }); + } + }); + +} + +$(document).on('click', 'tbody tr', function (e) { + // Exclude clicks on any elements inside the last column (actions) + if ($(e.target).closest('td').index() !== $(this).children('td').length - 1) { + const id = $(this).data('id'); + console.log('Ticket ID', id) + viewTicket(id); + } +}); + + \ No newline at end of file From c94550a48df942aac19d265ae00070bb5669da5a Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Mon, 12 May 2025 15:09:23 +0530 Subject: [PATCH 05/12] FIX_FAMILY_FLOATER_KEY_ISSUE : RV --- app/Controllers/EmployeeServiceController.php | 6 ++++-- app/Helpers/excel_util_helper.php | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/Controllers/EmployeeServiceController.php b/app/Controllers/EmployeeServiceController.php index 9917796f..4d130194 100755 --- a/app/Controllers/EmployeeServiceController.php +++ b/app/Controllers/EmployeeServiceController.php @@ -2077,12 +2077,14 @@ public function getFileMetaDataByFileId($file_id, $status = 'success'){ $relation = 'parent'; } else if(strtolower(trim($value['relationship'])) === 'son' || strtolower(trim($value['relationship'])) === 'daughter'){ $relation = 'child'; - }else if(strtolower(trim($value['relationship'])) === 'father in law' || strtolower(trim($value['relationship'])) === 'mother in law'){ + }else if((strtolower(trim($value['relationship'])) === 'father in law' || strtolower(trim($value['relationship'])) === 'mother in law') || (strtolower(trim($value['relationship'])) === 'father-in-law' || strtolower(trim($value['relationship'])) === 'mother-in-law')){ $relation = 'parent_in_law'; }else if(strtolower(trim($value['relationship'])) === 'spouse'){ $relation = 'spouse'; - }else{ + }else if(strtolower(trim($value['relationship'])) === 'self'){ $relation = 'self'; + }else { + $relation = ''; } $value['family_floater_key'] = $relation; diff --git a/app/Helpers/excel_util_helper.php b/app/Helpers/excel_util_helper.php index d2e30828..67ffc9b1 100755 --- a/app/Helpers/excel_util_helper.php +++ b/app/Helpers/excel_util_helper.php @@ -2210,12 +2210,14 @@ if (!function_exists('generate_family_floater_key')) { $relation = 'parent'; } else if (strtolower(trim($relationship)) === 'son' || strtolower(trim($relationship)) === 'daughter') { $relation = 'child'; - } else if (strtolower(trim($relationship)) === 'father in Law' || strtolower(trim($relationship)) === 'mother in Law') { + }else if((strtolower(trim($relationship)) === 'father in Law' || strtolower(trim($relationship)) === 'mother in Law') || (strtolower(trim($relationship)) === 'father-in-Law' || strtolower(trim($relationship)) === 'mother-in-Law')){ $relation = 'parent_in_law'; } else if (strtolower(trim($relationship)) === 'spouse') { $relation = 'spouse'; - } else { + } else if(strtolower(trim($relationship)) === 'self'){ $relation = 'self'; + }else{ + $relation = ''; } return $relation; From a533f06e4a82dfac397d8b48f760c1d090035896 Mon Sep 17 00:00:00 2001 From: Srinivas-Saravanan Date: Mon, 12 May 2025 18:03:35 +0530 Subject: [PATCH 06/12] FEAT_TAT_AND_TPA_REDIRECT,FIX_APPROVED_AMOUNT AS DATE --- app/Controllers/TicketController.php | 38 ++- app/Models/TicketMasterModel.php | 362 +++++++++++++++--------- app/Views/claims_report_tpa_wise.php | 45 ++- app/Views/tat_report_band_wise_list.php | 39 ++- 4 files changed, 333 insertions(+), 151 deletions(-) diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php index 7cbf5766..005bebc4 100644 --- a/app/Controllers/TicketController.php +++ b/app/Controllers/TicketController.php @@ -198,6 +198,12 @@ class TicketController extends BaseController }else if ($isFromDashboard == 2){ $data['ticket_data'] = $this->ticketSearch(4); + }else if ($isFromDashboard == 3){ + $data['ticket_data'] = $this->ticketSearch(2); + + }else if ($isFromDashboard == 4){ + $data['ticket_data'] = $this->ticketSearch(5); + } $data['claim_status'] = $this->claimStatus->select('id,ticket_type,claim_status')->where('is_active', 1)->findAll(); $data['client_list'] = $this->clientModel->select('id,client_name')->where('is_active', 1)->findAll(); @@ -249,7 +255,7 @@ class TicketController extends BaseController ->groupBy('tm.id, tm.created_at, latest_history.created_at'); - //action 1 get last 100 rows, action 2 filter and get all rows related to that, action 3 gets according to dashboard, action 4 gets according to ACM + //action 1 get last 100 rows, action 2 filter and get all rows related to that, action 3 gets according to dashboard, action 4 gets according to ACM, action 5 tat if ($action == 1) { $query = $db->table('ticket_master tm') @@ -356,6 +362,10 @@ class TicketController extends BaseController $where = '1 = 0'; // No valid IDs, return empty result } + }else if ($action == 5) { + $search_data = $this->request->getPost(); + $where = "tm.created_at >= '" . $search_data['from_date'] . "' AND tm.created_at <= '" . $search_data['to_date'] . "'" ."and ticket_type_id = ".$search_data['ticket_type_id']; + } else { $search_data = $this->request->getPost(); // print_r($search_data); die() @@ -445,6 +455,17 @@ class TicketController extends BaseController ->orderBy('tm.id', 'DESC'); $data = $query->get()->getResultArray(); + // dd($db->getLastQuery()->getQuery()); + // dd($data); + if ($action == 5){ + + $tat = $this->request->getPost("tat_category"); + + $data = array_values(array_filter($data, function($dat) use ($tat) { + return $dat['tat'] == $tat; + })); + + } // print_rr($data); // log_message('error',' Claims Master Data '.json_encode($data));die(); // print_rr($data);die(); @@ -1068,6 +1089,10 @@ class TicketController extends BaseController $this->myLogger->logme('error', "Replacing placeholders in content"); if (!empty($ticket_data) && !empty($content)) { + // print_rr($ticket_data);die(); + if (!isset($ticket_data['id'])) { $ticket_data['id'] = $ticket_data['ticket_master_id'];} + if (!isset($ticket_data['ticket_master_id'])) {$ticket_data['ticket_master_id'] = $ticket_data['id'];} + foreach ($this->placeHolders as $key => $value) { if ($value == "emp_code") { @@ -1451,7 +1476,7 @@ class TicketController extends BaseController 'TPA_NAME', 'NON ID', 'ID NOT GENERATED', 'CDA', 'INFORMATION REQUIRED', 'UNDER PROCESS - CLAIM NO. UPDATION', 'UNDER PROCESS - QUERY DOCUMENT RECEIVED', 'APPROVED', 'PAYMENT INITIATED', - 'TOTAL', 'SETTLED', 'CLOSED', 'CANCELLED', 'RETURNED', 'CLEARED_TOTAL' + 'TOTAL', 'SETTLED', 'CLOSED', 'CANCELLED', 'RETURNED', 'CLEARED_TOTAL','TPA_ID' ]; // Reorder data based on column order @@ -1465,6 +1490,7 @@ class TicketController extends BaseController $ordered_data[] = $temp; } $viewData['tpa_wise_data'] = $ordered_data; + // print_r($ordered_data);die(); // $html = view('claims_report_tpa_wise', $viewData); $html = view('claims_report_tpa_wise',$viewData); @@ -1472,6 +1498,9 @@ class TicketController extends BaseController } else if ($received_data['report_type'] == 'tat_band_wise') { $viewData['data'] = $this->ticketMasterModel->getTATReport($policy_type, $fromDate, $toDate); + $viewData['policyType'] = $policy_type; + $viewData['fromDate'] = $fromDate; + $viewData['toDate'] = $toDate; $html = view('tat_report_band_wise_list', $viewData); return $this->respond(['status' => true, 'html' => $html], 200); } @@ -1876,9 +1905,10 @@ class TicketController extends BaseController } } - private function isDate($value) { + private function isDate($value, $format = 'Y-m-d') { // Check if the value is a valid date string (basic validation) - return strtotime($value) !== false; + $date = \DateTime::createFromFormat($format, $value); + return $date && $date->format($format) === $value; } diff --git a/app/Models/TicketMasterModel.php b/app/Models/TicketMasterModel.php index 1404190e..62a5e101 100644 --- a/app/Models/TicketMasterModel.php +++ b/app/Models/TicketMasterModel.php @@ -335,159 +335,240 @@ class TicketMasterModel extends Model // return $data; // } + // public function getTATReport($ticket_type = null, $start_date = null, $end_date = null) + // { + // //set default last 3 months data date + // $fromDate = date('Y-m-d', strtotime('-90 days')); + // $toDate = date('Y-m-d 23:59:59'); + + // if (!empty($start_date) && !empty($end_date)) { + // $fromDate = change_date_format($start_date); + // $toDate = change_date_format($end_date); + // } + // $ticket_type_data_1 = ""; + // $ticket_type_data_2 = ""; + // if (!empty($ticket_type)) { + // $ticket_type_data_1 = "AND ticket_type = $ticket_type"; + // $ticket_type_data_2 = "WHERE tm.ticket_type_id = $ticket_type"; + // } + + // // Fetch claim statuses from the `ticket_claim_status` table + // $statusQuery = " SELECT + // id, claim_status, ticket_type + // FROM ticket_claim_status + // Where is_active = 1 + // $ticket_type_data_1 + // "; + // $statusResult = $this->db->query($statusQuery)->getResultArray(); + // // dd($statusResult); + + // // Initialize dynamic query parts + // $dynamicSelect = ''; + + // // Loop through each claim status and generate the COALESCE and CASE statements for the SELECT + // foreach ($statusResult as $status) { + + // $columnName = $status['claim_status']; // Default column name + + // if (empty($ticket_type)) { + // // Append the insurance type prefix based on `ticket_type` + // switch ($status['ticket_type']) { + // case 1: + // $columnName = "GMC - {$status['claim_status']}"; + // break; + // case 2: + // $columnName = "GPA - {$status['claim_status']}"; + // break; + // case 3: + // $columnName = "EDLI - {$status['claim_status']}"; + // break; + // case 4: + // $columnName = "GTLI - {$status['claim_status']}"; + // break; + // } + // } + + // $dynamicSelect .= " + // COALESCE( + // SUM( + // CASE + // WHEN subquery.status_id = {$status['id']} THEN 1 + // ELSE 0 + // END + // ), + // 0 + // ) AS `$columnName`, "; + // } + + // // Remove the trailing comma from the SELECT part + // $dynamicSelect = rtrim($dynamicSelect, ', '); + // // dd($dynamicSelect); + + + // // Construct the full SQL query + // $sql = " + // SELECT + // tc.TAT_Category, + // $dynamicSelect + // FROM + // ( + // SELECT 'Above 20 Days' AS TAT_Category + // UNION ALL + // SELECT '13-20 Days' + // UNION ALL + // SELECT '7-12 Days' + // UNION ALL + // SELECT '0-6 Days' + // ) AS tc + // LEFT JOIN ( + // SELECT + // tm.id AS ticket_id, + // latest_status.claim_status_id AS status_id, + // CASE + // WHEN DATEDIFF(CURDATE(), COALESCE(latest_status.change_date, tm.created_at)) BETWEEN 0 AND 6 THEN '0-6 Days' + // WHEN DATEDIFF(CURDATE(), COALESCE(latest_status.change_date, tm.created_at)) BETWEEN 7 AND 12 THEN '7-12 Days' + // WHEN DATEDIFF(CURDATE(), COALESCE(latest_status.change_date, tm.created_at)) BETWEEN 13 AND 20 THEN '13-20 Days' + // ELSE 'Above 20 Days' + // END AS TAT_Category + // FROM + // ticket_master tm + // LEFT JOIN ( + // SELECT + // th.ticket_id, + // th.new_value AS claim_status_id, + // MAX(th.created_at) AS change_date + // FROM + // ticket_history th + // WHERE + // th.field_name = 'claim_status_id' + // AND th.is_active = 1 + // GROUP BY + // th.ticket_id, th.new_value + // ) AS latest_status ON latest_status.ticket_id = tm.id + // WHERE tm.is_active = 1 + // AND tm.created_at >= '$fromDate' + // AND tm.created_at <= '$toDate' + // " . (!empty($ticket_type) ? " AND tm.ticket_type_id = $ticket_type" : "") . " + // GROUP BY tm.id, latest_status.claim_status_id, latest_status.change_date, tm.created_at + // ) AS subquery ON tc.TAT_Category = subquery.TAT_Category + // GROUP BY + // tc.TAT_Category + // ORDER BY + // FIELD( + // tc.TAT_Category, + // 'Above 20 Days', + // '13-20 Days', + // '7-12 Days', + // '0-6 Days' + // ); + // "; + + // // Execute the query and return the result + // $data = $this->db->query($sql)->getResultArray(); + // // dd($data); + // print_rr($data);die(); + // // print_rr($this->db->getLastQuery()->getQuery()); die; + + // return $data; + // } public function getTATReport($ticket_type = null, $start_date = null, $end_date = null) { - //set default last 3 months data date + // Set default date range (last 90 days) $fromDate = date('Y-m-d', strtotime('-90 days')); $toDate = date('Y-m-d 23:59:59'); - + if (!empty($start_date) && !empty($end_date)) { $fromDate = change_date_format($start_date); $toDate = change_date_format($end_date); } - $ticket_type_data_1 = ""; - $ticket_type_data_2 = ""; + + // Get all active claim statuses + $statusQuery = $this->db->table('ticket_claim_status') + ->select('id, claim_status') + ->where('is_active', 1) + ->orderBy('id', 'ASC'); + if (!empty($ticket_type)) { - $ticket_type_data_1 = "AND ticket_type = $ticket_type"; - $ticket_type_data_2 = "WHERE tm.ticket_type_id = $ticket_type"; + $statusQuery->where('ticket_type', $ticket_type); } - - // Fetch claim statuses from the `ticket_claim_status` table - $statusQuery = " SELECT - id, claim_status, ticket_type - FROM ticket_claim_status - Where is_active = 1 - $ticket_type_data_1 - "; - $statusResult = $this->db->query($statusQuery)->getResultArray(); - // dd($statusResult); - - // Initialize dynamic query parts - $dynamicSelect = ''; - - // Loop through each claim status and generate the COALESCE and CASE statements for the SELECT - foreach ($statusResult as $status) { - - $columnName = $status['claim_status']; // Default column name - - if (empty($ticket_type)) { - // Append the insurance type prefix based on `ticket_type` - switch ($status['ticket_type']) { - case 1: - $columnName = "GMC - {$status['claim_status']}"; - break; - case 2: - $columnName = "GPA - {$status['claim_status']}"; - break; - case 3: - $columnName = "EDLI - {$status['claim_status']}"; - break; - case 4: - $columnName = "GTLI - {$status['claim_status']}"; - break; + + $statusResult = $statusQuery->get()->getResultArray(); + + // Create a list of all TAT categories we want in the output + $tatCategories = [ + 'Above 20 Days', + '13-20 Days', + '7-12 Days', + '0-6 Days' + ]; + + // Initialize the result array with all TAT categories + $result = []; + foreach ($tatCategories as $category) { + $row = ['TAT_Category' => $category]; + foreach ($statusResult as $status) { + $row[$status['claim_status']] = 0; + } + $result[] = $row; + } + + // Get the base query for ticket counts by status and TAT category + $query = $this->db->table('ticket_master tm') + ->select([ + 'tcs.claim_status', + 'CASE + WHEN DATEDIFF(CURDATE(), COALESCE( + (SELECT MAX(th.created_at) + FROM ticket_history th + WHERE th.ticket_id = tm.id + AND th.field_name = "claim_status_id" + AND th.is_active = 1), + tm.created_at + )) BETWEEN 0 AND 6 THEN "0-6 Days" + WHEN DATEDIFF(CURDATE(), COALESCE( + (SELECT MAX(th.created_at) + FROM ticket_history th + WHERE th.ticket_id = tm.id + AND th.field_name = "claim_status_id" + AND th.is_active = 1), + tm.created_at + )) BETWEEN 7 AND 12 THEN "7-12 Days" + WHEN DATEDIFF(CURDATE(), COALESCE( + (SELECT MAX(th.created_at) + FROM ticket_history th + WHERE th.ticket_id = tm.id + AND th.field_name = "claim_status_id" + AND th.is_active = 1), + tm.created_at + )) BETWEEN 13 AND 20 THEN "13-20 Days" + ELSE "Above 20 Days"g + END AS tat_category', + 'COUNT(*) AS count' + ]) + ->join('ticket_claim_status tcs', 'tcs.id = tm.claim_status_id AND tcs.is_active = 1') + ->where('tm.is_active', 1) + ->where('tm.created_at >=', $fromDate) + ->where('tm.created_at <=', $toDate) + ->groupBy('tcs.claim_status, tat_category') + ->orderBy('FIELD(tat_category, "Above 20 Days", "13-20 Days", "7-12 Days", "0-6 Days")'); + + if (!empty($ticket_type)) { + $query->where('tm.ticket_type_id', $ticket_type); + } + + $countResults = $query->get()->getResultArray(); + + // Populate the result array with actual counts + foreach ($countResults as $row) { + foreach ($result as &$categoryRow) { + if ($categoryRow['TAT_Category'] === $row['tat_category']) { + $categoryRow[$row['claim_status']] = (int)$row['count']; + break; } } - - $dynamicSelect .= " - COALESCE( - SUM( - CASE - WHEN subquery.status_id = {$status['id']} THEN 1 - ELSE 0 - END - ), - 0 - ) AS `$columnName`, "; } - - // Remove the trailing comma from the SELECT part - $dynamicSelect = rtrim($dynamicSelect, ', '); - // dd($dynamicSelect); - - - // Construct the full SQL query - $sql = " - SELECT - tc.TAT_Category, - $dynamicSelect - FROM - ( - SELECT 'Above 20 Days' AS TAT_Category - UNION ALL - SELECT '13-20 Days' - UNION ALL - SELECT '7-12 Days' - UNION ALL - SELECT '0-6 Days' - ) AS tc - LEFT JOIN ( - - SELECT - th.ticket_id, - tcs.claim_status, - tcs.id AS status_id, - CASE - WHEN DATEDIFF( - th.created_at, - COALESCE( - (SELECT MIN(created_at) FROM ticket_history th2 WHERE th2.ticket_id = th.ticket_id), - tm.created_at - ) - ) BETWEEN 0 AND 6 THEN '0-6 Days' - WHEN DATEDIFF( - th.created_at, - COALESCE( - (SELECT MIN(created_at) FROM ticket_history th2 WHERE th2.ticket_id = th.ticket_id), - tm.created_at - ) - ) BETWEEN 7 AND 12 THEN '7-12 Days' - WHEN DATEDIFF( - th.created_at, - COALESCE( - (SELECT MIN(created_at) FROM ticket_history th2 WHERE th2.ticket_id = th.ticket_id), - tm.created_at - ) - ) BETWEEN 13 AND 20 THEN '13-20 Days' - ELSE 'Above 20 Days' - END AS TAT_Category - - FROM - ticket_master tm - JOIN ticket_history th ON tm.id = th.ticket_id - JOIN ticket_claim_status tcs ON th.field_name = 'claim_status_id' AND th.new_value = tcs.id - $ticket_type_data_2 - AND tm.created_at >= '$fromDate' - AND tm.created_at <= '$toDate' - AND tm.is_active = 1 - AND th.is_active = 1 - AND tcs.is_active = 1 - - ) AS subquery ON tc.TAT_Category = subquery.TAT_Category - GROUP BY - tc.TAT_Category - ORDER BY - FIELD( - tc.TAT_Category, - 'Above 20 Days', - '13-20 Days', - '7-12 Days', - '0-6 Days' - ); - "; - - // Execute the query and return the result - $data = $this->db->query($sql)->getResultArray(); - // print_rr($this->db->getLastQuery(), $data); die; - - // $tableData = []; - // if (!empty($data)) { - // // Extract table headers from the first row keys - // $headers = array_keys($data[0]); - // $tableData['headers'] = $headers; - // $tableData['body'] = $data; - // } - - return $data; + + return $result; } public function tpaWiseReport($policy_type = null, $start_date = null, $end_date = null) @@ -544,6 +625,7 @@ class TicketMasterModel extends Model // Construct the final SQL query $sql = " SELECT + tpa.id as TPA_ID, tpa.name AS TPA_NAME, $dynamicSelect, ($dynamicTotal) AS TOTAL, diff --git a/app/Views/claims_report_tpa_wise.php b/app/Views/claims_report_tpa_wise.php index 0a3fc65a..d473d717 100644 --- a/app/Views/claims_report_tpa_wise.php +++ b/app/Views/claims_report_tpa_wise.php @@ -37,16 +37,18 @@ - - + + + - - + + + @@ -62,7 +64,7 @@ } foreach ($column_order as $col_name) { - if ($col_name !== 'TPA_NAME') { + if ($col_name !== 'TPA_NAME' && $col_name != "TPA_ID") { echo "{$totals[$col_name]}"; } } @@ -98,4 +100,35 @@ console.error("Table not found."); } }); - + + function redirectTPAToClaimList(tpa_id){ + + // alert(tpa_id); + data = { + 'tpa_id' : tpa_id, + 'is_dashboard':3 + } + + redirectWithPost("", data); + + } + + function redirectWithPost(url, data = {}) { + const form = document.createElement('form'); + form.method = 'POST'; + form.action = url; + + for (const key in data) { + if (data.hasOwnProperty(key)) { + const input = document.createElement('input'); + input.type = 'hidden'; + input.name = key; + input.value = data[key]; + form.appendChild(input); + } + } + + document.body.appendChild(form); + form.submit(); + } + \ No newline at end of file diff --git a/app/Views/tat_report_band_wise_list.php b/app/Views/tat_report_band_wise_list.php index 0666ece7..a41ff23c 100644 --- a/app/Views/tat_report_band_wise_list.php +++ b/app/Views/tat_report_band_wise_list.php @@ -63,7 +63,7 @@ $rowTotal += $numValue; // Add to row total } ?> - + @@ -129,4 +129,41 @@ }); // ---------------------------------------------------------------------------------------------------- + + \ No newline at end of file From 50d630b1d9c33f533135cf7a3f28c04b516aefb3 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Tue, 13 May 2025 10:27:17 +0530 Subject: [PATCH 07/12] FIX_DELETION_DUBLICATE : RV --- app/Controllers/EmployeeServiceController.php | 4 ++-- app/Views/leads_form_handler.php | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/Controllers/EmployeeServiceController.php b/app/Controllers/EmployeeServiceController.php index d27444b8..5d65c4a4 100755 --- a/app/Controllers/EmployeeServiceController.php +++ b/app/Controllers/EmployeeServiceController.php @@ -1383,11 +1383,11 @@ class EmployeeServiceController extends AdminController { // dd($employee); $existing_endorsements = $this->empEndorsementModel->where('actions','d') - ->where('table_name','employees') + ->where('table_name','employee_polices') ->where('endorsement_id is null') ->where('emp_code',$employee['emp_code']) ->where('name',$employee['name']) - ->where('field_name','emp_status') + ->where('field_name','status') ->where('status !=','truncated') ->where('is_active', 1) ->findAll(); diff --git a/app/Views/leads_form_handler.php b/app/Views/leads_form_handler.php index c6f463df..11ba47a7 100644 --- a/app/Views/leads_form_handler.php +++ b/app/Views/leads_form_handler.php @@ -458,9 +458,19 @@ if (isset($selected_lead_type)) { \ No newline at end of file + + + + + + From f1e66204bf63322d2d5a60e048d397364638c098 Mon Sep 17 00:00:00 2001 From: Srinivas-Saravanan Date: Tue, 13 May 2025 17:03:43 +0530 Subject: [PATCH 09/12] FEAT_PLACEMENT_INSTALLMENTS --- app/Controllers/LeadsController.php | 4 +- app/Views/view_rfq.php | 112 ++++++-- app/Views/view_rfq_non_eb.php | 408 +++++++++++++++++++++++++++- 3 files changed, 490 insertions(+), 34 deletions(-) diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php index b001edf1..41792dbf 100644 --- a/app/Controllers/LeadsController.php +++ b/app/Controllers/LeadsController.php @@ -2372,7 +2372,9 @@ class LeadsController extends BaseController $installment_data = json_decode($params['installments'], true); if(!empty($installment_data)){ foreach ($installment_data as $key => $value) { - $value['payment_date'] = date('Y/m/d', strtotime($value['payment_date'])) ?? null; + $value['payment_date'] = !empty($value['payment_date']) && strtotime($value['payment_date']) + ? date('Y/m/d', strtotime($value['payment_date'])) + : null; if(isset($value['id']) && !empty($value['id'])){ $this->leadInstallmentPaymentDetails->where('id', $value['id'])->set($value)->update(); }else{ diff --git a/app/Views/view_rfq.php b/app/Views/view_rfq.php index 7ddfa80a..1fcc9688 100644 --- a/app/Views/view_rfq.php +++ b/app/Views/view_rfq.php @@ -550,7 +550,7 @@
- +

@@ -5826,27 +5826,92 @@ function appendMultiFileData(data) { }) $("#is_installment_switch").change(function (){ - var switch_status = ($(this).is(":checked")? "on" : "off"); - console.log("Switch status",switch_status); - if (switch_status == "on"){ - $("#no_of_installment").show(); - $("#payment_date").hide(); - $("#utr_no").hide(); - $("#no_of_installment").closest('.form-group').show(); - $("#payment_date").closest('.form-group').hide(); - $("#utr_no").closest('.form-group').hide(); - addInstallmentHTML() - }else{ - $("#no_of_installment").hide(); - $("#payment_date").show(); - $("#utr_no").show(); - $("#no_of_installment").closest('.form-group').hide(); - $("#payment_date").closest('.form-group').show(); - $("#utr_no").closest('.form-group').show(); - $('#installment_form_row').empty(); - } + + var switch_status = ($(this).is(":checked")? "on" : "off"); + console.log("Switch status",switch_status); + if (switch_status == "on"){ + $("#no_of_installment").show(); + $("#payment_date").hide(); + $("#utr_no").hide(); + $("#no_of_installment").closest('.form-group').show(); + $("#payment_date").closest('.form-group').hide(); + $("#utr_no").closest('.form-group').hide(); + let $installmentContainer = $('#installment_form_row'); + let row_count = $installmentContainer.find('.form-row').length; + + if (row_count == 0 ) { addInstallmentHTML()} + // addInstallmentHTML() + }else{ + console.log("inside else") + + let $installmentContainer = $('#installment_form_row'); + let row_count = $installmentContainer.find('.form-row').length; + let remove_count = $("#no_of_installment").val(); + console.log("row count",row_count); + if (row_count > 0 ) { + let ids = $installmentContainer.find('.form-row').slice(-remove_count).find('input[name="installment_primary_key[]"]').map(function() { + return $(this).val(); + }).get(); + Swal.fire({ + title: "Do you want to remove all the entries?", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#3085d6", + cancelButtonColor: "#d33", + confirmButtonText: "Yes, Proceed!" + }).then((result) => { + if (result.isConfirmed) { + let url = ''; + let requestData = { id: ids }; + + $('.loader').fadeIn(); + $('.loader-mask').fadeIn(); + + sendAjaxRequestForGlobal(url, 'GET', requestData, function(response) { + console.log('Data fetched successfully:', response); + + if (response.status === true) { + toastr.success(response.message, 'SUCCESS'); + $("#no_of_installment").hide(); + $("#payment_date").show(); + $("#utr_no").show(); + $("#no_of_installment").closest('.form-group').hide(); + $("#payment_date").closest('.form-group').show(); + $("#utr_no").closest('.form-group').show(); + $('#installment_form_row').empty(); + $('#no_of_installment').val(""); + } else { + toastr.error(response.message, 'WARNING'); + } + + $('.loader').fadeOut(); + $('.loader-mask').delay(350).fadeOut('slow'); + + }, function(xhr, status, error) { + $('.loader').fadeOut(); + $('.loader-mask').delay(350).fadeOut('slow'); + console.error('Error fetching data:', error); + console.error(xhr.responseText); + toastr.error('An error occurred while removing the installment.', 'ERROR'); + }); + }else{ + // alert("Inside else"); + $('#no_of_installment').val(row_count); + // $("#is_installment_switch").bootstrapToggle('on'); + // $('#is_installment_switch').val('1').change(); + // $('#is_installment_switch').bootstrapToggle('on'); + // $('#is_installment_switch').prop('checked', true).trigger('change'); + $('#is_installment_switch').trigger('click'); // in some cases, this forces the CSS to update + + + } + }); + } + + } }) + $(document).on("input", "#cd_amount, #premium_amount", function() { // alert("Function called"); @@ -5989,8 +6054,8 @@ function appendMultiFileData(data) { console.log("Form row count:", row_count); if (row_count === 1) { - $installmentContainer.empty(); - for (let index = 0; index < no_of_installments; index++) { + // $installmentContainer.empty(); + for (let index = 0; index < no_of_installments - 1; index++) { addInstallmentHTML(); } } else if (no_of_installments === row_count) { @@ -6008,7 +6073,7 @@ function appendMultiFileData(data) { console.log('ids', ids); - if (ids != null) { + if (Object.keys(ids).length > 0) { Swal.fire({ title: "Do you want to remove the last " + (remove_count ?? "") + " entries?", icon: "warning", @@ -6067,6 +6132,7 @@ function appendMultiFileData(data) { } }); + $(document).ready(function(){ setTimeout(function(){ $('.payment_date').flatpickr({ diff --git a/app/Views/view_rfq_non_eb.php b/app/Views/view_rfq_non_eb.php index 977d1c82..183a1bb1 100644 --- a/app/Views/view_rfq_non_eb.php +++ b/app/Views/view_rfq_non_eb.php @@ -255,6 +255,12 @@ cursor: pointer; user-select: none; } + + .toggle.btn { + height: 38px !important; + line-height: 33px !important; + } + @@ -424,31 +430,66 @@
-
- - "> -
+
">
+
+ + > +
+
">
-
- - "> -
+ + +
+ + "> +
+ +
+ + "> +
+ +
- - "> + + >
+
+ + +
+ + + +
+ + "> +
+ +
+ + "> +
+ + + +
+
+
+

@@ -4790,6 +4831,7 @@ var lead_id = $('#lead_id').val(); let to = $('#placement_to').val(); let placement_date = $('#placement_date').val(); + let payment_date = $('#payment_date').val(); let utr_no = $('#utr_no').val(); let premium_amount = $('#premium_amount').val(); let total_amount = $('#total_amount').val(); @@ -4799,6 +4841,10 @@ let proposal_insurer = $('#proposals option:selected').data('id'); let insurer_and_branch = $('#proposals').val(); let cc = $('#placement_cc').val(); + let is_cd = $("#is_cd_switch").is(":checked") ? 1 : 0; + let no_of_installment = $('#no_of_installment').val(); + let is_installment = $("#is_installment_switch").is(":checked") ? 1 : 0; + // Process `to` field to = to.split(',').map(email => email.trim()); @@ -4810,6 +4856,33 @@ selectedFiles.push($(this).val()); }); + let data = []; + + $('#installment_form_row .form-row').each(function () { + var lead_id = $('#lead_id').val(); + let installment_amount = $(this).find('input[name="installment_amount[]"]').val(); + let payment_date = $(this).find('input[name="payment_date[]"]').val(); + let utr_no = $(this).find('input[name="utr_no[]"]').val(); + let id = $(this).find('input[name="installment_primary_key[]"]').val(); + + + + console.log('installment_primary_key', id); + + let obj = { + lead_id: lead_id, + installment_amount: installment_amount, + payment_date: payment_date, + utr_no: utr_no + }; + + if (id != undefined && id != null && id != '') { + obj.id = id; + } + + data.push(obj); + }); + // Prepare FormData var formData = new FormData(); @@ -4822,12 +4895,17 @@ formData.append('proposal_insurer', proposal_insurer); formData.append('insurer_and_branch', insurer_and_branch); formData.append('placement_date', placement_date); + formData.append('payment_date', payment_date); + formData.append("is_cd",is_cd); formData.append('utr_no', utr_no); formData.append('premium_amount', premium_amount); formData.append('total_amount', total_amount); formData.append('cd_amount', cd_amount); formData.append('mail_content', mail_content); formData.append('selected_attachment_files', JSON.stringify(selectedFiles)); + formData.append('installments', JSON.stringify(data)); + formData.append('no_of_installment', no_of_installment); + formData.append('is_installment', is_installment); ajaxRequest(formData); @@ -5203,6 +5281,316 @@ return false; } + $(document).on("input", "#cd_amount, #premium_amount", function() { + + // alert("Function called"); + + var cd_amount = parseInt($("#cd_amount").val()) || 0; + var premium_amount = parseInt($("#premium_amount").val()) || 0; + + var total_amount = (cd_amount + premium_amount); + $("#total_amount").val(total_amount); + + + }); + + $("#is_cd_switch").change(function (){ + var switch_status = ($("#is_cd_switch").is(":checked")? "on" : "off"); + console.log("Switch status",switch_status); + if (switch_status == "on"){ + + $("#cd_amount").show(); + $("#total_amount").show(); + $("#cd_amount").closest('.form-group').show(); + $("#total_amount").closest('.form-group').show(); + + }else{ + + $("#cd_amount").hide(); + $("#total_amount").hide(); + $("#cd_amount").closest('.form-group').hide(); + $("#total_amount").closest('.form-group').hide(); + + } + }) + + $("#is_installment_switch").change(function (){ + + var switch_status = ($(this).is(":checked")? "on" : "off"); + console.log("Switch status",switch_status); + if (switch_status == "on"){ + $("#no_of_installment").show(); + $("#payment_date").hide(); + $("#utr_no").hide(); + $("#no_of_installment").closest('.form-group').show(); + $("#payment_date").closest('.form-group').hide(); + $("#utr_no").closest('.form-group').hide(); + let $installmentContainer = $('#installment_form_row'); + let row_count = $installmentContainer.find('.form-row').length; + + if (row_count == 0 ) { addInstallmentHTML()} + // addInstallmentHTML() + }else{ + console.log("inside else") + + let $installmentContainer = $('#installment_form_row'); + let row_count = $installmentContainer.find('.form-row').length; + let remove_count = $("#no_of_installment").val(); + console.log("row count",row_count); + if (row_count > 0 ) { + let ids = $installmentContainer.find('.form-row').slice(-remove_count).find('input[name="installment_primary_key[]"]').map(function() { + return $(this).val(); + }).get(); + Swal.fire({ + title: "Do you want to remove all the entries?", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#3085d6", + cancelButtonColor: "#d33", + confirmButtonText: "Yes, Proceed!" + }).then((result) => { + if (result.isConfirmed) { + let url = ''; + let requestData = { id: ids }; + + $('.loader').fadeIn(); + $('.loader-mask').fadeIn(); + + sendAjaxRequestForGlobal(url, 'GET', requestData, function(response) { + console.log('Data fetched successfully:', response); + + if (response.status === true) { + toastr.success(response.message, 'SUCCESS'); + $("#no_of_installment").hide(); + $("#payment_date").show(); + $("#utr_no").show(); + $("#no_of_installment").closest('.form-group').hide(); + $("#payment_date").closest('.form-group').show(); + $("#utr_no").closest('.form-group').show(); + $('#installment_form_row').empty(); + $('#no_of_installment').val(""); + } else { + toastr.error(response.message, 'WARNING'); + } + + $('.loader').fadeOut(); + $('.loader-mask').delay(350).fadeOut('slow'); + + }, function(xhr, status, error) { + $('.loader').fadeOut(); + $('.loader-mask').delay(350).fadeOut('slow'); + console.error('Error fetching data:', error); + console.error(xhr.responseText); + toastr.error('An error occurred while removing the installment.', 'ERROR'); + }); + }else{ + // alert("Inside else"); + $('#no_of_installment').val(row_count); + // $("#is_installment_switch").bootstrapToggle('on'); + // $('#is_installment_switch').val('1').change(); + // $('#is_installment_switch').bootstrapToggle('on'); + // $('#is_installment_switch').prop('checked', true).trigger('change'); + $('#is_installment_switch').trigger('click'); // in some cases, this forces the CSS to update + + + } + }); + } + + } + }) + + $('#no_of_installment').on('change', function () { + let no_of_installments = parseInt($(this).val()); + let $installmentContainer = $('#installment_form_row'); + let row_count = $installmentContainer.find('.form-row').length; + + console.log("Form row count:", row_count); + + if (row_count === 1) { + // $installmentContainer.empty(); + for (let index = 0; index < no_of_installments - 1; index++) { + addInstallmentHTML(); + } + } else if (no_of_installments === row_count) { + console.log('Same row count, no change needed.'); + } else if (no_of_installments < row_count) { + + // Remove extra rows from the end + let remove_count = row_count - no_of_installments; + let ids = $installmentContainer.find('.form-row') + .slice(-remove_count) + .find('input[name="installment_primary_key[]"]') + .map(function() { + return $(this).val(); + }).get(); + + console.log('ids', ids); + + if (Object.keys(ids).length > 0) { + Swal.fire({ + title: "Do you want to remove the last " + (remove_count ?? "") + " entries?", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#3085d6", + cancelButtonColor: "#d33", + confirmButtonText: "Yes, Proceed!" + }).then((result) => { + if (result.isConfirmed) { + let url = ''; + let requestData = { id: ids }; + + $('.loader').fadeIn(); + $('.loader-mask').fadeIn(); + + sendAjaxRequestForGlobal(url, 'GET', requestData, function(response) { + console.log('Data fetched successfully:', response); + + if (response.status === true) { + toastr.success(response.message, 'SUCCESS'); + $installmentContainer.find('.form-row').slice(-remove_count).remove(); + } else { + toastr.error(response.message, 'WARNING'); + } + + $('.loader').fadeOut(); + $('.loader-mask').delay(350).fadeOut('slow'); + + }, function(xhr, status, error) { + $('.loader').fadeOut(); + $('.loader-mask').delay(350).fadeOut('slow'); + console.error('Error fetching data:', error); + console.error(xhr.responseText); + toastr.error('An error occurred while removing the installment.', 'ERROR'); + }); + }else{ + $('#no_of_installment').val(row_count); + } + }); + } else { + $installmentContainer.find('.form-row').slice(-remove_count).remove(); + } + + } else if (no_of_installments > row_count) { + // Add extra rows from the end + let add_count = no_of_installments - row_count; + for (let index = 0; index < add_count; index++) { + addInstallmentHTML(); + } + } else { + // Add missing rows + let add_count = no_of_installments - row_count; + for (let index = 0; index < add_count; index++) { + addInstallmentHTML(); + } + } + }); + + function addInstallmentHTML() { + let html = ` +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ `; + + $('#installment_form_row').append(html); + + $('.payment_date').flatpickr({ + dateFormat: 'd/m/Y', + }); + } + + $(document).ready(function(){ + setTimeout(function(){ + $('.payment_date').flatpickr({ + dateFormat: 'd/m/Y', + }); + }, 2000) + + // $('#is_installment_switch').bootstrapToggle(); + + }) + + $(document).on('click', '.remove-installment', function () { + let $this = $(this); // Store reference to the clicked element + let row_count = $('#installment_form_row .form-row').length; + console.log("row_count", row_count); + + let id = $this.closest('.form-row').find('input[name="installment_primary_key[]"]').val() ?? null; + console.log("id", id); + let ids = id ? [id] : []; + console.log("ids", ids); + + if (id != null && row_count > 1) { + Swal.fire({ + title: "Do you want to remove this?", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#3085d6", + cancelButtonColor: "#d33", + confirmButtonText: "Yes, Proceed!" + }).then((result) => { + if (result.isConfirmed) { + let url = ''; + let requestData = { id: ids }; + + $('.loader').fadeIn(); + $('.loader-mask').fadeIn(); + + sendAjaxRequestForGlobal(url, 'GET', requestData, function(response) { + console.log('Data fetched successfully:', response); + + if (response.status === true) { + toastr.success(response.message, 'SUCCESS'); + + $this.closest('.form-row').remove(); + let updated_row_count = $('#installment_form_row .form-row').length; + $('#no_of_installment').val(updated_row_count); + console.log("after remove row_count", updated_row_count); + } else { + toastr.error(response.message, 'WARNING'); + } + + $('.loader').fadeOut(); + $('.loader-mask').delay(350).fadeOut('slow'); + + }, function(xhr, status, error) { + $('.loader').fadeOut(); + $('.loader-mask').delay(350).fadeOut('slow'); + console.error('Error fetching data:', error); + console.error(xhr.responseText); + toastr.error('An error occurred while removing the installment.', 'ERROR'); + }); + } + }); + } else { + if (row_count > 1) { + $this.closest('.form-row').remove(); + let updated_row_count = $('#installment_form_row .form-row').length; + $('#no_of_installment').val(updated_row_count); + console.log("after remove row_count", updated_row_count); + } else { + console.log("Only one row left. Not removing."); + } + } + }); From 239c55a7e552500b989eea1041716aa1eee88725 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Tue, 13 May 2025 18:49:03 +0530 Subject: [PATCH 10/12] FEAT_GPA_AUTO_TSA_FIX_DEMOGRAPHY : RV --- app/Controllers/ClientController.php | 4 +- app/Controllers/EmployeeController.php | 2 + app/Controllers/LeadsController.php | 75 +++++++++++++++++++- app/Views/leads_form_handler.php | 9 ++- app/Views/view_rfq.php | 41 ++++++++++- public/sample_excel/Sample_Member_Data.xlsx | Bin 0 -> 19847 bytes public/sample_excel/enrollment.xlsx | Bin 7754 -> 89706 bytes 7 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 public/sample_excel/Sample_Member_Data.xlsx diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index a490bddc..9bf373ce 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -4685,7 +4685,7 @@ class ClientController extends AdminController // ------------- LEADS CONTROLLER ---------------------------------------------------------- - // $LeadsController = new LeadsController(); + $LeadsController = new LeadsController(); // $RFQModel = new RFQModel(); // $data = $RFQModel->where('is_active', 1)->where('lead_id', 40)->first(); @@ -4699,6 +4699,8 @@ class ClientController extends AdminController // $returndata = $LeadsController->convertQCRJsonToPolicyTerms($jsonArray, $policy_type, $proposel_name, $insurer_name); // dd($returndata); + $LeadsController->handleMemberDataGPATotalSumInsurerFromExcel(['lead_id' => 169]); + // -----------BDS REPORT CONTROLLER--------------------------------------------------------------------------------- // $BDSReportController = new BDSReportController(); diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php index a11921fb..0bcc03c5 100755 --- a/app/Controllers/EmployeeController.php +++ b/app/Controllers/EmployeeController.php @@ -444,6 +444,8 @@ class EmployeeController extends AdminController $filePath = ROOTPATH . 'public/sample_excel/enrollment.xlsx'; }else if ($actionType == 'missed_inception') { $filePath = ROOTPATH . 'public/sample_excel/sample_inception.xls'; + }else if ($actionType == 'member_data') { + $filePath = ROOTPATH . 'public/sample_excel/Sample_Member_Data.xlsx'; } // Check if the file exists diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php index b001edf1..199c8d3b 100644 --- a/app/Controllers/LeadsController.php +++ b/app/Controllers/LeadsController.php @@ -712,6 +712,12 @@ class LeadsController extends BaseController $subject = "{{CLIENT_NAME}} _ {{POLICY_TYPE}} _ {{RFQ_OR_QCR}} _ {{POLICY_YEAR}}"; } + if($lead_data['policy_type_id'] == 1){ + $data['totalSumAssured'] = $this->handleMemberDataGPATotalSumInsurerFromExcel(['lead_id' => $id]); + }else{ + $data['totalSumAssured'] = []; + } + $data['mail_content'] = $this->transformMailContent($lead_data, $mail_content, $data['page_name']); $data['subject'] = $this->transformMailContent($lead_data, $subject, $data['page_name']); @@ -1762,7 +1768,7 @@ class LeadsController extends BaseController ['file_path' => WRITEPATH . 'uploads/lead_files/' . $lead_data['file_name'], 'sheets' => [0, 1]], ['file_path' => WRITEPATH . '/uploads/lead_files/' . $result['filename'], 'sheets' => []], ]; - $outputPath = WRITEPATH . 'uploads/lead_files/Member_Data.xlsx'; + $outputPath = WRITEPATH . 'uploads/lead_files/' .$lead_data['file_name']; $result_merge = ExcelMergeHelper::mergeExcelFiles($filePaths, $outputPath); if ($result_merge) { // Call the delete function after the file is successfully created @@ -4077,4 +4083,71 @@ class LeadsController extends BaseController return $attachments; } + + public function handleMemberDataGPATotalSumInsurerFromExcel($params) + { + $lead_id = $params['lead_id']; + $lead_data = $this->leadsModel->find($lead_id); + // dd($lead_data); + $file_name_with_path = WRITEPATH . "/uploads/lead_files/" . $lead_data['file_name']; + // dd($file_name_with_path); + + if (!$lead_data) { + return ['status' => 'failed', 'message' => 'Lead data not found']; + } + + if ($lead_data['file_name']) { + + //check physical file + if (!file_exists($file_name_with_path)) { + + $message = "Lead Physcial file not found"; + $this->myLogger->logme('error', ($message . ' for file ' . $file_name_with_path)); + return ['status' => 'failed', 'message' => 'no physical file']; + } + + $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path); + + //get members data + $members_sheet = $spreadsheet->getSheet(0); + $highestRowAndColumn = $members_sheet->getHighestRowAndColumn(); + // dd($highestRowAndColumn); + + $uncleaned_members = $members_sheet->rangeToArray('A1:' . $highestRowAndColumn['column'] . $highestRowAndColumn['row']); + // dd($uncleaned_members); + + $members = ExcelSanitizeHelper::sanitizeArrayData($uncleaned_members); + // dd($members); + + + // Check column headings + $members_heading = $members[0]; + $available_col = []; + + $lower_headers = array_map('strtolower', $members_heading); + foreach ($lower_headers as $index => $header) { + if (preg_match('/^sa\s*-\s*option\s*\d*$/i', $header)) { + $column_name = $members_heading[$index]; + $sum = 0; + + for ($i = 1; $i < count($members); $i++) { + $cell_raw = $members[$i][$index] ?? ''; + $cell_clean = preg_replace('/[^0-9.\-]/', '', $cell_raw); // remove non-numeric chars + + if ($cell_clean !== '' && is_numeric($cell_clean)) { + $sum += (float) $cell_clean; + } + } + + $available_col[] = $sum; + } + } + + + // dd($available_col); + return $available_col; + } + + return []; + } } diff --git a/app/Views/leads_form_handler.php b/app/Views/leads_form_handler.php index c6f463df..363baef6 100644 --- a/app/Views/leads_form_handler.php +++ b/app/Views/leads_form_handler.php @@ -346,14 +346,21 @@ if (isset($selected_lead_type)) { let placeholder = isFirstField ? 'First file must be Demography.' : ''; let accept = isFirstField ? '.xls,.xlsx' : ''; + if(selected_lead_form_type != 1){ placeholder = ''; accept = ''; } + + let sample_dwn_link = ""; + if(selected_lead_form_type == 1 && isFirstField == 1){ + sample_dwn_link = ' [ " id="excel_download" data-toggle="tooltip" data-placement="top" title="Download Sample Excel">Sample Excel ]'; + } + div.innerHTML = `
- +
diff --git a/app/Views/view_rfq.php b/app/Views/view_rfq.php index 7ddfa80a..86deabef 100644 --- a/app/Views/view_rfq.php +++ b/app/Views/view_rfq.php @@ -635,6 +635,7 @@ var user_role_id = ; var jsonDataForHide = null; var multi_file_data = []; + var totalSumAssuredData = []; const editorConfig = { buttons: [ @@ -708,6 +709,9 @@ let qcr_count = ; let question_json = ; let policy_terms_json = ; + totalSumAssuredData = ; + console.log('totalSumAssuredData', totalSumAssuredData); + console.log('totalSumAssuredData.type', typeof totalSumAssuredData); // console.log('policy_terms_json', policy_terms_json); data = JSON.parse(data); @@ -1236,7 +1240,7 @@ function addSuggestionsToTable() { particularsCell.innerText = details.display_values; const columnCount = $("#rfqTable thead tr th").length; - console.log('columnCount' + columnCount); + // console.log('columnCount' + columnCount); for (let i = 3; i < columnCount - 6; i++) { @@ -1333,8 +1337,43 @@ function addSuggestionsToTable() { moveAddRowButton(); hideQCR(); isFormDataModified = false; + processTotalSumInsured(totalSumAssuredData) + } +function processTotalSumInsured(data) { + let values = []; + + if (Array.isArray(data)) { + data.forEach((value, index) => { + console.log('total - value', value); + if (index !== 0) { + $('#addQuote').click(); + } + }); + values = data + } else if (typeof data === 'object' && data !== null) { + $.each(data, function(key, value) { + console.log('total - value', value); + if (key != 0) { + $('#addQuote').click(); + } + }); + values = Object.values(data) + } else { + console.log("Data is not iterable."); + return; + } + + // Set values in td.editablecolumns in order + $('#totalSumInsured .editablecolumns').each(function(index) { + if (values[index] !== undefined) { + $(this).text(values[index]); + } + }); +} + + // Function to move add row button to last row function moveAddRowButton() { diff --git a/public/sample_excel/Sample_Member_Data.xlsx b/public/sample_excel/Sample_Member_Data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3adbcef7c4d8e3b514cb8f93838aa63ea727e2e2 GIT binary patch literal 19847 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 literal 0 HcmV?d00001 diff --git a/public/sample_excel/enrollment.xlsx b/public/sample_excel/enrollment.xlsx index 0666a6c87688e2c80785c4969af5d8cce4abf933..97cd3191d28915a6893bc17bd6223f18780690e6 100755 GIT binary patch literal 89706 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 adl7e8O&7kQh{$Z=AuG&~@j>A=i2N^gnQi<4 delta 5115 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 d(6NdC=KJrdIa0#Li9rYhOCTWz6ZJ2X{{zzt Date: Wed, 14 May 2025 15:50:27 +0530 Subject: [PATCH 11/12] FEAT_PLACELEMNT_CRON --- app/Config/Routes.php | 3 + app/Controllers/MasterController.php | 2 +- .../PolicyTransactionController.php | 115 ++- app/Models/BdsPlacementModel.php | 93 ++ app/Models/TicketMasterModel.php | 2 +- app/Views/leads_form.php | 1 + app/Views/leads_form_handler.php | 5 + app/Views/leads_non_eb.php | 875 +++++++++--------- app/Views/rfq/claims_details_non_eb.php | 20 +- 9 files changed, 684 insertions(+), 432 deletions(-) create mode 100644 app/Models/BdsPlacementModel.php diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 1527b8cc..ef4c655c 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -360,6 +360,9 @@ $routes->group("/util", ["filter" => "authMVC"], function ($routes) { $routes->get('removeInstallments', 'LeadsController::removeInstallments'); }); +$routes->post("policy_tranction/sendInstallmentRemainderMail","PolicyTransactionController::sendInstallmentRemainderMail"); +$routes->cli("cli/sendInstallmentRemainderMail","PolicyTransactionController::sendInstallmentRemainderMail"); + $routes->group("policy_tranction", ["filter" => "authMVC"], function ($routes) { $routes->group("inception", ["filter" => "authMVC"], function ($routes) { diff --git a/app/Controllers/MasterController.php b/app/Controllers/MasterController.php index fa094bb8..0a3c357d 100755 --- a/app/Controllers/MasterController.php +++ b/app/Controllers/MasterController.php @@ -1680,7 +1680,7 @@ class MasterController extends AdminController ["filePath" => ROOTPATH."public/sample_excel/sample_inception.xls","fileName" => "sample_inception.xls"], ["filePath" => ROOTPATH."public/assets/images/login_bg.jpg","fileName" => "login_bg.jpg"] ]; - $email_id = 'srinivas.saravanan@venbainfotech.com'; + $email_id = ['srinivas.saravanan@venbainfotech.com','srinivassaravanan2002@gmail.com']; $params = ['mail'=>$email_id]; $common = ['mail_type'=>'test_mail_cli']; // $bcc = "vijayalakshmi@nhanceindia.in,vitvelz@gmail.com,velmurugan.s@venbainfotech.com,hariharan@nhanceindia.in,hariharan@jubiliant.in,srinivas.saravanan@venbainfotech.com"; diff --git a/app/Controllers/PolicyTransactionController.php b/app/Controllers/PolicyTransactionController.php index d0242215..d7270335 100644 --- a/app/Controllers/PolicyTransactionController.php +++ b/app/Controllers/PolicyTransactionController.php @@ -32,10 +32,13 @@ use App\Models\InvPaymentDetailsModel; use App\Models\BatchFileModel; use App\Models\FileModel; use App\Models\COShareStmtDetailsModel; -use Kint; +use App\Models\BdsPlacementModel; +use Kint\Kint; +use App\Helpers\MailHelper; +use Exception; class PolicyTransactionController extends BaseController -{ +{ use ResponseTrait; protected $myLogger; @@ -64,6 +67,7 @@ class PolicyTransactionController extends BaseController protected $batchFileModel; protected $filesModel; protected $coShareStmtDetailsModel; + protected $BdsPlacementModel; public function __construct() { @@ -94,6 +98,7 @@ class PolicyTransactionController extends BaseController $this->batchFileModel = new BatchFileModel(); $this->filesModel = new FileModel(); $this->coShareStmtDetailsModel = new COShareStmtDetailsModel(); + $this->BdsPlacementModel = new BdsPlacementModel(); $this->invoiceStatus = [ 'pending' => 'Pending', 'generated' => 'Generated', @@ -182,8 +187,7 @@ class PolicyTransactionController extends BaseController $issuer, $status ); - - }else{ + } else { $ids = $this->request->getPost('ids'); $ids = array_filter(explode(',', $ids)); @@ -1831,7 +1835,7 @@ class PolicyTransactionController extends BaseController if (isset($isFromDashboard) && !empty($isFromDashboard) && $isFromDashboard == 1) { $ids = $this->request->getPost('ids'); - + $ids = array_filter(explode(',', $ids)); if (!empty($ids)) { @@ -2801,4 +2805,105 @@ class PolicyTransactionController extends BaseController ->update(); return $this->respond(['dataStatus' => true, 'code' => 200], 200); } + + public function sendInstallmentRemainderMail() + { + + $this->myLogger->logme("error", "Cron Job For Send Installment Remainder Mail Started"); + + try { + + try { + + $bdsInstallmentData = $this->BdsPlacementModel->getClientInstallmentDetails(); + + }catch (Exception $e) { + + $this->myLogger->logme('error', 'Exception: ' . $e->getMessage() . 'Page: ' . $e->getFile() . ' Line: ' . $e->getLine()); + + } + $this->myLogger->logme("error", "Data for BDS Installment " . json_encode($bdsInstallmentData)); + // dd($bdsInstallmentData); + + if (empty($bdsInstallmentData)) { + + $this->myLogger->logme("error", "No Client Installment is Due in the 15th Day"); + + return false; + } + + foreach ($bdsInstallmentData as $installmentData) { + + $mailData = $this->PrepareBDSMailData($installmentData); + $to_mail = $mailData['to_mail']; + $message = $mailData['message']; + $subject = $mailData['subject']; + + $this->myLogger->logme("error", "Installment Pending for" . $subject); + + $common = ['mail_type' => 'installment_amount_due_remainder_mail']; + + $res = MailHelper::send_email(['mail' => $to_mail, 'subject' => $subject, 'message' => $message, 'common' => $common]); + + $res = json_decode($res); + $this->myLogger->logme('error', 'res: ' . json_encode($res)); + + if ($res->status == 'success') { + return true; + } else { + return false; + } + } + } catch (Exception $e) { + + $this->myLogger->logme('error', 'Exception: ' . $e->getMessage() . 'Page: ' . $e->getFile() . ' Line: ' . $e->getLine()); + } + } + + protected function PrepareBDSMailData($data) + { + + try { + + $installment_amount = $data['installment_amount']; + $payment_date = date('d-m-Y', strtotime($data['payment_date'])); + $client = $data['client_name']; + $branch = $data['branch_name']; + $sales_person_mail = $data['sales_person']; + $heads = $data['heads']; + $admins = $data['admins']; + $buisness_team = $data['buisness_team']; + $policy_no = $data['policy_no']; + $client_short_name = isset($data['short_name']) && $data['short_name'] != null ? $data['short_name'] : $data['client_name']; + + $subject = "Installment Amount Due For Client - {$client_short_name} - Policy NO({$policy_no}) is Due On - {$payment_date}"; + + $message = "Policy Installment for Client - {$client}, Branch - {$branch} is Due on {$payment_date} + with amount of {$installment_amount}.
+ Policy No : {$policy_no}"; + + + $to_mail = array_merge( + array_column($heads, 'email'), + array_column($admins, 'email'), + array_column($buisness_team, 'email'), + [$sales_person_mail] + ); + + $to_mail = array_unique($to_mail); + + $this->myLogger->logme("error", "Selected To Address : " . json_encode($to_mail)); + + // dd($to_mail); + return [ + 'to_mail' => $to_mail, + 'message' => $message, + 'subject' => $subject + ]; + + } catch (Exception $e) { + + $this->myLogger->logme('error', 'Exception: ' . $e->getMessage() . 'Page: ' . $e->getFile() . ' Line: ' . $e->getLine()); + } + } } diff --git a/app/Models/BdsPlacementModel.php b/app/Models/BdsPlacementModel.php new file mode 100644 index 00000000..2cd7c6f4 --- /dev/null +++ b/app/Models/BdsPlacementModel.php @@ -0,0 +1,93 @@ +db->table("bds_installment_payment_details bipd") + ->select("bipd.*, ct.client_name,ct.short_name, cb.branch_name, leads.salse_person_id,cp.policy_no") + ->join("policy_transaction pt", "pt.id = bipd.pt_id") + ->join("clients ct", "ct.id = pt.client_id") + ->join("client_branch cb", "cb.id = pt.client_branch_id") + ->join("leads", "leads.id = bipd.lead_id") + ->join("client_policy cp","cp.id = pt.client_policy_id") + ->where("bipd.is_active", 1) + ->where("bipd.payment_date", date('Y-m-d', strtotime('+15 days'))); + + $data = $builder->get()->getResultArray(); + + // Loop through to extract sales person details + foreach ($data as &$row) { + $sales_person_ids = json_decode($row['salse_person_id'], true); + $sales_person_id = $sales_person_ids[0] ?? null; + + if ($sales_person_id) { + $user = $this->db->table('user_profiles') + ->select('email') // or whatever field + ->where('id', $sales_person_id) + ->get() + ->getRowArray(); + + $row['sales_person'] = $user['email'] ?? 'N/A'; + } else { + $row['sales_person'] = 'Not Assigned'; + } + + $head = $this->db->table('user_profiles') + ->select('email') // or whatever field + ->where('role', 5) + ->where('is_active',1) + ->get() + ->getResultArray(); + + + $row['heads'] = $head; + + $admin = $this->db->table('user_profiles') + ->select('email') + ->where("is_active",1) + ->where("role",1) + ->get() + ->getResultArray(); + + $row['admins'] = $admin; + + $buisenessTeam = $this->db->table("user_teams ut") + ->select("up.email") + ->join('user_profiles up','up.id = ut.user_id and up.is_active = 1') + ->where("ut.team_id",7) + ->where("ut.is_active",1) + ->get() + ->getResultArray(); + + $row['buisness_team'] = $buisenessTeam; + + + } + + + return $data; + } +} diff --git a/app/Models/TicketMasterModel.php b/app/Models/TicketMasterModel.php index 62a5e101..b85dad62 100644 --- a/app/Models/TicketMasterModel.php +++ b/app/Models/TicketMasterModel.php @@ -541,7 +541,7 @@ class TicketMasterModel extends Model AND th.is_active = 1), tm.created_at )) BETWEEN 13 AND 20 THEN "13-20 Days" - ELSE "Above 20 Days"g + ELSE "Above 20 Days" END AS tat_category', 'COUNT(*) AS count' ]) diff --git a/app/Views/leads_form.php b/app/Views/leads_form.php index 265d1f32..25044797 100644 --- a/app/Views/leads_form.php +++ b/app/Views/leads_form.php @@ -777,6 +777,7 @@ console.log(response.message, 'SUCCESS'); $('#appendArea_' + dataIncrement).append(response.data); + console.log("Policy Type ID : ",policy_type_id); if (policy_type_id == 1 || policy_type_id == 6 || policy_type_id == 7) { let newId = 'appendAreaForClaim_' + dataIncrement; diff --git a/app/Views/leads_form_handler.php b/app/Views/leads_form_handler.php index 11ba47a7..f796ee6e 100644 --- a/app/Views/leads_form_handler.php +++ b/app/Views/leads_form_handler.php @@ -719,6 +719,11 @@ if (isset($selected_lead_type)) { $('#policy_type_id').val(data.policy_type_id || '').select2(); $('.loader').fadeOut(); $('.loader-mask').delay(350).fadeOut('slow'); + $(".loss_date").each(function () { + flatpickr(this, { + dateFormat: "d-m-Y", + }); + }); }, 1000); }, 1000); }, 2000); diff --git a/app/Views/leads_non_eb.php b/app/Views/leads_non_eb.php index 0dc0d785..9c826359 100644 --- a/app/Views/leads_non_eb.php +++ b/app/Views/leads_non_eb.php @@ -1,41 +1,41 @@ @@ -233,8 +233,8 @@ hr.solid { " . $value['policy_type'] .""; + if (in_array($value['allocg'], ["Non-EB", "Marine"])) { + echo ""; } } } @@ -247,11 +247,11 @@ hr.solid {
@@ -260,13 +260,19 @@ hr.solid {
--> @@ -308,11 +314,11 @@ hr.solid { @@ -355,60 +361,83 @@ hr.solid { \ No newline at end of file diff --git a/app/Views/rfq/claims_details_non_eb.php b/app/Views/rfq/claims_details_non_eb.php index 9a7b590b..04592201 100644 --- a/app/Views/rfq/claims_details_non_eb.php +++ b/app/Views/rfq/claims_details_non_eb.php @@ -13,6 +13,21 @@ } ?> +
+ + +
+
+ + +
+
+ + +
-
- - -
Date: Wed, 14 May 2025 17:28:53 +0530 Subject: [PATCH 12/12] FIX_FILE_UPLOAD : RV --- app/Helpers/utility_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Helpers/utility_helper.php b/app/Helpers/utility_helper.php index 33f504c0..0d4529c3 100755 --- a/app/Helpers/utility_helper.php +++ b/app/Helpers/utility_helper.php @@ -55,8 +55,8 @@ if (!function_exists('file_Upload')) { function file_Upload($fileToUpload, $filepath) { if ($fileToUpload !== null && $fileToUpload->isValid() && !$fileToUpload->hasMoved()) { + $fileToUpload->move($filepath); $fileName = $fileToUpload->getName(); - $fileToUpload->move($filepath, $fileName); return $fileName; } else { return "";