Noten.svelte 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <!--
  2. Allgemeine Notentabelle für Berufskollegs, die z.B. die etwas langtextigen
  3. Lernfeldfächer unterstützt oder verschiedene Abschlussnoten.
  4. Folgende Attribute werden unterstützt:
  5. lernfeld: Sorgt dafür, dass die Klasse `fach-bezeichnung` nicht gesetzt wird und
  6. Fächer dementsprechend nicht eingerückt werden (nur Lernfeldfächer)
  7. true|false Standardwert false
  8. noten: Hier können Abschnittsnoten oder Abschlussnoten gesetzt werden, z.B.
  9. hj.noten oder s.bk_abschluss_faecher oder s.fhr_abschluss_faecher
  10. Muss gesetzt werden
  11. fachGliederungen: sollten mitgegeben werden, wenn die für verschiedene Bildungsgänge
  12. geänderten Werte berücksichtigt werden sollen, z.B. andere Bezeichnungen
  13. in den verschiedenen Bildungsgängen
  14. ger: Wenn ein Referenzniveau für die Fremdsprachen angegeben werden soll
  15. true|false, Standardwert false,
  16. fachklasse: muss mitgegeben werden, wenn aus der Fachklassen.json Datei der Standard-
  17. Wert gelesen werden soll. Ansonsten über Lernentw festlegen, was eigetragen wird
  18. faechergruppenIds: legt fest, welche Fächergruppen gezogen werden sollen. Standartwert ist
  19. ein leerer Array, d.h. alle Fächergruppen werden gezogen. Ansonsten können
  20. nur bestimmte festgelegt werden z.B. [10, 20, 30]
  21. fhrSternchen: Legt fest, ob die für die FHR relevanten Fächer ein Sternchen
  22. bekommen. Standardwert ist false
  23. gruppenbezeichnungNeu: Legt für eine GruppenID eine neue Gruppenbezeichnung fest
  24. Es wird ein Objekt erwartet, z.B. {40: 'Fachpraktische Prüfung'}
  25. berufsbezogenZuerst: Diese Einstellung legt fest, dass die gen. Fächer zuerst auf
  26. dem Zeugnis als Fächergruppe erscheinen wie in der BASS vorgegeben.
  27. -->
  28. <table class="table-noten">
  29. {#each faechergruppen as [gruppen_id, gruppenFaecher]}
  30. <tr>
  31. <td class="fachgruppe-margin">
  32. <b>{gruppenbezeichnung(gruppen_id)}</b>
  33. </td>
  34. </tr>
  35. {#each lernbereicheUndFaecher(gruppenFaecher) as [lernbereich, faecher]}
  36. {#if lernbereich != faecher[0].fach.Zeugnisbez}
  37. <tr><td colspan="2" class="{lernfeld ? '' : 'fach-bezeichnung'}">{lernbereich}</td></tr>
  38. {/if}
  39. {#each faecher as f (f.ID)}
  40. {#if f.fach.AufZeugnis === '+'}
  41. <tr>
  42. <td class="{lernfeld ? '' : 'fach-bezeichnung'} {lernbereich != faecher[0].fach.Zeugnisbez ? 'lernfeld-lernbereich' : ''}" style="display: inline-flex">
  43. {#if f.fach.Zeugnisbez.startsWith("Projekt")}
  44. <!-- Funktioniert nicht mit Abschlussnoten, da diese keine Spalte `Lernentw` haben -->
  45. {f.Lernentw}
  46. {:else}
  47. <!-- Die Zeugnisbezeichnung hat bei gesetzten fachGliederungen einen anderen Namen... -->
  48. {f.fach.ZeugnisBez || f.fach.Zeugnisbez}
  49. <!-- Ist ger gesetzt, unter Lernentw nach Eintrag schauen. Wenn dort nichts steht,
  50. in der Fachklassen.json nach Einträgen für Fremdsprache und Fach_ID suchen
  51. Mit der Fussnote 1 muss natürlich auch tatsächlich eine Fussnote zum GER existieren … -->
  52. {#if ger && f.fach.IstSprache === '+'}
  53. {fremdsprache(f, fachklasse)}<sup>1</sup>
  54. {/if}
  55. <!-- Die für die FHR Durchschnittsnote einbezogenen Noten bekommen in
  56. den FS-Zeugnissen ein Sternchen -->
  57. {#if fhrSternchen && f.fach.GewichtungFHR > 0}
  58. <sup>*</sup>
  59. {/if}
  60. {/if}
  61. </td>
  62. <!-- Entweder Abschlussnote, wenn gesetzt oder Abschnittsnote oder nix -->
  63. <!-- Wenn als Note eines der 'Teilgenommen' steht, dann ohne graue Hinterlegung.
  64. Außer es ist eine Sprache, dann wird es wohl ein 'teilgenommen' sein,
  65. das auf eine Fremdsprachenprüfung hinweist und nicht mit den anderen
  66. Fächern im Diff-Bereich steht. Optisch besser. -->
  67. {#if (f.fach.IstSprache==='-') && (f.NoteAbschluss?.toUpperCase().startsWith('E') || f.NotenKrz?.toUpperCase().startsWith('E'))}
  68. <td class="td-fach-note"><span class="e-note">{note(f.NoteAbschluss) || note(f.NotenKrz)}</span></td>
  69. {:else}
  70. <td class="td-fach-note"><span>{note(f.NoteAbschluss) || note(f.NotenKrz) || '–––––'}</span></td>
  71. {/if}
  72. </tr>
  73. {/if}
  74. {/each}
  75. {/each}
  76. <tr>
  77. </tr>
  78. {/each}
  79. </table>
  80. <script>
  81. import { gruppenIds } from './gruppenIDs'
  82. import { note, fremdsprache, groupBy } from '../helfer'
  83. export let lernfeld
  84. export let ger = false
  85. export let faechergruppenIds = []
  86. export let noten, fachGliederungen, fachklasse
  87. export let fhrSternchen, gruppenbezeichnungNeu
  88. export let berufsbezogenZuerst = true
  89. let faechergruppen
  90. // Berechne die Noten neu, wenn sich die Notenquelle ändert
  91. $: noten && faechergruppen_calc()
  92. Object.assign(gruppenIds, gruppenbezeichnungNeu)
  93. const faechergruppen_calc = () => {
  94. // noten werden im jeweiligen Dokument über das *noten*-Attribut mitgegeben.
  95. // z.B. die Abschnittsnote oder die Noten aus *s.bk_abschluss_faecher* und co.
  96. // Nutzer über Konsole auf Änderungen in den Fächern hinweisen
  97. if (fachGliederungen && fachGliederungen.length > 0) console.log('Es wurden Fachgliederungswerte gesetzt: ', fachGliederungen)
  98. // suche in den fachGliederungen, ob für die jeweilige Fachklasse was besonderes festgelegt wurde
  99. // vorausgesetzt, fachGliederungen wurde mitgegeben
  100. const faecher = fachGliederungen
  101. ? noten.map(f => {return {...f, fach: Object.assign(f.fach, fachGliederungen.find(fg => fg.Fach_ID === f.Fach_ID))}})
  102. : noten
  103. // nun alle Fächer rauswerfen, die nicht in den FaechergruppenIds zugeordnet sind, z.B. Abschlussarbeiten, Projekte etc.
  104. const faecherBereinigt = faechergruppenIds.length === 0
  105. ? faecher
  106. : faecher.filter(f => faechergruppenIds.find(id => f.fach.Fachgruppe_ID === id))
  107. // erstmal alle Fächer sortieren in der passenden Reihenfolge,
  108. // dann nach Fachgruppe gruppieren
  109. const sortiert = faecherBereinigt.sort((a, b) => a.fach.SortierungS2 < b.fach.SortierungS2 ? 1 : -1)
  110. let gruppiert = groupBy(sortiert, 'fach.Fachgruppe_ID')
  111. // Die BK-Zeugnisse führen zuerst die berufsbezogenen Fächer auf.
  112. // D.h. Gruppen_ID 20 muss auf 0 gesetzt werden, damit es an den Anfang kommt
  113. if (berufsbezogenZuerst && gruppiert.get(20)) {
  114. gruppiert.set(0, gruppiert.get(20))
  115. gruppiert.delete(20)
  116. gruppenIds[0] = gruppenIds[20]
  117. }
  118. faechergruppen = [...gruppiert.entries()].sort((a,b) => a[0] - b[0])
  119. }
  120. const gruppenbezeichnung = gruppe => gruppenIds[gruppe]
  121. const lernbereicheUndFaecher = gruppenFaecher => [...groupBy(gruppenFaecher, 'fach.Bezeichnung').entries()].reverse()
  122. </script>
  123. <style>
  124. .table-noten {
  125. width: 100%;
  126. border: none;
  127. border-collapse: collapse;
  128. margin-bottom: 1rem;
  129. }
  130. .fach-bezeichnung {
  131. padding-left: 10mm;
  132. }
  133. .td-fach-note {
  134. padding-bottom: .2rem;
  135. padding-top: .2rem;
  136. width: 12rem;
  137. }
  138. .td-fach-note span {
  139. background-color: #dcdcdc !important;
  140. text-align: center;
  141. width: 10rem;
  142. display: block;
  143. margin: 0 auto;
  144. }
  145. .td-fach-note span.e-note {
  146. background-color: white !important;
  147. width: 17em;
  148. margin: 0;
  149. padding: 0;
  150. }
  151. .fachgruppe-margin {
  152. padding-top: 0.3rem;
  153. }
  154. .lernfeld-lernbereich {
  155. padding-left: 2rem;
  156. padding-bottom: .5rem;
  157. }
  158. </style>