src/Form/GHPerfilCargoType.php line 234

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\GHPerfilCargo;
  4. use App\Entity\ParCargo;
  5. use App\Entity\TerEmpresa;
  6. use App\Entity\TerPersona;
  7. use Symfony\Component\Form\AbstractType;
  8. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  9. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  10. use Symfony\Component\Form\FormBuilderInterface;
  11. use Symfony\Component\OptionsResolver\OptionsResolver;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Symfony\Component\Form\FormEvent;
  14. use Symfony\Component\Form\FormEvents;
  15. use Symfony\Component\Form\Extension\Core\Type\FileType;
  16. use Symfony\Component\Validator\Constraints\File;
  17. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  18. use Doctrine\ORM\EntityRepository;
  19. class GHPerfilCargoType extends AbstractType
  20. {
  21.     private $entityManager;
  22.     public function __construct(
  23.         EntityManagerInterface $entityManager
  24.     ) {
  25.         $this->entityManager $entityManager;
  26.     }
  27.     public function buildForm(FormBuilderInterface $builder, array $options): void
  28.     {
  29.         $idEmpresaFilial $options['idEmpresaFilial'];
  30.         $idProceso $options['idProceso'];
  31.         $builder
  32.             //->add('fecha')
  33.             ->add('resumenCargo'NULL, ['label' => 'Objetivo del Cargo''attr' => ['placeholder' => 'Seleccione una Opción.'], 'required' => true])
  34.             ->add('rangoSalarial'NULL, ['label' => 'Rango salarial''attr' => ['placeholder' => 'Seleccione una OpciónSeleccione una Opción.'], 'required' => true])
  35.             ->add('responsabilidades'NULL, ['label' => 'Responsabilidades y Funciones''attr' => ['placeholder' => 'Seleccione una Opción.'], 'required' => true])
  36.             //->add('funciones', NULL, ['label' => 'Funciones', 'attr' => ['placeholder' => 'Seleccione una Opción.'], 'required' => true])
  37.             ->add('formacionExperiencia'NULL, ['label' => 'Formación''attr' => ['placeholder' => 'Seleccione una Opción.'], 'required' => true])
  38.             ->add('experiencia'NULL, ['label' => 'Experiencia''attr' => ['placeholder' => 'Seleccione una Opción.'], 'required' => true])
  39.             ->add('conocimientosEspecificos'NULL, ['label' => 'Conocimientos especificos''attr' => ['placeholder' => 'Seleccione una Opción.'], 'required' => false])
  40.             ->add('competenciasOrganizacionales'\Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
  41.                 'class' => \App\Entity\ParCompetenciaOrganizacional::class,
  42.                 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
  43.                     return $er->createQueryBuilder('e')
  44.                         ->orderBy('e.nombre''ASC');
  45.                 },
  46.                 'label' => 'Competencias Organizacionales',
  47.                 'attr' => ['class' => 'form-control'],
  48.                 'placeholder' => 'Seleccione una Opción.',
  49.                 'multiple' => true,
  50.                 'required' => true
  51.             ])
  52.             ->add('competenciasFuncionales'\Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
  53.                 'class' => \App\Entity\ParCompetenciaFuncional::class,
  54.                 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
  55.                     return $er->createQueryBuilder('e')
  56.                         ->orderBy('e.nombre''ASC');
  57.                 },
  58.                 'label' => 'Competencias Funcionales',
  59.                 'attr' => ['class' => 'form-control'],
  60.                 'placeholder' => 'Seleccione una Opción.',
  61.                 'multiple' => true,
  62.                 'required' => true
  63.             ])
  64.             ->add('empresaFilial'EntityType::class, [
  65.                 'label' => 'Empresa',
  66.                 'class' => TerEmpresa::class,
  67.                 'query_builder' => function (EntityRepository $er) {
  68.                     return $er->createQueryBuilder('e')
  69.                         ->orderBy('e.nombre''ASC');
  70.                 },
  71.                 'choice_label' => 'abreviatura',
  72.                 'placeholder' => 'Seleccione una Opción.',
  73.                 'required' => true,
  74.                 'multiple' => true
  75.             ])
  76.             ->add('empresaServicios'\Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
  77.                 'class' => \App\Entity\TerEmpresa::class,
  78.                 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
  79.                     return $er->createQueryBuilder('e')
  80.                         ->orderBy('e.nombre''ASC');
  81.                 },
  82.                 'choice_label' => 'abreviatura',
  83.                 'label' => 'Presta Servicio a',
  84.                 'attr' => ['class' => 'form-control'],
  85.                 'placeholder' => 'Seleccione una Opción.',
  86.                 'multiple' => true,
  87.             ])
  88.             ->add('personalCargo'EntityType::class, [
  89.                 'class' => \App\Entity\ParCargo::class,
  90.                 'query_builder' => function (EntityRepository $er) use ($idProceso) {
  91.                     return $er->createQueryBuilder('c')
  92.                         ->leftJoin('c.procesos''pro')
  93.                         ->leftJoin('c.perfilPersonalCargo''perfil'// Relación con GHPerfilCargo
  94.                         ->where('perfil.id IS NULL OR perfil.estado IS NOT NULL'// Si no está en GHPerfilCargo, mostrarlo
  95.                         ->andWhere('pro.id = :idProceso')
  96.                         ->setParameter('idProceso'$idProceso)
  97.                         ->orderBy('c.nombre''ASC');
  98.                 },
  99.                 'label' => 'Personal a Cargo',
  100.                 'attr' => ['class' => 'form-control'],
  101.                 'placeholder' => 'Seleccione una Opción.',
  102.                 'required' => false,
  103.                 'multiple' => true
  104.             ])
  105.             ->add('jefeInmediatoCargo'\Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
  106.                 'class'         => \App\Entity\ParCargo::class,
  107.                 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) use ($idProceso$options) {
  108.                     // Filtra cargos con nivel de autoridad 3 o 4 y estado activo.
  109.                     // Siempre incluye el cargo actualmente guardado para que el
  110.                     // select no quede vacío en el formulario de edición.
  111.                     $idActual $options['idJefeActual'] ?? 0;
  112.                     return $er->createQueryBuilder('c')
  113.                         ->leftJoin('c.perfilCargo''pc')
  114.                         ->leftJoin('pc.estado''est')
  115.                         ->leftJoin('pc.ParNivelAutoridad''nc')
  116.                         ->where('nc.id IN (3, 4)')
  117.                         ->andWhere('est.id <> 3')
  118.                         ->orWhere('c.id = :idActual')
  119.                         ->setParameter('idActual'$idActual)
  120.                         ->orderBy('c.nombre''ASC');
  121.                 },
  122.                 'label'        => 'Jefe Inmediato',
  123.                 'choice_label' => 'nombre',
  124.                 'attr'         => ['class' => 'form-control'],
  125.                 'placeholder'  => 'Seleccione una Opción.',
  126.                 'required'     => true,
  127.             ])
  128.             //            ->add('cargoAprueba', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, ['class' => \App\Entity\ParCargo::class, 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) use ($idProceso) {
  129. //                return $er->createQueryBuilder('c')
  130. //                    ->leftJoin('c.procesos', 'pro')
  131. //                    ->leftJoin('c.perfilCargo', 'pc')
  132. //                    ->leftJoin('pc.estado', 'est')
  133. //                    //  ->leftJoin('pc.persona', 'p')
  134. //                    ->leftJoin('pc.ParNivelAutoridad', 'nc')
  135. //                    //->where('c.id is null')
  136. //                    // ->orWhere('pro.id = :idProceso')
  137. //                    ->where('nc.id in (4)')
  138. //                    ->andWhere('est.id <> 3')
  139. //                    //->setParameter('idProceso', $idProceso)
  140. //                    ->orderBy('c.nombre', 'ASC');
  141. //            }, 'label' => 'Aprobado por',
  142. //                'attr' => ['class' => 'form-control'], 'placeholder' => 'Seleccione una Opción.', 'required' => true])
  143.             ->add('cargoAprueba'EntityType::class, [
  144.                 'class'         => \App\Entity\ParCargo::class,
  145.                 'label'         => 'Aprobado por (Cargo)',
  146.                 'placeholder'   => 'Seleccione una opción',
  147.                 'required'      => true,
  148.                 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) use ($options) {
  149.                     // Filtra cargos con nivel de autoridad 3 o 4 y estado activo.
  150.                     // Siempre incluye el cargo actualmente guardado para que el
  151.                     // select no quede vacío en el formulario de edición.
  152.                     $idActual $options['idCargoApruebaActual'] ?? 0;
  153.                     return $er->createQueryBuilder('c')
  154.                         ->leftJoin('c.perfilCargo''pc')
  155.                         ->leftJoin('pc.ParNivelAutoridad''na')
  156.                         ->leftJoin('pc.estado''est')
  157.                         ->where('na.id IN (3, 4)')
  158.                         ->andWhere('est.id <> 3')
  159.                         ->orWhere('c.id = :idActual')
  160.                         ->setParameter('idActual'$idActual)
  161.                         ->orderBy('c.nombre''ASC');
  162.                 },
  163.                 'choice_label'  => 'nombre',
  164.                 'attr'          => ['class' => 'form-control'],
  165.             ])
  166.             //                ->add('personaAprueba', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, ['class' => \App\Entity\TerPersona::class, 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
  167. //                        return $er->createQueryBuilder('p')
  168. //                        ->leftJoin('p.nivelCargo', 'nc')
  169. //                        ->where('nc.id in (1,2)')
  170. //                        ->orderBy('nc.nombre', 'ASC');
  171. //                    }, 'label' => 'Aprobado por',
  172. //                    'attr' => ['class' => 'form-control'], 'placeholder' => 'Seleccione una Opción.'])
  173. //                ->add('jefeInmediato', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, ['class' => \App\Entity\TerPersona::class, 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
  174. //                        return $er->createQueryBuilder('p')
  175. //                        ->leftJoin('p.nivelCargo', 'nc')
  176. //                        ->where('nc.id in (1,2)')
  177. //                        ->orderBy('nc.nombre', 'ASC');
  178. //                    }, 'label' => 'Jefe Inmediato',
  179. //                    'label_attr' => ['class' => 'field_required'],
  180. //                    'attr' => ['class' => 'form-control'], 'placeholder' => 'Seleccione una Opción.'])
  181.             //este campo equivale a subProceso
  182.             //->add('subprocesoId', NULL, ['label' => 'Subproceso', 'placeholder' => 'Seleccione una Opción.', 'required' => true])
  183.             ->add('subprocesoId'EntityType::class, [
  184.                 'class' => \App\Entity\ParSubproceso::class,
  185.                 'label' => 'SubProceso',
  186.                 'choice_label' => 'subproceso',
  187.                 'placeholder' => 'Seleccione una opción',
  188.                 'required' => true,
  189.                 'query_builder' => function (EntityRepository $er) {
  190.                     return $er->createQueryBuilder('p')
  191.                         ->orderBy('p.subproceso''ASC');
  192.                 },
  193.                 'attr' => ['class' => 'form-control'],
  194.             ])
  195.             ->add('ParNivelAutoridad'NULL, ['label' => 'Nivel autoridad''placeholder' => 'Seleccione una Opción.''required' => true])
  196.             //->add('ParCriticidad', NULL, ['label' => 'Criticidad', 'placeholder' => 'Seleccione una Opción.', 'disabled' => true])
  197.             ->add('ParNivelEducativo'NULL, ['label' => 'Nivel Educativo''placeholder' => 'Seleccione una Opción.''required' => true])
  198.             ->add('educacion'NULL, ['label' => 'Educacion''attr' => ['placeholder' => 'Registre información de educación'], 'required' => true])
  199.             ->add('ParTipoPerfil'NULL, ['label' => 'Tipo Perfil''placeholder' => 'Seleccione una Opción.''required' => true])
  200.             //cargo organizado de manera alafabetica
  201.             ->add('cargo'\Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
  202.                 'class' => \App\Entity\ParCargo::class,
  203.                 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) use ($idProceso) {
  204.                     return $er->createQueryBuilder('c')
  205.                         ->leftJoin('c.procesos''pro')
  206.                         ->where('c.id is null')
  207.                         ->orWhere('pro.id = :idProceso')
  208.                         ->setParameter('idProceso'$idProceso)
  209.                         ->orderBy('c.nombre''ASC');
  210.                 },
  211.                 'label' => 'Cargo',
  212.                 'attr' => ['class' => 'form-control'],
  213.                 'placeholder' => 'Seleccione una Opción.',
  214.                 'required' => true
  215.             ])
  216.             //este campo es proceso
  217.             //->add('ParProceso', NULL, ['label' => 'Proceso', 'placeholder' => 'Seleccione una Opciónes.', 'required' => true])
  218.             ->add('ParProceso'EntityType::class, [
  219.                 'class' => \App\Entity\ParProceso::class,
  220.                 'label' => 'Proceso',
  221.                 'choice_label' => 'nombre',
  222.                 'placeholder' => 'Seleccione una opción',
  223.                 'required' => true,
  224.                 'query_builder' => function (EntityRepository $er) {
  225.                     return $er->createQueryBuilder('p')
  226.                         ->orderBy('p.nombre''ASC');
  227.                 },
  228.                 'attr' => ['class' => 'form-control'],
  229.             ])
  230.             ->add('pruebaTecnica')
  231.             ->add('sede'\Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
  232.                 'class' => \App\Entity\TerSedeEmpresa::class,
  233.                 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) use ($idEmpresaFilial) {
  234.                     return $er->createQueryBuilder('se')
  235.                         ->leftJoin('se.empresaFilial''ef')
  236.                         ->where('se.nombre is null')
  237.                         ->orWhere('ef.id in (:idEmpresa)')
  238.                         ->setParameter('idEmpresa'$idEmpresaFilial)
  239.                         ->orderBy('se.nombre''ASC');
  240.                 },
  241.                 'label' => 'Sucursal',
  242.                 'multiple' => true,
  243.                 'label_attr' => ['class' => 'field_required'],
  244.                 'attr' => ['class' => 'form-control'],
  245.                 'placeholder' => 'Seleccione una Opción.'
  246.             ])
  247.             ->add('tipoContrato'\Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
  248.                 'class' => \App\Entity\ParTipoContrato::class,
  249.                 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
  250.                     return $er->createQueryBuilder('e')
  251.                         ->orderBy('e.nombre''ASC');
  252.                 },
  253.                 'label' => 'Tipo Contrato',
  254.                 'attr' => ['class' => 'form-control'],
  255.                 'placeholder' => 'Seleccione una Opción.',
  256.                 'multiple' => true
  257.             ])
  258.             ->add('vinculacion'\Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
  259.                 'class' => \App\Entity\ParTipoVinculacion::class,
  260.                 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
  261.                     return $er->createQueryBuilder('e')
  262.                         ->orderBy('e.nombre''ASC');
  263.                 },
  264.                 'label' => 'Tipo Vinculacion',
  265.                 'attr' => ['class' => 'form-control'],
  266.                 'placeholder' => 'Seleccione una Opción.',
  267.                 'multiple' => true
  268.             ])
  269.             ->add('sistemaInformacion'\Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
  270.                 'class' => \App\Entity\ParSistemaInformatico::class,
  271.                 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
  272.                     return $er->createQueryBuilder('e')
  273.                         ->where('e.estado = 1')
  274.                         ->orderBy('e.nombre''ASC');
  275.                 },
  276.                 'label' => 'Sistemas de información',
  277.                 'attr' => ['class' => 'form-control'],
  278.                 'placeholder' => 'Seleccione una Opción.',
  279.                 'multiple' => true
  280.             ])
  281.             ->add('recursos'\Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
  282.                 'class' => \App\Entity\ParRecursosPerfil::class,
  283.                 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
  284.                     return $er->createQueryBuilder('e')
  285.                         ->orderBy('e.nombre''ASC');
  286.                 },
  287.                 'label' => 'Recursos del perfil',
  288.                 'attr' => ['class' => 'form-control'],
  289.                 'placeholder' => 'Seleccione una Opción.',
  290.                 'multiple' => true
  291.             ])
  292.             ->add('file'FileType::class, [
  293.                 'label' => 'Prueba Técnica',
  294.                 'mapped' => false,
  295.                 'required' => false,
  296.                 'constraints' => [
  297.                     new File([
  298.                         'maxSize' => '5120k',
  299.                     ])
  300.                 ]
  301.             ])
  302.             ->add('accesoInfoConf'\Symfony\Component\Form\Extension\Core\Type\ChoiceType::class, ['choices' => [=> 1=> 3=> 5], 'label' => 'Acceso a documentos e información confidencial''required' => true'placeholder' => 'Seleccione una opcion'])
  303.             ->add('constratacionAsociados'\Symfony\Component\Form\Extension\Core\Type\ChoiceType::class, ['choices' => [=> 1=> 3=> 5], 'label' => 'Influye en la contratación de Asociados de Negocio o personal''required' => true'placeholder' => 'Seleccione una opcion'])
  304.             ->add('tomaDecisiones'\Symfony\Component\Form\Extension\Core\Type\ChoiceType::class, ['choices' => [=> 1=> 3=> 5], 'label' => 'Responsabilidad y autoridad en la toma de decisiones''required' => true'placeholder' => 'Seleccione una opcion'])
  305.             ->add('programasInfoSensible'\Symfony\Component\Form\Extension\Core\Type\ChoiceType::class, ['choices' => [=> 1=> 3=> 5], 'label' => 'Manejo de programas con información sensible''required' => true'placeholder' => 'Seleccione una opcion'])
  306.             ->add('contactoCarga'\Symfony\Component\Form\Extension\Core\Type\ChoiceType::class, ['choices' => [=> 1=> 3=> 5], 'label' => 'Contacto con la carga''required' => true'placeholder' => 'Seleccione una opcion'])
  307.             ->add('habilidades'TextareaType::class, [
  308.                 'label' => 'Habilidades (Req. Técnicos)',
  309.                 'required' => true,
  310.             ])
  311.             ->add('documentosAplicables'TextareaType::class, [
  312.                 'label' => '
  313.                             Documentos aplicables 
  314.                                 <span data-bs-toggle="tooltip" 
  315.                                       data-bs-placement="top"
  316.                                       title="(Procedimientos, Instructivos, Protocolos, Indicadores).">
  317.                                       <i class="fas fa-info-circle text-primary"></i>
  318.                                 </span>
  319.                                     ',
  320.                 'label_html' => true,
  321.                 'required' => true,
  322.             ]);
  323.         $builder->addEventSubscriber(new \App\FormSubscriber\GHPerfilCargoSubscriber($this->entityManager));
  324.     }
  325.     public function configureOptions(OptionsResolver $resolver): void
  326.     {
  327.         $resolver->setDefaults([
  328.             'data_class'             => GHPerfilCargo::class,
  329.             'idEmpresaFilial'        => [0],
  330.             'idProceso'              => 0,
  331.             // ID del cargo jefe inmediato actualmente guardado (para el editar)
  332.             'idJefeActual'           => 0,
  333.             // ID del cargo aprobador actualmente guardado (para el editar)
  334.             'idCargoApruebaActual'   => 0,
  335.         ]);
  336.     }
  337. }