| 5866 | eleazar | 1 | <?php
 | 
        
           |  |  | 2 |   | 
        
           |  |  | 3 | declare(strict_types=1);
 | 
        
           |  |  | 4 |   | 
        
           |  |  | 5 | namespace LeadersLinked\Controller;
 | 
        
           |  |  | 6 |   | 
        
           |  |  | 7 | use Laminas\Db\Adapter\AdapterInterface;
 | 
        
           |  |  | 8 | use Laminas\Cache\Storage\Adapter\AbstractAdapter;
 | 
        
           |  |  | 9 | use Laminas\Mvc\Controller\AbstractActionController;
 | 
        
           |  |  | 10 | use Laminas\Log\LoggerInterface;
 | 
        
           |  |  | 11 | use Laminas\View\Model\ViewModel;
 | 
        
           |  |  | 12 | use Laminas\View\Model\JsonModel;
 | 
        
           |  |  | 13 | use LeadersLinked\Mapper\QueryMapper;
 | 
        
           |  |  | 14 | use Laminas\Db\Sql\Select;
 | 
        
           |  |  | 15 | use LeadersLinked\Library\Functions;
 | 
        
           |  |  | 16 | use LeadersLinked\Mapper\SurveyTestMapper;
 | 
        
           |  |  | 17 | use LeadersLinked\Mapper\SurveyMapper;
 | 
        
           |  |  | 18 | use LeadersLinked\Mapper\SurveyFormMapper;
 | 
        
           |  |  | 19 | use LeadersLinked\Form\SurveyTestForm;
 | 
        
           |  |  | 20 | use LeadersLinked\Model\SurveyTest;
 | 
        
           |  |  | 21 | use LeadersLinked\Mapper\UserMapper;
 | 
        
           |  |  | 22 | use LeadersLinked\Hydrator\ObjectPropertyHydrator;
 | 
        
           |  |  | 23 | use LeadersLinked\Library\SurveyReport;
 | 
        
           | 7080 | eleazar | 24 | use PhpOffice\PhpSpreadsheet\Spreadsheet;
 | 
        
           |  |  | 25 | use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
 | 
        
           |  |  | 26 | use PhpOffice\PhpSpreadsheet\IOFactory;
 | 
        
           | 5866 | eleazar | 27 |   | 
        
           |  |  | 28 | class SurveyReportController extends AbstractActionController {
 | 
        
           |  |  | 29 |   | 
        
           |  |  | 30 |     /**
 | 
        
           |  |  | 31 |      *
 | 
        
           |  |  | 32 |      * @var AdapterInterface
 | 
        
           |  |  | 33 |      */
 | 
        
           |  |  | 34 |     private $adapter;
 | 
        
           |  |  | 35 |   | 
        
           |  |  | 36 |     /**
 | 
        
           |  |  | 37 |      *
 | 
        
           |  |  | 38 |      * @var AbstractAdapter
 | 
        
           |  |  | 39 |      */
 | 
        
           |  |  | 40 |     private $cache;
 | 
        
           |  |  | 41 |   | 
        
           |  |  | 42 |     /**
 | 
        
           |  |  | 43 |      *
 | 
        
           |  |  | 44 |      * @var  LoggerInterface
 | 
        
           |  |  | 45 |      */
 | 
        
           |  |  | 46 |     private $logger;
 | 
        
           |  |  | 47 |   | 
        
           |  |  | 48 |     /**
 | 
        
           |  |  | 49 |      *
 | 
        
           |  |  | 50 |      * @var array
 | 
        
           |  |  | 51 |      */
 | 
        
           |  |  | 52 |     private $config;
 | 
        
           |  |  | 53 |   | 
        
           |  |  | 54 |     /**
 | 
        
           |  |  | 55 |      *
 | 
        
           |  |  | 56 |      * @param AdapterInterface $adapter
 | 
        
           |  |  | 57 |      * @param AbstractAdapter $cache
 | 
        
           |  |  | 58 |      * @param LoggerInterface $logger
 | 
        
           |  |  | 59 |      * @param array $config
 | 
        
           |  |  | 60 |      */
 | 
        
           |  |  | 61 |     public function __construct($adapter, $cache, $logger, $config) {
 | 
        
           |  |  | 62 |         $this->adapter = $adapter;
 | 
        
           |  |  | 63 |         $this->cache = $cache;
 | 
        
           |  |  | 64 |         $this->logger = $logger;
 | 
        
           |  |  | 65 |         $this->config = $config;
 | 
        
           |  |  | 66 |     }
 | 
        
           |  |  | 67 |   | 
        
           |  |  | 68 |     public function indexAction() {
 | 
        
           | 5911 | eleazar | 69 |   | 
        
           | 5866 | eleazar | 70 |         $request = $this->getRequest();
 | 
        
           |  |  | 71 |         $currentUserPlugin = $this->plugin('currentUserPlugin');
 | 
        
           |  |  | 72 |         $currentCompany = $currentUserPlugin->getCompany();
 | 
        
           |  |  | 73 |         $currentUser = $currentUserPlugin->getUser();
 | 
        
           |  |  | 74 |   | 
        
           | 6424 | eleazar | 75 |         try{
 | 
        
           | 5866 | eleazar | 76 |         $request = $this->getRequest();
 | 
        
           |  |  | 77 |         if ($request->isGet()) {
 | 
        
           |  |  | 78 |   | 
        
           |  |  | 79 |             $headers = $request->getHeaders();
 | 
        
           |  |  | 80 |   | 
        
           |  |  | 81 |             $isJson = false;
 | 
        
           |  |  | 82 |             if ($headers->has('Accept')) {
 | 
        
           |  |  | 83 |                 $accept = $headers->get('Accept');
 | 
        
           |  |  | 84 |   | 
        
           |  |  | 85 |                 $prioritized = $accept->getPrioritized();
 | 
        
           |  |  | 86 |   | 
        
           |  |  | 87 |                 foreach ($prioritized as $key => $value) {
 | 
        
           |  |  | 88 |                     $raw = trim($value->getRaw());
 | 
        
           |  |  | 89 |   | 
        
           |  |  | 90 |                     if (!$isJson) {
 | 
        
           |  |  | 91 |                         $isJson = strpos($raw, 'json');
 | 
        
           |  |  | 92 |                     }
 | 
        
           |  |  | 93 |                 }
 | 
        
           |  |  | 94 |             }
 | 
        
           |  |  | 95 |   | 
        
           |  |  | 96 |             if ($isJson) {
 | 
        
           | 5911 | eleazar | 97 |   | 
        
           | 5866 | eleazar | 98 |                 $search = $this->params()->fromQuery('search', []);
 | 
        
           |  |  | 99 |                 $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
 | 
        
           |  |  | 100 |   | 
        
           |  |  | 101 |                 $page = intval($this->params()->fromQuery('start', 1), 10);
 | 
        
           |  |  | 102 |                 $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
 | 
        
           |  |  | 103 |                 $order = $this->params()->fromQuery('order', []);
 | 
        
           |  |  | 104 |                 $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
 | 
        
           |  |  | 105 |                 $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
 | 
        
           |  |  | 106 |   | 
        
           | 6411 | eleazar | 107 |                 $fields = ['name'];
 | 
        
           | 6416 | eleazar | 108 |                 $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'name';
 | 
        
           | 5866 | eleazar | 109 |   | 
        
           |  |  | 110 |                 if (!in_array($order_direction, ['ASC', 'DESC'])) {
 | 
        
           |  |  | 111 |                     $order_direction = 'ASC';
 | 
        
           |  |  | 112 |                 }
 | 
        
           |  |  | 113 |   | 
        
           | 6411 | eleazar | 114 |                 $surveyMapper = SurveyMapper::getInstance($this->adapter);
 | 
        
           | 6412 | eleazar | 115 |                 $paginator = $surveyMapper->fetchAllDataTableByCompanyId($currentCompany->id, $search, $page, $records_x_page, $order_field, $order_direction);
 | 
        
           | 6423 | eleazar | 116 |   | 
        
           |  |  | 117 |                 $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
 | 
        
           |  |  | 118 |   | 
        
           | 5866 | eleazar | 119 |                 $items = [];
 | 
        
           |  |  | 120 |                 $records = $paginator->getCurrentItems();
 | 
        
           | 6866 | eleazar | 121 |   | 
        
           | 5866 | eleazar | 122 |                 foreach ($records as $record) {
 | 
        
           | 6423 | eleazar | 123 |                     $surveyForm = $surveyFormMapper->fetchOne($record->form_id);
 | 
        
           | 6451 | eleazar | 124 |                     $params = [
 | 
        
           |  |  | 125 |   | 
        
           |  |  | 126 |                         'id' => $record->uuid,
 | 
        
           |  |  | 127 |                     ];
 | 
        
           | 5866 | eleazar | 128 |                     $item = [
 | 
        
           |  |  | 129 |                         'id' => $record->id,
 | 
        
           | 6426 | eleazar | 130 |                         'name' => $record->name,
 | 
        
           | 6211 | eleazar | 131 |                         'form' => $surveyForm->name,
 | 
        
           | 6427 | eleazar | 132 |                         'status' => $record->status,
 | 
        
           | 5866 | eleazar | 133 |                         'actions' => [
 | 
        
           | 6496 | eleazar | 134 |                             'link_report_all' => $this->url()->fromRoute('survey/report/all', ['survey_id' => $record->uuid]),
 | 
        
           | 7021 | eleazar | 135 |                             'link_report_csv' => $this->url()->fromRoute('survey/report/csv', ['survey_id' => $record->uuid]),
 | 
        
           | 6496 | eleazar | 136 |                             'link_overview' => $this->url()->fromRoute('survey/report/overview', ['survey_id' => $record->uuid])
 | 
        
           | 5866 | eleazar | 137 |                         ]
 | 
        
           |  |  | 138 |                     ];
 | 
        
           |  |  | 139 |   | 
        
           |  |  | 140 |                     array_push($items, $item);
 | 
        
           |  |  | 141 |                 }
 | 
        
           |  |  | 142 |   | 
        
           |  |  | 143 |                 return new JsonModel([
 | 
        
           |  |  | 144 |                     'success' => true,
 | 
        
           |  |  | 145 |                     'data' => [
 | 
        
           |  |  | 146 |                         'items' => $items,
 | 
        
           |  |  | 147 |                         'total' => $paginator->getTotalItemCount(),
 | 
        
           |  |  | 148 |                     ]
 | 
        
           |  |  | 149 |                 ]);
 | 
        
           | 5911 | eleazar | 150 |             } else {
 | 
        
           |  |  | 151 |                 $surveyMapper = SurveyMapper::getInstance($this->adapter);
 | 
        
           |  |  | 152 |                 $survies = $surveyMapper->fetchAllByCompanyId($currentCompany->id);
 | 
        
           |  |  | 153 |   | 
        
           | 5866 | eleazar | 154 |                 $form = new SurveyTestForm($this->adapter, $currentCompany->id);
 | 
        
           |  |  | 155 |   | 
        
           |  |  | 156 |                 $this->layout()->setTemplate('layout/layout-backend');
 | 
        
           |  |  | 157 |                 $viewModel = new ViewModel();
 | 
        
           | 5933 | eleazar | 158 |                 $viewModel->setTemplate('leaders-linked/survey-report/index.phtml');
 | 
        
           | 5866 | eleazar | 159 |                 $viewModel->setVariables([
 | 
        
           | 5911 | eleazar | 160 |                     'form'      => $form,
 | 
        
           |  |  | 161 |                     'survies' => $survies
 | 
        
           | 5866 | eleazar | 162 |                 ]);
 | 
        
           |  |  | 163 |                 return $viewModel;
 | 
        
           |  |  | 164 |             }
 | 
        
           |  |  | 165 |         } else {
 | 
        
           |  |  | 166 |             return new JsonModel([
 | 
        
           |  |  | 167 |                 'success' => false,
 | 
        
           |  |  | 168 |                 'data' => 'ERROR_METHOD_NOT_ALLOWED'
 | 
        
           |  |  | 169 |             ]);
 | 
        
           |  |  | 170 |   | 
        
           | 6424 | eleazar | 171 |         }
 | 
        
           |  |  | 172 |         } catch (\Throwable $e) {
 | 
        
           |  |  | 173 |             $e->getMessage();
 | 
        
           |  |  | 174 |             return new JsonModel([
 | 
        
           |  |  | 175 |                 'success' => false,
 | 
        
           |  |  | 176 |                 'data' => $e
 | 
        
           |  |  | 177 |             ]);
 | 
        
           | 5866 | eleazar | 178 |         }
 | 
        
           | 6212 | eleazar | 179 |   | 
        
           | 5866 | eleazar | 180 |     }
 | 
        
           | 5911 | eleazar | 181 |   | 
        
           | 6496 | eleazar | 182 |     public function overviewAction(){
 | 
        
           |  |  | 183 |         $request = $this->getRequest();
 | 
        
           |  |  | 184 |         $currentUserPlugin = $this->plugin('currentUserPlugin');
 | 
        
           |  |  | 185 |         $currentCompany = $currentUserPlugin->getCompany();
 | 
        
           |  |  | 186 |         $currentUser = $currentUserPlugin->getUser();
 | 
        
           |  |  | 187 |   | 
        
           |  |  | 188 |         $request = $this->getRequest();
 | 
        
           |  |  | 189 |         $uuid = $this->params()->fromRoute('survey_id');
 | 
        
           |  |  | 190 |   | 
        
           |  |  | 191 |         if (!$uuid) {
 | 
        
           |  |  | 192 |             $data = [
 | 
        
           |  |  | 193 |                 'success' => false,
 | 
        
           |  |  | 194 |                 'data' => 'ERROR_INVALID_PARAMETER'
 | 
        
           |  |  | 195 |             ];
 | 
        
           |  |  | 196 |   | 
        
           |  |  | 197 |             return new JsonModel($data);
 | 
        
           |  |  | 198 |         }
 | 
        
           |  |  | 199 |   | 
        
           |  |  | 200 |         $surveyMapper = SurveyMapper::getInstance($this->adapter);
 | 
        
           |  |  | 201 |         $survey = $surveyMapper->fetchOneByUuid($uuid);
 | 
        
           |  |  | 202 |   | 
        
           |  |  | 203 |         $surveyMapper = SurveyMapper::getInstance($this->adapter);
 | 
        
           |  |  | 204 |         $survey = $surveyMapper->fetchOneByUuid($uuid);
 | 
        
           |  |  | 205 |   | 
        
           |  |  | 206 |         $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
 | 
        
           |  |  | 207 |         $surveyTests = $surveyTestMapper->fetchAllBySurveyId($survey->id);
 | 
        
           |  |  | 208 |   | 
        
           | 8355 | eleazar | 209 |         if (!$surveyTests) {
 | 
        
           |  |  | 210 |             $data = [
 | 
        
           |  |  | 211 |                 'success' => false,
 | 
        
           |  |  | 212 |                 'data' => 'No hay respuestas en esta encuesta'
 | 
        
           |  |  | 213 |             ];
 | 
        
           |  |  | 214 |   | 
        
           |  |  | 215 |             return new JsonModel($data);
 | 
        
           |  |  | 216 |         }
 | 
        
           |  |  | 217 |   | 
        
           | 6496 | eleazar | 218 |         $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
 | 
        
           |  |  | 219 |         $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
 | 
        
           |  |  | 220 |   | 
        
           |  |  | 221 |         $sections = json_decode($surveyForm->content, true);
 | 
        
           |  |  | 222 |   | 
        
           |  |  | 223 |         $allTests = array_map(
 | 
        
           |  |  | 224 |             function($response) {
 | 
        
           |  |  | 225 |                 return json_decode($response->content, true);
 | 
        
           |  |  | 226 |             },
 | 
        
           |  |  | 227 |             $surveyTests,
 | 
        
           |  |  | 228 |         );
 | 
        
           |  |  | 229 |   | 
        
           |  |  | 230 |         $averages = [];
 | 
        
           |  |  | 231 |   | 
        
           |  |  | 232 |         foreach($sections as $section) {
 | 
        
           |  |  | 233 |             foreach($section['questions'] as $question) {
 | 
        
           |  |  | 234 |                 switch ($question['type']) {
 | 
        
           |  |  | 235 |                     case 'multiple':
 | 
        
           |  |  | 236 |                         $totals = [];
 | 
        
           |  |  | 237 |   | 
        
           |  |  | 238 |                         foreach($question['options'] as $option) {
 | 
        
           |  |  | 239 |                             $totals[$option['slug_option']] = 0;
 | 
        
           |  |  | 240 |                         }
 | 
        
           |  |  | 241 |   | 
        
           |  |  | 242 |                         foreach($question['options'] as $option) {
 | 
        
           |  |  | 243 |                             $totals[$option['slug_option']] = count(array_filter(
 | 
        
           |  |  | 244 |                                 $allTests,
 | 
        
           |  |  | 245 |                                 function ($test) use($option, $question) {
 | 
        
           |  |  | 246 |                                     return in_array($option['slug_option'], $test[$question['slug_question']]);
 | 
        
           |  |  | 247 |                                 }
 | 
        
           |  |  | 248 |                             ));
 | 
        
           |  |  | 249 |                         }
 | 
        
           |  |  | 250 |   | 
        
           |  |  | 251 |                         $averages[$question['slug_question']] = $totals;
 | 
        
           |  |  | 252 |   | 
        
           |  |  | 253 |                         break;
 | 
        
           |  |  | 254 |   | 
        
           |  |  | 255 |                     case 'simple':
 | 
        
           |  |  | 256 |                         $totals = [];
 | 
        
           |  |  | 257 |   | 
        
           |  |  | 258 |                         foreach($question['options'] as $option) {
 | 
        
           |  |  | 259 |                             $totals[$option['slug_option']] = 0;
 | 
        
           |  |  | 260 |                         }
 | 
        
           |  |  | 261 |   | 
        
           |  |  | 262 |                         foreach ($allTests as $test) {
 | 
        
           |  |  | 263 |                             $totals[$test[$question['slug_question']]]++;
 | 
        
           |  |  | 264 |                         }
 | 
        
           |  |  | 265 |   | 
        
           |  |  | 266 |                         foreach($totals as $slug => $amount) {
 | 
        
           |  |  | 267 |                             $totals[$slug] = ($amount / count($allTests)) * 100;
 | 
        
           |  |  | 268 |                         }
 | 
        
           |  |  | 269 |   | 
        
           |  |  | 270 |                         $averages[$question['slug_question']] = $totals;
 | 
        
           |  |  | 271 |                     break;
 | 
        
           |  |  | 272 |   | 
        
           |  |  | 273 |                 }
 | 
        
           |  |  | 274 |             }
 | 
        
           |  |  | 275 |         }
 | 
        
           |  |  | 276 |   | 
        
           |  |  | 277 |         $this->layout()->setTemplate('layout/layout-backend.phtml');
 | 
        
           |  |  | 278 |         $viewModel = new ViewModel();
 | 
        
           |  |  | 279 |         $viewModel->setTemplate('leaders-linked/survey-report/overview.phtml');
 | 
        
           |  |  | 280 |         $viewModel->setVariables([
 | 
        
           | 6506 | eleazar | 281 |             'sections' => $sections,
 | 
        
           | 6524 | eleazar | 282 |             'averages' => $averages,
 | 
        
           | 6496 | eleazar | 283 |         ]);
 | 
        
           |  |  | 284 |         return $viewModel ;
 | 
        
           |  |  | 285 |   | 
        
           |  |  | 286 |     }
 | 
        
           |  |  | 287 |   | 
        
           | 6447 | eleazar | 288 |     public function allAction() {
 | 
        
           | 5930 | eleazar | 289 |         $request = $this->getRequest();
 | 
        
           |  |  | 290 |         $currentUserPlugin = $this->plugin('currentUserPlugin');
 | 
        
           |  |  | 291 |         $currentCompany = $currentUserPlugin->getCompany();
 | 
        
           |  |  | 292 |         $currentUser = $currentUserPlugin->getUser();
 | 
        
           |  |  | 293 |   | 
        
           |  |  | 294 |         $request = $this->getRequest();
 | 
        
           | 6043 | eleazar | 295 |         $uuid = $this->params()->fromRoute('survey_id');
 | 
        
           | 5961 | eleazar | 296 |   | 
        
           | 5930 | eleazar | 297 |   | 
        
           |  |  | 298 |   | 
        
           |  |  | 299 |         if (!$uuid) {
 | 
        
           |  |  | 300 |             $data = [
 | 
        
           |  |  | 301 |                 'success' => false,
 | 
        
           |  |  | 302 |                 'data' => 'ERROR_INVALID_PARAMETER'
 | 
        
           |  |  | 303 |             ];
 | 
        
           |  |  | 304 |   | 
        
           |  |  | 305 |             return new JsonModel($data);
 | 
        
           |  |  | 306 |         }
 | 
        
           |  |  | 307 |   | 
        
           | 6039 | eleazar | 308 |         $surveyMapper = SurveyMapper::getInstance($this->adapter);
 | 
        
           |  |  | 309 |         $survey = $surveyMapper->fetchOneByUuid($uuid);
 | 
        
           | 6044 | eleazar | 310 |   | 
        
           | 5965 | eleazar | 311 |         $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
 | 
        
           | 6052 | eleazar | 312 |         $surveyTests = $surveyTestMapper->fetchAllBySurveyId($survey->id);
 | 
        
           | 5966 | eleazar | 313 |   | 
        
           | 6052 | eleazar | 314 |         if (!$surveyTests) {
 | 
        
           | 5930 | eleazar | 315 |             $data = [
 | 
        
           |  |  | 316 |                 'success' => false,
 | 
        
           | 5961 | eleazar | 317 |                 'data' => 'ERROR_RECORD_NOT_FOUND'
 | 
        
           | 5930 | eleazar | 318 |             ];
 | 
        
           |  |  | 319 |   | 
        
           |  |  | 320 |             return new JsonModel($data);
 | 
        
           |  |  | 321 |         }
 | 
        
           |  |  | 322 |   | 
        
           | 5965 | eleazar | 323 |   | 
        
           | 5930 | eleazar | 324 |         if ($request->isGet()) {
 | 
        
           |  |  | 325 |             $hydrator = new ObjectPropertyHydrator();
 | 
        
           |  |  | 326 |   | 
        
           |  |  | 327 |             //get form data
 | 
        
           |  |  | 328 |             $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
 | 
        
           | 5965 | eleazar | 329 |             $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
 | 
        
           | 5930 | eleazar | 330 |   | 
        
           |  |  | 331 |             if ($surveyForm) {
 | 
        
           |  |  | 332 |   | 
        
           | 6052 | eleazar | 333 |                 return $this->renderPDF($surveyForm, $surveyTests, $survey);
 | 
        
           | 5930 | eleazar | 334 |             } else {
 | 
        
           |  |  | 335 |   | 
        
           |  |  | 336 |                 $data = [
 | 
        
           |  |  | 337 |                     'success' => false,
 | 
        
           |  |  | 338 |                     'data' => 'ERROR_METHOD_NOT_ALLOWED'
 | 
        
           |  |  | 339 |                 ];
 | 
        
           |  |  | 340 |   | 
        
           |  |  | 341 |                 return new JsonModel($data);
 | 
        
           |  |  | 342 |             }
 | 
        
           |  |  | 343 |         } else {
 | 
        
           |  |  | 344 |             $data = [
 | 
        
           |  |  | 345 |                 'success' => false,
 | 
        
           |  |  | 346 |                 'data' => 'ERROR_METHOD_NOT_ALLOWED'
 | 
        
           |  |  | 347 |             ];
 | 
        
           |  |  | 348 |   | 
        
           |  |  | 349 |             return new JsonModel($data);
 | 
        
           |  |  | 350 |         }
 | 
        
           |  |  | 351 |   | 
        
           |  |  | 352 |         return new JsonModel($data);
 | 
        
           |  |  | 353 |     }
 | 
        
           |  |  | 354 |   | 
        
           |  |  | 355 |   | 
        
           | 6052 | eleazar | 356 |     public function renderPDF($surveyForm, $surveyTests, $survey) {
 | 
        
           | 5930 | eleazar | 357 |   | 
        
           | 6052 | eleazar | 358 |         $target_path = $this->config['leaderslinked.fullpath.company'] . DIRECTORY_SEPARATOR . $survey->uuid;
 | 
        
           | 5930 | eleazar | 359 |   | 
        
           |  |  | 360 |   | 
        
           |  |  | 361 |         if(file_exists($target_path)) {
 | 
        
           |  |  | 362 |             Functions::deleteFiles($target_path);
 | 
        
           |  |  | 363 |         } else {
 | 
        
           |  |  | 364 |             @mkdir($target_path, 0755, true);
 | 
        
           |  |  | 365 |         }
 | 
        
           |  |  | 366 |   | 
        
           |  |  | 367 |         // Set Data
 | 
        
           |  |  | 368 |         $headerFormName = utf8_decode($surveyForm->name);
 | 
        
           | 6071 | eleazar | 369 |         $headerSurveyName = utf8_decode('Informe de Encuesta: ' . trim($survey->name) . ' al ' . date("m-d-Y H:i:s", strtotime($survey->added_on)));
 | 
        
           | 6052 | eleazar | 370 |         $sections = json_decode($surveyForm->content, true);
 | 
        
           |  |  | 371 |   | 
        
           | 6053 | eleazar | 372 |         $allTests = array_map(
 | 
        
           | 6052 | eleazar | 373 |             function($response) {
 | 
        
           |  |  | 374 |                 return json_decode($response->content, true);
 | 
        
           |  |  | 375 |             },
 | 
        
           |  |  | 376 |             $surveyTests,
 | 
        
           |  |  | 377 |         );
 | 
        
           |  |  | 378 |   | 
        
           |  |  | 379 |         $averages = [];
 | 
        
           |  |  | 380 |   | 
        
           |  |  | 381 |         foreach($sections as $section) {
 | 
        
           |  |  | 382 |             foreach($section['questions'] as $question) {
 | 
        
           |  |  | 383 |                 switch ($question['type']) {
 | 
        
           | 6054 | eleazar | 384 |                     case 'multiple':
 | 
        
           | 6056 | eleazar | 385 |                         $totals = [];
 | 
        
           |  |  | 386 |   | 
        
           |  |  | 387 |                         foreach($question['options'] as $option) {
 | 
        
           |  |  | 388 |                             $totals[$option['slug_option']] = 0;
 | 
        
           |  |  | 389 |                         }
 | 
        
           |  |  | 390 |   | 
        
           |  |  | 391 |                         foreach($question['options'] as $option) {
 | 
        
           | 6057 | eleazar | 392 |                             $totals[$option['slug_option']] = count(array_filter(
 | 
        
           | 6056 | eleazar | 393 |                                 $allTests,
 | 
        
           | 6452 | eleazar | 394 |                                 function ($test) use($option, $question) {
 | 
        
           | 6450 | eleazar | 395 |                                     return in_array($option['slug_option'], $test[$question['slug_question']]);
 | 
        
           | 6056 | eleazar | 396 |                                 }
 | 
        
           |  |  | 397 |                             ));
 | 
        
           |  |  | 398 |                         }
 | 
        
           | 6084 | eleazar | 399 |   | 
        
           | 6056 | eleazar | 400 |                         $averages[$question['slug_question']] = $totals;
 | 
        
           |  |  | 401 |   | 
        
           |  |  | 402 |                         break;
 | 
        
           | 6449 | eleazar | 403 |   | 
        
           | 6052 | eleazar | 404 |                     case 'simple':
 | 
        
           | 6053 | eleazar | 405 |                         $totals = [];
 | 
        
           | 6052 | eleazar | 406 |   | 
        
           |  |  | 407 |                         foreach($question['options'] as $option) {
 | 
        
           | 6053 | eleazar | 408 |                             $totals[$option['slug_option']] = 0;
 | 
        
           | 6052 | eleazar | 409 |                         }
 | 
        
           |  |  | 410 |   | 
        
           | 6053 | eleazar | 411 |                         foreach ($allTests as $test) {
 | 
        
           |  |  | 412 |                             $totals[$test[$question['slug_question']]]++;
 | 
        
           | 6052 | eleazar | 413 |                         }
 | 
        
           |  |  | 414 |   | 
        
           | 6053 | eleazar | 415 |                         foreach($totals as $slug => $amount) {
 | 
        
           |  |  | 416 |                             $totals[$slug] = ($amount / count($allTests)) * 100;
 | 
        
           | 6052 | eleazar | 417 |                         }
 | 
        
           |  |  | 418 |   | 
        
           | 6084 | eleazar | 419 |                         $averages[$question['slug_question']] = $totals;
 | 
        
           | 6052 | eleazar | 420 |                     break;
 | 
        
           | 6071 | eleazar | 421 |   | 
        
           | 6052 | eleazar | 422 |                 }
 | 
        
           |  |  | 423 |             }
 | 
        
           |  |  | 424 |         }
 | 
        
           |  |  | 425 |   | 
        
           | 5930 | eleazar | 426 |         //Generate New PDF
 | 
        
           | 5971 | eleazar | 427 |         $pdf = new SurveyReport();
 | 
        
           | 5930 | eleazar | 428 |   | 
        
           |  |  | 429 |         $pdf->AliasNbPages();
 | 
        
           |  |  | 430 |         $pdf->AddPage();
 | 
        
           |  |  | 431 |   | 
        
           |  |  | 432 |         // Set header secundary
 | 
        
           | 6071 | eleazar | 433 |         $pdf->customHeader($headerFormName, $headerSurveyName);
 | 
        
           | 5930 | eleazar | 434 |   | 
        
           | 6609 | eleazar | 435 |         $countSection = 0;
 | 
        
           |  |  | 436 |   | 
        
           | 6615 | eleazar | 437 |         for ($i = 0; $i < count($sections); $i++) {
 | 
        
           |  |  | 438 |             if ($countSection > 1) {
 | 
        
           |  |  | 439 |                 $countSection = 0;
 | 
        
           |  |  | 440 |                 $pdf->AddPage();
 | 
        
           |  |  | 441 |                 $pdf->customHeader($headerFormName, $headerUserName);
 | 
        
           |  |  | 442 |             }
 | 
        
           |  |  | 443 |             $section = $sections[$i];
 | 
        
           | 6084 | eleazar | 444 |   | 
        
           |  |  | 445 |             foreach ($section['questions'] as $question) {
 | 
        
           | 6615 | eleazar | 446 |   | 
        
           | 6614 | eleazar | 447 |                     switch ($question['type']) {
 | 
        
           |  |  | 448 |                         case 'simple':
 | 
        
           |  |  | 449 |                             $labels = [];
 | 
        
           |  |  | 450 |                             $values = [];
 | 
        
           | 6039 | eleazar | 451 |   | 
        
           | 6614 | eleazar | 452 |                             foreach($question['options'] as $option) {
 | 
        
           |  |  | 453 |                                 $labels []= strip_tags($option['text']) . "\n(%.1f%%)";
 | 
        
           | 6133 | eleazar | 454 |   | 
        
           | 6614 | eleazar | 455 |                                 $values []= $averages[$question['slug_question']][$option['slug_option']];
 | 
        
           |  |  | 456 |                             }
 | 
        
           |  |  | 457 |   | 
        
           |  |  | 458 |                             $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
 | 
        
           | 6635 | eleazar | 459 |                             $pdf->Cell(0,10,strip_tags(trim(str_replace(' ', ' ', html_entity_decode($question['text'])))),0,1);
 | 
        
           | 6914 | eleazar | 460 |                             $pdf->pieChart($labels, $values, '', $filename);
 | 
        
           | 6614 | eleazar | 461 |                             $pdf->SetFont('Arial', '', 12);
 | 
        
           |  |  | 462 |                             $pdf->Image($filename, 45, $pdf->getY(), 120);
 | 
        
           |  |  | 463 |                             $pdf->setY($pdf->getY() + 90);
 | 
        
           | 6912 | eleazar | 464 |   | 
        
           | 6614 | eleazar | 465 |   | 
        
           |  |  | 466 |                             break;
 | 
        
           |  |  | 467 |   | 
        
           |  |  | 468 |                         case 'multiple':
 | 
        
           |  |  | 469 |                             $labels = [];
 | 
        
           |  |  | 470 |                             $values = [];
 | 
        
           |  |  | 471 |   | 
        
           |  |  | 472 |                             foreach($question['options'] as $option) {
 | 
        
           |  |  | 473 |                                 $labels []= strip_tags($option['text']);
 | 
        
           |  |  | 474 |   | 
        
           |  |  | 475 |                                 $values []= $averages[$question['slug_question']][$option['slug_option']];
 | 
        
           |  |  | 476 |                             }
 | 
        
           |  |  | 477 |   | 
        
           |  |  | 478 |                             $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
 | 
        
           |  |  | 479 |                             $pdf->Cell(0,10,strip_tags($question['text']),0,1);
 | 
        
           |  |  | 480 |                             $pdf->barChart($labels, $values, '', $filename);
 | 
        
           |  |  | 481 |                             $pdf->SetFont('Arial', '', 12);
 | 
        
           |  |  | 482 |                             $pdf->Image($filename, 12, $pdf->getY());
 | 
        
           |  |  | 483 |                             $pdf->setY($pdf->getY() + (count($values) * 13) + 10);
 | 
        
           |  |  | 484 |   | 
        
           |  |  | 485 |                             break;
 | 
        
           |  |  | 486 |                     }
 | 
        
           | 6615 | eleazar | 487 |                 $countSection++;
 | 
        
           | 6084 | eleazar | 488 |             }
 | 
        
           | 6608 | eleazar | 489 |   | 
        
           | 6615 | eleazar | 490 |   | 
        
           | 5930 | eleazar | 491 |         }
 | 
        
           |  |  | 492 |   | 
        
           | 7021 | eleazar | 493 |         return $pdf->Output();
 | 
        
           |  |  | 494 |     }
 | 
        
           |  |  | 495 |   | 
        
           |  |  | 496 |     public function csvAction() {
 | 
        
           |  |  | 497 |         $request = $this->getRequest();
 | 
        
           |  |  | 498 |         $currentUserPlugin = $this->plugin('currentUserPlugin');
 | 
        
           |  |  | 499 |         $currentCompany = $currentUserPlugin->getCompany();
 | 
        
           |  |  | 500 |         $currentUser = $currentUserPlugin->getUser();
 | 
        
           |  |  | 501 |   | 
        
           |  |  | 502 |         $request = $this->getRequest();
 | 
        
           |  |  | 503 |         $uuid = $this->params()->fromRoute('survey_id');
 | 
        
           |  |  | 504 |   | 
        
           |  |  | 505 |   | 
        
           |  |  | 506 |   | 
        
           |  |  | 507 |         if (!$uuid) {
 | 
        
           |  |  | 508 |             $data = [
 | 
        
           |  |  | 509 |                 'success' => false,
 | 
        
           |  |  | 510 |                 'data' => 'ERROR_INVALID_PARAMETER'
 | 
        
           |  |  | 511 |             ];
 | 
        
           |  |  | 512 |   | 
        
           |  |  | 513 |             return new JsonModel($data);
 | 
        
           |  |  | 514 |         }
 | 
        
           |  |  | 515 |   | 
        
           |  |  | 516 |         $surveyMapper = SurveyMapper::getInstance($this->adapter);
 | 
        
           |  |  | 517 |         $survey = $surveyMapper->fetchOneByUuid($uuid);
 | 
        
           |  |  | 518 |   | 
        
           |  |  | 519 |         $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
 | 
        
           |  |  | 520 |         $surveyTests = $surveyTestMapper->fetchAllBySurveyId($survey->id);
 | 
        
           |  |  | 521 |   | 
        
           |  |  | 522 |         if (!$surveyTests) {
 | 
        
           |  |  | 523 |             $data = [
 | 
        
           |  |  | 524 |                 'success' => false,
 | 
        
           |  |  | 525 |                 'data' => 'ERROR_RECORD_NOT_FOUND'
 | 
        
           |  |  | 526 |             ];
 | 
        
           |  |  | 527 |   | 
        
           |  |  | 528 |             return new JsonModel($data);
 | 
        
           |  |  | 529 |         }
 | 
        
           |  |  | 530 |   | 
        
           |  |  | 531 |   | 
        
           |  |  | 532 |         if ($request->isGet()) {
 | 
        
           |  |  | 533 |             $hydrator = new ObjectPropertyHydrator();
 | 
        
           |  |  | 534 |   | 
        
           |  |  | 535 |             //get form data
 | 
        
           |  |  | 536 |             $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
 | 
        
           |  |  | 537 |             $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
 | 
        
           |  |  | 538 |   | 
        
           |  |  | 539 |             if ($surveyForm) {
 | 
        
           |  |  | 540 |   | 
        
           |  |  | 541 |                 return $this->csvRender($surveyForm, $surveyTests, $survey);
 | 
        
           |  |  | 542 |             } else {
 | 
        
           |  |  | 543 |   | 
        
           |  |  | 544 |                 $data = [
 | 
        
           |  |  | 545 |                     'success' => false,
 | 
        
           |  |  | 546 |                     'data' => 'ERROR_METHOD_NOT_ALLOWED'
 | 
        
           |  |  | 547 |                 ];
 | 
        
           |  |  | 548 |   | 
        
           |  |  | 549 |                 return new JsonModel($data);
 | 
        
           |  |  | 550 |             }
 | 
        
           |  |  | 551 |         } else {
 | 
        
           |  |  | 552 |             $data = [
 | 
        
           |  |  | 553 |                 'success' => false,
 | 
        
           |  |  | 554 |                 'data' => 'ERROR_METHOD_NOT_ALLOWED'
 | 
        
           |  |  | 555 |             ];
 | 
        
           |  |  | 556 |   | 
        
           |  |  | 557 |             return new JsonModel($data);
 | 
        
           |  |  | 558 |         }
 | 
        
           |  |  | 559 |   | 
        
           |  |  | 560 |         return new JsonModel($data);
 | 
        
           |  |  | 561 |     }
 | 
        
           |  |  | 562 |   | 
        
           |  |  | 563 |   | 
        
           |  |  | 564 |     public function csvRender($surveyForm, $surveyTests, $survey)
 | 
        
           |  |  | 565 |     {
 | 
        
           | 7026 | eleazar | 566 |         $sections = json_decode($surveyForm->content, true);
 | 
        
           | 7020 | eleazar | 567 |   | 
        
           | 7088 | eleazar | 568 |         $spreadsheet = new Spreadsheet();
 | 
        
           |  |  | 569 |         $sheet = $spreadsheet->getActiveSheet();
 | 
        
           |  |  | 570 |   | 
        
           | 7025 | eleazar | 571 |         $allTests = array_map(
 | 
        
           |  |  | 572 |             function($response) {
 | 
        
           |  |  | 573 |                 return json_decode($response->content, true);
 | 
        
           |  |  | 574 |             },
 | 
        
           |  |  | 575 |             $surveyTests,
 | 
        
           |  |  | 576 |         );
 | 
        
           |  |  | 577 |   | 
        
           |  |  | 578 |         $averages = [];
 | 
        
           |  |  | 579 |   | 
        
           |  |  | 580 |         foreach($sections as $section) {
 | 
        
           |  |  | 581 |             foreach($section['questions'] as $question) {
 | 
        
           |  |  | 582 |                 switch ($question['type']) {
 | 
        
           |  |  | 583 |                     case 'multiple':
 | 
        
           |  |  | 584 |                         $totals = [];
 | 
        
           |  |  | 585 |   | 
        
           |  |  | 586 |                         foreach($question['options'] as $option) {
 | 
        
           |  |  | 587 |                             $totals[$option['slug_option']] = 0;
 | 
        
           |  |  | 588 |                         }
 | 
        
           |  |  | 589 |   | 
        
           |  |  | 590 |                         foreach($question['options'] as $option) {
 | 
        
           |  |  | 591 |                             $totals[$option['slug_option']] = count(array_filter(
 | 
        
           |  |  | 592 |                                 $allTests,
 | 
        
           |  |  | 593 |                                 function ($test) use($option, $question) {
 | 
        
           |  |  | 594 |                                     return in_array($option['slug_option'], $test[$question['slug_question']]);
 | 
        
           |  |  | 595 |                                 }
 | 
        
           |  |  | 596 |                             ));
 | 
        
           |  |  | 597 |                         }
 | 
        
           |  |  | 598 |   | 
        
           |  |  | 599 |                         $averages[$question['slug_question']] = $totals;
 | 
        
           |  |  | 600 |   | 
        
           |  |  | 601 |                         break;
 | 
        
           |  |  | 602 |   | 
        
           |  |  | 603 |                     case 'simple':
 | 
        
           |  |  | 604 |                         $totals = [];
 | 
        
           |  |  | 605 |   | 
        
           |  |  | 606 |                         foreach($question['options'] as $option) {
 | 
        
           |  |  | 607 |                             $totals[$option['slug_option']] = 0;
 | 
        
           |  |  | 608 |                         }
 | 
        
           |  |  | 609 |   | 
        
           |  |  | 610 |                         foreach ($allTests as $test) {
 | 
        
           |  |  | 611 |                             $totals[$test[$question['slug_question']]]++;
 | 
        
           |  |  | 612 |                         }
 | 
        
           |  |  | 613 |   | 
        
           |  |  | 614 |                         foreach($totals as $slug => $amount) {
 | 
        
           |  |  | 615 |                             $totals[$slug] = ($amount / count($allTests)) * 100;
 | 
        
           |  |  | 616 |                         }
 | 
        
           |  |  | 617 |   | 
        
           |  |  | 618 |                         $averages[$question['slug_question']] = $totals;
 | 
        
           |  |  | 619 |                     break;
 | 
        
           |  |  | 620 |   | 
        
           |  |  | 621 |                 }
 | 
        
           |  |  | 622 |             }
 | 
        
           |  |  | 623 |         }
 | 
        
           |  |  | 624 |   | 
        
           | 7101 | eleazar | 625 |         $row = 1;
 | 
        
           |  |  | 626 |   | 
        
           | 7025 | eleazar | 627 |         for ($i = 0; $i < count($sections); $i++) {
 | 
        
           |  |  | 628 |             $section = $sections[$i];
 | 
        
           |  |  | 629 |   | 
        
           | 7096 | eleazar | 630 |            for($j = 0; $j < count($section['questions']); $j++) {
 | 
        
           | 7099 | eleazar | 631 |                 $question = $section['questions'][$j];
 | 
        
           | 7095 | eleazar | 632 |   | 
        
           | 7101 | eleazar | 633 |                 if (!in_array($question['type'], ['simple', 'multiple'])){
 | 
        
           |  |  | 634 |                     continue;
 | 
        
           |  |  | 635 |                 }
 | 
        
           |  |  | 636 |                 $sheet->setCellValueByColumnAndRow(1, $row++, strip_tags($question['text']));
 | 
        
           |  |  | 637 |   | 
        
           | 7028 | eleazar | 638 |                 switch ($question['type']) {
 | 
        
           | 7032 | eleazar | 639 |                     case 'simple':
 | 
        
           | 7102 | eleazar | 640 |                         for($k = 0; $k < count($question['options']); $k++) {
 | 
        
           |  |  | 641 |                             $option = $question['options'][$k];
 | 
        
           | 7101 | eleazar | 642 |                             $sheet->setCellValueByColumnAndRow(1, $row, strip_tags($option['text']));
 | 
        
           |  |  | 643 |                             $sheet->setCellValueByColumnAndRow(2, $row, round($averages[$question['slug_question']][$option['slug_option']], 2) . '%');
 | 
        
           |  |  | 644 |                             $row++;
 | 
        
           | 7032 | eleazar | 645 |                         }
 | 
        
           | 7025 | eleazar | 646 |   | 
        
           | 7032 | eleazar | 647 |                         break;
 | 
        
           | 7025 | eleazar | 648 |   | 
        
           | 7032 | eleazar | 649 |                     case 'multiple':
 | 
        
           | 7102 | eleazar | 650 |                         for($k = 0; $k < count($question['options']); $k++) {
 | 
        
           |  |  | 651 |                             $option = $question['options'][$k];
 | 
        
           | 7101 | eleazar | 652 |                             $sheet->setCellValueByColumnAndRow(1, $row, strip_tags($option['text']));
 | 
        
           |  |  | 653 |                             $sheet->setCellValueByColumnAndRow(2, $row,$averages[$question['slug_question']][$option['slug_option']]);
 | 
        
           |  |  | 654 |                             $row++;
 | 
        
           | 7032 | eleazar | 655 |                         }
 | 
        
           | 7025 | eleazar | 656 |   | 
        
           | 7032 | eleazar | 657 |                         break;
 | 
        
           |  |  | 658 |                 }
 | 
        
           | 7025 | eleazar | 659 |             }
 | 
        
           |  |  | 660 |   | 
        
           |  |  | 661 |   | 
        
           |  |  | 662 |         }
 | 
        
           |  |  | 663 |   | 
        
           | 7020 | eleazar | 664 |         header('Content-Description: File Transfer');
 | 
        
           | 7088 | eleazar | 665 |         header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
 | 
        
           |  |  | 666 |         header('Content-Disposition: attachment; filename=report.xls');
 | 
        
           | 7020 | eleazar | 667 |         header('Content-Transfer-Encoding: binary');
 | 
        
           |  |  | 668 |         header('Expires: 0');
 | 
        
           |  |  | 669 |         header('Cache-Control: must-revalidate');
 | 
        
           |  |  | 670 |         header('Pragma: public');
 | 
        
           |  |  | 671 |   | 
        
           | 7088 | eleazar | 672 |         $writer = new Xlsx($spreadsheet);
 | 
        
           |  |  | 673 |   | 
        
           | 7020 | eleazar | 674 |         ob_clean();
 | 
        
           |  |  | 675 |         flush();
 | 
        
           | 7088 | eleazar | 676 |         $writer->save('php://output');
 | 
        
           | 7020 | eleazar | 677 |         return;
 | 
        
           | 5930 | eleazar | 678 |     }
 | 
        
           | 5866 | eleazar | 679 | }
 |