diff --git a/app/Config/Routes.php b/app/Config/Routes.php index ad6649dc..e5f4df58 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -776,3 +776,12 @@ $routes->group('payout', function($routes) { $routes->post('removeUtrDetails',"PayoutController::removeUtrDetails"); }); +//PARTNER COMMISSION +$routes->group('commission', function($routes) { + $routes->match (['get','post'],'list',"RuleImportController::commissionFileUploadList"); + $routes->post('upload',"RuleImportController::upload"); + $routes->get('sample_file',"RuleImportController::downloadSampleCommissionFileUploadExcel"); + $routes->get('downloadErrorFile',"RuleImportController::downloadErrorFile"); + $routes->get("deleteCommissionData/(:any)", "RuleImportController::deleteCommissionData/$1"); +}); + diff --git a/app/Controllers/PayoutController.php b/app/Controllers/PayoutController.php index 06762fd8..02bbe1b2 100644 --- a/app/Controllers/PayoutController.php +++ b/app/Controllers/PayoutController.php @@ -81,6 +81,7 @@ class PayoutController extends BaseController // for list $data['payout_status'] = $this->payout_status; $data['agent_list'] = $this->invoiceModel->agentList(); + $data['page_name'] = "Payout"; $payout_data['payout_list_data'] = $this->invoiceModel->invoiceList(); $data['payout_list'] = view('payout_list', $payout_data); diff --git a/app/Controllers/RuleImportController.php b/app/Controllers/RuleImportController.php index a3162499..0c073e55 100644 --- a/app/Controllers/RuleImportController.php +++ b/app/Controllers/RuleImportController.php @@ -1,13 +1,48 @@ myLogger = \Config\Services::mylogger(); $this->ruleImportService = \Config\Services::ruleImportService(); + + $this->commissionFilesModel = new CommissionFilesModel(); + $this->insurerModel = new InsurerModel(); + $this->departments = [ + 'motor' => 'Motor', + 'health' => 'Health', + ]; + } + + public function commissionFileUploadList() + { + $data['page_name'] = "Commision File Upload"; + $data['departments'] = $this->departments; + $data['insurers'] = $this->insurerModel->where('is_active', 1)->findAll(); + $data['commission_file_list'] = $this->commissionFilesModel + ->select('commission_files.*, insurers.name as insurer_name, user_profiles.first_name as created_user_name') + ->join('insurers', 'commission_files.insurer_id = insurers.id') + ->join('user_profiles', 'commission_files.created_by = user_profiles.id') + ->where('commission_files.is_active', 1) + ->orderBy('commission_files.id', 'desc') + ->findAll(); + // dd( $data); + return $this->loadLayout('commission_file_upload', $data); } /** @@ -21,7 +56,7 @@ class RuleImportController extends AdminController try { $file = $this->request->getFile('rules_file'); if (!$file || !$file->isValid()) { - return $this->response->setJSON(['status'=>'error','message'=>'No file uploaded or upload error']); + return $this->response->setJSON(['status'=>false,'message'=>'No file uploaded or upload error']); } // Move uploaded file to writable temp location @@ -42,30 +77,22 @@ class RuleImportController extends AdminController return $this->response->setJSON($result); } catch (\Throwable $e) { - log_message('critical', 'RuleImportController::upload ' . $e->getMessage()); - return $this->response->setJSON(['status'=>'exception','message'=>$e->getMessage()]); + $this->myLogger->logme('critical', 'RuleImportController::upload ' . $e->getMessage()); + return $this->response->setJSON(['status'=>false,'message'=>$e->getMessage()]); } } public function upload() { - // Make sure filesystem helpers available if you need them - helper(['filesystem']); - - // CommissionFilesModel – adjust namespace if different - $commissionFilesModel = new \App\Models\CommissionFilesModel(); - try { + // --------------------------------------------------------- // 1. Get uploaded file // --------------------------------------------------------- $file = $this->request->getFile('rules_file'); if (!$file || !$file->isValid()) { - log_message('warning', 'RuleImportController::upload - No file or invalid upload.'); - return $this->respond([ - 'status' => 'error', - 'message' => 'No file uploaded or upload error.' - ], 400); + $this->myLogger->logme('error', 'RuleImportController::upload - No file or invalid upload.'); + return $this->respond(['status' => false, 'code' => 404, 'message' => 'No file uploaded or upload error.'], 200); } // --------------------------------------------------------- @@ -74,19 +101,11 @@ class RuleImportController extends AdminController $insurerId = $this->request->getPost('insurer_id'); $department = $this->request->getPost('department'); $commissionMonth = $this->request->getPost('commission_month'); - $createdBy = $this->request->getPost('created_by'); + $createdBy = get_session_userid(); - if (empty($insurerId) || empty($department) || empty($commissionMonth) || empty($createdBy)) { - log_message('warning', 'RuleImportController::upload - Missing required POST data.', [ - 'insurer_id' => $insurerId, - 'department' => $department, - 'commission_month' => $commissionMonth, - 'created_by' => $createdBy, - ]); - return $this->respond([ - 'status' => 'error', - 'message' => 'Missing required fields: insurer_id, department, commission_month, created_by.' - ], 400); + if (empty($insurerId) || empty($department) || empty($commissionMonth)) { + $this->myLogger->logme('error', 'RuleImportController::upload - Missing required POST data.' . json_encode($this->request->getPost() ?? [])); + return $this->respond(['status' => false, 'code' => 404, 'message' => 'Missing required fields: insurer_id, department, commission_month'], 200); } // Optional / default fields @@ -116,14 +135,11 @@ class RuleImportController extends AdminController $file->move($uploadDir, $targetFileName); if (!file_exists($movedFullPath)) { - log_message('error', "RuleImportController::upload - Failed to move uploaded file to {$movedFullPath}"); - return $this->respond([ - 'status' => 'error', - 'message' => 'Failed to store uploaded file.' - ], 500); + $this->myLogger->logme('error', "RuleImportController::upload - Failed to move uploaded file to {$movedFullPath}"); + return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to store uploaded file.'], 500); } - log_message('info', "RuleImportController::upload - File moved to {$movedFullPath}"); + $this->myLogger->logme('info', "RuleImportController::upload - File moved to {$movedFullPath}"); // --------------------------------------------------------- // 4. Insert commission_files row with status pending @@ -132,7 +148,7 @@ class RuleImportController extends AdminController 'file_name' => $targetFileName, 'insurer_id' => (int)$insurerId, 'department' => $department, - 'commission_month'=> $commissionMonth, + 'commission_month' => $commissionMonth, 'rules_count' => 0, // will update on success 'file_status' => $fileStatus, // 'pending' by default 'is_active' => $isActive, @@ -140,18 +156,19 @@ class RuleImportController extends AdminController 'created_at' => date('Y-m-d H:i:s'), ]; - $commissionFilesModel->insert($insertData); - $insertId = $commissionFilesModel->getInsertID(); + $this->commissionFilesModel->insert($insertData); + $insertId = $this->commissionFilesModel->getInsertID(); if (empty($insertId)) { - log_message('error', 'RuleImportController::upload - Failed to insert commission_files record', ['data' => $insertData]); + $this->myLogger->logme('error', 'RuleImportController::upload - Failed to insert commission_files record', ['data' => $insertData]); return $this->respond([ - 'status' => 'error', + 'status' => false, + 'code' => 404, 'message' => 'Failed to record upload in database.' - ], 500); + ], 200); } - log_message('info', "RuleImportController::upload - commission_files inserted id={$insertId}", $insertData); + $this->myLogger->logme('info', "RuleImportController::upload - commission_files inserted id={$insertId}", $insertData); // --------------------------------------------------------- // 5. Call ruleImportService->processUpload with inserted file info @@ -172,22 +189,23 @@ class RuleImportController extends AdminController 'commission_month' => $commissionMonth, ]; - log_message('info', 'RuleImportController::upload - Calling ruleImportService->processUpload', ['payload' => $payload]); + $this->myLogger->logme('info', 'RuleImportController::upload - Calling ruleImportService->processUpload', ['payload' => $payload]); $result = $this->ruleImportService->processUpload($payload); if (!is_array($result) || !isset($result['status'])) { - log_message('error', 'RuleImportController::upload - Invalid service response', ['response' => $result]); + $this->myLogger->logme('error', 'RuleImportController::upload - Invalid service response', ['response' => $result]); // update file status as failed - $commissionFilesModel->update($insertId, [ + $this->commissionFilesModel->update($insertId, [ 'file_status' => 'failed', 'updated_by' => (int)$createdBy, 'updated_at' => date('Y-m-d H:i:s'), ]); return $this->respond([ - 'status' => 'error', + 'status' => false, + 'code' => 404, 'message' => 'Invalid response from import service.' - ], 500); + ], 200); } // --------------------------------------------------------- @@ -215,43 +233,45 @@ class RuleImportController extends AdminController $jsonData = json_encode($rulesArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); if ($jsonData === false) { - log_message('error', 'RuleImportController::upload - json_encode failed for rules', [ + $this->myLogger->logme('error', 'RuleImportController::upload - json_encode failed for rules', [ 'last_error' => json_last_error_msg() ]); // mark as failed since we cannot save rules - $commissionFilesModel->update($insertId, [ + $this->commissionFilesModel->update($insertId, [ 'file_status' => 'failed', 'updated_by' => (int)$createdBy, 'updated_at' => date('Y-m-d H:i:s'), ]); return $this->respond([ - 'status' => 'error', + 'status' => false, + 'code' => 404, 'message' => 'Failed to encode rules as JSON.' - ], 500); + ], 200); } if (file_put_contents($jsonPath, $jsonData) === false) { - log_message('error', 'RuleImportController::upload - Failed to write rules JSON file', ['json_path' => $jsonPath]); - $commissionFilesModel->update($insertId, [ + $this->myLogger->logme('error', 'RuleImportController::upload - Failed to write rules JSON file', ['json_path' => $jsonPath]); + $this->commissionFilesModel->update($insertId, [ 'file_status' => 'failed', 'updated_by' => (int)$createdBy, 'updated_at' => date('Y-m-d H:i:s'), ]); return $this->respond([ - 'status' => 'error', + 'status' => false, + 'code' => 404, 'message' => 'Failed to store rules JSON file.' ], 500); } - log_message('info', 'RuleImportController::upload - Rules JSON written', [ + $this->myLogger->logme('info', 'RuleImportController::upload - Rules JSON written', [ 'file_id' => $insertId, 'json_path' => $jsonPath, 'rules_cnt' => $rulesCount, ]); // Update DB: status, rules_count, updated_by - $commissionFilesModel->update($insertId, [ - 'file_status' => 'processed', + $this->commissionFilesModel->update($insertId, [ + 'file_status' => 'pending', 'rules_count' => $rulesCount, 'updated_by' => (int)$createdBy, 'updated_at' => date('Y-m-d H:i:s'), @@ -260,7 +280,8 @@ class RuleImportController extends AdminController ]); return $this->respond([ - 'status' => 'success', + 'status' => true, + 'code' => 200, 'message' => 'File processed successfully.', 'file_id' => $insertId, 'rules_count' => $rulesCount, @@ -291,15 +312,16 @@ class RuleImportController extends AdminController $updateData['annotated_file_path'] = $annotatedPath; } - $commissionFilesModel->update($insertId, $updateData); + $this->commissionFilesModel->update($insertId, $updateData); - log_message('warning', "RuleImportController::upload - Validation failed for file_id={$insertId}", [ + $this->myLogger->logme('error', "RuleImportController::upload - Validation failed for file_id={$insertId}", [ 'errors' => $errors, 'annotated_file' => $annotatedPath ]); return $this->respond([ - 'status' => 'error', + 'status' => false, + 'code' => 404, 'message' => 'Validation failed. No rules saved.', 'file_id' => $insertId, 'errors' => $errors, @@ -310,41 +332,93 @@ class RuleImportController extends AdminController // --------------------------------------------------------- // 8. Unexpected status // --------------------------------------------------------- - log_message('error', 'RuleImportController::upload - Unexpected result status from service', ['result' => $result]); - $commissionFilesModel->update($insertId, [ + $this->myLogger->logme('error', 'RuleImportController::upload - Unexpected result status from service', ['result' => $result]); + $this->commissionFilesModel->update($insertId, [ 'file_status' => 'failed', 'updated_by' => (int)$createdBy, 'updated_at' => date('Y-m-d H:i:s'), ]); return $this->respond([ - 'status' => 'error', + 'status' => false, + 'code' => 404, 'message' => 'Unexpected import service result.' ], 500); - } catch (\Throwable $ex) { - log_message('critical', 'RuleImportController::upload exception: ' . $ex->getMessage(), [ + $this->myLogger->logme('critical', 'RuleImportController::upload exception: ' . $ex->getMessage(), [ 'trace' => $ex->getTraceAsString() ]); // Try to update the commission_files record if insertId exists if (isset($insertId) && !empty($insertId)) { try { - $commissionFilesModel->update($insertId, [ + $this->commissionFilesModel->update($insertId, [ 'file_status' => 'failed', 'updated_by' => isset($createdBy) ? (int)$createdBy : null, 'updated_at' => date('Y-m-d H:i:s'), 'notes' => 'Upload exception: ' . $ex->getMessage(), ]); } catch (\Throwable $e2) { - log_message('error', 'RuleImportController::upload - failed to update commission_files after exception: ' . $e2->getMessage()); + $this->myLogger->logme('error', 'RuleImportController::upload - failed to update commission_files after exception: ' . $e2->getMessage()); } } return $this->respond([ - 'status' => 'exception', + 'status' => false, + 'code' => 500, 'message' => $ex->getMessage(), ], 500); } } + + public function downloadSampleCommissionFileUploadExcel() + { + + $filePath = ROOTPATH . 'public/sample_excel/sample_commission.csv'; + // Check if the file exists + if (file_exists($filePath)) { + + // Set the appropriate MIME type + $mimeType = mime_content_type($filePath); + + // Send the file to the client for download + return $this->response->download($filePath, null, $mimeType); + } else { + // File not found, show an error message or redirect + echo view('errors/html/production'); + } + } + + public function downloadErrorFile() + { + $file_id = $this->request->getGet('file_id'); + + $file_data = $this->commissionFilesModel->where('id', $file_id)->where('is_active', 1)->first(); + + $filePath = WRITEPATH . 'uploads/commission/files/annotated_' . $file_data['file_name']; + + // Check if the file exists + if (file_exists($filePath)) { + + // Set the appropriate MIME type + $mimeType = mime_content_type($filePath); + + // Send the file to the client for download + return $this->response->download($filePath, null, $mimeType); + } else { + // File not found, show an error message or redirect + $data['message'] = 'The Physical File Not Found'; + echo view('errors/404', $data); + } + } + + public function deleteCommissionData($id) + { + $this->commissionFilesModel->where('id', $id) + ->set(['is_active' => 0]) + ->update(); + return $this->respond(['status' => true, 'code' => 200, 'message' => "File removed successfully"], 200); + } + + } diff --git a/app/Models/CommissionFilesModel.php b/app/Models/CommissionFilesModel.php index 99a44a8b..03035526 100644 --- a/app/Models/CommissionFilesModel.php +++ b/app/Models/CommissionFilesModel.php @@ -21,6 +21,7 @@ class CommissionFilesModel extends Model 'is_active', 'created_by', 'updated_by', + 'rules_count', ]; // Auto timestamps by CI4 diff --git a/app/Views/commission_file_upload.php b/app/Views/commission_file_upload.php new file mode 100644 index 00000000..f3e0770c --- /dev/null +++ b/app/Views/commission_file_upload.php @@ -0,0 +1,584 @@ + + + + +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + $row) { ?> + + + + + + + + + + + + + +
S.No.
File Name
Insurer
Commission Month
Department
Rules Count
File
status
User/Time
Action
' . $row['created_user_name'] . '' ?> + + +
+
+
+
+
+
+
+ + + + + + diff --git a/app/Views/layout/header.php b/app/Views/layout/header.php index 8fd011b7..585faa29 100755 --- a/app/Views/layout/header.php +++ b/app/Views/layout/header.php @@ -1256,14 +1256,14 @@ /* Cancel Bootstrap's .form-control for file inputs */ /* input[type="file"].form-control { */ - /* height: auto !important;*/ - /* remove forced height */ - /* padding: initial !important;*/ - /* reset padding */ - /* font-size: inherit !important;*/ - /* reset font size */ - /* line-height: normal !important;*/ - /* reset line height */ + /* height: auto !important;*/ + /* remove forced height */ + /* padding: initial !important;*/ + /* reset padding */ + /* font-size: inherit !important;*/ + /* reset font size */ + /* line-height: normal !important;*/ + /* reset line height */ /* } */ @@ -1327,7 +1327,7 @@