Merge remote-tracking branch 'origin/staging' into origin/production

This commit is contained in:
Server D3 Linksehat
2025-02-24 16:03:57 +07:00
37 changed files with 1299 additions and 250 deletions

View File

@@ -37,27 +37,24 @@ class MemberController extends Controller
else
{
$members = DB::table('members')
->leftJoin('member_policies', 'member_policies.member_id', '=', 'members.member_id')
->leftJoin('persons', 'persons.id', '=', 'members.person_id')
->where('members.member_id', '=', $request->no_polis)
->where('members.birth_date', '=', $request->birth_date)
->whereNull('members.deleted_at') // Mengecek apakah deleted_at adalah NULL
->select(
'members.id',
'members.name',
'members.member_id',
'member_policies.policy_id',
'persons.nik',
'members.email',
'members.birth_date',
'members.gender',
'members.marital_status',
'members.language',
'members.race',
'members.relation_with_principal'
)
->first(); // Mengambil hasil pertama
->leftJoin('member_policies', 'member_policies.member_id','=', 'members.member_id')
->leftJoin('persons', 'persons.id', '=', 'members.person_id')
->where('members.member_id', '=', $request->no_polis)
->where('members.birth_date', '=', $request->birth_date)
->select(
'members.id',
'members.name',
'members.member_id',
'member_policies.policy_id',
'persons.nik',
'members.email',
'members.birth_date',
'members.gender',
'members.marital_status',
'members.language',
'members.race',
'members.relation_with_principal')
->first();
if($members)
{
$res_data['members'] = $members;
@@ -134,6 +131,17 @@ class MemberController extends Controller
$res_data['companies'] = $companies;
// specialities
$specialities = DB::table('specialities')
->select(
'specialities.id',
'specialities.name'
)
->orderBy('specialities.name','asc')
->get();
$res_data['specialities'] = $specialities;
return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200);
}

View File

@@ -36,6 +36,8 @@ class RequestLogController extends Controller
'address_provider' => !empty($request->address_provider) ? $request->address_provider : null,
'submission_date' => $request->submission_date,
'corporate_id_partner' => !empty($request->corporate_id_partner) ? $request->corporate_id_partner : [],
'specialities_id' => $request->specialities_id,
'dppj' => $request->dppj
];
$validator = Validator::make($request->all(), [
'member_id' => 'required',
@@ -240,6 +242,8 @@ class RequestLogController extends Controller
'request_logs.submission_date',
'request_logs.approved_at')
->paginate($limit);
return response()->json(Helper::paginateResources($results));
}
@@ -338,12 +342,14 @@ class RequestLogController extends Controller
$validator = Validator::make($request->all(), [
'request_logs_id' => 'required',
'discharge_date' => 'required',
'service_code' => 'required',
'result_files.*' => 'sometimes|file|max:10000',
'diagnosa_files.*' => 'sometimes|file|max:10000',
'kondisi_files.*' => 'sometimes|file|max:10000',
], [
'request_logs_id.required' => trans('Validation.required',['attribute' => 'Request Logs ID']),
'discharge_date.required' => trans('Validation.required',['attribute' => 'Discharge Date']),
'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']),
'result_files.*.max' => trans('Validation.max.file', ['attribute' => 'Result Files', 'max' => '10 MB' ]),
'diagnosa_files.*.max' => trans('Validation.max.file', ['attribute' => 'Diagnosis Files', 'max' => '10 MB' ]),
'kondisi_files.*.max' => trans('Validation.max.file', ['attribute' => 'Condition Files', 'max' => '10 MB' ]),
@@ -361,6 +367,7 @@ class RequestLogController extends Controller
->update([
'status_final_log' => 'requested',
'final_log' => 1,
'service_code' =>$request->service_code,
'discharge_date' => $request->discharge_date,
'created_final_by'=> auth()->user()->id,
'created_final_at'=> date('Y-m-d H:i:s'),

View File

@@ -11,6 +11,7 @@ use Modules\HospitalPortal\Http\Controllers\ApotekController;
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;
/*
|--------------------------------------------------------------------------
@@ -34,7 +35,8 @@ Route::prefix('v1')->group(function() {
Route::post('forget-password', [AuthController::class, 'forgetPassword']);
Route::post('verify-email', [AuthController::class, 'verifyEmail'])->name('verify-email');
Route::post('verify-code', [AuthController::class, 'verifCode']);
Route::get('service-member/{id}', [AutocompleteController::class, 'serviceCode']);
Route::middleware('auth:sanctum')->group(function () {
@@ -92,5 +94,7 @@ Route::prefix('v1')->group(function() {
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']);
});
});
});

View File

@@ -13,6 +13,7 @@ use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\File as Files;
use Modules\Internal\Transformers\DailyMonitoringResource;
use App\Models\File;
use Carbon\Carbon;
/**
@@ -38,25 +39,44 @@ class DailyMonitoringController extends Controller
public function GetMemberList(Request $request)
{
$memberList = DB::table('request_logs')
->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
->leftJoin('organizations', 'organizations.id', '=', 'request_logs.organization_id')
->select('members.member_id','members.name','members.members_effective_date AS startdate','members.members_expire_date AS enddate', 'request_logs.submission_date as addmision_date', 'organizations.name as provider', 'request_logs.organization_id' )
->where('request_logs.service_code', 'IP')
->where('request_logs.deleted_at', null)
->when($request->search, function ($q, $search) {
$q->where(function ($subQ) use ($search) {
$subQ->where('members.member_id', 'LIKE', "%".$search."%");
$subQ->orWhere('members.name','LIKE',"%".$search."%");
});
})
// ->where('request_logs.status_final_log', 'approved')
->groupBy('request_logs.member_id', 'request_logs.organization_id')
->orderBy('request_logs.created_at', 'desc')
// ->get()
->paginate();
$startDate = $request->start_date ? Carbon::parse($request->start_date) : Carbon::today();
$endDate = $request->end_date ? Carbon::parse($request->end_date)->addDay() : Carbon::today()->addDay();
$memberList = DB::table('request_log_daily_monitorings')
->leftJoin('request_logs', 'request_log_daily_monitorings.request_log_id', '=', 'request_logs.id')
->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
->leftJoin('organizations', 'organizations.id', '=', 'request_logs.organization_id')
->select(
'members.member_id',
'members.name',
'members.birth_date',
'request_logs.type_of_member as member_type',
'members.members_effective_date AS startdate',
'members.members_expire_date AS enddate',
'request_logs.submission_date as addmision_date',
'organizations.name as provider',
'request_logs.organization_id',
'request_logs.code',
// Using a subquery to fetch medical_plan
DB::raw('(SELECT plan FROM request_log_medical_plan rdm WHERE rdm.request_log_daily_monitoring_id = request_log_daily_monitorings.id AND type = 1 LIMIT 1) as medical_plan'),
DB::raw('(SELECT plan FROM request_log_medical_plan rdm WHERE rdm.request_log_daily_monitoring_id = request_log_daily_monitorings.id AND type = 2 LIMIT 1) as non_medical_plan'),
'request_log_daily_monitorings.*'
)
->whereNull('request_logs.deleted_at') // Use whereNull() for checking NULL
->when($request->search, function ($q, $search) {
$q->where(function ($subQ) use ($search) {
$subQ->where('members.member_id', 'LIKE', "%{$search}%");
$subQ->orWhere('members.name', 'LIKE', "%{$search}%");
});
})
->when($startDate, function ($q) use ($startDate) {
$q->where('request_log_daily_monitorings.submission_date', '>=', $startDate);
})
->when($endDate, function ($q) use ($endDate) {
$q->where('request_log_daily_monitorings.submission_date', '<=', Carbon::parse($endDate)->addDay());
})
->orderBy('request_logs.created_at', 'desc')
->paginate();
return Helper::paginateResources(DailyMonitoringResource::collection($memberList));
}
@@ -125,29 +145,34 @@ class DailyMonitoringController extends Controller
{
$detail = RequestDailyMonitoring::where('id', $id)
->orderBy("created_at", "desc")
->first();
->orderBy("created_at", "desc")
->first();
if ($detail) {
// Ubah menjadi array agar bisa dimodifikasi
$detailArray = $detail->toArray();
// Ubah nama key dari request_log_id menjadi log_id
$detailArray['log_code'] = $detailArray['request_log_id'];
unset($detailArray['request_log_id']);
} else {
$detailArray = null;
}
return response()->json([
'error' => false,
'message' => "success",
'data' => $detail,
],200);
'data' => $detailArray,
], 200);
}
public function UpdateDetailMonitoringbyID(Request $request)
{
// validation rule
$validator = Validator::make($request->all(),[
'subject' => 'required',
'submission_date' => 'required',
'body_temperature' => 'required',
'sistole' => 'required',
'diastole' => 'required',
'respiration_rate' => 'required',
'analysis' => 'required',
'medical_plan' => 'required',
'log_code' => 'required',
'reason' => 'required',
'non_medikamentosa_plan' => 'required',
],$this->messages());
// validation error
@@ -161,6 +186,7 @@ class DailyMonitoringController extends Controller
// insert claim daily monitoring
$db_response = RequestDailyMonitoring::where('id', $request->id)
->update([
'request_log_id' => $request->log_code,
'submission_date' => $request->submission_date,
'subject' => $request->subject,
'object' => $request->objective,
@@ -172,6 +198,13 @@ class DailyMonitoringController extends Controller
'lab_date' => $request->lab_date,
'provider' => $request->provider,
'examination' => $request->examination,
'doctor_1' => $request->doctor_1,
'doctor_2' => $request->doctor_2,
'temp_diagnosis' => $request->temp_diagnosis,
'final_diagnosis' => $request->final_diagnosis,
'approval_pendamping' => $request->approval_pendamping,
'description' => $request->keterangan,
'note' => $request->catatan,
'reason' => $request->reason,
'created_by' => auth()->user()->id,
]);
@@ -620,6 +653,181 @@ class DailyMonitoringController extends Controller
}
}
public function AddListRequestLog(Request $request)
{
// validation rule
$validator = Validator::make($request->all(),[
'log_code' => 'required|exists:request_logs,id',
'subject' => 'required',
'submission_date' => 'required',
'body_temperature' => 'required',
'sistole' => 'required',
'diastole' => 'required',
'respiration_rate' => 'required',
'analysis' => 'required',
'medical_plan' => 'required',
'non_medikamentosa_plan' => 'required',
],$this->messages());
// validation error
if ($validator->fails()) {
return response()->json([
'error' => true,
'message' => $validator->getMessageBag()
],400);
}
// get claim request
$request_log = DB::table('request_logs')
->select('id')
->where('id', $request->log_code)
->first();
DB::beginTransaction();
try {
// insert claim daily monitoring
$db_response = RequestDailyMonitoring::create([
'request_log_id' => $request->log_code,
'submission_date' => $request->submission_date,
'doctor_1' => $request->doctor_1,
'doctor_2' => $request->doctor_2,
'temp_diagnosis' => $request->temp_diagnosis,
'final_diagnosis' => $request->final_diagnosis,
'approval_pendamping' => $request->approval_pendamping,
'description' => $request->keterangan,
'note' => $request->catatan,
'subject' => $request->subject,
'object' => $request->objective,
'sistole' => $request->sistole,
'diastole' => $request->diastole,
'body_temperature' => $request->body_temperature,
'respiration_rate' => $request->respiration_rate,
'analysis' => $request->analysis,
'lab_date' => $request->lab_date,
'provider' => $request->provider,
'examination' => $request->examination,
'created_by' => auth()->user()->id,
]);
// cek medical plan
$num_medical_plan = 0;
foreach ($request->medical_plan as $row) {
if ($row['medical_plan_str']) {
$num_medical_plan++;
}
}
if ($num_medical_plan == 0) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => [
'medical_plan' => ['medical plan harus diisi']
],
'data' => []
],400);
}
// insert medical plan
foreach ($request->medical_plan as $row) {
DB::table('request_log_medical_plan')->insert([
'request_log_daily_monitoring_id' => $db_response->id,
'plan' => $row['medical_plan_str'],
'type' => 1,
'created_at' => date('Y-m-d'),
]);
}
// insert non medical plan
foreach ($request->non_medikamentosa_plan as $row) {
DB::table('request_log_medical_plan')->insert([
'request_log_daily_monitoring_id' => $db_response->id,
'plan' => $row['non_medikamentosa_plan_str'],
'type' => 2,
'created_at' => date('Y-m-d'),
]);
}
// insert file result
if ($request->confirmation_medical_leter){
foreach ($request->confirmation_medical_leter as $file) {
$name = 'labresult-' . uniqid();
$extension= $file->getClientOriginalExtension();
$fileName = $name . '.' . $extension;
$orignalName = $file->getClientOriginalName();
$path = $file->storeAs($this->path_for_store, $fileName);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'confirmation-medical-letter',
'name' => $name,
'original_name' => $orignalName,
'extension' => $extension,
'path' => $path,
]);
}
}
if ($request->medical_action_letter){
foreach ($request->medical_action_letter as $file) {
$name = 'labresult-' . uniqid();
$extension= $file->getClientOriginalExtension();
$fileName = $name . '.' . $extension;
$orignalName = $file->getClientOriginalName();
$path = $file->storeAs($this->path_for_store, $fileName);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'medical-action-letter',
'name' => $name,
'original_name' => $orignalName,
'extension' => $extension,
'path' => $path,
]);
// $file->storeAs($this->path_for_store, $fileName);
}
}
if ($request->result){
foreach ($request->result as $file) {
$name = 'labresult-' . uniqid();
$extension= $file->getClientOriginalExtension();
$orignalName = $file->getClientOriginalName();
$fileName = $name . '.' . $extension;
$path = $file->storeAs($this->path_for_store, $fileName);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'laboratorium-result',
'name' => $name,
'original_name' => $orignalName,
'extension' => $extension,
'path' => $path,
]);
// $file->storeAs($this->path_for_store, $fileName);
}
}
DB::commit();
return response()->json([
'error' => false,
'message' => "success",
'data' => []
],200);
}
catch (Exception $e) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => $e->getMessage(),
'data' => []
],500);
}
}
/**
* Delete Listing Daily Monitoring
*/

View File

@@ -165,6 +165,10 @@ class DrugController extends Controller
[
'name' => $row['name'],
'code' => $row['code'],
'id_setara' => $row['id_setara'],
'code_setara' => $row['code_setara'],
'nama_setara' => $row['nama_setara'],
'multiply_jual' => $row['multiply_jual'],
'generic_name' => $row['generic_name'],
'description' => $row['description'],
'mims_class' => $row['mims_class'],

View File

@@ -150,7 +150,9 @@ class RequestLogController extends Controller
// status: 'approved',
status: 'requested', // di nonaktifkan dulu auto approved
organization_id: $request->organization_id,
source: $request->source
source: $request->source,
specialities_id: $request->specialities_id,
dppj: $request->dppj
);
DB::commit();
@@ -172,7 +174,9 @@ class RequestLogController extends Controller
submissionDate: $request->submission_date,
status: 'requested',
organization_id: $request->organization_id,
source: $request->source
source: $request->source,
specialities_id: $request->specialities_id,
dppj: $request->dppj
);
DB::commit();
@@ -237,6 +241,31 @@ class RequestLogController extends Controller
return Helper::responseJson(data: $manipulatedIcds);
}
public function codeLog(Request $request)
{
$codeLogs = RequestLog::with(['member'])
->when($request->search, function ($q) use ($request) {
$q->where('code', 'LIKE', "%{$request->search}%")
->orWhereHas('member', function ($subQuery) use ($request) {
$subQuery->where('name', 'LIKE', "%{$request->search}%");
});
})
->whereHas('member', function ($subQuery) {
$subQuery->whereNull('deleted_at');
})
->get();
$manipulatedIcds = $codeLogs->map(function ($codeLog) {
return [
'value' => $codeLog->id,
'label' => $codeLog->code . ' - ' . ($codeLog->member->name ?? 'Unknown'),
];
});
return Helper::responseJson(data: $manipulatedIcds);
}
public function hospitals(){
$organizations = Organization::query()
->where([
@@ -490,11 +519,11 @@ class RequestLogController extends Controller
if (!empty($request->reason)) {
$requestLog->reason_final = $request->reason;
}
if (!empty($request->type_of_member)){
$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();

View File

@@ -82,6 +82,7 @@ Route::prefix('internal')->group(function () {
Route::get('diagnosis', [RequestLogController::class, 'diagnosis']);
Route::get('codeLog', [RequestLogController::class, 'codeLog']);
Route::get('drugs', [AutocompleteController::class, 'drugList']);
Route::get('units', [AutocompleteController::class, 'unitList']);
@@ -207,6 +208,7 @@ Route::prefix('internal')->group(function () {
Route::post('detail/update-request', [DailyMonitoringController::class, 'UpdateDetailMonitoringbyID']);
Route::post('detail/{claim_code}/add', [DailyMonitoringController::class, 'AddDetailMonitoringList']);
Route::post('detail/{claim_code}/add-request', [DailyMonitoringController::class, 'AddDetailMonitoringListRequestLog']);
Route::post('add-request', [DailyMonitoringController::class, 'AddListRequestLog']);
Route::post('detail/{claim_code}/update-status', [DailyMonitoringController::class, 'UpdateListRequestLog']);
Route::get('detail/{id}/delete', [DailyMonitoringController::class, 'deleteDetailMonitoringListRequestLog']);
Route::get('detail/{id}/delete-file', [DailyMonitoringController::class, 'deleteFileDetailMonitoringListRequestLog']);

View File

@@ -14,15 +14,29 @@ class DailyMonitoringResource extends JsonResource
*/
public function toArray($request)
{
$data = [
'code' => $this->code,
'id' => $this->id,
'member_id' => $this->member_id,
'member_type' => $this->member_type,
'birth_date' => $this->birth_date,
'name' => $this->name,
'start_date' => $this->startdate,
'end_date' => $this->enddate,
'addmision_date' => $this->addmision_date,
'submission_date' => $this->submission_date,
'provider' => $this->provider,
'organization_id' => $this->organization_id,
'doctor_1' => $this->doctor_1,
'doctor_2' => $this->doctor_2,
'temp_diagnosis' => $this->temp_diagnosis,
'final_diagnosis' => $this->final_diagnosis,
'approval_pendamping' => $this->approval_pendamping,
'status' => $this->status,
'description' => strip_tags($this->description),
'note' => strip_tags($this->note),
'medical_plan' => strip_tags($this->medical_plan),
'non_medical_plan' => strip_tags($this->non_medical_plan),
];
return $data;

View File

@@ -13,6 +13,7 @@ use App\Models\Benefit;
use App\Models\Exclusion;
use App\Models\ClaimRequest;
use App\Models\Icd;
use App\Models\Speciality;
use App\Helpers\Helper;
use App\Models\CorporatePolicy;
use Illuminate\Http\Resources\Json\JsonResource;
@@ -117,12 +118,29 @@ class RequestLogShowResource extends JsonResource
}
$memberUsage = Helper::getUsageMember($corporateId, $requestLog['member']['id'], $benefitData);
// dd($memberLimitUsage);
if(isset($requestLog['specialities_id']))
{
$spesialis = Speciality::query()
->where('id', $requestLog['specialities_id'])
->select('name')
->first();
$name = $spesialis['name'];
} else {
$name = '-';
}
if (isset($requestLog['specialities_id'])){
$dppj = $requestLog['dppj'];
} else {
$dppj = '-';
}
$data = [
'id' => $requestLog['id'],
'code' => $requestLog['code'],
'invoice_no' => $requestLog['invoice_no'],
'billing_no' => $requestLog['billing_no'],
'specialities_id' => $name,
'dppj' => $dppj,
'code' => $requestLog['code'],
'code_claim' => $claimCode,
'member_id' => $requestLog['member']['member_id'],
@@ -161,7 +179,7 @@ class RequestLogShowResource extends JsonResource
'reason' => $requestLog['reason'],
'diagnosis' => $icd,
'is_reversal' => $isReversal, // untuk penjagaan, jika true tidak bisa di edit/hapus lagi
];

View File

@@ -6,6 +6,7 @@ use App\Models\OLDLMS\User;
use App\Models\Icd;
use App\Models\Drug;
use App\Models\Unit;
use App\Models\MemberPlan;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
@@ -180,6 +181,22 @@ class AutocompleteController extends Controller {
return Helper::responseJson(['message' => 'Signa added successfully']);
}
public function serviceCode(Request $request, $id)
{
$plans = MemberPlan::with('plan', 'plan.service')
->where('member_id', $id)
->get();
$manipulatedPlan = $plans->map(function ($plan) {
return [
'value' => optional($plan->plan)->service_code ?? '-',
'label' => optional($plan->plan->service)->name ?? 'Unknown'
];
});
return response()->json($manipulatedPlan);
}
}

View File

@@ -15,6 +15,10 @@ class Drug extends Model
'name',
'generic_name',
'code',
'id_setara',
'code_setara',
'nama_setara',
'multiply_jual',
'description',
'brand_id',
'mims_class',

View File

@@ -16,6 +16,13 @@ class RequestDailyMonitoring extends Model
protected $fillable = [
'request_log_id',
'doctor_1',
'doctor_2',
'temp_diagnosis',
'final_diagnosis',
'approval_pendamping',
'description',
'note',
'subject',
'object',
'submission_date',

View File

@@ -51,6 +51,8 @@ class RequestLog extends Model
'approved_final_log_at',
'created_final_at',
'created_final_by',
'specialities_id',
'dppj',
'type_of_member'
];
@@ -82,7 +84,7 @@ class RequestLog extends Model
"Keterangan IGL" => "keterangan",
"Catatan FGL" => "catatan",
"QC 1" => "status_final_log",
"Ingestion Code" => "ingestion_code",
"Ingestion Code" => "ingestion_code",
"Ingestion Status" => "ingestion_status",
];

View File

@@ -21,14 +21,16 @@ use Str;
class RequestLogService{
public static function storeRequestLog(
$row = null,
$code,
$member,
$paymentType,
$serviceCode,
$submissionDate,
$status, $organization_id = null,
$source
$row = null,
$code,
$member,
$paymentType,
$serviceCode,
$submissionDate,
$status, $organization_id = null,
$source,
$specialities_id,
$dppj
)
{
try {
@@ -55,6 +57,8 @@ class RequestLogService{
'policy_id' => $member->currentPolicy->id ?? null,
'organization_id' => $organization ? $organization->id : 0,
'source' => $source,
'specialities_id' => $specialities_id,
'dppj' => $dppj
];
$requestLog = RequestLog::create($requestLogData);
@@ -109,7 +113,7 @@ class RequestLogService{
DB::commit();
return $claimManagement;
} catch (\Exception $error) {
DB::rollBack();
@@ -168,4 +172,4 @@ class RequestLogService{
}
}
}
}

View File

@@ -0,0 +1,44 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('request_log_daily_monitorings', function (Blueprint $table) {
$table->string('doctor_1')->after('examination')->nullable();
$table->string('doctor_2')->after('doctor_1')->nullable();
$table->string('approval_pendamping')->after('doctor_2')->nullable();
$table->text('description')->after('approval_pendamping')->nullable();
$table->text('note')->after('description')->nullable();
$table->string('temp_diagnosis')->after('note')->nullable();
$table->string('final_diagnosis')->after('temp_diagnosis')->nullable();
$table->string('status')->after('final_diagnosis')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('request_log_daily_monitorings', function (Blueprint $table) {
$table->dropColumn('doctor_1');
$table->dropColumn('doctor_2');
$table->dropColumn('description');
$table->dropColumn('note');
$table->dropColumn('temp_diagnosis');
$table->dropColumn('final_diagnosis');
});
}
};

View File

@@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
if(!Schema::hasColumn('request_logs', 'specialities_id')) {
Schema::table('request_logs', function (Blueprint $table) {
$table->bigInteger('specialities_id')->after('created_final_by')->nullable();
});
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
if(!Schema::hasColumn('request_logs', 'specialities_id')) {
Schema::table('request_logs', function (Blueprint $table) {
$table->dropColumn('specialities_id');
});
}
}
};

View File

@@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
if(!Schema::hasColumn('request_logs', 'dppj')) {
Schema::table('request_logs', function (Blueprint $table) {
$table->string('dppj', '255')->after('specialities_id')->nullable();
});
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
if(!Schema::hasColumn('request_logs', 'dppj')) {
Schema::table('request_logs', function (Blueprint $table) {
$table->dropColumn('dppj');
});
}
}
};

View File

@@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('drugs', function (Blueprint $table) {
$table->string('id_setara')->nullable()->after('code');
$table->string('code_setara')->nullable()->after('id_setara');
$table->string('nama_setara')->nullable()->after('code_setara');
$table->integer('multiply_jual')->nullable()->after('nama_setara');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('drugs', function (Blueprint $table) {
$table->dropColumn('id_setara');
$table->dropColumn('nama_setara');
$table->dropColumn('code_setara ');
$table->dropColumn('multiply_jual');
});
}
};

View File

@@ -3,7 +3,7 @@
* ============================================
*/
import React, { ChangeEvent, useEffect, useRef, useState } from "react";
import { Box, Paper, TableContainer, Table, TableHead, TableRow, TableCell, TableBody, Stack, TextField, Button, Menu, } from "@mui/material";
import { Box, Paper, TableContainer, Table, TableHead, TableRow, TableCell, TableBody, Stack, TextField, Button, Menu, Typography, ButtonGroup, } from "@mui/material";
/**
* Types & Functions
@@ -15,9 +15,18 @@ import DailyMonitoringListRow from "./DailyMonitoringListRow";
import { LaravelPaginatedData, LaravelPaginatedDataDefault } from "@/@types/paginated-data";
import { Grid } from "@mui/material";
import DataTable from '../../../../components/LaravelTable';
import DownloadIcon from '@mui/icons-material/Download';
import CancelIcon from '@mui/icons-material/Cancel';
import UploadIcon from '@mui/icons-material/Upload';
import { MenuItem } from "@mui/material";
import { useSearchParams } from "react-router-dom";
import { useNavigate, useSearchParams } from "react-router-dom";
import axios from "@/utils/axios";
import { DesktopDatePicker, LocalizationProvider } from "@mui/x-date-pickers";
import { AdapterDateFns } from "@mui/x-date-pickers/AdapterDateFns";
import { fDateOnly } from "@/utils/formatTime";
import { LoadingButton } from "@mui/lab";
import { Import } from "@/@types/claims";
import { HeadCell, Order } from '@/@types/table';
export default function DailyMonitoringList() {
const [searchParams, setSearchParams] = useSearchParams();
@@ -34,8 +43,7 @@ export default function DailyMonitoringList() {
fontWeight: 'bold',
};
const [importResult, setImportResult] = useState<Import>(null);
// Load Data
// -------------------
const loadDataTableData = async (appliedFilter: any | null = null) => {
@@ -57,46 +65,156 @@ export default function DailyMonitoringList() {
loadDataTableData(filter);
setSearchParams(filter);
};
/* ------------------------------ handle params ----------------------------- */
const [appliedParams, setAppliedParams] = useState({});
const params = {
searchParams: searchParams,
setSearchParams: setSearchParams,
appliedParams: appliedParams,
setAppliedParams: setAppliedParams,
};
/* ------------------------------ handle order ------------------------------ */
const [order, setOrder] = useState<Order>('desc');
const [orderBy, setOrderBy] = useState('submission_date');
const orders = {
order: order,
setOrder: setOrder,
orderBy: orderBy,
setOrderBy: setOrderBy,
};
/* ------------------------------- handle sort ------------------------------ */
const handleRequestSort = async (event: React.MouseEvent<unknown>, property: string) => {
const isAsc = orders?.orderBy === property && orders?.order === 'asc';
orders?.setOrder(isAsc ? 'desc' : 'asc');
orders?.setOrderBy(property);
const parameters = Object.fromEntries([
...(params?.searchParams.entries() as IterableIterator<[string, string]>),
['order', isAsc ? 'desc' : 'asc'],
['orderBy', property],
]);
params?.setAppliedParams(parameters);
};
useEffect(() => {
loadDataTableData();
}, [])
}, [appliedParams, searchParams, order, orderBy, setSearchParams])
function SearchInput(props: any) {
// SEARCH
const searchInput = useRef<HTMLInputElement>(null);
const [searchText, setSearchText] = useState('');
// Start Date
// con
const handleSearchChange = (event: any) => {
const newSearchText = event.target.value ?? '';
setSearchText(newSearchText);
};
const handleSearchSubmit = (event: any) => {
event.preventDefault();
props.onSearch({ search: searchText }); // Trigger to Parent
};
const today = new Date(); // Default ke hari ini
const [startDate, setStartDate] = useState<Date | null>(today);
const [endDate, setEndDate] = useState<Date | null>(today);
useEffect(() => {
// Set nilai default saat pertama kali load jika searchParams kosong
const paramStartDate = searchParams.get('start_date');
const paramEndDate = searchParams.get('end_date');
if (paramStartDate) {
setStartDate(new Date(paramStartDate));
}
if (paramEndDate) {
setEndDate(new Date(paramEndDate));
}
}, []);
useEffect(() => {
// Trigger First Search
setSearchText(searchParams.get('search') ?? '');
}, []);
return (
<form onSubmit={handleSearchSubmit} style={{ width: '100%' }}>
<TextField
id="search-input"
ref={searchInput}
label="Search"
variant="outlined"
fullWidth
onChange={handleSearchChange}
value={searchText}
placeholder='Search Member Code or Member Name...'
/>
<form style={{ width: '100%' }}>
<Grid container spacing={2} >
<Grid item md={8}>
<TextField
id="search-input"
ref={searchInput}
label="Search"
variant="outlined"
fullWidth
onChange={handleSearchChange}
onKeyDown={(event) => {
if (event.key === 'Enter') {
// handleSearchSubmit(event);
const filter = Object.fromEntries([
...searchParams.entries(),
['search', searchText],
]);
setSearchParams(filter);
loadDataTableData(filter);
}
}}
value={searchText}
placeholder='Search Code or Name...'
/>
</Grid>
{/* Start Date */}
<Grid item md={2}>
<LocalizationProvider dateAdapter={AdapterDateFns}>
<DesktopDatePicker
label="Start Date"
inputFormat="dd/MM/yyyy"
value={startDate}
onChange={(value) => {
if (value) {
setStartDate(value);
const dateStr = fDateOnly(value);
const filter = Object.fromEntries([...searchParams.entries(), ['start_date', dateStr]]);
setSearchParams(filter);
loadDataTableData(filter);
}
}}
renderInput={(params) => <TextField {...params} variant="outlined" />}
/>
</LocalizationProvider>
</Grid>
{/* End Date */}
<Grid item md={2}>
<LocalizationProvider dateAdapter={AdapterDateFns}>
<DesktopDatePicker
label="End Date"
inputFormat="dd/MM/yyyy"
value={endDate}
onChange={(value) => {
if (value) {
setEndDate(value);
const dateStr = fDateOnly(value);
const filter = Object.fromEntries([...searchParams.entries(), ['end_date', dateStr]]);
setSearchParams(filter);
loadDataTableData(filter);
}
}}
renderInput={(params) => <TextField {...params} variant="outlined" />}
/>
</LocalizationProvider>
</Grid>
</Grid>
</form>
);
}
}
function ImportForm(props: any) {
// IMPORT
@@ -110,6 +228,7 @@ export default function DailyMonitoringList() {
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
@@ -124,7 +243,8 @@ export default function DailyMonitoringList() {
};
const handleCancelImportButton = () => {
importForm.current.value = '';
importForm.current.dispatchEvent(new Event('change', { bubbles: true }));
};
const handleImportChange = (event: any) => {
@@ -136,32 +256,146 @@ export default function DailyMonitoringList() {
};
const handleUpload = () => {
if (importForm.current?.files.length) {
const formData = new FormData();
formData.append('file', importForm.current?.files[0]);
setImportLoading(true);
axios
.post(`customer-service/request/import`, formData)
.then((response) => {
handleCancelImportButton();
loadDataTableData();
setImportResult(response.data);
// alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows');
setImportLoading(false);
})
.catch((response) => {
enqueueSnackbar(
'Looks like something went wrong. Please check your data and try again. ' +
response.message,
{ variant: 'error' }
);
setImportLoading(false);
});
} else {
enqueueSnackbar('No File Selected', { variant: 'warning' });
}
};
const handleGetTemplate = (type :string) => {
axios.get('corporates/import-document-example/' + type)
.then((response) => {
const link = document.createElement('a');
link.href = response.data.data.file_url;
link.setAttribute('download', response.data.data.file_name);
document.body.appendChild(link);
link.click();
handleClose();
})
}
const handleGetData = (type :string) => {
}
const navigate = useNavigate()
return (
<div>
<input
type="file"
id="file"
ref={importForm}
style={{ display: 'none' }}
onChange={handleImportChange}
accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain"
/>
{!currentImportFileName && (
<Stack direction={'row'} spacing={2} sx={{ p: 2 }}>
<SearchInput onSearch={applyFilter} />
{/* <Button
variant="contained"
startIcon={<AddIcon />}
sx={{ p: 1.8 }}
onClick={() => {
navigate('/claim-requests/create');
}}
<Button
id="import-button"
startIcon={<DownloadIcon />}
sx={{ p: 1.8, color: '#FFFFFF', backgroundColor: '#19BBBB', width: '125px', height: '48px' }}
aria-controls={createMenu ? 'basic-menu' : undefined}
aria-haspopup="true"
aria-expanded={createMenu ? 'true' : undefined}
onClick={handleClick}
>
Create
</Button> */}
</Button>
<Menu
id="import-button"
anchorEl={anchorEl}
open={createMenu}
onClose={handleClose}
MenuListProps={{
'aria-labelledby': 'basic-button',
}}
>
<MenuItem onClick={handleImportButton}>
<Typography variant='body2'>Import</Typography>
</MenuItem>
<MenuItem
onClick={() => {
handleGetTemplate('member');
}}
>
<Typography variant='body2'> Download Template</Typography>
</MenuItem>
<MenuItem onClick={() => navigate(`/case_management/daily_monitoring/add_monitoring`)}>
<Typography variant='body2'>Tambah</Typography>
</MenuItem>
</Menu>
</Stack>
)}
{currentImportFileName && (
<Stack direction={'row'} spacing={2} sx={{ p: 2 }}>
<ButtonGroup variant="outlined" aria-label="outlined button group" fullWidth>
<Button onClick={handleImportButton} fullWidth>
{currentImportFileName ?? 'No File Selected'}
</Button>
<Button
onClick={handleCancelImportButton}
size="small"
fullWidth={false}
sx={{ p: 1.8 }}
>
<CancelIcon color="error" />
</Button>
</ButtonGroup>
<LoadingButton
id="upload-button"
variant="outlined"
startIcon={<UploadIcon />}
sx={{ p: 1.8 }}
onClick={handleUpload}
loading={importLoading}
>
Upload
</LoadingButton>
</Stack>
)}
{importResult && (
<Stack direction={'row'} sx={{ px: 2, pb: 2 }}>
<Box sx={{ color: 'text.secondary' }}>
Last Import Result :{' '}
<Box sx={{ color: 'success.main', display: 'inline' }}>
{importResult.total_success_row ?? 0}
</Box>{' '}
Row Processed,{' '}
<Box sx={{ color: 'error.main', display: 'inline' }}>
{importResult.total_failed_row}
</Box>{' '}
Failed, Report :{' '}
<a href={importResult.result_file?.url ?? '#'}>
{importResult.result_file?.name ?? '-'}
</a>
</Box>
</Stack>
)}
</div>
@@ -175,12 +409,14 @@ export default function DailyMonitoringList() {
<TableHead>
<TableRow>
<TableCell style={TableHeadStyle} align="left" width={50} />
<TableCell style={TableHeadStyle} align="left" width={160}>Code</TableCell>
<TableCell style={TableHeadStyle} align="left" width={160}>Admission Date</TableCell>
<TableCell style={TableHeadStyle} align="left" width={150}>Member ID</TableCell>
<TableCell style={TableHeadStyle} align="left" width={'*'}>Name</TableCell>
<TableCell style={TableHeadStyle} align="left" width={160}>Start Date</TableCell>
<TableCell style={TableHeadStyle} align="left" width={160}>End Date</TableCell>
<TableCell style={TableHeadStyle} align="left" width={160}>Admission Date</TableCell>
<TableCell style={TableHeadStyle} align="left" width={160}>Provider</TableCell>
<TableCell style={TableHeadStyle} align="left" width={160}>Tanggal Lahir</TableCell>
<TableCell style={TableHeadStyle} align="left" width={160}>Member Type</TableCell>
<TableCell style={TableHeadStyle} align="left" width={160}>Medical Plan</TableCell>
<TableCell style={TableHeadStyle} align="left" width={160}>Non Medical Plan</TableCell>
<TableCell align="left" width={"10"} />
</TableRow>
</TableHead>

View File

@@ -21,6 +21,7 @@ import TableMoreMenu from '@/components/table/TableMoreMenu';
*/
import { fDate } from "@/utils/formatTime";
import { DailyMonitoringListType } from "../Model/Types";
import { Edit } from "@mui/icons-material";
type Props = {
row: DailyMonitoringListType,
@@ -29,12 +30,21 @@ type Props = {
export default function DailyMonitoringListRow ({ ...props }: Props) {
const navigate = useNavigate()
return (
<React.Fragment>
<TableRow hover sx={{ '& > td': { borderBottom: '1' } }}>
<TableCell align="left" />
<TableCell align="left">{props.row.code}</TableCell>
<TableCell align="left">
<Label
variant="ghost"
color="default"
>
{props.row.addmision_date ? fDate(props.row.addmision_date) : '-'}
</Label>
</TableCell>
<TableCell align="left">{props.row.member_id}</TableCell>
<TableCell align="left">{props.row.name}</TableCell>
<TableCell align="left">
@@ -42,34 +52,31 @@ export default function DailyMonitoringListRow ({ ...props }: Props) {
variant="ghost"
color="default"
>
{fDate(props.row.start_date)}
{props.row.birth_date ? fDate(props.row.birth_date) : '-'}
</Label>
</TableCell>
<TableCell align="left">
<Label
variant="ghost"
color="default"
>
{fDate(props.row.end_date)}
</Label>
{props.row.member_type}
</TableCell>
<TableCell align="left">
<Label
variant="ghost"
color="default"
>
{fDate(props.row.addmision_date)}
</Label>
{props.row.medical_plan}
</TableCell>
<TableCell align="left">{props.row.provider}</TableCell>
<TableCell align="left">
{props.row.non_medical_plan}
</TableCell>
<TableCell align="right" onClick={(e) => e.stopPropagation()}>
<Stack direction="row" justifyContent="flex-end" spacing={1}>
<TableMoreMenu actions={
<>
<MenuItem onClick={() => navigate(`/case_management/daily_monitoring/${props.row.member_id}/${props.row.organization_id}/claims`)}>
<MenuItem onClick={() => navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/list_monitoring`)}>
<Visibility />
View
</MenuItem>
<MenuItem onClick={() => navigate(`/case_management/daily_monitoring/${props.row.id}/edit`)}>
<Edit />
Edit
</MenuItem>
</>
} />
</Stack>

View File

@@ -4,7 +4,7 @@
*/
import { useFieldArray, useForm } from 'react-hook-form';
import { useNavigate, useParams } from 'react-router-dom';
import { Box, IconButton, Typography, Grid, Card, Button, ButtonBase, Stack, Autocomplete } from '@mui/material';
import { Box, IconButton, Typography, Grid, Card, Button, ButtonBase, Stack, Autocomplete, CircularProgress } from '@mui/material';
import { LoadingButton } from "@mui/lab";
/**
@@ -28,41 +28,41 @@ import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile';
* Utils, Types, Functions
* ============================================
*/
import { AddMonitoringDetail, UpdateMonitoringDetail, getMonitoringDetailById, getMonitoringDetailList, getMonitorungDetailById, getOrganizationId } from '../Model/Functions';
import { AddMonitoringDetail, UpdateMonitoringDetail, getMonitoringDetailById, getOrganizationId } from '../Model/Functions';
import { DetailMonitoringListType} from '../Model/Types';
import FormCreateFilesUpload from '@/pages/CustomerService/FinalLog/Components/FormCreateFilesUpload';
import MultiFilePreview from '@/components/upload/MultiFilePreview';
import Iconify from '@/components/Iconify';
import { useEffect, useMemo, useRef, useState } from 'react';
import { TextField } from '@mui/material';
import axios from "@/utils/axios";
type Detail = {
row : DetailMonitoringListType|undefined
}
export default function DetailMonitoringList() {
const { member_id, claim_code, id} = useParams();
const { member_id, id} = useParams();
const [organizationId, setOrganizationId] = useState<number|undefined>();
const [isEdit, setIsEdit] = useState<boolean|undefined>(false);
const [data, setData] = useState<DetailMonitoringListType>();
const navigate = useNavigate()
const pageTitle = claim_code??'_ _ _ _';
const fileInput1 = useRef<HTMLInputElement>(null);
const fileInput2 = useRef<HTMLInputElement>(null);
const fileInput3 = useRef<HTMLInputElement>(null);
const loadOrganizationID = async () => {
const organization_id = await getOrganizationId(claim_code??'');
setOrganizationId(organization_id);
}
// const loadOrganizationID = async () => {
// const organization_id = await getOrganizationId('');
// setOrganizationId(organization_id);
// }
const loadDetailDailyMonitoring = async () => {
const monitoring = await getMonitoringDetailById(id??'')
const monitoring = await getMonitoringDetailById(id)
setData(monitoring)
}
useEffect(() => {
loadOrganizationID();
// loadOrganizationID();
if (id){
loadDetailDailyMonitoring();
setIsEdit(true)
@@ -74,33 +74,41 @@ export default function DetailMonitoringList() {
// ====================================
const defaultValues = useMemo(
() => ({
id : data?.id ??'',
claim_code : data?.claim_code ?? '',
claim_id : data?.claim_id ?? '',
subject : data?.subject ?? '',
objective : data?.object ?? '',
submission_date : data?.submission_date ?? '',
body_temperature: data?.body_temperature ?? '',
sistole : data?.sistole ?? '',
diastole : data?.diastole ??'',
respiration_rate: data?.respiration_rate ??'',
complaints : data?.complaints ?? '',
analysis : data?.analysis ?? '',
medical_plan : data?.medical_plan ?? [{
medical_plan_str: ''
}],
non_medikamentosa_plan : data?.non_medikamentosa_plan ?? [{
non_medikamentosa_plan_str: ''
}],
confirmation_medical_leter : [],
medical_action_letter : [],
// result : data?.laboratorium_result ?? [],
result : [],
created_at : data?.created_at ?? '',
lab_date : data?.lab_date ?? '',
provider : data?.provider ?? '',
examination : data?.examination ?? '',
reason : '',
id : data?.id ??'',
// claim_code : data?.claim_code ?? '',
log_code : data?.log_code ?? '',
doctor_1 : data?.doctor_1 ?? '',
doctor_2 : data?.doctor_2 ?? '',
temp_diagnosis : data?.temp_diagnosis ?? '',
final_diagnosis : data?.final_diagnosis ?? '',
approval_pendamping : data?.approval_pendamping ?? '',
keterangan : data?.keterangan ?? '',
catatan : data?.catatan ?? '',
claim_id : data?.claim_id ?? '',
subject : data?.subject ?? '',
objective : data?.object ?? '',
submission_date : data?.submission_date ?? '',
body_temperature: data?.body_temperature ?? '',
sistole : data?.sistole ?? '',
diastole : data?.diastole ??'',
respiration_rate: data?.respiration_rate ??'',
complaints : data?.complaints ?? '',
analysis : data?.analysis ?? '',
medical_plan : data?.medical_plan ?? [{
medical_plan_str: ''
}],
non_medikamentosa_plan : data?.non_medikamentosa_plan ?? [{
non_medikamentosa_plan_str: ''
}],
confirmation_medical_leter : [],
medical_action_letter : [],
// result : data?.laboratorium_result ?? [],
result : [],
created_at : data?.created_at ?? '',
lab_date : data?.lab_date ?? '',
provider : data?.provider ?? '',
examination : data?.examination ?? '',
reason : '',
}),
[data]
);
@@ -188,7 +196,6 @@ export default function DetailMonitoringList() {
arr_result.push(event.target.files[0]);
setValue('result', arr_result)
console.log('test3')
}
else {
console.log('NO FILE');
@@ -230,35 +237,77 @@ export default function DetailMonitoringList() {
// =====================================
const submitHandler = async (data: DetailMonitoringListType) => {
const response = isEdit ? await UpdateMonitoringDetail(data) : await AddMonitoringDetail(claim_code??'', data);
const response = isEdit ? await UpdateMonitoringDetail(data) : await AddMonitoringDetail('', data);
if (response == true) {
reset();
if (isEdit) {
navigate('/case_management/daily_monitoring/'+member_id+'/claims/'+claim_code+'/list_monitoring', { replace: true });
navigate('/case_management/daily_monitoring', { replace: true });
} else {
navigate('/case_management/daily_monitoring/'+member_id+'/'+organizationId+'/claims', { replace: true });
navigate('/case_management/daily_monitoring', { replace: true });
}
// window.location.reload()
}
}
const [selectedReason, setSelectedReason] = useState({value:'-', label:''});
const [selectedCode, setSelectedCode] = useState({value:'-', label:''});
const reasons = [
{ value: 'Wrong Setting', label: 'Wrong Setting' },
{ value: 'Hospital Request', label: 'Hospital Request' }
];
const [codes, setCodes] = useState([{ value: '-', label: '-' }]); // Data hasil pencarian
const [searchTerm, setSearchTerm] = useState(''); // Nilai input pencarian
useEffect(() => {
axios.get('codeLog')
.then((response) => {
const fetchedCodes = response.data.data;
setCodes(fetchedCodes);
// Set nilai default jika data tersedia
console.log(defaultValues, 'test')
if (defaultValues?.log_code) {
const defaultValueLOG = fetchedCodes.find((item) => item.value === defaultValues?.log_code);
setSelectedCode(defaultValueLOG || null);
}
})
.catch((error) => {
console.error('Error fetching Code LOG options:', error);
});
}, [isEdit, defaultValues]); // Tambahkan dependency agar dijalankan ulang jika log_code berubah
useEffect(() => {
const fetchCodes = async () => {
if (searchTerm.length > 3) { // Hanya fetch jika input lebih dari 2 karakter
try {
const response = await axios.get(`codeLog?search=${searchTerm}`);
setCodes(response.data.data);
} catch (error) {
console.error('Error fetching codes:', error);
setCodes([]);
}
}
};
const debounceFetch = setTimeout(fetchCodes, 500); // Debounce 500ms
return () => clearTimeout(debounceFetch);
}, [searchTerm]);
const [searchCode, setSearchCode] = useState('');
const [error, setError] = useState(true);
return (
<Page title={pageTitle}>
<Page title=''>
<Box sx={{ display: 'flex', alignItems: 'center', pl: '22px', mb: '40px' }}>
<IconButton size='large' color='inherit' onClick={() => navigate(`/case_management/daily_monitoring/${member_id}/${organizationId}/claims`)} >
<IconButton size='large' color='inherit' onClick={() => navigate(`/case_management/daily_monitoring`)} >
<ArrowBackIosNew/>
</IconButton>
<Typography variant="h5" sx={{ marginLeft: '24px' }}>
{pageTitle}
{isEdit ? "Update " : "Tambah "} Daily Monitoring
</Typography>
</Box>
@@ -269,6 +318,43 @@ export default function DetailMonitoringList() {
{/* Date */}
<Grid item xs={12}>
<Grid container spacing={3}>
<Grid item xs={12}>
<Typography variant="body1" component="div">
Code Letter of Guarantee* :
</Typography>
</Grid>
<Grid item xs={12} sx={{ display: 'flex', gap: 1 }}>
<Autocomplete
options={codes}
getOptionLabel={(option) => option.label}
fullWidth
value={selectedCode}
onChange={(event, newValue) => {
setSelectedCode(newValue);
setValue('log_code', newValue?.value);
if (!newValue) {
setError('Please select a code');
} else {
setError('');
}
}}
onInputChange={(event, newInputValue) => {
setSearchTerm(newInputValue); // Set nilai pencarian untuk fetch data
}}
renderInput={(params) => (
<RHFTextField
{...params}
label="Code LOG"
variant="outlined"
id="log_code"
name="log_code"
error={false} // Menampilkan error jika ada
helperText={error} // Menampilkan pesan kesalahan
/>
)}
/>
</Grid>
<Grid item xs={12}>
<Typography variant="body1" component="div">
Date* :
@@ -285,8 +371,74 @@ export default function DetailMonitoringList() {
</Grid>
</Grid>
{/* Subject */}
<Grid item xs={12}>
{/* Doctor 1 */}
{/* <Grid item xs={12}>
<Grid container spacing={3}>
<Grid item xs={12}>
<Typography variant="body1" component="div">
Dokter 1
</Typography>
</Grid>
<Grid item xs={12}>
<RHFTextField
id="doctor_1"
name='doctor_1'
placeholder='Dokter 1'
/>
</Grid>
<Grid item xs={12}>
<Typography variant="body1" component="div">
Dokter 2
</Typography>
</Grid>
<Grid item xs={12}>
<RHFTextField
id="doctor_2"
name='doctor_2'
placeholder='Dokter 2'
/>
</Grid>
<Grid item xs={12}>
<Typography variant="body1" component="div">
Temp Diagnosis
</Typography>
</Grid>
<Grid item xs={12}>
<RHFTextField
id="temp_diagnosis"
name='temp_diagnosis'
placeholder='Temp Diagnosis'
/>
</Grid>
<Grid item xs={12}>
<Typography variant="body1" component="div">
Final Diagnosis
</Typography>
</Grid>
<Grid item xs={12}>
<RHFTextField
id="final_diagnosis"
name='final_diagnosis'
placeholder='Final Diagnosis'
/>
</Grid>
<Grid item xs={12}>
<Typography variant="body1" component="div">
Approval Pendamping
</Typography>
</Grid>
<Grid item xs={12}>
<RHFTextField
id="approval_pendamping"
name='approval_pendamping'
placeholder='Approval Pendamping'
/>
</Grid>
</Grid>
</Grid> */}
{/* Subject */}
<Grid item xs={12}>
<Grid container spacing={3}>
<Grid item xs={12}>
<Typography variant="body1" component="div">
@@ -562,6 +714,28 @@ export default function DetailMonitoringList() {
</Grid>
</Grid>
{/* Keterangan dan Catatan */}
{/* <Grid item xs={12}>
<Grid container spacing={3}>
<Grid item xs={12}>
<Typography variant="body1" component="div">
Keterangan
</Typography>
</Grid>
<Grid item xs={12}>
<RHFEditor id="keterangan" name="keterangan" placeholder="Keterangan"/>
</Grid>
<Grid item xs={12}>
<Typography variant="body1" component="div">
Catatan
</Typography>
</Grid>
<Grid item xs={12}>
<RHFEditor id="catatan" name="catatan" placeholder="Catatan"/>
</Grid>
</Grid>
</Grid> */}
{/* Confirmation Medical Letter */}
<Grid item xs={12}>
<Grid container spacing={3}>
@@ -673,7 +847,7 @@ export default function DetailMonitoringList() {
</Grid>
</Grid>
{/* Laboratorium */}
<Grid item xs={12}>
<Grid container spacing={3}>
@@ -823,7 +997,7 @@ export default function DetailMonitoringList() {
<Grid item xs={12} md={12}>
<Box display="flex" justifyContent={'flex-end'}>
<Box display="flex" gap={1}>
<Button variant="outlined" color="inherit" onClick={() => isEdit ? navigate(`/case_management/daily_monitoring/${member_id}/claims/${claim_code}/list_monitoring`) : navigate(`/case_management/daily_monitoring/${member_id}/${organizationId}/claims`)}>
<Button variant="outlined" color="inherit" onClick={() => navigate(`/case_management/daily_monitoring`)}>
Cancel
</Button>
<LoadingButton disabled={ isEdit ? error : !isDirty} type="submit" variant="contained" loading={isSubmitting}>

View File

@@ -173,11 +173,10 @@ export default function DetailMonitoringList() {
setOrganizationId(organization_id);
}
const renderHTML = (data:string) => {
function renderHTML(data: string) {
return (
<div style={{marginLeft: 20}}
dangerouslySetInnerHTML={{__html: data}}
/>
<div style={{ marginLeft: 20 }}
dangerouslySetInnerHTML={{ __html: data }} />
);
}
@@ -187,7 +186,7 @@ export default function DetailMonitoringList() {
{/* back button */}
<Grid item xs={12}>
<Box sx={{ display: 'flex', alignItems: 'center' }}>
<IconButton size='large' color='inherit' onClick={() => navigate(`/case_management/daily_monitoring/${member_id}/${organizationId}/claims`)} >
<IconButton size='large' color='inherit' onClick={() => navigate(`/case_management/daily_monitoring`)} >
<ArrowBackIosNew/>
</IconButton>
@@ -241,10 +240,10 @@ export default function DetailMonitoringList() {
<Box sx={{ marginLeft: 'auto' }}> {/* Menempatkan TableMoreMenu di sebelah kanan */}
<TableMoreMenu actions={
<>
<MenuItem onClick={() => {handleEdit(row.id);}}>
{/* <MenuItem onClick={() => {handleEdit(row.id);}}>
<Edit />
Edit
</MenuItem>
</MenuItem> */}
<MenuItem onClick={() => {setOpenDialog(true); setId(row.id); setIdFile(null)}}>
<Delete color='error' />
Delete

View File

@@ -51,7 +51,7 @@ export const AddMonitoringDetail = async ( claim_code: string,data: DetailMonito
const formData = makeFormData({...data});
const response = await axios.post(`/case_management/daily_monitoring/detail/${claim_code}/add-request`, formData)
const response = await axios.post(`/case_management/daily_monitoring/add-request`, formData)
.then((res) =>{
enqueueSnackbar(res.data.message, {
variant: 'success',

View File

@@ -3,12 +3,23 @@
*/
export type DailyMonitoringListType = {
member_id : string,
member_type : string,
birth_date : string,
name : string,
start_date : string,
end_date : string,
addmision_date : string,
provider : string,
organization_id : number,
start_date : string,
end_date : string,
description : string,
doctor_1 : string,
doctor_2 : string,
temp_diagnosis : string,
final_diagnosis : string,
approval_pendamping : string,
note : string,
addmision_date : string,
provider : string,
organization_id : number,
medical_plan : string,
non_medical_plan : string,
}
/**
@@ -50,7 +61,18 @@ export type ClaimListType = {
export type DetailMonitoringListType = {
id : number|null,
claim_id : string|null,
log_code : string|null,
request_log_id : string|null,
claim_code : string|undefined,
doctor_1 : string|undefined,
doctor_2 : string|undefined,
temp_diagnosis : string|undefined,
final_diagnosis : string|undefined,
approval_pendamping : string|undefined,
keterangan : string|undefined,
catatan : string|undefined,
description : string|undefined,
note : string|undefined,
subject : string|undefined,
object : string|undefined,
objective : string|undefined,

View File

@@ -25,8 +25,9 @@ export default function DialogConfirmation({requestLog, setOpenDialog, openDialo
id: requestLog?.id,
status: approve || '',
catatan: '',
type_of_member: '' ,
icdCodes: requestLog?.diagnosis.length ? requestLog.diagnosis.map(diagnosis => ({ value: diagnosis.id, label: diagnosis.name })) : []
type_of_member: requestLog?.type_of_member,
// icdCodes: requestLog?.diagnosis.length ? requestLog.diagnosis.map(diagnosis => ({ value: diagnosis.id, label: diagnosis.name })) : []
icdCodes: requestLog?.diagnosis
});
const [error, setError] = useState(false);
@@ -197,7 +198,7 @@ export default function DialogConfirmation({requestLog, setOpenDialog, openDialo
variant="outlined"
displayEmpty
required
error={error}
error={error}
>
<MenuItem value="" disabled>
Type Member

View File

@@ -194,9 +194,9 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo
<Card sx={{padding:2, marginTop:2}} >
<Stack direction='row' spacing={2} sx={marginBottom2}>
<Typography variant='subtitle2' sx={style1} gutterBottom>Invoice Number</Typography>
<Typography variant='subtitle2' sx={style1} gutterBottom>Invoice Provider</Typography>
<TextField
label="Invoice Number"
label="Invoice Provider"
variant="outlined"
fullWidth
value={formData.invoice_no}

View File

@@ -250,6 +250,14 @@ export default function Detail() {
<Typography variant='subtitle2' sx={style1} gutterBottom>Penempatan Kamar</Typography>
<Typography variant='subtitle2' sx={style2} gutterBottom>{requestLog?.penempatan_kamar ? requestLog?.penempatan_kamar : '-'}</Typography>
</Stack>
<Stack direction='row' spacing={2} sx={marginBottom1}>
<Typography variant='subtitle2' sx={style1} gutterBottom>Spesialis</Typography>
<Typography variant='subtitle2' sx={style2} gutterBottom>{requestLog?.specialities_id ? requestLog?.specialities_id : '-'}</Typography>
</Stack>
<Stack direction='row' spacing={2} sx={marginBottom1}>
<Typography variant='subtitle2' sx={style1} gutterBottom>DPPJ</Typography>
<Typography variant='subtitle2' sx={style2} gutterBottom>{requestLog?.dppj ? requestLog?.dppj : '-'}</Typography>
</Stack>
<Stack direction='row' spacing={2} sx={marginBottom1}>
<Typography variant='subtitle2' sx={style1} gutterBottom>Catatan</Typography>
<Typography variant='subtitle2' sx={style2} gutterBottom>{requestLog?.catatan ? requestLog?.catatan : '-'}</Typography>

View File

@@ -24,6 +24,8 @@ export type FinalLogType = {
provider : string,
status : string,
files_by_type : files_by_type,
specialities_id : number,
dppj: string
}

View File

@@ -34,7 +34,7 @@ export default function Detail() {
const navigate = useNavigate();
const { themeStretch } = useSettings();
const [requestLog, setRequestLog] = useState<DetailRequestLogType>();
const { id } = useParams();
@@ -70,9 +70,9 @@ export default function Detail() {
const handleCloseDialogSubmit = () => {
setOpenDialogSubmit(false);
}
const [approve, setApprove] = useState('')
const [openDialogEdit, setOpenDialogEdit] = useState(false);
return (
<Page title='Detail'>
@@ -84,7 +84,7 @@ export default function Detail() {
<Grid container spacing={2}>
<Grid item xs={12} md={12}>
<Card sx={{padding:2}} >
<Grid container spacing={2}>
<Grid container spacing={2}>
<Grid item xs={6}>
<Typography variant='subtitle1' sx={{ color: '#19BBBB', marginBottom: 4 }} gutterBottom>
Detail
@@ -106,7 +106,7 @@ export default function Detail() {
/>
</Grid>
) : null}
</Grid>
<Stack direction='row' spacing={2} sx={marginBottom1}>
<Typography variant='subtitle2' sx={style1} gutterBottom>Provider Name</Typography>
@@ -157,6 +157,14 @@ export default function Detail() {
<Typography variant='subtitle2' sx={style1} gutterBottom>Penempatan Kamar</Typography>
<Typography variant='subtitle2' sx={style2} gutterBottom>{requestLog?.penempatan_kamar ? requestLog?.penempatan_kamar : '-'}</Typography>
</Stack>
<Stack direction='row' spacing={2} sx={marginBottom1}>
<Typography variant='subtitle2' sx={style1} gutterBottom>Spesialis</Typography>
<Typography variant='subtitle2' sx={style2} gutterBottom>{requestLog?.specialities_id ? requestLog?.specialities_id : '-'}</Typography>
</Stack>
<Stack direction='row' spacing={2} sx={marginBottom1}>
<Typography variant='subtitle2' sx={style1} gutterBottom>DPPJ</Typography>
<Typography variant='subtitle2' sx={style2} gutterBottom>{requestLog?.dppj ? requestLog?.dppj : '-'}</Typography>
</Stack>
</Card>
</Grid>
<Grid item xs={12} md={12} marginTop={2}>
@@ -217,13 +225,13 @@ export default function Detail() {
openDialog={openDialogSubmit}
approve={approve}
></DialogConfirmation>
</Stack>
</Grid>
) : null}
<Grid item xs={12} md={12}>
<Stack direction="row" padding={4} sx={{ justifyContent: 'space-between' }}>
<DialogEditInformation
<DialogEditInformation
setOpenDialog={setOpenDialogEdit}
requestLog={requestLog}
openDialog={openDialogEdit}
@@ -231,7 +239,7 @@ export default function Detail() {
</DialogEditInformation>
</Stack>
</Grid>
</Grid>
</Container>
</Page>

View File

@@ -57,7 +57,9 @@ export type DetailRequestLogType = {
benefit : Benefit[],
reason : string,
type_of_member : string,
corporate_id : number
corporate_id : number,
specialities_id : number,
dppj: string
}
export type Benefit = {

View File

@@ -233,10 +233,18 @@ export default function Router() {
path: 'daily_monitoring/:member_id/claims/:claim_code/add_monitoring',
element: <DetailMonitoringForm />
},
{
path: 'daily_monitoring/add_monitoring',
element: <DetailMonitoringForm />
},
{
path: 'daily_monitoring/:member_id/claims/:claim_code/:id',
element: <DetailMonitoringForm />
},
{
path: 'daily_monitoring/:id/edit',
element: <DetailMonitoringForm />
},
{
path: 'daily_monitoring/:member_id/claims/:claim_code/list_monitoring',
element: <DetailMonitoringList />

View File

@@ -138,7 +138,9 @@
"txtButtonClose": "Close",
"txtLabelFailed": "Failed",
"txtAttention": "Attention",
"txtAttentionInfo": "There are pending orders that require approval."
"txtAttentionInfo": "There are pending orders that require approval.",
"txtDPPJ": "DPPJ",
"txtSpecialist": "Specialist"
}

View File

@@ -138,5 +138,7 @@
"txtButtonClose": "Tutup",
"txtLabelFailed": "Gagal Pengiriman",
"txtAttention": "Perhatian",
"txtAttentionInfo": "Terdapat pesanan pending mohon untuk segera di approve."
"txtAttentionInfo": "Terdapat pesanan pending mohon untuk segera di approve.",
"txtDPPJ": "DPPJ",
"txtSpecialist": "Spesialis"
}

View File

@@ -2,13 +2,13 @@ import { styled } from '@mui/material/styles';
import Iconify from '@/components/Iconify';
import { fCurrency } from '@/utils/formatNumber';
import { LoadingButton } from '@mui/lab';
import { Avatar, Button, Divider, LinearProgress, linearProgressClasses, ButtonBase, Box } from '@mui/material';
import { Avatar, Button, Divider, LinearProgress, linearProgressClasses, ButtonBase, Box, Autocomplete, FormHelperText } from '@mui/material';
import { Card } from '@mui/material';
import { Stack, Typography } from '@mui/material';
import { fPostFormat } from '@/utils/formatTime';
import axios from '@/utils/axios';
import { enqueueSnackbar } from 'notistack';
import { useRef, useState, useContext } from 'react';
import { useRef, useState, useContext, useEffect } from 'react';
import { makeFormData } from '@/utils/jsonToFormData';
import { format } from 'date-fns';
import { LanguageContext } from '@/contexts/LanguageContext';
@@ -17,10 +17,10 @@ import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
import TextField from '@mui/material/TextField';
export default function DialogFinalLog({ member, getData, onClose, handleSubmitSuccess }: any) {
const { localeData }: any = useContext(LanguageContext);
//Submission date
const [dischargeDate, setDischargeDate] = useState<string>(format(new Date(), "yyyy MMM d HH:mm:ss"));
const { localeData }: any = useContext(LanguageContext);
//Submission date
const [dischargeDate, setDischargeDate] = useState<string>(format(new Date(), "yyyy MMM d HH:mm:ss"));
const [serviceCode, setServiceCode] = useState<string>('');
// ----------------------------------------------------------------------
// Files Diagnosa
@@ -101,6 +101,7 @@ export default function DialogFinalLog({ member, getData, onClose, handleSubmitS
diagnosa_files: fileDiagnosas,
kondisi_files: fileKondisis,
discharge_date: fPostFormat(dischargeDate, 'yyyy-MM-dd HH:mm:ss'),
service_code: serviceCode,
});
axios
.post('/request-final-log', formData)
@@ -117,6 +118,22 @@ export default function DialogFinalLog({ member, getData, onClose, handleSubmitS
});
}
const [serviceOptions, setServiceOptions] = useState([
{ value: '-', label: '-' }
]);
useEffect(() => {
axios.get('service-member/'+member.member_id)
.then((response) => {
setServiceOptions(response.data);
}).catch((error) => {
console.error('Error fetching ICD options:', error);
});
}, []);
console.log(serviceOptions, member, 'test')
return (
<Stack>
<Stack direction="row" justifyContent={'end'} sx={{ marginBottom: 2, marginTop: 2 }} spacing={2}>
@@ -324,23 +341,44 @@ export default function DialogFinalLog({ member, getData, onClose, handleSubmitS
</Stack>
</Stack>
<Stack direction="row" spacing={2}>
<Stack spacing={2} sx={{ width: '100%' }}>
<Typography variant='subtitle1'>{localeData.txtDischargeDate} *</Typography>
<LocalizationProvider dateAdapter={AdapterDateFns}>
<DatePicker
label={localeData.txtDischargeDate}
value={dischargeDate}
onChange={(newValue:any) => {
setDischargeDate( (newValue));
}}
inputFormat="dd-MM-yyyy HH:mm"
renderInput={(params) => <TextField sx={{width:'40%'}} {...params} required/>}
/>
</LocalizationProvider>
</Stack>
<Stack direction="row" spacing={2} sx={{ width: '100%' }}>
{/* Kolom Tanggal Discharge */}
<Stack spacing={2} sx={{ flex: 1 }}>
<Typography variant="subtitle1">{localeData.txtDischargeDate} *</Typography>
<LocalizationProvider dateAdapter={AdapterDateFns}>
<DatePicker
label={localeData.txtDischargeDate}
value={dischargeDate}
onChange={(newValue: any) => {
setDischargeDate(newValue);
}}
inputFormat="dd-MM-yyyy HH:mm"
renderInput={(params) => <TextField {...params} fullWidth required />}
/>
</LocalizationProvider>
</Stack>
{/* Kolom Service Type */}
<Stack spacing={2} sx={{ flex: 1 }}>
<Typography variant="subtitle1">{localeData.txtDialogMember1} *</Typography>
<Autocomplete
id="service_type"
options={serviceOptions}
getOptionLabel={(option) => option.label || ""}
value={serviceOptions.find((opt) => opt.value == member.service_code) || null}
onChange={(event, newValue) => {
setServiceCode(newValue?.value || "");
}}
renderInput={(params) => (
<TextField {...params} label={localeData.txtDialogMember1} fullWidth />
)}
/>
<FormHelperText style={{ color: "red" }}></FormHelperText>
</Stack>
</Stack>
<LoadingButton
variant="contained"
sx={{ marginTop: 2, p: 2, backgroundColor: '#19BBBB' }}

View File

@@ -1,18 +1,18 @@
import { LoadingButton } from '@mui/lab';
import
{
import
{
Avatar,
FormControl,
InputLabel,
Select,
FormHelperText,
MenuItem
MenuItem
} from '@mui/material';
import { Card } from '@mui/material';
import { Stack, Typography } from '@mui/material';
import axios from '@/utils/axios';
import { enqueueSnackbar } from 'notistack';
import { useRef, useState, useContext, useEffect } from 'react';
import React, { useRef, useState, useContext, useEffect } from 'react';
import { makeFormData } from '@/utils/jsonToFormData';
import { format } from 'date-fns';
import { LanguageContext } from '@/contexts/LanguageContext';
@@ -28,6 +28,7 @@ interface MemberType {
services: any;
providers:any;
companies:any;
specialities:any;
}
interface FormRequestClaimProps {
member: MemberType;
@@ -37,6 +38,8 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe
const { localeData }: any = useContext(LanguageContext);
const [serviceCode, setServiceCode] = useState<string>('');
const [idProvider, setIdProvider] = useState<number>(0);
const [idSpecialities, setIdSpecialities] = useState<number>(0);
const [inputDppj, setInputDppj] = useState<string>('');
//Submission date
const [submissionDate, setSubmissionDate] = useState<string>(format(new Date(), "yyyy MMM d HH:mm:ss"));
@@ -47,7 +50,7 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe
setCorporateIdPartner(member?.companies?.map((item: { id: any; name: any; }) => ({ value: item.id, label: item.name })));
}, []);
const [selectedCorporatID, setSelectedCorporateID] = useState<any>([]);
const handleSelectChangePatner = (event:any, selectedOptions:any) => {
const selectedValues = selectedOptions.map((option: { value: any; }) => option.value);
setSelectedCorporateID(selectedValues);
@@ -77,24 +80,26 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe
organization_name : name,
address_provider: alamat,
submission_date: fPostFormat(submissionDate, 'yyyy-MM-dd HH:mm:ss'),
corporate_id_partner: selectedCorporatID
corporate_id_partner: selectedCorporatID,
specialities_id: idSpecialities,
dppj: inputDppj
};
axios
.post('/request-log', formData)
.then((response) => {
if (response && response.data && response.data.meta) {
setTimeout(() => {
window.location.reload();
}, 1500);
// setTimeout(() => {
// window.location.reload();
// }, 1500);
enqueueSnackbar(response.data.meta.message, { variant: 'success' });
handleSubmitSuccess();
}
}
})
.catch(({ response }) => {
if (response && response.data && response.data.meta) {
enqueueSnackbar(response.data.meta.message, { variant: 'error' });
}
}
})
.then(() => {
setSubmitLoading(false);
@@ -111,6 +116,11 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe
name: string;
}
interface Specialities {
id: number;
name: string;
}
const [showAddNewForm, setShowAddNewForm] = useState(false);
const [name, setName] = useState('');
const [alamat, setAlamat] = useState('');
@@ -191,22 +201,46 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe
<FormHelperText style={{ color: 'red' }}></FormHelperText>
</Stack>
</Stack>
<Stack direction="row" spacing={2}>
<Stack spacing={2} sx={{ width: '100%' }}>
<Typography variant='subtitle1'>{localeData.txtDialogMember1} *</Typography>
<Autocomplete
id="service_type"
options={member?.services || []}
getOptionLabel={(option: MemberService) => option.name || ''}
value={member?.services.find((item: MemberService) => item.service_code === serviceCode) || null}
onChange={(event: React.ChangeEvent<{}>, newValue: MemberService | null) => {
setServiceCode(newValue?.service_code || '');
id="service_type"
options={member?.services || []}
getOptionLabel={(option: MemberService) => option.name || ''}
value={member?.services.find((item: MemberService) => item.service_code === serviceCode) || null}
onChange={(event: React.ChangeEvent<{}>, newValue: MemberService | null) => {
setServiceCode(newValue?.service_code || '');
}}
renderInput={(params) => (
<TextField
{...params}
label={localeData.txtDialogMember1}
fullWidth
/>
)}
/>
<FormHelperText style={{ color: 'red' }}></FormHelperText>
</Stack>
</Stack>
{/* Specialist */}
<Stack direction="row" spacing={2}>
<Stack spacing={2} sx={{ width: '100%' }}>
<Typography variant='subtitle1'>{localeData.txtSpecialist}</Typography>
<Autocomplete
id='specialities'
options={member?.specialities || []}
getOptionLabel={(option: Specialities) => option.name || ''}
value={member?.specialities.find((item: Specialities) => item.id === idSpecialities) || null}
onChange={(event: React.ChangeEvent<{}>, newValue : Specialities | null) => {
setIdSpecialities(newValue?.id || 0);
}}
renderInput={(params) => (
<TextField
{...params}
label={localeData.txtDialogMember1}
label={localeData.txtSpecialist}
fullWidth
/>
)}
@@ -215,6 +249,21 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe
</Stack>
</Stack>
<Stack direction="row" spacing={2}>
<Stack spacing={2} sx={{ width: '100%' }}>
<Typography variant='subtitle1'>{ localeData.txtDPPJ }</Typography>
<TextField
id='dppj'
variant='outlined'
placeholder={ localeData.txtDPPJ }
onChange={(event) => {
setInputDppj(event.target.value);
}}
fullWidth
/>
</Stack>
</Stack>
<Stack direction="row" spacing={2}>
<Stack spacing={2} sx={{ width: '100%' }}>
<Typography variant='subtitle1'>{localeData.txtDialogMember5} *</Typography>
@@ -226,7 +275,7 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe
setSubmissionDate( (newValue));
}}
inputFormat="dd-MM-yyyy HH:mm"
renderInput={(params) => <TextField sx={{width:'40%'}} {...params} required/>}
renderInput={(params) => <TextField sx={{width:'45%'}} {...params} required/>}
/>
</LocalizationProvider>
</Stack>

View File

@@ -348,14 +348,23 @@ export default function TableList() {
function handleRequestFinalLog(id:any, full_name:any, no_polis:any, submission_date:any)
function handleRequestFinalLog(
id:any,
full_name:any,
no_polis:any,
submission_date:any,
service_code:any,
member_id:any,
)
{
setOpenDialogFinalLog(true);
const datas_view = {
'id' : id,
'full_name' : full_name,
'no_polis' : no_polis,
'submission_date' : submission_date
'submission_date' : submission_date,
'service_code' : service_code,
'member_id' : member_id,
};
setDataViewFinalDialog(datas_view);
}
@@ -427,7 +436,7 @@ export default function TableList() {
</MenuItem>
):''}
{obj.final_log === 0 && obj.status === 'approved' ? (
<MenuItem onClick={() => handleRequestFinalLog(obj.id, obj.full_name, obj.no_polis, obj.submission_date) }>
<MenuItem onClick={() => handleRequestFinalLog(obj.id, obj.full_name, obj.no_polis, obj.submission_date, obj.service_code, obj.member_id) }>
<Iconify icon="fa:file-text" />
Request Final LOG
</MenuItem>

View File

@@ -242,7 +242,7 @@
<td style="width: 29%;">{{ wordwrap($request_logs->code,15,"<br>\n")}}</td>
<td style="width: 20%;">Tanggal</td>
<td style="width: 1%;">:</td>
<td style="width: 29%;">{{ \Carbon\Carbon::parse($request_logs->created_at)->format('d M Y') }}</td>
<td style="width: 29%;">{{ \Carbon\Carbon::parse($request_logs->approved_at)->format('d M Y') }}</td>
</tr>
<tr>
<td>Kepada</td>