Add phone login support and member import functionality

Features:
- Support login via phone number or email (LoginRequest)
- Add members:import-roster command for Excel roster import
- Merge survey emails with roster data

Code Quality (Phase 1-4):
- Add database locking for balance calculation
- Add self-approval checks for finance workflow
- Create service layer (FinanceDocumentApprovalService, PaymentVerificationService)
- Add HasAccountingEntries and HasApprovalWorkflow traits
- Create FormRequest classes for validation
- Add status-badge component
- Define authorization gates in AuthServiceProvider
- Add accounting config file

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-25 03:08:06 +08:00
parent ed7169b64e
commit 42099759e8
66 changed files with 3492 additions and 3803 deletions

View File

@@ -2,8 +2,8 @@
namespace App\Providers;
// use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
class AuthServiceProvider extends ServiceProvider
{
@@ -21,6 +21,58 @@ class AuthServiceProvider extends ServiceProvider
*/
public function boot(): void
{
//
// Define gates that map to Spatie permissions
// These gates are used in controllers with $this->authorize()
// Payment Order gates
Gate::define('create_payment_order', function ($user) {
return $user->can('create_payment_order');
});
Gate::define('verify_payment_order', function ($user) {
return $user->can('verify_payment_order');
});
Gate::define('execute_payment', function ($user) {
return $user->can('execute_payment');
});
// Finance document gates
Gate::define('approve_finance_secretary', function ($user) {
return $user->can('approve_finance_secretary') || $user->hasRole('secretary_general');
});
Gate::define('approve_finance_chair', function ($user) {
return $user->can('approve_finance_chair') || $user->hasRole('finance_chair');
});
Gate::define('approve_finance_board', function ($user) {
return $user->can('approve_finance_board') || $user->hasRole('finance_board_member');
});
// Member management gates
Gate::define('create_members', function ($user) {
return $user->can('create_members') || $user->hasRole(['admin', 'super_admin']);
});
Gate::define('edit_members', function ($user) {
return $user->can('edit_members') || $user->hasRole(['admin', 'super_admin']);
});
// Issue management gates
Gate::define('create_issues', function ($user) {
return $user->can('create_issues') || $user->hasRole(['admin', 'super_admin']);
});
Gate::define('edit_issues', function ($user) {
return $user->can('edit_issues') || $user->hasRole(['admin', 'super_admin']);
});
// Super admin bypass - can do anything
Gate::before(function ($user, $ability) {
if ($user->hasRole('super_admin')) {
return true;
}
});
}
}