Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16820 | 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\Mvc\Controller\AbstractActionController;
use Laminas\Log\LoggerInterface;
use Laminas\View\Model\JsonModel;
use Laminas\View\Model\ViewModel;
use LeadersLinked\Library\Functions;
use LeadersLinked\Mapper\QueryMapper;
use LeadersLinked\Mapper\UserMapper;
use Laminas\Hydrator\ArraySerializableHydrator;
use Laminas\Db\ResultSet\HydratingResultSet;
use Laminas\Paginator\Adapter\DbSelect;
use Laminas\Paginator\Paginator;
use Laminas\Mvc\I18n\Translator;
use LeadersLinked\Cache\CacheInterface;
use LeadersLinked\Cache\CacheImpl;
use LeadersLinked\Mapper\SurveyTestMapper;
use LeadersLinked\Form\Survey\SurveyTakeAnTestForm;
use LeadersLinked\Model\SurveyTest;
use LeadersLinked\Library\UniqueSurveyReport;
use Laminas\Http\Response;
use LeadersLinked\Mapper\SurveyCampaignMapper;


class ActivityCenterSurveyController extends AbstractActionController
{
    /**
     *
     * @var \Laminas\Db\Adapter\AdapterInterface
     */
    private $adapter;
    
    /**
     *
     * @var \LeadersLinked\Cache\CacheInterface
     */
    private $cache;
    
    
    /**
     *
     * @var \Laminas\Log\LoggerInterface
     */
    private $logger;
    
    /**
     *
     * @var array
     */
    private $config;
    
    
    /**
     *
     * @var \Laminas\Mvc\I18n\Translator
     */
    private $translator;
    
    
    /**
     *
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
     * @param \LeadersLinked\Cache\CacheInterface $cache
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
     * @param array $config
     * @param \Laminas\Mvc\I18n\Translator $translator
     */
    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()
    {
        $request = $this->getRequest();
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentCompany = $currentUserPlugin->getCompany();
        $currentUser = $currentUserPlugin->getUser();
        
        
        $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');
                    }
                }
            }
            
            //$isJson = true;
            if ($isJson) {
                
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
                $allowTakeATest = $acl->isAllowed($currentUser->usertype_id, 'activities-center/survey/take-a-test');
                $allowReport = $acl->isAllowed($currentUser->usertype_id, 'activities-center/survey/report');


                
                $search = $this->params()->fromQuery('search', []);
                $search = empty($search['value']) ? '' :  Functions::sanitizeFilterString($search['value']);
                
                $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' : Functions::sanitizeFilterString(filter_var($order[0]['dir']));
                
                $fields = ['name', 'start_date', 'end_date', 'status'];
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'name';
                
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
                    $order_direction = 'ASC';
                }
                
                $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
                $paginator = $surveyTestMapper->fetchAllNormalDataTableByUserId($currentUser->id, $search, $page, $records_x_page, $order_field, $order_direction);
                
                $items = [];
                $records = $paginator->getCurrentItems();
                
                foreach ($records as $record) 
                {
                    $link_pdf = '';
                    $link_take_a_test = '';
                    
                    if($allowReport && $record['status'] == SurveyTest::STATUS_COMPLETED) {
                        $link_pdf = $this->url()->fromRoute('activities-center/survey/report', ['id' => $record['uuid']]);
                        $link_take_a_test = '';
                        
                        
                    } 
                    if($allowTakeATest && $record['status'] == SurveyTest::STATUS_PENDING) {
                        $link_pdf = '';
                        $link_take_a_test = $this->url()->fromRoute('activities-center/survey/take-a-test', ['id' => $record['uuid']]);
                    }
                    
                    
                    
                    
                    switch($record['status'])
                    {
                        case SurveyTest::STATUS_PENDING :
                            $status = 'LABEL_PENDING';
                            break;
                            
                        case SurveyTest::STATUS_COMPLETED : 
                            $status = 'LABEL_COMPLETED';
                            break;
                            
                        default :
                            $status = 'LABEL_UNKNOWD';
                            break;
                            
                    }
                    
                    $dtStart = \DateTime::createFromFormat('Y-m-d', $record['start_date']);
                    $dtEnd = \DateTime::createFromFormat('Y-m-d', $record['end_date']);

                    $item = [
                        'name' => $record['name'],
                        'start_date' => $dtStart->format('d/m/Y'),
                        'end_date' => $dtEnd->format('d/m/Y'),
                        'status' => $status,
                        'actions' => [
                            'link_pdf' => $link_pdf,
                            'link_take_a_test' => $link_take_a_test,
                            
                        ]
                    ];
                    
                    array_push($items, $item);
                }
                
                return new JsonModel([
                    'success' => true,
                    'data' => [
                        'items' => $items,
                        'total' => $paginator->getTotalItemCount(),
                    ]
                ]);
            } 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 SurveyTakeAnTestForm();
                
                $this->layout()->setTemplate('layout/layout-backend');
                $viewModel = new ViewModel();
                $viewModel->setTemplate('leaders-linked/activity-center-survey/index.phtml');
                $viewModel->setVariables([
                    'form'      => $form,
                    'search'    => $search
                ]);
                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);
        }
        
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
        $surveyTest = $surveyTestMapper->fetchOneByUuid($uuid);
        if (! $surveyTest) {
            $data = [
                'success' => false,
                'data' => 'ERROR_RECORD_NOT_FOUND'
            ];
            
            return new JsonModel($data);
        }
        
        
        if ( $surveyTest->company_id != $currentCompany->id) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        if ($surveyTest->user_id != $currentUser->id ) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        if($surveyTest->status == SurveyTest::STATUS_COMPLETED) {
            return new JsonModel([
                'success' => false,
                'data' =>   'ERROR_SURVEY_ALREADY_COMPLETED'
            ]);
            
        }
        
        
        
        $request = $this->getRequest();
        if ($request->isGet()) {
            
            $content = json_decode($surveyTest->content);
            
            return new JsonModel([
                'success' => true,
                'data' =>   [
                    'name' => $content->name,
                    'text' => $content->text,
                    'content' => $content->content
                ]
            ]);
            
            
            
            return ;
        }
        else if ( $request->isPost()) {
            
            $surveyTestContent = json_decode($surveyTest->content, true);
            
            $max_sections = count($surveyTestContent['content']);
            for($i = 0; $i < $max_sections; $i++)
            {
                $max_questions = count($surveyTestContent['content'][$i]['questions']);  
                for($j = 0; $j < $max_questions; $j++)
                {

                    if($surveyTestContent['content'][$i]['questions'][$j]['type'] == 'open') {
                        $surveyTestContent['content'][$i]['questions'][$j]['answer'] = Functions::sanitizeFilterString( $this->params()->fromPost($surveyTestContent['content'][$i]['questions'][$j]['slug_question'],  '')); 
                    } 
                    else if($surveyTestContent['content'][$i]['questions'][$j]['type'] == 'simple') {
                        $val = Functions::sanitizeFilterString( $this->params()->fromPost($surveyTestContent['content'][$i]['questions'][$j]['slug_question'],  ''));

                        $max_options = count($surveyTestContent['content'][$i]['questions'][$j]['options']);
                        for($x = 0; $x < $max_options; $x++)
                        {
                            $surveyTestContent['content'][$i]['questions'][$j]['options'][$x]['checked'] = $surveyTestContent['content'][$i]['questions'][$j]['options'][$x]['slug_option'] == $val ? 1 : 0;
                        }
                    
                    } else if($surveyTestContent['content'][$i]['questions'][$j]['type'] == 'multiple') {
                        $val = $this->params()->fromPost($surveyTestContent['content'][$i]['questions'][$j]['slug_question']);
                        $val = is_array($val) ? $val : [];
                        
                        $max_options = count($surveyTestContent['content'][$i]['questions'][$j]['options']);
                        for($x = 0; $x < $max_options; $x++)
                        {
                            $surveyTestContent['content'][$i]['questions'][$j]['options'][$x]['checked'] = in_array($surveyTestContent['content'][$i]['questions'][$j]['options'][$x]['slug_option'], $val) ? 1 : 0;
                        }
                        
                    } else if($surveyTestContent['content'][$i]['questions'][$j]['type'] == 'range1to5') {
                        $surveyTestContent['content'][$i]['questions'][$j]['answer'] = intval($this->params()->fromPost($surveyTestContent['content'][$i]['questions'][$j]['slug_question'],  '0'), 10);
                    } 
                }
            }
            

            $surveyTest->content = json_encode($surveyTestContent);
            $surveyTest->status = SurveyTest::STATUS_COMPLETED;
            
            if($surveyTestMapper->update($surveyTest)) {
            
            
                return new JsonModel([
                    'success' => true,
                    'data' => 'LABEL_SURVEY_TEST_COMPLETED'
                ]);
            } else {
                return new JsonModel([
                    'success' => false,
                    'data' => $surveyTestMapper->getError()
                ]);
                
            }
            
        } else {
            
            
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    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);
        }
        
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
        $surveyTest = $surveyTestMapper->fetchOneByUuid($uuid);
        if (! $surveyTest) {
            $data = [
                'success' => false,
                'data' => 'ERROR_RECORD_NOT_FOUND'
            ];
            
            return new JsonModel($data);
        }
        
        
        if ( $surveyTest->company_id != $currentCompany->id) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        if ($surveyTest->user_id != $currentUser->id ) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        if($surveyTest->status != SurveyTest::STATUS_COMPLETED) {
            return new JsonModel([
                'success' => false,
                'data' =>   'ERROR_SURVEY_IS_NOT_COMPLETED'
            ]);
            
        }
        
        $request = $this->getRequest();
        if ($request->isGet()) {
            
            //Generate New PDF
            $pdf = new UniqueSurveyReport();
            $pdf->translator = $this->translator;
            
            $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'];
            }

            $pdf->header = $header;
            $pdf->footer = $footer;
           

            
            
            $userMapper = UserMapper::getInstance($this->adapter);
            $user = $userMapper->fetchOne($surveyTest->user_id);

            $content = json_decode($surveyTest->content, true);
            
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $surveyTest->update_on);   
            
            $pdf->SetTitle(Functions::utf8_decode($content['name']));
            $pdf->formName = Functions::utf8_decode($content['name']);
            $pdf->formText = Functions::utf8_decode($content['text']);
            $pdf->formDate = $dt->format('d/m/Y H:i a');
            $pdf->userName = Functions::utf8_decode($user->first_name . ' ' . $user->last_name) . ' (' . $user->email . ') ';
            

            
            $pdf->SetMargins(10, 0, 10);
            
            $pdf->AliasNbPages();
            $pdf->AddPage();


            foreach($content['content'] as $section)
            {
                if($pdf->GetY() > 250) {
                    $pdf->AddPage();
                }
                
                $pdf->addSection($section['name'], $section['text']);
                

                
                foreach($section['questions'] as $question)
                {
                    switch($question['type']) {
                        case 'range1to5' : 
                            $pdf->questionAndAnswer($question['text'], $question['answer']);
                            break;
                            
                        case 'multiple' : 
                        case 'simple' : 
                            $values = [];
                            
                            foreach($question['options'] as $option)
                            {
                                if($option['checked']) {
                                    array_push($values, $option['text']);
                                }
                            }
                            
                            $pdf->questionAndAnswers($question['text'], $values);
                            break;
                            
                    }
                }

            }
            
            
            $content = $pdf->Output('S');
            
            $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;
            
        } else {
            
            
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    
    
    
   
}