ServiceAbschlussMSA.ts 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. import { JavaObject, cast_java_lang_Object } from '../../../java/lang/JavaObject';
  2. import { GEAbschlussFach, cast_de_nrw_schule_svws_core_data_abschluss_GEAbschlussFach } from '../../../core/data/abschluss/GEAbschlussFach';
  3. import { Service, cast_de_nrw_schule_svws_core_Service } from '../../../core/Service';
  4. import { JavaString, cast_java_lang_String } from '../../../java/lang/JavaString';
  5. import { GELeistungsdifferenzierteKursart, cast_de_nrw_schule_svws_core_types_ge_GELeistungsdifferenzierteKursart } from '../../../core/types/ge/GELeistungsdifferenzierteKursart';
  6. import { LogLevel, cast_de_nrw_schule_svws_logger_LogLevel } from '../../../logger/LogLevel';
  7. import { Predicate, cast_java_util_function_Predicate } from '../../../java/util/function/Predicate';
  8. import { AbschlussFaecherGruppe, cast_de_nrw_schule_svws_core_abschluss_ge_AbschlussFaecherGruppe } from '../../../core/abschluss/ge/AbschlussFaecherGruppe';
  9. import { GEAbschlussFaecher, cast_de_nrw_schule_svws_core_data_abschluss_GEAbschlussFaecher } from '../../../core/data/abschluss/GEAbschlussFaecher';
  10. import { AbschlussErgebnis, cast_de_nrw_schule_svws_core_data_abschluss_AbschlussErgebnis } from '../../../core/data/abschluss/AbschlussErgebnis';
  11. import { NullPointerException, cast_java_lang_NullPointerException } from '../../../java/lang/NullPointerException';
  12. import { List, cast_java_util_List } from '../../../java/util/List';
  13. import { Arrays, cast_java_util_Arrays } from '../../../java/util/Arrays';
  14. import { Abschluss, cast_de_nrw_schule_svws_core_types_Abschluss } from '../../../core/types/Abschluss';
  15. import { Vector, cast_java_util_Vector } from '../../../java/util/Vector';
  16. import { AbschlussManager, cast_de_nrw_schule_svws_core_abschluss_AbschlussManager } from '../../../core/abschluss/AbschlussManager';
  17. import { AbschlussFaecherGruppen, cast_de_nrw_schule_svws_core_abschluss_ge_AbschlussFaecherGruppen } from '../../../core/abschluss/ge/AbschlussFaecherGruppen';
  18. export class ServiceAbschlussMSA extends Service<GEAbschlussFaecher, AbschlussErgebnis> {
  19. private filterDefizite : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => !f.ausgeglichen && ((f.note > 4) || ((GELeistungsdifferenzierteKursart.G.hat(f.kursart)) && (f.note > 3))) };
  20. private filterDefizite1NS : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => !f.ausgeglichen && (((!GELeistungsdifferenzierteKursart.G.hat(f.kursart)) && (f.note === 5)) || ((GELeistungsdifferenzierteKursart.G.hat(f.kursart)) && (f.note === 4))) };
  21. private filterDefizite2NS : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => !f.ausgeglichen && (((!GELeistungsdifferenzierteKursart.G.hat(f.kursart)) && (f.note === 6)) || ((GELeistungsdifferenzierteKursart.G.hat(f.kursart)) && (f.note === 5))) };
  22. private filterDefiziteMehrAls1NS : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => !f.ausgeglichen && (((!GELeistungsdifferenzierteKursart.G.hat(f.kursart)) && (f.note === 6)) || ((GELeistungsdifferenzierteKursart.G.hat(f.kursart)) && (f.note >= 5))) };
  23. private filterDefiziteMehrAls2NS : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => !f.ausgeglichen && ((GELeistungsdifferenzierteKursart.G.hat(f.kursart)) && (f.note === 6)) };
  24. private filterDefiziteMitNPOption : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => !f.ausgeglichen && ((!GELeistungsdifferenzierteKursart.G.hat(f.kursart)) && (f.note === 5)) };
  25. private filterDefizitWP : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => !f.ausgeglichen && (f.note > 4) && JavaString.equalsIgnoreCase("WP", f.kuerzel) };
  26. private filterDefizitNichtWP : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => !f.ausgeglichen && (f.note > 4) || ((GELeistungsdifferenzierteKursart.G.hat(f.kursart)) && (f.note > 3)) && !JavaString.equalsIgnoreCase("WP", f.kuerzel) };
  27. private filterBenoetigte3er : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => !f.ausgleich && (f.note <= 3) && (GELeistungsdifferenzierteKursart.Sonstige.hat(f.kursart)) };
  28. private filterDefiziteBenoetigte3erMitNPOption : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => !f.ausgleich && (f.note === 4) && (GELeistungsdifferenzierteKursart.Sonstige.hat(f.kursart)) };
  29. private filterAusgleiche : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => !f.ausgleich && ((f.note < 3) || ((!GELeistungsdifferenzierteKursart.G.hat(f.kursart)) && (f.note < 4))) };
  30. private filterAusgleiche3er : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => !f.ausgleich && (f.note < 3) };
  31. private filterEKurse : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => (GELeistungsdifferenzierteKursart.E.hat(f.kursart)) };
  32. public constructor() {
  33. super();
  34. }
  35. /**
  36. * Bestimmt anhand der übergebenen Fächer die Zuordnung zu den beiden Fäächergruppen.
  37. *
  38. * @param input die Abschlussfächer
  39. *
  40. * @return die Zuordnung der Abschlussfächer zu beiden Fachgruppen 1 und 2
  41. */
  42. public static getFaechergruppen(input : List<GEAbschlussFach>) : AbschlussFaecherGruppen {
  43. let faecher : AbschlussFaecherGruppen = new AbschlussFaecherGruppen(new AbschlussFaecherGruppe(input, Arrays.asList("D", "M", "E", "WP"), null), new AbschlussFaecherGruppe(input, null, Arrays.asList("D", "M", "E", "WP", "LBNW", "LBAL")));
  44. return faecher;
  45. }
  46. /**
  47. * Führt die Abschlussberechnung anhand der übergebenen Abschlussfächer durch
  48. * und gibt das Berechnungsergebnis zurück.
  49. *
  50. * @param input die Abschlussfächer
  51. *
  52. * @return das Ergebnis der Abschlussberechnung
  53. */
  54. public handle(input : GEAbschlussFaecher) : AbschlussErgebnis {
  55. this.logger.logLn(LogLevel.INFO, "Prüfe MSA:");
  56. this.logger.logLn(LogLevel.DEBUG, "==========");
  57. if ((input.faecher === null) || (!AbschlussManager.pruefeHat4LeistungsdifferenzierteFaecher(input))) {
  58. this.logger.logLn(LogLevel.DEBUG, "______________________________");
  59. this.logger.logLn(LogLevel.DEBUG, " => Fehler: Es wurden nicht genügend leistungsdiffernzierte Fächer gefunden.");
  60. return AbschlussManager.getErgebnis(null, false);
  61. }
  62. if (!AbschlussManager.pruefeKuerzelDuplikate(input)) {
  63. this.logger.logLn(LogLevel.DEBUG, "______________________________");
  64. this.logger.logLn(LogLevel.DEBUG, " => Fehler: Es wurden Fächer mit dem gleichen Kürzel zur Abschlussprüfung übergeben. Dies ist nicht zulässig.");
  65. return AbschlussManager.getErgebnis(null, false);
  66. }
  67. let faecher : AbschlussFaecherGruppen = ServiceAbschlussMSA.getFaechergruppen(input.faecher);
  68. if (!faecher.fg1.istVollstaendig(Arrays.asList("D", "M", "E", "WP"))) {
  69. this.logger.logLn(LogLevel.DEBUG, "______________________________");
  70. this.logger.logLn(LogLevel.DEBUG, " => Fehler: Es wurden nicht alle nötigen Leistungen für die Fächergruppe 1 gefunden.");
  71. return AbschlussManager.getErgebnis(null, false);
  72. }
  73. if (faecher.fg2.isEmpty()) {
  74. this.logger.logLn(LogLevel.DEBUG, "______________________________");
  75. this.logger.logLn(LogLevel.DEBUG, " => Fehler: Keine Leistungen für die Fächergruppe 2 gefunden.");
  76. return AbschlussManager.getErgebnis(null, false);
  77. }
  78. let anzahlEKurse : number = faecher.getFaecherAnzahl(this.filterEKurse);
  79. if (anzahlEKurse < 2) {
  80. this.logger.logLn(LogLevel.DEBUG, "______________________________");
  81. this.logger.logLn(LogLevel.INFO, " => kein MSA (FOR) - nicht genügend E-Kurse belegt");
  82. return AbschlussManager.getErgebnis(Abschluss.MSA, false);
  83. } else
  84. if (anzahlEKurse > 2) {
  85. let zuviel : number = anzahlEKurse - 2;
  86. let eKursFG2 : GEAbschlussFach | null = faecher.fg2.getFach(this.filterEKurse);
  87. if (eKursFG2 !== null) {
  88. let note : number = eKursFG2.note;
  89. let note_neu : number = (note === 1) ? 1 : note - 1;
  90. this.logger.logLn(LogLevel.DEBUG, " " + eKursFG2.kuerzel + ":(E)" + note + "->(G)" + note_neu);
  91. eKursFG2.note = note_neu;
  92. eKursFG2.kursart = GELeistungsdifferenzierteKursart.G.kuerzel;
  93. zuviel--;
  94. }
  95. while (zuviel > 0) {
  96. let eKursFG1 : GEAbschlussFach | null = faecher.fg1.getFach(this.filterEKurse);
  97. if (eKursFG1 !== null) {
  98. let note : number = eKursFG1.note;
  99. let note_neu : number = (note === 1) ? 1 : note - 1;
  100. this.logger.logLn(LogLevel.DEBUG, " " + eKursFG1.kuerzel + ":(E)" + note + "->(G)" + note_neu);
  101. eKursFG1.note = note_neu;
  102. eKursFG1.kursart = GELeistungsdifferenzierteKursart.G.kuerzel;
  103. zuviel--;
  104. }
  105. zuviel--;
  106. }
  107. }
  108. this.logger.logLn(LogLevel.DEBUG, " -> FG1: Fächer " + faecher.fg1.toString().valueOf());
  109. this.logger.logLn(LogLevel.DEBUG, " -> FG2: Fächer " + faecher.fg2.toString().valueOf());
  110. let abschlussergebnis : AbschlussErgebnis = this.pruefeDefizite(faecher, "");
  111. if (abschlussergebnis.erworben) {
  112. this.logger.logLn(LogLevel.DEBUG, "______________________________");
  113. this.logger.logLn(LogLevel.INFO, " => MSA (FOR): APO-SI §42 (3)");
  114. } else
  115. if (AbschlussManager.hatNachpruefungsmoeglichkeit(abschlussergebnis)) {
  116. this.logger.logLn(LogLevel.INFO, " => kein MSA (FOR) - Nachprüfungsmöglichkeite(en) in " + AbschlussManager.getNPFaecherString(abschlussergebnis).valueOf());
  117. } else {
  118. this.logger.logLn(LogLevel.INFO, " => kein MSA (FOR) - KEINE Nachprüfungsmöglichkeiten!");
  119. }
  120. return abschlussergebnis;
  121. }
  122. /**
  123. * Prüft in Bezug auf Defizite, ob der Abschluss erworben wurde.
  124. *
  125. * @param faecher die Asbchlussfächer nach Fächergruppen sortiert
  126. * @param log_indent die Einrückung für das Logging
  127. *
  128. * @return das Ergebnis der Abschlussberechnung in Bezug die Defizitberechnung
  129. */
  130. private pruefeDefizite(faecher : AbschlussFaecherGruppen, log_indent : String) : AbschlussErgebnis {
  131. let ignorieren_genutzt : boolean = false;
  132. let ausgleich_genutzt : boolean = false;
  133. let nachpruefung_genutzt : boolean = false;
  134. let npFaecher : List<GEAbschlussFach> = new Vector();
  135. let fg1_defizite : number = faecher.fg1.getFaecherAnzahl(this.filterDefizite);
  136. let fg2_defizite : number = faecher.fg2.getFaecherAnzahl(this.filterDefizite);
  137. let fg1_anzahlAusgleiche : number = faecher.fg1.getFaecherAnzahl(this.filterAusgleiche);
  138. if (fg1_defizite > 0)
  139. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> FG1: Defizit" + (fg1_defizite > 1 ? "e" : "") + ": " + faecher.fg1.getKuerzelListe(this.filterDefizite).valueOf());
  140. if (fg2_defizite > 0)
  141. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> FG2: Defizit" + (fg2_defizite > 1 ? "e" : "") + ": " + faecher.fg2.getKuerzelListe(this.filterDefizite).valueOf());
  142. if (faecher.fg1.getFaecherAnzahl(this.filterDefiziteMehrAls1NS) > 0) {
  143. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> in FG1 unzulässig: mind. 1x6 oder bei einem G-Kurs 1x5");
  144. return AbschlussManager.getErgebnis(Abschluss.MSA, false);
  145. }
  146. if (faecher.fg2.getFaecherAnzahl(this.filterDefiziteMehrAls2NS) > 0) {
  147. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> in FG2 unzulässig: in einem G-Kurs 1x6");
  148. return AbschlussManager.getErgebnis(Abschluss.MSA, false);
  149. }
  150. let sonstige_ungenuegend : List<GEAbschlussFach> = faecher.fg2.getFaecher(this.filterDefizite2NS);
  151. if (sonstige_ungenuegend.size() > 1) {
  152. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> zu viele Defizite, kann nicht mehr als eine Note mit 6 (bzw. 5 bei einem G-Kurs) in FG2 unberücksichtigt lassen");
  153. return AbschlussManager.getErgebnis(Abschluss.MSA, false);
  154. } else
  155. if (sonstige_ungenuegend.size() === 1) {
  156. let defizitFach : GEAbschlussFach = sonstige_ungenuegend.get(0);
  157. if (GELeistungsdifferenzierteKursart.Sonstige.hat(defizitFach.kursart)) {
  158. defizitFach.ausgeglichen = true;
  159. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> unberücksichtigt: Defizit in " + defizitFach.kuerzel + " (2 Notenstufen)");
  160. ignorieren_genutzt = true;
  161. } else
  162. if ((GELeistungsdifferenzierteKursart.E.hat(defizitFach.kursart)) && (defizitFach.note === 6)) {
  163. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> Ein ungenügend in dem E-Kurs " + defizitFach.kuerzel + " kann nicht ausgelichen werden und eine Nachprüfung ist nicht zulässig!");
  164. return AbschlussManager.getErgebnis(Abschluss.MSA, false);
  165. } else {
  166. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> Nachprüfung muss falls möglich in " + defizitFach.kuerzel + " stattfinden!");
  167. nachpruefung_genutzt = true;
  168. npFaecher.add(defizitFach);
  169. defizitFach.note--;
  170. }
  171. }
  172. let wp_defizit : GEAbschlussFach | null = faecher.fg1.getFach(this.filterDefizitWP);
  173. if ((fg1_defizite > 2) || ((fg1_defizite === 2) && (wp_defizit === null)) || ((fg1_defizite === 2) && (fg1_anzahlAusgleiche === 0)) || ((fg1_defizite === 1) && (wp_defizit === null) && (fg1_anzahlAusgleiche === 0))) {
  174. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> zu viele Defizite in FG1");
  175. return AbschlussManager.getErgebnis(Abschluss.MSA, false);
  176. }
  177. if ((fg1_defizite === 2) && (wp_defizit !== null)) {
  178. if (nachpruefung_genutzt) {
  179. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> zu viele Defizite in FG1, eine Nachprüfung in mehreren Fächern (WP, " + sonstige_ungenuegend.get(0).kuerzel + ") ist nicht möglich!");
  180. return AbschlussManager.getErgebnis(Abschluss.MSA, false);
  181. }
  182. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> WP-Defizite in FG1, eine Nachprüfung ist, sofern möglich, in WP nötig!");
  183. npFaecher.add(wp_defizit);
  184. nachpruefung_genutzt = true;
  185. }
  186. if ((fg1_defizite === 2) || ((fg1_defizite === 1) && (wp_defizit === null))) {
  187. ausgleich_genutzt = true;
  188. let defizitFach : GEAbschlussFach | null = faecher.fg1.getFach(this.filterDefizitNichtWP);
  189. if (defizitFach === null)
  190. throw new NullPointerException()
  191. defizitFach.ausgeglichen = true;
  192. let ausgleichsFach : GEAbschlussFach | null = faecher.fg1.getFach(this.filterAusgleiche);
  193. if (ausgleichsFach === null)
  194. throw new NullPointerException()
  195. ausgleichsFach.ausgleich = true;
  196. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> Gleiche das Defizit (FG1) in " + defizitFach.kuerzel + " mit " + ausgleichsFach.kuerzel + " (FG1) aus.");
  197. }
  198. if (((fg1_defizite === 1) && (wp_defizit !== null))) {
  199. let defizitFach : GEAbschlussFach = wp_defizit;
  200. let ausgleichsFach : GEAbschlussFach | null = faecher.fg1.getFach(this.filterAusgleiche);
  201. if (ausgleichsFach !== null) {
  202. ausgleich_genutzt = true;
  203. defizitFach.ausgeglichen = true;
  204. ausgleichsFach.ausgleich = true;
  205. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> Prüfe mit Ausgleich: Gleiche das Defizit (FG1) in " + defizitFach.kuerzel + " mit " + ausgleichsFach.kuerzel + " (FG1) aus. " + defizitFach.kuerzel + " alternativ als Nachprüfungsfach denkbar.");
  206. let abschlussergebnis : AbschlussErgebnis = this.pruefeFG2(faecher, log_indent.valueOf() + " ", npFaecher, 2, ignorieren_genutzt, ausgleich_genutzt, nachpruefung_genutzt);
  207. if (!abschlussergebnis.erworben && abschlussergebnis.npFaecher !== null && AbschlussManager.hatNachpruefungsmoeglichkeit(abschlussergebnis) && wp_defizit.kuerzel !== null)
  208. abschlussergebnis.npFaecher.add(wp_defizit.kuerzel);
  209. return abschlussergebnis;
  210. }
  211. if ((sonstige_ungenuegend.size() === 1) && (!sonstige_ungenuegend.get(0).ausgeglichen)) {
  212. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> das Defizit in WP kann nicht ausgeglichen werden und eine Nachprüfung in mehreren Fächern (WP, " + sonstige_ungenuegend.get(0).kuerzel + ") ist nicht möglich!");
  213. return AbschlussManager.getErgebnis(Abschluss.MSA, false);
  214. }
  215. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> WP-Defizite in FG1 ohne Ausgleichsmöglichkeit, eine Nachprüfung ist, sofern möglich, in WP nötig!");
  216. npFaecher.add(wp_defizit);
  217. nachpruefung_genutzt = true;
  218. }
  219. let abschlussergebnis : AbschlussErgebnis = this.pruefeFG2(faecher, log_indent, npFaecher, 2, ignorieren_genutzt, ausgleich_genutzt, nachpruefung_genutzt);
  220. if ((nachpruefung_genutzt) && abschlussergebnis.erworben)
  221. return AbschlussManager.getErgebnisNachpruefung(Abschluss.MSA, AbschlussManager.getKuerzel(npFaecher));
  222. return abschlussergebnis;
  223. }
  224. /**
  225. * Führt eine Detailprüfung in der Fächergruppe 2 durch. Diese Methode wird ggf. mehrfach - auch rekursiv - aufgerufen.
  226. *
  227. * @param faecher die Abschlussfächer nach Fächergruppen sortiert
  228. * @param log_indent die Einrückung für das Logging
  229. * @param npFaecher die Liste der Nachprüfungsfächer, die bisher schon feststehen
  230. * @param benoetige3er die Anzahl der 3er, die noch in FG2 benötigt werden
  231. * @param ignorieren_genutzt gibt an, ob die Möglichkeit eine defizitäre Leistung in FG2 zu ignorieren schon genutzt wurde
  232. * @param ausgleich_genutzt gibt an, ob die Möglichkeit des Ausgleichs über ein anderes Fach schon genutzt wurde
  233. * @param nachpruefung_genutzt gibt an, ob die Nachprüfungsmöglichkeit bereits eingesetzt werden musste
  234. *
  235. * @return das Ergebnis der Abschlussberechnung in Bezug auf den Stand dieser Detailprüfung
  236. */
  237. private pruefeFG2(faecher : AbschlussFaecherGruppen, log_indent : String, npFaecher : List<GEAbschlussFach>, benoetige3er : number, ignorieren_genutzt : boolean, ausgleich_genutzt : boolean, nachpruefung_genutzt : boolean) : AbschlussErgebnis {
  238. let defizite : List<GEAbschlussFach> = faecher.fg2.getFaecher(this.filterDefizite);
  239. let mangelhaft : List<GEAbschlussFach> = faecher.fg2.getFaecher(this.filterDefizite1NS);
  240. let hat_defizit : boolean = defizite.size() > 0;
  241. let hat_defizit_sonstige_3er : boolean = faecher.fg2.getFaecherAnzahl(this.filterBenoetigte3er) < benoetige3er;
  242. if ((!hat_defizit) && (!hat_defizit_sonstige_3er))
  243. return AbschlussManager.getErgebnis(Abschluss.MSA, true);
  244. if (!ignorieren_genutzt) {
  245. for (let defizitFach of mangelhaft) {
  246. if (!GELeistungsdifferenzierteKursart.Sonstige.hat(defizitFach.kursart))
  247. continue;
  248. defizitFach.ausgeglichen = true;
  249. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> Prüfe: Defizit unberücksichtigt in " + defizitFach.kuerzel);
  250. let abschlussergebnis : AbschlussErgebnis = this.pruefeFG2(faecher, log_indent.valueOf() + " ", npFaecher, benoetige3er, true, ausgleich_genutzt, nachpruefung_genutzt);
  251. if (abschlussergebnis.erworben)
  252. return abschlussergebnis;
  253. defizitFach.ausgeglichen = false;
  254. }
  255. }
  256. if (!ausgleich_genutzt) {
  257. if (hat_defizit_sonstige_3er) {
  258. let ausgleichsFach : GEAbschlussFach | null = faecher.fg2.getFach(this.filterAusgleiche3er);
  259. if (ausgleichsFach === null) {
  260. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> Kein Ausgleich für eine fehlende 3 vorhanden. ");
  261. } else {
  262. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> Prüfe: Ausgleich einer fehlende 3 durch " + ausgleichsFach.kuerzel);
  263. ausgleichsFach.ausgleich = true;
  264. let abschlussergebnis : AbschlussErgebnis = this.pruefeFG2(faecher, log_indent.valueOf() + " ", npFaecher, benoetige3er - 1, ignorieren_genutzt, true, nachpruefung_genutzt);
  265. if (abschlussergebnis.erworben)
  266. return abschlussergebnis;
  267. ausgleichsFach.ausgleich = false;
  268. }
  269. } else {
  270. let ausgleichsFaecher : List<GEAbschlussFach> = faecher.getFaecher(this.filterAusgleiche);
  271. if (ausgleichsFaecher.size() <= benoetige3er) {
  272. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> kann Ausgleichsregelung nicht nutzen, da nicht genügend 3er-Fächer vorhanden sind.");
  273. } else {
  274. let anzahlSonstigeFaecherMind3 : number = faecher.fg2.getFaecherAnzahl(this.filterBenoetigte3er);
  275. for (let defizitFach of defizite) {
  276. for (let ausgleichsFach of ausgleichsFaecher) {
  277. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> Prüfe: Ausgleich von " + defizitFach.kuerzel + " durch " + ausgleichsFach.kuerzel);
  278. if ((GELeistungsdifferenzierteKursart.Sonstige.hat(ausgleichsFach.kursart)) && (anzahlSonstigeFaecherMind3 <= benoetige3er)) {
  279. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> " + ausgleichsFach.kuerzel + " nicht als Ausgleich möglich, da für die Mindestanforderung mind. " + benoetige3er + "x3 benötigt wird, aber nur " + anzahlSonstigeFaecherMind3 + "x3 zur Verfügung steht.");
  280. } else {
  281. defizitFach.ausgeglichen = true;
  282. ausgleichsFach.ausgleich = true;
  283. let abschlussergebnis : AbschlussErgebnis = this.pruefeFG2(faecher, log_indent.valueOf() + " ", npFaecher, benoetige3er, ignorieren_genutzt, true, nachpruefung_genutzt);
  284. if (abschlussergebnis.erworben)
  285. return abschlussergebnis;
  286. defizitFach.ausgeglichen = false;
  287. ausgleichsFach.ausgleich = false;
  288. }
  289. }
  290. }
  291. }
  292. }
  293. }
  294. if (!nachpruefung_genutzt) {
  295. if (hat_defizit_sonstige_3er) {
  296. let npKandidaten : List<GEAbschlussFach> = faecher.fg2.getFaecher(this.filterDefiziteBenoetigte3erMitNPOption);
  297. for (let defizitFach of npKandidaten) {
  298. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> Prüfe: Nachprüfung in " + defizitFach.kuerzel + " auf befriedigend möglich?");
  299. defizitFach.ausgeglichen = true;
  300. defizitFach.note--;
  301. let abschlussergebnis : AbschlussErgebnis = this.pruefeFG2(faecher, log_indent.valueOf() + " ", npFaecher, benoetige3er, ignorieren_genutzt, ausgleich_genutzt, true);
  302. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + (abschlussergebnis.erworben ? " -> Ja!" : " -> Nein!"));
  303. if (abschlussergebnis.erworben)
  304. npFaecher.add(defizitFach);
  305. defizitFach.note++;
  306. defizitFach.ausgeglichen = false;
  307. }
  308. } else {
  309. let npKandidaten : List<GEAbschlussFach> = faecher.fg2.getFaecher(this.filterDefiziteMitNPOption);
  310. for (let defizitFach of npKandidaten) {
  311. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> Prüfe: Nachprüfung in " + defizitFach.kuerzel + " möglich?");
  312. defizitFach.ausgeglichen = true;
  313. defizitFach.note--;
  314. let abschlussergebnis : AbschlussErgebnis = this.pruefeFG2(faecher, log_indent.valueOf() + " ", npFaecher, benoetige3er, ignorieren_genutzt, ausgleich_genutzt, true);
  315. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + (abschlussergebnis.erworben ? " -> Ja!" : " -> Nein!"));
  316. if (abschlussergebnis.erworben)
  317. npFaecher.add(defizitFach);
  318. defizitFach.note++;
  319. defizitFach.ausgeglichen = false;
  320. }
  321. }
  322. }
  323. if ((!nachpruefung_genutzt) && (npFaecher.size() > 0))
  324. return AbschlussManager.getErgebnisNachpruefung(Abschluss.MSA, AbschlussManager.getKuerzel(npFaecher));
  325. return AbschlussManager.getErgebnis(Abschluss.MSA, false);
  326. }
  327. isTranspiledInstanceOf(name : string): boolean {
  328. return ['de.nrw.schule.svws.core.abschluss.ge.ServiceAbschlussMSA', 'de.nrw.schule.svws.core.Service'].includes(name);
  329. }
  330. }
  331. export function cast_de_nrw_schule_svws_core_abschluss_ge_ServiceAbschlussMSA(obj : unknown) : ServiceAbschlussMSA {
  332. return obj as ServiceAbschlussMSA;
  333. }