1297 lines
54 KiB
PHP
1297 lines
54 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers;
|
|
|
|
use CodeIgniter\API\ResponseTrait;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PhpOffice\PhpSpreadsheet\Style\Border;
|
|
use PhpOffice\PhpSpreadsheet\Style\Alignment;
|
|
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
|
|
|
use App\Models\UserModel;
|
|
use App\Models\ClientModel;
|
|
use App\Models\ClientBranchModel;
|
|
use App\Models\ClientPolicyModel;
|
|
use App\Models\LevelContactModel;
|
|
use App\Models\LeadsModel;
|
|
use App\Models\PolicyTypeModel;
|
|
use App\Models\KYCEntityTypeModel;
|
|
use App\Models\PolicyTransactionStatusModel;
|
|
use App\Models\InsurerBranchModel;
|
|
use App\Models\TPABranchModel;
|
|
use App\Models\RFQModel;
|
|
use App\Models\InsurerModel;
|
|
|
|
use App\Helpers\MailHelper;
|
|
use Kint;
|
|
|
|
|
|
class LeadsController extends BaseController
|
|
{
|
|
use ResponseTrait;
|
|
|
|
//log message
|
|
protected $myLogger;
|
|
|
|
//models
|
|
protected $clientModel;
|
|
protected $userModel;
|
|
protected $clientBranchModel;
|
|
protected $clientPolicyModel;
|
|
protected $levelContactModel;
|
|
protected $leadsModel;
|
|
protected $policyTypeModel;
|
|
protected $kycEntityTypeModel;
|
|
protected $policyTransactionStatusModel;
|
|
protected $insurerBranchModel;
|
|
protected $tpaBranchModel;
|
|
protected $RFQModel;
|
|
protected $insurerModel;
|
|
|
|
//variables for storing array
|
|
protected $issuer;
|
|
protected $clientType;
|
|
protected $leadType;
|
|
protected $leadsStatus;
|
|
|
|
public function __construct()
|
|
{
|
|
set_session_context('Leads');
|
|
$this->myLogger = \Config\Services::mylogger();
|
|
|
|
$this->clientModel = new ClientModel();
|
|
$this->userModel = new UserModel();
|
|
$this->clientBranchModel = new ClientBranchModel();
|
|
$this->clientPolicyModel = new ClientPolicyModel();
|
|
$this->levelContactModel = new LevelContactModel();
|
|
$this->leadsModel = new LeadsModel();
|
|
$this->policyTypeModel = new PolicyTypeModel();
|
|
$this->kycEntityTypeModel = new KYCEntityTypeModel();
|
|
$this->policyTransactionStatusModel = new PolicyTransactionStatusModel();
|
|
$this->insurerBranchModel = new InsurerBranchModel();
|
|
$this->tpaBranchModel = new TPABranchModel();
|
|
$this->RFQModel = new RFQModel();
|
|
$this->insurerModel = new InsurerModel();
|
|
|
|
$this->issuer = [1 => 'JIBS', 2 => 'Nhance'];
|
|
$this->clientType = [1 => 'Group', 2 => 'Individual'];
|
|
$this->leadType = [1 => 'Fresh', 2 => 'Renewal', 3 => 'Roll Over'];
|
|
$this->leadsStatus = [
|
|
'queued' => 'Queued',
|
|
'qcr_sent' => 'QCR sent',
|
|
'lost' => 'Lost',
|
|
'co_insurer_pending' => 'Co-Insurer Pending',
|
|
'won' => 'Won',
|
|
'completed_with_corrections' => 'Completed with Corrections',
|
|
'completed_without_corrections' => 'Completed w/o Corrections',
|
|
];
|
|
}
|
|
|
|
public function viewLeadsList()
|
|
{
|
|
$data['page_name'] = 'Leads';
|
|
|
|
// Set basic data
|
|
$data['issuer'] = $this->issuer;
|
|
$data['client_type'] = $this->clientType;
|
|
$data['lead_type'] = $this->leadType;
|
|
$data['lead_status'] = $this->leadsStatus;
|
|
|
|
// Fetch policy types and entity data
|
|
$data['policy_type'] = $this->policyTypeModel->where('is_active', 1)->findAll();
|
|
$data['entity'] = $this->kycEntityTypeModel->where('is_active', 1)->findAll();
|
|
|
|
// Fetch insurer and TPA branch data
|
|
$data['insurer'] = $this->insurerBranchModel->getInsurerBranchesWithInsurerNames();
|
|
$data['tpa'] = $this->tpaBranchModel->getTpaBranchesWithTpaNames();
|
|
|
|
// Fetch sales team members who are active in team 5
|
|
$data['salse_team'] = $this->userModel
|
|
->select('user_profiles.*')
|
|
->join('user_teams', 'user_profiles.id = user_teams.user_id')
|
|
->where('user_teams.team_id', 5)
|
|
->where('user_teams.is_active', 1)
|
|
->where('user_profiles.is_active', 1)
|
|
->findAll();
|
|
|
|
// dd($data);
|
|
|
|
// Fetch leads data
|
|
$data['lead_data_list'] = $this->leadsModel->getLeadDataForLising();
|
|
|
|
// Load layout and pass data
|
|
$this->loadLayout('leads_list', $data);
|
|
}
|
|
|
|
public function createLead()
|
|
{
|
|
// print_r($this->request->getPost()); die;
|
|
$id = $this->request->getPost('id');
|
|
$data = $this->prepareLeadData();
|
|
// print_r($this->request->getPost()); die;
|
|
|
|
|
|
if (!$id) {
|
|
return $this->insertNewLead($data);
|
|
} else {
|
|
return $this->updateOldLead($id, $data);
|
|
}
|
|
}
|
|
|
|
private function prepareLeadData()
|
|
{
|
|
$data = $this->request->getPost();
|
|
|
|
if($data['lead_type'] == 2){
|
|
$client_data = $this->clientModel->where('id', $data['client_id'])->where('is_active', 1)->first();
|
|
$data['client_name'] = $client_data['client_name'];
|
|
$data['client_short_name'] = $client_data['short_name'];
|
|
$data['entity_type_id'] = $client_data['entity_type_id'];
|
|
$data['client_type'] = $client_data['client_type'];
|
|
}else{
|
|
$data['client_id'] = 0;
|
|
$data['client_branch_id'] = 0;
|
|
$data['source_policy_id'] = 0;
|
|
}
|
|
|
|
$data['client_code'] = generate_client_code();
|
|
if($data['client_code'] == 2){
|
|
$data['client_code'] = generate_client_code('IC');
|
|
}
|
|
|
|
$data = $this->prepareMultipleLeadData($data);
|
|
// print_r($data); die;
|
|
return $data;
|
|
}
|
|
|
|
private function prepareMultipleLeadData($data)
|
|
{
|
|
// print_r($data); die;
|
|
$processedData = [];
|
|
foreach($data['policy_type_id'] as $index => $value){
|
|
|
|
|
|
// Separate the insurer and insurer branch, handle missing or invalid data
|
|
if (isset($data['insurer'][$index]) && strpos($data['insurer'][$index], '-') !== false) {
|
|
list($insurer_branch_id, $insurer_id) = explode('-', $data['insurer'][$index]);
|
|
} else {
|
|
$insurer_branch_id = 0;
|
|
$insurer_id = 0;
|
|
}
|
|
// Separate the insurer and insurer branch, handle missing or invalid data
|
|
if (isset($data['tpa'][$index]) && strpos($data['tpa'][$index], '-') !== false) {
|
|
list($tpa_branch_id, $tpa_id) = explode('-', $data['tpa'][$index]);
|
|
} else {
|
|
$tpa_branch_id = 0;
|
|
$tpa_id = 0;
|
|
}
|
|
|
|
|
|
// Separate the insurer and insurer branch, handle missing or invalid data
|
|
if (isset($data['proposed_insurer'][$index]) && strpos($data['proposed_insurer'][$index], '-') !== false) {
|
|
list($proposed_insurer_branch_id, $proposed_insurer_id) = explode('-', $data['proposed_insurer'][$index]);
|
|
} else {
|
|
$proposed_insurer_branch_id = 0;
|
|
$proposed_insurer_id = 0;
|
|
}
|
|
|
|
// Separate the TPA and TPA branch, handle missing or invalid data
|
|
if (isset($data['proposed_tpa'][$index]) && strpos($data['proposed_tpa'][$index], '-') !== false) {
|
|
list($proposed_tpa_branch_id, $proposed_tpa_id) = explode('-', $data['proposed_tpa'][$index]);
|
|
} else {
|
|
$proposed_tpa_branch_id = 0;
|
|
$proposed_tpa_id = 0;
|
|
}
|
|
|
|
if(!empty($data['policy_start_date'][$index])){
|
|
$policy_start_date = change_date_format($data['policy_start_date'][$index], 'd/m/Y', 'Y-m-d');
|
|
}else{
|
|
$policy_start_date = null;
|
|
}
|
|
|
|
if(!empty($data['policy_end_date'][$index])){
|
|
$policy_end_date = change_date_format($data['policy_end_date'][$index], 'd/m/Y', 'Y-m-d');
|
|
}else{
|
|
$policy_end_date = null;
|
|
}
|
|
|
|
$processedData[] = [
|
|
'lead_type' => $data['lead_type'],
|
|
'issuer' => $data['issuer'],
|
|
'client_type' => $data['client_type'],
|
|
'client_name' => $data['client_name'],
|
|
'client_short_name' => $data['client_short_name'],
|
|
'entity_type_id' => $data['entity_type_id'],
|
|
'client_code' => $data['client_code'],
|
|
'pan' => $data['pan'],
|
|
'gst' => $data['gst'],
|
|
'branch_name' => $data['branch_name'],
|
|
'branch_code' => $data['branch_code'],
|
|
'contact_person_name' => $data['contact_person_name'],
|
|
'contact_person_mobile' => $data['contact_person_mobile'],
|
|
'contact_person_email' => $data['contact_person_email'],
|
|
'client_id' => $data['client_id'] ?? 0,
|
|
'client_branch_id' => $data['client_branch_id'] ?? 0,
|
|
'source_policy_id' => $data['source_policy_id'] ?? 0,
|
|
'policy_type_id' => $value,
|
|
'salse_person_id' => $data['salse_person_id'] ?? 0,
|
|
|
|
'insurer_id' => $insurer_id ?? 0,
|
|
'insurer_branch_id' => $insurer_branch_id ?? 0,
|
|
'tpa_id' => $tpa_id ?? 0,
|
|
'tpa_branch_id' => $tpa_branch_id ?? 0,
|
|
'policy_start_date' => $policy_start_date,
|
|
'policy_end_date' => $policy_end_date,
|
|
'no_of_lives' => $data['no_of_lives'][$index] ?? null,
|
|
'claims' => $data['claims'][$index] ?? null,
|
|
'location' => $data['location'][$index] ?? null,
|
|
'proposed_insurer_id' => $proposed_insurer_id ?? 0,
|
|
'proposed_insurer_branch_id' => $proposed_insurer_branch_id ?? 0,
|
|
'proposed_tpa_id' => $proposed_tpa_id ?? 0,
|
|
'proposed_tpa_branch_id' => $proposed_tpa_branch_id ?? 0,
|
|
|
|
'status' => $data['status'] ?? null,
|
|
'notes' => $data['notes'] ?? null,
|
|
];
|
|
}
|
|
|
|
return $processedData;
|
|
}
|
|
|
|
private function insertNewLead($data)
|
|
{
|
|
$insertCount = [];
|
|
foreach($data as $value){
|
|
$insert = $this->leadsModel->insert($value);
|
|
$insertCount[] = $insert;
|
|
$this->insertLeadStatus($insert, $value['status'], 3);
|
|
}
|
|
|
|
if (count($insertCount) > 0) {
|
|
return $this->respond(['status' => true, 'lead_id' => $insert, 'message' => 'New Lead created successfully', 'data' =>$data], 200);
|
|
}
|
|
|
|
return $this->respond(['status' => false, 'lead_id' => $insert, 'message' => "Failed to create Lead", 'data' =>$data], 200);
|
|
}
|
|
|
|
private function updateOldLead($id, $data)
|
|
{
|
|
if ($this->leadsModel->where('id', $id)->set($data[0])->update()) {
|
|
$this->insertLeadStatus($id, $data[0]['status'], 3);
|
|
return $this->respond(['status' => true, 'lead_id' => $id, 'message' => "Lead updated successfully", 'data' =>$data], 200);
|
|
}
|
|
return $this->respond(['status' => false, 'lead_id' => $id, 'message' => "Failed to update Lead", 'data' =>$data], 200);
|
|
}
|
|
|
|
// Get the Single Lead data for edit
|
|
public function getLeadDataForEdit($id)
|
|
{
|
|
|
|
$data = $this->leadsModel
|
|
->where('leads.id', $id)
|
|
->where('leads.is_active', 1)
|
|
->first();
|
|
|
|
if(!empty($data['policy_start_date'])){
|
|
$data['policy_start_date'] = change_date_format($data['policy_start_date'], 'Y-m-d', 'd/m/Y');
|
|
}else{
|
|
$data['policy_start_date'] = null;
|
|
}
|
|
|
|
if(!empty($data['policy_end_date'])){
|
|
$data['policy_end_date'] = change_date_format($data['policy_end_date'], 'Y-m-d', 'd/m/Y');
|
|
}else{
|
|
$data['policy_end_date'] = null;
|
|
}
|
|
|
|
if($data){
|
|
return $this->respond(['status' => true, 'data' => $data], 200);
|
|
}else{
|
|
return $this->respond(['status' => false], 200);
|
|
}
|
|
|
|
}
|
|
|
|
private function insertLeadStatus($primaryKey, $status, $statusType)
|
|
{
|
|
$statusData = [
|
|
'policy_tran_id' => $primaryKey,
|
|
'status' => $status,
|
|
'status_type' => $statusType,
|
|
'created_by' => get_session_userid(),
|
|
];
|
|
$this->policyTransactionStatusModel->insert($statusData);
|
|
}
|
|
|
|
|
|
//--------RFQ-----------------------------------------------------------------------------------------------
|
|
|
|
|
|
public function viewRFQ($id, $type = 1){
|
|
|
|
$data['rfq_data'] = $this->RFQModel
|
|
->where('lead_id', $id)
|
|
->where('type', $type)
|
|
->where('is_active', 1)
|
|
->first();
|
|
|
|
$data['rfq_count'] = $this->RFQModel
|
|
->where('lead_id', $id)
|
|
->where('type', 1)
|
|
->where('is_active', 1)
|
|
->countAllResults();
|
|
|
|
$data['qcr_count'] = $this->RFQModel
|
|
->where('lead_id', $id)
|
|
->where('type', 2)
|
|
->where('is_active', 1)
|
|
->countAllResults();
|
|
|
|
// dd(count($data['rfq_data']));
|
|
|
|
$data['lead_id'] = $id;
|
|
$lead_data = $this->leadsModel
|
|
->select('leads.*, policy_type.question_json')
|
|
->join('policy_type', 'leads.policy_type_id = policy_type.id')
|
|
->where('leads.id', $id)
|
|
->where('leads.is_active', 1)
|
|
->first();
|
|
|
|
// dd($lead_data);
|
|
|
|
if($lead_data['lead_type'] == 2){
|
|
$client_policy_data = $this->clientPolicyModel->where('is_active', 1)->where('id', $lead_data['source_policy_id'])->first();
|
|
$data['policy_terms'] = $client_policy_data['policy_terms'];
|
|
}
|
|
|
|
$data['question_json'] = $lead_data['question_json'];
|
|
$data['page_name'] = isset($data['rfq_data']['type']) && $data['rfq_data']['type'] == 2 ? 'QCR' : 'RFQ';
|
|
$data['insurer'] = $this->insurerBranchModel->getInsurerBranchesWithInsurerNames();
|
|
$data['userList'] = $this->userModel->getUserListForRFQ();
|
|
$data['lead_data'] = $lead_data;
|
|
|
|
// dd($data);
|
|
$this->loadLayout('view_rfq.php', $data);
|
|
}
|
|
|
|
public function createRFQ(){
|
|
|
|
$data = $this->request->getPost();
|
|
$lead_id = $data['lead_id'];
|
|
$data['type'] = 1;
|
|
$this->RFQModel
|
|
->where('lead_id', $lead_id)
|
|
->where('type', 1)
|
|
->where('is_active', 1)
|
|
->set('is_active', 0)
|
|
->update();
|
|
|
|
$result = $this->RFQModel->insert($data);
|
|
|
|
if ($result) {
|
|
return $this->respond(['status' => true, 'id' => $result, 'message' => 'RFQ created successfully', 'data' =>$data], 200);
|
|
}
|
|
|
|
return $this->respond(['status' => false, 'id' => $result, 'message' => "Failed to create RFQ", 'data' =>$data], 200);
|
|
|
|
}
|
|
|
|
public function createQCR(){
|
|
|
|
$data = $this->request->getPost();
|
|
$lead_id = $data['lead_id'];
|
|
$data['type'] = 2;
|
|
|
|
$this->RFQModel
|
|
->where('lead_id', $lead_id)
|
|
->where('type', 2)
|
|
->where('is_active', 1)
|
|
->set('is_active', 0)
|
|
->update();
|
|
|
|
$result = $this->RFQModel->insert($data);
|
|
|
|
if ($result) {
|
|
return $this->respond(['status' => true, 'id' => $result, 'message' => 'QCR created successfully', 'data' =>$data], 200);
|
|
}
|
|
|
|
return $this->respond(['status' => false, 'id' => $result, 'message' => "Failed to create QCR", 'data' =>$data], 200);
|
|
}
|
|
|
|
|
|
//-----RFQ and QCR EXPORT------------------------------------------------------------------------------------------------
|
|
|
|
|
|
//export main route function
|
|
public function exportQCRandRFQ($lead_id, $type, $export_type){
|
|
$this-> exportExcelForQCRandRFQ($lead_id, $type);
|
|
}
|
|
|
|
//FOR EXCEL
|
|
public function exportExcelForQCRandRFQ($lead_id, $type)
|
|
{
|
|
$filepath = $this->constructExcelToSaveTemp($lead_id, $type);
|
|
$filepath = $filepath['filePath'];
|
|
|
|
if (file_exists($filepath)) {
|
|
// Set headers to force download
|
|
header('Content-Description: File Transfer');
|
|
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
|
|
header('Content-Disposition: attachment; filename="' . basename($filepath) . '"');
|
|
header('Content-Length: ' . filesize($filepath));
|
|
header('Pragma: public');
|
|
|
|
// Output the file content
|
|
readfile($filepath);
|
|
|
|
// Delete the file after download
|
|
unlink($filepath);
|
|
|
|
exit;
|
|
} else {
|
|
echo "File does not exist.";
|
|
}
|
|
}
|
|
|
|
//Construct excel file and save the file to the folder and return file path
|
|
public function constructExcelToSaveTemp($lead_id, $type, $propsal_and_insurer = null)
|
|
{
|
|
$rfq_data = $this->RFQModel->getRFQTableDataWithLeadIDAndType($lead_id, $type);
|
|
|
|
// dd($rfq_data, $lead_id, $type);
|
|
|
|
$lead_data = [
|
|
'Insured' => $rfq_data['client_name'],
|
|
'Insurer' => $rfq_data['insurer_name'] . ' - ' . $rfq_data['insurer_branch_name'],
|
|
'TPA' => $rfq_data['tpa_name'] . ' - ' . $rfq_data['tpa_branch_name'],
|
|
];
|
|
|
|
$data = json_decode($rfq_data['json'], true);
|
|
|
|
if($type == 2){
|
|
$data = $this->convertJsonForQCR($data, 'stc');
|
|
if($propsal_and_insurer !== null){
|
|
list($proposal_key, $insurer_key) = explode('-', $propsal_and_insurer, 2);
|
|
$data = $this->transformProposelData($data, $proposal_key, $insurer_key);
|
|
}
|
|
}
|
|
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
|
|
// Start with lead_data at the top
|
|
$rowNumber = 1;
|
|
foreach ($lead_data as $key => $value) {
|
|
$sheet->setCellValue("A{$rowNumber}", $key);
|
|
$sheet->setCellValue("B{$rowNumber}", $value);
|
|
$sheet->getStyle("A{$rowNumber}")->applyFromArray(['font' => ['bold' => true]]);
|
|
$rowNumber++;
|
|
}
|
|
|
|
$leadRange = "A1:B" . (count($lead_data));
|
|
$sheet->getStyle($leadRange)->applyFromArray([
|
|
'borders' => [
|
|
'allBorders' => [
|
|
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
|
|
'color' => ['argb' => 'FF000000'], // Black color
|
|
],
|
|
],
|
|
]);
|
|
|
|
|
|
$rowNumber += 2;
|
|
|
|
// Add headers and subheaders
|
|
$headers = $data['table_data']['headers'];
|
|
$subHeaderRow = $rowNumber + 1;
|
|
$columnLetter = 'A';
|
|
|
|
foreach ($headers as $header) {
|
|
if (in_array($header['parentHeader'], ['Item Key', 'Action'])) {
|
|
continue;
|
|
}
|
|
|
|
if ($header['parentHeader'] === 'Sno') {
|
|
$header['parentHeader'] = 'S.No.';
|
|
}
|
|
|
|
$startColumn = $columnLetter; // Start of the current header range
|
|
$subHeaderCount = count($header['subHeaders']); // Number of subheaders for this parent header
|
|
|
|
// Set parent header value
|
|
$sheet->setCellValue("{$startColumn}{$rowNumber}", $header['parentHeader']);
|
|
$sheet->getStyle("{$startColumn}{$rowNumber}")->applyFromArray([
|
|
'font' => ['bold' => true],
|
|
'alignment' => [
|
|
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
|
|
'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
|
|
],
|
|
]);
|
|
|
|
// Merge header cells if it spans multiple subheaders
|
|
if ($subHeaderCount > 1) {
|
|
$endColumn = chr(ord($startColumn) + $subHeaderCount - 1); // Calculate the end column
|
|
$sheet->mergeCells("{$startColumn}{$rowNumber}:{$endColumn}{$rowNumber}");
|
|
} else {
|
|
$endColumn = $startColumn; // No merge needed if only one subheader
|
|
}
|
|
|
|
// Add subheaders
|
|
foreach ($header['subHeaders'] as $subHeader) {
|
|
$sheet->setCellValue("{$columnLetter}{$subHeaderRow}", $subHeader);
|
|
$sheet->getStyle("{$columnLetter}{$subHeaderRow}")->applyFromArray([
|
|
'font' => ['bold' => true],
|
|
'alignment' => [
|
|
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
|
|
'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
|
|
],
|
|
]);
|
|
$columnLetter++; // Move to the next column for subheaders
|
|
}
|
|
}
|
|
|
|
// Apply border to the header range
|
|
$headerRange = "A{$rowNumber}:" . chr(ord($columnLetter) - 1) . "{$subHeaderRow}";
|
|
$sheet->getStyle($headerRange)->applyFromArray([
|
|
'borders' => [
|
|
'allBorders' => [
|
|
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
|
|
'color' => ['argb' => 'FF000000'], // Black color
|
|
],
|
|
],
|
|
]);
|
|
|
|
// Increase row height for headers and subheaders
|
|
$sheet->getRowDimension($rowNumber)->setRowHeight(30); // Header row height
|
|
$sheet->getRowDimension($subHeaderRow)->setRowHeight(25); // Subheader row height
|
|
|
|
$rowNumber = $subHeaderRow + 2;
|
|
$column_data = $data['table_data']['data'];
|
|
$serial_no = 1;
|
|
|
|
// Add table data rows
|
|
foreach ($column_data as $dataRow) {
|
|
$columnLetter = 'A';
|
|
foreach ($dataRow['data'] as $cellData) {
|
|
if (in_array($cellData['parentth'], ['Item Key', 'Action'])) {
|
|
continue;
|
|
}
|
|
|
|
if ($cellData['parentth'] == 'Sno') {
|
|
$sheet->setCellValue("{$columnLetter}{$rowNumber}", $serial_no);
|
|
} else {
|
|
$sheet->setCellValue("{$columnLetter}{$rowNumber}", $cellData['value']);
|
|
}
|
|
|
|
$columnLetter++;
|
|
}
|
|
$rowNumber++;
|
|
$serial_no++;
|
|
}
|
|
|
|
$dataRange = "A" . ($subHeaderRow + 1) . ":" . chr(ord($columnLetter) - 1) . ($rowNumber - 1);
|
|
$sheet->getStyle($dataRange)->applyFromArray([
|
|
'borders' => [
|
|
'allBorders' => [
|
|
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
|
|
'color' => ['argb' => 'FF000000'], // Black color
|
|
],
|
|
],
|
|
]);
|
|
|
|
|
|
if($type == 2){
|
|
|
|
$rowNumber += 2;
|
|
|
|
// Add premium data
|
|
$premiumData = $data['premium_data']['data'];
|
|
$premium = ['Premium'];
|
|
$gst = ['GST'];
|
|
$total = ['Total'];
|
|
|
|
foreach ($premiumData as $proposal => $insurers) {
|
|
foreach ($insurers as $insurer => $values) {
|
|
$premium[] = $values['Premium'];
|
|
$gst[] = $values['GST'];
|
|
$total[] = $values['Total'];
|
|
}
|
|
}
|
|
|
|
foreach ([$premium, $gst, $total] as $index => $rowData) {
|
|
$columnLetter = 'B';
|
|
foreach ($rowData as $key => $value) {
|
|
$sheet->setCellValue("{$columnLetter}{$rowNumber}", $value);
|
|
if ($key === 0) {
|
|
$sheet->getStyle("{$columnLetter}{$rowNumber}")->applyFromArray(['font' => ['bold' => true,],]);
|
|
}
|
|
$columnLetter++;
|
|
}
|
|
$rowNumber++;
|
|
}
|
|
|
|
$premiumRange = "B" . ($rowNumber - 3) . ":" . chr(ord($columnLetter) - 1) . ($rowNumber - 1);
|
|
$sheet->getStyle($premiumRange)->applyFromArray([
|
|
'borders' => [
|
|
'allBorders' => [
|
|
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
|
|
'color' => ['argb' => 'FF000000'], // Black color
|
|
],
|
|
],
|
|
]);
|
|
|
|
}
|
|
|
|
// Auto-size columns
|
|
foreach ($sheet->getColumnIterator() as $column) {
|
|
$sheet->getColumnDimension($column->getColumnIndex())->setAutoSize(true);
|
|
}
|
|
|
|
// Set filename
|
|
$string = ($type == 2) ? 'QCR' : 'RFQ';
|
|
$filename = "{$string}_{$rfq_data['client_short_name']}_{$rfq_data['policy_type']}_" . date('YmdHis') . '.xlsx';
|
|
|
|
// Save to temporary location
|
|
$uploadFilePath = WRITEPATH . 'tmp/' . $filename;
|
|
$writer = new Xlsx($spreadsheet);
|
|
$writer->save($uploadFilePath);
|
|
|
|
return [
|
|
'filePath' => $uploadFilePath,
|
|
'fileName' => $filename,
|
|
];
|
|
}
|
|
|
|
//this funciton for send mail to insurer and client with either RFQ/QCR
|
|
public function sendMailWithAttachement()
|
|
{
|
|
helper('excel_util_helper');
|
|
helper('MailHelper');
|
|
|
|
$params = $this->request->getGet();
|
|
// print_r($params); die;
|
|
$lead_id = $params['lead_id'];
|
|
$file_type = $params['file_type']; //rfq or qcr
|
|
$recipient_type = $params['recipient_type']; //insurer or client or internal or placement
|
|
$recipient_mail = $params['recipient_mail']; // - only primary key of contacts
|
|
$recipient_mail = json_decode($params['recipient_mail'], true); // - only primary key of contacts
|
|
$propsal_and_insurer = isset($params['proposal_insurer']) ? $params['proposal_insurer'] : null;
|
|
|
|
$result_data = [];
|
|
// dd($recipient_mail);
|
|
if ($recipient_type == 'insurer' && (!is_array($recipient_mail) || count($recipient_mail) == 0)) {
|
|
return $this->respond(['status' => 'failed', 'code' => 400, 'data' => '', 'messgae' => 'Recipient mail not found ! '], 200);
|
|
}
|
|
// dd();
|
|
//gather lead info
|
|
$lead_data = $this->leadsModel
|
|
->select('leads.*,policy_type.long_name,policy_type.policy_type,user_profiles.email as created_person_email')
|
|
->join('policy_type', 'leads.policy_type_id = policy_type.id')
|
|
->join('user_profiles', 'leads.created_by = user_profiles.id')
|
|
->where('leads.id', $lead_id)
|
|
->first();
|
|
|
|
$cc_mails = [];
|
|
|
|
//get CC Mails
|
|
if($recipient_type == 'internal' || $recipient_type == 'placement'){
|
|
|
|
$cc_data = isset($params['cc']) ? $params['cc'] : "";
|
|
$param_cc_mail = json_decode($cc_data, true);
|
|
if (isset($param_cc_mail) && is_array($param_cc_mail) && count($param_cc_mail) > 0) {
|
|
// Fetch user data where ID is in the param_cc_mail array
|
|
$userData = $this->userModel
|
|
->where('is_active', 1)
|
|
->whereIn('id', $param_cc_mail)
|
|
->findAll();
|
|
|
|
// print_r($userData); die;
|
|
|
|
// Extract emails from the fetched user data
|
|
$cc_mails = array_column($userData, 'email');
|
|
|
|
// print_r(json_encode($cc_mails)); die;
|
|
|
|
// If no emails were found, return an error response
|
|
if (empty($cc_mails)) {
|
|
return $this->respond(['status' => 'failed','code' => 400,'data' => '','message' => 'No valid CC mail addresses found!'], 200);
|
|
}
|
|
|
|
} else {
|
|
// Handle case where param_cc_mail is not valid
|
|
return $this->respond(['status' => 'failed','code' => 400,'data' => '','message' => 'CC mail not found!'], 200);
|
|
}
|
|
}
|
|
|
|
if ($recipient_type == 'client' && ($lead_data['contact_person_email'] == '' || $lead_data['contact_person_email'] == null)) {
|
|
return $this->respond(['status' => 'failed', 'code' => 400, 'data' => '', 'messgae' => 'Recipient mail not found ! '], 200);
|
|
}
|
|
|
|
// dd($lead_data);
|
|
$reply_to = $lead_data['created_person_email'];
|
|
|
|
//get file path to attach
|
|
$file_info = $this->constructExcelToSaveTemp($lead_id, ($file_type == 'rfq' ? 1 : 2), $propsal_and_insurer);
|
|
// $file_path = WRITEPATH."uploads/excel/sample/correction.xls";
|
|
// $file_name = $file_type.'.xlsx';
|
|
// !dd($file_info);
|
|
|
|
$file_path = $file_info['filePath'];
|
|
$file_name = $file_info['fileName'];
|
|
$attachments = [['fileName' => $file_name, 'filePath' => $file_path]];
|
|
|
|
//get recipient address
|
|
if ($recipient_type == 'insurer' || $recipient_type == 'placement') {
|
|
|
|
// print_r($recipient_mail); die;
|
|
|
|
$recipient_data = $this->levelContactModel
|
|
->where(['contact_type' => 'insurer', 'is_active' => 1])
|
|
->whereIn('id', $recipient_mail)
|
|
->findAll();
|
|
|
|
// print_r($recipient_data); die;
|
|
|
|
} else if($recipient_type == 'client') {
|
|
$recipient_data = [['name' => $lead_data['contact_person_name'], 'email' => $lead_data['contact_person_email']]];
|
|
}else{
|
|
$recipient_data = [['name' => "Team", 'email' => $params['to']]];
|
|
}
|
|
// print_r($recipient_data); die;
|
|
|
|
$subject = $file_type == 'rfq' ? 'Request for Quotation from ' . $lead_data['client_name'] . ' for ' . $lead_data['policy_type'] : 'Quotation Comparison Report for ' . $lead_data['policy_type'];
|
|
$original_message = '<div style="width:100%;max-width:600px;margin:0 auto;padding:20px;border:1px solid #e0e0e0;background-color:#f9f9f9;font-family:Arial,sans-serif;color:#333;line-height:1.6"><div style=background-color:#4a90e2;color:#fff;padding:15px;text-align:center><h1 style=margin:0;font-size:24px>Request for Quotation (RFQ)</h1></div><div style=padding:20px;background-color:#fff><h2 style=color:#4a90e2;font-size:20px;margin-top:0>Dear {{RECIPIENT_NAME}},</h2><p>We are reaching out to request a quotation for the following insurance coverage. Please review the details below and provide your quote at your earliest convenience.<h2 style=color:#4a90e2;font-size:20px;margin-top:20px>RFQ Details</h2><table style=width:100%;border-collapse:collapse;margin-top:20px><tr><th style="border:1px solid #ddd;padding:10px;text-align:left;background-color:#f2f2f2">Client name<td style="border:1px solid #ddd;padding:10px;text-align:left">{{CLIENT_NAME}}<tr><th style="border:1px solid #ddd;padding:10px;text-align:left;background-color:#f2f2f2">Coverage Type<td style="border:1px solid #ddd;padding:10px;text-align:left">{{POLICY_LONG_NAME}}<tr><th style="border:1px solid #ddd;padding:10px;text-align:left;background-color:#f2f2f2">Policy Start Date<td style="border:1px solid #ddd;padding:10px;text-align:left">{{POLICY_START_DATE}}<tr><th style="border:1px solid #ddd;padding:10px;text-align:left;background-color:#f2f2f2">Policy Duration<td style="border:1px solid #ddd;padding:10px;text-align:left">{{DURATION}}</table><div style="margin-top:20px;padding:10px;background-color:#f7f7f7;border-left:4px solid #4a90e2;font-style:italic">Please note: Additional terms and details are included in the attachment for your reference.</div><p>Please feel free to reach out if you require any further information to prepare the quote. We look forward to receiving your proposal.<p>Best regards,<p><strong>Nhance India Pvt Ltd</strong><br></div><div style=margin-top:20px;font-size:12px;color:#777;text-align:center><p>© Nhance India Pvt Ltd. All rights reserved.</div></div>';
|
|
|
|
if($recipient_data){
|
|
foreach ($recipient_data as $recipient) {
|
|
|
|
$message = $original_message;
|
|
$message = str_replace("{{RECIPIENT_NAME}}", $recipient['name'], $message);
|
|
$message = str_replace("{{CLIENT_NAME}}", $lead_data['client_name'], $message);
|
|
$message = str_replace("{{POLICY_LONG_NAME}}", $lead_data['long_name'], $message);
|
|
$message = str_replace("{{POLICY_START_DATE}}", change_date_format($lead_data['policy_start_date'], 'Y-m-d', 'd-m-Y'), $message);
|
|
$message = str_replace("{{DURATION}}", calculate_days_bw_dates($lead_data['policy_end_date'] ?? "", $lead_data['policy_start_date'] ?? "")->days, $message) ?? '--';
|
|
|
|
// print_rr($message);calculate_days_bw_dates
|
|
|
|
$res = MailHelper::send_email(['mail' => $recipient['email'], 'cc'=> $cc_mails, 'subject' => $subject, 'message' => $message, 'attachments' => $attachments, 'reply_to' => $reply_to]);
|
|
// !dd($res);
|
|
$result_data[] = ['mail' => $recipient['email'], 'status' => $res];
|
|
}
|
|
}
|
|
|
|
if($recipient_type == 'placement'){
|
|
|
|
list($proposal_key, $insurer_key) = explode('-', $propsal_and_insurer, 2);
|
|
|
|
$lead_update_data = [
|
|
'proposel_name' => $proposal_key,
|
|
'insurer_name' => $insurer_key,
|
|
'insurer' => $params['insurer_and_branch'],
|
|
] ;
|
|
|
|
$data = [
|
|
'proposel_data' => json_encode($lead_update_data),
|
|
'status' => 'won'
|
|
];
|
|
|
|
$this->leadsModel->where('id', $lead_id)->set($data)->update();
|
|
}
|
|
|
|
//delete attachment file
|
|
unlink($file_path);
|
|
return $this->respond(['status' => 'success', 'code' => 200, 'data' => $result_data], 200);
|
|
}
|
|
|
|
public function getLevelContects()
|
|
{
|
|
|
|
$data = $this->levelContactModel->getContactForRFQ();
|
|
|
|
if($data){
|
|
return $this->respond(['status' => true, 'data' => $data], 200);
|
|
}else{
|
|
return $this->respond(['status' => false], 200);
|
|
}
|
|
|
|
}
|
|
|
|
public function getInsurerBranchContacts($insurer_and_branch_id)
|
|
{
|
|
if (strpos($insurer_and_branch_id, '-') === false) {
|
|
return $this->respond(['status' => false, 'message' => 'Invalid ID format'], 400);
|
|
}
|
|
|
|
// Split the insurer_and_branch_id
|
|
list($insurerBranchId, $insurerId) = explode('-', $insurer_and_branch_id);
|
|
|
|
$data = $this->levelContactModel->getContactForRFQ($insurerId, $insurerBranchId);
|
|
|
|
if (!empty($data)) {
|
|
return $this->respond(['status' => true, 'data' => $data], 200);
|
|
} else {
|
|
return $this->respond(['status' => false, 'data' => $data, 'message' => 'No contacts were found for the selected insurer.'], 200);
|
|
}
|
|
}
|
|
|
|
function transformProposelData($data, $proposel, $insurer){
|
|
|
|
// print_r($data['premium_data']['data']); die;
|
|
|
|
$headerData = [];
|
|
|
|
// Default headers: S. No and Particulars
|
|
$defaultHeaders = [
|
|
[
|
|
'parentHeader' => 'Sno',
|
|
'subHeaders' => ['-']
|
|
],
|
|
[
|
|
'parentHeader' => 'Particulars',
|
|
'subHeaders' => ['-']
|
|
]
|
|
];
|
|
|
|
// Add default headers to the result
|
|
$headerData = array_merge($headerData, $defaultHeaders);
|
|
|
|
foreach ($data['table_data']['headers'] as $header) {
|
|
// Check if the parentHeader matches the target proposal
|
|
if ($header['parentHeader'] === $proposel) {
|
|
// Check if subHeaders contain the target insurer key
|
|
foreach ($header['subHeaders'] as $subHeader) {
|
|
if ($subHeader === $insurer) {
|
|
$headerData[] = [
|
|
'parentHeader' => $header['parentHeader'],
|
|
'subHeaders' => [
|
|
'Quote Asked', // Default value
|
|
$subHeader // Matched insurer key
|
|
]
|
|
];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$columnData = [];
|
|
|
|
foreach ($data['table_data']['data'] as $entry) {
|
|
|
|
$sno = $entry['SNO'];
|
|
$items = $entry['items'];
|
|
$dataEntry = $entry['data'];
|
|
|
|
$result = [
|
|
"SNO" => $sno,
|
|
"items" => $items,
|
|
"data" => []
|
|
];
|
|
|
|
foreach ($dataEntry as $item) {
|
|
|
|
// Include Sno and Particulars by default
|
|
if (in_array($item['parentth'], ['Sno', 'Particulars'])) {
|
|
$result['data'][] = [
|
|
"parentth" => $item['parentth'],
|
|
"subth" => $item['subth'],
|
|
"value" => $item['value'],
|
|
"input_value" => $item['input_value']
|
|
];
|
|
}
|
|
|
|
// Include Proposal with Quote Asked by default
|
|
if ($item['parentth'] === $proposel && $item['subth'] === "Quote Asked") {
|
|
$result['data'][] = [
|
|
"parentth" => $item['parentth'],
|
|
"subth" => $item['subth'],
|
|
"value" => $item['value'],
|
|
"input_value" => $item['input_value']
|
|
];
|
|
}
|
|
|
|
// Example of including matching specific proposals and insurers
|
|
if ($item['parentth'] === $proposel && $item['subth'] === $insurer) {
|
|
$result['data'][] = [
|
|
"parentth" => $item['parentth'],
|
|
"subth" => $item['subth'],
|
|
"value" => $item['value'],
|
|
"input_value" => $item['input_value']
|
|
];
|
|
}
|
|
}
|
|
|
|
// Add to the final result
|
|
$columnData[] = $result;
|
|
}
|
|
|
|
$premiumData = [];
|
|
|
|
foreach ($data['premium_data']['data'] as $key => $value) {
|
|
if ($key === $proposel) {
|
|
$premiumData[$key]['Quote Asked'] = $value['Quote Asked'];
|
|
$premiumData[$key][$insurer] = $value[$insurer];
|
|
}
|
|
}
|
|
|
|
$data['table_data']['headers'] = $headerData;
|
|
$data['table_data']['data'] = $columnData;
|
|
$data['premium_data']['data'] = $premiumData;
|
|
|
|
return $data;
|
|
|
|
}
|
|
|
|
function convertJsonForQCR($json, $type)
|
|
{
|
|
if ($json) {
|
|
// Deep copy of JSON
|
|
$first_json = json_decode(json_encode($json), true);
|
|
|
|
// Column-wise Check: Remove headers and relevant data if qcr == 0
|
|
foreach ($json['proposal_data']['over_all_column_data'] as $proposalKey => $proposalData) {
|
|
if ($proposalData['stc'] == 0 || $proposalData['stc'] === false) {
|
|
// Remove matching parentHeader in headers
|
|
foreach ($first_json['table_data']['headers'] as $index => $header) {
|
|
if ($header['parentHeader'] === $proposalKey) {
|
|
unset($first_json['table_data']['headers'][$index]);
|
|
}
|
|
}
|
|
|
|
// Remove data entries with matching parentth
|
|
foreach ($first_json['table_data']['data'] as &$item) {
|
|
$item['data'] = array_values(array_filter($item['data'], function ($entry) use ($proposalKey) {
|
|
return $entry['parentth'] !== $proposalKey;
|
|
}));
|
|
}
|
|
|
|
// Remove proposalKey from over_all_column_data
|
|
unset($first_json['proposal_data']['over_all_column_data'][$proposalKey]);
|
|
|
|
if($type == 'stc'){
|
|
// Remove proposalKey from premium_data
|
|
unset($first_json['premium_data']['data'][$proposalKey]);
|
|
}
|
|
}
|
|
|
|
// Insurer Check: Remove subHeaders and relevant data for insurers with qcr == 0
|
|
foreach ($proposalData['insurers'] as $insurerIndex => $insurer) {
|
|
if ($insurer['stc'] === 0 || $insurer['stc'] === false) {
|
|
foreach ($first_json['table_data']['headers'] as &$header) {
|
|
if (isset($header['subHeaders'])) {
|
|
$header['subHeaders'] = array_values(array_filter($header['subHeaders'], function ($sub) use ($insurer) {
|
|
return $sub !== $insurer['display_name'];
|
|
}));
|
|
}
|
|
}
|
|
|
|
|
|
foreach ($first_json['table_data']['data'] as &$item) {
|
|
$item['data'] = array_values(array_filter($item['data'], function ($entry) use ($insurer) {
|
|
return $entry['subth'] !== $insurer['display_name'];
|
|
}));
|
|
}
|
|
|
|
// Remove insurer from proposal's insurers array
|
|
unset($first_json['proposal_data']['over_all_column_data'][$proposalKey]['insurers'][$insurerIndex]);
|
|
|
|
if($type == 'stc'){
|
|
unset($first_json['premium_data']['data'][$proposalKey][$insurer['display_name']]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Row-wise Check: Remove rows if qcr == 0 for actions
|
|
foreach ($first_json['table_data']['data'] as $rowKey => $rowData) {
|
|
foreach ($rowData['data'] as $data) {
|
|
if ($data['parentth'] === "Action" && isset($data['input_value']['stc']) && $data['input_value']['stc'] == 0) {
|
|
unset($first_json['table_data']['data'][$rowKey]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Reindex arrays to maintain proper structure
|
|
$first_json['table_data']['headers'] = array_values($first_json['table_data']['headers']);
|
|
$first_json['table_data']['data'] = array_values($first_json['table_data']['data']);
|
|
$first_json['proposal_data']['over_all_column_data'] = array_map(function ($proposal) {
|
|
$proposal['insurers'] = array_values($proposal['insurers']);
|
|
return $proposal;
|
|
}, $first_json['proposal_data']['over_all_column_data']);
|
|
|
|
return $first_json;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
//----- Featch Lead data and insert Client -------------------------------------------------------------------------------------------
|
|
|
|
|
|
public function featchLeadDataAndInsertClient($lead_id)
|
|
{
|
|
$data = $this->leadsModel->where('leads.id', $lead_id)->where('leads.is_active', 1)->first();
|
|
|
|
if (!$data) {
|
|
return $this->respond(['status' => false, 'message' => 'Failed to create Client', 'data' => null], 200);
|
|
}
|
|
|
|
$result = $this->createClientWithLeadData($data);
|
|
|
|
if ($result) {
|
|
|
|
$policy_data = $this->clientPolicyModel->where('client_id', $result)->where('is_active', 1)->first();
|
|
return $this->respond(['status' => true, 'message' => 'New Client created successfully', 'client_id' => $result, 'data' => $data, 'client_policy_id' => $policy_data['id']], 200);
|
|
}
|
|
|
|
return $this->respond(['status' => false, 'message' => 'Failed to create client', 'data' => $data], 200);
|
|
}
|
|
|
|
public function createClientWithLeadData($data)
|
|
{
|
|
$client_data = $this->prepareClientData($data);
|
|
$client_id = $this->clientModel->insert($client_data);
|
|
|
|
if ($client_id) {
|
|
$this->createClientBranchAndContactWithLeadData($data, $client_id);
|
|
}
|
|
|
|
return $client_id;
|
|
}
|
|
|
|
private function prepareClientData($data)
|
|
{
|
|
return [
|
|
'client_type' => $data['client_type'],
|
|
'entity_type_id' => $data['entity_type_id'],
|
|
'client_code' => $data['client_code'],
|
|
'client_name' => $data['client_name'],
|
|
'short_name' => $data['client_short_name'],
|
|
'pan' => $data['pan'],
|
|
];
|
|
}
|
|
|
|
public function createClientBranchAndContactWithLeadData($data, $client_id)
|
|
{
|
|
$branch_data = $this->prepareClientBranchData($data, $client_id);
|
|
$branch_id = $this->clientBranchModel->insert($branch_data);
|
|
|
|
if ($branch_id) {
|
|
|
|
$contact_data = $this->prepareContactData($data, $branch_id);
|
|
$this->levelContactModel->insert($contact_data);
|
|
|
|
$this->createClientPolicyWithLeadData($data, $client_id, $branch_id);
|
|
}
|
|
|
|
return $branch_id;
|
|
}
|
|
|
|
private function prepareClientBranchData($data, $client_id)
|
|
{
|
|
$default_unit = trim(($data['client_short_name'] ?? '') . '-' . ($data['branch_code'] ?? ''), '-');
|
|
|
|
return [
|
|
'client_id' => $client_id,
|
|
'branch_name' => $data['branch_name'],
|
|
'branch_code' => $data['branch_code'],
|
|
'gst' => $data['gst'],
|
|
'units' => json_encode([$default_unit]),
|
|
];
|
|
}
|
|
|
|
private function prepareContactData($data, $branch_id)
|
|
{
|
|
return [
|
|
'name' => $data['contact_person_name'],
|
|
'mobile' => $data['contact_person_mobile'],
|
|
'email' => $data['contact_person_email'],
|
|
'contact_type' => 'client',
|
|
'ref_id' => $branch_id,
|
|
];
|
|
}
|
|
|
|
public function createClientPolicyWithLeadData($data, $client_id, $branch_id)
|
|
{
|
|
$client_policy_data = $this->prepareClientPolicyData($data, $client_id, $branch_id);
|
|
return $this->clientPolicyModel->insert($client_policy_data);
|
|
}
|
|
|
|
private function prepareClientPolicyData($data, $client_id, $branch_id)
|
|
{
|
|
$proposel_data = json_decode($data['proposel_data'], true);
|
|
// print_r($proposel_data); die;
|
|
list($insurer_branch_id, $insurer_id) = explode('-', $proposel_data['insurer'], 2);
|
|
|
|
$client_policy_data = [
|
|
'client_id' => $client_id,
|
|
'client_branch_id' => $branch_id,
|
|
'policy_type_id' => $data['policy_type_id'],
|
|
'insurer_id' => $insurer_id,
|
|
'insurer_branch_id' => $insurer_branch_id,
|
|
'tpa_id' => $data['tpa_id'],
|
|
'tpa_branch_id' => $data['tpa_branch_id'],
|
|
'policy_start_date' => $data['policy_start_date'],
|
|
'policy_end_date' => $data['policy_end_date'],
|
|
'policy_status' => 1,
|
|
];
|
|
|
|
$terms = $this->preparePolicyTermsFromRFQ($data);
|
|
|
|
$policy_type_id = $data['policy_type_id'];
|
|
if (in_array($policy_type_id, [1, 2, 6, 7])) {
|
|
$client_policy_data['is_addon'] = 1; // Base Policy
|
|
} elseif (in_array($policy_type_id, [4, 5])) {
|
|
$client_policy_data['is_addon'] = 2; // SI TOPUP
|
|
} elseif ($policy_type_id == 3) {
|
|
// if ($base_policy) {
|
|
// $data['is_addon'] = 3; // Dependent Addon
|
|
// } else {
|
|
$data['is_addon'] = 1;
|
|
// }
|
|
}
|
|
|
|
$client_policy_data['policy_terms'] = $this->preparePolicyTermsFromRFQ($data);
|
|
|
|
// print_r($client_policy_data); die;
|
|
|
|
return $client_policy_data;
|
|
}
|
|
|
|
private function preparePolicyTermsFromRFQ($data)
|
|
{
|
|
$proposel_data = json_decode($data['proposel_data'], true);
|
|
|
|
$QCRData = $this->RFQModel->where('is_active', 1)->where('type', 2)->where('lead_id', $data['id'])->first();
|
|
|
|
$JSON = json_decode($QCRData['json'], true);
|
|
|
|
$converted_json = $this->transformProposelData($JSON, $proposel_data['proposel_name'], $proposel_data['insurer_name']);
|
|
|
|
return $this->convertQCRJsonToPolicyTerms($converted_json, $data['policy_type_id'], $proposel_data['proposel_name'], $proposel_data['insurer_name']);
|
|
}
|
|
|
|
private function convertQCRJsonToPolicyTerms($data, $policy_type, $proposel_name, $insurer_name)
|
|
{
|
|
$GMC_Keys = [
|
|
"sum_insured", "family_floater", "family_floaters", "age_ratio", "waiverofpreexistingdiseases",
|
|
"maternitycoverage", "twindelivery", "preandpostnatal", "babyday1cover", "9monthwaitingperiodwaived",
|
|
"coverfromthedateofjoining", "waiverof1,2,3&4thyearexclusions", "waiverof30dayswaitingperiod",
|
|
"prehospitalizationcover", "congenitaldiseasesinternal", "copayzonewisecopay",
|
|
"bioabsorbablestenttoriclensmultifocallens", "roomrentlimit", "proportionatedeductionclause",
|
|
"ailmentcapping", "ambulancecharges", "airambulance", "familytransportationbenefit",
|
|
"reasonableandcustomarycharges", "ayudhtreatmentcover", "congenitaldiseasesexternal",
|
|
"optionalparentalcopay", "posthospitalizationcover", "corporatebuffer", "sublimitofcorporatebuffer",
|
|
"ayushTreatmentCoverData", "armdcovered", "suminsuredenhancement", "automaticsuminsuredreinstatement",
|
|
"additionalsicknessbenefit", "lasiksurgery", "midterminclusion", "capd", "organdonorexpenses",
|
|
"moderntreatmentsasperirdai", "Wellness", "days_of_discharge", "days_from_dod",
|
|
"special_condition_label", "special_condition_input", "multiple_sum_insured",
|
|
"cataract", "cataractData"
|
|
];
|
|
|
|
$GPA_Keys = [
|
|
"sumInsured2", "totalSumInsured", "age_ratio", "accidentalDeathBenefit", "permanentTotalDisablement",
|
|
"permanentPartialDisablement", "temporaryTotalDisablementBenefit", "accidentalHospitalizationExpenses",
|
|
"childrenEducationWelfareFund", "compassionateVisitExpenses", "compassionateVisitExpensesData",
|
|
"brokenBoneExpenses", "brokenBoneExpensesData", "ambulanceCharges", "ambulanceChargesData",
|
|
"burnExpenses", "burnExpensesData", "carriageOfDeadBody", "carriageOfDeadBodyData",
|
|
"animalSnakeInsectBite", "terrorism", "worldwideCover", "gpa_special_condition_label",
|
|
"gpa_special_condition_input", "multiple_sum_insured"
|
|
];
|
|
|
|
// Select keys based on policy type
|
|
$termsKey = $policy_type == 1 ? $GPA_Keys : $GMC_Keys;
|
|
|
|
// Initialize terms_array with default empty values
|
|
$terms_array = array_fill_keys($termsKey, "");
|
|
$specialKeys = ['special_condition_label', 'special_condition_input', 'gpa_special_condition_label', 'gpa_special_condition_input', 'multiple_sum_insured'];
|
|
foreach ($specialKeys as $key) {
|
|
$terms_array[$key] = [];
|
|
}
|
|
|
|
// Initialize age_ratio based on policy type
|
|
$terms_array['age_ratio'] = $policy_type == 2 ? [
|
|
"self" => ["min" => "18", "max" => "60"],
|
|
"spouse" => ["min" => 0, "max" => 0],
|
|
"child" => ["min" => 0, "max" => "25"],
|
|
"elders" => ["min" => 0, "max" => 0],
|
|
] : ["self" => ["min" => "18", "max" => "60"]];
|
|
|
|
foreach ($data['table_data']['data'] as $dataRow) {
|
|
|
|
$item = $dataRow['items'] ?? '';
|
|
|
|
foreach ($dataRow['data'] as $cellData) {
|
|
$parentth = $cellData['parentth'] ?? '';
|
|
$subth = $cellData['subth'] ?? '';
|
|
$input_value = $cellData['input_value'] ?? '';
|
|
$value = $cellData['value'] ?? '';
|
|
|
|
// Skip unwanted keys
|
|
if (in_array($parentth, ['Sno', 'Item Key', 'Particulars', 'Action']) ||
|
|
in_array($subth, ['Quote Asked'])) {
|
|
continue;
|
|
}
|
|
|
|
// Handle special conditions
|
|
if (str_starts_with($item, "special_condition") && $parentth === $proposel_name && $subth === $insurer_name) {
|
|
|
|
$parts = explode("-", $input_value);
|
|
$question = $parts[0] ?? '';
|
|
$answer = $parts[1] ?? '';
|
|
$labelKey = $policy_type == 1 ? 'gpa_special_condition_label' : 'special_condition_label';
|
|
$inputKey = $policy_type == 1 ? 'gpa_special_condition_input' : 'special_condition_input';
|
|
|
|
$terms_array[$labelKey][] = $question;
|
|
$terms_array[$inputKey][] = $answer;
|
|
continue;
|
|
}
|
|
|
|
// Handle sum insured
|
|
if (in_array($item, ['sum_insured', 'sumInsured2'])) {
|
|
$si_amt = explode(",", $value);
|
|
$terms_array[$item] = $si_amt[0] ?? "";
|
|
$terms_array['multiple_sum_insured'] = array_slice($si_amt, 1);
|
|
continue;
|
|
}
|
|
|
|
// Handle family floaters
|
|
if ($item === 'family_composition') {
|
|
$terms_array['family_floaters'] = isJsonString($input_value) ? json_decode($input_value, true) : $input_value;
|
|
continue;
|
|
}
|
|
|
|
// Decode JSON if valid
|
|
$terms_array[$item] = isJsonString($input_value) ?
|
|
(json_decode($input_value, true)['key'] ?? '') :
|
|
$input_value;
|
|
}
|
|
}
|
|
|
|
return json_encode($terms_array);
|
|
}
|
|
|
|
public function featchClientPolicyFromLead($client_id, $branch_id, $lead_id)
|
|
{
|
|
$data = $this->leadsModel->where('leads.id', $lead_id)->where('leads.is_active', 1)->first();
|
|
|
|
if (!$data) {
|
|
return $this->respond(['status' => false, 'message' => 'Failed to create policy', 'data' => null], 200);
|
|
}
|
|
|
|
$result = $this->createClientPolicyWithLeadData($data, $client_id, $branch_id);
|
|
// print_r($result); die;
|
|
|
|
if ($result) {
|
|
|
|
$policy_data = $this->clientPolicyModel->where('id', $result)->where('is_active', 1)->first();
|
|
return $this->respond(['status' => true, 'message' => 'New Policy created successfully', 'client_policy_id' => $result, 'data' => $data, 'client_id' => $policy_data['client_id']], 200);
|
|
}
|
|
|
|
return $this->respond(['status' => false, 'message' => 'Failed to create policy', 'data' => $data], 200);
|
|
|
|
}
|
|
|
|
} |