Rev 16785 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?phpdeclare(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\Hydrator\ObjectPropertyHydrator;use LeadersLinked\Mapper\PlanningObjectiveMapper;use LeadersLinked\Model\PlanningObjective;use LeadersLinked\Form\Planning\PlanningObjectiveForm;use LeadersLinked\Form\Planning\PlanningObjectiveHeaderForm;use LeadersLinked\Mapper\PlanningPeriodMapper;use LeadersLinked\Mapper\PlanningGoalMapper;use LeadersLinked\Mapper\PlanningTaskMapper;use LeadersLinked\Mapper\UserMapper;use LeadersLinked\Mapper\PlanningTaskUserMapper;use PhpOffice\PhpSpreadsheet\Spreadsheet;use PhpOffice\PhpSpreadsheet\Writer\Xlsx;use PhpOffice\PhpSpreadsheet\IOFactory;use LeadersLinked\Model\PlanningPeriod;use LeadersLinked\Model\PlanningGoal;use LeadersLinked\Model\PlanningTask;use LeadersLinked\Form\Planning\PlanningObjectiveReportForm;class PlanningObjectiveController extends AbstractActionController {const REPORT_ANALYSIS = 1;const REPORT_MATRIX = 2;const REPORT_FULL = 3;/**** @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() {$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) {$link_add = '';$period_id = Functions::sanitizeFilterString($this->params()->fromQuery('period_id'));if(empty($period_id)) {return new JsonModel(['success' => true,'data' => ['items' => [],'total' => 0,'link_add' => '',]]);}$planningPeriodMapper = PlanningPeriodMapper::getInstance($this->adapter);$planningPeriod = $planningPeriodMapper->fetchOneByUuid($period_id);if (!$planningPeriod) {$data = ['success' => false,'data' => 'ERROR_RECORD_NOT_FOUND'];return new JsonModel($data);}if ($planningPeriod->company_id != $currentCompany->id) {return new JsonModel(['success' => false,'data' => 'ERROR_UNAUTHORIZED']);}$link_add = $this->url()->fromRoute('planning/objectives/add', ['period_id' => $planningPeriod->uuid]);$acl = $this->getEvent()->getViewModel()->getVariable('acl');$allowAdd = $acl->isAllowed($currentUser->usertype_id, 'planning/objectives/add');$allowEdit = $acl->isAllowed($currentUser->usertype_id, 'planning/objectives/edit');$allowDelete = $acl->isAllowed($currentUser->usertype_id, 'planning/objectives/delete');$allowMatrix = $acl->isAllowed($currentUser->usertype_id, 'planning/objectives/matrix');$allowAnalysis = $acl->isAllowed($currentUser->usertype_id, 'planning/objectives/analysis');$allowFull = $acl->isAllowed($currentUser->usertype_id, 'planning/objectives/full');$search = $this->params()->fromQuery('search', []);$search = empty($search['value']) ? '' : Functions::sanitizeFilterString($search['value']);$records_x_page = intval($this->params()->fromQuery('length', 10), 10);$page = (intval($this->params()->fromQuery('start', 1), 10)/$records_x_page)+1;$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(Functions::sanitizeFilterString($order[0]['dir']));$fields = ['title', 'start', 'end', 'progress'];$order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'title';if(!in_array($order_direction, ['ASC', 'DESC'])) {$order_direction = 'ASC';}$planningObjectiveMapper = PlanningObjectiveMapper::getInstance($this->adapter);$paginator = $planningObjectiveMapper->fetchAllDataTableByCompanyIdAndPeriodId($planningPeriod->company_id, $planningPeriod->id, $search, $page, $records_x_page, $order_field, $order_direction);$items = [];$records = $paginator->getCurrentItems();foreach($records as $record){$dtStart = \DateTime::createFromFormat('Y-m-d', $record->start);$dtEnd = \DateTime::createFromFormat('Y-m-d', $record->end);$item = ['title' => $record->title,'description' => $record->description,'status' => $record->status,'start' => $dtStart->format('d/m/Y'),'end' => $dtEnd->format('d/m/Y'),'progress' => $record->progress ? $record->progress : 0,'actions' => ['link_edit' => $allowEdit ? $this->url()->fromRoute('planning/objectives/edit', ['id' => $record->uuid]) : '','link_delete' => $allowDelete ? $this->url()->fromRoute('planning/objectives/delete', ['id' => $record->uuid]) : '','link_analysis' => $allowAnalysis ? $this->url()->fromRoute('planning/objectives/analysis', ['id' => $record->uuid]) : '','link_matrix' => $allowMatrix ? $this->url()->fromRoute('planning/objectives/matrix', ['id' => $record->uuid]) : '','link_full' => $allowFull ? $this->url()->fromRoute('planning/objectives/full', ['id' => $record->uuid]) : '',]];array_push($items, $item);}return new JsonModel(['success' => true,'data' => ['items' => $items,'total' => $paginator->getTotalItemCount(),'link_add' => $allowAdd ? $link_add : '',]]);} else {$acl = $this->getEvent()->getViewModel()->getVariable('acl');$allowMatrix = $acl->isAllowed($currentUser->usertype_id, 'planning/objectives/matrix');$allowAnalysis = $acl->isAllowed($currentUser->usertype_id, 'planning/objectives/analysis');$allowFull = $acl->isAllowed($currentUser->usertype_id, 'planning/objectives/full');$form = new PlanningObjectiveForm();$formFilter = new PlanningObjectiveHeaderForm($this->adapter, $currentCompany->id);$options = [];if($allowAnalysis) {$options[ self::REPORT_ANALYSIS ] = 'LABEL_PLANNING_REPORT_ANALISYS_OPTION';}if($allowMatrix) {$options[ self::REPORT_MATRIX ] = 'LABEL_PLANNING_REPORT_MATRIX_OPTION';}if($allowFull) {$options[ self::REPORT_FULL ] = 'LABEL_PLANNING_REPORT_FULL_OPTION';}$formReport = new PlanningObjectiveReportForm($options);$this->layout()->setTemplate('layout/layout-backend');$viewModel = new ViewModel();$viewModel->setTemplate('leaders-linked/planning/objectives');$viewModel->setVariables(['form' => $form,'formFilter' => $formFilter,'formReport' => $formReport,]);return $viewModel ;}} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function addAction(){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$currentCompany = $currentUserPlugin->getCompany();$request = $this->getRequest();if($request->isPost()) {$period_id = Functions::sanitizeFilterString($this->params()->fromRoute('period_id'));$planningPeriodMapper = PlanningPeriodMapper::getInstance($this->adapter);$planningPeriod = $planningPeriodMapper->fetchOneByUuid($period_id);if (!$planningPeriod) {$data = ['success' => false,'data' => 'ERROR_RECORD_NOT_FOUND'];return new JsonModel($data);}if ($planningPeriod->company_id != $currentCompany->id) {return new JsonModel(['success' => false,'data' => 'ERROR_UNAUTHORIZED']);}$form = new PlanningObjectiveForm();$dataPost = $request->getPost()->toArray();if(!empty($dataPost['date_range'])) {$s = explode('-', $dataPost['date_range']);$start = trim($s[0]);$end = trim($s[1]);$dtStart = \DateTime::createFromFormat('d/m/Y', $start);$dtEnd = \DateTime::createFromFormat('d/m/Y', $end);if(!$dtStart && !$dtEnd) {$dataPost['date_range'] = '';}}$form->setData($dataPost);if($form->isValid()) {$dataPost = (array) $form->getData();$dataPost['status'] = empty($dataPost['status']) ? PlanningObjective::STATUS_INACTIVE : $dataPost['status'];$hydrator = new ObjectPropertyHydrator();$planningObjective = new PlanningObjective();$planningObjective->company_id = $planningPeriod->company_id;$planningObjective->period_id = $planningPeriod->id;$hydrator->hydrate($dataPost, $planningObjective);$planningObjectiveMapper = PlanningObjectiveMapper::getInstance($this->adapter);$result = $planningObjectiveMapper->insert($planningObjective);if($result) {$this->logger->info('Se agrego el objetivo la planificación : ' . $planningObjective->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);$data = ['success' => true,'data' => 'LABEL_RECORD_ADDED'];} else {$data = ['success' => false,'data' => $planningObjectiveMapper->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 {$data = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($data);}return new JsonModel($data);}public function editAction(){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$currentCompany = $currentUserPlugin->getCompany();$request = $this->getRequest();$uuid = $this->params()->fromRoute('id');if(!$uuid) {$data = ['success' => false,'data' => 'ERROR_INVALID_PARAMETER'];return new JsonModel($data);}$planningObjectiveMapper = PlanningObjectiveMapper::getInstance($this->adapter);$planningObjective = $planningObjectiveMapper->fetchOneByUuid($uuid);if (!$planningObjective) {$data = ['success' => false,'data' => 'ERROR_RECORD_NOT_FOUND'];return new JsonModel($data);}if ($planningObjective->company_id != $currentCompany->id) {return new JsonModel(['success' => false,'data' => 'ERROR_UNAUTHORIZED']);}if($request->isPost()) {$form = new PlanningObjectiveForm();$dataPost = $request->getPost()->toArray();$dataPost['status'] = empty($dataPost['status']) ? PlanningObjective::STATUS_INACTIVE : $dataPost['status'];if(empty($dataPost['date_range'])) {$dataPost['start'] = date('Y-m-d');$dataPost['end'] = date('Y-m-d');} else {$s = explode('-', $dataPost['date_range']);$start = trim($s[0]);$end = trim($s[1]);$dtStart = \DateTime::createFromFormat('d/m/Y', $start);$dtEnd = \DateTime::createFromFormat('d/m/Y', $end);if($dtStart && $dtEnd) {$dataPost['start'] = $dtStart->format('Y-m-d');$dataPost['end'] = $dtEnd->format('Y-m-d');} else {$dataPost['start'] = date('Y-m-d');$dataPost['end'] = date('Y-m-d');}}$form->setData($dataPost);if($form->isValid()) {$dataPost = (array) $form->getData();$hydrator = new ObjectPropertyHydrator();$hydrator->hydrate($dataPost, $planningObjective);$result = $planningObjectiveMapper->update($planningObjective);if($result) {$this->logger->info('Se actualizo el objetivo la planificación : ' . $planningObjective->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);$data = ['success' => true,'data' => 'LABEL_RECORD_UPDATED'];} else {$data = ['success' => false,'data' => $planningObjectiveMapper->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()) {$data = ['success' => true,'data' => ['title' => $planningObjective->title,'description' => $planningObjective->description,'start' => $planningObjective->start,'end' => $planningObjective->end,'status' => $planningObjective->status,'progress' => $planningObjective->progress,'budget' => $planningObjective->budget,'cost' => $planningObjective->cost,]];return new JsonModel($data);} else {$data = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($data);}return new JsonModel($data);}public function deleteAction(){$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);}$planningObjectiveMapper = PlanningObjectiveMapper::getInstance($this->adapter);$planningObjective = $planningObjectiveMapper->fetchOneByUuid($uuid);if (!$planningObjective) {$data = ['success' => false,'data' => 'ERROR_RECORD_NOT_FOUND'];return new JsonModel($data);}if ($planningObjective->company_id != $currentCompany->id) {return new JsonModel(['success' => false,'data' => 'ERROR_UNAUTHORIZED']);}if ($request->isPost()) {$result = $planningObjectiveMapper->delete($planningObjective);if ($result) {$this->logger->info('Se borro el objetivo de la planificación :' . $planningObjective->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);$data = ['success' => true,'data' => 'LABEL_RECORD_DELETED'];} else {$data = ['success' => false,'data' => $planningObjectiveMapper->getError()];return new JsonModel($data);}} else {$data = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($data);}return new JsonModel($data);}public function analysisAction(){$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);}$planningObjectiveMapper = PlanningObjectiveMapper::getInstance($this->adapter);$planningObjective = $planningObjectiveMapper->fetchOneByUuid($uuid);if (!$planningObjective) {$data = ['success' => false,'data' => 'ERROR_RECORD_NOT_FOUND'];return new JsonModel($data);}if ($planningObjective->company_id != $currentCompany->id) {return new JsonModel(['success' => false,'data' => 'ERROR_UNAUTHORIZED']);}if ($request->isGet()) {$planningPeriodMapper = PlanningPeriodMapper::getInstance($this->adapter);$planningPeriod = $planningPeriodMapper->fetchOne($planningObjective->period_id);$planningGoalMapper = PlanningGoalMapper::getInstance($this->adapter);$planningTaskMapper = PlanningTaskMapper::getInstance($this->adapter);$userMapper = UserMapper::getInstance($this->adapter);$planningTaskUserMapper = PlanningTaskUserMapper::getInstance($this->adapter);$spreadsheet = new Spreadsheet();$spreadsheet->getProperties()->setTitle($this->translator->translate('LABEL_PLANNING_REPORT_ANALISYS_TITLE'));$spreadsheet->setActiveSheetIndex(0);$sheet = $spreadsheet->getActiveSheet();$row = 1;$sheet->setCellValue('A' . $row, $this->translator->translate('LABEL_PLANNING_REPORT_ANALISYS_TITLE'));$sheet->mergeCells('A' . $row . ':R' . $row);$sheet->getCell('A' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('A' . $row)->getStyle()->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);/** PERIODO **/$row++;$sheet->setCellValue('A' . $row, $planningObjective->title);$sheet->getCell('A' . $row)->getStyle()->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('A' . $row)->getStyle()->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('A' . $row)->getStyle()->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$row++;$sheet->setCellValue('A' . $row, '');$sheet->getCell('A' . $row)->getStyle()->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('A' . $row)->getStyle()->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('A' . $row)->getStyle()->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);/** GOAL **/$goals = $planningGoalMapper->fetchAllActiveByObjectiveId($planningObjective->id);foreach($goals as $goal){$sheet->setCellValue('B' . $row, $goal->title);$sheet->getCell('B' . $row)->getStyle()->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('B' . $row)->getStyle()->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('B' . $row)->getStyle()->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$row++;$sheet->setCellValue('B' . $row, '');$sheet->getCell('B' . $row)->getStyle()->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('B' . $row)->getStyle()->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('B' . $row)->getStyle()->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('C' . $row, $this->translator->translate('LABEL_TASK'));$sheet->getCell('C' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('D' . $row, $this->translator->translate('LABEL_DESCRIPTION'));$sheet->getCell('D' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('D' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('E' . $row, $this->translator->translate('LABEL_TASK_HOW'));$sheet->getCell('E' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('E' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('F' . $row, $this->translator->translate('LABEL_TASK_PLACE'));$sheet->getCell('F' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('F' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('G' . $row, $this->translator->translate('LABEL_DATE'));$sheet->getCell('G' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('G' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('H' . $row, $this->translator->translate('LABEL_TASK_WHO'));$sheet->getCell('H' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('H' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('I' . $row, $this->translator->translate('LABEL_HOURS'));$sheet->getCell('I' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('I' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('J' . $row, $this->translator->translate('LABEL_PROGRESS'));$sheet->getCell('J' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('J' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('K' . $row, $this->translator->translate('LABEL_COST'));$sheet->getCell('K' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('K' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('L' . $row, $this->translator->translate('LABEL_TASK_DETOUR'));$sheet->getCell('L' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('L' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('M' . $row, $this->translator->translate('LABEL_TASK_EVALUATION'));$sheet->getCell('M' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('M' . $row)->getStyle()->getFont()->setBold(true);$tasks = $planningTaskMapper->fetchAllByGoalId($goal->id);if($tasks) {foreach($tasks as $task){$row++;$users =[];$taskUsers = $planningTaskUserMapper->fetchAllByTaskId($task->id);foreach($taskUsers as $taskUser){$user = $userMapper->fetchOne($taskUser->user_id);if($user) {array_push($users, trim($user->first_name.' '.$user->last_name));}}$sheet->setCellValue('C' . $row, $task->title);$sheet->getCell('C' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('D' . $row, $task->description);$sheet->getCell('D' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('E' . $row, $task->how);$sheet->getCell('E' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('F' . $row, $task->place);$sheet->getCell('F' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$dtStart = \DateTime::createFromFormat('Y-m-d', $task->start);$dtEnd = \DateTime::createFromFormat('Y-m-d', $task->end);$date = $dtStart->format('d/m/Y') . ' - ' . $dtEnd->format('d/m/Y');$sheet->setCellValue('G' . $row, $date);$sheet->getCell('G' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('H' . $row, implode(',', $users));$sheet->getCell('H' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('I' . $row, $task->hours);$sheet->getCell('I' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('J' . $row, $task->progress);$sheet->getCell('J' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('K' . $row, $task->cost);$sheet->getCell('K' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('L' . $row, $task->detour);$sheet->getCell('L' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('M' . $row, $task->evaluation);$sheet->getCell('M' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);}}$row++;}$fileName = Functions::normalizeString('analysis-'. $planningObjective->title . '-' . date('d-m-Y-h-i-a', time()) . '.xls');$tempFilename = tempnam(sys_get_temp_dir(), 'planning_objective_' . time());$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');$writer->save($tempFilename);$content = file_get_contents($tempFilename);@unlink($tempFilename);return new JsonModel(['success' => true,'data' => ['content' => base64_encode($content),'basename' => $fileName]]);} else {$data = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($data);}return new JsonModel($data);}public function fullAction(){$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);}$planningObjectiveMapper = PlanningObjectiveMapper::getInstance($this->adapter);$planningObjective = $planningObjectiveMapper->fetchOneByUuid($uuid);if (!$planningObjective) {$data = ['success' => false,'data' => 'ERROR_RECORD_NOT_FOUND'];return new JsonModel($data);}if ($planningObjective->company_id != $currentCompany->id) {return new JsonModel(['success' => false,'data' => 'ERROR_UNAUTHORIZED']);}if ($request->isGet()) {$planningPeriodMapper = PlanningPeriodMapper::getInstance($this->adapter);$planningPeriod = $planningPeriodMapper->fetchOne($planningObjective->period_id);$planningGoalMapper = PlanningGoalMapper::getInstance($this->adapter);$planningTaskMapper = PlanningTaskMapper::getInstance($this->adapter);$userMapper = UserMapper::getInstance($this->adapter);$planningTaskUserMapper = PlanningTaskUserMapper::getInstance($this->adapter);$spreadsheet = new Spreadsheet();$spreadsheet->getProperties()->setTitle($this->translator->translate('LABEL_PLANNING_REPORT_FULL_TITLE'));$spreadsheet->setActiveSheetIndex(0);$sheet = $spreadsheet->getActiveSheet();$row = 1;$sheet->setCellValue('A' . $row, $this->translator->translate('LABEL_PLANNING_REPORT_FULL_TITLE'));$sheet->mergeCells('A' . $row . ':R' . $row);$sheet->getCell('A' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('A' . $row)->getStyle()->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);/** PERIODO **/$row++;$sheet->setCellValue('A' . $row, $this->translator->translate('LABEL_PLANNING_PERIOD'));$sheet->getCell('A' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('A' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$row++;$sheet->setCellValue('A' . $row, $this->translator->translate('LABEL_TITLE'));$sheet->getCell('A' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('A' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('B' . $row, $this->translator->translate('LABEL_DESCRIPTION'));$sheet->getCell('B' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('B' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('C' . $row, $this->translator->translate('LABEL_START'));$sheet->getCell('C' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('C' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('D' . $row, $this->translator->translate('LABEL_END'));$sheet->getCell('D' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('D' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('E' . $row, $this->translator->translate('LABEL_BUDGET'));$sheet->getCell('E' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('E' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('F' . $row, $this->translator->translate('LABEL_COST'));$sheet->getCell('F' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('F' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('G' . $row, $this->translator->translate('LABEL_HOURS'));$sheet->getCell('G' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('G' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('H' . $row, $this->translator->translate('LABEL_PROGRESS'));$sheet->getCell('H' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('H' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('I' . $row, $this->translator->translate('LABEL_STATUS'));$sheet->getCell('I' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('I' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('A3', $planningPeriod->title);$sheet->getCell('A3')->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$row++;$sheet->setCellValue('B' . $row, $planningPeriod->description);$sheet->getCell('B' . $row)->getStyle()->getAlignment()->setWrapText(true);$sheet->getCell('B' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$dt = \DateTime::createFromFormat('Y-m-d', $planningPeriod->start);$sheet->setCellValue('C' . $row, $dt->format('d/m/Y'));$sheet->getCell('C' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$dt = \DateTime::createFromFormat('Y-m-d', $planningPeriod->end);$sheet->setCellValue('D' . $row, $dt->format('d/m/Y'));$sheet->getCell('D' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('E' . $row, $planningPeriod->budget);$sheet->getCell('E' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('F' . $row, $planningPeriod->cost);$sheet->getCell('F' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('G' . $row, $planningPeriod->hours);$sheet->getCell('G' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('H' . $row, $planningPeriod->progress);$sheet->getCell('H' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('I' . $row, $planningPeriod->status == PlanningPeriod::STATUS_ACTIVE ? $this->translator->translate('LABEL_ACTIVE') : $this->translator->translate('LABEL_INACTIVE'));$sheet->getCell('I' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);/** OBJETIVOS **/$row = 4;$sheet->setCellValue('B' . $row, $this->translator->translate('LABEL_PLANNING_OBJECTIVE'));$sheet->getCell('B' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('B' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$row++;$sheet->setCellValue('B' . $row, $this->translator->translate('LABEL_TITLE'));$sheet->getCell('B' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('B' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('C' . $row, $this->translator->translate('LABEL_DESCRIPTION'));$sheet->getCell('C' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('C' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('D' . $row, $this->translator->translate('LABEL_START'));$sheet->getCell('D' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('D' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('E' . $row, $this->translator->translate('LABEL_END'));$sheet->getCell('E' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('E' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('F' . $row, $this->translator->translate('LABEL_BUDGET'));$sheet->getCell('F' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('F' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('G' . $row, $this->translator->translate('LABEL_COST'));$sheet->getCell('G' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('G' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('H' . $row, $this->translator->translate('LABEL_HOURS'));$sheet->getCell('H' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('H' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('I' . $row, $this->translator->translate('LABEL_PROGRESS'));$sheet->getCell('I' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('I' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('J' . $row, $this->translator->translate('LABEL_STATUS'));$sheet->getCell('J' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('J' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$row++;$sheet->setCellValue('B' . $row, $planningObjective->title);$sheet->getCell('B' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('C' . $row, $planningObjective->description);$sheet->getCell('C' . $row)->getStyle()->getAlignment()->setWrapText(true);$sheet->getCell('C' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$dt = \DateTime::createFromFormat('Y-m-d', $planningObjective->start);$sheet->setCellValue('D' . $row, $dt->format('d/m/Y'));$sheet->getCell('D' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$dt = \DateTime::createFromFormat('Y-m-d', $planningObjective->end);$sheet->setCellValue('E' . $row, $dt->format('d/m/Y'));$sheet->getCell('E' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('F' . $row, $planningObjective->budget);$sheet->getCell('F' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('G' . $row, $planningObjective->cost);$sheet->getCell('G' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('H' . $row, $planningObjective->hours);$sheet->getCell('H' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('I' . $row, $planningObjective->progress);$sheet->getCell('I' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('J' . $row, $planningObjective->status == PlanningObjective::STATUS_ACTIVE ? $this->translator->translate('LABEL_ACTIVE') : $this->translator->translate('LABEL_INACTIVE'));$sheet->getCell('J' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);/** GOAL **/$goals = $planningGoalMapper->fetchAllActiveByObjectiveId($planningObjective->id);foreach($goals as $goal){$row++;$sheet->setCellValue('C' . $row, $this->translator->translate('LABEL_PLANNING_GOAL'));$sheet->getCell('C' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('C' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$row++;$sheet->setCellValue('C' . $row, $this->translator->translate('LABEL_TITLE'));$sheet->getCell('C' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('D' . $row, $this->translator->translate('LABEL_DESCRIPTION'));$sheet->getCell('D' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('E' . $row, $this->translator->translate('LABEL_START'));$sheet->getCell('E' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('F' . $row, $this->translator->translate('LABEL_END'));$sheet->getCell('F' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('G' . $row, $this->translator->translate('LABEL_BUDGET'));$sheet->getCell('G' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('H' . $row, $this->translator->translate('LABEL_COST'));$sheet->getCell('H' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('I' . $row, $this->translator->translate('LABEL_HOURS'));$sheet->getCell('I' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('J' . $row, $this->translator->translate('LABEL_PROGRESS'));$sheet->getCell('J' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('K' . $row, $this->translator->translate('LABEL_STATUS'));$sheet->getCell('K' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$row++;$sheet->setCellValue('C' . $row, $goal->title);$sheet->getCell('C' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('D' . $row, $goal->description);$sheet->getCell('D' . $row)->getStyle()->getAlignment()->setWrapText(true);$sheet->getCell('D' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$dt = \DateTime::createFromFormat('Y-m-d', $goal->start);$sheet->setCellValue('E' . $row, $dt->format('d/m/Y'));$sheet->getCell('E' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$dt = \DateTime::createFromFormat('Y-m-d', $goal->end);$sheet->setCellValue('F' . $row, $dt->format('d/m/Y'));$sheet->getCell('F' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('G' . $row, $goal->budget);$sheet->getCell('G' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('F' . $row, $goal->cost);$sheet->getCell('F' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('H' . $row, $goal->hours);$sheet->getCell('H' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('I' . $row, $goal->progress);$sheet->getCell('I' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('J' . $row, $goal->status == PlanningGoal::STATUS_ACTIVE ? $this->translator->translate('LABEL_ACTIVE') : $this->translator->translate('LABEL_INACTIVE'));$sheet->getCell('J' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$tasks = $planningTaskMapper->fetchAllByGoalId($goal->id);if($tasks) {$row++;$sheet->setCellValue('D' . $row, $this->translator->translate('LABEL_PLANNING_TASKS'));$sheet->getCell('D' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('D' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$row++;$sheet->setCellValue('D' . $row, $this->translator->translate('LABEL_TITLE'));$sheet->getCell('D' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('D' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('E' . $row, $this->translator->translate('LABEL_DESCRIPTION'));$sheet->getCell('E' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('E' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('F' . $row, $this->translator->translate('LABEL_START'));$sheet->getCell('F' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('F' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('G' . $row, $this->translator->translate('LABEL_END'));$sheet->getCell('G' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('G' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('H' . $row, $this->translator->translate('LABEL_COST'));$sheet->getCell('H' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('H' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('I' . $row, $this->translator->translate('LABEL_HOURS'));$sheet->getCell('I' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('I' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('J' . $row, $this->translator->translate('LABEL_PROGRESS'));$sheet->getCell('J' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('J' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('K' . $row, $this->translator->translate('LABEL_STATUS'));$sheet->getCell('K' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('K' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('L' . $row, $this->translator->translate('LABEL_TASK_HOW'));$sheet->getCell('L' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('L' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('M' . $row, $this->translator->translate('LABEL_TASK_PLACE'));$sheet->getCell('M' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('M' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('N' . $row, $this->translator->translate('LABEL_TASK_WHO'));$sheet->getCell('N' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('N' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('O' . $row, $this->translator->translate('LABEL_TASK_EVALUATION'));$sheet->getCell('O' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('O' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('P' . $row, $this->translator->translate('LABEL_TASK_DETOUR'));$sheet->getCell('P' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('P' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('Q' . $row, $this->translator->translate('LABEL_IS_PRIORITY'));$sheet->getCell('Q' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('Q' . $row)->getStyle()->getFont()->setBold(true);$sheet->setCellValue('R' . $row, $this->translator->translate('LABEL_IS_URGENT'));$sheet->getCell('R' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('R' . $row)->getStyle()->getFont()->setBold(true);foreach($tasks as $task){$users =[];$taskUsers = $planningTaskUserMapper->fetchAllByTaskId($task->id);foreach($taskUsers as $taskUser){$user = $userMapper->fetchOne($taskUser->user_id);if($user) {array_push($users, trim($user->first_name.' '.$user->last_name));}}$row++;$sheet->setCellValue('D' . $row, $task->title);$sheet->getCell('D' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('E' . $row, $task->description);$sheet->getCell('E' . $row)->getStyle()->getAlignment()->setWrapText(true);$sheet->getCell('E' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$dt = \DateTime::createFromFormat('Y-m-d', $task->start);$sheet->setCellValue('F' . $row, $dt->format('d/m/Y'));$sheet->getCell('F' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$dt = \DateTime::createFromFormat('Y-m-d', $task->end);$sheet->setCellValue('G' . $row, $dt->format('d/m/Y'));$sheet->getCell('G' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('H' . $row, $task->cost);$sheet->getCell('H' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('I' . $row, $task->hours);$sheet->getCell('I' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('J' . $row, $task->progress);$sheet->getCell('J' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('K' . $row, $task->status == PlanningTask::STATUS_ACTIVE ? $this->translator->translate('LABEL_ACTIVE') : $this->translator->translate('LABEL_INACTIVE'));$sheet->getCell('K' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('L' . $row, $task->how);$sheet->getCell('L' . $row)->getStyle()->getAlignment()->setWrapText(true);$sheet->getCell('L' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('M' . $row, $task->place);$sheet->getCell('M' . $row)->getStyle()->getAlignment()->setWrapText(true);$sheet->getCell('M' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('N' . $row, implode(' , ', $users));$sheet->getCell('N' . $row)->getStyle()->getAlignment()->setWrapText(true);$sheet->getCell('N' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('O' . $row, $task->evaluation);$sheet->getCell('O' . $row)->getStyle()->getAlignment()->setWrapText(true);$sheet->getCell('O' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('P' . $row, $task->detour);$sheet->getCell('P' . $row)->getStyle()->getAlignment()->setWrapText(true);$sheet->getCell('P' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('Q' . $row, $task->priority == PlanningTask::YES ? $this->translator->translate('LABEL_YES') : $this->translator->translate('LABEL_NO'));$sheet->getCell('Q' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('R' . $row, $task->urgent == PlanningTask::YES ? $this->translator->translate('LABEL_YES') : $this->translator->translate('LABEL_NO'));$sheet->getCell('R' . $row)->getStyle()->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);}}}$fileName = Functions::normalizeString('details-'.$planningObjective->title . '-' . date('d-m-Y-h-i-a', time()) . '.xls');$tempFilename = tempnam(sys_get_temp_dir(), 'planning_objective_' . time());$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');$writer->save($tempFilename);$content = file_get_contents($tempFilename);@unlink($tempFilename);return new JsonModel(['success' => true,'data' => ['content' => base64_encode($content),'basename' => $fileName]]);} else {$data = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($data);}return new JsonModel($data);}public function matrixAction(){$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);}$planningObjectiveMapper = PlanningObjectiveMapper::getInstance($this->adapter);$planningObjective = $planningObjectiveMapper->fetchOneByUuid($uuid);if (!$planningObjective) {$data = ['success' => false,'data' => 'ERROR_RECORD_NOT_FOUND'];return new JsonModel($data);}if ($planningObjective->company_id != $currentCompany->id) {return new JsonModel(['success' => false,'data' => 'ERROR_UNAUTHORIZED']);}if ($request->isGet()) {$taskImportantAndUrgent = [];$taskImportantAndNoUrgent = [];$taskNoImportantAndUrgent = [];$taskNoImportantAndNotUrgent = [];$planningTaskMapper = PlanningTaskMapper::getInstance($this->adapter);$tasks = $planningTaskMapper->fetchAllByObjectiveId($planningObjective->id);foreach($tasks as $task){if($task->priority == PlanningTask::YES){if($task->urgent == PlanningTask::YES) {array_push($taskImportantAndUrgent, $task->title);} else {array_push($taskImportantAndNoUrgent, $task->title);}} else {if($task->urgent == PlanningTask::YES) {array_push($taskNoImportantAndUrgent, $task->title);} else {array_push($taskNoImportantAndNotUrgent, $task->title);}}}$spreadsheet = new Spreadsheet();$spreadsheet->getProperties()->setTitle($this->translator->translate('LABEL_PLANNING_REPORT_MATRIX_TITLE'));$spreadsheet->setActiveSheetIndex(0);$sheet = $spreadsheet->getActiveSheet();$row = 1;$sheet->setCellValue('A' . $row, $this->translator->translate('LABEL_PLANNING_REPORT_MATRIX_TITLE'));$sheet->mergeCells('A' . $row . ':C' . $row);$sheet->getCell('A' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('A' . $row)->getStyle()->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);$row += 2;$sheet->setCellValue('A' . $row, '');$sheet->getCell('A' . $row)->getStyle()->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('A' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('A' . $row)->getStyle()->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('B' . $row, $this->translator->translate('LABEL_MATRIX_URGENT'));$sheet->getCell('B' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('B' . $row)->getStyle()->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('B' . $row)->getStyle()->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->setCellValue('C' . $row, $this->translator->translate('LABEL_MATRIX_NOT_URGENT'));$sheet->getCell('C' . $row)->getStyle()->getFont()->setBold(true);$sheet->getCell('C' . $row)->getStyle()->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('C' . $row)->getStyle()->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);/** IMPORTANTES **/$i = $row;foreach($taskImportantAndUrgent as $text){$i++;$sheet->setCellValue('B' . $i, $text);$sheet->getCell('B' . $i)->getStyle()->getAlignment()->setWrapText(true);}$i = $row;foreach($taskImportantAndNoUrgent as $text){$i++;$sheet->setCellValue('C' . $i, $text);$sheet->getCell('C' . $i)->getStyle()->getAlignment()->setWrapText(true);}$max = max(count($taskImportantAndUrgent), count($taskImportantAndNoUrgent));$max = $max ? $max : 1;for($i = 0; $i <= $max; $i++){$y = $row + $i;$sheet->getCell('B' . $y)->getStyle()->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('B' . $y)->getStyle()->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);}if($max > 2) {$y = $max / 2;$y = intval($y);$y = $row + $y + 1;$sheet->setCellValue('A' . $y, $this->translator->translate('LABEL_MATRIX_IMPORTANT'));$sheet->getCell('A' . $y)->getStyle()->getFont()->setBold(true);} else {$y = $row + 1;$sheet->setCellValue('A' . $y, $this->translator->translate('LABEL_MATRIX_IMPORTANT'));$sheet->getCell('A' . $y)->getStyle()->getFont()->setBold(true);}$row += $max;$sheet->getCell('A' . $row)->getStyle()->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('B' . $row)->getStyle()->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('C' . $row)->getStyle()->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);/***** NO IMPORTANTES ****/$i = $row;foreach($taskNoImportantAndUrgent as $text){$i++;$sheet->setCellValue('B' . $i, $text);$sheet->getCell('B' . $i)->getStyle()->getAlignment()->setWrapText(true);}$i = $row;foreach($taskNoImportantAndNotUrgent as $text){$i++;$sheet->setCellValue('C' . $i, $text);$sheet->getCell('C' . $i)->getStyle()->getAlignment()->setWrapText(true);}$max = max(count($taskNoImportantAndUrgent), count($taskNoImportantAndNotUrgent));$max = $max ? $max : 1;for($i = 0; $i <= $max; $i++){$y = $row + $i;$sheet->getCell('B' . $y)->getStyle()->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);$sheet->getCell('B' . $y)->getStyle()->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);}if($max > 2) {$y = $max / 2;$y = intval($y);$y = $row + $y + 1;$sheet->setCellValue('A' . $y, $this->translator->translate('LABEL_MATRIX_NOT_IMPORTANT'));$sheet->getCell('A' . $y)->getStyle()->getFont()->setBold(true);} else {$y = $row + 1;$sheet->setCellValue('A' . $y, $this->translator->translate('LABEL_MATRIX_NOT_IMPORTANT'));$sheet->getCell('A' . $y)->getStyle()->getFont()->setBold(true);}$fileName = Functions::normalizeString('matrix-' . $planningObjective->title . '-' . date('d-m-Y-h-i-a', time()) . '.xls');$tempFilename = tempnam(sys_get_temp_dir(), 'planning_objective_' . time());$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');$writer->save($tempFilename);$content = file_get_contents($tempFilename);@unlink($tempFilename);return new JsonModel(['success' => true,'data' => ['content' => base64_encode($content),'basename' => $fileName]]);} else {$data = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($data);}return new JsonModel($data);}}