Proyectos de Subversion LeadersLinked - Backend

Rev

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