Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17033 | 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
 
17034 ariadna 80
 
81
 
17023 ariadna 82
        // 🔹 Validar si la solicitud es POST
83
        if (!$request->isPost()) {
84
            return new JsonModel([
85
                'success' => false,
86
                'message' => 'Invalid request method'
87
            ]);
88
        }
89
 
17034 ariadna 90
        // 🔹 Obtener usuario y permisos ACL
91
        $currentUserPlugin = $this->plugin('currentUserPlugin');
92
        $currentUser = $currentUserPlugin->getUser();
93
        $acl = $this->getEvent()->getViewModel()->getVariable('acl');
94
 
95
        // 🔹 Verificar si el usuario tiene permiso para extraer criterios
96
        if (!$acl->isAllowed($currentUser->usertype_id, 'recruitment-and-selection/vacancies/extract-criteria')) {
97
            return new JsonModel([
98
                'success' => false,
99
                'message' => 'Access denied'
100
            ]);
101
        }
102
 
17031 ariadna 103
        // 🔹 Obtener el ID desde form-data
17030 ariadna 104
        $vacancyId = $this->params()->fromPost('id');
17023 ariadna 105
 
106
        // 🔹 Verificar si el ID es válido
107
        if (!$vacancyId) {
108
            return new JsonModel([
109
                'success' => false,
110
                'message' => 'Missing vacancy ID'
111
            ]);
112
        }
113
 
114
        // 🔹 Construcción de la consulta con QueryMapper
115
        $queryMapper = QueryMapper::getInstance($this->adapter);
116
        $select = $queryMapper->getSql()->select();
117
        $select->from(['tb1' => RecruitmentSelectionVacancyMapper::_TABLE]);
118
        $select->columns(['uuid', 'name', 'last_date', 'status']);
119
 
120
        // 🔹 JOIN con JobDescriptionMapper (incluyendo functions y objectives)
121
        $select->join(
122
            ['tb2' => JobDescriptionMapper::_TABLE],
123
            'tb1.job_description_id = tb2.id AND tb1.company_id = tb2.company_id',
124
            [
17033 ariadna 125
                'job_description_name' => 'name',
126
                'job_description_functions'   => 'functions',
127
                'job_description_objectives'  => 'objectives'
17023 ariadna 128
            ]
129
        );
130
 
131
        // 🔹 JOIN con JobCategoryMapper (para obtener nombre y descripción de la categoría)
132
        $select->join(
133
            ['tb3' => JobCategoryMapper::_TABLE],
134
            'tb1.job_category_id = tb3.id',
135
            [
17033 ariadna 136
                'job_category_name'        => 'name',
137
                'job_category_description' => 'description'
17023 ariadna 138
            ]
139
        );
140
 
141
        // 🔹 JOIN con LocationMapper (para obtener país y dirección formateada)
142
        $select->join(
143
            ['tb4' => LocationMapper::_TABLE],
144
            'tb1.location_id = tb4.id',
145
            [
17033 ariadna 146
                'job_location_country' => 'country',
147
                'job_location_address' => 'formatted_address'
17023 ariadna 148
            ]
149
        );
150
 
151
        // 🔹 Filtrar por el ID de la vacante
152
        $select->where->equalTo('tb1.id', $vacancyId);
153
 
154
        // 🔹 Ejecutar la consulta
155
        $statement = $queryMapper->getSql()->prepareStatementForSqlObject($select);
156
        $resultSet = $statement->execute();
157
 
158
        // 🔹 Procesar los resultados
159
        $hydrator = new ArraySerializableHydrator();
17031 ariadna 160
        $hydratingResultSet = new HydratingResultSet($hydrator);
17023 ariadna 161
        $hydratingResultSet->initialize($resultSet);
162
 
17031 ariadna 163
        // 🔹 Obtener un solo resultado como diccionario
164
        $vacancyData = $hydratingResultSet->current();
17023 ariadna 165
 
17031 ariadna 166
        // 🔹 Validar si no se encontró la vacante
167
        if (!$vacancyData) {
17023 ariadna 168
            return new JsonModel([
169
                'success' => false,
170
                'message' => 'Vacancy not found'
171
            ]);
172
        }
173
 
174
        // 🔹 Retornar la vacante en formato JSON
175
        return new JsonModel([
176
            'success' => true,
177
            'data' => $vacancyData
178
        ]);
179
    }
180
}