CaiWuXiTong/tests/Feature/Business/NegativeAlertPagesTest.php
苏木 32669b4bc9 fix: 调整供应商负数预警筛选公式
按供应商余额减应付余额加预估金额的公式筛选负数预警记录。
Co-authored-by: 苏木 <594326199@qq.com>
Co-committed-by: 苏木 <594326199@qq.com>
2026-10-28 14:12:13 +08:00

146 lines
5.5 KiB
PHP

<?php
namespace Tests\Feature\Business;
use App\Http\Controllers\Business\PayablesFinalActions;
use App\Listeners\Menu\ShowInAdmin;
use App\Models\Auth\Permission;
use App\Utilities\BusinessNavigation;
use Modules\EcommerceFinance\Services\PayablesFinalRegistry;
use Modules\EcommerceFinance\Services\SupplierPayableOverrideStore;
use Tests\Feature\FeatureTestCase;
class NegativeAlertPagesTest extends FeatureTestCase
{
protected function setUp(): void
{
parent::setUp();
$this->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',
]);
$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('历史多付款')
->assertDontSeeText('正余额供应商')
->assertDontSeeText('负余额但公式为正供应商');
$fields = app(PayablesFinalRegistry::class)->fields(
PayablesFinalRegistry::SECTION_SUPPLIER,
'supplier-payables-report',
);
preg_match_all('/<th(?:\s|>)/', (string) $response->getContent(), $headers);
$this->assertCount(count($fields) + 1, $headers[0]);
$this->loginAs()
->get(route('business.pages.show', [
'section' => 'negative-alerts',
'page' => 'courier-negative-alert',
]))
->assertOk()
->assertSeeText('供应商负数预警')
->assertSeeText('快递负数预警')
->assertSeeText('快递负数判定口径待确认')
->assertSeeText('待接入');
}
public function test_supplier_negative_alert_filters_by_month_and_supplier(): void
{
$this->saveSupplierPayable('negative:sep', '九月负余额供应商', '-99.00', '2026-09');
$this->saveSupplierPayable('negative:aug', '八月负余额供应商', '-66.00', '2026-08');
$this->loginAs()
->get(route('business.pages.show', [
'section' => 'negative-alerts',
'page' => 'supplier-negative-alert',
'month' => '2026-08',
'supplier' => '八月负余额',
]))
->assertOk()
->assertSeeText('八月负余额供应商')
->assertSeeText('-66.00')
->assertDontSeeText('九月负余额供应商');
}
public function test_supplier_negative_alert_route_no_longer_renders_under_supplier_reconciliation(): void
{
$this->withExceptionHandling()
->loginAs()
->get(route('business.pages.show', [
'section' => 'supplier-reconciliation',
'page' => 'supplier-negative-alert',
]))
->assertRedirect();
}
private function saveSupplierPayable(
string $key,
string $supplier,
string $supplierBalance,
string $month,
array $extra = [],
): void {
app(SupplierPayableOverrideStore::class)->save(
PayablesFinalActions::DATASET_PREFIX . 'supplier:supplier-payables-report',
$key,
$extra + [
'summary_month' => $month,
'supplier' => $supplier,
'supplier_balance' => $supplierBalance,
],
(int) $this->company->id,
(int) $this->user->id,
);
}
}