From b281bd5e74c0f7d350c487796c37031dde4ad4af Mon Sep 17 00:00:00 2001 From: vladfo Date: Thu, 17 Oct 2024 14:46:46 +0300 Subject: [PATCH] =?utf8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5?= =?utf8?q?=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D0=BC=D0=B0=D0=B3?= =?utf8?q?=D0=B0=D0=B7=D0=B8=D0=BD=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../crud/ClusterAdminController.php | 33 ++++++++-- erp24/services/ClusterManagerService.php | 65 +++++++++++++++++++ 2 files changed, 93 insertions(+), 5 deletions(-) diff --git a/erp24/controllers/crud/ClusterAdminController.php b/erp24/controllers/crud/ClusterAdminController.php index 77667ecc..d917c713 100644 --- a/erp24/controllers/crud/ClusterAdminController.php +++ b/erp24/controllers/crud/ClusterAdminController.php @@ -88,6 +88,8 @@ class ClusterAdminController extends Controller if ($existingRecord) { // Обновляем дату окончания для текущей записи на текущую дату $existingRecord->date_end = date('Y-m-d'); + + ClusterManagerService::clearClusterManagerStores($existingRecord->cluster_id, $existingRecord->admin_id); if (!$existingRecord->save()) { Yii::$app->session->setFlash('error', 'Ошибка при обновлении существующей записи.'); return $this->redirect(['create']); @@ -115,7 +117,7 @@ class ClusterAdminController extends Controller $clusters = ArrayHelper::map(Cluster::find()->all(), 'id', 'name'); $admins = ArrayHelper::map(Admin::find() ->select(['id', 'name']) - ->where(['NOT IN', 'group_id', [-1, 1000]]) // Исключаем сотрудников с group_id = -1 и group_id = 1000 + ->where(['IN', 'group_id', [7]]) // Только кустовые директора ->all(), 'id', 'name'); $user = Yii::$app->user->identity; @@ -139,18 +141,39 @@ class ClusterAdminController extends Controller { $model = $this->findModel($id); - if ($this->request->isPost && $model->load($this->request->post()) && $model->save()) { - return $this->redirect(['view', 'id' => $model->id]); - } + // Сохраним оригинальные значения до изменения + $originalClusterId = $model->cluster_id; + $originalAdminId = $model->admin_id; + + if ($this->request->isPost && $model->load($this->request->post())) { + // Если запись успешно обновлена + if ($model->save()) { + // Проверяем, изменились ли cluster_id или admin_id + if ($originalClusterId != $model->cluster_id || $originalAdminId != $model->admin_id) { + // Очищаем старую привязку менеджера к магазину + ClusterManagerService::clearClusterManagerStores($originalClusterId, $originalAdminId); + + // Синхронизируем новую привязку + ClusterManagerService::syncClusterManagers($model->cluster_id, $model->admin_id); + } + + // Перенаправляем на страницу просмотра + return $this->redirect(['view', 'id' => $model->id]); + } else { + Yii::$app->session->setFlash('error', 'Ошибка при сохранении данных.'); + } + } // Получение данных для выпадающих списков $clusters = ArrayHelper::map(Cluster::find()->all(), 'id', 'name'); $admins = ArrayHelper::map(Admin::find() ->select(['id', 'name']) - ->where(['NOT IN', 'group_id', [-1, 1000]]) // Исключаем сотрудников с group_id = -1 и group_id = 1000 + ->where(['IN', 'group_id', [7]]) // Только кустовые директора ->all(), 'id', 'name'); + $user = Yii::$app->user->identity; + return $this->render('update', [ 'model' => $model, 'clusters' => $clusters, diff --git a/erp24/services/ClusterManagerService.php b/erp24/services/ClusterManagerService.php index a900c68a..2e8409a5 100644 --- a/erp24/services/ClusterManagerService.php +++ b/erp24/services/ClusterManagerService.php @@ -80,4 +80,69 @@ class ClusterManagerService } } } + + + public static function clearClusterManagerStores($clusterId, $adminId) + { + + $clusterAdmin = ClusterAdmin::find() + ->where(['cluster_id' => $clusterId, 'admin_id' => $adminId, 'date_end' => '2100-01-01']) + ->one(); + + if (!$clusterAdmin) { + Yii::debug("Привязка для кластера $clusterId и администратора $adminId не найдена или уже закрыта.", __METHOD__); + return false; + } + + + $manager = Admin::findOne($adminId); + if (!$manager) { + Yii::debug("Менеджер с ID $adminId не найден.", __METHOD__); + return false; + } + + + $clusterStores = StoreDynamic::find() + ->select(['value_int AS cluster_id', "string_agg(store_id::text, ',') AS stores"]) + ->where(['active' => 1, 'value_int' => $clusterId]) + ->groupBy('value_int') + ->asArray() + ->one(); + + if (!$clusterStores) { + Yii::debug("Магазины для кластера $clusterId не найдены.", __METHOD__); + return false; + } + + $clusterStoreIds = explode(',', $clusterStores['stores']); + + // Текущий список магазинов у менеджера + $managerStores = explode(',', $manager->store_arr); + + // Удаляем из списка менеджера магазины, которые пересекаются с магазинами кластера + $newStoreArr = array_diff($managerStores, $clusterStoreIds); + + // Обновляем поля store_arr и store_arr_guid + $manager->store_arr = implode(',', $newStoreArr); + + // Получим экспортные GUID магазинов для удаления + $entityCityStore = ExportImportService::getEntityByType('city_store'); + $exportCityStore = ArrayHelper::map($entityCityStore, 'entity_id', 'export_val'); + $exportGuidsToRemove = array_intersect_key($exportCityStore, array_flip($clusterStoreIds)); + + // Обновляем store_arr_guid у менеджера, исключая пересекающиеся магазины + $managerGuids = explode(',', $manager->store_arr_guid); + $newStoreGuids = array_diff($managerGuids, $exportGuidsToRemove); + $manager->store_arr_guid = implode(',', $newStoreGuids); + + // Сохраняем изменения + if ($manager->save(false)) { + Yii::debug("Пользователь {$manager->id} успешно обновлен после удаления магазинов.", __METHOD__); + return true; + } else { + Yii::debug("Не удалось обновить пользователя {$manager->id} при удалении магазинов.", __METHOD__); + return false; + } + } + } \ No newline at end of file -- 2.39.5