From 3c52667eb5f171d5a94486d818427ca939cbf7e5 Mon Sep 17 00:00:00 2001 From: ismailmasseran Date: Wed, 15 Jul 2026 11:35:45 +0800 Subject: [PATCH] DONE: fix naming, add transaction for completion of membership application (#12) Co-authored-by: ISMAIL MASSERAN Reviewed-on: https://git.koppkb.com/KoPKB/My-KOPKB/pulls/12 --- .env.production | 11 +++++-- .../Entities/MembershipApplicationReview.php | 9 ++++++ .../Enums/ReviewStage.php | 1 + .../Services/MembershipApplicationService.php | 30 +++++++++++-------- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/.env.production b/.env.production index 69139e2..3a55ebd 100644 --- a/.env.production +++ b/.env.production @@ -4,6 +4,7 @@ APP_KEY=base64:XdMAy5IbQMHsTrp1N7Tn/LIJC4SKenN8CfhYLt1s3tk= APP_DEBUG=false APP_TIMEZONE=Asia/Kuala_Lumpur APP_URL=https://api.koppkb.com +FRONTEND_URL=https://mykopkb.koppkb.com APP_LOCALE=en APP_FALLBACK_LOCALE=en @@ -91,11 +92,15 @@ ENABLE_API_KEY_AUTH=true API_VALID_KEYS=86f58825e5c1e0872d8786092d47e3bd,6461fc5390660c55dc47bdfcd85ed9ae API_LOG_KEY_USAGE=true -PUBLIC_PROFILE_TOKEN_TTL_DAYS=7 -FRONTEND_URL=https://mykopkb.koppkb.com +AUTH_COOKIE_NAME=auth_token +AUTH_COOKIE_LIFETIME=360 +AUTH_COOKIE_SECURE=true +AUTH_COOKIE_SAME_SITE=lax +AUTH_COOKIE_EXPOSE_TOKEN=false + BROWSERSHOT_NO_SANDBOX=true -PUBLIC_PROFILE_TOKEN_TTL_DAYS=7 +PUBLIC_PROFILE_TOKEN_TTL_DAYS=3 EMAIL_VERIFICATION_EXPIRE_MINUTES=60 EMAIL_VERIFICATION_REDIRECT_PATH=/profile-overview-2 diff --git a/Modules/MembershipApplication/Entities/MembershipApplicationReview.php b/Modules/MembershipApplication/Entities/MembershipApplicationReview.php index 2fb89f2..e2b6d36 100644 --- a/Modules/MembershipApplication/Entities/MembershipApplicationReview.php +++ b/Modules/MembershipApplication/Entities/MembershipApplicationReview.php @@ -69,4 +69,13 @@ class MembershipApplicationReview extends Model return BoardDecision::tryFrom($this->decision); } + + public function completionDecision(): ?BoardDecision + { + if ($this->stage !== ReviewStage::Completion) { + return null; + } + + return BoardDecision::tryFrom($this->decision); + } } diff --git a/Modules/MembershipApplication/Enums/ReviewStage.php b/Modules/MembershipApplication/Enums/ReviewStage.php index ef4d9cb..5e72f30 100644 --- a/Modules/MembershipApplication/Enums/ReviewStage.php +++ b/Modules/MembershipApplication/Enums/ReviewStage.php @@ -6,4 +6,5 @@ enum ReviewStage: string { case Management = 'MANAGEMENT'; case Board = 'BOARD'; + case Completion = 'COMPLETION'; } diff --git a/Modules/MembershipApplication/Services/MembershipApplicationService.php b/Modules/MembershipApplication/Services/MembershipApplicationService.php index b44c3d8..2c24e16 100644 --- a/Modules/MembershipApplication/Services/MembershipApplicationService.php +++ b/Modules/MembershipApplication/Services/MembershipApplicationService.php @@ -254,12 +254,8 @@ class MembershipApplicationService }); } - public function complete( - MembershipApplication $application, - User $processedBy, - string $boardMeetingReference, - string $boardMeetingDate, - ): MembershipApplication { + public function complete(MembershipApplication $application, User $processedBy, string $boardMeetingReference, string $boardMeetingDate,): MembershipApplication + { if ($application->status !== ApplicationStatus::PendingNotification) { throw ValidationException::withMessages([ 'status' => ['Permohonan ini tidak boleh diselesaikan pada masa ini.'], @@ -272,7 +268,7 @@ class MembershipApplicationService ]); } - return DB::transaction(function () use ($application, $boardMeetingReference, $boardMeetingDate) { + return DB::transaction(function () use ($application, $processedBy, $boardMeetingReference, $boardMeetingDate) { $plainPassword = null; if ($application->board_result === BoardResult::Pass->value && ! $application->user_id) { @@ -286,6 +282,18 @@ class MembershipApplicationService $this->sendResultNotification($application, $resultLetter, $plainPassword); + $application->reviews()->create([ + 'stage' => ReviewStage::Completion, + 'decision' => $application->board_result, + 'remarks' => sprintf( + 'Rujukan mesyuarat lembaga: %s, Tarikh mesyuarat: %s', + $boardMeetingReference, + $boardMeetingDate, + ), + 'reviewer_id' => $processedBy->id, + 'reviewed_at' => now(), + ]); + $application->update([ 'status' => ApplicationStatus::Completed, 'completed_at' => now()->toDateTimeString(), @@ -302,12 +310,8 @@ class MembershipApplicationService * failed: list * } */ - public function completeBatch( - array $applicationIds, - User $processedBy, - string $boardMeetingReference, - string $boardMeetingDate, - ): array { + public function completeBatch(array $applicationIds, User $processedBy, string $boardMeetingReference, string $boardMeetingDate): array + { $succeeded = []; $failed = [];