-
Notifications
You must be signed in to change notification settings - Fork 1
/
WinSVSchuelerReader.cs
281 lines (259 loc) · 11 KB
/
WinSVSchuelerReader.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
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
using diNo.diNoDataSetTableAdapters;
using log4net;
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
namespace diNo
{
/// <summary>
/// Liest die Schülerdatei aus der WinSV ein.
/// </summary>
public class WinSVSchuelerReader
{
# region Spaltenindex-Konstanten
public const int schuelerIdSpalte = 2;
public const int nachnameSpalte = 3;
public const int vornameSpalte = 6;
public const int rufnameSpalte = 7;
public const int geschlechtSpalte = 8;
public const int geburtsdatumSpalte = 10;
public const int geburtsortSpalte = 12;
public const int bekenntnisSpalte = 14;
public const int nachnameEltern1Spalte = 15;
public const int vornameEltern1Spalte = 16;
public const int anredeEltern1Spalte = 17;
public const int verwandtschaftsbezeichnungEltern1Spalte = 18;
public const int nachnameEltern2Spalte = 20;
public const int vornameEltern2Spalte = 21;
public const int anredeEltern2Spalte = 22;
public const int verwandtschaftsbezeichnungEltern2Spalte = 23;
public const int anschr1PlzSpalte = 25;
public const int anschr1OrtSpalte = 26;
public const int anschr1StrasseSpalte = 27;
public const int anschr1TelefonSpalte = 28;
public const int klasseSpalte = 52;
public const int jahrgangsstufeSpalte = 53;
public const int ausbildungsrichtungSpalte = 58;
public const int fremdsprache2Spalte = 60;
public const int reliOderEthikSpalte = 63;
public const int wahlpflichtfachSpalte = 64;
public const int wahlfach1Spalte = 73;
public const int wahlfach2Spalte = 74;
public const int wahlfach3Spalte = 75;
public const int wahlfach4Spalte = 76;
public const int wdh1JahrgangsstufeSpalte = 86;
public const int wdh2JahrgangsstufeSpalte = 87;
public const int wdh1GrundSpalte = 91;
public const int wdh2GrundSpalte = 92;
public const int probezeitBisSpalte = 98;
public const int eintrittDatumSpalte = 115;
public const int eintrittJgstSpalte = 117;
public const int eintrittVonSchulnummerSpalte = 125;
public const int austrittsdatumSpalte = 122;
public const int schulischeVorbildungSpalte = 128;
public const int beruflicheVorbildungSpalte = 129;
public const int lrsStoerungSpalte = 215;
public const int lrsSchwaecheSpalte = 216;
public const int lrsBisDatumSpalte = 254;
public const int emailSpalte = 269;
public const int notfallrufnummerSpalte = 270;
#endregion
/// <summary>
/// Der log4net-Logger.
/// </summary>
private static readonly log4net.ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// Die Methode zum Einlesen der Daten.
/// </summary>
/// <param name="fileName">Der Dateiname.</param>
public static void ReadSchueler(string fileName)
{
using (StreamReader reader = new StreamReader(fileName, Encoding.GetEncoding("iso-8859-1")))
using (SchuelerTableAdapter tableAdapter = new SchuelerTableAdapter())
using (KlasseTableAdapter klasseTableAdapter = new KlasseTableAdapter())
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
if (string.IsNullOrEmpty(line))
{
log.Debug("Ignoriere Leerzeile");
continue;
}
string[] array = line.Split(new string[] { "\t" }, StringSplitOptions.None);
string[] cleanArray = array.Select(aString => aString.Trim(new char[] { '\"', ' ', '\n' })).ToArray();
var klasse = GetKlasseId(klasseTableAdapter, cleanArray[klasseSpalte].Trim());
if (klasse == null)
{
log.Debug("Ignoriere einen Schüler ohne richtige Klasse. Übergebene Klasse war " + cleanArray[klasseSpalte]);
continue;
}
// wenn der Schüler noch nicht vorhanden ist
var table = tableAdapter.GetDataById(int.Parse(cleanArray[schuelerIdSpalte]));
diNoDataSet.SchuelerRow row = (table.Count == 0) ? table.NewSchuelerRow() : table[0];
FillRow(cleanArray, klasse, row);
if (table.Count == 0)
{
table.AddSchuelerRow(row);
}
tableAdapter.Update(row);
// Diese Zeile meldet den Schüler bei allen notwendigen Kursen seiner Klasse an
new Schueler(row).WechsleKlasse(new Klasse(klasse));
}
}
}
/// <summary>
/// Füllt die SchuelerRow mit ihren Daten aus WinSV
/// </summary>
/// <param name="cleanArray">Das Array mit Daten.</param>
/// <param name="klasse">Die Klasse in welche der Schüler gehen soll.</param>
/// <param name="row">Die SchuelerRow.</param>
private static void FillRow(string[] cleanArray, diNoDataSet.KlasseRow klasse, diNoDataSet.SchuelerRow row)
{
row.Id = int.Parse(cleanArray[schuelerIdSpalte]);
row.Name = cleanArray[nachnameSpalte];
row.Vorname = cleanArray[vornameSpalte];
row.KlasseId = klasse.Id;
row.Schulart = klasse.Bezeichnung.StartsWith("B") ? "B" : "F";
row.Rufname = cleanArray[rufnameSpalte];
row.Geschlecht = cleanArray[geschlechtSpalte];
if (row.Geschlecht != "M" && row.Geschlecht != "W")
throw new InvalidDataException("Geschlecht unbekannt");
DateTime? geburtsdatum = ParseDate(cleanArray[geburtsdatumSpalte]);
if (geburtsdatum == null)
{
row.SetGeburtsdatumNull();
}
else
{
row.Geburtsdatum = (DateTime)geburtsdatum;
}
row.Geburtsort = cleanArray[geburtsortSpalte];
row.Bekenntnis = cleanArray[bekenntnisSpalte];
row.AnschriftPLZ = cleanArray[anschr1PlzSpalte];
row.AnschriftOrt = cleanArray[anschr1OrtSpalte];
row.AnschriftStrasse = cleanArray[anschr1StrasseSpalte];
row.AnschriftTelefonnummer = cleanArray[anschr1TelefonSpalte];
row.Ausbildungsrichtung = ChangeAusbildungsrichtung(cleanArray[ausbildungsrichtungSpalte]);
row.ReligionOderEthik = cleanArray[reliOderEthikSpalte];
row.Wiederholung1Jahrgangsstufe = cleanArray[wdh1JahrgangsstufeSpalte];
row.Wiederholung2Jahrgangsstufe = cleanArray[wdh2JahrgangsstufeSpalte];
row.Wiederholung1Grund = cleanArray[wdh1GrundSpalte];
row.Wiederholung2Grund = cleanArray[wdh2GrundSpalte];
DateTime? probezeit = ParseDate(cleanArray[probezeitBisSpalte]);
if (probezeit == null)
{
row.SetProbezeitBisNull();
}
else
{
row.ProbezeitBis = (DateTime)probezeit;
}
DateTime? austrittsdatum = ParseDate(cleanArray[austrittsdatumSpalte]);
if (austrittsdatum == null)
{
row.SetAustrittsdatumNull();
row.Status = 0;
}
else
{
row.Austrittsdatum = (DateTime)austrittsdatum;
row.Status = austrittsdatum < DateTime.Now ? 1 : 0;
}
row.SchulischeVorbildung = cleanArray[schulischeVorbildungSpalte];
row.BeruflicheVorbildung = cleanArray[beruflicheVorbildungSpalte];
row.LRSStoerung = cleanArray[lrsStoerungSpalte] == "1";
row.VerwandtschaftsbezeichnungEltern1 = cleanArray[verwandtschaftsbezeichnungEltern1Spalte];
row.NachnameEltern1 = cleanArray[nachnameEltern1Spalte];
row.VornameEltern1 = cleanArray[vornameEltern1Spalte];
row.AnredeEltern1 = cleanArray[anredeEltern1Spalte];
row.NachnameEltern2 = cleanArray[nachnameEltern2Spalte];
row.VornameEltern2 = cleanArray[vornameEltern2Spalte];
row.AnredeEltern2 = cleanArray[anredeEltern2Spalte];
row.VerwandtschaftsbezeichnungEltern2 = cleanArray[verwandtschaftsbezeichnungEltern2Spalte];
row.EintrittJahrgangsstufe = cleanArray[eintrittJgstSpalte];
row.LRSZuschlagMin = 0;
row.LRSZuschlagMax = 0;
DateTime? eintrittDatum = ParseDate(cleanArray[eintrittDatumSpalte]);
if (eintrittDatum == null)
{
row.SetEintrittAmNull();
}
else
{
row.EintrittAm = (DateTime)eintrittDatum;
}
row.EintrittAusSchulnummer = !string.IsNullOrEmpty(cleanArray[eintrittVonSchulnummerSpalte]) ? int.Parse(cleanArray[eintrittVonSchulnummerSpalte]) : -1;
row.Email = cleanArray[emailSpalte];
row.Notfalltelefonnummer = cleanArray[notfallrufnummerSpalte];
row.Berechungsstatus = (int)Berechnungsstatus.Unberechnet;
row.AndereFremdspr2Art = 0;
}
/// <summary>
/// Sucht die ID der Klasse in der Datenbank. Versucht auch zu beurteilen, ob es sich überhaupt um eine echte Klasse handelt.
/// Legt auch Klassen ggf. selbstständig in der Datenbank an.
/// </summary>
/// <param name="klasseTableAdapter">Der Table Adapter für Klassen.</param>
/// <param name="klasse">Die Klassenbezeichnung.</param>
/// <returns>Die Id der Klasse oder -1 falls die Klasse ungültig ist.</returns>
private static diNoDataSet.KlasseRow GetKlasseId(KlasseTableAdapter klasseTableAdapter, string klasse)
{
var klasseDBresult = klasseTableAdapter.GetDataByBezeichnung(klasse);
if (klasseDBresult.Count == 1)
{
return klasseDBresult[0];
}
else
{
// -N : Klassen für kommendes Jahr
// AHR, FHR: Klassen des vergangenen Jahres
// Abm: Abmeldungen
// Ex, Import: ?
if (klasse.EndsWith("-N") || klasse.Contains("Rest") || klasse.Contains("AHR") || klasse.Contains("FHR") || klasse.Contains("Abm") || klasse.Equals("Ex") || klasse.Equals("Import"))
{
return null;
}
else
{
Klasse.Insert(klasse);
var neueKlasse = klasseTableAdapter.GetDataByBezeichnung(klasse);
return neueKlasse[0];
}
}
}
/// <summary>
/// Macht aus einem Datummstring ein DateTime oder null wenn das Datum leer ist.
/// </summary>
/// <param name="date">Der Datumsstring.</param>
/// <returns>Ein DateTime oder null.</returns>
private static DateTime? ParseDate(string date)
{
if (string.IsNullOrEmpty(date))
return null;
return DateTime.Parse(date, CultureInfo.CurrentCulture);
}
/// <summary>
/// Hauptzweck der Methode: W statt WVR im Wirtschaftszweig verwenden.
/// </summary>
/// <param name="ausbildungsrichtung">Die Ausbildungsrichtung aus der Schüler SV. z. B. WVR für Wirtschaft.</param>
/// <returns>Ein-Buchstabige Ausbildungsrichtung, z. B. W für Wirtschaft.</returns>
private static string ChangeAusbildungsrichtung(string ausbildungsrichtung)
{
switch (ausbildungsrichtung)
{
case "S": return "S";
case "T": return "T";
case "WVR": return "W";
case "W": return "W"; // manchmal steht W auch schon drin
case "V": return "V"; // Vorklasse FOS hat noch keine Ausbildungsrichtung
case "": return "V"; // Integrationsvorklasse hat auch noch keine Richtung
case "A": return "U"; // Agrar- Bio und Umwelttechnologie.
case "U": return "U"; // Agrar- Bio und Umwelttechnologie.
default:
throw new InvalidOperationException("Unbekannte Ausbildungsrichtung " + ausbildungsrichtung);
}
}
}
}