Proyectos de Subversion LeadersLinked - Backend

Rev

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