Commits

JanKanis committed 210b43f Draft

Improve warning messages when spreadsheet inconsistencies are detected, hopefully users can now figure out how to fix them themselves

Comments (0)

Files changed (1)

aanmeldscript-functions.php

 		$this->projecten = new Sheet($this->spreadsheetService, $this->findsheet($this->spreadsheetFeed, trim($projecten)));
 		//checkpoint('got sheets');
 		
-		$this->errors = array();
-			$projectencsv = $this->projecten->getData();
-			$this->checkprojecten($projectencsv);
-			$projectendata = index(filterfield(filterfield($projectencsv, 'naam'), 'code'), 'code');
-	
-			$this->aanmeldingendata = $this->aanmeldingen->getData(array('headerref'=>&$this->aanmeldingcolumns));
-			$this->checkaanmeldingen($projectendata);
-	
-			$this->projectendata = plekvrij($projectendata, $this->aanmeldingendata);
+		$projectencsv = $this->projecten->getData();
+		$this->checkprojectenchars($projectencsv);
+		$projectendata = index(filterfield(filterfield($projectencsv, 'naam'), 'code'), 'code');
 
-		if(count($this->errors) > 0) {
-			warn_sheetbeheerder("Fouten gevonden in spreadsheets:\n".implode("\n", $this->errors)); }
+		$this->aanmeldingendata = $this->aanmeldingen->getData(array('headerref'=>&$this->aanmeldingcolumns));
+		$this->checkspreadsheets($projectencsv, $projectendata, $this->aanmeldingendata);
+
+		$this->projectendata = plekvrij($projectendata, $this->aanmeldingendata);
 	}
 
 	function plekvrij($project) {
 		return $this->aanmeldingen->insertrow($row);
 	}
 
-
 	private function findsheet($spreadsheetFeed, $name) {
 		$name = trim($name);
 		$found = 0;
 		return $sheet;
 	}
 
-	private function checkprojecten($projectencsv) {
-		foreach(array_count_values(array_map(fn('$x["code"]'), $projectencsv)) as $code => $count) {
-			if($count > 1) {
-				$this->errors[] = "Projectcode '$code' wordt voor meerdere projecten gebruikt"; }
-		}
-
+	// Checks for fatal errors in the Projecten spreadsheets, and throws an 
+	// exception if any are found. The current checks are for illegal 
+	// characters in project codes and illegal values in 'max deelnemers'.
+	private function checkprojectenchars($projectencsv) {
 		foreach($projectencsv as $project) {
 			$code = $project['code'];
 			$maxdeelnemers = $project['max deelnemers'];
-			if(!($code === htmlspecialchars($code, ENT_QUOTES) && ($maxdeelnemers === '' || $maxdeelnemers === (string) (int) $maxdeelnemers))) {
-				throw new Exception("niet toegestane tekens in Projecten configuratie: ".var_export_str($arr));
+			if($code !== htmlspecialchars($code, ENT_QUOTES)) {
+				throw new Exception("niet toegestane tekens in Projecten configuratie: ".var_export_str($code).
+					"\nIn projectcodes zijn de volgende tekens niet toegestaan: <>'\"&");
+			}
+			if(!($maxdeelnemers === '' || $maxdeelnemers === (string) (int) $maxdeelnemers)) {
+				throw new Exception("'max deelnemers' moet een getal zijn of mag leeg gelaten worden: ".var_export_str($maxdeelnemers));
 			}
 		}
 		return True;
 	}
 
-	private function checkaanmeldingen($projecten) {
-		foreach($this->aanmeldingendata as $aanmelding) {
-			if($aanmelding['ingedeeld'] && !isset($projecten[$aanmelding['ingedeeld']])) {
-				$this->errors[] = "Er is iemand aangemeld voor een onbekend project '{$aanmelding['ingedeeld']}'"; }
+	// This function checks for non-fatal errors in the Google spreadsheets, and calls warn_sheetbeheerder if it finds any.
+	// returns True when no errors found, False on errors.
+	private function checkspreadsheets($projectendata_raw, $projectendata, $aanmeldingen) {
+		$duplicatecode = array();
+		foreach(array_count_values(array_map(fn('$x["code"]'), $projectendata_raw)) as $code => $count) {
+			if($count > 1) {
+				$duplicatecode[] = $code; }
 		}
-		return True;
+
+		$unknownprojects = array();
+		foreach($aanmeldingen as $aanmelding) {
+			if($aanmelding['ingedeeld'] && !isset($projectendata[$aanmelding['ingedeeld']])) {
+				$unknownprojects[] = $aanmelding['ingedeeld']; }
+		}
+
+		// Return if no errors found
+		if(!$duplicatecode and !$unknownprojects) {
+			return True; }
+		
+		// Construct a (very verbose) warning message
+		$warnmsg = "Fouten gevonden in spreadsheets!\n".
+			"(Dit bericht betreft een waarschuwing, aanmeldingen kunnen ondertussen gewoon door gaan)\n";
+		if($duplicatecode) {
+			$warnmsg .= "\nDe volgende projectcodes worden voor meerdere projecten gebruikt:\n";
+			foreach($duplicatecode as $dup) {
+				$warnmsg .= "- $dup\n"; }
+		}
+		if($unknownprojects) {
+			$warnmsg .= "\nEr zijn aanmeldingen geregistreerd voor de volgende project(en), maar deze projecten zijn onbekend:\n";
+			foreach($unknownprojects as $unk) {
+				$warnmsg .= "- '$unk'\n"; }
+		}
+		$warnmsg .= "\n\nMogelijke oplossingen:\n";
+		if($duplicatecode) {
+			$warnmsg .= "\nZorg er voor dat elke code in het Projecten spreadsheet maar bij één project hoort. ".
+				"Geef de projecten die codes dubbel gebruiken een nieuwe code.\n"; }
+		if($unknownprojects) {
+			$warnmsg .= "\nZorg er voor dat iedereen die in het Aanmeldingen spreadsheet ergens is ingedeeld, ".
+				"ingedeeld staat bij een project dat ook in het Projecten sheet voorkomt. Als het bedoelde project wel in het Projecten spreadsheet staat maar de codes komen ".
+				"niet overeen, pas dan de code in het Aanmeldingen sheet aan. Als het project niet in het Projecten spreadsheet voorkomt, voeg het dan daaraan toe. ".
+				"Als je iemand handmatig bij een project ingedeeld wil hebben staan maar niet wil dat andere mensen zich ook voor dit project in kunnen schrijven, ".
+				"voeg dan de code van het project aan het Projecten spreadsheet toe maar laat de naam in het Projecten sheet leeg, dan verschijnt het project niet in het ".
+				"aanmeldformulier op de website."; 
+		}
+		warn_sheetbeheerder($warnmsg);
+
+		return False;
 	}
 
 }