src/Controller/ApiPuntoCulturaController.php line 48

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\Repository\PcPuntoCulturaRepository;
  10. use App\Entity\PcConvocatorias;
  11. use App\Entity\PcCriterios;
  12. use App\Repository\PcCriteriosRepository;
  13. use App\Entity\PcCriteriosConvocatorias;
  14. use App\Repository\PcCriteriosConvocatoriasRepository;
  15. use App\Repository\RegionRepository;
  16. use App\Service\RegionComunaService;
  17. use App\Service\RacService;
  18. use App\Service\ValidacionService;
  19. use App\Entity\PcPostulacion;
  20. use App\Repository\PcPostulacionRepository;
  21. use App\Repository\PostulacionRepository;
  22. use App\Entity\Postulacion;
  23. use App\Entity\Region;
  24. use App\Entity\Comuna;
  25. use App\Repository\ComunaRepository;
  26. use Symfony\Component\HttpFoundation\Response;
  27. use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
  28. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  29. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  30. use Symfony\Component\Security\Core\Security;
  31. use Symfony\Component\Validator\Validator\ValidatorInterface;
  32. use DateTime;
  33. use DateTimeInterface;
  34. /**
  35.  * @Route("/api/pu", name="api_pu_")
  36.  */
  37. class ApiPuntoCulturaController extends AbstractController
  38. {
  39.     #[Route('/insecure/puntocultura'name'obtenerTodosPuntoCultura'methods: ['GET'])]
  40.     public function obtenerTodosPuntoCultura(
  41.         PcPuntoCulturaRepository $pcPuntoCulturaRepository
  42.     ): JsonResponse
  43.     {
  44.         try {
  45.             $puntos $pcPuntoCulturaRepository->findAllActivos();
  46.             $data = [];
  47.             $puntoxregion = [];
  48.             foreach ($puntos as $punto) {
  49.                 $region $punto->getRegion();
  50.                 $comuna $punto->getComuna();
  51.                 if(empty($puntoxregion[$region])) $puntoxregion[$region] = 0;
  52.                 $puntoxregion[$region] += 1;
  53.                 if(empty($data[$region])) $data[$region] = [];
  54.                 if(empty($data[$region][$comuna])) $data[$region][$comuna] = [];
  55.                 $data[$region][$comuna][] = [
  56.                     'id' => $punto->getId(),
  57.                     'nombre' => $punto->getNombre(),
  58.                 ];
  59.             }
  60.             return $this->json(['data' => $data'total' => $puntoxregion]);
  61.         } catch (\Exception $e) {
  62.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  63.         }
  64.     }
  65.     #[Route('/insecure/puntocultura/{id}'name'obtenerPuntoCulturaPublico'methods: ['GET'])]
  66.     public function obtenerPuntoCulturaPublico(
  67.         $idPcPuntoCulturaRepository $pcPuntoCulturaRepository
  68.     ): JsonResponse
  69.     {
  70.         try {
  71.             $punto $pcPuntoCulturaRepository->findActivo($id);
  72.             if (!$punto) {
  73.                 return new JsonResponse(['error' => 'Punto no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  74.             }
  75.             return $this->json([
  76.                 'id' => $punto->getId(),
  77.                 'nombre' => $punto->getNombre() ?? '',
  78.                 'resenia' => $punto->getResenia() ?? '',
  79.                 'region' => $punto->getRegion() ?? '',
  80.                 'comuna' => $punto->getComuna() ?? '',
  81.                 'direccion' => $punto->getDireccion() ?? '',
  82.                 'georeferencia' => $punto->getGeoreferencia(),
  83.                 'nombre_contacto' => $punto->getNombreContacto() ?? '',
  84.                 'email_contacto' => $punto->getEmailContacto() ?? '',
  85.                 'redes_sociales' => $punto->getRedesSociales(),
  86.                 'certificado_punto' => $punto->getCertificadoPunto() ?? '',
  87.                 // 'nombre_persona_juridica' => $punto->getNombrePersonaJuridica(),
  88.                 // 'nombre_representante_legal' => $punto->getNombreRepresentanteLegal(),
  89.                 // 'rut_persona_juridica' => $punto->getRutPersonaJuridica(),
  90.                 // 'rut_representante_legal' => $punto->getRutRepresentanteLegal(),
  91.                 // 'direccion_postal' => $punto->getDireccionPostal(),
  92.                 // 'correo_electronico_1' => $punto->getCorreoElectronico1(),
  93.                 // 'correo_electronico_2' => $punto->getCorreoElectronico2(),
  94.                 // 'telefono_1' => $punto->getTelefono1(),
  95.                 // 'telefono_2' => $punto->getTelefono2(),
  96.                 // 'organizacion_comunitaria_id' => $punto->getOrganizacionComunitariaId(),
  97.                 // 'doc_estatuto_organizacion' => $punto->getDocEstatutoOrganizacion(),
  98.                 // 'doc_certificado_vigencia_persona_juridica' => $punto->getDocCertificadoVigenciaPersonaJuridica(),
  99.                 // 'doc_acredita_personeria_vigente' => $punto->getDocAcreditaPersoneriaVigente(),
  100.                 // 'doc_listado_personas'=> $punto->getDocListadoPersonas(),
  101.                 // 'documentos' => $punto->getDocumentos(),
  102.                 'rut' => $punto->getRut(),
  103.                 'dv' => $punto->getDv(),
  104.             ]);
  105.         } catch (\Exception $e) {
  106.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  107.         }
  108.     }
  109.     #[Route('/secure/puntocultura/{id}'name'obtenerPuntoCulturaPrivado'methods: ['GET'])]
  110.     public function obtenerPuntoCulturaPrivado(
  111.         $id,
  112.         PcPuntoCulturaRepository $pcPuntoCulturaRepository,
  113.         RacService $racService,
  114.         Security $security
  115.     ): JsonResponse
  116.     {
  117.         try {
  118.             $user $security->getUser();
  119.             if (!$user) {
  120.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  121.             }
  122.             $rut $user->getRut();
  123.             $dv $user->getDv();
  124.             $userRut strval(number_format((int) $rut0'''.')) . '-' $dv;
  125.             $punto $pcPuntoCulturaRepository->findByIdAndRut($id$rut$dv);
  126.             if (!$punto) {
  127.                 return new JsonResponse(['error' => 'Punto no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  128.             }
  129.             $organizaciones $racService->getRegisterRac($userRut);
  130.             $organizacionId = (string) $punto->getOrganizacionComunitariaId();
  131.             $rac null;
  132.             foreach($organizaciones as $org){
  133.                 if(empty($org['org_id'])) continue;
  134.                 $org_id $org['org_id'];
  135.                 if($organizacionId == $org_id){
  136.                     $rac $org;
  137.                 }
  138.             }
  139.             return $this->json([
  140.                 'id' => $punto->getId(),
  141.                 'nombre' => $punto->getNombre() ?? '',
  142.                 'resenia' => $punto->getResenia() ?? '',
  143.                 'region' => $punto->getRegion() ?? '',
  144.                 'comuna' => $punto->getComuna() ?? '',
  145.                 'direccion' => $punto->getDireccion() ?? '',
  146.                 'georeferencia' => $punto->getGeoreferencia() ?? '',
  147.                 'nombre_contacto' => $punto->getNombreContacto() ?? '',
  148.                 'email_contacto' => $punto->getEmailContacto() ?? '',
  149.                 'redes_sociales' => $punto->getRedesSociales(),
  150.                 'certificado_punto' => $punto->getCertificadoPunto() ?? '',
  151.                 'nombre_persona_juridica' => $punto->getNombrePersonaJuridica() ?? '',
  152.                 'nombre_representante_legal' => $punto->getNombreRepresentanteLegal() ?? '',
  153.                 'rut_persona_juridica' => $punto->getRutPersonaJuridica() ?? '',
  154.                 'rut_representante_legal' => $punto->getRutRepresentanteLegal() ?? '',
  155.                 'direccion_postal' => $punto->getDireccionPostal() ?? '',
  156.                 'correo_electronico_1' => $punto->getCorreoElectronico1() ?? '',
  157.                 'correo_electronico_2' => $punto->getCorreoElectronico2() ?? '',
  158.                 'telefono_1' => $punto->getTelefono1() ?? '',
  159.                 'telefono_2' => $punto->getTelefono2() ?? '',
  160.                 'organizacion_comunitaria_id' => $punto->getOrganizacionComunitariaId(),
  161.                 'doc_estatuto_organizacion' => $punto->getDocEstatutoOrganizacion(),
  162.                 'doc_certificado_vigencia_persona_juridica' => $punto->getDocCertificadoVigenciaPersonaJuridica(),
  163.                 'doc_acredita_personeria_vigente' => $punto->getDocAcreditaPersoneriaVigente(),
  164.                 'doc_listado_personas'=> $punto->getDocListadoPersonas(),
  165.                 'documentos' => $punto->getDocumentos(),
  166.                 'rut' => $punto->getRut(),
  167.                 'dv' => $punto->getDv(),
  168.                 'rac' => $rac,
  169.             ]);
  170.         } catch (\Exception $e) {
  171.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  172.         }
  173.     }
  174.     #[Route('/secure/puntocultura/{id}'name'actualizarPuntoCultura'methods: ['PUT'])]
  175.     public function actualizarPuntoCultura(
  176.         $id,
  177.         Request $request,
  178.         PcPuntoCulturaRepository $pcPuntoCulturaRepository,
  179.         Security $security,
  180.         ValidatorInterface $validator,
  181.         ValidacionService $validacionService
  182.     ): JsonResponse
  183.     {
  184.         try {
  185.             $user $security->getUser();
  186.             if (!$user) {
  187.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  188.             }
  189.             $rut $user->getRut();
  190.             $dv $user->getDv();
  191.             $punto $pcPuntoCulturaRepository->findByIdAndRut($id$rut$dv);;
  192.             if (!$punto) {
  193.                 return new JsonResponse(['error' => 'Punto cultura no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  194.             }
  195.             $data json_decode($request->getContent(), true);
  196.             // Validacion
  197.             if (!$validacionService->validacionesOrNulo([
  198.                 $data['nombre'],
  199.                 $data['resenia'],
  200.                 $data['region'],
  201.                 $data['comuna'],
  202.                 $data['direccion'],
  203.                 $data['georeferencia'],
  204.                 $data['nombre_contacto'],
  205.                 $data['email_contacto'],
  206.                 $data['certificado_punto'],
  207.                 $data['nombre_persona_juridica'],
  208.                 $data['nombre_representante_legal'],
  209.                 $data['rut_persona_juridica'],
  210.                 $data['rut_representante_legal'],
  211.                 $data['direccion_postal'],
  212.                 $data['correo_electronico_1'],
  213.                 $data['correo_electronico_2'],
  214.                 $data['telefono_1'],
  215.                 $data['telefono_2']
  216.             ], 'string')) {
  217.                 return new JsonResponse(['error' => 'Los campos de nombre, reseña, region, comuna, georeferencia, nombre_contacto, email_contacto, certificado_punto, nombre_persona_juridica, nombre_representante_legal, rut_persona_juridica, rut_representante_legal, direccion_postal, correo_electronico_1,  correo_electronico_2, telefono_1, telefono_2 y dirección deben ser texto'], JsonResponse::HTTP_BAD_REQUEST);
  218.             }
  219.             if (!$validacionService->validacionesOrNulo([
  220.                 $data['organizacion_comunitaria_id']
  221.             ], 'integer')) {
  222.                 return new JsonResponse(['error' => 'Los campos organizacion_comunitaria_id debe ser numerico'], JsonResponse::HTTP_BAD_REQUEST);
  223.             }
  224.             if (!$validacionService->validacionesOrNulo([
  225.                 $data['redes_sociales'],
  226.                 $data['doc_estatuto_organizacion'],
  227.                 $data['doc_certificado_vigencia_persona_juridica'],
  228.                 $data['doc_acredita_personeria_vigente'],
  229.                 $data['doc_listado_personas'],
  230.                 $data['documentos']
  231.             ], 'array')) {
  232.                 return new JsonResponse(['error' => 'Los campos de redes_sociales, doc_estatuto_organizacion,  doc_certificado_vigencia_persona_juridica, doc_acredita_personeria_vigente, doc_listado_personas y documentos deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
  233.             }
  234.             $punto->setNombre($data['nombre']);
  235.             $punto->setResenia($data['resenia']);
  236.             $punto->setRegion($data['region']);
  237.             $punto->setComuna($data['comuna']);
  238.             $punto->setDireccion($data['direccion']);
  239.             $punto->setGeoreferencia($data['georeferencia']);
  240.             $punto->setNombreContacto($data['nombre_contacto']);
  241.             $punto->setEmailContacto($data['email_contacto']);
  242.             $punto->setRedesSociales($data['redes_sociales']);
  243.             $punto->setCertificadoPunto($data['certificado_punto']);
  244.             $punto->setNombrePersonaJuridica($data['nombre_persona_juridica']);
  245.             $punto->setNombreRepresentanteLegal($data['nombre_representante_legal']);
  246.             $punto->setRutPersonaJuridica($data['rut_persona_juridica']);
  247.             $punto->setRutRepresentanteLegal($data['rut_representante_legal']);
  248.             $punto->setDireccionPostal($data['direccion_postal']);
  249.             $punto->setCorreoElectronico1($data['correo_electronico_1']);
  250.             $punto->setCorreoElectronico2($data['correo_electronico_2']);
  251.             $punto->setTelefono1($data['telefono_1']);
  252.             $punto->setTelefono2($data['telefono_2']);
  253.             $punto->setOrganizacionComunitariaId($data['organizacion_comunitaria_id']);
  254.             $punto->setDocEstatutoOrganizacion($data['doc_estatuto_organizacion']);
  255.             $punto->setDocCertificadoVigenciaPersonaJuridica($data['doc_certificado_vigencia_persona_juridica']);
  256.             $punto->setDocAcreditaPersoneriaVigente($data['doc_acredita_personeria_vigente']);
  257.             $punto->setDocListadoPersonas($data['doc_listado_personas']);
  258.             $punto->setDocumentos($data['documentos']);
  259.             // Validar con Symfony Validator
  260.             $errors $validator->validate($punto);
  261.             if (count($errors) > 0) {
  262.                 $errorMessages = [];
  263.                 foreach ($errors as $error) {
  264.                     $errorMessages[] = $error->getMessage();
  265.                 }
  266.                 return new JsonResponse(['error' => $errorMessages], JsonResponse::HTTP_BAD_REQUEST);
  267.             }
  268.             $pcPuntoCulturaRepository->save($puntotrue);
  269.             $puntoCulturaArr = [
  270.                 'id' => $punto->getId(),
  271.                 'nombre' => $punto->getNombre(),
  272.                 'resenia' => $punto->getResenia(),
  273.                 'region' => $punto->getRegion(),
  274.                 'comuna' => $punto->getComuna(),
  275.                 'direccion' => $punto->getDireccion(),
  276.                 'georeferencia' => $punto->getGeoreferencia(),
  277.                 'nombre_contacto' => $punto->getNombreContacto(),
  278.                 'email_contacto' => $punto->getEmailContacto(),
  279.                 'redes_sociales' => $punto->getRedesSociales(),
  280.                 'certificado_punto' => $punto->getCertificadoPunto(),
  281.                 'nombre_persona_juridica' => $punto->getNombrePersonaJuridica(),
  282.                 'nombre_representante_legal' => $punto->getNombreRepresentanteLegal(),
  283.                 'rut_persona_juridica' => $punto->getRutPersonaJuridica(),
  284.                 'rut_representante_legal' => $punto->getRutRepresentanteLegal(),
  285.                 'direccion_postal' => $punto->getDireccionPostal(),
  286.                 'correo_electronico_1' => $punto->getCorreoElectronico1(),
  287.                 'correo_electronico_2' => $punto->getCorreoElectronico2(),
  288.                 'telefono_1' => $punto->getTelefono1(),
  289.                 'telefono_2' => $punto->getTelefono2(),
  290.                 'organizacion_comunitaria_id' => $punto->getOrganizacionComunitariaId(),
  291.                 'doc_estatuto_organizacion' => $punto->getDocEstatutoOrganizacion(),
  292.                 'doc_certificado_vigencia_persona_juridica' => $punto->getDocCertificadoVigenciaPersonaJuridica(),
  293.                 'doc_acredita_personeria_vigente' => $punto->getDocAcreditaPersoneriaVigente(),
  294.                 'doc_listado_personas'=> $punto->getDocListadoPersonas(),
  295.                 'documentos' => $punto->getDocumentos(),
  296.                 'rut' => $punto->getRut(),
  297.                 'dv' => $punto->getDv(),
  298.             ];
  299.             return new JsonResponse(['message' => 'Punto Cultura actualizado con éxito''pc' => $puntoCulturaArr]);
  300.         } catch (\Exception $e) {
  301.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  302.         }
  303.     }
  304.     #[Route('/secure/region'name'obtenerRegiones'methods: ['GET'])]
  305.     public function obtenerRegiones(
  306.         RegionRepository $regionRepository
  307.     ): JsonResponse
  308.     {
  309.         try {
  310.             $regiones $regionRepository->findAll();
  311.             $regionesJson = [];
  312.             foreach($regiones as $region){
  313.                 $regionesJson[] = [
  314.                     'nombre' => $region->getNombre(),
  315.                     'codigo' => $region->getId()
  316.                 ];
  317.             }
  318.             return $this->json($regionesJson);
  319.         } catch (\Exception $e) {
  320.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  321.         }
  322.     }
  323.     #[Route('/secure/region/{codigo}/comuna'name'obtenerComunas'methods: ['GET'])]
  324.     public function obtenerComunas(
  325.         $codigo,
  326.         ComunaRepository $comunaRepository
  327.     ): JsonResponse
  328.     {
  329.         try {
  330.             $comunas $comunaRepository->findByRegion((int) $codigo);
  331.             $comunasJson = [];
  332.             foreach($comunas as $comuna){
  333.                 $comunasJson[] = [
  334.                     'nombre' => $comuna->getNombre(),
  335.                     'codigo' => $comuna->getId()
  336.                 ];
  337.             }
  338.             return $this->json($comunasJson);
  339.         } catch (\Exception $e) {
  340.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  341.         }
  342.     }
  343.     /**
  344.      * @Route("/secure/upload-file", name="uploadFile", methods={"POST"})
  345.      */
  346.     public function uploadFile(Request $request): JsonResponse
  347.     {
  348.         try {
  349.             $file $request->files->get('file');
  350.             if (!$file) {
  351.                 return new JsonResponse(['error' => 'No hay documento'], 400);
  352.             }
  353.             try {
  354.                 $originalName $file->getClientOriginalName();
  355.                 $newFilename str_replace(' ''_'$originalName) . '-' uniqid() . '.' $file->guessExtension();
  356.                 $projectRoot $this->getParameter('kernel.project_dir');
  357.                 $dirToMove $projectRoot '/private/documentos/subidas';
  358.                 if (!is_dir($dirToMove)) {
  359.                     mkdir($dirToMove0777true);
  360.                 }
  361.                 $file->move($dirToMove$newFilename);
  362.                 return new JsonResponse([
  363.                     'message' => 'Documento subido con exito',
  364.                     'original_name' => $originalName,
  365.                     'new_filename' => $newFilename,
  366.                     'path' => '/documentos/subidas/' $newFilename,
  367.                 ], 200);
  368.             } catch (FileException $e) {
  369.                 return new JsonResponse(['error' => 'Falla al subir archivo: ' $e->getMessage()], 500);
  370.             }
  371.         } catch (\Exception $e) {
  372.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  373.         }
  374.     }
  375.     /**
  376.      * @Route("/secure/download-file/{filename}", name="downloadFile", methods={"GET"})
  377.      */
  378.     public function downloadFile(string $filename): Response
  379.     {
  380.         try {
  381.             $projectRoot $this->getParameter('kernel.project_dir');
  382.             $filePath $projectRoot '/private/documentos/subidas/' $filename;
  383.             if (!file_exists($filePath)) {
  384.                 throw $this->createNotFoundException("Archivo no encontrado: $filename");
  385.             }
  386.             // Devolver el archivo como una respuesta
  387.             $response = new BinaryFileResponse($filePath);
  388.             $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT$filename);
  389.             return $response;
  390.         } catch (\Exception $e) {
  391.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  392.         }
  393.     }
  394.     #[Route('/secure/convocatorias'name'obtenerConvocatoriasAbiertas'methods: ['GET'])]
  395.     public function obtenerConvocatoriasAbiertas(
  396.         PcConvocatoriasRepository $pcConvocatoriasRepository,
  397.         Security $security,
  398.         PcPostulacionRepository $pcPostulacionRepository
  399.     ): JsonResponse
  400.     {
  401.         try {
  402.             $user $security->getUser();
  403.             if (!$user) {
  404.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  405.             }
  406.             $rut $user->getRut();
  407.             $dv $user->getDv();
  408.             $convocatorias $pcConvocatoriasRepository->findAbiertas();
  409.             $convocatoriasJson = [];
  410.             foreach ($convocatorias as $convocatoria) {
  411.                 $pu_inscritos = [];
  412.                 $postulaciones $pcPostulacionRepository->findPuntoCulturaAndRutAndConvocatorias($rut$dv$convocatoria->getId());
  413.                 foreach ($postulaciones as $postulacion) {
  414.                     $pu_inscritos[] = $postulacion->getPuntoCultura()->getId();
  415.                 }
  416.                 $convocatoriasJson[] = [
  417.                     'id' => $convocatoria->getId(),
  418.                     'nombre' => $convocatoria->getNombre(),
  419.                     'descripcion' => $convocatoria->getDescripcion(),
  420.                     'anio' => $convocatoria->getAnio(),
  421.                     'estado' => $convocatoria->getEstado(),
  422.                     'pu_inscritos' => $pu_inscritos
  423.                 ];
  424.             }
  425.             return $this->json(['convocatorias' => $convocatoriasJson]);
  426.         } catch (\Exception $e) {
  427.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  428.         }
  429.     }
  430.     #[Route('/secure/postulacion'name'crearPostulacion'methods: ['POST'])]
  431.     public function crearPostulacion(
  432.         Request $request,
  433.         PcConvocatoriasRepository $pcConvocatoriaRepository,
  434.         PcPostulacionRepository $pcPostulacionRepository,
  435.         PcPuntoCulturaRepository $pcPuntoCulturaRepository,
  436.         Security $security,
  437.         ValidatorInterface $validator,
  438.         ValidacionService $validacionService
  439.     ): JsonResponse
  440.     {
  441.         try {
  442.             $user $security->getUser();
  443.             if (!$user) {
  444.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  445.             }
  446.             $rut $user->getRut();
  447.             $dv $user->getDv();
  448.             $data json_decode($request->getContent(), true);
  449.             if (!$validacionService->validacionesOrNulo([
  450.                 $data['convocatoriaId'],
  451.                 $data['puntoCulturaId'],
  452.             ], 'integer')) {
  453.                 return new JsonResponse(['error' => 'Los campos de convocatoriaId y puntoCulturaId  deben ser numericos'], JsonResponse::HTTP_BAD_REQUEST);
  454.             }
  455.             $convocatoriaId $data['convocatoriaId'];
  456.             $puntoCulturaId $data['puntoCulturaId'];
  457.             $convocatoria $pcConvocatoriaRepository->find($convocatoriaId);
  458.             $puntoCultura $pcPuntoCulturaRepository->findByIdAndRut($puntoCulturaId$rut$dv);
  459.             if (!$convocatoria) {
  460.                 return new JsonResponse(['error' => 'Convocatoria no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  461.             }
  462.             if($convocatoria->getEstado() !== '1'){
  463.                 return new JsonResponse(['error' => 'Convocatoria no esta en fase de postulación'], JsonResponse::HTTP_BAD_REQUEST);
  464.             }
  465.             if (!$puntoCultura) {
  466.                 return new JsonResponse(['error' => 'Punto Cultura no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  467.             }
  468.             $postulacionExistente =  $pcPostulacionRepository->findByPuntoCulturaAndRutAndConvocatoria($puntoCulturaId$rut$dv$convocatoriaId);
  469.             if (!!$postulacionExistente) {
  470.                 return new JsonResponse(['error' => 'Ya existe una postulación para esta convocatoria'], JsonResponse::HTTP_BAD_REQUEST);
  471.             }
  472.             if (!empty($data['estado']) && ($data['estado'] !== 'save' && $data['estado'] !== 'send')) {
  473.                 return new JsonResponse(['error' => 'Solo se permite estado save y send'], JsonResponse::HTTP_BAD_REQUEST);
  474.             }
  475.             $formularioAdmisibilidad = [
  476.                 => [
  477.                     'pregunta'=> '¿Admisibilidad?',
  478.                     'tipo'=> 'opcion',
  479.                     'opciones'=> ['Si''No'],
  480.                     'respuesta'=> '',
  481.                 ],
  482.                 => [
  483.                     'pregunta'=> 'Observaciones internas',
  484.                     'tipo'=> 'texarea',
  485.                     'respuesta'=> '',
  486.                 ],
  487.                 => [
  488.                     'pregunta'=> 'Observaciones publicas',
  489.                     'tipo'=> 'texarea',
  490.                     'respuesta'=> '',
  491.                 ],
  492.             ];
  493.             $formularioSeleccion = [
  494.                 => [
  495.                     'pregunta'=> '',
  496.                     'tipo'=> 'opcion',
  497.                     'opciones'=> ['Seleccionado''No seleccionado'],
  498.                     'respuesta'=> '',
  499.                 ],
  500.                 => [
  501.                     'pregunta'=> 'Monto adjudicado',
  502.                     'tipo'=> 'text',
  503.                     'respuesta'=> '',
  504.                 ],
  505.                 => [
  506.                     'pregunta'=> 'Observaciones',
  507.                     'tipo'=> 'texarea',
  508.                     'respuesta'=> '',
  509.                 ],
  510.             ];
  511.             $criteriosData $convocatoria->getCriterios();
  512.             $formularioEvaluacion = [];
  513.             foreach ($criteriosData as $criterioConvocatoria) {
  514.                 $formularioEvaluacion[] = [
  515.                     'tipo' => 'criterio',
  516.                     'id' => $criterioConvocatoria->getId(),
  517.                     'nombre' => $criterioConvocatoria->getCriterios()->getNombre(),
  518.                     'descripcion' => $criterioConvocatoria->getCriterios()->getDescripcion(),
  519.                     'peso' => $criterioConvocatoria->getPeso(),
  520.                     'puntajes' => $criterioConvocatoria->getCriterios()->getPuntajes(),
  521.                     'valor' => null,
  522.                     'justificacion' => ''
  523.                 ];
  524.             }
  525.             $formularioEvaluacion[] = [
  526.                 'tipo' => 'pregunta',
  527.                 'pregunta'=> 'Justificación general',
  528.                 'tipo'=> 'texarea',
  529.                 'respuesta'=> '',
  530.             ];
  531.             $formulario array_map(function($cuestionario) {
  532.                     $cuestionario['valor'] = null;
  533.                     return $cuestionario;
  534.                 }, $convocatoria->getCuestionarios());
  535.             $documentos array_map(function($documento) {
  536.                     $documento['valor'] = null;
  537.                     return $documento;
  538.                 }, $convocatoria->getDocumentos());
  539.             $postulacion = new PcPostulacion();
  540.             $postulacion->setConvocatoria($convocatoria);
  541.             $postulacion->setPuntoCultura($puntoCultura);
  542.             $postulacion->setFormularioPostulacion($formulario);
  543.             $postulacion->setDocumentosPostulacion($documentos);
  544.             $postulacion->setFormularioAdmisibilidad($formularioAdmisibilidad);
  545.             $postulacion->setFormularioSeleccion($formularioSeleccion);
  546.             $postulacion->setFormularioEvaluacion($formularioEvaluacion);
  547.             $postulacion->setEstado('save');
  548.             $now = new DateTime();
  549.             $postulacion->setCreatedAt($now);
  550.             $postulacion->updateTimestamps();
  551.             // Validar con Symfony Validator
  552.             $errors $validator->validate($postulacion);
  553.             if (count($errors) > 0) {
  554.                 $errorMessages = [];
  555.                 foreach ($errors as $error) {
  556.                     $errorMessages[] = $error->getMessage();
  557.                 }
  558.                 return new JsonResponse(['error' => $errorMessages], JsonResponse::HTTP_BAD_REQUEST);
  559.             }
  560.             $pcPostulacionRepository->save($postulaciontrue);
  561.             $postulacionObj = [
  562.                 'id' => $postulacion->getId(),
  563.                 'montoRequerido' => $postulacion->getMontoRequerido(),
  564.                 'formularioPostulacion' => $postulacion->getFormularioPostulacion(),
  565.                 'documentosPostulacion' => $postulacion->getDocumentosPostulacion(),
  566.                 'anexos' => $postulacion->getDocumentos(),
  567.                 'convocatoriaId' => $postulacion->getConvocatoria()->getId(),
  568.                 'convocatoriaNombre' => $postulacion->getConvocatoria()->getNombre(),
  569.             ];
  570.             return new JsonResponse(['message' => 'Postulacion creada con éxito''postulacion' => $postulacionObj ], JsonResponse::HTTP_CREATED);
  571.         } catch (\Exception $e) {
  572.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  573.         }
  574.     }
  575.     #[Route('/secure/postulacion/{id}'name'actualizarPostulacion'methods: ['PUT'])]
  576.     public function actualizarPostulacion(
  577.         $id,
  578.         Request $request,
  579.         PcPostulacionRepository $pcPostulacionRepository,
  580.         Security $security,
  581.         ValidatorInterface $validator,
  582.         ValidacionService $validacionService
  583.     ): JsonResponse
  584.     {
  585.         try {
  586.             $user $security->getUser();
  587.             if (!$user) {
  588.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  589.             }
  590.             $rut $user->getRut();
  591.             $dv $user->getDv();
  592.             $postulacion $pcPostulacionRepository->findByIdAndRut($id$rut$dv);
  593.             if (!$postulacion) {
  594.                 return new JsonResponse(['error' => 'Postulacion no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  595.             }
  596.             $punto $postulacion->getPuntoCultura();
  597.             if(!$punto || !$punto->getActivo()){
  598.                 return new JsonResponse(['error' => 'Punto de cultura no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  599.             }
  600.             $convocatoria $postulacion->getConvocatoria();
  601.             if (!$convocatoria) {
  602.                 return new JsonResponse(['error' => 'Convocatoria no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  603.             }
  604.             if($convocatoria->getEstado() !== '1'){
  605.                 return new JsonResponse(['error' => 'Convocatoria no esta en fase de postulación'], JsonResponse::HTTP_BAD_REQUEST);
  606.             }
  607.             $estadoOriginal $postulacion->getEstado();
  608.             if($estadoOriginal == 'send'){
  609.                 return new JsonResponse(['error' => 'Postulacion ya fue enviada'], JsonResponse::HTTP_BAD_REQUEST);
  610.             }
  611.             $data json_decode($request->getContent(), true);
  612.             if (!$validacionService->validacionesOrNulo([
  613.                 $data['estado'],
  614.             ], 'string')) {
  615.                 return new JsonResponse(['error' => 'Los campos de estado deben ser texto'], JsonResponse::HTTP_BAD_REQUEST);
  616.             }
  617.             if (!$validacionService->validacionesOrNulo([
  618.                 $data['montoRequerido']
  619.             ], 'integer')) {
  620.                 return new JsonResponse(['error' => 'Los campos de montoRequerido deben ser numerico'], JsonResponse::HTTP_BAD_REQUEST);
  621.             }
  622.             if (!$validacionService->validacionesOrNulo([
  623.                 $data['formularioPostulacion'],
  624.                 $data['documentosPostulacion'],
  625.                 $data['anexos']
  626.             ], 'array')) {
  627.                 return new JsonResponse(['error' => 'Los campos de formularioPostulacion, documentosPostulacion y anexos deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
  628.             }
  629.             if($data['estado'] == 'send'){
  630.                 $now = new DateTime();
  631.                 $postulacion->setPostulatedAt($now);
  632.             }
  633.             $postulacion->setMontoRequerido($data['montoRequerido']);
  634.             $postulacion->setFormularioPostulacion($data['formularioPostulacion']);
  635.             $postulacion->setDocumentosPostulacion($data['documentosPostulacion']);
  636.             $postulacion->setDocumentos($data['anexos']);
  637.             $postulacion->setEstado($data['estado'] ?? 'save');
  638.             $postulacion->updateTimestamps();
  639.             // Validar con Symfony Validator
  640.             $errors $validator->validate($postulacion);
  641.             if (count($errors) > 0) {
  642.                 $errorMessages = [];
  643.                 foreach ($errors as $error) {
  644.                     $errorMessages[] = $error->getMessage();
  645.                 }
  646.                 return new JsonResponse(['error' => $errorMessages], JsonResponse::HTTP_BAD_REQUEST);
  647.             }
  648.             $pcPostulacionRepository->save($postulaciontrue);
  649.             $postulacionObj = [
  650.                 'id' => $postulacion->getId(),
  651.                 'montoRequerido' => $postulacion->getMontoRequerido(),
  652.                 'formularioPostulacion' => $postulacion->getFormularioPostulacion(),
  653.                 'documentosPostulacion' => $postulacion->getDocumentosPostulacion(),
  654.                 'anexos' => $postulacion->getDocumentos(),
  655.                 'convocatoriaId' => $postulacion->getConvocatoria()->getId(),
  656.                 'convocatoriaNombre' => $postulacion->getConvocatoria()->getNombre(),
  657.                 'nombrePuntoCultura' => $punto->getNombre(),
  658.                 'idPuntoCultura' => $punto->getId(),
  659.             ];
  660.             return new JsonResponse(['message' => 'Postulación actualizada con éxito''postulacion' => $postulacionObj]);
  661.         } catch (\Exception $e) {
  662.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  663.         }
  664.     }
  665.     #[Route('/secure/postulacion/{id}'name'obtenerPostulacion'methods: ['GET'])]
  666.     public function obtenerPostulacion(
  667.         $id,
  668.         PcPostulacionRepository $pcPostulacionRepository,
  669.         Security $security
  670.     ): JsonResponse
  671.     {
  672.         try {
  673.             $user $security->getUser();
  674.             if (!$user) {
  675.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  676.             }
  677.             $rut $user->getRut();
  678.             $dv $user->getDv();
  679.             $postulacion $pcPostulacionRepository->findByIdAndRut($id$rut$dv);
  680.             if (!$postulacion) {
  681.                 return new JsonResponse(['error' => 'Postulacion no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  682.             }
  683.             $punto $postulacion->getPuntoCultura();
  684.             if(!$punto || !$punto->getActivo()){
  685.                 return new JsonResponse(['error' => 'Punto de cultura no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  686.             }
  687.             $usuarioAdmisibilidad $postulacion->getUsuarioAdmisibilidad();
  688.             $usuarioEvaluacion $postulacion->getUsuarioEvaluacion();
  689.             $usuarioSeleccion $postulacion->getUsuarioSeleccion();
  690.             return $this->json([
  691.                 'id' => $postulacion->getId(),
  692.                 'montoRequerido' => $postulacion->getMontoRequerido(),
  693.                 'formularioPostulacion' => $postulacion->getFormularioPostulacion(),
  694.                 'documentosPostulacion' => $postulacion->getDocumentosPostulacion(),
  695.                 'certificadoPostulacion' => $postulacion->getCertificadoPostulacion(),
  696.                 'resultadoAdmisibilidad' => $postulacion->getResultadoAdmisibilidad(),
  697.                 'estadoAdmisibilidad' => $postulacion->getEstadoAdmisibilidad(),
  698.                 'formularioAdmisibilidad' => $postulacion->getFormularioAdmisibilidad(),
  699.                 'notaFinalEvaluacion' => $postulacion->getNotaFinalEvaluacion(),
  700.                 'formularioEvaluacion' => $postulacion->getFormularioEvaluacion(),
  701.                 'estadoEvaluacion' => $postulacion->getEstadoEvaluacion(),
  702.                 'formularioSeleccion' => $postulacion->getFormularioSeleccion(),
  703.                 'estado' => $postulacion->getEstado(),
  704.                 'formularioSeleccion' => $postulacion->getFormularioSeleccion(),
  705.                 'estadoSeleccion' => $postulacion->getEstadoSeleccion(),
  706.                 'resultadoSeleccion' => $postulacion->getResultadoSeleccion(),
  707.                 'montoAdjudicado' => $postulacion->getMontoAdjudicado(),
  708.                 'anexos' => $postulacion->getDocumentos(),
  709.                 'convocatoriaId' => $postulacion->getConvocatoria()->getId(),
  710.                 'convocatoriaNombre' => $postulacion->getConvocatoria()->getNombre(),
  711.                 'usuarioAdmisibilidad' => $usuarioAdmisibilidad $usuarioAdmisibilidad->getNombres() : null,
  712.                 'usuarioEvaluacion' => $usuarioEvaluacion $usuarioEvaluacion->getNombres() : null,
  713.                 'usuarioSeleccion' => $usuarioSeleccion $usuarioSeleccion->getNombres() : null,
  714.                 'admisibilidadAt' => $postulacion->getAdmisibilidadAt(),
  715.                 'evaluacionAt' => $postulacion->getEvaluacionAt(),
  716.                 'seleccionAt' => $postulacion->getSeleccionAt(),
  717.                 'nombrePuntoCultura' => $punto->getNombre(),
  718.                 'idPuntoCultura' => $punto->getId(),
  719.             ]);
  720.         } catch (\Exception $e) {
  721.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  722.         }
  723.     }
  724.     #[Route('/secure/postulaciones'name'obtenerPostulaciones'methods: ['GET'])]
  725.     public function obtenerPostulaciones(
  726.         PcPostulacionRepository $pcPostulacionRepository,
  727.         Security $security
  728.     ): JsonResponse
  729.     {
  730.         try {
  731.             $user $security->getUser();
  732.             if (!$user) {
  733.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  734.             }
  735.             $rut $user->getRut();
  736.             $dv $user->getDv();
  737.             $postulaciones $pcPostulacionRepository->findByRut($rut$dv);
  738.             $postulacionesJson = [];
  739.             foreach ($postulaciones as $postulacion) {
  740.                 $puntoCultura $postulacion->getPuntoCultura();
  741.                 $convocatoria $postulacion->getConvocatoria();
  742.                 $postulacionesJson[] = [
  743.                     'id' => $postulacion->getId(),
  744.                     'nombre' => $convocatoria->getNombre(),
  745.                     'convocatoriaEstado' => $convocatoria->getEstado(),
  746.                     'estado' => $postulacion->getEtapaPostulacion(),
  747.                     'resultadoEvaluacion' => $postulacion->getResultadoPostulacion(),
  748.                     'editar' => $postulacion->getEstado() == 'send' false true,
  749.                     'puntoCultura' => $puntoCultura->getNombre(),
  750.                     'pundoCulturaId' => $puntoCultura->getId(),
  751.                 ];
  752.             }
  753.             return $this->json(['postulaciones' => $postulacionesJson]);
  754.         } catch (\Exception $e) {
  755.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  756.         }
  757.     }
  758.     #[Route('/secure/mis-puntos'name'obtenerMisPuntosDeCultura'methods: ['GET'])]
  759.     public function obtenerMisPuntosDeCultura(
  760.         PcPuntoCulturaRepository $pcPuntoCulturaRepository,
  761.         Security $security
  762.     ): JsonResponse
  763.     {
  764.         try {
  765.             $user $security->getUser();
  766.             if (!$user) {
  767.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  768.             }
  769.             $rut $user->getRut();
  770.             $dv $user->getDv();
  771.             $puntos $pcPuntoCulturaRepository->findByRut($rut$dv);
  772.             $data = [];
  773.             $puntosResponse = [];
  774.             foreach ($puntos as $punto) {
  775.                 $puntosResponse[] = [
  776.                     'id' => $punto->getId(),
  777.                     'nombre' => $punto->getNombre(),
  778.                 ];
  779.             }
  780.             return $this->json($puntosResponse);
  781.         } catch (\Exception $e) {
  782.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  783.         }
  784.     }
  785.     #[Route('/secure/mi-perfil'name'obtenerMiPerfil'methods: ['GET'])]
  786.     public function obtenerMiPerfil(
  787.         PcPuntoCulturaRepository $pcPuntoCulturaRepository,
  788.         RacService $racService,
  789.         Security $security
  790.     ): JsonResponse
  791.     {
  792.         try {
  793.             $user $security->getUser();
  794.             if (!$user) {
  795.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  796.             }
  797.             $rut $user->getRut();
  798.             $dv $user->getDv();
  799.             $puntos $pcPuntoCulturaRepository->findByRut($rut$dv);
  800.             $data = [];
  801.             $puntosResponse = [];
  802.             $userRut strval(number_format((int) $rut0'''.')) . '-' $dv;
  803.             $organizaciones $racService->getRegisterRac($userRut);
  804.             $organizacionesById = [];
  805.             foreach($organizaciones as $org){
  806.                 if(empty($org['org_id'])) continue;
  807.                 $org_id $org['org_id'];
  808.                 $organizacionesById[$org_id] = $org;
  809.             }
  810.             foreach ($puntos as $punto) {
  811.                 $organizacionId = (string) $punto->getOrganizacionComunitariaId();
  812.                 $rac $organizacionesById[$organizacionId] ?? [];
  813.                 $puntosResponse[] = [
  814.                     'id' => $punto->getId(),
  815.                     'nombre' => $punto->getNombre() ?? '',
  816.                     'resenia' => $punto->getResenia() ?? '',
  817.                     'region' => $punto->getRegion() ?? '',
  818.                     'comuna' => $punto->getComuna() ?? '',
  819.                     'direccion' => $punto->getDireccion() ?? '',
  820.                     'georeferencia' => $punto->getGeoreferencia() ?? '',
  821.                     'nombre_contacto' => $punto->getNombreContacto() ?? '',
  822.                     'email_contacto' => $punto->getEmailContacto() ?? '',
  823.                     'redes_sociales' => $punto->getRedesSociales(),
  824.                     'certificado_punto' => $punto->getCertificadoPunto() ?? '',
  825.                     'nombre_persona_juridica' => $punto->getNombrePersonaJuridica() ?? '',
  826.                     'nombre_representante_legal' => $punto->getNombreRepresentanteLegal() ?? '',
  827.                     'rut_persona_juridica' => $punto->getRutPersonaJuridica() ?? '',
  828.                     'rut_representante_legal' => $punto->getRutRepresentanteLegal() ?? '',
  829.                     'direccion_postal' => $punto->getDireccionPostal() ?? '',
  830.                     'correo_electronico_1' => $punto->getCorreoElectronico1() ?? '',
  831.                     'correo_electronico_2' => $punto->getCorreoElectronico2() ?? '',
  832.                     'telefono_1' => $punto->getTelefono1() ?? '',
  833.                     'telefono_2' => $punto->getTelefono2() ?? '',
  834.                     'organizacion_comunitaria_id' => $punto->getOrganizacionComunitariaId(),
  835.                     'doc_estatuto_organizacion' => $punto->getDocEstatutoOrganizacion(),
  836.                     'doc_certificado_vigencia_persona_juridica' => $punto->getDocCertificadoVigenciaPersonaJuridica(),
  837.                     'doc_acredita_personeria_vigente' => $punto->getDocAcreditaPersoneriaVigente(),
  838.                     'doc_listado_personas'=> $punto->getDocListadoPersonas(),
  839.                     'documentos' => $punto->getDocumentos(),
  840.                     'rut' => $punto->getRut(),
  841.                     'dv' => $punto->getDv(),
  842.                     'rac' => $rac,
  843.                 ];
  844.             }
  845.             return $this->json($puntosResponse);
  846.         } catch (\Exception $e) {
  847.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  848.         }
  849.     }
  850.     #[Route('/secure/convocatoria/{id}'name'obtenerConvocatoria'methods: ['GET'])]
  851.     public function obtenerConvocatoria(
  852.         $id,
  853.         PcConvocatoriasRepository $pcConvocatoriaRepository,
  854.         Security $security
  855.     ): JsonResponse
  856.     {
  857.         try {
  858.             $convocatoria $pcConvocatoriaRepository->find($id);
  859.             if (!$convocatoria) {
  860.                 return new JsonResponse(['error' => 'Convocatoria no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  861.             }
  862.             $criterios = [];
  863.             $criteriosData $convocatoria->getCriterios();
  864.             foreach ($criteriosData as $criterioConvocatoria) {
  865.                 $criterios[] = [
  866.                     'id' => $criterioConvocatoria->getCriterios()->getId(),
  867.                     'peso' => $criterioConvocatoria->getPeso()
  868.                 ];
  869.             }
  870.             return $this->json([
  871.                 'id' => $convocatoria->getId(),
  872.                 'nombre' => $convocatoria->getNombre(),
  873.                 'descripcion' => $convocatoria->getDescripcion(),
  874.                 'anio' => $convocatoria->getAnio(),
  875.                 'bases' => $convocatoria->getBases(),
  876.                 'presupuesto' => $convocatoria->getPresupuesto(),
  877.                 'puntajeEvalCorte' => $convocatoria->getPuntajeEvalCorte(),
  878.                 'cuestionarios' => $convocatoria->getCuestionarios(),
  879.                 'documentos' => $convocatoria->getDocumentos(),
  880.                 'estado' => $convocatoria->getEstado(),
  881.                 'criterios' => $criterios,
  882.             ]);
  883.         } catch (\Exception $e) {
  884.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  885.         }
  886.     }
  887.     #[Route('/secure/cargar'name'cargar'methods: ['POST'])]
  888.     public function cargarArchivos(
  889.         Request $request,
  890.         PcPostulacionRepository $pcPostulacionRepository,
  891.         PcPuntoCulturaRepository $pcPuntoCulturaRepository,
  892.         Security $security
  893.     ): JsonResponse
  894.     {
  895.         try {
  896.             $user $security->getUser();
  897.             if (!$user) {
  898.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  899.             }
  900.             $rut $user->getRut();
  901.             $dv $user->getDv();
  902.             $file $request->files->get('file');
  903.             if (!$file) {
  904.                 return new JsonResponse(['error' => 'No hay documento'], 400);
  905.             }
  906.             // Obtener configuración desde .env
  907.             $maxFileSizeMB $_ENV['MAX_FILE_SIZE'] ?? 10;
  908.             $allowedExtensions explode(','$_ENV['ALLOWED_EXTENSIONS'] ?? '');
  909.             // Validar tamaño del archivo
  910.             $fileSizeMB $file->getSize() / (1024 1024); // Convertir a MB
  911.             if ($fileSizeMB $maxFileSizeMB) {
  912.                 return new JsonResponse(['error' => "El archivo supera el tamaño máximo permitido de {$maxFileSizeMB}MB"], 400);
  913.             }
  914.             // Validar extensión
  915.             $extension $file->guessExtension();
  916.             if (!in_array($extension$allowedExtensions)) {
  917.                 return new JsonResponse(['error' => "Extensión no permitida. Solo se aceptan: " implode(', '$allowedExtensions)], 400);
  918.             }
  919.             $postulacionId $request->request->get('postulacionId');
  920.             $puntoCulturaId $request->request->get('puntoCulturaId');
  921.             $tipoDocumento '';
  922.             if(!empty($postulacionId)){
  923.                 $tipoDocumento="/pcpostulaciones/postulacion_" $postulacionId;
  924.                 $postulacion $pcPostulacionRepository->findByIdAndRut($postulacionId$rut$dv);
  925.                 if (!$postulacion) {
  926.                     return new JsonResponse(['error' => 'Postulacion no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  927.                 }
  928.             } else if (!empty($puntoCulturaId)){
  929.                 $tipoDocumento="/puntoscultura/puntocultura_" $puntoCulturaId;
  930.                 $punto $pcPuntoCulturaRepository->findByIdAndRut($puntoCulturaId$rut$dv);
  931.                 if (!$punto) {
  932.                     return new JsonResponse(['error' => 'Punto no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  933.                 }
  934.             } else {
  935.                 return new JsonResponse(['error' => 'postulacionId, puntoCulturaId o convocatoriaId requerido'], 400);
  936.             }
  937.             try {
  938.                 $originalName $file->getClientOriginalName();
  939.                 $newFilename str_replace(' ''_'$originalName) . '-' uniqid() . '.' $file->guessExtension();
  940.                 $projectRoot $this->getParameter('kernel.project_dir');
  941.                 $dirToMove $projectRoot '/public/documentos' $tipoDocumento;
  942.                 if (!is_dir($dirToMove)) {
  943.                     mkdir($dirToMove0777true);
  944.                 }
  945.                 $file->move($dirToMove$newFilename);
  946.                 return new JsonResponse([
  947.                     'message' => 'Documento subido con exito',
  948.                     'original_name' => $originalName,
  949.                     'new_filename' => $newFilename,
  950.                     'path' => '/documentos' $tipoDocumento '/' $newFilename,
  951.                 ], 200);
  952.             } catch (FileException $e) {
  953.                 return new JsonResponse(['error' => 'Falla al subir archivo: ' $e->getMessage()], 500);
  954.             }
  955.         } catch (\Exception $e) {
  956.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  957.         }
  958.     }
  959.     #[Route('/secure/descargas'name'descargas'methods: ['POST'])]
  960.     public function descargas(
  961.         Request $request,
  962.         PcPostulacionRepository $pcPostulacionRepository,
  963.         PcPuntoCulturaRepository $pcPuntoCulturaRepository,
  964.         PostulacionRepository $postulacionRepository,
  965.         Security $security
  966.     ): Response
  967.     {
  968.         try {
  969.             $user $security->getUser();
  970.             if (!$user) {
  971.                 return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  972.             }
  973.             $rut $user->getRut();
  974.             $dv $user->getDv();
  975.             $data json_decode($request->getContent(), true);
  976.             $path $data['path'];
  977.             if(empty($path)){
  978.                 return new JsonResponse(['error' => 'Falta enviar path'],
  979.                     JsonResponse::HTTP_BAD_REQUEST);
  980.             }
  981.             $rutasArchivo explode("/"$path);
  982.             $tipoDocumento $rutasArchivo[2];
  983.             if($tipoDocumento == "postulaciones"){
  984.                 $postulacionId explode('_'$rutasArchivo[3])[1];
  985.                 $postulacion $postulacionRepository->findOneByRutId($rut,  $postulacionId);
  986.                 if (!$postulacion) {
  987.                     return new JsonResponse(['error' => 'Postulacion no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  988.                 }
  989.             } else if($tipoDocumento == "puntoscultura"){
  990.                 $puntoCulturaId explode('_'$rutasArchivo[3])[1];
  991.                 $punto $pcPuntoCulturaRepository->findByIdAndRut($puntoCulturaId$rut$dv);
  992.                 if (!$punto) {
  993.                     return new JsonResponse(['error' => 'Punto no encontrado'], JsonResponse::HTTP_NOT_FOUND);
  994.                 }
  995.             } else if($tipoDocumento == "pcpostulaciones"){
  996.                 $postulacionId explode('_'$rutasArchivo[3])[1];
  997.                 $postulacion $pcPostulacionRepository->findByIdAndRut($postulacionId$rut$dv);
  998.                 if (!$postulacion) {
  999.                     return new JsonResponse(['error' => 'Postulacion no encontrada'], JsonResponse::HTTP_NOT_FOUND);
  1000.                 }
  1001.             }
  1002.             $projectRoot $this->getParameter('kernel.project_dir');
  1003.             $filePath $projectRoot '/public' $path;
  1004.             if (!file_exists($filePath)) {
  1005.                 throw $this->createNotFoundException("Archivo no encontrado");
  1006.             }
  1007.             $filename $rutasArchivo[count($rutasArchivo)-1];
  1008.             // Devolver el archivo como una respuesta
  1009.             $response = new BinaryFileResponse($filePath);
  1010.             $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT$filename);
  1011.             return $response;
  1012.         } catch (\Exception $e) {
  1013.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  1014.         }
  1015.     }
  1016.     #[Route('/insecure/file'name'obtenerInfoFile'methods: ['GET'])]
  1017.     public function obtenerInfoFile(): JsonResponse
  1018.     {
  1019.         try {
  1020.             return $this->json([
  1021.                 'maxFileSize' => $_ENV['MAX_FILE_SIZE'] ?? 10,
  1022.                 'allowedExtensions' => explode(','$_ENV['ALLOWED_EXTENSIONS'] ?? '')
  1023.             ]);
  1024.         } catch (\Exception $e) {
  1025.             return new JsonResponse(['error' => 'Error de servidor''detalle' => $e->getMessage()], 500);
  1026.         }
  1027.     }
  1028. }