<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\PcConvocatoriasRepository;
use App\Entity\PcConvocatorias;
use App\Entity\PcCriterios;
use App\Repository\PcCriteriosRepository;
use App\Entity\PcCriteriosConvocatorias;
use App\Repository\PcCriteriosConvocatoriasRepository;
use App\Repository\PcPostulacionRepository;
use App\Service\ValidacionService;
use App\Repository\RegionRepository;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use App\Service\RacService;
use App\Repository\PcPuntoCulturaRepository;
use Symfony\Component\Security\Core\Security;
use Symfony\Bundle\SecurityBundle\Attribute\IsGranted;
use DateTime;
/**
* @Route("/api/admin", name="api_admin_")
*/
class ApiAdminController extends AbstractController
{
#[Route('/login', name: 'login', methods: ['POST'])]
public function login(Request $request): JsonResponse
{
// La autenticación será manejada automáticamente por el firewall
return new JsonResponse(['message' => 'Por favor, envía credenciales válidas']);
}
#[Route('/secure/roles', name: 'obtenerRoles', methods: ['GET'])]
public function obtenerRoles(
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
return $this->json($user->getRoles());
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/info', name: 'obtenerInfo', methods: ['GET'])]
public function obtenerInfo(
Security $security,
RegionRepository $regionRepository
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
$regiones = [];
if($user->isSuperAdmin()){
$regiones = $regionRepository->findAll();
} else {
$regiones = $user->getRegiones();
}
$regionesLabel = [];
foreach($regiones as $regionOb){
$regionesLabel[] = $regionOb->getNombre();
}
return $this->json([
'roles' => $user->getRoles(),
'regiones' => $regionesLabel,
'maxFileSize' => $_ENV['MAX_FILE_SIZE'] ?? 10,
'allowedExtensions' => explode(',', $_ENV['ALLOWED_EXTENSIONS'] ?? '')
]);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/convocatorias', name: 'obtenerTodasConvocatorias', methods: ['GET'])]
public function obtenerTodasConvocatorias(
PcConvocatoriasRepository $pcConvocatoriaRepository,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$convocatorias = $pcConvocatoriaRepository->findAll();
$data = [];
foreach ($convocatorias as $convocatoria) {
$data[] = [
'id' => $convocatoria->getId(),
'nombre' => $convocatoria->getNombre(),
'anio' => $convocatoria->getAnio(),
'estado' => $convocatoria->getEstado(),
];
}
return $this->json($data);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/convocatoria/{id}', name: 'obtenerConvocatoria', methods: ['GET'])]
public function obtenerConvocatoria(
$id, PcConvocatoriasRepository $pcConvocatoriaRepository,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$convocatoria = $pcConvocatoriaRepository->find($id);
if (!$convocatoria) {
return new JsonResponse(['error' => 'Convocatoria no encontrada'], JsonResponse::HTTP_NOT_FOUND);
}
$criterios = [];
$criteriosData = $convocatoria->getCriterios();
foreach ($criteriosData as $criterioConvocatoria) {
$criterios[] = [
'id' => $criterioConvocatoria->getCriterios()->getId(),
'peso' => $criterioConvocatoria->getPeso()
];
}
return $this->json([
'id' => $convocatoria->getId(),
'nombre' => $convocatoria->getNombre(),
'descripcion' => $convocatoria->getDescripcion(),
'anio' => $convocatoria->getAnio(),
'bases' => $convocatoria->getBases(),
'presupuesto' => $convocatoria->getPresupuesto(),
'puntajeEvalCorte' => $convocatoria->getPuntajeEvalCorte(),
'cuestionarios' => $convocatoria->getCuestionarios(),
'documentos' => $convocatoria->getDocumentos(),
'estado' => $convocatoria->getEstado(),
'criterios' => $criterios,
'apertura' => $convocatoria->getApertura(),
]);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/convocatoria', name: 'crearConvocatoria', methods: ['POST'])]
public function crearConvocatoria(
Request $request,
PcConvocatoriasRepository $pcConvocatoriaRepository,
PcCriteriosRepository $pcCriteriosRepository,
ValidatorInterface $validator,
ValidacionService $validacionService,
PcCriteriosConvocatoriasRepository $pcCriteriosConvocatoriasRepository,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$data = json_decode($request->getContent(), true);
if (!$validacionService->validacionesOrNulo([
$data['nombre'],
$data['descripcion']
], 'string')) {
return new JsonResponse(['error' => 'Los campos de nombre, descripcion, estado deben ser texto'], JsonResponse::HTTP_BAD_REQUEST);
}
if (!$validacionService->validacionesOrNulo([
$data['apertura']
], 'boolean')) {
return new JsonResponse(['error' => 'Apertura debe ser boolean'], JsonResponse::HTTP_BAD_REQUEST);
}
if (!$validacionService->validacionesOrNulo([
$data['presupuesto'],
$data['anio'],
$data['puntajeEvalCorte']
], 'integer')) {
return new JsonResponse(['error' => 'Los campos presupuesto, anio y puntajeEvalCorte debe ser numerico'], JsonResponse::HTTP_BAD_REQUEST);
}
if (!$validacionService->validacionesOrNulo([
$data['bases'],
$data['cuestionarios'],
$data['documentos']
], 'array')) {
return new JsonResponse(['error' => 'Los campos de bases, cuestionarios y documentos deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
}
$convocatoria = new PcConvocatorias();
$convocatoria->setNombre($data['nombre']);
$convocatoria->setDescripcion($data['descripcion']);
$convocatoria->setAnio((string) $data['anio']);
$convocatoria->setBases($data['bases']);
$convocatoria->setPresupuesto($data['presupuesto']);
$convocatoria->setPuntajeEvalCorte($data['puntajeEvalCorte']);
$convocatoria->setCuestionarios($data['cuestionarios']);
$convocatoria->setDocumentos($data['documentos']);
$convocatoria->setApertura($data['apertura']);
if($data['apertura']){
$convocatoria->setEstado('1');
}
// Validar con Symfony Validator
$errors = $validator->validate($convocatoria);
if (count($errors) > 0) {
$errorMessages = [];
foreach ($errors as $error) {
$errorMessages[] = $error->getMessage();
}
return new JsonResponse(['error' => $errorMessages], JsonResponse::HTTP_BAD_REQUEST);
}
$pcConvocatoriaRepository->save($convocatoria, true);
if (isset($data['criterios'])) {
foreach ($data['criterios'] as $criterioData) {
// Buscar el criterio por ID
$criterio = $pcCriteriosRepository->find($criterioData['id']);
if ($criterio) {
// Crear la relación entre la convocatoria y el criterio
$criteriosConvocatoria = new PcCriteriosConvocatorias();
$criteriosConvocatoria->setConvocatorias($convocatoria);
$criteriosConvocatoria->setCriterios($criterio);
$criteriosConvocatoria->setPeso($criterioData['peso']); // Asignar el peso
// Usar el repository para guardar la relación
$pcCriteriosConvocatoriasRepository->save($criteriosConvocatoria, true);
}
}
}
$convocatoriaObj = [
'id' => $convocatoria->getId(),
'nombre' => $convocatoria->getNombre(),
'descripcion' => $convocatoria->getDescripcion(),
'anio' => $convocatoria->getAnio(),
'bases' => $convocatoria->getBases(),
'presupuesto' => $convocatoria->getPresupuesto(),
'puntajeEvalCorte' => $convocatoria->getPuntajeEvalCorte(),
'cuestionarios' => $convocatoria->getCuestionarios(),
'documentos' => $convocatoria->getDocumentos(),
'estado' => $convocatoria->getEstado(),
'criterios' => $data['criterios'],
'apertura' => $convocatoria->getApertura(),
];
return new JsonResponse(['message' => 'Convocatoria creada con éxito', 'convocatoria' => $convocatoriaObj ], JsonResponse::HTTP_CREATED);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/convocatoria/{id}', name: 'actualizarConvocatoria', methods: ['PUT'])]
public function actualizarConvocatoria(
$id,
Request $request,
PcConvocatoriasRepository $pcConvocatoriaRepository,
PcCriteriosRepository $pcCriteriosRepository,
ValidatorInterface $validator,
ValidacionService $validacionService,
PcCriteriosConvocatoriasRepository $pcCriteriosConvocatoriasRepository,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$convocatoria = $pcConvocatoriaRepository->find($id);
if (!$convocatoria) {
return new JsonResponse(['error' => 'Convocatoria no encontrada'], JsonResponse::HTTP_NOT_FOUND);
}
$data = json_decode($request->getContent(), true);
if (!$validacionService->validacionesOrNulo([
$data['nombre'],
$data['descripcion'],
$data['estado']
], 'string')) {
return new JsonResponse(['error' => 'Los campos de nombre, descripcion, estado deben ser texto'], JsonResponse::HTTP_BAD_REQUEST);
}
if (!$validacionService->validacionesOrNulo([
$data['apertura']
], 'boolean')) {
return new JsonResponse(['error' => 'Apertura debe ser boolean'], JsonResponse::HTTP_BAD_REQUEST);
}
if (!$validacionService->validacionesOrNulo([
$data['presupuesto'],
$data['anio'],
$data['puntajeEvalCorte']
], 'integer')) {
return new JsonResponse(['error' => 'Los campos presupuesto, anio y puntajeEvalCorte debe ser numerico'], JsonResponse::HTTP_BAD_REQUEST);
}
if (!$validacionService->validacionesOrNulo([
$data['bases'],
$data['cuestionarios'],
$data['documentos']
], 'array')) {
return new JsonResponse(['error' => 'Los campos de bases, cuestionarios y documentos deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
}
$aperturaExistente = $convocatoria->getApertura();
if($aperturaExistente){
if(empty($data['estado'])){
return new JsonResponse(['error' => 'Estado no puede ser nulo porque la convocatoria ya esta aperturada'], JsonResponse::HTTP_BAD_REQUEST);
}
$convocatoria->setEstado($data['estado']);
} else {
$convocatoria->setNombre($data['nombre']);
$convocatoria->setDescripcion($data['descripcion']);
$convocatoria->setAnio((string) $data['anio']);
$convocatoria->setBases($data['bases']);
$convocatoria->setPresupuesto($data['presupuesto']);
$convocatoria->setPuntajeEvalCorte($data['puntajeEvalCorte']);
$convocatoria->setCuestionarios($data['cuestionarios']);
$convocatoria->setDocumentos($data['documentos']);
$convocatoria->setApertura($data['apertura']);
if($data['apertura']){
$convocatoria->setEstado('1');
}
}
// Validar con Symfony Validator
$errors = $validator->validate($convocatoria);
if (count($errors) > 0) {
$errorMessages = [];
foreach ($errors as $error) {
$errorMessages[] = $error->getMessage();
}
return new JsonResponse(['error' => $errorMessages], JsonResponse::HTTP_BAD_REQUEST);
}
$pcConvocatoriaRepository->save($convocatoria, true);
if (!$aperturaExistente && isset($data['criterios'])) {
// Eliminar los criterios actuales
foreach ($convocatoria->getCriterios() as $criterioConvocatoria) {
$pcCriteriosConvocatoriasRepository->remove($criterioConvocatoria, true);
}
// Agregar los nuevos criterios
foreach ($data['criterios'] as $criterioData) {
// Buscar el criterio por ID
$criterio = $pcCriteriosRepository->find($criterioData['id']);
if ($criterio) {
// Verificar si el criterio ya está asociado a la convocatoria
$criteriosConvocatoria = new PcCriteriosConvocatorias();
$criteriosConvocatoria->setConvocatorias($convocatoria);
$criteriosConvocatoria->setCriterios($criterio);
$criteriosConvocatoria->setPeso($criterioData['peso']); // Asignar el peso
// Usar el repository para guardar la relación
$pcCriteriosConvocatoriasRepository->save($criteriosConvocatoria, true);
}
}
}
$convocatoriaObj = [
'id' => $convocatoria->getId(),
'nombre' => $convocatoria->getNombre(),
'descripcion' => $convocatoria->getDescripcion(),
'anio' => $convocatoria->getAnio(),
'bases' => $convocatoria->getBases(),
'presupuesto' => $convocatoria->getPresupuesto(),
'puntajeEvalCorte' => $convocatoria->getPuntajeEvalCorte(),
'cuestionarios' => $convocatoria->getCuestionarios(),
'documentos' => $convocatoria->getDocumentos(),
'estado' => $convocatoria->getEstado(),
'criterios' => $data['criterios'],
'apertura' => $convocatoria->getApertura(),
];
return new JsonResponse(['message' => 'Convocatoria actualizada con éxito', 'convocatoria' => $convocatoriaObj]);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/criterios', name: 'obtenerCriterios', methods: ['GET'])]
public function obtenerCriterios(
PcCriteriosRepository $pcCriteriosRepository,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$criterios = $pcCriteriosRepository->findAll();
$data = [];
foreach ($criterios as $criterio) {
$data[] = [
'id' => $criterio->getId(),
'nombre' => $criterio->getNombre(),
'descripcion' => $criterio->getDescripcion(),
'puntajes' => $criterio->getPuntajes(),
];
}
return $this->json($data);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/criterio', name: 'crearCriterio', methods: ['POST'])]
public function crearCriterio(
Request $request,
PcConvocatoriasRepository $pcConvocatoriaRepository,
PcCriteriosRepository $pcCriteriosRepository,
ValidatorInterface $validator,
ValidacionService $validacionService,
PcCriteriosConvocatoriasRepository $pcCriteriosConvocatoriasRepository,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$data = json_decode($request->getContent(), true);
if (!$validacionService->validacionesOrNulo([
$data['nombre'],
$data['descripcion'],
], 'string')) {
return new JsonResponse(['error' => 'Los campos de nombre y descripción deben ser texto'], JsonResponse::HTTP_BAD_REQUEST);
}
if (!$validacionService->validacionesOrNulo([
$data['puntajes'],
], 'array')) {
return new JsonResponse(['error' => 'Los campos de puntajes deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
}
$criterio = new PcCriterios();
$criterio->setNombre($data['nombre']);
$criterio->setDescripcion($data['descripcion']);
$criterio->setPuntajes($data['puntajes']);
// Validar con Symfony Validator
$errors = $validator->validate($criterio);
if (count($errors) > 0) {
$errorMessages = [];
foreach ($errors as $error) {
$errorMessages[] = $error->getMessage();
}
return new JsonResponse(['error' => $errorMessages], JsonResponse::HTTP_BAD_REQUEST);
}
$pcCriteriosRepository->save($criterio, true);
$criterioObj = [
'id' => $criterio->getId(),
'nombre' => $criterio->getNombre(),
'descripcion' => $criterio->getDescripcion(),
'puntajes' => $criterio->getPuntajes(),
];
return new JsonResponse(['message' => 'Criterio creado con éxito', 'criterio' => $criterioObj ], JsonResponse::HTTP_CREATED);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/criterio/{id}', name: 'editarCriterio', methods: ['PUT'])]
public function editarCriterio(
$id,
Request $request,
PcConvocatoriasRepository $pcConvocatoriaRepository,
PcCriteriosRepository $pcCriteriosRepository,
ValidatorInterface $validator,
ValidacionService $validacionService,
PcCriteriosConvocatoriasRepository $pcCriteriosConvocatoriasRepository,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_ADMINISTRADOR_CON')) {
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$data = json_decode($request->getContent(), true);
if (!$validacionService->validacionesOrNulo([
$data['nombre'],
$data['descripcion'],
], 'string')) {
return new JsonResponse(['error' => 'Los campos de nombre y descripción deben ser texto'], JsonResponse::HTTP_BAD_REQUEST);
}
if (!$validacionService->validacionesOrNulo([
$data['puntajes'],
], 'array')) {
return new JsonResponse(['error' => 'Los campos de puntajes deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
}
$criterio = $pcCriteriosRepository->find($id);
if(!$criterio){
return new JsonResponse(['error' => 'Criterio no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
$criterio->setNombre($data['nombre']);
$criterio->setDescripcion($data['descripcion']);
$criterio->setPuntajes($data['puntajes']);
// Validar con Symfony Validator
$errors = $validator->validate($criterio);
if (count($errors) > 0) {
$errorMessages = [];
foreach ($errors as $error) {
$errorMessages[] = $error->getMessage();
}
return new JsonResponse(['error' => $errorMessages], JsonResponse::HTTP_BAD_REQUEST);
}
$pcCriteriosRepository->save($criterio, true);
$criterioObj = [
'id' => $criterio->getId(),
'nombre' => $criterio->getNombre(),
'descripcion' => $criterio->getDescripcion(),
'puntajes' => $criterio->getPuntajes(),
];
return new JsonResponse(['message' => 'Criterio actualizado con éxito', 'criterio' => $criterioObj ], JsonResponse::HTTP_CREATED);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
/**
* @Route("/secure/upload-file", name="uploadFile", methods={"POST"})
*/
public function uploadFile(Request $request,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if(
!$this->isGranted('ROLE_SUPER_ADMIN') &&
!$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
!$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
!$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_ADM')
){
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$file = $request->files->get('file');
if (!$file) {
return new JsonResponse(['error' => 'No hay documento'], 400);
}
try {
$originalName = $file->getClientOriginalName();
$newFilename = str_replace(' ', '_', $originalName) . '-' . uniqid() . '.' . $file->guessExtension();
$projectRoot = $this->getParameter('kernel.project_dir');
$dirToMove = $projectRoot . '/public/documentos/subidas';
if (!is_dir($dirToMove)) {
mkdir($dirToMove, 0777, true);
}
$file->move($dirToMove, $newFilename);
return new JsonResponse([
'message' => 'Documento subido con exito',
'original_name' => $originalName,
'new_filename' => $newFilename,
'path' => '/documentos/subidas/' . $newFilename,
], 200);
} catch (FileException $e) {
return new JsonResponse(['error' => 'Falla al subir archivo: ' . $e->getMessage()], 500);
}
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
/**
* @Route("/secure/download-file/{filename}", name="downloadFile", methods={"GET"})
*/
public function downloadFile(
string $filename,
Security $security
): Response
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if(
!$this->isGranted('ROLE_SUPER_ADMIN') &&
!$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
!$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
!$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_ADM')
){
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$projectRoot = $this->getParameter('kernel.project_dir');
$filePath = $projectRoot . '/public/documentos/subidas/' . $filename;
if (!file_exists($filePath)) {
throw $this->createNotFoundException("Archivo no encontrado: $filename");
}
// Devolver el archivo como una respuesta
$response = new BinaryFileResponse($filePath);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $filename);
return $response;
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/cargar', name: 'cargar', methods: ['POST'])]
public function cargarArchivos(
Request $request,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if(
!$this->isGranted('ROLE_SUPER_ADMIN') &&
!$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
!$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
!$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_ADM')
){
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$file = $request->files->get('file');
if (!$file) {
return new JsonResponse(['error' => 'No hay documento'], 400);
}
// Obtener configuración desde .env
$maxFileSizeMB = $_ENV['MAX_FILE_SIZE'] ?? 10;
$allowedExtensions = explode(',', $_ENV['ALLOWED_EXTENSIONS'] ?? '');
// Validar tamaño del archivo
$fileSizeMB = $file->getSize() / (1024 * 1024); // Convertir a MB
if ($fileSizeMB > $maxFileSizeMB) {
return new JsonResponse(['error' => "El archivo supera el tamaño máximo permitido de {$maxFileSizeMB}MB"], 400);
}
// Validar extensión
$extension = $file->guessExtension();
if (!in_array($extension, $allowedExtensions)) {
return new JsonResponse(['error' => "Extensión no permitida. Solo se aceptan: " . implode(', ', $allowedExtensions)], 400);
}
$postulacionId = $request->request->get('postulacionId');
$puntoCulturaId = $request->request->get('puntoCulturaId');
$convocatoriaId = $request->request->get('convocatoriaId');
$tipoDocumento = '';
if(!empty($postulacionId)){
$tipoDocumento="/pcpostulaciones/postulacion_" . $postulacionId;
} else if (!empty($puntoCulturaId)){
$tipoDocumento="/puntoscultura/puntocultura_" . $puntoCulturaId;
} else if (!empty($convocatoriaId)) {
$tipoDocumento="/pcconvocatorias/convocatoria_" . $convocatoriaId;
} else {
return new JsonResponse(['error' => 'postulacionId, puntoCulturaId o convocatoriaId requerido'], 400);
}
try {
$originalName = $file->getClientOriginalName();
$newFilename = str_replace(' ', '_', $originalName) . '-' . uniqid() . '.' . $file->guessExtension();
$projectRoot = $this->getParameter('kernel.project_dir');
$dirToMove = $projectRoot . '/public/documentos' . $tipoDocumento;
if (!is_dir($dirToMove)) {
mkdir($dirToMove, 0777, true);
}
$file->move($dirToMove, $newFilename);
return new JsonResponse([
'message' => 'Documento subido con exito',
'original_name' => $originalName,
'new_filename' => $newFilename,
'path' => '/documentos' . $tipoDocumento . '/' . $newFilename,
], 200);
} catch (FileException $e) {
return new JsonResponse(['error' => 'Falla al subir archivo: ' . $e->getMessage()], 500);
}
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/descargas', name: 'descargas', methods: ['POST'])]
public function descargas(
Request $request,
PcPostulacionRepository $pcPostulacionRepository,
ValidacionService $validacionService,
Security $security
): Response
{
try {
//POSTULACION
//PUNTO CULTURA
//CONVOCATORIA
//POSTULACION PUNTO CULTURA
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if(
!$this->isGranted('ROLE_SUPER_ADMIN') &&
!$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
!$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
!$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_ADM')
){
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$data = json_decode($request->getContent(), true);
$path = $data['path'];
if(empty($path)){
return new JsonResponse(['error' => 'Falta enviar path'],
JsonResponse::HTTP_BAD_REQUEST);
}
// $rutaAlArchivo = explode("/", $path);
$projectRoot = $this->getParameter('kernel.project_dir');
$filePath = $projectRoot . '/public' . $path;
if (!file_exists($filePath)) {
throw $this->createNotFoundException("Archivo no encontrado");
}
$rutasArchivo = explode("/", $path);
$filename = $rutasArchivo[count($rutasArchivo)-1];
// Devolver el archivo como una respuesta
$response = new BinaryFileResponse($filePath);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $filename);
return $response;
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/postulacion/{id}', name: 'obtenerPostulacion', methods: ['GET'])]
public function obtenerPostulacion(
$id, PcPostulacionRepository $pcPostulacionRepository,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if(
!$this->isGranted('ROLE_SUPER_ADMIN') &&
!$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
!$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
!$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_ADM')
){
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$postulacion = $pcPostulacionRepository->find($id);
if (!$postulacion) {
return new JsonResponse(['error' => 'Postulacion no encontrada'], JsonResponse::HTTP_NOT_FOUND);
}
$usuarioAdmisibilidad = $postulacion->getUsuarioAdmisibilidad();
$usuarioEvaluacion = $postulacion->getUsuarioEvaluacion();
$usuarioSeleccion = $postulacion->getUsuarioSeleccion();
return $this->json([
'id' => $postulacion->getId(),
'montoRequerido' => $postulacion->getMontoRequerido(),
'formularioPostulacion' => $postulacion->getFormularioPostulacion(),
'documentosPostulacion' => $postulacion->getDocumentosPostulacion(),
'certificadoPostulacion' => $postulacion->getCertificadoPostulacion(),
'resultadoAdmisibilidad' => $postulacion->getResultadoAdmisibilidad(),
'estadoAdmisibilidad' => $postulacion->getEstadoAdmisibilidad(),
'formularioAdmisibilidad' => $postulacion->getFormularioAdmisibilidad(),
'notaFinalEvaluacion' => $postulacion->getNotaFinalEvaluacion(),
'formularioEvaluacion' => $postulacion->getFormularioEvaluacion(),
'estadoEvaluacion' => $postulacion->getEstadoEvaluacion(),
'formularioSeleccion' => $postulacion->getFormularioSeleccion(),
'estadoSeleccion' => $postulacion->getEstadoSeleccion(),
'formularioSeleccion' => $postulacion->getFormularioSeleccion(),
'estado' => $postulacion->getEstado(),
'resultadoSeleccion' => $postulacion->getResultadoSeleccion(),
'montoAdjudicado' => $postulacion->getMontoAdjudicado(),
'usuarioAdmisibilidad' => $usuarioAdmisibilidad ? $usuarioAdmisibilidad->getNombres() : null,
'usuarioEvaluacion' => $usuarioEvaluacion ? $usuarioEvaluacion->getNombres() : null,
'usuarioSeleccion' => $usuarioSeleccion ? $usuarioSeleccion->getNombres() : null,
'admisibilidadAt' => $postulacion->getAdmisibilidadAt(),
'evaluacionAt' => $postulacion->getEvaluacionAt(),
'seleccionAt' => $postulacion->getSeleccionAt(),
'anexos' => $postulacion->getDocumentos(),
'convocatoriaId' => $postulacion->getConvocatoria()->getId(),
'convocatoriaNombre' => $postulacion->getConvocatoria()->getNombre(),
'puntoCulturaId' => $postulacion->getPuntoCultura()->getId(),
'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
'editarColectivo' => $postulacion->isEditableEvaluacion(),
'editarSeleccion' => $postulacion->isEditableSeleccion(),
]);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/postulaciones', name: 'obtenerPostulaciones', methods: ['GET'])]
public function obtenerPostulaciones(
PcPostulacionRepository $pcPostulacionRepository,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if(
!$this->isGranted('ROLE_SUPER_ADMIN') &&
!$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
!$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
!$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_ADM')
){
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$userActual = $security->getUser();
$regiones = $userActual->getRegiones();
$regionesLabel = [];
foreach($regiones as $regionOb){
$regionesLabel[] = $regionOb->getNombre();
}
if (!$userActual) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
$postulaciones = $pcPostulacionRepository->findByRegiones($regionesLabel, $userActual->isSuperAdmin());
//Filtrar las que no tienen postulaciones
$postulacionesJson = [];
foreach ($postulaciones as $postulacion) {
$convocatoria = $postulacion->getConvocatoria();
$puntoCultura = $postulacion->getPuntoCultura();
$postulacionesJson[] = [
'id' => $postulacion->getId(),
'nombreOrganizacion' => $puntoCultura->getNombre(),
'rut' => $puntoCultura->getRut() . '-' . $puntoCultura->getDv(),
'region' => $puntoCultura->getRegion(),
'convocatoria' => $convocatoria->getNombre(),
'evaluacion' => $postulacion->getEtapaPostulacion(),
'resultadoEvaluacion' => $postulacion->getResultadoPostulacion(),
'notaFinal' =>
$postulacion->getEstadoEvaluacion() == 'send'
? $postulacion->getNotaFinalEvaluacion()
: null,
'estadoConvocatoria' => $convocatoria->getEstado(),
'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
'editarColectivo' => $postulacion->isEditableEvaluacion(),
'editarSeleccion' => $postulacion->isEditableSeleccion(),
];
}
return $this->json(['postulaciones' => $postulacionesJson]);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/postulacion/{id}/admisibilidad', name: 'procesoAdmisibilidad', methods: ['PUT'])]
public function procesoAdmisibilidad(
$id,
Request $request,
PcPostulacionRepository $pcPostulacionRepository,
ValidacionService $validacionService,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_EVALUADOR_ADM')) {
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$postulacion = $pcPostulacionRepository->findByIdAdmin($id);
if (!$postulacion) {
return new JsonResponse(['error' => 'Postulacion no encontrada'], JsonResponse::HTTP_NOT_FOUND);
}
if ($postulacion->getEstadoAdmisibilidad() == 'send') {
return new JsonResponse(['error' => 'El formulario ya fue calificado'], JsonResponse::HTTP_BAD_REQUEST);
}
$usuarioAdmisibilidadActual = $postulacion->getUsuarioAdmisibilidad();
if(!empty($usuarioAdmisibilidadActual) && $usuarioAdmisibilidadActual->getId() !== $user->getId()){
return new JsonResponse(['error' => 'Usuario responsable es ' . $usuarioAdmisibilidadActual->getNombres()],
JsonResponse::HTTP_BAD_REQUEST);
}
$data = json_decode($request->getContent(), true);
if (!$validacionService->validaciones([
$data['formularioAdmisibilidad'],
], 'array')) {
return new JsonResponse(['error' => 'formularioAdmisibilidad deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
}
if (!empty($data['estado']) && ($data['estado'] !== 'save' && $data['estado'] !== 'send')) {
return new JsonResponse(['error' => 'Solo se permite estado save y send'], JsonResponse::HTTP_BAD_REQUEST);
}
if($data['estado'] == 'send'){
$respuesta = $data['formularioAdmisibilidad']['1']['respuesta'];
$postulacion->setResultadoAdmisibilidad($respuesta == 'Si');
}
$now = new DateTime();
$postulacion->setUsuarioAdmisibilidad($user);
$postulacion->setAdmisibilidadAt($now);
$postulacion->setFormularioAdmisibilidad($data['formularioAdmisibilidad']);
$postulacion->setEstadoAdmisibilidad($data['estado']);
$pcPostulacionRepository->save($postulacion, true);
$postulacionObj = [
'id' => $postulacion->getId(),
'notaFinal' =>
$postulacion->getEstadoEvaluacion() == 'send'
? $postulacion->getNotaFinalEvaluacion()
: null,
'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
'editarColectivo' => $postulacion->isEditableEvaluacion(),
'editarSeleccion' => $postulacion->isEditableSeleccion(),
];
return new JsonResponse(['message' => 'Postulacion actualizada con éxito', 'postulacion' => $postulacionObj]);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/postulacion/{id}/colectivo', name: 'procesoColectivo', methods: ['PUT'])]
public function procesoColectivo(
$id,
Request $request,
PcPostulacionRepository $pcPostulacionRepository,
ValidacionService $validacionService,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_EVALUADOR_COL')) {
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$postulacion = $pcPostulacionRepository->findByIdAdmin($id);
if (!$postulacion) {
return new JsonResponse(['error' => 'Postulacion no encontrada'], JsonResponse::HTTP_NOT_FOUND);
}
if ($postulacion->getEstadoEvaluacion() == 'send') {
return new JsonResponse(['error' => 'El formulario ya fue calificado'], JsonResponse::HTTP_BAD_REQUEST);
}
$usuarioEvaluacionActual = $postulacion->getUsuarioEvaluacion();
if(!empty($usuarioEvaluacionActual) && $usuarioEvaluacionActual->getId() !== $user->getId()){
return new JsonResponse(['error' => 'Usuario responsable es ' . $usuarioEvaluacionActual->getNombres()],
JsonResponse::HTTP_BAD_REQUEST);
}
$data = json_decode($request->getContent(), true);
if (!$validacionService->validaciones([
$data['formularioEvaluacion'],
], 'array')) {
return new JsonResponse(['error' => 'formularioEvaluacion deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
}
if (!empty($data['estado']) && ($data['estado'] !== 'save' && $data['estado'] !== 'send')) {
return new JsonResponse(['error' => 'Solo se permite estado save y send'], JsonResponse::HTTP_BAD_REQUEST);
}
if($data['estado'] == 'send'){
$notaFinal = 0;
$pesoTotal = 0;
foreach($data['formularioEvaluacion'] as $criterio){
if($criterio['tipo'] == 'criterio'){
$pesoTotal = $pesoTotal + (float) $criterio['peso'];
$notaFinal = $notaFinal + ((float) $criterio['peso'] * (float) $criterio['valor']);
}
}
$notaFinal = $notaFinal / $pesoTotal;
$postulacion->setNotaFinalEvaluacion($notaFinal);
}
$now = new DateTime();
$postulacion->setUsuarioEvaluacion($user);
$postulacion->setEvaluacionAt($now);
$postulacion->setFormularioEvaluacion($data['formularioEvaluacion']);
$postulacion->setEstadoEvaluacion($data['estado']);
$pcPostulacionRepository->save($postulacion, true);
$postulacionObj = [
'id' => $postulacion->getId(),
'notaFinal' =>
$postulacion->getEstadoEvaluacion() == 'send'
? $postulacion->getNotaFinalEvaluacion()
: null,
'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
'editarColectivo' => $postulacion->isEditableEvaluacion(),
'editarSeleccion' => $postulacion->isEditableSeleccion(),
];
return new JsonResponse(['message' => 'Postulacion actualizada con éxito', 'postulacion' => $postulacionObj]);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/postulacion/{id}/seleccion', name: 'procesoSeleccion', methods: ['PUT'])]
public function procesoSeleccion(
$id,
Request $request,
PcPostulacionRepository $pcPostulacionRepository,
ValidacionService $validacionService,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if (!$this->isGranted('ROLE_SUPER_ADMIN') && !$this->isGranted('ROLE_PU_EVALUADOR_SEL')) {
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$postulacion = $pcPostulacionRepository->findByIdAdmin($id);
if (!$postulacion) {
return new JsonResponse(['error' => 'Postulacion no encontrada'], JsonResponse::HTTP_NOT_FOUND);
}
if ($postulacion->getEstadoSeleccion() == 'send') {
return new JsonResponse(['error' => 'El formulario ya fue calificado'], JsonResponse::HTTP_BAD_REQUEST);
}
$usuarioSeleccionActual = $postulacion->getUsuarioSeleccion();
if(!empty($usuarioSeleccionActual) && $usuarioSeleccionActual->getId() !== $user->getId()){
return new JsonResponse(['error' => 'Usuario responsable es ' . $usuarioSeleccionActual->getNombres()],
JsonResponse::HTTP_BAD_REQUEST);
}
$data = json_decode($request->getContent(), true);
if (!$validacionService->validaciones([
$data['formularioSeleccion'],
], 'array')) {
return new JsonResponse(['error' => 'formularioSeleccion deben ser objetos'], JsonResponse::HTTP_BAD_REQUEST);
}
if (!empty($data['estado']) && ($data['estado'] !== 'save' && $data['estado'] !== 'send')) {
return new JsonResponse(['error' => 'Solo se permite estado save y send'], JsonResponse::HTTP_BAD_REQUEST);
}
if($data['estado'] == 'send'){
$respuesta = $data['formularioSeleccion']['1']['respuesta'];
$montoAdjudicado = $data['formularioSeleccion']['2']['respuesta'];
$postulacion->setMontoAdjudicado((int) $montoAdjudicado);
$postulacion->setResultadoSeleccion($respuesta == 'Seleccionado');
}
$now = new DateTime();
$postulacion->setUsuarioSeleccion($user);
$postulacion->setSeleccionAt($now);
$postulacion->setFormularioSeleccion($data['formularioSeleccion']);
$postulacion->setEstadoSeleccion($data['estado']);
$pcPostulacionRepository->save($postulacion, true);
$postulacionObj = [
'id' => $postulacion->getId(),
'notaFinal' =>
$postulacion->getEstadoEvaluacion() == 'send'
? $postulacion->getNotaFinalEvaluacion()
: null,
'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
'editarColectivo' => $postulacion->isEditableEvaluacion(),
'editarSeleccion' => $postulacion->isEditableSeleccion(),
];
return new JsonResponse(['message' => 'Postulacion actualizada con éxito', 'postulacion' => $postulacionObj]);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/puntocultura/{id}', name: 'obtenerPuntoCultura', methods: ['GET'])]
public function obtenerPuntoCultura(
$id,
PcPuntoCulturaRepository $pcPuntoCulturaRepository,
RacService $racService,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if(
!$this->isGranted('ROLE_SUPER_ADMIN') &&
!$this->isGranted('ROLE_PU_ADMINISTRADOR_CON') &&
!$this->isGranted('ROLE_PU_SUPERVISOR_POS') &&
!$this->isGranted('ROLE_PU_EVALUADOR_SEL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_COL') &&
!$this->isGranted('ROLE_PU_EVALUADOR_ADM')
){
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$punto = $pcPuntoCulturaRepository->findActivo($id);
if (!$punto) {
return new JsonResponse(['error' => 'Punto no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
$rut = $punto->getRut();
$dv = $punto->getDv();
$userRut = strval(number_format((int) $rut, 0, '', '.')) . '-' . $dv;
$organizaciones = $racService->getRegisterRac($userRut);
$organizacionId = (string) $punto->getOrganizacionComunitariaId();
$rac = null;
//org_id
foreach($organizaciones as $org){
if(empty($org['org_id'])) continue;
$org_id = $org['org_id'];
if($organizacionId == $org_id){
$rac = $org;
}
}
return $this->json([
'id' => $punto->getId(),
'nombre' => $punto->getNombre() ?? '',
'resenia' => $punto->getResenia() ?? '',
'region' => $punto->getRegion() ?? '',
'comuna' => $punto->getComuna() ?? '',
'direccion' => $punto->getDireccion() ?? '',
'georeferencia' => $punto->getGeoreferencia() ?? '',
'nombre_contacto' => $punto->getNombreContacto() ?? '',
'email_contacto' => $punto->getEmailContacto() ?? '',
'redes_sociales' => $punto->getRedesSociales(),
'certificado_punto' => $punto->getCertificadoPunto() ?? '',
'nombre_persona_juridica' => $punto->getNombrePersonaJuridica() ?? '',
'nombre_representante_legal' => $punto->getNombreRepresentanteLegal() ?? '',
'rut_persona_juridica' => $punto->getRutPersonaJuridica() ?? '',
'rut_representante_legal' => $punto->getRutRepresentanteLegal() ?? '',
'direccion_postal' => $punto->getDireccionPostal() ?? '',
'correo_electronico_1' => $punto->getCorreoElectronico1() ?? '',
'correo_electronico_2' => $punto->getCorreoElectronico2() ?? '',
'telefono_1' => $punto->getTelefono1() ?? '',
'telefono_2' => $punto->getTelefono2() ?? '',
'organizacion_comunitaria_id' => $punto->getOrganizacionComunitariaId(),
'doc_estatuto_organizacion' => $punto->getDocEstatutoOrganizacion(),
'doc_certificado_vigencia_persona_juridica' => $punto->getDocCertificadoVigenciaPersonaJuridica(),
'doc_acredita_personeria_vigente' => $punto->getDocAcreditaPersoneriaVigente(),
'doc_listado_personas'=> $punto->getDocListadoPersonas(),
'documentos' => $punto->getDocumentos(),
'rut' => $punto->getRut(),
'dv' => $punto->getDv(),
'rac' => $rac,
]);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/postulaciones/admisibilidad', name: 'obtenerPostulacionesAdmisibilidad', methods: ['GET'])]
public function obtenerPostulacionesAdmisibilidad(
PcPostulacionRepository $pcPostulacionRepository,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if(
!$this->isGranted('ROLE_SUPER_ADMIN') &&
!$this->isGranted('ROLE_PU_EVALUADOR_ADM')
){
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$userActual = $security->getUser();
$regiones = $userActual->getRegiones();
$regionesLabel = [];
foreach($regiones as $regionOb){
$regionesLabel[] = $regionOb->getNombre();
}
if (!$userActual) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
$postulaciones = $pcPostulacionRepository->findByRegionesAdmisibilidad($regionesLabel, $userActual->isSuperAdmin());
//Filtrar las que no tienen postulaciones
$postulacionesJson = [];
foreach ($postulaciones as $postulacion) {
$convocatoria = $postulacion->getConvocatoria();
$puntoCultura = $postulacion->getPuntoCultura();
$postulacionesJson[] = [
'id' => $postulacion->getId(),
'nombreOrganizacion' => $puntoCultura->getNombre(),
'rut' => $puntoCultura->getRut() . '-' . $puntoCultura->getDv(),
'region' => $puntoCultura->getRegion(),
'convocatoria' => $convocatoria->getNombre(),
'notaFinal' =>
$postulacion->getEstadoEvaluacion() == 'send'
? $postulacion->getNotaFinalEvaluacion()
: null,
'estadoConvocatoria' => $convocatoria->getEstado(),
'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
'editarColectivo' => $postulacion->isEditableEvaluacion(),
'editarSeleccion' => $postulacion->isEditableSeleccion(),
'evaluacion' => $postulacion->getEtapaPostulacion(),
'resultadoEvaluacion' => $postulacion->getResultadoPostulacion(),
];
}
return $this->json(['postulaciones' => $postulacionesJson]);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/postulaciones/colectivo', name: 'obtenerPostulacionesColectivo', methods: ['GET'])]
public function obtenerPostulacionesColectivo(
PcPostulacionRepository $pcPostulacionRepository,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if(
!$this->isGranted('ROLE_SUPER_ADMIN') &&
!$this->isGranted('ROLE_PU_EVALUADOR_ADM')
){
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$userActual = $security->getUser();
$regiones = $userActual->getRegiones();
$regionesLabel = [];
foreach($regiones as $regionOb){
$regionesLabel[] = $regionOb->getNombre();
}
if (!$userActual) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
$postulaciones = $pcPostulacionRepository->findByRegionesEvaluacion($regionesLabel, $userActual->isSuperAdmin());
//Filtrar las que no tienen postulaciones
$postulacionesJson = [];
foreach ($postulaciones as $postulacion) {
$convocatoria = $postulacion->getConvocatoria();
$puntoCultura = $postulacion->getPuntoCultura();
$postulacionesJson[] = [
'id' => $postulacion->getId(),
'nombreOrganizacion' => $puntoCultura->getNombre(),
'rut' => $puntoCultura->getRut() . '-' . $puntoCultura->getDv(),
'region' => $puntoCultura->getRegion(),
'convocatoria' => $convocatoria->getNombre(),
'evaluacion' => $postulacion->getEtapaPostulacion(),
'resultadoEvaluacion' => $postulacion->getResultadoPostulacion(),
'notaFinal' =>
$postulacion->getEstadoEvaluacion() == 'send'
? $postulacion->getNotaFinalEvaluacion()
: null,
'estadoConvocatoria' => $convocatoria->getEstado(),
'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
'editarColectivo' => $postulacion->isEditableEvaluacion(),
'editarSeleccion' => $postulacion->isEditableSeleccion(),
];
}
return $this->json(['postulaciones' => $postulacionesJson]);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
#[Route('/secure/postulaciones/seleccion', name: 'obtenerPostulacionesSeleccion', methods: ['GET'])]
public function obtenerPostulacionesSeleccion(
PcPostulacionRepository $pcPostulacionRepository,
Security $security
): JsonResponse
{
try {
$user = $security->getUser();
if (!$user) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
if (!$user->isActivo()) {
return new JsonResponse(['error' => 'Usuario no está activo'], JsonResponse::HTTP_FORBIDDEN);
}
if(
!$this->isGranted('ROLE_SUPER_ADMIN') &&
!$this->isGranted('ROLE_PU_EVALUADOR_ADM')
){
return new JsonResponse(['error' => 'Acceso denegado'], 403);
}
$userActual = $security->getUser();
$regiones = $userActual->getRegiones();
$regionesLabel = [];
foreach($regiones as $regionOb){
$regionesLabel[] = $regionOb->getNombre();
}
if (!$userActual) {
return new JsonResponse(['error' => 'Usuario no encontrado'], JsonResponse::HTTP_NOT_FOUND);
}
$postulaciones = $pcPostulacionRepository->findByRegionesSeleccion($regionesLabel, $userActual->isSuperAdmin());
//Filtrar las que no tienen postulaciones
$postulacionesJson = [];
foreach ($postulaciones as $postulacion) {
$convocatoria = $postulacion->getConvocatoria();
$puntoCultura = $postulacion->getPuntoCultura();
$postulacionesJson[] = [
'id' => $postulacion->getId(),
'nombreOrganizacion' => $puntoCultura->getNombre(),
'rut' => $puntoCultura->getRut() . '-' . $puntoCultura->getDv(),
'region' => $puntoCultura->getRegion(),
'convocatoria' => $convocatoria->getNombre(),
'evaluacion' => $postulacion->getEtapaPostulacion(),
'resultadoEvaluacion' => $postulacion->getResultadoPostulacion(),
'notaFinal' =>
$postulacion->getEstadoEvaluacion() == 'send'
? $postulacion->getNotaFinalEvaluacion()
: null,
'estadoConvocatoria' => $convocatoria->getEstado(),
'editarAdminsibilidad' => $postulacion->isEditableAdmisibilidad(),
'editarColectivo' => $postulacion->isEditableEvaluacion(),
'editarSeleccion' => $postulacion->isEditableSeleccion(),
];
}
return $this->json(['postulaciones' => $postulacionesJson]);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
}
}