Proyectos de Subversion LeadersLinked - Backend

Rev

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