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\ClaimController;
|
||||
use Modules\HospitalPortal\Http\Controllers\Api\NotificationController;
|
||||
use Modules\HospitalPortal\Http\Controllers\Api\ProviderOnlineController;
|
||||
use Modules\HospitalPortal\Http\Controllers\Api\RequestLogController;
|
||||
use Modules\Internal\Http\Controllers\Api\RequestLogController as RequestLogControllerInternal;
|
||||
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
|
||||
|
||||
namespace Modules\HospitalPortal\Http\Controllers\Api;
|
||||
namespace Modules\ProviderIntegrations\Http\Controllers\Api;
|
||||
|
||||
use App\Helpers\Helper;
|
||||
use App\Models\Benefit;
|
||||
use App\Models\Claim;
|
||||
use App\Models\CorporateBenefit;
|
||||
use App\Models\Member;
|
||||
use App\Models\MemberPlan;
|
||||
use App\Models\Organization;
|
||||
use App\Models\Plan;
|
||||
use App\Models\Provider;
|
||||
use App\Models\RequestLog;
|
||||
use App\Models\RequestLogBenefit;
|
||||
@@ -16,59 +17,13 @@ use Illuminate\Http\Request;
|
||||
use Illuminate\Routing\Controller;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Str;
|
||||
use PDF;
|
||||
use Modules\HospitalPortal\Http\Controllers\Api\RequestLogController;
|
||||
use Throwable;
|
||||
|
||||
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)
|
||||
{
|
||||
$request->validate([
|
||||
@@ -122,7 +77,7 @@ class ProviderOnlineController extends Controller
|
||||
'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) {
|
||||
return $authError;
|
||||
}
|
||||
@@ -136,31 +91,22 @@ class ProviderOnlineController extends Controller
|
||||
return $this->statusError('Peserta tidak ditemukan');
|
||||
}
|
||||
|
||||
$planIds = $member->memberPlans
|
||||
->pluck('plan_id')
|
||||
->filter()
|
||||
->unique()
|
||||
->values();
|
||||
$benefits = $member->memberPlans
|
||||
->map(function (MemberPlan $memberPlan) {
|
||||
$plan = $memberPlan->plan;
|
||||
if (!$plan || empty($plan->code)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$benefits = collect();
|
||||
if ($planIds->isNotEmpty()) {
|
||||
$benefits = CorporateBenefit::query()
|
||||
->with(['benefit', 'plan'])
|
||||
->whereIn('plan_id', $planIds)
|
||||
->get()
|
||||
->map(function (CorporateBenefit $corporateBenefit) {
|
||||
return [
|
||||
// Keep response keys unchanged, but fill with sub-benefit data
|
||||
'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 [
|
||||
'kodebenefit' => $plan->code,
|
||||
'namabenefit' => $plan->corporate_plan_id,
|
||||
'planid' => $plan->code,
|
||||
];
|
||||
})
|
||||
->filter()
|
||||
->unique('kodebenefit')
|
||||
->values();
|
||||
|
||||
return response()->json([
|
||||
'Status' => $this->okStatus(),
|
||||
@@ -204,7 +150,7 @@ class ProviderOnlineController extends Controller
|
||||
'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) {
|
||||
return $authError;
|
||||
}
|
||||
@@ -213,6 +159,7 @@ class ProviderOnlineController extends Controller
|
||||
->with(['person', 'currentCorporate', 'currentPolicy'])
|
||||
->where('member_id', $request->nokartu)
|
||||
->first();
|
||||
|
||||
if (!$member) {
|
||||
return $this->statusError('Peserta tidak ditemukan');
|
||||
}
|
||||
@@ -263,49 +210,17 @@ class ProviderOnlineController extends Controller
|
||||
'namasubbenefit' => optional($corporateBenefit->benefit)->description,
|
||||
'batasan' => (string) ($corporateBenefit->limit_amount ?? 0),
|
||||
];
|
||||
})
|
||||
->filter(function (array $item) {
|
||||
return !empty($item['kodesubbenefit']);
|
||||
});
|
||||
}
|
||||
|
||||
$this->sendProviderOnlineEmail('pendaftaran baru', $requestLog, $organization);
|
||||
|
||||
return response()->json([
|
||||
'Status' => $this->okStatus(),
|
||||
'Data' => [[
|
||||
'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),
|
||||
]],
|
||||
'Data' => [$this->buildClaimHeader($requestLog, $organization)],
|
||||
'LimitSubBenefit' => $limitSubBenefit->values(),
|
||||
]);
|
||||
}
|
||||
@@ -326,7 +241,7 @@ class ProviderOnlineController extends Controller
|
||||
'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) {
|
||||
return $authError;
|
||||
}
|
||||
@@ -336,12 +251,18 @@ class ProviderOnlineController extends Controller
|
||||
->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([
|
||||
'status_final_log' => 'approved',
|
||||
'status_final_log' => 'approve',
|
||||
'final_log' => true,
|
||||
'discharge_date' => $request->tanggalkeluar,
|
||||
'diagnosis' => $request->kodediagnosa,
|
||||
@@ -350,10 +271,7 @@ class ProviderOnlineController extends Controller
|
||||
]);
|
||||
|
||||
foreach (($request->daftarbiaya ?? []) as $biaya) {
|
||||
$benefit = Benefit::query()->where('code', $biaya['kodesubbenefit'])->first();
|
||||
if (!$benefit) {
|
||||
continue;
|
||||
}
|
||||
$benefit = $benefitsByCode[$biaya['kodesubbenefit']];
|
||||
|
||||
RequestLogBenefit::query()->updateOrCreate(
|
||||
[
|
||||
@@ -386,50 +304,78 @@ class ProviderOnlineController extends Controller
|
||||
];
|
||||
})->values();
|
||||
|
||||
$this->sendProviderOnlineEmail('pengesahan', $requestLog, $organization);
|
||||
|
||||
return response()->json([
|
||||
'Status' => $this->okStatus(),
|
||||
'Data' => [[
|
||||
'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),
|
||||
]],
|
||||
'Data' => [$this->buildClaimHeader($requestLog, $organization)],
|
||||
'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)
|
||||
{
|
||||
$request->validate([
|
||||
@@ -439,16 +385,17 @@ class ProviderOnlineController extends Controller
|
||||
'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) {
|
||||
return $authError;
|
||||
}
|
||||
|
||||
$requestLog = RequestLog::query()
|
||||
->with(['plan', 'requestLogBenefits.benefit'])
|
||||
->with(['member.person', 'member.currentCorporate', 'member.currentPolicy', 'plan', 'requestLogBenefits.benefit'])
|
||||
->where('code', $request->noklaim)
|
||||
->where('organization_id', $organization->id)
|
||||
->first();
|
||||
|
||||
if (!$requestLog) {
|
||||
return $this->statusError('Nomor klaim tidak ditemukan');
|
||||
}
|
||||
@@ -469,13 +416,7 @@ class ProviderOnlineController extends Controller
|
||||
|
||||
return response()->json([
|
||||
'Status' => $this->okStatus(),
|
||||
'Data' => [
|
||||
'noklaim' => $requestLog->code,
|
||||
'kodeprovider' => $organization->code,
|
||||
'nosep' => $requestLog->nomor_sep,
|
||||
'keterangan' => $requestLog->keterangan,
|
||||
'statusklaim' => $requestLog->status,
|
||||
],
|
||||
'Data' => [$this->buildClaimHeader($requestLog, $organization)],
|
||||
'Biaya' => $biaya,
|
||||
]);
|
||||
}
|
||||
@@ -489,21 +430,25 @@ class ProviderOnlineController extends Controller
|
||||
'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) {
|
||||
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) {
|
||||
return $this->statusError('Nomor klaim tidak ditemukan');
|
||||
}
|
||||
|
||||
try {
|
||||
$requestLogController = new RequestLogController();
|
||||
return $requestLogController->downlodLog($requestLog->id);
|
||||
return (new RequestLogController())->downlodLog($requestLog->id);
|
||||
} catch (Throwable $e) {
|
||||
$fallbackUrl = url('api/v1/hospitalportal/download-log/' . $requestLog->id);
|
||||
|
||||
return $this->statusError(
|
||||
'Gagal generate PDF struk pendaftaran: ' . $e->getMessage() . '. request_log_id=' . $requestLog->id . ', fallback_url=' . $fallbackUrl,
|
||||
500
|
||||
@@ -520,21 +465,25 @@ class ProviderOnlineController extends Controller
|
||||
'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) {
|
||||
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) {
|
||||
return $this->statusError('Nomor klaim tidak ditemukan');
|
||||
}
|
||||
|
||||
try {
|
||||
$requestLogController = new RequestLogController();
|
||||
return $requestLogController->downlodFinalLog($requestLog->id);
|
||||
return (new RequestLogController())->downlodFinalLog($requestLog->id);
|
||||
} catch (Throwable $e) {
|
||||
$fallbackUrl = url('api/v1/hospitalportal/download-final-log/' . $requestLog->id);
|
||||
|
||||
return $this->statusError(
|
||||
'Gagal generate PDF struk pengesahan: ' . $e->getMessage() . '. request_log_id=' . $requestLog->id . ', fallback_url=' . $fallbackUrl,
|
||||
500
|
||||
@@ -555,6 +504,7 @@ class ProviderOnlineController extends Controller
|
||||
->where('code', $kodeProvider)
|
||||
->where('status', 'active')
|
||||
->first();
|
||||
|
||||
if (!$provider) {
|
||||
return [null, null, $this->statusError('User provider tidak ditemukan')];
|
||||
}
|
||||
@@ -566,9 +516,10 @@ class ProviderOnlineController extends Controller
|
||||
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')
|
||||
->orderByDesc('id')
|
||||
->get()
|
||||
@@ -583,6 +534,117 @@ class ProviderOnlineController extends Controller
|
||||
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
|
||||
{
|
||||
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,
|
||||
"Linksehat": true,
|
||||
"HospitalPortal": true,
|
||||
"Primaya": true
|
||||
}
|
||||
"Primaya": true,
|
||||
"ProviderIntegrations": true
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user