Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17025 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
17023 ariadna 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Controller;
6
 
7
use Laminas\Mvc\Controller\AbstractActionController;
8
use Laminas\View\Model\ViewModel;
9
use Laminas\View\Model\JsonModel;
10
use Laminas\Db\Adapter\AdapterInterface;
11
use Laminas\Db\Sql\Select;
12
use Laminas\Db\Sql\Sql;
13
use Laminas\Db\ResultSet\HydratingResultSet;
14
use Laminas\Hydrator\ArraySerializableHydrator;
15
use LeadersLinked\Mapper\RecruitmentSelectionVacancyMapper;
16
use LeadersLinked\Mapper\JobDescriptionMapper;
17
use LeadersLinked\Mapper\JobCategoryMapper;
18
use LeadersLinked\Mapper\LocationMapper;
19
use LeadersLinked\Library\QueryMapper;
20
use ArrayObject;
21
 
22
 
23
class RecruitmentSelectionVacancyCriteriaController extends AbstractActionController
24
{
25
    public function indexAction()
26
    {
27
        $request = $this->getRequest();
28
 
29
        // 🔹 Validar si la solicitud es POST
30
        if (!$request->isPost()) {
31
            return new JsonModel([
32
                'success' => false,
33
                'message' => 'Invalid request method'
34
            ]);
35
        }
36
 
37
        // 🔹 Obtener el ID de la URL
38
        $vacancyId = $this->params()->fromRoute('id', null);
39
 
40
        // 🔹 Verificar si el ID es válido
41
        if (!$vacancyId) {
42
            return new JsonModel([
43
                'success' => false,
44
                'message' => 'Missing vacancy ID'
45
            ]);
46
        }
47
 
48
        // 🔹 Construcción de la consulta con QueryMapper
49
        $queryMapper = QueryMapper::getInstance($this->adapter);
50
        $select = $queryMapper->getSql()->select();
51
        $select->from(['tb1' => RecruitmentSelectionVacancyMapper::_TABLE]);
52
        $select->columns(['uuid', 'name', 'last_date', 'status']);
53
 
54
        // 🔹 JOIN con JobDescriptionMapper (incluyendo functions y objectives)
55
        $select->join(
56
            ['tb2' => JobDescriptionMapper::_TABLE],
57
            'tb1.job_description_id = tb2.id AND tb1.company_id = tb2.company_id',
58
            [
59
                'job_description' => 'name',
60
                'job_functions'   => 'functions',
61
                'job_objectives'  => 'objectives'
62
            ]
63
        );
64
 
65
        // 🔹 JOIN con JobCategoryMapper (para obtener nombre y descripción de la categoría)
66
        $select->join(
67
            ['tb3' => JobCategoryMapper::_TABLE],
68
            'tb1.job_category_id = tb3.id',
69
            [
70
                'category_name'        => 'name',
71
                'category_description' => 'description'
72
            ]
73
        );
74
 
75
        // 🔹 JOIN con LocationMapper (para obtener país y dirección formateada)
76
        $select->join(
77
            ['tb4' => LocationMapper::_TABLE],
78
            'tb1.location_id = tb4.id',
79
            [
80
                'location_country' => 'country',
81
                'location_address' => 'formatted_address'
82
            ]
83
        );
84
 
85
        // 🔹 Filtrar por el ID de la vacante
86
        $select->where->equalTo('tb1.id', $vacancyId);
87
 
88
        // 🔹 Ejecutar la consulta
89
        $statement = $queryMapper->getSql()->prepareStatementForSqlObject($select);
90
        $resultSet = $statement->execute();
91
 
92
        // 🔹 Procesar los resultados
93
        $hydrator = new ArraySerializableHydrator();
94
        $hydratingResultSet = new HydratingResultSet($hydrator, new ArrayObject());
95
        $hydratingResultSet->initialize($resultSet);
96
 
97
        // 🔹 Convertir los resultados a array
98
        $vacancyData = [];
99
        foreach ($hydratingResultSet as $row) {
100
            $vacancyData[] = $row;
101
        }
102
 
103
        // 🔹 Validar si no se encontraron resultados
104
        if (empty($vacancyData)) {
105
            return new JsonModel([
106
                'success' => false,
107
                'message' => 'Vacancy not found'
108
            ]);
109
        }
110
 
111
        // 🔹 Retornar la vacante en formato JSON
112
        return new JsonModel([
113
            'success' => true,
114
            'data' => $vacancyData
115
        ]);
116
    }
117
}