From 5c71b556a05dad6e349c03e5d46c3fa20200a48a Mon Sep 17 00:00:00 2001 From: R Date: Fri, 17 Feb 2023 14:29:50 +0700 Subject: [PATCH] Update Linking With ASO --- .../Api/OLDLMS/MembershipController.php | 82 +++++++++++++++++++ app/Http/Resources/OLDLMS/MemberResource.php | 19 ++++- app/Models/Corporate.php | 3 +- app/Models/Member.php | 3 +- app/Models/MemberPlan.php | 13 +++ app/Providers/AppServiceProvider.php | 2 + app/Rules/NikRule.php | 66 +++++++++++++++ .../dashboard/src/pages/Corporates/Form.tsx | 7 +- .../src/pages/Master/Formularium/Form.tsx | 2 +- routes/api.php | 3 + 10 files changed, 194 insertions(+), 6 deletions(-) create mode 100644 app/Rules/NikRule.php diff --git a/app/Http/Controllers/Api/OLDLMS/MembershipController.php b/app/Http/Controllers/Api/OLDLMS/MembershipController.php index 8dd2a00a..341f74c2 100644 --- a/app/Http/Controllers/Api/OLDLMS/MembershipController.php +++ b/app/Http/Controllers/Api/OLDLMS/MembershipController.php @@ -4,7 +4,10 @@ namespace App\Http\Controllers\Api\OLDLMS; use App\Helpers\Helper; use App\Http\Controllers\Controller; +use App\Http\Resources\OLDLMS\MemberResource; +use App\Models\Corporate; use App\Models\Member; +use App\Rules\NikRule; use App\Services\ClaimService; use Illuminate\Http\Request; @@ -169,4 +172,83 @@ class MembershipController extends Controller return Helper::responseJson(data: $limits); } + + public function linkingRules(Request $request) + { + $corporates = Corporate::query() + ->when($request->search, function ($q, $search) { + $q->where('name', 'LIKE', '%'.$search.'%'); + }) + ->get(); + + return Helper::responseJson(data: $corporates); + } + + public function linkingValidate(Request $request) + { + $request->validate([ + 'corporate_id' => 'required' + ]); + + $corporate = Corporate::findOrFail($request->corporate_id); + + // Make Validation from Linking Rules + $linkingRulesArr = $corporate->linking_rules->toArray(); + $validationRules = []; + foreach ($linkingRulesArr as $field) { + $rules = ['required']; // Default is required if in the linking_rules + if ($field == 'email') { + $rules[] = 'email'; + } + + if ($field == 'nric') { + $rules[] = new NikRule; + } + + $validationRules[$field] = $rules; + } + $request->validate($validationRules); + + $member = Member::query() + ->when(in_array('nric', $linkingRulesArr), function($q) use ($request) { + $q->where('nric', $request->nric); + }) + ->when(in_array('member_id', $linkingRulesArr), function($q) use ($request) { + $q->where('member_id', $request->member_id); + }) + ->when(in_array('name', $linkingRulesArr), function($q) use ($request) { + $q->where('name', $request->name); + }) + ->when(in_array('dob', $linkingRulesArr), function($q) use ($request) { + $q->where('birth_date', $request->dob); + }) + ->when(in_array('phone', $linkingRulesArr), function($q) use ($request) { + $q->whereHas('person', function ($person) use ($request) { + $person->where('phone', $request->phone); + }); + }) + ->when(in_array('email', $linkingRulesArr), function($q) use ($request) { + $q->where('email', $request->email); + }) + ->when(in_array('nik', $linkingRulesArr), function($q) use ($request) { + $q->whereHas('employeds', function ($employed) use ($request) { + $employed->where('corporate_id', $request->corporate_id) + ->where('nik', $request->nik); + }); + }) + + ->with([ + 'memberPlans' => function ($memberPlan) { + $memberPlan->latest(); + }, + ]) + + ->first(); + + if ($member) { + return Helper::responseJson(data: MemberResource::make($member), message: 'Data Member ditemukan!'); + } + + return Helper::responseJson(data: [], message: 'Member Tidak ditemukan', statusCode: 404, status: 'error'); + } } diff --git a/app/Http/Resources/OLDLMS/MemberResource.php b/app/Http/Resources/OLDLMS/MemberResource.php index c27a55ba..101bfb20 100644 --- a/app/Http/Resources/OLDLMS/MemberResource.php +++ b/app/Http/Resources/OLDLMS/MemberResource.php @@ -14,6 +14,23 @@ class MemberResource extends JsonResource */ public function toArray($request) { - return parent::toArray($request); + // $data = parent::toArray($request); + $currentMemberPlan = $this->memberPlans?->first(); + $currentPlan = $currentMemberPlan ? [ + 'code' => $currentMemberPlan->plan->code ?? null, + 'start' => $currentMemberPlan->start, + 'end' => $currentMemberPlan->end + ] : null; + + $data = [ + 'member_id' => $this->member_id, + 'birth_date' => $this->birth_date, + 'email' => $this->email, + 'phone' => $this->person->phone ?? null, + 'full_name' => $this->full_name, + 'nric' => $this->nric, + 'plan' => $currentPlan + ]; + return $data; } } diff --git a/app/Models/Corporate.php b/app/Models/Corporate.php index ca53e5d6..ae660e64 100755 --- a/app/Models/Corporate.php +++ b/app/Models/Corporate.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Traits\Blameable; +use Illuminate\Database\Eloquent\Casts\AsArrayObject; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -23,7 +24,7 @@ class Corporate extends Model ]; protected $casts = [ - 'linking_rules' => 'array', + 'linking_rules' => AsArrayObject::class, ]; protected $appends = [ diff --git a/app/Models/Member.php b/app/Models/Member.php index 81ccef0e..1e55be87 100755 --- a/app/Models/Member.php +++ b/app/Models/Member.php @@ -141,7 +141,8 @@ class Member extends Model public function currentPlan() { - return $this->hasOneThrough(Plan::class, MemberPlan::class, 'member_id', 'id', 'id', 'plan_id')->latest(); + return $this->hasOneThrough(Plan::class, MemberPlan::class, 'member_id', 'id', 'id', 'plan_id') + ->latest(); // TODO Fix This } public function policies() diff --git a/app/Models/MemberPlan.php b/app/Models/MemberPlan.php index 558b9555..23ec7a66 100755 --- a/app/Models/MemberPlan.php +++ b/app/Models/MemberPlan.php @@ -31,4 +31,17 @@ class MemberPlan extends Model { return $this->belongsTo(CorporatePlan::class, 'plan_id', 'code'); } + + public function plan() + { + return $this->belongsTo(Plan::class, 'plan_id'); + } + + public function scopeActive($q) + { + return $q + ->where('start', '<', now()) + ->where('end', '>', now()) + ->latest(); + } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 204d1f5f..ed9fe4e6 100755 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,7 +2,9 @@ namespace App\Providers; +use App\Rules\NikRule; use Illuminate\Support\Facades\Schema; +use Illuminate\Support\Facades\Validator; use Illuminate\Support\ServiceProvider; use Str; diff --git a/app/Rules/NikRule.php b/app/Rules/NikRule.php new file mode 100644 index 00000000..ed5f14ac --- /dev/null +++ b/app/Rules/NikRule.php @@ -0,0 +1,66 @@ + + {JSON.stringify(getValues('linking_rules'))} diff --git a/frontend/dashboard/src/pages/Master/Formularium/Form.tsx b/frontend/dashboard/src/pages/Master/Formularium/Form.tsx index 9ec18471..98d0ecc4 100755 --- a/frontend/dashboard/src/pages/Master/Formularium/Form.tsx +++ b/frontend/dashboard/src/pages/Master/Formularium/Form.tsx @@ -154,7 +154,7 @@ export default function FormulariumForm({ isEdit, currentFormularium }: Props) { const linking_rules_checkbox_name = "linking_rules" const linking_tools = [ { - "value" : "nrik", + "value" : "nric", "label" : "No. KTP" }, { diff --git a/routes/api.php b/routes/api.php index 59746c20..06636948 100755 --- a/routes/api.php +++ b/routes/api.php @@ -22,7 +22,10 @@ Route::middleware('linksehat.old.auth')->group(function() { Route::post('check-membership', [MembershipController::class, 'check']); Route::post('check-limit', [MembershipController::class, 'checkLimit']); Route::post('check-coverage-limit', [MembershipController::class, 'checkLimit']); + Route::get('linking-rules', [MembershipController::class, 'linkingRules']); + Route::post('linking-validate', [MembershipController::class, 'linkingValidate']); Route::post('claim-create', [ClaimController::class, 'store']); Route::post('claim-update-diagnosis', [ClaimController::class, 'updateClaimDiagnosis']); + }); \ No newline at end of file