src/Controller/ApiAdminController.php line 376

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\JsonResponse;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use App\Repository\PcConvocatoriasRepository;
  9. use App\Entity\PcConvocatorias;
  10. use App\Entity\PcCriterios;
  11. use App\Repository\PcCriteriosRepository;
  12. use App\Entity\PcCriteriosConvocatorias;
  13. use App\Repository\PcCriteriosConvocatoriasRepository;
  14. use App\Repository\PcPostulacionRepository;
  15. use App\Service\ValidacionService;
  16. use App\Repository\RegionRepository;
  17. use Symfony\Component\Validator\Validator\ValidatorInterface;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
  20. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  21. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  22. use App\Service\RacService;
  23. use App\Repository\PcPuntoCulturaRepository;
  24. use Symfony\Component\Security\Core\Security;
  25. use Symfony\Bundle\SecurityBundle\Attribute\IsGranted;
  26. use DateTime;
  27. /**
  28.  * @Route("/api/admin", name="api_admin_")
  29.  */
  30. class ApiAdminController extends AbstractController
  31. {
  32.     #[Route('/login'name'login'methods: ['POST'])]
  33.     public function login(Request $request): JsonResponse
  34.     {
  35.         // La autenticación será manejada automáticamente por el firewall
  36.         return new JsonResponse(['message' => 'Por favor, envía credenciales válidas']);
  37.     }
  38.     #[Route('/secure/roles'name'obtenerRoles'methods: ['GET'])]
  39.     public function obtenerRoles(
  40.         Security $security
  41.     ): JsonResponse
  42.     {
  43.         try {
  44.             $user $security->getUser();
  45.             if (!$user) {
  46.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  47.             }
  48.             if (!$user->isActivo()) {
  49.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  50.             }
  51.             return $this->json($user->getRoles());
  52.         } catch (\Exception $e) {
  53.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  54.         }
  55.     }
  56.     #[Route('/secure/info'name'obtenerInfo'methods: ['GET'])]
  57.     public function obtenerInfo(
  58.         Security $security,
  59.         RegionRepository $regionRepository
  60.     ): JsonResponse
  61.     {
  62.         try {
  63.             $user $security->getUser();
  64.             if (!$user) {
  65.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  66.             }
  67.             if (!$user->isActivo()) {
  68.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  69.             }
  70.             $regiones = [];
  71.             if($user->isSuperAdmin()){
  72.                 $regiones $regionRepository->findAll();
  73.             } else  {
  74.                 $regiones $user->getRegiones();
  75.             }
  76.             $regionesLabel = [];
  77.             foreach($regiones as $regionOb){
  78.                 $regionesLabel[] = $regionOb->getNombre();
  79.             }
  80.             return $this->json([
  81.                 'roles' => $user->getRoles(),
  82.                 'regiones' => $regionesLabel,
  83.                 'maxFileSize' => $_ENV['MAX_FILE_SIZE'] ?? 10,
  84.                 'allowedExtensions' => explode(','$_ENV['ALLOWED_EXTENSIONS'] ?? '')
  85.             ]);
  86.         } catch (\Exception $e) {
  87.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  88.         }
  89.     }
  90.     #[Route('/secure/convocatorias'name'obtenerTodasConvocatorias'methods: ['GET'])]
  91.     public function obtenerTodasConvocatorias(
  92.         PcConvocatoriasRepository $pcConvocatoriaRepository,
  93.         Security $security
  94.     ): JsonResponse
  95.     {
  96.         try {
  97.             $user $security->getUser();
  98.             if (!$user) {
  99.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  100.             }
  101.             if (!$user->isActivo()) {
  102.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  103.             }
  104.             if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
  105.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  106.             }
  107.             $convocatorias $pcConvocatoriaRepository->findAll();
  108.             $data = [];
  109.             foreach ($convocatorias as $convocatoria) {
  110.                 $data[] = [
  111.                     'id' => $convocatoria->getId(),
  112.                     'nombre' => $convocatoria->getNombre(),
  113.                     'anio' => $convocatoria->getAnio(),
  114.                     'estado' => $convocatoria->getEstado(),
  115.                 ];
  116.             }
  117.             return $this->json($data);
  118.         } catch (\Exception $e) {
  119.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  120.         }
  121.     }
  122.     #[Route('/secure/convocatoria/{id}'name'obtenerConvocatoria'methods: ['GET'])]
  123.     public function obtenerConvocatoria(
  124.         $idPcConvocatoriasRepository $pcConvocatoriaRepository,
  125.         Security $security
  126.     ): JsonResponse
  127.     {
  128.         try {
  129.             $user $security->getUser();
  130.             if (!$user) {
  131.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  132.             }
  133.             if (!$user->isActivo()) {
  134.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  135.             }
  136.             if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
  137.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  138.             }
  139.             $convocatoria $pcConvocatoriaRepository->find($id);
  140.             if (!$convocatoria) {
  141.                 return new JsonResponse(['error' => 'Convocatoria no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  142.             }
  143.             $criterios = [];
  144.             $criteriosData $convocatoria->getCriterios();
  145.             foreach ($criteriosData as $criterioConvocatoria) {
  146.                 $criterios[] = [
  147.                     'id' => $criterioConvocatoria->getCriterios()->getId(),
  148.                     'peso' => $criterioConvocatoria->getPeso()
  149.                 ];
  150.             }
  151.             return $this->json([
  152.                 'id' => $convocatoria->getId(),
  153.                 'nombre' => $convocatoria->getNombre(),
  154.                 'descripcion' => $convocatoria->getDescripcion(),
  155.                 'anio' => $convocatoria->getAnio(),
  156.                 'bases' => $convocatoria->getBases(),
  157.                 'presupuesto' => $convocatoria->getPresupuesto(),
  158.                 'puntajeEvalCorte' => $convocatoria->getPuntajeEvalCorte(),
  159.                 'cuestionarios' => $convocatoria->getCuestionarios(),
  160.                 'documentos' => $convocatoria->getDocumentos(),
  161.                 'estado' => $convocatoria->getEstado(),
  162.                 'criterios' => $criterios,
  163.                 'apertura' => $convocatoria->getApertura(),
  164.             ]);
  165.         } catch (\Exception $e) {
  166.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  167.         }
  168.     }
  169.     #[Route('/secure/convocatoria'name'crearConvocatoria'methods: ['POST'])]
  170.     public function crearConvocatoria(
  171.         Request $request,
  172.         PcConvocatoriasRepository $pcConvocatoriaRepository,
  173.         PcCriteriosRepository $pcCriteriosRepository,
  174.         ValidatorInterface $validator,
  175.         ValidacionService $validacionService,
  176.         PcCriteriosConvocatoriasRepository $pcCriteriosConvocatoriasRepository,
  177.         Security $security
  178.     ): JsonResponse
  179.     {
  180.         try {
  181.             $user $security->getUser();
  182.             if (!$user) {
  183.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  184.             }
  185.             if (!$user->isActivo()) {
  186.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  187.             }
  188.             if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
  189.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  190.             }
  191.             $data json_decode($request->getContent(), true);
  192.             if (!$validacionService->validacionesOrNulo([
  193.                 $data['nombre'],
  194.                 $data['descripcion']
  195.             ], 'string')) {
  196.                 return new JsonResponse(['error' => 'Los campos de nombre, descripcion, estado  deben ser texto'], JsonResponse::HTTP_BAD_REQUEST);
  197.             }
  198.             if (!$validacionService->validacionesOrNulo([
  199.                 $data['apertura']
  200.             ], 'boolean')) {
  201.                 return new JsonResponse(['error' => 'Apertura  debe ser boolean'], JsonResponse::HTTP_BAD_REQUEST);
  202.             }
  203.             if (!$validacionService->validacionesOrNulo([
  204.                 $data['presupuesto'],
  205.                 $data['anio'],
  206.                 $data['puntajeEvalCorte']
  207.             ], 'integer')) {
  208.                 return new JsonResponse(['error' => 'Los campos presupuesto, anio y puntajeEvalCorte debe ser numerico'], JsonResponse::HTTP_BAD_REQUEST);
  209.             }
  210.             if (!$validacionService->validacionesOrNulo([
  211.                 $data['bases'],
  212.                 $data['cuestionarios'],
  213.                 $data['documentos']
  214.             ], 'array')) {
  215.                 return new JsonResponse(['error' => 'Los campos de bases, cuestionarios y documentos deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
  216.             }
  217.             $convocatoria = new PcConvocatorias();
  218.             $convocatoria->setNombre($data['nombre']);
  219.             $convocatoria->setDescripcion($data['descripcion']);
  220.             $convocatoria->setAnio((string) $data['anio']);
  221.             $convocatoria->setBases($data['bases']);
  222.             $convocatoria->setPresupuesto($data['presupuesto']);
  223.             $convocatoria->setPuntajeEvalCorte($data['puntajeEvalCorte']);
  224.             $convocatoria->setCuestionarios($data['cuestionarios']);
  225.             $convocatoria->setDocumentos($data['documentos']);
  226.             $convocatoria->setApertura($data['apertura']);
  227.             if($data['apertura']){
  228.                 $convocatoria->setEstado('1');
  229.             }
  230.             // Validar con Symfony Validator
  231.             $errors $validator->validate($convocatoria);
  232.             if (count($errors) > 0) {
  233.                 $errorMessages = [];
  234.                 foreach ($errors as $error) {
  235.                     $errorMessages[] = $error->getMessage();
  236.                 }
  237.                 return new JsonResponse(['error' => $errorMessages], JsonResponse::HTTP_BAD_REQUEST);
  238.             }
  239.             $pcConvocatoriaRepository->save($convocatoriatrue);
  240.             if (isset($data['criterios'])) {
  241.                 foreach ($data['criterios'] as $criterioData) {
  242.                     // Buscar el criterio por ID
  243.                     $criterio $pcCriteriosRepository->find($criterioData['id']);
  244.                     if ($criterio) {
  245.                         // Crear la relación entre la convocatoria y el criterio
  246.                         $criteriosConvocatoria = new PcCriteriosConvocatorias();
  247.                         $criteriosConvocatoria->setConvocatorias($convocatoria);
  248.                         $criteriosConvocatoria->setCriterios($criterio);
  249.                         $criteriosConvocatoria->setPeso($criterioData['peso']); // Asignar el peso
  250.                         // Usar el repository para guardar la relación
  251.                         $pcCriteriosConvocatoriasRepository->save($criteriosConvocatoriatrue);
  252.                     }
  253.                 }
  254.             }
  255.             $convocatoriaObj = [
  256.                 'id' => $convocatoria->getId(),
  257.                 'nombre' => $convocatoria->getNombre(),
  258.                 'descripcion' => $convocatoria->getDescripcion(),
  259.                 'anio' => $convocatoria->getAnio(),
  260.                 'bases' => $convocatoria->getBases(),
  261.                 'presupuesto' => $convocatoria->getPresupuesto(),
  262.                 'puntajeEvalCorte' => $convocatoria->getPuntajeEvalCorte(),
  263.                 'cuestionarios' => $convocatoria->getCuestionarios(),
  264.                 'documentos' => $convocatoria->getDocumentos(),
  265.                 'estado' => $convocatoria->getEstado(),
  266.                 'criterios' => $data['criterios'],
  267.                 'apertura' => $convocatoria->getApertura(),
  268.             ];
  269.             return new JsonResponse(['message' => 'Convocatoria creada con éxito''convocatoria' => $convocatoriaObj ], JsonResponse::HTTP_CREATED);
  270.         } catch (\Exception $e) {
  271.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  272.         }
  273.     }
  274.     #[Route('/secure/convocatoria/{id}'name'actualizarConvocatoria'methods: ['PUT'])]
  275.     public function actualizarConvocatoria(
  276.         $id,
  277.         Request $request,
  278.         PcConvocatoriasRepository $pcConvocatoriaRepository,
  279.         PcCriteriosRepository $pcCriteriosRepository,
  280.         ValidatorInterface $validator,
  281.         ValidacionService $validacionService,
  282.         PcCriteriosConvocatoriasRepository $pcCriteriosConvocatoriasRepository,
  283.         Security $security
  284.     ): JsonResponse
  285.     {
  286.         try {
  287.             $user $security->getUser();
  288.             if (!$user) {
  289.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  290.             }
  291.             if (!$user->isActivo()) {
  292.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  293.             }
  294.             if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
  295.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  296.             }
  297.             $convocatoria $pcConvocatoriaRepository->find($id);
  298.             if (!$convocatoria) {
  299.                 return new JsonResponse(['error' => 'Convocatoria no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  300.             }
  301.             $data json_decode($request->getContent(), true);
  302.             if (!$validacionService->validacionesOrNulo([
  303.                 $data['nombre'],
  304.                 $data['descripcion'],
  305.                 $data['estado']
  306.             ], 'string')) {
  307.                 return new JsonResponse(['error' => 'Los campos de nombre, descripcion, estado  deben ser texto'], JsonResponse::HTTP_BAD_REQUEST);
  308.             }
  309.             if (!$validacionService->validacionesOrNulo([
  310.                 $data['apertura']
  311.             ], 'boolean')) {
  312.                 return new JsonResponse(['error' => 'Apertura  debe ser boolean'], JsonResponse::HTTP_BAD_REQUEST);
  313.             }
  314.             if (!$validacionService->validacionesOrNulo([
  315.                 $data['presupuesto'],
  316.                 $data['anio'],
  317.                 $data['puntajeEvalCorte']
  318.             ], 'integer')) {
  319.                 return new JsonResponse(['error' => 'Los campos presupuesto, anio y puntajeEvalCorte debe ser numerico'], JsonResponse::HTTP_BAD_REQUEST);
  320.             }
  321.             if (!$validacionService->validacionesOrNulo([
  322.                 $data['bases'],
  323.                 $data['cuestionarios'],
  324.                 $data['documentos']
  325.             ], 'array')) {
  326.                 return new JsonResponse(['error' => 'Los campos de bases, cuestionarios y documentos deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
  327.             }
  328.             $aperturaExistente $convocatoria->getApertura();
  329.             if($aperturaExistente){
  330.                 if(empty($data['estado'])){
  331.                     return new JsonResponse(['error' => 'Estado no puede ser nulo porque la convocatoria ya esta aperturada'], JsonResponse::HTTP_BAD_REQUEST);
  332.                 }
  333.                 $convocatoria->setEstado($data['estado']);
  334.             } else {
  335.                 $convocatoria->setNombre($data['nombre']);
  336.                 $convocatoria->setDescripcion($data['descripcion']);
  337.                 $convocatoria->setAnio((string) $data['anio']);
  338.                 $convocatoria->setBases($data['bases']);
  339.                 $convocatoria->setPresupuesto($data['presupuesto']);
  340.                 $convocatoria->setPuntajeEvalCorte($data['puntajeEvalCorte']);
  341.                 $convocatoria->setCuestionarios($data['cuestionarios']);
  342.                 $convocatoria->setDocumentos($data['documentos']);
  343.                 $convocatoria->setApertura($data['apertura']);
  344.                 if($data['apertura']){
  345.                     $convocatoria->setEstado('1');
  346.                 }
  347.             }
  348.                 // Validar con Symfony Validator
  349.                 $errors $validator->validate($convocatoria);
  350.                 if (count($errors) > 0) {
  351.                     $errorMessages = [];
  352.                     foreach ($errors as $error) {
  353.                         $errorMessages[] = $error->getMessage();
  354.                     }
  355.                     return new JsonResponse(['error' => $errorMessages], JsonResponse::HTTP_BAD_REQUEST);
  356.                 }
  357.             $pcConvocatoriaRepository->save($convocatoriatrue);
  358.             if (!$aperturaExistente && isset($data['criterios'])) {
  359.                 // Eliminar los criterios actuales
  360.                 foreach ($convocatoria->getCriterios() as $criterioConvocatoria) {
  361.                     $pcCriteriosConvocatoriasRepository->remove($criterioConvocatoriatrue);
  362.                 }
  363.                 // Agregar los nuevos criterios
  364.                 foreach ($data['criterios'] as $criterioData) {
  365.                     // Buscar el criterio por ID
  366.                     $criterio $pcCriteriosRepository->find($criterioData['id']);
  367.                     if ($criterio) {
  368.                         // Verificar si el criterio ya está asociado a la convocatoria
  369.                         $criteriosConvocatoria = new PcCriteriosConvocatorias();
  370.                         $criteriosConvocatoria->setConvocatorias($convocatoria);
  371.                         $criteriosConvocatoria->setCriterios($criterio);
  372.                         $criteriosConvocatoria->setPeso($criterioData['peso']); // Asignar el peso
  373.                         // Usar el repository para guardar la relación
  374.                         $pcCriteriosConvocatoriasRepository->save($criteriosConvocatoriatrue);
  375.                     }
  376.                 }
  377.             }
  378.             $convocatoriaObj = [
  379.                 'id' => $convocatoria->getId(),
  380.                 'nombre' => $convocatoria->getNombre(),
  381.                 'descripcion' => $convocatoria->getDescripcion(),
  382.                 'anio' => $convocatoria->getAnio(),
  383.                 'bases' => $convocatoria->getBases(),
  384.                 'presupuesto' => $convocatoria->getPresupuesto(),
  385.                 'puntajeEvalCorte' => $convocatoria->getPuntajeEvalCorte(),
  386.                 'cuestionarios' => $convocatoria->getCuestionarios(),
  387.                 'documentos' => $convocatoria->getDocumentos(),
  388.                 'estado' => $convocatoria->getEstado(),
  389.                 'criterios' => $data['criterios'],
  390.                 'apertura' => $convocatoria->getApertura(),
  391.             ];
  392.             return new JsonResponse(['message' => 'Convocatoria actualizada con éxito''convocatoria' => $convocatoriaObj]);
  393.         } catch (\Exception $e) {
  394.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  395.         }
  396.     }
  397.     #[Route('/secure/criterios'name'obtenerCriterios'methods: ['GET'])]
  398.     public function obtenerCriterios(
  399.         PcCriteriosRepository $pcCriteriosRepository,
  400.         Security $security
  401.     ): JsonResponse
  402.     {
  403.         try {
  404.             $user $security->getUser();
  405.             if (!$user) {
  406.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  407.             }
  408.             if (!$user->isActivo()) {
  409.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  410.             }
  411.             if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
  412.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  413.             }
  414.             $criterios $pcCriteriosRepository->findAll();
  415.             $data = [];
  416.             foreach ($criterios as $criterio) {
  417.                 $data[] = [
  418.                     'id' => $criterio->getId(),
  419.                     'nombre' => $criterio->getNombre(),
  420.                     'descripcion' => $criterio->getDescripcion(),
  421.                     'puntajes' => $criterio->getPuntajes(),
  422.                 ];
  423.             }
  424.             return $this->json($data);
  425.         } catch (\Exception $e) {
  426.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  427.         }
  428.     }
  429.     #[Route('/secure/criterio'name'crearCriterio'methods: ['POST'])]
  430.     public function crearCriterio(
  431.         Request $request,
  432.         PcConvocatoriasRepository $pcConvocatoriaRepository,
  433.         PcCriteriosRepository $pcCriteriosRepository,
  434.         ValidatorInterface $validator,
  435.         ValidacionService $validacionService,
  436.         PcCriteriosConvocatoriasRepository $pcCriteriosConvocatoriasRepository,
  437.         Security $security
  438.     ): JsonResponse
  439.     {
  440.         try {
  441.             $user $security->getUser();
  442.             if (!$user) {
  443.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  444.             }
  445.             if (!$user->isActivo()) {
  446.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  447.             }
  448.             if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
  449.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  450.             }
  451.             $data json_decode($request->getContent(), true);
  452.             if (!$validacionService->validacionesOrNulo([
  453.                 $data['nombre'],
  454.                 $data['descripcion'],
  455.             ], 'string')) {
  456.                 return new JsonResponse(['error' => 'Los campos de  nombre y descripción deben ser texto'], JsonResponse::HTTP_BAD_REQUEST);
  457.             }
  458.             if (!$validacionService->validacionesOrNulo([
  459.                 $data['puntajes'],
  460.             ], 'array')) {
  461.                 return new JsonResponse(['error' => 'Los campos de puntajes deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
  462.             }
  463.             $criterio = new PcCriterios();
  464.             $criterio->setNombre($data['nombre']);
  465.             $criterio->setDescripcion($data['descripcion']);
  466.             $criterio->setPuntajes($data['puntajes']);
  467.             // Validar con Symfony Validator
  468.             $errors $validator->validate($criterio);
  469.             if (count($errors) > 0) {
  470.                 $errorMessages = [];
  471.                 foreach ($errors as $error) {
  472.                     $errorMessages[] = $error->getMessage();
  473.                 }
  474.                 return new JsonResponse(['error' => $errorMessages], JsonResponse::HTTP_BAD_REQUEST);
  475.             }
  476.             $pcCriteriosRepository->save($criteriotrue);
  477.             $criterioObj = [
  478.                 'id' => $criterio->getId(),
  479.                 'nombre' => $criterio->getNombre(),
  480.                 'descripcion' => $criterio->getDescripcion(),
  481.                 'puntajes' => $criterio->getPuntajes(),
  482.             ];
  483.             return new JsonResponse(['message' => 'Criterio creado con éxito''criterio' => $criterioObj ], JsonResponse::HTTP_CREATED);
  484.         } catch (\Exception $e) {
  485.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  486.         }
  487.     }
  488.     #[Route('/secure/criterio/{id}'name'editarCriterio'methods: ['PUT'])]
  489.     public function editarCriterio(
  490.         $id,
  491.         Request $request,
  492.         PcConvocatoriasRepository $pcConvocatoriaRepository,
  493.         PcCriteriosRepository $pcCriteriosRepository,
  494.         ValidatorInterface $validator,
  495.         ValidacionService $validacionService,
  496.         PcCriteriosConvocatoriasRepository $pcCriteriosConvocatoriasRepository,
  497.         Security $security
  498.     ): JsonResponse
  499.     {
  500.         try {
  501.             $user $security->getUser();
  502.             if (!$user) {
  503.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  504.             }
  505.             if (!$user->isActivo()) {
  506.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  507.             }
  508.             if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
  509.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  510.             }
  511.             $data json_decode($request->getContent(), true);
  512.             if (!$validacionService->validacionesOrNulo([
  513.                 $data['nombre'],
  514.                 $data['descripcion'],
  515.             ], 'string')) {
  516.                 return new JsonResponse(['error' => 'Los campos de  nombre y descripción deben ser texto'], JsonResponse::HTTP_BAD_REQUEST);
  517.             }
  518.             if (!$validacionService->validacionesOrNulo([
  519.                 $data['puntajes'],
  520.             ], 'array')) {
  521.                 return new JsonResponse(['error' => 'Los campos de puntajes deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
  522.             }
  523.             $criterio $pcCriteriosRepository->find($id);
  524.             if(!$criterio){
  525.                 return new JsonResponse(['error' => 'Criterio no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  526.             }
  527.             $criterio->setNombre($data['nombre']);
  528.             $criterio->setDescripcion($data['descripcion']);
  529.             $criterio->setPuntajes($data['puntajes']);
  530.             // Validar con Symfony Validator
  531.             $errors $validator->validate($criterio);
  532.             if (count($errors) > 0) {
  533.                 $errorMessages = [];
  534.                 foreach ($errors as $error) {
  535.                     $errorMessages[] = $error->getMessage();
  536.                 }
  537.                 return new JsonResponse(['error' => $errorMessages], JsonResponse::HTTP_BAD_REQUEST);
  538.             }
  539.             $pcCriteriosRepository->save($criteriotrue);
  540.             $criterioObj = [
  541.                 'id' => $criterio->getId(),
  542.                 'nombre' => $criterio->getNombre(),
  543.                 'descripcion' => $criterio->getDescripcion(),
  544.                 'puntajes' => $criterio->getPuntajes(),
  545.             ];
  546.             return new JsonResponse(['message' => 'Criterio actualizado con éxito''criterio' => $criterioObj ], JsonResponse::HTTP_CREATED);
  547.         } catch (\Exception $e) {
  548.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  549.         }
  550.     }
  551.     /**
  552.      * @Route("/secure/upload-file", name="uploadFile", methods={"POST"})
  553.      */
  554.     public function uploadFile(Request $request,
  555.         Security $security
  556.     ): JsonResponse
  557.     {
  558.         try {
  559.             $user $security->getUser();
  560.             if (!$user) {
  561.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  562.             }
  563.             if (!$user->isActivo()) {
  564.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  565.             }
  566.             if(
  567.             !$this->isGranted('ROLE_SUPER_ADMIN') &&
  568.             !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
  569.             !$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
  570.             !$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
  571.             !$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
  572.             !$this->isGranted('ROLE_PU_EVALUADOR_ADM')
  573.             ){
  574.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  575.             }
  576.             $file $request->files->get('file');
  577.             if (!$file) {
  578.                 return new JsonResponse(['error' => 'No hay documento'], 400);
  579.             }
  580.             try {
  581.                 $originalName $file->getClientOriginalName();
  582.                 $newFilename str_replace(' ''_'$originalName) . '-' uniqid() . '.' $file->guessExtension();
  583.                 $projectRoot $this->getParameter('kernel.project_dir');
  584.                 $dirToMove $projectRoot '/public/documentos/subidas';
  585.                 if (!is_dir($dirToMove)) {
  586.                     mkdir($dirToMove0777true);
  587.                 }
  588.                 $file->move($dirToMove$newFilename);
  589.                 return new JsonResponse([
  590.                     'message' => 'Documento subido con exito',
  591.                     'original_name' => $originalName,
  592.                     'new_filename' => $newFilename,
  593.                     'path' => '/documentos/subidas/' $newFilename,
  594.                 ], 200);
  595.             } catch (FileException $e) {
  596.                 return new JsonResponse(['error' => 'Falla al subir archivo: ' $e->getMessage()], 500);
  597.             }
  598.         } catch (\Exception $e) {
  599.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  600.         }
  601.     }
  602.     /**
  603.      * @Route("/secure/download-file/{filename}", name="downloadFile", methods={"GET"})
  604.      */
  605.     public function downloadFile(
  606.         string $filename,
  607.         Security $security
  608.         ): Response
  609.     {
  610.         try {
  611.             $user $security->getUser();
  612.             if (!$user) {
  613.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  614.             }
  615.             if (!$user->isActivo()) {
  616.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  617.             }
  618.             if(
  619.             !$this->isGranted('ROLE_SUPER_ADMIN') &&
  620.             !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
  621.             !$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
  622.             !$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
  623.             !$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
  624.             !$this->isGranted('ROLE_PU_EVALUADOR_ADM')
  625.             ){
  626.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  627.             }
  628.             $projectRoot $this->getParameter('kernel.project_dir');
  629.             $filePath $projectRoot '/public/documentos/subidas/' $filename;
  630.             if (!file_exists($filePath)) {
  631.                 throw $this->createNotFoundException("Archivo no encontrado: $filename");
  632.             }
  633.             // Devolver el archivo como una respuesta
  634.             $response = new BinaryFileResponse($filePath);
  635.             $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT$filename);
  636.             return $response;
  637.         } catch (\Exception $e) {
  638.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  639.         }
  640.     }
  641.     #[Route('/secure/cargar'name'cargar'methods: ['POST'])]
  642.     public function cargarArchivos(
  643.         Request $request,
  644.         Security $security
  645.     ): JsonResponse
  646.     {
  647.         try {
  648.             $user $security->getUser();
  649.             if (!$user) {
  650.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  651.             }
  652.             if (!$user->isActivo()) {
  653.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  654.             }
  655.             if(
  656.             !$this->isGranted('ROLE_SUPER_ADMIN') &&
  657.             !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
  658.             !$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
  659.             !$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
  660.             !$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
  661.             !$this->isGranted('ROLE_PU_EVALUADOR_ADM')
  662.             ){
  663.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  664.             }
  665.             $file $request->files->get('file');
  666.             if (!$file) {
  667.                 return new JsonResponse(['error' => 'No hay documento'], 400);
  668.             }
  669.             // Obtener configuración desde .env
  670.             $maxFileSizeMB $_ENV['MAX_FILE_SIZE'] ?? 10;
  671.             $allowedExtensions explode(','$_ENV['ALLOWED_EXTENSIONS'] ?? '');
  672.             // Validar tamaño del archivo
  673.             $fileSizeMB $file->getSize() / (1024 1024); // Convertir a MB
  674.             if ($fileSizeMB $maxFileSizeMB) {
  675.                 return new JsonResponse(['error' => "El archivo supera el tamaño máximo permitido de {$maxFileSizeMB}MB"], 400);
  676.             }
  677.             // Validar extensión
  678.             $extension $file->guessExtension();
  679.             if (!in_array($extension$allowedExtensions)) {
  680.                 return new JsonResponse(['error' => "Extensión no permitida. Solo se aceptan: " implode(', '$allowedExtensions)], 400);
  681.             }
  682.             $postulacionId $request->request->get('postulacionId');
  683.             $puntoCulturaId $request->request->get('puntoCulturaId');
  684.             $convocatoriaId $request->request->get('convocatoriaId');
  685.             $tipoDocumento '';
  686.             if(!empty($postulacionId)){
  687.                 $tipoDocumento="/pcpostulaciones/postulacion_" $postulacionId;
  688.             } else if (!empty($puntoCulturaId)){
  689.                 $tipoDocumento="/puntoscultura/puntocultura_" $puntoCulturaId;
  690.             } else if (!empty($convocatoriaId)) {
  691.                 $tipoDocumento="/pcconvocatorias/convocatoria_" $convocatoriaId;
  692.             } else {
  693.                 return new JsonResponse(['error' => 'postulacionId, puntoCulturaId o convocatoriaId requerido'], 400);
  694.             }
  695.             try {
  696.                 $originalName $file->getClientOriginalName();
  697.                 $newFilename str_replace(' ''_'$originalName) . '-' uniqid() . '.' $file->guessExtension();
  698.                 $projectRoot $this->getParameter('kernel.project_dir');
  699.                 $dirToMove $projectRoot '/public/documentos' $tipoDocumento;
  700.                 if (!is_dir($dirToMove)) {
  701.                     mkdir($dirToMove0777true);
  702.                 }
  703.                 $file->move($dirToMove$newFilename);
  704.                 return new JsonResponse([
  705.                     'message' => 'Documento subido con exito',
  706.                     'original_name' => $originalName,
  707.                     'new_filename' => $newFilename,
  708.                     'path' => '/documentos' $tipoDocumento '/' $newFilename,
  709.                 ], 200);
  710.             } catch (FileException $e) {
  711.                 return new JsonResponse(['error' => 'Falla al subir archivo: ' $e->getMessage()], 500);
  712.             }
  713.         } catch (\Exception $e) {
  714.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  715.         }
  716.     }
  717.     #[Route('/secure/descargas'name'descargas'methods: ['POST'])]
  718.     public function descargas(
  719.         Request $request,
  720.         PcPostulacionRepository $pcPostulacionRepository,
  721.         ValidacionService $validacionService,
  722.         Security $security
  723.     ): Response
  724.     {
  725.         try {
  726.             //POSTULACION
  727.             //PUNTO CULTURA
  728.             //CONVOCATORIA
  729.             //POSTULACION PUNTO CULTURA
  730.             $user $security->getUser();
  731.             if (!$user) {
  732.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  733.             }
  734.             if (!$user->isActivo()) {
  735.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  736.             }
  737.             if(
  738.             !$this->isGranted('ROLE_SUPER_ADMIN') &&
  739.             !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
  740.             !$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
  741.             !$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
  742.             !$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
  743.             !$this->isGranted('ROLE_PU_EVALUADOR_ADM')
  744.             ){
  745.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  746.             }
  747.             $data json_decode($request->getContent(), true);
  748.             $path $data['path'];
  749.             if(empty($path)){
  750.                 return new JsonResponse(['error' => 'Falta enviar path'],
  751.                     JsonResponse::HTTP_BAD_REQUEST);
  752.             }
  753.             // $rutaAlArchivo = explode("/", $path);
  754.             $projectRoot $this->getParameter('kernel.project_dir');
  755.             $filePath $projectRoot '/public' $path;
  756.             if (!file_exists($filePath)) {
  757.                 throw $this->createNotFoundException("Archivo no encontrado");
  758.             }
  759.             $rutasArchivo explode("/"$path);
  760.             $filename $rutasArchivo[count($rutasArchivo)-1];
  761.             // Devolver el archivo como una respuesta
  762.             $response = new BinaryFileResponse($filePath);
  763.             $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT$filename);
  764.             return $response;
  765.         } catch (\Exception $e) {
  766.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  767.         }
  768.     }
  769.     #[Route('/secure/postulacion/{id}'name'obtenerPostulacion'methods: ['GET'])]
  770.     public function obtenerPostulacion(
  771.         $idPcPostulacionRepository $pcPostulacionRepository,
  772.         Security $security
  773.     ): JsonResponse
  774.     {
  775.         try {
  776.             $user $security->getUser();
  777.             if (!$user) {
  778.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  779.             }
  780.             if (!$user->isActivo()) {
  781.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  782.             }
  783.             if(
  784.             !$this->isGranted('ROLE_SUPER_ADMIN') &&
  785.             !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
  786.             !$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
  787.             !$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
  788.             !$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
  789.             !$this->isGranted('ROLE_PU_EVALUADOR_ADM')
  790.             ){
  791.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  792.             }
  793.             $postulacion $pcPostulacionRepository->find($id);
  794.             if (!$postulacion) {
  795.                 return new JsonResponse(['error' => 'Postulacion no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  796.             }
  797.             $usuarioAdmisibilidad $postulacion->getUsuarioAdmisibilidad();
  798.             $usuarioEvaluacion $postulacion->getUsuarioEvaluacion();
  799.             $usuarioSeleccion $postulacion->getUsuarioSeleccion();
  800.             return $this->json([
  801.                 'id' => $postulacion->getId(),
  802.                 'montoRequerido' => $postulacion->getMontoRequerido(),
  803.                 'formularioPostulacion' => $postulacion->getFormularioPostulacion(),
  804.                 'documentosPostulacion' => $postulacion->getDocumentosPostulacion(),
  805.                 'certificadoPostulacion' => $postulacion->getCertificadoPostulacion(),
  806.                 'resultadoAdmisibilidad' => $postulacion->getResultadoAdmisibilidad(),
  807.                 'estadoAdmisibilidad' => $postulacion->getEstadoAdmisibilidad(),
  808.                 'formularioAdmisibilidad' => $postulacion->getFormularioAdmisibilidad(),
  809.                 'notaFinalEvaluacion' => $postulacion->getNotaFinalEvaluacion(),
  810.                 'formularioEvaluacion' => $postulacion->getFormularioEvaluacion(),
  811.                 'estadoEvaluacion' => $postulacion->getEstadoEvaluacion(),
  812.                 'formularioSeleccion' => $postulacion->getFormularioSeleccion(),
  813.                 'estadoSeleccion' => $postulacion->getEstadoSeleccion(),
  814.                 'formularioSeleccion' => $postulacion->getFormularioSeleccion(),
  815.                 'estado' => $postulacion->getEstado(),
  816.                 'resultadoSeleccion' => $postulacion->getResultadoSeleccion(),
  817.                 'montoAdjudicado' => $postulacion->getMontoAdjudicado(),
  818.                 'usuarioAdmisibilidad' => $usuarioAdmisibilidad $usuarioAdmisibilidad->getNombres() : null,
  819.                 'usuarioEvaluacion' => $usuarioEvaluacion $usuarioEvaluacion->getNombres() : null,
  820.                 'usuarioSeleccion' => $usuarioSeleccion $usuarioSeleccion->getNombres() : null,
  821.                 'admisibilidadAt' => $postulacion->getAdmisibilidadAt(),
  822.                 'evaluacionAt' => $postulacion->getEvaluacionAt(),
  823.                 'seleccionAt' => $postulacion->getSeleccionAt(),
  824.                 'anexos' => $postulacion->getDocumentos(),
  825.                 'convocatoriaId' => $postulacion->getConvocatoria()->getId(),
  826.                 'convocatoriaNombre' => $postulacion->getConvocatoria()->getNombre(),
  827.                 'puntoCulturaId' => $postulacion->getPuntoCultura()->getId(),
  828.                 'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
  829.                 'editarColectivo' => $postulacion->isEditableEvaluacion(),
  830.                 'editarSeleccion' => $postulacion->isEditableSeleccion(),
  831.             ]);
  832.         } catch (\Exception $e) {
  833.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  834.         }
  835.     }
  836.     #[Route('/secure/postulaciones'name'obtenerPostulaciones'methods: ['GET'])]
  837.     public function obtenerPostulaciones(
  838.         PcPostulacionRepository $pcPostulacionRepository,
  839.         Security $security
  840.     ): JsonResponse
  841.     {
  842.         try {
  843.             $user $security->getUser();
  844.             if (!$user) {
  845.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  846.             }
  847.             if (!$user->isActivo()) {
  848.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  849.             }
  850.             if(
  851.             !$this->isGranted('ROLE_SUPER_ADMIN') &&
  852.             !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
  853.             !$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
  854.             !$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
  855.             !$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
  856.             !$this->isGranted('ROLE_PU_EVALUADOR_ADM')
  857.             ){
  858.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  859.             }
  860.             $userActual $security->getUser();
  861.             $regiones $userActual->getRegiones();
  862.             $regionesLabel = [];
  863.             foreach($regiones as $regionOb){
  864.                 $regionesLabel[] = $regionOb->getNombre();
  865.             }
  866.             if (!$userActual) {
  867.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  868.             }
  869.             $postulaciones $pcPostulacionRepository->findByRegiones($regionesLabel$userActual->isSuperAdmin());
  870.             //Filtrar las que no tienen postulaciones
  871.             $postulacionesJson = [];
  872.             foreach ($postulaciones as $postulacion) {
  873.                 $convocatoria $postulacion->getConvocatoria();
  874.                 $puntoCultura $postulacion->getPuntoCultura();
  875.                 $postulacionesJson[] = [
  876.                     'id' => $postulacion->getId(),
  877.                     'nombreOrganizacion' => $puntoCultura->getNombre(),
  878.                     'rut' => $puntoCultura->getRut() . '-' $puntoCultura->getDv(),
  879.                     'region' => $puntoCultura->getRegion(),
  880.                     'convocatoria' => $convocatoria->getNombre(),
  881.                     'evaluacion' => $postulacion->getEtapaPostulacion(),
  882.                     'resultadoEvaluacion' => $postulacion->getResultadoPostulacion(),
  883.                     'notaFinal' =>
  884.                         $postulacion->getEstadoEvaluacion() == 'send'
  885.                         $postulacion->getNotaFinalEvaluacion()
  886.                         : null,
  887.                     'estadoConvocatoria' => $convocatoria->getEstado(),
  888.                     'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
  889.                     'editarColectivo' => $postulacion->isEditableEvaluacion(),
  890.                     'editarSeleccion' => $postulacion->isEditableSeleccion(),
  891.                 ];
  892.             }
  893.             return $this->json(['postulaciones' => $postulacionesJson]);
  894.         } catch (\Exception $e) {
  895.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  896.         }
  897.     }
  898.     #[Route('/secure/postulacion/{id}/admisibilidad'name'procesoAdmisibilidad'methods: ['PUT'])]
  899.     public function procesoAdmisibilidad(
  900.         $id,
  901.         Request $request,
  902.         PcPostulacionRepository $pcPostulacionRepository,
  903.         ValidacionService $validacionService,
  904.         Security $security
  905.     ): JsonResponse
  906.     {
  907.         try {
  908.             $user $security->getUser();
  909.             if (!$user) {
  910.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  911.             }
  912.             if (!$user->isActivo()) {
  913.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  914.             }
  915.             if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_EVALUADOR_ADM')) {
  916.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  917.             }
  918.             $postulacion $pcPostulacionRepository->findByIdAdmin($id);
  919.             if (!$postulacion) {
  920.                 return new JsonResponse(['error' => 'Postulacion no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  921.             }
  922.             if ($postulacion->getEstadoAdmisibilidad() == 'send') {
  923.                 return new JsonResponse(['error' => 'El formulario ya fue calificado'], JsonResponse::HTTP_BAD_REQUEST);
  924.             }
  925.             $usuarioAdmisibilidadActual $postulacion->getUsuarioAdmisibilidad();
  926.             if(!empty($usuarioAdmisibilidadActual) && $usuarioAdmisibilidadActual->getId() !== $user->getId()){
  927.                 return new JsonResponse(['error' => 'Usuario responsable es ' $usuarioAdmisibilidadActual->getNombres()],
  928.                     JsonResponse::HTTP_BAD_REQUEST);
  929.             }
  930.             $data json_decode($request->getContent(), true);
  931.             if (!$validacionService->validaciones([
  932.                 $data['formularioAdmisibilidad'],
  933.             ], 'array')) {
  934.                 return new JsonResponse(['error' => 'formularioAdmisibilidad deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
  935.             }
  936.             if (!empty($data['estado']) && ($data['estado'] !== 'save' && $data['estado'] !== 'send')) {
  937.                 return new JsonResponse(['error' => 'Solo se permite estado save y send'], JsonResponse::HTTP_BAD_REQUEST);
  938.             }
  939.             if($data['estado'] == 'send'){
  940.                 $respuesta $data['formularioAdmisibilidad']['1']['respuesta'];
  941.                 $postulacion->setResultadoAdmisibilidad($respuesta == 'Si');
  942.             }
  943.             $now = new DateTime();
  944.             $postulacion->setUsuarioAdmisibilidad($user);
  945.             $postulacion->setAdmisibilidadAt($now);
  946.             $postulacion->setFormularioAdmisibilidad($data['formularioAdmisibilidad']);
  947.             $postulacion->setEstadoAdmisibilidad($data['estado']);
  948.             $pcPostulacionRepository->save($postulaciontrue);
  949.             $postulacionObj = [
  950.                 'id' => $postulacion->getId(),
  951.                 'notaFinal' =>
  952.                     $postulacion->getEstadoEvaluacion() == 'send'
  953.                     $postulacion->getNotaFinalEvaluacion()
  954.                     : null,
  955.                 'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
  956.                 'editarColectivo' => $postulacion->isEditableEvaluacion(),
  957.                 'editarSeleccion' => $postulacion->isEditableSeleccion(),
  958.             ];
  959.             return new JsonResponse(['message' => 'Postulacion actualizada con éxito''postulacion' => $postulacionObj]);
  960.         } catch (\Exception $e) {
  961.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  962.         }
  963.     }
  964.     #[Route('/secure/postulacion/{id}/colectivo'name'procesoColectivo'methods: ['PUT'])]
  965.     public function procesoColectivo(
  966.         $id,
  967.         Request $request,
  968.         PcPostulacionRepository $pcPostulacionRepository,
  969.         ValidacionService $validacionService,
  970.         Security $security
  971.     ): JsonResponse
  972.     {
  973.         try {
  974.             $user $security->getUser();
  975.             if (!$user) {
  976.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  977.             }
  978.             if (!$user->isActivo()) {
  979.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  980.             }
  981.             if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_EVALUADOR_COL')) {
  982.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  983.             }
  984.             $postulacion $pcPostulacionRepository->findByIdAdmin($id);
  985.             if (!$postulacion) {
  986.                 return new JsonResponse(['error' => 'Postulacion no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  987.             }
  988.             if ($postulacion->getEstadoEvaluacion() == 'send') {
  989.                 return new JsonResponse(['error' => 'El formulario ya fue calificado'], JsonResponse::HTTP_BAD_REQUEST);
  990.             }
  991.             $usuarioEvaluacionActual $postulacion->getUsuarioEvaluacion();
  992.             if(!empty($usuarioEvaluacionActual) && $usuarioEvaluacionActual->getId() !== $user->getId()){
  993.                 return new JsonResponse(['error' => 'Usuario responsable es ' $usuarioEvaluacionActual->getNombres()],
  994.                     JsonResponse::HTTP_BAD_REQUEST);
  995.             }
  996.             $data json_decode($request->getContent(), true);
  997.             if (!$validacionService->validaciones([
  998.                 $data['formularioEvaluacion'],
  999.             ], 'array')) {
  1000.                 return new JsonResponse(['error' => 'formularioEvaluacion deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
  1001.             }
  1002.             if (!empty($data['estado']) && ($data['estado'] !== 'save' && $data['estado'] !== 'send')) {
  1003.                 return new JsonResponse(['error' => 'Solo se permite estado save y send'], JsonResponse::HTTP_BAD_REQUEST);
  1004.             }
  1005.             if($data['estado'] == 'send'){
  1006.                 $notaFinal 0;
  1007.                 $pesoTotal 0;
  1008.                 foreach($data['formularioEvaluacion'] as $criterio){
  1009.                     if($criterio['tipo'] == 'criterio'){
  1010.                         $pesoTotal $pesoTotal + (float) $criterio['peso'];
  1011.                         $notaFinal $notaFinal + ((float) $criterio['peso'] * (float) $criterio['valor']);
  1012.                     }
  1013.                 }
  1014.                 $notaFinal $notaFinal $pesoTotal;
  1015.                 $postulacion->setNotaFinalEvaluacion($notaFinal);
  1016.             }
  1017.             $now = new DateTime();
  1018.             $postulacion->setUsuarioEvaluacion($user);
  1019.             $postulacion->setEvaluacionAt($now);
  1020.             $postulacion->setFormularioEvaluacion($data['formularioEvaluacion']);
  1021.             $postulacion->setEstadoEvaluacion($data['estado']);
  1022.             $pcPostulacionRepository->save($postulaciontrue);
  1023.             $postulacionObj = [
  1024.                 'id' => $postulacion->getId(),
  1025.                 'notaFinal' =>
  1026.                     $postulacion->getEstadoEvaluacion() == 'send'
  1027.                     $postulacion->getNotaFinalEvaluacion()
  1028.                     : null,
  1029.                 'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
  1030.                 'editarColectivo' => $postulacion->isEditableEvaluacion(),
  1031.                 'editarSeleccion' => $postulacion->isEditableSeleccion(),
  1032.             ];
  1033.             return new JsonResponse(['message' => 'Postulacion actualizada con éxito''postulacion' => $postulacionObj]);
  1034.         } catch (\Exception $e) {
  1035.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  1036.         }
  1037.     }
  1038.     #[Route('/secure/postulacion/{id}/seleccion'name'procesoSeleccion'methods: ['PUT'])]
  1039.     public function procesoSeleccion(
  1040.         $id,
  1041.         Request $request,
  1042.         PcPostulacionRepository $pcPostulacionRepository,
  1043.         ValidacionService $validacionService,
  1044.         Security $security
  1045.     ): JsonResponse
  1046.     {
  1047.         try {
  1048.             $user $security->getUser();
  1049.             if (!$user) {
  1050.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  1051.             }
  1052.             if (!$user->isActivo()) {
  1053.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  1054.             }
  1055.             if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_EVALUADOR_SEL')) {
  1056.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  1057.             }
  1058.             $postulacion $pcPostulacionRepository->findByIdAdmin($id);
  1059.             if (!$postulacion) {
  1060.                 return new JsonResponse(['error' => 'Postulacion no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  1061.             }
  1062.             if ($postulacion->getEstadoSeleccion() == 'send') {
  1063.                 return new JsonResponse(['error' => 'El formulario ya fue calificado'], JsonResponse::HTTP_BAD_REQUEST);
  1064.             }
  1065.             $usuarioSeleccionActual $postulacion->getUsuarioSeleccion();
  1066.             if(!empty($usuarioSeleccionActual) && $usuarioSeleccionActual->getId() !== $user->getId()){
  1067.                 return new JsonResponse(['error' => 'Usuario responsable es ' $usuarioSeleccionActual->getNombres()],
  1068.                     JsonResponse::HTTP_BAD_REQUEST);
  1069.             }
  1070.             $data json_decode($request->getContent(), true);
  1071.             if (!$validacionService->validaciones([
  1072.                 $data['formularioSeleccion'],
  1073.             ], 'array')) {
  1074.                 return new JsonResponse(['error' => 'formularioSeleccion deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
  1075.             }
  1076.             if (!empty($data['estado']) && ($data['estado'] !== 'save' && $data['estado'] !== 'send')) {
  1077.                 return new JsonResponse(['error' => 'Solo se permite estado save y send'], JsonResponse::HTTP_BAD_REQUEST);
  1078.             }
  1079.             if($data['estado'] == 'send'){
  1080.                 $respuesta $data['formularioSeleccion']['1']['respuesta'];
  1081.                 $montoAdjudicado $data['formularioSeleccion']['2']['respuesta'];
  1082.                 $postulacion->setMontoAdjudicado((int) $montoAdjudicado);
  1083.                 $postulacion->setResultadoSeleccion($respuesta == 'Seleccionado');
  1084.             }
  1085.             $now = new DateTime();
  1086.             $postulacion->setUsuarioSeleccion($user);
  1087.             $postulacion->setSeleccionAt($now);
  1088.             $postulacion->setFormularioSeleccion($data['formularioSeleccion']);
  1089.             $postulacion->setEstadoSeleccion($data['estado']);
  1090.             $pcPostulacionRepository->save($postulaciontrue);
  1091.             $postulacionObj = [
  1092.                 'id' => $postulacion->getId(),
  1093.                 'notaFinal' =>
  1094.                     $postulacion->getEstadoEvaluacion() == 'send'
  1095.                     $postulacion->getNotaFinalEvaluacion()
  1096.                     : null,
  1097.                 'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
  1098.                 'editarColectivo' => $postulacion->isEditableEvaluacion(),
  1099.                 'editarSeleccion' => $postulacion->isEditableSeleccion(),
  1100.             ];
  1101.             return new JsonResponse(['message' => 'Postulacion actualizada con éxito''postulacion' => $postulacionObj]);
  1102.         } catch (\Exception $e) {
  1103.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  1104.         }
  1105.     }
  1106.     #[Route('/secure/puntocultura/{id}'name'obtenerPuntoCultura'methods: ['GET'])]
  1107.     public function obtenerPuntoCultura(
  1108.         $id,
  1109.         PcPuntoCulturaRepository $pcPuntoCulturaRepository,
  1110.         RacService $racService,
  1111.         Security $security
  1112.     ): JsonResponse
  1113.     {
  1114.         try {
  1115.             $user $security->getUser();
  1116.             if (!$user) {
  1117.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  1118.             }
  1119.             if (!$user->isActivo()) {
  1120.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  1121.             }
  1122.             if(
  1123.             !$this->isGranted('ROLE_SUPER_ADMIN') &&
  1124.             !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
  1125.             !$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
  1126.             !$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
  1127.             !$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
  1128.             !$this->isGranted('ROLE_PU_EVALUADOR_ADM')
  1129.             ){
  1130.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  1131.             }
  1132.             $punto $pcPuntoCulturaRepository->findActivo($id);
  1133.             if (!$punto) {
  1134.                 return new JsonResponse(['error' => 'Punto no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  1135.             }
  1136.             $rut $punto->getRut();
  1137.             $dv $punto->getDv();
  1138.             $userRut strval(number_format((int) $rut0'''.')) . '-' $dv;
  1139.             $organizaciones $racService->getRegisterRac($userRut);
  1140.             $organizacionId = (string) $punto->getOrganizacionComunitariaId();
  1141.             $rac null;
  1142.             //org_id
  1143.             foreach($organizaciones as $org){
  1144.                 if(empty($org['org_id'])) continue;
  1145.                 $org_id $org['org_id'];
  1146.                 if($organizacionId == $org_id){
  1147.                     $rac $org;
  1148.                 }
  1149.             }
  1150.             return $this->json([
  1151.                 'id' => $punto->getId(),
  1152.                 'nombre' => $punto->getNombre() ?? '',
  1153.                 'resenia' => $punto->getResenia() ?? '',
  1154.                 'region' => $punto->getRegion() ?? '',
  1155.                 'comuna' => $punto->getComuna() ?? '',
  1156.                 'direccion' => $punto->getDireccion() ?? '',
  1157.                 'georeferencia' => $punto->getGeoreferencia() ?? '',
  1158.                 'nombre_contacto' => $punto->getNombreContacto() ?? '',
  1159.                 'email_contacto' => $punto->getEmailContacto() ?? '',
  1160.                 'redes_sociales' => $punto->getRedesSociales(),
  1161.                 'certificado_punto' => $punto->getCertificadoPunto() ?? '',
  1162.                 'nombre_persona_juridica' => $punto->getNombrePersonaJuridica() ?? '',
  1163.                 'nombre_representante_legal' => $punto->getNombreRepresentanteLegal() ?? '',
  1164.                 'rut_persona_juridica' => $punto->getRutPersonaJuridica() ?? '',
  1165.                 'rut_representante_legal' => $punto->getRutRepresentanteLegal() ?? '',
  1166.                 'direccion_postal' => $punto->getDireccionPostal() ?? '',
  1167.                 'correo_electronico_1' => $punto->getCorreoElectronico1() ?? '',
  1168.                 'correo_electronico_2' => $punto->getCorreoElectronico2() ?? '',
  1169.                 'telefono_1' => $punto->getTelefono1() ?? '',
  1170.                 'telefono_2' => $punto->getTelefono2() ?? '',
  1171.                 'organizacion_comunitaria_id' => $punto->getOrganizacionComunitariaId(),
  1172.                 'doc_estatuto_organizacion' => $punto->getDocEstatutoOrganizacion(),
  1173.                 'doc_certificado_vigencia_persona_juridica' => $punto->getDocCertificadoVigenciaPersonaJuridica(),
  1174.                 'doc_acredita_personeria_vigente' => $punto->getDocAcreditaPersoneriaVigente(),
  1175.                 'doc_listado_personas'=> $punto->getDocListadoPersonas(),
  1176.                 'documentos' => $punto->getDocumentos(),
  1177.                 'rut' => $punto->getRut(),
  1178.                 'dv' => $punto->getDv(),
  1179.                 'rac' => $rac,
  1180.             ]);
  1181.         } catch (\Exception $e) {
  1182.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  1183.         }
  1184.     }
  1185.     #[Route('/secure/postulaciones/admisibilidad'name'obtenerPostulacionesAdmisibilidad'methods: ['GET'])]
  1186.     public function obtenerPostulacionesAdmisibilidad(
  1187.         PcPostulacionRepository $pcPostulacionRepository,
  1188.         Security $security
  1189.     ): JsonResponse
  1190.     {
  1191.         try {
  1192.             $user $security->getUser();
  1193.             if (!$user) {
  1194.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  1195.             }
  1196.             if (!$user->isActivo()) {
  1197.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  1198.             }
  1199.             if(
  1200.             !$this->isGranted('ROLE_SUPER_ADMIN') &&
  1201.             !$this->isGranted('ROLE_PU_EVALUADOR_ADM')
  1202.             ){
  1203.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  1204.             }
  1205.             $userActual $security->getUser();
  1206.             $regiones $userActual->getRegiones();
  1207.             $regionesLabel = [];
  1208.             foreach($regiones as $regionOb){
  1209.                 $regionesLabel[] = $regionOb->getNombre();
  1210.             }
  1211.             if (!$userActual) {
  1212.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  1213.             }
  1214.             $postulaciones $pcPostulacionRepository->findByRegionesAdmisibilidad($regionesLabel$userActual->isSuperAdmin());
  1215.             //Filtrar las que no tienen postulaciones
  1216.             $postulacionesJson = [];
  1217.             foreach ($postulaciones as $postulacion) {
  1218.                 $convocatoria $postulacion->getConvocatoria();
  1219.                 $puntoCultura $postulacion->getPuntoCultura();
  1220.                 $postulacionesJson[] = [
  1221.                     'id' => $postulacion->getId(),
  1222.                     'nombreOrganizacion' => $puntoCultura->getNombre(),
  1223.                     'rut' => $puntoCultura->getRut() . '-' $puntoCultura->getDv(),
  1224.                     'region' => $puntoCultura->getRegion(),
  1225.                     'convocatoria' => $convocatoria->getNombre(),
  1226.                     'notaFinal' =>
  1227.                         $postulacion->getEstadoEvaluacion() == 'send'
  1228.                         $postulacion->getNotaFinalEvaluacion()
  1229.                         : null,
  1230.                     'estadoConvocatoria' => $convocatoria->getEstado(),
  1231.                     'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
  1232.                     'editarColectivo' => $postulacion->isEditableEvaluacion(),
  1233.                     'editarSeleccion' => $postulacion->isEditableSeleccion(),
  1234.                     'evaluacion' => $postulacion->getEtapaPostulacion(),
  1235.                     'resultadoEvaluacion' => $postulacion->getResultadoPostulacion(),
  1236.                 ];
  1237.             }
  1238.             return $this->json(['postulaciones' => $postulacionesJson]);
  1239.         } catch (\Exception $e) {
  1240.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  1241.         }
  1242.     }
  1243.     #[Route('/secure/postulaciones/colectivo'name'obtenerPostulacionesColectivo'methods: ['GET'])]
  1244.     public function obtenerPostulacionesColectivo(
  1245.         PcPostulacionRepository $pcPostulacionRepository,
  1246.         Security $security
  1247.     ): JsonResponse
  1248.     {
  1249.         try {
  1250.             $user $security->getUser();
  1251.             if (!$user) {
  1252.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  1253.             }
  1254.             if (!$user->isActivo()) {
  1255.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  1256.             }
  1257.             if(
  1258.             !$this->isGranted('ROLE_SUPER_ADMIN') &&
  1259.             !$this->isGranted('ROLE_PU_EVALUADOR_ADM')
  1260.             ){
  1261.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  1262.             }
  1263.             $userActual $security->getUser();
  1264.             $regiones $userActual->getRegiones();
  1265.             $regionesLabel = [];
  1266.             foreach($regiones as $regionOb){
  1267.                 $regionesLabel[] = $regionOb->getNombre();
  1268.             }
  1269.             if (!$userActual) {
  1270.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  1271.             }
  1272.             $postulaciones $pcPostulacionRepository->findByRegionesEvaluacion($regionesLabel$userActual->isSuperAdmin());
  1273.             //Filtrar las que no tienen postulaciones
  1274.             $postulacionesJson = [];
  1275.             foreach ($postulaciones as $postulacion) {
  1276.                 $convocatoria $postulacion->getConvocatoria();
  1277.                 $puntoCultura $postulacion->getPuntoCultura();
  1278.                 $postulacionesJson[] = [
  1279.                     'id' => $postulacion->getId(),
  1280.                     'nombreOrganizacion' => $puntoCultura->getNombre(),
  1281.                     'rut' => $puntoCultura->getRut() . '-' $puntoCultura->getDv(),
  1282.                     'region' => $puntoCultura->getRegion(),
  1283.                     'convocatoria' => $convocatoria->getNombre(),
  1284.                     'evaluacion' => $postulacion->getEtapaPostulacion(),
  1285.                     'resultadoEvaluacion' => $postulacion->getResultadoPostulacion(),
  1286.                     'notaFinal' =>
  1287.                         $postulacion->getEstadoEvaluacion() == 'send'
  1288.                         $postulacion->getNotaFinalEvaluacion()
  1289.                         : null,
  1290.                     'estadoConvocatoria' => $convocatoria->getEstado(),
  1291.                     'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
  1292.                     'editarColectivo' => $postulacion->isEditableEvaluacion(),
  1293.                     'editarSeleccion' => $postulacion->isEditableSeleccion(),
  1294.                 ];
  1295.             }
  1296.             return $this->json(['postulaciones' => $postulacionesJson]);
  1297.         } catch (\Exception $e) {
  1298.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  1299.         }
  1300.     }
  1301.     #[Route('/secure/postulaciones/seleccion'name'obtenerPostulacionesSeleccion'methods: ['GET'])]
  1302.     public function obtenerPostulacionesSeleccion(
  1303.         PcPostulacionRepository $pcPostulacionRepository,
  1304.         Security $security
  1305.     ): JsonResponse
  1306.     {
  1307.         try {
  1308.             $user $security->getUser();
  1309.             if (!$user) {
  1310.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  1311.             }
  1312.             if (!$user->isActivo()) {
  1313.                 return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
  1314.             }
  1315.             if(
  1316.             !$this->isGranted('ROLE_SUPER_ADMIN') &&
  1317.             !$this->isGranted('ROLE_PU_EVALUADOR_ADM')
  1318.             ){
  1319.                 return new JsonResponse(['error' => 'Acceso denegado'], 403);
  1320.             }
  1321.             $userActual $security->getUser();
  1322.             $regiones $userActual->getRegiones();
  1323.             $regionesLabel = [];
  1324.             foreach($regiones as $regionOb){
  1325.                 $regionesLabel[] = $regionOb->getNombre();
  1326.             }
  1327.             if (!$userActual) {
  1328.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  1329.             }
  1330.             $postulaciones $pcPostulacionRepository->findByRegionesSeleccion($regionesLabel$userActual->isSuperAdmin());
  1331.             //Filtrar las que no tienen postulaciones
  1332.             $postulacionesJson = [];
  1333.             foreach ($postulaciones as $postulacion) {
  1334.                 $convocatoria $postulacion->getConvocatoria();
  1335.                 $puntoCultura $postulacion->getPuntoCultura();
  1336.                 $postulacionesJson[] = [
  1337.                     'id' => $postulacion->getId(),
  1338.                     'nombreOrganizacion' => $puntoCultura->getNombre(),
  1339.                     'rut' => $puntoCultura->getRut() . '-' $puntoCultura->getDv(),
  1340.                     'region' => $puntoCultura->getRegion(),
  1341.                     'convocatoria' => $convocatoria->getNombre(),
  1342.                     'evaluacion' => $postulacion->getEtapaPostulacion(),
  1343.                     'resultadoEvaluacion' => $postulacion->getResultadoPostulacion(),
  1344.                     'notaFinal' =>
  1345.                         $postulacion->getEstadoEvaluacion() == 'send'
  1346.                         $postulacion->getNotaFinalEvaluacion()
  1347.                         : null,
  1348.                     'estadoConvocatoria' => $convocatoria->getEstado(),
  1349.                     'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
  1350.                     'editarColectivo' => $postulacion->isEditableEvaluacion(),
  1351.                     'editarSeleccion' => $postulacion->isEditableSeleccion(),
  1352.                 ];
  1353.             }
  1354.             return $this->json(['postulaciones' => $postulacionesJson]);
  1355.         } catch (\Exception $e) {
  1356.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  1357.         }
  1358.     }
  1359. }