<?php
namespace App\Form;
use App\Entity\SubEmpresa;
use App\Entity\Empresa;
use App\Entity\User;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class SubEmpresaType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('nome', null, [
'label' => 'Nome',
'required' => false,
'attr' => ['class' => 'form-control', 'style' => 'margin:5px 0;'],
])
->add('descricao', null, [
'label' => 'Descrição',
'required' => false,
'attr' => ['class' => 'form-control', 'style' => 'margin:5px 0;'],
])
->add('empresa', EntityType::class, [
'class' => Empresa::class,
'choice_label' => 'nome',
'placeholder' => 'Selecione a empresa',
'label' => 'Empresa',
'attr' => ['class' => 'form-control', 'style' => 'margin:5px 0;'],
])
->add('users', EntityType::class, [
'class' => User::class,
'label' => 'Aprovadores',
'multiple' => true,
'expanded' => true,
'by_reference' => false, // importante para ManyToMany
'choices' => $options['usuarios_permitidos'], // lista já filtrada no controller
'choice_label' => function (User $u) {
$nome = method_exists($u, 'getNome') ? $u->getNome() : null;
$roles = $u->getRoles() ?? [];
// escolhe um role "representativo" por prioridade
$pick = null;
if (in_array('ROLE_SUPER', $roles, true)) {
$pick = 'ROLE_SUPER';
}
if (!$pick) {
foreach ($roles as $r) {
if (str_starts_with($r, 'ROLE_ADMINISTRADOR')) {
$pick = $r;
break;
}
}
}
if (!$pick) {
foreach ($roles as $r) {
if (str_starts_with($r, 'ROLE_APROVADOR')) {
$pick = $r;
break;
}
}
}
if (!$pick && $roles) {
$pick = $roles[0]; // fallback
}
// transforma "ROLE_APROVADOR_ADMINISTRATIVO" -> "Aprovador Administrativo"
$pretty = 'Sem Papel';
if ($pick) {
$clean = preg_replace('/^ROLE_/', '', $pick);
$parts = explode('_', $clean);
$pretty = implode(' ', array_map(
fn($p) => mb_convert_case($p, MB_CASE_TITLE, 'UTF-8'),
array_map('strtolower', $parts)
));
}
// Se quiser mostrar só o papel, retorne apenas $pretty
return $nome ? sprintf('%s (%s)', $nome, $pretty) : $pretty;
},
'attr' => [],
'choice_attr' => function () {
static $index = 0;
$index++;
return [
'style' => $index === 1
? 'margin-right:6px;' // 1º item: sem margin-left
: 'margin-right:6px; margin-left:16px;' // demais: com margin-left
];
},
'required' => false,
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => SubEmpresa::class,
'usuarios_permitidos' => [], // obrigatório: será preenchido no controller
]);
}
}