diff --git a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php index dd1ca899..45af4fbd 100755 --- a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php @@ -237,6 +237,7 @@ class RequestLogController extends Controller 'request_logs.service_code', 'request_logs.specialities_id', 'request_logs.dppj', + 'request_logs.log_type', DB::raw(' CASE WHEN request_logs.status = "requested" THEN "requested" @@ -316,6 +317,7 @@ class RequestLogController extends Controller 'members.id AS member_id', 'request_logs.service_code', 'members.birth_date', + 'request_logs.log_type', DB::raw(' CASE WHEN request_logs.status_final_log = "requested" THEN "requested" @@ -375,14 +377,14 @@ class RequestLogController extends Controller DB::table('request_logs') ->where('request_logs.id', '=', $request->request_logs_id) ->update([ - 'status_final_log' => 'requested', - 'final_log' => 1, + 'status_final_log' => $request->edit ? null : 'requested', + 'final_log' => $request->edit ? 0 : 1, 'service_code' =>$request->service_code, 'discharge_date' => $request->discharge_date, 'dppj' => $request->dppj, 'specialities_id' => $request->spescialis_id, - 'created_final_by'=> auth()->user()->id, - 'created_final_at'=> date('Y-m-d H:i:s'), + 'created_final_by'=> $request->edit ? null : auth()->user()->id, + 'created_final_at'=> $request->edit ? null : date('Y-m-d H:i:s'), ]); if ($request->hasFile('result_files')) { foreach ($request->result_files as $file) { diff --git a/Modules/HospitalPortal/Routes/api.php b/Modules/HospitalPortal/Routes/api.php index 9f18de88..f1cd4b58 100755 --- a/Modules/HospitalPortal/Routes/api.php +++ b/Modules/HospitalPortal/Routes/api.php @@ -16,6 +16,7 @@ use Modules\HospitalPortal\Http\Middleware\Authentication; use Modules\HospitalPortal\Http\Middleware\Authorization; use Modules\Internal\Http\Controllers\Api\NavigationController; use Modules\Linksehat\Http\Controllers\Api\AutocompleteController; +use Modules\Primaya\Http\Controllers\Api\MasterController; /* |-------------------------------------------------------------------------- @@ -128,6 +129,8 @@ Route::prefix('v1')->group(function() { Route::get('get-claim-requests', [ClaimRequestController::class, 'get_claim_requests'])->name('claim-requests.get_claim_requests'); Route::get('detail-claim-requests/{id}', [ClaimRequestController::class, 'detail_claim_requests'])->name('claim-requests.detail_claim_requests'); Route::post('claim-requests/{id}/request-files', [ClaimRequestController::class, 'requestFiles']); + + Route::get('organizations', [MasterController::class, 'organizations']); }); diff --git a/Modules/Internal/Http/Controllers/Api/OrganizationController.php b/Modules/Internal/Http/Controllers/Api/OrganizationController.php index 7c2cbbd1..e7ead6b5 100755 --- a/Modules/Internal/Http/Controllers/Api/OrganizationController.php +++ b/Modules/Internal/Http/Controllers/Api/OrganizationController.php @@ -31,6 +31,16 @@ class OrganizationController extends Controller return response()->json(OrganizationResource::collection($organizations)); } + public function organizations() + { + $data = Organization::hospital()->select('id', 'name', 'code')->get(); + + return response()->json([ + 'status' => 'success', + 'data' => OrganizationResource::collection($data) + ]); + } + /** * Show the form for creating a new resource. * @return Renderable diff --git a/Modules/Internal/Http/Controllers/Api/RequestLogController.php b/Modules/Internal/Http/Controllers/Api/RequestLogController.php index d66b3255..0be472cb 100755 --- a/Modules/Internal/Http/Controllers/Api/RequestLogController.php +++ b/Modules/Internal/Http/Controllers/Api/RequestLogController.php @@ -129,7 +129,7 @@ class RequestLogController extends Controller if ($request->member_id){ try { $code = !empty($this->getNextCode($request)) ? $this->getNextCode($request) : null; - + $member = Member::find($request->member_id); $memberValid = false; if ($member){ @@ -349,7 +349,7 @@ class RequestLogController extends Controller if ($request->status_approval){ $requestLog->status_approval = $request->status_approval; $requestLog->approval_nominal_by = auth()->user()->id; - } + } $requestLog->save(); @@ -517,9 +517,7 @@ class RequestLogController extends Controller } else { $requestLog->diagnosis = ''; } - if (!empty($request->status)) { - $requestLog->status_final_log = $status; - } + if (!empty($request->reason)) { $requestLog->reason_final = $request->reason; @@ -529,9 +527,25 @@ class RequestLogController extends Controller $requestLog->type_of_member = $request->type_of_member; } - $requestLog->final_log = 1; - $requestLog->approved_final_log_by = auth()->user()->id; - $requestLog->approved_final_log_at = Carbon::now(); + if (!empty($request->organization_id)){ + $requestLog->organization_id = $request->organization_id; + } + + if(empty($request->edit)) { + if (!empty($request->status)) { + $requestLog->status_final_log = $status; + if($request->status == 'requested') { + $requestLog->final_log = 1; + $requestLog->created_final_by = auth()->user()->id; + $requestLog->created_final_at = date('Y-m-d H:i:s'); + } + if($request->status == 'approved') { + $requestLog->approved_final_log_by = auth()->user()->id; + $requestLog->approved_final_log_at = Carbon::now(); + } + } + } + // if($requestLog->service_code != 'IP'){ // $requestLog->discharge_date = Carbon::now(); // } @@ -1138,8 +1152,8 @@ class RequestLogController extends Controller $organization = Organization::where(['id' => $request->organization_id, 'type' => 'hospital'])->first('code'); $provideCode = $organization ? $organization->code : ''; $member = Member::with(['currentCorporate','currentPolicy' ])->where(['id' => $request->member_id])->first(); - - + + $data = [ 'source' => $source, 'provideCode' => $provideCode, @@ -1148,7 +1162,7 @@ class RequestLogController extends Controller 'member_code' => $member->member_id, ]; - + $last_numeric_code = RequestLog::select(DB::raw('MAX(CAST(SUBSTRING_INDEX(code, ".", -1) AS SIGNED)) as max_numeric_code')) ->whereRaw('SUBSTRING_INDEX(code, ".", -1) REGEXP "^[0-9]+$"') @@ -1307,7 +1321,7 @@ class RequestLogController extends Controller { // Ambil data file dari database $file = File::where('path', $request->path)->first(); - + // Tentukan disk berdasarkan source $disk = $file->source === 's3' ? 's3' : 'local'; @@ -1317,7 +1331,7 @@ class RequestLogController extends Controller // Hapus file dari storage (cek dulu ada atau tidak) if (Storage::disk($disk)->exists($path)) { Storage::disk($disk)->delete($path); - + // Update status file di DB (soft delete + reason) $file->update([ 'deleted_at' => Carbon::now(), @@ -1355,5 +1369,5 @@ class RequestLogController extends Controller phpinfo(); } - + } diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index e0a613a0..48d8f406 100755 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -56,6 +56,7 @@ use Modules\Internal\Http\Controllers\ClaimEncounterController; use Modules\Linksehat\Http\Controllers\Api\AutocompleteController; use Modules\HospitalPortal\Http\Controllers\Api\MemberController as MemberControllerHospitalPortal; use Modules\HospitalPortal\Http\Controllers\Api\RequestLogController as RequestLogControllerHospitalPortal; +use Modules\Primaya\Http\Controllers\Api\MasterController; @@ -397,6 +398,8 @@ Route::prefix('internal')->group(function () { Route::get('search-organizations', [OrganizationController::class, 'searchOrganization']); Route::get('search-specialities', [SpecialityController::class, 'searchSpeciality']); Route::resource('organizations', OrganizationController::class); + Route::get('organizations', [MasterController::class, 'organizations']); + Route::resource('appointments', AppointmentController::class); Route::get('live-chat/export', [LivechatController::class, 'export']); Route::resource('live-chat', LivechatController::class); diff --git a/Modules/Internal/Services/CorporateService.php b/Modules/Internal/Services/CorporateService.php index 497cbd15..11444721 100755 --- a/Modules/Internal/Services/CorporateService.php +++ b/Modules/Internal/Services/CorporateService.php @@ -245,14 +245,13 @@ class CorporateService ->where('corporate_plan_id', $benefit_data['plan_code']) ->first(); $benefit_data['plan_code'] = $plan->id; - $benefit = Benefit::updateOrCreate([ + $benefit = Benefit::firstOrCreate([ 'code' => $benefit_data['code'], 'service_code' => $plan->service_code, ], [ - 'code' => $benefit_data['code'], - 'service_code' => $plan->service_code, - 'description' => $benefit_data['description'], + 'description' => $benefit_data['description'], // hanya initial ]); + $corporateBenefit = $corporate->corporateBenefits()->updateOrCreate([ 'benefit_id' => $benefit->id, 'plan_id' => $plan->id, diff --git a/Modules/Internal/Transformers/RequestLogShowResource.php b/Modules/Internal/Transformers/RequestLogShowResource.php index 0627386a..14b42009 100755 --- a/Modules/Internal/Transformers/RequestLogShowResource.php +++ b/Modules/Internal/Transformers/RequestLogShowResource.php @@ -15,6 +15,7 @@ use App\Models\ClaimRequest; use App\Models\Icd; use App\Models\Speciality; use App\Helpers\Helper; +use App\Models\Corporate; use App\Models\CorporatePolicy; use Illuminate\Http\Resources\Json\JsonResource; @@ -135,6 +136,8 @@ class RequestLogShowResource extends JsonResource } else { $dppj = '-'; } + //cek untuk view omt non omt + $code_corporate = Corporate::where('id', $corporateId)->first(); $data = [ 'id' => $requestLog['id'], 'code' => $requestLog['code'], @@ -174,6 +177,7 @@ class RequestLogShowResource extends JsonResource 'medicine' => $medicineData, 'files' => $requestLog['files'], 'provider' => $providerName, + 'organization_id' => $requestLog['organization_id'], 'no_identitas' => $requestLog['member']['nric'], 'keterangan' => $requestLog['keterangan'], 'hak_kamar_pasien' => $requestLog['hak_kamar_pasien'], @@ -185,7 +189,7 @@ class RequestLogShowResource extends JsonResource 'diagnosis' => $icd, 'url_approval' => env('LMS_WEB_URL') . '/custormer-service/final-log/detail/'.$requestLog['id'] . '/' . auth()->user()->id, 'is_reversal' => $isReversal, // untuk penjagaan, jika true tidak bisa di edit/hapus lagi - + 'view_type_member' => $code_corporate->code == 'VALEIND' ? true : false, ]; diff --git a/Modules/Primaya/Http/Controllers/Api/MasterController.php b/Modules/Primaya/Http/Controllers/Api/MasterController.php index 62656569..d1f1b952 100644 --- a/Modules/Primaya/Http/Controllers/Api/MasterController.php +++ b/Modules/Primaya/Http/Controllers/Api/MasterController.php @@ -22,6 +22,7 @@ use App\Models\ClaimRequest; use App\Models\CorporateBenefit; use App\Models\RequestLogBenefit; use App\Models\Speciality; +use Modules\Internal\Transformers\OrganizationResource; class MasterController extends Controller { @@ -53,11 +54,11 @@ class MasterController extends Controller public function organizations() { - $data = Organization::select('id', 'name', 'code')->get(); + $data = Organization::hospital()->select('id', 'name', 'code')->get(); return response()->json([ 'status' => 'success', - 'data' => $data + 'data' => OrganizationResource::collection($data) ]); } } diff --git a/Modules/Primaya/Http/Controllers/Api/MemberController.php b/Modules/Primaya/Http/Controllers/Api/MemberController.php index 6cef0400..798a0aa0 100644 --- a/Modules/Primaya/Http/Controllers/Api/MemberController.php +++ b/Modules/Primaya/Http/Controllers/Api/MemberController.php @@ -48,6 +48,10 @@ class MemberController extends Controller ->select( 'members.id', 'members.name', + 'persons.phone', + 'persons.email as email2', + 'persons.gender as gender2', + 'persons.marital_status', 'members.member_id', 'member_policies.policy_id', 'persons.nik', diff --git a/Modules/Primaya/Http/Controllers/Api/RequestLogController.php b/Modules/Primaya/Http/Controllers/Api/RequestLogController.php index cd2850b0..caff914b 100644 --- a/Modules/Primaya/Http/Controllers/Api/RequestLogController.php +++ b/Modules/Primaya/Http/Controllers/Api/RequestLogController.php @@ -37,6 +37,8 @@ class RequestLogController extends Controller 'organization_name' => !empty($request->organization_name) ? $request->organization_name : null, 'address_provider' => !empty($request->address_provider) ? $request->address_provider : null, 'submission_date' => $request->submission_date, + 'approved_at' => $request->approved_at, + 'approved_final_log_at' => $request->approved_final_log_at, 'discharge_date' => $request->discharge_date, 'corporate_id_partner' => !empty($request->corporate_id_partner) ? $request->corporate_id_partner : [], 'specialities_id' => $request->specialities_id, @@ -46,6 +48,8 @@ class RequestLogController extends Controller 'member_id' => 'required', 'service_code' => 'required', 'submission_date' => 'required', + 'approved_at' => 'required', + 'approved_final_log_at' => 'required', 'discharge_date' => 'required', 'specialities_id' => 'required', 'dppj' => 'required', @@ -53,6 +57,8 @@ class RequestLogController extends Controller 'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']), 'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']), 'submission_date.required' => trans('Validation.required',['attribute' => 'Submission Date']), + 'approved_at.required' => trans('Validation.required',['attribute' => 'Submission Date']), + 'approved_final_log_at.required' => trans('Validation.required',['attribute' => 'Submission Date']), 'discharge_date.required' => trans('Validation.required',['attribute' => 'Discharge Date']), 'specialities_id.required' => trans('Validation.required',['attribute' => 'Specialities']), 'dppj.required' => trans('Validation.required',['attribute' => 'DPJP']), @@ -64,6 +70,8 @@ class RequestLogController extends Controller 'member_id' => 'required', 'service_code' => 'required', 'submission_date' => 'required', + 'approved_at' => 'required', + 'approved_final_log_at' => 'required', 'discharge_date' => 'required', 'specialities_id' => 'required', 'dppj' => 'required', @@ -72,6 +80,8 @@ class RequestLogController extends Controller 'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']), 'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']), 'submission_date.required' => trans('Validation.required',['attribute' => 'Submission Date']), + 'approved_at.required' => trans('Validation.required',['attribute' => 'Approved At Date']), + 'approved_final_log_at.required' => trans('Validation.required',['attribute' => 'Approved Final Log At Date']), 'discharge_date.required' => trans('Validation.required',['attribute' => 'Discharge Date']), 'specialities_id.required' => trans('Validation.required',['attribute' => 'Specialities']), 'dppj.required' => trans('Validation.required',['attribute' => 'DPJP']), @@ -150,13 +160,16 @@ class RequestLogController extends Controller 'status' => 'approved', 'status_final_log' => 'approved', 'final_log' => 1, + 'approved_at' => $request->approved_at ?? now(), + 'approved_final_log_at' => $request->approved_final_log_at ?? now(), 'payment_type' => 'cashless', 'service_code' => $request->service_code, 'policy_id' => $member->currentPolicy->id ?? null, 'organization_id' => $request->organization_id ?? 0, 'source' => $request->source, 'specialities_id' => $request->specialities_id, - 'dppj' => $request->dppj + 'dppj' => $request->dppj, + 'log_type' => $request->type ?? 'final' ]; // SIMPAN LOG @@ -256,6 +269,8 @@ class RequestLogController extends Controller 'organization_name' => !empty($request->organization_name) ? $request->organization_name : null, 'address_provider' => !empty($request->address_provider) ? $request->address_provider : null, 'submission_date' => $request->submission_date, + 'approved_at' => $request->approved_at, + 'approved_final_log_at' => $request->approved_final_log_at, 'corporate_id_partner' => !empty($request->corporate_id_partner) ? $request->corporate_id_partner : [], 'specialities_id' => $request->specialities_id, 'dppj' => $request->dppj @@ -264,12 +279,16 @@ class RequestLogController extends Controller 'member_id' => 'required', 'service_code' => 'required', 'submission_date' => 'required', + 'approved_at' => 'required', + 'approved_final_log_at' => 'required', 'specialities_id' => 'required', 'dppj' => 'required', ], [ 'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']), 'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']), 'submission_date.required' => trans('Validation.required',['attribute' => 'Submission Date']), + 'approved_at.required' => trans('Validation.required',['attribute' => 'Approved At Date']), + 'approved_final_log_at.required' => trans('Validation.required',['attribute' => 'Approved Final Log At Date']), 'specialities_id.required' => trans('Validation.required',['attribute' => 'Specialities']), 'dppj.required' => trans('Validation.required',['attribute' => 'DPJP']), ]); @@ -280,6 +299,8 @@ class RequestLogController extends Controller 'member_id' => 'required', 'service_code' => 'required', 'submission_date' => 'required', + 'approved_at' => 'required', + 'approved_final_log_at' => 'required', 'specialities_id' => 'required', 'dppj' => 'required', ], [ @@ -287,6 +308,8 @@ class RequestLogController extends Controller 'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']), 'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']), 'submission_date.required' => trans('Validation.required',['attribute' => 'Submission Date']), + 'approved_at.required' => trans('Validation.required',['attribute' => 'Submission Date']), + 'approved_final_log_at.required' => trans('Validation.required',['attribute' => 'Submission Date']), 'specialities_id.required' => trans('Validation.required',['attribute' => 'Specialities']), 'dppj.required' => trans('Validation.required',['attribute' => 'DPJP']), ]); @@ -369,6 +392,8 @@ class RequestLogController extends Controller 'specialities_id' => $request->specialities_id, 'dppj' => $request->dppj, 'approved_at' => $request->approved_at ?? now(), + 'approved_final_log_at' => $request->approved_final_log_at ?? now(), + 'log_type' => $request->type ?? 'reference' ]; // SIMPAN LOG diff --git a/app/Console/Commands/SyncLogTypeFromTelemedicine.php b/app/Console/Commands/SyncLogTypeFromTelemedicine.php new file mode 100644 index 00000000..f6d08fa8 --- /dev/null +++ b/app/Console/Commands/SyncLogTypeFromTelemedicine.php @@ -0,0 +1,126 @@ +option('dry-run'); + + if ($isDryRun) { + $this->info('🔍 DRY RUN MODE - No database changes will be made'); + } + + $this->info('Starting sync log_type from telemedicine...'); + + // Get telemedicine DB config + $telemedicineDb = config('database.connections.telemedicine'); + + if (!$telemedicineDb) { + $this->error('Telemedicine database connection not configured!'); + return Command::FAILURE; + } + + // Query prime_logs from telemedicine with log_code + $primeLogs = DB::connection('telemedicine') + ->table('prime_logs') + ->whereNotNull('log_code') + ->where('log_code', '!=', '') + ->where('status', 'success') + ->select('log_code', 'type') + ->get(); + + if ($primeLogs->isEmpty()) { + $this->warn('No prime_logs found with log_code'); + return Command::SUCCESS; + } + + $this->info("Found {$primeLogs->count()} prime_logs records"); + + $updated = 0; + $skipped = 0; + $notFound = 0; + + $bar = $this->output->createProgressBar($primeLogs->count()); + $bar->start(); + + foreach ($primeLogs as $primeLog) { + // Find matching request_log by code + $requestLog = DB::table('request_logs') + ->where('code', $primeLog->log_code) + ->whereNull('deleted_at') + ->first(); + + if (!$requestLog) { + $notFound++; + $bar->advance(); + continue; + } + + // Skip if log_type already set correctly + if ($requestLog->log_type === $primeLog->type) { + $skipped++; + $bar->advance(); + continue; + } + + if (!$isDryRun) { + // Update log_type + DB::table('request_logs') + ->where('id', $requestLog->id) + ->update([ + 'log_type' => $primeLog->type, + 'updated_at' => now() + ]); + } + + $updated++; + $bar->advance(); + } + + $bar->finish(); + $this->newLine(2); + + // Summary + $this->info('✅ Sync completed!'); + $this->table( + ['Status', 'Count'], + [ + ['Updated', $updated], + ['Skipped (already correct)', $skipped], + ['Not found in request_logs', $notFound], + ['Total processed', $primeLogs->count()], + ] + ); + + if ($isDryRun) { + $this->warn('⚠️ This was a DRY RUN. Run without --dry-run to apply changes.'); + } + + return Command::SUCCESS; + } +} diff --git a/app/Models/RequestLog.php b/app/Models/RequestLog.php index d415be4f..a0b25c53 100644 --- a/app/Models/RequestLog.php +++ b/app/Models/RequestLog.php @@ -57,6 +57,7 @@ class RequestLog extends Model 'type_of_member', 'nominal', 'approval_nominal_by', + 'log_type', ]; protected $hidden = [ diff --git a/config/database.php b/config/database.php index 2b1a1a86..ad716693 100644 --- a/config/database.php +++ b/config/database.php @@ -83,6 +83,19 @@ return [ ]) : [], ], + 'telemedicine' => [ + 'driver' => 'mysql', + 'host' => env('TELEMEDICINE_DB_HOST', '127.0.0.1'), + 'port' => env('TELEMEDICINE_DB_PORT', '3306'), + 'database' => env('TELEMEDICINE_DB_DATABASE', 'forge'), + 'username' => env('TELEMEDICINE_DB_USERNAME', 'forge'), + 'password' => env('TELEMEDICINE_DB_PASSWORD', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'strict' => false, + ], + 'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DATABASE_URL'), diff --git a/database/migrations/2024_01_03_143801_add_column_to_notifications.php b/database/migrations/2024_01_03_143801_add_column_to_notifications.php index c98d6a3d..602759e2 100644 --- a/database/migrations/2024_01_03_143801_add_column_to_notifications.php +++ b/database/migrations/2024_01_03_143801_add_column_to_notifications.php @@ -14,7 +14,7 @@ return new class extends Migration public function up() { Schema::table('notifications', function (Blueprint $table) { - $table->text('data')->after('notifiable_id')->nullable(); + $table->text('data')->nullable(); }); } diff --git a/database/migrations/2024_08_21_114955_add_unit_to_drugs_table.php b/database/migrations/2024_08_21_114955_add_unit_to_drugs_table.php index 344e5cdf..f15f37e8 100644 --- a/database/migrations/2024_08_21_114955_add_unit_to_drugs_table.php +++ b/database/migrations/2024_08_21_114955_add_unit_to_drugs_table.php @@ -14,7 +14,7 @@ return new class extends Migration public function up() { Schema::table('drugs', function (Blueprint $table) { - $table->string('unit')->nullable()->after('generic_name'); + // $table->string('unit')->nullable()->after('generic_name'); }); } diff --git a/database/migrations/2026_05_04_110554_add_log_type_column_to_request_logs_table.php b/database/migrations/2026_05_04_110554_add_log_type_column_to_request_logs_table.php new file mode 100644 index 00000000..41504927 --- /dev/null +++ b/database/migrations/2026_05_04_110554_add_log_type_column_to_request_logs_table.php @@ -0,0 +1,36 @@ +enum('log_type', ['reference', 'prescription', 'consultation'])->after('dppj')->nullable()->comment('Type of LOG: reference, prescription, or consultation'); + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + if(Schema::hasColumn('request_logs', 'log_type')) { + Schema::table('request_logs', function (Blueprint $table) { + $table->dropColumn('log_type'); + }); + } + } +}; diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx index 8b6ce0d5..9aa56ee4 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx @@ -14,7 +14,7 @@ type DialogConfirmationType = { setOpenDialog: any; onSubmit?: void; approve: string; - requestLog: DetailFinalLogType|undefined; + requestLog: DetailFinalLogType|undefined; } export default function DialogConfirmation({requestLog, setOpenDialog, openDialog, approve, onSubmit} : DialogConfirmationType ) { @@ -29,7 +29,7 @@ export default function DialogConfirmation({requestLog, setOpenDialog, openDialo // icdCodes: requestLog?.diagnosis.length ? requestLog.diagnosis.map(diagnosis => ({ value: diagnosis.id, label: diagnosis.name })) : [] icdCodes: requestLog?.diagnosis }); - + const [error, setError] = useState(false); const [icdOptions, setIcdOptions] = useState([ @@ -73,10 +73,10 @@ export default function DialogConfirmation({requestLog, setOpenDialog, openDialo } const handleSubmit = () => { - if (formData.type_of_member == "" && requestLog?.corporate_id == 5) { // corporate vale + if (formData.type_of_member == "" && requestLog?.view_type_member) { // corporate vale setError(true); alert('Silakan pilih Type Of Member sebelum mengirimkan data.'); - } + } else { axios .post(`customer-service/request/final-log`, formData) @@ -121,10 +121,12 @@ export default function DialogConfirmation({requestLog, setOpenDialog, openDialo Member ID {requestLog?.member_id} - - Member Of Type - {requestLog?.type_of_member} - + {requestLog?.view_type_member ? ( + + Member Of Type + {requestLog?.type_of_member} + + ):('')} Policy Number {requestLog?.policy_number} @@ -189,24 +191,26 @@ export default function DialogConfirmation({requestLog, setOpenDialog, openDialo )} /> - - Type Of Member* - - + {requestLog?.view_type_member ? ( + + Type Of Member + + + ):('')} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditFinalLOG.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditFinalLOG.tsx index 6d371ee0..25a3bde1 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditFinalLOG.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditFinalLOG.tsx @@ -14,7 +14,7 @@ type DialogConfirmationType = { openDialog: boolean; setOpenDialog: any; onSubmit?: void; - requestLog: DetailFinalLogType|undefined; + requestLog: DetailFinalLogType|undefined; } export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialog, onSubmit} : DialogConfirmationType ) { @@ -28,11 +28,14 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo catatan: requestLog?.catatan, icdCodes: requestLog?.diagnosis, reason: requestLog?.reason, - type_of_member: requestLog?.type_of_member + type_of_member: requestLog?.type_of_member, + organization_id: requestLog?.organization_id || 0, + edit: true + }); const [error, setError] = useState(false); - + const [icdOptions, setIcdOptions] = useState([ { value: '-', label: '-' } ]); @@ -48,9 +51,9 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo .catch((error) => { console.error('Error fetching ICD options:', error); }); - + }, []); // useEffect dijalankan hanya sekali saat komponen dimount - + useEffect(() => { setFormData({ discharge_date: requestLog?.discharge_date|| '', @@ -61,7 +64,11 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo icdCodes: requestLog?.diagnosis|| [], reason: requestLog?.reason|| '', type_of_member: requestLog?.type_of_member|| '', + organization_id: requestLog?.organization_id || 0, + edit: true + }); + setIdProvider(requestLog?.organization_id || 0); }, [requestLog]); @@ -93,13 +100,13 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo console.error('Error fetching ICD options:', error); }); } - + const handleSubmit = () => { - if (formData.type_of_member == "" && requestLog?.corporate_id == 5) { + if (formData.type_of_member == "" && requestLog?.view_type_member) { setError(true); alert('Silakan pilih Type Of Member sebelum mengirimkan data.'); - } + } else if (isReasonSelected && formData.reason !== '') { axios .post(`customer-service/request/final-log`, formData) @@ -117,7 +124,7 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo alert('Silakan pilih alasan sebelum mengirimkan data.'); } } - + const style1 = { color: '#919EAB', width: '30%' @@ -140,12 +147,15 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo invoice_no: requestLog?.invoice_no ?? '', catatan: requestLog?.catatan ?? '', icdCodes: requestLog?.diagnosis ?? [], - reason: requestLog?.reason ?? '', + reason: requestLog?.reason ?? '', type_of_member: requestLog?.type_of_member ?? '', + organization_id: requestLog?.organization_id || 0, + edit: true + }); }; const [isReasonSelected, setIsReasonSelected] = useState(true); - + const handleCloseDialog = () => { setOpenDialog(false); resetForm(); @@ -156,11 +166,33 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo { value: 'endorsement', label: 'Endorsement' }, { value: 'renewal', label: 'Renewal' }, { value: 'wrong_setting', label: 'Wrong Setting' }, + { value: 'approval', label: 'Approval' }, // Add more options as needed ]; // console.log(formData.type_of_member) + const [providers, setProviders] = useState([]); + const [idProvider, setIdProvider] = useState(0); + + useEffect(() => { + axios + .get('/organizations') + .then((res) => { + setProviders(res.data.data || []); + }) + .catch((err) => console.error(err)); + }, []); + + useEffect(() => { + + if (requestLog?.organization_id) { + console.log(requestLog?.organization_id); + setIdProvider(requestLog.organization_id); + console.log(idProvider); + } + }, [requestLog]); + const getContent = () => ( Are you sure to edit this final log ? @@ -193,6 +225,26 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo + + + Provider + + + option.name?.trim() || '-'} + value={providers.find((item) => item.id == idProvider) || null} + onChange={(event, newValue) => { + const id = newValue?.id || 0; + setIdProvider(id); + handleChange('organization_id', id); + }} + renderInput={(params) => ( + + )} + fullWidth + /> + Invoice Provider handleChange('billing_no', e.target.value)} /> - - Type Of Member* - - + {requestLog?.view_type_member ? ( + + Type Of Member + + + ):('')} Discharge Date (format(new Date(), "yyyy MMM d HH:mm:ss")); - const [serviceOptions, setServiceOptions] = useState([ - { value: '-', label: '-' } -]); -const [specialisOptions, setSpecialisOptions] = useState([ - { value: '-', label: '-' } -]); -useEffect(() => { - axios.get('service-member/'+1) - .then((response) => { - setServiceOptions(response.data); - }).catch((error) => { - console.error('Error fetching ICD options:', error); - }); +// const [dischargeDate, setDischargeDate] = useState(format(new Date(), "yyyy MMM d HH:mm:ss")); +const [dischargeDate, setDischargeDate] = useState(null) - axios.get('specialis') - .then((response) => { - setSpecialisOptions(response.data); - }).catch((error) => { - console.error('Error fetching ICD options:', error); - }); - }, []); +// const [serviceOptions, setServiceOptions] = useState([ +// { value: '-', label: '-' } +// ]); +// const [specialisOptions, setSpecialisOptions] = useState([ +// { value: '-', label: '-' } +// ]); + +const [serviceOptions, setServiceOptions] = useState< +{ value: string; label: string }[] +>([]) + +const [specialisOptions, setSpecialisOptions] = useState< +{ value: number; label: string }[] +>([]) const [serviceCode, setServiceCode] = useState(""); -const [idSpecialities, setIdSpecialities] = useState(""); +const [idSpecialities, setIdSpecialities] = useState(null) + const [inputDppj, setInputDppj] = useState(""); +const [requestLog, setRequestLog] = useState(); function submitRequestFinalLog() { if(dischargeDate == '') { @@ -127,7 +126,7 @@ function submitRequestFinalLog() { //cek dpjp if(!inputDppj) { - enqueueSnackbar('DPPJ', { variant: 'warning' }); + enqueueSnackbar('DPJP', { variant: 'warning' }); return false; } setSubmitLoading(true); @@ -136,10 +135,11 @@ function submitRequestFinalLog() { // result_files: fileHasilPenunjangs, // diagnosa_files: fileDiagnosas, // kondisi_files: fileKondisis, + request_logs_id: requestLog?.id, discharge_date: fPostFormat(dischargeDate, 'yyyy-MM-dd HH:mm:ss'), service_code: serviceCode, spescialis_id: idSpecialities, - dppj: inputDppj, + dppj: inputDppj }); axios .post('/request-final-log', formData) @@ -163,7 +163,7 @@ function submitRequestFinalLog() { const navigate = useNavigate(); const { themeStretch } = useSettings(); - const [requestLog, setRequestLog] = useState(); + const [isReversal, setIsReversal] = useState(false); const [submitLoading, setSubmitLoading] = useState(false); @@ -199,6 +199,24 @@ function submitRequestFinalLog() { }); } + useEffect(() => { + if (!requestLog?.id_member) return + axios.get('service-member/'+ (requestLog?.id_member ?? null)) + .then((response) => { + setServiceOptions(response.data); + }).catch((error) => { + console.error('Error fetching ICD options:', error); + }); + + axios.get('specialis') + .then((response) => { + setSpecialisOptions(response.data); + }).catch((error) => { + console.error('Error fetching ICD options:', error); + }); + + }, [requestLog?.id_member]); + const updateApproval = async () => { setSubmitLoading(true); axios @@ -335,6 +353,40 @@ function submitRequestFinalLog() { ); }; + useEffect(() => { + if (requestLog?.discharge_date) { + setDischargeDate( + parse( + requestLog.discharge_date, + 'yyyy-MM-dd HH:mm:ss', + new Date() + ) + ) + } + }, [requestLog?.discharge_date]) + useEffect(() => { + if (!requestLog) return + setServiceCode(requestLog.service_code ?? '') + setIdSpecialities(requestLog.specialitiesID ?? null) + setInputDppj(requestLog.dppj ?? '') + }, [requestLog]) + const selectedService = useMemo( + () => + serviceOptions.find( + (o) => String(o.value) === String(serviceCode) + ) || null, + [serviceOptions, serviceCode] + ) + console.log(serviceOptions); + console.log(serviceCode); + const selectedSpecialis = useMemo( + () => + specialisOptions.find( + (o) => Number(o.value) === Number(idSpecialities) + ) || null, + [specialisOptions, idSpecialities] + ) + return ( @@ -352,7 +404,7 @@ function submitRequestFinalLog() { Detail - {requestLog?.status_final_log != 'requested' ? ( + {requestLog?.status_final_log != 'approved' ? ( Member ID {requestLog?.member_id} - - Type Of Member - {requestLog?.type_of_member} - + {requestLog?.view_type_member ? ( + + Type Of Member + {requestLog?.type_of_member} + + ):('')} Policy Number {requestLog?.policy_number} @@ -440,7 +494,7 @@ function submitRequestFinalLog() { {requestLog?.specialities_id ? requestLog?.specialities_id : '-'} - DPPJ + DPJP {requestLog?.dppj ? requestLog?.dppj : '-'} @@ -529,7 +583,7 @@ function submitRequestFinalLog() { {/* Kolom Service Type */} Tipe Service - option.label || ""} @@ -540,7 +594,17 @@ function submitRequestFinalLog() { renderInput={(params) => ( )} - /> + /> */} + o.label} + isOptionEqualToValue={(o, v) => o.value === v.value} + onChange={(_, v) => setServiceCode(v?.value ?? '')} + renderInput={(params) => ( + + )} + /> @@ -549,7 +613,7 @@ function submitRequestFinalLog() { Spesialis - option.label || ''} @@ -560,6 +624,16 @@ function submitRequestFinalLog() { renderInput={(params) => ( )} + /> */} + o.label} + isOptionEqualToValue={(o, v) => o.value === v.value} + onChange={(_, v) => setIdSpecialities(v?.value ?? null)} + renderInput={(params) => ( + + )} /> @@ -567,12 +641,12 @@ function submitRequestFinalLog() { - DPPJ + DPJP { setInputDppj(event.target.value); }} @@ -1203,7 +1277,7 @@ function submitRequestFinalLog() { {requestLog?.status_final_log == 'requested' ? ( - + <>
) } - + ); diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Components/DialogEditInformation.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Components/DialogEditInformation.tsx index b0b02131..e545a52e 100644 --- a/frontend/dashboard/src/pages/CustomerService/Request/Components/DialogEditInformation.tsx +++ b/frontend/dashboard/src/pages/CustomerService/Request/Components/DialogEditInformation.tsx @@ -17,7 +17,7 @@ type DialogConfirmationType = { openDialog: boolean; setOpenDialog: any; onSubmit?: void; - requestLog: DetailRequestLogType|undefined; + requestLog: DetailRequestLogType|undefined; } export default function DialogEditInformation({requestLog, setOpenDialog, openDialog, onSubmit} : DialogConfirmationType ) { @@ -34,7 +34,7 @@ export default function DialogEditInformation({requestLog, setOpenDialog, openDi const [error, setError] = useState(false); const [isReasonSelected, setIsReasonSelected] = useState(true); - + useEffect(() => { // Update formData setiap kali requestLog berubah setFormData({ @@ -65,10 +65,10 @@ export default function DialogEditInformation({requestLog, setOpenDialog, openDi })); handleSubmit(); }; - + const handleSubmit = () => { - if (formData.type_of_member == "" && requestLog?.corporate_id == 5) { + if (formData.type_of_member == "" && requestLog?.view_type_member) { setError(true); alert('Silakan pilih Type Of Member sebelum mengirimkan data.'); } else if (isReasonSelected && formData.reason !== '') { @@ -88,7 +88,7 @@ export default function DialogEditInformation({requestLog, setOpenDialog, openDi alert('Silakan pilih alasan sebelum mengirimkan data.'); } - + } const style1 = { @@ -114,7 +114,7 @@ export default function DialogEditInformation({requestLog, setOpenDialog, openDi penempatan_kamar: requestLog?.penempatan_kamar ?? '', reason: requestLog?.reason ?? '', type_of_member: requestLog?.type_of_member ?? '' - + }); }; @@ -201,24 +201,26 @@ export default function DialogEditInformation({requestLog, setOpenDialog, openDi onChange={(e) => handleChange('penempatan_kamar', e.target.value)} /> - - Type Of Member* - - + {requestLog?.view_type_member ? ( + + Type Of Member + + + ):('')} Reason* Member ID {requestLog?.member_id} - - Type Of Member - {requestLog?.type_of_member} - + {requestLog?.view_type_member ? ( + + Type Of Member + {requestLog?.type_of_member} + + ):('')} Policy Number {requestLog?.policy_number} @@ -162,7 +164,7 @@ export default function Detail() { {requestLog?.specialities_id ? requestLog?.specialities_id : '-'} - DPPJ + DPJP {requestLog?.dppj ? requestLog?.dppj : '-'} @@ -192,7 +194,7 @@ export default function Detail() { {requestLog?.status == 'requested' || requestLog?.status == 'canceled' || requestLog?.status == 'waiting_billing' ? ( - + <>
@@ -1330,7 +1348,6 @@ export default function DetailRequestFinalLog() {
) : null} - diff --git a/frontend/hospital-portal/src/sections/dashboard/Model/Types.ts b/frontend/hospital-portal/src/sections/dashboard/Model/Types.ts index cb9081c1..5efb4c56 100644 --- a/frontend/hospital-portal/src/sections/dashboard/Model/Types.ts +++ b/frontend/hospital-portal/src/sections/dashboard/Model/Types.ts @@ -35,6 +35,12 @@ export type DetailFinalLogType = { id : number, code : string, member_id : string, + view_type_member : any, + organization_id : any, + id_member : string, + service_code : string, + specialitiesID : any, + dppj : any, invoice_no : string, billing_no : string, provider : string, diff --git a/frontend/hospital-portal/src/sections/dashboard/TableListFinalLog.tsx b/frontend/hospital-portal/src/sections/dashboard/TableListFinalLog.tsx index 91f9aeff..65f8ad44 100644 --- a/frontend/hospital-portal/src/sections/dashboard/TableListFinalLog.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/TableListFinalLog.tsx @@ -188,7 +188,7 @@ export default function TableListFinalLog() { // enqueueSnackbar('Mohon isi alasan', { variant: 'warning' }); // return false; // } - axios.post('/submit-claims', { + axios.post('/submit-claims', { selectedRows: selectedRows }) .then((response) => { @@ -202,7 +202,7 @@ export default function TableListFinalLog() { enqueueSnackbar(response.data.meta.message, {variant : "error"}); } getData(); - setSelectedRows([]); + setSelectedRows([]); }) .catch(({response}) => { enqueueSnackbar(response.data.errors ? response.data.errors[0] : (response.data ? response.data.meta.message : 'Opps, Something went Wrong!'), {variant : "error"}) @@ -344,6 +344,12 @@ export default function TableListFinalLog() { label: localeData.txtServiceType, isSort: true, }, + { + id: 'log_type', + align: 'center', + label: 'LOG Type', + isSort: true, + }, { id: 'discharge_date', align: 'center', @@ -365,8 +371,8 @@ export default function TableListFinalLog() { ]; function handleSearchMember(noPolis:any, birthDate:any) { setLoadingClaim(false) - axios.post('/search-member', { - no_polis: noPolis, + axios.post('/search-member', { + no_polis: noPolis, birth_date: birthDate ? fPostFormat(birthDate, 'yyyy-MM-dd') : null, type: 'view' }) @@ -447,6 +453,24 @@ export default function TableListFinalLog() { Pending ), + log_type: + obj.log_type === 'final' ? ( + + ) : obj.log_type === 'prescription' ? ( + + ) : obj.log_type === 'reference' ? ( + + ) : ( + + ), submission_date: