Proyectos de Subversion LeadersLinked - Services

Rev

Rev 514 | Rev 518 | Ir a la última revisión | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 514 Rev 516
Línea 13... Línea 13...
13
use Laminas\Db\Sql\Select;
13
use Laminas\Db\Sql\Select;
14
use Laminas\Db\Adapter\Adapter;
14
use Laminas\Db\Adapter\Adapter;
15
use Laminas\Db\Sql\Sql;
15
use Laminas\Db\Sql\Sql;
16
use Laminas\Db\ResultSet\HydratingResultSet;
16
use Laminas\Db\ResultSet\HydratingResultSet;
17
use Laminas\Hydrator\ArraySerializableHydrator;
17
use Laminas\Hydrator\ArraySerializableHydrator;
18
use LeadersLinked\Mapper\RecruitmentSelectionVacancyMapper;
18
use LeadersLinked\Mapper\CompetencyMapper;
19
use LeadersLinked\Mapper\JobDescriptionMapper;
19
use LeadersLinked\Mapper\JobDescriptionMapper;
20
use LeadersLinked\Mapper\JobCategoryMapper;
20
use LeadersLinked\Mapper\JobDescriptionCompetencyMapper;
21
use LeadersLinked\Mapper\LocationMapper;
21
use LeadersLinked\Mapper\LocationMapper;
22
use LeadersLinked\Mapper\QueryMapper;
22
use LeadersLinked\Mapper\QueryMapper;
23
use ArrayObject;
23
use ArrayObject;
Línea 24... Línea 24...
24
 
24
 
Línea 77... Línea 77...
77
    public function indexAction()
77
    public function indexAction()
78
    {
78
    {
79
        $request = $this->getRequest();
79
        $request = $this->getRequest();
Línea 80... Línea 80...
80
 
80
 
81
        // 🔹 Obtener el ID desde la ruta (URL) con el formato /endpoint/:id
81
        // 🔹 Obtener el ID desde la ruta (URL) con el formato /endpoint/:id
Línea 82... Línea 82...
82
        $vacancyId = $this->params()->fromRoute('id');
82
        $jobDescriptionId = $this->params()->fromRoute('id');
83
 
83
 
84
        // 🔹 Verificar si el ID es válido
84
        // 🔹 Verificar si el ID es válido
85
        if (!$vacancyId) {
85
        if (!$jobDescriptionId) {
86
            return new JsonModel([
86
            return new JsonModel([
87
                'success' => false,
87
                'success' => false,
88
                'message' => 'Missing vacancy ID'
88
                'message' => 'Missing vacancy ID'
Línea 93... Línea 93...
93
        $currentUserPlugin = $this->plugin('currentUserPlugin');
93
        $currentUserPlugin = $this->plugin('currentUserPlugin');
94
        $currentUser = $currentUserPlugin->getUser();
94
        $currentUser = $currentUserPlugin->getUser();
95
        $acl = $this->getEvent()->getViewModel()->getVariable('acl');
95
        $acl = $this->getEvent()->getViewModel()->getVariable('acl');
Línea 96... Línea 96...
96
 
96
 
97
        // 🔹 Verificar si el usuario tiene permiso para extraer criterios
97
        // 🔹 Verificar si el usuario tiene permiso para extraer criterios
98
        if (!$acl->isAllowed($currentUser->usertype_id, '')) {
98
        if (!$acl->isAllowed($currentUser->usertype_id, 'recruitment-ai/job-description')) {
99
            return new JsonModel([
99
            return new JsonModel([
100
                'success' => false,
100
                'success' => false,
101
                'message' => 'Access denied'
101
                'message' => 'Access denied'
102
            ]);
102
            ]);
Línea 103... Línea 103...
103
        }
103
        }
Línea 104... Línea 104...
104
 
104
 
105
        if ($request->isGet()) {
105
        if ($request->isGet()) {
Línea 106... Línea 106...
106
 
106
 
107
            // Llamar a la función que obtiene los archivos de la vacante
107
            // Llamar a la función que obtiene los archivos de la vacante
108
            $candidates = $this->getSelectionPreAplicationCandidates($vacancyId);
108
            $competencies = $this->getJobDescriptionCompetencies($jobDescriptionId);
109
 
109
 
110
            return new JsonModel([
110
            return new JsonModel([
Línea 111... Línea -...
111
                'success' => true,
-
 
112
                'data' => $candidates
-
 
113
            ]);
-
 
114
        }
111
                'success' => true,
115
 
-
 
116
        if ($request->isPost()) {
-
 
117
            // 🔹 Obtener los CVs en Base64 desde el cuerpo de la solicitud
-
 
118
            $bodyParams = json_decode($this->getRequest()->getContent(), true);
112
                'data' => $competencies
119
            $cvs = $bodyParams['cvs'] ?? [];
113
            ]);
120
 
114
        }
121
            // 🔹 Verificar si hay CVs
115
 
122
            if (empty($cvs)) {
116
        // Si el método no es GET ni POST
Línea -... Línea 117...
-
 
117
        return new JsonModel([
-
 
118
            'success' => false,
-
 
119
            'message' => 'Invalid request method'
-
 
120
        ]);
-
 
121
    }
-
 
122
 
-
 
123
    public function getJobDescriptionCompetencies($jobDescriptionId)
-
 
124
    {
123
                return new JsonModel([
125
        // 🔹 Validación básica del ID
124
                    'success' => false,
126
        if (!is_numeric($jobDescriptionId) || $jobDescriptionId <= 0) {
-
 
127
            return null;
-
 
128
        }
-
 
129
 
-
 
130
        try {
-
 
131
            // 🔹 Crear el QueryMapper
-
 
132
            $queryMapper = QueryMapper::getInstance($this->adapter);
-
 
133
            $select = $queryMapper->getSql()->select();
-
 
134
 
-
 
135
            // 🔹 FROM JobDescriptionMapper
Línea -... Línea 136...
-
 
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);
125
                    'message' => 'Missing CVs data'
165
            $resultSet = $statement->execute();
-
 
166
 
-
 
167
            // 🔹 Procesar resultados
-
 
168
            $hydrator = new ArraySerializableHydrator();
-
 
169
            $hydratingResultSet = new HydratingResultSet($hydrator);
126
                ]);
170
            $hydratingResultSet->initialize($resultSet);
127
            }
171
 
128
 
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'],
129
            // 🔹 Obtener criterios desde la base de datos
180
                        'functions' => $row['functions'],
130
            $criteria = $this->getSelectionCriteriaVacancy($vacancyId);
181
                        'objectives' => $row['objectives']
131
 
182
                    ];
Línea 132... Línea -...
132
            // 🔹 Verificar si los criterios existen
-
 
133
            if (!$criteria) {
-
 
134
                return new JsonModel([
-
 
135
                    'success' => false,
-
 
136
                    'message' => 'No selection criteria found for this vacancy'
-
 
137
                ]);
-
 
138
            }
-
 
139
 
183
                }
140
            // 🔹 Procesar los CVs y analizar compatibilidad con los criterios
-
 
141
            try {
184
 
142
                $processedCvs = $this->processCvs($cvs, $criteria, $vacancyId);
-
 
143
 
-
 
144
                return new JsonModel([
-
 
145
                    'success' => true,
185
                $competencies[] = [
146
                    'data' => $processedCvs
-
 
Línea -... Línea 186...
-
 
186
                    'name' => $row['competency_name'],
-
 
187
                    'description' => $row['competency_description']
-
 
188
                ];
-
 
189
            }
-
 
190
 
-
 
191
            if (!$jobInfo) {
147
                ]);
192
                return null;
-
 
193
            }
-
 
194
 
-
 
195
            // 🔹 Construir el texto formateado
-
 
196
            $formattedText =
-
 
197
                "### Información del Trabajo\n" .
148
            } catch (\Exception $e) {
198
                "Nombre: {$jobInfo['name']}\n" .
149
                return new JsonModel([
199
                "Funciones: {$jobInfo['functions']}\n" .
150
                    'success' => false,
200
                "Objetivos: {$jobInfo['objectives']}\n\n" .
-
 
201
                "### Competencias requeridas:\n";
151
                    'message' => 'Error processing CVs: ' . $e->getMessage()
202
 
152
                ]);
203
            foreach ($competencies as $index => $comp) {
153
            }
204
                $formattedText .= ($index + 1) . ". {$comp['name']} - {$comp['description']}\n";