--- /dev/null
+<?php
+
+declare(strict_types=1);
+
+use yii\db\Migration;
+use yii_app\records\AdminGroup;
+
+/**
+ * Даёт доступ к страницам категорийного менеджера (ERP-325):
+ * /assortment-label, /products1c-nomenclature-markup, /products1c-nomenclature-actuality
+ *
+ * Группы:
+ * 7 (GROUP_BUSH_DIRECTOR — Кустовой директор) → view + manage
+ * 10 (GROUP_RS_DIRECTOR — Директор розничной сети) → view + manage
+ * 82 (GROUP_KIK_MANAGER — Менеджер контроля качества) → view + manage
+ * (группа 82 уже имела разрешение из m260422, но могла не применить через auth/init)
+ *
+ * После применения ОБЯЗАТЕЛЬНО запустить:
+ * php yii auth/init --force=1
+ *
+ * Флаг --force=1 обязателен, если cache/flush-all был запущен после предыдущих изменений —
+ * в этом случае dirty-флаг в кеше сброшен и команда без --force пропустит переприменение прав.
+ */
+class m260522_120000_add_catmanager_rbac_to_rs_and_kik extends Migration
+{
+ private const TABLE = 'erp24.admin_group_rbac_config';
+
+ private const PERMISSIONS = ['catmanager/view', 'catmanager/manage'];
+
+ private const TARGET_GROUPS = [
+ AdminGroup::GROUP_BUSH_DIRECTOR, // 7
+ AdminGroup::GROUP_RS_DIRECTOR, // 10
+ AdminGroup::GROUP_KIK_MANAGER, // 82
+ ];
+
+ public function safeUp(): void
+ {
+ foreach (self::TARGET_GROUPS as $groupId) {
+ $existing = $this->db->createCommand(
+ 'SELECT config FROM ' . self::TABLE . ' WHERE admin_group_id = :gid',
+ [':gid' => $groupId]
+ )->queryScalar();
+
+ if ($existing === false) {
+ $this->insert(self::TABLE, [
+ 'admin_group_id' => $groupId,
+ 'config' => implode(',', self::PERMISSIONS),
+ ]);
+ echo " Группа {$groupId}: создана запись [" . implode(', ', self::PERMISSIONS) . "]\n";
+ } else {
+ $current = array_filter(array_map('trim', explode(',', (string)$existing)));
+ $merged = array_values(array_unique(array_merge($current, self::PERMISSIONS)));
+ $added = array_diff(self::PERMISSIONS, $current);
+ $this->update(self::TABLE, ['config' => implode(',', $merged)], ['admin_group_id' => $groupId]);
+ echo " Группа {$groupId}: добавлено [" . implode(', ', $added ?: ['—уже было']) . "]\n";
+ }
+ }
+
+ \Yii::$app->cache->set('dirtyAuthSettings', true);
+
+ echo "\n";
+ echo "==============================================================\n";
+ echo " Запустите:\n";
+ echo " php yii auth/init --force=1\n";
+ echo "==============================================================\n";
+ }
+
+ public function safeDown(): void
+ {
+ foreach (self::TARGET_GROUPS as $groupId) {
+ $existing = $this->db->createCommand(
+ 'SELECT config FROM ' . self::TABLE . ' WHERE admin_group_id = :gid',
+ [':gid' => $groupId]
+ )->queryScalar();
+
+ if ($existing === false) {
+ continue;
+ }
+
+ $current = array_filter(array_map('trim', explode(',', (string)$existing)));
+ $filtered = array_values(array_diff($current, self::PERMISSIONS));
+
+ if ($filtered === []) {
+ $this->delete(self::TABLE, ['admin_group_id' => $groupId]);
+ } else {
+ $this->update(self::TABLE, ['config' => implode(',', $filtered)], ['admin_group_id' => $groupId]);
+ }
+ echo " Группа {$groupId}: разрешения удалены\n";
+ }
+
+ \Yii::$app->cache->set('dirtyAuthSettings', true);
+ echo "\nПосле отката запустите: php yii auth/init --force=1\n";
+ }
+}