Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
8780 eleazar 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Controller;
6
 
7
use Laminas\Db\Adapter\AdapterInterface;
8
use LeadersLinked\Library\InterviewPDF;
9
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
10
use Laminas\Mvc\Controller\AbstractActionController;
11
use Laminas\Log\LoggerInterface;
12
use Laminas\View\Model\JsonModel;
13
use LeadersLinked\Form\RecruitmentSelectionInterviewFormForm;
14
use LeadersLinked\Form\InterviewFileForm;
15
use LeadersLinked\Form\JobDescriptionForm;
16
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
17
use LeadersLinked\Library\Functions;
18
use LeadersLinked\Mapper\CompanyMapper;
19
use LeadersLinked\Mapper\CompetencyTypeMapper;
20
use LeadersLinked\Model\JobDescription;
21
use LeadersLinked\Mapper\CompetencyMapper;
22
use LeadersLinked\Mapper\BehaviorCompetencyMapper;
23
use LeadersLinked\Model\BehaviorCompetency;
24
use LeadersLinked\Library\JobPdf;
25
use LeadersLinked\Mapper\JobDescriptionCompetencyMapper;
26
use LeadersLinked\Mapper\JobDescriptionSubordinateMapper;
27
use LeadersLinked\Model\JobDescriptionCompetency;
28
use LeadersLinked\Model\JobDescriptionBehaviorCompetency;
29
use LeadersLinked\Mapper\JobDescriptionBehaviorCompetencyMapper;
30
use LeadersLinked\Model\JobDescriptionSubordinate;
31
use LeadersLinked\Mapper\BehaviorMapper;
32
use LeadersLinked\Model\Behavior;
33
use LeadersLinked\Model\Company;
34
use LeadersLinked\Mapper\RecruitmentSelectionInterviewMapper;
35
use LeadersLinked\Mapper\RecruitmentSelectionInterviewFileMapper;
36
use LeadersLinked\Model\RecruitmentSelectionInterview;
37
use LeadersLinked\Model\RecruitmentSelectionInterviewFile;
38
use LeadersLinked\Mapper\RecruitmentSelectionVacancyMapper;
39
use LeadersLinked\Model\RecruitmentSelectionVacancy;
40
use LeadersLinked\Mapper\RecruitmentSelectionCandidateMapper;
41
use LeadersLinked\Model\RecruitmentSelectionCandidate;
42
use LeadersLinked\Mapper\JobDescriptionMapper;
43
use Laminas\View\Model\ViewModel;
44
use LeadersLinked\Form\RecruitmentSelectionCandidateFormForm;
45
use Laminas\Hydrator\ArraySerializableHydrator;
46
use Laminas\Db\ResultSet\HydratingResultSet;
47
use LeadersLinked\Mapper\QueryMapper;
48
use Laminas\Paginator\Adapter\DbSelect;
49
use Laminas\Paginator\Paginator;
14917 efrain 50
use LeadersLinked\Mapper\UserMapper;
8780 eleazar 51
 
14916 stevensc 52
class RecruitmentSelectionInterviewFileController extends AbstractActionController {
8780 eleazar 53
 
54
    /**
55
     *
56
     * @var AdapterInterface
57
     */
58
    private $adapter;
59
 
60
    /**
61
     *
62
     * @var AbstractAdapter
63
     */
64
    private $cache;
65
 
66
    /**
67
     *
68
     * @var  LoggerInterface
69
     */
70
    private $logger;
71
 
72
    /**
73
     *
74
     * @var array
75
     */
76
    private $config;
77
 
78
    /**
79
     *
80
     * @param AdapterInterface $adapter
81
     * @param AbstractAdapter $cache
82
     * @param LoggerInterface $logger
83
     * @param array $config
84
     */
14916 stevensc 85
    public function __construct($adapter, $cache, $logger, $config) {
8780 eleazar 86
        $this->adapter = $adapter;
87
        $this->cache = $cache;
88
        $this->logger = $logger;
89
        $this->config = $config;
90
    }
91
 
92
    public function indexAction()
93
    {
14916 stevensc 94
 
8780 eleazar 95
        $request            = $this->getRequest();
96
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
97
        $currentUser        = $currentUserPlugin->getUser();
98
        $currentCompany     = $currentUserPlugin->getCompany();
8802 eleazar 99
        $interview_uuid       = $this->params()->fromRoute('interview_uuid');
14916 stevensc 100
 
8850 eleazar 101
 
102
        $flashMessenger     = $this->plugin('FlashMessenger');
14916 stevensc 103
 
8852 eleazar 104
        $interviewMapper = RecruitmentSelectionInterviewMapper::getInstance($this->adapter);
105
        $interview = $interviewMapper->fetchOneByUuid($interview_uuid);
14916 stevensc 106
 
107
 
108
        if(!$interview) {
8811 eleazar 109
            $flashMessenger->addErrorMessage('ERROR_FORM_NOT_FOUND');
110
            return $this->redirect()->toRoute('dashboard');
111
        }
14916 stevensc 112
 
113
        if($interview->company_id != $currentCompany->id) {
8812 eleazar 114
            $flashMessenger->addErrorMessage('ERROR_UNAUTHORIZED');
115
            return $this->redirect()->toRoute('dashboard');
116
        }
14917 efrain 117
 
118
        $vacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
14918 efrain 119
        $vacancy = $vacancyMapper->fetchOne($interview->vacancy_id);
14917 efrain 120
 
121
        $candidateMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
14918 efrain 122
        $candidate =  $candidateMapper->fetchOne($interview->candidate_id);
14917 efrain 123
 
124
 
14916 stevensc 125
        try{
126
        $request = $this->getRequest();
127
        if($request->isGet()) {
128
            $headers  = $request->getHeaders();
129
 
130
            $isJson = false;
131
            if($headers->has('Accept')) {
132
                $accept = $headers->get('Accept');
133
 
134
                $prioritized = $accept->getPrioritized();
135
 
136
                foreach($prioritized as $key => $value) {
137
                    $raw = trim($value->getRaw());
138
 
139
                    if(!$isJson) {
140
                        $isJson = strpos($raw, 'json');
8780 eleazar 141
                    }
14916 stevensc 142
 
8780 eleazar 143
                }
14916 stevensc 144
            }
145
 
146
            if($isJson) {
147
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
148
                $allowAdd  = $acl->isAllowed($currentUser->usertype_id, 'recruitment-and-selection/interview/file/add');
149
                $allowEdit  = $acl->isAllowed($currentUser->usertype_id, 'recruitment-and-selection/interview/file/edit');
150
                $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'recruitment-and-selection/interview/file/delete');
151
 
152
 
153
                $search = $this->params()->fromQuery('search', []);
154
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
155
 
156
                $page               = intval($this->params()->fromQuery('start', 1), 10);
157
                $records_x_page     = intval($this->params()->fromQuery('length', 10), 10);
158
                $order =  $this->params()->fromQuery('order', []);
159
                $order_field        = empty($order[0]['column']) ? 99 :  intval($order[0]['column'], 10);
160
                $order_direction    = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var( $order[0]['dir'], FILTER_SANITIZE_STRING));
161
 
162
                $fields =  ['title'];
163
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'title';
164
 
165
                if(!in_array($order_direction, ['ASC', 'DESC'])) {
166
                    $order_direction = 'ASC';
167
                }
168
 
169
                $fileMapper = RecruitmentSelectionInterviewFileMapper::getInstance($this->adapter);
170
                $paginator = $fileMapper->fetchAllDataTableByInterviewId($interview->id, $search, $page, $records_x_page, $order_field, $order_direction);
171
 
172
                $items = [];
173
                $records = $paginator->getCurrentItems();
174
 
175
                foreach($records as $record)
176
                {
177
                    $params = [
178
                        'interview_uuid' => $interview->uuid,
179
                        'id' => $record->uuid,
8780 eleazar 180
                    ];
14916 stevensc 181
 
182
                    $item = [
8871 eleazar 183
                        'interview_uuid' => $interview->uuid,
14916 stevensc 184
                        'id' => $record->uuid,
185
                        'title' => $record->title,
186
                        'coment' => $record->coment,
187
                        'actions' => [
188
                            'link_edit'   => $allowEdit ? $this->url()->fromRoute('recruitment-and-selection/interview/file/edit', $params) : '',
189
                            'link_delete' => $allowDelete ? $this->url()->fromRoute('recruitment-and-selection/interview/file/delete', $params) : '',
190
                        ],
191
                    ];
192
                    array_push($items, $item);
8780 eleazar 193
                }
14916 stevensc 194
 
195
 
196
                $data = [];
14917 efrain 197
                $data['vacancy'] = [
198
                    'name' => $vacancy->name
199
                ];
200
 
201
                $data['candidate'] = [
202
                    'full_name' => trim(trim($candidate->first_name) . ' ' . trim($candidate->last_name)),
203
                    'email' => $candidate->email,
204
                ];
205
 
206
                $candidateMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
207
                $candidate =  $candidateMapper->fetchOne($vacancy->id);
14916 stevensc 208
                $data['items'] = $items;
209
                $data['total'] = $paginator->getTotalItemCount();
210
 
211
                $response = [
212
                    'success' => true,
213
                    'data' => $data
214
                ];
215
 
216
                return new JsonModel($response);
217
 
218
 
8780 eleazar 219
            } else {
14916 stevensc 220
                $form = new InterviewFileForm($this->adapter, $currentCompany ? $currentCompany->id : null);
221
 
222
                $this->layout()->setTemplate('layout/layout-backend.phtml');
223
                $viewModel = new ViewModel();
224
                $viewModel->setTemplate('leaders-linked/recruitment-and-selection-interview-file/index.phtml');
225
                $viewModel->setVariables([
226
                    'interview_uuid' => $interview->uuid,
227
                    'form' => $form,
8780 eleazar 228
                ]);
14916 stevensc 229
                return $viewModel ;
8780 eleazar 230
            }
14916 stevensc 231
 
232
        } else {
8780 eleazar 233
            return new JsonModel([
234
                'success' => false,
14916 stevensc 235
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
8780 eleazar 236
            ]);
237
        }
14916 stevensc 238
    } catch (\Throwable $e) {
239
        $e->getMessage();
240
        return new JsonModel([
241
            'success' => false,
242
            'data' => $e
243
        ]);
8863 eleazar 244
    }
14916 stevensc 245
 
246
    }
8780 eleazar 247
 
248
    public function addAction()
249
    {
250
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
14916 stevensc 251
        $currentCompany     = $currentUserPlugin->getCompany();
8780 eleazar 252
        $currentUser        = $currentUserPlugin->getUser();
14916 stevensc 253
 
8780 eleazar 254
        $request    = $this->getRequest();
255
 
256
        $interview_id = $this->params()->fromRoute('interview_uuid');
8838 eleazar 257
        $recruitmentSelectionInterviewMapper = RecruitmentSelectionInterviewMapper::getInstance($this->adapter);
258
        $interview = $recruitmentSelectionInterviewMapper->fetchOneByUuid($interview_id);
14916 stevensc 259
     try{
260
        if($request->isPost()) {
261
            $form = new  InterviewFileForm($this->adapter, $currentCompany->id);
262
 
263
            $dataPost = array_merge(
264
                $request->getPost()->toArray(),
265
                $request->getFiles()->toArray(),
266
            );
267
 
268
            $form->setData($dataPost);
269
 
270
            if($form->isValid()) {
271
 
272
                $dataPost = (array) $form->getData();
273
 
274
                $files = $this->getRequest()->getFiles()->toArray();
8780 eleazar 275
 
14916 stevensc 276
                $hydrator = new ObjectPropertyHydrator();
277
                $file = new RecruitmentSelectionInterviewFile();
278
                $hydrator->hydrate($dataPost, $file);
279
 
280
                $file->company_id = $currentCompany->id;
281
                $file->interview_id = $interview->id;
282
                $file->file = null;
8780 eleazar 283
 
14916 stevensc 284
                $fileMapper = RecruitmentSelectionInterviewFileMapper::getInstance($this->adapter);
8780 eleazar 285
 
14916 stevensc 286
                if($fileMapper->insert($file)) {
287
                     $file = $fileMapper->fetchOne($file->id);
288
 
289
                    //leaderslinked.fullpath.recruitment_selection/uuid vacante/uuid candidato
290
 
291
                     $target_path = $this->config['leaderslinked.fullpath.recruitment_selection'].$interview_id;
292
                     if(!file_exists($target_path)) {
293
                         mkdir($target_path, 0755, true);
294
                     }
8780 eleazar 295
                    $files = $this->getRequest()->getFiles()->toArray();
14916 stevensc 296
                     if(isset($files['file']) && empty($files['file']['error'])) {
297
                         $tmp_filename  = $files['file']['tmp_name'];
298
                         $original_filename  = trim(strtolower($files['file']['name']));
299
                        try {
300
                            $parts = explode('.', $original_filename);
301
                            $filename = 'document-' . uniqid() . '.' . $parts[ count($parts) - 1 ];
302
 
303
                            $full_filename = $target_path  . DIRECTORY_SEPARATOR .$filename;
304
                            if(move_uploaded_file($tmp_filename, $full_filename)) {
305
                                 $file->file = $filename;
306
                                 $fileMapper->update($file);
307
                             }
308
                         } catch(\Throwable $e) {
309
                             error_log($e->getTraceAsString());
310
                         }
311
                     }
8780 eleazar 312
 
14916 stevensc 313
                    $this->logger->info('Se agrego el candidato ' . $file->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
314
 
315
                    $data = [
316
                        'success'   => true,
317
                        'data'   => 'LABEL_RECORD_ADDED'
318
                    ];
8780 eleazar 319
                } else {
14916 stevensc 320
                    $data = [
321
                        'success'   => false,
322
                        'data'      => $fileMapper->getError()
323
                    ];
324
 
8780 eleazar 325
                }
14916 stevensc 326
 
327
                return new JsonModel($data);
328
 
14913 stevensc 329
            } else {
14916 stevensc 330
                $messages = [];
331
                $form_messages = (array) $form->getMessages();
332
                foreach($form_messages  as $fieldname => $field_messages)
333
                {
334
 
335
                    $messages[$fieldname] = array_values($field_messages);
336
                }
337
 
8780 eleazar 338
            }
14916 stevensc 339
 
340
        } else {
341
            $data = [
8780 eleazar 342
                'success' => false,
14916 stevensc 343
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
344
            ];
345
 
346
            return new JsonModel($data);
8780 eleazar 347
        }
14916 stevensc 348
      } catch (\Throwable $e) {
349
          $e->getMessage();
350
          return new JsonModel([
351
              'success' => false,
352
              'data' => $e
353
          ]);
354
      }
8780 eleazar 355
    }
356
 
14916 stevensc 357
    public function editAction() {
8780 eleazar 358
        $request = $this->getRequest();
359
        $currentUserPlugin = $this->plugin('currentUserPlugin');
360
        $currentCompany = $currentUserPlugin->getCompany();
361
        $currentUser = $currentUserPlugin->getUser();
362
 
363
        $request = $this->getRequest();
364
        $id = $this->params()->fromRoute('id');
365
        $interview_id = $this->params()->fromRoute('interview_uuid');
366
 
367
        if (!$id) {
368
            $data = [
369
                'success' => false,
370
                'data' => 'ERROR_INVALID_PARAMETER'
371
            ];
372
 
373
            return new JsonModel($data);
374
        }
375
 
376
        $fileMapper = RecruitmentSelectionInterviewFileMapper::getInstance($this->adapter);
8876 eleazar 377
        $file = $fileMapper->fetchOneByUuid($id);
14916 stevensc 378
 
8780 eleazar 379
        if (!$file) {
380
            $data = [
381
                'success' => false,
382
                'data' => 'ERROR_RECORD_NOT_FOUND'
383
            ];
384
 
385
            return new JsonModel($data);
386
        }
387
 
388
        if ($file->company_id != $currentCompany->id) {
389
            return new JsonModel([
390
                'success' => false,
391
                'data' => 'ERROR_UNAUTHORIZED'
392
            ]);
393
        }
14916 stevensc 394
 
8780 eleazar 395
        if ($request->isPost()) {
396
            $form = new InterviewFileForm($this->adapter, $currentCompany->id);
397
            $dataPost = $request->getPost()->toArray();
398
 
399
            $form->setData($dataPost);
400
 
401
            if ($form->isValid()) {
402
                $dataPost = (array) $form->getData();
403
 
404
                $hydrator = new ObjectPropertyHydrator();
405
                $hydrator->hydrate($dataPost, $file);
406
 
14916 stevensc 407
                if($fileMapper->update($file)) {
408
                    $file = $fileMapper->fetchOne($file->id);
409
 
410
                   //leaderslinked.fullpath.recruitment_selection/uuid vacante/uuid candidato
411
 
412
                    $target_path = $this->config['leaderslinked.fullpath.recruitment_selection'].$interview_id;
413
                    if(!file_exists($target_path)) {
8780 eleazar 414
                        mkdir($target_path, 0755, true);
415
                    }
416
 
417
                    $files = $this->getRequest()->getFiles()->toArray();
14916 stevensc 418
 
419
                    if(isset($files['file']) && empty($files['file']['error'])) {
8780 eleazar 420
                        $tmp_filename  = $files['file']['tmp_name'];
421
                        $original_filename  = trim(strtolower($files['file']['name']));
14916 stevensc 422
 
8780 eleazar 423
                        try {
424
                            $parts = explode('.', $original_filename);
14916 stevensc 425
                            $filename = 'document-' . uniqid() . '.' . $parts[ count($parts) - 1 ];
426
 
427
                            $full_filename = $target_path  . DIRECTORY_SEPARATOR .$filename;
428
                            if(move_uploaded_file($tmp_filename, $full_filename)) {
8780 eleazar 429
                                $file->file = $filename;
430
                                $fileMapper->update($file);
431
                            }
14916 stevensc 432
                        } catch(\Throwable $e) {
8780 eleazar 433
                            error_log($e->getTraceAsString());
434
                        }
435
                    }
436
 
14916 stevensc 437
                   $this->logger->info('Se agrego el archivo ' . $file->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
438
 
439
                   $data = [
440
                       'success'   => true,
441
                       'data'   => 'LABEL_RECORD_UPDATED'
442
                   ];
443
               } else {
444
                   $data = [
445
                       'success'   => false,
446
                       'data'      => $fileMapper->getError()
447
                   ];
448
 
449
               }
8780 eleazar 450
 
451
                return new JsonModel($data);
452
            } else {
453
                $messages = [];
454
                $form_messages = (array) $form->getMessages();
455
                foreach ($form_messages as $fieldname => $field_messages) {
456
                    $messages[$fieldname] = array_values($field_messages);
457
                }
458
 
459
                return new JsonModel([
460
                    'success' => false,
461
                    'data' => $messages
462
                ]);
463
            }
464
        } else if ($request->isGet()) {
465
 
466
            $hydrator = new ObjectPropertyHydrator();
467
 
468
            $data = [
469
                'success' => true,
470
                'data' => [
471
                    'id' => $file->uuid,
472
                    'title' => $file->title,
8896 eleazar 473
                    'coment' => strip_tags($file->coment),
14916 stevensc 474
                    'file' => $this->url()->fromRoute('storage', ['type' => 'recruitment-selection', 'code'=> $interview_id, 'filename' => $file->file]),
8780 eleazar 475
                ]
476
            ];
477
 
478
            return new JsonModel($data);
479
        } else {
480
            $data = [
481
                'success' => false,
482
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
483
            ];
484
 
485
            return new JsonModel($data);
486
        }
487
 
488
        return new JsonModel($data);
489
    }
490
 
14916 stevensc 491
    public function deleteAction() {
8780 eleazar 492
        $request = $this->getRequest();
493
        $currentUserPlugin = $this->plugin('currentUserPlugin');
494
        $currentCompany = $currentUserPlugin->getCompany();
495
        $currentUser = $currentUserPlugin->getUser();
496
 
497
        $request = $this->getRequest();
8873 eleazar 498
        $id = $this->params()->fromRoute('id');
8780 eleazar 499
 
8873 eleazar 500
        if (!$id) {
8780 eleazar 501
            $data = [
502
                'success' => false,
503
                'data' => 'ERROR_INVALID_PARAMETER'
504
            ];
505
 
506
            return new JsonModel($data);
507
        }
508
 
509
        $fileMapper = RecruitmentSelectionInterviewFileMapper::getInstance($this->adapter);
8873 eleazar 510
        $file = $fileMapper->fetchOneByUuid($id);
8780 eleazar 511
        if (!$file) {
512
            $data = [
513
                'success' => false,
514
                'data' => 'ERROR_RECORD_NOT_FOUND'
515
            ];
516
 
517
            return new JsonModel($data);
518
        }
519
 
520
        if ($file->company_id != $currentCompany->id) {
521
            return new JsonModel([
522
                'success' => false,
523
                'data' => 'ERROR_UNAUTHORIZED'
524
            ]);
525
        }
526
 
527
        if ($request->isPost()) {
528
 
529
 
530
            $result = $fileMapper->delete($file->id);
531
            if ($result) {
532
                $this->logger->info('Se borro el archivo ' . $file->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
533
 
534
                $data = [
535
                    'success' => true,
536
                    'data' => 'LABEL_RECORD_DELETED'
537
                ];
538
            } else {
539
 
540
                $data = [
541
                    'success' => false,
542
                    'data' => $fileMapper->getError()
543
                ];
544
 
545
                return new JsonModel($data);
546
            }
547
        } else {
548
            $data = [
549
                'success' => false,
550
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
551
            ];
552
 
553
            return new JsonModel($data);
554
        }
555
 
556
        return new JsonModel($data);
557
    }
558
}