<?php
// src/Form/EventListener/AddNameFieldSubscriber.php
namespace App\FormSubscriber;
use App\Entity\TerPersona;
use Doctrine\ORM\EntityRepository;
use App\Entity\GHPerfilCargo;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\Form;
use Doctrine\ORM\EntityManagerInterface;
class GHCambioContratoSubscriber implements EventSubscriberInterface {
private $entityManager;
public function __construct(
EntityManagerInterface $entityManager
) {
$this->entityManager = $entityManager;
}
public static function getSubscribedEvents(): array {
return [
FormEvents::PRE_SET_DATA => 'preSetData',
FormEvents::PRE_SUBMIT => 'preSubmit',
];
}
private function modificarFormulario(Form $form, ?TerPersona $colaborador): void
{
$qb = $this->entityManager->createQueryBuilder()
->select('p')
->from(GHPerfilCargo::class, 'p')
->join('p.estado', 'est')
->join('p.cargo', 'c')
->where('est.id = :estadoActivo') // 🔥 NO usar ID
->setParameter('estadoActivo', 1)
->orderBy('c.nombre', 'ASC');
// 👉 Excluir el cargo actual si existe colaborador
if (
$colaborador &&
$colaborador->getPerfilCargo() &&
$colaborador->getPerfilCargo()->getCargo()
) {
$nombreCargoActual = $colaborador->getPerfilCargo()->getCargo()->getNombre();
$qb->andWhere('c.nombre != :nombreActual')
->setParameter('nombreActual', $nombreCargoActual);
}
$tiposCargoDisponibles = $qb->getQuery()->getResult();
// 🧠DEBUG REAL (si algo falla, aquà se ve)
/*
dump(array_map(
fn(GHPerfilCargo $p) => [
'perfilCargoId' => $p->getId(),
'cargo' => $p->getCargo()->getNombre(),
'estado' => $p->getEstado()->getCodigo(),
],
$tiposCargoDisponibles
));
die;
*/
// 🧾 Formulario
$form->add('cargo', EntityType::class, [
'class' => GHPerfilCargo::class,
'choices' => $tiposCargoDisponibles,
'placeholder' => 'Seleccione un cargo',
'required' => true,
'choice_label' => function (GHPerfilCargo $perfilCargo) {
return $perfilCargo->getCargo()->getNombre();
},
'attr' => ['class' => 'form-control'],
]);
}
public function preSetData(FormEvent $event): void {
$form = $event->getForm();
$data = $event->getData();
if ($data && $data->getColaborador()) {
$colaborador = $data->getColaborador();
$this->modificarFormulario($form, $colaborador);
}
}
public function preSubmit(FormEvent $event): void {
$form = $event->getForm();
$data = $event->getData();
if (isset($data['colaborador'])) {
$idColaborador = $data['colaborador'];
$colaborador = $this->entityManager->getRepository(\App\Entity\TerPersona::class)->find($idColaborador);
$this->modificarFormulario($form, $colaborador);
// Sigue actualizando los campos visibles si deseas:
$cargo = $colaborador?->getPerfilCargo()?->getCargo()?->getNombre() ?? 'N/A';
$salario = $colaborador?->getSalario();
$empresaObj = $colaborador?->getPerfilCargo()?->getEmpresaFilial()->first();
$empresa = $empresaObj ? $empresaObj->getAbreviatura() : 'N/A';
$sedeObj = $colaborador?->getSede(); // Usuario registrado
$sede = $sedeObj ? $sedeObj->getNombre() : 'N/A';
$tipoContratoObj = $colaborador?->getPerfilCargo()?->getTipoContrato()?->first();
$tipoContrato = $tipoContratoObj ? $tipoContratoObj->getNombre() : 'N/A';
$data['cargoTmp'] = $cargo; // Falla
$data['salarioTmp'] = $salario;
$data['empresaTmp'] = $empresa;
$data['sedeTmp'] = $sede;
$data['tipoContratoTmp'] = $tipoContrato;
$event->setData($data);
}
}
}