forked from FOSBOS/diNo
/
ISchuelerKursSelector.cs
259 lines (233 loc) · 9.91 KB
/
ISchuelerKursSelector.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
using diNo.diNoDataSetTableAdapters;
using System;
using System.Collections.Generic;
namespace diNo
{
/// <summary>
/// Interface für Klassen, die die Auswahl von Schülern für bestimmte Kurse übernehmen können.
/// </summary>
public interface ISchuelerKursSelector
{
/// <summary>
/// Prüft, ob ein Schueler in einem Kurs ist. Voreinstellung: Der Schueler ist drin, solange kein Selector ihn rausnimmt.
/// </summary>
/// <param name="schueler">Der Schueler.</param>
/// <param name="kurs">Der Kurs.</param>
/// <returns>False wenn es einen Grund gibt, weswegen der Schueler in diesen Kurs nicht gehen darf. Sonst true.</returns>
bool IsInKurs(diNo.diNoDataSet.SchuelerRow schueler, diNo.diNoDataSet.KursRow kurs);
/// <summary>
/// Muss true ausgeben, wenn sich der Selector für ein Fach interessiert.
/// </summary>
/// <param name="fach">Das Fach.</param>
/// <returns>true wenn interessiert.</returns>
bool IsInterestedInFach(diNo.diNoDataSet.FachRow fach);
}
/// <summary>
/// Diese Klasse nimmt mehrere solche Selektoren auf und leitet intern die Anfragen weiter.
/// </summary>
public class SchuelerKursSelectorHolder : ISchuelerKursSelector
{
/// <summary>
/// Die Selektoren.
/// </summary>
private IList<ISchuelerKursSelector> allSelectors;
/// <summary>
/// Der Konstruktor.
/// </summary>
public SchuelerKursSelectorHolder()
{
this.allSelectors = new List<ISchuelerKursSelector>();
}
/// <summary>
/// Methode zum Anmelden eines weiteren Selektors.
/// </summary>
/// <param name="selector">Der Selektor.</param>
public void AddSelector(ISchuelerKursSelector selector)
{
this.allSelectors.Add(selector);
}
/// <summary>
/// Prüft, ob ein Schueler in einem Kurs ist. Voreinstellung: Der Schueler ist drin, solange kein Selector ihn rausnimmt.
/// </summary>
/// <param name="schueler">Der Schueler.</param>
/// <param name="kurs">Der Kurs.</param>
/// <returns>False wenn es einen Grund gibt, weswegen der Schueler in diesen Kurs nicht gehen darf. Sonst true.</returns>
public bool IsInKurs(diNoDataSet.SchuelerRow schueler, diNoDataSet.KursRow kurs)
{
var fach = new FachTableAdapter().GetDataById(kurs.FachId)[0];
foreach (ISchuelerKursSelector selector in this.allSelectors)
{
if (selector.IsInterestedInFach(fach) && !selector.IsInKurs(schueler, kurs))
{
return false;
}
}
return true;
}
/// <summary>
/// Muss true ausgeben, wenn sich der Selector für ein Fach interessiert.
/// </summary>
/// <param name="fach">Das Fach.</param>
/// <returns>true wenn interessiert.</returns>
public bool IsInterestedInFach(diNo.diNoDataSet.FachRow fach)
{
foreach (ISchuelerKursSelector selector in this.allSelectors)
{
if (selector.IsInterestedInFach(fach))
{
return true;
}
}
return false;
}
}
/// <summary>
/// Prüft, ob der Schüler den übergebenen Kurs als Fremdsprache gewählt hat.
/// </summary>
public class FremdspracheSelector :ISchuelerKursSelector
{
/// <summary>
/// Prüft, ob ein Schueler in einem Kurs ist. Voreinstellung: Der Schueler ist drin, solange kein Selector ihn rausnimmt.
/// Der Fremdsprachenselektor prüft, ob Französisch als zweite Fremdsprache eingetragen ist.
/// </summary>
/// <param name="schueler">Der Schüler.</param>
/// <param name="kurs">Der Kurs (momentan nur französisch).</param>
/// <returns>true wenn der Schüler französisch gewählt hat.</returns>
public bool IsInKurs(diNoDataSet.SchuelerRow schueler, diNoDataSet.KursRow kurs)
{
var fach = new FachTableAdapter().GetDataById(kurs.FachId)[0];
if (fach.Kuerzel.Equals("F", StringComparison.OrdinalIgnoreCase))
{
// F3 steht für französisch fortgeführt. Diese Leute gehören nicht in den "normalen" Französischkurs
return (fach.Kuerzel.Equals(schueler.Fremdsprache2, StringComparison.OrdinalIgnoreCase)) && !(schueler.Wahlpflichtfach.Equals("F3", StringComparison.OrdinalIgnoreCase));
}
return true;
}
/// <summary>
/// Muss true ausgeben, wenn sich der Selector für ein Fach interessiert.
/// Momentan interessiert sich der Fremdsprachenselektor nur für Französisch.
/// </summary>
/// <param name="fach">Das Fach.</param>
/// <returns>true wenn interessiert.</returns>
public bool IsInterestedInFach(diNo.diNoDataSet.FachRow fach)
{
return fach.Kuerzel.Equals("F", StringComparison.OrdinalIgnoreCase);
}
}
/// <summary>
/// Prüft, ob der Schüler in RK, EV oder Eth geht.
/// </summary>
public class ReliOderEthikSelector : ISchuelerKursSelector
{
/// <summary>
/// Prüft, ob ein Schueler in einem Kurs ist.
/// </summary>
/// <param name="schueler">Der Schüler.</param>
/// <param name="kurs">Der Kurs.</param>
/// <returns>true, wenn der Schüler in diesen Kurs gehen soll.</returns>
public bool IsInKurs(diNoDataSet.SchuelerRow schueler, diNoDataSet.KursRow kurs)
{
var fach = new FachTableAdapter().GetDataById(kurs.FachId)[0];
// wenn eine Wahl vorliegt, zuerst danach richten
bool kursGewaehlt = !string.IsNullOrEmpty(schueler.ReligionOderEthik);
if (kursGewaehlt)
{
bool katholisch = fach.Kuerzel.Equals("K", StringComparison.OrdinalIgnoreCase) && schueler.ReligionOderEthik.Equals("RK", StringComparison.OrdinalIgnoreCase);
bool evangelisch = fach.Kuerzel.Equals("Ev", StringComparison.OrdinalIgnoreCase) && schueler.ReligionOderEthik.Equals("EV", StringComparison.OrdinalIgnoreCase);
bool ethik = fach.Kuerzel.Equals("Eth", StringComparison.OrdinalIgnoreCase) && schueler.ReligionOderEthik.Equals("Eth", StringComparison.OrdinalIgnoreCase);
return katholisch || evangelisch || ethik;
}
else
{
// wenn keine Wahl vorliegt, dann muss das Bekenntnis passen
// wenn das auch nicht passt, dann stecken wir den Schueler in Ethik
bool bekenntnisStimmt = IsEqualBekenntnis(schueler.Bekenntnis, fach.Kuerzel);
return bekenntnisStimmt || fach.Kuerzel.Equals("Eth", StringComparison.OrdinalIgnoreCase);
}
}
public bool IsEqualBekenntnis(string bekenntnis, string anderes)
{
if (bekenntnis.Equals(anderes, StringComparison.OrdinalIgnoreCase))
{
return true;
}
if ((bekenntnis.Equals("K", StringComparison.OrdinalIgnoreCase) && anderes.Equals("RK", StringComparison.OrdinalIgnoreCase)) || (bekenntnis.Equals("RK", StringComparison.OrdinalIgnoreCase) && anderes.Equals("K", StringComparison.OrdinalIgnoreCase)))
{
return true;
}
return false;
}
/// <summary>
/// Interessiert sich momentan für die Fächer K, Ev und Eth.
/// </summary>
/// <param name="fach">Das Fach</param>
/// <returns>true falls eines der Reli-Fächer übergeben wurde. Sonst false.</returns>
public bool IsInterestedInFach(diNo.diNoDataSet.FachRow fach)
{
return fach.Kuerzel.Equals("K", StringComparison.OrdinalIgnoreCase)
|| fach.Kuerzel.Equals("Ev", StringComparison.OrdinalIgnoreCase)
|| fach.Kuerzel.Equals("Eth", StringComparison.OrdinalIgnoreCase);
}
}
public class WahlpflichtfachSelector : ISchuelerKursSelector
{
/// <summary>
/// Prüft, ob ein Schueler in einem Kurs ist.
/// </summary>
/// <param name="schueler">Der Schüler.</param>
/// <param name="kurs">Der Kurs.</param>
/// <returns>true, wenn der Schüler in diesen Kurs gehen soll.</returns>
public bool IsInKurs(diNoDataSet.SchuelerRow schueler, diNoDataSet.KursRow kurs)
{
var fach = new FachTableAdapter().GetDataById(kurs.FachId)[0];
Schueler derSchueler = new Schueler(schueler);
if (derSchueler.getKlasse.Zweig == Zweig.Wirtschaft)
{
if (derSchueler.getKlasse.Schulart == Schulart.FOS)
{
// Wirtschafts-FOSler müssen zwischen WIn und Französisch (fortgeführt) wählen
// wenn der Schüler dieses Fach extra gewählt hat soll er natürlich reingehen
if (fach.Kuerzel.Equals("F-Wi", StringComparison.OrdinalIgnoreCase) &&
schueler.Wahlpflichtfach.Equals("F3", StringComparison.OrdinalIgnoreCase))
{
return true;
}
if (fach.Kuerzel.Equals("WIn", StringComparison.OrdinalIgnoreCase) &&
schueler.Wahlpflichtfach.Equals("WIn", StringComparison.OrdinalIgnoreCase))
{
return true;
}
return false;
}
else
{
// Wirtschafts-BOSler gehen immer in WIn, aber nie in Französisch (fortgeführt) oder Kunst
return fach.Kuerzel.Equals("WIn", StringComparison.OrdinalIgnoreCase);
}
}
// Für Soziale gilt: Wer Kunst als Wahlpflichtfach gewählt hat geht in Kunst
// wer Französisch als Wahlpflichtfach gewählt hat, geht in Französisch (das macht aber der
// Fremdsprachenselector, weil dann Französisch als Sprache2 eingetragen wird)
if (derSchueler.getKlasse.Zweig == Zweig.Sozial)
{
if (fach.Kuerzel.Equals("Ku", StringComparison.OrdinalIgnoreCase) &&
schueler.Wahlpflichtfach.Equals("Ku", StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
return false;
}
/// <summary>
/// Interessiert sich momentan für die Fächer F-Wi, Ku und WIn.
/// </summary>
/// <param name="fach">Das Fach</param>
/// <returns>true falls eines der Reli-Fächer übergeben wurde. Sonst false.</returns>
public bool IsInterestedInFach(diNoDataSet.FachRow fach)
{
return fach.Kuerzel.Equals("F-Wi", StringComparison.OrdinalIgnoreCase)
|| fach.Kuerzel.Equals("WIn", StringComparison.OrdinalIgnoreCase)
|| fach.Kuerzel.Equals("Ku", StringComparison.OrdinalIgnoreCase);
}
}
}