src/Controller/TerPersonaController.php line 491

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\GHCandidato;
  4. use App\Entity\GHDocumentoContratacion;
  5. use App\Entity\GHEntrevista;
  6. use App\Entity\GHExamenPeriodico;
  7. use App\Entity\GHPruebasPsicotecnicas;
  8. use App\Entity\GHPruebasTecnicas;
  9. use App\Entity\GHRevisionInicial;
  10. use App\Entity\GHVerificacionAntecedente;
  11. use App\Entity\GHVerificacionAntecedentePersona;
  12. use App\Entity\SecMensaje;
  13. use App\Entity\TerPersonaHistorial;
  14. use App\Message\NotificarUltimoRegistroMessage;
  15. use App\Services\DocumentHandler;
  16. use Doctrine\Common\Collections\Criteria;
  17. use Doctrine\ORM\Mapping\Entity;
  18. use Dompdf\Dompdf;
  19. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  20. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  21. use Symfony\Component\Form\Extension\Core\Type\FileType;
  22. use Symfony\Component\Form\Extension\Core\Type\NumberType;
  23. use Symfony\Component\HttpFoundation\JsonResponse;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\HttpFoundation\Response;
  26. use Symfony\Component\Messenger\MessageBusInterface;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use Doctrine\ORM\EntityManagerInterface;
  29. use App\Entity\TerPersona;
  30. use App\Form\TerPersonaType;
  31. use App\Repository\TerPersonaRepository;
  32. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  33. class TerPersonaController extends AbstractController {
  34.     private $entityManager;
  35.     private $code 0;
  36.     private $msj "";
  37.     private $url "";
  38.     private $html "";
  39.     /**
  40.      * @var DocumentHandler
  41.      */
  42.     private $documentHandler;
  43.     public function __construct(EntityManagerInterface $entityManagerDocumentHandler $documentHandler) {
  44.         $this->entityManager $entityManager;
  45.         $this->documentHandler $documentHandler;
  46.     }
  47.     #[Route('/ter/persona'name'ter_persona')]
  48.     public function index(TerPersonaRepository $terPersonaRepository): Response {
  49.         $personas $terPersonaRepository->getAll();
  50.         return $this->render('ter_persona/index.html.twig', [
  51.                     'entities' => $personas,
  52.         ]);
  53.     }
  54.     
  55.       #[Route('/ter/persona/desvinculadas'name'ter_persona_desvinculadas')]
  56.     public function indexDesvinculadas(TerPersonaRepository $terPersonaRepository): Response {
  57.         $personas $terPersonaRepository->getAll([2]);
  58.         return $this->render('ter_persona/index.html.twig', [
  59.                     'entities' => $personas,
  60.         ]);
  61.     }
  62.     #[Route('/ter/persona/crear'name'ter_persona_new')]
  63.     public function crearPersona(Request $request\App\Services\DocumentHandler $documentHandler\App\Services\ResponseHandler $responseHandlerUserPasswordHasherInterface $passwordHasher): Response {
  64.         $persona = new TerPersona();
  65.         $form $this->createForm(TerPersonaType::class, $persona, ['method' => 'POST''action' => $this->generateUrl($request->attributes->get('_route'))]);
  66.         # Validar los campos para crear datos
  67.         $form->add('fechaNacimiento',\Symfony\Component\Form\Extension\Core\Type\DateTimeType::class,['widget' => 'single_text','html5'=>false'format' => 'yyyy-MM-dd','attr'=>['class'=>'fc-datepicker']])
  68.             ->add('edad',NumberType::class,[
  69.                 'label' => 'Edad',
  70.                 'attr' => [
  71.                     'min' => 0,
  72.                     'max' => 99,
  73.                     'maxlength' => 2,
  74.                 ],
  75.                 'required' => true,
  76.             ])
  77.             ->add('estado'\Symfony\Bridge\Doctrine\Form\Type\EntityType::class, ['class' => \App\Entity\ParEstado::class, 'query_builder' => function (\Doctrine\ORM\EntityRepository $er) {
  78.                 return $er->createQueryBuilder('e')
  79.                     ->where('e.id in (1,2)')
  80.                     ->orderBy('e.nombre''ASC');
  81.             }, 'label' => 'Estado',
  82.                 'label_attr' => ['class' => 'field_required'],
  83.                 'attr' => ['class' => 'form-control''placeholder' => 'Seleccione una Opción.'],'disabled'=>false])
  84.             ->add('perfilCargo'null,['disabled'=>false])
  85.             ->add('nivelCargo'null,['disabled'=>false])
  86.             ->add('sede');
  87.         $form->remove('estado');
  88.         $form->handleRequest($request);
  89.         if ($form->isSubmitted() && $form->isValid()) {
  90.             $campos = [
  91.                 'fechaNacimiento' => 'setFechaNacimiento',
  92.                 'edad' => 'setEdad',
  93.                 'perfilCargo' => 'setPerfilCargo',
  94.                 'nivelCargo' => 'addNivelCargo'# Coleccion
  95.                 'sede' => 'setSede',
  96.                 'email' => 'setEmail',
  97.             ];
  98.             # Validar los campos solo para crear
  99.             foreach ($campos as $key => $setter) {
  100.                 $valor $form->get($key)->getData();
  101.                 if($valor && $key !== 'nivelCargo'){ # Agregar el valor si no es NULL
  102.                     $persona->{$setter}($valor);
  103.                 }else{
  104.                     # Iterar el arreglo si tiene valores
  105.                     // dump($valor);
  106.                     if($valor){
  107.                         foreach ($valor as $nivelCargo) {
  108.                             // dump($nivelCargo);
  109.                             $persona->{$setter}($nivelCargo);
  110.                         }
  111.                     }
  112.                 }
  113.             }
  114.             $entityManager $this->entityManager;
  115.             $foto $form->get('fotografia')->getData();
  116.             //$indiceIzq = $form->get('indiceIzquierdo')->getData();
  117.             //$indiceDer = $form->get('indiceDerecho')->getData();
  118.             if ($foto != NULL) { //$persona->getFirmaCorta() != null && $persona->getFirmaLarga() != null &&  $indiceIzq != NULL && $indiceDer != NULL
  119.                 /*  $rutaArchivo = $documentHandler->cargarArchivoBase64($persona->getFirmaCorta(), TerPersona::class);
  120.                   if ($rutaArchivo['code'] == 'success') {
  121.                   $persona->setFirmaCorta($rutaArchivo['msj']);
  122.                   }
  123.                   $rutaArchivo = $documentHandler->cargarArchivoBase64($persona->getFirmaLarga(), TerPersona::class);
  124.                   if ($rutaArchivo['code'] == 'success') {
  125.                   $persona->setFirmaLarga($rutaArchivo['msj']);
  126.                   } */
  127.                 $rutaArchivo $documentHandler->cargarArchivo($fotoTerPersona::class);
  128.                 //  $rutaArchivoII = $documentHandler->cargarArchivo($indiceIzq, TerPersona::class);
  129.                 //  $rutaArchivoID = $documentHandler->cargarArchivo($indiceDer, TerPersona::class);
  130.                 if ($rutaArchivo['code'] == 'success') { //&& $rutaArchivoII['code'] == 'success' && $rutaArchivoID['code'] == 'success'
  131.                     $persona->setHorario('NA');
  132.                     $persona->setFotografia($rutaArchivo['msj']);
  133.                     //  $persona->setIndiceDerecho($rutaArchivoID['msj']);
  134.                     //  $persona->setIndiceIzquierdo($rutaArchivoII['msj']);
  135.                     $persona->setCreateAt(new \DateTime('now'));
  136.                     $persona->setCreateUser($this->getUser()->getUsername());
  137.                     $persona->setUpdateAt(new \DateTime('now'));
  138.                     $persona->setUpdateUser($this->getUser()->getUsername());
  139.                     $persona->setEstado($this->entityManager->getRepository(\App\Entity\ParEstado::class)->find(1));
  140.                     $persona->setFechaDiligenciamiento(new \DateTime('now'));
  141.                     $entityManager->persist($persona);
  142.                     $user = new \App\Entity\SecUser();
  143.                     $plaintextPassword 'ClaveTemporal123*';
  144.                     // hash the password (based on the security.yaml config for the $user class)
  145.                     $hashedPassword $passwordHasher->hashPassword(
  146.                             $user,
  147.                             $plaintextPassword
  148.                     );
  149.                     $user->setPassword($hashedPassword);
  150.                     $user->setEmail($persona->getEmail());
  151.                     $user->setEnabled(true);
  152.                     $user->setPersona($persona);
  153.                     $user->setUsername(trim($persona->getNumeroDocumento()));
  154.                     $user->setRoles(['ROLE_USUARIO']);
  155.                     $entityManager->persist($user);
  156.                     $entityManager->flush();
  157.                     $this->code 'success';
  158.                     $this->msj 'Registro creado correctamente';
  159.                     return new Response(json_encode(['code' => $this->code'msj' => $this->msj'url' => $this->url'html' => $this->html]));
  160.                 } else {
  161.                     $this->code 'warning';
  162.                     $this->msj "Imposible continuar, por favor valide que los documentos solicitados esten presentes.{$rutaArchivo['msj']}";
  163.                     return new Response(json_encode(['code' => $this->code'msj' => $this->msj'url' => $this->url'html' => $this->html]));
  164.                 }
  165.             } else {
  166.                 $this->code 'warning';
  167.                 $this->msj "Valide que la firma se encuentre adjunta en el formulario.";
  168.                 return new Response(json_encode(['code' => $this->code'msj' => $this->msj'url' => $this->url'html' => $this->html]));
  169.             }
  170.         }
  171.         return $this->render('ter_persona/crear.html.twig', [
  172.                     'persona' => $persona,
  173.                     'form' => $form->createView(),
  174.         ]);
  175.     }
  176.     #[Route('/ter/persona/editar/{id}'name'ter_persona_edit')]
  177.     public function editarPersona(Request $requestTerPersona $persona\App\Services\DocumentHandler $documentHandler\App\Services\ResponseHandler $responseHandler\App\Services\MailerCore $mailerCore): Response {
  178.         $entityManager $this->entityManager;
  179.         if (!$persona) {
  180.             throw $this->createNotFoundException('No se encontró a la persona solicitada, valide e intente nuevamente.');
  181.         }
  182.         //
  183.         $form $this->createForm(TerPersonaType::class, $persona, ['disabled_fields' => true,'method' => 'POST''action' => $this->generateUrl($request->attributes->get('_route'),['id'=>$persona->getId()]  )]);
  184.         $form->remove('nombres')
  185.                 ->remove('tipoDocumento')
  186.                 ->remove('numeroDocumento')
  187.                 ->remove('edad')
  188.                 ->remove('email')
  189.                 ->remove('fechaNacimiento')
  190.                 ->remove('estado')
  191.                 ->remove('perfilCargo')
  192.                 ->remove('nivelCargo');
  193.         $form->handleRequest($request);
  194.         if ($form->isSubmitted() && $form->isValid()) {
  195.             $foto $form->get('fotografia')->getData();
  196.             // $indiceIzq = $form->get('indiceIzquierdo')->getData();
  197.             // $indiceDer = $form->get('indiceDerecho')->getData();
  198.             if ($foto != NULL) { //&& $indiceIzq != NULL && $indiceDer != NULL
  199.                 /* $rutaArchivo = $documentHandler->cargarArchivoBase64($persona->getFirmaCorta(), TerPersona::class);
  200.                   if ($rutaArchivo['code'] == 'success') {
  201.                   $persona->setFirmaCorta($rutaArchivo['msj']);
  202.                   }
  203.                   $rutaArchivo = $documentHandler->cargarArchivoBase64($persona->getFirmaLarga(), TerPersona::class);
  204.                   if ($rutaArchivo['code'] == 'success') {
  205.                   $persona->setFirmaLarga($rutaArchivo['msj']);
  206.                   } */
  207.                 $rutaArchivo $documentHandler->cargarArchivo($fotoTerPersona::class);
  208.                 //  $rutaArchivoII = $documentHandler->cargarArchivo($indiceIzq, TerPersona::class);
  209.                 //  $rutaArchivoID = $documentHandler->cargarArchivo($indiceDer, TerPersona::class);
  210.                 if ($rutaArchivo['code'] == 'success') { //&& $rutaArchivoII['code'] == 'success' && $rutaArchivoID['code'] == 'success'
  211.                     $persona->setHorario('NA');
  212.                     $persona->setFotografia($rutaArchivo['msj']);
  213.                     // $persona->setIndiceDerecho($rutaArchivoID['msj']);
  214.                     // $persona->setIndiceIzquierdo($rutaArchivoII['msj']);
  215.                     /*
  216.                       $persona->setCreateAt(new \DateTime('now'));
  217.                       $persona->setCreateUser($this->getUser()->getUsername());
  218.                       $persona->setUpdateAt(new \DateTime('now'));
  219.                       $persona->setUpdateUser($this->getUser()->getUsername());
  220.                       $persona->setEstado($this->entityManager->getRepository(\App\Entity\ParEstado::class)->find(1));
  221.                       $entityManager->persist($persona);
  222.                       $user = new \App\Entity\SecUser();
  223.                       $plaintextPassword = 'ClaveTemporal123*';
  224.                       // hash the password (based on the security.yaml config for the $user class)
  225.                       $hashedPassword = $passwordHasher->hashPassword(
  226.                       $user,
  227.                       $plaintextPassword
  228.                       );
  229.                       $user->setPassword($hashedPassword);
  230.                       $user->setEmail($persona->getEmail());
  231.                       $user->setEnabled(true);
  232.                       $user->setPersona($persona);
  233.                       $user->setUsername(trim($persona->getNumeroDocumento()));
  234.                       $user->setRoles(['ROLE_USUARIO']);
  235.                       $entityManager->persist($user);
  236.                       $entityManager->flush();
  237.                       $this->addFlash('success', "Registro cargado exitosamente.");
  238.                       return $this->redirectToRoute($responseHandler->manejoRespuesta()); */
  239.                 } else {
  240.                     $this->code 'warning';
  241.                     $this->msj "Imposible continuar, por favor valide que los documentos solicitados esten presentes.{$rutaArchivo['msj']}";
  242.                     return new Response(json_encode(['code' => $this->code'msj' => $this->msj'url' => $this->url'html' => $this->html]));                
  243.                 }
  244.             }
  245.             $persona->setUpdateAt(new \DateTime('now'));
  246.             $persona->setUpdateUser($this->getUser()->getUsername());
  247.             $entityManager->flush();
  248.             $usuario $entityManager->getRepository(\App\Entity\SecUser::class)->findOneBy(['username' => $persona->getNumeroDocumento()]);
  249.             /*  if ($usuario) {
  250.               $mailerCore->notificarUsuario('solicitaCarnet', [$usuario]);
  251.               $mailerCore->notificarUsuario('controlInstalaciones', [$usuario]);
  252.               $mailerCore->notificarUsuario('solicitudAccesos', [$usuario]);
  253.               } */
  254.               $this->code 'success';
  255.               $this->msj 'Registro cargado correctamente';
  256.               return new Response(json_encode(['code' => $this->code'msj' => $this->msj'url' => $this->url'html' => $this->html]));
  257.         }
  258.             $estado $persona->getEstado();
  259.             $estadosFiltrados = ($estado && in_array($estado->getId(), [12])) ? [$estado] : [];
  260.         return $this->render('ter_persona/editar.html.twig', [
  261.                     'persona' => $persona,
  262.                     'form' => $form->createView(),
  263.                     'estados' => $estadosFiltrados,
  264.         ]);
  265.     }
  266.      #[Route('/ter/persona/show/{id}'name'ter_persona_show')]
  267.     public function showPersona(Request $requestTerPersona $persona\App\Services\DocumentHandler $documentHandler\App\Services\ResponseHandler $responseHandler\App\Services\MailerCore $mailerCoreMessageBusInterface $bus): Response
  268.      {
  269.          $entityManager $this->entityManager;
  270.          $entrevista null// Validar entrevista de persona
  271.          // Validar los dias que lleva en la empresa desde fecha ingreso
  272.          $diasEmpresa null;
  273.          $fechaIngreso null;
  274.          if (!$persona) {
  275.              throw $this->createNotFoundException('No se encontró a la persona solicitada, valide e intente nuevamente.');
  276.          }
  277.          // Validar que existio esa persona como candidato
  278.          $candidato $entityManager->getRepository(GHCandidato::class)->findOneBy([
  279.              'numeroDocumento' => $persona->getNumeroDocumento()
  280.          ]);
  281.          if($candidato){
  282.             $fechaIngreso $candidato->getContratacion()->last();
  283.              $entrevista $candidato->getEntrevista()->last();
  284.              $diasEmpresa date_diff($fechaIngreso && $fechaIngreso->getFechaIngreso() ? $fechaIngreso->getFechaIngreso() : new \DateTime(), new \DateTime('now'))->days;
  285.          }else{
  286.              // Si no fue candidato buscar por la fecha de creacion
  287.              $diasEmpresa date_diff($persona->getCreateAt(), new \DateTime('now'))->days;
  288.          }
  289.          // Validar los contactos de emergencia que tiene el usuario
  290.          $contactosEmergencia $persona->getContactoPersona();
  291.          $form $this->createForm(TerPersonaType::class, $persona, ['disabled_fields' => false'method' => 'POST''action' => $this->generateUrl($request->attributes->get('_route'), ['id' => $persona->getId()])]);
  292.          $form->remove('nombres')
  293.              ->remove('tipoDocumento')
  294.              ->remove('salario')
  295.              ->remove('numeroDocumento');
  296.          // Precargar datos del formulario
  297.          $form->get('direccion')->setData($persona $persona->getDireccion() : ($entrevista $entrevista->getDireccion() : null));
  298.          $form->get('barrio')->setData($persona $persona->getBarrio() : ($entrevista $entrevista->getBarrio() : null));
  299.          $form->get('localidad')->setData($persona $persona->getLocalidad() : ($entrevista $entrevista->getLocalidad() : null));
  300.          $form->get('email')->setData($persona $persona->getEmail() : ($candidato $candidato->getCorreoElectronico() : null));
  301.          $form->get('celular')->setData($persona $persona->getCelular() : ($candidato $candidato->getCelular() : null));
  302.          $form->get('telefonoFijo')->setData($persona $persona->getTelefonoFijo() : ($entrevista $entrevista->getTelefono() : null));
  303.          $form->get('tenenciaResidencia')->setData($persona->getTenenciaResidencia() ? $persona->getTenenciaResidencia() : ($entrevista && $entrevista->getTenenciaResidencia() ? $entrevista->getTenenciaResidencia() : null));
  304.          // Segunda pestaña -> INFORMACIÓN GENERAL
  305.          $entrevistaInfoAcademica $entrevista && $entrevista->getEntrevistaInfoAcademica()->last() ? $entrevista->getEntrevistaInfoAcademica()->last() : null;
  306.          $form->get('nivelEducativo')->setData($persona->getNivelEducativo() ?
  307.              $persona->getNivelEducativo() :
  308.              ($entrevistaInfoAcademica && $entrevistaInfoAcademica->getNivelEducativo() ? $entrevistaInfoAcademica->getNivelEducativo() : null));
  309.          $form->get('tituloObtenido')->setData($persona->getTituloObtenido() ? $persona->getTituloObtenido() : ($entrevistaInfoAcademica $entrevistaInfoAcademica->getNombreCarrera() : null));
  310.          $form->get('institucion')->setData($persona->getInstitucion() ? $persona->getInstitucion() : ($entrevistaInfoAcademica $entrevistaInfoAcademica->getInstitucion() : null));
  311.          $form->get('horario')->setData($persona->getHorario() ? $persona->getHorario() : ($entrevistaInfoAcademica $entrevistaInfoAcademica->getHorario() : null));
  312.          $form->get('modalidadEstudio')->setData($persona->getModalidadEstudio() ?
  313.              $persona->getModalidadEstudio() :
  314.              ($entrevistaInfoAcademica && $entrevistaInfoAcademica->getModalidadTrabajo() ?
  315.              $entrevistaInfoAcademica->getModalidadTrabajo() : null));
  316.          // Validar el historial que tiene la persona en cambios
  317.          $cambiosHistorico $persona->getHistorialesPerso();
  318.          $form->handleRequest($request);
  319.          if ($form->isSubmitted() && $form->isValid()) {
  320.              $entityManager $this->entityManager;
  321.              // Validar foto de persona
  322.              $archivo $form->get('fotografia')->getData();
  323.              if($archivo){
  324.                  $archivoNombre $this->documentHandler->cargarArchivo($archivoTerPersona::class, "",$persona->getFotografia());
  325.                  if($archivoNombre['code'] !== 'success'){
  326.                      $this->code 'error';
  327.                      $this->msj '¡Archivo no compatible!';
  328.                      return new Response(json_encode(['code' => $this->code'msj' => $this->msj'url' => $this->url]));
  329.                  }
  330.                  $persona->setFotografia($archivoNombre['msj']); // Guardar
  331.                  $entityManager->persist($persona);
  332.              }
  333.              // Validar el grupo sanguineo si viene de entrevista
  334.              if($entrevista)
  335.                  $persona->setGrupoSanguineoRH(strtoupper($entrevista->getGrupoSanguineo()));
  336.              $persona->setFechaDiligenciamiento(new \DateTime()); // Fecha diligenciamiento cuando actualiza datos
  337.              $entityManager->persist($persona);
  338.              $historial = new TerPersonaHistorial();
  339.              $historial->setFechaDiligenciamiento(new \DateTime()); // Agregar la fecha de diligencia
  340.              $historial->setCreateAt($persona->getCreateAt());
  341.              $historial->setUpdateAt($persona->getUpdateAt());
  342.              $historial->setCreateUser($persona->getCreateUser());
  343.              $historial->setUpdateUser($persona->getUpdateUser());
  344.              // $historial->setFechaNacimiento($persona->getFechaNacimiento());
  345.              $historial->setCelular($persona->getCelular());
  346.              $historial->setEdad($persona->getEdad());
  347.              $historial->setGrupoSanguineoRH($persona->getGrupoSanguineoRH());
  348.              $historial->setEstrato($persona->getEstrato());
  349.              $historial->setLocalidad($persona->getLocalidad());
  350.              $historial->setBarrio($persona->getBarrio());
  351.              $historial->setDireccion($persona->getDireccion());
  352.              $historial->setUniversidad($persona->getUniversidad());
  353.              $historial->setSede($persona->getSede());
  354.              $historial->setCualExequial($persona->getCualExequial());
  355.              $historial->setFotogratia($persona->getFotografia());
  356.              $historial->setQueHaceTiempoLibre($persona->getQueHaceTiempoLibre());
  357.              $historial->setCualDeporte($persona->getCualDeporte());
  358.              $historial->setCualEnfermedad($persona->getCualEnfermedad());
  359.              $historial->setCualesActiviSalud($persona->getCualesActiviSalud());
  360.              $historial->setPromedioDiario($persona->getPromedioDiario());
  361.              $historial->setPersona($persona);
  362.              $entityManager->persist($historial);
  363.              $entityManager->flush();
  364.              // Enviar notificación al usuario para que actualice su perfil en un año
  365.              $this->Notificacion1anio($persona);
  366.              $this->code 'success';
  367.              $this->msj 'Registro Actualizado correctamente';
  368.              return new Response(json_encode(['code' => $this->code'msj' => $this->msj'url' => $this->url]));
  369.          }
  370.          // Para validar urgente -> $colaborador = $this->getUser()->getPersona();
  371.          $colaborador $persona;
  372.          $salario "N/A";
  373.          $empresa "N/A";
  374.          $tipoContrato "N/A";
  375.          $candidato $this->entityManager->getRepository(\App\Entity\GHCandidato::class)->findOneBy(['numeroDocumento' => $colaborador->getNumeroDocumento()]);
  376.          if ($candidato) {
  377.              $contratacion $this->entityManager->getRepository(\App\Entity\GHContratacion::class)->findOneBy(['candidato' => $candidato->getId()]);
  378.              if ($contratacion) {
  379.                  $salario $contratacion->getSalario();
  380.                  $empresa $contratacion->getContrato()->getEmpresaFilial()->getAbreviatura();
  381.                  $tipoContrato $colaborador->getPerfilCargo()->getTipoContrato()->first()->getNombre();
  382.              }else {
  383.                  foreach ($colaborador->getCambioContrato() as $cambio) {
  384.                      $salario $cambio->getSalario();
  385.                      $empresa $cambio->getEmpresa()->getNombre();
  386.                      $tipoContrato $cambio->getTipoContrato()->getNombre();
  387.                  }
  388.              }
  389.          }
  390.          return $this->render('ter_persona/show.html.twig', [
  391.              'historial' => $cambiosHistorico,
  392.              'persona' => $persona,
  393.              'form' => $form->createView(),
  394.              // Validar si fue candidato
  395.              'entrevista' => $entrevista,
  396.              // Contactos de persona
  397.              'contactosPersona' => $contactosEmergencia,
  398.              'diasEmpresa' => (floor(($diasEmpresa 365) * 100) / 100), // Dias en la empresa calculada en decimales
  399.              'fechaIngreso' => $fechaIngreso && $fechaIngreso->getFechaIngreso()
  400.                  ? ($fechaIngreso->getFechaIngreso())->format('Y-m-d') : ($persona->getCreateAt())->format('Y-m-d'),
  401.              'salario' => $salario,
  402.              'empresa' => $empresa,
  403.              'tipoContrato' => $tipoContrato,
  404.          ]);
  405.      }
  406.      public function Notificacion1anio(TerPersona $persona null) {
  407.         $entityManager $this->entityManager;
  408.         // VERIFICAR los usuarios que tengan ya un año sin actualizar su perfil
  409.          if ($personaCliente $this->getUser()->getPersona()->isPersonaCliente()) {
  410.              // Si la persona tiene un cliente asociado, no se envía la notificación
  411.              return;
  412.          }
  413.          $personaAtenticada =  $this->getUser()->getPersona()->getId();
  414.          // $persona = $entityManager->getRepository(\App\Entity\TerPersona::class)->find($personaAtenticada);
  415.          $personaGH $entityManager->getRepository(\App\Entity\TerPersona::class)->findOneBy(['numeroDocumento' => '52225052']);
  416.          if (!$persona) {
  417.                 throw $this->createNotFoundException('No se encontró a la persona solicitada, valide e intente nuevamente.');
  418.          }
  419.          $fechaActual = new \DateTime('now');
  420.          $fechaUltimaActualizacion $persona->getUpdateAt();
  421.          $diferencia1anio $fechaUltimaActualizacion->diff($fechaActual);
  422.          $personaPerfilCargo $persona->getPerfilCargo();
  423.          if($personaPerfilCargo)
  424.             $procesoPersona $personaPerfilCargo->getParProceso()->getId();
  425.          $personaGHPerfilCargo $personaGH->getPerfilCargo();
  426.          $procesoPersonaGH $personaGHPerfilCargo->getParProceso()->getId();
  427.          //enviar a gh a ana maria benitez
  428.          if ($diferencia1anio->>= && $persona->isNoti1anio() === false && $persona->getEstado()->getId() == 1) {
  429.              $notificacionInterna = new SecMensaje();
  430.              $notificacionInterna->setProceso(
  431.                  $this->entityManager->getRepository(\App\Entity\ParProceso::class)->find($procesoPersona)
  432.              );
  433.              // Pasa la ENTIDAD persona directamente
  434.              $notificacionInterna->setColaborador($persona);
  435.              $notificacionInterna->setPerfilCargo($personaPerfilCargo);
  436.              $notificacionInterna->setEstado($this->entityManager->getRepository(\App\Entity\ParEstado::class)->find(1));
  437.              $notificacionInterna->setTipo(1); // notificación de un año
  438.              $notificacionInterna->setTitulo('Actualización de datos personales');
  439.              $notificacionInterna->setDescripcion(
  440.                  'Buen día ' $persona->getNombres() . ', se le recuerda que hace un año no actualiza su información personal en el sistema, por favor ingrese a la sección de colaboradores y actualice su información. Gracias'
  441.              );
  442.              $notificacionInterna->setLeido(false);
  443. //             $notificacionInterna->setCreateAt(new \DateTime('now'));
  444. //             $notificacionInterna->setUpdateAt(new \DateTime('now'));
  445. //             $notificacionInterna->setCreateUser($this->getUser()->getUsername());
  446. //             $notificacionInterna->setUpdateUser($this->getUser()->getUsername());
  447.              // Marca que ya se notificó el año
  448.              $persona->setNoti1anio(true); // <-- verifica el nombre del setter
  449.              $entityManager->persist($notificacionInterna);
  450.              $entityManager->persist($persona); // opcional si ya está managed, pero seguro
  451.          }
  452. //         if ($diferencia1anio->y >= 1) {
  453. //             // notificación para GH
  454. //             $notificacionInternaGH = new SecMensaje();
  455. //             $notificacionInternaGH->setProceso(
  456. //                 $this->entityManager->getRepository(\App\Entity\ParProceso::class)->find($procesoPersonaGH)
  457. //             );
  458. //             // Asegúrate de pasar la ENTIDAD $personaGH (no el id)
  459. //             $notificacionInternaGH->setColaborador($personaGH);
  460. //             $notificacionInternaGH->setPerfilCargo($personaGHPerfilCargo);
  461. //             $notificacionInternaGH->setEstado($this->entityManager->getRepository(\App\Entity\ParEstado::class)->find(1));
  462. //             $notificacionInternaGH->setTipo(1);
  463. //             $notificacionInternaGH->setTitulo('Actualización de datos personales: ' . $persona->getNombres());
  464. //             $notificacionInternaGH->setDescripcion(
  465. //                 'Notificación para el colaborador: ' . $persona->getNombres() . '<br>' .
  466. //                 'Buen día ' . $persona->getNombres() . ', se le recuerda que hace un año no actualiza su información personal en el sistema, por favor ingrese a la sección de colaboradores y actualice su información. Gracias'
  467. //             );
  468. //             $notificacionInternaGH->setLeido(false);
  469. //             $notificacionInternaGH->setCreateAt(new \DateTime('now'));
  470. //             $notificacionInternaGH->setUpdateAt(new \DateTime('now'));
  471. //             $notificacionInternaGH->setCreateUser($this->getUser()->getUsername());
  472. //             $notificacionInternaGH->setUpdateUser($this->getUser()->getUsername());
  473. //
  474. //             $entityManager->persist($notificacionInternaGH);
  475. //         }
  476.          $entityManager->flush();
  477.      }
  478.      // Funcion para repositorio de documentos
  479.     #[Route('/colaborador/repositorio_documentos/{id}'name'repositorio_documentos_colaborador')]
  480.     public function repositorioColaboradorDocumentos(Request $requestEntityManagerInterface $entityManagerTerPersona $terPersona) {
  481.         // Buscar al candidato por terpersona
  482.         $candidato $entityManager->getRepository(GHCandidato::class)->findOneBy([
  483.             'numeroDocumento' => $terPersona->getNumeroDocumento(),
  484.         ]);
  485.         $camposDinamicos = [];
  486.         // Validar para mostrar otros documentos cargados
  487.         $otrosDocs $request->get('otros') ?? false;
  488.         // Declaracion variables de candidato
  489.         $antecedentes null;
  490.         $pruebaPsicotecnica null;
  491.         $pruebaTecnica null;
  492.         $examenesMedicos null;
  493.         $visitaDomicilio null;
  494.         $afiliaciones null;
  495.         $contrato null;
  496.         $recursoPerfil null;
  497.         $documentos null;
  498.         $cesantias null;
  499.         $evidenciaEvaluacionDesempeno null// Evluacion desempeño
  500.         // Buscar los documentos asociados con la contratacion
  501.         $ghDocumentosContrato null;
  502.         // Validar que encontro al candidato
  503.         if($candidato && !$otrosDocs){
  504.             // Buscar en todo el proceso de contratacion los documentos asociados al colaborador
  505.             $antecedentes $entityManager->getRepository(GHRevisionInicial::class)->findOneBy([
  506.                 'candidato' => $candidato,
  507.             ]);
  508.             $pruebaPsicotecnica $candidato->getPruebaPsicotecnica()->last() ?? null;
  509.             $pruebaTecnica $candidato->getPruebaTecnica()->last() ?? null;
  510.             $examenesMedicos $candidato->getExamenes()->last() ?? null;
  511.             $visitaDomicilio $candidato->getVisitaDomiciliaria()->last() ?? null;
  512.             $afiliaciones $candidato->getAfiliacionContratacion()->last() ?? null;
  513.             $contrato $candidato->getContrato()->last() ?? null;
  514.             $recursoPerfil $candidato->getSolicitudDotacion()->last() ?? null;
  515.             $documentos $candidato->getContratacion()->last() ?? null;
  516.             // Buscar los documentos asociados con la contratacion
  517.             $ghDocumentosContrato null;
  518.             if($documentos)
  519.                 $ghDocumentosContrato $entityManager->getRepository(GHDocumentoContratacion::class)->findOneBy([
  520.                     'contratacion' => $documentos,
  521.                 ]);
  522.         }
  523.         // Validar el terPersona
  524.         if($terPersona && !$otrosDocs){
  525.             // Datos de mantenimiento -----------------------------------------------------------------------
  526.             $registroOpain $terPersona->getRegistrosOpain()->last() ?? null;
  527.             $registroDian $terPersona->getRegistroInscripcion()->last() ?? null;
  528.             $registroDReposicion $registroDian $registroDian->getRegistroInscripcionReposicion()->last() : null;
  529.             $examenPeriodico $terPersona->getExamenPeriodicoPersona()->last() ?? null;
  530.             $visitaPeriodica $terPersona->getVisitaPeriodicaPersona()->last() ?? null;
  531.             $antecedentesPeriodicos $terPersona->getVerificacionAntecedentesPersona()->last() ?? null;
  532.             // Ev Desempeño -----------------------------------------------------------------------------
  533.             $evDesempeno $terPersona->getEvaluacionesDesempenoPersona()->last() ?? null;
  534.             // Ultimas cesantias --------------------------------------------------------------------------
  535.             $cesantias $terPersona->getRetiroCesantias()->last() ?? null;
  536.             // Proceso disciplinario -------------------------------------------------------------------
  537.             $procesoDisciplinario $terPersona->getProcesoDisciplinarioPersona()->last() ?? null;
  538.             // Cambio contrato
  539.             $cambioContrato $terPersona->getCambioContrato()->last() ?? null;
  540.             // Desvinculacion --------------------------------------------------------------------------
  541.             $desvinculacion $terPersona->getDesvinculacion()->last() ?? null;
  542.             // dump($desvinculacion);
  543.         }
  544.         # Validar que la persona ya ha tenido novedad nomina
  545.         $novedadNomina $terPersona->getNovedadNomina()->last() ?? null;
  546.         // Array para recorrer los filtrado
  547.         if(!$otrosDocs){
  548.             $camposDinamicos = [
  549.                 // Proceso de seleccion
  550.                 [
  551.                     'titulo' => 'Hoja de Vida',
  552.                     'campos' => [
  553.                         'entidad' => [$candidato],
  554.                         'atributo' => 'hojaVida',
  555.                         'ruta' => 'Repository/GHCandidato/',
  556.                         'icono' => 'fas fa-file',
  557.                         // Fecha cargue documento
  558.                         'fecha' => $candidato $candidato->getUpdateAt()->format('Y-m-d') : 'N/A',
  559.                     ]
  560.                 ],
  561.                 [
  562.                     'titulo' => 'Antecedentes',
  563.                     'campos' => [
  564.                         'entidad' => [$antecedentes],
  565.                         'atributo' => 'archivo',
  566.                         'ruta' => 'Repository/GHRevisionInicial/',
  567.                         'icono' => 'fab fa-first-order-alt',
  568.                         'fecha' => $antecedentes $antecedentes->getUpdateAt()->format('Y-m-d') : 'N/A',
  569.                     ]
  570.                 ],[
  571.                     'titulo' => 'Prueba de Confiabilidad',
  572.                     'campos' => [
  573.                         'entidad' => [$pruebaPsicotecnica],
  574.                         'atributo' => 'evidenciaDisc',
  575.                         'ruta' => 'Repository/GHPruebasPsicotecnicas/',
  576.                         'icono' => 'fas fa-head-side-cough',
  577.                         'fecha' => $pruebaPsicotecnica $pruebaPsicotecnica->getUpdateAt()->format('Y-m-d') : 'N/A',
  578.                     ]
  579.                 ],[
  580.                     'titulo' => 'Prueba Disc',
  581.                     'campos' => [
  582.                         'entidad' => [$pruebaPsicotecnica],
  583.                         'atributo' => 'evidenciaEthickos',
  584.                         'ruta' => 'Repository/GHPruebasPsicotecnicas/',
  585.                         'icono' => 'fas fa-head-side-cough',
  586.                         'fecha' => $pruebaPsicotecnica $pruebaPsicotecnica->getUpdateAt()->format('Y-m-d') : 'N/A',
  587.                     ]
  588.                 ],[
  589.                     'titulo' => 'Prueba Tecnica',
  590.                     'campos' => [
  591.                         'entidad' => [$pruebaTecnica],
  592.                         'atributo' => 'archivo',
  593.                         'ruta' => 'Repository/GHPruebasTecnicas/',
  594.                         'icono' => 'fas fa-head-side-virus',
  595.                         'fecha' => $pruebaTecnica $pruebaTecnica->getUpdateAt()->format('Y-m-d') : 'N/A',
  596.                     ]
  597.                 ],[
  598.                     // Proceso de contratacion
  599.                     'titulo' => 'Resultados Medicos',
  600.                     'campos' => [
  601.                         'entidad' => [$examenesMedicos],
  602.                         'atributo' => 'resultado',
  603.                         'ruta' => 'Repository/GHExamenes/',
  604.                         'icono' => 'fas fa-list',
  605.                         'fecha' => $examenesMedicos $examenesMedicos->getUpdateAt()->format('Y-m-d') : 'N/A',
  606.                     ]
  607.                 ],[
  608.                     'titulo' => 'Visita Domiciliaria',
  609.                     'campos' => [
  610.                         'entidad' => [$visitaDomicilio],
  611.                         'atributo' => 'informeVisita',
  612.                         'ruta' => 'Repository/GHVisitaDomiciliaria/',
  613.                         'icono' => 'fas fa-house-user',
  614.                         'fecha' => $visitaDomicilio $visitaDomicilio->getUpdateAt()->format('Y-m-d') : 'N/A',
  615.                     ]
  616.                 ],[
  617.                     'titulo' => 'Afiliaciones',
  618.                     'campos' => [
  619.                         'entidad' => [$afiliaciones],
  620.                         'atributo' => 'soporte',
  621.                         'ruta' => 'Repository/GHAfiliacionContratacion/',
  622.                         'icono' => 'fas fa-passport',
  623.                         // Agregar el listar ya que es una coleccion con varias afiliaciones
  624.                         'enlace' => 'gh_afiliacion_contratacion',
  625.                         'fecha' => $afiliaciones $afiliaciones->getUpdateAt()->format('Y-m-d') : 'N/A',
  626.                     ]
  627.                 ],[
  628.                     'titulo' => 'Contrato',
  629.                     'campos' => [
  630.                         'entidad' => [$contrato],
  631.                         'atributo' => 'contrato',
  632.                         'ruta' => 'Repository/GHContrato/',
  633.                         'icono' => 'fas fa-user-cog',
  634.                         'fecha' => $contrato $contrato->getUpdateAt()->format('Y-m-d') : 'N/A',
  635.                     ]
  636.                 ],[
  637.                     // DAtos de recurso perfil
  638.                     'titulo' => 'Foto Recurso Perfil',
  639.                     'campos' => [
  640.                         'entidad' => [$recursoPerfil],
  641.                         'atributo' => 'foto',
  642.                         'ruta' => 'Repository/GHSolicitudDotacion/',
  643.                         'icono' => 'fa-solid fa-briefcase',
  644.                         'fecha' => $recursoPerfil $recursoPerfil->getUpdateAt()->format('Y-m-d') : 'N/A',
  645.                     ]
  646.                 ],[
  647.                     'titulo' => 'Cert. Procuraduria',
  648.                     'campos' => [
  649.                         'entidad' => [$recursoPerfil],
  650.                         'atributo' => 'certificadoProcuraduria',
  651.                         'ruta' => 'Repository/GHSolicitudDotacion/',
  652.                         'icono' => 'fa-solid fa-briefcase',
  653.                         'fecha' => $recursoPerfil $recursoPerfil->getUpdateAt()->format('Y-m-d') : 'N/A',
  654.                     ]
  655.                 ],[
  656.                     'titulo' => 'Soporte Carnet',
  657.                     'campos' => [
  658.                         'entidad' => [$recursoPerfil],
  659.                         'atributo' => 'soporteCarnet',
  660.                         'ruta' => 'Repository/GHSolicitudDotacion/',
  661.                         'icono' => 'fa-solid fa-briefcase',
  662.                         'fecha' => $recursoPerfil $recursoPerfil->getUpdateAt()->format('Y-m-d') : 'N/A',
  663.                     ]
  664.                 ],[
  665.                     'titulo' => 'Foto Carnet',
  666.                     'campos' => [
  667.                         'entidad' => [$recursoPerfil],
  668.                         'atributo' => 'fotoCarnet',
  669.                         'ruta' => 'Repository/GHSolicitudDotacion/',
  670.                         'icono' => 'fa-solid fa-briefcase',
  671.                         'fecha' => $recursoPerfil $recursoPerfil->getUpdateAt()->format('Y-m-d') : 'N/A',
  672.                     ]
  673.                 ],[
  674.                     'titulo' => 'Documentos',
  675.                     'campos' => [
  676.                         'entidad' => [$ghDocumentosContrato],
  677.                         'atributo' => 'evidencia',
  678.                         'ruta' => 'Repository/GHDocumentoContratacion/',
  679.                         'icono' => 'fas fa-folder-open',
  680.                         'enlace' => 'gh_documento_contratacion',
  681.                         'fecha' => $ghDocumentosContrato $ghDocumentosContrato->getUpdateAt()->format('Y-m-d') : 'N/A',
  682.                     ]
  683.                 ],
  684.                 // Evidencias de mantenimiento
  685.                 [
  686.                     'titulo' => 'Formulario 1526',
  687.                     'campos' => [
  688.                         'entidad' => [$registroDian],
  689.                         'atributo' => 'formato',
  690.                         'ruta' => 'Repository/GHRegistroInscripcion/',
  691.                         'icono' => 'fas fa-file-signature',
  692.                         'fecha' => $registroDian && $registroDian->getFechaInscripcion()
  693.                             ? $registroDian->getFechaInscripcion()->format('Y-m-d') : 'N/A',
  694.                     ]
  695.                 ],[
  696.                     'titulo' => 'Formulario 1783',
  697.                     'campos' => [
  698.                         'entidad' => [$registroDian],
  699.                         'atributo' => 'formulario1783',
  700.                         'ruta' => 'Repository/GHRegistroInscripcion/',
  701.                         'icono' => 'fas fa-file-signature',
  702.                         'fecha' => $registroDian && $registroDian->getFechaInscripcion()
  703.                             ? $registroDian->getFechaInscripcion()->format('Y-m-d') : 'N/A',
  704.                     ]
  705.                 ],[
  706.                     'titulo' => 'Acta Entrega Carnet',
  707.                     'campos' => [
  708.                         'entidad' => [$registroDian],
  709.                         'atributo' => 'evidencia',
  710.                         'ruta' => 'Repository/GHRegistroInscripcion/',
  711.                         'icono' => 'fas fa-id-card',
  712.                         'fecha' => $registroDian && $registroDian->getFechaInscripcion()
  713.                             ? $registroDian->getFechaInscripcion()->format('Y-m-d') : 'N/A',
  714.                     ]
  715.                 ],[
  716.                     'titulo' => 'Manual Funciones',
  717.                     'campos' => [
  718.                         'entidad' => [$registroDian],
  719.                         'atributo' => 'manual',
  720.                         'ruta' => 'Repository/GHRegistroInscripcion/',
  721.                         'icono' => 'fas fa-file-signature',
  722.                         'fecha' => $registroDian && $registroDian->getFechaInscripcion()
  723.                             ? $registroDian->getFechaInscripcion()->format('Y-m-d') : 'N/A',
  724.                     ]
  725.                 ],[
  726.                     'titulo' => 'Repo. Acta Entrega Carnet',
  727.                     'campos' => [
  728.                         'entidad' => [$registroDReposicion],
  729.                         'atributo' => 'actaEntrega',
  730.                         'ruta' => 'Repository/GHRegistroInscripcionReposicion/',
  731.                         'icono' => 'fas fa-file-signature',
  732.                         'fecha' => $registroDReposicion && $registroDReposicion->getUpdateAt()
  733.                             ? $registroDReposicion->getUpdateAt()->format('Y-m-d') : 'N/A',
  734.                     ]
  735.                 ],
  736.                 [
  737.                     'titulo' => 'Ev. Carnet OPAIN',
  738.                     'campos' => [
  739.                         'entidad' => [$registroOpain],
  740.                         'atributo' => 'evidenciaCarnet',
  741.                         'ruta' => 'Repository/GHRegistroOpain/',
  742.                         'icono' => 'fas fa-id-card',
  743.                         'fecha' => $registroOpain $registroOpain->getUpdateAt()->format('Y-m-d') : 'N/A',
  744.                     ]
  745.                 ],[
  746.                     'titulo' => 'Renov. Carnet OPAIN',
  747.                     'campos' => [
  748.                         'entidad' => [$registroOpain],
  749.                         'atributo' => 'evidenciaCarnet',
  750.                         'ruta' => 'Repository/GHRegistroOpain/',
  751.                         'icono' => 'fas fa-id-card',
  752.                         'fecha' => $registroOpain && $registroOpain->getFechaRenovacion() ?
  753.                             $registroOpain->getFechaRenovacion()->format('Y-m-d') : 'N/A',
  754.                     ]
  755.                 ],[
  756.                     'titulo' => 'Devol. Carnet OPAIN',
  757.                     'campos' => [
  758.                         'entidad' => [$registroOpain],
  759.                         'atributo' => 'evidenciaCarnet',
  760.                         'ruta' => 'Repository/GHRegistroOpain/',
  761.                         'icono' => 'fas fa-id-card',
  762.                         'fecha' => $registroOpain && $registroOpain->getFechaRenovacion() ?
  763.                             $registroOpain->getFechaRenovacion()->format('Y-m-d') : 'N/A',
  764.                     ]
  765.                 ],
  766.                 // Controles de seguridad --------------------------------- GH
  767.                 [
  768.                     'titulo' => 'Resultado / Examen Periodico',
  769.                     'campos' => [
  770.                         'entidad' => [$examenPeriodico],
  771.                         'atributo' => 'soporte',
  772.                         'ruta' => 'Repository/GHExamenPeriodico/',
  773.                         'icono' => 'fas fa-file',
  774.                         'fecha' => $examenPeriodico && $examenPeriodico->getFecha() ?
  775.                             $examenPeriodico->getFecha()->format('Y-m-d') : 'N/A',
  776.                     ]
  777.                 ],[
  778.                     'titulo' => 'Resultado / Visita Periodica',
  779.                     'campos' => [
  780.                         'entidad' => [$visitaPeriodica],
  781.                         'atributo' => 'soporte',
  782.                         'ruta' => 'Repository/GHExamenPeriodico/',
  783.                         'icono' => 'fas fa-file',
  784.                         'fecha' => $visitaPeriodica && $visitaPeriodica->getFecha() ?
  785.                             $visitaPeriodica->getFecha()->format('Y-m-d') : 'N/A',
  786.                     ]
  787.                 ],[
  788.                     'titulo' => 'Resultado / Verificación Antecedentes',
  789.                     'campos' => [
  790.                         'entidad' => [$antecedentesPeriodicos],
  791.                         'atributo' => 'evidencia',
  792.                         'ruta' => 'Repository/GHVerificacionAntecedente/',
  793.                         'icono' => 'fas fa-file',
  794.                         'fecha' => $antecedentesPeriodicos && $antecedentesPeriodicos->getFecha() ?
  795.                             $antecedentesPeriodicos->getFecha()->format('Y-m-d') : 'N/A',
  796.                     ]
  797.                 ],
  798.                 // Evaluacion y desempeño
  799.                 [
  800.                     'titulo' => 'Evaluación Desempeño',
  801.                     'campos' => [
  802.                         'entidad' => [$evDesempeno],
  803.                         'atributo' => 'fechaSolicitud',
  804.                         'ruta' => 'Repository/GHEvaluacionDesempenoPersona/',
  805.                         'icono' => 'fas fa-scroll',
  806.                         'enlace' => 'gh_retiro_cesantias_edit',
  807.                         'fecha' => $evDesempeno && $evDesempeno->getUpdateAt() ?
  808.                             $evDesempeno->getUpdateAt()->format('Y-m-d') : 'N/A',
  809.                     ]
  810.                 ],
  811.                 // Cesantias
  812.                 [
  813.                     'titulo' => 'Retiro Cesantias',
  814.                     'campos' => [
  815.                         'entidad' => [$cesantias],
  816.                         'atributo' => 'fechaSolicitud',
  817.                         'ruta' => 'Repository/GHRetiroCesantias/',
  818.                         'icono' => 'fas fa-scroll',
  819.                         'enlace' => 'gh_retiro_cesantias_edit',
  820.                         'fecha' => $cesantias && $cesantias->getUpdateAt() ?
  821.                             $cesantias->getUpdateAt()->format('Y-m-d') : 'N/A',
  822.                     ]
  823.                 ],[
  824.                     // Proceso disciplinario
  825.                     'titulo' => 'Acta Proceso Disciplinario',
  826.                     'campos' => [
  827.                         'entidad' => [$procesoDisciplinario],
  828.                         'atributo' => 'acta',
  829.                         'ruta' => 'Repository/GHProcesoDisciplinario/',
  830.                         'icono' => 'fas fa-pencil-ruler',
  831.                         'fecha' => $procesoDisciplinario && $procesoDisciplinario->getUpdateAt() ?
  832.                             $procesoDisciplinario->getUpdateAt()->format('Y-m-d') : 'N/A',
  833.                     ]
  834.                 ],[
  835.                     'titulo' => 'Soporte Medida Disciplinaria',
  836.                     'campos' => [
  837.                         'entidad' => [$procesoDisciplinario],
  838.                         'atributo' => 'soporteMedida',
  839.                         'ruta' => 'Repository/GHProcesoDisciplinario/',
  840.                         'icono' => 'fas fa-pencil-ruler',
  841.                         'fecha' => $procesoDisciplinario && $procesoDisciplinario->getUpdateAt() ?
  842.                             $procesoDisciplinario->getUpdateAt()->format('Y-m-d') : 'N/A',
  843.                     ]
  844.                 ],[
  845.                     'titulo' => 'Citación Proceso Disciplinario',
  846.                     'campos' => [
  847.                         'entidad' => [$procesoDisciplinario],
  848.                         'atributo' => 'citacion',
  849.                         'ruta' => 'Repository/GHProcesoDisciplinario/',
  850.                         'icono' => 'fas fa-pencil-ruler',
  851.                         'fecha' => $procesoDisciplinario && $procesoDisciplinario->getUpdateAt() ?
  852.                             $procesoDisciplinario->getUpdateAt()->format('Y-m-d') : 'N/A',
  853.                     ]
  854.                 ],[
  855.                     'titulo' => 'Gestión Apelación',
  856.                     'campos' => [
  857.                         'entidad' => [$procesoDisciplinario],
  858.                         'atributo' => 'gestionApelacion',
  859.                         'ruta' => 'Repository/GHProcesoDisciplinario/',
  860.                         'icono' => 'fas fa-pencil-ruler',
  861.                         'fecha' => $procesoDisciplinario && $procesoDisciplinario->getUpdateAt() ?
  862.                             $procesoDisciplinario->getUpdateAt()->format('Y-m-d') : 'N/A',
  863.                     ]
  864.                 ],
  865.                 // Cambio contrato
  866.                 [
  867.                     'titulo' => 'Prueba Tecnica / Cond. Contrato',
  868.                     'campos' => [
  869.                         'entidad' => [$cambioContrato],
  870.                         'atributo' => 'pruebaTecnica',
  871.                         'ruta' => 'Repository/GHCambioContrato/',
  872.                         'icono' => 'fab fa-stack-exchange',
  873.                         'fecha' => $cambioContrato && $cambioContrato->getUpdateAt() ?
  874.                             $cambioContrato->getUpdateAt()->format('Y-m-d') : 'N/A',
  875.                     ]
  876.                 ],[
  877.                     'titulo' => 'Examen Medico / Cond. Contrato',
  878.                     'campos' => [
  879.                         'entidad' => [$cambioContrato],
  880.                         'atributo' => 'examenMedico',
  881.                         'ruta' => 'Repository/GHCambioContrato/',
  882.                         'icono' => 'fab fa-stack-exchange',
  883.                         'fecha' => $cambioContrato && $cambioContrato->getUpdateAt() ?
  884.                             $cambioContrato->getUpdateAt()->format('Y-m-d') : 'N/A',
  885.                     ]
  886.                 ],[
  887.                     'titulo' => 'Visita Domiciliaria / Cond. Contrato',
  888.                     'campos' => [
  889.                         'entidad' => [$cambioContrato],
  890.                         'atributo' => 'visitaDomiciliaria',
  891.                         'ruta' => 'Repository/GHCambioContrato/',
  892.                         'icono' => 'fab fa-stack-exchange',
  893.                         'fecha' => $cambioContrato && $cambioContrato->getUpdateAt() ?
  894.                             $cambioContrato->getUpdateAt()->format('Y-m-d') : 'N/A',
  895.                     ]
  896.                 ],[
  897.                     'titulo' => 'Contrato / Cond. Contrato',
  898.                     'campos' => [
  899.                         'entidad' => [$cambioContrato],
  900.                         'atributo' => 'contrato',
  901.                         'ruta' => 'Repository/GHCambioContrato/',
  902.                         'icono' => 'fab fa-stack-exchange',
  903.                         'fecha' => $cambioContrato && $cambioContrato->getUpdateAt() ?
  904.                             $cambioContrato->getUpdateAt()->format('Y-m-d') : 'N/A',
  905.                     ]
  906.                 ],[
  907.                     'titulo' => 'Carta Notif. / Cond. Contrato',
  908.                     'campos' => [
  909.                         'entidad' => [$cambioContrato],
  910.                         'atributo' => 'cartaNotificacion',
  911.                         'ruta' => 'Repository/GHCambioContrato/',
  912.                         'icono' => 'fab fa-stack-exchange',
  913.                         'fecha' => $cambioContrato && $cambioContrato->getUpdateAt() ?
  914.                             $cambioContrato->getUpdateAt()->format('Y-m-d') : 'N/A',
  915.                     ]
  916.                 ],[
  917.                     'titulo' => 'Cesion Contrato / Cond. Contrato',
  918.                     'campos' => [
  919.                         'entidad' => [$cambioContrato],
  920.                         'atributo' => 'cesionContrato',
  921.                         'ruta' => 'Repository/GHCambioContrato/',
  922.                         'icono' => 'fab fa-stack-exchange',
  923.                         'fecha' => $cambioContrato && $cambioContrato->getUpdateAt() ?
  924.                             $cambioContrato->getUpdateAt()->format('Y-m-d') : 'N/A',
  925.                     ]
  926.                 ],[
  927.                     'titulo' => 'Otro Si / Cond. Contrato',
  928.                     'campos' => [
  929.                         'entidad' => [$cambioContrato],
  930.                         'atributo' => 'otroSi',
  931.                         'ruta' => 'Repository/GHCambioContrato/',
  932.                         'icono' => 'fab fa-stack-exchange',
  933.                         'fecha' => $cambioContrato && $cambioContrato->getUpdateAt() ?
  934.                             $cambioContrato->getUpdateAt()->format('Y-m-d') : 'N/A',
  935.                     ]
  936.                 ],
  937.                 // Proceso de desvinculacion
  938.                 [
  939.                     'titulo' => 'Soporte Desvinculación',
  940.                     'campos' => [
  941.                         'entidad' => [$desvinculacion],
  942.                         'atributo' => 'soporte',
  943.                         'ruta' => 'Repository/GHDesvinculacion/',
  944.                         'icono' => 'fas fa-person-circle-minus',
  945.                         'fecha' => $desvinculacion && $desvinculacion->getFechaDesvinculacion() ?
  946.                             $desvinculacion->getFechaDesvinculacion()->format('Y-m-d') : 'N/A',
  947.                     ]
  948.                 ],
  949.                 [
  950.                     'titulo' => 'Carta Renuncia',
  951.                     'campos' => [
  952.                         'entidad' => [$desvinculacion],
  953.                         'atributo' => 'cartaRenuncia',
  954.                         'ruta' => 'Repository/GHDesvinculacion/',
  955.                         'icono' => 'fas fa-person-circle-minus',
  956.                         'fecha' => $desvinculacion && $desvinculacion->getFechaDesvinculacion() ?
  957.                             $desvinculacion->getFechaDesvinculacion()->format('Y-m-d') : 'N/A',
  958.                     ]
  959.                 ],[
  960.                     'titulo' => 'Acta Entrega / Desvinculación',
  961.                     'campos' => [
  962.                         'entidad' => [$desvinculacion],
  963.                         'atributo' => 'actaEntrega',
  964.                         'ruta' => 'Repository/GHDesvinculacion/',
  965.                         'icono' => 'fas fa-person-circle-minus',
  966.                         'fecha' => $desvinculacion && $desvinculacion->getFechaDesvinculacion() ?
  967.                             $desvinculacion->getFechaDesvinculacion()->format('Y-m-d') : 'N/A',
  968.                     ]
  969.                 ],[
  970.                     'titulo' => 'Acta Destruccion Carnet Dian / Desvinculación',
  971.                     'campos' => [
  972.                         'entidad' => [$desvinculacion],
  973.                         'atributo' => 'actaDestruccionCarnetDian',
  974.                         'ruta' => 'Repository/GHDesvinculacion/',
  975.                         'icono' => 'fas fa-person-circle-minus',
  976.                         'fecha' => $desvinculacion && $desvinculacion->getFechaDesvinculacion() ?
  977.                             $desvinculacion->getFechaDesvinculacion()->format('Y-m-d') : 'N/A',
  978.                     ]
  979.                 ],[
  980.                     'titulo' => 'Liquidación / Desvinculación',
  981.                     'campos' => [
  982.                         'entidad' => [$desvinculacion],
  983.                         'atributo' => 'liquidacion',
  984.                         'ruta' => 'Repository/GHDesvinculacion/',
  985.                         'icono' => 'fas fa-person-circle-minus',
  986.                         'fecha' => $desvinculacion && $desvinculacion->getFechaDesvinculacion() ?
  987.                             $desvinculacion->getFechaDesvinculacion()->format('Y-m-d') : 'N/A',
  988.                     ]
  989.                 ],[
  990.                     'titulo' => 'Liquidación Firmada / Desvinculación',
  991.                     'campos' => [
  992.                         'entidad' => [$desvinculacion],
  993.                         'atributo' => 'liquidacionFirmada',
  994.                         'ruta' => 'Repository/GHDesvinculacion/',
  995.                         'icono' => 'fas fa-person-circle-minus',
  996.                         'fecha' => $desvinculacion && $desvinculacion->getFechaDesvinculacion() ?
  997.                             $desvinculacion->getFechaDesvinculacion()->format('Y-m-d') : 'N/A',
  998.                     ]
  999.                 ],[
  1000.                     'titulo' => 'Soporte Liquidación / Desvinculación',
  1001.                     'campos' => [
  1002.                         'entidad' => [$desvinculacion],
  1003.                         'atributo' => 'soporteLiquidacion',
  1004.                         'ruta' => 'Repository/GHDesvinculacion/',
  1005.                         'icono' => 'fas fa-person-circle-minus',
  1006.                         'fecha' => $desvinculacion && $desvinculacion->getFechaDesvinculacion() ?
  1007.                             $desvinculacion->getFechaDesvinculacion()->format('Y-m-d') : 'N/A',
  1008.                     ]
  1009.                 ],[
  1010.                     'titulo' => 'Paz y Salvo / Desvinculación',
  1011.                     'campos' => [
  1012.                         'entidad' => [$desvinculacion],
  1013.                         'atributo' => 'pazysalvo',
  1014.                         'ruta' => 'Repository/GHDesvinculacion/',
  1015.                         'icono' => 'fas fa-person-circle-minus',
  1016.                         'fecha' => $desvinculacion && $desvinculacion->getFechaDesvinculacion() ?
  1017.                             $desvinculacion->getFechaDesvinculacion()->format('Y-m-d') : 'N/A',
  1018.                     ]
  1019.                 ],[
  1020.                     'titulo' => 'Documentos Firmados / Desvinculación',
  1021.                     'campos' => [
  1022.                         'entidad' => [$desvinculacion],
  1023.                         'atributo' => 'documentosFirmados',
  1024.                         'ruta' => 'Repository/GHDesvinculacion/',
  1025.                         'icono' => 'fas fa-person-circle-minus',
  1026.                         'fecha' => $desvinculacion && $desvinculacion->getFechaDesvinculacion() ?
  1027.                             $desvinculacion->getFechaDesvinculacion()->format('Y-m-d') : 'N/A',
  1028.                     ]
  1029.                 ],[
  1030.                     'titulo' => 'Cambio condiciones Contrato',
  1031.                     'campos' => [
  1032.                         'entidad' => [$cambioContrato],
  1033.                         'ruta' => 'Repository/GHAfiliacionContratacion/',
  1034.                         'icono' => 'fas fa-file-signature',
  1035.                         // Agregar el listar ya que es una coleccion con varias afiliaciones
  1036.                         'enlace' => 'gh_cambio_contrato_ver',
  1037.                         'fecha' => $cambioContrato $cambioContrato->getUpdateAt()->format('Y-m-d') : 'N/A',
  1038.                     ]
  1039.                 ],
  1040.                 # Agregar lista para ver a los usuarios con novedades cerradas
  1041.                 [
  1042.                 'titulo' => 'Novedades Nomina',
  1043.                 'campos' => [
  1044.                     'entidad' => [$novedadNomina],
  1045.                     'ruta' => 'Repository/GHNovedadNomina/',
  1046.                     'icono' => 'fas fa-calendar',
  1047.                     // Agregar el listar ya que es una coleccion con varias afiliaciones
  1048.                     'enlace' => 'gh_novedad_nomina_cerrado',
  1049.                     'fecha' => $novedadNomina && $novedadNomina->getCreateAt() ? $novedadNomina->getCreateAt()->format('Y-m-d') : 'N/A',
  1050.                 ]
  1051.             ]
  1052.             ];
  1053.         }
  1054.         return $this->render('ter_persona/repositorioDocumentos.html.twig',[
  1055.             'terPersona' => $terPersona,
  1056.             'camposDinamicos' => $camposDinamicos,
  1057.             'candidato' => $candidato,
  1058.             // Retiro Cesantias
  1059.             'cesantias' => $cesantias,
  1060.             'otrosDocs' => $otrosDocs,
  1061.         ]);
  1062.     }
  1063.     // Funcion para registrar los demas documentos
  1064.     #[Route('/colaborador/repositorio_documentos_otros_docs/{id}'name'repositorio_documentos_colaborador_otros_docs')]
  1065.     public function registrarOtrosDocumentos(Request $requestEntityManagerInterface $entityManagerTerPersona $terPersona)
  1066.     {
  1067.         // Listar los documentos que tiene ya el colaborador
  1068.         $documentos $terPersona->getOtrosDocumentos() ?? [];
  1069.         $nombreDocumentos $terPersona->getNombreOtrosDocumentos() ?? [];
  1070.         // Crear un formulario improvisado
  1071.         $form $this->createFormBuilder(null,[
  1072.             'method' => 'POST',
  1073.             'action' => $this->generateUrl('repositorio_documentos_colaborador_otros_docs',[
  1074.                 'id' => $terPersona->getId(),
  1075.             ])
  1076.         ])
  1077.             ->add('otrosDocumentos',FileType::class,[
  1078.                 'multiple' => true,
  1079.                 'mapped' => false,
  1080.                 'required' => true,
  1081.                 'label'=>'Otros Documentos',
  1082.             ])
  1083.             ->getForm();
  1084.         $form->handleRequest($request);
  1085.         if($form->isSubmitted() && $form->isValid()){
  1086.             $archivos $form->get('otrosDocumentos')->getData();
  1087.             // Validar que los archivos sean validos
  1088.             if($archivos){
  1089.                 foreach($archivos as $archivo){
  1090.                     $carchivoCargado $this->documentHandler->cargarArchivo($archivo,TerPersona::class);
  1091.                     if($carchivoCargado['code'] !== 'success'){
  1092.                         return new JsonResponse([
  1093.                            'code' => 'error',
  1094.                            'msj' => '¡Archivos no compatibles!',
  1095.                            'url' => $this->url,
  1096.                            'html' => $this->html
  1097.                         ]);
  1098.                     }
  1099.                     // Seguir acumulando archivos , ya que no se pidio funcion de borrar , si se pide es adicional
  1100.                     $documentos[] = $carchivoCargado['msj'];
  1101.                     $nombreDocumentos[] = $carchivoCargado['title']; // Cargar los nombres de los documentos
  1102.                 }
  1103.                 // Persistir los datos
  1104.                 $terPersona->setOtrosDocumentos($documentos);
  1105.                 $terPersona->setNombreOtrosDocumentos($nombreDocumentos);
  1106.                 $entityManager->persist($terPersona);
  1107.             }
  1108.             // Guardar datos
  1109.             $entityManager->flush();
  1110.             return new JsonResponse([
  1111.                 'code' => 'success',
  1112.                 'msj' => 'Registro cargado exitosamente',
  1113.                 'url' => $this->url,
  1114.                 'html' => $this->html
  1115.             ]);
  1116.         }
  1117.         return $this->renderForm('ter_persona/otros_documentos.html.twig',[
  1118.             'terPersona' => $terPersona,
  1119.             'form' => $form,
  1120.         ]);
  1121.     }
  1122.     #[Route('/colaborador/imprimir/{id}'name'perfil_colaborador_imprimir')]
  1123.     public function imprimirColaborador(EntityManagerInterface $entityManagerTerPersona $persona\App\Services\ResponseHandler $responseHandler): Response {
  1124. //        $historial = $entityManager->getRepository(TerPersonaHistorial::class)->findBy(['persona' => $persona]);
  1125. //        if (!$historial) {
  1126. //           $this->addFlash('warning', 'No se encontro un historial asociado a la persona solicitada.');
  1127. //           return $this->redirectToRoute($responseHandler->manejoRespuesta());
  1128. //        }
  1129.         $path $this->getParameter('kernel.project_dir') . '/public_html/assets/img/brand/logos-empresas.png';
  1130.         $type pathinfo($pathPATHINFO_EXTENSION);
  1131.         $data file_get_contents($path);
  1132.         $base64 'data:image/' $type ';base64,' base64_encode($data);
  1133.         $rutaLogo $base64;
  1134.         $historiales $entityManager->getRepository(TerPersonaHistorial::class)->findBy(
  1135.             ['persona' => $persona],
  1136.             ['updateAt' => 'DESC'],
  1137.             1
  1138.         );
  1139.         $historial $historiales[0] ?? null;
  1140.         $html $this->renderView('formatos/formatoHistorialTerPersona.html.twig', ['logo' => $rutaLogo'historial' => $historial'persona' => $persona]);
  1141.         $dompdf = new Dompdf();
  1142.         //$customPaper = array(0, 0, 220, 130);
  1143.         //$dompdf->setPaper($customPaper);
  1144.         $dompdf->loadHtml($html);
  1145.         $dompdf->render();
  1146.         return new Response(
  1147.             $dompdf->stream('resume', ["Attachment" => false]),
  1148.             Response::HTTP_OK,
  1149.             ['Content-Type' => 'application/pdf']
  1150.         );
  1151.     }
  1152. }