diff --git a/app/app/Jobs/ChargeCampaignSpendJob.php b/app/app/Jobs/ChargeCampaignSpendJob.php index 342ff4fe..3def97a3 100644 --- a/app/app/Jobs/ChargeCampaignSpendJob.php +++ b/app/app/Jobs/ChargeCampaignSpendJob.php @@ -59,7 +59,7 @@ class ChargeCampaignSpendJob implements ShouldQueue $stopAll = app(AdStopAllService::class); $date = Carbon::now()->subDay()->toDateString(); - $markup = new AdMarkup((string) (DB::connection('pgsql_supplier')->table('ad_settings')->value('markup_percent') ?? '30.00')); + $markup = new AdMarkup((string) (DB::table('ad_settings')->value('markup_percent') ?? '30.00')); $direct = new YandexDirectClient( $this->configString('services.yandex_direct.base_url'), $this->configString('services.yandex_direct.token'), diff --git a/app/database/migrations/2026_07_25_100400_grant_supplier_worker_advertising.php b/app/database/migrations/2026_07_25_100400_grant_supplier_worker_advertising.php new file mode 100644 index 00000000..3621d507 --- /dev/null +++ b/app/database/migrations/2026_07_25_100400_grant_supplier_worker_advertising.php @@ -0,0 +1,44 @@ + параллельно с боевым main. Их прежние номера (v8.59–v8.62) **столкнулись** с боевыми (автоподбор), > поэтому при сведении они перенумерованы. Содержание не менялось. +## v8.94 (2026-07-25) — GRANT crm_supplier_worker на ad_campaigns/ad_campaign_ads — доступ ночных джобов Директа + +rls-reviewer подтвердил дыру: три ночных джоба Директа (Charge/SyncAudience/ +SyncModeration) перечисляют и обновляют `ad_campaigns`/`ad_campaign_ads` +через соединение `pgsql_supplier` (роль `crm_supplier_worker`, BYPASSRLS). +BYPASSRLS снимает RLS-политику, но НЕ заменяет табличную привилегию — без +GRANT на проде было бы `permission denied for table ad_campaigns/ +ad_campaign_ads` (тот же класс сбоя, что sales_prospects 19.07): + +```sql +GRANT SELECT, UPDATE ON ad_campaigns TO crm_supplier_worker; +GRANT SELECT, UPDATE ON ad_campaign_ads TO crm_supplier_worker; +``` + +SELECT — чтение всеми тремя джобами; UPDATE — запись `moderation_status` +через SyncCampaignModerationJob. Миграция +`app/database/migrations/2026_07_25_100400_grant_supplier_worker_advertising.php` +(`down()` — симметричный REVOKE), гард на существование роли (на dev/тест +роли нет), прогнана на `liderra_testing` — DONE. + +Той же задачей `ChargeCampaignSpendJob` переведён на чтение `ad_settings` +(наценка) по ДЕФОЛТНОМУ соединению вместо `pgsql_supplier` — таблица +глобальная, без RLS, `crm_app_user` уже имеет `SELECT` из миграции +2026_07_24_100300; отдельный supplier-грант не нужен. + +Структурно: 0 новых таблиц/колонок/индексов, +2 GRANT-выражения. +Функций/триггеров без изменений. + ## v8.93 (2026-07-25) — Яндекс-канал, Часть B1, Task 5 — GRANT crm_admin_user на ad_* + модели Eloquent Закрывает совет B-adv-1 из RLS-ревью Части A: будущему админ-экрану