570 lines
21 KiB
PHP
570 lines
21 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers;
|
|
|
|
use CodeIgniter\API\ResponseTrait;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
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;
|
|
|
|
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)
|
|
{
|
|
$processedData = [];
|
|
foreach($data['policy_type_id'] as $index => $value){
|
|
|
|
// Separate the insurer and insurer branch
|
|
list($insurer_branch_id, $insurer_id) = explode('-',$data['insurer'][$index]);
|
|
// Separate the tpa and tpa branch
|
|
list($tpa_branch_id, $tpa_id) = explode('-',$data['tpa'][$index]);
|
|
|
|
// 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'],
|
|
'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('policy_type.question_json')
|
|
->join('policy_type', 'leads.policy_type_id = policy_type.id')
|
|
->where('leads.id', $id)
|
|
->first();
|
|
|
|
$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();
|
|
|
|
|
|
// 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' => 'New 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' => 'New 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){
|
|
|
|
if($export_type == 'mail'){
|
|
$this-> exportMailForQCRandRFQ($lead_id, $type);
|
|
}else{
|
|
$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.";
|
|
}
|
|
}
|
|
|
|
//FOR MAIL
|
|
public function exportMailForQCRandRFQ($lead_id, $type){
|
|
|
|
$filepath = $this->constructExcelToSaveTemp($lead_id, $type);
|
|
|
|
if ($filepath) {
|
|
return $this->respond(['status' => true, 'file_path' => $filepath, 'message' => 'Mail send successfully'], 200);
|
|
}
|
|
|
|
return $this->respond(['status' => false, 'file_path' => $filepath, 'message' => "Mail send failed"], 200);
|
|
}
|
|
|
|
//Construct excel file and save the file to the folder and return file path
|
|
public function constructExcelToSaveTemp($lead_id, $type)
|
|
{
|
|
$rfq_data = $this->RFQModel
|
|
->select('
|
|
leads.client_name,
|
|
leads.client_short_name,
|
|
insurers.name as insurer_name,
|
|
insurer_branch.branch_name as insurer_branch_name,
|
|
tpa.name as tpa_name,
|
|
tpa_branch.branch_name as tpa_branch_name,
|
|
policy_type.policy_type,
|
|
rfq.json
|
|
')
|
|
->join('leads', 'rfq.lead_id = leads.id')
|
|
->join('policy_type', 'leads.policy_type_id = policy_type.id')
|
|
->join('insurers', 'leads.insurer_id = insurers.id')
|
|
->join('insurer_branch', 'leads.insurer_branch_id = insurer_branch.id')
|
|
->join('tpa', 'leads.tpa_id = tpa.id')
|
|
->join('tpa_branch', 'leads.tpa_branch_id = tpa_branch.id')
|
|
->where('rfq.lead_id', $lead_id)
|
|
->where('rfq.type', $type)
|
|
->where('rfq.is_active', 1)
|
|
->first();
|
|
|
|
$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'],
|
|
];
|
|
|
|
$jsonData = $rfq_data['json'];
|
|
$data = json_decode($jsonData, true);
|
|
|
|
// Initialize PhpSpreadsheet
|
|
$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);
|
|
|
|
// Apply bold style to the key
|
|
$sheet->getStyle("A{$rowNumber}")->applyFromArray([
|
|
'font' => [
|
|
'bold' => true,
|
|
],
|
|
]);
|
|
|
|
$rowNumber++;
|
|
}
|
|
|
|
// Leave two blank rows
|
|
$rowNumber += 2;
|
|
|
|
// Set headers and subheaders starting from current row
|
|
$headers = $data['table_data']['headers'];
|
|
$subHeaderRow = $rowNumber + 1;
|
|
$columnLetter = 'A';
|
|
|
|
// Add headers in the first row and subheaders in the second row
|
|
foreach ($headers as $header) {
|
|
if ($header['parentHeader'] === 'Item Key' || $header['parentHeader'] == 'Action') {
|
|
continue; // Skip "Item Key" and "Action" columns
|
|
}
|
|
|
|
if($header['parentHeader'] === 'Sno'){
|
|
$header['parentHeader'] = 'S.No.';
|
|
}
|
|
|
|
$sheet->setCellValue("{$columnLetter}{$rowNumber}", $header['parentHeader']);
|
|
|
|
// Apply bold style to the header
|
|
$sheet->getStyle("{$columnLetter}{$rowNumber}")->applyFromArray([
|
|
'font' => [
|
|
'bold' => true,
|
|
],
|
|
]);
|
|
|
|
foreach ($header['subHeaders'] as $subHeader) {
|
|
$sheet->setCellValue("{$columnLetter}{$subHeaderRow}", $subHeader);
|
|
|
|
// Apply bold style to the subheader
|
|
$sheet->getStyle("{$columnLetter}{$subHeaderRow}")->applyFromArray([
|
|
'font' => [
|
|
'bold' => true,
|
|
],
|
|
]);
|
|
|
|
$columnLetter++;
|
|
}
|
|
}
|
|
|
|
// Move to next row for data entries
|
|
$rowNumber = $subHeaderRow + 1;
|
|
|
|
// Add data rows
|
|
foreach ($data['table_data']['data'] as $dataRow) {
|
|
$columnLetter = 'A';
|
|
foreach ($dataRow['data'] as $cellData) {
|
|
if ($cellData['parentth'] === 'Item Key' || $cellData['parentth'] == 'Action') {
|
|
continue; // Skip "Item Key" data
|
|
}
|
|
$sheet->setCellValue("{$columnLetter}{$rowNumber}", $cellData['value']);
|
|
$columnLetter++;
|
|
}
|
|
$rowNumber++;
|
|
}
|
|
|
|
// Set filename based on type
|
|
$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,
|
|
]; // Return file path and file name
|
|
}
|
|
|
|
}
|