get('user_id'); // Получаем организации пользователя через связующую таблицу $userOrgLinks = $orgUserModel->where('user_id', $userId)->findAll(); // Нам нужно получить сами данные организаций $orgIds = array_column($userOrgLinks, 'organization_id'); $organizations = []; if (!empty($orgIds)) { $organizations = $orgModel->whereIn('id', $orgIds)->findAll(); } // Логика автоперехода (как в Auth) // if (count($organizations) === 1) { // session()->set('active_org_id', $organizations[0]['id']); // return redirect()->to('/'); // } // Если больше 1 или 0, показываем список return $this->renderTwig('organizations/index', [ 'organizations' => $organizations, 'count' => count($organizations) ]); } public function create() { if ($this->request->getMethod() === 'POST') { $orgModel = new OrganizationModel(); $orgUserModel = new OrganizationUserModel(); $rules = [ 'name' => 'required|min_length[2]', ]; if (!$this->validate($rules)) { return redirect()->back()->withInput()->with('errors', $this->validator->getErrors()); } // Собираем реквизиты в JSON $requisites = [ 'inn' => trim($this->request->getPost('inn') ?? ''), 'ogrn' => trim($this->request->getPost('ogrn') ?? ''), 'kpp' => trim($this->request->getPost('kpp') ?? ''), 'legal_address' => trim($this->request->getPost('legal_address') ?? ''), 'actual_address' => trim($this->request->getPost('actual_address') ?? ''), 'phone' => trim($this->request->getPost('phone') ?? ''), 'email' => trim($this->request->getPost('email') ?? ''), 'website' => trim($this->request->getPost('website') ?? ''), 'bank_name' => trim($this->request->getPost('bank_name') ?? ''), 'bank_bik' => trim($this->request->getPost('bank_bik') ?? ''), 'checking_account' => trim($this->request->getPost('checking_account') ?? ''), 'correspondent_account' => trim($this->request->getPost('correspondent_account') ?? ''), ]; // Создаем организацию $orgId = $orgModel->insert([ 'owner_id' => session()->get('user_id'), 'name' => $this->request->getPost('name'), 'type' => 'business', 'requisites' => json_encode($requisites), 'settings' => json_encode([]), ]); // Привязываем владельца $orgUserModel->insert([ 'organization_id' => $orgId, 'user_id' => session()->get('user_id'), 'role' => 'owner', 'status' => 'active', 'joined_at' => date('Y-m-d H:i:s'), ]); // Сразу переключаемся на неё session()->set('active_org_id', $orgId); session()->setFlashdata('success', 'Организация успешно создана!'); return redirect()->to('/'); } // GET запрос - форму создания return $this->renderTwig('organizations/create'); } /** * Редактирование организации */ public function edit($orgId) { $orgModel = new OrganizationModel(); $orgUserModel = new OrganizationUserModel(); $userId = session()->get('user_id'); // Проверяем: имеет ли пользователь доступ к этой организации? $membership = $orgUserModel->where('organization_id', $orgId) ->where('user_id', $userId) ->first(); if (!$membership) { session()->setFlashdata('error', 'Доступ запрещен'); return redirect()->to('/organizations'); } // Получаем организацию $organization = $orgModel->find($orgId); if (!$organization) { session()->setFlashdata('error', 'Организация не найдена'); return redirect()->to('/organizations'); } // Декодируем requisites для формы $requisites = json_decode($organization['requisites'] ?? '{}', true); // Если это POST запрос — обновляем данные if ($this->request->getMethod() === 'POST') { $rules = [ 'name' => 'required|min_length[2]', ]; if (!$this->validate($rules)) { return redirect()->back()->withInput()->with('errors', $this->validator->getErrors()); } // Собираем обновлённые реквизиты $newRequisites = [ 'inn' => trim($this->request->getPost('inn') ?? ''), 'ogrn' => trim($this->request->getPost('ogrn') ?? ''), 'kpp' => trim($this->request->getPost('kpp') ?? ''), 'legal_address' => trim($this->request->getPost('legal_address') ?? ''), 'actual_address' => trim($this->request->getPost('actual_address') ?? ''), 'phone' => trim($this->request->getPost('phone') ?? ''), 'email' => trim($this->request->getPost('email') ?? ''), 'website' => trim($this->request->getPost('website') ?? ''), 'bank_name' => trim($this->request->getPost('bank_name') ?? ''), 'bank_bik' => trim($this->request->getPost('bank_bik') ?? ''), 'checking_account' => trim($this->request->getPost('checking_account') ?? ''), 'correspondent_account' => trim($this->request->getPost('correspondent_account') ?? ''), ]; // Обновляем организацию $orgModel->update($orgId, [ 'name' => $this->request->getPost('name'), 'requisites' => json_encode($newRequisites), ]); session()->setFlashdata('success', 'Организация успешно обновлена!'); return redirect()->to('/organizations'); } // GET запрос — форма редактирования return $this->renderTwig('organizations/edit', [ 'organization' => $organization, 'requisites' => $requisites ]); } /** * Удаление организации */ public function delete($orgId) { $orgModel = new OrganizationModel(); $orgUserModel = new OrganizationUserModel(); $userId = session()->get('user_id'); // Проверяем: имеет ли пользователь доступ к этой организации? $membership = $orgUserModel->where('organization_id', $orgId) ->where('user_id', $userId) ->first(); if (!$membership) { session()->setFlashdata('error', 'Доступ запрещен'); return redirect()->to('/organizations'); } // Проверяем, что пользователь — владелец if ($membership['role'] !== 'owner') { session()->setFlashdata('error', 'Только владелец может удалить организацию'); return redirect()->to('/organizations'); } // Получаем организацию $organization = $orgModel->find($orgId); if (!$organization) { session()->setFlashdata('error', 'Организация не найдена'); return redirect()->to('/organizations'); } // Если это POST с подтверждением — удаляем if ($this->request->getMethod() === 'POST') { // Удаляем связи с пользователями $orgUserModel->where('organization_id', $orgId)->delete(); // Мягкое удаление организации $orgModel->delete($orgId); // Если удаляли активную организацию — очищаем if (session()->get('active_org_id') == $orgId) { session()->remove('active_org_id'); } session()->setFlashdata('success', 'Организация "' . $organization['name'] . '" удалена'); return redirect()->to('/organizations'); } // GET запрос — страница подтверждения удаления return $this->renderTwig('organizations/delete', [ 'organization' => $organization ]); } public function switch($orgId) { $userId = session()->get('user_id'); $orgUserModel = new OrganizationUserModel(); // Проверяем: имеет ли пользователь доступ к этой организации? $membership = $orgUserModel->where('organization_id', $orgId) ->where('user_id', $userId) ->first(); if ($membership) { session()->set('active_org_id', $orgId); session()->setFlashdata('success', 'Организация изменена'); return redirect()->to('/'); } else { session()->setFlashdata('error', 'Доступ запрещен'); return redirect()->to('/organizations'); } } }