Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
1384 efrain 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\ViewModel;
12
use Laminas\View\Model\JsonModel;
13
use LeadersLinked\Library\Functions;
1386 eleazar 14
use LeadersLinked\Mapper\RecruitmentSelectionVacancyMapper;
1384 efrain 15
use LeadersLinked\Model\RecruitmentForm;
16
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
17
use LeadersLinked\Model\Location;
18
use LeadersLinked\Mapper\LocationMapper;
19
use LeadersLinked\Mapper\IndustryMapper;
20
use LeadersLinked\Mapper\JobDescriptionMapper;
21
use LeadersLinked\Mapper\JobDescriptionCompetencyMapper;
22
use LeadersLinked\Mapper\CompetencyMapper;
23
use LeadersLinked\Mapper\CompetencyTypeMapper;
24
use LeadersLinked\Mapper\BehaviorCompetencyMapper;
25
use LeadersLinked\Mapper\BehaviorMapper;
26
use LeadersLinked\Mapper\JobDescriptionBehaviorCompetencyMapper;
27
use LeadersLinked\Mapper\CompanyMapper;
28
use LeadersLinked\Model\Company;
29
use LeadersLinked\Mapper\JobCategoryMapper;
30
 
31
class RecruitmentSelectionVacancyController extends AbstractActionController {
32
 
33
    /**
34
     *
35
     * @var AdapterInterface
36
     */
37
    private $adapter;
38
 
39
    /**
40
     *
41
     * @var AbstractAdapter
42
     */
43
    private $cache;
44
 
45
    /**
46
     *
47
     * @var  LoggerInterface
48
     */
49
    private $logger;
50
 
51
    /**
52
     *
53
     * @var array
54
     */
55
    private $config;
56
 
57
    /**
58
     *
59
     * @param AdapterInterface $adapter
60
     * @param AbstractAdapter $cache
61
     * @param LoggerInterface $logger
62
     * @param array $config
63
     */
64
    public function __construct($adapter, $cache, $logger, $config) {
65
        $this->adapter = $adapter;
66
        $this->cache = $cache;
67
        $this->logger = $logger;
68
        $this->config = $config;
69
    }
70
 
71
    public function indexAction() {
72
        $request = $this->getRequest();
73
        $currentUserPlugin = $this->plugin('currentUserPlugin');
74
        $currentCompany = $currentUserPlugin->getCompany();
75
        $currentUser = $currentUserPlugin->getUser();
76
 
77
 
78
        $request = $this->getRequest();
79
        if ($request->isGet()) {
80
            $sandbox = $this->config['leaderslinked.runmode.sandbox'];
81
            if($sandbox) {
82
                $google_map_key  = $this->config['leaderslinked.google_map.sandbox_api_key'];
83
            } else {
84
                $google_map_key  = $this->config['leaderslinked.google_map.production_api_key'];
85
            }
86
 
87
 
88
            $headers = $request->getHeaders();
89
 
90
            $isJson = false;
91
            if ($headers->has('Accept')) {
92
                $accept = $headers->get('Accept');
93
 
94
                $prioritized = $accept->getPrioritized();
95
 
96
                foreach ($prioritized as $key => $value) {
97
                    $raw = trim($value->getRaw());
98
 
99
                    if (!$isJson) {
100
                        $isJson = strpos($raw, 'json');
101
                    }
102
                }
103
            }
104
 
105
            //$isJson = true;
106
            if ($isJson) {
107
                $search = $this->params()->fromQuery('search', []);
108
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
109
 
110
                $page = intval($this->params()->fromQuery('start', 1), 10);
111
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
112
                $order = $this->params()->fromQuery('order', []);
113
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
114
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
115
 
116
                $fields = ['name'];
117
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'name';
118
 
119
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
120
                    $order_direction = 'ASC';
121
                }
122
 
1386 eleazar 123
                $recruitmentSelectionVacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
124
                $paginator = $recruitmentSelectionVacancyMapper->fetchAllDataTableByCompanyId($currentCompany->id, $search, $page, $records_x_page, $order_field, $order_direction);
1384 efrain 125
 
126
                $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
1386 eleazar 127
                $industryMapper = IndustryMapper::getInstance($this->adapter);
1384 efrain 128
                $jobCategoryMapper = JobCategoryMapper::getInstance($this->adapter);
129
 
130
                $items = [];
131
                $records = $paginator->getCurrentItems();
132
                foreach ($records as $record) {
133
 
134
 
135
 
136
                    $jobDescription = $jobDescriptionMapper->fetchOne($record->job_description_id);
137
                    if ($jobDescription) {
138
 
139
                        $item = [
140
                            'id' => $record->id,
141
                            'name' => $record->name,
142
                            'job_description' => $jobDescription->name,
143
                            'status' => $record->status,
144
                            'actions' => [
145
                                'link_edit' => $this->url()->fromRoute('recruitment-and-selection/forms/edit', ['id' => $record->uuid]),
146
                                'link_delete' => $this->url()->fromRoute('recruitment-and-selection/forms/delete', ['id' => $record->uuid])
147
                            ]
148
                        ];
149
                    }
150
 
151
                    array_push($items, $item);
152
                }
153
 
154
                return new JsonModel([
155
                    'success' => true,
156
                    'data' => [
157
                        'items' => $items,
158
                        'total' => $paginator->getTotalItemCount(),
159
                    ]
160
                ]);
161
            } else {
162
 
163
                $form = new RecruitForm($this->adapter, $currentCompany->id);
164
 
165
                $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
166
                $jobsDescription = $jobDescriptionMapper->fetchAllByCompanyId($currentCompany->id);
167
                $industryMapper = industryMapper::getInstance($this->adapter);
168
                $industry = $industryMapper->fetchAllActives($currentCompany->id);
169
                $jobCategoryMapper = JobCategoryMapper::getInstance($this->adapter);
170
                $jobCategory = $jobCategoryMapper->fetchAllActives($currentCompany->id);
171
 
172
                $this->layout()->setTemplate('layout/layout-backend');
173
                $viewModel = new ViewModel();
174
                $viewModel->setTemplate('leaders-linked/recruitment-and-selection-vacancies/index.phtml');
175
                $viewModel->setVariable('form', $form);
176
                $viewModel->setVariable('industry', $industry);
177
                $viewModel->setVariable('jobsDescription', $jobsDescription);
178
                $viewModel->setVariable('jobCategory', $jobCategory);
179
                $viewModel->setVariable('google_map_key', $google_map_key);
180
                return $viewModel;
181
            }
182
        } else {
183
            return new JsonModel([
184
                'success' => false,
185
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
186
            ]);
187
            ;
188
        }
189
    }
190
 
191
    public function addAction() {
192
        $request = $this->getRequest();
193
        $currentUserPlugin = $this->plugin('currentUserPlugin');
194
        $currentCompany = $currentUserPlugin->getCompany();
195
        $currentUser = $currentUserPlugin->getUser();
196
 
197
        $request = $this->getRequest();
198
 
199
 
200
        if ($request->isPost()) {
201
            $form = new RecruitForm($this->adapter, $currentCompany->id);
202
            $dataPost = $request->getPost()->toArray();
203
 
204
 
205
            $dataPost['status'] = isset($dataPost['status']) ? $dataPost['status'] : RecruitmentForm::STATUS_INACTIVE;
206
 
207
            $form->setData($dataPost);
208
 
209
            if ($form->isValid()) {
210
 
211
 
212
                $dataPost = (array) $form->getData();
213
 
214
                $hydrator = new ObjectPropertyHydrator();
215
                $recruitmentForm = new RecruitmentForm();
216
                $hydrator->hydrate($dataPost, $recruitmentForm);
217
 
218
                if (!$recruitmentForm->status) {
219
                    $recruitmentForm->status = RecruitmentForm::STATUS_INACTIVE;
220
                }
221
                $recruitmentForm->company_id = $currentCompany->id;
1386 eleazar 222
                $recruitmentSelectionVacancyMapper = RecurtingForm::getInstance($this->adapter);;
1384 efrain 223
 
1386 eleazar 224
                $result = $recruitmentSelectionVacancyMapper->insert($recruitmentForm);
1384 efrain 225
 
226
 
227
                if ($result) {
1385 eleazar 228
                    $this->logger->info('Se agrego el proceso de reclutamiento' . $recruitmentForm->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1384 efrain 229
 
230
                    $data = [
231
                        'success' => true,
232
                        'data' => 'LABEL_RECORD_ADDED'
233
                    ];
234
 
235
                } else {
236
                    $data = [
237
                        'success' => false,
1386 eleazar 238
                        'data' => $recruitmentSelectionVacancyMapper->getError()
1384 efrain 239
                    ];
240
                }
241
 
242
                return new JsonModel($data);
243
            } else {
244
                $messages = [];
245
                $form_messages = (array) $form->getMessages();
246
                foreach ($form_messages as $fieldname => $field_messages) {
247
 
248
                    $messages[$fieldname] = array_values($field_messages);
249
                }
250
 
251
                return new JsonModel([
252
                    'success' => false,
253
                    'data' => $messages
254
                ]);
255
            }
256
        } else {
257
            $data = [
258
                'success' => false,
259
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
260
            ];
261
 
262
            return new JsonModel($data);
263
        }
264
 
265
        return new JsonModel($data);
266
    }
267
 
268
    public function editAction() {
269
        $request = $this->getRequest();
270
        $currentUserPlugin = $this->plugin('currentUserPlugin');
271
        $currentCompany = $currentUserPlugin->getCompany();
272
        $currentUser = $currentUserPlugin->getUser();
273
 
274
        $request = $this->getRequest();
275
        $uuid = $this->params()->fromRoute('id');
276
 
277
 
278
        if (!$uuid) {
279
            $data = [
280
                'success' => false,
281
                'data' => 'ERROR_INVALID_PARAMETER'
282
            ];
283
 
284
            return new JsonModel($data);
285
        }
286
 
1386 eleazar 287
        $recruitmentSelectionVacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
288
        $recruitmentCandidate = $recruitmentSelectionVacancyMapper->fetchOneByUuid($uuid);
1384 efrain 289
        if (!$recruitmentCandidate) {
290
            $data = [
291
                'success' => false,
292
                'data' => 'ERROR_RECORD_NOT_FOUND'
293
            ];
294
 
295
            return new JsonModel($data);
296
        }
297
 
298
        if ($recruitmentCandidate->company_id != $currentCompany->id) {
299
            return new JsonModel([
300
                'success' => false,
301
                'data' => 'ERROR_UNAUTHORIZED'
302
            ]);
303
        }
304
 
305
 
306
        if ($request->isPost()) {
307
            $form = new RecruitForm($this->adapter, $currentCompany->id);
308
            $dataPost = $request->getPost()->toArray();
309
            $dataPost['status'] = isset($dataPost['status']) ? $dataPost['status'] : RecruitmentForm::STATUS_INACTIVE;
310
 
311
            $form->setData($dataPost);
312
 
313
            if ($form->isValid()) {
314
                $dataPost = (array) $form->getData();
315
 
316
                $hydrator = new ObjectPropertyHydrator();
317
                $hydrator->hydrate($dataPost, $recruitmentCandidate);
318
 
319
                if (!$recruitmentCandidate->status) {
320
                    $recruitmentCandidate->status = RecruitmentForm::STATUS_INACTIVE;
321
                }
322
 
323
                $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
324
                $jobDescription = $jobDescriptionMapper->fetchOneByUuid($dataPost['job_description_id']);
325
                $recruitmentCandidate->job_description_id = $jobDescription->id;
326
 
327
                $recruitmentCandidate->job_description_id = $jobDescription->id;
328
 
1386 eleazar 329
                $result = $recruitmentSelectionVacancyMapper->update($recruitmentCandidate);
1384 efrain 330
 
331
                if ($result) {
332
                    $this->logger->info('Se agrego el candidato' . $recruitmentCandidate->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
333
                    $data = [
334
                        'success' => true,
335
                        'id' => $recruitmentCandidate->id,
336
                        'action_edit' => $this->url()->fromRoute('recruitment-and-selection/forms/edit', ['id' => $recruitmentCandidate->uuid]),
337
                        'data' => 'LABEL_RECORD_UPDATED'
338
                    ];
339
                } else {
340
                    $data = [
341
                        'success' => false,
1386 eleazar 342
                        'data' => $recruitmentSelectionVacancyMapper->getError()
1384 efrain 343
                    ];
344
                }
345
 
346
                return new JsonModel($data);
347
            } else {
348
                $messages = [];
349
                $form_messages = (array) $form->getMessages();
350
                foreach ($form_messages as $fieldname => $field_messages) {
351
                    $messages[$fieldname] = array_values($field_messages);
352
                }
353
 
354
                return new JsonModel([
355
                    'success' => false,
356
                    'data' => $messages
357
                ]);
358
            }
359
        } else if ($request->isGet()) {
360
            $hydrator = new ObjectPropertyHydrator();
361
 
362
            $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
363
            $jobDescription = $jobDescriptionMapper->fetchOne($recruitmentCandidate->job_description_id);
364
            if (!$jobDescription) {
365
                $data = [
366
                    'success' => false,
367
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
368
                ];
369
 
370
                return new JsonModel($data);
371
            }
372
 
373
            $data = [
374
                'success' => true,
375
                'data' => [
376
                    'id' => $recruitmentCandidate->uuid,
377
                    'name' => $recruitmentCandidate->name,
378
                    'company'=>$recruitmentCandidate->company_id,
379
                    'description_id' => $jobDescription->job_description_id,
380
                    'category' => $recruitmentCandidate->job_category_id,
381
                    'job_id' => $recruitmentCandidate->job_id,
382
                    'text' => $recruitmentCandidate->text,
383
                    'location' => $recruitmentCandidate->location_id,
384
                    'industry' => $recruitmentCandidate->industry_id,
385
                    'status' => $recruitmentCandidate->status,
386
                    'content' => $recruitmentCandidate->content ? json_decode($recruitmentCandidate->content) : [],
387
                ]
388
            ];
389
 
390
            return new JsonModel($data);
391
        } else {
392
            $data = [
393
                'success' => false,
394
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
395
            ];
396
 
397
            return new JsonModel($data);
398
        }
399
 
400
        return new JsonModel($data);
401
    }
402
 
403
    public function deleteAction() {
404
        $request = $this->getRequest();
405
        $currentUserPlugin = $this->plugin('currentUserPlugin');
406
        $currentCompany = $currentUserPlugin->getCompany();
407
        $currentUser = $currentUserPlugin->getUser();
408
 
409
        $request = $this->getRequest();
410
        $uuid = $this->params()->fromRoute('id');
411
 
412
        if (!$uuid) {
413
            $data = [
414
                'success' => false,
415
                'data' => 'ERROR_INVALID_PARAMETER'
416
            ];
417
 
418
            return new JsonModel($data);
419
        }
420
 
1386 eleazar 421
        $recruitmentSelectionVacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
422
        $recruitmentCandidate = $recruitmentSelectionVacancyMapper->fetchOneByUuid($uuid);
1384 efrain 423
        if (!$recruitmentCandidate) {
424
            $data = [
425
                'success' => false,
426
                'data' => 'ERROR_RECORD_NOT_FOUND'
427
            ];
428
 
429
            return new JsonModel($data);
430
        }
431
 
432
        if ($recruitmentCandidate->company_id != $currentCompany->id) {
433
            return new JsonModel([
434
                'success' => false,
435
                'data' => 'ERROR_UNAUTHORIZED'
436
            ]);
437
        }
438
 
439
        if ($request->isPost()) {
440
 
441
 
1386 eleazar 442
            $result = $recruitmentSelectionVacancyMapper->delete($recruitmentCandidate->id);
1384 efrain 443
            if ($result) {
444
                $this->logger->info('Se borro el formulario de reclutamiento ' . $recruitmentCandidate->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
445
 
446
                $data = [
447
                    'success' => true,
448
                    'data' => 'LABEL_RECORD_DELETED'
449
                ];
450
            } else {
451
 
452
                $data = [
453
                    'success' => false,
1386 eleazar 454
                    'data' => $recruitmentSelectionVacancyMapper->getError()
1384 efrain 455
                ];
456
 
457
                return new JsonModel($data);
458
            }
459
        } else {
460
            $data = [
461
                'success' => false,
462
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
463
            ];
464
 
465
            return new JsonModel($data);
466
        }
467
 
468
        return new JsonModel($data);
469
    }
470
 
471
 
472
 
473
}