Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

USPA Changes #169

Merged
merged 77 commits into from
Jan 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
3544255
SOW25N003-1 USPA Changes - Added new 'Total Reserved Graduate Attesta…
MaelCormier-CGI Oct 23, 2024
f34747a
Merge pull request #117 from bcgov/uspa-changes-2024/db-changes
kmarshgov Oct 23, 2024
093f26e
Update 'total_reserved_graduate_attestations' field type, from String…
MaelCormier-CGI Oct 23, 2024
492f2f9
Updated migration file to use ->default(0)
MaelCormier-CGI Oct 24, 2024
013488f
Merge pull request #118 from bcgov/uspa-changes-2024/db-changes
kmarshgov Oct 24, 2024
aa9e358
SOW25N003-1 USPA Changes
MaelCormier-CGI Oct 24, 2024
89e55cd
Merge pull request #119 from bcgov/uspa-changes-2024/db-changes
kmarshgov Oct 24, 2024
9f23bff
SOW25N003-1 USPA Changes
MaelCormier-CGI Oct 25, 2024
2ee8c7e
Merge pull request #120 from bcgov/uspa-changes-2024/db-changes
kmarshgov Oct 25, 2024
a20b72c
SOW25N003-1 USPA Changes - Added new boolean 'program_graduate' field…
MaelCormier-CGI Oct 28, 2024
61e0cb8
Updated 'program_graduate' field to set default value to 'false'
MaelCormier-CGI Oct 28, 2024
7a20f04
Merge pull request #121 from bcgov/uspa-changes-2024/db-changes
m7amad-github Oct 28, 2024
d5b3dd8
SOW25N003-1 USPA Changes - Updated Vue et Laravel compoments to use n…
MaelCormier-CGI Oct 29, 2024
9f4b3dd
Formatted files with Pint
MaelCormier-CGI Oct 29, 2024
307dba4
Merge pull request #122 from bcgov/uspa-changes-2024/db-changes
m7amad-github Oct 29, 2024
5a8abf5
SOW25N003-1 USPA Changes - Added 'issued_reserved_graduate_attestatio…
MaelCormier-CGI Oct 29, 2024
c6c18b3
Merge pull request #123 from bcgov/uspa-changes-2024/db-changes
MaelCormier-CGI Oct 29, 2024
3ba32da
SOW25N003-1 USPA Changes - Updated Attestations:
MaelCormier-CGI Oct 29, 2024
b4c0258
SOW25N003-1 USPA Changes - Updated FedCap Model
MaelCormier-CGI Oct 30, 2024
c6bc2eb
Merge pull request #124 from bcgov/uspa-changes-2024/db-changes
kmarshgov Oct 31, 2024
c0d6a84
Removed unnecessary conditions.
MaelCormier-CGI Oct 31, 2024
000f33e
Improved getRemainingReservedGraduateCapAttribute() and getRemainingC…
MaelCormier-CGI Oct 31, 2024
4184ccd
Merge pull request #125 from bcgov/uspa-changes-2024/fed-cap-updates
kmarshgov Oct 31, 2024
d029cc3
SOW25N003-1 USPA Changes - Updated Attestations:
MaelCormier-CGI Oct 31, 2024
106f263
Merge pull request #126 from bcgov/uspa-changes-2024/fed-cap-updates
kmarshgov Oct 31, 2024
bab8f9b
SOW25N003-1 USPA Changes - Updated various Institutions components:
MaelCormier-CGI Oct 31, 2024
e5ed14b
Merge branch 'uspa-changes-2024/fed-cap-updates' into uspa-changes-20…
MaelCormier-CGI Oct 31, 2024
09bd04f
Merge pull request #127 from bcgov/uspa-changes-2024/db-changes
kmarshgov Oct 31, 2024
9b83b8c
SOW25N003-1 USPA Changes - Updated Reports pages + fixed issue with L…
MaelCormier-CGI Oct 31, 2024
a036898
Merge pull request #129 from bcgov/uspa-changes-2024/db-changes
kmarshgov Oct 31, 2024
aeb2d92
Merge pull request #131 from bcgov/uspa-changes-2024/main
kmarshgov Oct 31, 2024
fc50d31
Merge pull request #132 from bcgov/dev
kmarshgov Oct 31, 2024
95a0d91
SOW25N003-1 USPA Changes - Updated the logic for controlling the numb…
MaelCormier-CGI Nov 4, 2024
ae4c78e
Merge pull request #133 from bcgov/uspa-changes-2024/feedback-Oct31
MaelCormier-CGI Nov 4, 2024
fda3e9a
Merge pull request #134 from bcgov/uspa-changes-2024/main
m7amad-github Nov 4, 2024
2e5581e
Merge pull request #135 from bcgov/dev
m7amad-github Nov 4, 2024
b9fcbce
SOW25N003-1 USPA Changes - Updated app.php file to add new Facade cre…
MaelCormier-CGI Nov 5, 2024
14d905d
Merge pull request #136 from bcgov/uspa-changes-2024/feedback-Oct31
m7amad-github Nov 5, 2024
9173698
Merge pull request #137 from bcgov/dev
m7amad-github Nov 5, 2024
c2b7e7a
Merge branch 'uspa-changes-2024/feedback-Oct31' into uspa-changes-202…
MaelCormier-CGI Nov 6, 2024
31c17ba
SOW25N003-5 -USPA Changes: Information Sharing Declaration:
MaelCormier-CGI Nov 8, 2024
42c784c
Merge pull request #138 from bcgov/uspa-changes-2024/SOW25N003-5
m7amad-github Nov 12, 2024
6ebad2a
Added error handler when no Institution Cap is created for an Institu…
MaelCormier-CGI Nov 14, 2024
6771b96
Merge pull request #139 from bcgov/uspa-changes-2024/fix-issue-guid-m…
m7amad-github Nov 14, 2024
86a89ea
Merge pull request #140 from bcgov/uspa-changes-2024/main
m7amad-github Nov 14, 2024
4f89f07
Merge pull request #141 from bcgov/dev
m7amad-github Nov 15, 2024
4153499
Merge pull request #142 from bcgov/SOW25N003-6
m7amad-github Nov 18, 2024
1156fd8
Merge pull request #143 from bcgov/SOW25N003-6
m7amad-github Nov 18, 2024
3be78dc
Merge pull request #145 from bcgov/SOW25N003-6
m7amad-github Nov 20, 2024
d8bec4b
Merge pull request #146 from bcgov/SOW25N003-6
m7amad-github Nov 20, 2024
033c482
Merge branch 'SOW25N003-6' into uspa-changes-2024/main
MaelCormier-CGI Nov 25, 2024
15ec6fb
Added 'Graduate'/'Undergraduate' to program names
MaelCormier-CGI Nov 25, 2024
f62918d
Merge pull request #149 from bcgov/uspa-changes-2024/main
m7amad-github Nov 25, 2024
e9e66f5
Merge pull request #150 from bcgov/dev
MaelCormier-CGI Nov 25, 2024
23e277d
SOW25N003-7 Exceeding Caps - Draft vs Error
MaelCormier-CGI Dec 16, 2024
5b9fd9a
Merge pull request #151 from bcgov/uspa-changes-2024/SOW25N003-7-
MaelCormier-CGI Dec 16, 2024
3049dd7
Merge pull request #152 from bcgov/uspa-changes-2024/SOW25N003-7-
m7amad-github Dec 16, 2024
1ebf034
Merge pull request #153 from bcgov/dev
MaelCormier-CGI Dec 16, 2024
5e3932c
Updated Github Workflow: Install OpenShift CLI
MaelCormier-CGI Dec 16, 2024
f4ee004
Merge pull request #154 from bcgov/uspa-changes-2024/SOW25N003-7-
MaelCormier-CGI Dec 16, 2024
2301f6b
Merge pull request #155 from bcgov/uspa-changes-2024/main
m7amad-github Dec 16, 2024
23838b2
Updated Github Workflow: Install OpenShift CLI
MaelCormier-CGI Dec 16, 2024
7d4407c
Merge pull request #156 from bcgov/uspa-changes-2024/SOW25N003-7-
MaelCormier-CGI Dec 16, 2024
6b0ed58
Merge pull request #157 from bcgov/uspa-changes-2024/SOW25N003-7-
m7amad-github Dec 16, 2024
1397920
Merge pull request #158 from bcgov/programs-update-csv-2025Jan
MaelCormier-CGI Jan 8, 2025
20a5544
Merge pull request #159 from bcgov/programs-update-csv-2025Jan
MaelCormier-CGI Jan 8, 2025
a2b39ce
Merge pull request #160 from bcgov/programs-update-csv-2025Jan
MaelCormier-CGI Jan 8, 2025
f5e33cb
Merge pull request #161 from bcgov/programs-update-csv-2025Jan
m7amad-github Jan 9, 2025
614abb0
WIP
MaelCormier-CGI Jan 14, 2025
caeb17a
WIP
MaelCormier-CGI Jan 15, 2025
119a673
Merge branch 'programs-update-csv-2025Jan' into uspa-changes-2024/SOW…
MaelCormier-CGI Jan 15, 2025
5962fe3
Merge pull request #163 from bcgov/uspa-changes-2024/main
m7amad-github Jan 15, 2025
823f8d3
Merge pull request #164 from bcgov/dev
m7amad-github Jan 15, 2025
8dca85b
UAT Feedback - Text update on Institution Dashboard page
MaelCormier-CGI Jan 15, 2025
fbd8f5a
Merge pull request #166 from bcgov/uspa-changes-2024/SOW25N003-8
MaelCormier-CGI Jan 15, 2025
61d81fe
Merge pull request #167 from bcgov/uspa-changes-2024/main
MaelCormier-CGI Jan 15, 2025
49780d0
Merge pull request #168 from bcgov/dev
m7amad-github Jan 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 71 additions & 16 deletions Modules/Institution/App/Http/Controllers/AttestationController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@

use App\Events\AttestationDraftUpdated;
use App\Events\AttestationIssued;
use App\Facades\InstitutionFacade;
use App\Http\Controllers\Controller;
use App\Models\Attestation;
use App\Models\AttestationPdf;
use App\Models\Cap;
use App\Models\Country;
use App\Models\FedCap;
use App\Models\User;
use App\Services\Institution\InstitutionAttestationsDetails;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
Expand Down Expand Up @@ -45,20 +47,56 @@ public function index()
// This is going to be all attes. under this inst. and are using the same fed cap as this.
$user = User::find(Auth::user()->id);
$institution = $user->institution;
// $fedCap = FedCap::active()->first();

// $fedCap = FedCap::active()->first();

$cap = Cap::where('fed_cap_guid', Cache::get('global_fed_caps')['default'])->active()
// $cap = Cap::where('fed_cap_guid', $fedCap->guid)->active()
->where('program_guid', null)
->where('institution_guid', $institution->guid)
->first();

if (is_null($cap)) {
return redirect(route('institution.dashboard'))->withErrors(['error' => "Error: No institution cap found for this institution, attestations can't be retrieved."]);
}

$user = User::find(Auth::user()->id);

$attestations = $this->paginateAtte($user->institution);

return Inertia::render('Institution::Attestations', ['error' => null, 'results' => $attestations,
// Display a warning message to users if the institution has reached a cap.
$warning_message = '';

// Get the inst cap and check if we have hit the cap for issued attestations
// This is going to be all attes. under this inst. and are using the same fed cap as this.
$issued_attestations = Attestation::where('status', 'Issued')
->where('institution_guid', $cap->institution_guid)
->where('fed_cap_guid', $cap->fed_cap_guid)
->count();

// If the attestation is linked to a reserved graduate program
// Get the total for reserved graduate issued attestations
$issued_res_grad_attestations = Attestation::where('status', 'Issued')
->where('institution_guid', $cap->institution_guid)
->where('fed_cap_guid', $cap->fed_cap_guid)
->whereHas('program', function ($query) {
$query->where('program_graduate', true);
})
->count();

$instituion_attestations_details = InstitutionFacade::getInstitutionAttestInfo($issued_attestations, $issued_res_grad_attestations, $cap);

// If we hit or acceded the reserved graduate inst cap limit for issued attestations
if ($instituion_attestations_details['undergradRemaining'] === 0) {
$warning_message = "Your institution has reached the limit for undergraduate attestations. You can't issue a new attestation linked to an undergraduate program or it will be automatically converted as a Draft.";
}
elseif ($instituion_attestations_details['issued']>= $cap->total_attestations) {
$warning_message = "Your institution has reached the maximum attestations cap. You can't issue a new attestation or it will be automatically converted as a Draft.";
}

return Inertia::render('Institution::Attestations', [
'error' => null,
'warning' => $warning_message,
'results' => $attestations,
'institution' => $user->institution,
'programs' => $user->institution->activePrograms, 'countries' => $this->countries,
'instCaps' => $user->institution->activeInstCaps,
Expand Down Expand Up @@ -87,7 +125,6 @@ public function store(AttestationStoreRequest $request): RedirectResponse|\Illum
$attestation = Attestation::create($request->validated());
$this->authorize('download', $attestation);
event(new AttestationIssued($attestation->cap, $attestation, $request->status));

} else {
$error = "There's already an attestation for the same user.";
}
Expand Down Expand Up @@ -121,12 +158,11 @@ public function update(AttestationEditRequest $request): RedirectResponse|\Illum
->whereNot('status', 'Cancelled Draft')
->first();

if(is_null($check1)){
if (is_null($check1)) {
$error = 'This attestation cannot be edited. Only draft attestations can be edited.';
}
elseif(!is_null($check2)){
} elseif (! is_null($check2)) {
$error = "There's already an attestation for the exact same user.";
}else{
} else {
$cap = Cap::where('guid', $request->cap_guid)->first();

Attestation::where('id', $request->id)->update($request->validated());
Expand Down Expand Up @@ -211,15 +247,23 @@ public function capStat(Request $request)
->where('program_guid', null)
->first();

if(!is_null($instCap)) {
if (! is_null($instCap)) {
$issuedInstAttestations = Attestation::where('status', 'Issued')
->where('institution_guid', $instCap->institution_guid)
->where('fed_cap_guid', $instCap->fed_cap_guid)
->count();

$issuedResGradInstAttestations = Attestation::where('status', 'Issued')
->where('institution_guid', $instCap->institution_guid)
->where('fed_cap_guid', $instCap->fed_cap_guid)
->whereHas('program', function ($query) {
$query->where('program_graduate', true);
})
->count();
}
return Response::json(['status' => true, 'body' => ['instCap' => $instCap, 'issued' => $issuedInstAttestations ?? 0]]);
}

return Response::json(['status' => true, 'body' => ['instCap' => $instCap, 'issued' => $issuedInstAttestations ?? 0, 'resGradIssued' => $issuedResGradInstAttestations ?? 0]]);
}

public function duplicateStudent(Request $request)
{
Expand All @@ -232,7 +276,7 @@ public function duplicateStudent(Request $request)
->where('program_guid', null)
->first();

if(!is_null($instCap)) {
if (! is_null($instCap)) {
$issuedInstAttestations = Attestation::where('institution_guid', $instCap->institution_guid)
->where('fed_cap_guid', $instCap->fed_cap_guid)
->where('student_number', $request->input('student_number'))
Expand All @@ -245,11 +289,10 @@ public function duplicateStudent(Request $request)

private function paginateAtte($institution)
{
// $attestations = Attestation::where('institution_guid', $institution->guid)->with('program');
// $attestations = Attestation::where('institution_guid', $institution->guid)->with('program');
$attestations = Attestation::where('institution_guid', $institution->guid)
->where('fed_cap_guid', Cache::get('global_fed_caps')['default'])
->whereNot('status', 'Cancelled Draft')
->with('program');
->whereNot('status', 'Cancelled Draft');

if (request()->filter_term !== null && request()->filter_type !== null) {
$attestations = match (request()->filter_type) {
Expand All @@ -269,6 +312,18 @@ private function paginateAtte($institution)
$attestations = $attestations->orderBy('created_at', 'desc');
}

return $attestations->with('institution.activeCaps', 'institution.programs')->paginate(25)->onEachSide(1)->appends(request()->query());
if (request()->filter_program) {
$attestations->whereHas('program', function ($query) {
$query->where('program_graduate', request()->filter_program === 'graduate');
});
}

return $attestations->with([
'institution.activeCaps',
'institution.programs',
'program' => function ($query) {
$query->select('guid', 'program_name', 'program_graduate');
},
])->paginate(25)->onEachSide(1)->appends(request()->query());
}
}
70 changes: 58 additions & 12 deletions Modules/Institution/App/Http/Controllers/InstitutionController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Modules\Institution\App\Http\Controllers;

use App\Events\StaffRoleChanged;
use App\Facades\InstitutionFacade;
use App\Http\Controllers\Controller;
use App\Http\Requests\InstitutionStaffEditRequest;
use App\Models\Attestation;
Expand All @@ -22,6 +23,7 @@ class InstitutionController extends Controller
public function index()
{
$issuedInstAttestations = 0;
$issuedResGradInstAttestations = 0;
$user = User::find(Auth::user()->id);
$institution = $user->institution;

Expand All @@ -32,17 +34,35 @@ public function index()
->first();

$capTotal = 0;

if (! is_null($instCap)) {
$capTotal = $instCap->total_attestations;
$issuedInstAttestations = Attestation::where('status', 'Issued')
->where('institution_guid', $institution->guid)
->where('fed_cap_guid', $instCap->fed_cap_guid)
->count();

// Total for Grad3. attestations
$issuedResGradInstAttestations = Attestation::where('status', 'Issued')
->where('institution_guid', $institution->guid)
->where('fed_cap_guid', $instCap->fed_cap_guid)
->whereHas('program', function ($query) {
$query->where('program_graduate', true);
})
->count();

$instituionAttestationsDetails = InstitutionFacade::getInstitutionAttestInfo($issuedInstAttestations, $issuedResGradInstAttestations, $instCap);
}

return Inertia::render('Institution::Dashboard', ['results' => $institution,
return Inertia::render('Institution::Dashboard', [
'results' => $institution,
'capTotal' => $capTotal,
'issued' => $issuedInstAttestations]);
'resGraduateCapTotal' => $instCap->total_reserved_graduate_attestations,
'issued' => $issuedInstAttestations,
'issuedUndegrad' => $instituionAttestationsDetails['issuedUndegrad'] ?? 0,
'undergradRemaining' => $instituionAttestationsDetails['undergradRemaining'] ?? 0,
'issuedResGrad' => $issuedResGradInstAttestations,
]);
}

/**
Expand All @@ -66,9 +86,11 @@ public function caps()
$institution->activeInstCaps->makeHidden(['comment']);
$institution->activeProgramCaps->makeHidden(['comment']);

return Inertia::render('Institution::Caps', ['results' => $institution,
return Inertia::render('Institution::Caps', [
'results' => $institution,
'instCaps' => $institution->activeInstCaps,
'programCaps' => $institution->activeProgramCaps]);
'programCaps' => $institution->activeProgramCaps,
]);
}

/**
Expand All @@ -81,19 +103,26 @@ public function staffList(Request $request): \Inertia\Response
$user = User::find(Auth::user()->id);
$institution = $user->institution->staff()->with('user.roles')->get();

return Inertia::render('Institution::Staff', ['status' => true, 'results' => $institution]);
return Inertia::render('Institution::Staff', [
'status' => true,
'results' => $institution,
]);
}

/**
* Update the specified resource in storage.
*/
public function staffUpdate(InstitutionStaffEditRequest $request): \Inertia\Response
{
InstitutionStaff::where('id', $request->id)->update($request->validated());
InstitutionStaff::where('id', $request->id)
->update($request->validated());
$user = User::find(Auth::user()->id);
$institution = $user->institution->staff;

return Inertia::render('Institution::Staff', ['status' => true, 'results' => $institution]);
return Inertia::render('Institution::Staff', [
'status' => true,
'results' => $institution,
]);
}

/**
Expand All @@ -106,13 +135,27 @@ public function staffUpdateRole(Request $request): \Inertia\Response
$newRole = Role::where('name', Role::Institution_USER)->first();
}

$rolesToCheck = [Role::Ministry_ADMIN, Role::SUPER_ADMIN, Role::Institution_ADMIN, Role::Institution_USER];
if (Auth::user()->roles()->pluck('name')->intersect($rolesToCheck)->isNotEmpty() && Auth::user()->disabled === false) {
$staff = InstitutionStaff::where('id', $request->input('id'))->first();
$rolesToCheck = [
Role::Ministry_ADMIN,
Role::SUPER_ADMIN,
Role::Institution_ADMIN,
Role::Institution_USER,
];
if (Auth::user()
->roles()
->pluck('name')
->intersect($rolesToCheck)
->isNotEmpty() && Auth::user()->disabled === false) {
$staff = InstitutionStaff::where('id', $request->input('id'))
->first();

if (! is_null($staff)) {
//reset roles
$roles = Role::whereIn('name', [Role::Institution_ADMIN, Role::Institution_USER, Role::Institution_GUEST])->get();
$roles = Role::whereIn('name', [
Role::Institution_ADMIN,
Role::Institution_USER,
Role::Institution_GUEST,
])->get();
foreach ($roles as $role) {
$staff->user->roles()->detach($role);
}
Expand All @@ -125,6 +168,9 @@ public function staffUpdateRole(Request $request): \Inertia\Response
$user = User::find(Auth::user()->id);
$institution = $user->institution->staff;

return Inertia::render('Institution::Staff', ['status' => true, 'results' => $institution]);
return Inertia::render('Institution::Staff', [
'status' => true,
'results' => $institution,
]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,16 @@ private function getFedGuid(Cap $cap)
$next_numeric_part = 100000000;
}

// Construct the next value
return 'BC'.$year_prefix.'-'.sprintf('%03d', $next_numeric_part);
// Loop to ensure uniqueness
do {
$fed_guid = 'BC' . $year_prefix . '-' . sprintf('%09d', $next_numeric_part);
$exists = Attestation::where('fed_guid', $fed_guid)->exists();

if ($exists) {
$next_numeric_part++;
}
} while ($exists);

return $fed_guid;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public function rules(): array
'last_name' => 'required',
'id_number' => 'nullable',
'student_number' => 'nullable',
'student_confirmation' => 'boolean',
'dob' => 'required|date_format:Y-m-d',
'email' => 'required|email',
'address1' => 'required',
Expand Down Expand Up @@ -90,6 +91,7 @@ protected function prepareForValidation()
'last_touch_by_user_guid' => $this->user()->guid,
'id_number' => Str::upper($this->id_number),
'student_number' => Str::upper($this->student_number),
'student_confirmation' => $this->toBoolean($this->student_confirmation),
'first_name' => Str::title($this->first_name),
'last_name' => Str::title($this->last_name),
'email' => Str::lower($this->email),
Expand Down
15 changes: 13 additions & 2 deletions Modules/Institution/App/Http/Requests/AttestationStoreRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public function rules()
'last_name' => 'required',
'id_number' => 'nullable',
'student_number' => 'nullable',
'student_confirmation' => 'boolean',
'dob' => 'required|date_format:Y-m-d',
'email' => 'required|email',
'address1' => 'required',
Expand Down Expand Up @@ -97,6 +98,7 @@ protected function prepareForValidation()
'last_touch_by_user_guid' => $this->user()->guid,
'id_number' => Str::upper($this->id_number),
'student_number' => Str::upper($this->student_number),
'student_confirmation' => $this->toBoolean($this->student_confirmation),
'first_name' => Str::title($this->first_name),
'last_name' => Str::title($this->last_name),
'email' => Str::lower($this->email),
Expand Down Expand Up @@ -160,7 +162,16 @@ private function getFedGuid(Cap $cap)
$next_numeric_part = 100000000;
}

// Construct the next value
return 'BC'.$year_prefix.'-'.sprintf('%03d', $next_numeric_part);
// Loop to ensure uniqueness
do {
$fed_guid = 'BC' . $year_prefix . '-' . sprintf('%09d', $next_numeric_part);
$exists = Attestation::where('fed_guid', $fed_guid)->exists();

if ($exists) {
$next_numeric_part++;
}
} while ($exists);

return $fed_guid;
}
}
Loading
Loading