src/FormSubscriber/GHNovedadNominaSubscriber.php line 45

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