From 4a7c3ebddac0738e474b288895a8d7d48f00648a Mon Sep 17 00:00:00 2001 From: Fajar Date: Sat, 25 Mar 2023 16:15:26 +0700 Subject: [PATCH] [WIP] Claim Report & Dashboard --- .../Http/Controllers/Api/ClaimController.php | 31 ++++-- .../Api/CorporateMemberController.php | 74 ++------------ Modules/Client/Routes/api.php | 3 +- .../ClaimReport/MemberResources.php | 26 +++++ app/Builders/MemberBuilder.php | 9 ++ app/Services/ClaimService.php | 96 +++++++++++++------ app/Services/CorporateMemberService.php | 40 +++++++- .../src/pages/ClaimReport/Index.tsx | 8 +- 8 files changed, 178 insertions(+), 109 deletions(-) create mode 100644 Modules/Client/Transformers/ClaimReport/MemberResources.php diff --git a/Modules/Client/Http/Controllers/Api/ClaimController.php b/Modules/Client/Http/Controllers/Api/ClaimController.php index f378ef81..f58efa52 100644 --- a/Modules/Client/Http/Controllers/Api/ClaimController.php +++ b/Modules/Client/Http/Controllers/Api/ClaimController.php @@ -4,6 +4,7 @@ namespace Modules\Client\Http\Controllers\Api; use App\Helpers\Helper; use App\Models\Claim; +use App\Services\ClaimService; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; @@ -11,6 +12,24 @@ use Modules\Client\Transformers\ClaimShowResource; class ClaimController extends Controller { + public function __construct(public ClaimService $claimService) + { + } + + public function status($corporate_id) + { + $claims = $this->claimService->getCountClaimRequestPerStatus($corporate_id); + + dd($claims); + + return Helper::responseJson([ + 'count_requested' => 0, + 'count_approval' => 0, + 'count_disbrushment' => 0, + 'count_rejected' => 0, + ]); + } + /** * Display a listing of the resource. * @return Renderable @@ -18,8 +37,8 @@ class ClaimController extends Controller public function index(Request $request, $corporate_id) { $claims = Claim::query() - ->when($request->search ?? null, function($query, $search) { - $query->where('code', 'LIKE', '%'.$search.'%'); + ->when($request->search ?? null, function ($query, $search) { + $query->where('code', 'LIKE', '%' . $search . '%'); }) ->with([ 'member', @@ -27,7 +46,7 @@ class ClaimController extends Controller return $diagnosis->where('type', 'primary'); }, 'diagnoses.icd', - 'plan', + 'plan', 'benefit', 'claimRequest', 'claimRequest.service' @@ -65,8 +84,8 @@ class ClaimController extends Controller { $claim = Claim::query() ->with([ - 'member', - 'member.currentPlan', + 'member', + 'member.currentPlan', 'member.currentPlan.benefits', 'member.currentCorporate', 'member.currentPolicy', @@ -78,7 +97,7 @@ class ClaimController extends Controller 'claimRequest.files', 'items', 'items.claim_itemable', - ]) + ]) ->findOrFail($id); return Helper::responseJson(ClaimShowResource::make($claim)); diff --git a/Modules/Client/Http/Controllers/Api/CorporateMemberController.php b/Modules/Client/Http/Controllers/Api/CorporateMemberController.php index d0367231..8b4f0964 100755 --- a/Modules/Client/Http/Controllers/Api/CorporateMemberController.php +++ b/Modules/Client/Http/Controllers/Api/CorporateMemberController.php @@ -7,7 +7,8 @@ use App\Services\CorporateMemberService; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; -use Modules\Client\Transformers\Dashboard\MemberResources; +use Modules\Client\Transformers\ClaimReport\MemberResources as ClaimReportMemberResources; +use Modules\Client\Transformers\Dashboard\MemberResources as DashboardMemberResources; class CorporateMemberController extends Controller { @@ -21,68 +22,13 @@ class CorporateMemberController extends Controller */ public function index(Request $request, $corporate_id) { - $members = $this->corporateMemberService->getAllDashboardMembers($corporate_id, $request); - - return response()->json(Helper::paginateResources(MemberResources::collection($members))); - } - - /** - * Show the form for creating a new resource. - * @return Renderable - */ - public function create() - { - return view('client::create'); - } - - /** - * Store a newly created resource in storage. - * @param Request $request - * @return Renderable - */ - public function store(Request $request) - { - // - } - - /** - * Show the specified resource. - * @param int $id - * @return Renderable - */ - public function show($id) - { - return view('client::show'); - } - - /** - * Show the form for editing the specified resource. - * @param int $id - * @return Renderable - */ - public function edit($id) - { - return view('client::edit'); - } - - /** - * Update the specified resource in storage. - * @param Request $request - * @param int $id - * @return Renderable - */ - public function update(Request $request, $id) - { - // - } - - /** - * Remove the specified resource from storage. - * @param int $id - * @return Renderable - */ - public function destroy($id) - { - // + switch ($request->input('type')) { + case 'claim-report': + $members = $this->corporateMemberService->getAllMemberClaimReports($corporate_id, $request); + return response()->json(Helper::paginateResources(ClaimReportMemberResources::collection($members))); + default: + $members = $this->corporateMemberService->getAllMemberDashboards($corporate_id, $request); + return response()->json(Helper::paginateResources(DashboardMemberResources::collection($members))); + } } } diff --git a/Modules/Client/Routes/api.php b/Modules/Client/Routes/api.php index 49b3d864..8965d398 100755 --- a/Modules/Client/Routes/api.php +++ b/Modules/Client/Routes/api.php @@ -35,10 +35,11 @@ Route::prefix('client')->group(function () { Route::get('policy', [CorporatePolicyController::class, 'index']); Route::get('division', [CorporateDivisionController::class, 'index']); Route::get('members', [CorporateMemberController::class, 'index']); + Route::get('claims/status', [ClaimController::class, 'status']); Route::get('claims', [ClaimController::class, 'index']); }); - + Route::get('claims/{id}', [ClaimController::class, 'show']); }); }); diff --git a/Modules/Client/Transformers/ClaimReport/MemberResources.php b/Modules/Client/Transformers/ClaimReport/MemberResources.php new file mode 100644 index 00000000..088f3510 --- /dev/null +++ b/Modules/Client/Transformers/ClaimReport/MemberResources.php @@ -0,0 +1,26 @@ + $this->id, + 'memberId' => $this->member_id, + 'fullName' => $this->full_name, + 'division' => $this->division_name ?? '', + 'submission_date' => '', + 'status' => $this->active, + ]; + } +} diff --git a/app/Builders/MemberBuilder.php b/app/Builders/MemberBuilder.php index e7ffed23..78158016 100644 --- a/app/Builders/MemberBuilder.php +++ b/app/Builders/MemberBuilder.php @@ -37,4 +37,13 @@ class MemberBuilder extends Builder 'left' => $this->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id') }; } + + public function joinClaimRequests(string $value = 'join'): static + { + return match ($value) { + 'join' => $this->join('claim_requests', 'members.id', '=', 'claim_requests.member_id'), + 'left' => $this->leftJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id'), + 'right' => $this->rightJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id') + }; + } } diff --git a/app/Services/ClaimService.php b/app/Services/ClaimService.php index 23115e21..49ff4283 100644 --- a/app/Services/ClaimService.php +++ b/app/Services/ClaimService.php @@ -2,15 +2,14 @@ namespace App\Services; -use App\Events\ClaimApproved; use App\Models\Claim; -use App\Models\Icd; use App\Models\Member; use Carbon\Carbon; -use DB; -use Str; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Facades\DB; -class ClaimService{ +class ClaimService +{ public static function getMemberTotalUsage(Member $member, $startDate = null, $endDate = null) { @@ -18,9 +17,9 @@ class ClaimService{ $endDate = empty($endDate) ? Carbon::now()->startOfMonth() : $endDate; $claims = $member->claims() - ->used($startDate, $endDate) - ->get(); - $total = $claims->sum(function($claim){ + ->used($startDate, $endDate) + ->get(); + $total = $claims->sum(function ($claim) { return $claim->total_claim; }); @@ -33,7 +32,7 @@ class ClaimService{ $policy = $member->currentPolicy; $corporate = $policy->corporate; - + $isEligible = true; $validationErrors = []; @@ -42,7 +41,7 @@ class ClaimService{ if (!in_array($member->marital_status, explode(',', $benefit->msc))) { $validationErrors[] = [ 'error' => 'msc', - 'message' => 'Only '.$benefit->msc + 'message' => 'Only ' . $benefit->msc ]; $isEligible = false; } @@ -50,7 +49,7 @@ class ClaimService{ if (!in_array($member->gender_code, explode(',', $benefit->genders))) { $validationErrors[] = [ 'error' => 'genders', - 'message' => 'Only '.$benefit->genders + 'message' => 'Only ' . $benefit->genders ]; $isEligible = false; } @@ -58,7 +57,7 @@ class ClaimService{ if (!empty($benefit->min_age) && $member->age < $benefit->min_age) { $validationErrors[] = [ 'error' => 'min_age', - 'message' => 'Minimum Age is '.$benefit->min_age + 'message' => 'Minimum Age is ' . $benefit->min_age ]; $isEligible = false; } @@ -66,7 +65,7 @@ class ClaimService{ if (!empty($benefit->max_age) && $member->age > $benefit->max_age) { $validationErrors[] = [ 'error' => 'max_age', - 'message' => 'Maximum Age is '.$benefit->min_age + 'message' => 'Maximum Age is ' . $benefit->min_age ]; $isEligible = false; } @@ -82,14 +81,14 @@ class ClaimService{ ]; $isEligible = false; } - + if (bcsub($benefit->limit_amount, $totalClaim) < 0) { $validationErrors[] = [ 'error' => 'benefit_limit', 'message' => 'Benefit Limit cannot cover this' ]; $isEligible = false; - } + } // TODO complete validations @@ -103,7 +102,6 @@ class ClaimService{ public static function getMemberUsageByBenefitLimit($member, $benefit) { - } public static function showMemberBenefitLimit($member, $benefit_code) @@ -113,11 +111,11 @@ class ClaimService{ // $corporate = $member->currentCorporate; $benefit = $member->currentPlan->benefits()->where('code', $benefit_code)->first(); $corporateBenefit = $member->currentPlan - ->corporateBenefits() - ->where('benefit_id', $benefit->id ?? null) - ->where('plan_id', $member->currentPlan->id) - ->active() - ->first(); + ->corporateBenefits() + ->where('benefit_id', $benefit->id ?? null) + ->where('plan_id', $member->currentPlan->id) + ->active() + ->first(); $limits = [ 'total_limit' => $corporateBenefit ? $corporateBenefit->limit_amount : 0, @@ -130,29 +128,29 @@ class ClaimService{ 'usage_monthly' => null, 'usage_yearly' => null ]; - + switch ($corporateBenefit->max_frequency_period ?? 0) { - case(0) : + 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) : + 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) : + 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) : + 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) : + 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 : + default: // return null; break; } @@ -163,8 +161,8 @@ class ClaimService{ public static function storeClaim($member, $diagnosis = null, $totalClaim = null, $benefit = null, $status = 'requested', $claimRequest = null) { + DB::beginTransaction(); try { - DB::beginTransaction(); $claimData = [ 'member_id' => $member->id, @@ -176,7 +174,7 @@ class ClaimService{ 'benefit_id' => $benefit->id ?? null, 'status' => $status ]; - + $claim = Claim::create($claimData); DB::commit(); @@ -206,4 +204,40 @@ class ClaimService{ // return false; // } -} \ No newline at end of file + + public function getCountClaimRequestPerStatus(int $corporateId) + { + $members = Member::query() + ->joinClaimRequests('right') + ->joinCorporateEmployees('left') + ->where('corporate_employees.corporate_id', $corporateId) + ->get([DB::raw("COUNT(claim_requests.status = 'approved') AS count_approval")]); + + + // ->withCount([ + // 'claimRequests as count_requested' => function (Builder $query) { + // $query->where('status', 'requested'); + // }, + // 'claimRequests as count_approval' => function (Builder $query) { + // $query->where('status', 'approved'); + // }, + // // 'claimRequests as count_disbrushment' => function (Builder $query) { + // // $query->where('status', 'requested'); + // // }, + // 'claimRequests as count_rejected' => function (Builder $query) { + // $query->where('status', 'declined'); + // } + // ]); + + dd($members); + + // $data = [ + // 'count_requested' => $claimRequest->query()->where('status', 'requested')->count(), + // 'count_approval' => $claimRequest->query()->where('status', 'approved')->count(), + // 'count_disbrushment' => 0, + // 'count_rejected' => $claimRequest->query()->where('status', 'declined')->count(), + // ]; + + // return $data; + } +} diff --git a/app/Services/CorporateMemberService.php b/app/Services/CorporateMemberService.php index c17143f7..e71c552d 100644 --- a/app/Services/CorporateMemberService.php +++ b/app/Services/CorporateMemberService.php @@ -8,11 +8,46 @@ use Illuminate\Http\Request; class CorporateMemberService { - public function getAllDashboardMembers(int $corporateId, Request $request) + public function getAllMemberDashboards(int $corporateId, Request $request) { $limit = $request->has('perPage') ? $request->input('perPage') : 10; return Member::query() + ->joinCorporateEmployees('left') + ->joinCorporateDivisions('left') + ->with(['currentPlan', 'person']) + ->withSum('claims', 'total_claim') + ->where('corporate_employees.corporate_id', $corporateId) + ->when($request->input('search'), function (Builder $query, $search) { + $query->where(function (Builder $query) use ($search) { + $query->orWhere('members.member_id', 'like', "%" . $search . "%") + ->orWhere('members.name', 'like', "%" . $search . "%"); + }); + }) + ->when($request->input('division'), function (Builder $query, $value) { + $query->where('corporate_employees.division_id', $value); + }) + ->when($request->has('orderBy'), function (Builder $query) use ($request) { + $orderBy = match ($request->input('orderBy')) { + 'memberId' => 'member_id', + 'fullName' => 'name', + 'status' => 'active', + 'division' => 'corporate_divisions.name', + default => '' + }; + + $query->getQuery()->orderBy($orderBy, $request->order); + }) + ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'corporate_divisions.name AS division_name', 'members.active']) + ->paginate($limit); + } + + public function getAllMemberClaimReports(int $corporateId, Request $request) + { + $limit = $request->has('perPage') ? $request->input('perPage') : 10; + + return Member::query() + ->joinClaimRequests('right') ->joinCorporateEmployees('left') ->joinCorporateDivisions('left') ->with('currentPlan') @@ -35,7 +70,6 @@ class CorporateMemberService $orderBy = match ($request->orderBy) { 'memberId' => 'member_id', 'fullName' => 'name', - 'status' => 'active', default => '' }; @@ -45,7 +79,7 @@ class CorporateMemberService $query->getQuery()->orderBy('corporate_divisions.name', $request->order); } }) - ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'members.name_prefix', 'members.name_suffix', 'corporate_divisions.name AS division_name', 'members.active']) + ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'corporate_divisions.name AS division_name', 'members.active', 'claim_requests.id', 'claim_requests.member_id', 'claim_requests.submission_date']) ->paginate($limit); } } diff --git a/frontend/client-portal/src/pages/ClaimReport/Index.tsx b/frontend/client-portal/src/pages/ClaimReport/Index.tsx index 4d92b827..c4a833d9 100755 --- a/frontend/client-portal/src/pages/ClaimReport/Index.tsx +++ b/frontend/client-portal/src/pages/ClaimReport/Index.tsx @@ -132,8 +132,8 @@ export default function Drugs() { ['orderBy', orders.orderBy], ]); - const claim = await axios.get(`${corporateValue}/claim`, { - params: { ...parameters, claimMember: true }, + const claim = await axios.get(`${corporateValue}/members`, { + params: { ...parameters, type: 'claim-report' }, }); setSearchParams(parameters); @@ -154,14 +154,14 @@ export default function Drugs() { - + /> */}