Proyectos de Subversion LeadersLinked - Backend

Rev

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