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 ( 9ab5fe...d0cd7b )
by Jan
06:53
created

ModuleBelegungsplan::compile()   F

Complexity

Conditions 32
Paths 11616

Size

Total Lines 208
Code Lines 99

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 32
eloc 99
nc 11616
nop 0
dl 0
loc 208
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
*
19
* @author Jan Karai <https://www.sachsen-it.de>
20
*/
21
class ModuleBelegungsplan extends \Module
22
{	
23
	/**
24
	 * Template
25
	 * @var string
26
	 */
27
	protected $strTemplate = 'mod_belegungsplan';
28
	
29
	/**
30
	 * @var array
31
	 */
32
	protected $belegungsplan_category = array();
33
	
34
	/**
35
	 * @var string
36
	 */
37
	protected $strUrl;
38
	
39
	/**
40
	 * @var integer
41
	 */
42
	protected $intStartAuswahl;
43
	
44
	/**
45
	 * @var integer
46
	 */
47
	protected $intEndeAuswahl;
48
	
49
	/**
50
	 * @var integer
51
	 */
52
	protected $intAnzahlJahre;
53
	
54
	/**
55
	 * Display a wildcard in the back end
56
	 *
57
	 * @return string
58
	 */
59
	public function generate() 
60
	{
61
		if (TL_MODE == 'BE') 
62
		{
63
			/** @var BackendTemplate|object $objTemplate */
64
			$objTemplate = new \BackendTemplate('be_wildcard');
65
			$objTemplate->wildcard = '### ' . Utf8::strtoupper($GLOBALS['TL_LANG']['FMD']['belegungsplan'][0]) . ' ###';
66
			$objTemplate->title = $this->headline;
67
			$objTemplate->id = $this->id;
68
			$objTemplate->link = $this->name;
69
			$objTemplate->href = 'contao/main.php?do=themes&amp;table=tl_module&amp;act=edit&amp;id=' . $this->id;
70
			return $objTemplate->parse();
71
		}
72
		$this->belegungsplan_category = \StringUtil::deserialize($this->belegungsplan_categories);
73
		$this->belegungsplan_month = \StringUtil::deserialize($this->belegungsplan_month);
74
		// aktuelle Seiten URL
75
		$this->strUrl = preg_replace('/\?.*$/', '', \Environment::get('request'));
76
		
77
		// Return if there are no categories
78
		if (!is_array($this->belegungsplan_category) || empty($this->belegungsplan_category)) 
79
		{
80
			return '';
81
		}
82
		// Return if there are no month
83
		if (!is_array($this->belegungsplan_month) || empty($this->belegungsplan_month)) 
84
		{
85
			return '';
86
		}
87
		return parent::generate();
88
	}
89
	/**
90
	 * Generate the module
91
	 */
92
	protected function compile() 
93
	{
94
		$arrInfo = array();
95
		$arrCategorieObjekte = array();
96
		$arrJahre = array();
97
		$arrFeiertage = array();
98
		
99
		// Monate sortieren
100
		$arrBelegungsplanMonth = $this->belegungsplan_month;
101
		sort($arrBelegungsplanMonth, SORT_NUMERIC);
102
		$this->belegungsplan_month = $arrBelegungsplanMonth;
103
		
104
		$blnClearInput = false;
105
		
106
		// wenn der letzte anzuzeigende Monat verstrichen ist automatisch das nächste Jahr anzeigen
107
		$intMax = (int) max($this->belegungsplan_month);
108
		
109
		$intYear = \Input::get('belegyear');
110
		// interner Zaehler
111
		$i = 0;
112
		
113
		// Aktuelle Periode bei Erstaufruf der Seite
114
		if (!isset($_GET['belegyear'])) {	
115
			$intYear = $intMax < (int) date('n') ? (int) date('Y') + 1 : (int) date('Y');
116
			$blnClearInput = true;
117
		} else {
118
			if (!empty($intYear)) {
119
				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];
120
			}
121
		}
122
		$intMinYear = $intMax < (int) date('n') ? (int) date('Y') + 1 : (int) date('Y');
123
		
124
		// wenn $arrInfo hier schon belegt, dann nicht erst weiter machen
125
		if (empty($arrInfo)) {
126
			// Anfang und Ende des Anzeigezeitraumes je nach GET
127
			if (!empty($intYear)) {
128
				$this->intStartAuswahl = (int) mktime(0, 0, 0, 1, 1, $intYear);
129
				$this->intEndeAuswahl = (int) mktime(23, 59, 59, 12, 31, $intYear);
130
			}
131
			
132
			// Hole alle aktiven Objekte inklusive dazugehoeriger Kategorie
133
			$objCategoryObjekte = $this->Database->prepare("SELECT 	tbc.id as CategoryID,
134
										tbc.title as CategoryTitle,
135
										tbo.id as ObjektID,
136
										tbo.name as ObjektName,
137
										tbo.infotext as ObjektInfoText,
138
										tbo.sorting as ObjektSortierung
139
									FROM 	tl_belegungsplan_category tbc,
140
										tl_belegungsplan_objekte tbo
141
									WHERE	tbo.pid = tbc.id
142
									AND	tbo.published = 1")
143
									->execute();
144
			if ($objCategoryObjekte->numRows > 0) {
145
				while ($objCategoryObjekte->next()) {
146
					// Nicht anzuzeigende Kategorien aussortieren
147
					if (in_array($objCategoryObjekte->CategoryID, $this->belegungsplan_category)) {
148
						$arrHelper = array();
149
						$arrHelper['ObjektID'] = (int) $objCategoryObjekte->ObjektID;
150
						$arrHelper['ObjektName'] = \StringUtil::specialchars($objCategoryObjekte->ObjektName);
151
						$arrHelper['ObjektInfoText'] = $objCategoryObjekte->ObjektInfoText;
152
						if (array_key_exists($objCategoryObjekte->CategoryID, $arrCategorieObjekte)) {
153
							$arrCategorieObjekte[$objCategoryObjekte->CategoryID]['Objekte'][$objCategoryObjekte->ObjektSortierung] = $arrHelper;
154
							$i++;
155
						} else {
156
							$arrCategorieObjekte[$objCategoryObjekte->CategoryID]['CategoryTitle'] = \StringUtil::specialchars($objCategoryObjekte->CategoryTitle);
157
							$arrCategorieObjekte[$objCategoryObjekte->CategoryID]['Objekte'][$objCategoryObjekte->ObjektSortierung] = $arrHelper;
158
							$i++;
159
						}
160
						unset($arrHelper);
161
					}
162
				}
163
			} else {
164
				$arrInfo[] = '3. ' . $GLOBALS['TL_LANG']['mailwurm_belegung']['info'][0];
165
			}
166
			
167
			// Hole alle Calenderdaten zur Auswahl
168
			$objObjekteCalender = $this->Database->prepare("SELECT tbo.id as ObjektID,
169
							tbo.sorting as ObjektSortierung,
170
							tbcat.id as CategoryID,
171
							(CASE
172
								WHEN tbc.startDate < " . $this->intStartAuswahl . " THEN DAY(FROM_UNIXTIME(" . $this->intStartAuswahl . "))
173
								ELSE DAY(FROM_UNIXTIME(tbc.startDate))
174
							 END) as StartTag,
175
							 (CASE
176
								WHEN tbc.startDate < " . $this->intStartAuswahl . " THEN MONTH(FROM_UNIXTIME(" . $this->intStartAuswahl . "))
177
								ELSE MONTH(FROM_UNIXTIME(tbc.startDate))
178
							 END) as StartMonat,
179
							 (CASE
180
								WHEN tbc.startDate < " . $this->intStartAuswahl . " THEN YEAR(FROM_UNIXTIME(" . $this->intStartAuswahl . "))
181
								ELSE YEAR(FROM_UNIXTIME(tbc.startDate))
182
							 END) as StartJahr,
183
							 YEAR(FROM_UNIXTIME(tbc.startDate)) as BuchungsStartJahr,
184
							 (CASE
185
								WHEN tbc.endDate > " . $this->intEndeAuswahl . " THEN DAY(FROM_UNIXTIME(" . $this->intEndeAuswahl . "))
186
								ELSE DAY(FROM_UNIXTIME(tbc.endDate))
187
							 END) as EndeTag,
188
							 (CASE
189
								WHEN tbc.endDate > " . $this->intEndeAuswahl . " THEN MONTH(FROM_UNIXTIME(" . $this->intEndeAuswahl . "))
190
								ELSE MONTH(FROM_UNIXTIME(tbc.endDate))
191
							 END) as EndeMonat,
192
							 (CASE
193
								WHEN tbc.endDate > " . $this->intEndeAuswahl . " THEN YEAR(FROM_UNIXTIME(" . $this->intEndeAuswahl . "))
194
								ELSE YEAR(FROM_UNIXTIME(tbc.endDate))
195
							 END) as EndeJahr,
196
							 YEAR(FROM_UNIXTIME(tbc.endDate)) as BuchungsEndeJahr
197
						FROM 	tl_belegungsplan_calender tbc,
198
							tl_belegungsplan_objekte tbo,
199
							tl_belegungsplan_category tbcat
200
						WHERE 	tbc.pid = tbo.id
201
						AND	tbo.pid = tbcat.id
202
						AND 	tbo.published = 1
203
						AND 	((startDate < " . $this->intStartAuswahl . " AND endDate > " . $this->intStartAuswahl . ") OR (startDate >= " . $this->intStartAuswahl . " AND endDate <= " . $this->intEndeAuswahl . ") OR (startDate < " . $this->intEndeAuswahl . " AND endDate > " . $this->intEndeAuswahl . "))")
204
						->execute();
205
			if ($objObjekteCalender->numRows > 0) {
206
				while ($objObjekteCalender->next()) {
207
					$intEndeMonat = (int) date('t', mktime(0, 0, 0, (int) $objObjekteCalender->StartMonat, (int) $objObjekteCalender->StartTag, (int) $objObjekteCalender->StartJahr));
208
					for ($d = (int) $objObjekteCalender->StartTag, $m = (int) $objObjekteCalender->StartMonat, $e = $intEndeMonat, $y = (int) $objObjekteCalender->StartJahr, $z = 0; ;) {
209
						// erster Tag der Buchung und weitere
210
						if (empty($z)) {
211
							$arrCategorieObjekte[$objObjekteCalender->CategoryID]['Objekte'][$objObjekteCalender->ObjektSortierung]['Calender'][$m][$d] = $this->includeCalender($objObjekteCalender->BuchungsStartJahr, $objObjekteCalender->BuchungsEndeJahr, $y, $arrCategorieObjekte[$objObjekteCalender->CategoryID]['Objekte'][$objObjekteCalender->ObjektSortierung]['Calender'][$m][$d], 0);
212
						} elseif ($y === (int) $objObjekteCalender->EndeJahr && $m === (int) $objObjekteCalender->EndeMonat && $d === (int) $objObjekteCalender->EndeTag) {
213
							$arrCategorieObjekte[$objObjekteCalender->CategoryID]['Objekte'][$objObjekteCalender->ObjektSortierung]['Calender'][$m][$d] = $this->includeCalender($objObjekteCalender->BuchungsStartJahr, $objObjekteCalender->BuchungsEndeJahr, $y, $arrCategorieObjekte[$objObjekteCalender->CategoryID]['Objekte'][$objObjekteCalender->ObjektSortierung]['Calender'][$m][$d], 1);
214
							break;
215
						} else {
216
							$arrCategorieObjekte[$objObjekteCalender->CategoryID]['Objekte'][$objObjekteCalender->ObjektSortierung]['Calender'][$m][$d] = '1#1';
217
						}
218
						if ($d === $e) {
219
							if ((int) $objObjekteCalender->StartMonat === (int) $objObjekteCalender->EndeMonat) {
220
								$arrCategorieObjekte[$objObjekteCalender->CategoryID]['Objekte'][$objObjekteCalender->ObjektSortierung]['Calender'][$m][$d] = '1#0';
221
								break;
222
							}
223
							$m++;
224
							$d = 0;
225
							$e = (int) date('t', mktime(0, 0, 0, $m, $d + 1, $y));
226
						}
227
						$d++;
228
						$z++;
229
					}
230
				}
231
			}
232
			
233
			// Hole alle Jahre fuer die bereits Buchungen vorhanden sind ab dem aktuellen Jahr
234
			$objJahre = $this->Database->prepare("	SELECT YEAR(FROM_UNIXTIME(tbc.startDate)) as Start 
235
								FROM tl_belegungsplan_calender tbc,
236
									tl_belegungsplan_objekte tbo
237
								WHERE YEAR(FROM_UNIXTIME(tbc.startDate)) >= ? 
238
								AND tbc.pid = tbo.id
239
								AND tbo.published = 1
240
								GROUP BY YEAR(FROM_UNIXTIME(tbc.startDate))
241
								ORDER BY YEAR(FROM_UNIXTIME(tbc.startDate)) ASC")
242
								->execute($intMinYear);
243
			$this->intAnzahlJahre = $objJahre->numRows;
244
			if ($this->intAnzahlJahre > 0) {
245
				while ($objJahre->next()) {
246
					$arrJahre[] = array('single_year' => $objJahre->Start, 'year_href' => $this->strUrl . '?belegyear=' . $objJahre->Start, 'active' => $objJahre->Start == $intYear ? 1 : 0);
247
				}
248
			}
249
			
250
			// Hole alle Feiertage
251
			$objFeiertage = $this->Database->prepare("SELECT DAY(FROM_UNIXTIME(startDate)) as Tag,
252
									MONTH(FROM_UNIXTIME(startDate)) as Monat,
253
									YEAR(FROM_UNIXTIME(startDate)) as Jahr,
254
									title
255
							FROM 	tl_belegungsplan_feiertage
256
							WHERE 	startDate >= " . $this->intStartAuswahl . "
257
							AND 	startDate <= " . $this->intEndeAuswahl)
258
							->execute();
259
			if ($objFeiertage->numRows > 0) {
260
				while ($objFeiertage->next()) {
261
					$arrFeiertage[$objFeiertage->Jahr][$objFeiertage->Monat][$objFeiertage->Tag] = $objFeiertage->title;
262
				}
263
			}
264
		}
265
		
266
		$this->Template = new \FrontendTemplate($this->strTemplate);
267
		// Info-Array zur Ausgabe von Fehlern, Warnings und Defaults
268
		$this->Template->info = $arrInfo;
269
		// aktuell anzuzeigendes Jahr, wenn \Input::get('belegyear');
270
		$this->Template->display_year = $intYear;
271
		// Anzahl der anzuzeigenden Jahre fuer welche Reservierungen vorliegen
272
		$this->Template->number_year = $this->intAnzahlJahre;
273
		// Jahreszahlen fuer die Auswahlbox
274
		$this->Template->selectable_year = $arrJahre;
275
		// Anzahl anzuzeigender Objekte
276
		$this->Template->number_objekte = $i;
277
		// Kategorien sortieren wie im Checkboxwizard ausgewaehlt -> Elterntabelle
278
		$this->Template->CategorieObjekteCalender = $this->sortNachWizard($arrCategorieObjekte, $this->belegungsplan_category);
279
		// Array mit den Monatsdaten
280
		$this->Template->Month = $this->dataMonth($arrBelegungsplanMonth, $this->intStartAuswahl, $arrFeiertage);
281
		// Array mit den Feiertagen
282
		#$this->Template->Feiertage = $arrFeiertage;
283
		#$this->Template->Start = $this->intStartAuswahl;
284
		#$this->Template->Ende = $this->intEndeAuswahl;
285
		#$this->Template->Monate = $arrBelegungsplanMonth;
286
		#$this->Template->MaxMonat = $intMax;
287
		
288
		if (!empty($arrCategorieObjekte)) {
289
			unset($arrCategorieObjekte);
290
		}
291
		if (!empty($arrInfo)) {
292
			unset($arrInfo);
293
		}
294
		if (!empty($arrFeiertage)) {
295
			unset($arrFeiertage);
296
		}
297
		// Clear the $_GET array (see #2445)
298
		if ($blnClearInput) {
299
			\Input::setGet('belegyear', null);
300
		}
301
	}
302
	
303
	/**
304
	 * Sortiert die Kategorien nach Auswahl im Checkbox-Wizard
305
	 *
306
	 * @return array
307
	 */
308
	protected function sortNachWizard($arrCategorieObjekte, $arrBelegungsplanCategory)
309
	{	
310
		// Schluessel und Werte tauschen
311
		$arrHelper = array_flip($arrBelegungsplanCategory);
312
		
313
		foreach ($arrHelper as $key => $value) {
314
			if (array_key_exists($key, $arrCategorieObjekte)) {
315
				$arrHelper[$key] = $arrCategorieObjekte[$key];
316
				// Objekte in der Kategorie gleich mit nach DB sortieren
317
				ksort($arrHelper[$key]['Objekte']);
318
			} else {
319
				unset($arrHelper[$key]);
320
			}
321
		}
322
		// leere Einträge entfernen
323
		return $arrHelper;
324
	}
325
	
326
	/**
327
	 * Fuegt den Monaten Daten hinzu
328
	 *
329
	 * @return array
330
	 */
331
	protected function dataMonth($arrMonth, $intStartAuswahl, $arrFeiertage)
332
	{
333
		$arrHelper = array();
334
		$intJahr = date('Y', $intStartAuswahl);
335
		foreach ($arrMonth as $key => $value) {
336
			$arrHelper[$value]['Name'] = $GLOBALS['TL_LANG']['mailwurm_belegung']['month'][$value];
337
			$arrHelper[$value]['TageMonat'] = (int) date('t', mktime(0, 0, 0, (int) $value, 1, (int) $intJahr));
338
			$arrHelper[$value]['ColSpan'] = $arrHelper[$value]['TageMonat'] + 1;
339
			$intFirstDayInMonth = (int) date('N', mktime(0, 0, 0, (int) $value, 1, (int) $intJahr));
340
			for ($f = 1, $i = $intFirstDayInMonth; $f <= $arrHelper[$value]['TageMonat']; $f++) {
341
				$strClass = '';
342
				$arrHelper[$value]['Days'][$f]['Day'] = $GLOBALS['TL_LANG']['mailwurm_belegung']['day'][$i];
343
				$arrHelper[$value]['Days'][$f]['DayCut'] = $GLOBALS['TL_LANG']['mailwurm_belegung']['short_cut_day'][$i];
344
				$arrHelper[$value]['Days'][$f]['DayWeekNum'] = $i;
345
				$i === 6 ? $strClass .= ' saturday' : '';
346
				$i === 7 ? $strClass .= ' sunday' : '';
347
				if (!empty($arrFeiertage[$intJahr][$value][$f])) {
348
					$strClass .= ' holiday';
349
					$arrHelper[$value]['Days'][$f]['Holiday'] = $arrFeiertage[$intJahr][$value][$f];
350
				}
351
				$arrHelper[$value]['Days'][$f]['Class'] = trim($strClass);
352
				$i === 7 ? $i = 1 : $i++;
353
			}
354
		}
355
		unset($intJahr);
356
		unset($arrFeiertage);
357
		return $arrHelper;
358
	}
359
	
360
	/**
361
	 * Ausgabe fuer Kalender
362
	 *
363
	 * @return string
364
	 */
365
	protected function includeCalender($intBuchungsStartJahr, $intBuchungsEndeJahr, $intY, $arrCategoriesObjekte, $z)
366
	{
367
		$strReturn = '';
368
		$intBuchungJahr = empty($z) ? (int) $intBuchungsStartJahr : (int) $intBuchungsEndeJahr;
369
		// bei Jahresuebergreifender Buchung
370
		if ((int) $intBuchungsStartJahr != (int) $intBuchungsEndeJahr) {
371
			// bei Jahresuebergreifender Buchung
372
			if ($intY === $intBuchungJahr) {
373
				$strReturn = empty($z) ? '0#1' : '1#0';
374
			} else {
375
				$strReturn = '1#1';
376
			}
377
		} else {
378
			// wenn letzter Tag einer Buchung gleich dem ersten Tag einer neuer Buchung
379
			if (isset($arrCategoriesObjekte)) {
380
				$strReturn = '1#1';
381
			} else {
382
				$strReturn = empty($z) ? '0#1' : '1#0';
383
			}
384
		}
385
		return $strReturn;
386
	}
387
}
388