GWM : App signature

This commit is contained in:
Gowtham M 2025-12-02 18:18:27 +05:30
commit 44ab2aa76f
120 changed files with 11292 additions and 1370 deletions

View File

@ -53,11 +53,13 @@ class Filters extends BaseConfig
public array $globals = [
'before' => [
'HttpRequestLog' => ['except' => 'cli/*'],
'Cors',
// 'csrf',
// 'invalidchars',
],
'after' => [
'CloseDbConnection'
'CloseDbConnection',
'Cors',
// 'secureheaders',
],
];

View File

@ -3,6 +3,13 @@
use CodeIgniter\Router\RouteCollection;
// Allow OPTIONS for all routes
$routes->options('(:any)', function() {
// This will never be called because the CORS filter returns early
// But having this route ensures OPTIONS isn't rejected as 404
});
/**
* @var RouteCollection $routes
*/
@ -12,6 +19,8 @@ $routes->get('/chatbottest', 'ChatbotControllerNew::chatbotest');
$routes->get('/chatbot', 'ChatbotControllerNew::chatbot');
$routes->get('/swagger', 'SwaggerController::index', ['filter' => 'authMVC']);
$routes->get('/fedeploy', 'DeployController::fedeploy_view', ['filter' => 'authMVC']);
$routes->post('/fedeploy', 'DeployController::fedeploy', ['filter' => 'authMVC']);
// Reminder Mail Notification
@ -480,7 +489,6 @@ $routes->group("rfq", ["filter" => "authMVC"], function ($routes) {
$routes->get("driveListFiles", "GoogleDriveController::listFiles");
$routes->post('dmsSearch', 'PolicyTransactionController::dmsSearch', ['filter' => 'authMVC']);
$routes->get('dmsSearch', 'PolicyTransactionController::dmsSearch', ['filter' => 'authMVC']);
$routes->get('payouts', 'PolicyTransactionController::payouts', ['filter' => 'authMVC']);
$routes->get('downloadGdriveFile', 'GoogleDriveController::downloadGdriveFile', ['filter' => 'authMVC']);
$routes->get('cli/sendZeptoMail', 'MasterController::testZeptoSMTP');
@ -776,6 +784,14 @@ $routes->group('payout', function($routes) {
$routes->post('fetchUtrDetails',"PayoutController::fetchUtrDetails");
$routes->post('saveUtrDetails',"PayoutController::saveUtrDetails");
$routes->post('removeUtrDetails',"PayoutController::removeUtrDetails");
// invoice policy mapping
$routes->get('invoices', 'PayoutController::invoices');
$routes->post('invoices/save', 'PayoutController::saveInvoice');
$routes->get('invoices/history', 'PayoutController::auditHistory');
$routes->get('invoices/preview', 'PayoutController::preview');
$routes->get('invoices/downloadPdf/(:any)', 'PayoutController::downloadPdf/$1');
$routes->get('invoice/generate-number/(:num)', 'PayoutController::generateInvoiceNumberAjax/$1');
});
//PARTNER COMMISSION
@ -786,5 +802,17 @@ $routes->group('commission', function($routes) {
$routes->get('downloadErrorFile',"RuleImportController::downloadErrorFile");
$routes->get("deleteCommissionData/(:any)", "RuleImportController::deleteCommissionData/$1");
$routes->get('checkSameEntry',"RuleImportController::checkSameEntry");
$routes->get('rules/list/(:any)',"RuleImportController::ruleList/$1");
$routes->post('rules/save/',"RuleImportController::saveRule");
$routes->post('rules/remove/',"RuleImportController::removeRule");
$routes->get('checkRuleUsage',"RuleImportController::checkRuleUsage");
});
//BDS BULK UPLOAD
$routes->group('bds_upload', function($routes) {
$routes->match (['get','post'],'list',"PolicyTransactionController::policyBulkUpload");
$routes->get('downloadBDSDumpFile/(:any)',"PolicyTransactionController::downloadBDSDumpFile/$1");
$routes->get('getBdsDumpFileErrorData',"PolicyTransactionController::getBdsDumpFileErrorData");
$routes->get('getBdsDumpExcelFileErrors/(:any)',"PolicyTransactionController::getBdsDumpExcelFileErrors/$1");
});

View File

@ -5065,25 +5065,60 @@ class ClientController extends AdminController
public function get_client_policy_data_using_policy_no()
{
$received_data = $this->request->getGet();
$policy_no = $this->request->getGet('policy_no');
$client_id = $this->request->getGet('client_id');
$client_branch_id = $this->request->getGet('client_branch_id');
$policy_type_id = $this->request->getGet('policy_type_id');
$client_type = $this->request->getGet('client_type');
$received_data = $this->request->getGet();
$policy_no = trim($this->request->getGet('policy_no'));
$client_id = $this->request->getGet('client_id') ?? null;
$client_branch_id = $this->request->getGet('client_branch_id') ?? null;
$policy_type_id = $this->request->getGet('policy_type_id') ?? null;
$client_type = $this->request->getGet('client_type') ?? null;
$data = $this->policyTransactionModel
// Check in Policy Transaction (BDS)
$bds_count = $this->policyTransactionModel
->where('is_active', 1)
->where('action_type', 'inception')
->where('policy_no', $policy_no)
->where('TRIM(policy_no)', $policy_no)
->where('policy_no IS NOT NULL AND policy_no <> ""')
->countAllResults();
$client_policy_data = $this->clientPolicyModel->where('is_active', 1)->where('policy_status', 1)->where('policy_no', trim($policy_no))->first();
// Check in Enrollment (client_policy)
$client_policy_data = $this->clientPolicyModel
->where('is_active', 1)
->where('policy_status', 1)
->where('TRIM(policy_no)', $policy_no)
->first();
// Decide message + count
if ($bds_count > 0) {
return $this->respond([
'status' => true,
'message' => "This policy number is already linked to another policy in the BDS",
'code' => 409,
'data' => $bds_count,
'received_data' => $received_data,
'client_policy_id' => $client_policy_data['id'] ?? null
], 200);
} elseif (!empty($client_policy_data)) {
return $this->respond([
'status' => true,
'message' => "This policy number is already linked to another policy in the Enrollment",
'code' => 409,
'data' => 1,
'received_data' => $received_data,
'client_policy_id' => $client_policy_data['id']
], 200);
if ($data > 0) {
return $this->respond(['status' => true, 'message' => 'This policy number is already linked to another client', 'data' => $data, 'code' => 409, 'received_data' => $received_data, 'client_policy_id' => $client_policy_data['id'] ?? null], 200);
} else {
return $this->respond(['status' => false, 'message' => 'No Data Found', 'code' => 404, 'received_data' => $received_data, 'client_policy_id' => $client_policy_data['id'] ?? null], 200);
return $this->respond([
'status' => false,
'message' => 'No Data Found',
'code' => 404,
'received_data' => $received_data,
'client_policy_id' => null
], 200);
}
}
@ -5652,11 +5687,9 @@ class ClientController extends AdminController
public function sendextraparam()
{
// $data = db_connect()->table('jobs')->where('id', 1677)->get()->getRowArray();
// // dd($data);
// $return = db_connect()->table('jobs')->where('id', 1677)->get()->getRowArray();
// $return = $this->updatePolicyTransactionDataWhileClinetPolicyUpdate(json_decode($data['payload'], true));
// dd($return);
// die;
// $ticket_id = 515;
// $apiServiceController = new ApiServiceController();
@ -5680,7 +5713,9 @@ class ClientController extends AdminController
// $response = $ticketServiceController->extractExcelData("claims_dump_form_client.xlsx");
// dd($response);
// $TicketController = new TicketController();
// ---------- TICKET SERVICE CONTROLLER --------------------------------------------------------------------------------
$TicketController = new TicketController();
// $response = $TicketController->getMoreInfo($requestFrom = 'rest', $ticket_id = 70);
// dd($response);
@ -5689,7 +5724,8 @@ class ClientController extends AdminController
$empServiceController = new EmployeeServiceController();
// $res = $empServiceController->excelFileFormatValidation(['file_id' => '1126']);
// $res = $empServiceController->excelFileDataValidation(['file_id' => '865']);
// $res = $empServiceController->employeesOnboardPreprocess(['file_id' => 726]);
// $res = $empServiceController->employeesOnboardPreprocess(['file_id' => 1183]);
// $res = $empServiceController->employeesOnboardPreprocess(['file_id' => 1169]);
// $res = $empServiceController->employeesOnboardProcess(['file_id' => 835]);
// $res = $empServiceController->employeesEnrollmentInsert(['file_id' => 836]);
// $res = $empServiceController->employeesSIEnhanceProcess(['file_id' => '1131']);
@ -5698,13 +5734,13 @@ class ClientController extends AdminController
// $res = $empServiceController->compareMemberDataAndInceptionData(['file_id' => '1126']);
// dd($res);
// ---------- EMP MULTI EVENT SERVICE CONTROLLER --------------------------------------------------------------------------------
$EmployeeMultiEventServiceController = new EmployeeMultiEventServiceController();
// $res = $EmployeeMultiEventServiceController->constructMultiEventData(['file_id' => '1069']);
// $res = $EmployeeMultiEventServiceController->excelMultieventFileFormateValidation(['file_id' => '2373']);
// $res = $EmployeeMultiEventServiceController->excelMultieventFileDataValidation(['file_id' => '2373']);
// $res = $EmployeeMultiEventServiceController->excelMultieventFileOnBoard(['file_id' => '1069']);
// dd($res);
// $res = $EmployeeMultiEventServiceController->getExcelErrorData(1069, $res);
// $res['file_id'] = 1069;
// echo view('excel_errors', $res);
@ -6033,8 +6069,8 @@ class ClientController extends AdminController
->where('employees.is_active', 1)
->where('employees.relationship', "Self")
->where('employee_polices.is_active', 1)
->whereIn('employees.emp_status', ['active'])
->whereIn('employee_polices.status', ['active'])
->whereIn('employees.emp_status', ['active', 'expired'])
->whereIn('employee_polices.status', ['active', 'expired'])
->where('employees.is_active', 1)
->where('client_policy.id', $param)
->groupBy('employees.emp_code')
@ -6147,10 +6183,10 @@ class ClientController extends AdminController
->where('insurers.is_active', 1)
->where('tpa.is_active', 1)
->where('employees.is_active', 1)
->where('employees.emp_status', "active")
->whereIn('employees.emp_status', ['active', 'expired'])
->where('employees.relationship', "Self")
->where('employee_polices.is_active', 1)
->where('employee_polices.status', "active")
->whereIn('employee_polices.status', ['active', 'expired'])
->where($field_name, $param);
if (!empty($client_id)) {

View File

@ -0,0 +1,286 @@
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use CodeIgniter\API\ResponseTrait;
class DeployController extends AdminController
{
use ResponseTrait;
protected $myLogger;
public function __construct()
{
$this->myLogger = \Config\Services::mylogger();
}
// public function fedeploy()
// {
// $request = $this->request;
// // Multiple zip files: <input type="file" name="zip_files[]" multiple>
// // $zipFiles = $this->request->getFileMultiple('zip_files');
// $zipFiles = $this->request->getFile('zip_files');//('zip_files');
// // print_r($zipFiles);die();
// // Matching dropdown/text values (arrays, indexed same as zip_files[])
// $zipFolders = (array) $request->getPost('zip_folder'); // e.g. ["web/", "dist/"]
// $s3Buckets = (array) $request->getPost('s3_bucket'); // e.g. ["benefits-app-bucket", ...]
// $s3Prefixes = (array) $request->getPost('s3_prefix'); // e.g. ["hr/", "payroll/"]
// $cfDistributions = (array) $request->getPost('cf_distribution_id'); // e.g. ["DIST1", "DIST1", "DIST2"]
// $cfPathsList = (array) $request->getPost('cf_paths'); // e.g. ["/hr/*", "/hr/special/*", "/payroll/*"]
// // Path to Python interpreter and deploy_assets.py script
// $pythonBin = getenv('PY_PATH'); // adjust if needed
// $scriptPath = getenv('PY_SCRIPT_PATH'); // full path to your script
// $results = [];
// if (empty($zipFiles)) {
// return $this->response->setJSON([
// 'status' => 'error',
// 'message' => 'No zip files uploaded',
// ]);
// }
// // --------------------------------------------------------
// // 1) Pre-process distribution IDs → group by distribution
// // - So we can run ONE invalidation per distribution
// // - And merge all paths into a single JSON array
// // --------------------------------------------------------
// $distGroups = []; // [distId => ['indexes' => [...], 'paths' => [...], 'firstIndex' => int]]
// foreach ($cfDistributions as $i => $distId) {
// $distId = trim((string) $distId);
// $path = trim((string) ($cfPathsList[$i] ?? ''));
// // Only consider entries where both distribution ID and path are set
// if ($distId === '' || $path === '') {
// continue;
// }
// if (!isset($distGroups[$distId])) {
// $distGroups[$distId] = [
// 'indexes' => [],
// 'paths' => [],
// ];
// }
// $distGroups[$distId]['indexes'][] = $i;
// $distGroups[$distId]['paths'][] = $path;
// }
// // Set firstIndex and unique paths per distribution
// foreach ($distGroups as $distId => $info) {
// $distGroups[$distId]['firstIndex'] = $info['indexes'][0]; // first file index for this dist
// $distGroups[$distId]['paths'] = array_values(array_unique($info['paths'])); // unique paths
// }
// // --------------------------------------------------------
// // 2) Process each uploaded file
// // --------------------------------------------------------
// foreach ($zipFiles as $index => $file) {
// if (!$file->isValid() || $file->hasMoved()) {
// $results[] = [
// 'file' => $file->getName(),
// 'status' => 'error',
// 'message' => 'Invalid file or already moved.',
// ];
// continue;
// }
// // Read matching form values (or fallback)
// $zipFolder = $zipFolders[$index] ?? 'web/'; // default example
// $s3Bucket = $s3Buckets[$index] ?? '';
// $s3Prefix = $s3Prefixes[$index] ?? '';
// $cfDistribution = $cfDistributions[$index] ?? '';
// $cfDistribution = trim((string) $cfDistribution);
// // Move file into a known directory (keep original name)
// // $uploadDir = WRITEPATH . 'uploads/deploy';
// $uploadDir = '/home/ubuntu/py';
// if (!is_dir($uploadDir)) {
// mkdir($uploadDir, 0775, true);
// }
// $originalName = $file->getName();
// $file->move($uploadDir, $originalName);
// $zipPath = $uploadDir . DIRECTORY_SEPARATOR . $originalName;
// // --------------------------------------------------------
// // Decide whether THIS file should trigger invalidation
// // - Only firstIndex of each distribution will do it
// // - cf-paths-json = JSON array of all unique paths for that dist
// // --------------------------------------------------------
// $doInvalidation = false;
// $cfPathsJson = '';
// if ($cfDistribution !== '' && isset($distGroups[$cfDistribution])) {
// $group = $distGroups[$cfDistribution];
// if ($group['firstIndex'] === $index) {
// // This is the first file for this distribution ID → do invalidation ONCE
// $doInvalidation = true;
// // Build CloudFront paths JSON array (AWS syntax: ["path1", "path2", ...])
// $cfPathsJson = json_encode($group['paths']); // e.g. ["\/hr\/*","\/hr\/special\/*"]
// }
// // Else: same distribution ID but NOT first index → no invalidation
// }
// // --------------------------------------------------------
// // Build the python command safely using escapeshellarg
// // --------------------------------------------------------
// $cmdParts = [
// escapeshellarg($pythonBin),
// escapeshellarg($scriptPath),
// '--zip-path', escapeshellarg($zipPath),
// '--zip-folder', escapeshellarg($zipFolder),
// '--s3-bucket', escapeshellarg($s3Bucket),
// '--s3-prefix', escapeshellarg($s3Prefix),
// '--do-webhook', // always send webhook after success
// ];
// if ($doInvalidation) {
// $cmdParts[] = '--do-invalidation';
// $cmdParts[] = '--cf-distribution-id';
// $cmdParts[] = escapeshellarg($cfDistribution);
// $cmdParts[] = '--cf-paths-json';
// $cmdParts[] = escapeshellarg($cfPathsJson); // e.g. '["/hr/*","/hr/special/*"]'
// }
// // Final command string (2>&1 to capture stderr too)
// $cmd = implode(' ', $cmdParts) . ' 2>&1';
// print_r($cmd);die();
// $output = [];
// $returnVar = 0;
// exec($cmd, $output, $returnVar);
// $results[] = [
// 'file' => $originalName,
// 'zip_path' => $zipPath,
// 'command' => $cmd,
// 'output' => $output,
// 'exit_code' => $returnVar,
// 'status' => $returnVar === 0 ? 'success' : 'error',
// ];
// }
// return $this->response->setJSON([
// 'status' => 'completed',
// 'results' => $results,
// ]);
// }
public function fedeploy()
{
$request = $this->request;
// Single zip file: <input type="file" name="zip_file">
$file = $request->getFile('zip_file');
if (!$file || !$file->isValid()) {
return $this->response->setJSON([
'status' => 'error',
'message' => 'No valid zip file uploaded',
]);
}
// Read scalar form values
$zipFolder = (string) $request->getPost('zip_folder') ?: 'web/';
$s3Bucket = (string) $request->getPost('s3_bucket') ?: '';
$s3Prefix = (string) $request->getPost('s3_prefix') ?: '';
$cfDistribution = trim((string) $request->getPost('cf_distribution_id'));
$cfPathsRaw = (string) $request->getPost('cf_paths');
// Python interpreter and script path from env
$pythonBin = getenv('PY_PATH'); // e.g. /usr/bin/python3
$scriptPath = getenv('PY_SCRIPT_PATH'); // e.g. /home/ubuntu/deploy_assets.py
if (empty($pythonBin) || empty($scriptPath)) {
return $this->response->setJSON([
'status' => 'error',
'message' => 'Python path or script path not configured in environment.',
]);
}
// Move file into known directory (keep original name)
$uploadDir = '~/py';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0775, true);
}
$originalName = $file->getName();
$file->move($uploadDir, $originalName);
$zipPath = $uploadDir . DIRECTORY_SEPARATOR . $originalName;
// -----------------------------
// CloudFront invalidation data
// -----------------------------
$doInvalidation = false;
$cfPathsJson = '';
// Allow comma or newline separated paths: "/hr/*,/hr/special/*" or
// "/hr/*\n/hr/special/*"
$paths = array_filter(
array_map('trim', preg_split('/[\r\n,]+/', $cfPathsRaw)),
'strlen'
);
if ($cfDistribution !== '' && !empty($paths)) {
$doInvalidation = true;
$cfPathsJson = json_encode($paths); // e.g. ["\/hr\/*","\/hr\/special\/*"]
}
// -----------------------------
// Build python command
// -----------------------------
$cmdParts = [
escapeshellarg($pythonBin),
escapeshellarg($scriptPath),
'--zip-path', escapeshellarg($zipPath),
'--zip-folder', escapeshellarg($zipFolder),
'--s3-bucket', escapeshellarg($s3Bucket),
'--s3-prefix', escapeshellarg($s3Prefix),
'--do-webhook', // always send webhook after success
];
if ($doInvalidation) {
$cmdParts[] = '--do-invalidation';
$cmdParts[] = '--cf-distribution-id';
$cmdParts[] = escapeshellarg($cfDistribution);
$cmdParts[] = '--cf-paths-json';
$cmdParts[] = escapeshellarg($cfPathsJson);
}
// Final command string (2>&1 to capture stderr too)
$cmd = implode(' ', $cmdParts) . ' 2>&1';
$output = [];
$returnVar = 0;
print_r($cmd);die();
exec($cmd, $output, $returnVar);
$result = [
'file' => $originalName,
'zip_path' => $zipPath,
'command' => $cmd,
'output' => $output,
'exit_code' => $returnVar,
'status' => $returnVar === 0 ? 'success' : 'error',
];
return $this->response->setJSON([
'status' => 'completed',
'result' => $result,
]);
}
public function fedeploy_view()
{
// $this->load->view('fedeploy');
$this->loadLayout('fedeploy');
}
}

View File

@ -43,6 +43,7 @@ use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Reader\Exception as SpreadsheetReaderException;
use PhpParser\Node\Expr\Cast\Double;
use Kint\Kint;
use PhpParser\Node\Stmt\TraitUseAdaptation;
use function PHPUnit\Framework\returnSelf;
@ -2179,18 +2180,18 @@ class EmpDataServiceController extends BaseController
'user_id' => $user_id,
]]);
// $r = Jobs::addJob(['job_name' => 'makeEntryForBDSPolicyTransaction', 'payload' => [
// 'client_policy_id' => $client_policy_id ?? null,
// 'endorsement_no' => $endorsement_id ?? null,
// 'emp_count' => $emp_count ?? null,
// 'action_type' => $file['event_type'] ?? null,
// 'no_of_insured' => count($no_of_insured ?? []) ?? null,
// 'no_of_dependent' => count($no_of_dependent ?? []) ?? null,
// 'base_premium' => $base_bremium_and_gst['base_premium'] ?? null,
// 'gst' => $base_bremium_and_gst['gst'] ?? null,
// 'policy_issue_date' => $policy_issue_date ?? null,
// 'created_by' => $file['created_by'] ?? null,
// ]]);
$r = Jobs::addJob(['job_name' => 'makeEntryForBDSPolicyTransaction', 'payload' => [
'client_policy_id' => $client_policy_id ?? null,
'endorsement_no' => $endorsement_id ?? null,
'emp_count' => $emp_count ?? null,
'action_type' => $file['event_type'] ?? null,
'no_of_insured' => count($no_of_insured ?? []) ?? null,
'no_of_dependent' => count($no_of_dependent ?? []) ?? null,
'base_premium' => $base_bremium_and_gst['base_premium'] ?? null,
'gst' => $base_bremium_and_gst['gst'] ?? null,
'policy_issue_date' => $policy_issue_date ?? null,
'created_by' => $file['created_by'] ?? null,
]]);
// $this->cashDepositCalculationForInception($depositeData);
// $this->sendMailForDownloadingECard($emp_policy_ids);
@ -2620,14 +2621,14 @@ class EmpDataServiceController extends BaseController
$file_data = $this->getDataByFileId($file_id, 'success');
$this->setPullNotification($file_data);
// $r = Jobs::addJob(['job_name' => 'makeEntryForBDSPolicyTransaction', 'payload' => [
// 'client_policy_id' => $client_policy_id ?? null,
// 'endorsement_no' => $endorsement_id[0] ?? null,
// 'emp_count' => $emp_count ?? null,
// 'action_type' => $file['event_type'] ?? null,
// 'policy_issue_date' => $policy_issue_date ?? null,
// 'created_by' => $file['created_by'] ?? null,
// ]]);
$r = Jobs::addJob(['job_name' => 'makeEntryForBDSPolicyTransaction', 'payload' => [
'client_policy_id' => $client_policy_id ?? null,
'endorsement_no' => $endorsement_id[0] ?? null,
'emp_count' => $emp_count ?? null,
'action_type' => $file['event_type'] ?? null,
'policy_issue_date' => $policy_issue_date ?? null,
'created_by' => $file['created_by'] ?? null,
]]);
//import file to upload Google Drive
@ -3354,18 +3355,18 @@ class EmpDataServiceController extends BaseController
'user_id' => $user_id,
]]);
// $r = Jobs::addJob(['job_name' => 'makeEntryForBDSPolicyTransaction', 'payload' => [
// 'client_policy_id' => $client_policy_id ?? null,
// 'endorsement_no' => $endorsement_id ?? null,
// 'emp_count' => $emp_count ?? null,
// 'action_type' => $file['event_type'] ?? null,
// 'no_of_insured' => count($no_of_insured ?? []) ?? null,
// 'no_of_dependent' => count($no_of_dependent ?? []) ?? null,
// 'base_premium' => $base_bremium_and_gst['base_premium'] ?? null,
// 'gst' => $base_bremium_and_gst['gst'] ?? null,
// 'policy_issue_date' => $policy_issue_date ?? null,
// 'created_by' => $file['created_by'] ?? null,
// ]]);
$r = Jobs::addJob(['job_name' => 'makeEntryForBDSPolicyTransaction', 'payload' => [
'client_policy_id' => $client_policy_id ?? null,
'endorsement_no' => $endorsement_id ?? null,
'emp_count' => $emp_count ?? null,
'action_type' => $file['event_type'] ?? null,
'no_of_insured' => count($no_of_insured ?? []) ?? null,
'no_of_dependent' => count($no_of_dependent ?? []) ?? null,
'base_premium' => $base_bremium_and_gst['base_premium'] ?? null,
'gst' => $base_bremium_and_gst['gst'] ?? null,
'policy_issue_date' => $policy_issue_date ?? null,
'created_by' => $file['created_by'] ?? null,
]]);
}
@ -3865,18 +3866,18 @@ class EmpDataServiceController extends BaseController
'user_id' => $user_id,
]]);
// $r = Jobs::addJob(['job_name' => 'makeEntryForBDSPolicyTransaction', 'payload' => [
// 'client_policy_id' => $client_policy_id ?? null,
// 'endorsement_no' => $endorsement_id ?? null,
// 'emp_count' => $emp_count ?? null,
// 'action_type' => $file['event_type'] ?? null,
// 'no_of_insured' => count($no_of_insured ?? []) ?? null,
// 'no_of_dependent' => count($no_of_dependent ?? []) ?? null,
// 'base_premium' => $base_bremium_and_gst['base_premium'] ?? null,
// 'gst' => $base_bremium_and_gst['gst'] ?? null,
// 'policy_issue_date' => $policy_issue_date ?? null,
// 'created_by' => $file['created_by'] ?? null,
// ]]);
$r = Jobs::addJob(['job_name' => 'makeEntryForBDSPolicyTransaction', 'payload' => [
'client_policy_id' => $client_policy_id ?? null,
'endorsement_no' => $endorsement_id ?? null,
'emp_count' => $emp_count ?? null,
'action_type' => $file['event_type'] ?? null,
'no_of_insured' => count($no_of_insured ?? []) ?? null,
'no_of_dependent' => count($no_of_dependent ?? []) ?? null,
'base_premium' => $base_bremium_and_gst['base_premium'] ?? null,
'gst' => $base_bremium_and_gst['gst'] ?? null,
'policy_issue_date' => $policy_issue_date ?? null,
'created_by' => $file['created_by'] ?? null,
]]);
}
$file_data = $this->getDataByFileId($file_id, 'success');
@ -5170,6 +5171,7 @@ class EmpDataServiceController extends BaseController
public function makeEntryForBDSPolicyTransaction($params)
{
try {
$this->myLogger->logme("error", "makeEntryForBDSPolicyTransaction() started: " . json_encode(['params' => $params]));
if (empty($params) || !isset($params['client_policy_id']) || empty($params['client_policy_id'])) {
@ -5182,18 +5184,23 @@ class EmpDataServiceController extends BaseController
return ['status' => "Failed", 'message' => "Action type is missing or empty", 'data' => ['params' => $params]];
}
//Function call for if the old policy transaction entries exisit than active the Policy transaction entries
$existing_policy_transaction_entry = $this->retrivePolicyTransactionEntries($params);
//get the policy data
$policy_data = $this->clientPolicyModel->where('id', $params['client_policy_id'])->where('is_active', 1)->first();
$params['policy_no'] = $policy_data['policy_no'] ?? null;
//check if the entries available in the policy transaction table
$check_policy_exist = $this->checkPolicyTransactionExist($params);
if($existing_policy_transaction_entry != false){
return $existing_policy_transaction_entry;
if($check_policy_exist['status'] == true) {
return $check_policy_exist;
}
//get the policy data
$policy_data = $this->clientPolicyModel
->where('id', $params['client_policy_id'])
->where('is_active', 1)
->first();
//Function call for if the old policy transaction entries exisit than active the Policy transaction entries
// $existing_policy_transaction_entry = $this->retrivePolicyTransactionEntries($params);
// if($existing_policy_transaction_entry != false) {
// return $existing_policy_transaction_entry;
// }
if (empty($policy_data)) {
$this->myLogger->logme("error", "No policy data found: " . json_encode(['client_policy_id' => $params['client_policy_id']]));
@ -5201,10 +5208,7 @@ class EmpDataServiceController extends BaseController
}
//get the leads data
$lead_data = $this->leadsModel
->where('is_policy_created', $params['client_policy_id'])
->where('is_active', 1)
->first();
$lead_data = $this->leadsModel->where('is_policy_created', $params['client_policy_id'])->where('is_active', 1)->first();
if (empty($lead_data)) {
$this->myLogger->logme("error", "No lead data found: " . json_encode(['client_policy_id' => $params['client_policy_id']]));
@ -5227,14 +5231,13 @@ class EmpDataServiceController extends BaseController
$this->myLogger->logme("error", "Policy transaction inserted successfully: " . json_encode(['insert_id' => $insert_id]));
//do not remove this commented item
$coShareDetails = $this->ConstructPTShareData($policy_data, $insert_id, $params);
$coShareDetails = $this->ConstructPTShareData($policy_data, $insert_id, $params, $lead_data);
$pt_co_share_id = $this->PTCOShareDetailsModel->insert($coShareDetails);
// $this->myLogger->logme("error", "PT Co share data inserted successfully: " . json_encode(['pt_co_share_id' => $pt_co_share_id]));
$this->myLogger->logme("error", "PT Co share data inserted successfully: " . json_encode(['pt_co_share_id' => $pt_co_share_id]));
// get the lead installment data
if(!empty($lead_data)){
$lead_installment_data = $this->leadInstallmentPaymentDetailesModel
->select('lead_id, installment_amount, payment_date, utr_no')
->where('lead_id', $lead_data['id'])
@ -5253,12 +5256,20 @@ class EmpDataServiceController extends BaseController
return ['status' => "Success", 'message' => "Policy transaction entry created successfully", 'data' => ['params' => $params, 'insert_id' => $insert_id]];
} catch (\Throwable $e) {
$errorDetails = [
'error_message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack_trace' => $e->getTraceAsString(),
];
$this->myLogger->logme("error", "Exception occurred in makeEntryForBDSPolicyTransaction(): " . json_encode([
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]));
return ['status' => "Error", 'message' => "An unexpected error occurred", 'data' => ['error' => $e]];
return ['status' => "Error", 'message' => "An unexpected error occurred", 'data' => $errorDetails];
}
}
@ -5271,9 +5282,20 @@ class EmpDataServiceController extends BaseController
$action_type_string = "addition";
}
$user_data = db_connect()->table('user_profiles')->where('is_active', 1)->where('id', $lead_data['created_by'] ?? null)->get()->getRowArray();
$salse_person_id = null;
if(isset($lead_data['salse_person_id']) && !empty($lead_data['salse_person_id'])){
$salse_person_array = json_decode($lead_data['salse_person_id'] ?? '{}', true) ?? [];
$salse_person_id = $salse_person_array[0] ?? null;
}else{
$salse_person_id = $lead_data['created_by'] ?? null;
}
$policyTransactionData = [
'issuer' => 2,
'issuer_branch' => $user_data['nhance_branch_id'] ?? 1,
'client_id' => $policy_data['client_id'] ?? null,
'client_branch_id' => $policy_data['client_branch_id'] ?? null,
'insurer_id' => $policy_data['insurer_id'] ?? null,
@ -5292,7 +5314,7 @@ class EmpDataServiceController extends BaseController
'closure_date' => $policy_data['closure_date'] ?? null,
'emp_count' => $params['no_of_insured'] ?? null,
'dependent_count' => $params['no_of_dependent'] ?? null,
'revenue_type' => isset($lead_data['lead_type']) ?($lead_data['lead_type'] == 1 ? "NA" : ($lead_data['lead_type'] == 2 ? "EA" : "EANR") ) : null,
'revenue_type' => isset($lead_data['lead_type']) ?($lead_data['lead_type'] == 1 ? "NA" : ($lead_data['lead_type'] == 2 ? "EA" : "EANR") ) : "NA",
'co_share' => $policy_data['co_share'] ?? 0,
'pre_payable_by' => $policy_data['pre_payable_by'] ?? 1,
'renewal_date' => $policy_data['policy_end_date'] ?? null,
@ -5312,6 +5334,10 @@ class EmpDataServiceController extends BaseController
'tsi' => generate_tsi_code($lead_data['lead_type'] ?? 1) ?? null,
'installment' => $lead_data['no_of_installment'] ?? null,
'created_by' => $params['created_by'] ?? null,
'entry_from' => 2,
'sales_generated_by' => $salse_person_id,
'serviced_by' => $params['created_by'] ?? null,
];
$this->myLogger->logme("error", "Constructed policy transaction data: " . json_encode($policyTransactionData));
@ -5319,7 +5345,7 @@ class EmpDataServiceController extends BaseController
return $policyTransactionData;
}
private function ConstructPTShareData($policy_data, $pt_id, $params)
private function ConstructPTShareData($policy_data, $pt_id, $params, $lead_data)
{
$policyTypeModel = new PolicyTypeModel();
$policy_type_data = $policyTypeModel->where('is_active', 1)->where('id', $policy_data['policy_type_id'])->first();
@ -5336,10 +5362,15 @@ class EmpDataServiceController extends BaseController
'co_share_type' => 1,
'co_share_per' => 100,
'standerd_bp_per' => $policy_type_data['ebp'],
'pt_policy_issue_date' => $params['policy_issue_date'] ?? null,
'amount' => ($params['base_premium'] ?? 0) + ($params['gst'] ?? 0),
];
$coShareData['exp_amt'] = (($params['base_premium'] ?? 0) * ($policy_type_data['ebp'] ?? 0)) / 100;
if(isset($lead_data['agreed_percentage']) && !empty($lead_data['agreed_percentage'])){
$coShareData['exp_amt'] = (($params['base_premium'] ?? 0) * ($lead_data['agreed_percentage'] ?? 0)) / 100;
}else{
$coShareData['exp_amt'] = (($params['base_premium'] ?? 0) * ($policy_type_data['ebp'] ?? 0)) / 100;
}
$this->myLogger->logme("error", "Constructed PT co-share data: " . json_encode($coShareData));
@ -5391,8 +5422,7 @@ class EmpDataServiceController extends BaseController
$activated_pt_co_share_ids[] = $value['id'];
}
$this->myLogger->logme("error", "Activated pt_co_share_ids : ". json_encode($activated_pt_co_share_ids));
$this->myLogger->logme("error", "Activated pt_co_share_ids : ". json_encode($activated_pt_co_share_ids));
$update_return = $this->policyTransactionModel->where('id', $policy_transaction_data['id'])->set(['is_active' => 1])->update();
@ -5405,6 +5435,30 @@ class EmpDataServiceController extends BaseController
}
}
public function checkPolicyTransactionExist($params)
{
// Trim the input
$policy_no = trim($params['policy_no']);
// Base query
$policy_transaction_data = $this->policyTransactionModel->where('is_active', 1)->where('TRIM(policy_no)', $policy_no);
// Add endorsement condition only if not inception
if ($params['action_type'] !== "inception") {
$policy_transaction_data = $policy_transaction_data ->where('TRIM(endorsement_no)', trim($params['endorsement_no']));
}
$policy_transaction_data = $policy_transaction_data->first();
// If record exists → log and return true
if (!empty($policy_transaction_data)) {
$this->myLogger->logme("error", "Policy Transaction already exists. Input Parameters: " . json_encode($params) );
return ['status' => true, 'message' => "This entry already available in the Policy Transaction table", 'data' => $policy_transaction_data['id']];
}
return ['status' => false, 'message' => "This entry not available in the Policy Transaction table", 'data' => ''];
}
public function removeBDSPolicyTransactionEntryFromTruncate($params)
{

View File

@ -483,6 +483,8 @@ class EmployeeController extends AdminController
$filePath = ROOTPATH . 'public/sample_excel/Sample_Member_Data.xlsx';
}else if ($actionType == 'all') {
$filePath = ROOTPATH . 'public/sample_excel/sample_multievent_file.xlsx';
}else if ($actionType == 'bds_upload') {
$filePath = ROOTPATH . 'public/sample_excel/sample_bds_bulk_upload_excel.xlsx';
}
// Check if the file exists

View File

@ -2656,7 +2656,7 @@ class EmployeeRestController extends AdminController
->where('is_active', 1)
->where('file_type', 2)
->where('ticket_id', $ticket_id)
->where('ticket_message_id', $ticket_message['id'])
// ->where('ticket_message_id', $ticket_message['id'])
->findAll();
foreach ($claim_files_data as &$value) {
@ -3850,6 +3850,8 @@ class EmployeeRestController extends AdminController
foreach ($client_claim_status as $claim_key => $claim_value) {
if (in_array($value['claim_status_id'], $claim_value)) { // Corrected argument order
$ticket_data[$key]['claim_status'] = $claim_key ?? null; // Assign back to the main array
}else if(in_array($value['old_status_id'], $claim_value)){
$ticket_data[$key]['claim_status'] = $claim_key ?? null; // Assign back to the main array
}
}

View File

@ -1385,12 +1385,18 @@ class EmployeeServiceController extends AdminController
$existing_famility_details = transform_db_data_to_excel($existing_famility_details,$file);
// Kint::dump($existing_famility_details);
$family = array_merge($family,$existing_famility_details);
$family = data_group_by_family($family)[ $emp_id ];// reason to call this again is bring self to first index of the array
// dd($family);
$family = data_group_by_family($family, 'excel', 1)[ $emp_id ];// reason to call this again is bring self to first index of the array
// dd($family);
$self = current(array_filter($family, fn($r) => strtolower($r[5] ?? '') === 'self'));
$premium = (int)($self['temp']['rata_premimum'] ?? 0);
foreach ($family as &$r) if (strtolower($r[5] ?? '') !== 'self') $r['self_rata_premium'] = $premium;
}
// Kint::dump($family);
$data = calculate_premium_new(family_data:$family,policy_terms: $policy_terms,slab_details : $slab_details,fileArr: $file, existing_units:$existing_units);
if($file['action'] == 'dependent_addition') {
$data = validatet_family_floter_rata_premium($data);
}
// dd($data);
$employee_data_group_by_family[$emp_id] = $data;
$this->employeesOnboardProcess(['familiy_data' => $data,'file' => $file]);

View File

@ -13,7 +13,7 @@ class InsuranceCommissionController extends AdminController
public function __construct()
{
set_session_context('Client');
set_session_context('InsuranceCommissionController');
$this->myLogger = \Config\Services::mylogger();
// Load rules file if present in writable config path
// $rulesPath = WRITEPATH . 'config/insurance_rules.json';
@ -122,7 +122,10 @@ class InsuranceCommissionController extends AdminController
// Normalise department keys to lowercase for consistent lookups
$this->rules = [];
foreach ($parsed as $dept => $rules) {
$this->rules[strtolower($dept)] = $rules;
if($rules['is_deleted'] === false)
{
$this->rules[strtolower($dept)] = $rules;
}
}
// print_r($this->rules);die();

View File

@ -179,6 +179,14 @@ class JobWorker extends AdminController
'type' => 'CC', // Handler Category
'handler' => 'App\Controllers\MediAssistApiController',
],
'bdsDumpExcelFileFormatValidation' => [
'type' => 'CC', // Handler Category
'handler' => 'App\Controllers\PolicyTransactionController',
],
'insertBulkBdsData' => [
'type' => 'CC', // Handler Category
'handler' => 'App\Controllers\PolicyTransactionController',
],
];

View File

@ -3292,6 +3292,7 @@ class LeadsController extends BaseController
'no_of_installment' => $params['no_of_installment'] ?? null,
'is_installment' => $params['is_installment'] ?? null,
'acm_id' => $params['acm_pk'] ?? null,
'agreed_percentage' => $params['agreed_percentage'] ?? null,
];
if(isset($params['tpa_id']) && !empty($params['tpa_id'])){

View File

@ -1980,6 +1980,7 @@ class MasterController extends AdminController
'files' => WRITEPATH . 'uploads/commission/files',
'rules' => WRITEPATH . 'uploads/commission/rules',
'claim_sample_forms' => ROOTPATH . 'public/claim_sample_forms/',
'bds_dump_excel' => WRITEPATH . 'uploads/bds_dump_excel/',
];
foreach ($folders as $folderName => $folderPath) {

View File

@ -217,40 +217,44 @@ class NotificationController extends AdminController
}
// This function for sent a mail for testing
public function sentTestMail($template_id, $test_mail)
// keep watching this
public function sentTestMail($template_id, $test_mail, $string_flag)
{
$notification_data = $this->notificationModel->where('id', $template_id)->first();
if(empty($notification_data)) {
return $this->respond(['status' => false,'code' => 200, 'message' => 'Notification Template not enabled']);
}
$client_data = $this->clientModel->where('id', $notification_data['client_id'])->where('is_active', 1)->first();
if(!empty($notification_data)){
$params = [
$params = [
'client_data' => $client_data,
'notification_data' => $notification_data,
'test_mail' => $test_mail
];
];
$testMailData = sendMailNotification::sendMailNotificationForTesting($notification_data['template_name'], $params);
// print_r($testMailData); die;
if (!empty($testMailData)) {
$testMailData = sendMailNotification::sendMailNotificationForTesting($notification_data['template_name'], $params);
$mail_send_return1 = MailHelper::send_email($testMailData);
$this->myLogger->logme("info", $mail_send_return1);
$this->myLogger->logme("info", $mail_send_return1);
if(empty($testMailData)) {
return $this->respond(['status' => false,'code' => 200, 'message' => 'Test Mail Data Does Not Exist']);
}
return $this->respond(['status' => true,'code' => 200, 'respond' => json_decode($mail_send_return1)]);
}else{
return $this->respond(['status' => false,'code' => 200, 'message' => 'Test Mail Data Does Not Exist']);
}
}else{
return $this->respond(['status' => false,'code' => 200, 'message' => 'Notification Template not enabled']);
if($string_flag == "send"){
$mail_send_return1 = MailHelper::send_email($testMailData);
$this->myLogger->logme("info", $mail_send_return1);
return $this->respond(['status' => true,'code' => 200, 'respond' => json_decode($mail_send_return1)]);
}
if($string_flag == "preview"){
return $this->respond([
'status' => true,
'code' => 200,
'content' => $testMailData
]);
}
}
public function sendCommonTestMail()
@ -258,7 +262,7 @@ class NotificationController extends AdminController
$template_id = $this->request->getPost('template_id');
$test_mail = $this->request->getPost('test_mail');
// $test_mail = $this->request->getPost('test_mail');
$test_mail_list = $this->request->getPost('test_mail_list');
@ -268,27 +272,67 @@ class NotificationController extends AdminController
if(!empty($notification_data)){
$params = [
'client_data' => $client_data,
'notification_data' => $notification_data,
'test_mail' => $test_mail,
'test_mail_list' => $test_mail_list
];
// First Index as test mail all are testmaillist
// $params = [
// 'client_data' => $client_data,
// 'notification_data' => $notification_data,
// 'test_mail' => $test_mail,
// 'test_mail_list' => $test_mail_list
// ];
// $testMailData = sendMailNotification::sendMailNotificationForTesting($notification_data['template_name'], $params);
// if (!empty($testMailData)) {
// $mail_send_return1 = MailHelper::send_email($testMailData);
// $this->myLogger->logme("info", $mail_send_return1);
// $this->myLogger->logme("info", $mail_send_return1);
// return $this->respond(['status' => true,'code' => 200, 'respond' => json_decode($mail_send_return1)]);
// }else{
// return $this->respond(['status' => false,'code' => 200, 'message' => 'Test Mail Data Does Not Exist']);
// }
$testMailData = sendMailNotification::sendMailNotificationForTesting($notification_data['template_name'], $params);
// print_r($testMailData); die;
if (!empty($testMailData)) {
$mail_send_return1 = MailHelper::send_email($testMailData);
$this->myLogger->logme("info", $mail_send_return1);
$this->myLogger->logme("info", $mail_send_return1);
$mailArray = explode(',', $test_mail_list);
$successMails = [];
$failedMails = [];
return $this->respond(['status' => true,'code' => 200, 'respond' => json_decode($mail_send_return1)]);
foreach ($mailArray as $singleMail) {
$singleMail = trim($singleMail);
}else{
$params = [
'client_data' => $client_data,
'notification_data' => $notification_data,
'test_mail' => $singleMail,
'test_mail_list' => "" // optional
];
$testMailData = sendMailNotification::sendMailNotificationForTesting($notification_data['template_name'], $params);
if (!empty($testMailData)) {
$mail_send_return1 = MailHelper::send_email($testMailData);
if ($mail_send_return1) {
$successMails[] = $singleMail;
} else {
$failedMails[] = $singleMail;
}
$this->myLogger->logme("info", "Mail attempt to {$singleMail}: " . $mail_send_return1);
} else {
$failedMails[] = $singleMail;
$this->myLogger->logme("info", "Test Mail Data Does Not Exist for {$singleMail}");
}
}
// Prepare final response
if (!empty($successMails)) {
$responseMessage = "Count " . count($successMails) . " mail(s) sent successfully: \n" . implode("\n", $successMails);
if (!empty($failedMails)) {
$responseMessage .= "\nCount " . count($failedMails) . " mail(s) failed: \n" . implode("\n", $failedMails);
}
return $this->respond(['status' => true,'code' => 200,'message' => $responseMessage]);
} else {
return $this->respond(['status' => false,'code' => 200,'message' => 'All mails failed to send: ' . implode(", ", $failedMails)]);
}
return $this->respond(['status' => false,'code' => 200, 'message' => 'Test Mail Data Does Not Exist']);
}
}else{
return $this->respond(['status' => false,'code' => 200, 'message' => 'Notification Template not enabled']);

View File

@ -9,6 +9,10 @@ use App\Models\InvoiceItemModel;
use App\Models\InvoiceModel;
use App\Models\InvoiceUtrModel;
use App\Models\PolicyTransactionModel;
use App\Models\AuditHistoryModel;
use Dompdf\Dompdf;
use Dompdf\Options;
class PayoutController extends BaseController
{
@ -20,21 +24,23 @@ class PayoutController extends BaseController
protected $policyTransactionModel;
protected $payout_status;
protected $auditHistory;
public function __construct()
{
set_session_context('PayoutController');
$this->myLogger = \Config\Services::mylogger();
$this->payout_status = [
1 => "Draft",
2 => "Pending",
3 => "Complete",
1 => "Pending",
2 => "Completed",
];
$this->invoiceItemModel = new InvoiceItemModel();
$this->invoiceModel = new InvoiceModel();
$this->invoiceUtrModel = new InvoiceUtrModel();
$this->policyTransactionModel = new PolicyTransactionModel();
$this->auditHistory = new AuditHistoryModel();
}
public function payoutList()
@ -81,7 +87,7 @@ class PayoutController extends BaseController
// for list
$data['payout_status'] = $this->payout_status;
$data['agent_list'] = $this->invoiceModel->agentList();
$data['page_name'] = "Payout";
$data['page_name'] = "Invoices";
$payout_data['payout_list_data'] = $this->invoiceModel->invoiceList();
$data['payout_list'] = view('payout_list', $payout_data);
@ -189,4 +195,422 @@ class PayoutController extends BaseController
}
/*************************************************************************************************************/
//... Payout-invoice Mapping Commission's amount and Adjustment's Amount - Data Display
public function invoices()
{
$type = $this->request->getGet('type');
$title = $type === 'add' ? 'Add Payouts'
: ($type === 'edit' ? 'Edit Payouts'
: ($type === 'adjustment' ? 'Payouts Adjustment'
: 'Payouts'));
$data['tab_name'] = $title;
$data['page_name'] = $title;
$id = $this->request->getGet('id');
if($type == 'add')
{
$data['agents'] = $this->invoiceModel->agentList(['is_active' => 1]); // common both add and edit
}
else
{
$data['agents'] = $this->invoiceModel->agentList(); // common both add and edit
}
// $data['checked_policy_numbers'] = [];
// $data['invoice'] = [];
// $data['extra_payouts'] = [];
//... Now Seperated add => 'policy_transaction_payouts1'
//... Now Seperated edit and adjustment => 'policy_transaction_payouts' old file
//... Reason : Due Datatable issues Export button Searching like that so seperated
if ($type === 'add') {
// $invoiceNo = $this->generateInvoiceNumber();
$data['payouts'] = $this->invoiceModel->payoutList(1);
// print_rr($data['payouts']);die();
// print_rr($this->invoiceModel->getLastQuery());die();
// $data['invoice_number'] = $invoiceNo;
return $this->loadLayout('invoice_policy_mapping_add', $data);
}
if (($type === 'edit' || $type === 'adjustment') && !empty($id)) {
$invoice = $this->invoiceModel->where('id', $id)->first();
$data['freeze_edit'] = $this->auditHistory->where('table_name', 'partner_invoice')->where('pk', $id)->countAllResults();
$agentId = $invoice['agent_id'] ?? null;
$data['payouts'] = $this->invoiceModel->payoutList(2 ,$agentId,$id);
$data['extra_payouts'] = $agentId ? $this->invoiceModel->payoutList(3, $agentId) : [];
$invoice_items = $this->invoiceItemModel->where('invoice_id', $id)->findAll();
if (!$invoice) { return redirect()->to('payout/invoices')->with('error', 'Invoice not found'); }
$data['invoice'] = $invoice;
$data['invoice_items'] = $invoice_items;
// Initialize array for policy numbers
$data['checked_policy_numbers'] = array_column(array_filter($invoice_items, fn($ii) => isset($ii['is_active']) && $ii['is_active'] == 1),'policy_no');
$data['invoice_number']= $invoice['invoice_no'];
$data['type'] = $type;
$data['payout_status'] = $invoice['payout_status'] ;
// dd($data);
return $this->loadLayout('invoice_policy_mapping', $data);
}
}
//... Payout-invoice Mapping - Save/update/soft Delete/Hard Delete Data
public function saveInvoice()
{
$json = $this->request->getJSON(true);
// print_rr($json);die();
if (!$json) {
return $this->response->setJSON(['error' => 'Invalid JSON','message' => 'Invalid JSON received.'])->setStatusCode(400);
}
$id = $json['invoice_id'] ?? null;
try {
//... ADD Part
if (empty($id)) {
$exists = $this->invoiceModel
->where('invoice_no', $json['invoice_no'])
->first();
if ($exists) {
$InvNum = $this->generateInvoiceNumber($json['agent_id']);
} else {
$InvNum = $json['invoice_no'];
}
$invoiceData = [
'invoice_no' => $InvNum,
'agent_id' => $json['agent_id'],
'invoice_date' => $json['invoice_date'],
'invoice_amount' => $json['invoice_amount'],
'payout_status' => 1
];
$invoiceId = $this->invoiceModel->insert($invoiceData);
foreach ($json['policies'] as $p) {
$this->invoiceItemModel->insert([
'invoice_id' => $invoiceId,
'policy_id' => $p['partner_policy_id'],
'policy_no' => $p['policy_no'],
'commission_amount' => $p['commission_amount'],
'is_active' => 1
]);
}
$message = "Invoice created successfully.\nInvoice No: " . $json['invoice_no'];
}
// ... EDIT part
if (!empty($id)) {
$invoiceId = $id;
$invoiceData = [
'invoice_no' => $json['invoice_no'],
'agent_id' => $json['agent_id'],
'invoice_date' => $json['invoice_date'],
'invoice_amount' => $json['invoice_amount'],
];
$this->invoiceModel->update($invoiceId, $invoiceData);
//... Fetch existing invoice item rows
$existingItems = $this->invoiceItemModel
->where('invoice_id', $invoiceId)
->findAll();
//... Create map by policy_no
$existingMap = [];
foreach ($existingItems as $item) {
$existingMap[$item['policy_no']] = $item;
}
$newPolicyNos = [];
//... Loop new JSON policies
foreach ($json['policies'] as $p) {
$newPolicyNos[] = $p['policy_no'];
if (isset($existingMap[$p['policy_no']])) {
//... Update existing item
$this->invoiceItemModel
->where('id', $existingMap[$p['policy_no']]['id'])
->set([
'commission_amount' => $p['commission_amount'],
'is_active' => 1
])
->update();
} else {
//... Insert new item
$this->invoiceItemModel->insert([
'invoice_id' => $invoiceId,
'policy_id' => $p['policy_id'],
'policy_no' => $p['policy_no'],
'commission_amount' => $p['commission_amount'],
'is_active' => 1,
]);
}
}
//... Delete items removed in JSON (hard delete)
foreach ($existingItems as $old) {
if (!in_array($old['policy_no'], $newPolicyNos)) {
$this->invoiceItemModel
->where('id', $old['id'])
->delete();
}
}
//... Delete items removed in JSON (soft delete REF : SVM )
// foreach ($existingItems as $old) {
// if (!in_array($old['policy_no'], $newPolicyNos)) {
// $this->invoiceItemModel
// ->where('id', $old['id'])
// ->set(['is_active' => 0])
// ->update();
// }
// }
$message = "Invoice updated successfully.";
}
return $this->response->setJSON([
'status' => 'success',
'message' => $message,
'invoice_id' => $invoiceId
]);
} catch (\Exception $e) {
return $this->response->setJSON([
'status' => 'error',
'message' => 'Unexpected error occurred: ' . $e->getMessage()
]);
}
}
//... Payout-invoice Mapping - Invoice number is auto-generated only for the Add mode.
// Note New Pattern : INV/AG001/20251101/xx (REF:SVM)
public function generateInvoiceNumberAjax($agentId)
{
if (!$agentId) {
return $this->response->setJSON([
'status' => 'error',
'message' => 'Agent ID missing'
]);
}
$invoiceNo = $this->generateInvoiceNumber($agentId);
return $this->response->setJSON([
'status' => 'success',
'invoice_no' => $invoiceNo
]);
}
//... Payout-invoice Mapping - Invoice number is auto-generated only for the Add mode.
// Note New Pattern : INV/AG001/20251101/xx (REF:SVM)
private function generateInvoiceNumber($agentId)
{
$agent = $this->invoiceModel->agentListById($agentId);
$agentCode = $agent["agent_code"];
$today = date("Ymd");
$likePattern = "INV/$agentCode/$today/%";
$count = $this->invoiceModel
->like("invoice_no", $likePattern)
->countAllResults();
$nextNumber = $count + 1;
return "INV/$agentCode/$today/$nextNumber";
}
// private function generateInvoiceNumber()
// {
// $year = date('Y');
// $month = date('m');
// do {
// // random 3-digit number
// $random = str_pad(rand(1, 999), 3, '0', STR_PAD_LEFT);
// $invoiceNo = "INV{$year}{$month}{$random}";
// // check main invoice table
// $existsMain = $this->invoiceModel
// ->where('invoice_no', $invoiceNo)
// ->first();
// // check partner invoice table
// $existsPartner = $this->invoiceModel
// ->where('invoice_no', $invoiceNo)
// ->first();
// } while ($existsMain || $existsPartner); // regenerate if duplicate found
// return $invoiceNo;
// }
//... Payout-invoice Mapping Audit History Based on "Adjustment" value (REF: KV,SVM)
public function auditHistory()
{
$iid = $this->request->getGet('id');
$details['invoice'] = $this->auditHistory
->select('auditing_history.*,partner_invoice.invoice_no, user_profiles.first_name as created_name')
->join('user_profiles', 'user_profiles.id = auditing_history.created_by', 'left')
->join('partner_invoice', 'partner_invoice.id = auditing_history.pk', 'left')
->where('auditing_history.table_name', 'partner_invoice') // ok
->where('auditing_history.pk', $iid)
->orderBy('auditing_history.created_at', 'desc')
->get()
->getResultArray();
$details['invoice_child'] = $this->auditHistory
->select('auditing_history.*,partner_invoice.invoice_no, user_profiles.first_name as created_name,partner_invoice_items.policy_no')
->join('user_profiles', 'user_profiles.id = auditing_history.created_by', 'left')
->join('partner_invoice_items', 'partner_invoice_items.id = auditing_history.pk', 'left')
->join('partner_invoice', 'partner_invoice.id = partner_invoice_items.invoice_id', 'left')
->where('auditing_history.table_name', 'partner_invoice_items') // FIXED
->where('partner_invoice.id', $iid)
->orderBy('auditing_history.created_at', 'desc')
->get()
->getResultArray();
return $this->response->setJSON([
'status' => 'success',
'data' => $details
]);
}
// ****************************************************************************************************************************************************************
public function preview($invoiceId = null)
{
$invoiceId = $this->request->getGet('invoice_id');
// Get invoice data from database
$invoiceData = $this->getInvoiceData($invoiceId);
if (empty($invoiceData)) {
return $this->respond([
'status' => false,
'code' => 404,
'data' => '',
'message' => 'Invoice not found'
], 200);
}
// Load view with data
$html = view('invoice_template_2', $invoiceData);
// echo $html; die;
return $this->respond([
'status' => true,
'code' => 200,
'data' => $html
], 200);
}
public function downloadPdf($invoiceId = null, $type = 0)
{
// Get invoice data from database
$invoiceData = $this->getInvoiceData($invoiceId);
if (empty($invoiceData)) {
return redirect()->back()->with('error', 'Invoice not found');
}
// Generate HTML
$html = view('invoice_template_2', $invoiceData);
// Configure Dompdf
$options = new Options();
$options->set('isHtml5ParserEnabled', true);
$options->set('isPhpEnabled', true);
$options->set('isRemoteEnabled', true);
$options->set('defaultFont', 'Arial');
$options->set('chroot', FCPATH);
// Initialize Dompdf
$dompdf = new Dompdf($options);
// Load HTML
$dompdf->loadHtml($html);
// Set paper size and orientation
$dompdf->setPaper('A4', 'portrait');
// Render PDF
$dompdf->render();
// Generate filename
$filename = 'Invoice_' . $invoiceData['invoice_no'] . '_' . date('Ymd') . '.pdf';
if($type == 0){
// Download PDF
return $this->response
->setHeader('Content-Type', 'application/pdf')
->setHeader('Content-Disposition', 'attachment; filename="' . $filename . '"')
->setBody($dompdf->output());
}else{
// View PDF
return $this->response
->setHeader('Content-Type', 'application/pdf')
->setHeader('Content-Disposition', 'inline; filename="' . $filename . '"')
->setBody($dompdf->output());
}
}
private function getInvoiceData($invoiceId)
{
$invoice_data = $this->invoiceModel
->select('
partner_invoice.*,
pa.name as agent_name,
pa.email as agent_email,
pa.mobile as agent_mobile,
pa.address as agent_address,
pa.agent_code,
pa.certificate_file_name,
pa.commission_retain
')
->join('partner_agent pa', 'partner_invoice.agent_id = pa.id')
->where('partner_invoice.is_active', 1)
->where('partner_invoice.id', $invoiceId)
->first();
return $invoice_data;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -398,47 +398,54 @@ class RestAuthenticationController extends AdminController
$otp = isset($this->request->getJSON()->otp) ? $this->request->getJSON()->otp : null;
$client_id = $this->request->getJSON()->client_id ?? null;
if (isset($mobile_number))
{
// $employeeData = $this->employeeModel->where('mobile', $mobile_number)->where('relationship', 'self')->where('emp_status !=', 'truncated')->where('is_active', 1)->first();
$builder = $this->employeeModel
->select('employees.*')
->join('employee_polices', 'employees.id = employee_polices.employee_id')
->where('employees.mobile', $mobile_number)
->where('employees.relationship', 'Self')
->where('employee_polices.is_active', 1)
->whereIn('employee_polices.status', ['active', 'expired'])
->where('employees.is_active', 1)
->whereIn('employees.emp_status', ['active', 'expired'])
->where('otp', $otp);
if(empty($otp)){
return $this->respond(['status' => 'OTP is required','code' => 400,'message' => 'OTP is required'], 200);
}
if (!empty($client_id)) {
$builder->where('employees.client_id', $client_id);
}
if (empty($mobile_number) && empty($email_id)) {
return $this->respond(['status' => 'failed','code' => 400,'message' => 'Mobile number or Email ID is required'], 200);
}
$employeeData = $builder->orderBy('employees.id', 'desc')->first();
if (isset($mobile_number))
{
// $employeeData = $this->employeeModel->where('mobile', $mobile_number)->where('relationship', 'self')->where('emp_status !=', 'truncated')->where('is_active', 1)->first();
$builder = $this->employeeModel
->select('employees.*')
->join('employee_polices', 'employees.id = employee_polices.employee_id')
->where('employees.mobile', $mobile_number)
->where('employees.relationship', 'Self')
->where('employee_polices.is_active', 1)
->whereIn('employee_polices.status', ['active', 'expired'])
->where('employees.is_active', 1)
->whereIn('employees.emp_status', ['active', 'expired'])
->where('otp', $otp);
} else {
// $employeeData = $this->employeeModel->where('email_corporate', $email_id)->where('otp', $otp)->where('relationship', 'self')->where('emp_status !=', 'truncated')->where('is_active', 1)->first();
$builder = $this->employeeModel
->select('employees.*')
->join('employee_polices', 'employees.id = employee_polices.employee_id')
->where('employees.email_corporate', $email_id)
->where('employees.relationship', 'Self')
->where('employee_polices.is_active', 1)
->whereIn('employee_polices.status', ['active', 'expired'])
->where('employees.is_active', 1)
->whereIn('employees.emp_status', ['active', 'expired'])
->where('otp', $otp);
if (!empty($client_id)) {
$builder->where('employees.client_id', $client_id);
}
if (!empty($client_id)) {
$builder->where('employees.client_id', $client_id);
}
$employeeData = $builder->orderBy('employees.id', 'desc')->first();
$employeeData = $builder->orderBy('employees.id', 'desc')->first();
}
} else {
// $employeeData = $this->employeeModel->where('email_corporate', $email_id)->where('otp', $otp)->where('relationship', 'self')->where('emp_status !=', 'truncated')->where('is_active', 1)->first();
$builder = $this->employeeModel
->select('employees.*')
->join('employee_polices', 'employees.id = employee_polices.employee_id')
->where('employees.email_corporate', $email_id)
->where('employees.relationship', 'Self')
->where('employee_polices.is_active', 1)
->whereIn('employee_polices.status', ['active', 'expired'])
->where('employees.is_active', 1)
->whereIn('employees.emp_status', ['active', 'expired'])
->where('otp', $otp);
if (!empty($client_id)) {
$builder->where('employees.client_id', $client_id);
}
$employeeData = $builder->orderBy('employees.id', 'desc')->first();
}
$lastQuery = $this->employeeModel->db->getLastQuery();
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - getVerifiedUserData: Last Executed Query: " . $lastQuery);
$this->myLogger->logme("error", "REST-AUTH-CONTROLLER - getVerifiedUserData: employeeData: " . json_encode($employeeData ?? []));

View File

@ -4,6 +4,9 @@ namespace App\Controllers;
use CodeIgniter\API\ResponseTrait;
use App\Models\CommissionFilesModel;
use App\Models\InsurerModel;
use App\Models\PartnerPolicyModel;
class RuleImportController extends AdminController
{
@ -12,7 +15,9 @@ class RuleImportController extends AdminController
protected $ruleImportService;
protected $commissionFilesModel;
protected $departments;
protected $departmentFields;
protected $insurerModel;
protected $partnerPolicyModel;
public function __construct()
{
@ -20,13 +25,40 @@ class RuleImportController extends AdminController
$this->myLogger = \Config\Services::mylogger();
$this->ruleImportService = \Config\Services::ruleImportService();
$this->partnerPolicyModel = new partnerPolicyModel();
$this->commissionFilesModel = new CommissionFilesModel();
$this->insurerModel = new InsurerModel();
$this->departments = [
'motor' => 'Motor',
'health' => 'Health',
];
$this->departmentFields = [
'motor' => [
'department',
'vehicle_type',
'vehicle_sub_type',
'policy_type',
'vehicle_age',
'is_new_vehicle',
'cubic_capacity',
'policy_business_type',
'fuel_type',
'produt',
'geo_rto_state',
'geo_rto_city',
'model',
'make',
'weight',
'renewal_type',
'renewal_sub_type',
'premium',
'od_premium',
'tp_premium',
'product'
],
];
}
public function commissionFileUploadList()
@ -194,6 +226,8 @@ class RuleImportController extends AdminController
'insurer_id' => (int)$insurerId,
'department' => $department,
'commission_month' => $commissionMonth,
'created_by' => (int)$createdBy,
];
$this->myLogger->logme('info', 'RuleImportController::upload - Calling ruleImportService->processUpload', ['payload' => $payload]);
@ -262,10 +296,22 @@ class RuleImportController extends AdminController
// handle existing JSON file based on $override (bool)
if (file_exists($jsonPath)) {
if ($overwrite) {
// delete existing file before writing (deterministic overwrite)
if (!@unlink($jsonPath)) {
$this->myLogger->logme('warning', 'RuleImportController::upload - Failed to delete existing JSON before overwrite', ['json_path' => $jsonPath]);
// proceed to overwrite anyway by writing to the same path
// rename existing file before overwrite
if (file_exists($jsonPath)) {
$backupPath = $jsonPath . '.' . date('YmdHis') . '.bak';
if (!@rename($jsonPath, $backupPath)) {
$this->myLogger->logme(
'warning',
'RuleImportController::upload - Failed to rename existing JSON before overwrite',
[
'json_path' => $jsonPath,
'backup_path' => $backupPath
]
);
// continue anyway; writing to same path will overwrite
}
}
$finalJson = $jsonData;
} else {
@ -487,7 +533,7 @@ class RuleImportController extends AdminController
public function deleteCommissionData($id)
{
$return = $this->removeCommissionRules($id);
$return = $this->updateCommissionRules($id);
// dd($return);
if($return['status'] == true){
@ -498,7 +544,7 @@ class RuleImportController extends AdminController
}
}
public function deActiveCommissionRules($id)
public function updateCommissionRules($id, $post_data = null)
{
// 1. Fetch commission record
$commission_data = $this->commissionFilesModel
@ -528,7 +574,7 @@ class RuleImportController extends AdminController
// 4. Read JSON
$json = file_get_contents($filePath);
$rules = json_decode($json, true);
// dd($rules);
// print_rr($rules); die;
if (!is_array($rules)) {
$this->myLogger->logme("error", "Invalid JSON structure in file: $filePath");
@ -537,9 +583,58 @@ class RuleImportController extends AdminController
// 5. Mark matching rule as deleted
$ruleFound = false;
foreach ($rules as &$rule) {
if (!isset($rule['is_deleted']) && isset($rule['file_id']) && $rule['file_id'] == $id) {
$rule['is_deleted'] = true; // <-- NEW FEATURE
$log_message = "Rule file updated successfully";
if(empty($post_data)){
foreach ($rules as &$rule) {
if (isset($rule['file_id']) && $rule['file_id'] == $id && isset($rule['is_deleted']) && $rule['is_deleted'] == false) {
$rule['is_deleted'] = true;
$ruleFound = true;
}
}
$log_message = "Rule marked as deleted and file updated successfully";
} else {
foreach ($rules as &$rule) {
// Match rules for the same file and not deleted
if (isset($rule['file_id']) && $rule['file_id'] == $id && $rule['is_deleted'] == false)
{
// 1. DELETE RULE
if (!empty($post_data['rule_id']) && $post_data['rule_id'] == $rule['id'] && isset($post_data['is_deleted']))
{
$rule['is_deleted'] = true;
$ruleFound = true;
break;
}
// 2. UPDATE RULE
if (!empty($post_data['rule_id']) && $post_data['rule_id'] == $rule['id'])
{
$rule['conditions'] = $post_data['rule_data']['conditions'];
$rule['calculation'] = $post_data['rule_data']['calculation'];
$rule['name'] = $post_data['rule_data']['name'];
$ruleFound = true;
break;
}
}
}
// 3. CREATE NEW RULE (only if not found)
if (empty($post_data['rule_id']) && !$ruleFound) {
$newRuleId = 'rule_' . substr(md5(json_encode($post_data['rule_data']) . time()), 0, 13) . '_' . $id . '_' . strtolower($monthFolder);
$newRule = [
'id' => $newRuleId,
'name' => $post_data['rule_data']['name'],
"department" => $post_data['rule_data']['department'] ?? "motor",
'is_deleted' => false,
'file_id' => $id,
'conditions' => $post_data['rule_data']['conditions'],
'calculation' => $post_data['rule_data']['calculation'],
];
$rules[] = $newRule; // correctly push new rule
$ruleFound = true;
}
}
@ -552,11 +647,11 @@ class RuleImportController extends AdminController
// 6. Always save file back (No unlink)
file_put_contents($filePath, json_encode($rules, JSON_PRETTY_PRINT));
$this->myLogger->logme("error", "Rule marked deleted and file updated: $filePath");
$this->myLogger->logme("error", $log_message);
return [
'status' => true,
'message' => 'Rule marked as deleted and file updated successfully'
'message' => $log_message
];
}
@ -641,5 +736,109 @@ class RuleImportController extends AdminController
}
}
public function ruleList($id)
{
$data['page_name'] = "Rule Manager";
$data['departments'] = $this->departments;
$data['commission_file_id'] = $id;
$data['departmentFields'] = json_encode($this->departmentFields);
$data['rules'] = $this->getRuleJson($id);
return $this->loadLayout('commission_rules_list', $data);
}
public function getRuleJson($id)
{
// 1. Fetch commission record
$commission_data = $this->commissionFilesModel
->where('is_active', 1)
->where('id', $id)
->first();
if (!$commission_data) {
$this->myLogger->logme("error", "Commission record not found for ID: $id");
return [];
}
// 2. Convert commission_month → OCT2025
$month = date("M", strtotime($commission_data['commission_month']));
$year = date("Y", strtotime($commission_data['commission_month']));
$monthFolder = strtoupper($month . $year);
// 3. Path
$fileName = $commission_data['insurer_id'] . '_' . $commission_data['department'] . '.json';
$filePath = WRITEPATH . "uploads/commission/rules/" . $monthFolder . "/" . $fileName;
if (!file_exists($filePath)) {
$this->myLogger->logme("error", "Rule file not found: $filePath");
return [];
}
// 4. Read JSON
$json = file_get_contents($filePath);
$rules = json_decode($json, true);
if(!empty($rules)){
return $rules;
}else{
return [];
}
}
public function saveRule()
{
$post_data = $this->request->getPost();
$file_id = $post_data['file_id'];
$return = $this->updateCommissionRules($file_id, $post_data);
// print_r($return); die;
if(empty($post_data['rule_id'])){
$success_message = "New rule created successfully";
$error_message = "Failed to created the new rule";
}else{
$success_message = "Rule updated successfully";
$error_message = "Failed to update the rule";
}
if($return['status'] == true){
$data = $this->getRuleJson($file_id);
return $this->respond(['status' => true, 'code' => 200, 'data' => $data, 'message' => $success_message], 200);
}else{
return $this->respond(['status' => false, 'code' => 400, 'message' => $error_message], 200);
}
}
public function removeRule()
{
$post_data = $this->request->getPost();
$file_id = $post_data['file_id'];
$return = $this->updateCommissionRules($file_id, $post_data);
// print_r($return); die;
$success_message = "Rule deleted successfully";
$error_message = "Failed to delete the rule";
if($return['status'] == true){
$data = $this->getRuleJson($file_id);
return $this->respond(['status' => true, 'code' => 200, 'data' => $data, 'message' => $success_message], 200);
}else{
return $this->respond(['status' => false, 'code' => 400, 'message' => $error_message], 200);
}
}
public function checkRuleUsage()
{
$rule_id = $this->request->getGet('rule_id');
$count = $this->partnerPolicyModel->where('commission_applied_rule', $rule_id)
->countAllResults();
// $count = 1;
return $this->respond(['status' => true, 'code' => 200, 'count' => $count, 'message' => ""], 200);
}
}

View File

@ -102,16 +102,19 @@ class ThzController extends BaseController
public function ticketList()
{
try {
// try {
$returnType = strtolower($this->request->getGet('return_type') ?? 'api');
$data = $this->request->getGet();
if ($returnType === 'web' && in_array(get_role_id(), [3, 4])) {
if ($returnType === 'web' && in_array(get_role_id(), [4])) {
$data['assign_to'] = $data['assign_to'] ?? get_session_userid();
}
if ($returnType === 'web' && in_array(get_role_id(), [3])) {
$data['clientIds'] = $this->clientModel->getClientIdBasedonLoggedInSessionID();
}
$tickets = $this->fetchTicketsBasedOnrole($data);
@ -124,8 +127,9 @@ class ThzController extends BaseController
} else {
$data['ticket_data'] = $tickets;
$data['assignee'] = $this->userModel->where('is_active', 1)->whereIn('role', ['3', '4'])->findAll();
// enga 5-"head" and 1-"admin" assign pannvaga so dropdown la varakudhathu , 2-"manager l2 " - ivangalum assign pannalam
// 3,4 remain person varannum.
// enga 5-"head" and 1-"admin" assign pannvaga so dropdown la varakudhathu , 2-"manager l2 " - ivangalum assign pannalam. 3,4 remain person varannum dropdown la.
// Roles - 5 (Head) , 1 (Admin) and 2 (Manager) are already assigned to others, so the dropdown should not be shown.
// 3 (Account Manager) and 4 (Staff) should be selectable, so have to show in dropdown .
$data['client_list'] = $this->clientModel->getCreatedByUserName();
$data['ticket_type'] = $this->thzTypeModel->where('is_active', 1)->findAll();
$data['tab_name'] = "Tickets";
@ -138,9 +142,9 @@ class ThzController extends BaseController
'status' => 'success',
'data' => $tickets,
])->setStatusCode(200);
} catch (\Throwable $e) {
return handle_exception($e, $this->myLogger, $this->response);
}
// } catch (\Throwable $e) {
// return handle_exception($e, $this->myLogger, $this->response);
// }
}
public function ticketConversationSave()
@ -348,6 +352,7 @@ class ThzController extends BaseController
// $id = $data['thz_id'] ?? null;
$assign_to = $data['assign_to'] ?? null;
$mobile = $data['mobile'] ?? null;
$clientIds = $data['clientIds'] ?? null;
if (!empty($assign_to)) {
// Tickets assigned to a staff
@ -371,6 +376,17 @@ class ThzController extends BaseController
->findAll();
}
if (!empty($clientIds)) {
return $this->thzMasterModel
->select('thz_master.*, user_profiles.first_name as assignee_name')
->join('user_profiles', 'user_profiles.id = thz_master.assign_to', 'left')
->whereIn('thz_master.client_id', $clientIds)
->orderBy('thz_master.created_at', 'desc')
->findAll();
}
// All tickets (e.g., for managers)
return $this->thzMasterModel
->select('thz_master.*, user_profiles.first_name as assignee_name')

View File

@ -26,6 +26,7 @@ use App\Models\VehicleModel;
use App\Models\PartnerPolicyModel;
use DOMDocument;
use DOMXPath;
use Psr\Log\LoggerInterface;
use Kint\Kint;
@ -1313,7 +1314,7 @@ class TicketController extends BaseController
}
}
public function convertHtmlToText($html)
public function convertHtmlToTextOld($html)
{
if(!empty($html)){
$dom = new DOMDocument();
@ -1324,6 +1325,36 @@ class TicketController extends BaseController
}
}
public function convertHtmlToText($html)
{
if (empty($html)) {
return '';
}
// Remove BOM / strange characters
$html = preg_replace('/[\x00-\x1F\x80-\xFF]/', ' ', $html);
// Load HTML safely
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
// Remove style and script tags
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//style|//script') as $node) {
$node->parentNode->removeChild($node);
}
// Extract clean text
$text = $dom->textContent;
// Clean extra spaces
$text = preg_replace('/\s+/', ' ', $text);
return trim($text);
}
public function removeTicket()
{
$ticket_id = $this->request->getGet('ticket_id');
@ -2068,7 +2099,7 @@ class TicketController extends BaseController
->join('policy_type', 'policy_type.id = client_policy.policy_type_id AND policy_type.is_active = 1')
->join('insurers', 'insurers.id = client_policy.insurer_id AND insurers.is_active = 1', 'left')
->join('tpa', 'tpa.id = client_policy.tpa_id AND tpa.is_active = 1', 'left')
->where('client_policy.policy_status', 1)
// ->where('client_policy.policy_status', 1)
->whereIn('client_policy.id', $policy_ids)
->findAll();

View File

@ -20,6 +20,7 @@ use App\Models\AuthHistoryModel;
use App\Models\UserActivityHistoryModel;
use App\Models\PartnerStaffModel;
use App\Models\PartnerManagerIncentiveFileModel;
use App\Models\NhanceBranchModel;
class UserController extends AdminController
@ -36,6 +37,7 @@ class UserController extends AdminController
protected $userActivityHistoryModel;
protected $partnerStaffModel;
protected $partnerManagerIncentiveFileModel;
protected $nhanceBranchModel;
public function __construct()
{
@ -51,6 +53,7 @@ class UserController extends AdminController
$this->userActivityHistoryModel = new UserActivityHistoryModel();
$this->partnerStaffModel = new PartnerStaffModel();
$this->partnerManagerIncentiveFileModel = new PartnerManagerIncentiveFileModel();
$this->nhanceBranchModel = new NhanceBranchModel();
}
public function list()
@ -63,6 +66,7 @@ class UserController extends AdminController
// print_r($data); die;
$data['roleData'] = $this->roleModel->select('id, role')->findAll();
$data['teamData'] = $this->teamModel->select('id, name')->where('is_active',1)->findAll();
$data['NHanceBranchData'] = $this->nhanceBranchModel->select('id, branch_name')->where('is_active',1)->findAll();
$this->loadLayout('UserList', $data);
}
@ -70,6 +74,7 @@ class UserController extends AdminController
public function create()
{
$this->myLogger->logme('error', 'User create function called');
dd($this->request->getPost());
$teams = $this->request->getPost('team');
//if this is get method return to user creation page

422
app/Filters/Cors.php Normal file
View File

@ -0,0 +1,422 @@
<?php
namespace App\Filters;
use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
/**
* CORS (Cross-Origin Resource Sharing) Filter
*
* Handles CORS preflight requests and adds appropriate CORS headers to responses.
* Configurable via environment variables for flexibility across different environments.
*
* @package App\Filters
*/
class Cors implements FilterInterface
{
/**
* List of allowed origins (domains that can access this API)
* Can include wildcards like *.example.com
*
* @var array<string>
*/
protected array $allowedOrigins = [];
/**
* Whether to allow credentials (cookies, authorization headers) in CORS requests
* WARNING: Cannot be true if using wildcard (*) origin
*
* @var bool
*/
protected bool $allowCredentials = false;
/**
* HTTP methods allowed for CORS requests
*
* @var string
*/
protected string $allowedMethods = 'GET,POST,PUT,PATCH,DELETE,OPTIONS';
/**
* HTTP headers allowed in CORS requests
*
* @var string
*/
protected string $allowedHeaders = 'Content-Type,Authorization,X-Requested-With,Accept,Origin';
/**
* Headers exposed to the client (accessible via JavaScript)
*
* @var string
*/
protected string $exposeHeaders = '';
/**
* How long (in seconds) the preflight response can be cached
* Default: 24 hours (86400 seconds)
*
* @var int
*/
protected int $maxAge = 86400;
/**
* Whether to enable debug logging for CORS requests
*
* @var bool
*/
protected bool $debug = false;
/**
* Initialize CORS configuration from environment variables
*
* @throws \RuntimeException If configuration is invalid
*/
protected $myLogger;
public function __construct()
{
$this->myLogger = \Config\Services::mylogger();
// Parse allowed origins from environment variable
// Format: comma or semicolon separated list
// Examples: "https://example.com,https://app.example.com" or "*.example.com"
$raw = env('CORS_ALLOWED_ORIGINS', '*');
$parts = preg_split('/\s*[,;]\s*/', trim($raw));
$this->allowedOrigins = array_filter(array_map('trim', $parts));
// Load other configuration from environment
$this->allowCredentials = filter_var(
env('CORS_ALLOW_CREDENTIALS', false),
FILTER_VALIDATE_BOOLEAN
);
$this->allowedMethods = env('CORS_ALLOWED_METHODS', $this->allowedMethods);
$this->allowedHeaders = env('CORS_ALLOWED_HEADERS', $this->allowedHeaders);
$this->exposeHeaders = env('CORS_EXPOSE_HEADERS', $this->exposeHeaders);
$this->maxAge = (int) env('CORS_MAX_AGE', $this->maxAge);
$this->debug = filter_var(env('CORS_DEBUG', false), FILTER_VALIDATE_BOOLEAN);
// Security validation: wildcard origin cannot be used with credentials
// This is a browser security requirement, not just a best practice
if ($this->allowCredentials && in_array('*', $this->allowedOrigins, true)) {
throw new \RuntimeException(
'CORS configuration error: Cannot use wildcard (*) origin with credentials enabled. ' .
'This violates browser security policies. Either disable credentials or specify explicit origins.'
);
}
$this->log('CORS filter initialized', [
'allowed_origins' => $this->allowedOrigins,
'allow_credentials' => $this->allowCredentials,
'allowed_methods' => $this->allowedMethods,
]);
}
/**
* Check if a given origin is allowed to access this API
*
* Supports:
* - Exact matches: https://example.com
* - Wildcard origins: *.example.com
* - Scheme-less matching: example.com (matches http and https)
* - Universal wildcard: *
*
* @param string|null $origin The Origin header from the request
* @return bool True if origin is allowed, false otherwise
*/
protected function isOriginAllowed(?string $origin): bool
{
// Reject empty origins
if (empty($origin)) {
$this->log('Origin rejected: empty origin header');
return false;
}
// Validate origin format - must include scheme (http:// or https://)
// This prevents malformed origins from being accepted
if (!preg_match('#^https?://#i', $origin)) {
$this->log('Origin rejected: invalid format (missing scheme)', ['origin' => $origin]);
return false;
}
// If wildcard present in configuration, allow any origin
if (in_array('*', $this->allowedOrigins, true)) {
$this->log('Origin allowed: wildcard match', ['origin' => $origin]);
return true;
}
// Parse the host from the origin for wildcard matching
// Example: https://app.example.com:8080 → app.example.com
$originHost = parse_url($origin, PHP_URL_HOST) ?: $origin;
foreach ($this->allowedOrigins as $allowed) {
if ($allowed === '') {
continue;
}
// 1. Exact match (including scheme and port)
// Example: https://example.com matches https://example.com
if (strcasecmp($allowed, $origin) === 0) {
$this->log('Origin allowed: exact match', [
'origin' => $origin,
'matched_rule' => $allowed
]);
return true;
}
// 2. Handle scheme-less and wildcard patterns
// If the allowed entry doesn't contain ://, it's either a host-only or wildcard pattern
if (strpos($allowed, '://') === false) {
// 2a. Wildcard subdomain pattern: *.example.com
// Matches: app.example.com, api.example.com, dev.app.example.com
// Does NOT match: example.com (use explicit entry for root domain)
if (strpos($allowed, '*.') === 0) {
$allowedRoot = substr($allowed, 2); // Remove *. prefix
// Check if origin host ends with the allowed root domain
if ($originHost === $allowedRoot || str_ends_with($originHost, '.' . $allowedRoot)) {
$this->log('Origin allowed: wildcard subdomain match', [
'origin' => $origin,
'matched_rule' => $allowed,
'origin_host' => $originHost
]);
return true;
}
}
// 2b. Direct host match (scheme-less)
// Allows both http and https for the same host
// Example: example.com matches both http://example.com and https://example.com
else {
if (strcasecmp($allowed, $originHost) === 0) {
$this->log('Origin allowed: host match (scheme-less)', [
'origin' => $origin,
'matched_rule' => $allowed,
'origin_host' => $originHost
]);
return true;
}
}
}
}
// No match found - reject this origin
$this->log('Origin rejected: no matching rule', [
'origin' => $origin,
'checked_rules' => $this->allowedOrigins
]);
return false;
}
/**
* Build the Access-Control-Allow-Origin header value
*
* Returns either:
* - '*' if wildcard is configured and credentials are disabled
* - The actual origin value if credentials are enabled or specific origins configured
*
* Note: When credentials are enabled, you MUST echo back the specific origin,
* browsers reject wildcard with credentials.
*
* @param string $origin The validated origin
* @return string The value for Access-Control-Allow-Origin header
*/
protected function buildAllowOriginHeader(string $origin): string
{
// If wildcard configured and credentials NOT required, can safely return '*'
// This allows any origin to access the resource
if (in_array('*', $this->allowedOrigins, true) && !$this->allowCredentials) {
return '*';
}
// Otherwise, must return the specific origin
// This is required when allow-credentials is true
return $origin;
}
/**
* Add all CORS headers to the response
*
* This method is called for both preflight and actual requests
* to ensure consistent CORS headers across all responses.
*
* @param ResponseInterface $response The response object to add headers to
* @param RequestInterface $request The original request
* @param string $origin The validated origin
* @param bool $isPreflight Whether this is a preflight OPTIONS request
* @return void
*/
protected function addCorsHeaders(
ResponseInterface $response,
RequestInterface $request,
string $origin,
bool $isPreflight = false
): void {
// CRITICAL: Vary header prevents caching issues
// Without this, a cached response for origin A might be served to origin B,
// causing CORS errors because the Access-Control-Allow-Origin won't match
$response->setHeader('Vary', 'Origin');
// Set the allowed origin
$allowOrigin = $this->buildAllowOriginHeader($origin);
$response->setHeader('Access-Control-Allow-Origin', $allowOrigin);
// If credentials are allowed, set the header
// This allows cookies, authorization headers, and TLS client certificates
if ($this->allowCredentials) {
$response->setHeader('Access-Control-Allow-Credentials', 'true');
}
// Allowed HTTP methods
$response->setHeader('Access-Control-Allow-Methods', $this->allowedMethods);
// Handle allowed headers
if ($isPreflight) {
// For preflight: respect what the browser is asking for
// The browser sends Access-Control-Request-Headers to ask permission
$requestedHeaders = $request->getHeaderLine('Access-Control-Request-Headers');
$response->setHeader(
'Access-Control-Allow-Headers',
$requestedHeaders ?: $this->allowedHeaders
);
} else {
// For actual requests: use configured headers
// Access-Control-Request-Headers is only for preflight
$response->setHeader('Access-Control-Allow-Headers', $this->allowedHeaders);
}
// Expose additional headers to the client (accessible via JavaScript)
// Without this, only simple headers are accessible: Cache-Control, Content-Language,
// Content-Type, Expires, Last-Modified, Pragma
if (!empty($this->exposeHeaders)) {
$response->setHeader('Access-Control-Expose-Headers', $this->exposeHeaders);
}
// Cache duration for preflight responses
// Reduces preflight requests by allowing browser to cache the permissions
if ($this->maxAge > 0) {
$response->setHeader('Access-Control-Max-Age', (string) $this->maxAge);
}
}
/**
* Execute before the controller
*
* Handles preflight OPTIONS requests by returning early with appropriate headers.
* For other requests, allows them to proceed to the controller.
*
* @param RequestInterface $request The request object
* @param mixed $arguments Optional arguments
* @return ResponseInterface|null Response for preflight, null for other requests
*/
public function before(RequestInterface $request, $arguments = null)
{
$origin = $request->getHeaderLine('Origin') ?: '';
$method = strtoupper($request->getMethod());
// Handle preflight OPTIONS requests
// Preflight is sent by browsers before actual cross-origin requests
// to check if the actual request is safe to send
if ($method === 'OPTIONS') {
$this->log('Preflight request received', [
'origin' => $origin,
'method' => $method,
'uri' => (string) $request->getUri()
]);
// Validate origin - reject if not allowed
if (empty($origin) || !$this->isOriginAllowed($origin)) {
$this->log('Preflight rejected: origin not allowed', ['origin' => $origin]);
// Return 403 Forbidden for rejected origins
// Some prefer 200 with no CORS headers, but 403 is more explicit
return Services::response()
->setStatusCode(403)
->setJSON(['error' => 'Origin not allowed']);
}
// Origin is valid - build preflight response
$response = Services::response();
$this->addCorsHeaders($response, $request, $origin, true);
// 204 No Content is the standard response for successful preflight
// It indicates "permission granted, but no data to return"
$response->setStatusCode(204);
$response->setBody('');
$this->log('Preflight approved', [
'origin' => $origin,
'allowed_methods' => $this->allowedMethods
]);
return $response;
}
// For non-OPTIONS requests, don't return a response
// Let the request proceed to the controller
// CORS headers will be added in after() method
return null;
}
/**
* Execute after the controller
*
* Adds CORS headers to the response for actual (non-preflight) requests.
* This ensures all API responses include proper CORS headers.
*
* @param RequestInterface $request The request object
* @param ResponseInterface $response The response object
* @param mixed $arguments Optional arguments
* @return void
*/
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
{
$origin = $request->getHeaderLine('Origin') ?: '';
// Only add CORS headers if origin is present and allowed
// No origin header means it's a same-origin request (no CORS needed)
if (empty($origin)) {
return;
}
if (!$this->isOriginAllowed($origin)) {
$this->log('Response blocked: origin not allowed', [
'origin' => $origin,
'uri' => (string) $request->getUri()
]);
return;
}
// Add CORS headers to the response
$this->addCorsHeaders($response, $request, $origin, false);
$this->log('CORS headers added to response', [
'origin' => $origin,
'status' => $response->getStatusCode()
]);
}
/**
* Log debug information if debug mode is enabled
*
* Logs to CodeIgniter's log system at 'info' level.
* Enable with CORS_DEBUG=true in .env file.
*
* @param string $message The log message
* @param array $context Additional context data
* @return void
*/
protected function log(string $message, array $context = []): void
{
if (!$this->debug) {
return;
}
// $logger = Services::logger();
$contextString = !empty($context) ? json_encode($context, JSON_UNESCAPED_SLASHES) : '';
$this->myLogger->logme('error','[CORS] ' . $message . ($contextString ? ' | ' . $contextString : ''));
// $logger->info('[CORS] ' . $message . ($contextString ? ' | ' . $contextString : ''));
}
}

View File

@ -318,7 +318,7 @@ class MailHelper
$attachments = isset($params['attachments']) ? $params['attachments'] : [];
$common = isset($params['common']) ? $params['common'] : '';
$bcc = isset($params['bcc']) ? $params['bcc'] : '';
$cc = isset($params['cc']) ? $params['cc'] : '';
$cc = (isset($params['cc']) && !empty($params['cc'])) ? $params['cc'] : '';
$from_address = isset($params['from_mail']) && !empty($params['from_mail']) ? $params['from_mail'] : getenv('email.fromEmail');
// $from_address = "claims@nhanceindia.in";

View File

@ -50,7 +50,6 @@ if (!function_exists('check_columns_name')) {
}
}
if (!function_exists('check_row_is_empty_or_null')) {
function check_row_is_empty_or_null($arr)
@ -89,7 +88,6 @@ if (!function_exists('check_excel_date_format')) {
}
}
if (!function_exists('check_relationship')) {
function check_relationship($row, $relationship, $policy_terms)
{
@ -132,7 +130,6 @@ if (!function_exists('check_relationship')) {
}
}
if (!function_exists('check_doj')) {
function check_doj($row)
@ -179,7 +176,6 @@ if (!function_exists('check_doc')) {
}
}
if (!function_exists('check_employee_band')) {
function check_employee_band($row, $policy_terms, $slab_details)
{
@ -218,7 +214,6 @@ if (!function_exists('check_employee_band')) {
}
}
if (!function_exists('check_si')) {
function check_si($row, $policy_details, $slab_details)
{
@ -326,7 +321,6 @@ if (!function_exists('check_basic_pay')) {
}
}
if (!function_exists('check_dob_diff')) {
function check_dob_diff($row, $relationships, $default_age_ratio, $policy_details)
{
@ -381,6 +375,10 @@ if (!function_exists('data_group_by_family')) {
if ($data_source == 'excel') {
if (!check_row_is_empty_or_null($row)) {
if(empty($action)){
$row['data_from'] = "excel";
}
// for this condition to avoid 5,00,000 to 500000
if($current_column_action == 'SI'){
$row[3] = removeNumberFormatting($row[3]);
@ -398,6 +396,8 @@ if (!function_exists('data_group_by_family')) {
} else {
$result[$row[1]][] = $row;
}
}
} else if ($data_source = 'db') {
if (strtolower($row['relationship']) == 'self' && isset($result[$row['emp_code']])) {
@ -464,8 +464,6 @@ if (!function_exists('check_self_available_in_family')) {
}
}
if (!function_exists('name_and_empid_check_in_db')) {
function name_and_empid_check_in_db($family_data, $actionArr)
{
@ -955,7 +953,6 @@ if (!function_exists('calculate_premium_new')) {
}
}
if (!function_exists('transform_excel_data_to_db')) {
function transform_excel_data_to_db($memArr, $actionArr)
{
@ -1022,12 +1019,19 @@ if (!function_exists('transform_excel_data_to_db')) {
$result['temp']['rata_premimum'] = isset($memArr['temp']['rata_premimum']) ? $memArr['temp']['rata_premimum'] : 0;
$result['policy_details'] = $policy;
if(isset($memArr['self_rata_premium'])){
$result['self_rata_premium'] = $memArr['self_rata_premium'] ?? 0;
}
if(isset($memArr['data_from'])){
$result['data_from'] = $memArr['data_from'] ?? 'excel';
}
return $result;
}
}
}
if (!function_exists('premium_calculation_manager_old')) {
function premium_calculation_manager_old($emp_data, $policy_terms, $slab_details, $default_si = null)
{
@ -1839,6 +1843,15 @@ if (!function_exists('premium_calculation_manager')) {
//set dependent si to 0
$emp_data['policy_details']['basic_cover_si'] = 0;
$emp_data['policy_details']['premium'] = 0;
if(isset($emp_data['self_rata_premium']) && !empty($emp_data['self_rata_premium'])){
$self_rata_premium = (int)($emp_data['self_rata_premium'] ?? 0);
$dependent_rata_premium = (int)($emp_data['policy_details']['rata_premimum'] ?? 0);
$actual_rata_premium = abs($dependent_rata_premium - $self_rata_premium);
$emp_data['policy_details']['rata_premimum'] = $actual_rata_premium;
$emp_data['policy_details']['gst'] = (float) number_format(($emp_data['policy_details']['rata_premimum'] * ($gst / 100)), 2, '.', '');
}
}else if(strtolower($emp_data['relationship']) != 'self' && $temp_slab_rates[0]['premium_type'] == 1 && ($emp_data['temp']['action'] == 'I' || $emp_data['temp']['action'] == 'A' || $emp_data['temp']['action'] == 'MI')){
$emp_data['policy_details']['basic_cover_si'] = 0;
@ -1853,7 +1866,6 @@ if (!function_exists('premium_calculation_manager')) {
}
}
if (!function_exists('calculate_pro_rata_premimum')) {
function calculate_pro_rata_premimum($premium, $employee_policy_coverage_days, $policy_coverage_days)
{
@ -1976,7 +1988,6 @@ if (!function_exists('get_emp_policy_records_from_audit_history')) {
}
}
if (!function_exists('replace_original_data')) {
function replace_original_data(array $original_data, array $current_data)
{
@ -2048,7 +2059,6 @@ if (!function_exists('remap_default_age_ratio_into_relationship')) {
}
}
if (!function_exists('check_dup_mobileno')) {
function check_dup_mobileno(array $row, array $existing_mobilenos)
{
@ -2178,7 +2188,6 @@ if (!function_exists('convert_string_to_date')) {
}
}
if (!function_exists('transform_enrollment_row_to_inception_row')) {
function transform_enrollment_row_to_inception_row($row)
{
@ -2414,7 +2423,6 @@ if (!function_exists('check_unit')) {
}
}
if (!function_exists('transform_si_excel_row_to_calculatable_format')) {
function transform_si_excel_row_to_calculatable_format(array $employee, array $employee_policy, array $maxage_and_maxcount, array $slab_details, string $applicable_slab_name, string $augmented_si, array $grid_master)
{
@ -2874,3 +2882,458 @@ if (!function_exists('is_valid_or_empty_email')) {
}
}
if (!function_exists('validatet_family_floter_rata_premium')) {
function validatet_family_floter_rata_premium($family){
// print_rr($family); die;
if (count($family) === 2) {
return $family; // skip if only two members
}
$excelCount = count(array_filter($family, fn($r) => ($r['data_from'] ?? '') === 'excel') ?? []);
$reset_family_premium = false;
$dependentRataGiven = false;
if($excelCount == 1){
$selfPremium = 0;
$familyPremium = 0;
foreach ($family as $row) {
// Get self premium
if (isset($row['relationship']) && strtolower($row['relationship']) == 'self') {
$selfPremium = (float) ($row['policy_details']['rata_premimum'] ?? 0);
}
// Sum the dependents premium
if (isset($row['relationship']) && strtolower($row['relationship']) !== 'self')
{
$familyPremium += (float) ($row['policy_details']['rata_premimum'] ?? 0);
}
}
if($selfPremium > $familyPremium || $selfPremium == $familyPremium){
$reset_family_premium = true;
}
}
foreach ($family as &$row) {
// Skip if the member is self
if (isset($row['relationship']) && strtolower($row['relationship']) == 'self') {
continue;
}
// For dependents
if (isset($row['temp']['premium_type']) && $row['temp']['premium_type'] == 1) {
if (!$dependentRataGiven && isset($row['data_from']) && $row['data_from'] === 'excel') {
// First eligible dependent keeps premium
$dependentRataGiven = true;
} else if(isset($row['data_from']) && $row['data_from'] === 'excel'){
$row['policy_details']['rata_premimum'] = 0;
$row['policy_details']['gst'] = 0;
}
if($reset_family_premium == true && isset($row['data_from']) && $row['data_from'] === 'excel'){
$row['policy_details']['rata_premimum'] = 0;
$row['policy_details']['gst'] = 0;
}
}
}
return $family;
}
}
if (!function_exists('validate_excel_value')) {
function validate_excel_value($value, $data_type, $format = null, $allowed_values = null)
{
switch ($data_type) {
case 'date':
return validate_date_value($value, $format);
case 'mobile':
return validate_mobile_value($value);
case 'email':
return validate_email_value($value);
case 'vehicle':
return validate_indian_vehicle_number($value);
default:
return [
'status' => true,
'error' => null
];
}
}
}
if (!function_exists('validate_date_value')) {
function validate_date_value($value, $format)
{
if(empty($value)) {
return ['status' => true, 'error' => null]; // allow empty
}
$d = DateTime::createFromFormat($format, $value);
if ($d && $d->format($format) === $value) {
return ['status' => true, 'error' => null];
}
return [
'status' => false,
'error' => "Invalid date format. Expected format: {$format}"
];
}
}
if (!function_exists('validate_mobile_value')) {
function validate_mobile_value($value)
{
if (preg_match('/^[0-9]{10}$/', $value)) {
return ['status' => true, 'error' => null];
}
return [
'status' => false,
'error' => "Invalid mobile number. Expected 10 digits."
];
}
}
if (!function_exists('validate_email_value')) {
function validate_email_value($value)
{
if (filter_var($value, FILTER_VALIDATE_EMAIL)) {
return ['status' => true, 'error' => null];
}
return [
'status' => false,
'error' => "Invalid email address."
];
}
}
if (!function_exists('validate_indian_vehicle_number')) {
function validate_indian_vehicle_number($number)
{
$number = strtoupper(trim($number));
// Normal Format:
// 2 letters (state) + 2 digits (district) + 1 or 2 letters (series) + 4 digits
$normalPattern = '/^[A-Z]{2}[0-9]{2}[A-Z]{1,2}[0-9]{4}$/';
// BH Series: 22BH1234AA
$bhPattern = '/^[0-9]{2}BH[0-9]{4}[A-Z]{2}$/';
if (preg_match($normalPattern, $number)) {
return ['status' => true, 'error' => null];
}
if (preg_match($bhPattern, $number)) {
return ['status' => true, 'error' => null];
}
return [
'status' => false,
'error' => "Invalid Vehicle Number"
];
}
}
if (!function_exists('check_user_exist')) {
function check_user_exist($row, $col_key, $user_data)
{
// Get the uploaded value from the column
$input_value = trim($row[$col_key]);
// Loop DB user list
foreach ($user_data as $user) {
// Check if DB has 'first_name' key and matches input
if (isset($user['first_name']) && strtolower(trim($user['first_name'])) === strtolower($input_value)) {
return [
'status' => true,
'error' => null,
'user' => $user,
];
}
}
// If no user matched
return [
'status' => false,
'error' => "User '{$input_value}' not found in database."
];
}
}
if (!function_exists('check_agent_exist')) {
function check_agent_exist($row, $agent_data)
{
// Get agent code from the uploaded row
$agent_code = trim($row[15]); // or use index if needed
// Loop agent data from DB
foreach ($agent_data as $agent) {
// Assuming DB keys: agent_code
if (isset($agent['agent_code']) && $agent['agent_code'] == $agent_code) {
return [
'status' => true,
'error' => null,
'agent' => $agent,
];
}
}
// If not matched
return [
'status' => false,
'error' => "Agent code '{$agent_code}' not found in database."
];
}
}
if (!function_exists('check_rto_data')) {
function check_rto_data($row, $rto_master)
{
// Vehicle number from uploaded row
$vehicle_no = strtoupper(trim($row[2])); // Example: TN10AB1234
// Must be at least 4 characters to extract RTO
if (strlen($vehicle_no) < 4) {
return [
'status' => false,
'error' => "Invalid vehicle number format: '{$vehicle_no}'"
];
}
// Extract State (first 2 letters) and RTO Code (next 2 digits)
$state_code = substr($vehicle_no, 0, 2); // TN
$rto_code = substr($vehicle_no, 2, 2); // 10
// Validate they are correct format
if (!ctype_alpha($state_code) || !ctype_digit($rto_code)) {
return [
'status' => false,
'error' => "Vehicle number '{$vehicle_no}' has invalid state or RTO code."
];
}
// Loop RTO master data
foreach ($rto_master as $rto) {
// Expected DB fields: rto_state, rto_code
if (
isset($rto['rto_state']) &&
isset($rto['rto_code']) &&
strtoupper($rto['rto_state']) === $state_code &&
(string)$rto['rto_code'] === $rto_code
) {
return [
'status' => true,
'error' => null,
'rto_data' => $rto
];
}
}
// Not found in RTO master
return [
'status' => false,
'error' => "RTO '{$state_code} {$rto_code}' not found in RTO master."
];
}
}
if (!function_exists('check_vehicle_type')) {
function check_vehicle_type($row, $vehicle_type)
{
// Vehicle type from uploaded Excel row
$input_type = strtolower(trim($row[3])); // Example: CAR
// Loop vehicle type master
foreach ($vehicle_type as $vt) {
if (isset($vt['vehicle_type']) && strtolower($vt['vehicle_type']) == $input_type) {
return [
'status' => true,
'error' => null,
'vehicle_type' => $vt,
];
}
}
// Not found in master
return [
'status' => false,
'error' => "Vehicle type '{$input_type}' not found in master."
];
}
}
if (!function_exists('check_policy_no')) {
function check_policy_no($row, $pt_data)
{
// Get policy number from Excel row
$policy_no = strtolower(trim($row[4]));
// Empty policy number
if ($policy_no === '') {
return [
'status' => false,
'error' => "Policy number is empty."
];
}
// Loop all policy transactions (pt_data)
foreach ($pt_data as $pt) {
// Check policy_no exists in DB list
if (isset($pt['policy_no']) && strtolower($pt['policy_no']) == $policy_no) {
return [
'status' => false,
'error' => "Duplicate policy number '{$policy_no}' found in database."
];
}
}
// If no match found → not duplicate
return [
'status' => true,
'error' => null
];
}
}
if (!function_exists('check_insurer_exist')) {
function check_insurer_exist($row, $insurer_master)
{
// Get insurer short name from Excel row (col 7)
$short_name = strtolower(trim($row[7]));
foreach ($insurer_master as $insurer) {
if (
isset($insurer['short_name']) &&
strtolower($insurer['short_name']) === $short_name
) {
return [
'status' => true,
'error' => null,
'insurer' => $insurer // return entire insurer row for next validation
];
}
}
return [
'status' => false,
'error' => "Insurer '{$short_name}' not found in database."
];
}
}
if (!function_exists('check_insurer_branch_exist')) {
function check_insurer_branch_exist($row, $insurer_branch_master, $insurer)
{
// Get branch code from Excel row (col 8)
$branch_code = strtolower(trim($row[8]));
// Loop all branches
foreach ($insurer_branch_master as $branch) {
if (
isset($insurer['id']) && $branch['insurer_id'] == $insurer['id'] &&
strtolower($branch['branch_code']) == $branch_code
) {
return [
'status' => true,
'error' => null,
'branch' => $branch
];
}
}
return [
'status' => false,
'error' => "Branch code '{$branch_code}' not found in database."
];
}
}
if (!function_exists('check_nhance_branch')) {
function check_nhance_branch($row, $nhance_branch_master)
{
// Get branch name from Excel row (col 8)
$branch_name = strtolower(trim($row[1]));
// Loop all branches
foreach ($nhance_branch_master as $branch) {
if (
isset($branch['branch_name']) &&
strtolower($branch['branch_name']) == $branch_name
) {
return [
'status' => true,
'error' => null,
'branch' => $branch
];
}
}
return [
'status' => false,
'error' => "Branch '{$branch_name}' not found in database."
];
}
}
if (!function_exists('calculate_gst_amount')) {
function calculate_gst_amount($row) {
// Extract values
$base_premium = (float)trim($row[16]);
$non_commission_premium_amount = (float)trim($row[17]);
$tp_premium = (float)trim($row[18]);
$igst = (float)trim($row[19]);
$cgst = (float)trim($row[20]);
$sgst = (float)trim($row[21]);
// Total GST percentage
$gst_percentage = $igst + $cgst + $sgst;
// Step 1: Choose taxable amount
if ($non_commission_premium_amount > 0) {
// GST on non-commission premium
$taxable_amount = $non_commission_premium_amount;
} else {
// GST on base premium + TP premium
$taxable_amount = $base_premium + $tp_premium;
}
// Step 2: GST Amount calculation
$gst_amount = ($taxable_amount * $gst_percentage) / 100;
return round($gst_amount, 2);
}
}

View File

@ -381,7 +381,7 @@ class sendMailNotification
}
$table_content .= $policy_name_for_policy_type . '</h4></div>';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
// Add text-align: center to the table head
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
@ -518,7 +518,7 @@ class sendMailNotification
}
$table_content .= $policy_name_for_policy_type . ' ( Payable By Employee ) </h4></div>';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
// Add text-align: center to the table head
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
@ -555,7 +555,7 @@ class sendMailNotification
if (count($Addon_list) > 0) {
$table_content .= '<br><div style="text-align: left; font-size: 12px;"><div style="text-align:left;">';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
// Center align for table header and body
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
@ -738,7 +738,7 @@ class sendMailNotification
}
$table_content .= $policy_name_for_policy_type . '</h4></div>';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
// Add text-align: center to the table head
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
@ -824,7 +824,7 @@ class sendMailNotification
}
$table_content .= $policy_name_for_policy_type . ' ( Payable By Employee ) </h4></div>';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
// Add text-align: center to the table head
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
@ -862,7 +862,7 @@ class sendMailNotification
if (count($Addon_list) > 0) {
$table_content .= '<br><div style="text-align: left; font-size: 12px;"><div style="text-align:left;">';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
// Center align for table header and body
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
@ -1046,7 +1046,7 @@ class sendMailNotification
}
$table_content .= $policy_name_for_policy_type . '</h4></div>';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
// Add text-align: center to the table head
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
@ -1132,7 +1132,7 @@ class sendMailNotification
}
$table_content .= $policy_name_for_policy_type . ' ( Payable By Employee ) </h4></div>';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
// Add text-align: center to the table head
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
@ -1169,7 +1169,7 @@ class sendMailNotification
if (count($Addon_list) > 0) {
$table_content .= '<br><div style="text-align: left; font-size: 12px;"><div style="text-align:left;">';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
// Center align for table header and body
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
@ -1502,7 +1502,7 @@ class sendMailNotification
// Start table row
$table_content .= $policy_name . '</h4></div>';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
$table_content .= '<tr>';
$table_content .= '<th>Name</th>';
@ -1554,7 +1554,7 @@ class sendMailNotification
// Generate summary table for addon if applicable
if (count($Addon_list) > 0) {
$table_content .= '<br><div style="text-align: left; font-size: 12px;"><div style="text-align:left;">';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
$table_content .= '<tr>';
@ -1657,7 +1657,7 @@ class sendMailNotification
// Start table row
$table_content .= $policy_name . '</h4></div>';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
$table_content .= '<tr>';
$table_content .= '<th>Name</th>';
@ -1709,7 +1709,7 @@ class sendMailNotification
// Generate summary table for addon if applicable
if (count($Addon_list) > 0) {
$table_content .= '<br><div style="text-align: left; font-size: 12px;"><div style="text-align:left;">';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
$table_content .= '<tr>';
@ -1812,7 +1812,7 @@ class sendMailNotification
// Start table row
$table_content .= $policy_name . '</h4></div>';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
$table_content .= '<tr>';
$table_content .= '<th>Name</th>';
@ -1865,7 +1865,7 @@ class sendMailNotification
if (count($Addon_list) > 0) {
$table_content .= '<br><div style="text-align: left; font-size: 12px;"><div style="text-align:left;">';
$table_content .= '<table data-custom-table-css="table" border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<table border="1" cellpadding="5" cellspacing="0" style="width:100%; border-collapse: collapse; font-size: 12px;">';
$table_content .= '<thead style="background-color: #02a8b5; color: #ffffff; text-align: center;">';
$table_content .= '<tr>';
@ -1900,7 +1900,7 @@ class sendMailNotification
$mail_content = str_replace(["[[member_summary]]", "{{member_summary}}"], $table_content , $mail_content);
$mail_content = preg_replace('/<p[^>]*>(&nbsp;|\s)*<\/p>/i', '', $mail_content);
$data['params'] = $params;$data['client_logo'] = $client_logo;
$data['mail_content'] = $mail_content;
$mail_content = view('mail_template', $data);

View File

@ -62,6 +62,7 @@ class RuleImportService
protected array $expectedColumns;
protected array $columnValidators;
protected array $incomingData;
protected string $annotatedDir;
protected string $department;
protected string $uploadedCommissionFileID;
@ -148,7 +149,7 @@ class RuleImportService
{
// dd($params);
$startTime = microtime(true);
$this->incomingData = $params;
try {
$this->department = $params['department'];
$this->uploadedCommissionFileID = $params['id'];
@ -898,13 +899,33 @@ class RuleImportService
*/
protected function convertRowToRule(array $rowData): array
{
$temp_rule_id = $this->generateRuleId($rowData);
//rule_e07f52d4366a2_32_oct2025_3_com
$conditions = $this->buildConditions($rowData);
// $temp_rule_id .= '_'.$this->incomingData['id'].'_'. strtolower(date('MY')).'_'.(count($conditions));
$monthFormatted = strtoupper(date('M', strtotime($this->incomingData['commission_month'])))
. date('Y', strtotime($this->incomingData['commission_month']));
$temp_rule_id .= '_'.$this->incomingData['id'].'_'.$monthFormatted;
$calculation = $this->buildCalculation($rowData);
// $temp_rule_id .= '_'.substr($calculation['type'], 0, 3);
$rule = [
'id' => $this->generateRuleId($rowData),
'id' => $temp_rule_id,
'name' => $this->sanitize($rowData[self::COL_RULE_NAME] ?? ''),
'department' => $this->department,
'is_deleted' => false,
'file_id' => $this->uploadedCommissionFileID,
'conditions' => $this->buildConditions($rowData),
'calculation' => $this->buildCalculation($rowData)
'conditions' => $conditions,
'calculation' => $calculation,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
'created_by' => $this->incomingData['created_by'],
'updated_by' => $this->incomingData['created_by'],
];
return $rule;
@ -1090,31 +1111,31 @@ class RuleImportService
if ($weightMin !== '' && $weightMax !== '') {
if ($weightMin === $weightMax) {
$conditions[] = [
'field' => 'vehicle_weight',
'field' => 'weight',
'operator' => '==',
'value' => (float)$weightMin
];
} else {
$conditions[] = [
'field' => 'vehicle_weight',
'field' => 'weight',
'operator' => '>=',
'value' => (float)$weightMin
];
$conditions[] = [
'field' => 'vehicle_weight',
'field' => 'weight',
'operator' => '<=',
'value' => (float)$weightMax
];
}
} elseif ($weightMin !== '') {
$conditions[] = [
'field' => 'vehicle_weight',
'field' => 'weight',
'operator' => '>=',
'value' => (float)$weightMin
];
} elseif ($weightMax !== '') {
$conditions[] = [
'field' => 'vehicle_weight',
'field' => 'weight',
'operator' => '<=',
'value' => (float)$weightMax
];
@ -1126,13 +1147,13 @@ class RuleImportService
if (count($states) > 1) {
$conditions[] = [
'field' => 'rto_state',
'field' => 'geo_rto_state',
'operator' => 'in',
'value' => $states
];
} else {
$conditions[] = [
'field' => 'rto_state',
'field' => 'geo_rto_state',
'operator' => '==',
'value' => $states[0]
];
@ -1145,13 +1166,13 @@ class RuleImportService
if (count($cities) > 1) {
$conditions[] = [
'field' => 'rto_city',
'field' => 'geo_rto_city',
'operator' => 'in',
'value' => $cities
];
} else {
$conditions[] = [
'field' => 'rto_city',
'field' => 'geo_rto_city',
'operator' => '==',
'value' => $cities[0]
];
@ -1170,7 +1191,7 @@ class RuleImportService
// Policy Name
if (!empty($rowData[self::COL_POLICY_NAME])) {
$conditions[] = [
'field' => 'policy_name',
'field' => 'product',
'operator' => '==',
'value' => $this->sanitize($rowData[self::COL_POLICY_NAME])
];

View File

@ -0,0 +1,55 @@
<?php
namespace App\Models;
use CodeIgniter\Model;
class BDSDumpModel extends Model
{
protected $table = 'bds_dump_files';
protected $primaryKey = 'id';
protected $allowedFields = [
"id",
"file_name",
"status",
"reason",
"created_by",
"created_at",
"updated_by",
"updated_at",
"is_active",
];
// Callbacks
protected $allowCallbacks = true;
protected $beforeInsert = ["checkAndADDCreatedByValue"];
protected $afterInsert = [];
protected $beforeUpdate = ["checkAndUpdateUpdatedByValue"];
protected $afterUpdate = [];
protected $beforeFind = [];
protected $afterFind = [];
protected $beforeDelete = [];
protected $afterDelete = [];
protected function checkAndADDCreatedByValue(array $data)
{
// Check if 'updated_by' value is null or empty
if (empty($data['data']['created_by'])) {
// Set 'updated_by' value to the current session user ID
$data['data']['created_by'] = get_session_userid();
}
return $data;
}
protected function checkAndUpdateUpdatedByValue(array $data)
{
// Check if 'updated_by' value is null or empty
if (empty($data['data']['updated_by'])) {
// Set 'updated_by' value to the current session user ID
$data['data']['updated_by'] = get_session_userid();
}
return $data;
}
}

View File

@ -90,7 +90,7 @@ class ClientModel extends Model
->join('policy_type pt','client_policy.policy_type_id = pt.id')
->where('client_policy.client_id',$client['id'])
->where('client_policy.is_active', 1)
->where('client_policy.policy_status', 1)
// ->where('client_policy.policy_status', 1)
->findAll();
$client['policies'] = $clientPolicies;
@ -239,5 +239,24 @@ class ClientModel extends Model
return $builder->getNumRows() > 0 ? true : false;
}
public function getClientIdBasedonLoggedInSessionID()
{
$user_id = get_session_userid();
$builder = $this->db->table('client_rm rm')
->select('c.id AS client_id')
->join('clients c', 'c.id = rm.client_id', 'inner')
->where('rm.is_active', 1)
->where('c.is_active', 1)
->where('rm.user_id', $user_id)
->get();
$result = $builder->getResultArray();
$clientIds = !empty($result) ? array_column($result, 'client_id') : [];
// print_r($clientIds);die;
return $clientIds;
}
}

View File

@ -133,7 +133,7 @@ class ClientPolicyModel extends Model
->join('policy_type', 'policy_type.id = client_policy.policy_type_id')
->join('client_branch', 'client_branch.id = client_policy.client_branch_id')
->where('client_policy.client_id', $client_id)
->where('client_policy.policy_status', 1)
// ->where('client_policy.policy_status', 1)
->where('client_policy.is_active', 1)
->get()
->getResult();

View File

@ -275,8 +275,8 @@ class EmployeeModel extends Model
->join('employee_polices', 'employees.id = employee_polices.employee_id', 'left')
->where('employees.is_active', 1)
->where('employee_polices.is_active', 1)
->where('employees.emp_status', "active")
->where('employee_polices.status', "active")
->whereIn('employees.emp_status', ['active', 'expired'])
->whereIn('employee_polices.status', ['active', 'expired'])
->where('employees.emp_code', $emp_code);
if(!empty($client_id)){

View File

@ -38,4 +38,29 @@ class InvoiceItemModel extends Model
protected $validationMessages = [];
protected $skipValidation = false;
protected $beforeInsert = ["checkAndAddCreatedByValue"];
protected $beforeUpdate = ["checkAndUpdateUpdatedByValue"];
protected function checkAndAddCreatedByValue(array $data)
{
// Check if 'updated_by' value is null or empty
if (empty($data['data']['created_by'])) {
// Set 'updated_by' value to the current session user ID
$data['data']['created_by'] = get_session_userid();
}
return $data;
}
protected function checkAndUpdateUpdatedByValue(array $data)
{
// Check if 'updated_by' value is null or empty
if (empty($data['data']['updated_by'])) {
// Set 'updated_by' value to the current session user ID
$data['data']['updated_by'] = get_session_userid();
}
return $data;
}
}

View File

@ -29,7 +29,7 @@ class InvoiceModel extends Model
protected $useTimestamps = false;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
// Validation (optional)
protected $validationRules = [
'invoice_no' => 'required|max_length[100]',
@ -101,7 +101,7 @@ class InvoiceModel extends Model
-- Payout status
CASE
WHEN payout_status = 1 THEN 'Pending'
WHEN payout_status = 2 THEN 'Complete'
WHEN payout_status = 2 THEN 'Completed'
END AS status_text,
partner_agent.name as agent_name
@ -143,9 +143,12 @@ class InvoiceModel extends Model
return $return_data;
}
public function agentList()
public function agentList($params = [])
{
return $this->db->table('partner_agent')->where('is_active', 1)->get()->getResultArray();
if(isset($params['is_active'])){
return $this->db->table('partner_agent')->where('is_active', $params['is_active'])->get()->getResultArray();
}
return $this->db->table('partner_agent')->get()->getResultArray();
}
public function utrSummary($invoice_id)
@ -175,7 +178,7 @@ class InvoiceModel extends Model
-- Payout status
CASE
WHEN payout_status = 1 THEN 'Pending'
WHEN payout_status = 2 THEN 'Complete'
WHEN payout_status = 2 THEN 'Completed'
END AS status_text,
partner_agent.name as agent_name
@ -187,4 +190,67 @@ class InvoiceModel extends Model
return $data;
}
public function payoutList($flag, $agentId = null, $invoiceId = null)
{
$builder = $this->db->table('policy_transaction pt')
->select('
pt.id,
pt.policy_no AS policyNo,
pt.agent_id AS agentId,
pp.insured_name AS customer,
pp.premium_amount AS premium,
COALESCE(pii.commission_amount, pp.commission_amount) AS commission,
pp.issued_date AS date_db,
DATE_FORMAT(pp.issued_date, "%d/%m/%Y") AS date,
pii.id AS invoiceItemId,
pii.commission_amount as paid_amount,
pi.payout_status,
pp.id as partner_policy_id,
pp.policy_transaction_id
')
->join('partner_invoice_items pii','pii.policy_no = pt.policy_no','left')
->join('partner_invoice pi','pi.id = pii.invoice_id','left')
->join('partner_policy pp','pt.policy_no = pp.policy_number AND pt.agent_id = pp.agent_id AND pt.id = pp.policy_transaction_id')
->where('pt.is_active',1)
->where('pt.agent_id IS NOT NULL');
if ($flag == 1) { // Add mode
// EXCLUDE all policies that exist in partner_invoice_items
$builder->where("pt.id NOT IN (SELECT policy_id FROM partner_invoice_items)", null, false);
}
if ($flag == 2) { // Edit mode
// Policies belonging to a specific invoice
$builder->where('pii.is_active',1);
if ($invoiceId) {
$builder->where('pi.id', $invoiceId); // only policies of this invoice
}
if ($agentId) {
$builder->where('pt.agent_id', $agentId);
}
}
if ($flag == 3) { // Extra policies
// Policies not assigned to any invoice
$builder->where('pii.id IS NULL', null, false);
if ($agentId) {
$builder->where('pt.agent_id', $agentId);
}
}
return $builder->get()->getResultArray();
}
public function agentListById($agentId)
{
return $this->db->table('partner_agent')
->where('id', $agentId)
->where('is_active', 1)
->get()
->getRowArray();
}
}

View File

@ -107,6 +107,7 @@ class LeadsModel extends Model
'quote_received_insurer',
'acm_id',
'policy_with_correction',
'agreed_percentage',
];

View File

@ -68,6 +68,8 @@ class PTCOShareDetailsModel extends Model
'non_comm_per_amt',
'cotp_amt',
'cotep_amt',
'pt_policy_issue_date',
'file_id',
];
public function getNonReconcileredPolicyTransactions(string $insurer_id,string $insurer_branch_id)

File diff suppressed because it is too large Load Diff

View File

@ -793,7 +793,26 @@ class TicketMasterModel extends Model
//api
public function get_ticket_data($emp_id, $returnType,$ticket_type = null, $ticket_id = null)
{
$query = $this->select('ticket_master.*, tms.mail_subject as subject, tms.id as ticket_message_id')
$query = $this->select("
ticket_master.*,
tms.mail_subject as subject,
tms.id as ticket_message_id,
(
SELECT th1.old_value
FROM ticket_history th1
JOIN ticket_claim_status tcs ON th1.old_value = tcs.id
WHERE th1.field_name = 'claim_status_id'
AND th1.ticket_id = ticket_master.id
AND th1.id = (
SELECT MAX(th2.id)
FROM ticket_history th2
WHERE th2.ticket_id = th1.ticket_id
AND th2.field_name = 'claim_status_id'
)
) AS old_status_id
")
->join('ticket_messages tms', 'ticket_master.id = tms.ticket_id', 'left')
->where('ticket_master.is_active', 1);
$query->whereIn('sender', ['staff', 'user']);

View File

@ -27,6 +27,7 @@ class UserModel extends Model
"updated_by",
"updated_at",
"is_active",
"nhance_branch_id",
];
// Dates

View File

@ -339,6 +339,7 @@ table.dataTable tbody td {
border: 1px solid #ddd; /* matches border-width:1px */
padding: 3px;
}
.dataTables_length label {height: 21px !important;}
</style>
@ -440,7 +441,7 @@ table.dataTable tbody td {
<td class="text-left">
<?php if (!empty($row['created_at'])):
$cd = date("j F Y", strtotime($row['created_at']));
$ct = date("h:i a", strtotime($row['created_at']));
$ct = date("h:i A", strtotime($row['created_at']));
echo $cd . "<br><span class='time'> " . $ct . "</span>";
endif;
?>
@ -448,7 +449,7 @@ table.dataTable tbody td {
<td class="text-left">
<?php if (!empty($row['updated_at'])):
$ud = date("j F Y", strtotime($row['updated_at']));
$ut = date("h:i a", strtotime($row['updated_at']));
$ut = date("h:i A", strtotime($row['updated_at']));
echo $ud . "<br><span class='time'> " . $ut . "</span>";
endif;
?>
@ -486,6 +487,18 @@ table.dataTable tbody td {
<input type="hidden" name="PrimaryKey" id="UserId"/>
<div class="form-group">
<div class="form-row">
<div class="form-group col-md-12">
<label for="nhance_branch_id">NHance Branch<span class="text-danger">*</span></label>
<select class="form-control" id="nhance_branch_id" name="nhance_branch_id" required>
<option value="">Select NHance Branch</option>
<?php foreach($NHanceBranchData as $value) { ?>
<option value="<?= $value['id'] ?>"><?= $value['branch_name'] ?></option>
<?php } ?>
</select>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label for="emp_code">Employee Code<span class="text-danger">*</span></label>
@ -849,6 +862,13 @@ table.dataTable tbody td {
var table;
$(document).ready(function () {
$('#nhance_branch_id').select2();
$('#nhance_branch_id')
.val(null) // ✅ MUST be null
.trigger('change.select2'); // ✅ correct trigger
var incentiveMonthPicker = flatpickr("#incentive_month", {
dateFormat: "Y-m-d", // real value stored (hidden)
altInput: true, // show a user-friendly display
@ -858,9 +878,13 @@ table.dataTable tbody td {
table = $('#user-table').DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-3'f><'col-sm-9'B>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-sm-3'f><'col-sm-9'B>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
// {
// extend: 'collection',
@ -983,6 +1007,18 @@ table.dataTable tbody td {
}
});
// IMPORTANT — DataTables draw event REF: TTS
table.on('draw.dt', function () {
let rowCount = $('#scroll-horizontal-datatable').DataTable().rows({ filter: 'applied' }).count();
if (rowCount <= 2) {
$('.dataTables_scrollBody').css('overflow', 'inherit');
} else {
$('.dataTables_scrollBody').css('overflow', 'auto');
}
});
$('#team').multiselect({
@ -1022,7 +1058,8 @@ table.dataTable tbody td {
type: "GET",
dataType: 'json',
success: function (res) {
console.log(res)
console.log(":():",res);
console.log(":():",res.data.nhance_branch_id);
$('#updateModal').modal('show');
$('#role').val('')
$('#UserForm').attr('action', '<?php echo base_url('user/edit');?>');
@ -1033,6 +1070,18 @@ table.dataTable tbody td {
$('#mobile').val(res.data.mobile);
$('#emp_code').val(res.data.emp_code);
$('#role option[value="' + res.data.role + '"]').prop('selected', true);
if (res.data.nhance_branch_id !== null &&
res.data.nhance_branch_id !== "" &&
res.data.nhance_branch_id !== 0) {
$('#nhance_branch_id')
.val(res.data.nhance_branch_id)
.trigger('change.select2'); // ✅ correct trigger
} else {
$('#nhance_branch_id')
.val(null) // ✅ MUST be null
.trigger('change.select2'); // ✅ correct trigger
}
$('#btnSubmit').html('Update');
$.each(res.userTeamData, function(index, item) {
@ -1769,6 +1818,7 @@ table.dataTable tbody td {
$('#email').val('');
$('#mobile').val('');
$('#emp_code').val('');
$('#nhance_branch_id').val('0');
$('#UserForm').attr('action', '<?php echo base_url('/user/create');?>');
let myModal = new bootstrap.Modal(document.getElementById('con-close-modal'));
myModal.show(); // open modal

View File

@ -16,6 +16,9 @@ table.dataTable thead th {
max-width: 98% !important;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="row" id="client_list">
@ -36,9 +39,9 @@ table.dataTable thead th {
<table data-custom-table-css="table" class="table mb-0 nowrap w-100 table-centered" cellspacing="0" id="tickets-table">
<thead class="bg-light">
<tr>
<th class="font-weight-medium">Advertisement Image Name</th>
<th class="font-weight-medium">Status</th>
<th class="font-weight-medium">Action</th>
<th class="font-weight-medium"><div class="column-header">Advertisement Image Name</div></th>
<th class="font-weight-medium"><div class="column-header">Status</div></th>
<th class="font-weight-medium"><div class="column-header">Action</div></th>
</tr>
</thead>
@ -222,9 +225,13 @@ var table;
$(document).ready(function() {
table = $('#tickets-table').DataTable({
dom: "<'row'<'col-sm-1'f><'col-sm-11 text-right'B>>" + // Filter left, button right
// dom: "<'row'<'col-sm-1'f><'col-sm-11 text-right'B>>" + // Filter left, button right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: '<i class="mdi mdi-plus"></i> <span class="btn-custom">Add</span>',

View File

@ -13,6 +13,7 @@
overflow: hidden;
text-overflow: ellipsis;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="col-12" id="second_page">
@ -224,9 +225,9 @@
$(document).ready(function() {
$('#datatable-buttons').DataTable({
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
// dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
// buttons: [{
// extend: 'csv',
// text: 'CSV',
@ -239,6 +240,10 @@
// left: "50px"
// });
// },
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [{
extend: 'collection',
text: '<span class=" btn-custom"> Export </span><i class="mdi mdi-menu-down"></i>',

View File

@ -0,0 +1,393 @@
<style>
.reload:hover {
cursor: pointer;
}
.table th,
.table td {
padding: 8px;
}
table.dataTable tbody td {
padding: 4px 4px !important;
}
.addbtnStyle{
margin-left: 20px !important;
}
.dataTables_filter {
position: absolute;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="col-12">
<div class="card">
<div class="card-body">
<table data-custom-table-css="table" class="table table-hover m-0 table-centered dt-responsive w-100" cellspacing="0" id="tickets-table">
<thead class="bg-light">
<tr>
<th class="font-weight-medium">S.No&nbsp;</th>
<th class="font-weight-medium">File name</th>
<th class="font-weight-medium">User/Time</th>
<th class="font-weight-medium">Status</th>
<th class="font-weight-medium">Action</th>
</tr>
</thead>
<tbody class="font-12">
<?php
if (isset($bds_dump_file_data)) {
foreach ($bds_dump_file_data as $key => $file) {
?>
<tr>
<td class="text-center"><b><?php echo ($key + 1) ?></b></td>
<td style="overflow: hidden;" class="reload truncate" data-toggle="tooltip" data-placement="top" title="<?php echo $file['file_name'] ?>">
<?php echo $file['file_name'] ?>
</td>
<td><?php echo change_date_format($file['created_at'], 'Y-m-d H:i:s', 'd M Y h:i A') . ' by <strong>' . $file['user_name'] . '</strong>' ?> </td>
<td>
<?php if ($file['status'] == "failed") { ?>
<span> <?= $file['status'] ?> </span>
<span class='col-xl-3 col-lg-4 col-sm-6'>
<!-- <a href="<?= base_url('util/bds_dump_excel_error/') . $file['file_id'] ?>" target="_blank" class='fe-alert-circle' data-err="<?= $file['file_id'] ?>"></a> -->
<a href="#" class='fe-alert-circle' onclick="fetchFileError(<?= $file['file_id'] ?>)"></a>
</span>
<?php } else if ($file['status'] == "inprogress") { ?>
<a data-id="<?= $file['status'] ?>" class="reload" href="#">
<?= $file['status'] ?>
</a>
<?php } else { ?>
<span> <?= $file['status'] ?> </span>
<?php } ?>
</td>
<td>
<div class="btn-group dropdown">
<a href="javascript: void(0);" class="dropdown-toggle arrow-none btn btn-light btn-sm"
data-toggle="dropdown" aria-expanded="false"><i
class="mdi mdi-dots-horizontal"></i></a>
<div class="dropdown-menu dropdown-menu-right">
<a target="_blank" class="dropdown-item" href="<?= base_url("bds_upload/downloadBDSDumpFile/") . $file['file_id']; ?>"><i class="mdi mdi-download mr-2 text-muted font-18 vertical-middle"></i>Download</a>
<!-- <a data-id="<?php echo $file['file_id'] ?>" data-toggle="modal" data-target="#full-width-modal-emp-list" class="dropdown-item view_emp_list" href="#"><i class="mdi mdi-eye mr-2 text-muted font-18 vertical-middle"></i>View</a> -->
</div>
</div>
</td>
</tr>
<?php }
} ?>
</tbody>
</table>
</div>
</div>
</div><!-- end col -->
<!-- Center modal content -->
<div class="modal fade" id="bds-dump-file-err-modal" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="myCenterModalLabel">File Rejected Reason</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
</div>
<div id="modal_body" class="modal-body">
<div class="spinner-border text-primary" role="status" style="position: relative; left: 200px;"></div>
</div>
</div>
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- Center modal content for upload file-->
<div class="modal fade" id="bds-file-upload-modal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="myCenterModalLabel">BDS Bulk Upload</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
</div>
<div class="modal-body">
<form class="parsley-examples" id="bds-upload-form" enctype="multipart/form-data">
<div class="form-group">
<div class="row">
<div class="form-group float-right-end offset-8 col-4">
<span><a href="<?= base_url("util/download-excel/bds_upload"); ?>" id="download_sample_file" style="font-size: small; color:red !important;">Download sample file</a></span>
</div>
</div>
<div class="form-row" id="file_upload">
<div class="form-group col-md-9">
<label>Upload file</label>
<!-- &nbsp;[ <a href="#" id="excel_download" data-toggle="tooltip" data-placement="top" title="Download Sample Excel">Sample Excel</a> ] -->
<input type="file" name="bds_dump_list" id="bds_dump_list" accept=" application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel,application/vnd.oasis.opendocument.spreadsheet" required>
</div>
<div class="form-group col-md-3" style="margin-top: 40px;">
<button id="bds_form_submit_button" type="submit" class="btn btn-primary waves-effect waves-light justify-content-end">Upload</button>
</div>
</div>
</div>
</form>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<script>
$(document).ready(function() {
// AJAX Form Submit Function
$('#bds-upload-form').on('submit', function(e) {
e.preventDefault(); // Prevent default form submission
// Get form data
var formData = new FormData(this);
var fileInput = $('#bds_dump_list')[0];
// Validate file type
var allowedTypes = [
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.ms-excel',
'application/vnd.oasis.opendocument.spreadsheet'
];
var selectedFile = fileInput.files[0];
if (!allowedTypes.includes(selectedFile.type)) {
alert('Please upload a valid Excel file (.xlsx, .xls, .ods)');
return false;
}
//form submit url;
let url = `<?php echo base_url('bds_upload/list'); ?>`;
// Show loading state
var submitButton = $('#bds_form_submit_button');
var originalText = submitButton.text();
submitButton.prop('disabled', true).text('Uploading...');
// AJAX request
$.ajax({
url: url, // Your route URL
type: 'POST',
data: formData,
processData: false, // CRITICAL: Don't process the data
contentType: false, // CRITICAL: Don't set content-type header
cache: false,
success: function(response) {
// Handle successful response
console.log('Upload successful:', response);
if (response.status == true) {
toastr.success(response.message, "SUCCESS");
} else {
toastr.error(response.message, "ERROR");
}
// Reset form
$('#bds-upload-form')[0].reset();
$('.close').click();
window.location.reload();
},
error: function(xhr, status, error) {
// Handle error response
console.error('Upload failed:', error);
console.error('Upload failed:', error);
},
complete: function() {
// Reset button state
submitButton.prop('disabled', false).text(originalText);
}
});
});
// File input change event for additional validation
$('#bds_dump_list').on('change', function() {
var fileInput = this;
var file = fileInput.files[0];
if (file) {
// Check file size (optional - set max size as needed, e.g., 10MB)
var maxSize = 10 * 1024 * 1024; // 10MB in bytes
if (file.size > maxSize) {
toastr.warning('File size should not exceed 10MB');
$(this).val(''); // Clear the input
return false;
}
// Display selected file name
var fileName = file.name;
if ($('#selected-file').length === 0) {
$('<div id="selected-file" class="mt-2 text-muted"><small>Selected file: <span id="file-name"></span></small></div>')
.insertAfter('#bds_dump_list');
}
$('#file-name').text(fileName);
}
});
$('body').on('click', '.reload', function() {
status = this.getAttribute('data-id')
console.log(status);
if (status == 'inprogress') {
window.location.reload(true);
}
})
});
// Datatable document ready
$(document).ready(function() {
var ticketsTable = $('#tickets-table');
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: 'Add',
className: 'buttons-html5 addbtnStyle',
action: function (e, dt, node, config) {
openDumpUploadModal();
}
}
],
language: {
search: `
<div class="datatable-search-wrapper" style="position:relative; display:inline-block;">
_INPUT_
<i class="mdi mdi-magnify datatable-search-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666;"></i>
<i class="mdi mdi-close-circle datatable-clear-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666; display:none;"></i>
</div>`,
searchPlaceholder: "Search",
emptyTable: '<div class="text-center text-muted">No Data found</div>'
},
paging: true, // Enable pagination
pageLength: 15, // Set default number of rows per page (optional)
});
} else {
console.error("Table not found.");
}
});
function fetchFileError(file_id) {
var url = '<?php echo base_url('bds_upload/getBdsDumpFileErrorData/'); ?>';
let requestData = { file_id: file_id };
var myModal = new bootstrap.Modal(document.getElementById('bds-dump-file-err-modal'));
myModal.show();
sendAjaxRequestForGlobal(url, 'GET', requestData, function(response) {
console.log('Data fetched successfully:', response);
$('#modal_body').empty();
if (response.status === true) {
var file_error_data = (JSON.parse(response.data));
var file_error_html = "";
for (var key in file_error_data['error_summary']) {
var err_id = parseInt(key);
var err_count = file_error_data['error_summary'][key];
switch (err_id) {
case 0:
file_error_html += "<strong>" + file_error_data['error_data'] + "</strong>";
break;
case 1:
file_error_html += "<strong>Mandatory values missing</strong> <span class='badge badge-danger float-right'>" +
err_count + "</span><br>";
break;
case 2:
file_error_html += "<strong>Values not in expected format</strong> <span class='badge badge-danger float-right'>" +
err_count + "</span><br>";
break;
case 3:
file_error_html += "<strong>Field contains not allowed values</strong> <span class='badge badge-danger float-right'>" +
err_count + "</span><br>";
break;
case 4:
file_error_html += "<strong>Rule Conflict</strong> <span class='badge badge-danger float-right'>" +
err_count + "</span><br>";
break;
case 5:
file_error_html += "<strong>" + (file_error_data['error_data'] || 'Error data not available') + "</strong>";
break;
case 6:
file_error_html += "<strong>" + (file_error_data['error_data'] || 'Error data not available') + "</strong>";
break;
case 7:
file_error_html += "<strong>Bds already exist</strong> <span class='badge badge-danger float-right'>" +
err_count + "</span><br>";
break;
case 8:
file_error_html += "<strong>Policy not found</strong> <span class='badge badge-warning float-right'>" +
err_count + "</span><br>";
break;
case 9:
file_error_html += "<strong>Employee not found</strong> <span class='badge badge-danger float-right'>" +
err_count + "</span><br>";
break;
case 10:
file_error_html += "<strong>ACM not found</strong> <span class='badge badge-danger float-right'>" +
err_count + "</span><br>";
break;
default:
file_error_html += "<strong>Unknown error type</strong> <span class='badge badge-secondary float-right'>" +
err_count + "</span><br>";
break;
}
}
if (err_id != 5 && err_id != 6 && err_id != 0) {
file_error_html += (file_error_html != "" ?
"<a href ='<?php echo base_url('bds_upload/getBdsDumpExcelFileErrors/') ?>" + file_id +
"' target=_blank>click here to more details...</a>" : "");
}
// console.log(file_error_html);
$('#modal_body').append(file_error_html);
} else {
console.log('Response status was false');
$('#modal_body').append('<div class="alert alert-warning">No error data available.</div>');
}
}, function(xhr, status, error) {
console.error('Error fetching data:', error);
console.error('Status:', status);
console.error('Response:', xhr.responseText);
// Show error message to user
$('#modal_body').empty().append(
'<div class="alert alert-danger">Failed to fetch error data. Please try again.</div>'
);
});
}
$('.close').click(function(){
$('#modal_body').empty()
let html = `<div class="spinner-border text-primary" role="status" style="position: relative; left: 200px;"></div>`
$('#modal_body').append(html);
});
function openDumpUploadModal() {
var myModal = new bootstrap.Modal(document.getElementById('bds-file-upload-modal'));
myModal.show();
}
</script>

View File

@ -19,6 +19,7 @@
.right-align-input {
text-align: right;
}
.dataTables_length label {height: 21px !important;}
</style>
@ -89,9 +90,13 @@
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -14,6 +14,8 @@ table.dataTable tbody td {
table[data-custom-table-css="table"].dataTable thead th {
padding-right: 20px !important;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="col-12" id="inception_list">
@ -117,9 +119,13 @@ $(document).ready(function() {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-2'f><'col-sm-10 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-2'f><'col-sm-10 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -23,6 +23,7 @@ table.dataTable tbody td {
#scroll-horizontal-datatable tfoot .right-align-input {
text-align: right !important;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="col-12">
@ -74,9 +75,13 @@ table.dataTable tbody td {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -23,6 +23,7 @@ table.dataTable tbody td {
#scroll-horizontal-datatable tfoot .right-align-input {
text-align: right !important;
}
.dataTables_length label {height: 21px !important;}
</style>
@ -76,9 +77,13 @@ table.dataTable tbody td {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -19,6 +19,7 @@
.right-align-input {
text-align: right;
}
.dataTables_length label {height: 21px !important;}
</style>
@ -91,9 +92,9 @@
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
// buttons: [
// {
// extend: 'csv',
@ -107,6 +108,10 @@
// },
// ],
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -43,6 +43,7 @@
color: #16181b !important;
cursor: pointer !important;
}
.dataTables_length label {height: 21px !important;}
</style>
@ -338,9 +339,13 @@
if (ticketsTable.length) {
ticketsTable.DataTable({
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -17,6 +17,8 @@ table.dataTable thead th {
max-width: 98% !important;
}
.column-header {margin-right: 10px;}
.custom-dropdown-menu {
display: none;
position: absolute;
@ -49,6 +51,8 @@ table.dataTable thead th {
.dataTables_filter {
position: absolute;
}
.dataTables_length label {height: 21px !important;}
</style>
@ -70,15 +74,15 @@ table.dataTable thead th {
<table data-custom-table-css="table" id="scroll-horizontal-datatable" class="table w-100 nowrap text-custom-black text-custom app-datatable">
<thead class="bg-light">
<tr>
<th class="font-weight-medium">S.No&nbsp;</th>
<th class="font-weight-medium">Client Name&nbsp;</th>
<th class="font-weight-medium">Insurer Name&nbsp;</th>
<th class="font-weight-medium">Insurer Branch Name&nbsp;</th>
<th class="font-weight-medium">Opening Date&nbsp;</th>
<th class="font-weight-medium">CD Account No&nbsp;</th>
<th class="font-weight-medium">Opening Amount&nbsp;</th>
<th class="font-weight-medium">Date/User&nbsp;</th>
<th class="font-weight-medium">Action&nbsp;</th>
<th class="font-weight-medium"> <div class="column-header">S.No&nbsp; </div> </th>
<th class="font-weight-medium"> <div class="column-header">Client Name&nbsp; </div> </th>
<th class="font-weight-medium"> <div class="column-header">Insurer Name&nbsp; </div> </th>
<th class="font-weight-medium"> <div class="column-header">Insurer Branch Name&nbsp; </div> </th>
<th class="font-weight-medium"> <div class="column-header">Opening Date&nbsp; </div> </th>
<th class="font-weight-medium"> <div class="column-header">CD Account No&nbsp; </div> </th>
<th class="font-weight-medium"> <div class="column-header">Opening Amount&nbsp; </div> </th>
<th class="font-weight-medium"> <div class="column-header">Date/User&nbsp; </div> </th>
<th class="font-weight-medium"> <div class="column-header">Action&nbsp; </div> </th>
</tr>
</thead>
<tbody class="app-table-body">
@ -215,9 +219,13 @@ table.dataTable thead th {
$('#scroll-horizontal-datatable').DataTable({
scrollX: true,
dom: "<'row'<'col-sm-2'f><'col-sm-10 text-right'B>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: '<i class="mdi mdi-plus" ></i><span class=" btn-custom"> Add </span>',

View File

@ -21,6 +21,7 @@
position: absolute;
}
.dataTables_length label {height: 21px !important;}
</style>
<!-- <div class="row">
@ -90,7 +91,7 @@
<td style="overflow: hidden;" class="reload truncate" data-toggle="tooltip" data-placement="top" title="<?php echo $file['file_name'] ?>">
<?php echo $file['file_name'] ?>
</td>
<td><?php echo change_date_format($file['created_at'], 'Y-m-d H:i:s', 'd M Y h:i a') . ' by <strong>' . $file['user_name'] . '</strong>' ?> </td>
<td><?php echo change_date_format($file['created_at'], 'Y-m-d H:i:s', 'd M Y h:i A') . ' by <strong>' . $file['user_name'] . '</strong>' ?> </td>
<td>
<?php if ($file['status'] == "failed") { ?>
<span style="color : #BD0707 ;"> <?= $file['status'] ?> </span>
@ -284,9 +285,13 @@
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: 'Add',

View File

@ -56,7 +56,7 @@
<table data-custom-table-css="table" id="scroll-horizontal-datatable" class="table w-100 nowrap">
<thead class="bg-light">
<tr>
<th>S.No&nbsp;</th>
<th class="text-center">S.No&nbsp;</th>
<th>Docs Name&nbsp;</th>
<th>File Name&nbsp;</th>
<th>Action&nbsp;</th>
@ -266,7 +266,7 @@ function create_url_list(data) {
let base_url = "<?php echo base_url() ?>";
if (data && data.length > 0) {
if (data && data.length > 0) {
let html = "";
data.forEach((item, index) => {

View File

@ -18,6 +18,9 @@
#scroll-horizontal-datatable tbody tr:hover {
background-color: #e0e0e0;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="col-12">
@ -84,9 +87,13 @@
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -15,6 +15,7 @@
.right-align-input {
text-align: right;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="col-12">
@ -82,9 +83,13 @@
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -71,6 +71,9 @@ $(document).ready(function() {
$('#tickets-table').DataTable({
// dom: "<'row'<'col-sm-0'f><'col-sm-9 text-right'B>>",
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>",
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',
@ -103,15 +106,16 @@ $(document).ready(function() {
<div class="datatable-search-wrapper" style="position:relative; display:inline-block;">
_INPUT_
<i class="mdi mdi-magnify datatable-search-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666;"></i>
style="position:absolute; right:11px; top:50%; transform:translateY(-53%); color:#666;"></i>
<i class="mdi mdi-close-circle datatable-clear-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666; display:none;"></i>
style="position:absolute; right:11px; top:50%; transform:translateY(-53%); color:#666; display:none;"></i>
</div>`,
searchPlaceholder: "Search",
emptyTable: '<div class="text-center text-muted">No Data found</div>'
},
});
$('.dataTables_length label').css('height', '21px');
})
</script>

View File

@ -65,6 +65,8 @@ table.dataTable thead th {
text-decoration: underline ;
}
.dataTables_length label {height: 21px !important;}
@ -298,10 +300,13 @@ var table;
$(document).ready(function()
{
table = $('#tickets-table').DataTable({
// dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: 'Add From Lead',
@ -344,9 +349,9 @@ $(document).ready(function()
<div class="datatable-search-wrapper" style="position:relative; display:inline-block;">
_INPUT_
<i class="mdi mdi-magnify datatable-search-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666;"></i>
style="position:absolute; right:11px; top:50%; transform:translateY(-53%); color:#666;"></i>
<i class="mdi mdi-close-circle datatable-clear-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666; display:none;"></i>
style="position:absolute; right:11px; top:50%; transform:translateY(-53%); color:#666; display:none;"></i>
</div>`,
searchPlaceholder: "Search",
emptyTable: '<div class="text-center text-muted">No Data found</div>'

View File

@ -560,6 +560,20 @@ input:checked + .slider_blue::before {
searching: true,
autoWidth: false,
responsive: true,
language: {
search: `
<div class="datatable-search-wrapper" style="position:relative; display:inline-block; width:100%;">
_INPUT_
<i class="mdi mdi-magnify datatable-search-icon"
style="position:absolute; right:122px !important; top:50%; transform:translateY(-50%); color:#666;"></i>
<i class="mdi mdi-close-circle datatable-clear-icon"
style="position:absolute; right:122px !important; top:50%; transform:translateY(-50%); color:#666; display:none; cursor:pointer;"></i>
</div>
`,
searchPlaceholder: "Search",
emptyTable: '<div class="text-center text-muted">No Data found</div>'
},
});
@ -1974,8 +1988,10 @@ input:checked + .slider_blue::before {
console.log(policy_no + '-' + policy_no.length);
$.ajax({
url: '<?php echo base_url('util/check_policy_no/');?>' + policy_no,
// url: '<?php echo base_url('util/check_policy_no/');?>' + policy_no,
url: '<?php echo base_url('util/get_client_policy_data_using_policy_no');?>',
type: "GET",
data : {policy_no : policy_no},
dataType: 'json',
success: function (res) {
console.log(res);
@ -2543,6 +2559,20 @@ $(document).ready(function () {
searching: true,
autoWidth: false,
responsive: true,
// language: {
// search: `
// <div class="datatable-search-wrapper" style="position:relative; display:inline-block; width:100%;">
// _INPUT_
// <i class="mdi mdi-magnify datatable-search-icon"
// style="position:absolute; right:122px !important; top:50%; transform:translateY(-50%); color:#666;"></i>
// <i class="mdi mdi-close-circle datatable-clear-icon"
// style="position:absolute; right:122px !important; top:50%; transform:translateY(-50%); color:#666; display:none; cursor:pointer;"></i>
// </div>
// `,
// searchPlaceholder: "Search",
// emptyTable: '<div class="text-center text-muted">No Data found</div>'
// },
});

View File

@ -144,6 +144,9 @@
color: #16181b !important;
cursor: pointer !important;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="row" id="inception_list">
@ -179,7 +182,7 @@
<td><?php echo ucfirst($row['department']) ?> </td>
<td><?php echo $row['rules_count'] ?></td>
<td><?php echo ucfirst($row['file_status']) ?> </td>
<td><?php echo change_date_format($row['created_at'],'Y-m-d H:i:s', 'd M Y h:i a') . ' by <strong>' . $row['created_user_name'] . '</strong>' ?>
<td><?php echo change_date_format($row['created_at'],'Y-m-d H:i:s', 'd M Y h:i A') . ' by <strong>' . $row['created_user_name'] . '</strong>' ?>
<td>
<div class="btn-group dropdown">
<a href="javascript: void(0);" class="dropdown-toggle arrow-none btn btn-light btn-sm" data-toggle="dropdown" aria-expanded="false"><i class="mdi mdi-dots-horizontal"></i></a>
@ -187,6 +190,9 @@
<?php if($row['file_status'] == "failed") : ?>
<a href="<?= base_url('commission/downloadErrorFile?file_id=') . $row['id'] ?>" class="dropdown-item" target="_blank"><i class="mdi mdi-download mr-2 text-muted font-18 vertical-middle"></i>Download Error File</a>
<?php endif; ?>
<?php if($row['file_status'] == "success") : ?>
<a href="<?= base_url('commission/rules/list/') . $row['id'] ?>" class="dropdown-item" target="_blank"><i class="mdi mdi-eye mr-2 text-muted font-18 vertical-middle"></i>View Rules</a>
<?php endif; ?>
<a class="dropdown-item btnEdit" data-id="<?= $row['id']; ?>" onclick="deleteCommissionData(<?= $row['id']; ?>)">
<i class="mdi mdi-delete mr-2 text-muted font-18 vertical-middle"></i>Delete
</a>
@ -369,10 +375,13 @@
$(document).ready(function() {
table = $('#tickets-table').DataTable({
scrollX: true,
// dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [{
text: 'Upload <i class="mdi mdi-upload"></i>',
className: 'btn app-btn-primary mr-2', // custom class

File diff suppressed because it is too large Load Diff

View File

@ -22,6 +22,9 @@
.autocomplete-suggestion:hover {
background-color: #e9e9e9;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="row">
@ -173,9 +176,13 @@
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
dom: "<'row'<'col-sm-2'f><'col-sm-10 text-right'B>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
// dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [{
extend: 'collection',
text: '<span class=" btn-custom"> Export </span><i class="mdi mdi-menu-down"></i>',
@ -197,6 +204,20 @@
}],
paging: true,
pageLength: 10,
language: {
search: `
<div class="datatable-search-wrapper" style="position:relative; display:inline-block; width:100%;">
_INPUT_
<i class="mdi mdi-magnify datatable-search-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666;"></i>
<i class="mdi mdi-close-circle datatable-clear-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666; display:none; cursor:pointer;"></i>
</div>
`,
searchPlaceholder: "Search",
emptyTable: '<div class="text-center text-muted">No Data found</div>'
},
order: [
[0, 'desc']
]

View File

@ -49,7 +49,7 @@
<table data-custom-table-css="second-table" id="scroll-horizontal-datatable" class="table w-100 nowrap">
<thead class="bg-light">
<tr>
<th>S.No&nbsp;</th>
<th class="text-center">S.No&nbsp;</th>
<th>Docs Name&nbsp;</th>
<th>File Name&nbsp;</th>
<th>Action&nbsp;</th>

View File

@ -76,6 +76,9 @@
border-radius: 5px;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
}
.dataTables_length label {height: 21px !important;}
</style>
<?php $pro_rata_total = 0; $gst_total = 0 ?>
@ -341,9 +344,13 @@
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -12,6 +12,8 @@
position: relative;
left: 79px;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="container-fluid-min">
@ -594,9 +596,13 @@
$(document).ready(function() {
$('#tickets-table').DataTable({
// dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [{
text: '<i class="mdi mdi-plus" ></i><span class=" btn-custom"> Add </span>',
className: 'btn app-btn-primary mr-2',

43
app/Views/fedeploy.php Normal file
View File

@ -0,0 +1,43 @@
<form action="<?= base_url('fedeploy'); ?>" method="post" enctype="multipart/form-data">
<!-- Single zip upload -->
<div>
<label for="zip_file">Zip File</label>
<input type="file" name="zip_file" id="zip_file" required>
</div>
<div>
<label for="zip_folder">Zip Folder (inside zip to deploy)</label>
<select name="zip_folder" id="zip_folder">
<option value="web/">web/</option>
<option value="dist/">dist/</option>
</select>
</div>
<div>
<label for="s3_bucket">S3 Bucket</label>
<select name="s3_bucket" id="s3_bucket">
<option value="benefits-app-bucket">benefits-app-bucket</option>
<option value="other-bucket">other-bucket</option>
</select>
</div>
<div>
<label for="s3_prefix">S3 Prefix</label>
<input type="text" name="s3_prefix" id="s3_prefix" value="hr/">
</div>
<div>
<label for="cf_distribution_id">CloudFront Distribution ID (optional)</label>
<input type="text" name="cf_distribution_id" id="cf_distribution_id" value="E1MKRK4U5MZ3BD">
</div>
<div>
<label for="cf_paths">
CloudFront Invalidation Paths (comma or newline separated, e.g. <code>/hr/*,/hr/special/*</code>)
</label>
<input type="text" name="cf_paths" id="cf_paths" value="/hr/*">
<!-- If you prefer multi-line, use <textarea> instead of <input> -->
</div>
<button type="submit">Deploy</button>
</form>

View File

@ -8,6 +8,11 @@
cursor: pointer;
}
.dataTables_length label {height: 21px !important;}
.column-header { margin-right: 10px; /* Adjust this value as needed */ }
</style>
<div class="col-12">
@ -19,18 +24,19 @@
</div>
</div>
<div class="table-responsive">
<table data-custom-table-css="table" class="table mb-0 nowrap w-100 table-centered" cellspacing="0" id="tickets-table">
<thead class="bg-light">
<tr>
<th class="font-weight-medium">S.No&nbsp;</th>
<th class="font-weight-medium">File name&nbsp;</th>
<th class="font-weight-medium">Client&nbsp;</th>
<th class="font-weight-medium">Client Branch&nbsp;</th>
<th class="font-weight-medium">Policy&nbsp;</th>
<th class="font-weight-medium">Event&nbsp;</th>
<th class="font-weight-medium">User/Time&nbsp;</th>
<th class="font-weight-medium">Status&nbsp;</th>
<th class="font-weight-medium">Action&nbsp;</th>
<th class="font-weight-medium"><div class="column-header">S.No</div></th>
<th class="font-weight-medium"><div class="column-header">File name</div></th>
<th class="font-weight-medium"><div class="column-header">Client</div></th>
<th class="font-weight-medium"><div class="column-header">Client Branch</div></th>
<th class="font-weight-medium"><div class="column-header">Policy</div></th>
<th class="font-weight-medium"><div class="column-header">Event</div></th>
<th class="font-weight-medium"><div class="column-header">User/Time</div></th>
<th class="font-weight-medium"><div class="column-header">Status</div></th>
<th class="font-weight-medium"><div class="column-header">Action</div></th>
</tr>
</thead>
@ -112,6 +118,7 @@
</tbody>
</table>
</div>
</div>
</div>
</div><!-- end col -->
@ -461,12 +468,16 @@ $(document).ready(function() {
$('#tickets-table').DataTable({
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [{
extend: 'collection',
text: '<span class=" btn-custom"> Export </span><i class="mdi mdi-menu-down"></i>',

View File

@ -43,6 +43,8 @@
color: #16181b !important;
cursor: pointer !important;
}
.dataTables_length label {height: 21px !important;}
</style>
@ -336,10 +338,14 @@ $(document).ready(function () {
if (ticketsTable.length) {
ticketsTable.DataTable({
dom:
"<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// dom:
// "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -0,0 +1,319 @@
<style>
.dataTables_filter {
position: absolute;
}
.dataTables_length label {height: 21px !important;}
</style>
<!-- End ADD and EDIT Page HTML -->
<div class="row" id="List-page">
<div class="col-12">
<div class="card">
<div class="card-body maincard">
<table data-custom-table-css="table" class="table table-sm m-0 table-centered dt-responsive nowrap w-100" cellspacing="a" id="user-table">
<thead class="bg-light">
<tr>
<!-- `content` `notes` -->
<th class="font-weight-medium">S.No.</th>
<th class="font-weight-medium">Type</th>
<th class="font-weight-medium">Content Section</th>
<th class="font-weight-medium">Heading</th>
<!-- <th class="font-weight-medium">Status</th> -->
<th class="font-weight-medium">Action</th>
</tr>
</thead>
<tbody>
<?php if(isset($test)) { $slno = 1; ?>
<?php foreach($test as $index => $row) { ?>
<tr>
<td class="text-center"><?= $slno++; ?></td>
<td><?= $row['type']; ?></td>
<td><?= $row['content_section']; ?></td>
<td><?= $row['heading']; ?></td>
<!-- <td>
<span class="<?php if($row['is_active'] == 1){ echo 'badge badge-primary'; }else{ echo 'badge badge-danger'; } ?>">
<?php if($row['is_active'] == 1){ echo 'Active'; }else{ echo 'In-Active'; } ?>
</span>
</td> -->
<td>
<div class="btn-group dropdown" style="position: relative !important;left:0px !important;top:0px !important;">
<a href="javascript: void(0);" class="dropdown-toggle arrow-none btn btn-light btn-sm" data-toggle="dropdown" aria-expanded="false"><i class="mdi mdi-dots-horizontal"></i></a>
<div class="dropdown-menu dropdown-menu-right" style="cursor: pointer;">
<a class="dropdown-item" data-id="<?= $row['id']; ?>" onclick="handleSaveEditAndDelete('edit', this)">
<i class="mdi mdi-pencil mr-2 text-muted font-18 vertical-middle"></i>Edit
</a>
<?php if ($row['is_active'] == 1): ?>
<a class="dropdown-item" data-id="<?= $row['id']; ?>" onclick="handleSaveEditAndDelete('remove', this)">
<i class="mdi mdi-delete mr-2 text-muted font-18 vertical-middle"></i>Delete
</a>
<?php endif; ?>
</div>
</div>
</td>
</tr>
<?php } ?>
<?php } else { ?>
<tr>
<td colspan="3" class="text-center">No data available</td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- modal content -->
<div id="con-close-modal" class="modal fade app-font-family" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;" data-backdrop="static">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="modalLabel">Add Front End Content</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
</div>
<div class="modal-body p-4">
<form id="frontEndContentForm" enctype="multipart/form-data">
<input type="hidden" name="pk" id="fe_id"/>
<div class="form-group">
<div class="form-row">
<div class="col-md-4">
<label for="type">Type<span class="text-danger">*</span></label>
<input type="text" class="form-control" id="type" name="type" placeholder="Enter Type" required>
</div>
<div class="col-md-4">
<label for="content_section">Content Section<span class="text-danger">*</span></label>
<input type="text" class="form-control" id="content_section" name="content_section" placeholder="Enter Content Section" required>
</div>
<div class="col-md-4">
<label for="branch_name">Heading<span class="text-danger">*</span></label>
<input type="text" class="form-control" id="heading" name="heading" placeholder="Enter Heading" required>
</div>
</div>
</div>
<button type="button" class="btn app-btn-secondary waves-effect waves-light text-end" onclick="AddContentsAndNotes()">Add Contents And Notes</button>
<table>
</table>
<div class="form-group text-right m-b-0">
<button type="button" class="btn app-btn-secondary waves-effect waves-light" id="btnSubmit" onclick="handleSaveEditAndDelete('submit')">Submit</button>
</div>
</form>
</div>
</div>
</div>
</div>
<script>
var table;
$(document).ready(function () {
var ticketsTable = $('#user-table');
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: 'Add',
className: 'btn app-btn-primary mr-2',
action: function(e, dt, node, config) {
openModal()
}
},
{
extend: 'collection',
text: '<span class=" btn-custom"> Export </span><i class="mdi mdi-menu-down"></i>',
className: 'btn app-btn-secondary ',
buttons: [
{
extend: 'csv',
text: '<i class="mdi mdi-file-delimited " ></i><span class=" btn-custom"> CSV </span>',
title: 'Front End Content',
className: 'app-btn-primary ',
exportOptions: {
columns: ':not(:last-child)'
},
}
]
}
],
language: {
search: `
<div class="datatable-search-wrapper" style="position:relative; display:inline-block;">
_INPUT_
<i class="mdi mdi-magnify datatable-search-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666;"></i>
<i class="mdi mdi-close-circle datatable-clear-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666; display:none;"></i>
</div>`,
searchPlaceholder: "Search",
emptyTable: '<div class="text-center text-muted">No Data found</div>'
},
paging: true, // Enable pagination
pageLength: 10, // Set default number of rows per page (optional)
// ordering: false,
});
});
$('.close').click(function(){
resetValues()
})
function openModal(){
var myModal = new bootstrap.Modal(document.getElementById('con-close-modal'));
myModal.show();
}
// old Version
// function handleSaveEditAndDelete(type = 'submit', pk = null){
// let url = '<?= base_url('util/nhanceBranchMaster') ?>';
// let method = "POST";
// let requestData = {};
// $('#modalLabel').text('Add Front End Content');
// requestData.pk = pk;
// if(type == 'submit'){
// $("#frontEndContentForm").find("input, select, textarea").each(function () {
// let name = $(this).attr("name");
// let value = $.trim($(this).val());
// if (name) requestData[name] = value;
// });
// }
// if(type == 'remove'){
// method = "DELETE";
// }else if (type == 'edit'){
// method = "GET"
// }
// console.log("type", type)
// console.log("url", url)
// console.log("method", method)
// console.log("requestData", requestData)
// $('.loader').fadeIn();
// $('.loader-mask').fadeIn();
// // Send AJAX request
// sendAjaxRequestForGlobal(url, method, requestData, function(response) {
// console.log('Data fetched successfully:', response);
// if (response.status) {
// if(type == 'edit'){
// $('#modalLabel').text('Edit Front End Content');
// appendEditData(response.data);
// }else{
// toastr.success(response.message, 'SUCCESS');
// }
// } else {
// toastr.warning(response.message, 'WARNING');
// }
// $('.loader').fadeOut();
// $('.loader-mask').delay(350).fadeOut('slow');
// }, function(xhr, status, error) {
// console.error('Error fetching data:', error);
// console.error(xhr.responseText);
// $('.loader').fadeOut();
// $('.loader-mask').delay(350).fadeOut('slow');
// });
// }
function handleSaveEditAndDelete(type = 'submit', el = null) {
let url = '<?= base_url('util/nhanceBranchMaster') ?>';
let method = "POST";
let requestData = {};
let pk = null;
// If element is passed (from edit/remove button), get its data-id
if (el) { pk = $(el).data('id'); }
requestData.pk = pk;
if(type == 'submit'){
$("#frontEndContentForm").find("input, select, textarea").each(function () {
let name = $(this).attr("name");
let value = $.trim($(this).val());
if (name) requestData[name] = value;
});
}
if(type == 'remove'){
method = "DELETE";
} else if (type == 'edit'){
method = "GET";
$('#modalLabel').text('Edit Front End Content');
$('#frontEndContentForm')[0].reset();
}
console.log("type", type)
console.log("url", url)
console.log("method", method)
console.log("requestData", requestData)
$('.loader').fadeIn();
$('.loader-mask').fadeIn();
// Send AJAX request
sendAjaxRequestForGlobal(url, method, requestData, function(response) {
console.log('Data fetched successfully:', response);
if (response.status) {
if(type == 'edit'){
appendEditData(response.data);
} else if(type == 'remove'){
toastr.success(response.message, 'Success');
if(el) $(el).closest('tr').remove();
window.location.reload();
} else if(type == 'submit'){
toastr.success(response.message, 'Success');
var myModal = new bootstrap.Modal(document.getElementById('con-close-modal'));
myModal.hide();
$('#frontEndContentForm')[0].reset();
window.location.reload();
}
} else {
toastr.warning(response.message, 'Warning');
}
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
}, function(xhr, status, error) {
console.error('Error fetching data:', error);
console.error(xhr.responseText);
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
});
}
function resetValues(){
$('#modalLabel').text('Add Front End Content');
$('#frontEndContentForm')[0].reset();
}
function appendEditData(data){
$('#fe_id').val(data[0]['id']);
$('#branch_name').val(data[0]['branch_name']);
openModal()
}
</script>

View File

@ -47,6 +47,8 @@ table.dataTable tbody td {
#hr_activity_history_append_area tbody tr {
background-color: transparent !important;
}
.dataTables_length label {height: 21px !important;}
</style>
@ -98,12 +100,26 @@ $(document).ready(function () {
var table = ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
language: {
search: "_INPUT_",
searchPlaceholder: "Search..."
search: `
<div class="datatable-search-wrapper" style="position:relative; display:inline-block; width:100%;">
_INPUT_
<i class="mdi mdi-magnify datatable-search-icon"
style="position:absolute; right:122px !important; top:50%; transform:translateY(-50%); color:#666;"></i>
<i class="mdi mdi-close-circle datatable-clear-icon"
style="position:absolute; right:122px !important; top:50%; transform:translateY(-50%); color:#666; display:none; cursor:pointer;"></i>
</div>
`,
searchPlaceholder: "Search",
emptyTable: '<div class="text-center text-muted">No Data found</div>'
},
paging: true,
pageLength: 10,

View File

@ -3,6 +3,8 @@
padding: 5px 7px 5px 0 !important;
color: #000000;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="tab-pane fade" id="HR-DOC-tab">
@ -143,7 +145,7 @@
<td><?php echo $file['branch_name'] ?></td>
<td><?php echo $file['policy_no'] ?></td>
<td><?php echo $file['file_action'] ?></td>
<td><?php echo change_date_format($file['created_at'],'Y-m-d H:i:s', 'd M Y h:i a') . ' by <strong>' . $file['first_name'] . '</strong>' ?></td>
<td><?php echo change_date_format($file['created_at'],'Y-m-d H:i:s', 'd M Y h:i A') . ' by <strong>' . $file['first_name'] . '</strong>' ?></td>
<td><?php echo $file['status']; ?> </td>
<td> </td>
</tr>
@ -356,9 +358,13 @@
// for datatable
$(document).ready(function() {
$('#hr_tickets_table').DataTable({
// dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [{
extend: 'collection',
text: '<span class=" btn-custom"> Export </span><i class="mdi mdi-menu-down"></i>',

View File

@ -37,6 +37,9 @@
color: white;
border: 1px solid rgba(41, 139, 142, 1);
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="container-fluid-min">
@ -182,9 +185,13 @@
$(document).ready(function() {
$('#tickets-table').DataTable({
// dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: '<i class="mdi mdi-plus" ></i><span class=" btn-custom"> Add </span>',

View File

@ -101,13 +101,13 @@
</div>
</div>
<!-- <div class="form-row policy_issue_date_row" style="display:none;">
<div class="form-row policy_issue_date_row" style="display:none;">
<div class="form-group col-md-4">
<label id="policy_issue_date_label">Policy Issue Date</label> <br />
<input type="text" class="form-control" id="policy_issue_date" name="policy_issue_date"
placeholder="Enter Policy Issue Date">
</div>
</div> -->
</div>
<br>
<div class="form-row" id="import_excel_btn">
@ -171,10 +171,10 @@
$(document).ready(function() {
// var policy_issue_datePicker = flatpickr("#policy_issue_date", {
// dateFormat: "d/m/Y",
// allowInput: false,
// });
var policy_issue_datePicker = flatpickr("#policy_issue_date", {
dateFormat: "d/m/Y",
allowInput: false,
});
$('#insurer_or_tpa, #action_type').on('change', togglePolicyIssueDate);
});
@ -796,15 +796,15 @@
function togglePolicyIssueDate() {
let insurer = $('#insurer_or_tpa').val();
let action = $('#action_type').val();
// if (insurer === 'insurer' && action === 'import') {
// $('.policy_issue_date_row').show();
// $('#policy_issue_date').attr('required', true);
// $('#policy_issue_date_label').html('Policy Issue Date <span class="text-danger">*</span>');
// } else {
// $('.policy_issue_date_row').hide();
// $('#policy_issue_date').removeAttr('required').val('');
// $('#policy_issue_date_label').text('Policy Issue Date');
// }
if (insurer === 'insurer' && action === 'import') {
$('.policy_issue_date_row').show();
$('#policy_issue_date').attr('required', true);
$('#policy_issue_date_label').html('Policy Issue Date <span class="text-danger">*</span>');
} else {
$('.policy_issue_date_row').hide();
$('#policy_issue_date').removeAttr('required').val('');
$('#policy_issue_date_label').text('Policy Issue Date');
}
}
function fetchTpaIdFromTpa(){

View File

@ -164,6 +164,15 @@
margin-left: 5px;
border-radius: 6px;
}
th.no-sort {
pointer-events: none; /* disable click */
}
th.no-sort:before,
th.no-sort:after {
display: none !important; /* hide DataTables sorting arrows */
}
</style>
<div class="container-fluid-min">
<div class="row" id="inception_list">
@ -205,11 +214,12 @@
</div>
<div class="dataTables_length d-flex align-items-center">
</div>
<div>
<div class="table-responsive">
<table data-custom-table-css="table" class="table table-striped mb-0 nowrap" cellspacing="0" id="tickets-table">
<thead class="bg-light">
<tr>
<th></th>
<th class="no-sort"></th>
<th>
<div class="column-header">Insurer</div>
</th>
@ -269,7 +279,7 @@
</span>
</td>
<td><?php echo change_date_format($row['created_at'], 'Y-m-d H:i:s', 'd M Y h:i a') . ' <br> by ' . $row['first_name'] ?></td>
<td><?php echo change_date_format($row['created_at'], 'Y-m-d H:i:s', 'd M Y h:i A') . ' <br> by ' . $row['first_name'] ?></td>
<td>
<?php if ($row['file_status'] != 'failed') { ?>
<div class="btn-group dropdown">
@ -1734,9 +1744,24 @@
"order": [], // Disable initial sorting if needed
"pageLength": 10,
// "dom": '<"top"lf>rt<"bottom"ip><"clear">', // This places length and filter controls at top
"language": {
"lengthMenu": "Show _MENU_ entries",
"search": "Search:"
// "language": {
// "lengthMenu": "Show _MENU_ entries",
// "search": "Search:"
// }
language: {
lengthMenu: "Show _MENU_ entries",
search: `
<div class="datatable-search-wrapper" style="position:relative; display:inline-block; width:100%;">
_INPUT_
<i class="mdi mdi-magnify datatable-search-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666;"></i>
<i class="mdi mdi-close-circle datatable-clear-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666; display:none; cursor:pointer;"></i>
</div>
`,
searchPlaceholder: "Search",
emptyTable: '<div class="text-center text-muted">No Data found</div>'
}
});

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,609 @@
<style>
/* ---- CSS cleaned/optimized ---- */
.table th, .table td { padding: 8px; }
table.dataTable tbody td { padding: 4px 4px !important; }
.col-12 { max-width: 98% !important; }
.dataTables_filter { position: absolute; }
.column-header { margin-right: 10px; }
.filter-inline { display: flex; align-items: center; gap: 10px; }
.filter-inline input[type="date"] { padding: 8px 12px; border:1px solid #ddd; border-radius:4px; font-size:13px; background:white; cursor:pointer; }
.filter-inline input[type="date"]:focus { outline:none; border-color:#00a9a3; }
.icon-btn { width:36px; height:36px; border:1px solid #ddd; background:white; border-radius:4px; cursor:pointer; display:flex; align-items:center; justify-content:center; transition:all 0.2s; }
.icon-btn:hover { background:#f5f5f5; border-color:#00a9a3; }
.icon-btn svg { width:18px; height:18px; fill:#666; }
.icon-btn:hover svg { fill:#00a9a3; }
.policy-list { border:1px solid #e0e0e0; border-radius:4px; overflow:hidden; margin-top:0; }
.policy-header { background:#f8f9fa; padding:12px 15px; font-weight:600; border-bottom:1px solid #e0e0e0; display:flex; align-items:center; font-size:14px; }
.policy-header input[type="checkbox"] { width:18px; height:18px; margin-right:10px; cursor:pointer; }
.policy-item { border-bottom:1px solid #e0e0e0; padding:12px 15px; display:flex; align-items:center; background:white; transition:background 0.2s; }
.policy-item:hover { background:#f9f9f9; }
.policy-item:last-child { border-bottom:none; }
.policy-item.selected { background:#e8f5f4; }
.policy-checkbox { width:18px; height:18px; margin-right:15px; cursor:pointer; }
.policy-info { flex:1; display:flex; justify-content:space-between; align-items:center; }
.policy-details { flex:1; }
.policy-number { font-weight:600; color:#333; margin-bottom:4px; font-size:14px; }
.policy-meta { color:#666; font-size:13px; }
.policy-amount { font-size:16px; font-weight:600; color:#00a9a3; margin-left:20px; }
.badge { display:inline-block; padding:4px 10px; border-radius:12px; font-size:12px; font-weight:600; margin-left:10px; }
.badge-selected { background:#00a9a3; color:white; }
.summary-bar { position:fixed; bottom:0; left:0; right:0; width:100%; background:white; border-top:2px solid #00a9a3; padding:15px 30px; display:none; box-shadow:0 -2px 10px rgba(0,0,0,0.1); z-index:100; }
.summary-bar.show { display:flex; justify-content:flex-start; align-items:center; }
.summary-info { margin-left:auto; margin-right:0; display:flex; gap:40px; align-items:center; }
.summary-item { display:flex; flex-direction:column; }
.summary-label { font-size:12px; color:#666; margin-bottom:2px; }
.summary-value { font-size:18px; font-weight:600; color:#00a9a3; }
.summary-actions { display:flex; gap:10px; margin-left:auto; }
.btn-icon { background:#008b8b; border:none; border-radius:50%; width:32px; height:32px; display:flex; align-items:center; justify-content:center; cursor:pointer; }
.btn-icon i { color:#fff !important; font-size:18px; }
.btn-icon:hover { background:#00a3a3; }
/* Responsive */
@media (max-width:1024px){ .filter-inline{flex-wrap:wrap;} .filter-inline input[type="date"]{font-size:12px;padding:6px 8px;} }
@media (max-width:768px){
.section-header{flex-direction:column;gap:10px;align-items:flex-start;}
.header-right{width:100%;justify-content:space-between;}
.filter-inline{flex:1;}
.summary-bar{left:0;flex-direction:column;gap:15px;padding:15px;}
.summary-info{width:100%;justify-content:space-around;}
.summary-actions{width:100%;}
}
.dataTables_length label {height: 21px !important;}
</style>
<!-- ---- HTML structure remains mostly same ---- -->
<div class="row" id="invoices_details">
<div class="col-12">
<div id="invoices_accordion" class="ml-3">
<div class="card mb-1">
<h4 class="m-1">
<a href="#" onclick="history.back(); return false;">
<i style="font-size: 18px;" class="mdi mdi-chevron-left" title="Back"></i>
</a>
<span>Invoice Details</span>
<a id="toggleIcon" class="text-dark float-right" data-toggle="collapse" href="#collapseOne"
aria-expanded="true">
<i id="icon" class="mdi mdi-chevron-down mr-1 text-primary" style="font-size: 28px;"></i>
</a>
</h4>
<div id="collapseOne" class="collapse show" aria-labelledby="headingOne" data-parent="#invoices_accordion">
<div class="card-body" style="padding-bottom: unset;">
<div class="form-row">
<div class="form-group col-md-3">
<label>Invoice Number </label>
<input class="form-control" type="text" id="invoiceNo" placeholder="Auto-generated" readonly>
</div>
<div class="form-group col-md-3">
<label>Invoice Date <span class="text-danger"></span></label>
<input class="form-control" type="date" id="invoiceDate" required value="" >
</div>
<div class="form-group col-md-3">
<label for="agents"> Agents <span class="text-danger"></span></label>
<select class="form-control" id="agentSelect" name="agents_id" onchange="loadPolicies(); generateInvoiceNumberAjaxCall();" required autocomplete="off">
<option value="">Select Agent</option>
<?php
if(isset($agents) && count($agents)) {
foreach($agents as $agent): ?>
<option value="<?= $agent['id'] ?>">
<?= $agent['name'] ?> - <?= $agent['agent_code'] ?>
</option>
<?php endforeach;
}
?>
</select>
</div>
<div class="form-group col-md-3">
<label>Policy Till Date<span class="text-danger"></span></label>
<input class="form-control" type="date" id="policyTillDate" required onchange="loadPolicies()" max="<?= date('Y-m-d') ?>" >
</div>
<div class="form-group col-md-3">
<input class="form-control" type="hidden" id="invoiceID" required value="<?= isset($invoice['id']) ? $invoice['id'] : '' ?>" >
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row" id="payouts_details">
<div class="col-12">
<div id="policy_accordion" class="ml-3">
<div class="card mb-1">
<div class="row align-items-center m-1" id="policy_filter">
<div class="col d-flex align-items-center">
<h4 class="mb-0">
Policy Selection
<span id="selectedCount" class="badge badge-selected" style="display:none;">0 selected</span>
</h4>
</div>
<div class="col-auto d-flex align-items-center">
<!-- <input type="date" class="form-control mr-2" id="fromDate" placeholder="From Date" title="From Date" style="width:170px;" autocomplete="off">
<input type="date" class="form-control mr-2" id="toDate" placeholder="To Date" title="To Date" style="width:170px;" autocomplete="off">
<button type="button" class="btn-icon mr-1" title="Reset Filters" onclick="resetFilters()"><i class="mdi mdi-refresh"></i></button>
<button type="button" class="btn-icon mr-1" title="Search" onclick="searchPolicies()"><i class="mdi mdi-magnify"></i></button> -->
</div>
<a id="toggleIcon" class="text-dark float-right" data-toggle="collapse" href="#collapseTwo" aria-expanded="true">
<i id="icon" class="mdi mdi-chevron-down mr-1 text-primary" style="font-size: 28px;"></i>
</a>
</div>
<div id="collapseTwo" class="collapse show" aria-labelledby="headingTwo" data-parent="#policy_accordion">
<div class="card-body" style="padding-top: unset !important; border: white !important; background: unset !important;">
<div>
<div>
<table data-custom-table-css="table" class="table table-striped mb-0 nowrap" cellspacing="0" id="tickets-table">
<thead class="bg-light">
<tr>
<th style="text-align:center;"><input type="checkbox" class="CB" id="selectAll" onchange="toggleSelectAll(this)"></th>
<th><div class="column-header">Policy No</div></th> <!-- 2 -->
<th><div class="column-header">Customer</div></th> <!-- 3 -->
<th><div class="column-header">Premium</div></th> <!-- 4 -->
<th><div class="column-header">Policy Issues Date</div></th> <!-- 5 -->
<th><div class="column-header">Commission Amount</div></th> <!-- 6 -->
</tr>
</thead>
<tbody id="ticketListBody">
</tbody>
</table>
</div>
<div id="summaryBar" class="summary-bar">
<div class="summary-info">
<div class="summary-item">
<span class="summary-label">Selected Policies</span>
<span class="summary-value" id="totalPolicies">0</span>
</div>
<div class="summary-item">
<span class="summary-label">Total Commission</span>
<span class="summary-value" id="totalAmount">₹0.00</span>
</div>
</div>
<div class="summary-actions">
<button type="button" class="btn app-btn-outline-primary C" onclick="clearSelection()">Clear</button>
<button type="button" class="btn app-btn-secondary S" onclick="saveInvoice()">Submit</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div><!-- end col -->
</div>
<script>
let selectedPolicies = new Set();
let filteredPolicies = [];
let allPolicies = <?php echo json_encode($payouts); ?> || [];
// Helper
function getEl(id) { return document.getElementById(id); }
$(document).ready(function(){
// Initialize Select2
if ($('#agentSelect').select2) $('#agentSelect').select2();
// Clear fields without triggering change
$("#invoiceNo").val("");
$("#agentSelect").val(""); // do NOT trigger change
// Set max dates for date fields
const today = new Date().toISOString().split("T")[0];
if (getEl('invoiceDate')) getEl('invoiceDate').max = today;
if (getEl('policyTillDate')) getEl('policyTillDate').max = today;
if (getEl('invoiceDate')) getEl('invoiceDate').valueAsDate = new Date();
if (getEl('policyTillDate')) getEl('policyTillDate').valueAsDate = new Date();
// Initial empty DataTable so buttons/search are available even before loading policies
if ($.fn.DataTable.isDataTable('#tickets-table')) {
$('#tickets-table').DataTable().clear().destroy();
}
$('#tickets-table').DataTable({
dom:
"<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',
text: '<span class=" btn-custom"> Export </span><i class="mdi mdi-menu-down"></i>',
className: 'btn app-btn-secondary ',
buttons: [
{
extend: 'csv',
text: '<i class="mdi mdi-file-delimited"></i><span class="btn-custom"> CSV </span>',
className: 'app-btn-primary',
title: getExportFileName(),
exportOptions: {columns: ':not(:first-child)'}
},
{
extend: 'excel',
text: '<i class="mdi mdi-file-excel"></i><span class="btn-custom"> EXCEL </span>',
className: 'app-btn-primary',
title: getExportFileName(),
filename: getExportFileName(),
exportOptions: {columns: ':not(:first-child)'}
}
]
}
],
language: {
search: `
<div class="datatable-search-wrapper" style="position:relative; display:inline-block;">
_INPUT_
<i class="mdi mdi-magnify datatable-search-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666;"></i>
<i class="mdi mdi-close-circle datatable-clear-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666; display:none;"></i>
</div>`,
searchPlaceholder: "Search",
emptyTable: '<div class="text-center text-muted">No Data found</div>'
},
paging: false,
ordering: false,
});
});
// MAIN: load and render policies for selected agent / date
function loadPolicies() {
let agentEl = getEl('agentSelect');
let policyTillDateEl = getEl('policyTillDate');
let list = getEl('ticketListBody');
if (!list) return;
let agentId = agentEl ? agentEl.value : '';
let policyTillDate = policyTillDateEl ? policyTillDateEl.value : '';
console.log('policyTillDate', policyTillDate);
selectedPolicies.clear();
if (!agentId || agentId === '' || agentId === '0') {
// Destroy DataTable so table returns to normal
if ($.fn.DataTable.isDataTable('#tickets-table')) {
$('#tickets-table').DataTable().clear().destroy();
}
list.innerHTML = `<tr><td colspan="6" class="text-center text-danger">Please select an agent</td></tr>`;
reinitDataTable();
updateSummary();
return;
}
filteredPolicies = allPolicies.filter(p => String(p.agentId) === String(agentId));
// policy Till Date filter
filteredPolicies = allPolicies.filter(p => {
if (String(p.agentId) !== String(agentId)) return false;
if (policyTillDate && p.date_db > policyTillDate) return false;
return true;
});
let rows = '';
filteredPolicies.forEach(p => {
const idStr = String(p.id);
const checked = selectedPolicies.has(idStr) ? 'checked' : '';
rows += `
<tr>
<td style="text-align:center;">
<input type="checkbox" class="policy-checkbox CB"
value="${idStr}" ${checked}
onchange="togglePolicy(this.value, this.checked)">
</td>
<td>${p.policyNo || ''}</td>
<td>${p.customer || ''}</td>
<td>${Number(p.premium || 0).toFixed(2)}</td>
<td>${p.date || ''}</td>
<td>${Number(p.commission || 0).toFixed(2)}</td>
</tr>
`;
});
// Destroy DataTable BEFORE inserting rows
if ($.fn.DataTable.isDataTable('#tickets-table')) {
$('#tickets-table').DataTable().clear().destroy();
}
// Insert rows
list.innerHTML = rows;
// Reinitialize AFTER writing rows
reinitDataTable();
updateSelectAllCheckbox();
updateSummary();
}
// DataTable re-init helper (destroy + create)
function reinitDataTable() {
if ($.fn.DataTable.isDataTable('#tickets-table')) {
try {
$('#tickets-table').DataTable().clear().destroy();
} catch (e) {
// ignore destroy errors
}
}
$('#tickets-table').DataTable({
dom:
"<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',
text: '<span class=" btn-custom"> Export </span><i class="mdi mdi-menu-down"></i>',
className: 'btn app-btn-secondary ',
buttons: [
{
extend: 'csv',
text: '<i class="mdi mdi-file-delimited"></i><span class="btn-custom"> CSV </span>',
className: 'app-btn-primary',
title: getExportFileName(),
exportOptions: {columns: ':not(:first-child)'}
},
{
extend: 'excel',
text: '<i class="mdi mdi-file-excel"></i><span class="btn-custom"> EXCEL </span>',
className: 'app-btn-primary',
title: getExportFileName(),
filename: getExportFileName(),
exportOptions: {columns: ':not(:first-child)'}
}
]
}
],
language: {
search: `
<div class="datatable-search-wrapper" style="position:relative; display:inline-block;">
_INPUT_
<i class="mdi mdi-magnify datatable-search-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666;"></i>
<i class="mdi mdi-close-circle datatable-clear-icon"
style="position:absolute; right:10px; top:50%; transform:translateY(-50%); color:#666; display:none;"></i>
</div>`,
searchPlaceholder: "Search",
emptyTable: '<div class="text-center text-muted">No Data found</div>'
},
paging: false,
ordering: false,
// After init, align first column
initComplete: function() {
$('#tickets-table tbody tr td:first-child').css('text-align', 'center');
}
});
}
// Toggle single policy selection (called from checkbox onchange)
function togglePolicy(policyId, checked) {
policyId = String(policyId);
if (checked === undefined) {
// if called without the checked param, toggle based on presence
if (selectedPolicies.has(policyId)) selectedPolicies.delete(policyId);
else selectedPolicies.add(policyId);
} else {
if (checked) selectedPolicies.add(policyId);
else selectedPolicies.delete(policyId);
}
// update UI elements that reflect selection
updateSelectAllCheckbox();
updateSummary();
}
// Select / deselect all currently filtered policies
function toggleSelectAll(sourceCheckbox) {
if (!filteredPolicies || filteredPolicies.length === 0) return;
if (sourceCheckbox.checked) {
filteredPolicies.forEach(p => selectedPolicies.add(String(p.id)));
} else {
filteredPolicies.forEach(p => selectedPolicies.delete(String(p.id)));
}
// update all visible checkboxes to match selection
document.querySelectorAll('#ticketListBody .policy-checkbox').forEach(cb => {
cb.checked = selectedPolicies.has(cb.value);
});
updateSummary();
}
// Update header select-all checkbox state
function updateSelectAllCheckbox() {
const selectAllCheckbox = getEl('selectAll');
if (!selectAllCheckbox) return;
const allSelected = filteredPolicies.length > 0 && filteredPolicies.every(p => selectedPolicies.has(String(p.id)));
selectAllCheckbox.checked = !!allSelected;
}
// Update summary UI (footer/summaryBar)
function updateSummary() {
const summaryBar = getEl('summaryBar');
const selectedCountBadge = getEl('selectedCount');
const totalPoliciesEl = getEl('totalPolicies');
const totalAmountEl = getEl('totalAmount');
if (!totalPoliciesEl || !totalAmountEl) {
return;
}
if (selectedPolicies.size === 0) {
if (summaryBar) summaryBar.classList && summaryBar.classList.remove('show');
if (selectedCountBadge) selectedCountBadge.style.display = 'none';
totalPoliciesEl.textContent = '0';
totalAmountEl.textContent = '₹0.00';
return;
}
if (selectedCountBadge) {
selectedCountBadge.style.display = 'inline-block';
selectedCountBadge.textContent = `${selectedPolicies.size} selected`;
}
if (summaryBar) summaryBar.classList && summaryBar.classList.add('show');
const totalAmount = filteredPolicies
.filter(p => selectedPolicies.has(String(p.id)))
.reduce((sum, p) => sum + Number(p.commission || 0), 0);
totalPoliciesEl.textContent = String(selectedPolicies.size);
totalAmountEl.textContent = `₹${totalAmount.toFixed(2)}`;
}
// Clear selection
function clearSelection() {
if (!confirm('Are you sure you want to clear the selection?')) return;
selectedPolicies.clear();
// uncheck all checkboxes in view
document.querySelectorAll('#ticketListBody .policy-checkbox').forEach(cb => cb.checked = false);
updateSelectAllCheckbox();
updateSummary();
}
// Reset filters (keeps agent selection; clear others)
function resetFilters() {
// Keep agent selected
['fromDate','toDate','from_date','to_date'].forEach(id => {
if (getEl(id)) getEl(id).value = '';
});
}
// Save invoice (AJAX)
function saveInvoice() {
const agentId = getEl('agentSelect')?.value || '';
const invoiceNo = getEl('invoiceNo')?.value || '';
const invoiceDate = getEl('invoiceDate')?.value || '';
const policyTillDate = getEl('policyTillDate')?.value || '';
const invoiceID = '';
if (!agentId || agentId === '0') return toastr.warning('Please select an agent', 'Required');
if (!invoiceDate) return toastr.warning('Please select invoice date', 'Required');
if (selectedPolicies.size === 0) return toastr.warning('Please select at least one policy', 'Required');
const selectedPolicyData = filteredPolicies.filter(p => selectedPolicies.has(String(p.id)));
console.log('selectedPolicyData');
console.log(selectedPolicyData);
let totalAmount = 0;
const policies = selectedPolicyData.map(p => {
let finalAmount = Number(p.commission || 0);
totalAmount += finalAmount;
return {
policy_id: p.id,
policy_no: p.policyNo,
commission_amount: finalAmount,
partner_policy_id : p.partner_policy_id
};
});
const invoiceData = {
invoice_id: invoiceID,
invoice_no: invoiceNo,
agent_id: agentId,
invoice_date: invoiceDate,
invoice_amount: totalAmount,
policies: policies
};
$.ajax({
url: '<?= base_url('payout/invoices/save') ?>',
type: 'POST',
data: JSON.stringify(invoiceData),
contentType: 'application/json',
success: function(response) {
// toastr.success(`Invoice created successfully!<br>Invoice No: ${invoiceNo}`, 'Success');
toastr.success(response.message, 'Success');
window.location.href = '<?= base_url('payout/list') ?>';
},
error: function() {
toastr.error(response.message, 'Invoice Error');
// toastr.error('An error occurred while creating the invoice. Please try again.','Invoice Error');
}
});
}
function getExportFileName() {
let d = new Date();
let day = String(d.getDate()).padStart(2, '0');
let month = String(d.getMonth() + 1).padStart(2, '0');
let year = d.getFullYear();
return `Payouts (${day}-${month}-${year})`;
}
function generateInvoiceNumberAjaxCall() {
let agentId = $("#agentSelect").val();
if (!agentId) {
$("#invoiceNo").val("");
toastr.error("Please Select The Agent");
return;
}
$.ajax({
url: "<?= base_url('payout/invoice/generate-number') ?>/" + agentId,
method: "GET",
dataType: "json",
success: function (res) {
if (res.status === "success") {
$("#invoiceNo").val(res.invoice_no);
} else {
toastr.error(res.message);
}
},
error: function () {
toastr.error("Error generating invoice number");
}
});
}
// function searchPolicies() {
// filterPolicies();
// }
// function filterPolicies() {
// const fromDate = document.getElementById('fromDate').value;
// const toDate = document.getElementById('toDate').value;
// const agentId = document.getElementById('agentSelect').value;
// const policyTillDate = document.getElementById('policyTillDate').value;
// if (!agentId) {
// alert('Please select an agent first');
// return;
// }
// filteredPolicies = allPolicies.filter(p => {
// if (p.agentId != agentId) return false;
// if (policyTillDate && p.date_db > policyTillDate) return false;
// if (fromDate && p.date_db < fromDate) return false;
// if (toDate && p.date_db > toDate) return false;
// return true;
// });
// loadPolicies();
// }
</script>

View File

@ -0,0 +1,430 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Agent Commission Invoice</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
font-size: 12px;
color: #333;
background: #fff;
}
/* Page Setup for DOMPDF */
@page {
size: A4;
margin: 10mm;
}
/* .invoice-container {
width: 100%;
max-width: 210mm;
margin: 0 auto;
padding: 10mm;
background: #fff;
} */
.invoice-container {
width: 180mm; /* reduced from 210mm */
max-width: 180mm;
margin: 0 auto;
padding: 8mm; /* reduced padding */
background: #fff;
}
/* Header */
.invoice-header {
border-bottom: 3px solid #2c3e50;
padding-bottom: 15px;
margin-bottom: 20px;
}
.header-top {
width: 100%;
display: table;
}
.header-top > div {
display: table-cell;
vertical-align: top;
width: 50%;
}
.company-info h1 {
color: #2c3e50;
font-size: 24px;
margin-bottom: 5px;
}
.company-info p {
color: #666;
font-size: 11px;
line-height: 1.4;
}
.invoice-title {
text-align: right;
}
.invoice-title h2 {
font-size: 32px;
color: #e74c3c;
margin-bottom: 5px;
}
.invoice-title p {
font-size: 11px;
color: #666;
}
/* Invoice Info (converted grid to table layout) */
.invoice-info {
width: 100%;
display: table;
margin-bottom: 25px;
background: #f8f9fa;
border-radius: 5px;
}
.invoice-info > div {
display: table-cell;
width: 50%;
vertical-align: top;
padding: 15px;
}
.info-section h3 {
font-size: 13px;
color: #2c3e50;
margin-bottom: 10px;
padding-bottom: 5px;
border-bottom: 2px solid #3498db;
}
.info-row {
width: 100%;
display: table;
padding: 5px 0;
font-size: 11px;
}
.info-row span {
display: table-cell;
}
.info-label {
font-weight: 600;
color: #555;
}
.info-value {
color: #333;
font-weight: 500;
text-align: right;
}
/* Table */
.invoice-table {
width: 100%;
border-collapse: collapse;
margin-bottom: 10px;
margin-top: -16px;
}
.invoice-table thead {
display: table-header-group;
background: #2c3e50;
color: #fff;
}
.invoice-table thead th {
padding: 12px 8px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
text-align: left;
}
.invoice-table td {
padding: 10px 8px;
font-size: 11px;
border-bottom: 1px solid #e0e0e0;
}
.invoice-table tbody tr:nth-child(even) {
background: #f8f9fa;
}
/* Text alignment */
.text-right {
text-align: right;
}
.text-center {
text-align: center;
}
/* Summary Section */
.invoice-summary {
width: 100%;
text-align: right;
margin-top: 20px;
}
.summary-box {
width: 300px;
border: 2px solid #2c3e50;
border-radius: 5px;
display: inline-block;
}
.summary-row {
width: 100%;
display: table;
padding: 10px 15px;
border-bottom: 1px solid #e0e0e0;
}
.summary-row span {
display: table-cell;
}
.summary-row:last-child {
background: #2c3e50;
color: #fff;
font-weight: bold;
font-size: 14px;
}
.summary-label {
font-weight: 600;
}
/* Footer */
.invoice-footer {
border-top: 2px solid #2c3e50;
padding-top: 15px;
margin-top: 30px;
}
.footer-content {
width: 100%;
display: table;
}
.footer-section {
display: table-cell;
width: 50%;
vertical-align: top;
font-size: 10px;
color: #666;
}
.footer-section h4 {
font-size: 12px;
color: #2c3e50;
margin-bottom: 8px;
}
.footer-section p {
line-height: 1.6;
margin-bottom: 5px;
}
/* Signature */
.signature-section {
margin-top: 40px;
text-align: right;
}
.signature-line {
border-top: 2px solid #333;
width: 200px;
margin-left: auto;
padding-top: 10px;
font-size: 11px;
font-weight: 600;
}
/* Page break support */
.page-break {
page-break-after: always;
}
/* Row breaking prevention */
.invoice-table tr {
page-break-inside: avoid;
}
/* Optional hide */
.hide-header .invoice-header {
display: none;
}
.hide-footer .invoice-footer {
display: none;
}
</style>
</head>
<body>
<div class="invoice-container" id="invoiceContent">
<!-- Invoice Header (Can be toggled) -->
<div class="invoice-header">
<div class="header-top">
<div class="company-info">
<h1><?= $broker_company_name ?? 'Broker Company Name' ?></h1>
<p><?= $broker_address ?? 'Company Address Line 1' ?><br>
<?= $broker_city ?? 'City' ?>, <?= $broker_state ?? 'State' ?> - <?= $broker_pincode ?? 'PIN' ?><br>
Email: <?= $broker_email ?? 'email@company.com' ?> | Phone: <?= $broker_phone ?? '+91-XXXXXXXXXX' ?></p>
</div>
<div class="invoice-title">
<p>Commission Statement</p>
</div>
</div>
</div>
<!-- Invoice Information -->
<div class="invoice-info">
<div class="info-section">
<h3>Invoice Details</h3>
<div class="info-row">
<span class="info-label">Invoice Number:</span>
<span class="info-value"><?= $invoice_number ?? 'INV-2024-0001' ?></span>
</div>
<div class="info-row">
<span class="info-label">Invoice Date:</span>
<span class="info-value"><?= $invoice_date ?? date('d-M-Y') ?></span>
</div>
<div class="info-row">
<span class="info-label">Period:</span>
<span class="info-value"><?= $period ?? 'January 2024' ?></span>
</div>
</div>
<div class="info-section">
<h3>Agent Information</h3>
<div class="info-row">
<span class="info-label">Agent Name:</span>
<span class="info-value"><?= $agent_name ?? 'Agent Name' ?></span>
</div>
<div class="info-row">
<span class="info-label">Agent Code:</span>
<span class="info-value"><?= $agent_code ?? 'AGT-0001' ?></span>
</div>
<div class="info-row">
<span class="info-label">No. of Policies:</span>
<span class="info-value"><?= $total_policies ?? '0' ?></span>
</div>
<div class="info-row">
<span class="info-label">Policies Till Date:</span>
<span class="info-value"><?= $policies_till_date ?? '0' ?></span>
</div>
</div>
</div>
<!-- Policy Details Table -->
<table class="invoice-table">
<thead>
<tr>
<th style="width: 5%;">Sr.</th>
<th style="width: 15%;">Policy No.</th>
<th style="width: 25%;">Customer Name</th>
<th style="width: 15%;" class="text-right">Premium ()</th>
<th style="width: 15%;" class="text-center">Issue Date</th>
<th style="width: 15%;" class="text-right">Commission ()</th>
</tr>
</thead>
<tbody>
<?php
$serial = 1;
$total_premium = 0;
$total_commission = 0;
$records_per_page = 25; // Adjust based on page size
foreach($policies as $index => $policy):
$total_premium += $policy['premium'];
$total_commission += $policy['commission'];
// Add page break after certain records
$page_break_class = (($serial % $records_per_page) == 0 && $serial != count($policies)) ? 'page-break' : '';
?>
<tr class="<?= $page_break_class ?>">
<td class="text-center"><?= $serial ?></td>
<td><?= $policy['policy_no'] ?></td>
<td><?= $policy['customer_name'] ?></td>
<td class="text-right"><?= number_format($policy['premium'], 2) ?></td>
<td class="text-center"><?= date('d-M-Y', strtotime($policy['issue_date'])) ?></td>
<td class="text-right"><?= number_format($policy['commission'], 2) ?></td>
</tr>
<?php
// Insert page header for continuation pages
if($page_break_class && $serial != count($policies)):
?>
<tr class="page-header">
<td colspan="6">
<h3>Invoice #<?= $invoice_number ?? 'INV-2024-0001' ?> - Continued</h3>
</td>
</tr>
<?php
endif;
$serial++;
endforeach;
?>
</tbody>
</table>
<!-- Summary Section -->
<div class="invoice-summary">
<div class="summary-box">
<div class="summary-row">
<span class="summary-label">Total Premium:</span>
<span> <?= number_format($total_premium, 2) ?></span>
</div>
<div class="summary-row">
<span class="summary-label">Total Policies:</span>
<span><?= count($policies) ?></span>
</div>
<div class="summary-row">
<span class="summary-label">Total Commission:</span>
<span> <?= number_format($total_commission, 2) ?></span>
</div>
</div>
</div>
<!-- Invoice Footer (Can be toggled) -->
<div class="invoice-footer">
<div class="footer-content">
<div class="footer-section">
<h4>Payment Terms</h4>
<p>Payment due within 15 days of invoice date.</p>
<p>Bank Transfer Details:</p>
<p><strong>Bank:</strong> <?= $bank_name ?? 'Bank Name' ?></p>
<p><strong>Account No:</strong> <?= $account_number ?? 'XXXXXXXXXXXX' ?></p>
<p><strong>IFSC:</strong> <?= $ifsc_code ?? 'XXXXXX' ?></p>
</div>
<div class="footer-section">
<h4>Notes</h4>
<p>Commission calculated as per agreed terms.</p>
<p>This is a computer-generated invoice.</p>
<p>For queries, contact: <?= $contact_email ?? 'accounts@company.com' ?></p>
</div>
</div>
<div class="signature-section">
<div class="signature-line">
Authorized Signatory
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,158 @@
<head>
<style>
/* Page Setup for DOMPDF */
@page {
size: A4;
margin: 10mm;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
font-size: 12px;
color: #333;
background: #fff;
}
.invoice-container {
width: 180mm; /* reduced from 210mm */
max-width: 180mm;
margin: 0 auto;
padding: 8mm; /* reduced padding */
background: #fff;
}
.invoice-container table {
width: 100%;
/* border-collapse: collapse; */
margin-bottom: 15pt;
}
.invoice-container table th,
.invoice-container table td {
border: 1pt solid #000;
padding: 8pt;
text-align: left;
vertical-align: top;
}
.invoice-container th {
background-color: #f0f0f0;
font-weight: bold;
}
.header {
text-align: center;
font-weight: bold;
background-color: #fff;
}
.nhance-address {
text-align: center;
font-weight: bold;
background-color: #fff;
}
.section-header {
font-weight: bold;
background-color: #f8f8f8;
}
.amount {
text-align: right;
}
.bank-details {
margin-top: 15pt;
margin-bottom: 15pt;
line-height: 1.6;
}
.signature {
text-align: right;
margin-top: 40pt;
padding-top: 20pt;
}
.amount-words {
margin-top: 10pt;
margin-bottom: 10pt;
font-weight: bold;
}
strong {
font-weight: bold;
}
</style>
</head>
<body>
<div class="invoice-container">
<table>
<?php if(isset($agent_name)) : ?>
<tr>
<td colspan="3" class="header"><?= $agent_name ?></td>
</tr>
<?php endif; ?>
<?php if(isset($agent_address) && !empty($agent_address)) : ?>
<tr>
<td colspan="3" class="header"><?= $agent_address ?></td>
</tr>
<?php endif; ?>
<tr>
<td class="section-header">Bill To:</td>
<td class="section-header">Invoice No</td>
<td class="section-header">Date</td>
</tr>
<tr>
<td>
<strong>NHANCE INDIA INSURANCE BROKING PVT LTD</strong><br>
'Old No.76, New No.82, 'Sreshtha', First floor , <br>
4th Avenue, Ashok Nagar, Chennai - 600083
</td>
<td><?= isset($invoice_no) && !empty($invoice_no) ? $invoice_no : "-" ?></td>
<td><?= isset($invoice_date) && !empty($invoice_date) ? change_date_format($invoice_date, 'Y-m-d', 'd/m/Y') : "-" ?></td>
</tr>
</table>
<table>
<tr>
<th>Sl No</th>
<th>Description</th>
<th>Amount-INR</th>
</tr>
<tr>
<td>1</td>
<td>INSURANCE BROKING SERVICE (POINT OF SALE)</td>
<td class="amount"><?= isset($invoice_no) && !empty($invoice_amount) ? format_indian_number($invoice_amount) : "-" ?></td>
</tr>
<tr>
<td colspan="2"><strong>Total</strong></td>
<td class="amount"><strong><?= isset($invoice_no) && !empty($invoice_amount) ? format_indian_number($invoice_amount) : "-" ?></strong></td>
</tr>
</table>
<div class="amount-words">
<strong>Amount Payable in words : <?= isset($invoice_no) && !empty($invoice_amount) ? numberToWords((int)$invoice_amount) . ' Only' : "-" ?> </strong>
</div>
<div class="bank-details">
<strong>BANK ACCOUNT DETAILS</strong><br>
ACCOUNT NUMBER : <?= isset($agent_account_no) && !empty($agent_account_no) ? $agent_account_no : "-" ?><br>
IFSC CODE : <?= isset($agent_ifsc_code) && !empty($agent_ifsc_code) ? $agent_ifsc_code : "-" ?><br>
Bank NAME : <?= isset($agent_bank_name) && !empty($agent_bank_name) ? $agent_bank_name : "-" ?>
</div>
<div class="signature">
Authorised Signatory
</div>
</div>
</body>

View File

@ -34,6 +34,7 @@ table.dataTable tbody td {
#scroll-horizontal-datatable tfoot .right-align-input {
text-align: right !important;
}
.dataTables_length label {height: 21px !important;}
</style>
@ -206,9 +207,13 @@ $(document).ready(function() {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -24,6 +24,7 @@ table.dataTable tbody td {
#scroll-horizontal-datatable tfoot .right-align-input {
text-align: right !important;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="col-12" id="second_page">
@ -239,9 +240,9 @@ $(document).ready(function() {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// buttons: [{
// extend: 'csv',
// text: 'CSV',
@ -295,6 +296,10 @@ $(document).ready(function() {
// }
// ],
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -20,6 +20,7 @@ table.dataTable tbody td {
.right-align-input {
text-align: right;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="col-12" id="second_page">
@ -75,9 +76,9 @@ $(document).ready(function() {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// buttons: [{
// extend: 'csv',
// text: 'CSV',
@ -131,6 +132,10 @@ $(document).ready(function() {
// }
// ],
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -38,7 +38,7 @@
color: white;
border:1px solid rgba(41, 139, 142, 1);
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="row" id="kyc_list">
<div class="col-12">
@ -176,11 +176,13 @@
$('#tickets-table').DataTable({
// dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>" ,
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>" ,
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: '<i class="mdi mdi-plus" ></i><span class=" btn-custom"> Add </span>',

View File

@ -2019,16 +2019,22 @@
<?php } ?>
<li>
<a href="<?= base_url('/payout/list') ?>">
<i class="ri-book-open-line"></i>
<i class="ri-money-rupee-circle-line"></i>
<span> Payouts</span>
</a>
</li>
<li>
<a href="<?= base_url('/commission/list') ?>">
<i class="ri-book-open-line"></i>
<i class="ri-percent-line"></i>
<span> Commission</span>
</a>
</li>
<li>
<a href="<?= base_url('/bds_upload/list') ?>">
<i class="ri-car-line"></i>
<span> Motor Policy Bulk Upload</span>
</a>
</li>
<?php } ?>
</ul>

View File

@ -139,7 +139,7 @@ table.dataTable tbody td {
font-size: 0.9rem;
padding: 0.5rem 1rem;
}
.dataTables_length label {height: 21px !important;}
/* Modeal class */
</style>
@ -458,9 +458,13 @@ table.dataTable tbody td {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: 'Add',

View File

@ -8,7 +8,7 @@
</div>
<div class="form-group">
<label for="subject">Subject:</label>
<input type="text" class="form-control" id="subject" name="subject" value="Gmail API Test - . <?php echo date('Y-m-d h:i:s');?>" required>
<input type="text" class="form-control" id="subject" name="subject" value="Gmail API Test - . <?php echo date('Y-m-d h:i:s A');?>" required>
</div>
<div class="form-group">
<label for="content">Content:</label>

View File

@ -2,6 +2,7 @@
.dataTables_filter {
position: absolute;
}
.dataTables_length label {height: 21px !important;}
</style>
<!-- End ADD and EDIT Page HTML -->
@ -94,9 +95,13 @@
var ticketsTable = $('#user-table');
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: 'Add',

View File

@ -194,7 +194,7 @@
<div class="form-row">
<!-- Example: Member welcome mail -->
<!-- <div class="form-group col-md-6 mail-row">
<div class="form-group col-md-6 mail-row">
<div class="mail-section">
<div class="left">
<label class="switch">
@ -209,9 +209,9 @@
</a>
</div>
</div>
</div> -->
</div>
<!-- Example: Member reminder mail -->
<!-- <div class="form-group col-md-6 mail-row">
<div class="form-group col-md-6 mail-row">
<div class="mail-section">
<div class="left">
<label class="switch">
@ -226,7 +226,7 @@
</a>
</div>
</div>
</div> -->
</div>
</div>
@ -266,7 +266,7 @@
</div>
</div>
<!-- member review and summary mail -->
<!-- <div class="form-group col-md-6 mail-row">
<div class="form-group col-md-6 mail-row">
<div class="mail-section">
<div class="left">
<label class="switch">
@ -283,13 +283,13 @@
</div>
</div> -->
</div>
</div>
<div class="form-row">
<!-- Account Manager Summary Mail row-->
<!-- <div class="form-group col-md-6 mail-row">
<div class="form-group col-md-6 mail-row">
<div class="mail-section">
<div class="left">
<label class="switch">
@ -304,9 +304,9 @@
</a>
</div>
</div>
</div> -->
</div>
<!-- client hr summary mail -->
<!-- <div class="form-group col-md-6 mail-row">
<div class="form-group col-md-6 mail-row">
<div class="mail-section">
<div class="left">
<label class="switch">
@ -321,7 +321,7 @@
</a>
</div>
</div>
</div> -->
</div>
</div>
<div class="form-row">
@ -342,7 +342,7 @@
<!-- end -->
<!-- Modal content for the Large example -->
<!-- 1 Modal content for the Large example => Common mail -->
<div class="modal fade" id="member_common_mail_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel"
aria-hidden="true" aria-modal="true" data-backdrop="static">
<div class="modal-dialog modal-full-width scrollb">
@ -354,7 +354,7 @@
<div class="modal-body">
<div class="text-center" id="no_data"></div>
<form role="form" class="parsley-examples" method="post" id="member_common_mail_form" enctype="multipart/form-data">
<input type="hidden" class="form-control" id="template_name" name="template_name" value="Common Mail" readonly>
@ -391,11 +391,13 @@
<input type="text" id="subject" name="subject" class="form-control" placeholder="Subject">
</div>
<div class="form-group col-md-2 testmail" >
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this)">Test Mail</a>
<div class="form-group col-md-5 testmail" >
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this,'send')">Test Mail</a>
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="PreviewTheMail(this,'preview','member_common_mail')">Preview Mail</a>
</div>
</div>
<div class="member_common_mail_section">
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-12">
<select id="member_common_mail_modal_customButton" class="form-control" style="border:none;right: 6px;width: auto;position: absolute;z-index: 1;top: 17px;height: 32px;float: right;" onchange="copyToClipboard(this)">
@ -421,33 +423,36 @@
<input type="file" id="Question_title_fileInput" style="display: none;">
<table data-custom-table-css="table" id="attachment_table" class="table table-sm mb-0" style="margin-top: 30px;">
<table data-custom-table-css="table" id="attachment_table_common" class="table table-sm mb-0" style="margin-top: 30px;">
<thead>
<tr>
<th>Attachments</th>
<th>Action</th>
</tr>
</thead>
<tbody id="attachment_tbody">
<tbody id="attachment_tbody_common">
</tbody>
</table>
</div>
<div class="form-group text-right m-b-0">
<div class="form-group text-right m-b-0 member_common_mail_action">
<button type="button" class="btn btn-primary waves-effect waves-light mr-1"
onclick="sendCommonMails()" > Send Common Mails </button>
<button type="submit" class="btn btn-primary waves-effect waves-light mr-1"
id="btnGridSubmit_2">Submit</button>
</div>
</div>
<div class="member_common_mail_preview"></div>
</form>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- Modal content for the Large example -->
<!-- 2 Modal content for the Large example => Welcome mail-->
<div class="modal fade" id="member_welcome_mail_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel"
aria-hidden="true" aria-modal="true" data-backdrop="static">
<div class="modal-dialog modal-full-width scrollb">
@ -474,11 +479,13 @@
<div class="form-group col-md-5">
<input type="text" id="subject" name="subject" class="form-control" placeholder="Subject">
</div>
<div class="form-group col-md-2 testmail" style="display: none;">
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this)">Test Mail</a>
<div class="form-group col-md-5 testmail" style="display: none;">
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this,'send')">Test Mail</a>
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="PreviewTheMail(this,'preview','member_welcome_mail')">Preview Mail</a>
</div>
</div>
<div class="member_welcome_mail_section">
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-12">
<select id="member_welcome_mailmodal_customButton" class="form-control" style="border:none;right: 6px;width: auto;position: absolute;z-index: 1;top: 17px;height: 32px;float: right;" onchange="copyToClipboard(this)">
@ -516,18 +523,21 @@
</table>
</div>
</div>
<div class="member_welcome_mail_preview"></div>
<div class="form-group text-right m-b-0">
<div class="form-group text-right m-b-0 member_welcome_mail_action">
<button type="submit" class="btn btn-primary waves-effect waves-light mr-1"
id="btnGridSubmit_2">Submit</button>
</div>
</form>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- Modal content for the Large example -->
<!-- 3 Modal content for the Large example => Remainder mail -->
<div class="modal fade" id="member_reminder_mail_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="false" aria-modal="true">
<div class="modal-dialog modal-full-width">
<div class="modal-content">
@ -559,8 +569,9 @@
<div class="form-group col-md-5">
<input type="text" id="subject" name="subject" class="form-control" placeholder="Subject">
</div>
<div class="form-group col-md-2 testmail" style="display: none;">
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this)">Test Mail</a>
<div class="form-group col-md-5 testmail" style="display: none;">
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this,'send')">Test Mail</a>
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="PreviewTheMail(this,'preview','member_reminder_mail')">Preview Mail</a>
</div>
</div>
@ -575,6 +586,7 @@
</select>
</div>
</div> -->
<div class="member_reminder_mail_section">
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-12">
<select id="member_reminder_mail_customButton" class="form-control" style="border:none;right: 6px;width: auto;position: absolute;z-index: 1;top: 17px;height: 32px;float: right;" onchange="copyToClipboard(this)">
@ -604,21 +616,35 @@
<input type="file" id="Question_title_fileInput" style="display: none;">
<table data-custom-table-css="table" id="attachment_table_reminder" class="table table-sm mb-0" style="margin-top: 30px;">
<thead>
<tr>
<th>Attachments</th>
<th>Action</th>
</tr>
</thead>
<tbody id="attachment_tbody_reminder">
</tbody>
</table>
</div>
<div class="form-group text-right m-b-0">
<div class="form-group text-right m-b-0 member_reminder_mail_action">
<button class="btn btn-primary waves-effect waves-light mr-1 preview_button"
id="">Preview</button>
<button type="submit" class="btn btn-primary waves-effect waves-light mr-1"
id="btnGridSubmit_2">Submit</button>
</div>
</form>
</div>
<div class="member_reminder_mail_preview"></div>
</form>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- Modal content for the Large example -->
<!-- 4 Modal content for the Large example => Ecard mail -->
<div class="modal fade" id="member_ecard_mail_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel"
aria-hidden="true" aria-modal="true" data-backdrop="static">
<div class="modal-dialog modal-full-width">
@ -651,10 +677,12 @@
<div class="form-group col-md-5">
<input type="text" id="subject" name="subject" class="form-control" placeholder="Subject">
</div>
<div class="form-group col-md-2 testmail" style="display: none;">
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this)">Test Mail</a>
<div class="form-group col-md-5 testmail" style="display: none;">
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this,'send')">Test Mail</a>
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="PreviewTheMail(this,'preview','member_ecard_mail')">Preview Mail</a>
</div>
</div>
<div class="member_ecard_mail_section">
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-12">
<select id="member_ecard_mail_customButton" class="form-control" style="border:none;right: 6px;width: auto;position: absolute;z-index: 1;top: 17px;height: 32px;float: right;" onchange="copyToClipboard(this)">
@ -695,8 +723,10 @@
</table>
</div>
</div>
<div class="member_ecard_mail_preview"></div>
<div class="form-group text-right m-b-0">
<div class="form-group text-right m-b-0 member_ecard_mail_action">
<button class="btn btn-primary waves-effect waves-light mr-1 preview_button"
id="">Preview</button>
<button type="submit" class="btn btn-primary waves-effect waves-light mr-1"
@ -708,7 +738,7 @@
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- Modal content for the Large example -->
<!-- 5 Modal content for the Large example => Review And Summary mail -->
<div class="modal fade" id="member_review_and_summary_mail_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel"
aria-hidden="true" aria-modal="true" data-backdrop="static">
<div class="modal-dialog modal-full-width">
@ -741,8 +771,9 @@
<div class="form-group col-md-5">
<input type="text" id="subject" name="subject" class="form-control" placeholder="Subject">
</div>
<div class="form-group col-md-2 testmail" style="display: none;">
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this)">Test Mail</a>
<div class="form-group col-md-5 testmail" style="display: none;">
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this,'send')">Test Mail</a>
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="PreviewTheMail(this,'preview','member_review_and_summary_mail')">Preview Mail</a>
</div>
</div>
@ -757,6 +788,7 @@
</select>
</div>
</div> -->
<div class="member_review_and_summary_mail_section">
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-12">
<select id="member_review_and_summary_mail_customButton" class="form-control" style="border:none;right: 6px;width: auto;position: absolute;z-index: 1;top: 17px;height: 32px;float: right;" onchange="copyToClipboard(this)">
@ -785,10 +817,12 @@
<input type="file" id="Question_title_fileInput" style="display: none;">
</div>
<div class="member_review_and_summary_mail_preview"></div>
</div>
<div class="form-group text-right m-b-0">
<div class="form-group text-right m-b-0 member_review_and_summary_mail_action">
<button class="btn btn-primary waves-effect waves-light mr-1 preview_button"
id="">Preview</button>
<button type="submit" class="btn btn-primary waves-effect waves-light mr-1"
@ -799,6 +833,8 @@
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- 6 Modal content for the Large example => Acc Manager Summary mail -->
<div class="modal fade" id="account_maneger_summary_mail_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel"
aria-hidden="true" aria-modal="true" data-backdrop="static">
<div class="modal-dialog modal-full-width">
@ -826,10 +862,12 @@
<div class="form-group col-md-5">
<input type="text" id="subject" name="subject" class="form-control" placeholder="Subject">
</div>
<div class="form-group col-md-2 testmail" style="display: none;">
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this)">Test Mail</a>
<div class="form-group col-md-5 testmail" style="display: none;">
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this,'send')">Test Mail</a>
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="PreviewTheMail(this,'preview','account_maneger_summary_mail')">Preview Mail</a>
</div>
</div>
<div class="account_maneger_summary_mail_section">
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-12">
<select id="account_maneger_summary_mail_modal_customButton" class="form-control" style="border:none;right: 6px;width: auto;position: absolute;z-index: 1;top: 17px;height: 32px;float: right;" onchange="copyToClipboard(this)">
@ -852,7 +890,9 @@
<div id="account_maneger_summary_mail_editor_container" style="height: 600px"></div>
</div>
<!-- </div> -->
<div class="form-group text-right m-b-0">
</div>
<div class="account_maneger_summary_mail_preview"></div>
<div class="form-group text-right m-b-0 account_maneger_summary_mail_action">
<button class="btn btn-primary waves-effect waves-light mr-1 preview_button"
id="">Preview</button>
<button type="submit" class="btn btn-primary waves-effect waves-light mr-1"
@ -865,14 +905,13 @@
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- Modal content for the Large example -->
<!-- 7 Modal content for the Large example => Client HR Summary mail -->
<div class="modal fade" id="client_hr_summary_mail_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel"
aria-hidden="true" aria-modal="true" data-backdrop="static">
<div class="modal-dialog modal-full-width">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="myLargeModalLabel">Member Review and summary mail <span id="nameOfThePolicy"></span></h4>
<h4 class="modal-title" id="myLargeModalLabel">Member Review and Summary Mail <span id="nameOfThePolicy"></span></h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
</div>
<div class="modal-body">
@ -880,86 +919,74 @@
<div class="text-center" id="no_data"></div>
<form role="form" class="parsley-examples" method="post" id="client_hr_summary_mail_form" enctype="multipart/form-data">
<div class="form-group">
<div class="form-group">
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-2">
<label for="template_name">Template Name</label>
</div>
<div class="form-group col-md-5">
<input type="text" id="template_name" name="template_name" value="Client HR Summary Mail" readonly class="form-control" placeholder="Template Name">
</div>
</div>
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-2">
<label for="emp_code">Template Name</label>
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-2">
<label for="subject">Subject</label>
</div>
<div class="form-group col-md-5">
<input type="text" id="subject" name="subject" class="form-control" placeholder="Subject">
</div>
<div class="form-group col-md-5 testmail" style="display: none;">
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this,'send')">Test Mail</a>
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="PreviewTheMail(this,'preview','client_hr_summary_mail')">Preview Mail</a>
</div>
</div>
<div class="form-group col-md-5">
<input type="text" id="template_name" name="template_name" value="Client HR Summary Mail" readonly class="form-control" placeholder="Template Name">
<div class="client_hr_summary_mail_section">
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-12">
<select id="client_hr_summary_mail_customButton" class="form-control" style="border:none; right:6px; width:auto; position:absolute; z-index:1; top:17px; height:32px; float:right;" onchange="copyToClipboard(this)">
<option value="">PlaceHolders</option>
<?php foreach ($placeHolders as $value): ?>
<?php if (in_array($value, ['member_name','nhance_logo','client_logo','app_link','client_name','member_summary'])): ?>
<?php $valueChange = ucwords(str_replace('_',' ',$value)); ?>
<option value="{{<?php echo $value; ?>}}"><?php echo $valueChange; ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
<span id="copy-feedback" style="display: none; position: absolute; top:50px; right:10px; color:green; font-size:12px;">Copied to clipboard!</span>
</div>
</div>
<hr>
<!-- Unlayer editor -->
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-12">
<div id="client_hr_summary_mail_editor_container" style="height:600px;"></div>
</div>
</div>
<div id="editor"></div>
<input type="file" id="Question_title_fileInput" style="display:none;">
</div>
</div> <!-- /.form-group -->
<div class="form-group text-right m-b-0 client_hr_summary_mail_action">
<button type="button" class="btn btn-primary waves-effect waves-light mr-1 preview_button">Preview</button>
<button type="submit" class="btn btn-primary waves-effect waves-light mr-1" id="btnGridSubmit_2">Submit</button>
</div>
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-2">
<label for="emp_code">Subject</label>
</div>
<div class="form-group col-md-5">
<input type="text" id="subject" name="subject" class="form-control" placeholder="Subject">
</div>
<div class="form-group col-md-2 testmail" style="display: none;">
<a class="btn btn-primary waves-effect waves-light mr-1 setid" onclick="testMailSend(this)">Test Mail</a>
</div>
</div>
<!-- <div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-12">
<select name="" id="" class="form-control" style="z-index: 1;float: right;position: absolute;margin-top: 18px;right: 53px;width: 100px;height: 30px;">
<option value="">1</option>
<option value="">2</option>
<option value="">3</option>
<option value="">4</option>
<option value="">6</option>
</select>
</div>
</div> -->
</div> -->
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-12">
<select id="client_hr_summary_mail_customButton" class="form-control" style="border:none;right: 6px;width: auto;position: absolute;z-index: 1;top: 17px;height: 32px;float: right;" onchange="copyToClipboard(this)">
<option value="">PlaceHolders</option>
<?php foreach ($placeHolders as $value): ?>
<?php if ($value == 'member_name' || $value == 'nhance_logo' || $value == 'client_logo' || $value == 'app_link' || $value == 'client_name' || $value == 'member_summary') { ?>
<?php $valueChange = str_replace('_', ' ', $value);
$valueChange = ucwords($valueChange); ?>
<option value="{{<?php echo $value; ?>}}"><?php echo $valueChange; ?></option>
<?php } ?>
<?php endforeach; ?>
</select>
<span id="copy-feedback" style="display: none; position: absolute; top: 50px; right: 10px; color: green; font-size: 12px;">Copied to clipboard!</span>
</div>
</div>
<hr>
<!-- Unlayer editor -->
<div class="form-row" id="rac_rate_dropdown">
<div class="form-group col-md-12">
<div id="client_hr_summary_mail_editor_container" style="height: 600px"></div>
</div>
</div>
<div id="editor"></div>
<input type="file" id="Question_title_fileInput" style="display: none;">
</div>
<div class="form-group text-right m-b-0">
<button class="btn btn-primary waves-effect waves-light mr-1 preview_button"
id="">Preview</button>
<button type="submit" class="btn btn-primary waves-effect waves-light mr-1"
id="btnGridSubmit_2">Submit</button>
</div>
</form>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
<!-- /.modal -->
<div class="client_hr_summary_mail_preview"></div>
</form>
</div> <!-- /.modal-body -->
</div> <!-- /.modal-content -->
</div> <!-- /.modal-dialog -->
</div> <!-- /.modal -->
<div class="modal fade" id="preview_modal" tabindex="-1" role="dialog" aria-hidden="false" aria-modal="true" data-backdrop="static">
<div class="modal-dialog modal-dialog-centered">
@ -976,6 +1003,7 @@
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- <script>
$(document).ready(function() {
const fileInput = document.getElementById("Question_title_fileInput");
@ -1272,6 +1300,8 @@
// Global editor variable
let editor = null;
let template_name = '';
var activeParentModalId = null;
$(document).ready(function() {
const fileInput = document.getElementById("Question_title_fileInput");
@ -1291,7 +1321,8 @@
})
function testMailSend(input) {
// keep watching
function testMailSend(input,StringFlag) {
let test_mail = prompt("Please enter test mail:");
console.log('mail address:', test_mail);
@ -1304,7 +1335,8 @@
console.log('templte id', template_id);
if (template_id) {
let url = '<?= base_url('util/sentTestMail/') ?>' + template_id + '/' + test_mail;
// let url = '<?= base_url('util/sentTestMail/') ?>' + template_id + '/' + test_mail;
let url = '<?= base_url('util/sentTestMail/') ?>' + template_id + '/' + test_mail + '/'+StringFlag;
console.log('testing mail url:', url);
$('.loader').fadeIn();
@ -1368,7 +1400,7 @@
let test_mail_list = $('#common_mail').val();
let test_mail = test_mail_list.split(',')[0] ?? '';
let test_mail = test_mail_list.split(',')[0] ?? ''; //REF:SVM
if (test_mail !== null || test_mail !== "") {
@ -1400,30 +1432,19 @@
type: "POST",
data:{
template_id,
test_mail,
test_mail_list
test_mail_list,
},
dataType: 'json',
success: function(res) {
console.log('Test mail send function response', res)
console.log('Test mail send function response', res);
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
if (res.status == true) {
let respond = res.respond;
console.log('Parsed respond', respond)
if (respond.status == 'success') {
toastr.success(respond.message, 'SUCCESS')
} else {
toastr.warning(respond.message, 'WARNING')
}
if (res.status === true) {
toastr.success(res.message, 'SUCCESS');
} else {
toastr.warning('Failed to sent mail', 'WARNING')
toastr.warning('Failed to send mail', 'WARNING');
}
},
error: function(xhr, status, error) {
@ -1448,13 +1469,19 @@
function addHTMLInput(data = null) {
console.log('addHTMLInput function called');
console.log(template_name);
console.log(`:) addHTMLInput function called for ${template_name}`); // REF : PS
var container = '';
if (template_name == 'member_welcome_mail') {
container = document.getElementById('attachment_tbody');
}
else {
else if (template_name == 'member_common_mail') {
container = document.getElementById('attachment_tbody_common');
}
else if (template_name == 'member_reminder_mail') {
container = document.getElementById('attachment_tbody_reminder');
}
else {
container = document.getElementById('attachment_tbody_ecard');
}
@ -1478,20 +1505,39 @@
const newFormRow = document.createElement('tr');
newFormRow.className = 'dynamic-form-row';
newFormRow.innerHTML = `
<td>
<form class="ajax" onsubmit="submitAttachmentForm(event, this)">
<div class="form-row">
<div class="form-group col-3">
<input type="file" class="file-input__input" name="file" required>
// newFormRow.innerHTML = `
// <td>
// <form class="ajax" onsubmit="submitAttachmentForm(event, this)">
// <div class="form-row">
// <div class="form-group col-3">
// <input type="file" class="file-input__input" name="file" required>
// </div>
// <div class="form-group col-2">
// <button type="submit" class="btn btn-sm btn-primary">Submit</button>
// </div>
// </div>
// </form>
// </td>
// `; // DONT DELETE IT REF : VVJ
newFormRow.innerHTML = `<td>
<form class="ajax" onsubmit="submitAttachmentForm(event, this)">
<div style="display:flex; align-items:center; gap:10px; white-space:nowrap;">
<div>
<input type="file" name="file" required
style="width:100%; min-width:160px;
padding: 0 !important;
background-color: transparent !important;
border-radius: 0 !important;
box-shadow: none !important;
border-color: initial !important; color: white;">
</div>
<div>
<button type="submit" class="btn btn-sm btn-primary">Submit</button>
</div>
</div>
<div class="form-group col-2">
<button type="submit" class="btn btn-sm btn-primary">Submit</button>
</div>
</div>
</form>
</td>
`;
</form>
</td><td></td>`; // REF : PS
container.appendChild(newFormRow);
@ -1499,21 +1545,38 @@
// If no data is passed, create a new empty row
const newRow = document.createElement('tr');
newRow.className = 'dynamic-form-row';
newRow.innerHTML = `<td><form class="ajax" onsubmit="submitAttachmentForm(event, this)">
<div style="display:flex; align-items:center; gap:10px; white-space:nowrap;">
<div>
<input type="file" name="file" required
style="width:100%; min-width:160px;
padding: 0 !important;
background-color: transparent !important;
border-radius: 0 !important;
box-shadow: none !important;
border-color: initial !important; color: white;">
</div>
<div>
<button type="submit" class="btn btn-sm btn-primary">Submit</button>
</div>
</div>
</form>
</td><td></td>`; // REF : PS
newRow.innerHTML = `
<td>
<form class="ajax" onsubmit="submitAttachmentForm(event, this)">
<div class="form-row">
<div class="form-group col-3">
<input type="file" class="file-input__input" name="file" required>
</div>
<div class="form-group col-2">
<button type="submit" class="btn btn-sm btn-primary">Submit</button>
</div>
</div>
</form>
</td>
`;
// newRow.innerHTML = `
// <td>
// <form class="ajax" onsubmit="submitAttachmentForm(event, this)">
// <div class="form-row">
// <div class="form-group col-3">
// <input type="file" class="file-input__input" name="file" required>
// </div>
// <div class="form-group col-2">
// <button type="submit" class="btn btn-sm btn-primary">Submit</button>
// </div>
// </div>
// </form>
// </td>
// `; // DONT DELETE IT REF : VVJ
container.appendChild(newRow);
}
}
@ -1521,7 +1584,14 @@
function removeHTMLInput(element) {
if (template_name == 'member_welcome_mail') {
const container = document.getElementById('attachment_tbody');
} else {
}
else if (template_name == 'member_common_mail') {
container = document.getElementById('attachment_tbody_common');
}
else if (template_name == 'member_reminder_mail') {
container = document.getElementById('attachment_tbody_reminder');
}
else {
const container = document.getElementById('attachment_tbody_ecard');
}
const rows = container.querySelectorAll('.dynamic-form-row');
@ -1539,6 +1609,7 @@
// var template_name = template_name;
var client_id = $('#general_PrimaryKey').val();
// console.log(client_id);
console.log(`:) Submitted for ${template_name}`);
const formData = new FormData(form);
formData.append('template_name', template_name);
@ -1773,7 +1844,7 @@
const validTemplates = [
"account_maneger_summary_mail", "member_reminder_mail","member_common_mail", "member_ecard_mail", "member_welcome_mail", "member_review_and_summary_mail", "client_hr_summary_mail"
];
console.log(`:) getMailTemplateData function called for ${template_name}`); // REF : PS
if (!validTemplates.includes(template_name)) {
console.error("Invalid template name:", template_name);
return;
@ -1791,7 +1862,7 @@
type: "GET",
dataType: 'json',
success: function(res) {
console.log('get Mail Template Data', res);
console.log(':) getMailTemplateData Resp are', res);
if (res) {
// Set subject
@ -1842,6 +1913,8 @@
$('.testmail').toggle(!!res.id);
$('#attachment_table').toggle(!!res.id);
$('#attachment_table_ecard').toggle(!!res.id);
$('#attachment_table_common').toggle(!!res.id);
$('#attachment_table_reminder').toggle(!!res.id);
$('.setid').attr('data-id', res.id || '');
if (template_name == "member_common_mail"){
$('#notification_temp_id').val(res.id);
@ -2445,4 +2518,69 @@
}
});
})
function PreviewTheMail(button, StringFlag,className) {
let $btn = $(button);
let $formSection = $('.' + className + '_section');
let $actionButtons = $('.' + className + '_action');
let $previewSection= $('.' + className + '_preview');
console.log(":/");
console.log($formSection, $actionButtons, $previewSection);
// let $formSection = $('.client_hr_summary_mail_section');
// let $actionButtons = $('.client_hr_summary_mail_action');
// let $previewSection = $('.client_hr_summary_mail_preview');
// 2nd click → Close preview
if ($btn.data('previewing')) {
$formSection.show();
$actionButtons.show();
$previewSection.hide();
$btn.text('Preview Mail');
$btn.data('previewing', false);
return;
}
// 1st click → Open preview
let template_id = $btn.data('id');
let test_mail = "xyz@gmail.com";
if(!template_id){
toastr.warning('Template ID not exist', 'WARNING');
return;
}
let url = '<?= base_url('util/sentTestMail/') ?>' + template_id + '/' + test_mail + '/' + StringFlag;
$('.loader, .loader-mask').fadeIn();
$.ajax({
url: url,
type: "GET",
dataType: 'json',
success: function(res){
$('.loader, .loader-mask').fadeOut();
if(res.status){
let content = res.content || "No Data Found";
$previewSection.html(content.message);
$formSection.hide();
$actionButtons.hide();
$previewSection.show();
$btn.text('Close Preview');
$btn.data('previewing', true);
} else {
toastr.warning('Failed to load content', 'WARNING');
}
},
error: function(xhr){
$('.loader, .loader-mask').fadeOut();
console.error(xhr.responseText);
}
});
}
</script>

View File

@ -33,6 +33,7 @@
padding-right: 15px !important;
padding-left: 15px !important;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="container-fluid-min">
@ -178,9 +179,13 @@
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [{
extend: 'collection',
text: '<span class=" btn-custom"> Export </span><i class="mdi mdi-menu-down"></i>',

View File

@ -23,11 +23,11 @@
}
.badge-container {
background: #F0F0F0;
padding: 6px 12px;
border-radius: 6px;
font-size: 14px;
display: inline-block;
background: #F0F0F0;
padding: 6px 12px;
border-radius: 6px;
font-size: 14px;
display: inline-block;
}
.summary-box {
@ -176,17 +176,28 @@
min-height: 40px;
vertical-align: middle;
}
.dataTables_length label {height: 21px !important;}
</style>
<style>
.invoice-actions {
display: flex;
justify-content: flex-end;
gap: 10px;
}
#invoiceModal .modal-body {
max-height: 520px; /* adjust as needed */
overflow-y: auto;
}
</style>
<div class="col-12">
<div class="card">
<div class="card-body">
<!-- <div class="row" style="padding-bottom: 10px;">
<div class="col-6" style="align-self: center;">
<h4 style="position: relative;">Payout List <span id="payout_title"></span></h4>
</div>
</div> -->
<div class="table-responsive">
<table data-custom-table-css="table" id="scroll-horizontal-datatable" class="table w-100 nowrap">
<thead class="bg-light">
@ -208,7 +219,7 @@
<tr>
<td> <?= $index + 1 ?> </td>
<td> <?= $row['invoice_no'] ?> </td>
<td> <?= change_date_format($row['invoice_no'], null, 'd-M-Y') ?? "" ?> </td>
<td> <?= change_date_format($row['invoice_date'], null, 'd-M-Y') ?? "" ?> </td>
<td> <?= format_indian_number($row['invoice_amount']) ?> </td>
<td> <?= format_indian_number($row['total_utr_amount']) ?> </td>
<td> <?= format_indian_number($row['balance_amount']) ?> </td>
@ -217,10 +228,11 @@
<td>
<div class="btn-group dropdown">
<a href="javascript: void(0);" class="dropdown-toggle arrow-none btn btn-light btn-sm" data-toggle="dropdown"aria-expanded="false"><i class="mdi mdi-dots-horizontal"></i></a>
<div class="dropdown-menu dropdown-menu-right">
<div class="dropdown-menu dropdown-menu-right">
<a class="dropdown-item" onclick="fetchUtrDetails(<?= $row['id'] ?>, '<?= $row['invoice_no'] ?>')"><i class="mdi mdi-bank-transfer mr-2 text-muted font-18 vertical-middle"></i>UTR</a>
<a href="<?= base_url('payout/invoices/save?type="edit"') ?>" class="dropdown-item"><i class="mdi mdi-pencil mr-2 text-muted font-18 vertical-middle"></i>Edit</a>
<a href="<?= base_url('payout/invoices/save?type="adjustment"') ?>" class="dropdown-item"><i class="mdi mdi-tune mr-2 text-muted font-18 vertical-middle"></i>Adjustment</a>
<a href="<?= base_url('payout/invoices?type=edit&id=' . $row['id']) ?>" class="dropdown-item"><i class="mdi mdi-pencil mr-2 text-muted font-18 vertical-middle"></i>Edit</a>
<a href="<?= base_url('payout/invoices?type=adjustment&id=' . $row['id']) ?>" class="dropdown-item"><i class="mdi mdi-tune mr-2 text-muted font-18 vertical-middle"></i>Adjustment</a>
<a onclick="fetchPreviewInvoiceDetails(<?= $row['id'] ?>, '<?= $row['invoice_no'] ?>')" class="dropdown-item"><i class="mdi mdi-eye mr-2 text-muted font-18 vertical-middle"></i>Preview Invoice</a>
</div>
</div>
</td>
@ -247,21 +259,64 @@
</div>
</div>
<!-- Invoice Preview Modal -->
<div class="modal fade" id="invoiceModal" tabindex="-1" role="dialog" aria-hidden="true" aria-modal="true" data-bs-backdrop="static">
<div class="modal-dialog modal-full-width">
<div class="modal-content">
<div class="modal-header" style="background-color: gainsboro;">
<h5 class="modal-title" id="invoiceModalLabel">
Invoice Preview <span id="invoice_heading"></span>
</h5>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
</div>
<div class="modal-body" id="invoice_modal_body">
<input type="hidden" id="row_invoice_id">
<!-- Action Buttons -->
<div class="invoice-actions">
<button class="btn btn-success btn-sm" onclick="downloadInvoicePdf()"><i class="mdi mdi-download"></i> Download PDF</button>
<!-- <button class="btn btn-info btn-sm" onclick="printInvoice()"><i class="mdi mdi-printer"></i> Print </button> -->
</div>
<hr>
<!-- Invoice Preview Container -->
<div id="invoicePreview"></div>
</div>
</div>
</div>
</div>
<!-------------------------------------------------------------------------------------------------->
<script>
// Datatable document ready
$(document).ready(function() {
var tableEl = $('#scroll-horizontal-datatable');
if (tableEl.length) {
var ticketsTable = $('#scroll-horizontal-datatable');
if (ticketsTable.length) {
ticketsTable.DataTable({
var ticketsTable = tableEl.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: 'Add',
className: 'btn app-btn-primary mr-2',
action: function (e, dt, node, config) {
window.location.href = "<?= base_url('payout/invoices?type=add') ?>";
}
},
{
extend: 'collection',
text: '<span class=" btn-custom"> Export </span><i class="mdi mdi-menu-down"></i>',
@ -269,15 +324,21 @@
buttons: [
{
extend: 'csv',
title: 'List',
title: getExportFileName(),
text: '<i class="mdi mdi-file-delimited " ></i><span class=" btn-custom"> CSV </span>',
exportOptions: {
columns: ':not(:last-child)'
},
},
{
extend: 'excel',
title: 'List',
sheetName: 'Policy-Tranction-payout-List',
title: getExportFileName(),
sheetName: getExportFileName(),
text: '<i class="mdi mdi-file-excel " ></i><span class=" btn-custom"> EXCEL </span>',
className: 'app-btn-primary ',
exportOptions: {
columns: ':not(:last-child)'
},
}
]
}
@ -298,14 +359,24 @@
pageLength: 10, // Set default number of rows per page (optional)
ordering: false
});
// IMPORTANT — DataTables draw event REF: TTS
ticketsTable.on('draw.dt', function () {
let rowCount = $('#scroll-horizontal-datatable').DataTable().rows({ filter: 'applied' }).count();
if (rowCount <= 2) {
$('.dataTables_scrollBody').css('overflow', 'inherit');
} else {
$('.dataTables_scrollBody').css('overflow', 'auto');
}
});
} else {
console.error("Table atet found.");
}
});
function fetchUtrDetails(invoice_id, invoice_no)
{
function fetchUtrDetails(invoice_id, invoice_no){
if (!invoice_id) {
toastr.warning("Invoice Id not found!", "WARNING");
return false;
@ -354,4 +425,75 @@
});
}
function fetchPreviewInvoiceDetails(invoice_id, invoice_no){
if (!invoice_id) {
toastr.warning("Invoice Id not found!", "WARNING");
return false;
}
let heading_text = ' - ( ' + invoice_no + ' )';
$('#invoicePreview').empty();
$('#invoice_heading').text(heading_text);
$('#invoicePreview').append('<div class="text-center p-5"><div class="spinner-border text-primary" role="status"><span class="sr-only">Loading...</span></div></div>');
var myModal = new bootstrap.Modal(document.getElementById('invoiceModal'));
myModal.show();
let url = '<?= base_url('payout/invoices/preview') ?>';
// Data to send in the AJAX request
let requestData = {
invoice_id: invoice_id,
};
// Send AJAX request
sendAjaxRequestForGlobal(url, 'GET', requestData, function(response) {
console.log('Data fetched successfully:', response);
$('#invoicePreview').empty();
$('#invoice_heading').text(heading_text);
if (response.status == true) {
$('#invoicePreview').append(response.data);
$('#row_invoice_id').val(invoice_id);
}else{
$('#invoicePreview').append('<div class="text-center p-5 text-muted">No data found</div>');
}
}, function(xhr, status, error) {
console.error('Error fetching data:', error);
console.error(xhr.responseText);
// toastr.error('An error occurred while fetching the data.', 'ERROR');
$('#invoicePreview').empty();
$('#invoicePreview').append('<div class="text-center p-5 text-muted">No data found</div>');
});
}
function addInvoiceButton(){
window.location.href='<?= base_url('payout/invoices?type=add') ?>'
}
function getExportFileName() {
let d = new Date();
let day = String(d.getDate()).padStart(2, '0');
let month = String(d.getMonth() + 1).padStart(2, '0');
let year = d.getFullYear();
return `Invoices (${day}-${month}-${year})`;
}
function downloadInvoicePdf(){
let invoice_id = $('#row_invoice_id').val();
window.location.href = '<?= base_url('payout/invoices/downloadPdf/') ?>' + invoice_id
}
$('#invoiceModal').on('hidden.bs.modal', function () {
$('#row_invoice_id').val("");
console.log('value reseted...')
});
</script>

View File

@ -128,6 +128,7 @@
$('#reportrange').val('');
$('#startDate').val('');
$('#endDate').val('');
window.location.reload(true);
});
});

View File

@ -154,6 +154,7 @@
toastr.success(response.message, 'SUCCESS');
$('#modal_body').empty();
$('#modal_body').append(response.data);
window.location.href = '<?= base_url("payout/list") ?>';
}else{
toastr.warning(response.message || 'Unable to fetch data', 'WARNING');
}
@ -163,7 +164,6 @@
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
},
error: function(xhr, status, error) {
$('.loader').fadeOut();

View File

@ -109,7 +109,6 @@
margin-top:10px;
}
</style>
<div id="policyGMCTerms" style="display:none">
@ -126,8 +125,8 @@
<div class="form-group">
<div class="row" style="margin-bottom: 10px;">
<!-- <div class="row" style="margin-bottom: 10px;">
REF: VR
<div class="col">
<div class="d-flex align-items-center gap-2">
<label for="sumInsured" class="form-label" >Sum Insured</label>
@ -143,9 +142,9 @@
</div>
</div>
REF: VR
<div id="gmc_si_add_more"></div>
REF: VR
<div class="row" style="margin-bottom:10px;">
<div class="col">
<label for="totalSumInsured" class="form-label me-3">Family Floater</label>
@ -160,6 +159,45 @@
<label class="form-check-label" for="familyFloaterNo">No</label>
</div>
</div>
</div> -->
<div class="row mb-2">
<div class="col-md-4">
<label class="form-label">Sum Insured</label>
</div>
<div class="col-md-6">
<div class="d-flex align-items-center gap-2">
<input class="form-control" type="text" name="sum_insured" id="sum_insured"
style="max-width:200px;"
onkeypress="return onlyNumbers(event)"
onkeyup="formatNumber(this); si_keup_num_to_word(this)">
<button type="button" class="btn btn-primary ml-2 si-add-more"
onclick="appendGMCSIAddMore()"
style="background-color:#e26728;border:1px solid #e26728;">
<i class="mdi mdi-plus"></i>
</button>
</div>
<div id="numberToWordGMC" class="text-danger-2 mt-1"></div>
</div>
</div>
<div id="gmc_si_add_more"></div>
<div class="row mb-2">
<div class="col-md-4">
<label class="form-label">Family Floater</label>
</div>
<div class="col-md-6">
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" id="familyFloaterYes" name="family_floater" value="1">
<label class="form-check-label" for="familyFloaterYes" style="width: 52px !important">Yes</label>
<input class="form-check-input" type="radio" id="familyFloaterNo" name="family_floater" value="0">
<label class="form-check-label" for="familyFloaterNo">No</label>
</div>
</div>
</div>
@ -1183,6 +1221,7 @@
if (Array.isArray(jsonObject[key])) {
jsonObject[key].forEach((value, index) => {
appendGMCSIAddMore(value);
});
} else {
console.log(`${key} is not an array.`);
@ -1269,14 +1308,27 @@
if (element.value === jsonObject[key]) {
element.checked = element.value === jsonObject[key];
if (element.name === "family_floater") {
element.parentElement.nextElementSibling.style
.display = '';
element.parentElement.parentElement
.parentElement.nextElementSibling.style
.display = '';
// alert('family floater');
} else if (element.name ===
// if (element.name === "family_floater") { REF: VR
// element.parentElement.nextElementSibling.style
// .display = '';
// element.parentElement.parentElement
// .parentElement.nextElementSibling.style
// .display = '';
// // alert('family floater');
// }
if (element.name === "family_floater" && element.checked) {
let currentRow = element.closest('.row');
if (currentRow && currentRow.nextElementSibling) {
currentRow.nextElementSibling.style.display = '';
}
if (currentRow && currentRow.nextElementSibling && currentRow.nextElementSibling.nextElementSibling) {
currentRow.nextElementSibling.nextElementSibling.style.display = '';
}
}
else if (element.name ===
"waiverofpreexistingdiseases") {
element.parentElement.parentElement
.nextElementSibling.style.display = '';
@ -1546,6 +1598,52 @@
}
};
$("#sum_insured").on("keyup", function() {
var inputNumber = $(this).val();
console.log('keyup sum insured 2nd');
if (inputNumber) {
var result = convertCommaNumberToWords(inputNumber);
$("#numberToWordSumInsured").text(result);
} else {
$("#numberToWordSumInsured").text("");
}
});
$(".multiple_sum_insured").on("keyup", function() {
console.log('multiple_sum_insured key up')
var inputNumber = $(this).val();
console.log('inputNumber', inputNumber);
if (inputNumber) {
var result = convertCommaNumberToWords(inputNumber);
console.log(result);
$(".numberToWordSumInsured").text(result);
} else {
$(".numberToWordSumInsured").text("");
}
});
function numtowordinkeyup(input) {
console.log('numtowordinkeyup');
var inputNumber = $(input).val().toString().replace(/,/g, '').trim();
var $parentRow = $(input).closest('.row');
var $targetDiv = $parentRow.find('.numberToWordSumInsured');
if (inputNumber) {
var result = convertCommaNumberToWords(inputNumber);
$targetDiv.text(result);
} else {
$targetDiv.text("");
}
}
</script>
<!-- Policy terms Add Special Condition -->
@ -1749,35 +1847,67 @@
}
}
function appendGMCSIAddMore(data = null) {
//REF: VR
// function appendGMCSIAddMore(data = null) {
// console.log('function called')
// var html = `
// <div class="row" style="margin-bottom: 10px;">
// <div class="col">
// <div class="d-flex align-items-center gap-2">
// <label for="sumInsured" class="form-label" >Additional Sum Insured</label>
// <input class="form-control mr-2" style="max-width:200px;"
// value="${data == null || data == undefined || data == "" ? '' : data}" type="text" name="multiple_sum_insured[]"
// class="form-control multiple_sum_insured mr-2" onkeypress="return onlyNumbers(event)"
// onkeyup="formatNumber(this); numtowordinkeyup(this)">
// <button type="button" class="btn btn-primary si-add-more mr-2" onclick="appendGMCSIAddMore()"
// style="background-color: #e26728; border:1px solid #e26728;">
// <i class="mdi mdi-plus"></i>
// </button>
// <button type="button" class="btn btn-danger si-remove-multi mr-2" onclick="removeGMCAdditionalSI(this)"
// style="background-color: #BD0707;border:1px solid #BD0707">
// <i class="mdi mdi-delete"></i>
// </button>
// <div id='numberToWordSumInsured' class="text-danger-2 mr-2"></div>
// </div>
// </div>
// </div> `;
// $('#gmc_si_add_more').append(html);
// }
function appendGMCSIAddMore(data = '') {
console.log('function called')
var html = `
<div class="row" style="margin-bottom: 10px;">
<div class="col">
<div class="d-flex align-items-center gap-2">
<label for="sumInsured" class="form-label" >Additional Sum Insured</label>
<input class="form-control mr-2" style="max-width:200px;"
value="${data == null || data == undefined || data == "" ? '' : data}" type="text" name="multiple_sum_insured[]"
class="form-control multiple_sum_insured mr-2" onkeypress="return onlyNumbers(event)"
onkeyup="formatNumber(this); numtowordinkeyup(this)">
<button type="button" class="btn btn-primary si-add-more mr-2" onclick="appendGMCSIAddMore()"
style="background-color: #e26728; border:1px solid #e26728;">
<i class="mdi mdi-plus"></i>
</button>
<button type="button" class="btn btn-danger si-remove-multi mr-2" onclick="removeGMCAdditionalSI(this)"
style="background-color: #BD0707;border:1px solid #BD0707">
<i class="mdi mdi-delete"></i>
</button>
<div id='numberToWordSumInsured' class="text-danger-2 mr-2"></div>
</div>
<div class="row align-items-start mb-2">
<div class="col-md-4">
<label class="form-label">Additional Sum Insured</label>
</div>
</div>
`;
$('#gmc_si_add_more').append(html);
<div class="col-md-6">
<div class="d-flex align-items-center gap-2">
<input class="form-control" style="max-width:200px;"
value="${data == null || data == undefined || data == "" ? '' : data}" type="text" name="multiple_sum_insured[]"
type="text" name="multiple_sum_insured[]"
onkeypress="return onlyNumbers(event)"
onkeyup="formatNumber(this); numtowordinkeyup(this)">
<button type="button" class="btn btn-primary si-add-more ml-2 "
onclick="appendGMCSIAddMore()"
style="background-color:#e26728;border:1px solid #e26728;">
<i class="mdi mdi-plus"></i>
</button>
<button type="button" class="btn btn-danger si-remove-multi ml-2"
onclick="removeGMCAdditionalSI(this)"
style="background-color:#BD0707;border:1px solid #BD0707;">
<i class="mdi mdi-delete"></i>
</button>
</div>
<div class="text-danger-2 mr-2 numberToWordSumInsured"></div>
</div>
</div>`;
$('#gmc_si_add_more').append(html);
}
function removeGMCAdditionalSI(button) {
@ -2037,5 +2167,4 @@
}
});
</script>

View File

@ -104,8 +104,8 @@
<div class="form-group">
<div class="row" style="margin-bottom: 10px;">
<!-- <div class="row" style="margin-bottom: 10px;">
REF: VR
<div class="col">
<div class="d-flex align-items-center gap-2">
<label for="sumInsured" class="form-label" >Sum Insured</label>
@ -123,7 +123,7 @@
</div>
</div>
REF: VR
<div class="row" style="margin-bottom: 10px;">
<div class="col">
@ -134,8 +134,44 @@
<div id='numberToWordTotalSumInsured' class="text-danger-2 mr-2"></div>
</div>
</div>
</div> -->
<div class="row mb-2">
<div class="col-md-4">
<label for="sumInsured" class="form-label" >Sum Insured</label>
</div>
<div class="col-md-6">
<div class="d-flex align-items-center gap-2">
<input class="form-control mr-2" type="text" name="sumInsured2" id="sumInsured2" style="max-width:200px;"
onkeypress="return onlyNumbers(event)" onkeyup="formatNumber(this)">
<button type="button" class="btn btn-primary si-add-more ml-2" onclick="appendGPASIAddMore()"
style="background-color: #e26728; border:1px solid #e26728;">
<i class="mdi mdi-plus"></i>
</button>
</div>
<div id='numberToWordSumInsured' class="text-danger-2 mr-2"></div>
</div>
</div>
<div id="gpa_si_add_more"></div>
<div class="row mb-2">
<div class="col-md-4">
<label for="totalSumInsured">Total Sum Assured</label>
</div>
<div class="col-md-6">
<div class="d-flex align-items-center gap-2">
<input type="text" style="max-width: 200px !important;" class="form-control mr-2" name="totalSumInsured"
id="totalSumInsured" onkeypress="return onlyNumbers(event)" onkeyup="formatNumber(this)">
</div>
<div id='numberToWordTotalSumInsured' class="text-danger-2 mr-2"></div>
</div>
</div>
<div class="row" style="margin-bottom: 10px;">
<div class="col d-flex align-items-center"
style="background-color: #F5FFFF;border-radius:10px;box-shadow: 0px 2px 2px 0px #00000040;
@ -144,7 +180,7 @@
<input disabled type="checkbox" style="color:black;" name="family_floaters[]"
value="self" id="self" checked>
<span style="margin-right: 40px;color:black;">Self</span>
<span style="margin-right: 40px;color:black; margin-left: 8px;">Self</span>
<div class="self-age" style="margin-right: 20px;">
<span style="margin-right: 20px;color:black;">Min Age:</span>
@ -885,23 +921,40 @@
}
});
// function numtowordinkeyup(input) {
// console.log('testing......')
// console.log(input);
// var inputNumber = $(input).val();
// console.log('inputNumber', inputNumber);
// if (inputNumber) {
// var result = numberToWordsIndian(inputNumber);
// console.log(result);
// var $parentRow = $(input).closest('.row');
// console.log('$parentRow', $parentRow)
// var $targetDiv = $parentRow.find('.numberToWordSumInsured');
// $targetDiv.text(result)
// console.log('$targetDiv', $targetDiv)
// }
// }
function numtowordinkeyup(input) {
console.log('testing......')
console.log(input);
var inputNumber = $(input).val();
console.log('inputNumber', inputNumber);
var inputNumber = $(input).val().toString().replace(/,/g, '').trim();
var $parentRow = $(input).closest('.row');
var $targetDiv = $parentRow.find('.numberToWordSumInsured');
if (inputNumber) {
var result = numberToWordsIndian(inputNumber);
console.log(result);
var $parentRow = $(input).closest('.row');
console.log('$parentRow', $parentRow)
var $targetDiv = $parentRow.find('.numberToWordSumInsured');
$targetDiv.text(result)
console.log('$targetDiv', $targetDiv)
var result = convertCommaNumberToWords(inputNumber);
$targetDiv.text(result);
} else {
$targetDiv.text("");
}
}
$("#totalSumInsured").on("keyup", function() {
@ -914,35 +967,69 @@
}
});
//REF: VR function appendGPASIAddMore(data = null) {
// console.log('appendGPASIAddMore function called')
// console.log('appendGPASIAddMore function data', data)
// var html = `
// <div class="row" style="margin-bottom: 10px;">
// <div class="col">
// <div class="d-flex align-items-center gap-2">
// <label for="sumInsured" class="form-label" >Additional Sum Insured</label>
// <input
// style="max-width:200px;"
// value="${data == null || data == undefined || data == "" ? '' : data}" type="text" name="multiple_sum_insured[]"
// class="form-control multiple_sum_insured mr-2" onkeypress="return onlyNumbers(event)" onkeyup="formatNumber(this); numtowordinkeyup(this)">
// <button type="button" class="btn btn-primary si-add-more mr-2" onclick="appendGPASIAddMore()"
// style="background-color: #e26728; border:1px solid #e26728;" >
// <i class="mdi mdi-plus"></i>
// </button>
// <button type="button" class="btn btn-danger si-remove-multi mr-2" onclick="removeGMCAdditionalSI(this)"
// style="background-color: #BD0707;border:1px solid #BD0707">
// <i class="mdi mdi-delete"></i>
// </button>
// <div id='numberToWordSumInsured' class="text-danger-2 "></div>
// </div>
// </div>
// </div>
// `;
// $('#gpa_si_add_more').append(html);
// }
function appendGPASIAddMore(data = null) {
console.log('appendGPASIAddMore function called')
console.log('appendGPASIAddMore function data', data)
var html = `
<div class="row" style="margin-bottom: 10px;">
<div class="col">
<div class="row align-items-start mb-2">
<div class="col-md-4">
<label for="sumInsured" class="form-label" >Additional Sum Insured</label>
</div>
<div class="col-md-6">
<div class="d-flex align-items-center gap-2">
<label for="sumInsured" class="form-label" >Additional Sum Insured</label>
<input
style="max-width:200px;"
value="${data == null || data == undefined || data == "" ? '' : data}" type="text" name="multiple_sum_insured[]"
class="form-control multiple_sum_insured mr-2" onkeypress="return onlyNumbers(event)" onkeyup="formatNumber(this); numtowordinkeyup(this)">
<button type="button" class="btn btn-primary si-add-more mr-2" onclick="appendGPASIAddMore()"
style="max-width:200px;"
value="${data == null || data == undefined || data == "" ? '' : data}" type="text" name="multiple_sum_insured[]"
class="form-control multiple_sum_insured mr-2" onkeypress="return onlyNumbers(event)" onkeyup="formatNumber(this); numtowordinkeyup(this)">
<button type="button" class="btn btn-primary si-add-more ml-2" onclick="appendGPASIAddMore()"
style="background-color: #e26728; border:1px solid #e26728;" >
<i class="mdi mdi-plus"></i>
</button>
<button type="button" class="btn btn-danger si-remove-multi mr-2" onclick="removeGMCAdditionalSI(this)"
<button type="button" class="btn btn-danger si-remove-multi ml-2" onclick="removeGMCAdditionalSI(this)"
style="background-color: #BD0707;border:1px solid #BD0707">
<i class="mdi mdi-delete"></i>
</button>
<div id='numberToWordSumInsured' class="text-danger-2 "></div>
</div>
</div>
</div>
`;
<div class="text-danger-2 mr-2 numberToWordSumInsured"></div>
</div>
</div>`;
$('#gpa_si_add_more').append(html);
}

View File

@ -63,7 +63,7 @@
aria-hidden="true" aria-modal="true" data-backdrop="static" style="padding-right: 15px">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<!-- <div class="modal-header">
<div class="col-md-6">
<h4 class="modal-title" id="myLargeModalLabel">Rack Rate <span id="PolicyNameForTitle"></span></h4>
</div>
@ -73,6 +73,13 @@
<div class="col-md-1" style="position: relative;top: 10px;">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
</div>
</div> -->
<div class="modal-header d-flex align-items-center justify-content-between">
<h4 class="modal-title" id="myLargeModalLabel">Rack Rate <span id="PolicyNameForTitle"></span></h4><!-- Left: Title -->
<div class="d-flex align-items-center">
<div id="add_new_rack_rate_tab_div" class="mr-5"><button class="btn btn-info waves-effect waves-light" id="add_new_rack_rate_tab" onclick="appendNewTab()">Add Rack Rate</button></div><!-- Add Button (show/hide works normally) -->
<button type="button" class="close mr-1" data-dismiss="modal" aria-hidden="true">×</button><!-- Close Button -->
</div><!-- Right: Buttons -->
</div>
<div class="modal-body">

View File

@ -32,11 +32,13 @@
box-shadow: none;
outline: none;
width: 100%;
padding: 5px 30px !important;
}
#insurerTable th,
#insurerTable td {
padding: 5px;
height: 30px;
padding: 2px 4px !important;
/* height: 30px; */
vertical-align: middle;
}
@ -50,16 +52,65 @@
height: 20px;
width: 20px;
}
#insurerTable th,
#insurerTable th {
min-width: 230px;
}
/** newly implemented */
#insurerTable thead th:first-child {
border-top: 0px solid #fff !important;
border-bottom: 0px solid #fff !important;
background-color: transparent !important;
}
#insurerTable tbody td {
border-top: 0px solid #fff !important;
border-bottom: 0px solid #fff !important;
background-color: transparent !important;
}
#insurerTable th{
color: black !important;
background-color: transparent !important;
}
#insurerTable input[type="text"],
#insurerTable select {
width: 100%;
font-size: 14px;
line-height: 1.5;
color: #000;
background-color: #fff;
background-clip: padding-box;
border: 1px solid #ced4da;
border-radius: 4px;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
box-sizing: border-box;
}
/* Focus effect like form-control */
#insurerTable input[type="text"]:focus,
#insurerTable select:focus {
border-color: #80bdff;
outline: 0;
box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}
/* Disabled & readonly styling */
#insurerTable input[readonly],
#insurerTable input:disabled,
#insurerTable select:disabled {
background-color: #e0e0e0; /* Darker background */
color: #666; /* Darker text color */
cursor: not-allowed;
}
</style>
<style>
.readonly-color {
background-color: #e0e0e0; /* Darker background */
color: #666; /* Darker text color */
}
.readonly-select {
pointer-events: none;
/* background-color: #f0f0f0; */
@ -91,28 +142,13 @@
.input-with-percentage::after {
content: '%';
position: absolute;
right: 5px;
right: 10px;
top: 50%;
transform: translateY(-50%);
font-weight: bold;
color: #000;
}
/** newly implemented */
#insurerTable thead th:first-child {
border-top: 0px solid #fff !important;
border-bottom: 0px solid #fff !important;
background-color: transparent !important;
}
#insurerTable tbody td {
border-top: 0px solid #fff !important;
border-bottom: 0px solid #fff !important;
background-color: transparent !important;
}
#insurerTable th{
color: black !important;
background-color: transparent !important;
}
</style>
<div class="row" id="endorsement_form" style="display: none;">
@ -266,12 +302,12 @@
</div>
<div class="form-group col-md-3">
<label for="policy_issue_date">Date of Issue<span id="base_danger" class="text-danger">*</span></label>
<label for="policy_issue_date">Endorsement Issue Date<span id="base_danger" class="text-danger">*</span></label>
<input type="text" class="form-control" id="policy_issue_date" name="policy_issue_date" placeholder="DD/MM/YYYY" required>
</div>
<div class="form-group col-md-3">
<label for="month">Policy Issue Month<span id="base_danger" class="text-danger">*</span></label>
<label for="month">Endorsement Issue Month<span id="base_danger" class="text-danger">*</span></label>
<input type="text" class="form-control readonly-select" id="month" name="month" placeholder="MM/YYYY" required>
</div>
@ -399,15 +435,19 @@
<td>CD Amount</td>
</tr>
<tr id="table_tr_35">
<tr id="table_tr_35" style="display: none;">
<td>Follower Policy No</td>
</tr>
<tr id="table_tr_40" >
<td>Endorsement Issue Date</td>
</tr>
<tr id="table_tr_3" style="display: none;">
<td>Co-Share %</td>
</tr>
<tr id="table_tr_36">
<td>Non Commitional <br> Premium Amount</td>
<td>Non Commissional <br> Premium Amount</td>
</tr>
<tr id="table_tr_4">
<td>Base Premium</td>
@ -926,7 +966,7 @@
dataType: 'json',
success: function (res) {
console.log(res)
console.log("get_client_policy_data_using_policy_no_and_endo_no Response : ", res);
if(res.status == true){
$('#ct_type').val(1)
}else{
@ -939,6 +979,8 @@
console.error(status, error);
}
});
}else{
console.log('Policy number or Endorsement Number is empty')
}
})
@ -2120,100 +2162,103 @@
break;
case 4: // follower policy no
newCell = `<td class=""><input type="text" class="readonly-color" id="follower_policy_no_${insurerCount}" name="follower_policy_no[]" readonly></td>`;
break;
case 5: // calc_policy_issue_date
newCell = `<td class=""><input type="text" class="" id="calc_policy_issue_date_${insurerCount}" name="calc_policy_issue_date[]"></td>`;
break;
case 5: // Co-Share %
case 6: // Co-Share %
newCell = `<td class="input-with-percentage"><input type="text" id="co_share_per_${insurerCount}" class="right-align-input" name="co_share_per[]" oninput="validateRange(this)" onchange="co_share_percentage_calculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 6: // Non commissionable Premium amount %
case 7: // Non commissionable Premium amount %
newCell = `<td><input type="text" class="right-align-input" id="non_comm_per_amt_${insurerCount}" name="non_comm_per_amt[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 7: // Base Premium
case 8: // Base Premium
newCell = `<td><input type="text" class="right-align-input" id="base_premium_${insurerCount}" name="base_premium[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 8: // TP Premium
case 9: // TP Premium
newCell = `<td><input type="text" class="right-align-input" id="tp_premium_${insurerCount}" name="tp_premium[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 9: // Ter Premium
case 10: // Ter Premium
newCell = `<td><input type="text" class="right-align-input" id="ter_premium_${insurerCount}" name="ter_premium[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 10: // co Premium
case 11: // co Premium
newCell = `<td><input type="text" class="right-align-input" id="co_premium_${insurerCount}" name="co_premium[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 11: // Co TP Premium
case 12: // Co TP Premium
newCell = `<td><input type="text" class="right-align-input" id="co_tp_premium_${insurerCount}" name="co_tp_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 12: // Co Ter Premium
case 13: // Co Ter Premium
newCell = `<td><input type="text" class="right-align-input" id="co_ter_premium_${insurerCount}" name="co_ter_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 13: // CGST
case 14: // CGST
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="cgst_${insurerCount}" name="cgst[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 14: // SGST
case 15: // SGST
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="sgst_${insurerCount}" name="sgst[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 15: // IGST
case 16: // IGST
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="igst_${insurerCount}" name="igst[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 16: // GST Amount
case 17: // GST Amount
newCell = `<td><input type="text" class="right-align-input" id="gst_amount_${insurerCount}" name="gst_amount[]" onchange="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 17: // Stamp Duty
case 18: // Stamp Duty
newCell = `<td><input type="text" class="right-align-input" id="stamp_duty_${insurerCount}" name="stamp_duty[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 18: // Total
case 19: // Total
newCell = `<td><input type="text" class="readonly-color right-align-input" id="total_amt_${insurerCount}" name="total[]" readonly onkeypress="return onlyNumbers(event)"></td>`;
break;
case 19: // Agreed BP %
case 20: // Agreed BP %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="agreed_bp_${insurerCount}" name="agreed_bp[]" oninput="amountCalculation('${insurerCount}'); validateRange(this)" onkeypress="return onlyNumbers(event)" ></td>`;
break;
case 20: // Agreed TP %
case 21: // Agreed TP %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="agreed_tp_${insurerCount}" name="agreed_tp[]" oninput="amountCalculation('${insurerCount}'); validateRange(this)" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 21: // Agreed Ter %
case 22: // Agreed Ter %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="agreed_tep_${insurerCount}" name="agreed_ter[]" oninput="amountCalculation('${insurerCount}'); validateRange(this)" onkeypress="return onlyNumbers(event)" ></td>`;
break;
case 22: // Agreed Amount
case 23: // Agreed Amount
newCell = `<td><input type="text" class="right-align-input" id="agreed_amount_${insurerCount}" name="agreed_amount[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 23: // Standard BP %
case 24: // Standard BP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-color right-align-input" id="standard_bp_${insurerCount}" name="standard_bp[]" onkeypress="return onlyNumbers(event)" readonly></td>`;
break;
case 24: // Standard TP %
case 25: // Standard TP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-color right-align-input" name="standard_tp[]" onkeypress="return onlyNumbers(event)" readonly ></td>`;
break;
case 25: // Standard Ter %
case 26: // Standard Ter %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-color right-align-input" name="standard_ter[]" onkeypress="return onlyNumbers(event)" readonly></td>`;
break;
case 26: // Actual BP Amount
case 27: // Actual BP Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="actual_bp_amt_${insurerCount}" name="actual_bp_amt[]" onchange="actualAmountCalculation('${insurerCount}', 'bp_amt_for_calc')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 27: // Actual TP Amount
case 28: // Actual TP Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="actual_tp_amt_${insurerCount}" name="actual_tp_amt[]" onchange="actualAmountCalculation('${insurerCount}', 'tp_amt_for_calc')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 28: // Actual TEP Amount
case 29: // Actual TEP Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="actual_tep_amt_${insurerCount}" name="actual_tep_amt[]" onchange="actualAmountCalculation('${insurerCount}', 'tep_amt_for_calc')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 29: // Actual BP %
case 30: // Actual BP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-select right-align-input" id="actual_bp_per_${insurerCount}" name="actual_bp_per[]" onchange="actualAmountCalculation('${insurerCount}', 'bp_per')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 30: // Actual TP %
case 31: // Actual TP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-select right-align-input" id="actual_tp_per_${insurerCount}" name="actual_tp_per[]" onchange="actualAmountCalculation('${insurerCount}', 'tp_per')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 31: // Actual TEP %
case 32: // Actual TEP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-select right-align-input" id="actual_tep_per_${insurerCount}" name="actual_tep_per[]" onchange="actualAmountCalculation('${insurerCount}', 'tep_per')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 32: // Actual BP Brokerage Amount
case 33: // Actual BP Brokerage Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="actual_bp_brokerage_amt_${insurerCount}" name="actual_bp_brokerage_amt[]" onchange="actualAmountCalculation('${insurerCount}', 'bp_broker_amt')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 33: // Actual TP Brokerage Amount
case 34: // Actual TP Brokerage Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="actual_tp_brokerage_amt_${insurerCount}" name="actual_tp_brokerage_amt[]" onchange="actualAmountCalculation('${insurerCount}', 'tp_broker_amt' )" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 34: // Actual TEP Brokerage Amount
case 35: // Actual TEP Brokerage Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="actual_tep_brokerage_amt_${insurerCount}" name="actual_tep_brokerage_amt[]" onchange="actualAmountCalculation('${insurerCount}', 'tep_broker_amt')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 35: // Expected Amount
case 36: // Expected Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="exp_amt_${insurerCount}" name="exp_amt[]" onchange="actualAmountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
// case 30: // Variance
@ -2222,7 +2267,7 @@
// case 31: // Reward
// newCell = `<td><input type="text" class="right-align-input" id="reward_${insurerCount}" name="reward[]" onkeypress="return onlyNumbers(event)"></td>`;
// break;
case 36: // ID For Update
case 37: // ID For Update
newCell = `<td><input type="hidden" name="co_share_id[]" id="co_share_id[]" onkeypress="return onlyNumbers(event)"></td>`;
break;
}
@ -2254,69 +2299,72 @@
case 4: // follower policy no
newCell = `<td class=""><input type="text" class="readonly-color" id="follower_policy_no_${insurerCount}" name="follower_policy_no[]" readonly></td>`;
break;
case 5: // Co-Share %
case 5: // calc_policy_issue_date
newCell = `<td class=""><input type="text" class="" id="calc_policy_issue_date_${insurerCount}" name="calc_policy_issue_date[]"></td>`;
break;
case 6: // Co-Share %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" name="co_share_per[]" oninput="validateRange(this)" onchange="co_share_percentage_calculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 6: // Non commissionable Premium amount %
case 7: // Non commissionable Premium amount %
newCell = `<td><input type="text" class="right-align-input" id="non_comm_per_amt_${insurerCount}" name="non_comm_per_amt[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 7: // Base Premium
case 8: // Base Premium
newCell = `<td><input type="text" class="right-align-input" id="base_premium_${insurerCount}" name="base_premium[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 8: // TP Premium
case 9: // TP Premium
newCell = `<td><input type="text" class="right-align-input" id="tp_premium_${insurerCount}" name="tp_premium[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 9: // Ter Premium
case 10: // Ter Premium
newCell = `<td><input type="text" class="right-align-input" id="ter_premium_${insurerCount}" name="ter_premium[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 10: // co Premium
case 11: // co Premium
newCell = `<td><input type="text" class="right-align-input" id="co_premium_${insurerCount}" name="co_premium[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 11: // Co TP Premium
case 12: // Co TP Premium
newCell = `<td><input type="text" class="right-align-input" id="co_tp_premium_${insurerCount}" name="co_tp_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 12: // Co Ter Premium
case 13: // Co Ter Premium
newCell = `<td><input type="text" class="right-align-input" id="co_ter_premium_${insurerCount}" name="co_ter_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 13: // CGST
case 14: // CGST
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="cgst_${insurerCount}" name="cgst[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 14: // SGST
case 15: // SGST
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="sgst_${insurerCount}" name="sgst[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 15: // IGST
case 16: // IGST
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="igst_${insurerCount}" name="igst[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 16: // GST Amount
case 17: // GST Amount
newCell = `<td><input type="text" class="readonly-color right-align-input" id="gst_amount_${insurerCount}" name="gst_amount[]" oninput="amountCalculation('${insurerCount}')" readonly onkeypress="return onlyNumbers(event)"></td>`;
break;
case 17: // Stamp Duty
case 18: // Stamp Duty
newCell = `<td><input type="text" class="right-align-input" id="stamp_duty_${insurerCount}" name="stamp_duty[]" oninput="amountCalculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 18: // Total
case 19: // Total
newCell = `<td><input type="text" class="readonly-color right-align-input" id="total_amt_${insurerCount}" name="total[]" readonly onkeypress="return onlyNumbers(event)"></td>`;
break;
case 19: // Agreed BP %
case 20: // Agreed BP %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="agreed_bp_${insurerCount}" name="agreed_bp[]" oninput="amountCalculation('${insurerCount}'); validateRange(this)" onkeypress="return onlyNumbers(event)" ></td>`;
break;
case 20: // Agreed TP %
case 21: // Agreed TP %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="agreed_tp_${insurerCount}" name="agreed_tp[]" oninput="amountCalculation('${insurerCount}'); validateRange(this)" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 21: // Agreed Ter %
case 22: // Agreed Ter %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="agreed_tep_${insurerCount}" name="agreed_ter[]" oninput="amountCalculation('${insurerCount}'); validateRange(this)" onkeypress="return onlyNumbers(event)" ></td>`;
break;
case 22: // Standard BP %
case 23: // Standard BP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-color right-align-input" id="standard_bp_${insurerCount}" name="standard_bp[]" onkeypress="return onlyNumbers(event)" readonly></td>`;
break;
case 23: // Standard TP %
case 24: // Standard TP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-color right-align-input" name="standard_tp[]" onkeypress="return onlyNumbers(event)" readonly ></td>`;
break;
case 24: // Standard Ter %
case 25: // Standard Ter %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-color right-align-input" name="standard_ter[]" onkeypress="return onlyNumbers(event)" readonly></td>`;
break;
case 25: // ID For Update
case 26: // ID For Update
newCell = `<td><input type="hidden" name="co_share_id[]" id="co_share_id[]" onkeypress="return onlyNumbers(event)"></td>`;
break;
}
@ -2404,10 +2452,12 @@
if(is_co_pay_yes == 1){
$('.hidecotp').show();
$('#table_tr_7').show();
$('#table_tr_35').show();
$('#table_tr_3').show();
}else{
$('.hidecotp').hide();
$('#table_tr_7').hide();
$('#table_tr_35').hide();
$('#table_tr_3').hide();
}
@ -2452,6 +2502,11 @@
$('.follow_insurer').prop('required', false);
}
var calc_policy_issue_date = flatpickr("#calc_policy_issue_date_" + insurerCount, {
dateFormat: "d/m/Y",
allowInput: false
});
});
// Add click event for delete button
@ -2547,97 +2602,100 @@
case 4: // follower_policy_no
cell.find('input').val(data.follower_policy_no);
break;
case 5: // Co-Share %
case 5: // follower_policy_no
cell.find('input').val(data.pt_policy_issue_date);
break;
case 6: // Co-Share %
cell.find('input').val(data.co_share_per).toggleClass('readonly-select', !!disable_td);
break;
case 6: // non_comm_per_amt
case 7: // non_comm_per_amt
cell.find('input').val(data.non_comm_per_amt);
break;
case 7: // Base Premium
case 8: // Base Premium
cell.find('input').val(status ? data.bp_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 8: // TP Premium
case 9: // TP Premium
cell.find('input').val(status ? data.tp_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 9: // Ter Premium
case 10: // Ter Premium
cell.find('input').val(status ? data.tep_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 10: // Co Premium
case 11: // Co Premium
cell.find('input').val(status ? data.cop_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 11: // Co TP Premium
case 12: // Co TP Premium
cell.find('input').val(status ? data.cotp_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 12: // Co Ter Premium
case 13: // Co Ter Premium
cell.find('input').val(status ? data.cotep_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 13: // CGST
case 14: // CGST
cell.find('input').val(data.bp_cgst).toggleClass('readonly-select', !!disable_td);
break;
case 14: // SGST
case 15: // SGST
cell.find('input').val(data.bp_sgst).toggleClass('readonly-select', !!disable_td);
break;
case 15: // IGST
case 16: // IGST
cell.find('input').val(data.bp_igst).toggleClass('readonly-select', !!disable_td);
break;
case 16: // GST Amount
case 17: // GST Amount
cell.find('input').val(status ? data.bp_gst_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 17: // Stamp Duty
case 18: // Stamp Duty
cell.find('input').val(status ? data.stamp_duty : '').toggleClass('readonly-select', !!disable_td);
break;
case 18: // Total
case 19: // Total
cell.find('input').val(status ? data.amount : '');
break;
case 19: // Agreed BP %
case 20: // Agreed BP %
cell.find('input').val(data.agreed_bp_per).toggleClass('readonly-select', !!disable_td);
break;
case 20: // Agreed TP %
case 21: // Agreed TP %
cell.find('input').val(data.agreed_tp_per).toggleClass('readonly-select', !!disable_td);
break;
case 21: // Agreed Ter %
case 22: // Agreed Ter %
cell.find('input').val(data.agreed_tep_per).toggleClass('readonly-select', !!disable_td);
break;
case 22: // Agreed Amount
case 23: // Agreed Amount
cell.find('input').val(data.agreed_amt).toggleClass('readonly-select', !!disable_td);
break;
case 23: // Standard BP %
case 24: // Standard BP %
cell.find('input').val(data.standerd_bp_per);
break;
case 24: // Standard TP %
case 25: // Standard TP %
cell.find('input').val(data.standerd_tp_per);
break;
case 25: // Standard Ter %
case 26: // Standard Ter %
cell.find('input').val(data.standerd_tep_per);
break;
case 26: // Actual BP Amount
case 27: // Actual BP Amount
cell.find('input').val(status ? data.actual_bp_amt : '');
break;
case 27: // Actual TP Amount
case 28: // Actual TP Amount
cell.find('input').val(status ? data.actual_tp_amt : '');
break;
case 28: // Actual Ter Amount
case 29: // Actual Ter Amount
cell.find('input').val(status ? data.actual_tep_amt : '');
break;
case 29: // Actual BP %
case 30: // Actual BP %
cell.find('input').val(status ? data.actual_bp_per : '');
break;
case 30: // Actual TP %
case 31: // Actual TP %
cell.find('input').val(status ? data.actual_tp_per : '');
break;
case 31: // Actual Ter %
case 32: // Actual Ter %
cell.find('input').val(status ? data.actual_tep_per : '');
break;
case 32: // Actual BP Brokerage Amount
case 33: // Actual BP Brokerage Amount
cell.find('input').val(status ? data.actual_bp_brokerage_amt : '');
break;
case 33: // Actual TP Brokerage Amount
case 34: // Actual TP Brokerage Amount
cell.find('input').val(status ? data.actual_tp_brokerage_amt : '');
break;
case 34: // Actual Ter Brokerage Amount
case 35: // Actual Ter Brokerage Amount
cell.find('input').val(status ? data.actual_tep_brokerage_amt : '');
break;
case 35: // Expected Amount
case 36: // Expected Amount
cell.find('input').val(status ? data.exp_amt : '');
break;
// case 30: // Variance
@ -2646,7 +2704,7 @@
// case 31: // Reward
// cell.find('input').val(status ? data.reward : '');
// break;
case 36: // Co-share ID (hidden field)
case 37: // Co-share ID (hidden field)
cell.find('input[type="hidden"]').val(status ? data.id : '');
break;
}
@ -2668,67 +2726,70 @@
case 4: // follower_policy_no
cell.find('input').val(data.follower_policy_no);
break;
case 5: // Co-Share %
case 5: // follower_policy_no
cell.find('input').val(data.pt_policy_issue_date);
break;
case 6: // Co-Share %
cell.find('input').val(data.co_share_per).toggleClass('readonly-select', !!disable_td);
break;
case 6: // non_comm_per_amt
case 7: // non_comm_per_amt
cell.find('input').val(data.non_comm_per_amt);
break;
case 7: // Base Premium
case 8: // Base Premium
cell.find('input').val(status ? data.bp_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 8: // TP Premium
case 9: // TP Premium
cell.find('input').val(status ? data.tp_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 9: // Ter Premium
case 10: // Ter Premium
cell.find('input').val(status ? data.tep_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 10: // Co Premium
case 11: // Co Premium
cell.find('input').val(status ? data.cop_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 11: // Co TP Premium
case 12: // Co TP Premium
cell.find('input').val(status ? data.cotp_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 12: // Co Ter Premium
case 13: // Co Ter Premium
cell.find('input').val(status ? data.cotep_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 13: // CGST
case 14: // CGST
cell.find('input').val(data.bp_cgst).toggleClass('readonly-select', !!disable_td);
break;
case 14: // SGST
case 15: // SGST
cell.find('input').val(data.bp_sgst).toggleClass('readonly-select', !!disable_td);
break;
case 15: // IGST
case 16: // IGST
cell.find('input').val(data.bp_igst).toggleClass('readonly-select', !!disable_td);
break;
case 16: // GST Amount
case 17: // GST Amount
cell.find('input').val(status ? data.bp_gst_amt : '').toggleClass('readonly-select', !!disable_td);
break;
case 17: // Stamp Duty
case 18: // Stamp Duty
cell.find('input').val(status ? data.stamp_duty : '').toggleClass('readonly-select', !!disable_td);
break;
case 18: // Total
case 19: // Total
cell.find('input').val(status ? data.amount : '');
break;
case 19: // Agreed BP %
case 20: // Agreed BP %
cell.find('input').val(data.agreed_bp_per).toggleClass('readonly-select', !!disable_td);
break;
case 20: // Agreed TP %
case 21: // Agreed TP %
cell.find('input').val(data.agreed_tp_per).toggleClass('readonly-select', !!disable_td);
break;
case 21: // Agreed Ter %
case 22: // Agreed Ter %
cell.find('input').val(data.agreed_tep_per).toggleClass('readonly-select', !!disable_td);
break;
case 22: // Standard BP %
case 23: // Standard BP %
cell.find('input').val(data.standerd_bp_per);
break;
case 23: // Standard TP %
case 24: // Standard TP %
cell.find('input').val(data.standerd_tp_per);
break;
case 24: // Standard Ter %
case 25: // Standard Ter %
cell.find('input').val(data.standerd_tep_per);
break;
case 25: // Co-share ID (hidden field)
case 26: // Co-share ID (hidden field)
cell.find('input[type="hidden"]').val(status ? data.id : '');
break;
}
@ -2884,6 +2945,25 @@
})
$('#policy_issue_date').on('change', function(){
let date = $(this).val();
let date_set = false
$('[name="co_share_type[]"]').each(function () {
console.log('co_share_type[] value', $(this).val());
if($(this).val() == 1){
let uniqueid = $(this).data('id');
$('#calc_policy_issue_date_' + uniqueid).val(date).addClass('readonly-select');
date_set = true;
}
});
if(!date_set){
$('#calc_policy_issue_date_1').val(date).addClass('readonly-select');
}
});
//-----------------------------------------------------------------------------------------------------------
$(document).on('change', '#insurerTable input, #insurerTable select, #insurerTable textarea', function() {

View File

@ -164,6 +164,7 @@ table.dataTable thead th {
.slider.round:before {
border-radius: 50%;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="container-fluid-min">
@ -489,9 +490,14 @@ table.dataTable thead th {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
dom: "<'row'<'col-sm-1'f><'col-sm-11 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// dom: "<'row'<'col-sm-1'f><'col-sm-11 text-right'B>>" + // Filter left, buttons right
// dom: "<'row'<'col-12 d-flex justify-content-between'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-12 d-flex justify-content-between'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: '<i class="mdi mdi-plus" ></i><span class=" btn-custom"> Add </span>',

View File

@ -32,11 +32,13 @@
box-shadow: none;
outline: none;
width: 100%;
padding: 5px 30px !important;
}
#insurerTable th,
#insurerTable td {
padding: 5px;
height: 30px;
padding: 2px 4px !important;
/* height: 30px; */
vertical-align: middle;
}
@ -50,6 +52,7 @@
height: 20px;
width: 20px;
}
#insurerTable th,
#insurerTable th {
min-width: 230px;
@ -96,11 +99,11 @@
.input-with-percentage::after {
content: '%';
position: absolute;
right: 5px;
right: 10px;
top: 50%;
transform: translateY(-50%);
font-weight: bold;
color: #000;
color: #495057;
}
/* .select2-container .select2-selection__rendered {
@ -142,21 +145,55 @@
}
/** newly implemented */
#insurerTable thead th:first-child {
border-top: 0px solid #fff !important;
border-bottom: 0px solid #fff !important;
background-color: transparent !important;
}
#insurerTable tbody td {
border-top: 0px solid #fff !important;
border-bottom: 0px solid #fff !important;
background-color: transparent !important;
}
#insurerTable th{
color: black !important;
background-color: transparent !important;
}
#insurerTable input[type="text"],
#insurerTable select {
width: 100%;
font-size: 14px;
line-height: 1.5;
color: #000;
background-color: #fff;
background-clip: padding-box;
border: 1px solid #ced4da;
border-radius: 4px;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
box-sizing: border-box;
}
/* Focus effect like form-control */
#insurerTable input[type="text"]:focus,
#insurerTable select:focus {
border-color: #80bdff;
outline: 0;
box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}
/* Disabled & readonly styling */
#insurerTable input[readonly],
#insurerTable input:disabled,
#insurerTable select:disabled {
background-color: #e0e0e0; /* Darker background */
color: #666; /* Darker text color */
cursor: not-allowed;
}
</style>
<style>
@ -825,14 +862,17 @@
<tr id="table_tr_37">
<td>CD Amount</td>
</tr>
<tr id="table_tr_35">
<tr id="table_tr_35" style="display: none;">
<td>Follower Policy No</td>
</tr>
<tr id="table_tr_40">
<td>Policy Issue Date</td>
</tr>
<tr id="table_tr_3" style="display: none;">
<td>Co-Share %</td>
</tr>
<tr id="table_tr_36">
<td>Non Commitional <br> Premium Amount</td>
<td>Non Commissional <br> Premium Amount</td>
</tr>
<tr id="table_tr_4">
<td>Base Premium</td>
@ -1691,7 +1731,7 @@
var bap = selectedOption.data('bap');
var allocg = selectedOption.data('allocg');
console.log('allocg:', allocg);
// console.log('allocg:', allocg);
// console.log('EBP:', ebp);
// console.log('ETP:', etp);
@ -1870,10 +1910,8 @@
if (isAnyChecked) {
toastr.warning('Only one leader can be selected.', 'WARNING!');
$(this).prop('checked', false);
return;
}
});
$(document).on('click', '[name="co_share_type[]"]', function() {
let val = $(this).val();
let uniqueid = $(this).data('id');
@ -1889,10 +1927,24 @@
if(insurer == ""){
toastr.warning('Please select the insurer.', 'WARNING!');
$(this).prop('checked', false);
return;
}else{
$('#insurer_id').val(insurer)
}
$('[name="calc_policy_issue_date[]"]').each(function () {
$(this).val('').removeClass('readonly-select');
});
let policy_issue_date = $('#policy_issue_date').val();
if ($('#cop_yes').is(':checked') && $(this).is(':checked')) {
$('#follower_policy_no_' + uniqueid).prop('readonly', true);
$('#calc_policy_issue_date_' + uniqueid).val(policy_issue_date).addClass('readonly-select');;
} else {
$('#follower_policy_no_' + uniqueid).prop('readonly', false);
$('#calc_policy_issue_date_1').val(policy_issue_date).addClass('readonly-select');
}
});
$(document).on('change', 'select[name="relationship[]"]', function() {
@ -2417,7 +2469,7 @@
let selectedOption = $('#policy_type_id').find('option:selected');
let bap = selectedOption.data('bap');
let allocg = selectedOption.data('allocg');
console.log('allocg:', allocg);
// console.log('allocg:', allocg);
const event = window.event;
console.log("Event id:", event.target.id);
@ -3675,11 +3727,10 @@
let co_share_type = []; // Initialize an object to mimic the array structure
$('[name="cd_ac_no_for_child[]"]').each(function(index) {
let value = $(this).val();
$('[name="co_share_type[]"]').each(function(index) {
let value = $(this).is(':checked');
if(value){
co_share_type.push(1); // Assign value with index as key
}else{
co_share_type.push(2); // Assign value with index as key
}
@ -3967,7 +4018,7 @@
var selectedOption = $('#policy_type_id').find('option:selected');
var bap = selectedOption.data('bap');
var allocg = selectedOption.data('allocg');
console.log('allocg:', allocg);
// console.log('allocg:', allocg);
// do not remove this commented items
@ -4405,6 +4456,23 @@
$('#CDMasterForm')[0].reset();
});
$('#policy_issue_date').on('change', function(){
let date = $(this).val();
let date_set = false
$('[name="co_share_type[]"]').each(function () {
if($(this).is(':checked')){
let uniqueid = $(this).data('id');
$('#calc_policy_issue_date_' + uniqueid).val(date).addClass('readonly-select');
date_set = true;
}
});
if(!date_set){
$('#calc_policy_issue_date_1').val(date).addClass('readonly-select');
}
});
//------------------------------------------------------------------------------------------------------------
var insurerCount = 0;
@ -4469,108 +4537,111 @@
case 3: // CD Amount
newCell = `<td class=""><input type="text" class="right-align-input" id="cd_current_balance_${insurerCount}" readonly></td>`;
break;
case 4: // follower policy no %
case 4: // follower policy no
newCell = `<td class=""><input type="text" class="" id="follower_policy_no_${insurerCount}" name="follower_policy_no[]" onchange="validateInput(this, 'client_policy', 'policy_no')"></td>`;
break;
case 5: // policy issue date
newCell = `<td class=""><input type="text" class="" id="calc_policy_issue_date_${insurerCount}" name="calc_policy_issue_date[]"></td>`;
break;
case 5: // Co-Share %
case 6: // Co-Share %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="co_share_per_${insurerCount}" name="co_share_per[]" oninput="validateRange(this); " onchange="co_share_percentage_calculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 6: // Non commissionable Premium amount %
case 7: // Non commissionable Premium amount %
newCell = `<td><input type="text" class="right-align-input" id="non_comm_per_amt_${insurerCount}" name="non_comm_per_amt[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 7: // Base Premium
case 8: // Base Premium
newCell = `<td><input type="text" class="right-align-input" id="base_premium_${insurerCount}" name="base_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 8: // TP Premium
case 9: // TP Premium
newCell = `<td><input type="text" class="right-align-input" id="tp_premium_${insurerCount}" name="tp_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 9: // Ter Premium
case 10: // Ter Premium
newCell = `<td><input type="text" class="right-align-input" id="ter_premium_${insurerCount}" name="ter_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 10: // co Premium
case 11: // co Premium
newCell = `<td><input type="text" class="right-align-input" id="co_premium_${insurerCount}" name="co_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 11: // Co TP Premium
case 12: // Co TP Premium
newCell = `<td><input type="text" class="right-align-input" id="co_tp_premium_${insurerCount}" name="co_tp_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 12: // Co Ter Premium
case 13: // Co Ter Premium
newCell = `<td><input type="text" class="right-align-input" id="co_ter_premium_${insurerCount}" name="co_ter_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 13: // CGST
case 14: // CGST
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="cgst_${insurerCount}" name="cgst[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 14: // SGST
case 15: // SGST
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="sgst_${insurerCount}" name="sgst[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 15: // IGST
case 16: // IGST
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="igst_${insurerCount}" name="igst[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 16: // GST Amount
case 17: // GST Amount
newCell = `<td><input type="text" class="right-align-input" id="gst_amount_${insurerCount}" name="gst_amount[]" onchange="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 17: // Stamp Duty
case 18: // Stamp Duty
newCell = `<td><input type="text" class="right-align-input" id="stamp_duty_${insurerCount}" name="stamp_duty[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 18: // Total
case 19: // Total
newCell = `<td><input type="text" class="readonly-color right-align-input" id="total_amt_${insurerCount}" name="total[]" readonly onkeypress="return onlyNumbers(event)"></td>`;
break;
case 19: // Agreed BP %
case 20: // Agreed BP %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="agreed_bp_${insurerCount}" name="agreed_bp[]" oninput="validateRange(this); " onkeypress="return onlyNumbers(event)" ></td>`;
break;
case 20: // Agreed TP %
case 21: // Agreed TP %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="agreed_tp_${insurerCount}" name="agreed_tp[]" oninput="validateRange(this); " onkeypress="return onlyNumbers(event)"></td>`;
break;
case 21: // Agreed Ter %
case 22: // Agreed Ter %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="agreed_ter_${insurerCount}" name="agreed_ter[]" oninput="validateRange(this); " onkeypress="return onlyNumbers(event)" ></td>`;
break;
case 22: // Agreed Amount
case 23: // Agreed Amount
newCell = `<td><input type="text" class="right-align-input" id="agreed_amount_${insurerCount}" name="agreed_amount[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 23: // Standard BP %
case 24: // Standard BP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-color right-align-input" id="standard_bp_${insurerCount}" name="standard_bp[]" onkeypress="return onlyNumbers(event)" readonly></td>`;
break;
case 24: // Standard TP %
case 25: // Standard TP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-color right-align-input" id="standard_tp_${insurerCount}" name="standard_tp[]" onkeypress="return onlyNumbers(event)" readonly ></td>`;
break;
case 25: // Standard Ter %
case 26: // Standard Ter %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-color right-align-input" id="standard_tep_${insurerCount}" name="standard_ter[]" onkeypress="return onlyNumbers(event)" readonly></td>`;
break;
case 26: // Actual BP Amount
case 27: // Actual BP Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="actual_bp_amt_${insurerCount}" name="actual_bp_amt[]" onchange="actualAmountCalculation('${insurerCount}', 'bp_amt_for_calc')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 27: // Actual TP Amount
case 28: // Actual TP Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="actual_tp_amt_${insurerCount}" name="actual_tp_amt[]" onchange="actualAmountCalculation('${insurerCount}', 'tp_amt_for_calc')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 28: // Actual TEP Amount
case 29: // Actual TEP Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="actual_tep_amt_${insurerCount}" name="actual_tep_amt[]" onchange="actualAmountCalculation('${insurerCount}', 'tep_amt_for_calc')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 29: // Actual BP %
case 30: // Actual BP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-select right-align-input" id="actual_bp_per_${insurerCount}" name="actual_bp_per[]" onchange="actualAmountCalculation('${insurerCount}', 'bp_per')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 30: // Actual TP %
case 31: // Actual TP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-select right-align-input" id="actual_tp_per_${insurerCount}" name="actual_tp_per[]" onchange="actualAmountCalculation('${insurerCount}', 'tp_per')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 31: // Actual TEP %
case 32: // Actual TEP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-select right-align-input" id="actual_tep_per_${insurerCount}" name="actual_tp_per[]" onchange="actualAmountCalculation('${insurerCount}', 'tep_per')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 32: // Actual BP Brokerage Amount
case 33: // Actual BP Brokerage Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="actual_bp_brokerage_amt_${insurerCount}" name="actual_bp_brokerage_amt[]" onchange="actualAmountCalculation('${insurerCount}', 'bp_broker_amt')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 33: // Actual TP Brokerage Amount
case 34: // Actual TP Brokerage Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="actual_tp_brokerage_amt_${insurerCount}" name="actual_tp_brokerage_amt[]" onchange="actualAmountCalculation('${insurerCount}', 'tp_broker_amt')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 34: // Actual TEP Brokerage Amount
case 35: // Actual TEP Brokerage Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="actual_tep_brokerage_amt_${insurerCount}" name="actual_tep_brokerage_amt[]" onchange="actualAmountCalculation('${insurerCount}', 'tep_broker_amt')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 35: // Expected Amount
case 36: // Expected Amount
newCell = `<td><input type="text" class="readonly-select right-align-input" id="exp_amt_${insurerCount}" name="exp_amt[]" onchange="actual" onkeypress="return onlyNumbers(event)"></td>`;
break;
// case 34: // Variance
// newCell = `<td><input type="text" class="readonly-select right-align-input" id="variance_${insurerCount}" name="variance[]" onchange="actual" onkeypress="return onlyNumbers(event)"></td>`;
// break;
case 36: // ID For Update
case 37: // ID For Update
newCell = `<td><input type="hidden" name="co_share_id[]" id="co_share_id[]" onkeypress="return onlyNumbers(event)"></td>`;
break;
@ -4614,68 +4685,70 @@
case 4: // follower policy no %
newCell = `<td class=""><input type="text" class="" id="follower_policy_no_${insurerCount}" name="follower_policy_no[]" oninput="" onchange=""></td>`;
break;
case 5: // Co-Share %
case 5: // calc_policy_issue_date %
newCell = `<td class=""><input type="text" class="" id="calc_policy_issue_date_${insurerCount}" name="calc_policy_issue_date[]" oninput="" onchange=""></td>`;
break;
case 6: // Co-Share %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="co_share_per_${insurerCount}" name="co_share_per[]" oninput="validateRange(this); " onchange="co_share_percentage_calculation('${insurerCount}')" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 6: // Non commissionable Premium amount %
case 7: // Non commissionable Premium amount %
newCell = `<td><input type="text" class="right-align-input" id="non_comm_per_amt_${insurerCount}" name="non_comm_per_amt[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 7: // Base Premium
case 8: // Base Premium
newCell = `<td><input type="text" class="right-align-input" id="base_premium_${insurerCount}" name="base_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 8: // TP Premium
case 9: // TP Premium
newCell = `<td><input type="text" class="right-align-input" id="tp_premium_${insurerCount}" name="tp_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 9: // Ter Premium
case 10: // Ter Premium
newCell = `<td><input type="text" class="right-align-input" id="ter_premium_${insurerCount}" name="ter_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 10: // co Premium
case 11: // co Premium
newCell = `<td><input type="text" class="right-align-input" id="co_premium_${insurerCount}" name="co_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 11: // Co TP Premium
case 12: // Co TP Premium
newCell = `<td><input type="text" class="right-align-input" id="co_tp_premium_${insurerCount}" name="co_tp_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 12: // Co Ter Premium
case 13: // Co Ter Premium
newCell = `<td><input type="text" class="right-align-input" id="co_ter_premium_${insurerCount}" name="co_ter_premium[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 13: // CGST
case 14: // CGST
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="cgst_${insurerCount}" name="cgst[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 14: // SGST
case 15: // SGST
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="sgst_${insurerCount}" name="sgst[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 15: // IGST
case 16: // IGST
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="igst_${insurerCount}" name="igst[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 16: // GST Amount
case 17: // GST Amount
newCell = `<td><input type="text" class="right-align-input" id="gst_amount_${insurerCount}" name="gst_amount[]" onchange="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 17: // Stamp Duty
case 18: // Stamp Duty
newCell = `<td><input type="text" class="right-align-input" id="stamp_duty_${insurerCount}" name="stamp_duty[]" oninput="" onkeypress="return onlyNumbers(event)"></td>`;
break;
case 18: // Total
case 19: // Total
newCell = `<td><input type="text" class="readonly-color right-align-input" id="total_amt_${insurerCount}" name="total[]" readonly onkeypress="return onlyNumbers(event)"></td>`;
break;
case 19: // Agreed BP %
case 20: // Agreed BP %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="agreed_bp_${insurerCount}" name="agreed_bp[]" oninput="validateRange(this); " onkeypress="return onlyNumbers(event)" ></td>`;
break;
case 20: // Agreed TP %
case 21: // Agreed TP %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="agreed_tp_${insurerCount}" name="agreed_tp[]" oninput="validateRange(this); " onkeypress="return onlyNumbers(event)"></td>`;
break;
case 21: // Agreed Ter %
case 22: // Agreed Ter %
newCell = `<td class="input-with-percentage"><input type="text" class="right-align-input" id="agreed_ter_${insurerCount}" name="agreed_ter[]" oninput="validateRange(this); " onkeypress="return onlyNumbers(event)" ></td>`;
break;
case 22: // Standard BP %
case 23: // Standard BP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-color right-align-input" id="standard_bp_${insurerCount}" name="standard_bp[]" onkeypress="return onlyNumbers(event)" readonly></td>`;
break;
case 23: // Standard TP %
case 24: // Standard TP %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-color right-align-input" id="standard_tp_${insurerCount}" name="standard_tp[]" onkeypress="return onlyNumbers(event)" readonly ></td>`;
break;
case 24: // Standard Ter %
case 25: // Standard Ter %
newCell = `<td class="input-with-percentage"><input type="text" class="readonly-color right-align-input" id="standard_tep_${insurerCount}" name="standard_ter[]" onkeypress="return onlyNumbers(event)" readonly></td>`;
break;
case 25: // ID For Update
case 26: // ID For Update
newCell = `<td><input type="hidden" name="co_share_id[]" id="co_share_id[]" onkeypress="return onlyNumbers(event)"></td>`;
break;
}
@ -4705,7 +4778,7 @@
var bap = selectedOption.data('bap');
var allocg = selectedOption.data('allocg');
console.log('allocg:', allocg);
// console.log('allocg:', allocg);
var client_type_id = $('#client_type').val() ?? 1;
@ -4784,11 +4857,6 @@
std_tp = itp;
std_tep = itep;
}
// console.log('client_type_id', client_type_id);
// console.log('std_bp', std_bp);
// console.log('std_tp', std_tp);
// console.log('std_tep', std_tep);
$('[name="standard_bp[]"]').val(std_bp);
$('[name="standard_tp[]"]').val(std_tp);
@ -4802,7 +4870,7 @@
});
insurer_count_array.push(insurerCount)
insurer_count_array.push(insurerCount);
// Add click event for delete button
// $('.delete-insurer').off('click').on('click', function() {
@ -4821,6 +4889,11 @@
} else {
$('.follow_insurer').prop('required', true);
}
var calc_policy_issue_date = flatpickr("#calc_policy_issue_date_" + insurerCount, {
dateFormat: "d/m/Y",
allowInput: false
});
}
function removeInsurerColumn(index, count_index) {
@ -4920,103 +4993,106 @@
case 4: // follower_policy_no
cell.find('input').val(data.follower_policy_no).toggleClass('readonly-select', !!disable_td);
break;
case 5: // Co-Share %
case 5: // pt_policy_issue_date
cell.find('input').val(data.pt_policy_issue_date).toggleClass('readonly-select', !!disable_td);
break;
case 6: // Co-Share %
cell.find('input').val(data.co_share_per).toggleClass('readonly-select', !!disable_td);
break;
case 6: // non_comm_per_amt
case 7: // non_comm_per_amt
cell.find('input').val(data.non_comm_per_amt);
break;
case 7: // Base Premium
case 8: // Base Premium
cell.find('input').val(data.bp_amt).toggleClass('readonly-select', !!disable_td);
break;
case 8: // TP Premium
case 9: // TP Premium
cell.find('input').val(data.tp_amt).toggleClass('readonly-select', !!disable_td);
break;
case 9: // Ter Premium
case 10: // Ter Premium
cell.find('input').val(data.tep_amt).toggleClass('readonly-select', !!disable_td);
break;
case 10: // Co Premium
case 11: // Co Premium
cell.find('input').val(data.cop_amt).toggleClass('readonly-select', !!disable_td);
break;
case 11: // Co TP Premium
case 12: // Co TP Premium
cell.find('input').val(data.cotp_amt).toggleClass('readonly-select', !!disable_td);
break;
case 12: // Co Ter Premium
case 13: // Co Ter Premium
cell.find('input').val(data.cotep_amt).toggleClass('readonly-select', !!disable_td);
break;
case 13: // CGST
case 14: // CGST
cell.find('input').val(data.bp_cgst).toggleClass('readonly-select', !!disable_td);
break;
case 14: // SGST
case 15: // SGST
cell.find('input').val(data.bp_sgst).toggleClass('readonly-select', !!disable_td);
break;
case 15: // IGST
case 16: // IGST
cell.find('input').val(data.bp_igst).toggleClass('readonly-select', !!disable_td);
break;
case 16: // GST Amount
case 17: // GST Amount
cell.find('input').val(data.bp_gst_amt).toggleClass('readonly-select', !!disable_td);
break;
case 17: // Stamp Duty
case 18: // Stamp Duty
cell.find('input').val(data.stamp_duty).toggleClass('readonly-select', !!disable_td);
break;
case 18: // Total
case 19: // Total
cell.find('input').val(data.amount).toggleClass('readonly-select', !!disable_td);
break;
case 19: // Agreed BP %
case 20: // Agreed BP %
cell.find('input').val(data.agreed_bp_per).toggleClass('readonly-select', !!disable_td);
break;
case 20: // Agreed TP %
case 21: // Agreed TP %
cell.find('input').val(data.agreed_tp_per).toggleClass('readonly-select', !!disable_td);
break;
case 21: // Agreed Ter %
case 22: // Agreed Ter %
cell.find('input').val(data.agreed_tep_per).toggleClass('readonly-select', !!disable_td);
break;
case 22: // Agreed Amount
case 23: // Agreed Amount
cell.find('input').val(data.agreed_amt).toggleClass('readonly-select', !!disable_td);
break;
case 23: // Standard BP %
case 24: // Standard BP %
cell.find('input').val(data.standerd_bp_per).toggleClass('readonly-select', !!disable_td);
break;
case 24: // Standard TP %
case 25: // Standard TP %
cell.find('input').val(data.standerd_tp_per).toggleClass('readonly-select', !!disable_td);
break;
case 25: // Standard Ter %
case 26: // Standard Ter %
cell.find('input').val(data.standerd_tep_per).toggleClass('readonly-select', !!disable_td);
break;
case 26: // Actual BP Amount
case 27: // Actual BP Amount
cell.find('input').val(data.actual_bp_amount);
break;
case 27: // Actual TP Amount
case 28: // Actual TP Amount
cell.find('input').val(data.actual_tp_amount);
break;
case 28: // Actual Ter Amount
case 29: // Actual Ter Amount
cell.find('input').val(data.actual_tep_amount);
break;
case 29: // Actual BP %
case 30: // Actual BP %
cell.find('input').val(data.actual_bp_percentage);
break;
case 30: // Actual TP %
case 31: // Actual TP %
cell.find('input').val(data.actual_tp_percentage);
break;
case 31: // Actual Ter %
case 32: // Actual Ter %
cell.find('input').val(data.actual_tep_percentage);
break;
case 32: // Actual BP Brokerage Amount
case 33: // Actual BP Brokerage Amount
cell.find('input').val(data.actual_bp_brokerage_amount);
break;
case 33: // Actual TP Brokerage Amount
case 34: // Actual TP Brokerage Amount
cell.find('input').val(data.actual_tp_brokerage_amount);
break;
case 34: // Actual Ter Brokerage Amount
case 35: // Actual Ter Brokerage Amount
cell.find('input').val(data.actual_tep_brokerage_amount);
break;
case 35: // Expected Amount
case 36: // Expected Amount
cell.find('input').val(data.exp_amt);
break;
// case 34: // Variance
// cell.find('input').val(data.variance);
// break;
case 36: // Co-share ID (hidden field)
case 37: // Co-share ID (hidden field)
cell.find('input[type="hidden"]').val(data.id);
break;
}
@ -5047,67 +5123,70 @@
case 4: // follower_policy_no
cell.find('input').val(data.follower_policy_no).toggleClass('readonly-select', !!disable_td);
break;
case 5: // co_share_per
case 5: // pt_policy_issue_date
cell.find('input').val(data.pt_policy_issue_date).toggleClass('readonly-select', !!disable_td);
break;
case 6: // co_share_per
cell.find('input').val(data.co_share_per).toggleClass('readonly-select', !!disable_td);
break;
case 6: // non_comm_per_amt
case 7: // non_comm_per_amt
cell.find('input').val(data.non_comm_per_amt);
break;
case 7: // Base Premium
case 8: // Base Premium
cell.find('input').val(data.bp_amt).toggleClass('readonly-select', !!disable_td);
break;
case 8: // TP Premium
case 9: // TP Premium
cell.find('input').val(data.tp_amt).toggleClass('readonly-select', !!disable_td);
break;
case 9: // Ter Premium
case 10: // Ter Premium
cell.find('input').val(data.tep_amt).toggleClass('readonly-select', !!disable_td);
break;
case 10: // Co Premium
case 11: // Co Premium
cell.find('input').val(data.cop_amt).toggleClass('readonly-select', !!disable_td);
break;
case 11: // Co TP Premium
case 12: // Co TP Premium
cell.find('input').val(data.cotp_amt).toggleClass('readonly-select', !!disable_td);
break;
case 12: // Co Ter Premium
case 13: // Co Ter Premium
cell.find('input').val(data.cotep_amt).toggleClass('readonly-select', !!disable_td);
break;
case 13: // CGST
case 14: // CGST
cell.find('input').val(data.bp_cgst).toggleClass('readonly-select', !!disable_td);
break;
case 14: // SGST
case 15: // SGST
cell.find('input').val(data.bp_sgst).toggleClass('readonly-select', !!disable_td);
break;
case 15: // IGST
case 16: // IGST
cell.find('input').val(data.bp_igst).toggleClass('readonly-select', !!disable_td);
break;
case 16: // GST Amount
case 17: // GST Amount
cell.find('input').val(data.bp_gst_amt).toggleClass('readonly-select', !!disable_td);
break;
case 17: // Stamp Duty
case 18: // Stamp Duty
cell.find('input').val(data.stamp_duty).toggleClass('readonly-select', !!disable_td);
break;
case 18: // Total
case 19: // Total
cell.find('input').val(data.amount).toggleClass('readonly-select', !!disable_td);
break;
case 19: // Agreed BP %
case 20: // Agreed BP %
cell.find('input').val(data.agreed_bp_per).toggleClass('readonly-select', !!disable_td);
break;
case 20: // Agreed TP %
case 21: // Agreed TP %
cell.find('input').val(data.agreed_tp_per).toggleClass('readonly-select', !!disable_td);
break;
case 21: // Agreed Ter %
case 22: // Agreed Ter %
cell.find('input').val(data.agreed_tep_per).toggleClass('readonly-select', !!disable_td);
break;
case 22: // Standard BP %
case 23: // Standard BP %
cell.find('input').val(data.standerd_bp_per).toggleClass('readonly-select', !!disable_td);
break;
case 23: // Standard TP %
case 24: // Standard TP %
cell.find('input').val(data.standerd_tp_per).toggleClass('readonly-select', !!disable_td);
break;
case 24: // Standard Ter %
case 25: // Standard Ter %
cell.find('input').val(data.standerd_tep_per).toggleClass('readonly-select', !!disable_td);
break;
case 25: // Co-share ID (hidden field)
case 26: // Co-share ID (hidden field)
cell.find('input[type="hidden"]').val(data.id);
break;
}
@ -6353,7 +6432,6 @@
}
}
function makeUniqueShortName(baseName) {
let input = $("#short_name")[0]; // input element
checkDuplicateTableFieldValue("clients", "short_name", baseName, function(isDuplicate) {

View File

@ -142,6 +142,7 @@ table.dataTable tbody td {
#inception_list{
margin-left:20px !important;
}
.dataTables_length label {height: 21px !important;}
</style>
@ -316,7 +317,7 @@ table.dataTable tbody td {
<tr>
<td class="text-center"><?php echo $index+1; ?></td>
<td><?php echo $issuer[$row['issuer']]; ?></td>
<td><?php echo $issuing_type[$row['issue_type']] ?: 'N/A'; ?></td>
<td><?php echo $issuing_type[$row['issue_type']] ?? 'N/A'; ?></td>
<td><?php echo $client_type[$row['client_type']] ?? 'N/A'; ?></td>
<td><?php echo $row['client_type'] == 2 ? $row['client_name'] . " - " . (!empty($row['pan']) ? $row['pan'] : 'N/A') : $row['client_short_name'] . ' - ' . $row['client_branch_name']; ?></td>
<td><?php echo $row['insurer_short_name'] ?: 'N/A'; ?></td>
@ -327,7 +328,7 @@ table.dataTable tbody td {
<td><?php echo empty($row['policy_issue_date']) ? 'N/A' : date('d/m/Y', strtotime($row['policy_end_date'])); ?></td>
<td class="right-align-input"><?php echo $row['emp_count'] ?: '0'; ?></td>
<td class="right-align-input"><?php echo $row['dependent_count'] ?: '0'; ?></td>
<td><?php echo $policy_status[$row['status']] ?: 'N/A'; ?></td>
<td><?php echo $policy_status[$row['status']] ?? 'N/A'; ?></td>
<td><?php echo $row['user_name'] ?: 'N/A'; ?></td>
<td>
<div class="btn-group dropdown">
@ -561,9 +562,14 @@ $(document).ready(function() {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
dom: "<'row'<'col-sm-1'f><'col-sm-11 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// dom: "<'row'<'col-12'f><'col-sm-11 text-right'B>>" + // Filter left, buttons right
// dom: "<'row'<'col-12 d-flex justify-content-between'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-12 d-flex justify-content-between'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: '<i class="mdi mdi-plus" ></i><span class=" btn-custom"> Add </span>',

View File

@ -65,6 +65,7 @@
z-index: -2;
pointer-events: none;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="container-fluid-min">
@ -217,9 +218,9 @@
$(document).ready(function(){
$('#tickets-table').DataTable({
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
// dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
// buttons: [
// {
// extend: 'csv',
@ -230,6 +231,10 @@
// }
// }
// ],
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -33,7 +33,7 @@ table.dataTable tbody td {
flex-wrap: wrap;
gap: 8px;
}
.dataTables_length label {height: 21px !important;}
</style>
@ -79,12 +79,12 @@ table.dataTable tbody td {
<thead class="bg-light">
<tr>
<th>S. No</th>
<th style="display: none;">User</th>
<th>User</th>
<th>Month</th>
<th style="display: none;">Business Type</th>
<th style="display: none;">Client Type</th>
<th>Insured Name</th>
<th>Policy/<br>Endorsement</th>
<th style="text-align:center;">Policy /<br>Endorsement</th>
<th>Policy Type</th>
<th style="display: none;">BAP Group</th>
<th style="display: none;">Vehicle Number</th>
@ -100,9 +100,9 @@ table.dataTable tbody td {
<th style="display: none;">Remarks</th>
<th>BP Premium</th>
<th>TP/Ter Premium</th>
<th style="display: none;">Premium <br> (without GST)</th>
<th style="text-align:center;">Premium <br>(without GST)</th>
<!-- <th style="display: none;">GST @ 18%</th> -->
<th>Total Premium</th>
<th style="display: none;">Total Premium</th>
<th>BP%</th>
<th>TP/Ter%</th>
<th style="display: none;">Rewards</th>
@ -123,7 +123,7 @@ table.dataTable tbody td {
echo base_url('policy_tranction/endorsement/list') . '?pt_id=' . $row['id'] ;
}
?>" class="mdi mdi-pencil" ></a> </td>
<td style="display: none;"><?php echo $row['user_name'] ?: 'N/A'; ?></td>
<td><?php echo $row['user_name'] ?: 'N/A'; ?></td>
<td><?php echo $row['policy_issue_month'] ?: 'N/A'; ?></td>
<td style="display: none;"><?php echo $row['revenue_type'] ?: 'N/A'; ?></td>
<td style="display: none;"><?php echo $row['client_type'] ?: 'N/A'; ?></td>
@ -144,9 +144,9 @@ table.dataTable tbody td {
<td style="display: none;"><?php echo $row['remarks'] ?: 'N/A'; ?></td>
<td class="right-align-input"><?php echo $row['bp_amt'] ?: '0.00'; ?></td>
<td class="right-align-input"><?php echo $row['tp_or_ter'] ?: '0.00'; ?></td>
<td class="right-align-input" style="display: none;"><?php echo $row['premium_wo_gst']; ?></td>
<td class="right-align-input"><?php echo $row['premium_wo_gst']; ?></td>
<!-- <td class="right-align-input" style="display: none;"><?php echo $row['gst_amount']; ?></td> -->
<td class="right-align-input"><?php echo $row['total_premium'] ?: '0.00'; ?></td>
<td class="right-align-input" style="display: none;"><?php echo $row['total_premium'] ?: '0.00'; ?></td>
<td class="right-align-input"><?php echo $row['agreed_bp_per'] ?: '0.00'; ?>%</td>
<td class="right-align-input"><?php echo $row['agreed_tp_or_ter_per'] ?: '0.00';?>%</td>
<td class="right-align-input" style="display: none;"><?php echo isset($row['reward']) ? $row['reward'] : '0.00'; ?></td>
@ -175,9 +175,17 @@ table.dataTable tbody td {
// REF : Velmurugan but he told handle in query
// Date : 6/11/25 12:50
$unbilled_amt = $total_irda_amt - $row['billed_amt'];
if($total_irda_amt == "0.00"){
$unbilled_amt = abs($unbilled_amt);
}
$unbilled_amt = $unbilled_amt == 0 && $row['billed_amt'] == 0 ? $total_irda_amt : $unbilled_amt ;
?>
<td class="right-align-input"><?php echo number_format((float)$unbilled_amt,2, '.', '')?></td>
<td class="right-align-input">
<?php echo
// number_format((float)$unbilled_amt,2, '.', '')
number_format((float)$row['unbilled_amount'],2, '.', '');
?>
</td>
</tr>
<?php } ?>
<?php } ?>
@ -232,9 +240,9 @@ $(document).ready(function() {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// buttons: [
// {
// extend: 'csv',
@ -286,6 +294,10 @@ $(document).ready(function() {
// }
// }
// ],
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',
@ -547,7 +559,7 @@ $(document).ready(function() {
};
// Compute totals by column index
var totalPremium = getTotal(21);
var totalPremium = getTotal(20);
var totalRewards = getTotal(24);
var totalIrda = getTotal(25);
var totalBilled = getTotal(26);
@ -628,5 +640,10 @@ function appendTableData(data) {
});
}
$('table tbody').on('click', 'td', function () {
var index = $(this).index();
console.log('Clicked TD index:', index);
});
</script>

View File

@ -33,6 +33,7 @@
flex-wrap: wrap;
gap: 8px;
}
.dataTables_length label {height: 21px !important;}
</style>
@ -301,9 +302,9 @@
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// buttons: [
// {
// extend: 'csv',
@ -355,6 +356,10 @@
// }
// }
// ],
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

View File

@ -20,6 +20,7 @@ table.dataTable tbody td {
.right-align-input {
text-align: right;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="col-12" id="second_page">
@ -149,9 +150,13 @@ $(document).ready(function() {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'csv',

View File

@ -28,6 +28,7 @@
color: #00999E !important;
transform: scale(1.5);
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="container-fluid-min">
@ -140,7 +141,7 @@
<td class="text-center"><?php echo $employee['manager_name'] ?? 'N/A' ?></td>
<td class="text-center"><?php if (!empty($employee['created_at'])):
$cd = date("j F Y", strtotime($employee['created_at']));
$ct = date("h:i a", strtotime($employee['created_at']));
$ct = date("h:i A", strtotime($employee['created_at']));
echo $cd . "<br><span class='time'> " . $ct . "</span>";
endif; ?></td>
<td class="text-center"><?php if ($employee['status'] == 'open') {
@ -340,9 +341,9 @@
$(document).ready(function() {
$('#tickets-table').DataTable({
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
// dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>",
// buttons: [{
// extend: 'csv',
// text: 'CSV',
@ -361,6 +362,10 @@
// }
// }
// }],
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [{
extend: 'collection',
text: '<span class=" btn-custom"> Export </span><i class="mdi mdi-menu-down"></i>',

View File

@ -1,7 +1,6 @@
<style>
.dataTables_filter {
position: absolute;
}
.dataTables_filter {position: absolute;}
.dataTables_length label {height: 21px !important;}
</style>
<!-- End ADD and EDIT Page HTML -->
@ -117,9 +116,13 @@
var ticketsTable = $('#user-table');
ticketsTable.DataTable({
scrollX: true,
// dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: 'Add',

View File

@ -17,6 +17,7 @@
.right-align-input {
text-align: right;
}
.dataTables_length label {height: 21px !important;}
</style>
<div class="col-12" id="second_page">
@ -97,9 +98,9 @@
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
// "<'row'<'col-sm-12'tr>>" +
// "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// buttons: [{
// extend: 'csv',
// text: 'CSV',
@ -111,6 +112,10 @@
// title: 'TAT BAND WISE DATA',
// }
// ],
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
"<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',

Some files were not shown because too many files have changed in this diff Show More