user->attachPermission( Permission::where('name', 'read-admin-panel')->firstOrFail() ); } public function test_negative_alerts_is_a_payables_section_with_two_children(): void { $navigation = collect(BusinessNavigation::all())->keyBy('slug'); $alertSection = $navigation->get('negative-alerts'); $this->assertNotNull($alertSection); $this->assertSame('负数预警', $alertSection['title']); $this->assertSame( ['supplier-negative-alert', 'courier-negative-alert'], array_column($alertSection['pages'], 'slug'), ); $this->assertNotContains( 'supplier-negative-alert', array_column($navigation->get('supplier-reconciliation')['pages'], 'slug'), ); $grouped = ShowInAdmin::groupPayables(BusinessNavigation::all()); $payables = collect($grouped)->firstWhere('slug', 'payable-items'); $this->assertSame('negative-alerts', $payables['sections'][0]['slug']); } public function test_supplier_and_courier_negative_alert_pages_render_as_tabs(): void { $this->saveSupplierPayable('negative:1', '负余额供应商', '-128.50', '2026-09', [ 'company' => '测试供应商有限公司', 'negative_reason' => '历史多付款', ]); $this->saveSupplierPayable('positive:1', '正余额供应商', '88.00', '2026-09'); $this->saveSupplierPayable('formula:1', '公式命中供应商', '100.00', '2026-09', [ 'should_pay' => '180.00', 'estimated_price' => '50.00', ]); $this->saveSupplierPayable('formula:exclude', '负余额但公式为正供应商', '-100.00', '2026-09', [ 'should_pay' => '-500.00', 'estimated_price' => '50.00', ]); $supplierManagement = \Mockery::mock(SupplierManagementMirrorRepository::class); $supplierManagement->shouldReceive('suppliersByNames') ->once() ->withArgs(static fn (array $names): bool => count($names) === 2 && in_array('负余额供应商', $names, true) && in_array('公式命中供应商', $names, true)) ->andReturn([ (object) ['scmname' => '负余额供应商', 'buyer' => '采购甲'], (object) ['scmname' => '公式命中供应商', 'buyer' => '采购乙'], ]); $this->app->instance(SupplierManagementMirrorRepository::class, $supplierManagement); $response = $this->loginAs() ->get(route('business.pages.show', [ 'section' => 'negative-alerts', 'page' => 'supplier-negative-alert', ])) ->assertOk() ->assertSeeText('供应商负数预警') ->assertSeeText('快递负数预警') ->assertSeeText('按负数预警公式筛出的终版数据') ->assertSeeText('供应商余额 - 应付余额 + 预估金额 < 0') ->assertSeeText('负余额供应商') ->assertSeeText('公式命中供应商') ->assertSeeText('-128.50') ->assertSeeText('历史多付款') ->assertSeeText('采购甲') ->assertSeeText('采购乙') ->assertDontSeeText('正余额供应商') ->assertDontSeeText('负余额但公式为正供应商'); $fields = app(PayablesFinalRegistry::class)->fields( PayablesFinalRegistry::SECTION_SUPPLIER, 'supplier-payables-report', ); $html = (string) $response->getContent(); preg_match_all('/