Proyectos de Subversion LeadersLinked - Backend

Rev

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

<?php
declare(strict_types=1);

namespace LeadersLinked\Controller;

use Laminas\Db\Adapter\AdapterInterface;
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Log\LoggerInterface;
use Laminas\View\Model\JsonModel;
use Laminas\View\Model\ViewModel;
use LeadersLinked\Library\Functions;
use LeadersLinked\Mapper\PerformanceEvaluationTestMapper;
use LeadersLinked\Mapper\PerformanceEvaluationFormMapper;
use LeadersLinked\Mapper\QueryMapper;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Model\PerformanceEvaluationTest;
use Laminas\Hydrator\ArraySerializableHydrator;
use Laminas\Db\ResultSet\HydratingResultSet;
use Laminas\Paginator\Adapter\DbSelect;
use Laminas\Paginator\Paginator;
use LeadersLinked\Form\RecruitmentSelection\RecruitmentSelectionTakeAnTestForm;
use Laminas\Mvc\I18n\Translator;
use LeadersLinked\Library\PerformanceEvaluationInterviewPDF;
use LeadersLinked\Mapper\RecruitmentSelectionInterviewMapper;
use LeadersLinked\Mapper\RecruitmentSelectionVacancyMapper;
use LeadersLinked\Mapper\RecruitmentSelectionCandidateMapper;
use LeadersLinked\Model\RecruitmentSelectionInterview;
use LeadersLinked\Model\RecruitmentSelectionApplication;
use LeadersLinked\Library\RecruitmentSelectionPdf;
use LeadersLinked\Model\RecruitmentSelectionVacancy;
use LeadersLinked\Library\RecruitmentSelectionInterviewPDF;

class ActivityCenterRecruitmentSelectionController extends AbstractActionController
{
    /**
     *
     * @var AdapterInterface
     */
    private $adapter;
    
    
    /**
     *
     * @var AbstractAdapter
     */
    private $cache;
    
    /**
     *
     * @var  LoggerInterface
     */
    private $logger;
    
    /**
     *
     * @var array
     */
    private $config;
    
    
    /**
     * 
     * @var Translator
     */
    private $translator;
    
    
    
    /**
     *
     * @param AdapterInterface $adapter
     * @param AbstractAdapter $cache
     * @param LoggerInterface $logger
     * @param array $config
     * @param Translator $traslator
     */
    public function __construct($adapter, $cache , $logger, $config, $translator)
    {
        $this->adapter      = $adapter;
        $this->cache        = $cache;
        $this->logger       = $logger;
        $this->config       = $config;
        $this->translator   = $translator;
    }
    
    public function indexAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        
        
        
        $request = $this->getRequest();
        
        if ($request->isGet()) {
            
            $headers = $request->getHeaders();
            
            $isJson = false;
            if ($headers->has('Accept')) {
                $accept = $headers->get('Accept');
                
                $prioritized = $accept->getPrioritized();
                
                foreach ($prioritized as $key => $value) {
                    $raw = trim($value->getRaw());
                    
                    if (!$isJson) {
                        $isJson = strpos($raw, 'json');
                    }
                }
            }
            

            if ($isJson) {
                
                
                $data = [
                    'items' => [],
                    'total' => 0,
                ];
                
                
                $search = $this->params()->fromQuery('search');
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
                
                $start = intval($this->params()->fromQuery('start', 0), 10);
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
                $page =  intval($start / $records_x_page);
                $page++;
                
                $order = $this->params()->fromQuery('order', []);
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
                
                $fields = ['max_date'];
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'first_name';
                
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
                    $order_direction = 'ASC';
                }
                
                
                
                
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
                //$allowDelete = $acl->isAllowed($currentUser->usertype_id, 'performance-evaluation/evaluations/delete');
                
                
                
                $queryMapper = QueryMapper::getInstance($this->adapter);
                $sql = $queryMapper->getSql();
                $select = $sql->select();
                $select->columns([
                    'id',
                    'uuid',
                    'last_date',
                    'status',
                    'type',
                    'added_on',
                    'updated_on'
                    
                ]);

                
                $select->from(['tb1' => RecruitmentSelectionInterviewMapper::_TABLE]);
                $select->join(['tb2' => RecruitmentSelectionVacancyMapper::_TABLE], 'tb1.vacancy_id  = tb2.id ', ['vacancy' => 'name']);
                $select->join(['tb3' => RecruitmentSelectionCandidateMapper::_TABLE], 'tb1.candidate_id  = tb3.id  ', ['first_name', 'last_name', 'email']);

                $select->where->equalTo('tb1.company_id', $currentCompany->id);
                $select->where->equalTo('tb1.interviewer_id', $currentUser->id);
                
                if ($search) {
                    $select->where->nest() 
                        ->like('tb2.name', '%' . $search . '%')
                        ->or->like('tb1.uuid', '%' . $search . '%')
                        ->unnest();
                }
                
                
                $select->order('tb1.last_date DESC, tb2.name ASC');
                

                
                $hydrator = new ArraySerializableHydrator();
                $resultset = new HydratingResultSet($hydrator);
                
                $adapter = new DbSelect($select, $sql, $resultset);
                $paginator = new Paginator($adapter);
                $paginator->setItemCountPerPage($records_x_page);
                $paginator->setCurrentPageNumber($page);
                

                
                $items = [];
                $records = $paginator->getCurrentItems();
                foreach ($records as $record)
                {
                    
                    $dt = \DateTime::createFromFormat('Y-m-d', $record['last_date']);
                    $last_date = $dt->format('d/m/Y');
                    
                    switch($record['status'])
                    {
                        case RecruitmentSelectionInterview::STATUS_PENDING :
                            $status = 'LABEL_PENDING';
                            break;
                            
                        case RecruitmentSelectionInterview::STATUS_ACCEPTED :
                            $status = 'LABEL_ACCEPTED';
                            break;
                            
                        case RecruitmentSelectionInterview::STATUS_REJECTED :
                            $status = 'LABEL_REJECTED';
                            break;
                            
                            
                        default :
                            $status = 'LABEL_UNKNOW';
                            break;
                    }
                    
                    switch($record['type'])
                    {
                        case RecruitmentSelectionInterview::TYPE_BOSS : 
                            $type = 'LABEL_BOSS_INTERVIEW';
                            break;
                            
                        case RecruitmentSelectionInterview::TYPE_HUMAN_RESOURCE : 
                            $type = 'LABEL_HUMAN_RESOURCE';
                            break;
                            
                        default :
                            $type = 'LABEL_UNKNOWN';
                            break;
                    }
                    
                    /*
                                         
                    
                    
                    
                    'activities-center/recruitment-and-selection',
                    'activities-center/recruitment-and-selection/take-a-test',
                    'activities-center/recruitment-and-selection/report',
                     */
                    
                    if($record['status'] != RecruitmentSelectionInterview::STATUS_PENDING) {
                        $link_pdf = $this->url()->fromRoute('activities-center/recruitment-and-selection/report', ['id' => $record['uuid']]);
                        $link_take_a_test = '';
                        

                    } else {
                        $link_pdf = '';
                        $link_take_a_test = $this->url()->fromRoute('activities-center/recruitment-and-selection/take-a-test', ['id' => $record['uuid']]);
                    }

                    
                    $item = [
                        'last_date' => $last_date,
                        'vacancy' => $record['vacancy'],
                        'type' => $type,
                        'candidate' => $record['first_name'] . ' '.  $record['last_name'],
           
                        'status' => $status,
                        'actions' => [
                            'link_pdf' => $link_pdf,
                            'link_take_a_test' => $link_take_a_test,
                        ]
                    ];
                    /*
                     if($testSelf) {
                     $item['actions']['link_report_self'] = $this->url()->fromRoute('performance-evaluation/evaluations/report-self', ['id' => $record['uuid'] ]);
                     } else{
                     $item['actions']['link_self'] = $this->url()->fromRoute('performance-evaluation/evaluations/self', ['id' => $record['uuid'] ]);
                     }
                     if($testBoth) {
                     $item['actions']['link_report_both'] = $this->url()->fromRoute('performance-evaluation/evaluations/report-both', ['id' => $record['uuid'] ]);
                     } else{
                     $item['actions']['link_both'] = $this->url()->fromRoute('performance-evaluation/evaluations/both', ['id' => $record['uuid'] ]);
                     }
                     if($testSupervisor) {
                     $item['actions']['link_report_superviser'] = $this->url()->fromRoute('performance-evaluation/evaluations/report-superviser', ['id' => $record['uuid'] ]);
                     } else{
                     $item['actions']['link_superviser'] = $this->url()->fromRoute('performance-evaluation/evaluations/superviser', ['id' => $record['uuid'] ]);
                     }*/
                    
                    array_push($items, $item);
                }
                
                $data['items'] = $items;
                $data['total'] = $paginator->getTotalItemCount();
                
                
                return new JsonModel([
                    'success' => true,
                    'data' => $data
                ]);
            } else {
                if($this->cache->hasItem('ACTIVITY_CENTER_RELATIONAL')) {
                    $search =  $this->cache->getItem('ACTIVITY_CENTER_RELATIONAL');
                    $this->cache->removeItem('ACTIVITY_CENTER_RELATIONAL');
                } else {
                    $search = '';
                }

    
                

                $form = new RecruitmentSelectionTakeAnTestForm();

                $this->layout()->setTemplate('layout/layout-backend');
                $viewModel = new ViewModel();
                $viewModel->setTemplate('leaders-linked/activity-center-recruitment-and-selection/index.phtml');
                $viewModel->setVariables([
                    'search' => $search, 
                    'form' => $form
                ]);
                return $viewModel;
            }
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
            
        }
    }
    

    public function takeaTestAction()
    {
        $request = $this->getRequest();
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentCompany = $currentUserPlugin->getCompany();
        $currentUser = $currentUserPlugin->getUser();
        
        $request = $this->getRequest();
        $uuid = $this->params()->fromRoute('id');
        
        
        if (!$uuid) {
            $data = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($data);
        }
        
        $recruitmentSelectionInterviewMapper = RecruitmentSelectionInterviewMapper::getInstance($this->adapter);
        $recruitmentSelectionInterview = $recruitmentSelectionInterviewMapper->fetchOneByUuid($uuid);
        
        
        


        if (!$recruitmentSelectionInterview) {
            $data = [
                'success' => false,
                'data' => 'ERROR_RECORD_NOT_FOUND'
            ];
            
            return new JsonModel($data);
        }
        
        if ($recruitmentSelectionInterview->company_id == $currentCompany->id) {
            if($recruitmentSelectionInterview->interviewer_id != $currentUser->id) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_UNAUTHORIZED'
                ]);
                
            }
        }
        
        $recruitmentSelectionVacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
        $recruitmentSelectionVacancy = $recruitmentSelectionVacancyMapper->fetchOne($recruitmentSelectionInterview->vacancy_id);
        
        
        $recruitmentSelectionCandidateMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
        $recruitmentSelectionCandidate = $recruitmentSelectionCandidateMapper->fetchOne($recruitmentSelectionInterview->candidate_id);
        
        
        if ($request->isPost()) {
         
            
            
            $dataPost = $request->getPost()->toArray();
            
    
            
            $form = new RecruitmentSelectionTakeAnTestForm($this->adapter, $currentCompany->id);
            $form->setData($dataPost);
            
            if ($form->isValid()) {
            
                switch( $recruitmentSelectionInterview->type)
                {
                    case RecruitmentSelectionInterview::TYPE_BOSS :
                        $type = 'LABEL_BOSS_INTERVIEW';
                        break;
                        
                    case RecruitmentSelectionInterview::TYPE_HUMAN_RESOURCE :
                        $type = 'LABEL_HUMAN_RESOURCE';
                        break;

                    default :
                        $type = 'LABEL_UNKNOWN';
                        break;
                }
                
                
                $type = $this->translator->translate($type);
                $dataPost = (array) $form->getData();


                
                $content = json_decode($recruitmentSelectionVacancy->content);
                $content->points = $dataPost['points'];
                $content->comment = $dataPost['comment'];
                $content->evaluation = [];
                
                foreach($content->competencies_selected as $competency)
                {
                    foreach($competency->behaviors as $behavior)
                    {
                        $key_comment = $competency->uuid . '-' . $behavior->uuid . '-comment';
                        $key_points = $competency->uuid . '-' . $behavior->uuid . '-points';
                        
                        
                        if(!empty($_POST[$key_comment])) {
                            $value_comment = filter_var($_POST[$key_comment], FILTER_SANITIZE_STRING);
                        } else {
                            $value_comment = '';

                        }
                        
                        if(!empty($_POST[$key_points])) {
                            $value_points = intval( filter_var($_POST[$key_points], FILTER_SANITIZE_NUMBER_INT), 10);
                        } else {
                            $value_points = 0;
                            
                        }
                        
                        array_push($content->evaluation, [
                            'competency' => $competency->uuid, 
                            'behavior' => $behavior->uuid, 
                            'comment' => $value_comment, 
                            'points' => $value_points
                        ]);
                        
                        
                        
                        
                    }
                }
                
                
                $recruitmentSelectionInterview->status = $dataPost['status'];
                $recruitmentSelectionInterview->content = json_encode($content);
                
                $result = $recruitmentSelectionInterviewMapper->update($recruitmentSelectionInterview);
                
                if ($result) {
                    $this->logger->info('Se agrego el entrevisa de : '  . $type . ' del candidato : ' . $recruitmentSelectionCandidate->first_name . ' ' . $recruitmentSelectionCandidate->last_name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                    $data = [
                        'success' => true,
                        'data' => 'LABEL_RECORD_UPDATED'
                    ];
                } else {
                    $data = [
                        'success' => false,
                        'data' => $recruitmentSelectionInterviewMapper->getError()
                    ];
                }
                
                return new JsonModel($data);
            } else {
                $messages = [];
                $form_messages = (array) $form->getMessages();
                foreach ($form_messages as $fieldname => $field_messages) {
                    $messages[$fieldname] = array_values($field_messages);
                }
                
                return new JsonModel([
                    'success' => false,
                    'data' => $messages
                ]);
            }
        } else if ($request->isGet()) {
            
            switch( $recruitmentSelectionInterview->type)
            {
                case RecruitmentSelectionInterview::TYPE_BOSS :
                    $type = 'LABEL_BOSS_INTERVIEW';
                    break;
                    
                case RecruitmentSelectionInterview::TYPE_HUMAN_RESOURCE :
                    $type = 'LABEL_HUMAN_RESOURCE';
                    break;
                    
                default :
                    $type = 'LABEL_UNKNOWN';
                    break;
            }
            

            $content = json_decode($recruitmentSelectionVacancy->content);
            foreach($content->competencies_selected as &$competency)
            {
                foreach($competency->behaviors as &$behavior)
                {
                    $behavior->competency_uuid = $competency->uuid;
                }
            }

            $recruitmentSelectionVacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
            $recruitmentSelectionVacancy = $recruitmentSelectionVacancyMapper->fetchOne($recruitmentSelectionInterview->vacancy_id);
            
            $dt = \DateTime::createFromFormat('Y-m-d', $recruitmentSelectionInterview->last_date);
            if($dt) {
                $last_date = $dt->format('d/m/Y');
            } else {
                $last_date = '';
            }
            
            
            $data = [
                'name' =>  $recruitmentSelectionVacancy->name,
                'functions' =>  $content->functions,
                'objectives' =>  $content->objectives,
                'type' => $type,
                'candidate' => $recruitmentSelectionCandidate->first_name . ' ' . $recruitmentSelectionCandidate->last_name,
                'interviewer' => $currentUser->first_name . ' ' . $currentUser->last_name,
                'last_date' => $last_date,
                'competency_types' => [], 
                'competencies' => [],
                'behaviors' => [],
                'competencies_selected' => [],
                'subordinates_selected' => [],
            ]; 
            
            foreach($content->competency_types as $record) 
            {
               array_push($data['competency_types'], $record);
            }
            
            foreach($content->competencies as $record)
            {
                array_push($data['competencies'], $record);
            }
            
            foreach($content->behaviors as $record)
            {
                array_push($data['behaviors'], $record);
            }
            
            foreach($content->competencies_selected as $record)
            {
                array_push($data['competencies_selected'], $record);
            }
            
            foreach($content->subordinates_selected as $record)
            {
                array_push($data['subordinates_selected'], $record);
            }


            
            $data = [
                'success' => true,
                'data' => $data
            ];

            
            return new JsonModel($data);
        } else {
            $data = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];
            
            return new JsonModel($data);
        }
        
        return new JsonModel($data);
    }
    
    public function reportAction()
    {
        $request = $this->getRequest();
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentCompany = $currentUserPlugin->getCompany();
        $currentUser = $currentUserPlugin->getUser();
        
        $request = $this->getRequest();
        $uuid = $this->params()->fromRoute('id');
        
        if (!$uuid) {
            $data = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($data);
        }
        
        $recruitmentSelectionInterviewMapper = RecruitmentSelectionInterviewMapper::getInstance($this->adapter);
        $recruitmentSelectionInterview = $recruitmentSelectionInterviewMapper->fetchOneByUuid($uuid);
        if (!$recruitmentSelectionInterview) {
            $data = [
                'success' => false,
                'data' => 'ERROR_RECORD_NOT_FOUND'
            ];
            
            return new JsonModel($data);
        }

        
        if ($recruitmentSelectionInterview->company_id != $currentCompany->id) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        if ($recruitmentSelectionInterview->interviewer_id != $currentUser->id ) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        if($recruitmentSelectionInterview->status == RecruitmentSelectionInterview::STATUS_PENDING) {
            return new JsonModel([
                'success' => false,
                'data' =>   'ERROR_RECORD_IS_PENDING'
            ]);
            
        }
        

        
        $request = $this->getRequest();
        if ($request->isGet()) {
            
            switch( $recruitmentSelectionInterview->type)
            {
                case RecruitmentSelectionInterview::TYPE_BOSS :
                    $type = $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_TYPE_BOTH');
                    break;
                    
                case RecruitmentSelectionInterview::TYPE_HUMAN_RESOURCE :
                    $type = $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_TYPE_HUMAN_RESOURCE');
                    break;
                    
                    
                    
                default :
                    $type = $this->translator->translate('LABEL_UNKNOWN');
                    break;
            }
            
            
            $recruitmentSelectionVacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
            $recruitmentSelectionVacancy = $recruitmentSelectionVacancyMapper->fetchOne($recruitmentSelectionInterview->vacancy_id);
            
            
            $recruitmentSelectionCandidateMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
            $recruitmentSelectionCandidate = $recruitmentSelectionCandidateMapper->fetchOne($recruitmentSelectionInterview->candidate_id);
            
            $filename = $recruitmentSelectionVacancy->name . '-' . trim($recruitmentSelectionCandidate->first_name) . '-' . trim($recruitmentSelectionCandidate->last_name)  . '-' . $type . '-' . date('Y-m-d H:i a') . '.pdf';
            
            $filename = Functions::normalizeStringFilename( $filename );
            
            
            
            
            $content = base64_encode($this->renderPDF($recruitmentSelectionInterview));
            $data = [
                'success' => true,
                'data' => [
                    'basename' => $filename,
                    'content' => $content
                ]
            ];
            
            return new JsonModel($data);
            
            /*
            
            $content = $this->renderPdf($currentCompany, $jobDescription);
            $response = new Response();
            $response->setStatusCode(200);
            $response->setContent($content);
            
            
            
            $headers = $response->getHeaders();
            $headers->clearHeaders();
            
            $headers->addHeaderLine('Content-Description: File Transfer');
            $headers->addHeaderLine('Content-Type: application/pdf');
            //$headers->addHeaderLine('Content-Disposition: attachment; filename=' . $filename);
            $headers->addHeaderLine('Content-Transfer-Encoding: binary');
            $headers->addHeaderLine('Expires: 0');
            $headers->addHeaderLine('Cache-Control: must-revalidate');
            $headers->addHeaderLine('Pragma: public');
            return $response;
            */
            
            
            
            
            return ;
        } else {
            
            
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    /**
     * Render PDF
     * @param RecruitmentSelectionInterview $recruitmentSelectionInterview 
     
     * @return mixed
     */
    private function renderPDF($recruitmentSelectionInterview)
    {
        $request = $this->getRequest();
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentCompany = $currentUserPlugin->getCompany();
        $currentUser = $currentUserPlugin->getUser();
        
        
        //Generate New PDF
        $pdf = new RecruitmentSelectionInterviewPDF();
        
        $target_path = $this->config['leaderslinked.fullpath.company'] . DIRECTORY_SEPARATOR . $currentCompany->uuid;
        $header = $currentCompany->header ? $target_path . DIRECTORY_SEPARATOR . $currentCompany->header : '';
        if (empty($header) || !file_exists($header)) {
            $header = $this->config['leaderslinked.images_default.company_pdf_header'];
        }
        
        $footer = $currentCompany->footer ? $target_path . DIRECTORY_SEPARATOR . $currentCompany->footer : '';
        if (empty($footer) || !file_exists($footer)) {
            $footer = $this->config['leaderslinked.images_default.company_pdf_footer'];
        }
        
        $content = json_decode($recruitmentSelectionInterview->content);
        
        $pdf->header = $header;
        $pdf->footer = $footer;
        $pdf->translator = $this->translator;
        
        $pdf->SetMargins(10, 0, 10);
        
        $pdf->AliasNbPages();
        $pdf->AddPage();
        
        switch( $recruitmentSelectionInterview->type)
        {
            case RecruitmentSelectionInterview::TYPE_BOSS :
                $type = $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_TYPE_BOTH');
                break;
                
            case RecruitmentSelectionInterview::TYPE_HUMAN_RESOURCE :
                $type = $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_TYPE_HUMAN_RESOURCE');
                break;
                

                
            default :
                $type = $this->translator->translate('LABEL_UNKNOWN');
                break;
        }
        
        $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $recruitmentSelectionInterview->updated_on);
        

        
        $recruitmentSelectionVacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
        $recruitmentSelectionVacancy = $recruitmentSelectionVacancyMapper->fetchOne($recruitmentSelectionInterview->vacancy_id);
        
        
        $recruitmentSelectionCandidateMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
        $recruitmentSelectionCandidate = $recruitmentSelectionCandidateMapper->fetchOne($recruitmentSelectionInterview->candidate_id);
        
        $userMapper = UserMapper::getInstance($this->adapter);
        $user = $userMapper->fetchOne($recruitmentSelectionInterview->interviewer_id);
        if($user) {
            $interviewer  = ucwords(strtolower(trim($user->first_name . ' ' . $user->last_name)));
    
        }
        if($recruitmentSelectionCandidate) {
            $candidate = ucwords(strtolower(trim($recruitmentSelectionCandidate->first_name . ' ' . $recruitmentSelectionCandidate->last_name)));
            
        }
        
        $rows = [
            [
                'title' => $this->translator->translate('LABEL_TYPE') . ' : ',
                'content' => $type,
            ],
            [
                'title' => $this->translator->translate('LABEL_PDF_PERFORMANCE_EVALUATION_POSITION') . ' : ',
                'content' => $recruitmentSelectionVacancy->name,
            ],
            [
                'title' => $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_CANDIDATE')  . ' : ',
                'content' => utf8_decode($candidate),
            ],
            
            [
                'title' => $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_CANDIDATE_SIGNATURE') . ' : ',
                'content' => ''
            ],
            [
                'title' => $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_INTERVIEWER') . ' : ',
                'content' => utf8_decode($interviewer),
            ],
            [
                'title' => $this->translator->translate('LABEL_PDF_RECRUITMENT_AND_SELECTION_INTERVIEWER_SIGNATURE') . ' : ',
                'content' => ''
            ],
            [
                'title' => $this->translator->translate('LABEL_DATE'),
                'content' => $dt->format('d/m/Y H:i a')
            ]
        ];
        
        
        
        
        
        $pdf->borderTable($this->translator->translate('LABEL_PDF_PERFORMANCE_EVALUATION_TITLE'), $rows);
        
        switch( $recruitmentSelectionInterview->status)
        {
            case RecruitmentSelectionInterview::STATUS_ACCEPTED :
                $status = $this->translator->translate('LABEL_ACCEPTED');
                break;
                
            case RecruitmentSelectionInterview::STATUS_REJECTED :
                $status = $this->translator->translate('LABEL_REJECTED');
                break;
                
                
                
            default :
                $status = $this->translator->translate('LABEL_UNKNOWN');
                break;
        }
        
        
        $pdf->evaluationTable($status, $content->comment, $content->points);
        
        
    
        // Competencies
        if ($content->competencies_selected) {
            $pdf->AddPage();
            
            $i = 0;
            
            $max = count($content->competencies_selected);
            for($i = 0; $i < $max; $i++)
            {
                $competency_selected = $content->competencies_selected[$i];
                
                $j = $i + 1;
                $last = $j == $max;
                $pdf->competencyTable($i, $competency_selected, $content->competencies, $content->competency_types, $content->behaviors, $content->evaluation, $last);
            }
            
        }
        
        return $pdf->Output('S');
    }
}