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.

ModuleBelegungsplan::sortNachWizard()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 16
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

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