src/FormSubscriber/GHNovedadNominaSubscriber.php line 90

Open in your IDE?
  1. <?php
  2. namespace App\FormSubscriber;
  3. use App\Entity\GHCandidato;
  4. use App\Entity\ParSubConceptoNomina;
  5. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  8. use Symfony\Component\Form\Extension\Core\Type\DateType;
  9. use Symfony\Component\Form\Extension\Core\Type\TextType;
  10. use Symfony\Component\Form\FormEvent;
  11. use Symfony\Component\Form\FormEvents;
  12. use Symfony\Component\Form\Form;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use function Sodium\add;
  15. class GHNovedadNominaSubscriber implements EventSubscriberInterface {
  16.     private $entityManager;
  17.     public function __construct(
  18.             EntityManagerInterface $entityManager
  19.     ) {
  20.         $this->entityManager $entityManager;
  21.     }
  22.     private function addReadOnlyField(Form $formstring $name, ?string $valuestring $label)
  23.     {
  24.         $form->add($nameTextType::class, [
  25.             'label' => $label,
  26.             'data' => $value,
  27.             'mapped' => false,
  28.             'disabled' => true,
  29.             'attr' => ['readonly' => true'class' => 'form-control']
  30.         ]);
  31.     }
  32.     private function addAuxSubConcepto($form, ?int $conceptoId, ?ParSubConceptoNomina $selected null): void
  33.     {
  34.         $form->add('auxSubConcepto'EntityType::class, [
  35.             'class' => ParSubConceptoNomina::class,
  36.             'mapped' => false,
  37.             'required' => false,
  38.             'placeholder' => 'Seleccione una opción',
  39.             'query_builder' => function ($er) use ($conceptoId) {
  40.                 return $er->createQueryBuilder('sc')
  41.                     ->leftJoin('sc.conceptoNomina''cn')
  42.                     ->where('cn.id = :id')
  43.                     ->setParameter('id'$conceptoId)
  44.                     ->orderBy('sc.nombre''ASC');
  45.             },
  46.             // ⚠️ SOLO en PRE_SET_DATA
  47.             'data' => $selected,
  48.             'label' => 'Sub Concepto',
  49.         ]);
  50.     }
  51.     public function onPreSetData(FormEvent $event): void
  52.     {
  53.         $form $event->getForm();
  54.         $novedad $event->getData();
  55.         if (!$novedad) {
  56.             return;
  57.         }
  58.         $concepto $novedad->getConceptoNomina()?->last();
  59.         if (!$concepto) {
  60.             return;
  61.         }
  62.         $concepto $novedad->getConceptoNomina()?->last();
  63.         $sub $novedad->getSubConcepto()?->last();
  64.         if ($concepto) {
  65.             $this->addAuxSubConcepto($form$concepto->getId(), $sub $sub null);
  66.         }
  67.     }
  68.     public static function getSubscribedEvents(): array {
  69.         // Tells the dispatcher that you want to listen on the form.pre_set_data
  70.         // event and that the preSetData method should be called.
  71.         return [FormEvents::PRE_SUBMIT => 'preSubmit',FormEvents::PRE_SET_DATA => 'onPreSetData',];
  72.     }
  73.     public function preSubmit(FormEvent $event): void {
  74.         $data $event->getData();
  75.         $candidato null;
  76.         $contratacion null;
  77.         $form $event->getForm();
  78.         //data es un arreglo con los valores establecidos por el usuario en el form.
  79.         //como $data contiene el pais seleccionado por el usuario al enviar el formulario,
  80.         // usamos el valor de la posicion $data['country'] para filtrar el sql de los estados
  81.         
  82.                 $form $event->getForm();
  83.                 $novedad $form->getData(); // Entidad original, antes del envío
  84.                 dump($novedad->getSubConcepto()->last() ? $novedad->getSubConcepto()->last() : null);
  85.                 $originalConcepto $novedad->getConceptoNomina()->first();
  86.                 $originalConceptoId $originalConcepto $originalConcepto->getId() : null;
  87.                 $submittedConceptoId $data['conceptoNomina'] ?? null;
  88.                 // Si el concepto ha cambiado, reseteamos el valor del sub-concepto.
  89.                 if ($submittedConceptoId != $originalConceptoId) {
  90.                     $data['subConcepto'] = null;
  91.                     $event->setData($data);
  92.                 }
  93.           
  94.         
  95.         if (isset($data['persona'])) {
  96.             $idPersona $data['persona'];
  97.             $persona $this->entityManager->getRepository(\App\Entity\TerPersona::class)->find($idPersona);
  98.             // Validar al jefe inmediato que tiene por contratacion - si en algun momento fue vacante
  99.             $candidato $this->entityManager->getRepository(GHCandidato::class)->findOneBy([
  100.                 'numeroDocumento' => $persona->getNumeroDocumento(), // Tiene que ser igual al de la persona
  101.             ]);
  102.             // Validar si el candidato tiene contratacion valida
  103.             if($candidato) {
  104.                 $contratacion $candidato->getContratacion()->last();
  105.             }
  106.             if ($persona->getTipoDocumento()) {
  107.                 $idTipoDocumento $persona->getTipoDocumento()->getId();
  108.                 $event->getForm()->add('tipoDocumento'TextType::class, ['label' => 'Tipo Documento',
  109.                     'required' => true,
  110.                     'data' => $persona->getTipoDocumento()?->getNombre() ?? 'N/A',
  111.                     'mapped' => false,
  112.                     'disabled' => true,
  113.                     ]);
  114.             }
  115.             if ($persona && $persona->getNumeroDocumento()) {
  116.                 $numero $persona->getNumeroDocumento();
  117.                 $numeroDocumentoEntity $this->entityManager
  118.                     ->getRepository(\App\Entity\TerPersona::class)
  119.                     ->findOneBy(['numeroDocumento' => $numero]);
  120.                 if ($numeroDocumentoEntity) {
  121.                     $event->getForm()->add('numeroDocumento'TextType::class, [
  122.                         'label' => 'Número Documento',
  123.                         'data' => $numeroDocumentoEntity->getNumeroDocumento() ?? 'N/A',
  124.                         'attr' => array('readonly' => true),
  125.                         'disabled' => true
  126.                     ]);
  127.                 }
  128.             }
  129. //            if ($persona && $persona->getNumeroDocumento()) {
  130. //                $event->getForm()->add('numeroDocumento', TextType::class, [
  131. //                    'label' => 'Número Documento',
  132. //                    'data' => $persona->getNumeroDocumento(), // ← el string directamente
  133. //                    'mapped' => false,
  134. //                    'disabled' => true,
  135. //                    'attr' => ['readonly' => true]
  136. //                ]);
  137. //            }
  138.             if ($persona && $persona->getCreateAt() instanceof \DateTimeInterface) {
  139.                 $event->getForm()->add('fechaDiligenciamiento'TextType::class, [
  140.                     'label' => 'Fecha Ingreso',
  141.                     'data' => $contratacion && $contratacion->getFechaIngreso() ? $contratacion->getFechaIngreso()->format('Y-m-d') : $persona->getCreateAt()->format('Y-m-d'),
  142.                     'mapped' => false,
  143.                     'required' => false,
  144.                     'attr' => ['readonly' => true],
  145.                     'disabled' => true
  146.                 ]);
  147.                 // Calcular años de diferencia
  148.                 $diasBeneficio $persona->getCreateAt();
  149.                 $hoy = new \DateTime();
  150.                 $diff $diasBeneficio->diff($hoy);
  151.                 $anios $diff->y;
  152.                 // Definir texto del beneficio con control correcto
  153.                 if ($anios >= 3) {
  154.                     $textoBeneficio '3 días de beneficio';
  155.                 } elseif ($anios == 2) {
  156.                     $textoBeneficio '2 días de beneficio';
  157.                 } elseif ($anios == 1) {
  158.                     $textoBeneficio '1 día de beneficio';
  159.                 } else {
  160.                     $textoBeneficio 'sin beneficios';
  161.                 }
  162.                 $event->getForm()->add('beneficioVacaciones'TextType::class, [
  163.                     'label' => 'Beneficio Vacaciones',
  164.                     'data' => $textoBeneficio,
  165.                     'mapped' => false,
  166.                     'required' => false,
  167.                     'attr' => ['readonly' => true],
  168.                     'disabled' => true
  169.                 ]);
  170.             }
  171.             if ($persona && $persona->getPerfilCargo()) {
  172.                 $perfilCargo $persona->getPerfilCargo();
  173.                 $cargo $perfilCargo->getCargo();
  174.                 $proceso $perfilCargo->getParProceso();
  175.                 // 🔹 CARGO
  176.                 if ($cargo) {
  177.                     $this->addReadOnlyField($event->getForm(), 'cargo'$cargo->getNombre(), 'Cargo');
  178.                 } else {
  179.                     $event->getForm()->add('cargo'EntityType::class, [
  180.                         'class' => \App\Entity\ParCargo::class,
  181.                         'choice_label' => 'nombre',
  182.                         'placeholder' => 'Seleccione un cargo',
  183.                         'label' => 'Cargo',
  184.                         'required' => false,
  185.                     ]);
  186.                 }
  187.                 // 🔹 PROCESO
  188.                 if ($proceso) {
  189.                     $this->addReadOnlyField($event->getForm(), 'proceso'$proceso->getNombre(), 'Proceso');
  190.                 } else {
  191.                     $event->getForm()->add('proceso'EntityType::class, [
  192.                         'class' => \App\Entity\ParProceso::class,
  193.                         'choice_label' => 'nombre',
  194.                         'placeholder' => 'Seleccione un proceso',
  195.                         'label' => 'Proceso',
  196.                         'required' => false,
  197.                     ]);
  198.                 }
  199.                 // 🔹 JEFE INMEDIATO
  200.                 $nombreJefe null;
  201. //                $p = null;
  202. //                if ($perfilCargo->getJefeInmediatoCargo()) {
  203. //                    foreach ($perfilCargo->getJefeInmediatoCargo()->getPerfilCargoJefeInmediato() as $pc) {
  204. //                        foreach ($pc->getPersona() as $pp) {
  205. //                            $p = $pp; // Agregar dato terpersona.
  206. //                            if ($p->getEstado()->getId() == 1) {
  207. //                                $nombreJefe = $pp->getPerfilCargo()?->getJefeInmediato()?->getNombres() ?? 'N/A'; // usa un getter o concatenación
  208. //                            }
  209. //                        }
  210. //                    }
  211. //                }
  212.                 $jefeInmediatoPersona $persona->getGrupoTrabajoColaboradores()->last() && $persona->getGrupoTrabajoColaboradores()->last()->getCoordinador() ?
  213.                     $persona->getGrupoTrabajoColaboradores()->last()->getCoordinador()->getNombres() : 'N/A'# Jefe inmediato desde perfil cargo
  214.                 dump($persona->getId());
  215.                 $this->addReadOnlyField($event->getForm(), 'jefeInmediato'$jefeInmediatoPersona'Jefe Inmediato'); # Siempre va a tener un jefe inmediato
  216. //                if(!$candidato) {
  217. //                }else{
  218. //
  219. //                        $nombreJefe = $contratacion && $contratacion->getJefeInmediatoC() ?
  220. //                            $contratacion->getJefeInmediatoC()->getNombres() : 'N/A';
  221. //
  222. //                        dump("Jefecito - " . $nombreJefe);
  223. //
  224. //                        // Validar que busca al jefe inmediato
  225. //                        // dump($nombreJefe);
  226. //                        // dump($jefeInmediato);
  227. //                    $this->addReadOnlyField($event->getForm(), 'jefeInmediato', $nombreJefe, 'Jefe Inmediato');
  228. //                    }
  229.             }
  230. //            $data['rangoSalarial'] = $perfilCargo->getRangoSalarial();
  231. //            $data['ParProceso'] = $perfilCargo->getParProceso()->getId();
  232. //            $data['subprocesoId'] = $perfilCargo->getSubprocesoId()->getId();
  233. //            $data['cargo'] = $perfilCargo->getCargo()->getId();
  234.             $event->setData($data);
  235.         } else {
  236.             $event->getForm()->add('tipoDocumento');
  237.         }
  238.         if (isset($data['conceptoNomina'])) {
  239.             $this->addAuxSubConcepto($event->getForm(), $data['conceptoNomina']);
  240.         }
  241.     }
  242. }