Proyectos de Subversion LeadersLinked - Services

Rev

Rev 514 | Rev 518 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
512 ariadna 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Controller;
6
 
7
use Smalot\PdfParser\Parser;
8
 
9
use Laminas\Mvc\Controller\AbstractActionController;
10
use Laminas\View\Model\ViewModel;
11
use Laminas\View\Model\JsonModel;
12
use Laminas\Db\Adapter\AdapterInterface;
13
use Laminas\Db\Sql\Select;
14
use Laminas\Db\Adapter\Adapter;
15
use Laminas\Db\Sql\Sql;
16
use Laminas\Db\ResultSet\HydratingResultSet;
17
use Laminas\Hydrator\ArraySerializableHydrator;
516 ariadna 18
use LeadersLinked\Mapper\CompetencyMapper;
512 ariadna 19
use LeadersLinked\Mapper\JobDescriptionMapper;
516 ariadna 20
use LeadersLinked\Mapper\JobDescriptionCompetencyMapper;
512 ariadna 21
use LeadersLinked\Mapper\LocationMapper;
22
use LeadersLinked\Mapper\QueryMapper;
23
use ArrayObject;
24
 
25
class RecruitmentCreateJobDescriptionController extends AbstractActionController
26
{
27
    /**
28
     *
29
     * @var \Laminas\Db\Adapter\AdapterInterface
30
     */
31
    private $adapter;
32
 
33
    /**
34
     *
35
     * @var \LeadersLinked\Cache\CacheInterface
36
     */
37
    private $cache;
38
 
39
 
40
    /**
41
     *
42
     * @var \Laminas\Log\LoggerInterface
43
     */
44
    private $logger;
45
 
46
    /**
47
     *
48
     * @var array
49
     */
50
    private $config;
51
 
52
 
53
    /**
54
     *
55
     * @var \Laminas\Mvc\I18n\Translator
56
     */
57
    private $translator;
58
 
59
 
60
    /**
61
     *
62
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
63
     * @param \LeadersLinked\Cache\CacheInterface $cache
64
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
65
     * @param array $config
66
     * @param \Laminas\Mvc\I18n\Translator $translator
67
     */
68
    public function __construct($adapter, $cache, $logger, $config, $translator)
69
    {
70
        $this->adapter      = $adapter;
71
        $this->cache        = $cache;
72
        $this->logger       = $logger;
73
        $this->config       = $config;
74
        $this->translator   = $translator;
75
    }
76
 
77
    public function indexAction()
78
    {
79
        $request = $this->getRequest();
80
 
81
        // 🔹 Obtener el ID desde la ruta (URL) con el formato /endpoint/:id
516 ariadna 82
        $jobDescriptionId = $this->params()->fromRoute('id');
512 ariadna 83
 
84
        // 🔹 Verificar si el ID es válido
516 ariadna 85
        if (!$jobDescriptionId) {
512 ariadna 86
            return new JsonModel([
87
                'success' => false,
88
                'message' => 'Missing vacancy ID'
89
            ]);
90
        }
91
 
92
        // 🔹 Obtener usuario y permisos ACL
93
        $currentUserPlugin = $this->plugin('currentUserPlugin');
94
        $currentUser = $currentUserPlugin->getUser();
95
        $acl = $this->getEvent()->getViewModel()->getVariable('acl');
96
 
97
        // 🔹 Verificar si el usuario tiene permiso para extraer criterios
516 ariadna 98
        if (!$acl->isAllowed($currentUser->usertype_id, 'recruitment-ai/job-description')) {
512 ariadna 99
            return new JsonModel([
100
                'success' => false,
101
                'message' => 'Access denied'
102
            ]);
103
        }
104
 
105
        if ($request->isGet()) {
106
 
107
            // Llamar a la función que obtiene los archivos de la vacante
516 ariadna 108
            $competencies = $this->getJobDescriptionCompetencies($jobDescriptionId);
512 ariadna 109
 
110
            return new JsonModel([
111
                'success' => true,
516 ariadna 112
                'data' => $competencies
512 ariadna 113
            ]);
114
        }
115
 
516 ariadna 116
        // Si el método no es GET ni POST
117
        return new JsonModel([
118
            'success' => false,
119
            'message' => 'Invalid request method'
120
        ]);
121
    }
512 ariadna 122
 
516 ariadna 123
    public function getJobDescriptionCompetencies($jobDescriptionId)
124
    {
125
        // 🔹 Validación básica del ID
126
        if (!is_numeric($jobDescriptionId) || $jobDescriptionId <= 0) {
127
            return null;
128
        }
512 ariadna 129
 
516 ariadna 130
        try {
131
            // 🔹 Crear el QueryMapper
132
            $queryMapper = QueryMapper::getInstance($this->adapter);
133
            $select = $queryMapper->getSql()->select();
512 ariadna 134
 
516 ariadna 135
            // 🔹 FROM JobDescriptionMapper
136
            $select->from(['jd' => JobDescriptionMapper::_TABLE]);
137
            $select->columns([
138
                'name',
139
                'functions',
140
                'objectives'
141
            ]);
142
 
143
            // 🔹 JOIN con JobDescriptionCompetencyMapper
144
            $select->join(
145
                ['jdc' => JobDescriptionCompetencyMapper::_TABLE],
146
                'jd.id = jdc.job_description_id',
147
                [] // No seleccionamos nada directamente de esta tabla
148
            );
149
 
150
            // 🔹 JOIN con CompetencyMapper
151
            $select->join(
152
                ['c' => CompetencyMapper::_TABLE],
153
                'jdc.competency_id = c.id',
154
                [
155
                    'competency_name' => 'name',
156
                    'competency_description' => 'description'
157
                ]
158
            );
159
 
160
            // 🔹 WHERE por ID de descripción de trabajo
161
            $select->where->equalTo('jd.id', $jobDescriptionId);
162
 
163
            // 🔹 Ejecutar la consulta
164
            $statement = $queryMapper->getSql()->prepareStatementForSqlObject($select);
165
            $resultSet = $statement->execute();
166
 
167
            // 🔹 Procesar resultados
168
            $hydrator = new ArraySerializableHydrator();
169
            $hydratingResultSet = new HydratingResultSet($hydrator);
170
            $hydratingResultSet->initialize($resultSet);
171
 
172
            // 🔹 Agrupar resultados por competencias
173
            $jobInfo = null;
174
            $competencies = [];
175
 
176
            foreach ($hydratingResultSet as $row) {
177
                if (!$jobInfo) {
178
                    $jobInfo = [
179
                        'name' => $row['name'],
180
                        'functions' => $row['functions'],
181
                        'objectives' => $row['objectives']
182
                    ];
183
                }
184
 
185
                $competencies[] = [
186
                    'name' => $row['competency_name'],
187
                    'description' => $row['competency_description']
188
                ];
512 ariadna 189
            }
190
 
516 ariadna 191
            if (!$jobInfo) {
192
                return null;
193
            }
512 ariadna 194
 
516 ariadna 195
            // 🔹 Construir el texto formateado
196
            $formattedText =
197
                "### Información del Trabajo\n" .
198
                "Nombre: {$jobInfo['name']}\n" .
199
                "Funciones: {$jobInfo['functions']}\n" .
200
                "Objetivos: {$jobInfo['objectives']}\n\n" .
201
                "### Competencias requeridas:\n";
202
 
203
            foreach ($competencies as $index => $comp) {
204
                $formattedText .= ($index + 1) . ". {$comp['name']} - {$comp['description']}\n";
512 ariadna 205
            }
516 ariadna 206
 
207
            return $formattedText;
208
        } catch (\Exception $e) {
209
            // Aquí podrías loggear el error si es necesario
210
            return null;
512 ariadna 211
        }
212
    }
213
}