Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

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