ServiceAbschlussMSA.js 25 KB

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