seedRolesAndPermissions(); } /** * Test can view bank reconciliation page */ public function test_can_view_bank_reconciliation_page(): void { $accountant = $this->createAccountant(); $response = $this->actingAs($accountant)->get( route('admin.bank-reconciliations.index') ); $response->assertStatus(200); } /** * Test can view create reconciliation form */ public function test_can_view_create_reconciliation_form(): void { $cashier = $this->createCashier(); $response = $this->actingAs($cashier)->get( route('admin.bank-reconciliations.create') ); $response->assertStatus(200); } /** * Test reconciliation detects discrepancy */ public function test_reconciliation_detects_discrepancy(): void { $reconciliation = $this->createBankReconciliation([ 'bank_statement_balance' => 500000, 'system_book_balance' => 480000, 'discrepancy_amount' => 20000, ]); $this->assertEquals(20000, $reconciliation->discrepancy_amount); } /** * Test reconciliation status tracking */ public function test_reconciliation_status_tracking(): void { $reconciliation = $this->createBankReconciliation([ 'reconciliation_status' => 'pending', ]); $this->assertEquals('pending', $reconciliation->reconciliation_status); } /** * Test reconciliation approval */ public function test_reconciliation_approval(): void { $manager = $this->createChair(); $accountant = $this->createAccountant(); // Reconciliation must be reviewed before it can be approved $reconciliation = $this->createBankReconciliation([ 'reconciliation_status' => 'pending', 'reviewed_by_accountant_id' => $accountant->id, 'reviewed_at' => now(), ]); $response = $this->actingAs($manager)->post( route('admin.bank-reconciliations.approve', $reconciliation) ); $reconciliation->refresh(); $this->assertEquals('completed', $reconciliation->reconciliation_status); } /** * Test reconciliation date filter */ public function test_reconciliation_date_filter(): void { $accountant = $this->createAccountant(); $this->createBankReconciliation([ 'reconciliation_month' => now()->subMonth()->startOfMonth(), ]); $this->createBankReconciliation([ 'reconciliation_month' => now()->startOfMonth(), ]); $response = $this->actingAs($accountant)->get( route('admin.bank-reconciliations.index') ); $response->assertStatus(200); } /** * Test reconciliation list shows history */ public function test_reconciliation_list_shows_history(): void { $accountant = $this->createAccountant(); for ($i = 0; $i < 3; $i++) { $this->createBankReconciliation([ 'reconciliation_month' => now()->subMonths($i)->startOfMonth(), ]); } $response = $this->actingAs($accountant)->get( route('admin.bank-reconciliations.index') ); $response->assertStatus(200); } /** * Test only authorized users can reconcile */ public function test_only_authorized_users_can_reconcile(): void { $regularUser = User::factory()->create(); $response = $this->actingAs($regularUser)->get( route('admin.bank-reconciliations.index') ); $response->assertStatus(403); } /** * Test can view reconciliation details */ public function test_can_view_reconciliation_details(): void { $accountant = $this->createAccountant(); $reconciliation = $this->createBankReconciliation(); $response = $this->actingAs($accountant)->get( route('admin.bank-reconciliations.show', $reconciliation) ); $response->assertStatus(200); } /** * Test completed reconciliation creation */ public function test_completed_reconciliation_has_all_approvals(): void { $reconciliation = $this->createCompletedReconciliation(); $this->assertEquals('completed', $reconciliation->reconciliation_status); $this->assertNotNull($reconciliation->prepared_by_cashier_id); $this->assertNotNull($reconciliation->reviewed_by_accountant_id); $this->assertNotNull($reconciliation->approved_by_manager_id); } }