From dc582244a5a48815e45b2c30c77eb703e5a454c6 Mon Sep 17 00:00:00 2001 From: Tb Fajri Date: Wed, 29 Nov 2023 16:22:00 +0700 Subject: [PATCH] update import/export excel request log --- .../Controllers/Api/CorporateController.php | 6 ++ .../Controllers/Api/RequestLogController.php | 90 +++++++++++++----- Modules/Internal/Routes/api.php | 4 + app/Models/RequestLog.php | 74 +++----------- .../pages/CustomerService/FinalLog/List.tsx | 6 +- .../pages/CustomerService/Request/List.tsx | 23 +++-- public/files/Data Request LOG.xlsx | Bin 0 -> 3557 bytes .../Template Update Status Request LOG.xlsx | Bin 0 -> 9540 bytes 8 files changed, 112 insertions(+), 91 deletions(-) create mode 100644 public/files/Data Request LOG.xlsx create mode 100644 public/files/Template Update Status Request LOG.xlsx diff --git a/Modules/Internal/Http/Controllers/Api/CorporateController.php b/Modules/Internal/Http/Controllers/Api/CorporateController.php index 304e1ebe..a8fc5dbd 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateController.php @@ -563,6 +563,12 @@ class CorporateController extends Controller "file_url" => url('files/Template Format Claim.xlsx') ]); break; + case 'request-log': + return Helper::responseJson([ + 'file_name' => "Template Update Status Request LOG.xlsx", + "file_url" => url('files/Template Update Status Request LOG.xlsx') + ]); + break; default: return Helper::responseJson([], 'error', 404); break; diff --git a/Modules/Internal/Http/Controllers/Api/RequestLogController.php b/Modules/Internal/Http/Controllers/Api/RequestLogController.php index 6f9078bc..23a99492 100644 --- a/Modules/Internal/Http/Controllers/Api/RequestLogController.php +++ b/Modules/Internal/Http/Controllers/Api/RequestLogController.php @@ -16,6 +16,12 @@ use Illuminate\Support\Facades\Storage; use App\Services\RequestLogService; use App\Exceptions\ImportRowException; use App\Events\RequestLoged; + +use Maatwebsite\Excel\Facades\Excel; +use Box\Spout\Reader\Common\Creator\ReaderEntityFactory; +use Box\Spout\Writer\Common\Creator\WriterEntityFactory; + + use Exception; use PDF; @@ -207,7 +213,7 @@ class RequestLogController extends Controller } /** - * Generate Request LOG + * Generate Request LOG PDF */ public function generateRequestLog($id) { @@ -238,6 +244,55 @@ class RequestLogController extends Controller return $requestLog; } + /** + * Generate Export Excel Request LOG + */ + + public function generateDataRequestLogExcel(){ + $file_name = 'Data Request LOG'; + // Membuat penulis entitas Spout + $writer = WriterEntityFactory::createXLSXWriter(); + // Membuka penulis untuk menulis ke file + $writer->openToFile(public_path('files/Data Request LOG.xlsx')); + + // Sheet 1 + $writer->getCurrentSheet()->setName('Data'); + $headers_map_to_table_fields = RequestLog::$listing_data_doc_headers; + $headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields); + $writer->addRow($headerRow); + + $dataRequestLog = RequestLog::query() + // ->whereHas('corporatePlan', function ($corporatePlan) use ($corporate_id) { + // $corporatePlan->where('corporate_id', $corporate_id); + // }) + ->with('member') + ->orderBy('id', 'desc') + ->get()->toArray(); + + // dd($dataRequestLog); + foreach ($dataRequestLog as $index => $row){ + $serviceType = $this->getServiceName($row['service_code']); + + $rowData = [ + $row['id'], // id + $row['code'], // code + $row['member']['name'], // name + $row['submission_date'], // submission date + $serviceType, // service type + $row['payment_type_name'], // service type + $row['status'], // service type + ]; + $row = WriterEntityFactory::createRowFromArray($rowData); + $writer->addRow($row); + } + $writer->close(); + + return Helper::responseJson([ + 'file_name' => "Data Request Log " . date('Y-m-d h:i:s'), + "file_url" => url('files/Data Request LOG.xlsx') + ]); + } + public function updateFinalLog(Request $request, $id) { $requestLog = RequestLog::findOrFail($id); @@ -350,7 +405,7 @@ class RequestLogController extends Controller } - public function importClaim(Request $request) + public function importRequestLog(Request $request) { $request->validate([ @@ -398,38 +453,20 @@ class RequestLogController extends Controller $row_data[$headers_map_to_table_fields[$doc_headers_indexes[$header_index]]] = $cell->getValue(); } try { // Process the Row Data - $claimRequestService = new RequestLogService(); + $requestLog = new RequestLogService(); - $claimRequestService->handleRequestLogRow($row_data); + $requestLog->handleRequestLogRow($row_data); - // Write Success Result to File - // $import->read($fileRead); - // $import->write($fileWrite, 'xsls'); $result_headers = array_merge($row_data, ['Ingest Code' =>200, 'Ingest Note' => 'Success']); $import->addArrayToRow($result_headers, $sheet->getName()); } catch (ImportRowException $e) { - // Write Data Validation Error to File - // $import->read($fileRead); - // $import->write($fileWrite, 'xsls'); - $import->addArrayToRow(array_merge($row_data, [ 'Ingest Code' => $e->getCode(), 'Ingest Note' => $e->getMessage(), ]), $sheet->getName()); } - // catch (\Exception $e) { - // // throw new \Exception($e); - // // Write Server Error to File - // // $import->read($fileRead); - // // $import->write($fileWrite, 'xsls'); - // dd( $e->getMessage()); - // $import->addArrayToRow(array_merge($row_data, [ - // 'Ingest Code' => 500, - // 'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error', - // ]), $sheet->getName()); - // } } } } @@ -623,6 +660,15 @@ class RequestLogController extends Controller return $service; } + public function getServiceName($code){ + $service = DB::table('services') + ->select('name') + ->where('code', $code) + ->get() + ->first(); + return $service->name; + } + public static function getNextCode(Request $request) { // $last_number = RequestLog::max('code'); diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index a2f2821a..1977019a 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -252,6 +252,10 @@ Route::prefix('internal')->group(function () { Route::post('customer-service/request', [RequestLogController::class, 'createNew']); Route::put('customer-service/request/{id}', [RequestLogController::class, 'update']); Route::get('customer-service/request/{id}/download', [RequestLogController::class, 'generateRequestLog']); + Route::post('customer-service/request/import', [RequestLogController::class, 'importRequestLog']); + Route::get('customer-service/request/data', [RequestLogController::class, 'generateDataRequestLogExcel']); + + Route::get('search-organizations', [OrganizationController::class, 'searchOrganization']); Route::get('search-specialities', [SpecialityController::class, 'searchSpeciality']); diff --git a/app/Models/RequestLog.php b/app/Models/RequestLog.php index 7e89fa94..827cd846 100644 --- a/app/Models/RequestLog.php +++ b/app/Models/RequestLog.php @@ -41,69 +41,23 @@ class RequestLog extends Model ]; public static $doc_headers_to_field_map = [ - "PAYOR ID" => "payor_id", - "CORPORATE ID" => "corporate_id", - "POLICY NUMBER" => "policy_number", - "MEMBER ID" => "member_id", - "MEMBER NAME" => "member_name", - "RECORD TYPE (P/D)" => "record_type", - "BENEFIT CODE" => "benefit_code", - "BENEFIT DESC" => "benefit_desc", - "CLAIM TYPE" => "claim_type", - "CLAIM PROCESS STATUS" => "status", - "CLIENT CLAIM ID" => "client_claim_id", - "REFERENCE NO" => "reference_no", - "ADMEDIKA CLAIM ID" => "admika_claim_id", - "PROVIDER CODE" => "provider_code", - "ADMISSION DATE" => "admission_date", - "DISCUTRGE DATE" => "discutrge_date", - "DURATION DAYS" => "duration_days", - "COVERAGE TYPE" => "coverage_type", - "PLAN ID" => "plan_id", - "DIAGNOSIS CODE" => "diagnosis_code", - "DIAGNOSIS DESC" => "diagnosis_desc", - "TOT AMT INCURRED" => "tot_amt_insurred", - "TOT AMT APPROVED" => "tot_amt_approved", - "TOT AMT NOT APPROVED" => "tot_amt_not_approved", - "TOT EXCESS PAID" => "tot_excess_paid", - "REMARKS" => "remarks", - "SECONDARY DIAGNOSIS CODE" => "secondary_diagnosis", - "APPROVED DATE" => "approved_date", - "APPROVED BY" => "approved_by", - "DATE RECEIVED" => "data_received", - "HOSPITAL INVOICE DATE" => "hospital_invoice_date", + "ID REQUEST LOG" => "id", + "STATUS (approved, declined, requested)" => "status", ]; public static $listing_doc_headers = [ - "PAYOR ID", - "CORPORATE ID", - "POLICY NUMBER", - "MEMBER ID", - "MEMBER NAME", - "RECORD TYPE (P/D)", - "CLAIM TYPE", - "CLAIM PROCESS STATUS", - "CLIENT CLAIM ID", - "REFERENCE NO", - "ADMEDIKA CLAIM ID", - "PROVIDER CODE", - "ADMISSION DATE", - "DISCUTRGE DATE", - "DURATION DAYS", - "COVERAGE TYPE", - "PLAN ID", - "DIAGNOSIS CODE", - "DIAGNOSIS DESC", - "TOT AMT INCURRED", - "TOT AMT APPROVED", - "TOT AMT NOT APPROVED", - "TOT EXCESS PAID", - "REMARKS", - "SECONDARY DIAGNOSIS CODE", - "APPROVED DATE", - "APPROVED BY", - "DATE RECEIVED", - "HOSPITAL INVOICE DATE", + "ID REQUEST LOG", + "STATUS (approved, declined, requested)", + ]; + + public static $listing_data_doc_headers = [ + "ID REQUEST LOG", + "CODE", + "NAME", + "DATE OF SUBMISSION", + "SERVICE TYPE", + "CLAIM METHOD", + "STATUS", ]; diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/List.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/List.tsx index 24645d01..ece99d47 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/List.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/List.tsx @@ -348,9 +348,10 @@ export default function List() { // handleShowClaim(row); // }} > - {row.code} + {row.id} + {row.member?.code} {row.member?.full_name} {row.service_name} @@ -470,6 +471,9 @@ export default function List() { {/* */} + + ID Request LOG + Code diff --git a/frontend/dashboard/src/pages/CustomerService/Request/List.tsx b/frontend/dashboard/src/pages/CustomerService/Request/List.tsx index 887d67a2..4e9927a1 100644 --- a/frontend/dashboard/src/pages/CustomerService/Request/List.tsx +++ b/frontend/dashboard/src/pages/CustomerService/Request/List.tsx @@ -143,7 +143,7 @@ export default function List() { setImportLoading(true); axios - .post(`claim-requests/import`, formData) + .post(`customer-service/request/import`, formData) .then((response) => { handleCancelImportButton(); loadDataTableData(); @@ -177,7 +177,7 @@ export default function List() { } const handleGetData = (type :string) => { - axios.get(`corporates/${corporate_id}/data-plan-benefit`) + axios.get(`customer-service/request/data`) .then((response) => { const link = document.createElement('a'); link.href = response.data.data.file_url; @@ -219,10 +219,10 @@ export default function List() { }} > Import - {handleGetTemplate('claim-request')}}>Download Template - {handleGetData('data-plan-benefit')}}>Download Claim Request + {handleGetTemplate('request-log')}}>Download Template + {handleGetData('data-request-log')}}>Download Request LOG - + */} )} @@ -351,9 +351,10 @@ export default function List() { // handleShowClaim(row); // }} > - {row.code} + {row.id} + {row.code} {row.member?.full_name} {row.service_name} @@ -361,8 +362,11 @@ export default function List() { { row.status == "requested" ? () : + row.status == "declined" ? + () + : () - } + } {/* */} + + ID Request LOG + Code diff --git a/public/files/Data Request LOG.xlsx b/public/files/Data Request LOG.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c099f7e8ef7bbbebb10e01665f6227067ccd5484 GIT binary patch literal 3557 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 O=+7Uj*q_LM?)^W#eXQ94 literal 0 HcmV?d00001