<?php
namespace App\Controller;
use App\Entity\SubEmpresa;
use App\Form\SubEmpresaType;
use App\Repository\SubEmpresaRepository;
use App\Repository\UserRepository;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/sub/empresa')]
class SubEmpresaController extends AbstractController
{
#[Route('/', name: 'app_sub_empresa_index', methods: ['GET'])]
public function index(SubEmpresaRepository $subEmpresaRepository): Response
{
return $this->render('sub_empresa/index.html.twig', [
'sub_empresas' => $subEmpresaRepository->findAll(),
'nav_active' => 'Subempresa',
]);
}
#[Route('/new', name: 'app_sub_empresa_new', methods: ['GET', 'POST'])]
public function new(
Request $request,
SubEmpresaRepository $subEmpresaRepository,
UserRepository $userRepository
): Response {
$subEmpresa = new SubEmpresa();
// ---- Monta lista de usuários permitidos (aprovadores e administradores)
$todosUsuarios = $userRepository->findAll();
$matches = static function (User $u): bool {
$roles = $u->getRoles() ?? [];
// exatos aceitos
$exact = ['ROLE_ADMINISTRATIVO', 'ROLE_APROVADOR'];
// prefixes aceitos (cobre ROLE_ADMINISTRADOR_ASSESSORIA, ROLE_APROVADOR_ADMINISTRATIVO etc.)
$prefixes = ['ROLE_ADMINISTRADOR', 'ROLE_APROVADOR'];
foreach ($roles as $r) {
if (in_array($r, $exact, true)) {
return true;
}
foreach ($prefixes as $p) {
if (strpos($r, $p) === 0) {
return true;
}
}
}
return false;
};
$permitidos = array_values(array_filter($todosUsuarios, $matches));
$form = $this->createForm(SubEmpresaType::class, $subEmpresa, [
'usuarios_permitidos' => $permitidos,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$subEmpresaRepository->save($subEmpresa, true);
return $this->redirectToRoute('app_sub_empresa_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('sub_empresa/new.html.twig', [
'sub_empresa' => $subEmpresa,
'form' => $form,
'nav_active' => 'Subempresa',
]);
}
#[Route('/{id}', name: 'app_sub_empresa_show', methods: ['GET'])]
public function show(SubEmpresa $subEmpresa): Response
{
return $this->render('sub_empresa/show.html.twig', [
'sub_empresa' => $subEmpresa,
]);
}
#[Route('/{id}/edit', name: 'app_sub_empresa_edit', methods: ['GET', 'POST'])]
public function edit(
Request $request,
SubEmpresa $subEmpresa,
SubEmpresaRepository $subEmpresaRepository,
UserRepository $userRepository
): Response {
// ---- Monta lista base com aprovadores/administradores
$todosUsuarios = $userRepository->findAll();
$matches = static function (User $u): bool {
$roles = $u->getRoles() ?? [];
$exact = ['ROLE_ADMINISTRATIVO', 'ROLE_APROVADOR'];
$prefixes = ['ROLE_ADMINISTRADOR', 'ROLE_APROVADOR'];
foreach ($roles as $r) {
if (in_array($r, $exact, true)) {
return true;
}
foreach ($prefixes as $p) {
if (strpos($r, $p) === 0) {
return true;
}
}
}
return false;
};
$permitidosBase = array_values(array_filter($todosUsuarios, $matches));
// Garante que os já associados continuem aparecendo (mesmo se perderam o role)
$selecionados = $subEmpresa->getUsers()->toArray();
$porId = [];
foreach (array_merge($permitidosBase, $selecionados) as $u) {
$porId[$u->getId()] = $u;
}
$permitidos = array_values($porId);
$form = $this->createForm(SubEmpresaType::class, $subEmpresa, [
'usuarios_permitidos' => $permitidos,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$subEmpresaRepository->save($subEmpresa, true);
return $this->redirectToRoute('app_sub_empresa_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('sub_empresa/edit.html.twig', [
'sub_empresa' => $subEmpresa,
'form' => $form,
'nav_active' => 'Subempresa',
]);
}
#[Route('/{id}', name: 'app_sub_empresa_delete', methods: ['POST'])]
public function delete(Request $request, SubEmpresa $subEmpresa, SubEmpresaRepository $subEmpresaRepository): Response
{
if ($this->isCsrfTokenValid('delete' . $subEmpresa->getId(), $request->request->get('_token'))) {
$subEmpresaRepository->remove($subEmpresa, true);
}
return $this->redirectToRoute('app_sub_empresa_index', [], Response::HTTP_SEE_OTHER);
}
}