Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1709 eleazar 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Controller;
6
 
7
use Laminas\Db\Adapter\AdapterInterface;
8
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
9
use Laminas\Mvc\Controller\AbstractActionController;
10
use Laminas\Log\LoggerInterface;
11
use Laminas\View\Model\JsonModel;
12
use LeadersLinked\Form\RecruitmentSelectionInterviewFormForm;
1828 eleazar 13
use LeadersLinked\Form\JobDescriptionForm;
1829 eleazar 14
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
15
use LeadersLinked\Library\Functions;
16
use LeadersLinked\Mapper\CompanyMapper;
17
use LeadersLinked\Mapper\CompetencyTypeMapper;
18
use LeadersLinked\Model\JobDescription;
19
use LeadersLinked\Mapper\CompetencyMapper;
20
use LeadersLinked\Library\JobPdf;
21
use LeadersLinked\Mapper\JobDescriptionCompetencyMapper;
22
use LeadersLinked\Mapper\JobDescriptionSubordinateMapper;
23
use LeadersLinked\Model\JobDescriptionCompetency;
24
use LeadersLinked\Model\JobDescriptionBehaviorCompetency;
25
use LeadersLinked\Mapper\JobDescriptionBehaviorCompetencyMapper;
26
use LeadersLinked\Model\JobDescriptionSubordinate;
27
use LeadersLinked\Mapper\BehaviorCompetencyMapper;
28
use LeadersLinked\Model\BehaviorCompetency;
29
use LeadersLinked\Mapper\BehaviorMapper;
30
use LeadersLinked\Model\Behavior;
31
use LeadersLinked\Model\Company;
1713 eleazar 32
use LeadersLinked\Mapper\RecruitmentSelectionInterviewMapper;
33
use LeadersLinked\Model\RecruitmentSelectionInterview;
34
use LeadersLinked\Mapper\RecruitmentSelectionVacancyMapper;
35
use LeadersLinked\Model\RecruitmentSelectionVacancy;
36
use LeadersLinked\Mapper\RecruitmentSelectionCandidateMapper;
37
use LeadersLinked\Model\RecruitmentSelectionCandidate;
38
use LeadersLinked\Mapper\JobDescriptionMapper;
1717 eleazar 39
use Laminas\View\Model\ViewModel;
40
use LeadersLinked\Form\RecruitmentSelectionCandidateFormForm;
41
use Laminas\Hydrator\ArraySerializableHydrator;
42
use Laminas\Db\ResultSet\HydratingResultSet;
43
use LeadersLinked\Mapper\QueryMapper;
44
use Laminas\Paginator\Adapter\DbSelect;
45
use Laminas\Paginator\Paginator;
1709 eleazar 46
 
47
class RecruitmentSelectionInterviewFormController extends AbstractActionController {
48
 
49
    /**
50
     *
51
     * @var AdapterInterface
52
     */
53
    private $adapter;
54
 
55
    /**
56
     *
57
     * @var AbstractAdapter
58
     */
59
    private $cache;
60
 
61
    /**
62
     *
63
     * @var  LoggerInterface
64
     */
65
    private $logger;
66
 
67
    /**
68
     *
69
     * @var array
70
     */
71
    private $config;
72
 
73
    /**
74
     *
75
     * @param AdapterInterface $adapter
76
     * @param AbstractAdapter $cache
77
     * @param LoggerInterface $logger
78
     * @param array $config
79
     */
80
    public function __construct($adapter, $cache, $logger, $config) {
81
        $this->adapter = $adapter;
82
        $this->cache = $cache;
83
        $this->logger = $logger;
84
        $this->config = $config;
85
    }
86
 
87
    public function indexAction() {
88
        $currentUserPlugin = $this->plugin('currentUserPlugin');
89
        $currentUser = $currentUserPlugin->getUser();
90
        $currentCompany = $currentUserPlugin->getCompany();
91
 
92
        $request = $this->getRequest();
93
 
94
        if($request->isGet())
95
        {
96
            $headers  = $request->getHeaders();
97
 
98
            $isJson = false;
99
            if($headers->has('Accept')) {
100
                $accept = $headers->get('Accept');
101
 
102
                $prioritized = $accept->getPrioritized();
103
 
104
                foreach($prioritized as $key => $value) {
105
                    $raw = trim($value->getRaw());
106
 
107
                    if(!$isJson) {
108
                        $isJson = strpos($raw, 'json');
109
                    }
110
                }
111
            }
112
 
2021 eleazar 113
            if ($isJson) {
114
                $vacancy_uuid = filter_var($this->params()->fromQuery('vacancy_uuid'), FILTER_SANITIZE_STRING);
1709 eleazar 115
 
116
                $data = [
117
                    'link_upload' => '',
118
                    'items' => [] ,
119
                    'total' => 0,
120
                ];
121
 
122
                if(!$vacancy_uuid) {
123
                    return new JsonModel([
124
                        'success' => true,
125
                        'data' => $data
126
                    ]);
127
                }
128
 
129
                $vacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
130
                $vacancy = $vacancyMapper->fetchOneByUuid($vacancy_uuid);
2029 eleazar 131
 
132
                if(! $vacancy) {
1709 eleazar 133
                    return new JsonModel([
2015 eleazar 134
                        'success' => false,
1723 eleazar 135
                        'data' => 'ERROR_VACANCY_NOT_FOUND'
1709 eleazar 136
                    ]);
137
                }
138
 
139
                if($vacancy->company_id != $currentCompany->id) {
140
                    return new JsonModel([
2015 eleazar 141
                        'success' => false,
1709 eleazar 142
                        'data' => 'ERROR_UNAUTHORIZED'
143
                    ]);
144
                }
2033 eleazar 145
 
146
                $candidateMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
2035 eleazar 147
                $candidates = $candidateMapper->fetchAllBySelectionId($vacancy->id);
2015 eleazar 148
 
2049 eleazar 149
                $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
150
                $jobDescription = $jobDescriptionMapper->fetchOne($vacancy->job_description_id);
151
 
2029 eleazar 152
                return new JsonModel([
153
                    'success' => true,
2033 eleazar 154
                    'data' => [
155
                        'vacancy' => $vacancy,
156
                        'candidates' => $candidates,
2049 eleazar 157
                        'job_description' => $jobDescription,
2033 eleazar 158
                    ],
2029 eleazar 159
                ]);
1709 eleazar 160
            } else {
161
                $vacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
2021 eleazar 162
                $vacancies = $vacancyMapper->fetchAllByCompanyId($currentCompany->id);
1709 eleazar 163
 
164
                $this->layout()->setTemplate('layout/layout-backend');
165
                $viewModel = new ViewModel();
1718 eleazar 166
                $viewModel->setTemplate('leaders-linked/recruitment-and-selection-interview/index.phtml');
1709 eleazar 167
                $viewModel->setVariables([
2021 eleazar 168
                    'vacancies' => $vacancies
1709 eleazar 169
                ]);
170
 
171
                return $viewModel ;
172
            }
173
 
174
        } else {
175
            return new JsonModel([
176
                'success' => false,
177
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
178
            ]);
179
        }
180
    }
181
 
1827 eleazar 182
    public function addAction() {
183
        $currentUserPlugin = $this->plugin('currentUserPlugin');
184
        $currentUser = $currentUserPlugin->getUser();
185
        $currentCompany = $currentUserPlugin->getCompany();
1709 eleazar 186
 
1827 eleazar 187
        $request = $this->getRequest();
188
 
2126 efrain 189
 
190
        $candidate_uuid = $this->params()->fromRoute('candidate_uuid');
1827 eleazar 191
 
1906 eleazar 192
        if ($request->isGet()) {
193
 
2126 efrain 194
 
195
            $candidateMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
196
            $candidate = $candidateMapper->fetchOneByUuid($candidate_uuid);
197
 
198
 
199
 
200
 
2057 eleazar 201
            $vacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
2126 efrain 202
            $vacancy = $vacancyMapper->fetchOne($candidate->selection_id);
203
 
2057 eleazar 204
            $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
205
            $jobDescription = $jobDescriptionMapper->fetchOne($vacancy->job_description_id);
2126 efrain 206
 
2057 eleazar 207
            $jobDescriptionCompetencyMapper = JobDescriptionCompetencyMapper::getInstance($this->adapter);
208
            $jobDescriptionCompetencies = $jobDescriptionCompetencyMapper->fetchByJobDescriptionId($jobDescription->id);
2126 efrain 209
 
1906 eleazar 210
            $competencyTypeMapper = CompetencyTypeMapper::getInstance($this->adapter);
2057 eleazar 211
            $competencyMapper = CompetencyMapper::getInstance($this->adapter);
212
            $behaviorCompetencyMapper = BehaviorCompetencyMapper::getInstance($this->adapter);
213
            $behaviorMapper = BehaviorMapper::getInstance($this->adapter);
2126 efrain 214
 
215
 
216
 
217
            $data = [
218
                'candidate' => [
219
                    'uuid' => $candidate->uuid,
220
                    'first_name' => $candidate->first_name,
221
                    'last_name' => $candidate->last_name,
222
                    'email' => $candidate->email
223
                ],
224
                'job_description' => [
225
 
226
                    'uuid' => $jobDescription->uuid,
227
                    'name' => $jobDescription->name,
228
                    'functions' => $jobDescription->functions,
229
                    'objectives' => $jobDescription->objectives,
230
                    'competencies' => []
231
                ],
232
                'interview' => [
233
                    'type' => RecruitmentSelectionInterview::STATUS_HUMAN_RESOURCE,
234
                    'status' => RecruitmentSelectionInterview::STATUS_ACCEPTED,
235
                    'points' => 0,
236
                    'comment' => '',
237
                ]
238
 
239
            ];
1827 eleazar 240
 
2126 efrain 241
 
2057 eleazar 242
 
243
            foreach ($jobDescriptionCompetencies as $jobDescriptionCompetency) {
244
                $competency = $competencyMapper->fetchOne($jobDescriptionCompetency->competency_id);
245
                $competencyType = $competencyTypeMapper->fetchOne($competency->competency_type_id);
246
                $behaviorCompetencies = $behaviorCompetencyMapper->fetchByCompetencyId($competency->id);
247
 
248
                $behaviors = [];
249
 
250
                foreach ($behaviorCompetencies as $behaviorCompetency) {
2126 efrain 251
                    $behavior = $behaviorMapper->fetchOne($behaviorCompetency->behavior_id);
252
 
253
                    array_push($behaviors, [
254
                        'uuid' => $behavior->uuid,
255
                        'description' => $behavior->description,
256
                        'points' => 0,
257
                        'comment' => ''
258
                    ]);
259
 
260
 
2057 eleazar 261
                }
262
 
2126 efrain 263
                array_push($data['job_description']['competencies'], [
264
                    'competency_uuid' => $competency->uuid,
265
                    'competency_name' => $competency->name,
266
                    'competency_type_uuid' => $competencyType->uuid,
267
                    'competency_type_name' => $competencyType->name,
2057 eleazar 268
                    'behaviors' => $behaviors,
2126 efrain 269
                ]);
2057 eleazar 270
            }
271
 
272
            return new JsonModel([
273
                'success' => true,
2126 efrain 274
                'data' => $data
2057 eleazar 275
            ]);
276
 
1906 eleazar 277
        } else if ($request->isPost()) {
278
            $form = new JobDescriptionForm($this->adapter, $currentCompany ? $currentCompany->id : null);
1827 eleazar 279
            $dataPost = $request->getPost()->toArray();
280
 
281
 
282
            $form->setData($dataPost);
283
 
284
            if ($form->isValid()) {
285
                $dataPost = (array) $form->getData();
286
                $dataPost['status'] = $dataPost['status'] ? $dataPost['status'] : JobDescription::STATUS_INACTIVE;
287
 
288
 
1906 eleazar 289
                $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
290
 
1827 eleazar 291
                if (!empty($dataPost['job_description_id_boss'])) {
292
 
293
                    $jobDescriptionBoss = $jobDescriptionMapper->fetchOneByUuid($dataPost['job_description_id_boss']);
294
                    if ($jobDescriptionBoss) {
1906 eleazar 295
                        if ($jobDescriptionBoss->company_id == $currentCompany ? $currentCompany->id : null) {
1827 eleazar 296
                            $dataPost['job_description_id_boss'] = $jobDescriptionBoss->id;
297
                        } else {
298
                            $dataPost['job_description_id_boss'] = null;
299
                        }
300
                    } else {
301
                        $dataPost['job_description_id_boss'] = null;
302
                    }
303
                }
304
 
305
                $hydrator = new ObjectPropertyHydrator();
1906 eleazar 306
                $jobDescription = new JobDescription();
307
 
1827 eleazar 308
                $hydrator->hydrate($dataPost, $jobDescription);
309
 
1906 eleazar 310
                if ($currentCompany) {
311
                    $jobDescription->company_id = $currentCompany ? $currentCompany->id : null;
312
                }
1827 eleazar 313
 
1906 eleazar 314
                $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
315
                $result = $jobDescriptionMapper->insert($jobDescription);
316
 
1827 eleazar 317
                if ($result) {
318
 
319
                    $jobDescriptionSubordinateMapper = JobDescriptionSubordinateMapper::getInstance($this->adapter);
320
                    $jobDescriptionBehaviorCompetencyMapper = JobDescriptionBehaviorCompetencyMapper::getInstance($this->adapter);
321
                    $jobDescriptionCompetencyMapper = JobDescriptionCompetencyMapper::getInstance($this->adapter);
322
                    $competencyMapper = CompetencyMapper::getInstance($this->adapter);
323
                    $behaviorMapper = BehaviorMapper::getInstance($this->adapter);
324
 
325
                    $jobDescriptionSubordinateMapper->deleteAllByJobDescriptionIdTopLevel($jobDescription->id);
326
                    $jobDescriptionCompetencyMapper->deleteAllBJobDescriptionId($jobDescription->id);
327
                    $jobDescriptionBehaviorCompetencyMapper->deleteAllBJobDescriptionId($jobDescription->id);
328
 
329
 
330
                    $competencies_selected = json_decode($dataPost['competencies_selected'], true);
331
 
332
                    for ($i = 0; $i < count($competencies_selected); $i++) {
333
                        $competency = $competencyMapper->fetchOneByUuid($competencies_selected[$i]['competency_id']);
334
                        if ($competency) {
335
                            $jobDescriptionCompetency = new JobDescriptionCompetency();
336
                            $jobDescriptionCompetency->competency_id = $competency->id;
337
                            $jobDescriptionCompetency->job_description_id = $jobDescription->id;
338
                            $jobDescriptionCompetencyMapper->insert($jobDescriptionCompetency);
339
 
340
                            for ($b = 0; $b < count($competencies_selected[$i]['behaviors']); $b++) {
341
                                $jobDescriptionBehaviorCompetency = new JobDescriptionBehaviorCompetency();
342
                                $jobDescriptionBehaviorCompetency->competency_id = $competency->id;
343
                                $jobDescriptionBehaviorCompetency->behavior_id = $competencies_selected[$i]['behaviors'][$b]['behavior_id'];
344
                                $jobDescriptionBehaviorCompetency->level = $competencies_selected[$i]['behaviors'][$b]['level'];
345
                                $jobDescriptionBehaviorCompetency->job_description_id = $jobDescription->id;
346
                                $jobDescriptionBehaviorCompetencyMapper->insert($jobDescriptionBehaviorCompetency);
347
                            }
348
                        }
349
                    }
350
 
351
                    $subordinates_selected = json_decode($dataPost['subordinates_selected'], true);
352
                    for ($i = 0; $i < count($subordinates_selected); $i++) {
353
 
354
                        $jobDescriptionListingSubordinate = $jobDescriptionMapper->fetchOneByUuid($subordinates_selected[$i]['job_description_id']);
355
                        if ($jobDescriptionListingSubordinate) {
356
                            $jobDescriptionSubordinate = new JobDescriptionSubordinate();
357
                            $jobDescriptionSubordinate->job_description_id_top_level = $jobDescription->id;
358
                            $jobDescriptionSubordinate->job_description_id_low_level = $jobDescriptionListingSubordinate->id;
359
                            $jobDescriptionSubordinateMapper->insert($jobDescriptionSubordinate);
360
                        }
361
                    }
362
 
1906 eleazar 363
                    $this->logger->info('Se agrego el cargo ' . $jobDescription->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1827 eleazar 364
 
365
                    $data = [
366
                        'success' => true,
1906 eleazar 367
                        'data' => 'LABEL_RECORD_ADDED'
1827 eleazar 368
                    ];
369
                } else {
370
                    $data = [
371
                        'success' => false,
372
                        'data' => $jobDescriptionMapper->getError()
373
                    ];
374
                }
375
 
376
                return new JsonModel($data);
377
            } else {
378
                $messages = [];
379
                $form_messages = (array) $form->getMessages();
380
                foreach ($form_messages as $fieldname => $field_messages) {
1906 eleazar 381
 
1827 eleazar 382
                    $messages[$fieldname] = array_values($field_messages);
383
                }
384
 
385
                return new JsonModel([
386
                    'success' => false,
387
                    'data' => $messages
388
                ]);
389
            }
390
        } else {
391
            $data = [
392
                'success' => false,
393
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
394
            ];
395
 
396
            return new JsonModel($data);
397
        }
398
 
399
        return new JsonModel($data);
400
    }
2126 efrain 401
 
402
    public function editAction() {
403
 
404
        $interview_uuid = $this->params()->fromRoute('interview_uuid');
405
    }
1827 eleazar 406
 
1709 eleazar 407
}