chore(autopodbor): кнопка «Отказаться» (было «Удалить») + автоподбор в CSV списаний + canon-sync schema.sql v8.63
- Кнопка на актуализации переименована «Удалить»→«Отказаться» (чтобы клиент не путал с удалением конкурента). - 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:
@@ -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
@@ -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
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user