Proyectos de Subversion LeadersLinked - Services

Rev

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

Rev 494 Rev 497
Línea 9... Línea 9...
9
use Laminas\Mvc\Controller\AbstractActionController;
9
use Laminas\Mvc\Controller\AbstractActionController;
10
use Laminas\View\Model\ViewModel;
10
use Laminas\View\Model\ViewModel;
11
use Laminas\View\Model\JsonModel;
11
use Laminas\View\Model\JsonModel;
12
use Laminas\Db\Adapter\AdapterInterface;
12
use Laminas\Db\Adapter\AdapterInterface;
13
use Laminas\Db\Sql\Select;
13
use Laminas\Db\Sql\Select;
-
 
14
use Laminas\Db\Adapter\Adapter;
14
use Laminas\Db\Sql\Sql;
15
use Laminas\Db\Sql\Sql;
15
use Laminas\Db\ResultSet\HydratingResultSet;
16
use Laminas\Db\ResultSet\HydratingResultSet;
16
use Laminas\Hydrator\ArraySerializableHydrator;
17
use Laminas\Hydrator\ArraySerializableHydrator;
17
use LeadersLinked\Mapper\RecruitmentSelectionVacancyMapper;
18
use LeadersLinked\Mapper\RecruitmentSelectionVacancyMapper;
18
use LeadersLinked\Mapper\JobDescriptionMapper;
19
use LeadersLinked\Mapper\JobDescriptionMapper;
Línea 136... Línea 137...
136
                ]);
137
                ]);
137
            }
138
            }
Línea 138... Línea 139...
138
 
139
 
139
            // 🔹 Procesar los CVs y analizar compatibilidad con los criterios
140
            // 🔹 Procesar los CVs y analizar compatibilidad con los criterios
140
            try {
141
            try {
-
 
142
                //$processedCvs = $this->processCvs($cvs, $criteria, $vacancyId);
-
 
143
 
-
 
144
                $candidates = [
-
 
145
                    [
-
 
146
                        "uuid" => "b3e5b5c5-32b2-43b8-8c0a-3f9b9b5e8f3b",
-
 
147
                        "vacancy_id" => "5",
-
 
148
                        "full_name" => "Stivens Carrasquel",
-
 
149
                        "location" => "Caracas, Venezuela",
-
 
150
                        "years_of_experience" => 5,
-
 
151
                        "previous_positions" => [
-
 
152
                            "Desarrollador Frontend en Cesa Management Solutions",
-
 
153
                            "Desarrollador Full-Stack en Korvuss",
-
 
154
                            "Desarrollador Full-Stack Freelance",
-
 
155
                            "Analista TI en Empresas Polar"
-
 
156
                        ],
-
 
157
                        "specialization" => "Informática",
-
 
158
                        "skills" => [
-
 
159
                            "JavaScript",
-
 
160
                            "TypeScript",
-
 
161
                            "C#",
-
 
162
                            "React.js",
-
 
163
                            "Next.js",
-
 
164
                            "Redux",
-
 
165
                            "Zustand",
-
 
166
                            "Axios",
-
 
167
                            "React Native",
-
 
168
                            "Node.js",
-
 
169
                            "Express.js",
-
 
170
                            "MongoDB",
-
 
171
                            "SQL",
-
 
172
                            "Jest",
-
 
173
                            "SCRUM"
-
 
174
                        ],
-
 
175
                        "compatibility_score" => 75
-
 
176
                    ],
-
 
177
                    [
-
 
178
                        "uuid" => "f7d3b6f1-0c5a-4c2a-9b8e-0e6f2e35d8e3",
-
 
179
                        "vacancy_id" => "5",
-
 
180
                        "full_name" => "Lisseth Gonzalez",
-
 
181
                        "location" => "Caracas, Venezuela",
-
 
182
                        "years_of_experience" => 8,
-
 
183
                        "previous_positions" => [
-
 
184
                            "Docente Suplente en CEIN 'Magdalena de Sucre'",
-
 
185
                            "Personal Administrativo en UEN 'Mireya Vanegas'"
-
 
186
                        ],
-
 
187
                        "specialization" => "Lengua y Literatura",
-
 
188
                        "skills" => [
-
 
189
                            "Manejo avanzado de herramientas Microsoft Office",
-
 
190
                            "Elaboración de blog y Páginas Web",
-
 
191
                            "Docente en el área de Castellano y Literatura"
-
 
192
                        ],
-
 
193
                        "compatibility_score" => 40
-
 
194
                    ]
-
 
195
                ];
-
 
196
 
Línea 141... Línea 197...
141
                $processedCvs = $this->processCvs($cvs, $criteria, $vacancyId);
197
                $data = $this->saveOrUpdatePreApplications($candidates);
142
 
198
 
143
                return new JsonModel([
199
                return new JsonModel([
144
                    'success' => true,
200
                    'success' => true,
145
                    'data' => $processedCvs
201
                    'data' => $data
146
                ]);
202
                ]);
147
            } catch (\Exception $e) {
203
            } catch (\Exception $e) {
148
                return new JsonModel([
204
                return new JsonModel([
Línea 405... Línea 461...
405
        // Asignar solo el puntaje de compatibilidad correcto a cada CV
461
        // Asignar solo el puntaje de compatibilidad correcto a cada CV
406
        foreach ($extractedData as &$data) {
462
        foreach ($extractedData as &$data) {
407
            $data['compatibility_score'] = $evaluation[$data['uuid']] ?? 0;
463
            $data['compatibility_score'] = $evaluation[$data['uuid']] ?? 0;
408
        }
464
        }
Línea -... Línea 465...
-
 
465
 
-
 
466
        // Guardar o actualizar los datos en la base de datos
-
 
467
        $saveResult = $this->saveOrUpdatePreApplications($extractedData);
-
 
468
 
-
 
469
        // Validar si la inserción falló
-
 
470
        if ($saveResult !== true) {
-
 
471
            return [false, 'Error al guardar los datos: ' . json_encode($saveResult)];
-
 
472
        }
409
 
473
 
410
        // Retornar los datos procesados con las puntuaciones de compatibilidad
474
        // Retornar los datos procesados con las puntuaciones de compatibilidad
411
        return $extractedData;
475
        return $extractedData;
Línea -... Línea 476...
-
 
476
    }
-
 
477
 
-
 
478
    private function saveOrUpdatePreApplications(array $extractedData)
-
 
479
    {
-
 
480
        $sql = new Sql($this->adapter);
-
 
481
        $errors = [];
-
 
482
 
-
 
483
        foreach ($extractedData as $data) {
-
 
484
            $select = $sql->select()
-
 
485
                ->from('tbl_recruitment_selection_pre_aplications')
-
 
486
                ->where(['uuid' => $data['uuid'], 'full_name' => $data['full_name']]);
-
 
487
 
-
 
488
            $statement = $sql->prepareStatementForSqlObject($select);
-
 
489
            $result = $statement->execute();
-
 
490
 
-
 
491
            if ($result->current()) {
-
 
492
                // Si existe, realizar UPDATE
-
 
493
                $update = $sql->update('tbl_recruitment_selection_pre_aplications')
-
 
494
                    ->set([
-
 
495
                        'vacancy_id' => $data['vacancy_id'],
-
 
496
                        'location' => $data['location'],
-
 
497
                        'years_experience' => $data['years_of_experience'],
-
 
498
                        'previous_positions' => $data['previous_positions'],
-
 
499
                        'specialization' => $data['specialization'],
-
 
500
                        'skills' => $data['skills'],
-
 
501
                        'vacancy_compatibility_score' => $data['compatibility_score']
-
 
502
                    ])
-
 
503
                    ->where(['uuid' => $data['uuid'], 'full_name' => $data['full_name']]);
-
 
504
 
-
 
505
                $updateStatement = $sql->prepareStatementForSqlObject($update);
-
 
506
                try {
-
 
507
                    $updateStatement->execute();
-
 
508
                } catch (\Exception $e) {
-
 
509
                    $errors[] = "Error al actualizar: " . $e->getMessage();
-
 
510
                }
-
 
511
            } else {
-
 
512
                // Si no existe, realizar INSERT
-
 
513
                $insert = $sql->insert('tbl_recruitment_selection_pre_aplications')
-
 
514
                    ->values([
-
 
515
                        'uuid' => $data['uuid'],
-
 
516
                        'vacancy_id' => $data['vacancy_id'],
-
 
517
                        'full_name' => $data['full_name'],
-
 
518
                        'location' => $data['location'],
-
 
519
                        'years_experience' => $data['years_of_experience'],
-
 
520
                        'previous_positions' => $data['previous_positions'],
-
 
521
                        'specialization' => $data['specialization'],
-
 
522
                        'skills' => $data['skills'],
-
 
523
                        'vacancy_compatibility_score' => $data['compatibility_score']
-
 
524
                    ]);
-
 
525
 
-
 
526
                $insertStatement = $sql->prepareStatementForSqlObject($insert);
-
 
527
                try {
-
 
528
                    $result = $insertStatement->execute();
-
 
529
                    if (!$result->getGeneratedValue()) {
-
 
530
                        $errors[] = "Falló la inserción para UUID: " . $data['uuid'];
-
 
531
                    }
-
 
532
                } catch (\Exception $e) {
-
 
533
                    $errors[] = "Error al insertar: " . $e->getMessage();
-
 
534
                }
-
 
535
            }
-
 
536
        }
-
 
537
 
-
 
538
        return empty($errors) ? true : $errors;
412
    }
539
    }
413
 
540
 
414
    function callExternalApi($url, $payload, $headers)
541
    function callExternalApi($url, $payload, $headers)
415
    {
542
    {
416
        $ch = curl_init($url);
543
        $ch = curl_init($url);