Update: laravel 8 to 12, php 7.3 to php 8.3, Jenkinsfile, Unit/Feature testing, vapor, docker

This commit is contained in:
Dillon Ngo
2026-04-03 06:59:39 +08:00
parent 58de1017d7
commit b34b7c19d6
142 changed files with 3334 additions and 1101 deletions
@@ -20,7 +20,7 @@ class CreateBookingsTable extends Migration
$table->string('marking')->unique();
$table->foreignId('service_id')->unsigned();
$table->foreignId('bank_id')->unsigned();
$table->float('fix_amount', 20, 5);
$table->decimal('fix_amount', 20, 5);
$table->foreignId('fix_currency_id')->unsigned();
$table->foreignId('convertible_currency_id')->unsigned();
$table->foreignId('conversion_currency_id')->unsigned();
@@ -24,7 +24,7 @@ class CreateStatementTransactionsTable extends Migration
$table->string('transaction_description_4')->nullable();
$table->string('transaction_description_5')->nullable();
$table->string('transaction_ref')->nullable();
$table->float('amount', 15, 2)->unsigned(false);
$table->decimal('amount', 15, 2)->unsigned(false);
$table->string('teller_id')->nullable();
$table->string('branch_channel');
$table->string('transaction_code');
@@ -13,11 +13,13 @@ class AddInvoiceStatusToBookingLogsTable extends Migration
*/
public function up()
{
Schema::table('booking_logs', function (Blueprint $table) {
$table->boolean('invoice_status')
->default(false)
->after('status');
});
if (Schema::hasTable('booking_logs')) {
Schema::table('booking_logs', function (Blueprint $table) {
$table->boolean('invoice_status')
->default(false)
->after('status');
});
}
}
/**
@@ -27,8 +29,10 @@ class AddInvoiceStatusToBookingLogsTable extends Migration
*/
public function down()
{
Schema::table('booking_logs', function (Blueprint $table) {
$table->dropColumn('invoice_status');
});
if (Schema::hasTable('booking_logs')) {
Schema::table('booking_logs', function (Blueprint $table) {
$table->dropColumn('invoice_status');
});
}
}
}
@@ -13,11 +13,13 @@ class AddIsInvoiceGeneratedToBookingLogsTable extends Migration
*/
public function up()
{
Schema::table('booking_logs', function (Blueprint $table) {
$table->boolean('is_invoice_generated')
->default(false)
->after('status');
});
if (Schema::hasTable('booking_logs')) {
Schema::table('booking_logs', function (Blueprint $table) {
$table->boolean('is_invoice_generated')
->default(false)
->after('status');
});
}
}
/**
@@ -27,8 +29,10 @@ class AddIsInvoiceGeneratedToBookingLogsTable extends Migration
*/
public function down()
{
Schema::table('booking_logs', function (Blueprint $table) {
$table->dropColumn('is_invoice_generated');
});
if (Schema::hasTable('booking_logs')) {
Schema::table('booking_logs', function (Blueprint $table) {
$table->dropColumn('is_invoice_generated');
});
}
}
}
@@ -13,9 +13,11 @@ class RemoveIsInvoiceGeneratedFromBookingLogsTable extends Migration
*/
public function up()
{
Schema::table('booking_logs', function (Blueprint $table) {
$table->dropColumn('is_invoice_generated');
});
if (Schema::hasTable('booking_logs')) {
Schema::table('booking_logs', function (Blueprint $table) {
$table->dropColumn('is_invoice_generated');
});
}
}
/**
@@ -25,10 +27,12 @@ class RemoveIsInvoiceGeneratedFromBookingLogsTable extends Migration
*/
public function down()
{
Schema::table('booking_logs', function (Blueprint $table) {
$table->boolean('is_invoice_generated')
->default(false)
->after('status');
});
if (Schema::hasTable('booking_logs')) {
Schema::table('booking_logs', function (Blueprint $table) {
$table->boolean('is_invoice_generated')
->default(false)
->after('status');
});
}
}
}
@@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('activity_log', function (Blueprint $table) {
$table->uuid('batch_uuid')->nullable()->after('properties');
$table->string('event')->nullable()->after('subject_type');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('activity_log', function (Blueprint $table) {
$table->dropColumn('batch_uuid');
$table->dropColumn('event');
});
}
};
@@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
/**
* Run the migrations.
* Update all roles (id 1 & 2) and all permissions to use 'api' guard_name
* instead of 'web', to align with Spatie Laravel Permission v7 strict
* guard matching behaviour for SPA/API-based requests.
*/
public function up(): void
{
DB::table('roles')->where('id', 1)->update(['guard_name' => 'api']);
DB::table('roles')->where('id', 2)->update(['guard_name' => 'api']);
DB::table('permissions')->where('id', '>', 0)->update(['guard_name' => 'api']);
// Clear Spatie permission cache so changes take effect immediately
app()['cache']->forget('spatie.permission.cache');
}
/**
* Reverse the migrations.
*/
public function down(): void
{
DB::table('roles')->where('id', 1)->update(['guard_name' => 'web']);
DB::table('roles')->where('id', 2)->update(['guard_name' => 'web']);
DB::table('permissions')->where('id', '>', 0)->update(['guard_name' => 'web']);
// Clear Spatie permission cache so rollback takes effect immediately
app()['cache']->forget('spatie.permission.cache');
}
};
@@ -20,61 +20,61 @@ class AdminUserPermissionsTableSeeder extends Seeder
// admin permissions
$permissions = [
['name' => 'view document', 'guard_name' => 'web'],
['name' => 'add document', 'guard_name' => 'web'],
['name' => 'edit document', 'guard_name' => 'web'],
['name' => 'delete document', 'guard_name' => 'web'],
['name' => 'view document', 'guard_name' => 'api'],
['name' => 'add document', 'guard_name' => 'api'],
['name' => 'edit document', 'guard_name' => 'api'],
['name' => 'delete document', 'guard_name' => 'api'],
['name' => 'view standard_segment', 'guard_name' => 'web'],
['name' => 'add standard_segment', 'guard_name' => 'web'],
['name' => 'edit standard_segment', 'guard_name' => 'web'],
['name' => 'delete standard_segment', 'guard_name' => 'web'],
['name' => 'view standard_segment', 'guard_name' => 'api'],
['name' => 'add standard_segment', 'guard_name' => 'api'],
['name' => 'edit standard_segment', 'guard_name' => 'api'],
['name' => 'delete standard_segment', 'guard_name' => 'api'],
['name' => 'view standard_segment_constant', 'guard_name' => 'web'],
['name' => 'add standard_segment_constant', 'guard_name' => 'web'],
['name' => 'edit standard_segment_constant', 'guard_name' => 'web'],
['name' => 'delete standard_segment_constant', 'guard_name' => 'web'],
['name' => 'view standard_segment_constant', 'guard_name' => 'api'],
['name' => 'add standard_segment_constant', 'guard_name' => 'api'],
['name' => 'edit standard_segment_constant', 'guard_name' => 'api'],
['name' => 'delete standard_segment_constant', 'guard_name' => 'api'],
['name' => 'view segment', 'guard_name' => 'web'],
['name' => 'add segment', 'guard_name' => 'web'],
['name' => 'edit segment', 'guard_name' => 'web'],
['name' => 'delete segment', 'guard_name' => 'web'],
['name' => 'view segment', 'guard_name' => 'api'],
['name' => 'add segment', 'guard_name' => 'api'],
['name' => 'edit segment', 'guard_name' => 'api'],
['name' => 'delete segment', 'guard_name' => 'api'],
['name' => 'view segment_constant', 'guard_name' => 'web'],
['name' => 'add segment_constant', 'guard_name' => 'web'],
['name' => 'edit segment_constant', 'guard_name' => 'web'],
['name' => 'delete segment_constant', 'guard_name' => 'web'],
['name' => 'view segment_constant', 'guard_name' => 'api'],
['name' => 'add segment_constant', 'guard_name' => 'api'],
['name' => 'edit segment_constant', 'guard_name' => 'api'],
['name' => 'delete segment_constant', 'guard_name' => 'api'],
['name' => 'view company_bank', 'guard_name' => 'web'],
['name' => 'add company_bank', 'guard_name' => 'web'],
['name' => 'edit company_bank', 'guard_name' => 'web'],
['name' => 'delete company_bank', 'guard_name' => 'web'],
['name' => 'view company_bank', 'guard_name' => 'api'],
['name' => 'add company_bank', 'guard_name' => 'api'],
['name' => 'edit company_bank', 'guard_name' => 'api'],
['name' => 'delete company_bank', 'guard_name' => 'api'],
['name' => 'view currency', 'guard_name' => 'web'],
['name' => 'add currency', 'guard_name' => 'web'],
['name' => 'edit currency', 'guard_name' => 'web'],
['name' => 'delete currency', 'guard_name' => 'web'],
['name' => 'view currency', 'guard_name' => 'api'],
['name' => 'add currency', 'guard_name' => 'api'],
['name' => 'edit currency', 'guard_name' => 'api'],
['name' => 'delete currency', 'guard_name' => 'api'],
['name' => 'view currency_rate', 'guard_name' => 'web'],
['name' => 'add currency_rate', 'guard_name' => 'web'],
['name' => 'edit currency_rate', 'guard_name' => 'web'],
['name' => 'delete currency_rate', 'guard_name' => 'web'],
['name' => 'view currency_rate', 'guard_name' => 'api'],
['name' => 'add currency_rate', 'guard_name' => 'api'],
['name' => 'edit currency_rate', 'guard_name' => 'api'],
['name' => 'delete currency_rate', 'guard_name' => 'api'],
['name' => 'view booking', 'guard_name' => 'web'],
['name' => 'add booking', 'guard_name' => 'web'],
['name' => 'edit booking', 'guard_name' => 'web'],
['name' => 'delete booking', 'guard_name' => 'web'],
['name' => 'view booking', 'guard_name' => 'api'],
['name' => 'add booking', 'guard_name' => 'api'],
['name' => 'edit booking', 'guard_name' => 'api'],
['name' => 'delete booking', 'guard_name' => 'api'],
['name' => 'add milestone', 'guard_name' => 'web'],
['name' => 'add reward', 'guard_name' => 'web'],
['name' => 'edit milestone', 'guard_name' => 'web'],
['name' => 'delete milestone', 'guard_name' => 'web'],
['name' => 'delete reward', 'guard_name' => 'web'],
['name' => 'add milestone', 'guard_name' => 'api'],
['name' => 'add reward', 'guard_name' => 'api'],
['name' => 'edit milestone', 'guard_name' => 'api'],
['name' => 'delete milestone', 'guard_name' => 'api'],
['name' => 'delete reward', 'guard_name' => 'api'],
['name' => 'add voucher', 'guard_name' => 'web'],
['name' => 'list voucher campaigns', 'guard_name' => 'web'],
['name' => 'add voucher', 'guard_name' => 'api'],
['name' => 'list voucher campaigns', 'guard_name' => 'api'],
['name' => 'update bank_metadata', 'guard_name' => 'web'],
['name' => 'update bank_metadata', 'guard_name' => 'api'],
];
foreach ($permissions as $permission){
@@ -87,7 +87,7 @@ class AdminUserPermissionsTableSeeder extends Seeder
['name' => 'Shadow Admin'],
[
'name' => 'Shadow Admin',
'guard_name' => 'web',
'guard_name' => 'api',
'type' => 1,
]
);
@@ -108,7 +108,7 @@ class AdminUserPermissionsTableSeeder extends Seeder
['name' => 'Ultimate Admin'],
[
'name' => 'Ultimate Admin',
'guard_name' => 'web',
'guard_name' => 'api',
'type' => 1,
]
);
@@ -125,7 +125,7 @@ class AdminUserPermissionsTableSeeder extends Seeder
['name' => 'Admin'],
[
'name' => 'Admin',
'guard_name' => 'web',
'guard_name' => 'api',
'type' => 1,
]
);