0f820c4569
Backend AdminSuppliersController:
- GET /api/admin/suppliers — все 3 поставщика (B1/B2/B3).
- PATCH /api/admin/suppliers/{id} — обновляет cost_rub / quality_score / is_active.
- Validation: cost_rub >= 0, quality_score 0..9.99.
- Audit trail saas_admin_audit_log (stub admin via system-supplier@liderra.local).
- 4 Pest integration tests.
Frontend AdminSupplierPricesView (Vue 3 + Vuetify 3):
- v-data-table 3 строки с inline-editing cost_rub/quality_score/is_active.
- Forest-palette + JetBrains Mono tnum.
- 3 Vitest tests + Histoire story.
Router /admin/supplier-prices route.
Drive-by fix: SupplierProjectFactory.definition() default signal_type
ограничен ['site','call'] — иначе при ->create(['platform' => 'B1']) с
оригинальным random 'sms' нарушается CHECK chk_supplier_projects_b1_not_for_sms
(flaky parallel-pest race condition). Тесты, которым нужен 'sms', продолжают
явно передавать signal_type вместе с B2/B3.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
42 lines
1.5 KiB
PHP
42 lines
1.5 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace Database\Factories;
|
||
|
||
use App\Models\SupplierProject;
|
||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||
|
||
/**
|
||
* @extends Factory<SupplierProject>
|
||
*/
|
||
class SupplierProjectFactory extends Factory
|
||
{
|
||
protected $model = SupplierProject::class;
|
||
|
||
public function definition(): array
|
||
{
|
||
$platform = fake()->randomElement(['B1', 'B2', 'B3']);
|
||
// Default signal_type ограничен ['site','call'] — это безопасно для
|
||
// всех трёх платформ (B1 не поддерживает sms по
|
||
// chk_supplier_projects_b1_not_for_sms). Тесты, которым нужен 'sms',
|
||
// должны явно передавать ['signal_type' => 'sms'] вместе с B2/B3.
|
||
// Иначе при ->create(['platform' => 'B1']) signal_type 'sms' из
|
||
// оригинального randomElement остаётся и нарушает CHECK constraint.
|
||
$signal = fake()->randomElement(['site', 'call']);
|
||
|
||
return [
|
||
'platform' => $platform,
|
||
'signal_type' => $signal,
|
||
'unique_key' => fake()->unique()->domainName(),
|
||
'supplier_external_id' => (string) fake()->numberBetween(1_000_000, 99_999_999),
|
||
'current_limit' => 0,
|
||
'current_workdays' => [1, 2, 3, 4, 5, 6, 7],
|
||
'current_regions' => null,
|
||
'sync_status' => 'pending',
|
||
'last_synced_at' => null,
|
||
'inactive_since' => null,
|
||
];
|
||
}
|
||
}
|