You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1032 lines
33 KiB

<?php
/*
* @Author: Jino Lacson
* @Date: 2018-10-25 10:20:42
* @Last Modified by: jlacson@wylog.com
* @Last Modified time: 2019-02-14 10:29:12
*/
if (! defined('BASEPATH')) {
exit('No direct script access allowed');
}
use app\core\utils\Response;
//require phpoffice library(Spreadsheet and Writer)
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
//require excel styles
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
//require excel protection for lock/unlock
use PhpOffice\PhpSpreadsheet\Style\Protection;
//require excel contitions
use PhpOffice\PhpSpreadsheet\Style\Conditional;
//require excel datavalidations
use PhpOffice\PhpSpreadsheet\Cell\DataValidation;
class Noshow_export_controller extends MY_Controller
{
/**
* php excel object instance variables
*
* @var string
*/
private $spreadsheet;
/**
* no show excel file tabs
*
* @var string
*/
private $reports;
/**
* instance variable for PhpOffice writer class
*
* @var string
*/
private $writer;
/**
* variable that set iteration to row 2 which is the datasets not headers
*
* @var string
*/
private $dataset;
/**
* instance variable for activesheet
*
* @var string
*/
private $sheets;
/**
* variable default font size for excel exports
*
* @var string
*/
private $default_font;
/**
* variable for default background color
*
* @var string
*/
private $default_background_color;
/**
* Tab title
*
* @var string
*/
private $sheetTitle;
/**
* Holds default maximum row
*
* @var int
*/
private $defaultMaximumRow;
/**
* Holds gray color variable
*
* @var string
*/
private $setGrayColor;
/**
* EXCEL PASSWORD PROTECTION THIS IS CONFIDENTIAL
*/
private const PASSWORD = '1@#]00YHkBlackHatzZ';
public function __construct()
{
$this->my_parent_controller();
Response::handleSessionTimeout("bo");
//load nshow_model
$this->load->model('nshow_model');
// Create new PHPExcel object
$this->spreadsheet = new Spreadsheet();
//get active sheet
$this->sheets = $this->spreadsheet->getActiveSheet();
//create writer object
$this->writer = new Xlsx($this->spreadsheet);
//tab title
$this->sheetTitle = "No_Show";
//no show excel tabs pagination
$this->reports = "data_fields";
//start iteration in row 6 dataset exclude row 1 - 5(which is the excel main pane headers)
$this->dataset = 6;
//set default excel font size which is 8
$this->default_font = 8;
//Default maximum row
$this->defaultMaximumRow = 1000;
//Default maximum row
$this->booklist_end_row = 0;
//set default background color
$this->default_background_color = '428bcb';
//set gray color
$this->setGrayColor = 'D3D3D3';
}
/**
* Set execution and memory limit
*
* @return void
* access public
*/
public function setMemoryLimit()
{
ini_set('memory_limit', '1024M');
ini_set('max_execution_time', (60*3));
}
/**
* Set document properties
*
* @return void
* access public
*/
public function setDocumentProperties()
{
return $this->spreadsheet->getProperties()->setCreator("Company For Madagascar Event Management System")
->setLastModifiedBy("Company For Madagascar Event Management System")
->setTitle("Office 2007 XLSX Document")
->setSubject("Office 2007 XLSX Document")
->setDescription("No show export import file")
->setKeywords("office 2007 openxml php")
->setCategory("Export file");
}
/**
* Set headers(pragma, cache control , cookies etc..)
*
* @param string $filename
* @return void
*/
public function setHeaders(string $filename)
{
// Redirect output to a client’s web browser (Excel2007)
header('Content-Type: application/vnd.ms-excel; charset=utf-8');
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$filename.'.xlsx"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header('Pragma: public'); // HTTP/1.0
$this->writer->save('php://output');
exit();
}
/**
* Auto size columns for each worksheet
*
* @return void
* access public
*/
public function setExcelAutoSize()
{
foreach ($this->spreadsheet->getWorksheetIterator() as $worksheet) {
$this->spreadsheet->setActiveSheetIndex($this->spreadsheet->getIndex($worksheet));
$sheet = $this->sheets;
$cellIterator = $sheet->getRowIterator()->current()->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(true);
foreach ($cellIterator as $cell) {
$sheet->getColumnDimension($cell->getColumn())->setAutoSize(true);
}
}
}
/**
* set excel main headers (first rows 1 - 5 with freeze pane)
*
* @param integer $eventID
* @param integer $eventScheduleID
* @param string $event_title
* @return void
* access private member
*/
private function setExcelHeaders(int $eventID, int $eventScheduleID, string $event_title)
{
/**
* Merge some header cells
*/
$this->sheets->mergeCells('B1:E1');
$this->sheets->mergeCells('B2:D2');
$this->sheets->mergeCells('B3:D3');
$this->sheets->mergeCells('B4:E4');
//Set event_id in A3 cell
$this->sheets->setCellValue('A2', $eventID);
//Set event_schedule_id in A3 cell
$this->sheets->setCellValue('A3', $eventScheduleID);
//Count total subscribers
$this->sheets->setCellValue('A4', '=COUNT(A6:A'.$this->defaultMaximumRow.')');
$this->sheets->setCellValueByColumnAndRow(2, 2, "Nombre Total de places offertes");
$this->sheets->setCellValue('E2', $this->nshow_model->getTotalAvailableAndRemainingPlaces($eventID, $eventScheduleID)['total_available_seat']);
$this->sheets->setCellValueByColumnAndRow(2, 3, "Nombre de place restantes");
$this->sheets->setCellValue('E3', "=E2-(SUM(I{$this->dataset}:I{$this->defaultMaximumRow}))");
$this->sheets->setCellValueByColumnAndRow(2, 4, $event_title);
$this->sheets->setCellValue('F2', "Nombre total d'abonnés");
$this->sheets->setCellValue('F3', "Nombre total d'invités");
$this->sheets->setCellValue('F4', "Nombre total de personnes");
$this->sheets->setCellValue('G1', 'Attendus');
//$sheet->setCellValueExplicit('F2', '=sum(F3:F4)',\PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_FORMULA);
$this->sheets->setCellValue('G2', '=COUNT(G6:G'.$this->defaultMaximumRow.')');
$this->sheets->setCellValue('G3', '=G4-G2');
$this->sheets->setCellValue('G4', '=SUM(G6:G'.$this->defaultMaximumRow.')');
$this->sheets->setCellValue('H1', 'Liste d\'attente');
$this->sheets->setCellValue('H2', '=COUNT(H6:H'.$this->defaultMaximumRow.')');
$this->sheets->setCellValue('H3', '=H4-H2');
$this->sheets->setCellValue('H4', '=SUM(H6:H'.$this->defaultMaximumRow.')');
$this->sheets->setCellValue('I1', 'Présents');
$this->sheets->setCellValue('I2', '=(COUNTIF(I6:I'.$this->booklist_end_row.',">0"))');
$this->sheets->setCellValue('I3', '=SUM(N6:N'.$this->booklist_end_row.')');
$this->sheets->setCellValue('I4', '=I2+I3');
$this->sheets->setCellValue('J1', 'Absents');
$this->sheets->setCellValue('J2', '=G2-I2');
$this->sheets->setCellValue('J3', '=G3-I3');
$this->sheets->setCellValue('J4', '=J3+J2');
$this->sheets->setCellValue('K1', 'Nbre de No Show Complet :');
$this->sheets->setCellValue('L1', '=SUM(K6:K'.$this->booklist_end_row.')');
$this->sheets->setCellValue('K2', 'Nbre de No Show Partiel :');
$this->sheets->setCellValue('L2', '=SUM(L6:L'.$this->booklist_end_row.')');
$this->sheets->setCellValue('K4', 'Noshow :');
$this->sheets->setCellValue('L4', '=J3+J2&"/"&SUM(G6:G'.$this->defaultMaximumRow.')');
//set second headers for dataset title
$this->sheets->setCellValue('A5', 'ID unique');
$this->sheets->setCellValue('B5', 'Adresse e-mail');
$this->sheets->setCellValue('C5', 'Type');
$this->sheets->setCellValue('D5', 'Civilité');
$this->sheets->setCellValue('E5', 'Nom de famille');
$this->sheets->setCellValue('F5', 'Prénom');
$this->sheets->setCellValue('G5', 'Nombre de places réservées');
$this->sheets->mergeCells('G5:H5');
$this->sheets->setCellValue('I5', 'Présence Total');
$this->sheets->setCellValue('J5', 'Commentaires');
$this->sheets->setCellValue('K5', 'No Show');
$this->sheets->setCellValue('L5', 'No Show Partiel');
$this->sheets->setCellValue('M5', 'User Id');
$this->sheets->setCellValue('N5', 'Présence Invité(s)');
//set font styles for header totals
$this->setTotalsStyle();
//set cell alignments
$this->setCellAlignMent(
["A1","A4","D4","A5","B5","C5","D5","E5","F5","G5","H5","I5","J5","K5","L5","M5","N5"],
['alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER
],
'fill' => [
'fillType' => Fill::FILL_GRADIENT_LINEAR,
'rotation' => 90,
'startColor' => [
'argb' => $this->default_background_color,
],
'endColor' => [
'argb' => $this->default_background_color,
],
],
'font' => [
'size' => $this->default_font,
'bold' => false
]
]
);
//set color for headers then freeze
$this->fillHeaderColorsAndFreeze();
}
/**
* add text alignments for headers
*
* @return void
* access private member
*/
private function setCellAlignMent(array $ranges_alignment, array $property)
{
if (count($ranges_alignment) == 0 && count($property) == 0) {
return false;
}
foreach ($ranges_alignment as $index => $rows) {
$this->sheets->getStyle($rows)->applyFromArray($property)
->getBorders()
->getAllBorders()
->setBorderStyle(Border::BORDER_THIN);
}
}
/**
* Set font styles(bold or without bold formatting) for its header totals
* - Nombre Total de places offertes
* - Nombre de place restantes
* - Nombre total d'abonnés
* - Nombre total d'invités
* - Nombre total de personnes
* - Attendus
* - Waiting List
* - Présents
* - Absents
* - Nbre de No Show Complet :
* - Nbre de No Show Partiel :
*
* @return void
* access private
*/
private function setTotalsStyle()
{
//These ranges should be in bold format
$ranges_bold = ["E2","E3","F2","F3","F4","G4","H4","I4","J4","K1","K2","L1","L2"];
//list of ranges to apply font and or bold formating
$ranges_list = ["E2","E3","F2","F3","F4","G2","G3","G4","H2","H3","H4","I2","I3","I4","J1","J2","J3","J4","K1","K2","L1","L2"];
$with_bold = array(
'font' => [
'size' => $this->default_font,
'bold' => true
]
);
$without_bold = array(
'font' => [
'size' => $this->default_font,
'bold' => false
]
);
foreach ($ranges_list as $index => $rows) {
$this->sheets->getStyle($rows)->applyFromArray((in_array($rows, $ranges_bold) ? $with_bold : $without_bold))
->getBorders()
->getAllBorders()
->setBorderStyle(Border::BORDER_THIN);
}
}
/**
* Fill main header colors and freeze pane
*
* @return void
* access private member
*/
private function fillHeaderColorsAndFreeze()
{
//freeze pane from A5 to L5
$this->sheets->freezePane('L6');
//set of cells to be filled with colors, fonts and other attributes
$ranges_color = ['A1:J1','A2:B2','A3:B3','A4:B4','C2','C3','C4','E4', "F2", "F3", "F4", "K1" ,"K2", "K3" , "K4",
"L3" , "L4" ,'M1','M2','M3','M4','N1','N2','N3','N4'];
$color = array(
'fill' => [
'fillType' => Fill::FILL_GRADIENT_LINEAR,
'rotation' => 90,
'startColor' => [
'argb' => $this->default_background_color,
],
'endColor' => [
'argb' => $this->default_background_color,
],
],
'font' => [
'size' => $this->default_font,
'bold' => true
]
);
//add color to main header
foreach ($ranges_color as $range_cells) {
$this->sheets->getStyle($range_cells)->applyFromArray($color)
->getBorders()
->getAllBorders()
->setBorderStyle(Border::BORDER_THIN);
}
//create freeze pane header for 5 columns
for ($row_collapse = 1; $row_collapse <= 4; ++$row_collapse) {
$this->sheets->getRowDimension($row_collapse)
->setOutlineLevel(1)
->setVisible(true)
->setCollapsed(true);
}
}
/**
* Add protections to cell
*
* @return void
* access private member
*/
private function setUnProtectedCells($ranges)
{
if (is_null($ranges)) {
return false;
}
$this->sheets
->getStyle($ranges)
->getProtection()
->setLocked(Protection::PROTECTION_UNPROTECTED);
$this->sheets
->getProtection()
->setSheet(true);
//disable sorting
$this->sheets->getProtection()->setSort(true);
//disable inserting new rows
$this->sheets->getProtection()->setInsertRows(true);
//hide format cells
$this->sheets->getProtection()->setFormatCells(true);
//This line will add password protection for no show excel file
$this->sheets->getProtection()->setPassword(self::PASSWORD);
}
/**
* Set row or coloumn visibility
*
* @param string $range = cell range(s)
* @param string $type = row or col
* @param boolean $visibility = true or false
* @return void
* access private member
*/
private function rowColumnVisibility(string $range, string $type, bool $visibility)
{
if (is_null($range) && is_null($type) && is_null($visibility)) {
return false;
}
if ($type == 'row') {
$this->sheets->getRowDimension($range)->setVisible($visibility);
}
if ($type == 'col') {
$this->sheets->getColumnDimension($range)->setVisible($visibility);
}
}
/**
* apply styles for report data main row(s)
*
* @param string $cellStylesRangeIndex
* @param array $styles
* @return void
* access private member
*/
private function setReportDataCellsStyles($cellStylesRangeIndex, array $styles)
{
$this->sheets
->getStyle($cellStylesRangeIndex)
->applyFromArray($styles)
->getBorders()
->getAllBorders()
->setBorderStyle(Border::BORDER_THIN);
}
/**
* Add grey color to cells
*
* @return void
* access private member
*/
private function setGrayColor()
{
//Fill light gray color in cells
for ($datasets=6; $datasets < $this->defaultMaximumRow ; $datasets++) {
$this->grayColorRanges('A'.$datasets.':H'.$datasets, false);
$this->grayColorRanges('K'.$datasets.':N'.$datasets, false);
}
//Fill light gray color in header
$this->grayColorRanges([
"E2:E3",
"G2:J2",
"G3:J3",
"G2:J2",
"G4:J4",
"L1:L2"
], true);
}
/**
* Gray color properties
*
* @param [type] $ranges_cells = range cells
* @param boolean $isArray = true or false
* @return void
* access private member
*/
private function grayColorRanges($ranges_cells = null, bool $isArray)
{
$grayColor = array(
'fill' => [
'fillType' => Fill::FILL_GRADIENT_LINEAR,
'rotation' => 90,
'startColor' => [
'argb' => $this->setGrayColor,
],
'endColor' => [
'argb' => $this->setGrayColor,
],
]
);
if ($isArray) {
foreach ($ranges_cells as $ranges) {
$this->sheets->getStyle($ranges)->applyFromArray($grayColor)
->getBorders()
->getAllBorders()
->setBorderStyle(Border::BORDER_THIN);
}
}
if (!$isArray) {
$this->sheets->getStyle($ranges_cells)->applyFromArray($grayColor)
->getBorders()
->getAllBorders()
->setBorderStyle(Border::BORDER_THIN);
}
}
/**
* Add style for 1000 rows from cell range A5:N5 down to A1000:N1000
*
* @return void
* access private
*/
private function setDefaultStyleRows($rowSets = 5)
{
//add gray color to cells
$this->setGrayColor();
for ($datasets=$rowSets; $datasets < $this->defaultMaximumRow ; $datasets++) {
//Add styles for A - N
$this->setReportDataCellsStyles('A'.$datasets.':N'.$datasets, ['font' => ['size' => $this->default_font]]);
//Add validation colors for cells K and L
$this->addCellByColorConditions('K'.($datasets + 1).'', 'FF0000');
$this->addCellByColorConditions('L'.($datasets + 1).'', 'FFC000');
}
}
/**
* Create drop down "Walk in" and drop down for "Monsieur/Madame"
*
* @param [type] $datasets = range cells
* @return void
* access private member
*/
private function setDropDowns($datasets)
{
//loop cell range by 20 persons start at row 6
for ($i=$datasets; $i < $this->defaultMaximumRow; $i++) {
//Pick only "Extra" or "extra" from dropdown list(s)
$this->setCellValidationDropDown('C'.$i, 'Seule la valeur "extra" est autorisée', '"Extra"');
//Pick only "Extra" or "extra" from dropdown list(s)
$this->setCellValidationDropDown('D'.$i, 'Seules les valeurs "Monsieur" ou "Madame" sont autorisées', '"Monsieur,Madame"');
}
}
/**
* Add cell color by its value green if 1 or red if zero
*
* @param string $cell
* @param string $color
* @return void
* access private member
*/
private function addCellByColorConditions(string $cell, string $color)
{
if (is_null($cell)) {
return false;
}
$conditions = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
$conditions->setConditionType(Conditional::CONDITION_CELLIS);
$conditions->setOperatorType(Conditional::OPERATOR_GREATERTHANOREQUAL);
$conditions->addCondition('1');
$conditions->getStyle()->applyFromArray(['fill' => [
'fillType' => Fill::FILL_GRADIENT_LINEAR,
'rotation' => 90,
'startColor' => [
'argb' => $color,
],
'endColor' => [
'argb' => $color,
],
]])->getFont()->getColor()->setARGB($color);
$conditionalStyles = $this->sheets->getStyle($cell)->getConditionalStyles();
$conditionalStyles[] = $conditions;
$this->sheets->getStyle($cell)->setConditionalStyles($conditionalStyles);
}
/**
* Add validations for "No Show and No show Partial"
*
* @param string $cell
* @param integer $min
* @param integer $max
* @return void
* access private member
*/
private function setCellValidationsWithPrompt(string $cell, int $min, int $max)
{
$validation = $this->sheets->getCell($cell)->getDataValidation();
$validation->setType(DataValidation::TYPE_WHOLE);
$validation->setErrorStyle(DataValidation::STYLE_STOP);
$validation->setAllowBlank(true);
$validation->setShowInputMessage(true);
$validation->setShowErrorMessage(true);
$validation->setErrorTitle('Erreur de saisie.');
$validation->setError('Valeur incorrect!');
$validation->setPromptTitle('Rappel');
$validation->setPrompt('Seules les valeurs numériques sont autorisées.');
$validation->setFormula1($min);
$validation->setFormula2($max);
}
/**
* Allow only to pick from list "Extra" or "extra" people
* Allow only to pick from list "Monseur" or "Madam" gender
*
* @param string $cell = cell range
* @param string $prompt = Validation prompt message
* @param string $formula = dropdown list(s)
* @return void
* access private member
*/
private function setCellValidationDropDown(string $cell, string $prompt, string $formula)
{
$validation = $this->sheets->getCell($cell)->getDataValidation();
$validation->setType(DataValidation::TYPE_LIST);
$validation->setErrorStyle(DataValidation::STYLE_STOP);
$validation->setAllowBlank(true);
$validation->setShowInputMessage(true);
$validation->setShowErrorMessage(true);
$validation->setShowDropDown(true);
$validation->setErrorTitle('Erreur de saisie.');
$validation->setError('Valeur inexistante dans la liste.');
$validation->setPromptTitle('Sélectionnez une valeur dans la liste.');
$validation->setPrompt($prompt);
$validation->setFormula1($formula);
}
/**
* get data for export = confirmed,waitlist,extra_people
*
* @param int $event_schedule_id
* @return array
* access public
*/
private function getExportData($event_schedule_id) : array
{
$confirmed = $this->nshow_model->bookList($event_schedule_id);
$this->booklist_end_row = (count($confirmed)+($this->dataset)-1);
$waitlist = $this->nshow_model->waitList($event_schedule_id);
$extra = $this->nshow_model->extraPeople($event_schedule_id);
return array_merge($confirmed, $waitlist, $extra);
}
/**
* set No show "filename title" or "Tab" for download
*
* @param integer $event_schedule_id
* @param string $titleOrTab
* @return string
* access private member
*/
private function setNoShowFileNameTitle(int $event_schedule_id, string $titleOrTab) : string
{
$data = "";
$title = "";
$event_id = "";
$event = $this->nshow_model->getEventScheduleDetails($event_schedule_id);
$event_id = $event["event_id"] ?? "";
$date = $event["date_month"] ?? "";
$title = $event["title"] ?? "";
$start_date_time_hour = $event["start_date_time_hour"] ?? "";
if ($titleOrTab == 'title') {
return $title.$start_date_time_hour;
}
if ($titleOrTab == 'tab') {
return $this->sheetTitle."_".$event_id."_".$event_schedule_id;
}
}
/**
* Check if type is "booking or withdrawn"
*
* @param string $type
* @return boolean
* access private member
*/
private function isBooking(string $type) : bool
{
if (is_null($type)) {
return false;
}
return ((trim(strtolower($type)) == 'booking' || trim(strtolower($type)) == 'withdrawn'));
}
/**
* Check if type is "waiting or cancelled"
*
* @param string $type
* @return boolean
* access private member
*/
private function isWaiting(string $type) : bool
{
if (is_null($type)) {
return false;
}
return ((trim(strtolower($type)) == 'waiting' || trim(strtolower($type)) == 'cancelled'));
}
/**
* Check if type is "extra people"
*
* @param string $type
* @return boolean
* access private member
*/
private function isExtra(string $type)
{
$other_people = ["walk in", "Walk in", "extra", "Extra"];
$checkType = trim(strtolower($type)) ?? false;
if (is_null($type)) {
return false;
}
return (in_array($checkType, $other_people));
}
/**
* Hide cell range by col or rows
*
* @param array $range
* @param string $axis
* @param boolean $isShow
* @return void
* access private member
*/
private function hideCells(array $range, string $axis, bool $isShow) : void
{
foreach ($range as $key => $cells) {
$this->rowColumnVisibility($cells, strtolower($axis), $isShow);
}
}
/**
* Set default formated cells by 20 rows for extra peoples
* If no datasets for Booking,Waiting are empty
*
* @param integer $persons = number of rows to iterate
* @return void
* access private member
*/
private function setDefaultCellRange(int $persons) : void
{
//loop cell range by 20 persons start at row 6
for ($i=$this->dataset; $i <= $persons; $i++) {
//Unlock cells for new extra people(s) = start unlock at cell (6)
$this->setUnProtectedCells('B'.($i).':F'.$this->defaultMaximumRow);
$this->setUnProtectedCells('I'.($i).':J'.$this->defaultMaximumRow);
//End unlock extra people(s)
//set drop downs for 20 extra peoples
$this->setDropDowns(($i));
/**
* 'Presence Total' and 'Commentaries' editable
* Set Excel file Password protection
*/
$this->setUnProtectedCells('I'.$i.':J'.$i);
//Basic datasets
$this->sheets->setCellValue('A'.$i, '');
$this->sheets->setCellValue('B'.$i, '');
$this->sheets->setCellValue('C'.$i, '');
$this->sheets->setCellValue('D'.$i, '');
$this->sheets->setCellValue('E'.$i, '');
$this->sheets->setCellValue('F'.$i, '');
//Booking/withdrawn
$this->sheets->setCellValue('G'.$i, '');
//Waiting/cancelled
$this->sheets->setCellValue('H'.$i, '');
//Total present(s)
$this->sheets->setCellValue('I'.$i, '');
//Comment
$this->sheets->setCellValue('J'.$i, '');
//No show/No Show partial
//$this->sheets->setCellValue('K'.$i, '=IF(I'.$i.'=0,1,"")');
//$this->sheets->setCellValue('L'.$i, '=IF(I'.$i.'>0,IF(I'.$i.'<G'.$i.',1,""),"")');
//User IDS
$this->sheets->setCellValue('M'.$i, '');
//Invitees
$this->sheets->setCellValue('N'.$i, '=IF(I'.$i.'<>0,I'.$i.'-1,0)');
}
}
/**
* Main no show excel data values
*
* @param array $options
* @return void
* access private member
*/
private function reportData(array $datasets)
{
//start lock(s) at row 6
$registrationIndexStartAt = $this->dataset;
//Count total subscribers
$totalData = count($datasets);
/**
* Hide coloumn A(Registration ID)
* Hide column M(User IDs)
* Hide column N(Invitees)
*
*/
$this->hideCells(["A","M","N"], "col", false);
//if $datasets is empty then set default cells to input 20 extra peoples
if (count($datasets) == 0) {
$this->setDefaultCellRange(20);
}
//Display list of booking,waiting, extra, data rows and columns
foreach ($datasets as $index => $data) {
//Unlock cells for new extra people(s) = start unlock at cell (6 + total subscribers)
$this->setUnProtectedCells('B'.($registrationIndexStartAt + $totalData).':F'.$this->defaultMaximumRow);
$this->setUnProtectedCells('I'.($registrationIndexStartAt + $totalData).':J'.$this->defaultMaximumRow);
//End unlock extra people(s)
//set drop downs
$this->setDropDowns(($registrationIndexStartAt + $totalData));
//set unprotected ('Presence Total' and 'Commentaries' only are both editable other cells are disabled)
//Also set Excel file Password protection
$this->setUnProtectedCells('I'.$registrationIndexStartAt++.':J'.$registrationIndexStartAt++);
//Basic datasets
$this->sheets->setCellValue('A'.$this->dataset, $data->registration_id);
$this->sheets->setCellValue('D'.$this->dataset, $data->civility);
$this->sheets->setCellValue('E'.$this->dataset, strtoupper($data->last_name));
$this->sheets->setCellValue('F'.$this->dataset, $data->first_name);
$this->sheets->setCellValue('B'.$this->dataset, 'N/A');
// $this->sheets->setCellValue('B'.$this->dataset, ($data->email_address == "Unknown") ? 'N/A':$data->email_address);
//Booking/withdrawn
if ($this->isBooking($data->type)) {
$this->sheets->setCellValue('C'.$this->dataset, "Réservation");
$this->sheets->setCellValue('G'.$this->dataset, (($data->no_of_place == 0) ? "" : $data->no_of_place));
//Add validations for cells "Total present"
$this->setCellValidationsWithPrompt('I'.$this->dataset, 0, (int)$data->no_of_place);
}
//Waiting/cancelled
if ($this->isWaiting($data->type)) {
$this->sheets->setCellValue('C'.$this->dataset, "Attente");
$this->sheets->setCellValue('H'.$this->dataset, (($data->no_of_place == 0) ? "" : $data->no_of_place));
//Add validations for cells "Total present"
$this->setCellValidationsWithPrompt('I'.$this->dataset, 0, (int)$data->no_of_place);
}
//Walk in/Extra
if ($this->isExtra($data->type)) {
$this->sheets->setCellValue('C'.$this->dataset, 'Extra');
}
//Total present(s)
$this->sheets->setCellValue('I'.$this->dataset, (($data->attendance == 0) ? 0 : $data->attendance));
//Comment
$this->sheets->setCellValue('J'.$this->dataset, (($data->comment == "") ? "" : $data->comment));
//No show/No Show partial
$this->sheets->setCellValue('K'.$this->dataset, '=IF(I'.$this->dataset.'=0,1,0)');
$this->sheets->setCellValue('L'.$this->dataset, '=IF(I'.$this->dataset.'>0,IF(I'.$this->dataset.'<G'.$this->dataset.',1,0),0)');
//User IDS
$this->sheets->setCellValue('M'.$this->dataset, $data->user_id);
//Invitees
$this->sheets->setCellValue('N'.$this->dataset, '=IF(I'.$this->dataset.'<>0,I'.$this->dataset.'-1,0)');
//append datasets starting from row 6 downwards
$this->dataset++;
}
//Set default styles for A5:L5 down to A1000:L1000
$this->setDefaultStyleRows(5);
}
/**
* Export no show file with title+date
*
* @param integer $eventID
* @param integer $eventScheduleID
* @return void
* access private member
*/
public function export(int $eventID, int $eventScheduleID)
{
//This should be match for general export validation
if (is_null($eventID) && is_null($eventScheduleID)) {
return false;
}
//call memory limit
$this->setMemoryLimit();
//call document properties
$this->setDocumentProperties();
//get data for populate
$options = $this->getExportData($eventScheduleID);
//set php excel first 5 row(s) with freeze header
$this->setExcelHeaders($eventID, $eventScheduleID, $this->setNoShowFileNameTitle($eventScheduleID, "title"));
//Add no show excel data
$this->reportData($options);
//Call auto size function columns for active worksheet
$this->setExcelAutoSize();
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$this->spreadsheet->setActiveSheetIndex(0)->setTitle($this->setNoShowFileNameTitle($eventScheduleID, "tab"));
//call headers and download file
$this->setHeaders($this->setNoShowFileNameTitle($eventScheduleID, "title"));
}
}