src/Controller/TerPersonaController.php line 503

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