<?php
namespace App\FormSubscriber;
use App\Entity\GHCandidato;
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\DateType;
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;
use function Sodium\add;
class GHNovedadNominaSubscriber implements EventSubscriberInterface {
private $entityManager;
public function __construct(
EntityManagerInterface $entityManager
) {
$this->entityManager = $entityManager;
}
private function addReadOnlyField(Form $form, string $name, ?string $value, string $label)
{
$form->add($name, TextType::class, [
'label' => $label,
'data' => $value,
'mapped' => false,
'disabled' => true,
'attr' => ['readonly' => true, 'class' => 'form-control']
]);
}
public static function getSubscribedEvents(): array {
// Tells the dispatcher that you want to listen on the form.pre_set_data
// event and that the preSetData method should be called.
return [FormEvents::PRE_SUBMIT => 'preSubmit'];
}
public function preSubmit(FormEvent $event): void {
$data = $event->getData();
$candidato = null;
$contratacion = null;
//data es un arreglo con los valores establecidos por el usuario en el form.
//como $data contiene el pais seleccionado por el usuario al enviar el formulario,
// usamos el valor de la posicion $data['country'] para filtrar el sql de los estados
$form = $event->getForm();
$novedad = $form->getData(); // Entidad original, antes del envío
$originalConcepto = $novedad->getConceptoNomina()->first();
$originalConceptoId = $originalConcepto ? $originalConcepto->getId() : null;
$submittedConceptoId = $data['conceptoNomina'] ?? null;
// Si el concepto ha cambiado, reseteamos el valor del sub-concepto.
if ($submittedConceptoId != $originalConceptoId) {
$data['subConcepto'] = null;
$event->setData($data);
}
if (isset($data['persona'])) {
$idPersona = $data['persona'];
$persona = $this->entityManager->getRepository(\App\Entity\TerPersona::class)->find($idPersona);
// Validar al jefe inmediato que tiene por contratacion - si en algun momento fue vacante
$candidato = $this->entityManager->getRepository(GHCandidato::class)->findOneBy([
'numeroDocumento' => $persona->getNumeroDocumento(), // Tiene que ser igual al de la persona
]);
// Validar si el candidato tiene contratacion valida
if($candidato)
$contratacion = $candidato->getContratacion()->last();
if ($persona->getTipoDocumento()) {
$idTipoDocumento = $persona->getTipoDocumento()->getId();
$event->getForm()->add('tipoDocumento', TextType::class, ['label' => 'Tipo Documento',
'required' => true,
'data' => $persona->getTipoDocumento()?->getNombre() ?? 'N/A',
'mapped' => false,
'disabled' => true,
]);
}
if ($persona && $persona->getNumeroDocumento()) {
$numero = $persona->getNumeroDocumento();
$numeroDocumentoEntity = $this->entityManager
->getRepository(\App\Entity\TerPersona::class)
->findOneBy(['numeroDocumento' => $numero]);
if ($numeroDocumentoEntity) {
$event->getForm()->add('numeroDocumento', TextType::class, [
'label' => 'Número Documento',
'data' => $numeroDocumentoEntity->getNumeroDocumento() ?? 'N/A',
'attr' => array('readonly' => true),
'disabled' => true
]);
}
}
// if ($persona && $persona->getNumeroDocumento()) {
// $event->getForm()->add('numeroDocumento', TextType::class, [
// 'label' => 'Número Documento',
// 'data' => $persona->getNumeroDocumento(), // ← el string directamente
// 'mapped' => false,
// 'disabled' => true,
// 'attr' => ['readonly' => true]
// ]);
// }
if ($persona && $persona->getCreateAt() instanceof \DateTimeInterface) {
$event->getForm()->add('fechaDiligenciamiento', TextType::class, [
'label' => 'Fecha Ingreso',
'data' => $contratacion && $contratacion->getFechaIngreso() ? $contratacion->getFechaIngreso()->format('Y-m-d') : $persona->getCreateAt()->format('Y-m-d'),
'mapped' => false,
'required' => false,
'attr' => ['readonly' => true],
'disabled' => true
]);
// Calcular años de diferencia
$diasBeneficio = $persona->getCreateAt();
$hoy = new \DateTime();
$diff = $diasBeneficio->diff($hoy);
$anios = $diff->y;
// Definir texto del beneficio con control correcto
if ($anios >= 3) {
$textoBeneficio = '3 días de beneficio';
} elseif ($anios == 2) {
$textoBeneficio = '2 días de beneficio';
} elseif ($anios == 1) {
$textoBeneficio = '1 día de beneficio';
} else {
$textoBeneficio = 'sin beneficios';
}
$event->getForm()->add('beneficioVacaciones', TextType::class, [
'label' => 'Beneficio Vacaciones',
'data' => $textoBeneficio,
'mapped' => false,
'required' => false,
'attr' => ['readonly' => true],
'disabled' => true
]);
}
if ($persona && $persona->getPerfilCargo()) {
$perfilCargo = $persona->getPerfilCargo();
$cargo = $perfilCargo->getCargo();
$proceso = $perfilCargo->getParProceso();
// 🔹 CARGO
if ($cargo) {
$this->addReadOnlyField($event->getForm(), 'cargo', $cargo->getNombre(), 'Cargo');
} else {
$event->getForm()->add('cargo', EntityType::class, [
'class' => \App\Entity\ParCargo::class,
'choice_label' => 'nombre',
'placeholder' => 'Seleccione un cargo',
'label' => 'Cargo',
'required' => false,
]);
}
// 🔹 PROCESO
if ($proceso) {
$this->addReadOnlyField($event->getForm(), 'proceso', $proceso->getNombre(), 'Proceso');
} else {
$event->getForm()->add('proceso', EntityType::class, [
'class' => \App\Entity\ParProceso::class,
'choice_label' => 'nombre',
'placeholder' => 'Seleccione un proceso',
'label' => 'Proceso',
'required' => false,
]);
}
// 🔹 JEFE INMEDIATO
$nombreJefe = null;
// $p = null;
// if ($perfilCargo->getJefeInmediatoCargo()) {
// foreach ($perfilCargo->getJefeInmediatoCargo()->getPerfilCargoJefeInmediato() as $pc) {
// foreach ($pc->getPersona() as $pp) {
// $p = $pp; // Agregar dato terpersona.
// if ($p->getEstado()->getId() == 1) {
// $nombreJefe = $pp->getPerfilCargo()?->getJefeInmediato()?->getNombres() ?? 'N/A'; // usa un getter o concatenación
// }
// }
// }
// }
if(!$candidato) {
$this->addReadOnlyField($event->getForm(), 'jefeInmediato', 'N/A', 'Jefe Inmediato');
}else{
$nombreJefe = $contratacion && $contratacion->getJefeInmediatoC() ?
$contratacion->getJefeInmediatoC()->getNombres() : 'N/A';
// Validar que busca al jefe inmediato
// dump($nombreJefe);
// dump($jefeInmediato);
$this->addReadOnlyField($event->getForm(), 'jefeInmediato', $nombreJefe, 'Jefe Inmediato');
}
}
// $data['rangoSalarial'] = $perfilCargo->getRangoSalarial();
// $data['ParProceso'] = $perfilCargo->getParProceso()->getId();
// $data['subprocesoId'] = $perfilCargo->getSubprocesoId()->getId();
// $data['cargo'] = $perfilCargo->getCargo()->getId();
$event->setData($data);
} else {
$event->getForm()->add('tipoDocumento');
}
if (isset($data['conceptoNomina'])) {
$idConcepto = $data['conceptoNomina'];
//$concepto = $this->entityManager->getRepository(\App\Entity\ParConceptoNomina::class)->find($idConcepto);
// if ($concepto) {
// $idTipoDocumento = $persona->getTipoDocumento()->getId();
$event->getForm()->add('subConcepto', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
'class' => \App\Entity\ParSubConceptoNomina::class,
'query_builder' => function (\Doctrine\ORM\EntityRepository $er)use ($idConcepto) {
return $er->createQueryBuilder('sc')
->leftJoin('sc.conceptoNomina', 'cn')
->where('cn.id in (:idTipoDocumento)')
->setParameter('idTipoDocumento', $idConcepto)
->orderBy('sc.nombre', 'ASC')
->setMaxResults(50);
},
'placeholder' => 'Seleccione una opción',
'multiple' => true ,
'required' => false,
'attr' => ['class' => 'form-control nonSelectMultiple']]);
} else {
$event->getForm()->add('subConcepto');
}
}
}