AbiturdatenManager.ts 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494
  1. import { JavaObject, cast_java_lang_Object } from '../../../java/lang/JavaObject';
  2. import { Naturwissenschaften, cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Naturwissenschaften } from '../../../core/abschluss/gost/belegpruefung/Naturwissenschaften';
  3. import { SprachendatenManager, cast_de_nrw_schule_svws_core_SprachendatenManager } from '../../../core/SprachendatenManager';
  4. import { Schwerpunkt, cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Schwerpunkt } from '../../../core/abschluss/gost/belegpruefung/Schwerpunkt';
  5. import { HashMap, cast_java_util_HashMap } from '../../../java/util/HashMap';
  6. import { KurszahlenUndWochenstunden, cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_KurszahlenUndWochenstunden } from '../../../core/abschluss/gost/belegpruefung/KurszahlenUndWochenstunden';
  7. import { GostBelegpruefungsArt, cast_de_nrw_schule_svws_core_abschluss_gost_GostBelegpruefungsArt } from '../../../core/abschluss/gost/GostBelegpruefungsArt';
  8. import { AbiturFachbelegungHalbjahr, cast_de_nrw_schule_svws_core_data_gost_AbiturFachbelegungHalbjahr } from '../../../core/data/gost/AbiturFachbelegungHalbjahr';
  9. import { GostBesondereLernleistung, cast_de_nrw_schule_svws_core_types_gost_GostBesondereLernleistung } from '../../../core/types/gost/GostBesondereLernleistung';
  10. import { GostBelegpruefungErgebnis, cast_de_nrw_schule_svws_core_abschluss_gost_GostBelegpruefungErgebnis } from '../../../core/abschluss/gost/GostBelegpruefungErgebnis';
  11. import { JavaString, cast_java_lang_String } from '../../../java/lang/JavaString';
  12. import { GostKursart, cast_de_nrw_schule_svws_core_types_gost_GostKursart } from '../../../core/types/gost/GostKursart';
  13. import { Latinum, cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Latinum } from '../../../core/abschluss/gost/belegpruefung/Latinum';
  14. import { Sprachendaten, cast_de_nrw_schule_svws_core_data_Sprachendaten } from '../../../core/data/Sprachendaten';
  15. import { GostFachbereich, cast_de_nrw_schule_svws_core_types_gost_GostFachbereich } from '../../../core/types/gost/GostFachbereich';
  16. import { Allgemeines, cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Allgemeines } from '../../../core/abschluss/gost/belegpruefung/Allgemeines';
  17. import { Sport, cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Sport } from '../../../core/abschluss/gost/belegpruefung/Sport';
  18. import { GostHalbjahr, cast_de_nrw_schule_svws_core_types_gost_GostHalbjahr } from '../../../core/types/gost/GostHalbjahr';
  19. import { GostSchriftlichkeit, cast_de_nrw_schule_svws_core_types_gost_GostSchriftlichkeit } from '../../../core/types/gost/GostSchriftlichkeit';
  20. import { ZulaessigesFach, cast_de_nrw_schule_svws_core_types_statkue_ZulaessigesFach } from '../../../core/types/statkue/ZulaessigesFach';
  21. import { List, cast_java_util_List } from '../../../java/util/List';
  22. import { JavaBoolean, cast_java_lang_Boolean } from '../../../java/lang/JavaBoolean';
  23. import { Collections, cast_java_util_Collections } from '../../../java/util/Collections';
  24. import { Vector, cast_java_util_Vector } from '../../../java/util/Vector';
  25. import { GesellschaftswissenschaftenUndReligion, cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_GesellschaftswissenschaftenUndReligion } from '../../../core/abschluss/gost/belegpruefung/GesellschaftswissenschaftenUndReligion';
  26. import { GostBelegungsfehler, cast_de_nrw_schule_svws_core_abschluss_gost_GostBelegungsfehler } from '../../../core/abschluss/gost/GostBelegungsfehler';
  27. import { AbiFaecher, cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_AbiFaecher } from '../../../core/abschluss/gost/belegpruefung/AbiFaecher';
  28. import { HashSet, cast_java_util_HashSet } from '../../../java/util/HashSet';
  29. import { GostFach, cast_de_nrw_schule_svws_core_data_gost_GostFach } from '../../../core/data/gost/GostFach';
  30. import { LiterarischKuenstlerisch, cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_LiterarischKuenstlerisch } from '../../../core/abschluss/gost/belegpruefung/LiterarischKuenstlerisch';
  31. import { GostAbiturFach, cast_de_nrw_schule_svws_core_types_gost_GostAbiturFach } from '../../../core/types/gost/GostAbiturFach';
  32. import { AbiturFachbelegung, cast_de_nrw_schule_svws_core_data_gost_AbiturFachbelegung } from '../../../core/data/gost/AbiturFachbelegung';
  33. import { GostBelegpruefung, cast_de_nrw_schule_svws_core_abschluss_gost_GostBelegpruefung } from '../../../core/abschluss/gost/GostBelegpruefung';
  34. import { GostFachManager, cast_de_nrw_schule_svws_core_abschluss_gost_GostFachManager } from '../../../core/abschluss/gost/GostFachManager';
  35. import { Abiturdaten, cast_de_nrw_schule_svws_core_data_gost_Abiturdaten } from '../../../core/data/gost/Abiturdaten';
  36. import { Projektkurse, cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Projektkurse } from '../../../core/abschluss/gost/belegpruefung/Projektkurse';
  37. import { Deutsch, cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Deutsch } from '../../../core/abschluss/gost/belegpruefung/Deutsch';
  38. import { Fremdsprachen, cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Fremdsprachen } from '../../../core/abschluss/gost/belegpruefung/Fremdsprachen';
  39. import { GostBelegpruefungErgebnisFehler, cast_de_nrw_schule_svws_core_abschluss_gost_GostBelegpruefungErgebnisFehler } from '../../../core/abschluss/gost/GostBelegpruefungErgebnisFehler';
  40. import { JavaLong, cast_java_lang_Long } from '../../../java/lang/JavaLong';
  41. import { Mathematik, cast_de_nrw_schule_svws_core_abschluss_gost_belegpruefung_Mathematik } from '../../../core/abschluss/gost/belegpruefung/Mathematik';
  42. export class AbiturdatenManager extends JavaObject {
  43. private readonly abidaten : Abiturdaten;
  44. private readonly gostFaecher : HashMap<Number, GostFach>;
  45. private readonly pruefungsArt : GostBelegpruefungsArt;
  46. private readonly mapFachbereiche : HashMap<GostFachbereich, Vector<AbiturFachbelegung>> = new HashMap();
  47. private belegpruefungen : Vector<GostBelegpruefung> = new Vector();
  48. private belegpruefungsfehler : Vector<GostBelegungsfehler> = new Vector();
  49. private belegpruefungErfolgreich : boolean = false;
  50. /**
  51. * Erstellt ein neues Manager-Objekt, welches mit den übergebenen Abiturdaten verknüpft wird.
  52. *
  53. * @param abidaten die Abiturdaten
  54. * @param gostFaecher die Fächer der Gymnasialen Oberstufe, die bei dem Abiturjahrgang zur Verfügung stehen.
  55. * @param pruefungsArt die Art der Belegpruefung (z.B. EF1 oder GESAMT)
  56. */
  57. public constructor(abidaten : Abiturdaten, gostFaecher : List<GostFach>, pruefungsArt : GostBelegpruefungsArt) {
  58. super();
  59. this.abidaten = abidaten;
  60. this.gostFaecher = new HashMap();
  61. for (let i : number = 0; i < gostFaecher.size(); i++){
  62. let fach : GostFach | null = gostFaecher.get(i);
  63. if (fach !== null)
  64. this.gostFaecher.put(fach.id, fach);
  65. }
  66. this.pruefungsArt = pruefungsArt;
  67. this.init();
  68. }
  69. /**
  70. * Führt die Belegprüfung der Art pruefungs_art für einen Schüler durch, dessen Abiturdaten mit dem angegebenen
  71. * Manager verwaltet werden.
  72. *
  73. * @param pruefungs_art die Art der Prüfung, die durchgeführt wird
  74. *
  75. * @return eine Liste mit den durchgefuehrten Belegpruefungen
  76. */
  77. public getPruefungen(pruefungs_art : GostBelegpruefungsArt) : Vector<GostBelegpruefung> {
  78. let pruefungen : Vector<GostBelegpruefung> = new Vector();
  79. pruefungen.add(new Deutsch(this, pruefungs_art));
  80. let pruefungFremdsprachen : Fremdsprachen = new Fremdsprachen(this, pruefungs_art);
  81. pruefungen.add(pruefungFremdsprachen);
  82. pruefungen.add(new Latinum(this, pruefungs_art));
  83. pruefungen.add(new LiterarischKuenstlerisch(this, pruefungs_art));
  84. pruefungen.add(new GesellschaftswissenschaftenUndReligion(this, pruefungs_art));
  85. pruefungen.add(new Mathematik(this, pruefungs_art));
  86. let pruefungNaturwissenschaften : Naturwissenschaften = new Naturwissenschaften(this, pruefungs_art);
  87. pruefungen.add(pruefungNaturwissenschaften);
  88. pruefungen.add(new Sport(this, pruefungs_art));
  89. let pruefungProjektkurse : Projektkurse = new Projektkurse(this, pruefungs_art);
  90. pruefungen.add(pruefungProjektkurse);
  91. pruefungen.add(new Schwerpunkt(this, pruefungs_art, pruefungFremdsprachen, pruefungNaturwissenschaften));
  92. pruefungen.add(new AbiFaecher(this, pruefungs_art));
  93. pruefungen.add(new KurszahlenUndWochenstunden(this, pruefungs_art, pruefungProjektkurse));
  94. pruefungen.add(new Allgemeines(this, pruefungs_art));
  95. return pruefungen;
  96. }
  97. /**
  98. * Initialisiert bzw. reinitialisert die Datenstrukturen, die für den schnellen Zugriff auf die Daten
  99. * eingerichtet werden.
  100. */
  101. public init() : void {
  102. if (this.abidaten === null)
  103. return;
  104. this.initMapFachbereiche();
  105. this.belegpruefungen = this.getPruefungen(this.pruefungsArt);
  106. for (let i : number = 0; i < this.belegpruefungen.size(); i++){
  107. let belegpruefung : GostBelegpruefung = this.belegpruefungen.get(i);
  108. belegpruefung.pruefe();
  109. }
  110. this.belegpruefungsfehler = GostBelegpruefung.getBelegungsfehlerAlle(this.belegpruefungen);
  111. this.belegpruefungErfolgreich = GostBelegpruefung.istErfolgreich(this.belegpruefungsfehler);
  112. }
  113. /**
  114. * Initialisiert bzw. reinitialisiert die Map für den schnellen Zugriff auf Fachbelegungen
  115. * anhand des Fachbereichs.
  116. */
  117. private initMapFachbereiche() : void {
  118. this.mapFachbereiche.clear();
  119. let fachbereiche : List<GostFachbereich> = GostFachbereich.values();
  120. for (let fachbereich of fachbereiche) {
  121. this.mapFachbereiche.put(fachbereich, new Vector<AbiturFachbelegung>());
  122. }
  123. let fachbelegungen : Vector<AbiturFachbelegung> = this.abidaten.fachbelegungen;
  124. for (let fachbelegung of fachbelegungen) {
  125. if (this.zaehleBelegung(fachbelegung) > 0) {
  126. fachbereiche = GostFachbereich.getBereiche(this.getFach(fachbelegung));
  127. for (let fachbereich of fachbereiche) {
  128. let listFachbelegungen : Vector<AbiturFachbelegung> | null = this.mapFachbereiche.get(fachbereich);
  129. if (listFachbelegungen === null)
  130. continue;
  131. listFachbelegungen.add(fachbelegung);
  132. }
  133. }
  134. }
  135. }
  136. /**
  137. * Liefert die in den Abiturdaten enthaltenen Sprachendaten.
  138. *
  139. * @return Die Sprachendaten (siehe {@link Sprachendaten})
  140. */
  141. public getSprachendaten() : Sprachendaten | null {
  142. return this.abidaten.sprachendaten;
  143. }
  144. /**
  145. * Berechnet die Wochenstunden, welche von dem Schüler in den einzelnen
  146. * Halbjahren der gymnasialen Oberstufe für das Abitur relevant belegt wurden.
  147. *
  148. * @return ein Array mit den Wochenstunden für die sechs Halbjahre
  149. */
  150. public getWochenstunden() : Array<number> | null {
  151. let stunden : Array<number> | null = [0, 0, 0, 0, 0, 0];
  152. for (let i : number = 0; i < 6; i++){
  153. for (let fb of this.abidaten.fachbelegungen) {
  154. let hjb : AbiturFachbelegungHalbjahr | null = fb.belegungen[i];
  155. if ((hjb === null) || (JavaObject.equalsTranspiler("AT", (hjb.kursartKuerzel))))
  156. continue;
  157. stunden[i] += hjb.wochenstunden;
  158. }
  159. }
  160. return stunden;
  161. }
  162. /**
  163. * Berechnet die Anzahl der anrechenbaren Kurse, welche von dem Schüler in den einzelnen
  164. * Halbjahren der gymnasialen Oberstufe für das Abitur belegt wurden.
  165. *
  166. * @return ein Array mit den anrechenbaren Kursen für die sechs Halbjahre
  167. */
  168. public getAnrechenbareKurse() : Array<number> | null {
  169. let anzahl : Array<number> | null = [0, 0, 0, 0, 0, 0];
  170. let bll : GostBesondereLernleistung | null = GostBesondereLernleistung.fromKuerzel(this.abidaten.besondereLernleistung);
  171. for (let i : number = 0; i < 6; i++){
  172. for (let fb of this.abidaten.fachbelegungen) {
  173. let hjb : AbiturFachbelegungHalbjahr | null = fb.belegungen[i];
  174. if ((hjb === null) || (JavaObject.equalsTranspiler("AT", (hjb.kursartKuerzel))))
  175. continue;
  176. let kursart : GostKursart | null = GostKursart.fromKuerzel(hjb.kursartKuerzel);
  177. if ((kursart as unknown !== GostKursart.VTF as unknown) && (!((kursart as unknown === GostKursart.PJK as unknown) && (bll as unknown === GostBesondereLernleistung.PROJEKTKURS as unknown))))
  178. anzahl[i]++;
  179. }
  180. }
  181. return anzahl;
  182. }
  183. /**
  184. * Liefert das Fach der gymnasialen Oberstufe für die angegeben Abiturfachbelegung.
  185. *
  186. * @param belegung die Fachbelegung (siehe {@link AbiturFachbelegung})
  187. *
  188. * @return das Fach der gymnasialen Oberstufe (siehe {@link GostFach})
  189. */
  190. public getFach(belegung : AbiturFachbelegung | null) : GostFach | null {
  191. if (belegung === null)
  192. return null;
  193. return this.gostFaecher.get(belegung.fachID);
  194. }
  195. /**
  196. * Prüft, ob das Faches in allen angegebenen Halbjahren belegt wurde.
  197. * Ist die Fachbelegung null, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  198. * angegeben, so ist die Prüfung erfolgreich, da kein Halbjahr geprüft werden muss.
  199. *
  200. * @param fachbelegung die zu prüfende Fachbelegung
  201. * @param halbjahre die zu prüfenden Halbjahre
  202. *
  203. * @return true, falls das Fach in den Halbjahren belegt wurde, sonst false
  204. */
  205. public pruefeBelegung(fachbelegung : AbiturFachbelegung | null, ...halbjahre : Array<GostHalbjahr>) : boolean {
  206. if (fachbelegung === null)
  207. return false;
  208. if ((halbjahre === null) || (halbjahre.length === 0))
  209. return true;
  210. for (let halbjahr of halbjahre) {
  211. let belegungHalbjahr : AbiturFachbelegungHalbjahr | null = fachbelegung.belegungen[halbjahr.id];
  212. if ((belegungHalbjahr === null) || (belegungHalbjahr.kursartKuerzel === null))
  213. return false;
  214. }
  215. return true;
  216. }
  217. /**
  218. * Bestimmt die Anzahl der Fachbelegungen, die dem Fach zugeordnet sind.
  219. * Wird keine gültige Fachbelegung übergeben, so wird 0 zurückgegeben.
  220. *
  221. * @param fachbelegung die Fachbelegung
  222. *
  223. * @return die Anzahl der Belegungen des Faches
  224. */
  225. public zaehleBelegung(fachbelegung : AbiturFachbelegung | null) : number {
  226. if (fachbelegung === null)
  227. return 0;
  228. let anzahl : number = 0;
  229. for (let i : number = 0; i < GostHalbjahr.maxHalbjahre; i++){
  230. if (fachbelegung.belegungen[i] !== null)
  231. anzahl++;
  232. }
  233. return anzahl;
  234. }
  235. /**
  236. * Zählt die Anzahl der Belegungen für die angegebenen Fachbelegungen in den angegeben Halbjahren.
  237. * Ist die Fachbelegung null, so wird 0 zurückgegeben. Wird bei einer gültigen Fachbelegung kein Halbjahr
  238. * angegeben, so wird ebenfalls 0 zurückgegeben.
  239. *
  240. * @param fachbelegungen die Fachbelegungen
  241. * @param halbjahre die Halbjahre
  242. *
  243. * @return die Anzahl der Belegungen in den Halbjahren und den Fächern
  244. */
  245. public zaehleBelegungInHalbjahren(fachbelegungen : List<AbiturFachbelegung> | null, ...halbjahre : Array<GostHalbjahr>) : number {
  246. if (fachbelegungen === null)
  247. return 0;
  248. if ((halbjahre === null) || (halbjahre.length === 0))
  249. return 0;
  250. let anzahl : number = 0;
  251. for (let fachbelegung of fachbelegungen)
  252. for (let halbjahr of halbjahre)
  253. if (fachbelegung.belegungen[halbjahr.id] !== null)
  254. anzahl++;
  255. return anzahl;
  256. }
  257. /**
  258. * Prüft, ob die Belegung des Faches in den angegebenen Halbjahren der angegebenen Kursart entspricht.
  259. * Ist die Fachbelegung null, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  260. * angegeben, so ist die Prüfung erfolgreich, da kein Halbjahr geprüft werden muss.
  261. *
  262. * @param fachbelegung die zu prüfende Fachnbelegung
  263. * @param kursart die zu prüfende Kursart
  264. * @param halbjahre die zu prüfenden Halbjahre
  265. *
  266. * @return true, falls die Schriftlichkeit in den Halbjahren gegeben ist, sonst false
  267. */
  268. public pruefeBelegungMitKursart(fachbelegung : AbiturFachbelegung | null, kursart : GostKursart, ...halbjahre : Array<GostHalbjahr>) : boolean {
  269. if (fachbelegung === null)
  270. return false;
  271. if ((halbjahre === null) || (halbjahre.length === 0))
  272. return true;
  273. for (let halbjahr of halbjahre) {
  274. let belegungHalbjahr : AbiturFachbelegungHalbjahr | null = fachbelegung.belegungen[halbjahr.id];
  275. if ((belegungHalbjahr === null) || (kursart as unknown !== GostKursart.fromKuerzel(belegungHalbjahr.kursartKuerzel) as unknown))
  276. return false;
  277. }
  278. return true;
  279. }
  280. /**
  281. * Prüft, ob eine Fachbelegung existiert, welche in den angegebenen Halbjahren der angegebenen Kursart
  282. * entspricht.
  283. * Ist keine Fachbelegung angegeben, so schlägt die Prüfung fehl. Wird bei einer gültigen
  284. * Fachbelegung kein Halbjahr angegeben, so ist die Prüfung erfolgreich, da kein Halbjahr geprüft werden muss.
  285. *
  286. * @param fachbelegungen die zu prüfenden Fachnbelegungen
  287. * @param kursart die zu prüfende Kursart
  288. * @param halbjahre die zu prüfenden Halbjahre
  289. *
  290. * @return true, falls die Schriftlichkeit in den Halbjahren gegeben ist, sonst false
  291. */
  292. public pruefeBelegungExistiertMitKursart(fachbelegungen : List<AbiturFachbelegung> | null, kursart : GostKursart, ...halbjahre : Array<GostHalbjahr>) : boolean {
  293. if ((fachbelegungen === null) || (fachbelegungen.size() <= 0))
  294. return false;
  295. if ((halbjahre === null) || (halbjahre.length === 0))
  296. return true;
  297. for (let fachbelegung of fachbelegungen) {
  298. if (this.pruefeBelegungMitKursart(fachbelegung, kursart, ...halbjahre))
  299. return true;
  300. }
  301. return false;
  302. }
  303. /**
  304. * Prüft, ob die Belegung des Faches in den angegebenen Halbjahren mindestens einmal die angegebenen Kursart hat.
  305. * Ist die Fachbelegung null, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  306. * angegeben, so ist die Prüfung nicht erfolgreich, da kein Halbjahr geprüft werden muss und somit die Kursart nicht
  307. * einmal existiert.
  308. *
  309. * @param fachbelegung die zu prüfende Fachnbelegung
  310. * @param kursart die zu prüfende Kursart
  311. * @param halbjahre die zu prüfenden Halbjahre
  312. *
  313. * @return true, falls die Kursart mindestens einmal in den Halbjahren gegeben ist, sonst false
  314. */
  315. public pruefeBelegungHatMindestensEinmalKursart(fachbelegung : AbiturFachbelegung | null, kursart : GostKursart, ...halbjahre : Array<GostHalbjahr>) : boolean {
  316. if (fachbelegung === null)
  317. return false;
  318. if ((halbjahre === null) || (halbjahre.length === 0))
  319. return false;
  320. for (let halbjahr of halbjahre) {
  321. let belegungHalbjahr : AbiturFachbelegungHalbjahr | null = fachbelegung.belegungen[halbjahr.id];
  322. if (belegungHalbjahr === null)
  323. continue;
  324. if (kursart as unknown === GostKursart.fromKuerzel(belegungHalbjahr.kursartKuerzel) as unknown)
  325. return true;
  326. }
  327. return false;
  328. }
  329. /**
  330. * Prüft, ob die Belegung des Faches in dem angegebenen Halbjahr der angegebenen Schriftlichkeit entspricht.
  331. * Ist die Fachbelegung null, so schlägt die Prüfung fehl.
  332. *
  333. * @param fachbelegung die zu prüfende Fachnbelegung
  334. * @param schriftlichkeit die zu prüfende Schriftlichkeit
  335. * @param halbjahr das zu prüfende Halbjahr
  336. *
  337. * @return true, falls die Schriftlichkeit in dem Halbjahr gegeben ist, sonst false
  338. */
  339. public pruefeBelegungMitSchriftlichkeitEinzeln(fachbelegung : AbiturFachbelegung | null, schriftlichkeit : GostSchriftlichkeit, halbjahr : GostHalbjahr) : boolean {
  340. if (fachbelegung === null)
  341. return false;
  342. let belegungHalbjahr : AbiturFachbelegungHalbjahr | null = fachbelegung.belegungen[halbjahr.id];
  343. if ((belegungHalbjahr === null) || (belegungHalbjahr.schriftlich === null) || ((schriftlichkeit as unknown !== GostSchriftlichkeit.BELIEBIG as unknown) && (((schriftlichkeit as unknown === GostSchriftlichkeit.SCHRIFTLICH as unknown) && (!belegungHalbjahr.schriftlich)) || ((schriftlichkeit as unknown === GostSchriftlichkeit.MUENDLICH as unknown) && (belegungHalbjahr.schriftlich)))))
  344. return false;
  345. return true;
  346. }
  347. /**
  348. * Prüft, ob die Belegung des Faches in den angegebenen Halbjahren der angegebenen Schriftlichkeit entspricht.
  349. * Ist die Fachbelegung null, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  350. * angegeben, so ist die Prüfung erfolgreich, da kein Halbjahr geprüft werden muss.
  351. *
  352. * @param fachbelegung die zu prüfende Fachnbelegung
  353. * @param schriftlichkeit die zu prüfende Schriftlichkeit
  354. * @param halbjahre die zu prüfenden Halbjahre
  355. *
  356. * @return true, falls die Schriftlichkeit in den Halbjahren gegeben ist, sonst false
  357. */
  358. public pruefeBelegungMitSchriftlichkeit(fachbelegung : AbiturFachbelegung | null, schriftlichkeit : GostSchriftlichkeit, ...halbjahre : Array<GostHalbjahr>) : boolean {
  359. if (fachbelegung === null)
  360. return false;
  361. if ((halbjahre === null) || (halbjahre.length === 0))
  362. return true;
  363. for (let halbjahr of halbjahre)
  364. if (!this.pruefeBelegungMitSchriftlichkeitEinzeln(fachbelegung, schriftlichkeit, halbjahr))
  365. return false;
  366. return true;
  367. }
  368. /**
  369. * Prüft, ob eine Belegung des Faches in den angegebenen Halbjahren nicht der angegebenen Schriftlichkeit entspricht.
  370. * Ist die Fachbelegung null, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  371. * angegeben, so ist die Prüfung erfolgreich, da kein Halbjahr geprüft werden muss.
  372. *
  373. * @param fachbelegung die zu prüfende Fachnbelegung
  374. * @param schriftlichkeit die zu prüfende Schriftlichkeit
  375. * @param halbjahre die zu prüfenden Halbjahre
  376. *
  377. * @return true, falls die Schriftlichkeit in den Halbjahren nicht gegeben ist, sonst false
  378. */
  379. public pruefeBelegungErfuelltNicht(fachbelegung : AbiturFachbelegung | null, schriftlichkeit : GostSchriftlichkeit, ...halbjahre : Array<GostHalbjahr>) : boolean {
  380. if (fachbelegung === null)
  381. return false;
  382. if ((halbjahre === null) || (halbjahre.length === 0))
  383. return true;
  384. for (let halbjahr of halbjahre) {
  385. let belegungHalbjahr : AbiturFachbelegungHalbjahr | null = fachbelegung.belegungen[halbjahr.id];
  386. if ((belegungHalbjahr === null) || ((schriftlichkeit as unknown !== GostSchriftlichkeit.BELIEBIG as unknown) && (((schriftlichkeit as unknown === GostSchriftlichkeit.SCHRIFTLICH as unknown) && (!belegungHalbjahr.schriftlich)) || ((schriftlichkeit as unknown === GostSchriftlichkeit.MUENDLICH as unknown) && (belegungHalbjahr.schriftlich)))))
  387. return true;
  388. }
  389. return false;
  390. }
  391. /**
  392. * Prüft, ob eine Belegung des Faches in den angegebenen Halbjahren nicht der angegebenen Schriftlichkeit entspricht,
  393. * sofern es in dem Halbjahr überhaupt belegt wurde..
  394. * Ist die Fachbelegung null, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  395. * angegeben, so ist die Prüfung erfolgreich, da kein Halbjahr geprüft werden muss.
  396. *
  397. * @param fachbelegung die zu prüfende Fachnbelegung
  398. * @param schriftlichkeit die zu prüfende Schriftlichkeit
  399. * @param halbjahre die zu prüfenden Halbjahre
  400. *
  401. * @return true, falls die Schriftlichkeit in den Halbjahren nicht gegeben ist, sonst false
  402. */
  403. public pruefeBelegungErfuelltNichtFallsBelegt(fachbelegung : AbiturFachbelegung | null, schriftlichkeit : GostSchriftlichkeit, ...halbjahre : Array<GostHalbjahr>) : boolean {
  404. if (fachbelegung === null)
  405. return false;
  406. if ((halbjahre === null) || (halbjahre.length === 0))
  407. return true;
  408. for (let halbjahr of halbjahre) {
  409. let belegungHalbjahr : AbiturFachbelegungHalbjahr | null = fachbelegung.belegungen[halbjahr.id];
  410. if (belegungHalbjahr === null)
  411. continue;
  412. let schriftlich : Boolean = belegungHalbjahr.schriftlich === null ? false : belegungHalbjahr.schriftlich;
  413. if (((schriftlichkeit as unknown !== GostSchriftlichkeit.BELIEBIG as unknown) && (((schriftlichkeit as unknown === GostSchriftlichkeit.SCHRIFTLICH as unknown) && (!schriftlich)) || ((schriftlichkeit as unknown === GostSchriftlichkeit.MUENDLICH as unknown) && (schriftlich)))))
  414. return true;
  415. }
  416. return false;
  417. }
  418. /**
  419. * Prüft, ob die Belegung des Faches in den angegebenen Halbjahren mindestens einmal die angegebene Schritflichkeit hat.
  420. * Ist die Fachbelegung null, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  421. * angegeben, so ist die Prüfung nicht erfolgreich, da kein Halbjahr geprüft werden muss und somit die Schriftlichkeit nicht
  422. * einmal existiert.
  423. *
  424. * @param fachbelegung die zu prüfende Fachbelegung
  425. * @param schriftlichkeit die zu prüfende Schriftlichkeit
  426. * @param halbjahre die zu prüfenden Halbjahre
  427. *
  428. * @return true, falls die angegebene Schriftlichkeit mindestens einmal in den Halbjahren gegeben ist, sonst false
  429. */
  430. public pruefeBelegungHatMindestensEinmalSchriftlichkeit(fachbelegung : AbiturFachbelegung | null, schriftlichkeit : GostSchriftlichkeit, ...halbjahre : Array<GostHalbjahr>) : boolean {
  431. if (fachbelegung === null)
  432. return false;
  433. if ((halbjahre === null) || (halbjahre.length === 0))
  434. return false;
  435. for (let halbjahr of halbjahre) {
  436. let belegungHalbjahr : AbiturFachbelegungHalbjahr | null = fachbelegung.belegungen[halbjahr.id];
  437. if (belegungHalbjahr === null)
  438. continue;
  439. if ((schriftlichkeit.istSchriftlich === null) || (schriftlichkeit.istSchriftlich as unknown === belegungHalbjahr.schriftlich as unknown))
  440. return true;
  441. }
  442. return false;
  443. }
  444. /**
  445. * Prüft, ob eine Fachbelegung existiert, welche in den angegebenen Halbjahren mindestens einmal die angegebene
  446. * Schritflichkeit hat.
  447. * Ist die Fachbelegung null, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  448. * angegeben, so ist die Prüfung nicht erfolgreich, da kein Halbjahr geprüft werden muss und somit die Schriftlichkeit nicht
  449. * einmal existiert.
  450. *
  451. * @param fachbelegungen die zu prüfenden Fachbelegungen
  452. * @param schriftlichkeit die zu prüfende Schriftlichkeit
  453. * @param halbjahre die zu prüfenden Halbjahre
  454. *
  455. * @return true, falls die angegebene Schriftlichkeit bei einer Fachbelegung mindestens einmal in den Halbjahren gegeben ist, sonst false
  456. */
  457. public pruefeBelegungExistiertHatMindestensEinmalSchriftlichkeit(fachbelegungen : List<AbiturFachbelegung> | null, schriftlichkeit : GostSchriftlichkeit, ...halbjahre : Array<GostHalbjahr>) : boolean {
  458. if ((fachbelegungen === null) || (fachbelegungen.size() <= 0))
  459. return false;
  460. if ((halbjahre === null) || (halbjahre.length === 0))
  461. return false;
  462. for (let fachbelegung of fachbelegungen)
  463. if (this.pruefeBelegungHatMindestensEinmalSchriftlichkeit(fachbelegung, schriftlichkeit, ...halbjahre))
  464. return true;
  465. return false;
  466. }
  467. /**
  468. * Prüft, ob die Belegung eines der angegebenen Fächer mit den angegebenen Halbjahren existiert.
  469. * Ist keine Fachbelegung gegeben, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  470. * angegeben, so ist die Prüfung erfolgreich, da kein Halbjahr geprüft werden muss.
  471. * In dieser Methode wird ggf. auch geprüft, ob weitere Fachbelegungen existieren, welche das gleiche
  472. * Statistik-Kürzel haben und Ersatzweise eine Halbjahres-Belegung ersetzen können. Dies ist z.B. bei bilingualen
  473. * Fächern nötig oder bei der Unterscheidung von Sport-Profilen.
  474. *
  475. * @param fachbelegungen die zu prüfenden Fachnbelegungen
  476. * @param halbjahre die zu prüfenden Halbjahre
  477. *
  478. * @return true, falls eine Fachbelegung mit den Halbjahren existiert, sonst false
  479. */
  480. public pruefeBelegungExistiert(fachbelegungen : List<AbiturFachbelegung> | null, ...halbjahre : Array<GostHalbjahr>) : boolean {
  481. if (fachbelegungen === null)
  482. return false;
  483. if ((halbjahre === null) || (halbjahre.length === 0))
  484. return true;
  485. for (let fachbelegung of fachbelegungen) {
  486. let fach : GostFach | null = this.gostFaecher.get(fachbelegung.fachID);
  487. if (fach === null)
  488. continue;
  489. let alleBelegungen : List<AbiturFachbelegung> | null = this.getFachbelegungByFachkuerzel(fach.kuerzel);
  490. if ((alleBelegungen === null) || (alleBelegungen.size() === 0))
  491. continue;
  492. let hatBelegung : boolean = true;
  493. for (let halbjahr of halbjahre) {
  494. let hatHalbjahresBelegung : boolean = false;
  495. for (let aktFachbelegung of alleBelegungen) {
  496. if (aktFachbelegung.belegungen[halbjahr.id] !== null) {
  497. hatHalbjahresBelegung = true;
  498. break;
  499. }
  500. }
  501. if (!hatHalbjahresBelegung) {
  502. hatBelegung = false;
  503. break;
  504. }
  505. }
  506. if (hatBelegung)
  507. return true;
  508. }
  509. return false;
  510. }
  511. /**
  512. * Prüft, ob die Belegung eines der angegebenen Fächer mit dem angegebenen Halbjahr existiert.
  513. * Ist keine Fachbelegung gegeben, so schlägt die Prüfung fehl.
  514. * In dieser Methode wird ggf. auch geprüft, ob weitere Fachbelegungen existieren, welche das gleiche
  515. * Statistik-Kürzel haben und Ersatzweise eine Halbjahres-Belegung ersetzen können. Dies ist z.B. bei bilingualen
  516. * Fächern nötig oder bei der Unterscheidung von Sport-Profilen.
  517. *
  518. * @param fachbelegungen die zu prüfenden Fachnbelegungen
  519. * @param halbjahr das zu prüfende Halbjahr
  520. *
  521. * @return true, falls eine Fachbelegung mit dem Halbjahr existiert, sonst false
  522. */
  523. public pruefeBelegungExistiertEinzeln(fachbelegungen : List<AbiturFachbelegung> | null, halbjahr : GostHalbjahr) : boolean {
  524. if (fachbelegungen === null)
  525. return false;
  526. for (let fachbelegung of fachbelegungen) {
  527. let fach : GostFach | null = this.gostFaecher.get(fachbelegung.fachID);
  528. if (fach === null)
  529. continue;
  530. let alleBelegungen : List<AbiturFachbelegung> | null = this.getFachbelegungByFachkuerzel(fach.kuerzel);
  531. if ((alleBelegungen === null) || (alleBelegungen.size() === 0))
  532. continue;
  533. for (let aktFachbelegung of alleBelegungen)
  534. if (aktFachbelegung.belegungen[halbjahr.id] !== null)
  535. return true;
  536. }
  537. return false;
  538. }
  539. /**
  540. * Prüft, ob die Belegung eines der angegebenen Fächer mit einer durchgängigen Belegung existiert,
  541. * die zumindest in der Q1 und der Q2.1 schriftlich ist.
  542. * In dieser Methode wird ggf. auch geprüft, ob weitere Fachbelegungen existieren, welche das gleiche
  543. * Statistik-Kürzel haben und Ersatzweise eine Halbjahres-Belegung ersetzen können. Dies ist bei bilingualen
  544. * Fächern nötig.
  545. * Ist keine Fachbelegung gegeben, so schlägt die Prüfung fehl.
  546. *
  547. * @param fachbelegungen die zu prüfenden Fachnbelegungen
  548. *
  549. * @return true, falls eine durchgehend schriftliche Fachbelegung existiert, sonst false
  550. */
  551. public pruefeBelegungExistiertDurchgehendSchriftlich(fachbelegungen : List<AbiturFachbelegung> | null) : boolean {
  552. if (fachbelegungen === null)
  553. return false;
  554. for (let fachbelegung of fachbelegungen) {
  555. let fach : GostFach | null = this.gostFaecher.get(fachbelegung.fachID);
  556. if (fach === null)
  557. continue;
  558. let alleBelegungen : List<AbiturFachbelegung> | null = this.getFachbelegungByFachkuerzel(fach.kuerzel);
  559. if ((alleBelegungen === null) || (alleBelegungen.size() === 0))
  560. continue;
  561. let hatBelegung : boolean = true;
  562. for (let halbjahr of GostHalbjahr.values()) {
  563. let hatHalbjahresBelegung : boolean = false;
  564. for (let aktFachbelegung of alleBelegungen) {
  565. if (aktFachbelegung.belegungen[halbjahr.id] !== null) {
  566. let belegungHalbjahr : AbiturFachbelegungHalbjahr | null = aktFachbelegung.belegungen[halbjahr.id];
  567. if (((halbjahr as unknown !== GostHalbjahr.Q11 as unknown) && (halbjahr as unknown !== GostHalbjahr.Q12 as unknown) && (halbjahr as unknown !== GostHalbjahr.Q21 as unknown)) || ((belegungHalbjahr !== null) && (belegungHalbjahr.schriftlich !== null) && (belegungHalbjahr.schriftlich)))
  568. hatHalbjahresBelegung = true;
  569. }
  570. }
  571. if (!hatHalbjahresBelegung) {
  572. hatBelegung = false;
  573. break;
  574. }
  575. }
  576. if (hatBelegung)
  577. return true;
  578. }
  579. return false;
  580. }
  581. /**
  582. * Prüft, ob die Belegung eines der angegebenen Fächer in dem angegebenen Halbjahr der angegebenen Schriftlichkeit entspricht.
  583. * Ist keine Fachbelegung gegeben, so schlägt die Prüfung fehl.
  584. *
  585. * @param fachbelegungen die zu prüfenden Fachnbelegungen
  586. * @param schriftlichkeit die zu prüfende Schriftlichkeit
  587. * @param halbjahr das zu prüfende Halbjahr
  588. *
  589. * @return true, falls bei einer Fachbelegung die Schriftlichkeit in dem Halbjahr gegeben ist, sonst false
  590. */
  591. public pruefeBelegungExistiertMitSchriftlichkeitEinzeln(fachbelegungen : List<AbiturFachbelegung | null> | null, schriftlichkeit : GostSchriftlichkeit, halbjahr : GostHalbjahr) : boolean {
  592. if (fachbelegungen === null)
  593. return false;
  594. for (let fachbelegung of fachbelegungen) {
  595. if (this.pruefeBelegungMitSchriftlichkeitEinzeln(fachbelegung, schriftlichkeit, halbjahr))
  596. return true;
  597. }
  598. return false;
  599. }
  600. /**
  601. * Prüft, ob die Belegung eines der angegebenen Fächer in den angegebenen Halbjahren der angegebenen Schriftlichkeit entspricht.
  602. * Ist keine Fachbelegung gegeben, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  603. * angegeben, so ist die Prüfung erfolgreich, da kein Halbjahr geprüft werden muss.
  604. *
  605. * @param fachbelegungen die zu prüfenden Fachnbelegungen
  606. * @param schriftlichkeit die zu prüfende Schriftlichkeit
  607. * @param halbjahre die zu prüfenden Halbjahre
  608. *
  609. * @return true, falls bei einer Fachbelegung die Schriftlichkeit in den Halbjahren gegeben ist, sonst false
  610. */
  611. public pruefeBelegungExistiertMitSchriftlichkeit(fachbelegungen : List<AbiturFachbelegung> | null, schriftlichkeit : GostSchriftlichkeit, ...halbjahre : Array<GostHalbjahr>) : boolean {
  612. if (fachbelegungen === null)
  613. return false;
  614. for (let fachbelegung of fachbelegungen) {
  615. if (this.pruefeBelegungMitSchriftlichkeit(fachbelegung, schriftlichkeit, ...halbjahre))
  616. return true;
  617. }
  618. return false;
  619. }
  620. /**
  621. * Prüft, ob die Belegung eines der angegebenen Fächer in den angegebenen Halbjahren mindestens einmal die angegebene Kursart
  622. * hat. Ist keine Fachbelegung gegeben, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  623. * angegeben, so ist die Prüfung erfolgreich, da kein Halbjahr geprüft werden muss.
  624. *
  625. * @param fachbelegungen die zu prüfenden Fachnbelegungen
  626. * @param kursart die zu prüfende Kursart
  627. * @param halbjahre die zu prüfenden Halbjahre
  628. *
  629. * @return true, falls die Kursart bei einer Fachbelegung mindestens einmal in den Halbjahren gegeben ist, sonst false
  630. */
  631. public pruefeBelegungExistiertHatMindestensEinmalKursart(fachbelegungen : List<AbiturFachbelegung> | null, kursart : GostKursart, ...halbjahre : Array<GostHalbjahr>) : boolean {
  632. if (fachbelegungen === null)
  633. return false;
  634. for (let fachbelegung of fachbelegungen) {
  635. if (this.pruefeBelegungHatMindestensEinmalKursart(fachbelegung, kursart, ...halbjahre))
  636. return true;
  637. }
  638. return false;
  639. }
  640. /**
  641. * Prüft, ob die Belegung eines der angegebenen Fächer in den angegebenen Halbjahren existiert,
  642. * bei welchem in mind. einem der Halbjahren die angebene Schriftlichkeit nicht gegeben ist.
  643. * Ist keine Fachbelegung gegeben, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  644. * angegeben, so ist die Prüfung erfolgreich, da kein Halbjahr geprüft werden muss.
  645. *
  646. * @param fachbelegungen die zu prüfenden Fachnbelegungen
  647. * @param schriftlichkeit die zu prüfende Schriftlichkeit
  648. * @param halbjahre die zu prüfenden Halbjahre
  649. *
  650. * @return true oder false (siehe oben)
  651. */
  652. public pruefeBelegungExistiertErfuelltNicht(fachbelegungen : List<AbiturFachbelegung> | null, schriftlichkeit : GostSchriftlichkeit, ...halbjahre : Array<GostHalbjahr>) : boolean {
  653. if (fachbelegungen === null)
  654. return false;
  655. for (let fachbelegung of fachbelegungen) {
  656. if (this.pruefeBelegungErfuelltNicht(fachbelegung, schriftlichkeit, ...halbjahre))
  657. return true;
  658. }
  659. return false;
  660. }
  661. /**
  662. * Prüft, ob die Belegung eines der angegebenen Fächer in den angegebenen Halbjahren existiert,
  663. * bei welchem in mind. einem der Halbjahren die angebene Schriftlichkeit nicht gegeben ist, sofern
  664. * das Fach überhaupt belegt wurde.
  665. * Ist keine Fachbelegung gegeben, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  666. * angegeben, so ist die Prüfung erfolgreich, da kein Halbjahr geprüft werden muss.
  667. *
  668. * @param fachbelegungen die zu prüfenden Fachnbelegungen
  669. * @param schriftlichkeit die zu prüfende Schriftlichkeit
  670. * @param halbjahre die zu prüfenden Halbjahre
  671. *
  672. * @return true oder false (siehe oben)
  673. */
  674. public pruefeBelegungExistiertErfuelltNichtFallsBelegt(fachbelegungen : List<AbiturFachbelegung> | null, schriftlichkeit : GostSchriftlichkeit, ...halbjahre : Array<GostHalbjahr>) : boolean {
  675. if (fachbelegungen === null)
  676. return false;
  677. for (let fachbelegung of fachbelegungen) {
  678. if (this.pruefeBelegungErfuelltNichtFallsBelegt(fachbelegung, schriftlichkeit, ...halbjahre))
  679. return true;
  680. }
  681. return false;
  682. }
  683. /**
  684. * Prüft, ob die Belegung des Faches in den angegebenen Halbjahren der angegebenen Schriftlichkeit entspricht
  685. * und das Fach durchgehend belegbar ist.
  686. * Ist die Fachbelegung null, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  687. * angegeben, so ist die Prüfung erfolgreich, da kein Halbjahr geprüft werden muss.
  688. *
  689. * @param fachbelegung die zu prüfende Fachnbelegung
  690. * @param schriftlichkeit die zu prüfende Schriftlichkeit
  691. * @param halbjahre die zu prüfenden Halbjahre
  692. *
  693. * @return true, falls die Schriftlichkeit in den Halbjahren gegeben ist, sonst false
  694. */
  695. public pruefeBelegungDurchgehendBelegbar(fachbelegung : AbiturFachbelegung | null, schriftlichkeit : GostSchriftlichkeit, ...halbjahre : Array<GostHalbjahr>) : boolean {
  696. if (fachbelegung === null)
  697. return false;
  698. if (!GostFachManager.istDurchgehendBelegbarBisQ22(this.getFach(fachbelegung)))
  699. return false;
  700. return this.pruefeBelegungMitSchriftlichkeit(fachbelegung, schriftlichkeit, ...halbjahre);
  701. }
  702. /**
  703. * Prüft, ob die Belegung eines der angegebenen Fächer in den angegebenen Halbjahren der angegebenen Schriftlichkeit entspricht
  704. * und das Fach durchgängig belegbar ist.
  705. * Ist keine Fachbelegung gegeben, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  706. * angegeben, so ist die Prüfung erfolgreich, da kein Halbjahr geprüft werden muss.
  707. *
  708. * @param fachbelegungen die zu prüfenden Fachnbelegungen
  709. * @param schriftlichkeit die zu prüfende Schriftlichkeit
  710. * @param halbjahre die zu prüfenden Halbjahre
  711. *
  712. * @return true, falls bei einer Fachbelegung die Schriftlichkeit in den Halbjahren gegeben ist, sonst false
  713. */
  714. public pruefeBelegungDurchgehendBelegbarExistiert(fachbelegungen : List<AbiturFachbelegung> | null, schriftlichkeit : GostSchriftlichkeit, ...halbjahre : Array<GostHalbjahr>) : boolean {
  715. if (fachbelegungen === null)
  716. return false;
  717. for (let fachbelegung of fachbelegungen) {
  718. if (this.pruefeBelegungDurchgehendBelegbar(fachbelegung, schriftlichkeit, ...halbjahre))
  719. return true;
  720. }
  721. return false;
  722. }
  723. /**
  724. * Prüft, ob die Belegung eines der angegebenen Fächer in den angegebenen Halbjahren der angegebenen Schriftlichkeit entspricht
  725. * und das Fach durchgängig belegt ist.
  726. * Ist keine Fachbelegung gegeben, so schlägt die Prüfung fehl. Wird bei einer gültigen Fachbelegung kein Halbjahr
  727. * angegeben, so ist die Prüfung erfolgreich sofern das Fach durchgängig belegt wurde, da kein Halbjahr auf die
  728. * Schriftlichkeit geprüft werden muss.
  729. *
  730. * @param fachbelegungen die zu prüfenden Fachnbelegungen
  731. * @param schriftlichkeit die zu prüfende Schriftlichkeit
  732. * @param halbjahre die zu prüfenden Halbjahre
  733. *
  734. * @return true, falls bei eine Fachbelegung durchgängig belegt wurde und die Schriftlichkeit in den Halbjahren gegeben ist, sonst false
  735. */
  736. public pruefeBelegungDurchgehendBelegtExistiert(fachbelegungen : List<AbiturFachbelegung> | null, schriftlichkeit : GostSchriftlichkeit, ...halbjahre : Array<GostHalbjahr>) : boolean {
  737. if (fachbelegungen === null)
  738. return false;
  739. for (let fachbelegung of fachbelegungen) {
  740. if (this.pruefeBelegung(fachbelegung, GostHalbjahr.EF1, GostHalbjahr.EF2, GostHalbjahr.Q11, GostHalbjahr.Q12, GostHalbjahr.Q21, GostHalbjahr.Q22))
  741. if (this.pruefeBelegungMitSchriftlichkeit(fachbelegung, schriftlichkeit, ...halbjahre))
  742. return true;
  743. }
  744. return false;
  745. }
  746. /**
  747. * Prüft, ob die Fachbelegung in mindestens einem der Halbjahre die angegebene Kursart aufweist.
  748. * Existiert die Fachbelegung nicht (null), so kommt die Kursart auch nicht vor.
  749. *
  750. * @param fachbelegung die Fachbelegung
  751. * @param kursart die Kursart
  752. *
  753. * @return true, falls mindestens einmal die Kursart belegt wurde, sonst false
  754. */
  755. public pruefeAufKursart(fachbelegung : AbiturFachbelegung | null, kursart : GostKursart) : boolean {
  756. if (fachbelegung === null)
  757. return false;
  758. for (let belegunghalbjahr of fachbelegung.belegungen) {
  759. if ((belegunghalbjahr !== null) && GostKursart.fromKuerzel(belegunghalbjahr.kursartKuerzel) as unknown === kursart as unknown)
  760. return true;
  761. }
  762. return false;
  763. }
  764. /**
  765. * Filtert die Fachbelegungen und gibt nur die Fachbelegungen zurück, bei denen die
  766. * Kursart existiert.
  767. * Wird keine Fachbelegung übergeben (null oder leere Liste), so kommt auch keine
  768. * Belegung mit der Kursart vor.
  769. *
  770. * @param fachbelegungen die Fachbelegungen
  771. * @param kursart die Kursart
  772. *
  773. * @return eine Liste mit den Fachbelegungen, welche die kursart haben
  774. */
  775. public filterBelegungKursartExistiert(fachbelegungen : List<AbiturFachbelegung> | null, kursart : GostKursart) : List<AbiturFachbelegung> {
  776. let result : Vector<AbiturFachbelegung> = new Vector();
  777. if ((fachbelegungen === null) || (fachbelegungen.size() <= 0))
  778. return result;
  779. for (let fachbelegung of fachbelegungen) {
  780. if (this.pruefeAufKursart(fachbelegung, kursart))
  781. result.add(fachbelegung);
  782. }
  783. return result;
  784. }
  785. /**
  786. * Prüft, ob die Fachbelegung eine durchgängige Belegung hat. Zusatzkurse können nicht für eine
  787. * durchgängige Belegung zählen.
  788. *
  789. * @param fachbelegung die zu prüfende Fachbelegung
  790. *
  791. * @return true, wenn die Belegung durchgängig ist.
  792. */
  793. public pruefeDurchgaengigkeit(fachbelegung : AbiturFachbelegung | null) : boolean {
  794. if ((fachbelegung === null) || (this.pruefeAufKursart(fachbelegung, GostKursart.ZK)))
  795. return false;
  796. return this.pruefeBelegung(fachbelegung, GostHalbjahr.EF1, GostHalbjahr.EF2, GostHalbjahr.Q11, GostHalbjahr.Q12, GostHalbjahr.Q21, GostHalbjahr.Q22);
  797. }
  798. /**
  799. * Zählt die Fachbelegungen, welche eine durchgängige Belegung aufweisen. Zusatzkurse zählen
  800. * nicht für eine durchgängige Belegung.
  801. * In dieser Methode wird ggf. auch geprüft, ob weitere Fachbelegungen existieren, welche das gleiche
  802. * Statistik-Kürzel haben und Ersatzweise eine Halbjahres-Belegung ersetzen können. Dies ist bei bilingualen
  803. * Fächern nötig.
  804. *
  805. * @param fachbelegungen die zu überprüfenden Fachbelegungen
  806. *
  807. * @return die Anzahl der durchgängigen Belegungen
  808. */
  809. public zaehleDurchgaengigeBelegungen(fachbelegungen : List<AbiturFachbelegung> | null) : number {
  810. if (fachbelegungen === null)
  811. return 0;
  812. let anzahl : number = 0;
  813. for (let fachbelegung of fachbelegungen) {
  814. let fach : GostFach | null = this.gostFaecher.get(fachbelegung.fachID);
  815. if (fach === null)
  816. continue;
  817. if (fachbelegung.belegungen[GostHalbjahr.EF1.id] === null)
  818. continue;
  819. let alleBelegungen : List<AbiturFachbelegung> | null = this.getFachbelegungByFachkuerzel(fach.kuerzel);
  820. if ((alleBelegungen === null) || (alleBelegungen.size() === 0))
  821. continue;
  822. let hatBelegung : boolean = true;
  823. let halbjahre : Array<GostHalbjahr> = [GostHalbjahr.EF1, GostHalbjahr.Q11, GostHalbjahr.Q12, GostHalbjahr.Q21, GostHalbjahr.Q22];
  824. for (let halbjahr of halbjahre) {
  825. let hatHalbjahresBelegung : boolean = false;
  826. for (let aktFachbelegung of alleBelegungen) {
  827. if (aktFachbelegung.belegungen[halbjahr.id] !== null) {
  828. hatHalbjahresBelegung = true;
  829. break;
  830. }
  831. }
  832. if (!hatHalbjahresBelegung) {
  833. hatBelegung = false;
  834. break;
  835. }
  836. }
  837. if (hatBelegung)
  838. anzahl++;
  839. }
  840. return anzahl;
  841. }
  842. /**
  843. * Prüft, ob die Fachbelegung eine durchgängige Belegung hat und prüft die Schriftlichkeit
  844. * in der Qualifikationsphase. Ein Fach in der Qualifikationsphase gilt als Schriftlich belegt,
  845. * sofern die ersten 3 Halbjahre der Qualifikationsphase schriftlich belegt wurden.
  846. * - Zusatzkurse können nicht für eine durchgängige Belegung zählen.
  847. *
  848. * @param fachbelegung die zu prüfende die zu überprüfenden Fachbelegung
  849. *
  850. * @return true, wenn die Belegung durchgängig ist und die Schriftlichkeit den Anforderungen genügt.
  851. */
  852. public pruefeDurchgaengigkeitSchriftlich(fachbelegung : AbiturFachbelegung | null) : boolean {
  853. if (!this.pruefeDurchgaengigkeit(fachbelegung))
  854. return false;
  855. return this.pruefeBelegungMitSchriftlichkeit(fachbelegung, GostSchriftlichkeit.SCHRIFTLICH, GostHalbjahr.Q11, GostHalbjahr.Q12, GostHalbjahr.Q21);
  856. }
  857. /**
  858. * Prüft, ob unter den angegebenen Fachbelegungen ein Fach als Abiturfach von einem der angegebenen Arten
  859. * gewählt wurde. Wird keine Art angebeben, so wird jede Fachbelegung akzeptiert und true zurückgegeben.
  860. *
  861. * @param fachbelegungen die Fachbelegungen
  862. * @param arten die Arten der Abiturfächer
  863. *
  864. * @return true, falls unter den Fachbelegungen mindestens ein Fach als Abiturfach von einem der
  865. * angegebenen Arten gewählt wurde und false sonst
  866. */
  867. public pruefeExistiertAbiFach(fachbelegungen : List<AbiturFachbelegung> | null, ...arten : Array<GostAbiturFach>) : boolean {
  868. if ((arten === null) || (arten.length === 0))
  869. return true;
  870. if (fachbelegungen === null)
  871. return false;
  872. for (let fachbelegung of fachbelegungen)
  873. for (let art of arten) {
  874. let abiturFach : GostAbiturFach | null = GostAbiturFach.fromID(fachbelegung.abiturFach);
  875. if (abiturFach as unknown === art as unknown)
  876. return true;
  877. }
  878. return false;
  879. }
  880. /**
  881. * Prüft anhand des Statistik-Kürzels, ob in dem angegebenen Halbjahr eine doppelte Fachbelegung
  882. * vorliegt oder nicht. Bei den Fremdsprachen werden nur unterschiedliche Fremdsprachen in einem Halbjahr
  883. * akzeptiert und es dürfen mehrere Vertiefungsfächer (VX) in einem Halbjahr vorkommen.
  884. *
  885. * @param halbjahr das zu prüfende Halbjahr
  886. *
  887. * @return true, falls eine doppelte Belegung vorliegt, sonst false
  888. */
  889. public hatDoppelteFachbelegungInHalbjahr(halbjahr : GostHalbjahr) : boolean {
  890. let set : HashSet<String> = new HashSet();
  891. let fachbelegungen : Vector<AbiturFachbelegung> = this.abidaten.fachbelegungen;
  892. for (let fb of fachbelegungen) {
  893. let fach : GostFach | null = this.getFach(fb);
  894. if (fach === null)
  895. continue;
  896. let belegung : AbiturFachbelegungHalbjahr | null = this.getBelegungHalbjahr(fb, halbjahr, GostSchriftlichkeit.BELIEBIG);
  897. if (belegung === null)
  898. continue;
  899. let kuerzel : String | null = GostFachManager.getFremdsprache(fach);
  900. if (kuerzel === null)
  901. kuerzel = fach.kuerzel === null ? "" : fach.kuerzel;
  902. if (!set.add(kuerzel) && (!JavaObject.equalsTranspiler("VX", (kuerzel))))
  903. return true;
  904. }
  905. return false;
  906. }
  907. /**
  908. * Prüft anhand des Statistik-Kürzels, ob in einem der angegebenen Halbjahre eine doppelte Fachbelegung
  909. * vorliegt oder nicht. Bei den Fremdsprachen werden nur unterschiedliche Fremdsprachen in einem Halbjahr
  910. * akzeptiert und es dürfen mehrere Vertiefungsfächer (VX) in einem Halbjahr vorkommen.
  911. *
  912. * @param halbjahre die zu prüfenden Halbjahre
  913. *
  914. * @return true, falls eine doppelte Belegung vorliegt, sonst false
  915. */
  916. public hatDoppelteFachbelegung(...halbjahre : Array<GostHalbjahr>) : boolean {
  917. if ((halbjahre === null) || (halbjahre.length === 0))
  918. return false;
  919. for (let halbjahr of halbjahre)
  920. if (this.hatDoppelteFachbelegungInHalbjahr(halbjahr))
  921. return true;
  922. return false;
  923. }
  924. /**
  925. * Gibt zurück, ob der Projektkurs als besondere Lernleistung verwendet wird.
  926. *
  927. * @return true, falls der Projektkurs als besondere Lernleistung verwendet wird
  928. */
  929. public istProjektKursBesondereLernleistung() : boolean {
  930. return (GostBesondereLernleistung.PROJEKTKURS.is(this.abidaten.besondereLernleistung));
  931. }
  932. /**
  933. * Bestimmt die erste Fachbelegung mit dem angegebenen Statistik-Kürzel
  934. *
  935. * @param kuerzel das Kürzel des Faches, kann null sein (dann wird auch null zurückgegeben)
  936. *
  937. * @return die Fachbelegung oder null, falls keine vorhanden ist
  938. */
  939. public getFachbelegungByKuerzel(kuerzel : String | null) : AbiturFachbelegung | null {
  940. if ((kuerzel === null) || (JavaObject.equalsTranspiler("", (kuerzel))))
  941. return null;
  942. let fachbelegungen : Vector<AbiturFachbelegung> = this.abidaten.fachbelegungen;
  943. for (let fb of fachbelegungen) {
  944. let fach : GostFach | null = this.getFach(fb);
  945. if ((fach !== null) && (JavaObject.equalsTranspiler(kuerzel, (fach.kuerzel))))
  946. return fb;
  947. }
  948. return null;
  949. }
  950. /**
  951. * Liefert alle Fachbelegungen der Abiturdaten, welche den angegebenen Fachbereichen zuzuordnen sind.
  952. * Wird kein Fachbereich angegeben, so werden alle Fachbelegungen der Abiturdaten zurückgegeben.
  953. *
  954. * @param fachbereiche die Fachbereiche
  955. *
  956. * @return eine Liste der Fachbelegungen aus den Fachbereichen
  957. */
  958. public getFachbelegungen(...fachbereiche : Array<GostFachbereich>) : List<AbiturFachbelegung> {
  959. if ((fachbereiche === null) || (fachbereiche.length === 0))
  960. return this.abidaten.fachbelegungen;
  961. let result : Vector<AbiturFachbelegung> = new Vector();
  962. for (let fachbereich of fachbereiche) {
  963. let fachbelegungen : List<AbiturFachbelegung> | null = this.mapFachbereiche.get(fachbereich);
  964. if (fachbelegungen === null)
  965. continue;
  966. result.addAll(fachbelegungen);
  967. }
  968. return result;
  969. }
  970. /**
  971. * Liefert alle Fachbelegungen, die bilingual unterrichtet wurden.
  972. *
  973. * @return eine Liste der Fachbelegungen
  974. */
  975. public getFachbelegungenBilingual() : List<AbiturFachbelegung> {
  976. let result : Vector<AbiturFachbelegung> = new Vector();
  977. let fachbelegungen : Vector<AbiturFachbelegung> = this.abidaten.fachbelegungen;
  978. for (let fb of fachbelegungen) {
  979. if (this.zaehleBelegung(fb) <= 0)
  980. continue;
  981. let fach : GostFach | null = this.getFach(fb);
  982. if ((fach !== null) && (!GostFachbereich.FREMDSPRACHE.hat(fach)) && (!GostFachbereich.DEUTSCH.hat(fach)) && (fach.biliSprache !== null) && (!JavaObject.equalsTranspiler("D", (fach.biliSprache))))
  983. result.add(fb);
  984. }
  985. return result;
  986. }
  987. /**
  988. * Filtert die Fachbelegungen auf neu einsetzende Fremdsprachen.
  989. *
  990. * @param fachbelegungen die zu filternden Fachbelegungen
  991. *
  992. * @return die gefilterten Fachbelegungen
  993. */
  994. public filterFremdspracheNeuEinsetzend(fachbelegungen : List<AbiturFachbelegung> | null) : List<AbiturFachbelegung> {
  995. if (fachbelegungen === null)
  996. return Collections.emptyList();
  997. let result : Vector<AbiturFachbelegung> = new Vector();
  998. for (let fb of fachbelegungen) {
  999. let fach : GostFach | null = this.getFach(fb);
  1000. if ((fach !== null) && fach.istFremdsprache && fach.istFremdSpracheNeuEinsetzend)
  1001. result.add(fb);
  1002. }
  1003. return result;
  1004. }
  1005. /**
  1006. * Filtert die Fachbelegungen auf fortgeführte Fremdsprachen.
  1007. *
  1008. * @param fachbelegungen die zu filternden Fachbelegungen
  1009. *
  1010. * @return die gefilterten Fachbelegungen
  1011. */
  1012. public filterFremdspracheFortgefuehrt(fachbelegungen : List<AbiturFachbelegung> | null) : List<AbiturFachbelegung> {
  1013. if (fachbelegungen === null)
  1014. return Collections.emptyList();
  1015. let result : Vector<AbiturFachbelegung> = new Vector();
  1016. for (let fb of fachbelegungen) {
  1017. let fach : GostFach | null = this.getFach(fb);
  1018. if ((fach !== null) && fach.istFremdsprache && !fach.istFremdSpracheNeuEinsetzend)
  1019. result.add(fb);
  1020. }
  1021. return result;
  1022. }
  1023. /**
  1024. * Filtert die Fachbelegungen danach, ob sie durchgehend belegbar sind
  1025. *
  1026. * @param fachbelegungen die zu filternden Fachbelegungen
  1027. *
  1028. * @return die gefilterten Fachbelegungen
  1029. */
  1030. public filterDurchgehendBelegbar(fachbelegungen : List<AbiturFachbelegung> | null) : List<AbiturFachbelegung> {
  1031. let result : Vector<AbiturFachbelegung> = new Vector();
  1032. if (fachbelegungen === null)
  1033. return result;
  1034. for (let fb of fachbelegungen) {
  1035. let fach : GostFach | null = this.getFach(fb);
  1036. if (GostFachManager.istDurchgehendBelegbarBisQ22(fach))
  1037. result.add(fb);
  1038. }
  1039. return result;
  1040. }
  1041. /**
  1042. * Filtert die Fachbelegungen. Es werden nur Fachbelegungen behalten, die in den angegebenen Halbjahren eine Belegung aufweisen.
  1043. * Wird kein Halbjahr angegeben, so wird nichts gefiltert, da kein Halbjahr geprüft werden muss.
  1044. *
  1045. * @param fachbelegungen die zu filternden Fachbelegungen
  1046. * @param halbjahre die Halbjahre, die belegt sein müssen
  1047. *
  1048. * @return die gefilterten Fachbelegungen
  1049. */
  1050. public filterBelegungen(fachbelegungen : List<AbiturFachbelegung> | null, ...halbjahre : Array<GostHalbjahr>) : List<AbiturFachbelegung> {
  1051. if (fachbelegungen === null)
  1052. return Collections.emptyList();
  1053. let result : Vector<AbiturFachbelegung> = new Vector();
  1054. for (let fb of fachbelegungen) {
  1055. if (this.pruefeBelegung(fb, ...halbjahre))
  1056. result.add(fb);
  1057. }
  1058. return result;
  1059. }
  1060. /**
  1061. * Diese Methode zählt die Anzahl der angegebenen Fachbelegungen, welche in allen
  1062. * Halbjahren belegt sind. Dabei werden Fachbelegungen, welche dem gleichem Statistik-Fach
  1063. * zuzuordnen sind zusammengefasst. Dies ist bei der Abwahl von bilingualen Sachfächern
  1064. * relevant.
  1065. *
  1066. * @param fachbelegungen die zu zählenden Fachbelegungen
  1067. *
  1068. * @return die Anzahl der Fachbelegungen
  1069. */
  1070. public zaehleBelegungenDurchgaengig(fachbelegungen : List<AbiturFachbelegung> | null) : number {
  1071. if (fachbelegungen === null)
  1072. return 0;
  1073. let faecher : HashSet<ZulaessigesFach> = new HashSet();
  1074. for (let fb of fachbelegungen) {
  1075. let fach : GostFach | null = this.gostFaecher.get(fb.fachID);
  1076. if (fach === null)
  1077. continue;
  1078. let zulFach : ZulaessigesFach = ZulaessigesFach.getByKuerzelASD(fach.kuerzel);
  1079. if (zulFach as unknown !== ZulaessigesFach.DEFAULT as unknown)
  1080. faecher.add(zulFach);
  1081. }
  1082. let count : number = 0;
  1083. for (let zulFach of faecher) {
  1084. let vorhanden : boolean = true;
  1085. for (let halbjahr of GostHalbjahr.values()) {
  1086. let belegung_vorhanden : boolean = false;
  1087. for (let fb of fachbelegungen) {
  1088. let fbFach : GostFach | null = this.gostFaecher.get(fb.fachID);
  1089. if (fbFach === null)
  1090. continue;
  1091. let fbZulFach : ZulaessigesFach = ZulaessigesFach.getByKuerzelASD(fbFach.kuerzel);
  1092. if ((zulFach as unknown === fbZulFach as unknown) && (fb.belegungen[halbjahr.id] !== null)) {
  1093. belegung_vorhanden = true;
  1094. break;
  1095. }
  1096. }
  1097. if (!belegung_vorhanden) {
  1098. vorhanden = false;
  1099. break;
  1100. }
  1101. }
  1102. if (vorhanden)
  1103. count++;
  1104. }
  1105. return count;
  1106. }
  1107. /**
  1108. * Diese Methode zählt die Anzahl der angegebenen Fachbelegungen, welche in allen
  1109. * Halbjahren belegt sind. Dabei werden Fachbelegungen, welche dem gleichem Statistik-Fach
  1110. * zuzuordnen sind zusammengefasst. Dies ist bei der Abwahl von bilingualen Sachfächern
  1111. * relevant.
  1112. *
  1113. * @param fachbelegungen die zu zählenden Fachbelegungen
  1114. *
  1115. * @return die Anzahl der Fachbelegungen
  1116. */
  1117. public zaehleBelegungenDurchgaengigSchriftlichInQPhase(fachbelegungen : List<AbiturFachbelegung> | null) : number {
  1118. if (fachbelegungen === null)
  1119. return 0;
  1120. let faecher : HashSet<ZulaessigesFach> = new HashSet();
  1121. for (let fb of fachbelegungen) {
  1122. let fach : GostFach | null = this.gostFaecher.get(fb.fachID);
  1123. if (fach === null)
  1124. continue;
  1125. let zulFach : ZulaessigesFach = ZulaessigesFach.getByKuerzelASD(fach.kuerzel);
  1126. if (zulFach as unknown !== ZulaessigesFach.DEFAULT as unknown)
  1127. faecher.add(zulFach);
  1128. }
  1129. let count : number = 0;
  1130. for (let zulFach of faecher) {
  1131. let vorhanden : boolean = true;
  1132. for (let halbjahr of GostHalbjahr.values()) {
  1133. let belegung_vorhanden : boolean = false;
  1134. for (let fb of fachbelegungen) {
  1135. let fbFach : GostFach | null = this.gostFaecher.get(fb.fachID);
  1136. if (fbFach === null)
  1137. continue;
  1138. let fbZulFach : ZulaessigesFach = ZulaessigesFach.getByKuerzelASD(fbFach.kuerzel);
  1139. if (zulFach as unknown === fbZulFach as unknown) {
  1140. let belegung : AbiturFachbelegungHalbjahr | null = fb.belegungen[halbjahr.id];
  1141. if (belegung !== null) {
  1142. let istSchriftlichkeitOK : boolean = true;
  1143. if (((halbjahr as unknown === GostHalbjahr.Q11 as unknown) || (halbjahr as unknown === GostHalbjahr.Q12 as unknown) || (halbjahr as unknown === GostHalbjahr.Q21 as unknown)) && ((belegung.schriftlich === null) || (!belegung.schriftlich)))
  1144. istSchriftlichkeitOK = false;
  1145. if (istSchriftlichkeitOK) {
  1146. belegung_vorhanden = true;
  1147. break;
  1148. }
  1149. }
  1150. }
  1151. }
  1152. if (!belegung_vorhanden) {
  1153. vorhanden = false;
  1154. break;
  1155. }
  1156. }
  1157. if (vorhanden)
  1158. count++;
  1159. }
  1160. return count;
  1161. }
  1162. /**
  1163. * Filtert die Fachbelegungen. Es werden nur Belegungen behalten, die in den angegebenen Halbjahren die geforderte Schriftlichkeit aufweisen.
  1164. * Wird kein Halbjahr angegeben, so wird nichts gefiltert, da kein Halbjahr geprüft werden muss.
  1165. *
  1166. * @param fachbelegungen die zu filternden Fachbelegungen
  1167. * @param schriftlichkeit die geforderte Schriftlichkeit
  1168. * @param halbjahre die Halbjahre, die belegt sein müssen
  1169. *
  1170. * @return die gefilterten Fachbelegungen
  1171. */
  1172. public filterBelegungenMitSchriftlichkeit(fachbelegungen : List<AbiturFachbelegung> | null, schriftlichkeit : GostSchriftlichkeit, ...halbjahre : Array<GostHalbjahr>) : List<AbiturFachbelegung> {
  1173. if (fachbelegungen === null)
  1174. return Collections.emptyList();
  1175. let result : Vector<AbiturFachbelegung> = new Vector();
  1176. for (let fb of fachbelegungen) {
  1177. if (this.pruefeBelegungMitSchriftlichkeit(fb, schriftlichkeit, ...halbjahre))
  1178. result.add(fb);
  1179. }
  1180. return result;
  1181. }
  1182. /**
  1183. * Liefert die erste Fachbelegung für den Fachbereich - sofern eine existiert
  1184. *
  1185. * @param fachbereich der Fachbereich
  1186. *
  1187. * @return die Fachbelegung oder null
  1188. */
  1189. public getFachbelegung(fachbereich : GostFachbereich) : AbiturFachbelegung | null {
  1190. let faecher : Vector<AbiturFachbelegung | null> | null = this.mapFachbereiche.get(fachbereich);
  1191. if ((faecher === null) || (faecher.size() === 0))
  1192. return null;
  1193. return faecher.get(0);
  1194. }
  1195. /**
  1196. * Liefert alle Fachbelegungen mit dem angegebenen Statistk-Kürzel des Faches
  1197. *
  1198. * @param kuerzel das Kürzel des Faches
  1199. *
  1200. * @return eine Liste mit den Fachbelegungen
  1201. */
  1202. public getFachbelegungByFachkuerzel(kuerzel : String | null) : List<AbiturFachbelegung> {
  1203. let fachbelegungen : Vector<AbiturFachbelegung> = new Vector();
  1204. if (kuerzel === null)
  1205. return fachbelegungen;
  1206. let tmpFachbelegungen : Vector<AbiturFachbelegung> = this.abidaten.fachbelegungen;
  1207. for (let fachbelegung of tmpFachbelegungen) {
  1208. let fach : GostFach | null = this.gostFaecher.get(fachbelegung.fachID);
  1209. if ((fach === null) || (!JavaObject.equalsTranspiler(kuerzel, (fach.kuerzel))))
  1210. continue;
  1211. fachbelegungen.add(fachbelegung);
  1212. }
  1213. return fachbelegungen;
  1214. }
  1215. /**
  1216. * Prüft, ob der Kurs in dem angegebenen Halbjahr mit der angegebenen Schriftlichkeit belegt ist
  1217. * und gibt ggf. die Belegung zurück.
  1218. *
  1219. * @param fachbelegung die Abiturfachbelegung aus welcher die Belegungsinformationen für das Halbjahr entnommen wird
  1220. * @param halbjahr das Halbjahr, in welchem die Belegung gesucht wird.
  1221. * @param schriftlich gibt an, ob das Fach schriftlich oder mündlich belegt sein muss
  1222. *
  1223. * @return die Belegungsinformationen zu dem Fach
  1224. */
  1225. public getBelegungHalbjahr(fachbelegung : AbiturFachbelegung, halbjahr : GostHalbjahr, schriftlich : GostSchriftlichkeit) : AbiturFachbelegungHalbjahr | null {
  1226. let belegung : AbiturFachbelegungHalbjahr | null = fachbelegung.belegungen[halbjahr.id];
  1227. return ((belegung !== null) && ((schriftlich as unknown === GostSchriftlichkeit.BELIEBIG as unknown) || ((schriftlich as unknown === GostSchriftlichkeit.SCHRIFTLICH as unknown) && (belegung.schriftlich)) || ((schriftlich as unknown === GostSchriftlichkeit.MUENDLICH as unknown) && (!belegung.schriftlich)))) ? belegung : null;
  1228. }
  1229. /**
  1230. * Liefert die erste Sprachbelegung - sofern eine existiert
  1231. *
  1232. * @param sprache das einstellige Kürzel der Sprache
  1233. *
  1234. * @return die Fachbelegung für die Sprache
  1235. */
  1236. public getSprachbelegung(sprache : String | null) : AbiturFachbelegung | null {
  1237. if (sprache === null)
  1238. return null;
  1239. let fachbelegungen : Vector<AbiturFachbelegung> = this.abidaten.fachbelegungen;
  1240. for (let fb of fachbelegungen) {
  1241. let fach : GostFach | null = this.getFach(fb);
  1242. if ((fach === null) || (!GostFachManager.istFremdsprachenfach(fach, sprache)))
  1243. continue;
  1244. if (JavaObject.equalsTranspiler(sprache, (GostFachManager.getFremdsprache(fach))))
  1245. return fb;
  1246. }
  1247. return null;
  1248. }
  1249. /**
  1250. * Liefert für die übergebene Fachbelegung die Halbjahre, in denen das Fach mit einer der angebenen
  1251. * Kursarten belegt wurde. Ist keine Kursart angegeben, so werden die Halbjahre aller Belegungen
  1252. * zurückgegeben. Ist keine Fachbelegung angegeben, so wird eine leere Liste zurückgegeben.
  1253. *
  1254. * @param fachbelegung die Fachbelegung
  1255. * @param kursarten die Kursarten
  1256. *
  1257. * @return eine Liste der Halbjahre in den das Fach mit einer der Kursarten belegt wurde
  1258. */
  1259. public getHalbjahreKursart(fachbelegung : AbiturFachbelegung | null, ...kursarten : Array<GostKursart>) : Vector<GostHalbjahr> {
  1260. let halbjahre : Vector<GostHalbjahr> = new Vector();
  1261. if (fachbelegung !== null) {
  1262. for (let belegungHalbjahr of fachbelegung.belegungen) {
  1263. if (belegungHalbjahr === null)
  1264. continue;
  1265. let halbjahr : GostHalbjahr | null = GostHalbjahr.fromKuerzel(belegungHalbjahr.halbjahrKuerzel);
  1266. if (halbjahr === null)
  1267. continue;
  1268. if ((kursarten === null) || (kursarten.length === 0)) {
  1269. halbjahre.add(halbjahr);
  1270. continue;
  1271. }
  1272. for (let kursart of kursarten) {
  1273. if (JavaObject.equalsTranspiler(kursart, (GostKursart.fromKuerzel(belegungHalbjahr.kursartKuerzel)))) {
  1274. halbjahre.add(halbjahr);
  1275. break;
  1276. }
  1277. }
  1278. }
  1279. }
  1280. return halbjahre;
  1281. }
  1282. /**
  1283. * Gibt die Sprache des bilingualen Bildungsgang zurück oder null, falls keiner gewählt wurde.
  1284. *
  1285. * @return die Sprache des bilingualen Bildungsgang oder null
  1286. */
  1287. public getBiligualenBildungsgang() : String | null {
  1288. return this.abidaten.bilingualeSprache;
  1289. }
  1290. /**
  1291. * Prüft bei der Sprachenfolge, ob eine laut Sprachenfolge fortgeführte
  1292. * Fremdsprache fehlerhafterweise als neu einsetzende Fremdsprache belegt wurde.
  1293. * Übergebene Fachbelegungen, die keine Fremdsprachen sind werden ignoriert.
  1294. *
  1295. * @param fremdsprachen die zu prüfenden Fachbelegungen
  1296. *
  1297. * @return true, falls eine fortgeführte Fremdsprache bei den übergebenen
  1298. * Fachbelegungen existiert, ansonsten false
  1299. */
  1300. public hatFortgefuehrteFremdspracheInSprachendaten(fremdsprachen : List<AbiturFachbelegung> | null) : boolean {
  1301. if (fremdsprachen === null)
  1302. return false;
  1303. if (this.abidaten.sprachendaten === null)
  1304. return false;
  1305. for (let fs of fremdsprachen) {
  1306. let fach : GostFach | null = this.getFach(fs);
  1307. if ((fach === null) || (!fach.istFremdsprache))
  1308. continue;
  1309. if (SprachendatenManager.istFortfuehrbareSpracheInGOSt(this.abidaten.sprachendaten, GostFachManager.getFremdsprache(fach))) {
  1310. return true;
  1311. }
  1312. }
  1313. return false;
  1314. }
  1315. /**
  1316. * Prüft bei der Sprachenfolge, ob für eine laut Sprachenfolge neu einsetzende
  1317. * Fremdsprache fehlerhafterweise ein Kurs in einer fortgeführten Fremdsprache belegt wurde.
  1318. * Übergebene Fachbelegungen, die keine Fremdsprachen sind werden ignoriert.
  1319. *
  1320. * @param fremdsprachen die zu prüfenden Fachbelegungen
  1321. *
  1322. * @return true, falls eine neu einsetzende Fremdsprache bei den übergebenen
  1323. * Fachbelegungen existiert, ansonsten false
  1324. */
  1325. public hatNeuEinsetzendeFremdspracheInSprachendaten(fremdsprachen : List<AbiturFachbelegung> | null) : boolean {
  1326. if (fremdsprachen === null)
  1327. return false;
  1328. if (this.abidaten.sprachendaten === null)
  1329. return false;
  1330. for (let fs of fremdsprachen) {
  1331. let fach : GostFach | null = this.getFach(fs);
  1332. if ((fach === null) || (!fach.istFremdsprache))
  1333. continue;
  1334. if (!SprachendatenManager.istFortfuehrbareSpracheInGOSt(this.abidaten.sprachendaten, GostFachManager.getFremdsprache(fach))) {
  1335. return true;
  1336. }
  1337. }
  1338. return false;
  1339. }
  1340. /**
  1341. * Gibt an, ob am Ende der EF eine Muttersprachenprüfung geplant bzw. erfolgt ist.
  1342. *
  1343. * @return true, falls eine Muttersprachenprüfung am Ende der EF vorliegt, sonst false
  1344. */
  1345. public hatMuttersprachenPruefungEndeEF() : boolean {
  1346. return this.abidaten.muttersprachenpruefungEndeEF;
  1347. }
  1348. /**
  1349. * Gibt an, ob die zweite Fremdsprache in der Sekundarstufe manuell erfolgreich
  1350. * geprüft wurde und dort eine entsprechende Belegung existiert.
  1351. *
  1352. * @return true, falls in der Sek I eine zweite Fremdsprache belegt wurde
  1353. */
  1354. public istSekIZweiteFremdspracheManuellGeprueft() : boolean {
  1355. return this.abidaten.sek1Fremdsprache2ManuellGeprueft;
  1356. }
  1357. /**
  1358. * Prüft, ob die Belegung seit der EF1 vorhanden ist. Hierbei werden
  1359. * Zusatz-, Vertiefungs- und Projektkurse auch als später einsetzend akzeptiert.
  1360. * Dies gilt auch für Literatur, instrumental- und vokalpraktische Kurse sowie
  1361. * für Religion und Philosophie.
  1362. *
  1363. * @param fachbelegung die Abiturfachbelegungen, die geprüft werden
  1364. *
  1365. * @return true, falls das Fach seit EF1 durchgängig belegt wurde oder eine der Ausnahmen zutrifft, sonsta false
  1366. */
  1367. public istBelegtSeitEF(fachbelegung : AbiturFachbelegung) : boolean {
  1368. let fach : GostFach | null = this.getFach(fachbelegung);
  1369. if (fach === null)
  1370. return false;
  1371. if (GostFachbereich.LITERARISCH_KUENSTLERISCH_ERSATZ.hat(fach))
  1372. return true;
  1373. if (GostFachbereich.RELIGION.hat(fach))
  1374. return true;
  1375. if (JavaObject.equalsTranspiler("PL", (fach.kuerzel)))
  1376. return true;
  1377. for (let belegung of fachbelegung.belegungen) {
  1378. if (belegung === null)
  1379. continue;
  1380. let halbjahr : GostHalbjahr | null = GostHalbjahr.fromKuerzel(belegung.halbjahrKuerzel);
  1381. let kursart : GostKursart | null = GostKursart.fromKuerzel(belegung.kursartKuerzel);
  1382. if ((halbjahr === null) || (kursart === null))
  1383. continue;
  1384. if ((kursart as unknown === GostKursart.ZK as unknown) || (kursart as unknown === GostKursart.PJK as unknown) || (kursart as unknown === GostKursart.VTF as unknown))
  1385. continue;
  1386. let prevHalbjahr : GostHalbjahr | null = halbjahr.previous();
  1387. if (prevHalbjahr === null)
  1388. continue;
  1389. if (fachbelegung.belegungen[prevHalbjahr.id] === null) {
  1390. let alleBelegungen : List<AbiturFachbelegung> | null = this.getFachbelegungByFachkuerzel(fach.kuerzel);
  1391. if ((alleBelegungen === null) || (alleBelegungen.size() <= 1))
  1392. return false;
  1393. if (!this.pruefeBelegungExistiert(alleBelegungen, prevHalbjahr))
  1394. return false;
  1395. }
  1396. }
  1397. return true;
  1398. }
  1399. /**
  1400. * Gibt das Ergebnis der Belegprüfung zurück. Dieses enthält eine Liste der Fehler, die bei der Belegprüfung
  1401. * festgestellt wurden und ob diese erfolgreich gewesen ist oder nicht.
  1402. *
  1403. * @return das Ergebnis der Belegprüfung
  1404. */
  1405. public getBelegpruefungErgebnis() : GostBelegpruefungErgebnis {
  1406. let ergebnis : GostBelegpruefungErgebnis = new GostBelegpruefungErgebnis();
  1407. ergebnis.erfolgreich = this.belegpruefungErfolgreich;
  1408. for (let i : number = 0; i < this.belegpruefungsfehler.size(); i++){
  1409. let fehler : GostBelegungsfehler = this.belegpruefungsfehler.get(i);
  1410. ergebnis.fehlercodes.add(new GostBelegpruefungErgebnisFehler(fehler, this.pruefungsArt));
  1411. }
  1412. return ergebnis;
  1413. }
  1414. isTranspiledInstanceOf(name : string): boolean {
  1415. return ['de.nrw.schule.svws.core.abschluss.gost.AbiturdatenManager'].includes(name);
  1416. }
  1417. }
  1418. export function cast_de_nrw_schule_svws_core_abschluss_gost_AbiturdatenManager(obj : unknown) : AbiturdatenManager {
  1419. return obj as AbiturdatenManager;
  1420. }