chore(autopodbor): кнопка «Отказаться» (было «Удалить») + автоподбор в CSV списаний + canon-sync schema.sql v8.63
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled

- Кнопка на актуализации переименована «Удалить»→«Отказаться» (чтобы клиент не путал с удалением конкурента).
- CSV-выгрузка «Списаний» теперь включает автоподбор-строки (отдельным блоком, «Автоподбор конкурентов»);
  тест на export. charges 11/11.
- schema.sql canon-sync v8.63: +колонка dismissed_actualize_keys у autopodbor_competitors + CHANGELOG
  (заодно в цепочку шапки вписана пропущенная v8.62 CHECK autopodbor_charge).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-07-07 16:03:43 +03:00
parent 43012c982e
commit f888c4baec
5 changed files with 58 additions and 3 deletions
@@ -161,6 +161,29 @@ class TenantChargesController extends Controller
}
});
// Списания автоподбора — тоже в CSV (после лид-строк). charge_source к ним неприменим,
// поэтому при выбранном источнике их не выгружаем (как и в списке).
if ($source === null || $source === '') {
$autoq = DB::table('balance_transactions')
->where('tenant_id', $tenantId)
->where('type', 'autopodbor_charge')
->orderByDesc('created_at')
->orderByDesc('id');
$this->applyPeriodTo($autoq, 'created_at', $period);
$autoq->chunk(500, function ($rows) use ($out) {
foreach ($rows as $r) {
fputcsv($out, [
Carbon::parse($r->created_at)->toIso8601String(),
'Автоподбор конкурентов',
'',
'',
number_format(abs((float) $r->amount_rub), 2, '.', ''),
$r->balance_rub_after ?? '',
]);
}
});
}
fclose($out);
});
}, 200, [
@@ -367,7 +367,7 @@ defineExpose({ list, selected, toggle, toggleAll, moveToField, moveSelected, ope
<span class="ld-actbtns">
<button class="ld-btn primary sm" :disabled="busy || !c.site_url" @click="askActualize(c, 'add')">Добавить</button>
<button class="ld-btn ghost sm" :disabled="busy || !c.site_url" @click="askActualize(c, 'replace')">Заменить</button>
<button class="ld-btn gray sm" :disabled="busy" @click="dismissAct(c)">Удалить</button>
<button class="ld-btn gray sm" :disabled="busy" @click="dismissAct(c)">Отказаться</button>
</span>
</div>
</article>
@@ -205,3 +205,19 @@ it('не подмешивает автоподбор при фильтре charg
expect($data)->toHaveCount(1)
->and($data->firstWhere('kind', 'autopodbor'))->toBeNull();
});
it('export включает списания автоподбора отдельными строками', function () {
makeChargeFor($this->tenant);
BalanceTransaction::factory()->create([
'tenant_id' => $this->tenant->id,
'type' => 'autopodbor_charge',
'amount_rub' => '-50.00',
'balance_rub_after' => '100.00',
'created_at' => now(),
]);
$body = $this->postJson('/api/billing/charges/export')->assertOk()->streamedContent();
expect($body)->toContain('Автоподбор конкурентов')
->and($body)->toContain('50.00');
});
+16 -1
View File
@@ -2,7 +2,22 @@
**Назначение:** консолидированный журнал изменений `schema.sql`. Содержит тридцать записей в обратном хронологическом порядке (v8.33 → v8.32 → v8.31 → v8.30 → v8.29 → v8.28 → v8.27 → v8.26 → v8.25 → v8.24 → v8.23 → v8.22 → v8.21 → v8.20 → v8.19 → v8.18 → v8.17 → v8.16 → v8.15 → v8.14 → v8.13 → v8.12 → v8.11 → v8.10 → v8.9 → v8.8 → v8.7 → v8.6 → v8.5 → v8.4 → v8.3 → v8.2), как принято в keep-a-changelog.
**Файл схемы:** `schema.sql` (текущая версия — v8.62, консолидированная — разворачивает БД с нуля).
**Файл схемы:** `schema.sql` (текущая версия — v8.63, консолидированная — разворачивает БД с нуля).
## v8.63 (2026-07-07) — Автоподбор: колонка dismissed_actualize_keys (мягкое «Отказаться» на актуализации)
Ветка `worktree-avtopodbor`. Кнопка «Отказаться» на карточках «На актуализацию»: клиент отклоняет
находку нового сайта/адреса — фирма поля остаётся, находка уходит в архив, а её новые ключи-опознавалки
запоминаются у фирмы поля. `ProposalClassifier` вычитает отклонённые ключи из дельты → та же находка
больше не всплывает («не засорять ленту»); реально другой новый сайт даёт новый ключ → снова покажется.
**Свёрнуто в тело:** `autopodbor_competitors.dismissed_actualize_keys JSONB NOT NULL DEFAULT '[]'::jsonb`
(`schema.sql` ~л.1415). Миграция `2026_07_07_130000_add_dismissed_actualize_keys_to_autopodbor_competitors`
идемпотентна (`Schema::hasColumn`), migrate:fresh зелёный, ветка автоподбора 185/185.
**Структурно:** `autopodbor_competitors` +1 колонка. Счётчики таблиц/индексов/RLS/функций/триггеров/партиций
БЕЗ изменений (nullable/default ADD COLUMN, RLS построчная не меняется). **Колонка добавлена на прод
миграцией 07.07** (ролью `crm_migrator`); в остальном фича воркстри-only.
## v8.62 (2026-07-06) — Автоподбор: canon-sync денежной таблицы (пропущенный CHECK)
+2 -1
View File
File diff suppressed because one or more lines are too long