feat(provider-integrations): move ProviderOnline endpoints to new module
This commit is contained in:
@@ -6,7 +6,6 @@ use Modules\HospitalPortal\Http\Controllers\Api\ClaimRequestController;
|
|||||||
use Modules\HospitalPortal\Http\Controllers\Api\MemberController;
|
use Modules\HospitalPortal\Http\Controllers\Api\MemberController;
|
||||||
use Modules\HospitalPortal\Http\Controllers\ClaimController;
|
use Modules\HospitalPortal\Http\Controllers\ClaimController;
|
||||||
use Modules\HospitalPortal\Http\Controllers\Api\NotificationController;
|
use Modules\HospitalPortal\Http\Controllers\Api\NotificationController;
|
||||||
use Modules\HospitalPortal\Http\Controllers\Api\ProviderOnlineController;
|
|
||||||
use Modules\HospitalPortal\Http\Controllers\Api\RequestLogController;
|
use Modules\HospitalPortal\Http\Controllers\Api\RequestLogController;
|
||||||
use Modules\Internal\Http\Controllers\Api\RequestLogController as RequestLogControllerInternal;
|
use Modules\Internal\Http\Controllers\Api\RequestLogController as RequestLogControllerInternal;
|
||||||
use Modules\Internal\Http\Controllers\Api\RequestLogBenefitController;
|
use Modules\Internal\Http\Controllers\Api\RequestLogBenefitController;
|
||||||
@@ -137,14 +136,3 @@ Route::prefix('v1')->group(function() {
|
|||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
Route::prefix('v1/bridging-service/ProviderOnline')->group(function () {
|
|
||||||
Route::post('HeaderKey', [ProviderOnlineController::class, 'getHeaderKey']);
|
|
||||||
Route::post('AddHeaderKey', [ProviderOnlineController::class, 'addHeaderKey']);
|
|
||||||
Route::post('EligibilitasPeserta', [ProviderOnlineController::class, 'checkEligibilitasPeserta']);
|
|
||||||
Route::post('Pendaftaran', [ProviderOnlineController::class, 'createPendaftaran']);
|
|
||||||
Route::post('Pengesahan', [ProviderOnlineController::class, 'createPengesahan']);
|
|
||||||
Route::post('RincianBiayaKlaim', [ProviderOnlineController::class, 'getRincianBiayaKlaim']);
|
|
||||||
Route::post('StrukPendaftaran', [ProviderOnlineController::class, 'downloadStrukPendaftaran']);
|
|
||||||
Route::post('StrukPengesahan', [ProviderOnlineController::class, 'downloadStrukPengesahan']);
|
|
||||||
});
|
|
||||||
|
|||||||
5
Modules/ProviderIntegrations/Config/config.php
Normal file
5
Modules/ProviderIntegrations/Config/config.php
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
'name' => 'ProviderIntegrations',
|
||||||
|
];
|
||||||
@@ -1,13 +1,14 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace Modules\HospitalPortal\Http\Controllers\Api;
|
namespace Modules\ProviderIntegrations\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Helpers\Helper;
|
||||||
use App\Models\Benefit;
|
use App\Models\Benefit;
|
||||||
use App\Models\Claim;
|
|
||||||
use App\Models\CorporateBenefit;
|
use App\Models\CorporateBenefit;
|
||||||
use App\Models\Member;
|
use App\Models\Member;
|
||||||
use App\Models\MemberPlan;
|
use App\Models\MemberPlan;
|
||||||
use App\Models\Organization;
|
use App\Models\Organization;
|
||||||
|
use App\Models\Plan;
|
||||||
use App\Models\Provider;
|
use App\Models\Provider;
|
||||||
use App\Models\RequestLog;
|
use App\Models\RequestLog;
|
||||||
use App\Models\RequestLogBenefit;
|
use App\Models\RequestLogBenefit;
|
||||||
@@ -16,59 +17,13 @@ use Illuminate\Http\Request;
|
|||||||
use Illuminate\Routing\Controller;
|
use Illuminate\Routing\Controller;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Illuminate\Support\Facades\Hash;
|
use Illuminate\Support\Facades\Hash;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
use PDF;
|
use Modules\HospitalPortal\Http\Controllers\Api\RequestLogController;
|
||||||
use Throwable;
|
use Throwable;
|
||||||
|
|
||||||
class ProviderOnlineController extends Controller
|
class ProviderOnlineController extends Controller
|
||||||
{
|
{
|
||||||
public function addHeaderKey(Request $request)
|
|
||||||
{
|
|
||||||
$request->validate([
|
|
||||||
'kodeprovider' => 'required|string',
|
|
||||||
'username' => 'required|string',
|
|
||||||
'password' => 'required|string',
|
|
||||||
'status' => 'required|string',
|
|
||||||
'header_token' => 'required|string',
|
|
||||||
'namaprovider' => 'required|string',
|
|
||||||
]);
|
|
||||||
|
|
||||||
$organization = Organization::query()->firstOrCreate(
|
|
||||||
['code' => $request->kodeprovider],
|
|
||||||
[
|
|
||||||
'name' => $request->namaprovider,
|
|
||||||
'status' => 'active',
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
if ((string) $organization->name !== (string) $request->namaprovider) {
|
|
||||||
$organization->name = $request->namaprovider;
|
|
||||||
$organization->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
$provider = Provider::query()->firstOrNew([
|
|
||||||
'organization_id' => $organization->id,
|
|
||||||
'username' => $request->username,
|
|
||||||
]);
|
|
||||||
|
|
||||||
$provider->password = Hash::make($request->password);
|
|
||||||
$provider->code = $request->kodeprovider;
|
|
||||||
$provider->status = $request->status;
|
|
||||||
$provider->header_token = $request->header_token;
|
|
||||||
$provider->token = $provider->token ?: Str::random(64);
|
|
||||||
$provider->save();
|
|
||||||
|
|
||||||
return response()->json([
|
|
||||||
'header-token' => $provider->header_token,
|
|
||||||
'userid' => $provider->id,
|
|
||||||
'usertoken' => $provider->token,
|
|
||||||
'kodeprovider' => $organization->code,
|
|
||||||
'namaprovider' => $organization->name,
|
|
||||||
'errornumber' => 0,
|
|
||||||
'messagestring' => 'Success',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getHeaderKey(Request $request)
|
public function getHeaderKey(Request $request)
|
||||||
{
|
{
|
||||||
$request->validate([
|
$request->validate([
|
||||||
@@ -122,7 +77,7 @@ class ProviderOnlineController extends Controller
|
|||||||
'p_token' => 'required|string',
|
'p_token' => 'required|string',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
[, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
||||||
if ($authError) {
|
if ($authError) {
|
||||||
return $authError;
|
return $authError;
|
||||||
}
|
}
|
||||||
@@ -136,31 +91,22 @@ class ProviderOnlineController extends Controller
|
|||||||
return $this->statusError('Peserta tidak ditemukan');
|
return $this->statusError('Peserta tidak ditemukan');
|
||||||
}
|
}
|
||||||
|
|
||||||
$planIds = $member->memberPlans
|
$benefits = $member->memberPlans
|
||||||
->pluck('plan_id')
|
->map(function (MemberPlan $memberPlan) {
|
||||||
->filter()
|
$plan = $memberPlan->plan;
|
||||||
->unique()
|
if (!$plan || empty($plan->code)) {
|
||||||
->values();
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
$benefits = collect();
|
return [
|
||||||
if ($planIds->isNotEmpty()) {
|
'kodebenefit' => $plan->code,
|
||||||
$benefits = CorporateBenefit::query()
|
'namabenefit' => $plan->corporate_plan_id,
|
||||||
->with(['benefit', 'plan'])
|
'planid' => $plan->code,
|
||||||
->whereIn('plan_id', $planIds)
|
];
|
||||||
->get()
|
})
|
||||||
->map(function (CorporateBenefit $corporateBenefit) {
|
->filter()
|
||||||
return [
|
->unique('kodebenefit')
|
||||||
// Keep response keys unchanged, but fill with sub-benefit data
|
->values();
|
||||||
'kodebenefit' => optional($corporateBenefit->benefit)->code,
|
|
||||||
'namabenefit' => optional($corporateBenefit->benefit)->description,
|
|
||||||
'planid' => optional($corporateBenefit->plan)->code,
|
|
||||||
];
|
|
||||||
})
|
|
||||||
->filter(function (array $item) {
|
|
||||||
return !empty($item['kodebenefit']);
|
|
||||||
})
|
|
||||||
->values();
|
|
||||||
}
|
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'Status' => $this->okStatus(),
|
'Status' => $this->okStatus(),
|
||||||
@@ -204,7 +150,7 @@ class ProviderOnlineController extends Controller
|
|||||||
'p_token' => 'required|string',
|
'p_token' => 'required|string',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
[, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
||||||
if ($authError) {
|
if ($authError) {
|
||||||
return $authError;
|
return $authError;
|
||||||
}
|
}
|
||||||
@@ -213,6 +159,7 @@ class ProviderOnlineController extends Controller
|
|||||||
->with(['person', 'currentCorporate', 'currentPolicy'])
|
->with(['person', 'currentCorporate', 'currentPolicy'])
|
||||||
->where('member_id', $request->nokartu)
|
->where('member_id', $request->nokartu)
|
||||||
->first();
|
->first();
|
||||||
|
|
||||||
if (!$member) {
|
if (!$member) {
|
||||||
return $this->statusError('Peserta tidak ditemukan');
|
return $this->statusError('Peserta tidak ditemukan');
|
||||||
}
|
}
|
||||||
@@ -263,49 +210,17 @@ class ProviderOnlineController extends Controller
|
|||||||
'namasubbenefit' => optional($corporateBenefit->benefit)->description,
|
'namasubbenefit' => optional($corporateBenefit->benefit)->description,
|
||||||
'batasan' => (string) ($corporateBenefit->limit_amount ?? 0),
|
'batasan' => (string) ($corporateBenefit->limit_amount ?? 0),
|
||||||
];
|
];
|
||||||
|
})
|
||||||
|
->filter(function (array $item) {
|
||||||
|
return !empty($item['kodesubbenefit']);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->sendProviderOnlineEmail('pendaftaran baru', $requestLog, $organization);
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'Status' => $this->okStatus(),
|
'Status' => $this->okStatus(),
|
||||||
'Data' => [[
|
'Data' => [$this->buildClaimHeader($requestLog, $organization)],
|
||||||
'noklaim' => $requestLog->code,
|
|
||||||
'namapeserta' => $member->full_name,
|
|
||||||
'tanggallahir' => $this->isoDate($member->birth_date),
|
|
||||||
'nokartu' => $member->member_id,
|
|
||||||
'nopolis' => optional($member->currentPolicy)->code,
|
|
||||||
'nobpjs' => $member->bpjs_id,
|
|
||||||
'nosep' => $requestLog->nomor_sep,
|
|
||||||
'nomorrujukan' => $requestLog->nomor_rujukan,
|
|
||||||
'planid' => optional($plan)->code,
|
|
||||||
'masapolis' => optional($member->currentPolicy)->end ? Carbon::parse($member->currentPolicy->end)->format('d/m/Y') : null,
|
|
||||||
'namaperusahaan' => optional($member->currentCorporate)->name,
|
|
||||||
'namapenjamin' => $organization->name,
|
|
||||||
'tanggalmasuk' => $this->isoDate($requestLog->admission_date),
|
|
||||||
'tanggalkeluar' => $this->isoDate($requestLog->discharge_date),
|
|
||||||
'hakkamar' => $requestLog->penempatan_kamar,
|
|
||||||
'hakicu' => null,
|
|
||||||
'nosuratjaminan' => $requestLog->code,
|
|
||||||
'namapegawai' => null,
|
|
||||||
'namabenefit' => optional($plan)->corporate_plan_id,
|
|
||||||
'kodediagnosa' => $requestLog->diagnosis,
|
|
||||||
'keterangan' => $requestLog->keterangan,
|
|
||||||
'catatanTC1' => null,
|
|
||||||
'catatanTC2' => null,
|
|
||||||
'catatanTC3' => null,
|
|
||||||
'catatanTC4' => null,
|
|
||||||
'catatanTC5' => null,
|
|
||||||
'catatanTC6' => null,
|
|
||||||
'catatanTC7' => null,
|
|
||||||
'catatanTC8' => null,
|
|
||||||
'catatanTC9' => null,
|
|
||||||
'catatanTC10' => null,
|
|
||||||
'statusrujukan' => $requestLog->status_rujukan,
|
|
||||||
'statusklaim' => 0,
|
|
||||||
'notransaksiprovider' => $requestLog->no_transaksi_provider,
|
|
||||||
'inacbgscode' => $requestLog->inacbgs_code,
|
|
||||||
'inacbgsamount' => (float) ($requestLog->inacbgs_amount ?? 0),
|
|
||||||
]],
|
|
||||||
'LimitSubBenefit' => $limitSubBenefit->values(),
|
'LimitSubBenefit' => $limitSubBenefit->values(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -326,7 +241,7 @@ class ProviderOnlineController extends Controller
|
|||||||
'p_token' => 'required|string',
|
'p_token' => 'required|string',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
[, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
||||||
if ($authError) {
|
if ($authError) {
|
||||||
return $authError;
|
return $authError;
|
||||||
}
|
}
|
||||||
@@ -336,12 +251,18 @@ class ProviderOnlineController extends Controller
|
|||||||
->where('code', $request->noklaim)
|
->where('code', $request->noklaim)
|
||||||
->where('organization_id', $organization->id)
|
->where('organization_id', $organization->id)
|
||||||
->first();
|
->first();
|
||||||
|
|
||||||
if (!$requestLog) {
|
if (!$requestLog) {
|
||||||
return $this->statusError('Nomor klaim tidak ditemukan');
|
return $this->statusError('Nomor klaim tidak ditemukan');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$benefitsByCode = $this->resolveBenefitCodes($request->daftarbiaya ?? []);
|
||||||
|
if (isset($benefitsByCode['error'])) {
|
||||||
|
return $this->statusError($benefitsByCode['error']);
|
||||||
|
}
|
||||||
|
|
||||||
$requestLog->update([
|
$requestLog->update([
|
||||||
'status_final_log' => 'approved',
|
'status_final_log' => 'approve',
|
||||||
'final_log' => true,
|
'final_log' => true,
|
||||||
'discharge_date' => $request->tanggalkeluar,
|
'discharge_date' => $request->tanggalkeluar,
|
||||||
'diagnosis' => $request->kodediagnosa,
|
'diagnosis' => $request->kodediagnosa,
|
||||||
@@ -350,10 +271,7 @@ class ProviderOnlineController extends Controller
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
foreach (($request->daftarbiaya ?? []) as $biaya) {
|
foreach (($request->daftarbiaya ?? []) as $biaya) {
|
||||||
$benefit = Benefit::query()->where('code', $biaya['kodesubbenefit'])->first();
|
$benefit = $benefitsByCode[$biaya['kodesubbenefit']];
|
||||||
if (!$benefit) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
RequestLogBenefit::query()->updateOrCreate(
|
RequestLogBenefit::query()->updateOrCreate(
|
||||||
[
|
[
|
||||||
@@ -386,50 +304,78 @@ class ProviderOnlineController extends Controller
|
|||||||
];
|
];
|
||||||
})->values();
|
})->values();
|
||||||
|
|
||||||
|
$this->sendProviderOnlineEmail('pengesahan', $requestLog, $organization);
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'Status' => $this->okStatus(),
|
'Status' => $this->okStatus(),
|
||||||
'Data' => [[
|
'Data' => [$this->buildClaimHeader($requestLog, $organization)],
|
||||||
'noklaim' => $requestLog->code,
|
|
||||||
'namapeserta' => optional($requestLog->member)->full_name,
|
|
||||||
'tanggallahir' => $this->isoDate(optional($requestLog->member)->birth_date),
|
|
||||||
'nokartu' => optional($requestLog->member)->member_id,
|
|
||||||
'nopolis' => optional(optional($requestLog->member)->currentPolicy)->code,
|
|
||||||
'nobpjs' => optional($requestLog->member)->bpjs_id,
|
|
||||||
'nosep' => $requestLog->nomor_sep,
|
|
||||||
'nomorrujukan' => $requestLog->nomor_rujukan,
|
|
||||||
'planid' => optional($requestLog->plan)->code,
|
|
||||||
'masapolis' => optional(optional($requestLog->member)->currentPolicy)->end ? Carbon::parse($requestLog->member->currentPolicy->end)->format('d/m/Y') : null,
|
|
||||||
'namaperusahaan' => optional(optional($requestLog->member)->currentCorporate)->name,
|
|
||||||
'namapenjamin' => $organization->name,
|
|
||||||
'tanggalmasuk' => $this->isoDate($requestLog->admission_date),
|
|
||||||
'tanggalkeluar' => $this->isoDate($requestLog->discharge_date),
|
|
||||||
'hakkamar' => $requestLog->penempatan_kamar,
|
|
||||||
'hakicu' => null,
|
|
||||||
'nosuratjaminan' => $requestLog->code,
|
|
||||||
'namapegawai' => null,
|
|
||||||
'namabenefit' => optional($requestLog->plan)->corporate_plan_id,
|
|
||||||
'kodediagnosa' => $requestLog->diagnosis,
|
|
||||||
'keterangan' => $requestLog->keterangan,
|
|
||||||
'catatanTC1' => null,
|
|
||||||
'catatanTC2' => null,
|
|
||||||
'catatanTC3' => null,
|
|
||||||
'catatanTC4' => null,
|
|
||||||
'catatanTC5' => null,
|
|
||||||
'catatanTC6' => null,
|
|
||||||
'catatanTC7' => null,
|
|
||||||
'catatanTC8' => null,
|
|
||||||
'catatanTC9' => null,
|
|
||||||
'catatanTC10' => null,
|
|
||||||
'statusrujukan' => $requestLog->status_rujukan,
|
|
||||||
'statusklaim' => 0,
|
|
||||||
'notransaksiprovider' => $requestLog->no_transaksi_provider,
|
|
||||||
'inacbgscode' => $requestLog->inacbgs_code,
|
|
||||||
'inacbgsamount' => (float) ($requestLog->inacbgs_amount ?? 0),
|
|
||||||
]],
|
|
||||||
'Biaya' => $biayaResponse,
|
'Biaya' => $biayaResponse,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function upsertBillingSementara(Request $request)
|
||||||
|
{
|
||||||
|
$request->validate([
|
||||||
|
'noklaim' => 'required|string',
|
||||||
|
'kodeprovider' => 'required|string',
|
||||||
|
'tanggalkeluar' => 'nullable|date',
|
||||||
|
'kodediagnosa' => 'nullable|string',
|
||||||
|
'daftarbiaya' => 'nullable|array',
|
||||||
|
'daftarbiaya.*.kodesubbenefit' => 'required_with:daftarbiaya|string',
|
||||||
|
'daftarbiaya.*.biayaaju' => 'required_with:daftarbiaya|numeric',
|
||||||
|
'p_user_no' => 'required',
|
||||||
|
'p_token' => 'required|string',
|
||||||
|
]);
|
||||||
|
|
||||||
|
[, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
||||||
|
if ($authError) {
|
||||||
|
return $authError;
|
||||||
|
}
|
||||||
|
|
||||||
|
$requestLog = RequestLog::query()
|
||||||
|
->where('code', $request->noklaim)
|
||||||
|
->where('organization_id', $organization->id)
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if (!$requestLog) {
|
||||||
|
return $this->statusError('Nomor klaim tidak ditemukan');
|
||||||
|
}
|
||||||
|
|
||||||
|
$benefitsByCode = $this->resolveBenefitCodes($request->daftarbiaya ?? []);
|
||||||
|
if (isset($benefitsByCode['error'])) {
|
||||||
|
return $this->statusError($benefitsByCode['error']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$requestLog->update([
|
||||||
|
'discharge_date' => $request->tanggalkeluar,
|
||||||
|
'diagnosis' => $request->kodediagnosa,
|
||||||
|
]);
|
||||||
|
|
||||||
|
foreach (($request->daftarbiaya ?? []) as $biaya) {
|
||||||
|
$benefit = $benefitsByCode[$biaya['kodesubbenefit']];
|
||||||
|
|
||||||
|
RequestLogBenefit::query()->updateOrCreate(
|
||||||
|
[
|
||||||
|
'request_log_id' => $requestLog->id,
|
||||||
|
'benefit_id' => $benefit->id,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'amount_incurred' => $biaya['biayaaju'],
|
||||||
|
'amount_approved' => 0,
|
||||||
|
'amount_not_approved' => 0,
|
||||||
|
'excess_paid' => 0,
|
||||||
|
'keterangan' => null,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->sendProviderOnlineEmail('upsert billing sementara', $requestLog, $organization);
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'Status' => $this->okStatus(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
public function getRincianBiayaKlaim(Request $request)
|
public function getRincianBiayaKlaim(Request $request)
|
||||||
{
|
{
|
||||||
$request->validate([
|
$request->validate([
|
||||||
@@ -439,16 +385,17 @@ class ProviderOnlineController extends Controller
|
|||||||
'p_token' => 'required|string',
|
'p_token' => 'required|string',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
[, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
||||||
if ($authError) {
|
if ($authError) {
|
||||||
return $authError;
|
return $authError;
|
||||||
}
|
}
|
||||||
|
|
||||||
$requestLog = RequestLog::query()
|
$requestLog = RequestLog::query()
|
||||||
->with(['plan', 'requestLogBenefits.benefit'])
|
->with(['member.person', 'member.currentCorporate', 'member.currentPolicy', 'plan', 'requestLogBenefits.benefit'])
|
||||||
->where('code', $request->noklaim)
|
->where('code', $request->noklaim)
|
||||||
->where('organization_id', $organization->id)
|
->where('organization_id', $organization->id)
|
||||||
->first();
|
->first();
|
||||||
|
|
||||||
if (!$requestLog) {
|
if (!$requestLog) {
|
||||||
return $this->statusError('Nomor klaim tidak ditemukan');
|
return $this->statusError('Nomor klaim tidak ditemukan');
|
||||||
}
|
}
|
||||||
@@ -469,13 +416,7 @@ class ProviderOnlineController extends Controller
|
|||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'Status' => $this->okStatus(),
|
'Status' => $this->okStatus(),
|
||||||
'Data' => [
|
'Data' => [$this->buildClaimHeader($requestLog, $organization)],
|
||||||
'noklaim' => $requestLog->code,
|
|
||||||
'kodeprovider' => $organization->code,
|
|
||||||
'nosep' => $requestLog->nomor_sep,
|
|
||||||
'keterangan' => $requestLog->keterangan,
|
|
||||||
'statusklaim' => $requestLog->status,
|
|
||||||
],
|
|
||||||
'Biaya' => $biaya,
|
'Biaya' => $biaya,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -489,21 +430,25 @@ class ProviderOnlineController extends Controller
|
|||||||
'p_token' => 'required|string',
|
'p_token' => 'required|string',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
[, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
||||||
if ($authError) {
|
if ($authError) {
|
||||||
return $authError;
|
return $authError;
|
||||||
}
|
}
|
||||||
|
|
||||||
$requestLog = RequestLog::query()->where('code', $request->noklaim)->where('organization_id', $organization->id)->first();
|
$requestLog = RequestLog::query()
|
||||||
|
->where('code', $request->noklaim)
|
||||||
|
->where('organization_id', $organization->id)
|
||||||
|
->first();
|
||||||
|
|
||||||
if (!$requestLog) {
|
if (!$requestLog) {
|
||||||
return $this->statusError('Nomor klaim tidak ditemukan');
|
return $this->statusError('Nomor klaim tidak ditemukan');
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$requestLogController = new RequestLogController();
|
return (new RequestLogController())->downlodLog($requestLog->id);
|
||||||
return $requestLogController->downlodLog($requestLog->id);
|
|
||||||
} catch (Throwable $e) {
|
} catch (Throwable $e) {
|
||||||
$fallbackUrl = url('api/v1/hospitalportal/download-log/' . $requestLog->id);
|
$fallbackUrl = url('api/v1/hospitalportal/download-log/' . $requestLog->id);
|
||||||
|
|
||||||
return $this->statusError(
|
return $this->statusError(
|
||||||
'Gagal generate PDF struk pendaftaran: ' . $e->getMessage() . '. request_log_id=' . $requestLog->id . ', fallback_url=' . $fallbackUrl,
|
'Gagal generate PDF struk pendaftaran: ' . $e->getMessage() . '. request_log_id=' . $requestLog->id . ', fallback_url=' . $fallbackUrl,
|
||||||
500
|
500
|
||||||
@@ -520,21 +465,25 @@ class ProviderOnlineController extends Controller
|
|||||||
'p_token' => 'required|string',
|
'p_token' => 'required|string',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
[, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
||||||
if ($authError) {
|
if ($authError) {
|
||||||
return $authError;
|
return $authError;
|
||||||
}
|
}
|
||||||
|
|
||||||
$requestLog = RequestLog::query()->where('code', $request->noklaim)->where('organization_id', $organization->id)->first();
|
$requestLog = RequestLog::query()
|
||||||
|
->where('code', $request->noklaim)
|
||||||
|
->where('organization_id', $organization->id)
|
||||||
|
->first();
|
||||||
|
|
||||||
if (!$requestLog) {
|
if (!$requestLog) {
|
||||||
return $this->statusError('Nomor klaim tidak ditemukan');
|
return $this->statusError('Nomor klaim tidak ditemukan');
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$requestLogController = new RequestLogController();
|
return (new RequestLogController())->downlodFinalLog($requestLog->id);
|
||||||
return $requestLogController->downlodFinalLog($requestLog->id);
|
|
||||||
} catch (Throwable $e) {
|
} catch (Throwable $e) {
|
||||||
$fallbackUrl = url('api/v1/hospitalportal/download-final-log/' . $requestLog->id);
|
$fallbackUrl = url('api/v1/hospitalportal/download-final-log/' . $requestLog->id);
|
||||||
|
|
||||||
return $this->statusError(
|
return $this->statusError(
|
||||||
'Gagal generate PDF struk pengesahan: ' . $e->getMessage() . '. request_log_id=' . $requestLog->id . ', fallback_url=' . $fallbackUrl,
|
'Gagal generate PDF struk pengesahan: ' . $e->getMessage() . '. request_log_id=' . $requestLog->id . ', fallback_url=' . $fallbackUrl,
|
||||||
500
|
500
|
||||||
@@ -555,6 +504,7 @@ class ProviderOnlineController extends Controller
|
|||||||
->where('code', $kodeProvider)
|
->where('code', $kodeProvider)
|
||||||
->where('status', 'active')
|
->where('status', 'active')
|
||||||
->first();
|
->first();
|
||||||
|
|
||||||
if (!$provider) {
|
if (!$provider) {
|
||||||
return [null, null, $this->statusError('User provider tidak ditemukan')];
|
return [null, null, $this->statusError('User provider tidak ditemukan')];
|
||||||
}
|
}
|
||||||
@@ -566,9 +516,10 @@ class ProviderOnlineController extends Controller
|
|||||||
return [$provider, $organization, null];
|
return [$provider, $organization, null];
|
||||||
}
|
}
|
||||||
|
|
||||||
private function resolvePlan(Member $member, string $serviceCode)
|
private function resolvePlan(Member $member, string $serviceCode): ?Plan
|
||||||
{
|
{
|
||||||
$memberPlan = $member->memberPlans()->with('plan')
|
$memberPlan = $member->memberPlans()
|
||||||
|
->with('plan')
|
||||||
->where('status', 'active')
|
->where('status', 'active')
|
||||||
->orderByDesc('id')
|
->orderByDesc('id')
|
||||||
->get()
|
->get()
|
||||||
@@ -583,6 +534,117 @@ class ProviderOnlineController extends Controller
|
|||||||
return optional($member->memberPlans()->with('plan')->orderByDesc('id')->first())->plan;
|
return optional($member->memberPlans()->with('plan')->orderByDesc('id')->first())->plan;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function resolveBenefitCodes(array $daftarBiaya): array
|
||||||
|
{
|
||||||
|
$codes = collect($daftarBiaya)
|
||||||
|
->pluck('kodesubbenefit')
|
||||||
|
->filter()
|
||||||
|
->unique()
|
||||||
|
->values();
|
||||||
|
|
||||||
|
if ($codes->isEmpty()) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$benefits = Benefit::query()
|
||||||
|
->whereIn('code', $codes)
|
||||||
|
->get()
|
||||||
|
->keyBy('code');
|
||||||
|
|
||||||
|
$missing = $codes->filter(function (string $code) use ($benefits) {
|
||||||
|
return !$benefits->has($code);
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($missing->isNotEmpty()) {
|
||||||
|
return [
|
||||||
|
'error' => 'Kode sub benefit tidak valid: ' . $missing->implode(', '),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $benefits->all();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function buildClaimHeader(RequestLog $requestLog, Organization $organization): array
|
||||||
|
{
|
||||||
|
$requestLog->loadMissing(['member.currentCorporate', 'member.currentPolicy', 'plan']);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'noklaim' => $requestLog->code,
|
||||||
|
'namapeserta' => optional($requestLog->member)->full_name,
|
||||||
|
'tanggallahir' => $this->isoDate(optional($requestLog->member)->birth_date),
|
||||||
|
'nokartu' => optional($requestLog->member)->member_id,
|
||||||
|
'nopolis' => optional(optional($requestLog->member)->currentPolicy)->code,
|
||||||
|
'nobpjs' => optional($requestLog->member)->bpjs_id,
|
||||||
|
'nosep' => $requestLog->nomor_sep,
|
||||||
|
'nomorrujukan' => $requestLog->nomor_rujukan,
|
||||||
|
'planid' => optional($requestLog->plan)->code,
|
||||||
|
'masapolis' => optional(optional($requestLog->member)->currentPolicy)->end
|
||||||
|
? Carbon::parse($requestLog->member->currentPolicy->end)->format('d/m/Y')
|
||||||
|
: null,
|
||||||
|
'namaperusahaan' => optional(optional($requestLog->member)->currentCorporate)->name,
|
||||||
|
'namapenjamin' => $organization->name,
|
||||||
|
'tanggalmasuk' => $this->isoDate($requestLog->admission_date),
|
||||||
|
'tanggalkeluar' => $this->isoDate($requestLog->discharge_date),
|
||||||
|
'hakkamar' => $requestLog->penempatan_kamar,
|
||||||
|
'hakicu' => null,
|
||||||
|
'nosuratjaminan' => $requestLog->code,
|
||||||
|
'namapegawai' => null,
|
||||||
|
'namabenefit' => optional($requestLog->plan)->corporate_plan_id,
|
||||||
|
'kodediagnosa' => $requestLog->diagnosis,
|
||||||
|
'keterangan' => $requestLog->keterangan,
|
||||||
|
'catatanTC1' => null,
|
||||||
|
'catatanTC2' => null,
|
||||||
|
'catatanTC3' => null,
|
||||||
|
'catatanTC4' => null,
|
||||||
|
'catatanTC5' => null,
|
||||||
|
'catatanTC6' => null,
|
||||||
|
'catatanTC7' => null,
|
||||||
|
'catatanTC8' => null,
|
||||||
|
'catatanTC9' => null,
|
||||||
|
'catatanTC10' => null,
|
||||||
|
'statusrujukan' => $requestLog->status_rujukan,
|
||||||
|
'statusklaim' => 0,
|
||||||
|
'notransaksiprovider' => $requestLog->no_transaksi_provider,
|
||||||
|
'inacbgscode' => $requestLog->inacbgs_code,
|
||||||
|
'inacbgsamount' => (float) ($requestLog->inacbgs_amount ?? 0),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function sendProviderOnlineEmail(string $eventName, RequestLog $requestLog, Organization $organization): void
|
||||||
|
{
|
||||||
|
$email = trim((string) ($organization->email ?? env('PROVIDER_ONLINE_NOTIFICATION_EMAIL', 'alarm.center@linksehat.com')));
|
||||||
|
if (!$email || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = $organization->name ?: 'Provider';
|
||||||
|
$subject = sprintf('[ProviderOnline] %s - %s', ucfirst($eventName), $requestLog->code);
|
||||||
|
$body = sprintf(
|
||||||
|
'<p>Halo %s,</p><p>Event <strong>%s</strong> berhasil diproses untuk nomor klaim <strong>%s</strong>.</p><p>Waktu: %s</p>',
|
||||||
|
e($name),
|
||||||
|
e($eventName),
|
||||||
|
e($requestLog->code),
|
||||||
|
now()->format('Y-m-d H:i:s')
|
||||||
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Helper::sendEmail([
|
||||||
|
'email' => $email,
|
||||||
|
'name' => $name,
|
||||||
|
'subject' => $subject,
|
||||||
|
'body' => $body,
|
||||||
|
]);
|
||||||
|
} catch (Throwable $throwable) {
|
||||||
|
Log::warning('ProviderOnline notification email failed', [
|
||||||
|
'event' => $eventName,
|
||||||
|
'request_log_id' => $requestLog->id,
|
||||||
|
'request_log_code' => $requestLog->code,
|
||||||
|
'organization_id' => $organization->id,
|
||||||
|
'error' => $throwable->getMessage(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private function okStatus(): array
|
private function okStatus(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Modules\ProviderIntegrations\Providers;
|
||||||
|
|
||||||
|
use Illuminate\Support\ServiceProvider;
|
||||||
|
|
||||||
|
class ProviderIntegrationsServiceProvider extends ServiceProvider
|
||||||
|
{
|
||||||
|
protected $moduleName = 'ProviderIntegrations';
|
||||||
|
|
||||||
|
protected $moduleNameLower = 'providerintegrations';
|
||||||
|
|
||||||
|
public function boot()
|
||||||
|
{
|
||||||
|
$this->registerTranslations();
|
||||||
|
$this->registerConfig();
|
||||||
|
$this->registerViews();
|
||||||
|
$this->loadMigrationsFrom(module_path($this->moduleName, 'Database/Migrations'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register()
|
||||||
|
{
|
||||||
|
$this->app->register(RouteServiceProvider::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function registerConfig()
|
||||||
|
{
|
||||||
|
$this->publishes([
|
||||||
|
module_path($this->moduleName, 'Config/config.php') => config_path($this->moduleNameLower . '.php'),
|
||||||
|
], 'config');
|
||||||
|
|
||||||
|
$this->mergeConfigFrom(
|
||||||
|
module_path($this->moduleName, 'Config/config.php'),
|
||||||
|
$this->moduleNameLower
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function registerViews()
|
||||||
|
{
|
||||||
|
$viewPath = resource_path('views/modules/' . $this->moduleNameLower);
|
||||||
|
$sourcePath = module_path($this->moduleName, 'Resources/views');
|
||||||
|
|
||||||
|
$this->publishes([
|
||||||
|
$sourcePath => $viewPath,
|
||||||
|
], ['views', $this->moduleNameLower . '-module-views']);
|
||||||
|
|
||||||
|
$this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function registerTranslations()
|
||||||
|
{
|
||||||
|
$langPath = resource_path('lang/modules/' . $this->moduleNameLower);
|
||||||
|
|
||||||
|
if (is_dir($langPath)) {
|
||||||
|
$this->loadTranslationsFrom($langPath, $this->moduleNameLower);
|
||||||
|
$this->loadJsonTranslationsFrom($langPath, $this->moduleNameLower);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->loadTranslationsFrom(module_path($this->moduleName, 'Resources/lang'), $this->moduleNameLower);
|
||||||
|
$this->loadJsonTranslationsFrom(module_path($this->moduleName, 'Resources/lang'), $this->moduleNameLower);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provides()
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getPublishableViewPaths(): array
|
||||||
|
{
|
||||||
|
$paths = [];
|
||||||
|
|
||||||
|
foreach (config('view.paths') as $path) {
|
||||||
|
if (is_dir($path . '/modules/' . $this->moduleNameLower)) {
|
||||||
|
$paths[] = $path . '/modules/' . $this->moduleNameLower;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $paths;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Modules\ProviderIntegrations\Providers;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
|
||||||
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
|
class RouteServiceProvider extends ServiceProvider
|
||||||
|
{
|
||||||
|
protected $moduleNamespace = 'Modules\\ProviderIntegrations\\Http\\Controllers';
|
||||||
|
|
||||||
|
public function boot()
|
||||||
|
{
|
||||||
|
parent::boot();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function map()
|
||||||
|
{
|
||||||
|
$this->mapApiRoutes();
|
||||||
|
$this->mapWebRoutes();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function mapWebRoutes()
|
||||||
|
{
|
||||||
|
Route::middleware('web')
|
||||||
|
->namespace($this->moduleNamespace)
|
||||||
|
->group(module_path('ProviderIntegrations', '/Routes/web.php'));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function mapApiRoutes()
|
||||||
|
{
|
||||||
|
Route::prefix('api')
|
||||||
|
->middleware('api')
|
||||||
|
->namespace($this->moduleNamespace)
|
||||||
|
->group(module_path('ProviderIntegrations', '/Routes/api.php'));
|
||||||
|
}
|
||||||
|
}
|
||||||
14
Modules/ProviderIntegrations/Routes/api.php
Normal file
14
Modules/ProviderIntegrations/Routes/api.php
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Modules\ProviderIntegrations\Http\Controllers\Api\ProviderOnlineController;
|
||||||
|
|
||||||
|
Route::prefix('v1/bridging-service/ProviderOnline')->group(function () {
|
||||||
|
Route::post('HeaderKey', [ProviderOnlineController::class, 'getHeaderKey']);
|
||||||
|
Route::post('EligibilitasPeserta', [ProviderOnlineController::class, 'checkEligibilitasPeserta']);
|
||||||
|
Route::post('Pendaftaran', [ProviderOnlineController::class, 'createPendaftaran']);
|
||||||
|
Route::post('Pengesahan', [ProviderOnlineController::class, 'createPengesahan']);
|
||||||
|
Route::post('BillingSementara', [ProviderOnlineController::class, 'upsertBillingSementara']);
|
||||||
|
Route::post('RincianBiayaKlaim', [ProviderOnlineController::class, 'getRincianBiayaKlaim']);
|
||||||
|
Route::post('StrukPendaftaran', [ProviderOnlineController::class, 'downloadStrukPendaftaran']);
|
||||||
|
Route::post('StrukPengesahan', [ProviderOnlineController::class, 'downloadStrukPengesahan']);
|
||||||
|
});
|
||||||
7
Modules/ProviderIntegrations/Routes/web.php
Normal file
7
Modules/ProviderIntegrations/Routes/web.php
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
Route::prefix('providerintegrations')->group(function () {
|
||||||
|
Route::get('/', function () {
|
||||||
|
return response()->json(['module' => 'ProviderIntegrations']);
|
||||||
|
});
|
||||||
|
});
|
||||||
21
Modules/ProviderIntegrations/composer.json
Normal file
21
Modules/ProviderIntegrations/composer.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "nwidart/providerintegrations",
|
||||||
|
"description": "",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Nicolas Widart",
|
||||||
|
"email": "n.widart@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"extra": {
|
||||||
|
"laravel": {
|
||||||
|
"providers": [],
|
||||||
|
"aliases": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Modules\\ProviderIntegrations\\": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Modules/ProviderIntegrations/module.json
Normal file
11
Modules/ProviderIntegrations/module.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "ProviderIntegrations",
|
||||||
|
"alias": "providerintegrations",
|
||||||
|
"description": "",
|
||||||
|
"keywords": [],
|
||||||
|
"priority": 0,
|
||||||
|
"providers": [
|
||||||
|
"Modules\\ProviderIntegrations\\Providers\\ProviderIntegrationsServiceProvider"
|
||||||
|
],
|
||||||
|
"files": []
|
||||||
|
}
|
||||||
@@ -3,5 +3,6 @@
|
|||||||
"Client": true,
|
"Client": true,
|
||||||
"Linksehat": true,
|
"Linksehat": true,
|
||||||
"HospitalPortal": true,
|
"HospitalPortal": true,
|
||||||
"Primaya": true
|
"Primaya": true,
|
||||||
}
|
"ProviderIntegrations": true
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user