Skip to content

Commit aaba8ba

Browse files
authored
upgrade laravel 12, rename {*}_prices.price and addresses.address to value, rename stripe_id and stripe_one_time_type_id of price tables to type for one time, redefind is active member and membership qualification
* change admission_test_prices table stripe_id and synced_to_stripe columns to stripe_one_time_type_id and synced_one_time_type_to_stripe * change addresses.address to addresses.value * change (*)_prices.price to (*)_prices.value * change recurring parameter from hand code on price model to product model can be hand code or column value * fix missing update create custom_web_pages table migration file name * change members table to members and member_orders tables * install flag-icons js library * fix missing git ignore bootstrap ssr files * install laravel boost for ide ai support * add membership_transors table for member model definition is_active method and extend User models hasQualificationOfMembership method definition * fix member table user_id missing set user_id to unique * fix admission_test_order and membership_order missing gateway_payment_fee column * fix add membership_transors table for member model definition is_active method and extend User models hasQualificationOfMembership method definition missing save User medol * fix add membership_transors table for member model definition is_active method and extend User models hasQualificationOfMembership method definition missing save NationalMensaSeeder * add other-mensa-websites page * fix wrong type more 'create' on file name * rename ModuleSeeder to ModulePermissionSeeder * change member_id to user_id * rename membership_transfers table verified_at column to is_accepted * add qualifying_tests table for member model definition is_active method and extend User models hasQualificationOfMembership method definition and add user model hasQualificationOfMembership method tests * add more todo list items * fix database docs members table wrong type * fix Get active members with addresses detail code not up to date * fix missing remove type column from national_mensas table * fix wrong type membership_end_in column type * fix missing update user model hasSamePassportAlreadyQualificationOfMembership method * update datebase readme * fix coding style * fix change php verision missing update mac unlink old version and link new version code and upgrade laravel to 12 and mysql upgrade to 8.4 * fix update php version missing update github workflow * fix update github workflow missing update for lint parts * fix missing upload mi logo * fix test_id wrong type object * fix year column type wrong use tiny int * fix wrong type percent_of_group decimal total lenght * fix upgrade laravel 12 missing update npm library and clean usund library * fix upgrade laravel 12 missing update other files * fix unit test wrong using sqlLite
1 parent c84610f commit aaba8ba

File tree

94 files changed

+6571
-5346
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

94 files changed

+6571
-5346
lines changed

.github/workflows/laravel.yml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
runs-on: ubuntu-latest
1313
services:
1414
mysql:
15-
image: mysql:8.0.31
15+
image: mysql:8.4
1616
env:
1717
MYSQL_ROOT_PASSWORD: "password"
1818
MYSQL_DATABASE: "mensa"
@@ -26,6 +26,12 @@ jobs:
2626
--health-timeout=5s
2727
--health-retries=3
2828
steps:
29+
- name: Setup PHP
30+
uses: shivammathur/setup-php@v2
31+
with:
32+
php-version: '8.4' # Specify your desired PHP version
33+
coverage: none
34+
2935
- uses: actions/checkout@v4
3036

3137
- uses: actions/cache@v4
@@ -69,6 +75,12 @@ jobs:
6975
lint:
7076
runs-on: ubuntu-latest
7177
steps:
78+
- name: Setup PHP
79+
uses: shivammathur/setup-php@v2
80+
with:
81+
php-version: '8.4' # Specify your desired PHP version
82+
coverage: none
83+
7284
- uses: actions/checkout@v4
7385

7486
- uses: actions/cache@v4

.gitignore

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
*.log
2+
.DS_Store
13
/.phpunit.cache
24
/node_modules
5+
/bootstrap/ssr
36
/public/build
47
/public/hot
58
/public/storage
@@ -13,11 +16,15 @@
1316
.phpunit.result.cache
1417
Homestead.json
1518
Homestead.yaml
16-
auth.json
19+
Thumbs.db
20+
/auth.json
1721
npm-debug.log
1822
yarn-error.log
1923
/.fleet
2024
/.idea
2125
/.nova
2226
/.vscode
2327
/.zed
28+
boost.json
29+
/.github/copilot-instructions.md
30+

README.md

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,30 @@ Please read database/README.md for database setup and details.
5151
### Payment cards for Stripe UAT
5252
https://docs.stripe.com/testing
5353

54+
55+
### A.I. Helper
56+
57+
This installed laravel prompts mcp and boost
58+
59+
Please read laravel official documents:
60+
61+
- Laravel Prompts: https://laravel.com/docs/11.x/prompts
62+
- Laravel MCP: https://laravel.com/docs/11.x/mcp#main-content
63+
- Laravel Boost: https://laravel.com/docs/11.x/installation#installing-laravel-boost
64+
65+
5466
### Todo
5567

5668
#### stage 1 permission system, nav, custom web page and admission test
5769

58-
- change admission_test_prices table stripe_id and synced_to_stripe columns to stripe_one_time_type_id and synced_one_time_type_to_stripe
59-
- change (*)_prices.price to (*)_prices.value and addresses.address to addresses.value
60-
- change members table to members and member_orders tables
70+
- change address_id from members table to users table
71+
- change module to support submodule
72+
- add edit candidate and edit candidate result permission and update admin admission test candidate permission checking
73+
- change SEO from page to layout export props title, desc. and ogImage and change ogImage from public to storage
74+
- add admin nation index
75+
- add admin nation store
76+
- add admin nation update
77+
- add admin nation update status
6178
- update candidate store method to support select product and contact stripe
6279
- add stripe checkout web hock handle
6380
- change quota validity months to inside product and order table
@@ -185,4 +202,4 @@ https://docs.stripe.com/testing
185202

186203
#### unimportant
187204

188-
- takeout Strip Library from app folder to make a standalone composer package on standalone repo.
205+
- takeout Strip Library from app folder to make a standalone composer package on standalone repo.

app/Http/Controllers/Admin/AdmissionTest/Controller.php

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ public function create()
108108
)->with('districts', $districts)
109109
->with(
110110
'addresses', Address::distinct()
111-
->get('address')
112-
->pluck('address')
111+
->get('value')
112+
->pluck('value')
113113
->toArray()
114114
);
115115
}
@@ -122,7 +122,7 @@ public function store(TestRequest $request)
122122
]);
123123
$address = Address::firstOrCreate([
124124
'district_id' => $request->district_id,
125-
'address' => $request->address,
125+
'value' => $request->address,
126126
]);
127127
$test = AdmissionTest::create([
128128
'type_id' => $request->type_id,
@@ -219,46 +219,46 @@ public function show(AdmissionTest $admissionTest)
219219
->with(
220220
'addresses', Address::distinct()
221221
->has('admissionTests')
222-
->get(['id', 'address'])
223-
->pluck('address', 'id')
222+
->get(['id', 'value'])
223+
->pluck('value', 'id')
224224
->toArray()
225225
);
226226
}
227227

228-
private function updateAddress(Address $address, string $newAddress, int $newDistrictID)
228+
private function updateAddress(Address $address, string $newAddress, int $newDistrictID): Address
229229
{
230230
$addressModel = $address;
231231
if (
232-
$newAddress != $address->address ||
232+
$newAddress != $address->value ||
233233
$newDistrictID != $address->district_id
234234
) {
235235
$addressModel = Address::firstWhere([
236236
'district_id' => $newDistrictID,
237-
'address' => $newAddress,
237+
'value' => $newAddress,
238238
]);
239239
if ($address->admissionTests()->count() == 1) {
240240
if ($addressModel) {
241241
$address->delete();
242242
} else {
243243
$address->update([
244244
'district_id' => $newDistrictID,
245-
'address' => $newAddress,
245+
'value' => $newAddress,
246246
]);
247247
$addressModel = $address;
248248
}
249249
}
250250
if (! $addressModel) {
251251
$addressModel = Address::create([
252252
'district_id' => $newDistrictID,
253-
'address' => $newAddress,
253+
'value' => $newAddress,
254254
]);
255255
}
256256
}
257257

258258
return $addressModel;
259259
}
260260

261-
private function updateLocation(Location $location, string $newLocationName)
261+
private function updateLocation(Location $location, string $newLocationName): Location
262262
{
263263
$newLocation = $location;
264264
if ($location->name != $newLocationName) {
@@ -293,7 +293,7 @@ public function update(TestRequest $request, AdmissionTest $admissionTest)
293293
'testing_time' => $admissionTest->testing_at->format('H:i:s'),
294294
'expect_end_time' => $admissionTest->expect_end_at->format('H:i:s'),
295295
'location' => $admissionTest->location->name,
296-
'address' => "{$admissionTest->address->address}, {$admissionTest->address->district->name}, {$admissionTest->address->district->area->name}",
296+
'address' => "{$admissionTest->address->value}, {$admissionTest->address->district->name}, {$admissionTest->address->district->area->name}",
297297
];
298298
$address = $this->updateAddress($admissionTest->address, $request->address, $request->district_id);
299299
$location = $this->updateLocation($admissionTest->location, $request->location);
@@ -312,7 +312,7 @@ public function update(TestRequest $request, AdmissionTest $admissionTest)
312312
'testing_time' => $admissionTest->testing_at->format('H:i:s'),
313313
'expect_end_time' => $admissionTest->expect_end_at->format('H:i:s'),
314314
'location' => $admissionTest->location->name,
315-
'address' => "{$admissionTest->address->address}, {$admissionTest->address->district->name}, {$admissionTest->address->district->area->name}",
315+
'address' => "{$admissionTest->address->value}, {$admissionTest->address->district->name}, {$admissionTest->address->district->area->name}",
316316
];
317317
if (
318318
$from['testing_date'] != $to['testing_date'] ||
@@ -336,7 +336,7 @@ public function update(TestRequest $request, AdmissionTest $admissionTest)
336336
'location' => $admissionTest->location->name,
337337
'district_id' => $admissionTest->address->district_id,
338338
'address_id' => $admissionTest->address_id,
339-
'address' => $admissionTest->address->address,
339+
'address' => $admissionTest->address->value,
340340
'maximum_candidates' => $admissionTest->maximum_candidates,
341341
'is_public' => $admissionTest->is_public,
342342
];

app/Http/Controllers/Admin/AdmissionTest/OrderController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public function create()
7474
$products = AdmissionTestProduct::select(['id', 'name', 'minimum_age', 'maximum_age', 'quota'])
7575
->with([
7676
'price' => function ($query) {
77-
$query->select(['id', 'product_id', 'name', 'price']);
77+
$query->select(['id', 'product_id', 'name', 'value']);
7878
},
7979
])->whereInDateRange(now())
8080
->get();

app/Http/Controllers/Admin/AdmissionTest/PriceController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ public function store(PriceRequest $request, AdmissionTestProduct $product)
3535
$price = AdmissionTestPrice::create([
3636
'product_id' => $product->id,
3737
'name' => $request->name,
38-
'price' => $request->price,
38+
'value' => $request->price,
3939
'start_at' => $request->start_at,
4040
]);
4141

4242
return [
4343
'success' => 'The admission test product price create success.',
4444
'id' => $price->id,
4545
'name' => $price->name,
46-
'price' => $price->price,
46+
'price' => $price->value,
4747
'start_at' => $price->start_at,
4848
'updated_at' => $price->updated_at,
4949
];

app/Http/Controllers/Admin/AdmissionTest/ProductController.php

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public function store(ProductRequest $request)
4848
AdmissionTestPrice::create([
4949
'product_id' => $product->id,
5050
'name' => $request->price_name,
51-
'price' => $request->price,
51+
'value' => $request->price,
5252
]);
5353
DB::commit();
5454

@@ -62,13 +62,8 @@ public function show(AdmissionTestProduct $product)
6262
{
6363
$product->load([
6464
'prices' => function ($query) {
65-
$query->select([
66-
'id',
67-
'product_id',
68-
'name',
69-
'price',
70-
'start_at',
71-
])->orderByDesc('start_at')
65+
$query->select(['id', 'product_id', 'name', 'value', 'start_at'])
66+
->orderByDesc('start_at')
7267
->orderByDesc('updated_at');
7368
},
7469
])->makeHidden([

app/Http/Controllers/CandidateController.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ function (Request $request, Closure $next) {
4242
['admission_test' => $admissionTest]
4343
)->withErrors(['message' => 'You has already schedule this admission test.']);
4444
}
45-
if ($user->isActiveMember) {
45+
if ($user->member?->is_active) {
4646
return $errorReturn->withErrors(['message' => 'You has already been member.']);
4747
}
4848
if ($user->hasQualificationOfMembership) {
@@ -117,7 +117,7 @@ function (Request $request, Closure $next) {
117117
->find($request->price_id);
118118
if (! $price) {
119119
$request->merge(['error' => 'The selected product is invalid.']);
120-
} elseif ($price->price != $price->product->price->price) {
120+
} elseif ($price->value != $price->product->price->value) {
121121
$request->merge(['error' => 'The price of selected product is not up to date, please try again on this up to date version.']);
122122
} elseif ($price->product->start_at && $price->product->start_at > now()) {
123123
$request->merge(['error' => 'The selected product is not yet released, please try again later or select other product.']);
@@ -128,7 +128,7 @@ function (Request $request, Closure $next) {
128128
} elseif ($price->product->maximum_age && $price->product->maximum_age < floor($request->user()->age)) {
129129
$request->merge(['error' => 'Your age greater than product maximum age limit.']);
130130
} else {
131-
$price->makeHidden(['product_id', 'name', 'start_at', 'stripe_id', 'synced_to_stripe']);
131+
$price->makeHidden(['product_id', 'name', 'start_at', 'stripe_one_time_type_id', 'synced_one_time_type_to_stripe']);
132132
$price->product->makeHidden(['id', 'name', 'option_name', 'minimum_age', 'maximum_age', 'start_at', 'end_at', 'stripe_id', 'synced_to_stripe', 'created_at', 'updated_at', 'price']);
133133
$request->merge(['price' => $price]);
134134
}
@@ -144,7 +144,7 @@ function (Request $request, Closure $next) {
144144
]);
145145
foreach ($request->products as $product) {
146146
$product->makeHidden(['id']);
147-
$product->price->makeHidden(['product_id', 'name', 'stripe_id', 'synced_to_stripe', 'created_at', 'updated_at']);
147+
$product->price->makeHidden(['product_id', 'name', 'stripe_one_time_type_id', 'synced_one_time_type_to_stripe', 'created_at', 'updated_at']);
148148
}
149149
if (! $request->products->count()) {
150150
return redirect()->route('admission-tests.index')
@@ -167,7 +167,7 @@ function (Request $request, Closure $next) {
167167
if (! $admissionTest->is_public) {
168168
return $redirect->withErrors(['message' => 'You have no register this admission test and this test is private, please register other admission test.']);
169169
}
170-
if ($user->isActiveMember) {
170+
if ($user->member?->is_active) {
171171
return $redirect->withErrors(['message' => 'You have no register this admission test and you has already been member.']);
172172
}
173173
if ($user->hasQualificationOfMembership) {

app/Http/Controllers/PageController.php

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use App\Models\AdmissionTest;
66
use App\Models\CustomWebPage;
7+
use App\Models\NationalMensa;
78
use App\Models\SiteContent;
89
use Illuminate\Http\Request;
910
use Illuminate\Support\Facades\DB;
@@ -32,23 +33,23 @@ public function customWebPage($pathname)
3233
public function admissionTests(Request $request)
3334
{
3435
$user = [
35-
'has_qualification_of_membership' => $request->user()->hasQualificationOfMembership ?? null,
36-
'last_attended_admission_test' => $request->user()->lastAttendedAdmissionTest ?? false ? [
37-
'id' => $request->user()->hasQualificationOfMembership->id,
38-
'testing_at' => $request->user()->hasQualificationOfMembership->testing_at,
36+
'has_qualification_of_membership' => $request->user()?->hasQualificationOfMembership,
37+
'last_attended_admission_test' => $request->user()?->lastAttendedAdmissionTest ? [
38+
'id' => $request->user()->lastAttendedAdmissionTest->id,
39+
'testing_at' => $request->user()->lastAttendedAdmissionTest->testing_at,
3940
'type' => [
40-
'interval_month' => $request->user()->hasQualificationOfMembership->type->interval_month,
41+
'interval_month' => $request->user()->lastAttendedAdmissionTest->type->interval_month,
4142
],
4243
] : null,
43-
'future_admission_test' => $request->user()->futureAdmissionTest ?? false ? [
44+
'future_admission_test' => $request->user()?->futureAdmissionTest ? [
4445
'id' => $request->user()->futureAdmissionTest->id,
4546
'is_free' => $request->user()->futureAdmissionTest->is_free,
4647
] : null,
4748
'created_stripe_customer' => $request->user()->stripe ?? null,
48-
'default_email' => $request->user()->defaultEmail ?? false ? [
49+
'default_email' => $request->user()?->defaultEmail ? [
4950
'contact' => $request->user()->defaultEmail->contact,
5051
] : null,
51-
'has_unused_quota_admission_test_order' => (bool) $request->user()?->hasUnusedQuotaAdmissionTestOrder()->exists(),
52+
'has_unused_quota_admission_test_order' => $request->user()?->hasUnusedQuotaAdmissionTestOrder()->exists(),
5253
];
5354
$tests = AdmissionTest::joinRelation('type as type')
5455
->withCount('candidates')
@@ -112,4 +113,18 @@ function ($query) use ($request) {
112113
->toArray()
113114
)->with('tests', $tests);
114115
}
116+
117+
public function otherMensaWebsites()
118+
{
119+
return Inertia::render(
120+
'Pages/OtherMensaWebsites',
121+
[
122+
'nations' => function () {
123+
return NationalMensa::orderBy('name')
124+
->where('is_active', true)
125+
->get(['id', 'type', 'name', 'url']);
126+
},
127+
]
128+
);
129+
}
115130
}

app/Http/Requests/Admin/AdmissionTest/Candidate/StoreRequest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ function (string $attribute, mixed $value, Closure $fail) use ($request) {
2525
$test = $request->route('admission_test');
2626
if (! $request->user) {
2727
$fail('The selected user id is invalid.');
28-
} elseif ($request->user->isActiveMember) {
28+
} elseif ($request->user->member?->is_active) {
2929
$fail('The selected user id has already member.');
3030
} elseif ($request->user->hasQualificationOfMembership) {
3131
$fail('The selected user id has already qualification for membership.');

0 commit comments

Comments
 (0)