GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Test Failed
Push — master ( f62ff4...30caa4 )
by Jan
07:14
created

ModuleBelegungsplan::compile()   F

Complexity

Conditions 32
Paths 5808

Size

Total Lines 212
Code Lines 106

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 32
eloc 106
nc 5808
nop 0
dl 0
loc 212
rs 2
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
* Contao Open Source CMS
4
*
5
* Copyright (c) Jan Karai
6
*
7
* @license LGPL-3.0+
8
*/
9
namespace Mailwurm\Belegung;
10
use Psr\Log\LogLevel;
11
use Contao\CoreBundle\Monolog\ContaoContext;
12
use Patchwork\Utf8;
13
/**
14
* Class ModuleBelegungsplan
15
*
16
* @property array $belegungsplan_categories
17
* @property array $belegungsplan_month
18
* @property integer $intStartAuswahl
19
* @property integer $intEndeAuswahl
20
*
21
* @author Jan Karai <https://www.sachsen-it.de>
22
*/
23
class ModuleBelegungsplan extends \Module
24
{	
25
	/**
26
	* Template
27
	* @var string
28
	*/
29
	protected $strTemplate = 'mod_belegungsplan';
30
	
31
	/**
32
	* Display a wildcard in the back end
33
	*
34
	* @return string
35
	*/
36
	public function generate() 
37
	{
38
		if (TL_MODE == 'BE') 
39
		{
40
			/** @var BackendTemplate|object $objTemplate */
41
			$objTemplate = new \BackendTemplate('be_wildcard');
42
			$objTemplate->wildcard = '### ' . Utf8::strtoupper($GLOBALS['TL_LANG']['FMD']['belegungsplan'][0]) . ' ###';
43
			$objTemplate->title = $this->headline;
44
			$objTemplate->id = $this->id;
45
			$objTemplate->link = $this->name;
46
			$objTemplate->href = 'contao/main.php?do=themes&amp;table=tl_module&amp;act=edit&amp;id=' . $this->id;
47
			return $objTemplate->parse();
48
		}
49
		$this->belegungsplan_category = \StringUtil::deserialize($this->belegungsplan_categories);
0 ignored issues
show
Bug Best Practice introduced by
The property belegungsplan_category does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
50
		$this->belegungsplan_month = \StringUtil::deserialize($this->belegungsplan_month);
51
		// aktuelle Seiten URL
52
		$this->strUrl = preg_replace('/\?.*$/', '', \Environment::get('request'));
0 ignored issues
show
Bug Best Practice introduced by
The property strUrl does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
53
		
54
		// Return if there are no categories
55
		if (!is_array($this->belegungsplan_category) || empty($this->belegungsplan_category)) 
56
		{
57
			return '';
58
		}
59
		// Return if there are no month
60
		if (!is_array($this->belegungsplan_month) || empty($this->belegungsplan_month)) 
61
		{
62
			return '';
63
		}
64
		return parent::generate();
65
	}
66
	/**
67
	* Generate the module
68
	*/
69
	protected function compile() 
70
	{
71
		$arrInfo = array();
72
		$arrCategorieObjekte = array();
73
		$arrJahre = array();
74
		$arrFeiertage = array();
75
		$arrObjekteCalender = array();
76
		
77
		// Monate sortieren
78
		$arrBelegungsplanMonth = $this->belegungsplan_month;
79
		sort($arrBelegungsplanMonth, SORT_NUMERIC);
80
		$this->belegungsplan_month = $arrBelegungsplanMonth;
81
		
82
		$blnClearInput = false;
83
		
84
		// wenn der letzte anzuzeigende Monat verstrichen ist automatisch das nächste Jahr anzeigen
85
		$intMax = (int)max($this->belegungsplan_month);
86
		
87
		$intYear = \Input::get('belegyear');
88
		// interner Zaehler
89
		$i = 0;
90
		
91
		// Aktuelle Periode bei Erstaufruf der Seite
92
		if (!isset($_GET['belegyear'])) {	
93
			$intYear = $intMax < (int)date('n') ? (int)date('Y') + 1 : (int)date('Y');
94
			$blnClearInput = true;
95
		} else {
96
			if(!empty($intYear)) {
97
				is_numeric($intYear) && strlen($intYear) === 4 ? ($intYear >= (int)date('Y') ? $intYear = (int)$intYear : $arrInfo[] = '4. ' . $GLOBALS['TL_LANG']['mailwurm_belegung']['info'][2]) : $arrInfo[] = '1. ' . $GLOBALS['TL_LANG']['mailwurm_belegung']['info'][1];
98
			}
99
		}
100
		
101
		// wenn $arrInfo hier schon belegt, dann nicht erst weiter machen
102
		if(empty($arrInfo)) {
103
			// Anfang und Ende des Anzeigezeitraumes je nach GET
104
			if(!empty($intYear)) {
105
				$intStartAuswahl = (int)mktime(0, 0, 0, 1, 1, $intYear);
106
				$intEndeAuswahl = (int)mktime(23, 59, 59, 12, 31, $intYear);
107
			}
108
			
109
			// Hole alle Calenderdaten zur Auswahl
110
			$objObjekteCalender = $this->Database->prepare("SELECT tbo.id as ObjektID,
111
										(CASE
112
											WHEN tbc.startDate < ".$intStartAuswahl." THEN DAY(FROM_UNIXTIME(".$intStartAuswahl."))
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $intStartAuswahl does not seem to be defined for all execution paths leading up to this point.
Loading history...
113
											ELSE DAY(FROM_UNIXTIME(tbc.startDate))
114
										 END) as StartTag,
115
										 (CASE
116
											WHEN tbc.startDate < ".$intStartAuswahl." THEN MONTH(FROM_UNIXTIME(".$intStartAuswahl."))
117
											ELSE MONTH(FROM_UNIXTIME(tbc.startDate))
118
										 END) as StartMonat,
119
										 (CASE
120
											WHEN tbc.startDate < ".$intStartAuswahl." THEN YEAR(FROM_UNIXTIME(".$intStartAuswahl."))
121
											ELSE YEAR(FROM_UNIXTIME(tbc.startDate))
122
										 END) as StartJahr,
123
										 (CASE
124
											WHEN tbc.endDate > ".$intEndeAuswahl." THEN DAY(FROM_UNIXTIME(".$intEndeAuswahl."))
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $intEndeAuswahl does not seem to be defined for all execution paths leading up to this point.
Loading history...
125
											ELSE DAY(FROM_UNIXTIME(tbc.endDate))
126
										 END) as EndeTag,
127
										 (CASE
128
											WHEN tbc.endDate > ".$intEndeAuswahl." THEN MONTH(FROM_UNIXTIME(".$intEndeAuswahl."))
129
											ELSE MONTH(FROM_UNIXTIME(tbc.endDate))
130
										 END) as EndeMonat,
131
										 (CASE
132
											WHEN tbc.endDate > ".$intEndeAuswahl." THEN YEAR(FROM_UNIXTIME(".$intEndeAuswahl."))
133
											ELSE YEAR(FROM_UNIXTIME(tbc.endDate))
134
										 END) as EndeJahr
135
									FROM 	tl_belegungsplan_calender tbc,
136
											tl_belegungsplan_objekte tbo
137
									WHERE 	tbc.pid = tbo.id
138
									AND 	tbo.published = 1
139
									AND 	((startDate < ".$intStartAuswahl." AND endDate > ".$intStartAuswahl.") OR (startDate >= ".$intStartAuswahl." AND endDate <= ".$intEndeAuswahl.") OR (startDate < ".$intEndeAuswahl." AND endDate > ".$intEndeAuswahl."))")
140
									->execute();
141
			if($objObjekteCalender->numRows > 0) {
142
				while($objObjekteCalender->next()) {
143
					$arrHelper = array();
144
					$arrHelper['ObjektID'] = $objObjekteCalender->ObjektID;
145
					$arrHelper['StartTag'] = (int)$objObjekteCalender->StartTag;
146
					$arrHelper['StartMonat'] = (int)$objObjekteCalender->StartMonat;
147
					$arrHelper['StartJahr'] = (int)$objObjekteCalender->StartJahr;
148
					$arrHelper['EndeTag'] = (int)$objObjekteCalender->EndeTag;
149
					$arrHelper['EndeMonat'] = (int)$objObjekteCalender->EndeMonat;
150
					$arrHelper['EndeJahr'] = (int)$objObjekteCalender->EndeJahr;
151
					$intEndeMonat = (int)date('t', mktime(0, 0, 0, $arrHelper['StartMonat'], $arrHelper['StartTag'], $arrHelper['StartJahr']));
0 ignored issues
show
Bug introduced by
It seems like mktime(0, 0, 0, $arrHelp...arrHelper['StartJahr']) can also be of type false; however, parameter $timestamp of date() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

151
					$intEndeMonat = (int)date('t', /** @scrutinizer ignore-type */ mktime(0, 0, 0, $arrHelper['StartMonat'], $arrHelper['StartTag'], $arrHelper['StartJahr']));
Loading history...
152
					for($d = $arrHelper['StartTag'], $m = $arrHelper['StartMonat'], $e = $intEndeMonat, $y = $arrHelper['StartJahr'], $z = 0; ; ) {
153
						// erster Tag der Buchung und weitere
154
						empty($z) ? $arrObjekteCalender[$objObjekteCalender->ObjektID][$m][$d] = '0#1' : $arrObjekteCalender[$objObjekteCalender->ObjektID][$m][$d] = '1#1';
155
						if($d === $e) {
156
							if($arrHelper['StartMonat'] === $arrHelper['EndeMonat']) {
157
								break;
158
							}
159
							$m++;
160
							$d = 0;
161
							$e = (int)date('t', mktime(0, 0, 0, $m, $d + 1, $y));
162
						}
163
						if($y === $arrHelper['EndeJahr'] && $m === $arrHelper['EndeMonat'] && $d === $arrHelper['EndeTag']) {
164
							// letzter Tag der Buchung
165
							$arrObjekteCalender[$objObjekteCalender->ObjektID][$m][$d] = '1#0';
166
							break;
167
						}
168
						$d++;
169
						$z++;
170
					}
171
					unset($arrHelper);
172
				}
173
			}
174
			
175
			// Hole alle aktiven Objekte inklusive dazugehoeriger Kategorie
176
			$objCategoryObjekte = $this->Database->prepare("SELECT 	tbc.id as CategoryID,
177
										tbc.title as CategoryTitle,
178
										tbo.id as ObjektID,
179
										tbo.name as ObjektName,
180
										tbo.infotext as ObjektInfoText,
181
										tbo.sorting as ObjektSortierung
182
									FROM 	tl_belegungsplan_category tbc,
183
										tl_belegungsplan_objekte tbo
184
									WHERE	tbo.pid = tbc.id
185
									AND	tbo.published = 1")
186
									->execute();
187
			if($objCategoryObjekte->numRows > 0) {
188
				while($objCategoryObjekte->next()) {
189
					// Nicht anzuzeigende Kategorien aussortieren
190
					if(in_array($objCategoryObjekte->CategoryID, $this->belegungsplan_category)) {
191
						$arrHelper = array();
192
						$arrHelper['ObjektID'] = (int)$objCategoryObjekte->ObjektID;
193
						$arrHelper['ObjektName'] = $objCategoryObjekte->ObjektName;
194
						$arrHelper['ObjektInfoText'] = $objCategoryObjekte->ObjektInfoText;
195
						// Calender anfügen wenn vorhanden
196
						if(array_key_exists($arrHelper['ObjektID'], $arrObjekteCalender)) {
197
							$arrHelper['Calender'] = $arrObjekteCalender[$arrHelper['ObjektID']];
198
							unset($arrObjekteCalender[$arrHelper['ObjektID']]);
199
						}
200
						if(array_key_exists($objCategoryObjekte->CategoryID, $arrCategorieObjekte)) {
201
							$arrCategorieObjekte[$objCategoryObjekte->CategoryID]['Objekte'][$objCategoryObjekte->ObjektSortierung] = $arrHelper;
202
							$i++;
203
						} else {
204
							$arrCategorieObjekte[$objCategoryObjekte->CategoryID]['CategoryTitle'] = \StringUtil::specialchars($objCategoryObjekte->CategoryTitle);
205
							$arrCategorieObjekte[$objCategoryObjekte->CategoryID]['Objekte'][$objCategoryObjekte->ObjektSortierung] = $arrHelper;
206
							$i++;
207
						}
208
						unset($arrHelper);
209
					}
210
				}
211
			} else {
212
				$arrInfo[] = '3. ' . $GLOBALS['TL_LANG']['mailwurm_belegung']['info'][0];
213
			}
214
			
215
			// Hole alle Jahre fuer die bereits Buchungen vorhanden sind ab dem aktuellen Jahr
216
			$objJahre = $this->Database->prepare("	SELECT YEAR(FROM_UNIXTIME(startDate)) as Start 
217
								FROM tl_belegungsplan_calender tbc,
218
									tl_belegungsplan_objekte tbo
219
								WHERE YEAR(FROM_UNIXTIME(startDate)) >= ? 
220
								AND tbc.pid = tbo.id
221
								AND tbo.published = 1
222
								GROUP BY YEAR(FROM_UNIXTIME(startDate))
223
								ORDER BY YEAR(FROM_UNIXTIME(startDate)) ASC")
224
								->execute(date("Y"));
225
			if($objJahre->numRows > 0) {
226
				while($objJahre->next()) {
227
					$arrJahre[] = array('single_year' => $objJahre->Start, 'year_href' => $this->strUrl . '?belegyear=' . $objJahre->Start, 'active' => $objJahre->Start == $intYear ? 1 : 0);
228
				}
229
			}
230
			
231
			// Hole alle Feiertage
232
			$objFeiertage = $this->Database->prepare("	SELECT 	DAY(FROM_UNIXTIME(startDate)) as Tag,
233
																MONTH(FROM_UNIXTIME(startDate)) as Monat,
234
																YEAR(FROM_UNIXTIME(startDate)) as Jahr,
235
																title
236
														FROM 	tl_belegungsplan_feiertage
237
														WHERE 	startDate >= ".$intStartAuswahl."
238
														AND 	startDate <= ".$intEndeAuswahl)
239
														->execute();
240
			if($objFeiertage->numRows > 0) {
241
				while($objFeiertage->next()) {
242
					$arrFeiertage[$objFeiertage->Jahr][$objFeiertage->Monat][$objFeiertage->Tag] = $objFeiertage->title;
243
				}
244
			}
245
		}
246
		
247
		$this->Template = new \FrontendTemplate($this->strTemplate);
248
		// Info-Array zur Ausgabe von Fehlern, Warnings und Defaults
249
		$this->Template->info = $arrInfo;
250
		// aktuell anzuzeigendes Jahr, wenn \Input::get('year');
251
		$this->Template->display_year = $intYear;
252
		// Anzahl der anzuzeigenden Jahre fuer welche Reservierungen vorliegen
253
		$this->Template->number_year = $objJahre->numRows;
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $objJahre does not seem to be defined for all execution paths leading up to this point.
Loading history...
254
		// Jahreszahlen fuer die Auswahlbox
255
		$this->Template->selectable_year = $arrJahre;
256
		// Anzahl anzuzeigender Objekte
257
		$this->Template->number_objekte = $i;
258
		// Kategorien sortieren wie im Checkboxwizard ausgewaehlt -> Elterntabelle
259
		$this->Template->CategorieObjekteCalender = $this->sortNachWizard($arrCategorieObjekte, $this->belegungsplan_category);
260
		// Array mit den Monatsdaten
261
		$this->Template->Month = $this->dataMonth($arrBelegungsplanMonth, $intStartAuswahl, $arrFeiertage);
262
		// Array mit den Feiertagen
263
		#$this->Template->Feiertage = $arrFeiertage;
264
		#$this->Template->Start = $intStartAuswahl;
265
		#$this->Template->Ende = $intEndeAuswahl;
266
		#$this->Template->Monate = $arrBelegungsplanMonth;
267
		#$this->Template->MaxMonat = $intMax;
268
		
269
		if(!empty($arrCategorieObjekte)) {
270
			unset($arrCategorieObjekte);
271
		}
272
		if(!empty($arrInfo)) {
273
			unset($arrInfo);
274
		}
275
		if(!empty($arrFeiertage)) {
276
			unset($arrFeiertage);
277
		}
278
		// Clear the $_GET array (see #2445)
279
		if($blnClearInput) {
280
			\Input::setGet('belegyear', null);
281
		}
282
	}
283
	
284
	/**
285
	* Sortiert die Kategorien nach Auswahl im Checkbox-Wizard
286
	*
287
	* @return array
288
	*/
289
	protected function sortNachWizard($arrCategorieObjekte, $arrBelegungsplanCategory)
290
	{	
291
		// Schluessel und Werte tauschen
292
		$arrHelper = array_flip($arrBelegungsplanCategory);
293
		
294
		foreach($arrHelper as $key => $value) {
295
			if(array_key_exists($key, $arrCategorieObjekte)) {
296
				$arrHelper[$key] = $arrCategorieObjekte[$key];
297
				// Objekte in der Kategorie gleich mit nach DB sortieren
298
				ksort($arrHelper[$key]['Objekte']);
299
			} else {
300
				unset($arrHelper[$key]);
301
			}
302
		}
303
		// leere Einträge entfernen
304
		return $arrHelper;
305
	}
306
	
307
	/**
308
	* Fuegt den Monaten Daten hinzu
309
	*
310
	* @return array
311
	*/
312
	protected function dataMonth($arrMonth, $intStartAuswahl, $arrFeiertage)
313
	{
314
		$arrHelper = array();
315
		$intJahr = date('Y', $intStartAuswahl);
316
		foreach($arrMonth as $key => $value) {
317
			$arrHelper[$value]['Name'] = $GLOBALS['TL_LANG']['mailwurm_belegung']['month'][$value];
318
			$arrHelper[$value]['TageMonat'] = (int)date('t', mktime(0, 0, 0, (int)$value, 1, (int)$intJahr));
0 ignored issues
show
Bug introduced by
It seems like mktime(0, 0, 0, (int)$value, 1, (int)$intJahr) can also be of type false; however, parameter $timestamp of date() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

318
			$arrHelper[$value]['TageMonat'] = (int)date('t', /** @scrutinizer ignore-type */ mktime(0, 0, 0, (int)$value, 1, (int)$intJahr));
Loading history...
319
			$intFirstDayInMonth = (int)date('N', mktime(0, 0, 0, (int)$value, 1, (int)$intJahr));
320
			for($f = 1, $i = $intFirstDayInMonth; $f <= $arrHelper[$value]['TageMonat']; $f++) {
321
				$arrHelper[$value]['Days'][$f]['Day'] = $GLOBALS['TL_LANG']['mailwurm_belegung']['day'][$i];
322
				$arrHelper[$value]['Days'][$f]['DayCut'] = $GLOBALS['TL_LANG']['mailwurm_belegung']['short_cut_day'][$i];
323
				$arrHelper[$value]['Days'][$f]['DayWeekNum'] = $i;
324
				!empty($arrFeiertage[$intJahr][$value][$f]) ? $arrHelper[$value]['Days'][$f]['Holiday'] = $arrFeiertage[$intJahr][$value][$f] : '';
325
				$i === 7 ? $i = 1 : $i++;
326
			}
327
		}
328
		unset($intJahr);
329
		return $arrHelper;
330
	}
331
}
332