diff --git a/Modules/Internal/Http/Controllers/Api/DiagnosisController.php b/Modules/Internal/Http/Controllers/Api/DiagnosisController.php
index bea90e0f..db329ea4 100644
--- a/Modules/Internal/Http/Controllers/Api/DiagnosisController.php
+++ b/Modules/Internal/Http/Controllers/Api/DiagnosisController.php
@@ -29,12 +29,12 @@ class DiagnosisController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
- public function index(Request $request)
+ public function index(Request $request, $diagnosis_template_id)
{
$diagnosis = Icd::query()
->filter($request->toArray())
- // ->where('deleted_at', '=', NULL)
+ ->where('icd_template_id', '=', $diagnosis_template_id)
->orderBy('code', 'ASC')
->paginate(15);
return $diagnosis;
@@ -108,7 +108,7 @@ class DiagnosisController extends Controller
})->limit(10)->get();
}
- public function import(Request $request)
+ public function import(Request $request, $id)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
@@ -143,14 +143,8 @@ class DiagnosisController extends Controller
} else { // Next Row Should be Data
$row_data = [];
$row_map = [
- 0 => 'code',
- 1 => 'parent_code',
- 2 => 'reff_exc',
- 3 => 'description_en',
- 4 => 'description_id',
- 5 => 'keywords',
- 6 => 'version',
- 7 => 'active',
+ 0 => 'ICD_Code',
+ 1 => 'Description',
];
foreach ($row->getCells() as $header_index => $cell) {
@@ -166,21 +160,15 @@ class DiagnosisController extends Controller
try { // Process the Row Data
if (
- empty($row_data['code']) &&
- empty($row_data['parent_code']) &&
- empty($row_data['reff_exc']) &&
- empty($row_data['description_en']) &&
- empty($row_data['description_id']) &&
- empty($row_data['keywords']) &&
- empty($row_data['version']) &&
- empty($row_data['active'])
+ empty($row_data['ICD_Code']) &&
+ empty($row_data['Description'])
) {
continue;
}
// Save the Row
$icdService = new IcdService();
- $icdService->handleIcdRow($row_data);
+ $icdService->handleIcdRow($row_data, $id);
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
@@ -242,15 +230,15 @@ class DiagnosisController extends Controller
}
}
- public function generateIcdList(Request $request){
+ public function generateIcdList(Request $request, $diagnosis_id){
// Mendapatkan data yang akan diekspor (misalnya, dari database)
- $data = Icd::get()->toArray();
+ $data = Icd::where('icd_template_id', $diagnosis_id)->get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
- $writer->openToFile(public_path('files/CorporateMembershipList.xlsx'));
+ $writer->openToFile(public_path('files/TemplateICDList.xlsx'));
/** Create a style with the StyleBuilder */
$style = (new StyleBuilder())
->setFontBold()
@@ -266,14 +254,14 @@ class DiagnosisController extends Controller
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
- $item['rev'], // Rev
- $item['version'], // Version
+ // $item['rev'], // Rev
+ // $item['version'], // Version
$item['code'], // Code
- $item['parent_code'], // Parent Code
+ // $item['parent_code'], // Parent Code
$item['name'], // Name
- $item['description'], // Description
- $item['active'] == 1 ? 'Active' : 'Inactive', // Status
- $item['type'], // Type
+ // $item['description'], // Description
+ // $item['active'] == 1 ? 'Active' : 'Inactive', // Status
+ // $item['type'], // Type
];
$row = WriterEntityFactory::createRowFromArray($rowData);
@@ -285,11 +273,11 @@ class DiagnosisController extends Controller
$writer->close();
// Mengembalikan response untuk mengunduh file
- $filePath = public_path('files/CorporateMembershipList.xlsx');
+ $filePath = public_path('files/TemplateICDList.xlsx');
return Helper::responseJson([
'file_name' => "Diagnosis ICD List " . date('Y-m-d h:i:s'),
- "file_url" => url('files/CorporateMembershipList.xlsx')
+ "file_url" => url('files/TemplateICDList.xlsx')
]);
}
diff --git a/Modules/Internal/Http/Controllers/Api/DiagnosisTemplateController.php b/Modules/Internal/Http/Controllers/Api/DiagnosisTemplateController.php
new file mode 100644
index 00000000..01bb72a9
--- /dev/null
+++ b/Modules/Internal/Http/Controllers/Api/DiagnosisTemplateController.php
@@ -0,0 +1,314 @@
+search){
+ return IcdTemplate::when($request->search ?? null, function($icd, $search) {
+ $icd->where('name', 'LIKE', '%'.$search.'%')
+ ->orWhere('code', 'LIKE', '%'.$search.'%');
+ })->paginate(15);
+ } else {
+ $diagnosisTemplate = IcdTemplate::query()
+ // ->filter($request->toArray())
+ ->orderBy('code', 'ASC')
+ ->paginate(15);
+ return $diagnosisTemplate;
+ }
+
+ }
+
+ /**
+ * Show the form for creating a new resource.
+ * @return Renderable
+ */
+ public function create()
+ {
+ return view('internal::create');
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ * @param Request $request
+ * @return Renderable
+ */
+ public function store(Request $request)
+ {
+ $request->validate([
+ 'name' => 'required'
+ ]);
+
+ $newDiagnosisTemplate = IcdTemplate::create($request->all());
+
+ return $newDiagnosisTemplate;
+ }
+
+ /**
+ * Show the specified resource.
+ * @param int $id
+ * @return Renderable
+ */
+ public function show($id)
+ {
+ return view('internal::show');
+ }
+
+ /**
+ * Show the form for editing the specified resource.
+ * @param int $id
+ * @return Renderable
+ */
+ public function edit($id)
+ {
+ $IcdTemplate = IcdTemplate::findOrFail($id);
+
+ return $IcdTemplate;
+ }
+
+ /**
+ * Update the specified resource in storage.
+ * @param Request $request
+ * @param int $id
+ * @return Renderable
+ */
+ public function update(Request $request, $id)
+ {
+ $IcdTemplate = IcdTemplate::findOrFail($id);
+ $request->validate([
+ 'name' => 'required'
+ ]);
+ $IcdTemplate->fill([
+ // 'code' => $request->code,
+ 'name' => $request->name,
+ 'description' => $request->description,
+ 'active' => $request->active,
+ ])->save();
+
+ return $IcdTemplate;
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ * @param int $id
+ * @return Renderable
+ */
+ public function destroy($id)
+ {
+ //
+ }
+
+ public function search(Request $request)
+ {
+ return IcdTemplate::when($request->search ?? null, function($icd, $search) {
+ $icd->where('name', 'LIKE', '%'.$search.'%')
+ ->orWhere('code', 'LIKE', '%'.$search.'%');
+ })->limit(10)->get();
+ }
+
+ public function import(Request $request)
+ {
+ $request->validate([
+ 'file' => 'required|file|mimes:xls,xlsx,csv,txt',
+ ]);
+ $file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName();
+ $file = $request->file('file')->storeAs('temp', $file_name);
+
+ $import = new ImportService();
+ $import->read(Storage::path('temp/'.$file_name));
+ $import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls');
+
+ $imported_icd_data = 0;
+ $failed_icd_data = [];
+ foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
+ $doc_headers_indexes = [];
+ foreach ($sheet->getRowIterator() as $index => $row) {
+ if ($index == 1) { // First Row Must be Header
+ foreach ($row->getCells() as $index => $cell) {
+ $title = $cell->getValue();
+ $title = preg_replace( "/\r|\n/", " ", $title );
+ $title = preg_replace('/\xc2\xa0/', " ", $title );
+ $title = rtrim($title);
+ $title = ltrim($title);
+ $doc_headers_indexes[$index] = $title;
+ }
+
+ // Write Header to File
+ $result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']);
+ $import->addArrayToRow($result_headers);
+
+ // TODO Validate if First Row not Header
+ } else { // Next Row Should be Data
+ $row_data = [];
+ $row_map = [
+ 0 => 'code',
+ 1 => 'parent_code',
+ 2 => 'reff_exc',
+ 3 => 'description_en',
+ 4 => 'description_id',
+ 5 => 'keywords',
+ 6 => 'version',
+ 7 => 'active',
+ ];
+
+ foreach ($row->getCells() as $header_index => $cell) {
+ if (isset($row_map[$header_index])) {
+ $value = $cell->getValue();
+ $value = preg_replace( "/\r|\n/", " ", $value );
+ $value = preg_replace('/\xc2\xa0/', " ", $value );
+ $value = rtrim($value);
+ $value = ltrim($value);
+ $row_data[$row_map[$header_index]] = $cell->getValue();
+ }
+ }
+
+ try { // Process the Row Data
+ if (
+ empty($row_data['code']) &&
+ empty($row_data['parent_code']) &&
+ empty($row_data['reff_exc']) &&
+ empty($row_data['description_en']) &&
+ empty($row_data['description_id']) &&
+ empty($row_data['keywords']) &&
+ empty($row_data['version']) &&
+ empty($row_data['active'])
+ ) {
+ continue;
+ }
+
+ // Save the Row
+ $icdService = new IcdService();
+ $icdService->handleIcdRow($row_data);
+
+ // Write Success Result to File
+ $import->addArrayToRow(array_merge($row_data, [
+ 'Ingest Code' => 200,
+ 'Ingest Note' => 'Success',
+ ]), $sheet->getName());
+ $imported_icd_data++;
+
+ } catch (ImportRowException $e) {
+ // Write Data Validation Error to File
+ $import->addArrayToRow(array_merge($row_data, [
+ 'Ingest Code' => $e->getCode(),
+ 'Ingest Note' => $e->getMessage(),
+ ]), $sheet->getName());
+ $failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
+ } catch (\Exception $e) {
+ throw new \Exception($e);
+ // Write Server Error to File
+ $import->addArrayToRow(array_merge($row_data, [
+ 'Ingest Code' => 500,
+ 'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
+ ]), $sheet->getName());
+ $failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
+ }
+ }
+ }
+
+ break; // Only Read First Row
+ }
+ $import->reader->close();
+ Storage::delete('temp/'.$file_name);
+ $import->writer->close();
+
+ return [
+ 'total_successed_row' => $imported_icd_data,
+ 'total_failed_row' => count($failed_icd_data),
+ 'failed_row' => $failed_icd_data,
+ 'result_file' => [
+ 'url' => Storage::disk('public')->url('temp/result-'.$file_name),
+ 'name' => 'result-'.$file_name,
+ ]
+ ];
+ }
+
+ public function activation(Request $request, $id)
+ {
+ $request->validate([
+ 'active' => 'required'
+ ]);
+ $Icd = IcdTemplate::findOrFail($id);
+ $Icd->active = $request->active == '1';
+
+ if ($Icd->save()) {
+ return response()->json([
+ 'icd' => $Icd,
+ 'message' => 'Status Updated Successfully'
+ ]);
+ }
+ }
+
+ public function generateIcdList(Request $request){
+ // Mendapatkan data yang akan diekspor (misalnya, dari database)
+ $data = Icd::get()->toArray();
+
+ // Membuat penulis entitas Spout
+ $writer = WriterEntityFactory::createXLSXWriter();
+
+ // Membuka penulis untuk menulis ke file
+ $writer->openToFile(public_path('files/CorporateMembershipList.xlsx'));
+ /** Create a style with the StyleBuilder */
+ $style = (new StyleBuilder())
+ ->setFontBold()
+ ->build();
+
+ // Menulis header kolom
+ $headers_map_to_table_fields = $this->icdService->listing_doc_headers;
+ $headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style);
+
+ $writer->addRow($headerRow);
+
+ // Menulis data
+ if (!empty($data)) {
+ foreach ($data as $item) {
+ $rowData = [
+ $item['rev'], // Rev
+ $item['version'], // Version
+ $item['code'], // Code
+ $item['parent_code'], // Parent Code
+ $item['name'], // Name
+ $item['description'], // Description
+ $item['active'] == 1 ? 'Active' : 'Inactive', // Status
+ $item['type'], // Type
+ ];
+
+ $row = WriterEntityFactory::createRowFromArray($rowData);
+ $writer->addRow($row);
+ }
+ }
+
+ // Menutup penulis
+ $writer->close();
+
+ // Mengembalikan response untuk mengunduh file
+ $filePath = public_path('files/CorporateMembershipList.xlsx');
+
+ return Helper::responseJson([
+ 'file_name' => "Diagnosis ICD List " . date('Y-m-d h:i:s'),
+ "file_url" => url('files/CorporateMembershipList.xlsx')
+ ]);
+
+ }
+}
diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php
index 435e09ff..9315ddbc 100644
--- a/Modules/Internal/Routes/api.php
+++ b/Modules/Internal/Routes/api.php
@@ -15,6 +15,7 @@ use Modules\Internal\Http\Controllers\Api\CorporateMemberController;
use Modules\Internal\Http\Controllers\Api\CorporatePlanController;
use Modules\Internal\Http\Controllers\Api\CorporateServiceController;
use Modules\Internal\Http\Controllers\Api\DiagnosisController;
+use Modules\Internal\Http\Controllers\Api\DiagnosisTemplateController;
use Modules\Internal\Http\Controllers\Api\DiagnosisExclusionController;
use Modules\Internal\Http\Controllers\Api\DistrictController;
use Modules\Internal\Http\Controllers\Api\DivisionController;
@@ -127,12 +128,22 @@ Route::prefix('internal')->group(function () {
// Audittrail
Route::get('audittrail/{corporate_id}', [AuditTrailController::class, 'index']);
+
+ Route::get('master/diagnosis-template', [DiagnosisTemplateController::class, 'index']);
+ Route::get('master/diagnosis-template/search', [DiagnosisTemplateController::class, 'search']);
+ Route::post('master/diagnosis-template/store', [DiagnosisTemplateController::class, 'store']);
+ Route::put('master/diagnosis-template/{id}/activation', [DiagnosisTemplateController::class, 'activation']);
+ Route::get('master/diagnosis-template/{id}/edit', [DiagnosisTemplateController::class, 'edit']);
+ Route::put('master/diagnosis-template/{id}/update', [DiagnosisTemplateController::class, 'update']);
- Route::get('master/diagnosis', [DiagnosisController::class, 'index']);
- Route::get('master/diagnosis/search', [DiagnosisController::class, 'search']);
- Route::post('master/diagnosis/import', [DiagnosisController::class, 'import']);
- Route::get('master/diagnosis/list', [DiagnosisController::class, 'generateIcdList']);
- Route::put('master/diagnosis/{id}/activation', [DiagnosisController::class, 'activation']);
+ Route::get('master/diagnosis/{diagnosis_template_id}', [DiagnosisController::class, 'index']);
+ Route::get('master/diagnosis/{diagnosis_template_id}/search', [DiagnosisController::class, 'search']);
+ Route::post('master/diagnosis/{diagnosis_template_id}/import', [DiagnosisController::class, 'import']);
+ Route::get('master/diagnosis/{diagnosis_template_id}/list', [DiagnosisController::class, 'generateIcdList']);
+ Route::put('master/diagnosis/{diagnosis_template_id}/activation', [DiagnosisController::class, 'activation']);
+
+
+
Route::get('master/drugs', [DrugController::class, 'index']);
Route::get('master/formulariums', [FormulariumController::class, 'index']);
Route::post('master/formulariums', [FormulariumController::class, 'store']);
diff --git a/Modules/Internal/Services/IcdService.php b/Modules/Internal/Services/IcdService.php
index c3a22c20..ce668a4b 100644
--- a/Modules/Internal/Services/IcdService.php
+++ b/Modules/Internal/Services/IcdService.php
@@ -13,27 +13,25 @@ class IcdService
{
protected function validateDiagnosisExclusionRow($row)
{
- if (empty($row['code'])) {
- throw new ImportRowException(__('code.REQUIRED'), 0, null, $row);
- }
- if (empty($row['description_en'])) {
- throw new ImportRowException(__('name.REQUIRED'), 0, null, $row);
+ if (empty($row['ICD_Code'])) {
+ throw new ImportRowException(__('ICD_Code is REQUIRED'), 0, null, $row);
}
}
- public function handleIcdRow($row)
+ public function handleIcdRow($row, $id)
{
try {
$this->validateDiagnosisExclusionRow($row);
$icd = Icd::updateOrCreate([
- 'code' => $row['code']
+ 'code' => $row['ICD_Code']
], [
- "code" => $row['code'],
- "parent_code" => $row['parent_code'] ?? null,
- "rev" => $row['reff_exc'],
- "name" => $row['description_en'],
- "version" => $row["version"] ?? null,
- "active" => $row["active"] ?? 0
+ "code" => $row['ICD_Code'],
+ "parent_code" => null,
+ "rev" => '',
+ "name" => $row['Description'] ?? null,
+ "version" => null,
+ "active" => 1,
+ "icd_template_id" => $id,
]);
return true;
@@ -43,13 +41,13 @@ class IcdService
}
public $listing_doc_headers = [
- "Rev",
- "Version",
+ // "Rev",
+ // "Version",
"Code",
- "Parent Code",
- "Name",
+ // "Parent Code",
+ // "Name",
"Description",
- "Status",
- "Type"
+ // "Status",
+ // "Type"
];
}
diff --git a/app/Models/Icd.php b/app/Models/Icd.php
index 69497c4a..981c5a57 100644
--- a/app/Models/Icd.php
+++ b/app/Models/Icd.php
@@ -21,7 +21,8 @@ class Icd extends Model
'name',
'description',
'parent_code',
- 'active'
+ 'active',
+ 'icd_template_id'
];
public $appends = [
diff --git a/app/Models/IcdTemplate.php b/app/Models/IcdTemplate.php
new file mode 100644
index 00000000..e58c03dc
--- /dev/null
+++ b/app/Models/IcdTemplate.php
@@ -0,0 +1,32 @@
+logAuditTrail($model, 'deleted');
});
+ // ICD or exlusion
+ IcdTemplate::updated(function ($model) {
+ $this->logAuditTrail($model, 'updated');
+ });
+
+ IcdTemplate::deleted(function ($model) {
+ $this->logAuditTrail($model, 'deleted');
+ });
+
}
diff --git a/database/migrations/2023_09_19_164907_create_icd_template.php b/database/migrations/2023_09_19_164907_create_icd_template.php
new file mode 100644
index 00000000..9174bc8d
--- /dev/null
+++ b/database/migrations/2023_09_19_164907_create_icd_template.php
@@ -0,0 +1,34 @@
+id();
+ $table->string('name');
+ $table->string('code');
+ $table->string('description');
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('icd_template');
+ }
+};
diff --git a/database/migrations/2023_09_20_090317_add_active_to_icd_template.php b/database/migrations/2023_09_20_090317_add_active_to_icd_template.php
new file mode 100644
index 00000000..977af55f
--- /dev/null
+++ b/database/migrations/2023_09_20_090317_add_active_to_icd_template.php
@@ -0,0 +1,32 @@
+integer('active');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::table('icd_template', function (Blueprint $table) {
+ $table->dropColumn('active');
+ });
+ }
+};
diff --git a/database/migrations/2023_09_20_152738_add_icd_template_id_to_icd.php b/database/migrations/2023_09_20_152738_add_icd_template_id_to_icd.php
new file mode 100644
index 00000000..603b9104
--- /dev/null
+++ b/database/migrations/2023_09_20_152738_add_icd_template_id_to_icd.php
@@ -0,0 +1,32 @@
+integer('icd_template_id');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::table('icd', function (Blueprint $table) {
+ $table->dropColumn('icd_template_id');
+ });
+ }
+};
diff --git a/frontend/dashboard/src/@types/corporates.ts b/frontend/dashboard/src/@types/corporates.ts
index 45ad95ca..5484f2ce 100644
--- a/frontend/dashboard/src/@types/corporates.ts
+++ b/frontend/dashboard/src/@types/corporates.ts
@@ -182,3 +182,10 @@ export type CorporateService = {
status: string;
configurations: any;
}
+
+export type MasterExclusion = {
+ id?: string | number;
+ name?: string;
+ code: string;
+ description?: string;
+}
diff --git a/frontend/dashboard/src/layouts/dashboard/navbar/NavConfig.tsx b/frontend/dashboard/src/layouts/dashboard/navbar/NavConfig.tsx
index f99b2ef4..2629d771 100644
--- a/frontend/dashboard/src/layouts/dashboard/navbar/NavConfig.tsx
+++ b/frontend/dashboard/src/layouts/dashboard/navbar/NavConfig.tsx
@@ -54,7 +54,7 @@ const navConfig = [
// { title: 'Corporate Create', path: '/corporates/create' },
{ title: 'Formularium', path: '/master/formularium' },
{ title: 'Obat', path: '/master/drugs' },
- { title: 'Diagnosis Library (ICD-X)', path: '/master/diagnosis' },
+ { title: 'Master ICD-10 Diagnosis', path: '/master/diagnosis-template' },
{ title: 'Hospitals', path: '/hospitals' },
],
},
diff --git a/frontend/dashboard/src/pages/Master/Diagnosis/History.tsx b/frontend/dashboard/src/pages/Master/Diagnosis/History.tsx
index 1e6b7361..8b9d8bc1 100644
--- a/frontend/dashboard/src/pages/Master/Diagnosis/History.tsx
+++ b/frontend/dashboard/src/pages/Master/Diagnosis/History.tsx
@@ -157,7 +157,12 @@ export default function CustomizedAccordions() {
key === 'created_by' ||
key === 'created_at' ||
key === 'updated_by' ||
- key === 'description'
+ key === 'description'||
+ key === 'version'||
+ key === 'rev'||
+ key === 'active'||
+ key === 'parent_code'||
+ key === 'id'
) {
return null; // Melewati iterasi saat key adalah 'deleted_by'
}
@@ -196,14 +201,15 @@ export default function CustomizedAccordions() {
}
const field = key.charAt(0).toUpperCase() + key.slice(1);
-
- return (
-