[WIP] Claim

This commit is contained in:
R
2022-12-08 12:26:29 +07:00
parent 7d8a60f207
commit 32efc28043
7 changed files with 217 additions and 29 deletions

View File

@@ -0,0 +1,58 @@
<?php
namespace App\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\Member;
use App\Services\ClaimService;
use Illuminate\Http\Request;
class MembershipController extends Controller
{
//
public function check(Request $request)
{
$request->validate([
'member_id' => 'required',
'birth_date' => 'required',
]);
$member = Member::where('member_id', $request->member_id)->first();
if (!$member) {
return Helper::responseJson(statusCode: 404, message: 'Member not found.');
}
if (!$member->active) {
return Helper::responseJson(statusCode: 406, message: 'The Member '.$request->member_id.' is Inactive.');
}
return Helper::responseJson(data: $member, message: 'Member Found');
}
public function checkLimit(Request $request)
{
$request->validate([
'member_id' => 'required',
'type' => 'required|in:consultation-gp,consultation-specialist,medicine'
]);
if ($request->type == 'consultation-gp') {
$benefitCode = 'OPCONS1';
}
if ($request->type == 'consultation-specialist') {
$benefitCode = 'OPCONS2';
}
if ($request->type == 'medicine') {
$benefitCode = 'OPMEDI1';
}
$member = Member::where('member_id', $request->member_id)->with(['currentCorporate', 'currentPolicy', 'currentPlan'])->first();
$limits = ClaimService::showMemberBenefitLimit($member, $benefitCode);
return Helper::responseJson(data: $limits);
}
}

View File

@@ -64,5 +64,6 @@ class Kernel extends HttpKernel
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'linksehat.old.auth' => \App\Http\Middleware\LinksehatOldAuthMiddleware::class,
];
}

View File

@@ -0,0 +1,25 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class LinksehatOldAuthMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
if ($request->header('authorization') == 'Bearer LpMbGm0NQvFC3lUBiy1Ch3NzS0CIPSmanR12FcdP') {
return $next($request);
}
return abort(401, "Unauthenticated");
}
}

View File

@@ -132,6 +132,21 @@ class Benefit extends Model
"Show Benefit Value" => 'show_benefit_value',
];
public static $max_frequency_periods = [
0 => 'Policy Period',
1 => 'Daily Visit',
2 => 'Weekly',
3 => 'Monthly',
4 => 'Yearly',
5 => 'Disability',
6 => 'Visit',
];
protected $appends = [
'max_frequency_period_name',
'max_frequency'
];
public function setAreaLimitAttribute($value)
{
$this->attributes['area_limit'] = empty($value) ? null : $value;
@@ -168,4 +183,42 @@ class Benefit extends Model
{
return $this->belongsTo(Plan::class, 'plan_code', 'code');
}
public function getMaxFrequencyPeriodNameAttribute()
{
return self::$max_frequency_periods[$this->max_frequency_period] ?? null;
}
public function getMaxFrequencyAttribute()
{
switch ($this->max_frequency_period) {
// case(0) :
// // TODO Fix This
// return null;
// break;
case(1) :
return empty($this->daily_frequency) ? 1 : $this->daily_frequency;
break;
case(2) :
return empty($this->weekly_frequency) ? 1 : $this->weekly_frequency;
break;
case(3) :
return empty($this->monthly_frequency) ? 1 : $this->monthly_frequency;
break;
case(4) :
return empty($this->yearly_frequency) ? 1 : $this->yearly_frequency;
break;
case(5) :
// TODO Fix This
return empty($this->max_period_for_disability) ? 1 : $this->max_period_for_disability;
break;
case(6) :
// TODO Fix This
return 1;
break;
default :
return null;
break;
}
}
}

View File

@@ -99,17 +99,24 @@ class Member extends Model
public function currentCorporate()
{
return $this->belongsToMany(Corporate::class, 'corporate_employees', 'corporate_id', 'member_id')
// ->withPivot([
// 'branch_code',
// 'divison_id',
// 'nik',
// 'status',
// 'start',
// 'end'
// ])
->where('start', '<', now())
->where('end', '>', now());
// return $this->belongsToMany(Corporate::class, 'corporate_employees', 'corporate_id', 'member_id')
// // ->withPivot([
// // 'branch_code',
// // 'divison_id',
// // 'nik',
// // 'status',
// // 'start',
// // 'end'
// // ])
// ->where('start', '<', now())
// ->where('end', '>', now());
return $this->hasOneThrough(Corporate::class, CorporateEmployee::class, 'member_id', 'id', 'id', 'corporate_id');
// ->where('corporate_policies.start', '<', now())
// ->where('corporate_policies.end', '>', now())
// ->where('member_policies.start', '<', now())
// ->where('member_policies.end', '>', now());
}
public function memberPlans()

View File

@@ -10,23 +10,6 @@ use Str;
class ClaimService{
public function storeClaim($member, $icd, $benefit, $totalClaim)
{
$claim = Claim::create([
'code' => Str::random('16'),
'member_id' => $member->id,
'diagnosis_id' => $icd,
'total_claim' => $totalClaim,
'currency' => 'IDR',
'plan_id' => $member->currentPlan->id,
'benefit_id' => $benefit->id,
]);
$corporate = $member->asd;
return $claim;asldkmalskdmalksmdalksmd
}
public static function getMemberTotalUsage(Member $member, $startDate = null, $endDate = null)
{
$startDate = empty($startDate) ? Carbon::now()->startOfMonth() : $startDate;
@@ -116,6 +99,62 @@ class ClaimService{
];
}
public static function getMemberUsageByBenefitLimit($member, $benefit)
{
}
public static function showMemberBenefitLimit($member, $benefit_code)
{
// $plan = $member->currentPlan;
// $policy = $member->currentPolicy;
// $corporate = $member->currentCorporate;
$benefit = $member->currentPlan->benefits()->where('code', $benefit_code)->first();
// dd($benefit->toArray());
// dd(compact(['plan', 'policy', 'corporate', 'benefit']));
$limits = [
'total_limit' => $benefit->limit_amount,
'frequency_limit_name' => $benefit->max_frequency_period_name,
'frequency_limit' => $benefit->max_frequency,
'total_claim' => 0,
'remaining_limit' => $benefit->limit_amount,
'usage_daily' => null,
'usage_weekly' => null,
'usage_monthly' => null,
'usage_yearly' => null
];
switch ($benefit->max_frequency_period) {
case(0) :
$limits['usage_yearly'] = $member->claims()->used(Carbon::now()->firstOfYear(), now())->count();
$limits['total_claim'] = $member->claims()->used(Carbon::now()->firstOfYear(), now())->sum('total_claim');
break;
case(1) :
$limits['usage_daily'] = $member->claims()->used(now()->format('Y-m-d'), now()->addDay(1)->format('Y-m-d'))->count();
$limits['total_claim'] = $member->claims()->used(now()->format('Y-m-d'), now()->addDay(1)->format('Y-m-d'))->sum('total_claim');
break;
case(2) :
$limits['usage_weekly'] = $member->claims()->used(Carbon::parse('Previous Sunday'), now())->count();
$limits['total_claim'] = $member->claims()->used(Carbon::parse('Previous Sunday'), now())->sum('total_claim');
break;
case(3) :
$limits['usage_monthly'] = $member->claims()->used(Carbon::now()->firstOfMonth(), now())->count();
$limits['total_claim'] = $member->claims()->used(Carbon::now()->firstOfMonth(), now())->sum('total_claim');
break;
case(4) :
$limits['usage_yearly'] = $member->claims()->used(Carbon::now()->firstOfYear(), now())->count();
$limits['total_claim'] = $member->claims()->used(Carbon::now()->firstOfYear(), now())->sum('total_claim');
break;
default :
// return null;
break;
}
$limits['remaining_limit'] = $benefit->limit_amount - $limits['total_claim'];
return $limits;
}
public static function storeClaim($member, $diagnosis, $totalClaim, $benefit, $status)
{
try {

View File

@@ -1,7 +1,7 @@
<?php
use App\Http\Controllers\Api\AuthController;
use App\Http\Controllers\Api\MemberController;
use App\Http\Controllers\Api\MembershipController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
@@ -15,3 +15,8 @@ use Illuminate\Support\Facades\Route;
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::middleware('linksehat.old.auth')->group(function() {
Route::post('check-membership', [MembershipController::class, 'check']);
Route::post('check-limit', [MembershipController::class, 'checkLimit']);
});