Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17025 | Rev 17030 | Ir a la última revisión | | Comparar con el anterior | 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
{
17025 ariadna 25
 
26
    /**
27
     *
28
     * @var \Laminas\Db\Adapter\AdapterInterface
29
     */
30
    private $adapter;
31
 
32
    /**
33
     *
34
     * @var \LeadersLinked\Cache\CacheInterface
35
     */
36
    private $cache;
37
 
38
 
39
    /**
40
     *
41
     * @var \Laminas\Log\LoggerInterface
42
     */
43
    private $logger;
44
 
45
    /**
46
     *
47
     * @var array
48
     */
49
    private $config;
50
 
51
 
52
    /**
53
     *
54
     * @var \Laminas\Mvc\I18n\Translator
55
     */
56
    private $translator;
57
 
58
 
59
    /**
60
     *
61
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
62
     * @param \LeadersLinked\Cache\CacheInterface $cache
63
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
64
     * @param array $config
65
     * @param \Laminas\Mvc\I18n\Translator $translator
66
     */
67
    public function __construct($adapter, $cache, $logger, $config, $translator)
68
    {
69
        $this->adapter      = $adapter;
70
        $this->cache        = $cache;
71
        $this->logger       = $logger;
72
        $this->config       = $config;
73
        $this->translator   = $translator;
74
    }
75
 
17023 ariadna 76
    public function indexAction()
77
    {
78
        $request = $this->getRequest();
79
 
80
        // 🔹 Validar si la solicitud es POST
81
        if (!$request->isPost()) {
82
            return new JsonModel([
83
                'success' => false,
84
                'message' => 'Invalid request method'
85
            ]);
86
        }
87
 
88
        // 🔹 Obtener el ID de la URL
17029 ariadna 89
        $data = json_decode($request->getContent(), true);
90
        $vacancyId = $data['id'] ?? null;
17023 ariadna 91
 
92
        // 🔹 Verificar si el ID es válido
93
        if (!$vacancyId) {
94
            return new JsonModel([
95
                'success' => false,
96
                'message' => 'Missing vacancy ID'
97
            ]);
98
        }
99
 
100
        // 🔹 Construcción de la consulta con QueryMapper
101
        $queryMapper = QueryMapper::getInstance($this->adapter);
102
        $select = $queryMapper->getSql()->select();
103
        $select->from(['tb1' => RecruitmentSelectionVacancyMapper::_TABLE]);
104
        $select->columns(['uuid', 'name', 'last_date', 'status']);
105
 
106
        // 🔹 JOIN con JobDescriptionMapper (incluyendo functions y objectives)
107
        $select->join(
108
            ['tb2' => JobDescriptionMapper::_TABLE],
109
            'tb1.job_description_id = tb2.id AND tb1.company_id = tb2.company_id',
110
            [
111
                'job_description' => 'name',
112
                'job_functions'   => 'functions',
113
                'job_objectives'  => 'objectives'
114
            ]
115
        );
116
 
117
        // 🔹 JOIN con JobCategoryMapper (para obtener nombre y descripción de la categoría)
118
        $select->join(
119
            ['tb3' => JobCategoryMapper::_TABLE],
120
            'tb1.job_category_id = tb3.id',
121
            [
122
                'category_name'        => 'name',
123
                'category_description' => 'description'
124
            ]
125
        );
126
 
127
        // 🔹 JOIN con LocationMapper (para obtener país y dirección formateada)
128
        $select->join(
129
            ['tb4' => LocationMapper::_TABLE],
130
            'tb1.location_id = tb4.id',
131
            [
132
                'location_country' => 'country',
133
                'location_address' => 'formatted_address'
134
            ]
135
        );
136
 
137
        // 🔹 Filtrar por el ID de la vacante
138
        $select->where->equalTo('tb1.id', $vacancyId);
139
 
140
        // 🔹 Ejecutar la consulta
141
        $statement = $queryMapper->getSql()->prepareStatementForSqlObject($select);
142
        $resultSet = $statement->execute();
143
 
144
        // 🔹 Procesar los resultados
145
        $hydrator = new ArraySerializableHydrator();
146
        $hydratingResultSet = new HydratingResultSet($hydrator, new ArrayObject());
147
        $hydratingResultSet->initialize($resultSet);
148
 
149
        // 🔹 Convertir los resultados a array
150
        $vacancyData = [];
151
        foreach ($hydratingResultSet as $row) {
152
            $vacancyData[] = $row;
153
        }
154
 
155
        // 🔹 Validar si no se encontraron resultados
156
        if (empty($vacancyData)) {
157
            return new JsonModel([
158
                'success' => false,
159
                'message' => 'Vacancy not found'
160
            ]);
161
        }
162
 
163
        // 🔹 Retornar la vacante en formato JSON
164
        return new JsonModel([
165
            'success' => true,
166
            'data' => $vacancyData
167
        ]);
168
    }
169
}