Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17034 | | 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 ArrayObject;
20
 
21
 
22
class RecruitmentSelectionVacancyCriteriaController extends AbstractActionController
23
{
17025 ariadna 24
 
25
    /**
26
     *
27
     * @var \Laminas\Db\Adapter\AdapterInterface
28
     */
29
    private $adapter;
30
 
31
    /**
32
     *
33
     * @var \LeadersLinked\Cache\CacheInterface
34
     */
35
    private $cache;
36
 
37
 
38
    /**
39
     *
40
     * @var \Laminas\Log\LoggerInterface
41
     */
42
    private $logger;
43
 
44
    /**
45
     *
46
     * @var array
47
     */
48
    private $config;
49
 
50
 
51
    /**
52
     *
53
     * @var \Laminas\Mvc\I18n\Translator
54
     */
55
    private $translator;
56
 
57
 
58
    /**
59
     *
60
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
61
     * @param \LeadersLinked\Cache\CacheInterface $cache
62
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
63
     * @param array $config
64
     * @param \Laminas\Mvc\I18n\Translator $translator
65
     */
66
    public function __construct($adapter, $cache, $logger, $config, $translator)
67
    {
68
        $this->adapter      = $adapter;
69
        $this->cache        = $cache;
70
        $this->logger       = $logger;
71
        $this->config       = $config;
72
        $this->translator   = $translator;
73
    }
74
 
17023 ariadna 75
    public function indexAction()
76
    {
77
        $request = $this->getRequest();
78
 
17034 ariadna 79
 
80
 
17023 ariadna 81
        // 🔹 Validar si la solicitud es POST
82
        if (!$request->isPost()) {
83
            return new JsonModel([
84
                'success' => false,
85
                'message' => 'Invalid request method'
86
            ]);
87
        }
88
 
17034 ariadna 89
        // 🔹 Obtener usuario y permisos ACL
90
        $currentUserPlugin = $this->plugin('currentUserPlugin');
91
        $currentUser = $currentUserPlugin->getUser();
92
        $acl = $this->getEvent()->getViewModel()->getVariable('acl');
93
 
94
        // 🔹 Verificar si el usuario tiene permiso para extraer criterios
95
        if (!$acl->isAllowed($currentUser->usertype_id, 'recruitment-and-selection/vacancies/extract-criteria')) {
96
            return new JsonModel([
97
                'success' => false,
98
                'message' => 'Access denied'
99
            ]);
100
        }
101
 
17031 ariadna 102
        // 🔹 Obtener el ID desde form-data
17030 ariadna 103
        $vacancyId = $this->params()->fromPost('id');
17023 ariadna 104
 
105
        // 🔹 Verificar si el ID es válido
106
        if (!$vacancyId) {
107
            return new JsonModel([
108
                'success' => false,
109
                'message' => 'Missing vacancy ID'
110
            ]);
111
        }
112
 
113
        // 🔹 Construcción de la consulta con QueryMapper
114
        $queryMapper = QueryMapper::getInstance($this->adapter);
115
        $select = $queryMapper->getSql()->select();
116
        $select->from(['tb1' => RecruitmentSelectionVacancyMapper::_TABLE]);
117
        $select->columns(['uuid', 'name', 'last_date', 'status']);
118
 
119
        // 🔹 JOIN con JobDescriptionMapper (incluyendo functions y objectives)
120
        $select->join(
121
            ['tb2' => JobDescriptionMapper::_TABLE],
122
            'tb1.job_description_id = tb2.id AND tb1.company_id = tb2.company_id',
123
            [
17033 ariadna 124
                'job_description_name' => 'name',
125
                'job_description_functions'   => 'functions',
126
                'job_description_objectives'  => 'objectives'
17023 ariadna 127
            ]
128
        );
129
 
130
        // 🔹 JOIN con JobCategoryMapper (para obtener nombre y descripción de la categoría)
131
        $select->join(
132
            ['tb3' => JobCategoryMapper::_TABLE],
133
            'tb1.job_category_id = tb3.id',
134
            [
17033 ariadna 135
                'job_category_name'        => 'name',
136
                'job_category_description' => 'description'
17023 ariadna 137
            ]
138
        );
139
 
140
        // 🔹 JOIN con LocationMapper (para obtener país y dirección formateada)
141
        $select->join(
142
            ['tb4' => LocationMapper::_TABLE],
143
            'tb1.location_id = tb4.id',
144
            [
17033 ariadna 145
                'job_location_country' => 'country',
146
                'job_location_address' => 'formatted_address'
17023 ariadna 147
            ]
148
        );
149
 
150
        // 🔹 Filtrar por el ID de la vacante
151
        $select->where->equalTo('tb1.id', $vacancyId);
152
 
153
        // 🔹 Ejecutar la consulta
154
        $statement = $queryMapper->getSql()->prepareStatementForSqlObject($select);
155
        $resultSet = $statement->execute();
156
 
157
        // 🔹 Procesar los resultados
158
        $hydrator = new ArraySerializableHydrator();
17031 ariadna 159
        $hydratingResultSet = new HydratingResultSet($hydrator);
17023 ariadna 160
        $hydratingResultSet->initialize($resultSet);
161
 
17031 ariadna 162
        // 🔹 Obtener un solo resultado como diccionario
163
        $vacancyData = $hydratingResultSet->current();
17023 ariadna 164
 
17031 ariadna 165
        // 🔹 Validar si no se encontró la vacante
166
        if (!$vacancyData) {
17023 ariadna 167
            return new JsonModel([
168
                'success' => false,
169
                'message' => 'Vacancy not found'
170
            ]);
171
        }
172
 
173
        // 🔹 Retornar la vacante en formato JSON
174
        return new JsonModel([
175
            'success' => true,
176
            'data' => $vacancyData
177
        ]);
178
    }
179
}