ServiceAbschlussHA9.ts 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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 { List, cast_java_util_List } from '../../../java/util/List';
  12. import { Arrays, cast_java_util_Arrays } from '../../../java/util/Arrays';
  13. import { Abschluss, cast_de_nrw_schule_svws_core_types_Abschluss } from '../../../core/types/Abschluss';
  14. import { AbschlussManager, cast_de_nrw_schule_svws_core_abschluss_AbschlussManager } from '../../../core/abschluss/AbschlussManager';
  15. import { AbschlussFaecherGruppen, cast_de_nrw_schule_svws_core_abschluss_ge_AbschlussFaecherGruppen } from '../../../core/abschluss/ge/AbschlussFaecherGruppen';
  16. export class ServiceAbschlussHA9 extends Service<GEAbschlussFaecher, AbschlussErgebnis> {
  17. filterDefizit : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => f.note > 4 && (!f.ausgeglichen) };
  18. filterMangelhaft : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => f.note === 5 };
  19. filterUngenuegend : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => f.note === 6 };
  20. filterEKurse : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => (GELeistungsdifferenzierteKursart.E.hat(f.kursart)) };
  21. filterWeitereFremdsprachen : Predicate<GEAbschlussFach> = { test : (f: GEAbschlussFach) => (!JavaObject.equalsTranspiler("E", (f.kuerzel)) && (f.istFremdsprache !== null) && (f.istFremdsprache === true)) };
  22. public constructor() {
  23. super();
  24. }
  25. /**
  26. * Führt die Abschlussberechnung anhand der übergebenen Abschlussfächer durch
  27. * und gibt das Berechnungsergebnis zurück.
  28. *
  29. * @param input die Abschlussfächer
  30. *
  31. * @return das Ergebnis der Abschlussberechnung
  32. */
  33. public handle(input : GEAbschlussFaecher) : AbschlussErgebnis {
  34. if (JavaObject.equalsTranspiler("10", (input.jahrgang))) {
  35. this.logger.logLn(LogLevel.INFO, "Im Jahrgang 10 gibt es keinen HA9-Abschluss mehr.");
  36. return AbschlussManager.getErgebnis(null, false);
  37. }
  38. this.logger.logLn(LogLevel.INFO, "Prüfe HA9:");
  39. this.logger.logLn(LogLevel.DEBUG, "==========");
  40. if ((input.faecher === null) || (!AbschlussManager.pruefeHat4LeistungsdifferenzierteFaecher(input))) {
  41. this.logger.logLn(LogLevel.DEBUG, "______________________________");
  42. this.logger.logLn(LogLevel.DEBUG, " => Fehler: Es wurden nicht genügend leistungsdiffernzierte Fächer gefunden.");
  43. return AbschlussManager.getErgebnis(null, false);
  44. }
  45. if (!AbschlussManager.pruefeKuerzelDuplikate(input)) {
  46. this.logger.logLn(LogLevel.DEBUG, "______________________________");
  47. this.logger.logLn(LogLevel.DEBUG, " => Fehler: Es wurden Fächer mit dem gleichen Kürzel zur Abschlussprüfung übergeben. Dies ist nicht zulässig.");
  48. return AbschlussManager.getErgebnis(null, false);
  49. }
  50. let faecher : AbschlussFaecherGruppen = new AbschlussFaecherGruppen(new AbschlussFaecherGruppe(input.faecher, Arrays.asList("D", "M"), null), new AbschlussFaecherGruppe(input.faecher, null, Arrays.asList("D", "M", "LBNW", "LBAL")));
  51. if (!faecher.fg1.istVollstaendig(Arrays.asList("D", "M"))) {
  52. this.logger.logLn(LogLevel.DEBUG, "______________________________");
  53. this.logger.logLn(LogLevel.DEBUG, " => Fehler: Es wurden nicht alle nötigen Leistungen für die Fächergruppe 1 gefunden.");
  54. return AbschlussManager.getErgebnis(null, false);
  55. }
  56. if (faecher.fg2.isEmpty()) {
  57. this.logger.logLn(LogLevel.DEBUG, "______________________________");
  58. this.logger.logLn(LogLevel.DEBUG, " => Fehler: Keine Leistungen für die Fächergruppe 2 gefunden.");
  59. return AbschlussManager.getErgebnis(null, false);
  60. }
  61. let weitereFS : List<GEAbschlussFach> = faecher.fg2.entferneFaecher(this.filterWeitereFremdsprachen);
  62. if (weitereFS.size() > 0) {
  63. for (let fs of weitereFS) {
  64. if (fs.bezeichnung === null)
  65. continue;
  66. this.logger.logLn(LogLevel.DEBUG, " -> Ignoriere weitere Fremdsprache: " + fs.bezeichnung + "(" + fs.note + ")");
  67. }
  68. }
  69. this.logger.logLn(LogLevel.DEBUG, " - ggf. Verbessern der E-Kurs-Noten für die Defizitberechnung:");
  70. let tmpFaecher : List<GEAbschlussFach> = faecher.getFaecher(this.filterEKurse);
  71. for (let f of tmpFaecher) {
  72. if (f.kuerzel === null)
  73. continue;
  74. let note : number = f.note;
  75. let note_neu : number = (note === 1) ? 1 : note - 1;
  76. this.logger.logLn(LogLevel.DEBUG, " " + f.kuerzel + "(E):" + note + "->" + note_neu);
  77. f.note = note_neu;
  78. }
  79. this.logger.logLn(LogLevel.DEBUG, " -> FG1: Fächer " + faecher.fg1.toString().valueOf());
  80. this.logger.logLn(LogLevel.DEBUG, " -> FG2: Fächer " + faecher.fg2.toString().valueOf());
  81. let abschlussergebnis : AbschlussErgebnis = this.pruefeDefizite(faecher, "");
  82. if (abschlussergebnis.erworben) {
  83. this.logger.logLn(LogLevel.DEBUG, "______________________________");
  84. this.logger.logLn(LogLevel.INFO, " => HA 9: APO-SI §40 (3)");
  85. } else
  86. if (AbschlussManager.hatNachpruefungsmoeglichkeit(abschlussergebnis)) {
  87. this.logger.logLn(LogLevel.INFO, " => kein HA9 - Nachprüfungsmöglichkeite(en) in " + AbschlussManager.getNPFaecherString(abschlussergebnis).valueOf());
  88. } else {
  89. this.logger.logLn(LogLevel.INFO, " => kein HA9 - KEINE Nachprüfungsmöglichkeiten!");
  90. }
  91. return abschlussergebnis;
  92. }
  93. /**
  94. * Prüft in Bezug auf Defizite, ob der Abschluss erworben wurde.
  95. *
  96. * @param faecher die Asbchlussfächer nach Fächergruppen sortiert
  97. * @param log_indent die Einrückung für das Logging
  98. *
  99. * @return das Ergebnis der Abschlussberechnung in Bezug die Defizitberechnung
  100. */
  101. private pruefeDefizite(faecher : AbschlussFaecherGruppen, log_indent : String) : AbschlussErgebnis {
  102. let fg1_defizite : number = faecher.fg1.getFaecherAnzahl(this.filterDefizit);
  103. let fg2_defizite : number = faecher.fg2.getFaecherAnzahl(this.filterDefizit);
  104. let ges_defizite : number = fg1_defizite + fg2_defizite;
  105. let fg1_mangelhaft : number = faecher.fg1.getFaecherAnzahl(this.filterMangelhaft);
  106. let fg1_ungenuegend : number = faecher.fg1.getFaecherAnzahl(this.filterUngenuegend);
  107. let fg2_ungenuegend : number = faecher.fg2.getFaecherAnzahl(this.filterUngenuegend);
  108. if (fg1_defizite > 0)
  109. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> FG1: Defizit" + (fg1_defizite > 1 ? "e" : "") + ": " + faecher.fg1.getKuerzelListe(this.filterDefizit).valueOf());
  110. if (fg2_defizite > 0)
  111. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> FG2: Defizit" + (fg2_defizite > 1 ? "e" : "") + ": " + faecher.fg2.getKuerzelListe(this.filterDefizit).valueOf());
  112. if ((fg1_ungenuegend > 0) || (fg2_ungenuegend > 1)) {
  113. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> zu oft ungenügend (6) - 0x6 in FG1 und max. 1x6 in FG2 erlaubt.");
  114. return AbschlussManager.getErgebnis(Abschluss.HA9, false);
  115. }
  116. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> " + ((fg2_ungenuegend === 1) ? "1x6 in FG2 erlaubt" : "0x6 in FG1 und FG2") + " -> prüfe weitere Defizite");
  117. if (fg1_mangelhaft > 2) {
  118. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> zu viele Defizite: Mehr als 2x5 in FG1");
  119. return AbschlussManager.getErgebnis(Abschluss.HA9, false);
  120. }
  121. if ((fg1_mangelhaft === 2) && (fg2_defizite > 1)) {
  122. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> zu viele Defizite: 2x5 in FG1 und mind. ein weiteres Defizit in FG2");
  123. return AbschlussManager.getErgebnis(Abschluss.HA9, false);
  124. }
  125. if (ges_defizite > 3) {
  126. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> zu viele Defizite: Insgesamt mehr als 3 Defizite");
  127. return AbschlussManager.getErgebnis(Abschluss.HA9, false);
  128. }
  129. let hatNP : boolean = (fg1_mangelhaft === 2) || (ges_defizite === 3);
  130. if (hatNP) {
  131. let np_faecher : List<String> = (fg1_mangelhaft === 2) ? faecher.fg1.getKuerzel(this.filterMangelhaft) : faecher.getKuerzel(this.filterMangelhaft);
  132. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> zu viele Defizite: " + ((fg1_mangelhaft === 2) ? "2x5 in FG1, aber kein weiteres Defizit in FG2" : "3 Defizite nicht erlaubt"));
  133. let abschlussergebnis : AbschlussErgebnis = AbschlussManager.getErgebnisNachpruefung(Abschluss.HA9, np_faecher);
  134. this.logger.logLn(LogLevel.INFO, " -> Nachprüfungsmöglichkeit(en) in " + AbschlussManager.getNPFaecherString(abschlussergebnis).valueOf());
  135. return abschlussergebnis;
  136. }
  137. if ((fg1_defizite === 0) && (fg2_defizite === 0)) {
  138. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> keine Defizite in FG1 und FG2");
  139. return AbschlussManager.getErgebnis(Abschluss.HA9, true);
  140. }
  141. this.logger.logLn(LogLevel.DEBUG, log_indent.valueOf() + " -> zwei Defizite erlaubt (solange nicht beide in FG1)");
  142. return AbschlussManager.getErgebnis(Abschluss.HA9, true);
  143. }
  144. isTranspiledInstanceOf(name : string): boolean {
  145. return ['de.nrw.schule.svws.core.Service', 'de.nrw.schule.svws.core.abschluss.ge.ServiceAbschlussHA9'].includes(name);
  146. }
  147. }
  148. export function cast_de_nrw_schule_svws_core_abschluss_ge_ServiceAbschlussHA9(obj : unknown) : ServiceAbschlussHA9 {
  149. return obj as ServiceAbschlussHA9;
  150. }