bp/app/Controllers/Organizations.php

246 lines
10 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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