Files
portal/app/tests/Feature/Advertising/AdCampaignImpressionFieldsTest.php
T
Дмитрий c9443dca0c feat(реклама): Часть 1 — денежная модель кампании «за показы» (CPM)
Перевод рекламного модуля с «за клики» на «за показы» (медийная кампания),
Часть 1 из 6 — денежное ядро и модель. На бой не выкачивается.

- AdImpressionPricing: чистый калькулятор (показы=аудитория×частота,
  клиентская сумма по 120₽/1000 с округлением вверх до копейки, маржа); bcmath scale 2.
- ad_settings.client_cpm_rub (default 120.00) — плоская клиентская цена, наценка клиенту не видна.
- ad_campaigns: поля модели «за показы» (frequency, *_impressions, budget_rub,
  yandex_cost_rub, charged_client_rub), weekly_budget_rub → nullable (клик-наследие).
- AdCampaign: fillable/casts + default delivered_impressions=0.
- CHANGELOG_schema v8.96 + требование скрытия маржи (yandex_cost_rub) в клиентской выдаче.

Тесты: 12/12 рекламных зелёные (вкл. регресс кошелька). rls-reviewer: PASS.
Spec: docs/superpowers/specs/2026-07-25-yandex-reklama-medijnaya-pokazy-design.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-26 00:43:26 +03:00

39 lines
1.4 KiB
PHP

<?php
declare(strict_types=1);
use App\Models\AdCampaign;
use App\Models\Tenant;
use Illuminate\Support\Facades\Schema;
it('добавляет поля модели «за показы» в ad_campaigns', function () {
foreach ([
'frequency', 'frequency_period_days', 'estimated_impressions',
'paid_impressions', 'delivered_impressions', 'budget_rub',
'yandex_cost_rub', 'charged_client_rub',
] as $col) {
expect(Schema::hasColumn('ad_campaigns', $col))->toBeTrue("нет колонки {$col}");
}
});
it('позволяет создать кампанию БЕЗ weekly_budget_rub (клик-поле больше не обязательно)', function () {
$tenant = Tenant::factory()->create();
$c = AdCampaign::create([
'tenant_id' => $tenant->id,
'name' => 'Прогрев за показы',
'audience_days' => 30,
'use_uploaded_list' => true,
'frequency' => 15,
'estimated_impressions' => 24450,
'paid_impressions' => 24450,
'budget_rub' => '2934.00',
]);
expect($c->status)->toBe(AdCampaign::STATUS_DRAFT)
->and($c->weekly_budget_rub)->toBeNull()
->and($c->frequency)->toBe(15)
->and($c->estimated_impressions)->toBe(24450)
->and($c->delivered_impressions)->toBe(0)
->and($c->budget_rub)->toBe('2934.00');
});