Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
15461 efrain 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
16768 efrain 7
 
15461 efrain 8
use Laminas\Mvc\Controller\AbstractActionController;
9
use Laminas\Log\LoggerInterface;
10
use Laminas\View\Model\JsonModel;
11
use Laminas\View\Model\ViewModel;
12
use LeadersLinked\Library\Functions;
13
use LeadersLinked\Mapper\QueryMapper;
14
use LeadersLinked\Mapper\UserMapper;
15
use Laminas\Hydrator\ArraySerializableHydrator;
16
use Laminas\Db\ResultSet\HydratingResultSet;
17
use Laminas\Paginator\Adapter\DbSelect;
18
use Laminas\Paginator\Paginator;
19
use LeadersLinked\Form\RecruitmentSelection\RecruitmentSelectionTakeAnTestForm;
20
use Laminas\Mvc\I18n\Translator;
21
use LeadersLinked\Mapper\RecruitmentSelectionInterviewMapper;
22
use LeadersLinked\Mapper\RecruitmentSelectionVacancyMapper;
23
use LeadersLinked\Mapper\RecruitmentSelectionCandidateMapper;
24
use LeadersLinked\Model\RecruitmentSelectionInterview;
25
use LeadersLinked\Library\RecruitmentSelectionInterviewPDF;
16768 efrain 26
use LeadersLinked\Cache\CacheInterface;
27
use LeadersLinked\Cache\CacheImpl;
15461 efrain 28
 
29
class ActivityCenterRecruitmentSelectionController extends AbstractActionController
30
{
31
    /**
32
     *
33
     * @var AdapterInterface
34
     */
35
    private $adapter;
16768 efrain 36
 
15461 efrain 37
    /**
38
     *
39
     * @var  LoggerInterface
40
     */
41
    private $logger;
42
 
43
    /**
44
     *
45
     * @var array
46
     */
47
    private $config;
48
 
49
 
50
    /**
51
     *
52
     * @var Translator
53
     */
54
    private $translator;
55
 
16768 efrain 56
    /**
57
     *
58
     * @var CacheInterface
59
     */
60
    private $cache;
15461 efrain 61
 
62
 
16768 efrain 63
 
15461 efrain 64
    /**
65
     *
66
     * @param AdapterInterface $adapter
67
     * @param LoggerInterface $logger
68
     * @param array $config
69
     * @param Translator $traslator
70
     */
16768 efrain 71
    public function __construct($adapter, $logger, $config, $translator)
15461 efrain 72
    {
73
        $this->adapter      = $adapter;
74
        $this->logger       = $logger;
75
        $this->config       = $config;
76
        $this->translator   = $translator;
16768 efrain 77
        $this->cache        = CacheImpl::getInstance($config);
15461 efrain 78
    }
79
 
80
    public function indexAction()
81
    {
82
        $currentUserPlugin = $this->plugin('currentUserPlugin');
83
        $currentUser = $currentUserPlugin->getUser();
84
        $currentCompany = $currentUserPlugin->getCompany();
85
 
86
 
87
 
88
 
89
 
90
        $request = $this->getRequest();
91
 
92
        if ($request->isGet()) {
93
 
94
            $headers = $request->getHeaders();
95
 
96
            $isJson = false;
97
            if ($headers->has('Accept')) {
98
                $accept = $headers->get('Accept');
99
 
100
                $prioritized = $accept->getPrioritized();
101
 
102
                foreach ($prioritized as $key => $value) {
103
                    $raw = trim($value->getRaw());
104
 
105
                    if (!$isJson) {
106
                        $isJson = strpos($raw, 'json');
107
                    }
108
                }
109
            }
110
 
111
 
112
            if ($isJson) {
113
 
114
 
115
                $data = [
116
                    'items' => [],
117
                    'total' => 0,
118
                ];
119
 
120
 
121
                $search = $this->params()->fromQuery('search');
16766 efrain 122
                $search = empty($search['value']) ? '' :  Functions::sanitizeFilterString($search['value']);
15461 efrain 123
 
124
                $start = intval($this->params()->fromQuery('start', 0), 10);
125
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
126
                $page =  intval($start / $records_x_page);
127
                $page++;
128
 
129
                $order = $this->params()->fromQuery('order', []);
130
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
16766 efrain 131
                $order_direction = empty($order[0]['dir']) ? 'ASC' : Functions::sanitizeFilterString(filter_var($order[0]['dir']));
15461 efrain 132
 
133
                $fields = ['max_date'];
134
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'first_name';
135
 
136
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
137
                    $order_direction = 'ASC';
138
                }
139
 
140
 
141
 
142
 
143
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
144
                //$allowDelete = $acl->isAllowed($currentUser->usertype_id, 'performance-evaluation/evaluations/delete');
145
 
146
 
147
 
148
                $queryMapper = QueryMapper::getInstance($this->adapter);
149
                $sql = $queryMapper->getSql();
150
                $select = $sql->select();
151
                $select->columns([
152
                    'id',
153
                    'uuid',
154
                    'last_date',
155
                    'status',
156
                    'type',
157
                    'added_on',
158
                    'updated_on'
159
 
160
                ]);
161
 
162
 
163
                $select->from(['tb1' => RecruitmentSelectionInterviewMapper::_TABLE]);
164
                $select->join(['tb2' => RecruitmentSelectionVacancyMapper::_TABLE], 'tb1.vacancy_id  = tb2.id ', ['vacancy' => 'name']);
165
                $select->join(['tb3' => RecruitmentSelectionCandidateMapper::_TABLE], 'tb1.candidate_id  = tb3.id  ', ['first_name', 'last_name', 'email']);
166
 
167
                $select->where->equalTo('tb1.company_id', $currentCompany->id);
168
                $select->where->equalTo('tb1.interviewer_id', $currentUser->id);
169
 
170
                if ($search) {
171
                    $select->where->nest()
172
                        ->like('tb2.name', '%' . $search . '%')
173
                        ->or->like('tb1.uuid', '%' . $search . '%')
174
                        ->unnest();
175
                }
176
 
177
 
178
                $select->order('tb1.last_date DESC, tb2.name ASC');
179
 
180
 
181
 
182
                $hydrator = new ArraySerializableHydrator();
183
                $resultset = new HydratingResultSet($hydrator);
184
 
185
                $adapter = new DbSelect($select, $sql, $resultset);
186
                $paginator = new Paginator($adapter);
187
                $paginator->setItemCountPerPage($records_x_page);
188
                $paginator->setCurrentPageNumber($page);
189
 
190
 
191
 
192
                $items = [];
193
                $records = $paginator->getCurrentItems();
194
                foreach ($records as $record)
195
                {
196
 
197
                    $dt = \DateTime::createFromFormat('Y-m-d', $record['last_date']);
198
                    $last_date = $dt->format('d/m/Y');
199
 
200
                    switch($record['status'])
201
                    {
202
                        case RecruitmentSelectionInterview::STATUS_PENDING :
203
                            $status = 'LABEL_PENDING';
204
                            break;
205
 
206
                        case RecruitmentSelectionInterview::STATUS_ACCEPTED :
207
                            $status = 'LABEL_ACCEPTED';
208
                            break;
209
 
210
                        case RecruitmentSelectionInterview::STATUS_REJECTED :
211
                            $status = 'LABEL_REJECTED';
212
                            break;
213
 
214
 
215
                        default :
216
                            $status = 'LABEL_UNKNOW';
217
                            break;
218
                    }
219
 
220
                    switch($record['type'])
221
                    {
222
                        case RecruitmentSelectionInterview::TYPE_BOSS :
223
                            $type = 'LABEL_BOSS_INTERVIEW';
224
                            break;
225
 
226
                        case RecruitmentSelectionInterview::TYPE_HUMAN_RESOURCE :
227
                            $type = 'LABEL_HUMAN_RESOURCE';
228
                            break;
229
 
230
                        default :
231
                            $type = 'LABEL_UNKNOWN';
232
                            break;
233
                    }
234
 
235
                    /*
236
 
237
 
238
 
239
 
240
                    'activities-center/recruitment-and-selection',
241
                    'activities-center/recruitment-and-selection/take-a-test',
242
                    'activities-center/recruitment-and-selection/report',
243
                     */
244
 
245
                    if($record['status'] != RecruitmentSelectionInterview::STATUS_PENDING) {
246
                        $link_pdf = $this->url()->fromRoute('activities-center/recruitment-and-selection/report', ['id' => $record['uuid']]);
247
                        $link_take_a_test = '';
248
 
249
 
250
                    } else {
251
                        $link_pdf = '';
252
                        $link_take_a_test = $this->url()->fromRoute('activities-center/recruitment-and-selection/take-a-test', ['id' => $record['uuid']]);
253
                    }
254
 
255
 
256
                    $item = [
257
                        'last_date' => $last_date,
258
                        'vacancy' => $record['vacancy'],
259
                        'type' => $type,
260
                        'candidate' => $record['first_name'] . ' '.  $record['last_name'],
261
 
262
                        'status' => $status,
263
                        'actions' => [
264
                            'link_pdf' => $link_pdf,
265
                            'link_take_a_test' => $link_take_a_test,
266
                        ]
267
                    ];
268
                    /*
269
                     if($testSelf) {
270
                     $item['actions']['link_report_self'] = $this->url()->fromRoute('performance-evaluation/evaluations/report-self', ['id' => $record['uuid'] ]);
271
                     } else{
272
                     $item['actions']['link_self'] = $this->url()->fromRoute('performance-evaluation/evaluations/self', ['id' => $record['uuid'] ]);
273
                     }
274
                     if($testBoth) {
275
                     $item['actions']['link_report_both'] = $this->url()->fromRoute('performance-evaluation/evaluations/report-both', ['id' => $record['uuid'] ]);
276
                     } else{
277
                     $item['actions']['link_both'] = $this->url()->fromRoute('performance-evaluation/evaluations/both', ['id' => $record['uuid'] ]);
278
                     }
279
                     if($testSupervisor) {
280
                     $item['actions']['link_report_superviser'] = $this->url()->fromRoute('performance-evaluation/evaluations/report-superviser', ['id' => $record['uuid'] ]);
281
                     } else{
282
                     $item['actions']['link_superviser'] = $this->url()->fromRoute('performance-evaluation/evaluations/superviser', ['id' => $record['uuid'] ]);
283
                     }*/
284
 
285
                    array_push($items, $item);
286
                }
287
 
288
                $data['items'] = $items;
289
                $data['total'] = $paginator->getTotalItemCount();
290
 
291
 
292
                return new JsonModel([
293
                    'success' => true,
294
                    'data' => $data
295
                ]);
296
            } else {
297
                if($this->cache->hasItem('ACTIVITY_CENTER_RELATIONAL')) {
298
                    $search =  $this->cache->getItem('ACTIVITY_CENTER_RELATIONAL');
299
                    $this->cache->removeItem('ACTIVITY_CENTER_RELATIONAL');
300
                } else {
301
                    $search = '';
302
                }
303
 
304
 
305
 
306
 
307
                $form = new RecruitmentSelectionTakeAnTestForm();
308
 
309
                $this->layout()->setTemplate('layout/layout-backend');
310
                $viewModel = new ViewModel();
311
                $viewModel->setTemplate('leaders-linked/activity-center-recruitment-and-selection/index.phtml');
312
                $viewModel->setVariables([
313
                    'search' => $search,
314
                    'form' => $form
315
                ]);
316
                return $viewModel;
317
            }
318
        } else {
319
            return new JsonModel([
320
                'success' => false,
321
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
322
            ]);
323
 
324
        }
325
    }
326
 
327
 
328
    public function takeaTestAction()
329
    {
330
        $request = $this->getRequest();
331
        $currentUserPlugin = $this->plugin('currentUserPlugin');
332
        $currentCompany = $currentUserPlugin->getCompany();
333
        $currentUser = $currentUserPlugin->getUser();
334
 
335
        $request = $this->getRequest();
336
        $uuid = $this->params()->fromRoute('id');
337
 
338
 
339
        if (!$uuid) {
340
            $data = [
341
                'success' => false,
342
                'data' => 'ERROR_INVALID_PARAMETER'
343
            ];
344
 
345
            return new JsonModel($data);
346
        }
347
 
348
        $recruitmentSelectionInterviewMapper = RecruitmentSelectionInterviewMapper::getInstance($this->adapter);
349
        $recruitmentSelectionInterview = $recruitmentSelectionInterviewMapper->fetchOneByUuid($uuid);
350
 
351
 
352
 
353
 
354
 
355
        if (!$recruitmentSelectionInterview) {
356
            $data = [
357
                'success' => false,
358
                'data' => 'ERROR_RECORD_NOT_FOUND'
359
            ];
360
 
361
            return new JsonModel($data);
362
        }
363
 
364
        if ($recruitmentSelectionInterview->company_id == $currentCompany->id) {
365
            if($recruitmentSelectionInterview->interviewer_id != $currentUser->id) {
366
                return new JsonModel([
367
                    'success' => false,
368
                    'data' => 'ERROR_UNAUTHORIZED'
369
                ]);
370
 
371
            }
372
        }
373
 
374
        $recruitmentSelectionVacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
375
        $recruitmentSelectionVacancy = $recruitmentSelectionVacancyMapper->fetchOne($recruitmentSelectionInterview->vacancy_id);
376
 
377
 
378
        $recruitmentSelectionCandidateMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
379
        $recruitmentSelectionCandidate = $recruitmentSelectionCandidateMapper->fetchOne($recruitmentSelectionInterview->candidate_id);
380
 
381
 
382
        if ($request->isPost()) {
383
 
384
 
385
 
386
            $dataPost = $request->getPost()->toArray();
387
 
388
 
389
 
390
            $form = new RecruitmentSelectionTakeAnTestForm($this->adapter, $currentCompany->id);
391
            $form->setData($dataPost);
392
 
393
            if ($form->isValid()) {
394
 
395
                switch( $recruitmentSelectionInterview->type)
396
                {
397
                    case RecruitmentSelectionInterview::TYPE_BOSS :
398
                        $type = 'LABEL_BOSS_INTERVIEW';
399
                        break;
400
 
401
                    case RecruitmentSelectionInterview::TYPE_HUMAN_RESOURCE :
402
                        $type = 'LABEL_HUMAN_RESOURCE';
403
                        break;
404
 
405
                    default :
406
                        $type = 'LABEL_UNKNOWN';
407
                        break;
408
                }
409
 
410
 
411
                $type = $this->translator->translate($type);
412
                $dataPost = (array) $form->getData();
413
 
414
 
415
 
416
                $content = json_decode($recruitmentSelectionVacancy->content);
417
                $content->points = $dataPost['points'];
418
                $content->comment = $dataPost['comment'];
419
                $content->evaluation = [];
420
 
421
                foreach($content->competencies_selected as $competency)
422
                {
423
                    foreach($competency->behaviors as $behavior)
424
                    {
425
                        $key_comment = $competency->uuid . '-' . $behavior->uuid . '-comment';
426
                        $key_points = $competency->uuid . '-' . $behavior->uuid . '-points';
427
 
428
 
429
                        if(!empty($_POST[$key_comment])) {
16766 efrain 430
                            $value_comment = Functions::sanitizeFilterString($_POST[$key_comment]);
15461 efrain 431
                        } else {
432
                            $value_comment = '';
433
 
434
                        }
435
 
436
                        if(!empty($_POST[$key_points])) {
437
                            $value_points = intval( filter_var($_POST[$key_points], FILTER_SANITIZE_NUMBER_INT), 10);
438
                        } else {
439
                            $value_points = 0;
440
 
441
                        }
442
 
443
                        array_push($content->evaluation, [
444
                            'competency' => $competency->uuid,
445
                            'behavior' => $behavior->uuid,
446
                            'comment' => $value_comment,
447
                            'points' => $value_points
448
                        ]);
449
 
450
 
451
 
452
 
453
                    }
454
                }
455
 
456
 
457
                $recruitmentSelectionInterview->status = $dataPost['status'];
458
                $recruitmentSelectionInterview->content = json_encode($content);
459
 
460
                $result = $recruitmentSelectionInterviewMapper->update($recruitmentSelectionInterview);
461
 
462
                if ($result) {
463
                    $this->logger->info('Se agrego el entrevisa de : '  . $type . ' del candidato : ' . $recruitmentSelectionCandidate->first_name . ' ' . $recruitmentSelectionCandidate->last_name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
464
                    $data = [
465
                        'success' => true,
466
                        'data' => 'LABEL_RECORD_UPDATED'
467
                    ];
468
                } else {
469
                    $data = [
470
                        'success' => false,
471
                        'data' => $recruitmentSelectionInterviewMapper->getError()
472
                    ];
473
                }
474
 
475
                return new JsonModel($data);
476
            } else {
477
                $messages = [];
478
                $form_messages = (array) $form->getMessages();
479
                foreach ($form_messages as $fieldname => $field_messages) {
480
                    $messages[$fieldname] = array_values($field_messages);
481
                }
482
 
483
                return new JsonModel([
484
                    'success' => false,
485
                    'data' => $messages
486
                ]);
487
            }
488
        } else if ($request->isGet()) {
489
 
490
            switch( $recruitmentSelectionInterview->type)
491
            {
492
                case RecruitmentSelectionInterview::TYPE_BOSS :
493
                    $type = 'LABEL_BOSS_INTERVIEW';
494
                    break;
495
 
496
                case RecruitmentSelectionInterview::TYPE_HUMAN_RESOURCE :
497
                    $type = 'LABEL_HUMAN_RESOURCE';
498
                    break;
499
 
500
                default :
501
                    $type = 'LABEL_UNKNOWN';
502
                    break;
503
            }
504
 
505
 
506
            $content = json_decode($recruitmentSelectionVacancy->content);
507
            foreach($content->competencies_selected as &$competency)
508
            {
509
                foreach($competency->behaviors as &$behavior)
510
                {
511
                    $behavior->competency_uuid = $competency->uuid;
512
                }
513
            }
514
 
515
            $recruitmentSelectionVacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
516
            $recruitmentSelectionVacancy = $recruitmentSelectionVacancyMapper->fetchOne($recruitmentSelectionInterview->vacancy_id);
517
 
518
            $dt = \DateTime::createFromFormat('Y-m-d', $recruitmentSelectionInterview->last_date);
519
            if($dt) {
520
                $last_date = $dt->format('d/m/Y');
521
            } else {
522
                $last_date = '';
523
            }
524
 
525
 
526
            $data = [
527
                'name' =>  $recruitmentSelectionVacancy->name,
528
                'functions' =>  $content->functions,
529
                'objectives' =>  $content->objectives,
530
                'type' => $type,
531
                'candidate' => $recruitmentSelectionCandidate->first_name . ' ' . $recruitmentSelectionCandidate->last_name,
532
                'interviewer' => $currentUser->first_name . ' ' . $currentUser->last_name,
533
                'last_date' => $last_date,
534
                'competency_types' => [],
535
                'competencies' => [],
536
                'behaviors' => [],
537
                'competencies_selected' => [],
538
                'subordinates_selected' => [],
539
            ];
540
 
541
            foreach($content->competency_types as $record)
542
            {
543
               array_push($data['competency_types'], $record);
544
            }
545
 
546
            foreach($content->competencies as $record)
547
            {
548
                array_push($data['competencies'], $record);
549
            }
550
 
551
            foreach($content->behaviors as $record)
552
            {
553
                array_push($data['behaviors'], $record);
554
            }
555
 
556
            foreach($content->competencies_selected as $record)
557
            {
558
                array_push($data['competencies_selected'], $record);
559
            }
560
 
561
            foreach($content->subordinates_selected as $record)
562
            {
563
                array_push($data['subordinates_selected'], $record);
564
            }
565
 
566
 
567
 
568
            $data = [
569
                'success' => true,
570
                'data' => $data
571
            ];
572
 
573
 
574
            return new JsonModel($data);
575
        } else {
576
            $data = [
577
                'success' => false,
578
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
579
            ];
580
 
581
            return new JsonModel($data);
582
        }
583
 
584
        return new JsonModel($data);
585
    }
586
 
587
    public function reportAction()
588
    {
589
        $request = $this->getRequest();
590
        $currentUserPlugin = $this->plugin('currentUserPlugin');
591
        $currentCompany = $currentUserPlugin->getCompany();
592
        $currentUser = $currentUserPlugin->getUser();
593
 
594
        $request = $this->getRequest();
595
        $uuid = $this->params()->fromRoute('id');
596
 
597
        if (!$uuid) {
598
            $data = [
599
                'success' => false,
600
                'data' => 'ERROR_INVALID_PARAMETER'
601
            ];
602
 
603
            return new JsonModel($data);
604
        }
605
 
606
        $recruitmentSelectionInterviewMapper = RecruitmentSelectionInterviewMapper::getInstance($this->adapter);
607
        $recruitmentSelectionInterview = $recruitmentSelectionInterviewMapper->fetchOneByUuid($uuid);
608
        if (!$recruitmentSelectionInterview) {
609
            $data = [
610
                'success' => false,
611
                'data' => 'ERROR_RECORD_NOT_FOUND'
612
            ];
613
 
614
            return new JsonModel($data);
615
        }
616
 
617
 
618
        if ($recruitmentSelectionInterview->company_id != $currentCompany->id) {
619
            return new JsonModel([
620
                'success' => false,
621
                'data' => 'ERROR_UNAUTHORIZED'
622
            ]);
623
        }
624
 
625
        if ($recruitmentSelectionInterview->interviewer_id != $currentUser->id ) {
626
            return new JsonModel([
627
                'success' => false,
628
                'data' => 'ERROR_UNAUTHORIZED'
629
            ]);
630
        }
631
 
632
        if($recruitmentSelectionInterview->status == RecruitmentSelectionInterview::STATUS_PENDING) {
633
            return new JsonModel([
634
                'success' => false,
635
                'data' =>   'ERROR_RECORD_IS_PENDING'
636
            ]);
637
 
638
        }
639
 
640
 
641
 
642
        $request = $this->getRequest();
643
        if ($request->isGet()) {
644
 
645
            switch( $recruitmentSelectionInterview->type)
646
            {
647
                case RecruitmentSelectionInterview::TYPE_BOSS :
648
                    $type = $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_TYPE_BOTH');
649
                    break;
650
 
651
                case RecruitmentSelectionInterview::TYPE_HUMAN_RESOURCE :
652
                    $type = $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_TYPE_HUMAN_RESOURCE');
653
                    break;
654
 
655
 
656
 
657
                default :
658
                    $type = $this->translator->translate('LABEL_UNKNOWN');
659
                    break;
660
            }
661
 
662
 
663
            $recruitmentSelectionVacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
664
            $recruitmentSelectionVacancy = $recruitmentSelectionVacancyMapper->fetchOne($recruitmentSelectionInterview->vacancy_id);
665
 
666
 
667
            $recruitmentSelectionCandidateMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
668
            $recruitmentSelectionCandidate = $recruitmentSelectionCandidateMapper->fetchOne($recruitmentSelectionInterview->candidate_id);
669
 
670
            $filename = $recruitmentSelectionVacancy->name . '-' . trim($recruitmentSelectionCandidate->first_name) . '-' . trim($recruitmentSelectionCandidate->last_name)  . '-' . $type . '-' . date('Y-m-d H:i a') . '.pdf';
671
 
672
            $filename = Functions::normalizeStringFilename( $filename );
673
 
674
 
675
 
676
 
677
            $content = base64_encode($this->renderPDF($recruitmentSelectionInterview));
678
            $data = [
679
                'success' => true,
680
                'data' => [
681
                    'basename' => $filename,
682
                    'content' => $content
683
                ]
684
            ];
685
 
686
            return new JsonModel($data);
687
 
688
            /*
689
 
690
            $content = $this->renderPdf($currentCompany, $jobDescription);
691
            $response = new Response();
692
            $response->setStatusCode(200);
693
            $response->setContent($content);
694
 
695
 
696
 
697
            $headers = $response->getHeaders();
698
            $headers->clearHeaders();
699
 
700
            $headers->addHeaderLine('Content-Description: File Transfer');
701
            $headers->addHeaderLine('Content-Type: application/pdf');
702
            //$headers->addHeaderLine('Content-Disposition: attachment; filename=' . $filename);
703
            $headers->addHeaderLine('Content-Transfer-Encoding: binary');
704
            $headers->addHeaderLine('Expires: 0');
705
            $headers->addHeaderLine('Cache-Control: must-revalidate');
706
            $headers->addHeaderLine('Pragma: public');
707
            return $response;
708
            */
709
 
710
 
711
 
712
 
713
            return ;
714
        } else {
715
 
716
 
717
            return new JsonModel([
718
                'success' => false,
719
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
720
            ]);
721
        }
722
    }
723
 
724
    /**
725
     * Render PDF
726
     * @param RecruitmentSelectionInterview $recruitmentSelectionInterview
727
 
728
     * @return mixed
729
     */
730
    private function renderPDF($recruitmentSelectionInterview)
731
    {
732
        $request = $this->getRequest();
733
        $currentUserPlugin = $this->plugin('currentUserPlugin');
734
        $currentCompany = $currentUserPlugin->getCompany();
735
        $currentUser = $currentUserPlugin->getUser();
736
 
737
 
738
        //Generate New PDF
739
        $pdf = new RecruitmentSelectionInterviewPDF();
740
 
741
        $target_path = $this->config['leaderslinked.fullpath.company'] . DIRECTORY_SEPARATOR . $currentCompany->uuid;
742
        $header = $currentCompany->header ? $target_path . DIRECTORY_SEPARATOR . $currentCompany->header : '';
743
        if (empty($header) || !file_exists($header)) {
744
            $header = $this->config['leaderslinked.images_default.company_pdf_header'];
745
        }
746
 
747
        $footer = $currentCompany->footer ? $target_path . DIRECTORY_SEPARATOR . $currentCompany->footer : '';
748
        if (empty($footer) || !file_exists($footer)) {
749
            $footer = $this->config['leaderslinked.images_default.company_pdf_footer'];
750
        }
751
 
752
        $content = json_decode($recruitmentSelectionInterview->content);
753
 
754
        $pdf->header = $header;
755
        $pdf->footer = $footer;
756
        $pdf->translator = $this->translator;
757
 
758
        $pdf->SetMargins(10, 0, 10);
759
 
760
        $pdf->AliasNbPages();
761
        $pdf->AddPage();
762
 
763
        switch( $recruitmentSelectionInterview->type)
764
        {
765
            case RecruitmentSelectionInterview::TYPE_BOSS :
766
                $type = $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_TYPE_BOTH');
767
                break;
768
 
769
            case RecruitmentSelectionInterview::TYPE_HUMAN_RESOURCE :
770
                $type = $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_TYPE_HUMAN_RESOURCE');
771
                break;
772
 
773
 
774
 
775
            default :
776
                $type = $this->translator->translate('LABEL_UNKNOWN');
777
                break;
778
        }
779
 
780
        $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $recruitmentSelectionInterview->updated_on);
781
 
782
 
783
 
784
        $recruitmentSelectionVacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
785
        $recruitmentSelectionVacancy = $recruitmentSelectionVacancyMapper->fetchOne($recruitmentSelectionInterview->vacancy_id);
786
 
787
 
788
        $recruitmentSelectionCandidateMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
789
        $recruitmentSelectionCandidate = $recruitmentSelectionCandidateMapper->fetchOne($recruitmentSelectionInterview->candidate_id);
790
 
791
        $userMapper = UserMapper::getInstance($this->adapter);
792
        $user = $userMapper->fetchOne($recruitmentSelectionInterview->interviewer_id);
793
        if($user) {
794
            $interviewer  = ucwords(strtolower(trim($user->first_name . ' ' . $user->last_name)));
795
 
796
        }
797
        if($recruitmentSelectionCandidate) {
798
            $candidate = ucwords(strtolower(trim($recruitmentSelectionCandidate->first_name . ' ' . $recruitmentSelectionCandidate->last_name)));
799
 
800
        }
801
 
802
        $rows = [
803
            [
804
                'title' => $this->translator->translate('LABEL_TYPE') . ' : ',
805
                'content' => $type,
806
            ],
807
            [
808
                'title' => $this->translator->translate('LABEL_PDF_PERFORMANCE_EVALUATION_POSITION') . ' : ',
809
                'content' => $recruitmentSelectionVacancy->name,
810
            ],
811
            [
812
                'title' => $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_CANDIDATE')  . ' : ',
16768 efrain 813
                'content' => Functions::utf8_decode($candidate),
15461 efrain 814
            ],
815
 
816
            [
817
                'title' => $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_CANDIDATE_SIGNATURE') . ' : ',
818
                'content' => ''
819
            ],
820
            [
821
                'title' => $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_INTERVIEWER') . ' : ',
16768 efrain 822
                'content' => Functions::utf8_decode($interviewer),
15461 efrain 823
            ],
824
            [
825
                'title' => $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_INTERVIEWER_SIGNATURE') . ' : ',
826
                'content' => ''
827
            ],
828
            [
829
                'title' => $this->translator->translate('LABEL_DATE'),
830
                'content' => $dt->format('d/m/Y H:i a')
831
            ]
832
        ];
833
 
834
 
835
 
836
 
837
 
838
        $pdf->borderTable($this->translator->translate('LABEL_PDF_PERFORMANCE_EVALUATION_TITLE'), $rows);
839
 
840
        switch( $recruitmentSelectionInterview->status)
841
        {
842
            case RecruitmentSelectionInterview::STATUS_ACCEPTED :
843
                $status = $this->translator->translate('LABEL_ACCEPTED');
844
                break;
845
 
846
            case RecruitmentSelectionInterview::STATUS_REJECTED :
847
                $status = $this->translator->translate('LABEL_REJECTED');
848
                break;
849
 
850
 
851
 
852
            default :
853
                $status = $this->translator->translate('LABEL_UNKNOWN');
854
                break;
855
        }
856
 
857
 
858
        $pdf->evaluationTable($status, $content->comment, $content->points);
859
 
860
 
861
 
862
        // Competencies
863
        if ($content->competencies_selected) {
864
            $pdf->AddPage();
865
 
866
            $i = 0;
867
 
868
            $max = count($content->competencies_selected);
869
            for($i = 0; $i < $max; $i++)
870
            {
871
                $competency_selected = $content->competencies_selected[$i];
872
 
873
                $j = $i + 1;
874
                $last = $j == $max;
875
                $pdf->competencyTable($i, $competency_selected, $content->competencies, $content->competency_types, $content->behaviors, $content->evaluation, $last);
876
            }
877
 
878
        }
879
 
880
        return $pdf->Output('S');
881
    }
882
}