<?php
// src/Form/EventListener/AddNameFieldSubscriber.php
namespace App\FormSubscriber;
use App\Entity\GHCandidato;
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, // 🔥 AQUÍ está la magia
'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);
// Buscar el salario y tipo contrato por medio de la confirmacion y condiciones del contrato
$candidato = $this->entityManager->getRepository(GHCandidato::class)->findOneBy([
'numeroDocumento' => $colaborador->getNumeroDocumento()
]);
$salario = null;
$tipoContrato = null;
$sucursal = null;
if($candidato){
$salario = $candidato->getContratacion() && $candidato->getContratacion()->last() ? $candidato->getContratacion()->last()->getSalario() : 'N/A';
$tipoContrato = $candidato->getVacante()->getParTipoContrato() ? $candidato->getVacante()->getParTipoContrato()->getNombre() : 'N/A';
$sucursal = $candidato->getVacante()->getSede() ? $candidato->getVacante()->getSede()->getNombre() : 'N/A';
}
// Sigue actualizando los campos visibles si deseas:
$cargo = $colaborador?->getPerfilCargo()?->getCargo()?->getNombre() ?? 'N/A';
$salario = $colaborador->getSalario() ? $colaborador->getSalario() : ($salario ?? 'N/A'); // Validar si encontro registro de salario desde la contratacion
$empresaObj = $colaborador?->getEmpresa();
$empresa = $empresaObj ? $empresaObj->getNombre() : 'N/A';
$tipoContrato = $colaborador->getTipoContrato() ? $colaborador->getTipoContrato()->getNombre() : ($tipoContrato ?? 'N/A');
$data['cargoTmp'] = $cargo; // Falla
$data['salarioTmp'] = $salario;
$data['empresaTmp'] = $empresa;
$data['sedeTmp'] = ($colaborador->getSede() ? $colaborador->getSede()->getNombre() : ($sucursal ?? 'N/A'));
$data['tipoContratoTmp'] = $tipoContrato;
$event->setData($data);
}
}
}