<?php
namespace App\FormSubscriber;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use App\Entity\ParDescripcionDiligencia;
use App\Entity\RFDiligencia;
class RFDiligenciaSubscriber implements EventSubscriberInterface
{
private EntityManagerInterface $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public static function getSubscribedEvents(): array
{
return [
FormEvents::PRE_SET_DATA => 'preSetData',
FormEvents::PRE_SUBMIT => 'preSubmit',
];
}
public function preSetData(FormEvent $event): void
{
$form = $event->getForm();
$data = $event->getData();
if (method_exists($data, 'getMensajero') && $data->getMensajero()) {
$idColaborador = $data->getMensajero()->getId();
$diligencias = $this->entityManager->getRepository(RFDiligencia::class)
->diligenciaColaborador([$idColaborador], [34]);
$ordenAct = array_map(fn($d) => $d['id'], $diligencias);
$ordenEntities = $this->entityManager->getRepository(RFDiligencia::class)
->findBy(['id' => $ordenAct]);
$form->add('ordenTmp', EntityType::class, [
'label' => 'Orden Diligencias',
'required' => true,
'multiple' => true,
'mapped' => false,
'class' => RFDiligencia::class,
'query_builder' => function ($er) use ($ordenAct) {
return $er->createQueryBuilder('e')
->leftJoin('e.mensajero', 'm')
->leftJoin('e.estado', 'es')
->where('(m.id IS NULL OR e.id IN (:diligencias))')
->andWhere('es.nombre IN (:estados)')
->setParameter('diligencias', $ordenAct ?: [0])
->setParameter('estados', ['SOLICITADO', 'AUTORIZADO']);
},
'attr' => ['class' => 'nonSelectMultiple multipleSelect'],
'placeholder' => 'Seleccióne una opción.',
'data' => $ordenEntities,
]);
}
}
public function preSubmit(FormEvent $event): void
{
$form = $event->getForm();
$data = $event->getData();
// Descripción Diligencia dinámica
if (isset($data['tipoDiligencia'])) {
$idTipoDiligencia = (int)$data['tipoDiligencia'];
$required = true;
$idDesDil = match ($idTipoDiligencia) {
1 => [1, 2, 3, 4, 5],
2 => [1, 6],
3 => (function () use (&$required) {
$required = false;
return [0];
})(),
4 => [7, 8, 9, 10],
5 => [11, 12],
6 => [13, 14, 15],
default => [0],
};
if ($idTipoDiligencia == 3) {
$form->remove('descripcionDiligencia');
}else{
$form->add('descripcionDiligencia', EntityType::class, [
'class' => ParDescripcionDiligencia::class,
'query_builder' => fn($er) => $er->createQueryBuilder('dd')
->where('dd.id IN (:id)')
->setParameter('id', $idDesDil)
->orderBy('dd.nombre', 'ASC'),
'label' => 'Descripción Diligencia',
'required' => $required,
'attr' => ['class' => 'form-control nonSelectMultiple'],
'placeholder' => 'Seleccione una opción.',
]);
}
}
// OrdenTmp dinámico según mensajero
if (isset($data['mensajero'])) {
$idColaborador = $data['mensajero'];
$diligencias = $this->entityManager->getRepository(RFDiligencia::class)
->diligenciaColaborador([$idColaborador], [34]);
$ordenAct = array_map(fn($d) => $d['id'], $diligencias) ?: [0];
$form->add('ordenTmp', EntityType::class, [
'label' => 'Orden Diligencias',
'required' => true,
'multiple' => true,
'mapped' => false,
'class' => RFDiligencia::class,
'query_builder' => function ($er) use ($ordenAct) {
return $er->createQueryBuilder('e')
->leftJoin('e.mensajero', 'm')
->leftJoin('e.estado', 'es')
->where('(m.id IS NULL OR e.id IN (:diligencias))')
->andWhere('es.nombre IN (:estados)')
->setParameter('diligencias', $ordenAct)
->setParameter('estados', ['SOLICITADO', 'AUTORIZADO']);
},
'attr' => ['class' => 'nonSelectMultiple multipleSelect'],
'placeholder' => 'Seleccióne una opción.',
]);
// Sin necesidad de hacer setData manual aquí
}
}
}