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');
|
|
}
|
|
}
|
|
}
|