Proyectos de Subversion LeadersLinked - Services

Rev

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

Rev 525 Rev 526
Línea 19... Línea 19...
19
use LeadersLinked\Mapper\JobDescriptionMapper;
19
use LeadersLinked\Mapper\JobDescriptionMapper;
20
use LeadersLinked\Mapper\JobDescriptionCompetencyMapper;
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;
-
 
24
use Laminas\Db\Sql\Expression;
Línea 24... Línea 25...
24
 
25
 
25
class RecruitmentCreateJobDescriptionController extends AbstractActionController
26
class RecruitmentCreateJobDescriptionController extends AbstractActionController
26
{
27
{
27
    /**
28
    /**
Línea 150... Línea 151...
150
            // 🔹 JOIN con CompetencyMapper
151
            // 🔹 JOIN con CompetencyMapper
151
            $select->join(
152
            $select->join(
152
                ['c' => CompetencyMapper::_TABLE],
153
                ['c' => CompetencyMapper::_TABLE],
153
                'jdc.competency_id = c.id',
154
                'jdc.competency_id = c.id',
154
                [
155
                [
-
 
156
                    'competency_id' => 'id',
155
                    'competency_name' => 'name',
157
                    'competency_name' => 'name',
156
                    'competency_description' => 'description'
158
                    'competency_description' => 'description'
157
                ]
159
                ]
158
            );
160
            );
Línea 181... Línea 183...
181
                        'objectives' => $row['objectives']
183
                        'objectives' => $row['objectives']
182
                    ];
184
                    ];
183
                }
185
                }
Línea 184... Línea 186...
184
 
186
 
-
 
187
                $competencies[] = [
185
                $competencies[] = [
188
                    'id' => $row['competency_id'],
186
                    'name' => $row['competency_name'],
189
                    'name' => $row['competency_name'],
187
                    'description' => $row['competency_description']
190
                    'description' => $row['competency_description']
188
                ];
191
                ];
Línea 257... Línea 260...
257
 
260
 
258
                {
261
                {
259
                \"is_updated\": true o false,
262
                \"is_updated\": true o false,
260
                \"list_competencies\": [
263
                \"list_competencies\": [
-
 
264
                    {
261
                    {
265
                    \"has_id\": \"{'bool': true o false, 'nro': 'id', si no tiene 0}\",
262
                    \"name\": \"nombre de la competencia\",
266
                    \"name\": \"nombre de la competencia\",
263
                    \"description\": \"recomendación o análisis de si está o no actualizada, o si falta complementar\"
267
                    \"description\": \"recomendación o análisis de si está o no actualizada, o si falta complementar\"
264
                    }
268
                    }
265
                ]
269
                ]
Línea 307... Línea 311...
307
            'message' => 'No se pudo decodificar el JSON de la respuesta',
311
            'message' => 'No se pudo decodificar el JSON de la respuesta',
308
            'data' => $reply
312
            'data' => $reply
309
        ];
313
        ];
310
    }
314
    }
Línea -... Línea 315...
-
 
315
 
-
 
316
    public function insertOrUpdateCompetenciesFromAIResponse($jobDescriptionId, array $aiCompetencies, $competencyTypeId = 1)
-
 
317
    {
-
 
318
        if (!is_numeric($jobDescriptionId) || $jobDescriptionId <= 0) {
-
 
319
            return [false, 'ID de descripción inválido'];
-
 
320
        }
-
 
321
 
-
 
322
        $adapter = $this->adapter;
-
 
323
        $sql = new Sql($adapter);
-
 
324
        $results = [];
-
 
325
 
-
 
326
        foreach ($aiCompetencies as $comp) {
-
 
327
            $name = trim($comp['name'] ?? '');
-
 
328
            $description = trim($comp['description'] ?? '');
-
 
329
            $hasIdRaw = $comp['has_id'] ?? "{'bool': false, 'nro': 0}";
-
 
330
 
-
 
331
            $hasIdData = json_decode(str_replace("'", '"', $hasIdRaw), true);
-
 
332
 
-
 
333
            if (!$name || !$description || !is_array($hasIdData)) {
-
 
334
                continue;
-
 
335
            }
-
 
336
 
-
 
337
            $competencyId = null;
-
 
338
            $status = '';
-
 
339
 
-
 
340
            // 🔹 Si no tiene ID (nro = 0) → Crear
-
 
341
            if ($hasIdData['nro'] == 0) {
-
 
342
                $uuid = $this->generateUuid();
-
 
343
                $insert = $sql->insert(CompetencyMapper::_TABLE)
-
 
344
                    ->values([
-
 
345
                        'uuid' => $uuid,
-
 
346
                        'name' => $name,
-
 
347
                        'description' => $description,
-
 
348
                        'competency_type_id' => $competencyTypeId,
-
 
349
                        'status' => CompetencyMapper::STATUS_ACTIVE,
-
 
350
                        'added_on' => date('Y-m-d H:i:s'),
-
 
351
                        'updated_on' => date('Y-m-d H:i:s')
-
 
352
                    ]);
-
 
353
                $sql->prepareStatementForSqlObject($insert)->execute();
-
 
354
                $competencyId = $adapter->getDriver()->getLastGeneratedValue();
-
 
355
                $status = 'created';
-
 
356
            }
-
 
357
            // 🔹 Si tiene ID existente → Buscar y actualizar nombre + descripción
-
 
358
            else {
-
 
359
                $competencyId = (int) $hasIdData['nro'];
-
 
360
 
-
 
361
                $select = $sql->select(CompetencyMapper::_TABLE)
-
 
362
                    ->where(['id' => $competencyId]);
-
 
363
                $existing = $sql->prepareStatementForSqlObject($select)->execute()->current();
-
 
364
 
-
 
365
                if ($existing) {
-
 
366
                    // Actualizar nombre y descripción si cambiaron
-
 
367
                    if ($existing['name'] !== $name || $existing['description'] !== $description) {
-
 
368
                        $update = $sql->update(CompetencyMapper::_TABLE)
-
 
369
                            ->set([
-
 
370
                                'name' => $name,
-
 
371
                                'description' => $description,
-
 
372
                                'updated_on' => date('Y-m-d H:i:s')
-
 
373
                            ])
-
 
374
                            ->where(['id' => $competencyId]);
-
 
375
                        $sql->prepareStatementForSqlObject($update)->execute();
-
 
376
                    }
-
 
377
 
-
 
378
                    $status = 'updated_existing';
-
 
379
                } else {
-
 
380
                    // ⚠️ Si no encuentra el ID, podrías lanzar error o tratarlo como nueva
-
 
381
                    return [false, "ID de competencia {$competencyId} no encontrado"];
-
 
382
                }
-
 
383
            }
-
 
384
 
-
 
385
            // 🔹 Vincular competencia con descripción de trabajo
-
 
386
            $checkLink = $sql->select(JobDescriptionCompetencyMapper::_TABLE)
-
 
387
                ->where([
-
 
388
                    'job_description_id' => $jobDescriptionId,
-
 
389
                    'competency_id' => $competencyId
-
 
390
                ]);
-
 
391
            $existsLink = $sql->prepareStatementForSqlObject($checkLink)->execute()->current();
-
 
392
 
-
 
393
            if (!$existsLink) {
-
 
394
                $linkInsert = $sql->insert(JobDescriptionCompetencyMapper::_TABLE)
-
 
395
                    ->values([
-
 
396
                        'job_description_id' => $jobDescriptionId,
-
 
397
                        'competency_id' => $competencyId
-
 
398
                    ]);
-
 
399
                $sql->prepareStatementForSqlObject($linkInsert)->execute();
-
 
400
            }
-
 
401
 
-
 
402
            // 🔹 Registrar resultado
-
 
403
            $results[] = [
-
 
404
                'name' => $name,
-
 
405
                'competency_id' => $competencyId,
-
 
406
                'status' => $status
-
 
407
            ];
-
 
408
        }
-
 
409
 
-
 
410
        return [true, $results];
-
 
411
    }
-
 
412
 
311
 
413
 
312
    function callExternalApi($url, $payload, $headers)
414
    function callExternalApi($url, $payload, $headers)
313
    {
415
    {
314
        $ch = curl_init($url);
416
        $ch = curl_init($url);
315
        curl_setopt($ch, CURLOPT_CAINFO, '/etc/apache2/ssl/cacert.pem');
417
        curl_setopt($ch, CURLOPT_CAINFO, '/etc/apache2/ssl/cacert.pem');