246 lines
10 KiB
PHP
246 lines
10 KiB
PHP
<?php
|
||
|
||
namespace App\Controllers;
|
||
|
||
use App\Models\OrganizationModel;
|
||
use App\Models\OrganizationUserModel;
|
||
|
||
class Organizations extends BaseController
|
||
{
|
||
public function index()
|
||
{
|
||
$orgModel = new OrganizationModel();
|
||
$orgUserModel = new OrganizationUserModel();
|
||
$userId = session()->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');
|
||
}
|
||
}
|
||
}
|