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:
@@ -14,10 +14,11 @@ use Tests\Traits\SeedsRolesAndPermissions;
|
||||
* Finance Document Validation Tests
|
||||
*
|
||||
* Tests finance document model behavior and amount tiers.
|
||||
* Uses new workflow: Secretary → Chair → Board
|
||||
*/
|
||||
class FinanceDocumentValidationTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase, SeedsRolesAndPermissions, CreatesFinanceData;
|
||||
use CreatesFinanceData, RefreshDatabase, SeedsRolesAndPermissions;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
@@ -72,32 +73,32 @@ class FinanceDocumentValidationTest extends TestCase
|
||||
public function test_document_status_constants(): void
|
||||
{
|
||||
$this->assertEquals('pending', FinanceDocument::STATUS_PENDING);
|
||||
$this->assertEquals('approved_cashier', FinanceDocument::STATUS_APPROVED_CASHIER);
|
||||
$this->assertEquals('approved_accountant', FinanceDocument::STATUS_APPROVED_ACCOUNTANT);
|
||||
$this->assertEquals('approved_secretary', FinanceDocument::STATUS_APPROVED_SECRETARY);
|
||||
$this->assertEquals('approved_chair', FinanceDocument::STATUS_APPROVED_CHAIR);
|
||||
$this->assertEquals('approved_board', FinanceDocument::STATUS_APPROVED_BOARD);
|
||||
$this->assertEquals('rejected', FinanceDocument::STATUS_REJECTED);
|
||||
}
|
||||
|
||||
public function test_cashier_can_approve_pending_document(): void
|
||||
public function test_secretary_can_approve_pending_document(): void
|
||||
{
|
||||
$cashier = $this->createCashier();
|
||||
$secretary = $this->createSecretary();
|
||||
$document = $this->createFinanceDocument(['status' => FinanceDocument::STATUS_PENDING]);
|
||||
|
||||
$response = $this->withoutMiddleware(VerifyCsrfToken::class)
|
||||
->actingAs($cashier)
|
||||
->actingAs($secretary)
|
||||
->post(route('admin.finance.approve', $document));
|
||||
|
||||
$document->refresh();
|
||||
$this->assertEquals(FinanceDocument::STATUS_APPROVED_CASHIER, $document->status);
|
||||
$this->assertEquals(FinanceDocument::STATUS_APPROVED_SECRETARY, $document->status);
|
||||
}
|
||||
|
||||
public function test_cashier_can_reject_pending_document(): void
|
||||
public function test_secretary_can_reject_pending_document(): void
|
||||
{
|
||||
$cashier = $this->createCashier();
|
||||
$secretary = $this->createSecretary();
|
||||
$document = $this->createFinanceDocument(['status' => FinanceDocument::STATUS_PENDING]);
|
||||
|
||||
$response = $this->withoutMiddleware(VerifyCsrfToken::class)
|
||||
->actingAs($cashier)
|
||||
->actingAs($secretary)
|
||||
->post(
|
||||
route('admin.finance.reject', $document),
|
||||
['rejection_reason' => 'Test rejection']
|
||||
|
||||
Reference in New Issue
Block a user