public string CreateEventAuditReport(EventDB eventDB)
{
bool problemFound = false;
// Initialize the report
InitReport();
// Header.
WriteH1(string.Format(ReportText.EventAudit_Title, QueryEvent.GetEventTitle(eventDB, " ")));
// Courses missing things. Climb (not score course), start, finish (not score course), competitor load.
List<MissingThing> missingCourseThings = MissingCourseThings(eventDB);
if (missingCourseThings.Count > 0) {
problemFound = true;
WriteH2(ReportText.EventAudit_MissingItems);
BeginTable("", 3, "leftalign", "leftalign", "leftalign");
WriteTableHeaderRow(ReportText.ColumnHeader_Course, ReportText.ColumnHeader_Item, ReportText.ColumnHeader_Reason);
foreach (MissingThing thing in missingCourseThings) {
WriteTableRow(eventDB.GetCourse(thing.courseId).name, thing.what, thing.why);
}
EndTable();
}
// Close together controls.
float DISTANCE_LIMIT = 100.4999F; // limit of distance for close controls (100m, when rounded).
List<NearbyControls> nearbyList = FindNearbyControls(eventDB, DISTANCE_LIMIT);
if (nearbyList.Count > 0) {
problemFound = true;
// Informational text.
WriteH2(ReportText.EventAudit_CloseTogetherControls);
StartPara();
WriteText(string.Format(ReportText.EventAudit_CloseTogetherExplanation, Math.Round(DISTANCE_LIMIT)));
EndPara();
// The report.
BeginTable("", 3, "leftalign", "rightalign", "leftalign");
WriteTableHeaderRow(ReportText.ColumnHeader_ControlCodes, ReportText.ColumnHeader_Distance, ReportText.ColumnHeader_SameSymbol);
foreach (NearbyControls nearby in nearbyList) {
string code1 = eventDB.GetControl(nearby.controlId1).code;
string code2 = eventDB.GetControl(nearby.controlId2).code;
if (Util.CompareCodes(code1, code2) > 0) {
// swap code1 and code 2 so they always appear in order.
string temp = code1;
code1 = code2;
code2 = temp;
}
WriteTableRow(string.Format("{0}, {1}", code1, code2), string.Format("{0} m", Math.Round(nearby.distance)), nearby.sameSymbol ? ReportText.EventAudit_Yes : ReportText.EventAudit_No);
}
EndTable();
}
// Unused controls.
List<Id<ControlPoint>> unusedControls = SortedUnusedControls(eventDB);
if (unusedControls.Count > 0) {
problemFound = true;
WriteH2(ReportText.EventAudit_UnusedControls);
StartPara();
WriteText(ReportText.EventAudit_UnusedControlsExplanation);
EndPara();
BeginTable("", 2, "leftalign", "leftalign");
WriteTableHeaderRow(ReportText.ColumnHeader_Code, ReportText.ColumnHeader_Location);
foreach (Id<ControlPoint> controlId in unusedControls) {
ControlPoint control = eventDB.GetControl(controlId);
WriteTableRow(Util.ControlPointName(eventDB, controlId, NameStyle.Medium), string.Format("({0}, {1})", Math.Round(control.location.X), Math.Round(control.location.Y)));
}
EndTable();
}
// Missing descriptions boxes (regular controls only). Missing column D. Missing column E when between/junction/crossing used. Missing between/junction/crossing when column E is a symbol.
List<MissingThing> missingBoxes = MissingDescriptionBoxes(eventDB, unusedControls);
if (missingBoxes.Count > 0) {
problemFound = true;
WriteH2(ReportText.EventAudit_MissingBoxes);
BeginTable("", 3, "leftalign", "leftalign", "leftalign");
WriteTableHeaderRow(ReportText.ColumnHeader_Code, ReportText.ColumnHeader_Column, ReportText.ColumnHeader_Reason);
foreach (MissingThing thing in missingBoxes) {
WriteTableRow(Util.ControlPointName(eventDB, thing.controlId, NameStyle.Medium), thing.what, thing.why);
}
EndTable();
}
// Missing punches.
List<MissingThing> missingPunches = MissingPunches(eventDB, unusedControls);
if (missingPunches.Count > 0) {
problemFound = true;
WriteH2(ReportText.EventAudit_MissingPunchPatterns);
BeginTable("", 2, "leftalign", "leftalign");
WriteTableHeaderRow(ReportText.ColumnHeader_Code, ReportText.ColumnHeader_Reason);
foreach (MissingThing thing in missingPunches) {
WriteTableRow(Util.ControlPointName(eventDB, thing.controlId, NameStyle.Medium), thing.what);
}
EndTable();
}
// Missing points (score course only)
List<MissingThing> missingScores = MissingScores(eventDB);
if (missingScores.Count > 0) {
problemFound = true;
WriteH2(ReportText.EventAudit_MissingScores);
BeginTable("", 3, "leftalign", "leftalign", "leftalign");
WriteTableHeaderRow(ReportText.ColumnHeader_Course, ReportText.ColumnHeader_Control, ReportText.ColumnHeader_Reason);
foreach (MissingThing thing in missingScores) {
WriteTableRow(eventDB.GetCourse(thing.courseId).name, Util.ControlPointName(eventDB, thing.controlId, NameStyle.Medium), thing.what);
}
EndTable();
}
// If none of the above, then "no problems found".
if (!problemFound) {
StartPara();
WriteText(ReportText.EventAudit_NoProblems);
EndPara();
}
return FinishReport();
}