<?php
namespace App\Form;
use App\Entity\GHPerfilCargo;
use App\Entity\ParCargo;
use App\Entity\TerEmpresa;
use App\Entity\TerPersona;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Validator\Constraints\File;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;
class GHPerfilCargoType extends AbstractType
{
private $entityManager;
public function __construct(
EntityManagerInterface $entityManager
) {
$this->entityManager = $entityManager;
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$idEmpresaFilial = $options['idEmpresaFilial'];
$idProceso = $options['idProceso'];
$builder
//->add('fecha')
->add('resumenCargo', NULL, ['label' => 'Objetivo del Cargo', 'attr' => ['placeholder' => 'Seleccione una Opción.'], 'required' => true])
->add('rangoSalarial', NULL, ['label' => 'Rango salarial', 'attr' => ['placeholder' => 'Seleccione una OpciónSeleccione una Opción.'], 'required' => true])
->add('responsabilidades', NULL, ['label' => 'Responsabilidades y Funciones', 'attr' => ['placeholder' => 'Seleccione una Opción.'], 'required' => true])
//->add('funciones', NULL, ['label' => 'Funciones', 'attr' => ['placeholder' => 'Seleccione una Opción.'], 'required' => true])
->add('formacionExperiencia', NULL, ['label' => 'Formación', 'attr' => ['placeholder' => 'Seleccione una Opción.'], 'required' => true])
->add('experiencia', NULL, ['label' => 'Experiencia', 'attr' => ['placeholder' => 'Seleccione una Opción.'], 'required' => true])
->add('conocimientosEspecificos', NULL, ['label' => 'Conocimientos especificos', 'attr' => ['placeholder' => 'Seleccione una Opción.'], 'required' => false])
->add('competenciasOrganizacionales', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
'class' => \App\Entity\ParCompetenciaOrganizacional::class,
'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
return $er->createQueryBuilder('e')
->orderBy('e.nombre', 'ASC');
},
'label' => 'Competencias Organizacionales',
'attr' => ['class' => 'form-control'],
'placeholder' => 'Seleccione una Opción.',
'multiple' => true,
'required' => true
])
->add('competenciasFuncionales', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
'class' => \App\Entity\ParCompetenciaFuncional::class,
'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
return $er->createQueryBuilder('e')
->orderBy('e.nombre', 'ASC');
},
'label' => 'Competencias Funcionales',
'attr' => ['class' => 'form-control'],
'placeholder' => 'Seleccione una Opción.',
'multiple' => true,
'required' => true
])
->add('empresaFilial', EntityType::class, [
'label' => 'Empresa',
'class' => TerEmpresa::class,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('e')
->orderBy('e.nombre', 'ASC');
},
'choice_label' => 'abreviatura',
'placeholder' => 'Seleccione una Opción.',
'required' => true,
'multiple' => true
])
->add('empresaServicios', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
'class' => \App\Entity\TerEmpresa::class,
'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
return $er->createQueryBuilder('e')
->orderBy('e.nombre', 'ASC');
},
'choice_label' => 'abreviatura',
'label' => 'Presta Servicio a',
'attr' => ['class' => 'form-control'],
'placeholder' => 'Seleccione una Opción.',
'multiple' => true,
])
->add('personalCargo', EntityType::class, [
'class' => \App\Entity\ParCargo::class,
'query_builder' => function (EntityRepository $er) use ($idProceso) {
return $er->createQueryBuilder('c')
->leftJoin('c.procesos', 'pro')
->leftJoin('c.perfilPersonalCargo', 'perfil') // Relación con GHPerfilCargo
->where('perfil.id IS NULL OR perfil.estado IS NOT NULL') // Si no está en GHPerfilCargo, mostrarlo
->andWhere('pro.id = :idProceso')
->setParameter('idProceso', $idProceso)
->orderBy('c.nombre', 'ASC');
},
'label' => 'Personal a Cargo',
'attr' => ['class' => 'form-control'],
'placeholder' => 'Seleccione una Opción.',
'required' => false,
'multiple' => true
])
->add('jefeInmediatoCargo', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
'class' => \App\Entity\ParCargo::class,
'query_builder' => function (\Doctrine\ORM\EntityRepository $er) use ($idProceso, $options) {
// Filtra cargos con nivel de autoridad 3 o 4 y estado activo.
// Siempre incluye el cargo actualmente guardado para que el
// select no quede vacío en el formulario de edición.
$idActual = $options['idJefeActual'] ?? 0;
return $er->createQueryBuilder('c')
->leftJoin('c.perfilCargo', 'pc')
->leftJoin('pc.estado', 'est')
->leftJoin('pc.ParNivelAutoridad', 'nc')
->where('nc.id IN (3, 4)')
->andWhere('est.id <> 3')
->orWhere('c.id = :idActual')
->setParameter('idActual', $idActual)
->orderBy('c.nombre', 'ASC');
},
'label' => 'Jefe Inmediato',
'choice_label' => 'nombre',
'attr' => ['class' => 'form-control'],
'placeholder' => 'Seleccione una Opción.',
'required' => true,
])
// ->add('cargoAprueba', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, ['class' => \App\Entity\ParCargo::class, 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) use ($idProceso) {
// return $er->createQueryBuilder('c')
// ->leftJoin('c.procesos', 'pro')
// ->leftJoin('c.perfilCargo', 'pc')
// ->leftJoin('pc.estado', 'est')
// // ->leftJoin('pc.persona', 'p')
// ->leftJoin('pc.ParNivelAutoridad', 'nc')
// //->where('c.id is null')
// // ->orWhere('pro.id = :idProceso')
// ->where('nc.id in (4)')
// ->andWhere('est.id <> 3')
// //->setParameter('idProceso', $idProceso)
// ->orderBy('c.nombre', 'ASC');
// }, 'label' => 'Aprobado por',
// 'attr' => ['class' => 'form-control'], 'placeholder' => 'Seleccione una Opción.', 'required' => true])
->add('cargoAprueba', EntityType::class, [
'class' => \App\Entity\ParCargo::class,
'label' => 'Aprobado por (Cargo)',
'placeholder' => 'Seleccione una opción',
'required' => true,
'query_builder' => function (\Doctrine\ORM\EntityRepository $er) use ($options) {
// Filtra cargos con nivel de autoridad 3 o 4 y estado activo.
// Siempre incluye el cargo actualmente guardado para que el
// select no quede vacío en el formulario de edición.
$idActual = $options['idCargoApruebaActual'] ?? 0;
return $er->createQueryBuilder('c')
->leftJoin('c.perfilCargo', 'pc')
->leftJoin('pc.ParNivelAutoridad', 'na')
->leftJoin('pc.estado', 'est')
->where('na.id IN (3, 4)')
->andWhere('est.id <> 3')
->orWhere('c.id = :idActual')
->setParameter('idActual', $idActual)
->orderBy('c.nombre', 'ASC');
},
'choice_label' => 'nombre',
'attr' => ['class' => 'form-control'],
])
// ->add('personaAprueba', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, ['class' => \App\Entity\TerPersona::class, 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
// return $er->createQueryBuilder('p')
// ->leftJoin('p.nivelCargo', 'nc')
// ->where('nc.id in (1,2)')
// ->orderBy('nc.nombre', 'ASC');
// }, 'label' => 'Aprobado por',
// 'attr' => ['class' => 'form-control'], 'placeholder' => 'Seleccione una Opción.'])
// ->add('jefeInmediato', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, ['class' => \App\Entity\TerPersona::class, 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
// return $er->createQueryBuilder('p')
// ->leftJoin('p.nivelCargo', 'nc')
// ->where('nc.id in (1,2)')
// ->orderBy('nc.nombre', 'ASC');
// }, 'label' => 'Jefe Inmediato',
// 'label_attr' => ['class' => 'field_required'],
// 'attr' => ['class' => 'form-control'], 'placeholder' => 'Seleccione una Opción.'])
//este campo equivale a subProceso
//->add('subprocesoId', NULL, ['label' => 'Subproceso', 'placeholder' => 'Seleccione una Opción.', 'required' => true])
->add('subprocesoId', EntityType::class, [
'class' => \App\Entity\ParSubproceso::class,
'label' => 'SubProceso',
'choice_label' => 'subproceso',
'placeholder' => 'Seleccione una opción',
'required' => true,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('p')
->orderBy('p.subproceso', 'ASC');
},
'attr' => ['class' => 'form-control'],
])
->add('ParNivelAutoridad', NULL, ['label' => 'Nivel autoridad', 'placeholder' => 'Seleccione una Opción.', 'required' => true])
//->add('ParCriticidad', NULL, ['label' => 'Criticidad', 'placeholder' => 'Seleccione una Opción.', 'disabled' => true])
->add('ParNivelEducativo', NULL, ['label' => 'Nivel Educativo', 'placeholder' => 'Seleccione una Opción.', 'required' => true])
->add('educacion', NULL, ['label' => 'Educacion', 'attr' => ['placeholder' => 'Registre información de educación'], 'required' => true])
->add('ParTipoPerfil', NULL, ['label' => 'Tipo Perfil', 'placeholder' => 'Seleccione una Opción.', 'required' => true])
//cargo organizado de manera alafabetica
->add('cargo', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
'class' => \App\Entity\ParCargo::class,
'query_builder' => function (\Doctrine\ORM\EntityRepository $er) use ($idProceso) {
return $er->createQueryBuilder('c')
->leftJoin('c.procesos', 'pro')
->where('c.id is null')
->orWhere('pro.id = :idProceso')
->setParameter('idProceso', $idProceso)
->orderBy('c.nombre', 'ASC');
},
'label' => 'Cargo',
'attr' => ['class' => 'form-control'],
'placeholder' => 'Seleccione una Opción.',
'required' => true
])
//este campo es proceso
//->add('ParProceso', NULL, ['label' => 'Proceso', 'placeholder' => 'Seleccione una Opciónes.', 'required' => true])
->add('ParProceso', EntityType::class, [
'class' => \App\Entity\ParProceso::class,
'label' => 'Proceso',
'choice_label' => 'nombre',
'placeholder' => 'Seleccione una opción',
'required' => true,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('p')
->orderBy('p.nombre', 'ASC');
},
'attr' => ['class' => 'form-control'],
])
->add('pruebaTecnica')
->add('sede', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
'class' => \App\Entity\TerSedeEmpresa::class,
'query_builder' => function (\Doctrine\ORM\EntityRepository $er) use ($idEmpresaFilial) {
return $er->createQueryBuilder('se')
->leftJoin('se.empresaFilial', 'ef')
->where('se.nombre is null')
->orWhere('ef.id in (:idEmpresa)')
->setParameter('idEmpresa', $idEmpresaFilial)
->orderBy('se.nombre', 'ASC');
},
'label' => 'Sucursal',
'multiple' => true,
'label_attr' => ['class' => 'field_required'],
'attr' => ['class' => 'form-control'],
'placeholder' => 'Seleccione una Opción.'
])
->add('tipoContrato', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
'class' => \App\Entity\ParTipoContrato::class,
'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
return $er->createQueryBuilder('e')
->orderBy('e.nombre', 'ASC');
},
'label' => 'Tipo Contrato',
'attr' => ['class' => 'form-control'],
'placeholder' => 'Seleccione una Opción.',
'multiple' => true
])
->add('vinculacion', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
'class' => \App\Entity\ParTipoVinculacion::class,
'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
return $er->createQueryBuilder('e')
->orderBy('e.nombre', 'ASC');
},
'label' => 'Tipo Vinculacion',
'attr' => ['class' => 'form-control'],
'placeholder' => 'Seleccione una Opción.',
'multiple' => true
])
->add('sistemaInformacion', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
'class' => \App\Entity\ParSistemaInformatico::class,
'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
return $er->createQueryBuilder('e')
->where('e.estado = 1')
->orderBy('e.nombre', 'ASC');
},
'label' => 'Sistemas de información',
'attr' => ['class' => 'form-control'],
'placeholder' => 'Seleccione una Opción.',
'multiple' => true
])
->add('recursos', \Symfony\Bridge\Doctrine\Form\Type\EntityType::class, [
'class' => \App\Entity\ParRecursosPerfil::class,
'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
return $er->createQueryBuilder('e')
->orderBy('e.nombre', 'ASC');
},
'label' => 'Recursos del perfil',
'attr' => ['class' => 'form-control'],
'placeholder' => 'Seleccione una Opción.',
'multiple' => true
])
->add('file', FileType::class, [
'label' => 'Prueba Técnica',
'mapped' => false,
'required' => false,
'constraints' => [
new File([
'maxSize' => '5120k',
])
]
])
->add('accesoInfoConf', \Symfony\Component\Form\Extension\Core\Type\ChoiceType::class, ['choices' => [1 => 1, 3 => 3, 5 => 5], 'label' => 'Acceso a documentos e información confidencial', 'required' => true, 'placeholder' => 'Seleccione una opcion'])
->add('constratacionAsociados', \Symfony\Component\Form\Extension\Core\Type\ChoiceType::class, ['choices' => [1 => 1, 3 => 3, 5 => 5], 'label' => 'Influye en la contratación de Asociados de Negocio o personal', 'required' => true, 'placeholder' => 'Seleccione una opcion'])
->add('tomaDecisiones', \Symfony\Component\Form\Extension\Core\Type\ChoiceType::class, ['choices' => [1 => 1, 3 => 3, 5 => 5], 'label' => 'Responsabilidad y autoridad en la toma de decisiones', 'required' => true, 'placeholder' => 'Seleccione una opcion'])
->add('programasInfoSensible', \Symfony\Component\Form\Extension\Core\Type\ChoiceType::class, ['choices' => [1 => 1, 3 => 3, 5 => 5], 'label' => 'Manejo de programas con información sensible', 'required' => true, 'placeholder' => 'Seleccione una opcion'])
->add('contactoCarga', \Symfony\Component\Form\Extension\Core\Type\ChoiceType::class, ['choices' => [1 => 1, 3 => 3, 5 => 5], 'label' => 'Contacto con la carga', 'required' => true, 'placeholder' => 'Seleccione una opcion'])
->add('habilidades', TextareaType::class, [
'label' => 'Habilidades (Req. Técnicos)',
'required' => true,
])
->add('documentosAplicables', TextareaType::class, [
'label' => '
Documentos aplicables
<span data-bs-toggle="tooltip"
data-bs-placement="top"
title="(Procedimientos, Instructivos, Protocolos, Indicadores).">
<i class="fas fa-info-circle text-primary"></i>
</span>
',
'label_html' => true,
'required' => true,
]);
$builder->addEventSubscriber(new \App\FormSubscriber\GHPerfilCargoSubscriber($this->entityManager));
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => GHPerfilCargo::class,
'idEmpresaFilial' => [0],
'idProceso' => 0,
// ID del cargo jefe inmediato actualmente guardado (para el editar)
'idJefeActual' => 0,
// ID del cargo aprobador actualmente guardado (para el editar)
'idCargoApruebaActual' => 0,
]);
}
}