Browse Source

rename html svelte III

hmt 4 years ago
parent
commit
2e533f0f97

+ 140 - 0
AHR 1. Konferenz.svelte

@@ -0,0 +1,140 @@
+{#each schueler as s (s.ID)}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4">
+      <div class="header">
+        <Seitenlogo logo="{privat.traegerLogo}"/>
+        <Pageheader logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      </div>
+      <div class="main">
+        <b>Abiturprüfung {hj.Jahr+1}</b><br />Ergebnis der 1. Konferenz des allgemeinen Prüfungsausschusses
+        <br />{s.anrede} <b>{s.Vorname} {s.Zusatz || ''} {s.Name}</b>
+        <Voffset v="0.5"/>
+        <table class="table table-bordered table-eng">
+          <tr>
+            <td rowspan="3" width="40px">Abitur- fach</td>
+            <td rowspan="3">Fach – In der Reihenfolge der erlassenen Stundentafel</td>
+            <td colspan="4">Leistungsbewertung in den Halbjahren der Qualifikationsphase</td>
+            <td colspan="3">Zur Zulassung angerechnete Punkte</td>
+            <td rowspan="3">Durchschnitts- punktzahl</td>
+          </tr>
+          <tr>
+            <td class="text-center" rowspan="2">12.1</td>
+            <td class="text-center" rowspan="2">12.2</td>
+            <td class="text-center" rowspan="2">13.1</td>
+            <td class="text-center" rowspan="2">13.2</td>
+            <td class="text-center" rowspan="2">Grund- kurse</td>
+            <td class="text-center" colspan="2">Leistungskurse</td>
+          </tr>
+          <tr>
+            <td class="text-center">einfach</td>
+            <td class="text-center">zweifach</td>
+          </tr>
+          {#each s.abi_abschluss_faecher.sort((a,b) => a.FSortierung - b.FSortierung) as f}
+            <tr>
+              <td class="text-center">{f.AbiFach || ''}</td>
+              <td>{f.fach.Bezeichnung}</td>
+              <td class="text-center">{f.R12_1 === '-' ? `(${f.P12_1 || '–'})` : f.P12_1}</td>
+              <td class="text-center">{f.R12_2 === '-' ? `(${f.P12_2 || '–'})` : f.P12_2}</td>
+              <td class="text-center">{f.R13_1 === '-' ? `(${f.P13_1 || '–'})` : f.P13_1}</td>
+              <td class="text-center">{f.R13_2 === '-' ? `(${f.P13_2 || '–'})` : f.P13_2}</td>
+              <td class="text-center">{f.KursartAllg === "GK" ? f.Zulassung || '**' : '**'}</td>
+              <td class="text-center">{f.KursartAllg === "LK" ? f.Zulassung/2 : '**'}</td>
+              <td class="text-center">{f.KursartAllg === "LK" ? f.Zulassung : '**'}</td>
+              <td class="text-center">{f.Durchschnitt ? f.Durchschnitt.toFixed(2) : '**'}</td>
+            </tr>
+          {/each}
+          <tr>
+            <td colspan="2"></td>
+            <td colspan="3"><b>Summe der Punkte</b></td>
+            <td></td>
+            <td class="text-center">{s.abi_abschluss.SummeGK}</td>
+            <td></td>
+            <td class="text-center">{s.abi_abschluss.SummeLK}</td>
+          </tr>
+          <tr>
+            <td colspan="9"><br /></td>
+          </tr>
+          <tr>
+            <td colspan="2"></td>
+            <td colspan="6"><b>Gesamtsumme</b></td>
+            <td class="text-center">{s.abi_abschluss.SummeGK + s.abi_abschluss.SummeLK}</td>
+          </tr>
+          <tr>
+            <td colspan="2"></td>
+            <td colspan="6"><b>Anzahl der eingebrachten Kurse</b></td>
+            <td class="text-center">{s.abi_abschluss.Kurse_I}</td>
+          </tr>
+        </table>
+        Die Punktzahlen in Klammern wurden nicht in die Zulassungsberechnung einbezogen.
+        <Voffset v="1"/>
+        <div class="flex-grid">
+          <div class="col-2">Berechnung der Punktsumme im Block I gemäß § 15 in Verbindung mit § 25 Absatz 3 APO-BK Anlage D:</div>
+          <div class="col text-center"><h4>{s.abi_abschluss.Punktsumme_I}</h4></div>
+        </div>
+        Die Prüfung der Zulassung erfolgte unter Berücksichtigung aller erbrachten Leistungen in der
+        Qualifikationsphase mit der Maßgabe der Erreichung einer höchstmöglichen Punktzahl (für den
+        Block I) gemäß § 15 Absatz 2 APO-BK Anlage D. Falls der Prüfling beantragen möchte, dass
+        Änderungen bezüglich der Einbringung für die Berechnung der Punktsumme im Block I
+        vorgenommen werden, so ist dies innerhalb von drei Werktagen nach der ersten Konferenz schriftlich
+        gegenüber der Schule zu erklären.
+        <Voffset v="0.5"/>
+        {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} ist zur Abiturprüfung
+        <b>{s.abi_abschluss.Zugelassen === '+' ? '' : 'nicht'} zugelassen.</b>
+        {#if s.abi_abschluss.Zugelassen !== '+'}
+          <br>Es liegen folgende Verstöße gegen die Zulassungsbedingung(en)
+          nach § 15 APO-BK Anlage D vor:
+          <ul>
+            {#if s.abi_abschluss.Kurse_I < 200}<li>Nichterreichen von mindestens 200 Punkten im Block I</li>{/if}
+            {#if s.abi_abschluss.AnzahlKurse_0 > 0}<li>Bewertung eines einzubringenden Kurses mit null Punkten</li>{/if}
+            {#if (s.abi_abschluss.Kurse_I === 32 && s.abi_abschluss.Defizite_I > 6)
+              || (s.abi_abschluss.Kurse_I < 38   && s.abi_abschluss.Defizite_I > 7)
+              || (s.abi_abschluss.Kurse_I < 41   && s.abi_abschluss.Defizite_I > 8)
+              && (s.abi_abschluss.LK_Defizite_I < 4)}
+              <li>Überschreitung der maximal zulässigen Anzahl einzubringender Kurse mit weniger als fünf Punkten</li>
+            {/if}
+          </ul>
+        {/if}
+			</div>
+      <div class="footer">
+        <div class="flex-grid">
+          <div class="col">
+            {schule.Ort}, den {datum(hj.Konferenzdatum)}
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            <hr />
+            {schule.SchulleiterVorname} {schule.SchulleiterName}
+            <br />Vorsitzender des allgemeinen Prüfungsausschusses
+          </div>
+        </div>
+      </div>
+    </div>
+  {/each}
+{/each}
+<script>
+  export const kommentar = `
+[Anlage D 33b](https://bass.schul-welt.de/3129.htm#AnlageD33b)
+
+[Bass § 15](https://bass.schul-welt.de/3129.htm#pgfId-3911082)
+  `
+  import { datum }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+  .table-bordered {
+    border-collapse: collapse; }
+  .table-bordered tr td {
+    border: thin solid #ddd;
+    line-height: 1.3rem }
+  .table-eng {
+    margin-bottom: 0;
+  }
+</style>

+ 127 - 0
AHR AGZ 11.svelte

@@ -0,0 +1,127 @@
+{#each schueler as s (s.ID)}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader art="daten/agz.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <div style="font-size: 15pt; line-height: 1.5em">
+          {bg(s, 'Schulform')}
+        </div>
+        <div style="font-size: 12pt; line-height: 1.2em">
+          {bg(s, 'Bereich')}
+          {#if s.ASDSchulform.startsWith('B')}
+            <br />
+            Abschluss {@html s.Geschlecht === 3 ? bg(s, 'Berufsbezeichnung_m') : bg(s, 'Berufsbezeichnung_w')}
+          {/if}
+        </div>
+        <Voffset v="1"/>
+        <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+        <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},<br />
+        war vom {datum(s.BeginnBildungsgang)} bis {datum(s.Entlassdatum)} {s.schueler_in}
+        des Bildungsgangs {bg(s, 'Zeugniskopf')}.
+        <br />{s.Geschlecht === 3 ? 'Er':'Sie'} war zuletzt {s.schueler_in} in der Klasse {s.Klasse}.
+        <Voffset v="2"/>
+        Leistungen laut Konferenzbeschluss vom {datum(hj.Konferenzdatum)}:
+        <Noten
+          noten={hj.noten}
+          fachGliederungen={s.fachklasse.fach_gliederungen}
+          ger
+          fachklasse={s.fachklasse.Kennung}
+          faechergruppenIds={[10,20,30]}
+        ></Noten>
+        <hr />
+        {#if zeigeVersetzungsvermerk}
+          <b>{versetzungsvermerk(hj)}</b>
+        {/if}
+        <button class="vbutton no-print" on:click="{() => zeigeVersetzungsvermerk = !zeigeVersetzungsvermerk}">
+          Versetzungsvermerk {zeigeVersetzungsvermerk ? 'entfernen' : 'anzeigen'}
+        </button>
+        <Voffset v="1"/>
+        <b>Bemerkungen</b><br />{@html bemerkungen(hj)}
+      </div>
+      <div class="footer">
+        <Fussnote {schule} ger rechtsbehelfsbelehrung={false}></Fussnote>
+      </div>
+    </div>
+    <div class="page grid" orientation="portrait" size="A4">
+      <div class="main">
+        Seite 2/2 des Abgangsszeugnisses für {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name}
+        <Voffset v="2"/>
+        {#if zeige_FHR}
+          <Voffset v="2"/>
+          {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} hat nach § 13 a Absatz 1 Anlage D
+          APO-BK mit der Versetzung in die Jahrgangsstufe 12 die
+          Voraussetzungen für die Zuerkennung des schulischen Teils der
+          Fachhochschulreife erfüllt. Der Abschluss ist im Deutschen und
+          Europäischen Qualifikationsrahmen dem Niveau 4 zugeordnet.
+          <Voffset v="2"/>
+          Dieses
+          Zeugnis gilt in Verbindung mit dem Nachweis einer mindestens
+          zweijährigen abgeschlossenen Berufsausbildung nach Bundes- oder
+          Landesrecht als Nachweis der Fachhochschulreife. Es berechtigt
+          in den Ländern Nordrhein-Westfalen, Niedersachsen und
+          Schleswig-Holstein zum Studium an Fachhochschulen.
+          <Voffset v="2"/>
+          Durchschnittsnote: {s.DurchschnittsnoteFHR} – in&nbsp;Worten: {s.DSN_FHR_Text}
+        {/if}
+        <Voffset v="1"/>
+        <button class="vbutton no-print" on:click="{() => zeige_FHR = !zeige_FHR}">
+          FHR abgeschlossen: {zeige_FHR ? 'Ja' : 'Nein'}
+        </button>
+      </div>
+      <div class="footer">
+        <div class="flex-grid">
+          <div class="col-2">
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            <hr />
+            {schule.SchulleiterVorname} {schule.SchulleiterName}<br />{schule.schulleiter_in}
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            Siegel
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            <hr />
+            {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+          </div>
+        </div>
+        <Voffset v="9"/>
+        <Fussnote {schule}></Fussnote>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  import { datum, versetzungsvermerk, volljaehrigBei, bemerkungen, bg }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Noten from './partials/Noten.svelte'
+  import Fussnote from './partials/Fussnoten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  let zeigeVersetzungsvermerk = true
+  const aktHalbjahr = a => a.Jahr === jahr && a.Abschnitt === abschnitt
+  let zeige_FHR
+  const fhrFach = (s, fach, id) => {
+    const pid = 'P1' + id
+    if (!fach[pid]) return
+    const fach2 = s.fhr_abschluss_faecher.find(f => f.Fach_ID === fach.Fach_ID)
+    const rsid = 'RSII_' + id
+    return fach2[rsid] === '+' ? fach[pid] : `(${fach[pid]})`
+  }
+</script>
+
+<style>
+  @import 'css/main.css';
+  .vbutton {
+    background-color: red;
+    color: white;
+  }
+</style>

+ 270 - 0
AHR AGZ zweiseitig.svelte

@@ -0,0 +1,270 @@
+{#each schueler as s (s.ID)}
+  {#each aktHalbjahrFuer(s) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4" style="font-size: 0.8rem">
+      <div class="header">
+        <Seitenlogo logo="{privat.traegerLogo}"/>
+        <Pageheader art="daten/agz.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      </div>
+      <div class="main">
+          <div style="font-size: 12pt; line-height: 1.5em">Abgangszeugnis gemäß §13 APO-BK, Anlage D</div>
+          <div style="font-size: 11pt; line-height: 1.2em">Berufliches Gymnasium, {bg(s, 'Bereich')}</div>
+          <Voffset v="0.5"/>
+          {s.anrede} <b>{s.Vorname} {s.Zusatz || ''} {s.Name}</b>, geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+          <br />hat vom {datum(s.Aufnahmedatum)} bis zum {datum(s.Entlassdatum)} den <b>Bildungsgang {bg(s, 'Zeugniskopf')}</b> besucht.
+          <br>{s.Geschlecht === 3 ? 'Er':'Sie'} war zuletzt {s.schueler_in} im {hj.Abschnitt}. Halbjahr der Jahrgangstufe {hj.Jahrgang+10}.
+          <Voffset v="0.5"/>
+          In der Konferenz am {datum(hj.Konferenzdatum)} sind folgende Leistungen festgestellt worden:
+          <table class="table table-bordered table-eng">
+            <tr>
+              <td>Fach</td>
+              <td>Aufg.-<br>feld<sup>2</sup></td>
+              <td>Kurs-<br>Art<sup>3</sup></td>
+              <td colspan="2" class="text-center">12.1<sup>4</sup></td>
+              <td colspan="2" class="text-center">12.2<sup>4</sup></td>
+              <td colspan="2" class="text-center">13.1<sup>4</sup></td>
+              <td colspan="2" class="text-center">13.2<sup>4</sup></td>
+            </tr>
+            <tr>
+              <td colspan="3"></td>
+              <td class="text-center">Note</td>
+              <td class="text-center">Punkte</td>
+              <td class="text-center">Note</td>
+              <td class="text-center">Punkte</td>
+              <td class="text-center">Note</td>
+              <td class="text-center">Punkte</td>
+              <td class="text-center">Note</td>
+              <td class="text-center">Punkte</td>
+            </tr>
+            {#each s.abi_abschluss_faecher.sort((a, b) => a.FSortierung < b.FSortierung ? -1 : 1) as f}
+              <tr>
+                <td>{f.fach.Bezeichnung}
+                  {#if f.fach.IstSprache === '+'}{fremdsprache(f, s.fachklasse.Kennung)}<sup>1</sup>{/if}
+                </td>
+                <td class="text-center">{'I'.repeat(f.fach.Aufgabenfeld)}</td>
+                <td class="text-center">{f.KursartAllg || 'GK'}</td>
+                <td class="text-center">{punkte2note(f.P12_1) || '–'}</td>
+                <td class="text-center">{fhrFach(s, f, '2_1') || '–'}</td>
+                <td class="text-center">{punkte2note(f.P12_2) || '–'}</td>
+                <td class="text-center">{fhrFach(s, f, '2_2') || '–'}</td>
+                <td class="text-center">{punkte2note(f.P13_1) || '–'}</td>
+                <td class="text-center">{fhrFach(s, f, '3_1') || '–'}</td>
+                <td class="text-center">{punkte2note(f.P13_2) || '–'}</td>
+                <td class="text-center">{fhrFach(s, f, '3_2') || '–'}</td>
+              </tr>
+            {/each}
+          </table>
+          <Voffset v="0.5"/>
+          <b>Bemerkungen:
+          <br></b> {@html bemerkungen(hj)}
+          <Voffset v="1"/>
+          Die Kurse des letzten Halbjahres gelten als {zeige_Kurse_abgeschlossen ? '':'nicht'} abgeschlossen.
+          <button class="vbutton no-print" on:click="{() => zeige_Kurse_abgeschlossen = !zeige_Kurse_abgeschlossen}">
+            Kurse abgeschlossen: {zeige_Kurse_abgeschlossen ? 'Ja' : 'Nein'}
+          </button>
+          {#if zeige_FHR}
+            <Voffset v="2"/>
+            Dieses Zeugnis gilt in Verbindung mit dem Nachweis über eine
+            abgeschlossene Berufsausbildung oder ein einjähriges gelenktes
+            Praktikum gemäß der Praktikum - Ausbildungsordnung vom 11.12.2006
+            (BASS 13 -31 Nr.1) als Nachweis der Fachhochschulreife. Es
+            berechtigt zum Studium an einer Fachhochschule des Landes
+            Nordrhein-Westfalen. Dieses Zeugnis gilt auch als Nachweis des
+            schulischen Teils der Fachhochschulreife in den Ländern
+            Baden-Württemberg, Berlin, Brandenburg, Bremen, Hamburg, Hessen,
+            Mecklenburg-Vorpommern, Niedersachsen, Rheinland-Pfalz, Saarland,
+            Sachsen-Anhalt, Schleswig-Holstein und Thüringen.
+          {/if}
+          <button class="vbutton no-print" on:click="{() => zeige_FHR = !zeige_FHR}">
+            FHR abgeschlossen: {zeige_FHR ? 'Ja' : 'Nein'}
+          </button>
+          <Voffset v="2"/>
+          <table class="table-noten">
+            <tr>
+              <td>Durchschnittsnote:</td>
+              <td class="td-fach-note"><span>{s.fhr_abschluss && s.fhr_abschluss.Note}</span></td>
+              <td>in&nbsp;Worten:</td>
+              <td class="td-fach-note"><span>{@html s.fhr_abschluss && s.fhr_abschluss.Note && noteInWorten(s.fhr_abschluss.Note)}</span></td>
+            </tr>
+          </table>
+        </div>
+        <div class="footer">
+          <div class="flex-grid">
+            <div class="col-2">
+              {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+            </div>
+            <div class="col text-center klein">
+              <Voffset v="3"/>
+              <hr />
+              {schule.SchulleiterVorname} {schule.SchulleiterName}
+              <br />{schule.schulleiter_in}
+            </div>
+            <div class="col text-center klein">
+              <Voffset v="3"/>
+              Siegel
+            </div>
+            <div class="col text-center klein">
+              <Voffset v="3"/>
+              <hr />
+              {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+            </div>
+          </div>
+          <Voffset v="2"/>
+          Schulnummer: {schule.SchulNr}
+          <div class="klein">
+            <hr />
+            <sup>1</sup>Der Unterricht in den modernen Fremdsprachen hat auf der nach dem Fach in
+            Klammern angegebenen Niveaustufe des „Europäischen Referenzrahmens für
+            Sprachen: Lernen, Lehren, Beurteilen“ stattgefunden. Sind zwei
+            Referenzniveaus ausgewiesen, ist das niedrigere in vollem Umfang, das höhere
+            in Anteilen erreicht. Bei mindestens ausreichenden Leistungen (5 Punkte)
+            wird der sprachliche Kompetenzerwerb auf diesem Niveau bescheinigt.
+            <Voffset v=".5"/>
+            <table>
+              <tr>
+                <td rowspan="4" valign="top" width="5px" ><sup>2</sup> </td>
+                <td width="10px">I</td>
+                <td>= sprachlich literarisches Aufgabenfeld</td>
+                <td rowspan="4" valign="top" width="5px" ><sup>3</sup> </td>
+                <td width="10px">LK</td>
+                <td>= Leistungskurs</td>
+              </tr>
+              <tr>
+                <td>II</td>
+                <td>= gesellschaftswissenschaftliches Aufgabenfeld</td>
+                <td width="10px">GK</td>
+                <td>= Grundkurs</td>
+              </tr>
+              <tr>
+                <td>III</td>
+                <td>= mathematisch-naturwissenschaftlich-technisches Aufgabenfeld</td>
+              </tr>
+            </table>
+            <sup>4</sup> Für die Umsetzung von Noten in Punkte gilt:
+            <table class="table table-bordered table-eng" width="80%">
+              <tr>
+                <td width="5%"></td>
+                {#each ['sehr gut', 'gut', 'befriedigend', 'ausreichend', 'mangelhaft', 'ungenügend'] as n}
+                  <td class="text-center" width="10%">{n}</td>
+                {/each}
+              </tr>
+              <tr>
+                <td>Noten</td>
+                {#each [1,2,3,4,5] as i}
+                  <td class="text-center">
+                    <div class="flex-grid">
+                      <div class="col">+</div>
+                      <div class="col">{i}</div>
+                      <div class="col">-</div>
+                    </div>
+                  </td>
+                {/each}
+                <td class="text-center">6</td>
+              </tr>
+              <tr>
+                <td>Punkte</td>
+                {#each [[15,14,13],[12,11,10],['09','08','07'],['06','05','04'],['03','02','01']] as ii}
+                  <td class="text-center">
+                    <div class="flex-grid">
+                      {#each ii as i}
+                        <div class="col">{i}</div>
+                      {/each}
+                    </div>
+                  </td>
+                {/each}
+                <td class="text-center">00</td>
+              </tr>
+            </table>
+            <Voffset v=".5"/>
+            <table>
+              <tr>
+                <td width="3%">E1</td>
+                <td width="40%">= Mit besonderem Erfolg teilgenommen</td>
+                <td width="3%">E2</td>
+                <td width="30%">= Mit Erfolg teilgenommen</td>
+                <td width="3%">E3</td>
+                <td width="15%">= Teilgenommen</td>
+              </tr>
+            </table>
+            Die Punkte in Klammern sind nicht in die Durchschnittsnote eingerechnet worden.
+          </div>
+        </div>
+      </div>
+    <div class="page grid" orientation="portrait" size="A4">
+        <div class="footer klein">
+        <hr>
+          Dem Zeugnis liegen zugrunde:<br>
+          Die Verordnung über die Ausbildung und Prüfung
+          in den Bildungsgängen des Berufskollegs (Ausbildungs- und Prüfungsordnung
+          Berufskolleg, APO-BK) vom 26. Mai 1999 (SGV. NRW. 223/BASS 13 – 33 Nr. 1.1).
+          <Voffset v=".5"/>
+          Rechtsbehelfsbelehrung:<br>
+          Gegen dieses Zeugnis kann innerhalb eines Monats
+          nach Bekanntgabe des Zeugnisses Widerspruch eingelegt werden. Der Widerspruch
+          ist beim {schule.Bezeichnung2}, {schule.Strasse}, {schule.PLZ} {schule.Ort},
+          schriftlich oder zur Niederschrift zu erheben. <br />Falls die Frist durch
+          das Verschulden einer/eines Bevollmächtigten versäumt wird, wird dies
+          Verschulden der Widerspruchsführerin/dem Widerspruchsführer zugerechnet.
+        </div>
+      </div>
+  {/each}
+{/each}
+
+<script>
+  export const kommentar = `
+  *Achtung* die FHR wird nicht automatisch vergeben, Voraussetzungen beachten
+- [§13 zu AGZ 12, 13,](https://bass.schul-welt.de/3129.htm#pgfId-1289625)
+- [VV 13.4 zu Absatz 4](https://bass.schul-welt.de/3129.htm#pgfId-3910131)
+- [FHR bei Abgängern](https://bass.schul-welt.de/3129.htm#13-33nr1.1p13a_AnlageD)
+- [Sprachniveaus](https://bass.schul-welt.de/3129.htm#pgfId-3910826)
+- [AGZ D35](https://bass.schul-welt.de/3129.htm#AnlageD35)
+- [Kurse abgeschlossen? Bemerkung](https://bass.schul-welt.de/3129.htm#pgfId-3910135)
+  `
+  import { datum, versetzungsvermerk, volljaehrigBei, bemerkungen, bg, punkte2note, noteInWorten, fremdsprache }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  let zeige_FHR = false, zeige_Kurse_abgeschlossen = false
+  const aktHalbjahrFuer = s => [s.abschnitte.find(a => a.Jahr === jahr && a.Abschnitt === abschnitt)]
+
+  const fhrFach = (s, fach, id) => {
+    const pid = 'P1' + id
+    if (!fach[pid]) return
+    const fach2 = s.fhr_abschluss_faecher.find(f => f.Fach_ID === fach.Fach_ID)
+    const rsid = 'RSII_' + id
+    return fach2[rsid] === '+' ? fach[pid] : `(${fach[pid]})`
+  }
+</script>
+
+<style>
+  @import 'css/main.css';
+  @import 'css/a4-portrait.css';
+  .table-bordered {
+    border-collapse: collapse; }
+  .table-bordered td {
+    border: thin solid #ddd;
+    line-height: 1.3rem }
+  .table-eng {
+    margin-bottom: 0;
+  }
+  .table-noten {
+    width: 70%;
+    border: none;
+    border-collapse: collapse;
+    margin-bottom: 1rem;
+  }
+  .td-fach-note {
+    padding-bottom: .2rem;
+    padding-top: .2rem;
+    width: 12rem;
+  }
+  .td-fach-note span {
+    background-color: #dcdcdc !important;
+    text-align: center;
+    width: 10rem;
+    display: block;
+    margin: 0 auto;
+  }
+</style>

+ 278 - 0
AHR AGZ.svelte

@@ -0,0 +1,278 @@
+{#each schueler as s (s.ID)}
+  {#each aktHalbjahrFuer(s) as hj (hj.ID)}
+    <div class="page grid" orientation="landscape" size="A3">
+      <div class="header">
+        <Seitenlogo logo="{privat.traegerLogo}"/>
+        <Pageheader art="daten/agz.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      </div>
+      <div class="main-grid">
+        <div class="main-left">
+          <div style="font-size: 12pt; line-height: 1.5em">Abgangszeugnis gemäß §13 APO-BK, Anlage D</div>
+          <div style="font-size: 11pt; line-height: 1.2em">Berufliches Gymnasium, {bg(s, 'Bereich')}</div>
+          <Voffset v="0.5"/>
+          {s.anrede} <b>{s.Vorname} {s.Zusatz || ''} {s.Name}</b>, geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+          <br />hat vom {datum(s.Aufnahmedatum)} bis zum {datum(s.Entlassdatum)} den <b>Bildungsgang {bg(s, 'Zeugniskopf')}</b> besucht.
+          <br>{s.Geschlecht === 3 ? 'Er':'Sie'} war zuletzt {s.schueler_in} im {hj.Abschnitt}. Halbjahr der Jahrgangstufe {hj.Jahrgang+10}.
+          <Voffset v="0.5"/>
+          In der Konferenz am {datum(hj.Konferenzdatum)} sind folgende Leistungen festgestellt worden:
+          <table class="table table-bordered ">
+            <tr>
+              <td>Fach</td>
+              <td>Aufg.-<br>feld<sup>2</sup></td>
+              <td>Kurs-<br>Art<sup>3</sup></td>
+              <td colspan="2" class="text-center">12.1<sup>4</sup></td>
+              <td colspan="2" class="text-center">12.2<sup>4</sup></td>
+              <td colspan="2" class="text-center">13.1<sup>4</sup></td>
+              <td colspan="2" class="text-center">13.2<sup>4</sup></td>
+            </tr>
+            <tr>
+              <td colspan="3"></td>
+              <td class="text-center">Note</td>
+              <td class="text-center">Punkte</td>
+              <td class="text-center">Note</td>
+              <td class="text-center">Punkte</td>
+              <td class="text-center">Note</td>
+              <td class="text-center">Punkte</td>
+              <td class="text-center">Note</td>
+              <td class="text-center">Punkte</td>
+            </tr>
+            {#each s.abi_abschluss_faecher.sort((a, b) => a.FSortierung < b.FSortierung ? -1 : 1) as f}
+              <tr>
+                <td>{f.fach.Bezeichnung}
+                  {#if f.fach.IstSprache === '+'}{fremdsprache(f, s.fachklasse.Kennung)}<sup>1</sup>{/if}
+                </td>
+                <td class="text-center">{'I'.repeat(f.fach.Aufgabenfeld)}</td>
+                <td class="text-center">{f.KursartAllg || 'GK'}</td>
+                <td class="text-center">{punkte2note(f.P12_1) || '–'}</td>
+                <td class="text-center">{fhrFach(s, f, '2_1') || '–'}</td>
+                <td class="text-center">{punkte2note(f.P12_2) || '–'}</td>
+                <td class="text-center">{fhrFach(s, f, '2_2') || '–'}</td>
+                <td class="text-center">{punkte2note(f.P13_1) || '–'}</td>
+                <td class="text-center">{fhrFach(s, f, '3_1') || '–'}</td>
+                <td class="text-center">{punkte2note(f.P13_2) || '–'}</td>
+                <td class="text-center">{fhrFach(s, f, '3_2') || '–'}</td>
+              </tr>
+            {/each}
+          </table>
+          <Voffset v="0.5"/>
+          <b>Bemerkungen:
+          <br></b> {@html bemerkungen(hj)}
+        </div>
+        <div class="main-right">
+          <Voffset v="4"/>
+          Die Kurse des letzten Halbjahres gelten als {zeige_Kurse_abgeschlossen ? '':'nicht'} abgeschlossen.
+          <button class="vbutton no-print" on:click="{() => zeige_Kurse_abgeschlossen = !zeige_Kurse_abgeschlossen}">
+            Kurse abgeschlossen: {zeige_Kurse_abgeschlossen ? 'Ja' : 'Nein'}
+          </button>
+          {#if zeige_FHR}
+            <Voffset v="2"/>
+            Dieses Zeugnis gilt in Verbindung mit dem Nachweis über eine
+            abgeschlossene Berufsausbildung oder ein einjähriges gelenktes
+            Praktikum gemäß der Praktikum - Ausbildungsordnung vom 11.12.2006
+            (BASS 13 -31 Nr.1) als Nachweis der Fachhochschulreife. Es
+            berechtigt zum Studium an einer Fachhochschule des Landes
+            Nordrhein-Westfalen. Dieses Zeugnis gilt auch als Nachweis des
+            schulischen Teils der Fachhochschulreife in den Ländern
+            Baden-Württemberg, Berlin, Brandenburg, Bremen, Hamburg, Hessen,
+            Mecklenburg-Vorpommern, Niedersachsen, Rheinland-Pfalz, Saarland,
+            Sachsen-Anhalt, Schleswig-Holstein und Thüringen.
+            <Voffset v="2"/>
+            <table class="table-noten">
+              <tr>
+                <td>Durchschnittsnote:</td>
+                <td class="td-fach-note"><span>{s.fhr_abschluss && s.fhr_abschluss.Note}</span></td>
+                <td>in&nbsp;Worten:</td>
+                <td class="td-fach-note"><span>{@html s.fhr_abschluss && s.fhr_abschluss.Note && noteInWorten(s.fhr_abschluss.Note)}</span></td>
+              </tr>
+            </table>
+          {/if}
+          <button class="vbutton no-print" on:click="{() => zeige_FHR = !zeige_FHR}">
+            FHR abgeschlossen: {zeige_FHR ? 'Ja' : 'Nein'}
+          </button>
+        </div>
+        <div class="footer-right">
+          <div class="flex-grid">
+            <div class="col-2">
+              {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+            </div>
+            <div class="col text-center klein">
+              <Voffset v="3"/>
+              <hr />
+              {schule.SchulleiterVorname} {schule.SchulleiterName}
+              <br />{schule.schulleiter_in}
+            </div>
+            <div class="col text-center klein">
+              <Voffset v="3"/>
+              Siegel
+            </div>
+            <div class="col text-center klein">
+              <Voffset v="3"/>
+              <hr />
+              {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+            </div>
+          </div>
+          <Voffset v="6"/>
+        </div>
+      </div>
+      <div class="footer-grid klein eng">
+        <div class="header">
+          Schulnummer: {schule.SchulNr}
+          <hr />
+          <Voffset v="1"/>
+        </div>
+        <div class="footer-left">
+          <sup>1</sup>Der Unterricht in den modernen Fremdsprachen hat auf der nach dem Fach in
+          Klammern angegebenen Niveaustufe des „Europäischen Referenzrahmens für
+          Sprachen: Lernen, Lehren, Beurteilen“ stattgefunden. Sind zwei
+          Referenzniveaus ausgewiesen, ist das niedrigere in vollem Umfang, das höhere
+          in Anteilen erreicht. Bei mindestens ausreichenden Leistungen (5 Punkte)
+          wird der sprachliche Kompetenzerwerb auf diesem Niveau bescheinigt.
+          <Voffset v=".5"/>
+          <table>
+            <tr>
+              <td rowspan="4" valign="top" width="5px" ><sup>2</sup> </td>
+              <td width="10px">I</td>
+              <td>= sprachlich literarisches Aufgabenfeld</td>
+              <td rowspan="4" valign="top" width="5px" ><sup>3</sup> </td>
+              <td width="10px">LK</td>
+              <td>= Leistungskurs</td>
+            </tr>
+            <tr>
+              <td>II</td>
+              <td>= gesellschaftswissenschaftliches Aufgabenfeld</td>
+              <td width="10px">GK</td>
+              <td>= Grundkurs</td>
+            </tr>
+            <tr>
+              <td>III</td>
+              <td>= mathematisch-naturwissenschaftlich-technisches Aufgabenfeld</td>
+            </tr>
+          </table>
+          <sup>4</sup> Für die Umsetzung von Noten in Punkte gilt:
+          <table class="table table-bordered table-eng" width="80%">
+            <tr>
+              <td width="5%"></td>
+              {#each ['sehr gut', 'gut', 'befriedigend', 'ausreichend', 'mangelhaft', 'ungenügend'] as n}
+                <td class="text-center" width="10%">{n}</td>
+              {/each}
+            </tr>
+            <tr>
+              <td>Noten</td>
+              {#each [1,2,3,4,5] as i}
+                <td class="text-center">
+                  <div class="flex-grid">
+                    <div class="col">+</div>
+                    <div class="col">{i}</div>
+                    <div class="col">-</div>
+                  </div>
+                </td>
+              {/each}
+              <td class="text-center">6</td>
+            </tr>
+            <tr>
+              <td>Punkte</td>
+              {#each [[15,14,13],[12,11,10],['09','08','07'],['06','05','04'],['03','02','01']] as ii}
+                <td class="text-center">
+                  <div class="flex-grid">
+                    {#each ii as i}
+                      <div class="col">{i}</div>
+                    {/each}
+                  </div>
+                </td>
+              {/each}
+              <td class="text-center">00</td>
+            </tr>
+          </table>
+          <Voffset v=".5"/>
+          <table>
+            <tr>
+              <td width="3%">E1</td>
+              <td width="40%">= Mit besonderem Erfolg teilgenommen</td>
+              <td width="3%">E2</td>
+              <td width="30%">= Mit Erfolg teilgenommen</td>
+              <td width="3%">E3</td>
+              <td width="15%">= Teilgenommen</td>
+            </tr>
+          </table>
+          Die Punkte in Klammern sind nicht in die Durchschnittsnote eingerechnet worden.
+        </div>
+        <div class="footer-right">
+          Dem Zeugnis liegen zugrunde:<br>
+          Die Verordnung über die Ausbildung und Prüfung
+          in den Bildungsgängen des Berufskollegs (Ausbildungs- und Prüfungsordnung
+          Berufskolleg, APO-BK) vom 26. Mai 1999 (SGV. NRW. 223/BASS 13 – 33 Nr. 1.1).
+          <Voffset v=".5"/>
+          Rechtsbehelfsbelehrung:<br>
+          Gegen dieses Zeugnis kann innerhalb eines Monats
+          nach Bekanntgabe des Zeugnisses Widerspruch eingelegt werden. Der Widerspruch
+          ist beim {schule.Bezeichnung2}, {schule.Strasse}, {schule.PLZ} {schule.Ort},
+          schriftlich oder zur Niederschrift zu erheben. <br />Falls die Frist durch
+          das Verschulden einer/eines Bevollmächtigten versäumt wird, wird dies
+          Verschulden der Widerspruchsführerin/dem Widerspruchsführer zugerechnet.
+        </div>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  export const kommentar = `
+  *Achtung* die FHR wird nicht automatisch vergeben, Voraussetzungen beachten
+- [§13 zu AGZ 12, 13,](https://bass.schul-welt.de/3129.htm#pgfId-1289625)
+- [VV 13.4 zu Absatz 4](https://bass.schul-welt.de/3129.htm#pgfId-3910131)
+- [FHR bei Abgängern](https://bass.schul-welt.de/3129.htm#13-33nr1.1p13a_AnlageD)
+- [Sprachniveaus](https://bass.schul-welt.de/3129.htm#pgfId-3910826)
+- [AGZ D35](https://bass.schul-welt.de/3129.htm#AnlageD35)
+- [Kurse abgeschlossen? Bemerkung](https://bass.schul-welt.de/3129.htm#pgfId-3910135)
+  `
+  import { datum, versetzungsvermerk, volljaehrigBei, bemerkungen, bg, punkte2note, noteInWorten, fremdsprache }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  let zeige_FHR, zeige_Kurse_abgeschlossen
+  const aktHalbjahrFuer = s => [s.abschnitte.find(a => a.Jahr === jahr && a.Abschnitt === abschnitt)]
+
+  const fhrFach = (s, fach, id) => {
+    const pid = 'P1' + id
+    if (!fach[pid]) return
+    const fach2 = s.fhr_abschluss_faecher.find(f => f.Fach_ID === fach.Fach_ID)
+    const rsid = 'RSII_' + id
+    return fach2[rsid] === '+' ? fach[pid] : `(${fach[pid]})`
+  }
+</script>
+
+<style>
+  @import 'css/main.css';
+  @import 'css/a3-landscape.css';
+  .table-bordered {
+    border-collapse: collapse;
+  }
+  .table-bordered td {
+    border: thin solid #ddd;
+    line-height: 1.5rem;
+  }
+  .table-eng {
+    margin-bottom: 0;
+  }
+  .table-noten {
+    width: 70%;
+    border: none;
+    border-collapse: collapse;
+    margin-bottom: 1rem;
+  }
+  .td-fach-note {
+    padding-bottom: .2rem;
+    padding-top: .2rem;
+    width: 12rem;
+  }
+  .td-fach-note span {
+    background-color: #dcdcdc !important;
+    text-align: center;
+    width: 10rem;
+    display: block;
+    margin: 0 auto;
+  }
+</style>

+ 129 - 0
AHR ASZ BA.svelte

@@ -0,0 +1,129 @@
+{#each schueler as s (s.ID)}
+  {#each aktHalbjahrFuer(s) as hj (hj.ID)}
+    <div class="page grid" orientation="landscape" size="A3">
+      <div class="header">
+        <Seitenlogo logo="{privat.traegerLogo}"/>
+        <Pageheader art="daten/asz.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      </div>
+      <div class="main-grid">
+        <div class="main-left">
+          <Voffset v="2"/>
+          <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+          <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+          <br />war vom {datum(s.Aufnahmedatum)} bis zur Aushändigung des
+          Zeugnisses {s.schueler_in} des Bildungsgangs <br>
+          <b>Erzieherin/Erzieher mit Allgemeiner Hochschulreife</b> im
+          Fachbereich Gesundheit und Soziales mit dem fachlichen Schwerpunkt
+          Pädagogik.
+          <Voffset v="1"/>
+          In der Konferenz am {datum(hj.Konferenzdatum)} sind folgende Leistungen festgestellt worden:
+          <Voffset v=".5"/>
+          <Noten
+            noten={hj.noten}
+            faechergruppenIds={[10, 20, 30, 1600]}
+            fachGliederungen={s.fachklasse.fach_gliederungen}
+            fachklasse={s.fachklasse.Kennung}
+            gruppenbezeichnungNeu={gruppenbezeichnungNeu}
+          ></Noten>
+          <hr />
+          <b>Bemerkungen</b>
+          <br />{@html bemerkungen(hj)}
+        </div>
+        <div class="main-right">
+          <Voffset v="2"/>
+          {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} hat die staatliche
+          Berufsabschlussprüfung für Erzieherinnen und Erzieher<br>
+          am {hj.noten.find(f => f.fach.FachKrz === 'KO').Lernentw}
+          bestanden und ist berechtigt, die Berufsbezeichnung
+          <Voffset v="1"/>
+          <h6 class="text-center">{s.Geschlecht === 3 ? 'Staatlich anerkannter Erzieher' : 'Staatlich anerkannte Erzieherin'}</h6>
+          zu führen.
+          <Voffset v="1"/>
+          Der Abschluss ist im Deutschen und Europäischen Qualifikationsrahmen dem Niveau {s.fachklasse.DQR_Niveau} zugeordnet.
+          <Voffset v="9"/>
+          <div class="flex-grid">
+            <div class="col">
+              <Voffset v="-1"/>
+              {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+              <Voffset v="7"/>
+              <div class="text-center klein">Siegel</div>
+            </div>
+            <div class="col">
+              <hr />
+              <div class="text-center klein">
+                {schule.SchulleiterVorname} {schule.SchulleiterName} – Vorsitzende{schule.SchulleiterGeschlecht === 3 ? 'r':''} des allgemeinen
+                <br />Prüfungsausschusses
+              </div>
+              <Voffset v="6"/>
+              <hr />
+              <div class="text-center klein">
+                {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+              </div>
+            </div>
+            <div class="col"></div>
+          </div>
+        </div>
+      </div>
+      <div class="footer-grid klein eng">
+        <div class="header">
+          Schulnummer: {schule.SchulNr}
+          <hr />
+          <Voffset v="1"/>
+        </div>
+        <div class="footer-left">
+          Notenstufen gemäß § 48 SchulG: 1 = sehr gut, 2 = gut, 3 = befriedigend, 4 = ausreichend, 5 = mangelhaft, 6 = ungenügend
+          <Voffset v=".5"/>
+          <sup>1</sup>Der Unterricht in den modernen Fremdsprachen hat auf der nach dem Fach in
+          Klammern angegebenen Niveaustufe des „Europäischen Referenzrahmens für
+          Sprachen: Lernen, Lehren, Beurteilen“ stattgefunden. Sind zwei
+          Referenzniveaus ausgewiesen, ist das niedrigere in vollem Umfang, das höhere
+          in Anteilen erreicht. Bei mindestens ausreichenden Leistungen wird der
+          sprachliche Kompetenzerwerb auf diesem Niveau bescheinigt.
+        </div>
+        <Voffset v=".5"/>
+        <div class="footer-right">
+          Dem Zeugnis liegen zugrunde:
+          <ul class="list-unstyled dashes">
+            <li>
+              Die Verordnung über die Ausbildung und Prüfung in den Bildungsgängen
+              des Berufskollegs (Ausbildungs- und Prüfungsordnung Berufskolleg,
+              APO-BK) vom 26. Mai 1999 (SGV. NRW. 223/BASS 13 – 33 Nr. 1.1).
+            </li>
+            <li>
+              Die Vereinbarung über Fachschulen (Beschluss der Kultusministerkonferenz
+              vom 07. November 2002 in der jeweils geltenden Fassung).
+            </li>
+          </ul>
+          <Voffset v=".5"/>
+          Rechtsbehelfsbelehrung:
+          <br>Gegen dieses Zeugnis kann innerhalb eines Monats
+          nach Bekanntgabe des Zeugnisses Widerspruch eingelegt werden. Der Widerspruch
+          ist beim {schule.Bezeichnung2}, {schule.Strasse}, {schule.PLZ} {schule.Ort},
+          schriftlich oder zur Niederschrift zu erheben. <br />Falls die Frist durch
+          das Verschulden einer/eines Bevollmächtigten versäumt wird, wird dies
+          Verschulden der Widerspruchsführerin/dem Widerspruchsführer zugerechnet.
+        </div>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  export const kommentar = `
+[Anlage D 48](https://bass.schul-welt.de/anlagen/3129-50.pdf)
+Die *Fächer* BL und BP Gesamt sind in einer anderen Fächergruppe als das Kolloqium und werden auf dem Zeugnis ignoriert.
+  `
+  import { datum, bemerkungen, bg, note }  from './helfer'
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Noten from './partials/Noten.svelte'
+  export let schueler, schule, privat, jahr, abschnitt
+  let gruppenbezeichnungNeu = {1600: 'Fachpraktische Prüfung'}
+  const aktHalbjahrFuer = s => s.abschnitte.filter(a => a.Jahr === jahr && a.Abschnitt === abschnitt)
+</script>
+
+<style>
+  @import 'css/main.css';
+  @import 'css/a3-landscape.css';
+</style>

+ 401 - 0
AHR ASZ.svelte

@@ -0,0 +1,401 @@
+{#each schueler as s (s.ID)}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="landscape" size="A3">
+      <div class="main-grid">
+        <div class="main-left grid">
+          <div class="main">
+            <Voffset v="2"/>
+            4. Seite des Zeugnisses der Allgemeinen Hochschulreife für {s.Vorname} {s.Zusatz || ''} {s.Name}
+            <Voffset v="2"/>
+            {#if s.abi_abschluss.KlLatinum === '+' || s.abi_abschluss.Latinum === '+'}
+              Dieses Zeugnis schließt das Latinum (Nachweis von
+              Lateinkenntnissen gemäß Vereinbarung der
+              Kultusministerkonferenz vom 22. September 2005) ein.
+              <Voffset v="2"/>
+            {:else if s.abi_abschluss.Graecum === '+'}
+              <Voffset v="2"/>
+              Dieses Zeugnis schließt das Graecum (Nachweis von
+              Griechischkenntnissen gemäß Vereinbarung der
+              Kultusministerkonferenz vom 22. September 2005) ein.
+            {:else if s.abi_abschluss.Hebraicum === '+'}
+              Dieses Zeugnis schließt das Hebraicum ein.
+              <Voffset v="2"/>
+            {/if}
+            <b>Bemerkungen</b>
+            <br />{@html bemerkungen(hj)}
+            <Voffset v="2"/>
+            {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} hat die
+            Abiturprüfung bestanden und damit die Berechtigung zum Studium an
+            einer Hochschule in der Bundesrepublik Deutschland erworben. Der
+            Abschluss ist im Deutschen und Europäischen Qualifikationsrahmen
+            dem Niveau 4 zugeordnet.
+          </div>
+          <div class="footer">
+            <div class="flex-grid">
+              <div class="col-2">
+                <Voffset v="1"/>
+                {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+              </div>
+              <div class="col"></div>
+              <div class="col-2 text-center klein">
+                <Voffset v="3"/>
+                <hr />
+                {s.fachklasse.Ebene2Klartext}
+                <br>Bildungsgangleitung
+              </div>
+            </div>
+            <Voffset v="2"/>
+            <div class="flex-grid">
+              <div class="col text-center klein">
+                Siegel
+              </div>
+            </div>
+            <Voffset v="2"/>
+            <div class="flex-grid">
+              <div class="col-2 text-center klein">
+                <Voffset v="3"/>
+                <hr />
+                {schule.SchulleiterVorname} {schule.SchulleiterName} <br />
+                Vorsitzender des allgemeinen Prüfungsausschusses
+              </div>
+              <div class="col"></div>
+              <div class="col-2 text-center klein">
+                <Voffset v="3"/>
+                <hr />
+                {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+              </div>
+            </div>
+            <Voffset v="2"/>
+            <div class="klein eng">
+              <b>Rechtsbehelfsbelehrung:</b>
+              <Voffset v="0.5"/>
+              Gegen die Kursabschlussnoten der Jahrgangsstufe 13.2 und die
+              Leistungen in der Abiturprüfung sowie die Berechnung der
+              Gesamtqualifikation einschließlich der Durchschnittsnote kann
+              innerhalb eines Monats nach Bekanntgabe des Zeugnisses
+              Widerspruch erhoben werden. Der Widerspruch ist beim
+              {schule.Bezeichnung2}, {schule.Strasse}, {schule.PLZ}
+              {schule.Ort}, schriftlich oder zur Niederschrift zu erheben.
+              Falls die Frist durch das Verschulden einer/eines
+              Bevollmächtigten versäumt wird, wird dieses Verschulden der
+              Widerspruchsführerin/dem Widerspruchsführer zugerechnet.
+              <Voffset v="2"/>
+              <div class="schulnummer">
+                Schulnummer: {schule.SchulNr}
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="main-right grid">
+          <div class="header">
+            <Pageheader hr={false} logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+          </div>
+          <div class="main">
+            <Voffset v="3"/>
+            <h4 class="text-center">Zeugnis<br />der Allgemeinen Hochschulreife</h4>
+            <Voffset v="10"/>
+            <div class="text-center" style="font-size: 1.3rem">
+              <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+              <div class="voffset-2"></div>
+              <div>
+                geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+              </div>
+              <div>
+                wohnhaft in {s.OrtAbk},
+              </div>
+              <div>
+                hat sich der Abiturprüfung im Bildungsgang
+              </div>
+              <div>{bg(s, 'Bereich')}</div>
+              <div>unterzogen.</div>
+            </div>
+          </div>
+          <div class="footer klein eng">
+            <div class="sl"><Seitenlogo logo="{privat.traegerLogo}"/></div>
+            Dem Zeugnis liegen zugrunde:
+            <ul class="list-unstyled dashes">
+              <li>
+              die Vereinbarung zur Gestaltung der gymnasialen Oberstufe und
+              der Abiturprüfung (Beschluss der Kultusministerkonferenz vom
+              7. Juli 1972 in der jeweils geltenden Fassung)
+              </li>
+              <li>
+              die Bildungsstandards für die Allgemeine Hochschulreife oder
+              die Vereinbarung über die einheitlichen Prüfungsanforderungen
+              in der Abiturprüfung (Beschlüsse der Kultusministerkonferenz
+              in der jeweils geltenden Fassung)
+              </li>
+              <li>
+              die Verordnung über die Ausbildung und Prüfung in den
+              Bildungsgängen des Berufskollegs (Ausbildungs- und
+              Prüfungsordnung Berufskolleg – APO-BK) vom 26. Mai 1999 (SGV.
+              NRW. 223/BASS 13–33 Nr. 1.1)
+              </li>
+            </ul>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- Innenteil -->
+    <div class="page grid" orientation="landscape" size="A3">
+      <div class="main-grid">
+        <div class="main-left grid">
+          <div class="main">
+            <Voffset v="2"/>
+            2. Seite des Zeugnisses der Allgemeinen Hochschulreife für {s.Vorname} {s.Zusatz || ''} {s.Name}
+            <Voffset v="2"/>
+            <b>Block I: Ergebnisse in der Qualifikationsphase</b>
+            <div class="klein">
+              (Die Bewertungen von Halbjahresergebnissen, die nicht in
+              die Gesamtqualifikation eingehen, sind in Klammern gesetzt. Es
+              müssen 32 bis 40 Halbjahresergebnisse eingebracht werden.)
+            </div>
+            <table class="table table-bordered" width="100%">
+              <tr>
+                <td>Fach<sup>1</sup></td>
+                <td colspan="4">Bewertung<sup>2</sup>
+                <br />Halbjahresergebnisse in einfacher Wertung</td>
+              </tr>
+              <tr>
+                <td colspan="1"></td>
+                <td>1. Halbjahr</td>
+                <td>2. Halbjahr</td>
+                <td>3. Halbjahr</td>
+                <td>4. Halbjahr</td>
+              </tr>
+              {#each ['Sprachlich-literarisch-künstlerisches Aufgabenfeld',
+                      'Gesellschaftswissenschaftliches Aufgabenfeld',
+                      'Mathematisch-naturwissenschaftlich-technisches Aufgabenfeld'] as aufgabenfeld,i}
+                <tr>
+                  <td colspan="5">{aufgabenfeld}</td>
+                </tr>
+                {#each s.abi_abschluss_faecher.filter(f => f.fach.Aufgabenfeld === (i+1).toString()) as f}
+                  <tr>
+                    <td>{f.fach.Bezeichnung} {['1', '2'].includes(f.AbiFach) ? '(eA)' : ''}</td>
+                    <td class="text-center">{f.R12_1 === '-' ? `(${f.P12_1 || '–'})` : f.P12_1}</td>
+                    <td class="text-center">{f.R12_2 === '-' ? `(${f.P12_2 || '–'})` : f.P12_2}</td>
+                    <td class="text-center">{f.R13_1 === '-' ? `(${f.P13_1 || '–'})` : f.P13_1}</td>
+                    <td class="text-center">{f.R13_2 === '-' ? `(${f.P13_2 || '–'})` : f.P13_2}</td>
+                  </tr>
+                {/each}
+              {/each}
+              <tr>
+                <td colspan="5">&nbsp;</td>
+              </tr>
+              {#each ['RE', 'SP'] as fach,i}
+                {#each s.abi_abschluss_faecher.filter(f => f.FachKrz === fach) as f}
+                  <tr>
+                    <td>{f.fach.Bezeichnung}</td>
+                    <td class="text-center">{f.R12_1 === '-' ? `(${f.P12_1 || '–'})` : f.P12_1}</td>
+                    <td class="text-center">{f.R12_2 === '-' ? `(${f.P12_2 || '–'})` : f.P12_2}</td>
+                    <td class="text-center">{f.R13_1 === '-' ? `(${f.P13_1 || '–'})` : f.P13_1}</td>
+                    <td class="text-center">{f.R13_2 === '-' ? `(${f.P13_2 || '–'})` : f.P13_2}</td>
+                  </tr>
+                {/each}
+              {/each}
+            </table>
+          </div>
+          <div class="footer">
+            <div class="klein eng">
+              Schulnummer: {schule.SchulNr}
+              <hr />
+              <sup>1</sup>Leistungskursfächer werden mit dem Klammerzusatz
+              „eA“ (erhöhtes Anforderungsniveau) gekennzeichnet. Grundkurse
+              bleiben ohne besondere Kennzeichnung.
+              <Voffset v="0.5"/>
+              <sup>2</sup> Für die Umsetzung der Noten in Punkte gilt:
+              <table class="table table-bordered table-eng" width="100%">
+                <tr>
+                  <td width="5%"></td>
+                  {#each ['sehr gut', 'gut', 'befriedigend', 'ausreichend', 'mangelhaft', 'ungenügend'] as n}
+                    <td class="text-center" width="10%">{n}</td>
+                  {/each}
+                </tr>
+                <tr>
+                  <td>Noten</td>
+                  {#each [1,2,3,4,5] as i}
+                    <td class="text-center">
+                      <div class="flex-grid">
+                        <div class="col">+</div>
+                        <div class="col">{i}</div>
+                        <div class="col">-</div>
+                      </div>
+                    </td>
+                  {/each}
+                  <td class="text-center">6</td>
+                </tr>
+                <tr>
+                  <td>Punkte</td>
+                  {#each [[15,14,13],[12,11,10],['09','08','07'],['06','05','04'],['03','02','01']] as ii}
+                    <td class="text-center">
+                      <div class="flex-grid">
+                        {#each ii as i}
+                          <div class="col">{i}</div>
+                        {/each}
+                      </div>
+                    </td>
+                  {/each}
+                  <td class="text-center">00</td>
+                </tr>
+              </table>
+            </div>
+          </div>
+        </div>
+        <div class="main-right grid">
+          <div class="main">
+            <Voffset v="2"/>
+            3. Seite des Zeugnisses der Allgemeinen Hochschulreife für {s.Vorname} {s.Zusatz || ''} {s.Name}
+            <Voffset v="2"/>
+            <b>Block II: Ergebnisse in der Abiturprüfung</b>
+            <Voffset v="0.5"/>
+            <table class="table table-bordered" width="100%">
+              <tr>
+                <td rowspan="2">Prüfungsfach<sup>1</sup></td>
+                <td colspan="2">Ergebnisse<br />in einfacher Wertung</td>
+                <td class="text-center" rowspan="2">Gesamtergebnis<sup>2</sup></td>
+              </tr>
+              <tr>
+                <td class="text-center">schriftlich</td>
+                <td class="text-center">mündlich</td>
+              </tr>
+              {#each s.abi_abschluss_faecher.filter(f => ['1', '2', '3'].includes(f.AbiFach)).sort((a,b) => a.AbiFach-b.AbiFach) as f}
+                <tr>
+                  <td>{f.fach.Bezeichnung} {['1', '2'].includes(f.AbiFach) ? '(eA)' : ''}</td>
+                  <td class="text-center">{f.AbiPruefErgebnis || '–'}</td>
+                  <td class="text-center">{f.MdlPruefErgebnis || '–'}</td>
+                  <td class="text-center">{f.AbiErgebnis}</td>
+                </tr>
+              {/each}
+              {#each s.abi_abschluss_faecher.filter(f => f.AbiFach === '4') as f}
+                <tr>
+                  <td>{f.fach.Bezeichnung}</td>
+                  <td class="text-center">–</td>
+                  <td class="text-center">{f.AbiPruefErgebnis}</td>
+                  <td class="text-center">{f.AbiErgebnis}</td>
+                </tr>
+              {/each}
+            </table>
+            <Voffset v="2"/>
+            <b>Berechnung der Gesamtqualifikation und der Durchschnittsnote</b>
+            <Voffset v="1"/>
+            Block I:
+            <div class="flex-grid">
+              <div class="col-2">
+                Punktsumme aus den Halbjahresergebnissen<sup>3</sup>
+                <br />Berechnung gemäß Formel
+                <Voffset v="1"/>
+                <div class="text-center"><img src="daten/abiturformel.png" width="60" alt="Abiformel"/></div>
+              </div>
+              <div class="col text-center"><h5>{s.abi_abschluss.Punktsumme_I}</h5></div>
+              <div class="col">mindestens 200,<br>höchstens 600 Punkte</div>
+            </div>
+            <Voffset v="1"/>
+            <div class="klein">P = Erzielte Punkte in den eingebrachten Fächern<sup>4</sup>
+            <br />S = Anzahl der Schulhalbjahresergebnisse. Doppelt gewichtete Fächer zählen auch hier doppelt</div>
+            <Voffset v="1"/>
+            Block II:
+            <div class="flex-grid">
+              <div class="col-2">
+                Punktsumme aus den Gesamtergebnissen in den Prüfungsfächern in 5-facher Wertung
+              </div>
+              <div class="col text-center"><h5>{s.abi_abschluss.Punktsumme_II}</h5></div>
+              <div class="col">mindestens 100,<br>höchstens 300 Punkte</div>
+            </div>
+            <Voffset v="1"/>
+            <div class="flex-grid">
+              <div class="col-2">Gesamtpunktzahl:</div>
+              <div class="col text-center"><h5>{s.abi_abschluss.GesamtPunktzahl}</h5></div>
+              <div class="col">
+                mindestens 300,<br>höchstens 900 Punkte
+              </div>
+            </div>
+            <Voffset v="1"/>
+            <div class="flex-grid">
+              <div class="col-2">Durchschnittsnote:</div>
+              <div class="col text-center"><h5>{s.abi_abschluss.Note}</h5></div>
+              <div class="col">In Worten: {@html noteInWorten(s.abi_abschluss.Note)}</div>
+            </div>
+            <Voffset v="1"/>
+            <b>Fremdsprachen</b>
+            <Voffset v="1"/>
+            <table class="table table-bordered" width="100%">
+            <tr><td>Fach</td><td>Jahrgangsstufen</td><td>Niveau gemäß GER<sup>5</sup></td></tr>
+              {#each s.sprachenfolgen as sprache}
+                <tr>
+                  <td>{sprache.fach.Bezeichnung}</td>
+                  <td>von {sprache.JAHRGANGVON} bis {sprache.JAHRGANGBIS}</td>
+                  <td>{sprache.Referenzniveau || '–'}</td>
+                </tr>
+              {/each}
+            </table>
+          </div>
+          <div class="footer klein eng">
+            <hr>
+            <sup>1</sup>Leistungskursfächer werden mit dem Klammerzusatz „eA“
+            (erhöhtes Anforderungsniveau) gekennzeichnet.
+            <Voffset v="0.5"/>
+            <sup>2</sup> Die Ergebnisse der schriftlichen und der mündlichen
+            Prüfung sind hierbei im Verhältnis 2:1 gewichtet. Das
+            Gesamtergebnis ist in 5-facher Wertung angegeben; es wurde auf
+            eine ganzzahlige Punktzahl gerundet; dabei wurde ab der Dezimalen
+            5 aufgerundet.
+            <Voffset v="0.5"/>
+            <sup>3</sup> Es müssen mindestens 32 Halbjahresergebnisse
+            eingebracht werden. Die Punktsumme (E) wurde auf eine ganzzahlige
+            Punktzahl gerundet; dabei wurde ab der Dezimalen 5 aufgerundet.
+            <Voffset v="0.5"/>
+            <sup>4</sup> Die Ergebnisse in den Leistungskursfächern werden
+            doppelt gewichtet.
+            <Voffset v="0.5"/>
+            <sup>5</sup> Für die modernen Fremdsprachen schließt das Zeugnis
+            den „Europäischen Referenzrahmen für Sprachen: Lernen, Lehren,
+            Beurteilen“ ein. Sind zwei Referenzniveaus ausgewiesen, ist das
+            niedrigere in vollem Umfang, das höhere in Anteilen erreicht.
+          </div>
+        </div>
+      </div>
+    </div>
+  {/each}
+{/each}
+<script>
+  export const kommentar = `
+[Anlage D 41](https://bass.schul-welt.de/3129.htm#13-33nr11A_D41)
+[§24](https://bass.schul-welt.de/3129.htm#pgfId-1290315)
+Der Name der Bildungsgangleitung wird momentan über die Eingabe in der
+Fachklasse Ebene2 eingegeben.
+`
+  import { datum, bemerkungen, bg, noteInWorten }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Fussnote from './partials/Fussnoten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+  @import 'css/a3-landscape.css';
+  .sl {
+    position: relative;
+    bottom: -126px;
+    left: -90px;
+  }
+  /* div {
+    box-sizing: border-box;
+    border: thin solid #ddd;
+  } */
+  .table-bordered {
+    border-collapse: collapse;
+  }
+  .table-bordered tr td {
+    border: thin solid #ddd;
+    padding: 8px;
+    line-height: 1.3rem }
+  .table-eng tr td {
+    margin-bottom: 0;
+    padding: 1px;
+  }
+</style>

+ 82 - 0
AHR Abiturergebnisse.svelte

@@ -0,0 +1,82 @@
+{#each chunk(schueler, anzahl) as slice, i}
+  <div class="page grid" orientation="landscape" size="A4">
+    <div class="header">
+      <pre>
+        Übersicht der Abiturergebnisse <b>{klasse.Klasse || schueler[0].Klasse}</b> &Tab; Stand: {heute()}
+      </pre>
+    </div>
+    <div class="main">
+      <Voffset v=1/>
+      <table class="table-bordered" width="100%">
+        <tr>
+          <th rowspan="2" width="30px">Nr</th>
+          <th rowspan="2" style="text-align: left;">Name</th>
+          <th colspan="2" width="50px">1. Fach (LK1)</th>
+          <th colspan="2" width="50px">2. Fach (LK2)</th>
+          <th colspan="2" width="50px">3. Fach (GK)</th>
+          <th colspan="2" width="50px">4. Fach (mdl)</th>
+          <th rowspan="2" width="50px">Abitur- note</th>
+          <th rowspan="2" width="70px">Summe Block I</th>
+          <th rowspan="2" width="70px">vorl. Gesamt- summe</th>
+          <th rowspan="2" width="70px">Noten- sprung</th>
+          <th rowspan="2" width="50px">Diff</th>
+          <th rowspan="2" width="70px">mdl Pfl.- Prfg</th>
+          <th rowspan="2" width="70px">mdl Best.- Prfg</th>
+        </tr>
+        <tr>
+          <th>Fach</th><th>Note</th>
+          <th>Fach</th><th>Note</th>
+          <th>Fach</th><th>Note</th>
+        </tr>
+        {#each slice as s, ii}
+          <tr>
+            <td><b>{i*anzahl+ii+1}</b></td>
+            <td style="text-align: left;"><b>{s.Name}, {s.Vorname}</b></td>
+            {#each s.abi_abschluss_faecher.filter(f => ['1', '2', '3', '4'].includes(f.AbiFach)).sort(f => f.AbiFach).reverse() as f}
+              <td>{f.FachKrz}</td>
+              <td>{f.AbiPruefErgebnis}</td>
+            {/each}
+              <td>{s.abi_abschluss.Note}</td>
+              <td>{s.abi_abschluss.Punktsumme_I}</td>
+              <td>{s.abi_abschluss.GesamtPunktzahl}</td>
+              <td>{s.abi_abschluss.Notensprung}</td>
+              <td>{s.abi_abschluss.Notensprung && s.abi_abschluss.GesamtPunktzahl ? (s.abi_abschluss.Notensprung-s.abi_abschluss.GesamtPunktzahl) : ''}</td>
+              <td>{s.abi_abschluss_faecher.find(f=>f.MdlPflichtPruefung === '+') ? 'X' : ''}</td>
+              <td>{s.abi_abschluss_faecher.find(f=>f.MdlBestPruefung === '+') ? 'X' : ''}</td>
+          </tr>
+        {/each}
+      </table>
+    </div>
+    <div class="footer">Seite {i+1}/{Math.ceil(schueler.length/anzahl)}</div>
+  </div>
+{/each}
+
+<script>
+  import { datum, chunk }  from './helfer'
+  import Voffset from './partials/Voffset.svelte'
+  export let schueler, schule, privat, jahr, abschnitt, klasse
+  const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
+  const heute = () => new Date().toLocaleDateString('de', {day: '2-digit', month: '2-digit', year: 'numeric'})
+  const anzahl = 25
+</script>
+
+<style>
+  @import 'css/main.css';
+  @import 'css/a4-landscape.css';
+
+  .table-bordered {
+    border-collapse: collapse;
+  }
+  .table-bordered tr th {
+    border: thin solid #ddd;
+  }
+  .table-bordered tr td {
+    border: thin solid #ddd;
+    line-height: 1.3rem;
+    padding: 3px;
+    text-align: center;
+  }
+  .table-eng {
+    margin-bottom: 0;
+  }
+</style>

+ 57 - 0
AHR Bescheinigung BP.svelte

@@ -0,0 +1,57 @@
+{#each schueler as s}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+  <div class="page grid" orientation="portrait" size="A4">
+    <Seitenlogo logo="{privat.traegerLogo}"/>
+    <Pageheader logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+    <div class="main">
+      <div class="text-center">
+        <h4>Bescheinigung</h4>
+        <Voffset v="4"/>
+        <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name}</b>
+        <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+        <br>hat den doppelqualifizierenden Bildungsgang
+        <Voffset v="2"/>
+        <b>Erzieher{s.Geschlecht===3 ? '':'in'}/AHR</b>
+      </div>
+      <Voffset v="2"/>
+      seit dem {datum(s.BeginnBildungsgang)} besucht. {s.Geschlecht===3 ? 'Er':'Sie'} hat die Berechtigung zum Übergang in das Berufspraktikum erworben.
+      <Voffset v="9"/>
+      <div class="flex-grid">
+        <div class="col">
+          {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+        </div>
+        <div class="col">
+          <Voffset v="3"/>
+          <div class="text-center klein">Siegel</div>
+        </div>
+        <div class="col">
+          <Voffset v="6"/>
+          <hr />
+          <div class="text-center klein">
+            {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+          </div>
+          </div>
+      </div>
+      <Voffset v="2"/>
+    </div>
+    <div class="footer klein" style="text-align:right">
+      Schulnummer: {schule.SchulNr}
+    </div>
+  </div>
+{/each}
+{/each}
+
+<script>
+  export let schueler, schule, privat, jahr, abschnitt
+  import { datum }  from './helfer'
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+</style>
+
+

+ 90 - 0
AHR Bescheinigung Bewerbung.svelte

@@ -0,0 +1,90 @@
+{#each schueler as s}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+  <div class="page grid" orientation="portrait" size="A4">
+    <Seitenlogo logo="{privat.traegerLogo}"/>
+    <Pageheader logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+    <div class="main">
+      <h4>Bescheinigung für Bewerbungszwecke</h4>
+      <Voffset v="4"/>
+      <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name}</b>
+      <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+      <br>ist seit dem {datum(s.BeginnBildungsgang)} bis zur Aushändigung des Zeugnisses Schüler{s.Geschlecht===3 ? '':'in'} des Bildungsgangs
+      <b>Erzieherin/AHR, Erzieher/AHR</b>
+      <Voffset v="2"/>
+      Der allgemeine Prüfungsausschuss stellte in seiner Abschlusskonferenz am {datum(hj.Konferenzdatum)} fest:
+      <Voffset v="1"/>
+      {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} hat die staatliche <b>Berufsabschlussprüfung</b> am {hj.noten.find(n=>n.fach.FachKrz==='KO').Lernentw} bestanden.
+      <Voffset v="1"/>
+      <table width="80%">
+        <tr>
+          <td>Berufspraktische Leistungen</td>
+          <td class="td-fach-note"><span>{note(hj.noten.find(n => n.fach.FachKrz === 'BLgesamt').NotenKrz)}</span></td>
+        </tr>
+        <tr>
+          <td>Kolloquium</td>
+          <td class="td-fach-note"><span>{note(hj.noten.find(n => n.fach.FachKrz === 'KO').NotenKrz)}</span></td>
+        </tr>
+        <tr>
+          <td><b>Gesamtnote Berufspraxis</b></td>
+          <td class="td-fach-note"><b><span>{note(hj.noten.find(n => n.fach.FachKrz === 'BPgesamt').NotenKrz)}</span></b></td>
+        </tr>
+      </table>
+      <Voffset v="1"/>
+      {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} ist mit Abschluss des Berufspraktikums am {datum(hj.ZeugnisDatum)} berechtigt, die Berufsbezeichnung
+      <b>{bg(s, (s.Geschlecht === 3 ? 'Berufsbezeichnung_m' : 'Berufsbezeichnung_w'))}</b> zu führen.
+      <Voffset v="1"/>
+      Der Abschluss ist im Deutschen und Europäischen Qualifikationsrahmen dem Niveau {s.fachklasse.DQR_Niveau} zugeordnet.
+      <Voffset v="9"/>
+      <div class="flex-grid">
+        <div class="col">
+          {schule.Ort}, den {datum(hj.Konferenzdatum)}
+        </div>
+        <div class="col">
+          <Voffset v="3"/>
+          <div class="text-center klein">Siegel</div>
+        </div>
+        <div class="col">
+          <Voffset v="6"/>
+          <hr />
+          <div class="text-center klein">
+            {schule.SchulleiterVorname} {schule.SchulleiterName}
+            <br />Vorsitzender des allgemeinen Prüfungsausschusses
+          </div>
+          </div>
+      </div>
+      <Voffset v="2"/>
+    </div>
+    <div class="footer klein" style="text-align:right">
+      Schulnummer: {schule.SchulNr}
+    </div>
+  </div>
+{/each}
+{/each}
+
+<script>
+  export let schueler, schule, privat, jahr, abschnitt
+  import { datum, bg, note } from './helfer'
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+  .td-fach-note {
+    padding-bottom: .2rem;
+    padding-top: .2rem;
+    width: 12rem;
+  }
+  .td-fach-note span {
+    background-color: #dcdcdc !important;
+    text-align: center;
+    width: 10rem;
+    display: block;
+    margin: 0 auto;
+  }
+</style>
+
+
+

+ 63 - 0
AHR Durchschnittspunkte Zulassung.svelte

@@ -0,0 +1,63 @@
+<div class="page grid" orientation="portrait" size="A4">
+  <div class="header">
+    <pre>
+      Durchschnittspunkte Zulassung der Abiturfächer <b>{klasse.Klasse || schueler[0].Klasse}</b> &Tab; Stand: {heute()}
+    </pre>
+  </div>
+  <div class="main">
+    <Voffset v=1/>
+    <table class="table-bordered" width="100%">
+      <tr>
+        <th></th><th>1. LK</th><th>2. LK</th><th colspan="3">3. Abiturfach</th>
+      </tr>
+      <tr>
+        <th>Name</th><th>{eins()}</th><th>{zwei()}</th>{#each drei() as fach}<th>{fach}</th>{/each}
+      </tr>
+      {#each schueler as s}
+        <tr>
+          <td>{s.Name}, {s.Vorname[0]}.</td>
+          <td class="text-center">{fixed(s.abi_abschluss_faecher.find(f => f.AbiFach === '1').Durchschnitt)}</td>
+          <td class="text-center">{fixed(s.abi_abschluss_faecher.find(f => f.AbiFach === '2').Durchschnitt)}</td>
+          {#each drei() as fach}
+            {#each s.abi_abschluss_faecher.filter(f => f.AbiFach === '3') as s_fach}
+              <td class="text-center">{s_fach.FachKrz === fach ? fixed(s_fach.Durchschnitt) : ''}</td>
+            {/each}
+          {/each}
+        </tr>
+      {/each}
+    </table>
+  </div>
+</div>
+
+<script>
+  export let schueler, klasse
+  import { datum }  from './helfer'
+  import Voffset from './partials/Voffset.svelte'
+  const heute = () => new Date().toLocaleDateString('de', {day: '2-digit', month: '2-digit', year: 'numeric'})
+  let eins, zwei, drei
+  $: {
+    eins = () => schueler[0].abi_abschluss_faecher.find(f => f.AbiFach === '1').FachKrz
+    zwei = () => schueler[0].abi_abschluss_faecher.find(f => f.AbiFach === '2').FachKrz
+    drei = () => [...new Set(schueler.map(s => s.abi_abschluss_faecher.find(f => f.AbiFach === '3').FachKrz))]
+  }
+  const fixed = n => n ? n.toFixed(2) : null
+</script>
+<style>
+  @import 'css/main.css';
+  @import 'css/a4-portrait.css';
+
+  .table-bordered {
+    border-collapse: collapse;
+  }
+  .table-bordered tr th {
+    border: thin solid #ddd;
+  }
+  .table-bordered tr td {
+    border: thin solid #ddd;
+    line-height: 1.3rem;
+    padding: 3px;
+  }
+  .table-eng {
+    margin-bottom: 0;
+  }
+</style>

+ 236 - 0
AHR Schullaufbahnbescheinigung.svelte

@@ -0,0 +1,236 @@
+{#each schueler as s (s.ID)}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4">
+      <div class="header">
+        <Seitenlogo logo="{privat.traegerLogo}"/>
+        <Pageheader logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      </div>
+      <div class="main">
+        <div style="font-size: 12pt; line-height: 1.5em">Bescheinigung über die Schullaufbahn gemäß §13 APO-BK, Anlage D</div>
+        <div style="font-size: 11pt; line-height: 1.2em">Berufliches Gymnasium, Bereich Gesundheit und Soziales</div>
+        <Voffset v="0.5"/>
+        {s.anrede} <b>{s.Vorname} {s.Zusatz || ''} {s.Name}</b>, geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+        <br />besuchte im Schuljahr {hj.schuljahr} die Jahrgangsstufe {parseInt(hj.ASDJahrgang)+10}.{hj.Abschnitt} im Bildungsgang
+        <br /><b>{bg(s, 'Bereich')}</b>.
+        <Voffset v="0.5"/>
+        In der Konferenz am {datum(hj.Konferenzdatum)} sind folgende Leistungen festgestellt worden:
+        <table class="table table-bordered table-eng">
+          <tr>
+            <td rowspan="2">Fach<sup>1</sup></td>
+            <td rowspan="2" width="20px">Aufg.- feld<sup>2</sup></td>
+            <td rowspan="2" width="20px">Abitur- fach<sup>3</sup></td>
+            {#if s.ASDSchulform === 'D01'}
+              <td rowspan="2" width="20px">Fach der Berufs- abschlussprüfung</td>
+            {/if}
+            <td colspan="4">Leistungen im Halbjahr<sup>4, 5</sup></td>
+          </tr>
+          <tr>
+            <td class="text-center">12.1</td>
+            <td class="text-center">12.2</td>
+            <td class="text-center">13.1</td>
+            <td class="text-center">13.2</td>
+          </tr>
+          {#each s.abi_abschluss_faecher.sort((a, b) => a.FSortierung < b.FSortierung ? -1 : 1) as f}
+            <tr>
+              <td>{f.fach.Zeugnisbez}</td>
+              <td class="text-center">{'I'.repeat(f.fach.Aufgabenfeld)}</td>
+              <td class="text-center">{f.AbiFach || ''}</td>
+              {#if s.ASDSchulform === 'D01'}
+                <td class="text-center">{(parseInt(f.AbiFach) > 0 && parseInt(f.AbiFach) < 4) || f.FachKrz === 'DM' ? '+' : ''}</td>
+              {/if}
+              <td class="text-center">{f.P12_1 || '–'}</td>
+              <td class="text-center">{f.P12_2 || '–'}</td>
+              <td class="text-center">{f.P13_1 || '–'}</td>
+              <td class="text-center">{f.P13_2 || '–'}</td>
+            </tr>
+          {/each}
+        </table>
+        Versäumte Stunden: {parseInt(hj.SumFehlStd) || 0}, davon unentschuldigt: {parseInt(hj.SumFehlStdU) || 0}
+        <Voffset v="0.5"/>
+        Kurse unter 5 Punkten in den Fächern und Jahrgangsstufen:
+        <table>
+          <tr>
+            <td width="7%"><b>12.1:</b></td>
+            <td width="40%">{s.abi_abschluss_faecher.filter(f => parseInt(f.P12_1) < 5 && parseInt(f.P12_1) > 0).map(f => f.fach.Bezeichnung).join(', ') || '- keine -'}</td>
+            {#if hj.Jahrgang === 3 || hj.Jahrgang === 2 && hj.Abschnitt === 2}
+              <td width="7%"><b>12.2:</b></td>
+              <td width="40%">{s.abi_abschluss_faecher.filter(f => parseInt(f.P12_2) < 5 && parseInt(f.P12_2) > 0).map(f => f.fach.Bezeichnung).join(', ') || '- keine -'}</td>
+            {/if}
+          </tr>
+          {#if hj.Jahrgang === 3}
+            <tr>
+              <td><b>13.1:</b></td>
+              <td width="40%">{s.abi_abschluss_faecher.filter(f => parseInt(f.P13_1) < 5 && parseInt(f.P13_1) > 0).map(f => f.fach.Bezeichnung).join(', ') || '- keine -'}</td>
+              {#if hj.Jahrgang === 3 && hj.Abschnitt === 2}
+                <td width="7%"><b>13.2:</b></td>
+                <td width="40%">{s.abi_abschluss_faecher.filter(f => parseInt(f.P13_2) < 5 && parseInt(f.P13_2) > 0).map(f => f.fach.Bezeichnung).join(', ') || '- keine -'}</td>
+              {/if}
+            </tr>
+          {/if}
+        </table>
+        <Voffset v="0.5"/>
+        {#if s.abi_abschluss_faecher.some(f => [f.P12_1, f.P12_2, f.P13_1, f.P13_2].some(ff => parseInt(ff) < 5 && parseInt(ff) > 0))}
+          Ihre Schullaufbahn weist Defizite auf, durch die die Zulassung zur
+          Abiturprüfung
+          {#if s.ASDSchulform === 'D01'}
+            und zur Berufsabschlussprüfung
+          {/if}
+          gefährdet wird.
+        {/if}
+        <Voffset v="0.5"/>
+        <b>Bemerkungen:</b> {@html bemerkungen(hj)}
+      </div>
+      <div class="footer">
+        <div class="flex-grid">
+          <div class="col-2">
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            <hr />
+            {schule.SchulleiterVorname} {schule.SchulleiterName}
+            <br />{schule.schulleiter_in}
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            Siegel
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            <hr />
+            {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+          </div>
+        </div>
+        <div class="flex-grid">
+          <div class="col-2"></div>
+          <div class="col-2">
+            <Voffset v="1"/>
+            Die Kenntnisnahme wird bestätigt:
+          </div>
+          <div class="col">
+            <Voffset v="3"/>
+            <hr />
+            <div class="klein text-center">
+              {volljaehrigBei(s, hj.ZeugnisDatum) ? s.schueler_in : 'Erziehungsberechtigte'}
+            </div>
+          </div>
+        </div>
+        <div class="klein eng">
+          Schulnummer: {schule.SchulNr}
+          <hr />
+          <table>
+            <tr>
+              <td><sup>1</sup> </td>
+              <td colspan="5">In der Reihenfolge der erlassenen Stundentafel</td>
+            </tr>
+            <tr>
+              <td rowspan="4" valign="top"><sup>2</sup> </td>
+              <td>I</td>
+              <td width="70%">= sprachlich literarisches Aufgabenfeld</td>
+              <td align="right" rowspan="4" valign="top"><sup>3</sup> </td>
+              <td>1</td>
+              <td>= erstes Leistungsfach</td>
+            </tr>
+            <tr>
+              <td>II</td>
+              <td>= gesellschaftswissenschaftliches Aufgabenfeld</td>
+              <td>2</td>
+              <td>= zweites Leistungsfach</td>
+            </tr>
+            <tr>
+              <td>III</td>
+              <td>= mathematisch-naturwissenschaftlich-technisches Aufgabenfeld</td>
+              <td>3</td>
+              <td>= drittes Abiturfach</td>
+            </tr>
+            <tr>
+              <td colspan="2"></td>
+              <td>4</td>
+              <td>= viertes Abiturfach</td>
+            </tr>
+          </table>
+          <sup>4</sup> Für die Umsetzung von Noten in Punkte gilt:
+          <table class="table table-bordered table-eng" width="80%">
+            <tr>
+              <td width="5%"></td>
+              {#each ['sehr gut', 'gut', 'befriedigend', 'ausreichend', 'mangelhaft', 'ungenügend'] as n}
+                <td class="text-center" width="10%">{n}</td>
+              {/each}
+            </tr>
+            <tr>
+              <td>Noten</td>
+              {#each [1,2,3,4,5] as i}
+                <td class="text-center">
+                  <div class="flex-grid">
+                    <div class="col">+</div>
+                    <div class="col">{i}</div>
+                    <div class="col">-</div>
+                  </div>
+                </td>
+              {/each}
+              <td class="text-center">6</td>
+            </tr>
+            <tr>
+              <td>Punkte</td>
+              {#each [[15,14,13],[12,11,10],['09','08','07'],['06','05','04'],['03','02','01']] as ii}
+                <td class="text-center">
+                  <div class="flex-grid">
+                    {#each ii as i}
+                      <div class="col">{i}</div>
+                    {/each}
+                  </div>
+                </td>
+              {/each}
+              <td class="text-center">00</td>
+            </tr>
+          </table>
+          <Voffset v=".5"/>
+          <table>
+            <tr>
+              <td width="1%"><sup>5</sup> </td>
+              <td width="3%">E1</td>
+              <td width="40%">= Mit besonderem Erfolg teilgenommen</td>
+              <td width="3%">E2</td>
+              <td width="30%">= Mit Erfolg teilgenommen</td>
+              <td width="3%">E3</td>
+              <td width="15%">= Teilgenommen</td>
+            </tr>
+          </table>
+        </div>
+      </div>
+    </div>
+    <div class="page grid" orientation="portrait" size="A4">
+      <div class="footer grau">
+        <Fussnote {schule}></Fussnote>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  export const kommentar = `
+[Anlage D 33a](https://bass.schul-welt.de/3129.htm#AnlageD33a)
+[VV](https://bass.schul-welt.de/3129.htm#pgfId-3910124)
+  `
+  import { datum, versetzungsvermerk, volljaehrigBei, bemerkungen, bg }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Fussnote from './partials/Fussnoten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  const aktHalbjahr = a => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+  .table-bordered {
+    border-collapse: collapse; }
+  .table-bordered td {
+    border: thin solid #ddd;
+    line-height: 1.3rem }
+  .table-eng {
+    margin-bottom: 0;
+  }
+</style>

+ 90 - 0
AHR Vornoten Abitur.svelte

@@ -0,0 +1,90 @@
+{#each chunk(schueler, anzahl) as slice, i}
+  <div class="page grid" orientation="landscape" size="A3">
+    <div class="header">
+      <pre>
+        Konferenzliste APA BK Abitur <b>{klasse.Klasse || schueler[0].Klasse}</b> &Tab; {aktAbschnitt().klassenlehrer_in}: <b>{`${aktAbschnitt().lehrer.Vorname} ${aktAbschnitt().lehrer.Nachname} (${aktAbschnitt().lehrer.Kuerzel})`}</b> &Tab; Stand: {heute()}
+      </pre>
+    </div>
+    <div class="main">
+      {#each slice as s, ii}
+        <b>{(i*anzahl)+ii+1}. {s.Name}, {s.Vorname}</b>
+        <div class="flex-grid">
+          <div class="tabelle">
+            <table>
+              {#each zeilen(faecher(s)) as row}
+                <tr>
+                  {#each row as cell}
+                    <td class:red={parseInt(cell) < 5 && parseInt(cell) >= 0}>{cell}</td>
+                  {/each}
+                </tr>
+              {/each}
+              <tr><td>✎ → </td>
+              {#each s.abi_abschluss_faecher as i}
+              <td></td>
+              {/each}
+              </tr>
+            </table>
+          </div>
+          <div class="bemerkungen">
+            Bermerkungen:
+            {#each '12345' as i}
+              <hr>
+              <Voffset v='1.5' />
+            {/each}
+            Zugelassen: {s.abi_abschluss.Zugelassen === '+' ? "Ja":"Nein"}
+          </div>
+        </div>
+        <Voffset v=1 />
+      {/each}
+    </div>
+    <div class="footer">Seite {i+1}/{Math.ceil(schueler.length/anzahl)}</div>
+  </div>
+{/each}
+
+<script>
+  import { datum, chunk, punkte2note }  from './helfer'
+  import Voffset from './partials/Voffset.svelte'
+  export let schueler, schule, privat, jahr, abschnitt, klasse
+
+  const anzahl = 5
+  const heute = () => new Date().toLocaleDateString('de', {day: '2-digit', month: '2-digit', year: 'numeric'})
+  const aktAbschnitt = () => schueler[0].abschnitte.slice(-1)[0]
+  function faecher (s) {
+    return s.abi_abschluss_faecher.sort((a,b) => a.FSortierung - b.FSortierung)
+  }
+  function zeilen (faecher) {
+    const arr = [[''], ['12.1'], ['12.2'], ['13.1'], ['13.2']]
+    faecher.forEach(f => {
+      arr[0].push(f.FachKrz)
+      arr[1].push(f.P12_1 || '')
+      arr[2].push(f.P12_2 || '')
+      arr[3].push(f.P13_1 || '')
+      arr[4].push(f.P13_2 || '')
+    })
+    return arr
+  }
+</script>
+
+<style>
+  @import 'css/main.css';
+  @import 'css/a3-landscape.css';
+  table {
+    width: 98%;
+    border-collapse: collapse;
+  }
+  table td {
+    border: thin solid #ddd;
+    white-space:nowrap;
+    text-align: center;
+  }
+  .flex-grid {
+    display: flex;
+  }
+  .tabelle {
+    flex: 65%;
+  }
+  .bemerkungen {
+    flex: 35%;
+  }
+  .red { background-color: tomato; }
+</style>

+ 87 - 0
AHR Vornoten BA.svelte

@@ -0,0 +1,87 @@
+{#each chunk(schueler, anzahl) as slice, i}
+  <div class="page grid" orientation="landscape" size="A3">
+    <div class="header">
+      <pre>
+        Konferenzliste APA BK Berufsabschluss <b>{klasse.Klasse || schueler[0].Klasse}</b> &Tab; {aktAbschnitt().klassenlehrer_in}: <b>{`${aktAbschnitt().lehrer.Vorname} ${aktAbschnitt().lehrer.Nachname} (${aktAbschnitt().lehrer.Kuerzel})`}</b> &Tab; Stand: {heute()}
+      </pre>
+    </div>
+    <div class="main">
+      {#each slice as s, ii}
+        <b>{(i*anzahl)+ii+1}. {s.Name}, {s.Vorname}</b>
+        <div class="flex-grid">
+          <div class="tabelle">
+            <table>
+              {#each zeilen(faecher(s)) as row}
+                <tr>
+                  {#each row as cell}
+                    <td>{cell}</td>
+                  {/each}
+                </tr>
+              {/each}
+            </table>
+          </div>
+          <div class="bemerkungen">
+            Bermerkungen:
+            {#each '12345' as i}
+              <hr>
+              <Voffset v=2 />
+            {/each}
+          </div>
+        </div>
+        <Voffset v=1 />
+      {/each}
+    </div>
+    <div class="footer">Seite {i+1}/{Math.ceil(schueler.length/anzahl)}</div>
+  </div>
+{/each}
+
+<script>
+  import { datum, chunk, punkte2note }  from './helfer'
+  import Voffset from './partials/Voffset.svelte'
+  export let schueler, schule, privat, jahr, abschnitt, klasse
+
+  const anzahl = 5
+  const heute = () => new Date().toLocaleDateString('de', {day: '2-digit', month: '2-digit', year: 'numeric'})
+  const aktAbschnitt = () => schueler[0].abschnitte.slice(-1)[0]
+  function faecher (s) {
+    return s.abi_abschluss_faecher.filter(f => f.fach.Fachgruppe_ID !== 30).sort((a,b) => a.FSortierung - b.FSortierung)
+  }
+  function zeilen (faecher) {
+    const arr = [[''], ['13.1'], ['13.2'], ['VN'], ['SP'], ['BA']]
+    faecher.forEach(f => {
+      const anzahlNoten = [f.P13_1, f.P13_2].filter(n => parseInt(n) > 0).length
+      const vornote = Math.round((parseFloat(f.P13_1 || 0.0) + parseFloat(f.P13_2 || 0.0)) / anzahlNoten)
+      arr[0].push(f.FachKrz)
+      arr[1].push(punkte2note(f.P13_1) || '')
+      arr[2].push(punkte2note(f.P13_2) || '')
+      arr[3].push(parseInt(punkte2note(vornote)) || '–')
+      arr[4].push('123'.includes(f.AbiFach) ? (punkte2note(parseInt(f.AbiPruefErgebnis)) || '') : '')
+      if ('123'.includes(f.AbiFach) && !f.AbiPruefErgebnis) arr[5].push('…')
+      else arr[5].push(parseInt(punkte2note('123'.includes(f.AbiFach) ? (Math.round((vornote + parseInt(f.AbiPruefErgebnis))/2)) : vornote)))
+    })
+    return arr
+  }
+</script>
+
+<style>
+  @import 'css/main.css';
+  @import 'css/a3-landscape.css';
+  table {
+    width: 98%;
+    border-collapse: collapse;
+  }
+  table td {
+    border: thin solid #ddd;
+    white-space:nowrap;
+    text-align: center;
+  }
+  .flex-grid {
+    display: flex;
+  }
+  .tabelle {
+    flex: 65%;
+  }
+  .bemerkungen {
+    flex: 35%;
+  }
+</style>

+ 125 - 0
Allg AGZ.svelte

@@ -0,0 +1,125 @@
+{#each schueler as s (s.ID)}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader art="daten/agz.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <div style="font-size: 15pt; line-height: 1.5em">
+          {bg(s, 'Schulform')}
+        </div>
+        <div style="font-size: 12pt; line-height: 1.2em">
+          {bg(s, 'Bereich')}
+          {#if s.ASDSchulform.startsWith('B')}
+            <br />
+            Abschluss {@html s.Geschlecht === 3 ? bg(s, 'Berufsbezeichnung_m') : bg(s, 'Berufsbezeichnung_w')}
+          {/if}
+        </div>
+        <Voffset v="1"/>
+        <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+        <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},<br />
+        war vom {datum(s.BeginnBildungsgang)} bis {datum(s.Entlassdatum)} {s.schueler_in}
+        des Bildungsgangs {bg(s, 'Zeugniskopf')}.
+        <br />{s.Geschlecht === 3 ? 'Er':'Sie'} war zuletzt {s.schueler_in} in der Klasse {s.Klasse}.
+        <Voffset v="2"/>
+        Leistungen laut Konferenzbeschluss vom {datum(hj.Konferenzdatum)}:
+        <button class="vbutton no-print" on:click="{() => zeigeBKAbschlussNoten = !zeigeBKAbschlussNoten}">
+          BK-Abschluss wird {zeigeBKAbschlussNoten ? '' : 'nicht'} verwendet
+        </button>
+        <Noten
+          noten={zeigeBKAbschlussNoten ? s.bk_abschluss_faecher : hj.noten}
+          fachGliederungen={s.fachklasse.fach_gliederungen}
+          ger
+          fachklasse={s.fachklasse.Kennung}
+          faechergruppenIds={[10,20,30]}
+        ></Noten>
+        <hr />
+        {#if zeigeVersetzungsvermerk}
+          <b>{versetzungsvermerk(hj)}</b>
+        {/if}
+        <button class="vbutton no-print" on:click="{() => zeigeVersetzungsvermerk = !zeigeVersetzungsvermerk}">
+          Versetzungsvermerk {zeigeVersetzungsvermerk ? 'entfernen' : 'anzeigen'}
+        </button>
+        <Voffset v="1"/>
+        <b>Bemerkungen</b><br />{@html bemerkungen(hj)}
+          {#if zeige_FHR}
+            <Voffset v="2"/>
+            {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} hat nach § 13 a Absatz 1 Anlage D
+            APO-BK mit der Versetzung in die Jahrgangsstufe 12 die
+            Voraussetzungen für die Zuerkennung des schulischen Teils der
+            Fachhochschulreife erfüllt. Der Abschluss ist im Deutschen und
+            Europäischen Qualifikationsrahmen dem Niveau 4 zugeordnet. Dieses
+            Zeugnis gilt in Verbindung mit dem Nachweis einer mindestens
+            zweijährigen abgeschlossenen Berufsausbildung nach Bundes- oder
+            Landesrecht als Nachweis der Fachhochschulreife. Es berechtigt
+            in den Ländern Nordrhein-Westfalen, Niedersachsen und
+            Schleswig-Holstein zum Studium an Fachhochschulen.
+            <Voffset v="2"/>
+            <table class="table-noten">
+              <tr>
+                <td>Durchschnittsnote:</td>
+                <td class="td-fach-note"><span>{s.fhr_abschluss && s.fhr_abschluss.Note}</span></td>
+                <td>in&nbsp;Worten:</td>
+                <td class="td-fach-note"><span>{@html s.fhr_abschluss && s.fhr_abschluss.Note && noteInWorten(s.fhr_abschluss.Note)}</span></td>
+              </tr>
+            </table>
+          {/if}
+          <button class="vbutton no-print" on:click="{() => zeige_FHR = !zeige_FHR}">
+            FHR abgeschlossen: {zeige_FHR ? 'Ja' : 'Nein'}
+          </button>
+      </div>
+      <div class="footer">
+        <div class="flex-grid">
+          <div class="col-2">
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            <hr />
+            {schule.SchulleiterVorname} {schule.SchulleiterName}<br />{schule.schulleiter_in}
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            Siegel
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            <hr />
+            {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+          </div>
+        </div>
+        <Fussnote {schule} ger></Fussnote>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  import { datum, versetzungsvermerk, volljaehrigBei, bemerkungen, bg, noteInWorten }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Noten from './partials/Noten.svelte'
+  import Fussnote from './partials/Fussnoten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  let zeigeVersetzungsvermerk = true
+  let zeigeBKAbschlussNoten = false
+  const aktHalbjahr = a => a.Jahr === jahr && a.Abschnitt === abschnitt
+  let zeige_FHR
+  const fhrFach = (s, fach, id) => {
+    const pid = 'P1' + id
+    if (!fach[pid]) return
+    const fach2 = s.fhr_abschluss_faecher.find(f => f.Fach_ID === fach.Fach_ID)
+    const rsid = 'RSII_' + id
+    return fach2[rsid] === '+' ? fach[pid] : `(${fach[pid]})`
+  }
+</script>
+
+<style>
+  @import 'css/main.css';
+  .vbutton {
+    background-color: red;
+    color: white;
+  }
+</style>

+ 47 - 0
Allg Fotoliste.svelte

@@ -0,0 +1,47 @@
+{#each chunk(schueler, 25) as slice}
+  <div class="page grid" orientation="portrait" size="A4">
+    <div class="main">
+      <b>{slice[0].Klasse}</b>
+      Stand: {datum(new Date())}
+      <div class="grid" style="font-size: 0.8rem">
+        {#each slice as s}
+          <div>
+            {#await foto(s) then f}
+              <img src="data:image/jpg;base64,{f}" alt="Foto" style="width: 120px">
+            {:catch}
+              Kein Foto
+            {/await}
+            <br>
+            {s.Name}, {s.Vorname}
+          </div>
+        {/each}
+      </div>
+    </div>
+  </div>
+{/each}
+
+<script>
+  import { datum, chunk } from './helfer'
+  export let schueler, knexConfig
+  const mysql = R('mysql')
+  var connection = mysql.createConnection(knexConfig.connection)
+  connection.connect()
+  async function foto (s) {
+    return new Promise((resolve, reject) => {
+      connection.query('SELECT Foto FROM `schuelerfotos` WHERE `Schueler_ID` = ?', [s.ID],
+        (err, rows) => {
+          if (err || rows.length===0) return reject(err);
+          resolve(Buffer.from(rows[0].Foto, 'binary').toString('base64'));
+      });
+    });
+  }
+</script>
+
+<style>
+  @import 'css/main.css';
+  .grid {
+    display: grid;
+    grid-template-columns: repeat(5, 1fr);
+    grid-gap: 10px;
+  }
+</style>

+ 79 - 0
Allg HJZ.svelte

@@ -0,0 +1,79 @@
+{#each schueler as s (s.ID)}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader art="daten/zeugnis.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <div style="font-size: 15pt; line-height: 1.5em">
+          {bg(s, 'Schulform')}
+        </div>
+        <div style="font-size: 12pt; line-height: 1.2em">
+          {bg(s, 'Bereich')}
+          {#if s.ASDSchulform.startsWith('B')}
+            <br />
+            Abschluss {@html s.Geschlecht === 3 ? bg(s, 'Berufsbezeichnung_m') : bg(s, 'Berufsbezeichnung_w')}
+          {/if}
+        </div>
+        <Voffset v="1"/>
+        <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+        <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},<br />
+        besuchte im {hj.Abschnitt}. Halbjahr des Schuljahres {hj.schuljahr} die Klasse {hj.Klasse}
+        <Voffset v="2"/>
+        Leistungen laut Konferenzbeschluss vom {datum(hj.Konferenzdatum)}:
+        <Noten noten={hj.noten} fachGliederungen={s.fachklasse.fach_gliederungen}></Noten>
+        <hr />
+        Fehlstunden: {Number(hj.SumFehlStd) || 0}{#if Number(hj.SumFehlStd) > 0}, davon unentschuldigt: {hj.SumFehlStdU || 0}<Voffset v="1"/>{/if}
+        <Voffset v="1"/>
+        <b>Bemerkungen</b><br />{@html bemerkungen(hj)}
+      </div>
+      <div class="footer">
+        <div class="flex-grid">
+          <div class="col-2">
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            <hr />
+            {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            Siegel
+          </div>
+        </div>
+        <div class="flex-grid">
+          <div class="col-2"></div>
+          <div class="col-2">
+            <Voffset v="1"/>
+            Die Kenntnisnahme wird bestätigt:
+          </div>
+          <div class="col">
+            <Voffset v="3"/>
+            <hr />
+            <div class="klein text-center">
+              {volljaehrigBei(s, hj.ZeugnisDatum) ? s.schueler_in : 'Erziehungsberechtigte'}
+            </div>
+          </div>
+        </div>
+        <Fussnote schule={schule}></Fussnote>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  import { datum, versetzungsvermerk, volljaehrigBei, bemerkungen, bg }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Noten from './partials/Noten.svelte'
+  import Fussnote from './partials/Fussnoten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  const aktHalbjahr = a => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+</style>

+ 104 - 0
Allg JZ.svelte

@@ -0,0 +1,104 @@
+{#each schueler as s (s.ID)}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader art="daten/zeugnis.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <div style="font-size: 15pt; line-height: 1.5em">
+          {bg(s, 'Schulform')}
+        </div>
+        <div style="font-size: 12pt; line-height: 1.2em">
+          {bg(s, 'Bereich')}
+          {#if s.ASDSchulform.startsWith('B')}
+            <br />
+            Abschluss {@html s.Geschlecht === 3 ? bg(s, 'Berufsbezeichnung_m') : bg(s, 'Berufsbezeichnung_w')}
+          {/if}
+        </div>
+        <Voffset v="1"/>
+        <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+        <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},<br />
+        {#if s.ASDSchulform.startsWith('E')}
+          besuchte das Schuljahr {hj.schuljahr} in der Klasse {hj.Klasse}
+        {:else}
+          besuchte im {hj.Abschnitt}. Halbjahr des Schuljahres {hj.schuljahr} die Klasse {hj.Klasse}
+        {/if}
+        <Voffset v="2"/>
+        Leistungen laut Konferenzbeschluss vom {datum(hj.Konferenzdatum)}:
+        <Noten noten={hj.noten} fachGliederungen={s.fachklasse.fach_gliederungen}></Noten>
+        <hr />
+        {#if !s.ASDSchulform.startsWith('E')}
+          Fehlstunden: {Number(hj.SumFehlStd) || 0}{#if Number(hj.SumFehlStd) > 0}, davon unentschuldigt: {hj.SumFehlStdU || 0}
+            <Voffset v="1"/>
+          {/if}
+        {/if}
+        <Voffset v="1"/>
+        <b>{versetzungsvermerk(hj)}</b>
+        <Voffset v="1"/>
+        {#if s.ASDSchulform.startsWith('C') && hj.VersetzungKrz==='V'}
+          Der Unterricht in der Klasse 12 kann nur aufgenommen werden, wenn
+          zu Beginn des 12. Schuljahres der Nachweis über die erfolgreiche
+          Ableistung des Praktikantenjahres gemäß
+          Praktikum-Ausbildungsordnung, RdErl. v. 11.12.2006 (BASS 13 – 31
+          Nr. 1) vorgelegt wird.
+          <Voffset v="1"/>
+        {/if}
+        <b>Bemerkungen</b><br />{@html bemerkungen(hj)}
+      </div>
+      <div class="footer">
+        <div class="flex-grid">
+          <div class="col-2">
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            <hr />
+            {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            Siegel
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            <hr />
+            {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+          </div>
+        </div>
+        <div class="flex-grid">
+          {#if !s.ASDSchulform.startsWith('E')}
+            <div class="col-2"></div>
+            <div class="col-2">
+              <Voffset v="1"/>
+              Die Kenntnisnahme wird bestätigt:
+            </div>
+            <div class="col">
+              <Voffset v="3"/>
+              <hr />
+              <div class="klein text-center">
+                {volljaehrigBei(s, hj.ZeugnisDatum) ? s.schueler_in : 'Erziehungsberechtigte'}
+              </div>
+            </div>
+          {/if}
+        </div>
+        <Fussnote schule={schule}></Fussnote>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  import { datum, versetzungsvermerk, volljaehrigBei, bemerkungen, bg }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Noten from './partials/Noten.svelte'
+  import Fussnote from './partials/Fussnoten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+</style>

+ 105 - 0
Allg Konferenzliste Punkte.svelte

@@ -0,0 +1,105 @@
+{#each chunk(schueler, anzahl) as slice, i}
+  <div class="page grid" orientation="landscape" size="A3" style="font-size: 1.1rem">
+    <div class="header">
+      <pre>
+        Konferenzliste <b>{klasse.Klasse || schueler[0].Klasse}</b> &Tab; {aktAbschnitt().klassenlehrer_in}: <b>{`${aktAbschnitt().lehrer.Vorname} ${aktAbschnitt().lehrer.Nachname} (${aktAbschnitt().lehrer.Kuerzel})`}</b> &Tab; Stand: {heute()} &Tab; Konferenzdatum: {datum(aktAbschnitt().Konferenzdatum)} &Tab; Zeugnisdatum: {datum(aktAbschnitt().ZeugnisDatum)}
+      </pre>
+    </div>
+    <div class="main">
+      <Voffset v=1/>
+      <table>
+        <tr>
+          <th><b>Nr</b></th>
+          <th><b>Name</b></th>
+          <th class="rotate"><div><span><b>FStd</b></span></div></th>
+          <th class="rotate"><div><span><b>uFStd</b></span></div></th>
+          {#each Array.from(faecher) as f}
+            <th class="rotate"><div><span><b>{f}</b></span></div></th>
+          {/each}
+          <th><b>Bemerkungen</b></th>
+        </tr>
+        <tr><td colspan="2" style="height: 4rem">Bitte abzeichnen</td>{#each Array.from(faecher) as f}<td></td>{/each}<td></td><td></td><td></td></tr>
+        {#each slice as s, ii}
+          {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+            <tr>
+              <td><b>{i*anzahl+ii+1}</b></td>
+              <td><b>{s.Name}, {s.Vorname}</b></td>
+              <td>{hj.SumFehlStd || 0}</td>
+              <td>{hj.SumFehlStdU || 0}</td>
+              {#each Array.from(faecher) as f}
+                {#each [hj.noten.find(n => n.fach.FachKrz === f)||{}] as n}
+                  <td class="text-center" style={note2punkte(n.NotenKrz) < 5 ? 'background:tomato;':''}>
+                    <span class:kreis={n.Warnung==='+'}>{note2punkte(n.NotenKrz) || '–'}</span>
+                  </td>
+                {/each}
+              {/each}
+              <td class="extraklein">{hj.ZeugnisBem || ''}</td>
+            </tr>
+          {/each}
+        {/each}
+      </table>
+    </div>
+    <div class="footer">Seite {i+1}/{Math.ceil(schueler.length/anzahl)}</div>
+  </div>
+{/each}
+
+<script>
+  import { datum, chunk, note2punkte }  from './helfer'
+
+  import Voffset from './partials/Voffset.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt, klasse
+  const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
+  const heute = () => new Date().toLocaleDateString('de', {day: '2-digit', month: '2-digit', year: 'numeric'})
+  const anzahl = 25
+  const aktAbschnitt = () => schueler[0].abschnitte.slice(-1)[0]
+  const faecher = new Set
+  schueler.forEach(s => s.abschnitte.find(aktHalbjahr).noten.forEach(n => {faecher.add(n.fach.FachKrz)}))
+</script>
+
+<style>
+  @import 'css/main.css';
+  @import 'css/a3-landscape.css';
+  table {
+    border-collapse: collapse;
+    width:auto;
+  }
+  table td {
+    border: thin solid #ddd;
+    line-height: 1.3rem;
+    padding: 9px;
+    white-space:nowrap;
+  }
+  table td.extraklein {
+    font-size: .6rem;
+    white-space:pre-wrap;
+    word-wrap:break-word;
+    vertical-align: top;
+    padding: 1px;
+  }
+  table td:last-child {
+    width: 100%;
+  }
+  th.rotate {
+    height: 30px;
+    white-space: nowrap;
+  }
+  th.rotate > div {
+    transform:
+      translate(20px, -3px)
+      rotate(315deg);
+    box-sizing: border-box;
+  }
+  th.rotate > div > span {
+    border-bottom: 1px solid #ccc;
+    width: 30px;
+    transform-origin: left bottom;
+    display: inline-block
+  }
+  .kreis {
+    border: 0.2rem solid red;
+    border-radius: 20%;
+    padding: 0.2rem;
+  }
+
+</style>

+ 106 - 0
Allg Konferenzliste.svelte

@@ -0,0 +1,106 @@
+{#each chunk(schueler, anzahl) as slice, i}
+  <div class="page grid" orientation="landscape" size="A3" style="font-size: 1.1rem">
+    <div class="header">
+      <pre>
+        Konferenzliste <b>{klasse.Klasse || schueler[0].Klasse}</b> &Tab; {aktAbschnitt().klassenlehrer_in}: <b>{`${aktAbschnitt().lehrer.Vorname} ${aktAbschnitt().lehrer.Nachname} (${aktAbschnitt().lehrer.Kuerzel})`}</b> &Tab; Stand: {heute()} &Tab; Konferenzdatum: {datum(aktAbschnitt().Konferenzdatum)} &Tab; Zeugnisdatum: {datum(aktAbschnitt().ZeugnisDatum)}
+      </pre>
+    </div>
+    <div class="main">
+      <Voffset v=1/>
+      <table>
+        <tr>
+          <th><b>Nr</b></th>
+          <th><b>Name</b></th>
+          <th class="rotate"><div><span><b>FStd</b></span></div></th>
+          <th class="rotate"><div><span><b>uFStd</b></span></div></th>
+          {#each Array.from(faecher) as f}
+            <th class="rotate"><div><span><b>{f}</b></span></div></th>
+          {/each}
+          <th><b>Bemerkungen</b></th>
+        </tr>
+        <tr><td colspan="2" style="height: 4rem">Bitte abzeichnen</td>{#each Array.from(faecher) as f}<td></td>{/each}<td></td><td></td><td></td></tr>
+        {#each slice as s, ii}
+          {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+            <tr>
+              <td><b>{i*anzahl+ii+1}</b></td>
+              <td><b>{s.Name}, {s.Vorname}</b></td>
+              <td>{hj.SumFehlStd || 0}</td>
+              <td>{hj.SumFehlStdU || 0}</td>
+              {#each Array.from(faecher) as f}
+                {#each [hj.noten.find(n => n.fach.FachKrz === f)||{}] as n}
+                  <td class="text-center" style={parseInt(n.NotenKrz) > 4 ? 'background:tomato;':''}>
+                    <span class:kreis={n.Warnung==='+'}>{n.NotenKrz || '–'}</span>
+                  </td>
+                {/each}
+              {/each}
+              <td class="extraklein">{hj.ZeugnisBem || ''}</td>
+            </tr>
+          {/each}
+        {/each}
+      </table>
+    </div>
+    <div class="footer">Seite {i+1}/{Math.ceil(schueler.length/anzahl)}</div>
+  </div>
+{/each}
+
+<script>
+  import { datum, chunk }  from './helfer'
+
+  import Voffset from './partials/Voffset.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt, klasse
+  const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
+  const heute = () => new Date().toLocaleDateString('de', {day: '2-digit', month: '2-digit', year: 'numeric'})
+  const anzahl = 25
+  const aktAbschnitt = () => schueler[0].abschnitte.slice(-1)[0]
+  const faecher = new Set
+  schueler.forEach(s => s.abschnitte.find(aktHalbjahr).noten.forEach(n => {faecher.add(n.fach.FachKrz)}))
+</script>
+
+<style>
+  @import 'css/main.css';
+  @import 'css/a3-landscape.css';
+  table {
+    border-collapse: collapse;
+    width:auto;
+  }
+  table td {
+    border: thin solid #ddd;
+    line-height: 1.3rem;
+    padding: 9px;
+    white-space:nowrap;
+  }
+  table td.extraklein {
+    font-size: .6rem;
+    white-space:pre-wrap;
+    word-wrap:break-word;
+    vertical-align: top;
+    padding: 1px;
+  }
+  table td:last-child {
+    width: 100%;
+  }
+  th.rotate {
+    height: 30px;
+    white-space: nowrap;
+  }
+  th.rotate > div {
+    transform:
+      translate(20px, -3px)
+      rotate(315deg);
+    box-sizing: border-box;
+  }
+  th.rotate > div > span {
+    border-bottom: 1px solid #ccc;
+    width: 30px;
+    transform-origin: left bottom;
+    display: inline-block
+  }
+  .kreis {
+    border: 0.2rem solid red;
+    border-radius: 20%;
+    padding: 0.2rem;
+  }
+
+</style>
+

+ 130 - 0
BFS AGZ 2seitig.svelte

@@ -0,0 +1,130 @@
+{#each schueler as s (s.ID)}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader art="daten/agz.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <div style="font-size: 15pt; line-height: 1.5em">
+          {bg(s, 'Schulform')}
+        </div>
+        <div style="font-size: 12pt; line-height: 1.2em">
+          {bg(s, 'Bereich')}
+          {#if s.ASDSchulform.startsWith('B')}
+            <br />
+            Abschluss {@html s.Geschlecht === 3 ? bg(s, 'Berufsbezeichnung_m') : bg(s, 'Berufsbezeichnung_w')}
+          {/if}
+        </div>
+        <Voffset v="1"/>
+        <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+        <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},<br />
+        war vom {datum(s.BeginnBildungsgang)} bis {datum(s.Entlassdatum)} {s.schueler_in}
+        des Bildungsgangs
+        <br>{bg(s, 'Zeugniskopf')}.
+        <br>{s.Geschlecht === 3 ? 'Er':'Sie'} war zuletzt {s.schueler_in} in der Klasse {s.Klasse}.
+        <Voffset v="2"/>
+        Leistungen laut Konferenzbeschluss vom {datum(hj.Konferenzdatum)}:
+        <Noten
+          noten={hj.noten}
+          fachGliederungen={s.fachklasse.fach_gliederungen}
+          ger
+          fachklasse={s.fachklasse.Kennung}
+          faechergruppenIds={[10,20,30]}
+        ></Noten>
+        <hr />
+        <Voffset v="1"/>
+        {#if zeigeVersetzungsvermerk}
+          <b>{versetzungsvermerk(hj)}</b>
+        {/if}
+        <button class="vbutton no-print" on:click="{() => zeigeVersetzungsvermerk = !zeigeVersetzungsvermerk}">
+          Versetzungsvermerk {zeigeVersetzungsvermerk ? 'entfernen' : 'anzeigen'}
+        </button>
+        <Voffset v="1"/>
+        {#if zeigeAbschlussVermerk}
+          {#if s.Entlassart!=='5A'}
+            <div class="text-center">
+              <Voffset v="2"/>
+              {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} hat den
+              <Voffset v="0.5"/>
+              <b>mittleren Schulabschluss (Fachoberschulreife)</b>
+              {#if s.Entlassart==='5G'}
+                <br><b>mit Berechtigung zum Besuch der gymnasialen Oberstufe</b>
+              {/if}
+              <Voffset v="0.5"/>
+              erworben.
+            </div>
+          {:else}<Voffset v="3"/>
+          {/if}
+          <Voffset v="1"/>
+          Der Abschluss ist im Deutschen und Europäischen Qualifikationsrahmen dem Niveau 3 zugeordnet.
+          <Voffset v="1"/>
+          {s.Geschlecht === 3 ? "Der Schüler": "Die Schülerin"} hat ein bildungsgangbegleitendes Praktikum im Umfang von 16 Wochen absolviert.
+        {/if}
+        <button class="vbutton no-print" on:click="{() => zeigeAbschlussVermerk = !zeigeAbschlussVermerk}">
+          Abschlusssvermerk {zeigeAbschlussVermerk ? 'entfernen' : 'anzeigen'}
+        </button>
+        <Voffset v="1"/>
+        <b>Bemerkungen</b><br />{@html bemerkungen(hj)}
+      </div>
+      <div class="footer">
+        <div class="flex-grid">
+          <div class="col-2">
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            <hr />
+            {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            Siegel
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            <hr />
+            {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+          </div>
+        </div>
+        <Fussnote {schule} ger rechtsbehelfsbelehrung={false} verordnung={false}></Fussnote>
+      </div>
+    </div>
+    <div class="page grid" orientation="portrait" size="A4">
+      <div class="main">
+        Seite 2/2 des Abgangsszeugnisses für {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name}
+        <Voffset v="2"/>
+        <SoaTabelle></SoaTabelle>
+      </div>
+      <div class="footer">
+        <Fussnote {schule} bfs notenstufen={false}></Fussnote>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+
+<script>
+  import { datum, versetzungsvermerk, bemerkungen, bg }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import SoaTabelle from './partials/SOA-Tabelle.svelte'
+  import Noten from './partials/Noten.svelte'
+  import Fussnote from './partials/Fussnoten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  let zeigeVersetzungsvermerk = true
+  let zeigeAbschlussVermerk = false
+  const abschlussVermerk = _ => {
+
+  }
+  const aktHalbjahr = a => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+  .vbutton {
+    background-color: red;
+    color: white;
+  }
+</style>

+ 175 - 0
BFS ASZ.svelte

@@ -0,0 +1,175 @@
+{#each schueler as s (s.ID)}
+  {#each aktHalbjahrFuer(s) as hj (hj.ID)}
+    <div class="page grid" orientation="landscape" size="A3">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader art="daten/asz.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <div class="main-grid">
+          <Voffset v="1"/>
+          <div class="main-left">
+            <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+            <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+            <br />war vom {datum(s.Aufnahmedatum)} bis zur Aushändigung des Zeugnisses {s.schueler_in} des Bildungsgangs
+            <br /><b>{bg(s, 'Zeugniskopf')}.</b>
+            <Voffset v=".5"/>
+            Der allgemeine Prüfungsausschuss stellte in seiner Abschlusskonferenz am {datum(hj.Konferenzdatum)} fest:
+            <Voffset v=".5"/>
+            <b>Leistungen</b>
+            <div style="font-size: 90%">
+              <Noten
+                noten={hj.noten}
+                faechergruppenIds={[10, 20, 30]}
+                fachGliederungen={s.fachklasse.fach_gliederungen}
+                ger
+                fachklasse={s.fachklasse.Kennung}
+              ></Noten>
+            </div>
+            <hr />
+            <Voffset v="1"/>
+            {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} hat ein
+            bildungsgangbegleitendes Praktikum in Einrichtungen für Kinder
+            und Jugendliche sowie alte, kranke und behinderte Menschen im
+            Umfang von 16 Wochen absolviert.
+            <Voffset v="1"/>
+            <b>Bemerkungen</b>
+            <br />{@html bemerkungen(hj)}
+          </div>
+          <div class="main-right">
+            <Voffset v="2"/>
+            <table class="table-noten">
+              {#each s.bk_abschluss_faecher.filter(f => f.fach.FachKrz.startsWith('AS')) as as}
+                <tr>
+                  <td width="22%">{as.fach.Zeugnisbez}</td>
+                  <td class="td-padding-extra">{findeFach(hj, as).Lernentw}</td>
+                  <td class="td-fach-note"><span>{note(as.NoteAbschluss)}</span></td>
+                </tr>
+              {/each}
+            </table>
+            <Voffset v="4"/>
+            {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} hat die Berufsabschlussprüfung bestanden und ist berechtigt, die Berufsbezeichnung
+            <h6 class="text-center">{@html bg(s, (s.Geschlecht === 3 ? 'Berufsbezeichnung_m' : 'Berufsbezeichnung_w'))}</h6>
+            zu führen.
+            <Voffset v="1"/>
+            Der Abschluss ist im Deutschen und Europäischen Qualifikationsrahmen dem Niveau {s.fachklasse.DQR_Niveau} zugeordnet.
+            {#if s.Entlassart!=='5A'}
+              <div class="text-center">
+                <Voffset v="2"/>
+                {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} hat den
+                <Voffset v="0.5"/>
+                <b>mittleren Schulabschluss (Fachoberschulreife)</b>
+                {#if s.Entlassart==='5G'}
+                  <br><b>mit Berechtigung zum Besuch der gymnasialen Oberstufe</b>
+                {/if}
+                <Voffset v="0.5"/>
+                erworben.
+              </div>
+            {:else}<Voffset v="3"/>
+            {/if}
+            <Voffset v="6"/>
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+            <Voffset v="6"/>
+            <div class="flex-grid">
+              <div class="col">
+                <hr />
+                <div class="text-center klein">
+                  {schule.SchulleiterVorname} {schule.SchulleiterName}
+                  – Vorsitzende{schule.SchulleiterGeschlecht === 3 ? 'r':''} des allgemeinen
+                  <br />Prüfungsausschusses
+                </div>
+              </div>
+              <div class="col klein">
+                <div class="text-center klein">
+                  Siegel
+                </div>
+              </div>
+              <div class="col klein">
+                <hr />
+                <div class="text-center">
+                  {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="footer klein grau">
+        <div class="schulnummer">
+          Schulnummer: {schule.SchulNr}
+        </div>
+        <hr class="hr-grau" />
+        <Voffset v="1"/>
+        <div class="footer-grid">
+          <div class="footer-left">
+            Notenstufen gemäß § 48 SchulG: 1 = sehr gut, 2 = gut, 3 = befriedigend, 4 = ausreichend, 5 = mangelhaft, 6 = ungenügend
+            <p></p>
+            <sup>1</sup>Der Unterricht in den modernen Fremdsprachen hat auf der
+            nach dem Fach in Klammern angegebenen Niveaustufe des
+            „Europäischen Referenzrahmens für Sprachen: Lernen, Lehren,
+            Beurteilen“ stattgefunden. Sind zwei Referenzniveaus ausgewiesen, ist
+            das niedrigere in vollem Umfang, das höhere in Anteilen erreicht. Bei
+            mindestens ausreichenden Leistungen wird der sprachliche
+            Kompetenzerwerb auf diesem Niveau bescheinigt.
+          </div>
+          <div class="footer-right">
+            Dem Zeugnis liegen zugrunde:
+            <ul class="list-unstyled dashes">
+              <li>
+                Die Verordnung über die Ausbildung und Prüfung in den Bildungsgängen des Berufskollegs (Ausbildungs- und Prüfungsordnung Berufskolleg, APO-BK) vom 26. Mai 1999 (SGV. NRW. 223/BASS 13 – 33 Nr. 1.1).
+              </li>
+              <li>
+                Die Vereinbarung über Fachschulen (Beschluss der Kultusministerkonferenz vom 07. November 2002 in der jeweils geltenden Fassung).
+              </li>
+            </ul>
+            <br>
+            Rechtsbehelfsbelehrung:
+            Gegen dieses Zeugnis kann innerhalb eines Monats
+            nach Bekanntgabe des Zeugnisses Widerspruch eingelegt werden. Der Widerspruch
+            ist beim {schule.Bezeichnung2}, {schule.Strasse}, {schule.PLZ} {schule.Ort},
+            schriftlich oder zur Niederschrift zu erheben. <br />Falls die Frist durch
+            das Verschulden einer/eines Bevollmächtigten versäumt wird, wird dies
+            Verschulden der Widerspruchsführerin/dem Widerspruchsführer zugerechnet.
+          </div>
+        </div>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  export const kommentar = `
+[Anlage B6](https://bass.schul-welt.de/3129.htm#AnlageB6)
+[VV](https://bass.schul-welt.de/3129.htm#pgfId-3908229)
+**Praktikumsdauer Corona-bedingt beachten!**
+  `
+  import { datum, volljaehrigBei, bemerkungen, bg, note }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Noten from './partials/Noten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  const aktHalbjahrFuer = (s) => s.abschnitte.filter(a => a.Jahr === jahr && a.Abschnitt === abschnitt)
+  const findeFach = (hj, as) => hj.noten.find(n => n.fach.ID === as.fach.ID) || { Lernentw: 'undefined' }
+</script>
+
+<style>
+  @import 'css/main.css';
+  @import 'css/a3-landscape.css';
+  .td-padding-extra {
+    padding: 2mm 0 2mm 0;
+  }
+  .td-fach-note {
+    padding-bottom: .2rem;
+    padding-top: .2rem;
+    width: 12rem;
+  }
+  .td-fach-note span {
+    background-color: #dcdcdc !important;
+    text-align: center;
+    width: 10rem;
+    display: block;
+    margin: 0 auto;
+  }
+</style>
+

+ 74 - 0
BFS SOA HEH Zeugnisbeilage.svelte

@@ -0,0 +1,74 @@
+{#each schueler as s}
+  <div class="page grid" orientation="portrait" size="A4">
+    <Seitenlogo logo="{privat.traegerLogo}"/>
+    <Pageheader art="daten/zeugnis.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+    <div class="main">
+      Seite 3/3 des Abschlusszeugnisses für {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name}
+      <Voffset v="2"/>
+      <table class="table table-bordered" style="width: 100%">
+        <tr>
+          <th width="35%">Bereichsspezifische Fächer</th>
+          <th>Zugeordnete Lernfelder</th>
+        </tr>
+        <tr>
+          <td>Heilerziehung und Soziales</td>
+          <td>
+            <ul class="dashes">
+              <li>Pädagogische Handlungsprozesse planen, umsetzen, dokumentieren und evaluieren</li>
+              <li>Mit Beteiligten am beruflichen Handlungsprozess kommunizieren und kooperieren</li>
+              <li>Berufliche Identität entwickeln und Lebenswelten kennen</li>
+              <li>Assistierende Beziehungsgestaltung aufbauen</li>
+              <li>Mit Konzepten in Einrichtungen der Behindertenhilfe arbeiten</li>
+              <li>Kompetenzen, Ressourcen und Potentiale erkennen und entsprechende Situationen gestalten</li>
+            </ul>
+          </td>
+        </tr>
+        <tr>
+          <td>Gesundheitsförderung und Pflege</td>
+          <td>
+            <ul class="dashes">
+              <li>Pflegerische Handlungsprozesse planen, umsetzen, dokumentieren und evaluieren</li>
+              <li>Mit Pflege- und Handlungskonzepten in pflegerischen Einrichtungen arbeiten</li>
+              <li>Gesundheitserhaltung definieren, berücksichtigen und adressatengerecht anwenden</li>
+            </ul>
+          </td>
+        </tr>
+        <tr>
+          <td>Arbeitsorganisation und Recht</td>
+          <td>
+            <ul class="dashes">
+              <li>Rechtliche und verwaltungstechnische Rahmenbedingungen in der Heilerziehungshilfe berücksichtigen</li>
+              <li>Die eigene Person und Dienstleistungen vermarkten</li>
+            </ul>
+          </td>
+        </tr>
+      </table>
+    </div>
+    <div class="footer klein schulnummer">
+      Schulnummer: {schule.SchulNr}
+    </div>
+  </div>
+{/each}
+
+<script>
+  export const kommentar = `
+[Lehrplan, S. 24](https://www.berufsbildung.nrw.de/cms/upload/_lehrplaene/b/gesundheit_erziehung_soziales/bfsb_ges-erz-soz_heilerziehung.pdf)
+  `
+  export let schueler, schule, privat
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+</script>
+
+<style>
+  @import 'css/main.css';
+  .table-bordered {
+    border-collapse: collapse;
+  }
+  .table-bordered tr {
+    border-bottom: thin solid #333;
+  }
+  .schulnummer {
+    text-align: right;
+  }
+</style>

+ 75 - 0
BFS SOA Verkürzte Pflegeausbildung.svelte

@@ -0,0 +1,75 @@
+{#each schueler as s}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+  <div class="page grid" orientation="portrait" size="A4">
+    <Seitenlogo logo="{privat.traegerLogo}"/>
+    <Pageheader logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+    <div class="main">
+      <div class="text-center">
+        <h5>Bescheinigung für den Antrag zur Verkürzung der <br>Altenpflegeausbildung gemäß § 7 Absatz 2 AltPflG</h5>
+      </div>
+      <Voffset v="4"/>
+      {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},
+      <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+      <Voffset v="2"/>
+      hat im Schuljahr {hj.Jahr}/{hj.Jahr-1999} die Ausbildung
+      {s.Geschlecht === 4 ? "zur" : "zum"} <b>staatlich geprüften
+      Sozialassistent{s.Geschlecht === 4 ? 'i' : 'e'}n</b> absolviert.
+      <Voffset v="2"/>
+      Für den Antrag auf Verkürzung der Altenpflegeausbildung wird folgende
+      maßgebliche Gesamtleistung gemäß RdErl. d. Ministeriums für Gesundheit,
+      Emanzipation, Pflege und Alter (MGE-PA) v. 19.02.2015 (AZ 402-0422)
+      bescheinigt: <b>NOTE</b>
+      <Voffset v="2"/>
+      Die Bescheinigung gilt nur in Verbindung mit dem Berufsabschlusszeugnis
+      vom {datum(hj.ZeugnisDatum)}.
+      <Voffset v="7"/>
+      <div class="flex-grid">
+        <div class="col">
+          {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+        </div>
+        <div class="col">
+          <Voffset v="3"/>
+          <div class="text-center klein">Siegel</div>
+        </div>
+        <div class="col">
+          <hr />
+          <div class="text-center klein">
+            {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+          </div>
+          <Voffset v="6"/>
+          <hr />
+          <div class="text-center klein">
+            {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+          </div>
+          </div>
+      </div>
+      <Voffset v="2"/>
+    </div>
+    <div class="footer klein" style="text-align:right">
+      Schulnummer: {schule.SchulNr}
+    </div>
+  </div>
+{/each}
+{/each}
+
+<script>
+export const kommentar = `
+Mindestens gut oder sehr gut, weitere Bestimmungen siehe
+[VV](https://bass.schul-welt.de/3129.htm#pgfId-3908297)
+
+[Zeugnis nach Anlage C 10](https://bass.schul-welt.de/3129.htm#AnlageC10)
+
+__Achtung, das Ändern der Praxisnachweise gilt für alle Schüler im Dokument.__
+`
+  export let schueler, schule, privat, jahr, abschnitt
+  import { datum }  from './helfer'
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+</style>
+

+ 72 - 0
BFS SOA Zertifikat Betreuungshelfer.svelte

@@ -0,0 +1,72 @@
+{#each schueler as s}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+  <div class="page grid" orientation="portrait" size="A4">
+    <Seitenlogo logo="{privat.traegerLogo}"/>
+    <Pageheader logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+    <div class="main">
+      <Voffset v="8"/>
+      <div class="text-center">
+        <h5>Zertifikat über die fachliche Qualifikation
+        <br>zur Betreuungskraft nach § 43b SGB XI</h5>
+      </div>
+      <Voffset v="4"/>
+      {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},
+      <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+      <Voffset v="2"/>
+      wird bescheinigt, dass {s.Geschlecht===3?'er':'sie'} im Rahmen der Ausbildung
+      {bg(s, `Berufsbezeichnung_${s.Geschlecht===3?'m':'w'}`).replace('<br>','')} die erforderlichen fachlichen Kenntnisse
+      zur Betreuungskraft gemäß Richtlinien nach § 43b SGB XI
+      (Betreuungskräfte-RL vom 1. Januar 2017 in der jeweils geltenden
+      Fassung) erworben hat.
+      <Voffset v="1.5"/>
+      {#if s.fachklasse.Kennung === "93-103-01"}
+        Grundlage für das Zertifikat sind der Bildungsplan (APO-BK Anlage B3)
+        und die didaktische Jahresplanung (in der jeweils gültigen Fassung).
+      {/if}
+      <Voffset v="1.5"/>
+      Dieses Zertifikat gilt in Verbindung mit dem Abschlusszeugnis des
+      Bildungsganges der Berufs- fachschule {bg(s, `Berufsbezeichnung_${s.Geschlecht===3?'m':'w'}`).replace('<br>','')} vom
+      {datum(hj.ZeugnisDatum)}.
+      <Voffset v="7"/>
+      <div class="flex-grid">
+        <div class="col">
+          {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+        </div>
+        <div class="col">
+          <Voffset v="3"/>
+          <div class="text-center klein">Siegel</div>
+        </div>
+        <div class="col">
+          <hr />
+          <div class="text-center klein">
+            {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+          </div>
+          <Voffset v="6"/>
+          <hr />
+          <div class="text-center klein">
+            {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+          </div>
+          </div>
+      </div>
+      <Voffset v="2"/>
+    </div>
+    <div class="footer klein" style="text-align:right">
+      Schulnummer: {schule.SchulNr}
+    </div>
+  </div>
+{/each}
+{/each}
+
+<script>
+  export let schueler, schule, privat, jahr, abschnitt
+  import { datum, bg }  from './helfer'
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+</style>
+

+ 26 - 0
BFS SOA Zeugnisbeilage.svelte

@@ -0,0 +1,26 @@
+{#each schueler as s}
+  <div class="page grid" orientation="portrait" size="A4">
+    <Seitenlogo logo="{privat.traegerLogo}"/>
+    <Pageheader art="daten/zeugnis.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+    <div class="main">
+      Seite 3/3 des Abschlusszeugnisses für {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name}
+      <Voffset v="2"/>
+      <SoaTabelle></SoaTabelle>
+    </div>
+    <div class="footer klein schulnummer">
+      Schulnummer: {schule.SchulNr}
+    </div>
+  </div>
+{/each}
+
+<script>
+  export let schueler, schule, privat
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import SoaTabelle from './partials/SOA-Tabelle.svelte'
+</script>
+
+<style>
+  @import 'css/main.css';
+</style>

+ 176 - 0
FOS ASZ.svelte

@@ -0,0 +1,176 @@
+{#each schueler as s (s.ID)}
+  {#each aktHalbjahrFuer(s) as hj (hj.ID)}
+    <div class="page grid" orientation="landscape" size="A3">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader art="daten/asz.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <div class="main-grid">
+          <Voffset v="1"/>
+          <div class="main-left">
+            <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+            <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+            <br />war vom {datum(s.Aufnahmedatum)} bis zur Aushändigung des Zeugnisses {s.schueler_in} des Bildungsgangs
+            <br /><b>{bg(s, 'Zeugniskopf')}.</b>
+            <Voffset v=".5"/>
+            In der Konferenz am {datum(hj.Konferenzdatum)} sind folgende Leistungen festgestellt worden:
+            <Voffset v=".5"/>
+            <div style="font-size: 90%">
+              <Noten
+                noten={s.bk_abschluss_faecher}
+                faechergruppenIds={[10, 20, 30]}
+                fachGliederungen={s.fachklasse.fach_gliederungen}
+                ger
+                fachklasse={s.fachklasse.Kennung}
+              ></Noten>
+            </div>
+            <hr />
+            <b>Bemerkungen</b>
+            <br />{@html bemerkungen(hj)}
+          </div>
+          <div class="main-right">
+            <Voffset v="2"/>
+            {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} hat die
+            Fachhochschulreifeprüfung im vorgenannten Bildungsgang der
+            Fachoberschule am {datum(hj.Konferenzdatum)} bestanden.
+            <Voffset v="2"/>
+            Der Nachweis der fachpraktischen Ausbildung wurde durch
+            {nachweise[selected]} erbracht.
+            <div class="no-print">
+              <select bind:value="{selected}" class="no-print">
+                {#each nachweise as nachweis,i}
+                  <option value="{i}">
+                    {nachweis}
+                  </option>
+                {/each}
+              </select></div>
+            <Voffset v="1"/>
+            {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} wird die
+            <h4 class="text-center">Fachhochschulreife</h4>
+            zuerkannt.
+            <Voffset v="1"/>
+            Der Abschluss ist im Deutschen und Europäischen
+            Qualifikationsrahmen dem Niveau {s.fachklasse.DQR_Niveau}
+            zugeordnet. Entsprechend der Vereinbarung über die
+            Fachoberschulen – Beschluss der Kultusministerkonferenz vom 16.
+            Dezember 2004 in der jeweils geltenden Fassung – berechtigt
+            dieses Zeugnis in allen Ländern der Bundesrepublik Deutschland
+            zum Studium an Fachhochschulen.
+            <Voffset v="2"/>
+            <table width="100%">
+              <tr>
+                <td>Durchschnittsnote:</td><td class="td-fach-note"><span>{s.DurchschnittsnoteFHR}</span></td>
+                <td>in&nbsp;Worten:</td><td class="td-fach-note"><span>{@html noteInWorten(s.DurchschnittsnoteFHR)}</span></td>
+               </tr>
+            </table>
+            <Voffset v="6"/>
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+              <Voffset v="6"/>
+            <div class="flex-grid">
+              <Voffset v="6"/>
+              <div class="col">
+                <hr />
+                <div class="text-center klein">
+                  {schule.SchulleiterVorname} {schule.SchulleiterName} Vorsitzende{schule.SchulleiterGeschlecht === 3 ? 'r':''} des allgemeinen
+                  <br />Prüfungsausschusses
+                </div>
+              </div>
+              <div class="col klein">
+                <div class="text-center klein">
+                  Siegel
+                </div>
+              </div>
+              <div class="col klein">
+                <hr />
+                <div class="text-center">
+                  {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="footer klein">
+        <div class="schulnummer">
+          Schulnummer: {schule.SchulNr}
+        </div>
+        <hr class="hr-grau" />
+        <div class="footer-grid">
+          <div class="footer-left">
+            Notenstufen gemäß § 48 SchulG: 1 = sehr gut, 2 = gut, 3 = befriedigend, 4 = ausreichend, 5 = mangelhaft, 6 = ungenügend
+            <p></p>
+            <sup>1</sup>Der Unterricht in den modernen Fremdsprachen hat auf der
+            nach dem Fach in Klammern angegebenen Niveaustufe des
+            „Europäischen Referenzrahmens für Sprachen: Lernen, Lehren,
+            Beurteilen“ stattgefunden. Sind zwei Referenzniveaus ausgewiesen, ist
+            das niedrigere in vollem Umfang, das höhere in Anteilen erreicht. Bei
+            mindestens ausreichenden Leistungen wird der sprachliche
+            Kompetenzerwerb auf diesem Niveau bescheinigt.
+          </div>
+          <div class="footer-right">
+            Dem Zeugnis liegen zugrunde:
+            <ul class="list-unstyled dashes">
+              <li>
+                Die Verordnung über die Ausbildung und Prüfung in den
+                Bildungsgängen des Berufskollegs (Ausbildungs- und
+                Prüfungsordnung Berufskolleg, APO-BK) vom 26. Mai 1999 (SGV.
+                NRW. 223/BASS 13 – 33 Nr. 1.1).
+              </li>
+              <li>
+                die Rahmenvereinbarung über die Fachoberschulen (Beschluss
+                der Kultusministerkonferenz vom 16. Dezember 2004 in der
+                jeweils geltenden Fassung).
+              </li>
+            </ul>
+            <br>
+            Rechtsbehelfsbelehrung:
+            <br>Gegen dieses Zeugnis kann innerhalb eines Monats
+            nach Bekanntgabe des Zeugnisses Widerspruch eingelegt werden. Der Widerspruch
+            ist beim {schule.Bezeichnung2}, {schule.Strasse}, {schule.PLZ} {schule.Ort},
+            schriftlich oder zur Niederschrift zu erheben. <br />Falls die Frist durch
+            das Verschulden einer/eines Bevollmächtigten versäumt wird, wird dies
+            Verschulden der Widerspruchsführerin/dem Widerspruchsführer zugerechnet.
+          </div>
+        </div>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+export const kommentar = `
+[Anlage C](https://bass.schul-welt.de/3129.htm#13-33nr1.1p18_AnlageC)
+
+[Zeugnis nach Anlage C 10](https://bass.schul-welt.de/3129.htm#AnlageC10)
+
+__Achtung, das Ändern der Praxisnachweise gilt für alle Schüler im Dokument.__
+`
+  import { datum, bemerkungen, bg, note, noteInWorten }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Noten from './partials/Noten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  let selected = 0
+  let nachweise = [
+		'die erfolgreiche Ableistung des Praktikantenjahres im Rahmen der Klasse 11 der Fachoberschule',
+		'den erfolgreichen Abschluss einer mindestens zweijährigen Berufsausbildung',
+		'den Nachweis einer mindestens vierjährigen einschlägigen Berufstätigkeit als XXX'
+	]
+  const aktHalbjahrFuer = (s) => s.abschnitte.filter(a => a.Jahr === jahr && a.Abschnitt === abschnitt)
+</script>
+
+<style>
+  @import 'css/main.css';
+  @import 'css/a3-landscape.css';
+  .td-fach-note span {
+    background-color: #dcdcdc !important;
+    text-align: center;
+    width: 10rem;
+    display: block;
+  }
+  table {
+    border-collapse: collapse;
+  }
+</style>

+ 107 - 0
FS AGZ LF 2seitig.svelte

@@ -0,0 +1,107 @@
+{#each schueler as s (s.ID)}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader art="daten/agz.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <span style="font-size: 15pt; line-height: 1.5em">
+          {bg(s, 'Schulform')} |
+        </span>
+        <span style="font-size: 12pt; line-height: 1.2em">
+          {bg(s, 'Bereich')}
+        </span>
+        <Voffset v="1"/>
+        <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+        <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},<br />
+        war vom {datum(s.BeginnBildungsgang)} bis {datum(s.Entlassdatum)} {s.studierende_r}
+        des Bildungsgangs {bg(s, 'Zeugniskopf')}.
+        <br>{s.Geschlecht === 3 ? 'Er':'Sie'} war zuletzt {s.studierende_r} in der Klasse {s.Klasse}.
+        <Voffset v="2"/>
+        Leistungen laut Konferenzbeschluss vom {datum(hj.Konferenzdatum)}:
+        <div class="lf-noten">
+          <Noten
+            noten={hj.noten}
+            fachGliederungen={s.fachklasse.fach_gliederungen}
+            ger
+            lernfeld
+            fachklasse={s.fachklasse.Kennung}
+            faechergruppenIds={[10,20,30]}
+          ></Noten>
+        </div>
+        <hr />
+        <Voffset v="1"/>
+        {#if zeigeVersetzungsvermerk}
+          <b>{versetzungsvermerk(hj)}</b>
+        {/if}
+        <button class="vbutton no-print" on:click="{() => zeigeVersetzungsvermerk = !zeigeVersetzungsvermerk}">
+          Versetzungsvermerk {zeigeVersetzungsvermerk ? 'entfernen' : 'anzeigen'}
+        </button>
+        <Voffset v="1"/>
+        <b>Bemerkungen</b><br />{@html bemerkungen(hj)}
+      </div>
+      <div class="footer">
+        <div class="flex-grid">
+          <div class="col-2">
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            <hr />
+            {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            Siegel
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            <hr />
+            {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+          </div>
+        </div>
+        <div class="klein eng">
+          <Voffset v="2"/>
+          <div class="schulnummer text-center">
+            Schulnummer: {schule.SchulNr}
+          </div>
+          <hr class="hr-grau" />
+          <div class="grau text-center">
+              Notenstufen gemäß § 48 SchulG: 1 = sehr gut, 2 = gut, 3 = befriedigend,
+              4 = ausreichend, 5 = mangelhaft, 6 = ungenügend
+          </div>
+        </div>
+      </div>
+    </div>
+    <Seite2Fussnote {schule} ger></Seite2Fussnote>
+  {/each}
+{/each}
+
+<script>
+  import { datum, versetzungsvermerk, volljaehrigBei, bemerkungen, bg }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Noten from './partials/Noten.svelte'
+  import Seite2Fussnote from './partials/Seite2Fussnoten.svelte'
+  export const kommentar = `
+[Vorlage PDF](https://bass.schul-welt.de/anlagen/3129-61.pdf)
+
+[VV dazu 15.2](https://bass.schul-welt.de/3129.htm#pgfId-3914969)
+  `
+
+  export let schueler, schule, privat, jahr, abschnitt
+  let zeigeVersetzungsvermerk = true
+  const aktHalbjahr = a => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+  .lf-noten {
+    font-size: 0.9rem;
+  }
+  .vbutton {
+    background-color: red;
+    color: white;
+  }
+</style>

+ 136 - 0
FS ASZ BPX.svelte

@@ -0,0 +1,136 @@
+{#each schueler as s}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <h5>Abschlusszeugnis</h5>
+        <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name}</b>
+        <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+        <br>war vom {datum(s.BeginnBildungsgang)} bis zur Aushändigung des Zeugnisses
+        {s.studierende_r} im Bildungsgang
+          <Voffset v="1"/>
+          <b>{bg(s, 'Zeugniskopf')}</b>
+        <Voffset v="1.5"/>
+        Der allgemeine Prüfungsausschuss stellte in seiner Abschlusskonferenz am {datum(hj.Konferenzdatum)} fest:
+        <Voffset v="1"/>
+        {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} hat das staatliche
+        <h5 class="text-center">{bg(s, 'Examen')}</h5>
+        <Voffset v="-2"/>
+        am {hj.noten.map(n => n.fach.FachKrz === 'KO' ? n.Lernentw : null).join('')} bestanden.<sup>1</sup>
+        <Voffset v="2"/>
+        <table class="table-noten" width="100%">
+          {#each s.bk_abschluss_faecher.filter(f => ['BLgesamt', 'KO', 'BPgesamt'].some(n => n === f.fach.FachKrz)) as f}
+          <tr>
+            <td class="{f.fach.FachKrz === 'BPgesamt' ? 'fett' : ''}">{f.fach.Zeugnisbez}</td>
+            <td class="td-fach-note"><span>{note(f.NoteAbschluss)}</span></td>
+          </tr>
+          {/each}
+        </table>
+        <Voffset v="1"/>
+        {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} ist berechtigt, die Berufsbezeichnung
+        <h5 class="text-center">{bg(s, (s.Geschlecht === 3 ? 'Berufsbezeichnung_m' : 'Berufsbezeichnung_w'))}</h5>
+        <Voffset v="-1.5"/>
+        zu führen.
+        <Voffset v="1"/>
+        Der Abschluss ist im Deutschen und Europäischen Qualifikationsrahmen dem Niveau {s.fachklasse.DQR_Niveau} zugeordnet.
+        <Voffset v="5"/>
+        {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+        <Voffset v="4"/>
+        <div class="flex-grid">
+          <div class="col">
+            <hr />
+            <div class="text-center klein">
+              {schule.SchulleiterVorname} {schule.SchulleiterName} – Vorsitzende{schule.SchulleiterGeschlecht === 3 ? 'r':''} des allgemeinen
+              <br />Prüfungsausschusses
+            </div>
+          </div>
+          <div class="col klein">
+            <div class="text-center klein">
+              Siegel
+            </div>
+          </div>
+          <div class="col klein">
+            <hr />
+            <div class="text-center">
+              {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+            </div>
+          </div>
+        </div>
+        <Voffset v="2"/>
+      </div>
+      <div class="footer klein">
+        <div class="klein eng">
+          <Voffset v="2"/>
+          <div class="schulnummer">
+            Schulnummer: {schule.SchulNr}
+          </div>
+          <hr class="hr-grau" />
+          <div class="grau">
+            Notenstufen gemäß § 48 SchulG: 1 = sehr gut, 2 = gut, 3 = befriedigend,
+            4 = ausreichend, 5 = mangelhaft, 6 = ungenügend
+            <Voffset v=".5"/>
+            <sup>1</sup>Gilt nur in Verbindung mit der Bescheinigung über die
+            erfolgreich abgelegte fachtheoretischen Prüfung (Teil I) und dem
+            Versetzungszeugnis, welches die Berechtigung zum Übergang in das
+            Berufspraktikum ausweist, ausgestellt am {s.vermerke.find(v => v.Vermerkart_ID === 8).Bemerkung}
+            vom {s.vermerke.find(v => v.Vermerkart_ID === 9).Bemerkung}
+            <Voffset v=".5"/>
+            Dem Zeugnis liegen zugrunde: Die Verordnung über die Ausbildung und Prüfung
+            in den Bildungsgängen des Berufskollegs (Ausbildungs- und Prüfungsordnung
+            Berufskolleg, APO-BK) vom 26. Mai 1999 (SGV. NRW. 223/BASS 13 – 33 Nr. 1.1).
+            <br>Die Vereinbarung über Fachschulen (Beschluss der
+            Kultusministerkonferenz vom 07. November 2002 in der jeweils geltenden
+            Fassung).
+            <br>Abschluss der Fachschule entspricht der Rahmenvereinbarung über
+            Fachschulen (Beschluss der Kultusministerkonferenz vom 07.11.2002 in
+            der jeweils geltenden Fassung) und wird von allen Ländern in der
+            Bundesrepublik Deutschland anerkannt.
+            <Voffset v=".5"/>
+            Rechtsbehelfsbelehrung: Gegen dieses Zeugnis kann innerhalb eines Monats
+            nach Bekanntgabe des Zeugnisses Widerspruch eingelegt werden. Der Widerspruch
+            ist beim {schule.Bezeichnung2}, {schule.Strasse}, {schule.PLZ} {schule.Ort},
+            schriftlich oder zur Niederschrift zu erheben. <br />Falls die Frist durch
+            das Verschulden einer/eines Bevollmächtigten versäumt wird, wird dieses
+            Verschulden der Widerspruchsführerin/dem Widerspruchsführer zugerechnet.
+          </div>
+        </div>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  export let kommentar = `
+[E5 PDF](https://bass.schul-welt.de/anlagen/3129-60.pdf)
+[E5 html]()
+`
+  export let schueler, schule, privat, jahr, abschnitt
+  import { datum, bg, note } from './helfer'
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Fussnote from './partials/Fussnoten.svelte'
+  const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
+  const findeFach = (hj, as) => hj.noten.find(n => n.fach.ID === as.fach.ID) || { Lernentw: 'undefined' }
+</script>
+
+<style>
+  @import 'css/main.css';
+  .td-fach-note {
+    padding-bottom: .2rem;
+    padding-top: .2rem;
+    width: 12rem;
+  }
+  .td-fach-note span {
+    background-color: #dcdcdc !important;
+    text-align: center;
+    width: 10rem;
+    display: block;
+    margin: 0 auto;
+  }
+</style>
+
+
+
+

+ 151 - 0
FS ASZ Pferd.svelte

@@ -0,0 +1,151 @@
+{#each schueler as s (s.ID)}
+  {#each aktHalbjahrFuer(s) as hj (hj.ID)}
+    <div class="page grid" orientation="landscape" size="A3" style="font-size: 1.1rem">
+      <div class="header">
+        <Seitenlogo logo="{privat.traegerLogo}"/>
+        <Pageheader art="daten/asz.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      </div>
+      <div class="main-grid">
+        <div class="main-left">
+          <Voffset v="2"/>
+          <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+          <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+          <br />war vom {datum(s.Aufnahmedatum)} bis zur Aushändigung des Zeugnisses {s.studierende_r} des Bildungsgangs
+          <br /><b>{@html bg(s, 'Zeugniskopf')}</b>
+          <br>in Kooperation mit dem Deutschen Kuratorium für Therapeutisches Reiten e.V. (DKThR).
+          <Voffset v="1"/>
+          Der allgemeine Prüfungsausschuss stellte in seiner Abschlusskonferenz am {datum(hj.Konferenzdatum)} fest:
+          <Voffset v=".5"/>
+          <b>Leistungen</b>
+          <Noten
+            noten={hj.noten}
+            faechergruppenIds={[10, 20, 30]}
+            fachGliederungen={s.fachklasse.fach_gliederungen}
+            fachklasse={s.fachklasse.Kennung}
+          ></Noten>
+          <hr />
+          <b>Bemerkungen</b>
+          <br />{@html bemerkungen(hj)}
+        </div>
+        <div class="main-right">
+          <Voffset v="2"/>
+          {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} erbrachte in der Abschlussprüfung folgende Leistung:
+          <Voffset v="2"/>
+          <table class="table-noten" width="100%">
+            {#each hj.noten.filter(f => f.fach.FachKrz === "PROJ-PF") as f}
+              <tr>
+                <td width="22%">{f.fach.Zeugnisbez}</td>
+                <td class="td-padding-extra">{f.Lernentw}</td>
+                <td class="td-fach-note"><span>{note(f.NotenKrz)}</span></td>
+              </tr>
+            {/each}
+          </table>
+          <Voffset v="1"/>
+          <Voffset v="4"/>
+          {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} ist berechtigt, die Berufsbezeichnung
+          <h4 class="text-center">{@html s.berufsbezeichnung_mw}</h4>
+          zu führen.
+          <Voffset v="1"/>
+          Der Abschluss ist im Deutschen und Europäischen Qualifikationsrahmen dem Niveau {s.fachklasse.DQR_Niveau} zugeordnet.
+          <Voffset v="9"/>
+          <div class="flex-grid">
+            <Voffset v="6"/>
+            <div class="col">
+              {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+              <Voffset v="6"/>
+              <div class="text-center klein">Siegel</div>
+            </div>
+            <div class="col">
+              <hr />
+              <div class="text-center klein">
+                {schule.SchulleiterVorname} {schule.SchulleiterName}
+                <br>Vorsitzende{schule.SchulleiterGeschlecht === 3 ? 'r':''} des allg. Prüfungsausschusses
+              </div>
+              <Voffset v="6"/>
+              <hr />
+              <div class="text-center klein">
+                {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+              </div>
+              <Voffset v="6"/>
+              <hr />
+              <div class="text-center klein">
+                Weiterbildung DKThR
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="footer-grid klein eng">
+        <div class="header">
+          Schulnummer: {schule.SchulNr}
+          <hr />
+        </div>
+        <div class="footer-left">
+          Notenstufen gemäß § 48 SchulG: 1 = sehr gut, 2 = gut, 3 = befriedigend, 4 = ausreichend, 5 = mangelhaft, 6 = ungenügend
+          <p></p>
+          Dem Zeugnis liegen zugrunde:
+          <ul class="list-unstyled dashes">
+            <li>
+              Die Verordnung über die Ausbildung und Prüfung in den Bildungsgängen
+              des Berufskollegs (Ausbildungs- und Prüfungsordnung Berufskolleg,
+              APO-BK) vom 26. Mai 1999 (SGV. NRW. 223/BASS 13 – 33 Nr. 1.1).
+            </li>
+            <li>
+              Die Vereinbarung über Fachschulen (Beschluss der Kultusministerkonferenz
+              vom 07. November 2002 in der jeweils geltenden Fassung).
+            </li>
+          </ul>
+        </div>
+        <div class="footer-right">
+          Rechtsbehelfsbelehrung:<br>
+          Gegen dieses Zeugnis kann innerhalb eines Monats
+          nach Bekanntgabe des Zeugnisses Widerspruch eingelegt werden. Der Widerspruch
+          ist beim {schule.Bezeichnung2}, {schule.Strasse}, {schule.PLZ} {schule.Ort},
+          schriftlich oder zur Niederschrift zu erheben. <br />Falls die Frist durch
+          das Verschulden einer/eines Bevollmächtigten versäumt wird, wird dies
+          Verschulden der Widerspruchsführerin/dem Widerspruchsführer zugerechnet.
+        </div>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+export let kommentar = `
+[E5 PDF](https://bass.schul-welt.de/anlagen/3129-60.pdf)
+[E5 html]()
+`
+  import { datum, bemerkungen, bg, note }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Noten from './partials/Noten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+
+  const aktHalbjahrFuer = (s) => s.abschnitte.filter(a => a.Jahr === jahr && a.Abschnitt === abschnitt)
+</script>
+
+<style>
+  @import 'css/main.css';
+  @import 'css/a3-landscape.css';
+  .table-noten {
+    width: 100%;
+    border-collapse: collapse;
+    margin-bottom: 1rem;
+  }
+  .td-fach-note {
+    padding-bottom: .2rem;
+    padding-top: .2rem;
+    width: 12rem;
+  }
+  .td-fach-note span {
+    background-color: #dcdcdc;
+    text-align: center;
+    width: 10rem;
+    display: block;
+    margin: 0 auto;
+  }
+</style>
+

+ 172 - 0
FS ASZ.svelte

@@ -0,0 +1,172 @@
+{#each schueler as s (s.ID)}
+  {#each aktHalbjahrFuer(s) as hj (hj.ID)}
+    <div class="page grid" orientation="landscape" size="A3">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader art="daten/asz.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <div class="main-grid">
+          <Voffset v="1"/>
+          <div class="main-left">
+            <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+            <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},
+            <br />war vom {datum(s.Aufnahmedatum)} bis zur Aushändigung des Zeugnisses {s.studierende_r} des Bildungsgangs
+            <br /><b>{bg(s, 'Zeugniskopf')}.</b>
+            <Voffset v=".5"/>
+            Der allgemeine Prüfungsausschuss stellte in seiner Abschlusskonferenz am {datum(hj.Konferenzdatum)} fest:
+            <Voffset v=".5"/>
+            <b>Leistungen</b>
+            <div style="font-size: 90%">
+              <Noten
+                noten={hj.noten}
+                faechergruppenIds={[10, 20, 30]}
+                fachGliederungen={s.fachklasse.fach_gliederungen}
+                ger
+                lernfeld
+                fachklasse={s.fachklasse.Kennung}
+                fhrSternchen={s.DurchschnittsnoteFHR ? true: false}
+              ></Noten>
+            </div>
+            <hr />
+            <b>Bemerkungen</b>
+            <br />{@html bemerkungen(hj)}
+          </div>
+          <div class="main-right">
+            {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} hat das staatliche
+            <h5 class="text-center">{bg(s, 'Examen')}</h5>
+            <Voffset v="-2"/>
+            am {hj.noten.map(n => n.fach.FachKrz === 'KO' ? n.Lernentw : null).join('')} bestanden.
+            <Voffset v="2"/>
+            <table class="table-noten">
+              {#each s.bk_abschluss_faecher.filter(f => f.fach.FachKrz.startsWith('AS')).sort((a,b) => a.FSortierung > b.FSortierung ? 1:-1) as as}
+                <tr>
+                  <td width="22%">{as.fach.Zeugnisbez}</td>
+                  <td class="td-padding-extra">{findeFach(hj, as).Lernentw}</td>
+                  <td class="td-fach-note"><span>{note(as.NoteAbschluss)}</span></td>
+                </tr>
+              {/each}
+            </table>
+            <Voffset v="1"/>
+            <table class="table-noten" width="100%">
+              {#each s.bk_abschluss_faecher.filter(f => ['BLgesamt', 'KO', 'BPgesamt'].some(n => n === f.fach.FachKrz)).sort((a, b) => a.FSortierung < b.FSortierung ? -1 : 1) as f}
+                <tr>
+                  <td class="{f.fach.FachKrz === 'BPgesamt' ? 'fett' : ''}">{f.fach.Zeugnisbez}</td>
+                  <td class="td-fach-note"><span>{note(f.NoteAbschluss)}</span></td>
+                </tr>
+              {/each}
+            </table>
+            <Voffset v="4"/>
+            {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} ist berechtigt, die Berufsbezeichnung
+            <h5 class="text-center">{bg(s, (s.Geschlecht === 3 ? 'Berufsbezeichnung_m' : 'Berufsbezeichnung_w'))}</h5>
+            <Voffset v="-2"/>
+            zu führen.
+            <Voffset v="1"/>
+            Der Abschluss ist im Deutschen und Europäischen Qualifikationsrahmen dem Niveau {s.fachklasse.DQR_Niveau} zugeordnet.
+            <Voffset v="5"/>
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+            <Voffset v="5"/>
+            <div class="flex-grid">
+              <div class="col">
+                <hr />
+                <div class="text-center klein">
+                  {schule.SchulleiterVorname} {schule.SchulleiterName} – Vorsitzende{schule.SchulleiterGeschlecht === 3 ? 'r':''} des allgemeinen
+                  <br />Prüfungsausschusses
+                </div>
+              </div>
+              <div class="col klein">
+                <div class="text-center klein">
+                  Siegel
+                </div>
+              </div>
+              <div class="col klein">
+                <hr />
+                <div class="text-center">
+                  {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="footer klein grau">
+        <div class="schulnummer">
+          Schulnummer: {schule.SchulNr}
+        </div>
+        <hr class="hr-grau" />
+        <div class="footer-grid">
+          <div class="footer-left">
+            Notenstufen gemäß § 48 SchulG: 1 = sehr gut, 2 = gut, 3 = befriedigend, 4 = ausreichend, 5 = mangelhaft, 6 = ungenügend
+            <Voffset v="0.5"/>
+            <sup>1</sup>Der Unterricht in den modernen Fremdsprachen hat auf der
+            nach dem Fach in Klammern angegebenen Niveaustufe des
+            „Europäischen Referenzrahmens für Sprachen: Lernen, Lehren,
+            Beurteilen“ stattgefunden. Sind zwei Referenzniveaus ausgewiesen, ist
+            das niedrigere in vollem Umfang, das höhere in Anteilen erreicht. Bei
+            mindestens ausreichenden Leistungen wird der sprachliche
+            Kompetenzerwerb auf diesem Niveau bescheinigt.
+            <Voffset v="0.5"/>
+            {#if s.DurchschnittsnoteFHR}
+              <sup>*</sup>Die Noten der gekennzeichneten Fächer gehen in die
+              Berechnung der Durchnittsnote für die Fachochschulreife ein.
+            {/if}
+          </div>
+          <div class="footer-right">
+            Dem Zeugnis liegen zugrunde:
+            <ul class="list-unstyled dashes">
+              <li>
+                Die Verordnung über die Ausbildung und Prüfung in den Bildungsgängen des Berufskollegs (Ausbildungs- und Prüfungsordnung Berufskolleg, APO-BK) vom 26. Mai 1999 (SGV. NRW. 223/BASS 13 – 33 Nr. 1.1).
+              </li>
+              <li>
+                Die Vereinbarung über Fachschulen (Beschluss der Kultusministerkonferenz vom 07. November 2002 in der jeweils geltenden Fassung).
+              </li>
+            </ul>
+            <br>
+            Rechtsbehelfsbelehrung:
+            Gegen dieses Zeugnis kann innerhalb eines Monats
+            nach Bekanntgabe des Zeugnisses Widerspruch eingelegt werden. Der Widerspruch
+            ist beim {schule.Bezeichnung2}, {schule.Strasse}, {schule.PLZ} {schule.Ort},
+            schriftlich oder zur Niederschrift zu erheben. <br />Falls die Frist durch
+            das Verschulden einer/eines Bevollmächtigten versäumt wird, wird dies
+            Verschulden der Widerspruchsführerin/dem Widerspruchsführer zugerechnet.
+          </div>
+        </div>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+export let kommentar = `
+[E5 PDF](https://bass.schul-welt.de/anlagen/3129-60.pdf)
+[E5 html]()
+`
+  import { datum, volljaehrigBei, bemerkungen, bg, note }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Noten from './partials/Noten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  const aktHalbjahrFuer = (s) => s.abschnitte.filter(a => a.Jahr === jahr && a.Abschnitt === abschnitt)
+  const findeFach = (hj, as) => hj.noten.find(n => n.fach.ID === as.fach.ID) || { Lernentw: 'undefined' }
+</script>
+
+<style>
+  @import 'css/main.css';
+  @import 'css/a3-landscape.css';
+  .td-padding-extra {
+    padding: 2mm 0 2mm 0;
+  }
+  .td-fach-note {
+    padding-bottom: .2rem;
+    padding-top: .2rem;
+    width: 12rem;
+  }
+  .td-fach-note span {
+    background-color: #dcdcdc !important;
+    text-align: center;
+    width: 10rem;
+    display: block;
+    margin: 0 auto;
+  }
+</style>

+ 88 - 0
FS Bescheinigung Bewerbung.svelte

@@ -0,0 +1,88 @@
+{#each schueler as s}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+  <div class="page grid" orientation="portrait" size="A4">
+    <Seitenlogo logo="{privat.traegerLogo}"/>
+    <Pageheader logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+    <div class="main">
+      <h5>Anlage zum Jahreszeugnis</h5>
+      <Voffset v="-1.5"/>
+      Bescheinigung für Bewerbungszwecke
+      <Voffset v="3"/>
+      <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name}</b>
+      <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort}
+      <Voffset v="2"/>
+      besucht seit dem {datum(s.BeginnBildungsgang)} die Fachschule für Sozialwesen in der
+      {bg(s, 'Bereich')} und hat laut Beschluss des allgemeinen
+      Prüfungsausschusses den theoretischen Prüfungsteil des Fachschulexamens
+      bestanden. {s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name} hat damit die Berechtigung zum Übergang
+      in das Berufspraktikum erworben.
+      <Voffset v="2"/>
+      Der allgemeine Prüfungsausschuss stellte in seiner Abschlusskonferenz am {datum(hj.Konferenzdatum)} fest:
+      <Voffset v="1"/>
+      <b>Theoretischer Prüfungsteil des Fachschulexamens</b>
+      <Voffset v="1"/>
+      <table class="table-noten">
+        {#each s.bk_abschluss_faecher.filter(f => f.fach.FachKrz.startsWith('AS')) as as}
+          <tr>
+            <td width="22%" style="height:4rem">{as.fach.Zeugnisbez}</td>
+            <td class="td-padding-extra">{findeFach(hj, as).Lernentw}</td>
+            <td class="td-fach-note"><span>{note(as.NoteAbschluss)}</span></td>
+          </tr>
+        {/each}
+      </table>
+      <Voffset v="9"/>
+      <div class="flex-grid">
+        <div class="col">
+          {schule.Ort}, den {datum(hj.Konferenzdatum)}
+        </div>
+        <div class="col">
+          <Voffset v="3"/>
+          <div class="text-center klein">Siegel</div>
+        </div>
+        <div class="col">
+          <Voffset v="6"/>
+          <hr />
+          <div class="text-center klein">
+            {schule.SchulleiterVorname} {schule.SchulleiterName}
+            <br />Vorsitzender des allgemeinen Prüfungsausschusses
+          </div>
+          </div>
+      </div>
+      <Voffset v="2"/>
+    </div>
+    <div class="footer klein" style="text-align:right">
+      Schulnummer: {schule.SchulNr}
+    </div>
+  </div>
+{/each}
+{/each}
+
+<script>
+  export let schueler, schule, privat, jahr, abschnitt
+  import { datum, bg, note } from './helfer'
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
+  const findeFach = (hj, as) => hj.noten.find(n => n.fach.ID === as.fach.ID) || { Lernentw: 'undefined' }
+</script>
+
+<style>
+  @import 'css/main.css';
+  .td-fach-note {
+    padding-bottom: .2rem;
+    padding-top: .2rem;
+    width: 12rem;
+  }
+  .td-fach-note span {
+    background-color: #dcdcdc !important;
+    text-align: center;
+    width: 10rem;
+    display: block;
+    margin: 0 auto;
+  }
+</style>
+
+
+
+

+ 121 - 0
FS FHR.svelte

@@ -0,0 +1,121 @@
+{#each schueler.filter(s => s.DurchschnittsnoteFHR) as s}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <h5>Zeugnis der Fachhochschulreife</h5>
+        Der allgemeine Prüfungsausschuss stellte in seiner Abschlusskonferenz am {datum(hj.Konferenzdatum)} folgende Leistungen fest<sup>1</sup>:
+        <Voffset v="1"/>
+        Mathematisch-naturwissenschaftlicher-technischer Bereich: {note(s.bk_abschluss_faecher.find(f => f.fach.FachKrz === 'MFHR').NoteAbschluss)}
+        <Voffset v="1"/>
+        <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name}</b> hat die Fachhochschulreifeprüfung im Bildungsgang
+          {bg(s, 'Zeugniskopf')} am {datum(hj.Konferenzdatum)} bestanden.
+          {s.anrede}{s.Geschlecht === 3 ? 'n':''} {s.Vorname} {s.Zusatz || ''} {s.Name} wird die
+        <Voffset v="1"/>
+          <div class="text-center">
+            <h5>Fachhochschulreife</h5>
+          </div>
+        <Voffset v="-1.5"/>
+          zuerkannt.
+          <Voffset v="1"/>
+          Entsprechend der Vereinbarung über den Erwerb einer Fachhochschulreife
+          in beruflichen Bildungsgängen – Beschluss der Kultusministerkonferenz vom
+          5. Juni 1998 in der jeweils geltenden Fassung – berechtigt dieses Zeugnis in allen
+          Ländern der Bundesrepublik Deutschland zum Studium an Fachhochschulen und
+          entsprechender Studiengänge an Universitäten.
+          <Voffset v="1"/>
+        <table class="table-noten">
+          <tr>
+                <td>Durchschnittsnote:</td><td class="td-fach-note"><span>{s.DurchschnittsnoteFHR}</span></td>
+                <td>in&nbsp;Worten:</td><td class="td-fach-note"><span>{@html noteInWorten(s.DurchschnittsnoteFHR)}</span></td>
+          </tr>
+        </table>
+        <Voffset v="5"/>
+        {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+        <Voffset v="4"/>
+        <div class="flex-grid">
+          <div class="col">
+            <hr />
+            <div class="text-center klein">
+              {schule.SchulleiterVorname} {schule.SchulleiterName} – Vorsitzende{schule.SchulleiterGeschlecht === 3 ? 'r':''} des allgemeinen
+              <br />Prüfungsausschusses
+            </div>
+          </div>
+          <div class="col klein">
+            <div class="text-center klein">
+              Siegel
+            </div>
+          </div>
+          <div class="col klein">
+            <hr />
+            <div class="text-center">
+              {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+            </div>
+          </div>
+        </div>
+        <Voffset v="2"/>
+      </div>
+      <div class="footer klein">
+        <div class="klein eng">
+          <Voffset v="2"/>
+          <div class="schulnummer">
+            Schulnummer: {schule.SchulNr}
+          </div>
+          <hr class="hr-grau" />
+          <div class="grau">
+            <sup>1</sup>Die Fächer
+            {s.bk_abschluss_faecher.filter(f => f.fach.GewichtungFHR > 0)
+              .sort((a,b) => a.FSortierung > b.FSortierung ? 1 : -1)
+              .map(f => f.fach.Zeugnisbez)
+              .join(', ')
+              .replace(/, \ sowie/g, ' sowie')}
+            gehen in die Berechnung der Durchnittsnote für die Fachhochschulreife ein.
+            <Voffset v=".5"/>
+            Rechtsbehelfsbelehrung: Gegen dieses Zeugnis kann innerhalb eines Monats
+            nach Bekanntgabe des Zeugnisses Widerspruch eingelegt werden. Der Widerspruch
+            ist beim {schule.Bezeichnung2}, {schule.Strasse}, {schule.PLZ} {schule.Ort},
+            schriftlich oder zur Niederschrift zu erheben. <br />Falls die Frist durch
+            das Verschulden einer/eines Bevollmächtigten versäumt wird, wird dieses
+            Verschulden der Widerspruchsführerin/dem Widerspruchsführer zugerechnet.
+          </div>
+        </div>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  export let kommentar = `
+[E7 html](https://bass.schul-welt.de/3129.htm#pgfId-2875772)
+[VV zu §16](https://bass.schul-welt.de/3129.htm#13-33nr1.1p16_AnlageE)
+`
+  export let schueler, schule, privat, jahr, abschnitt
+  import { datum, bg, note, noteInWorten } from './helfer'
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Fussnote from './partials/Fussnoten.svelte'
+  const aktHalbjahr = (a) => a.Jahr === jahr && a.Abschnitt === abschnitt
+  const findeFach = (hj, as) => hj.noten.find(n => n.fach.ID === as.fach.ID) || { Lernentw: 'undefined' }
+</script>
+
+<style>
+  @import 'css/main.css';
+  .td-fach-note {
+    padding-bottom: .2rem;
+    padding-top: .2rem;
+    width: 12rem;
+  }
+  .td-fach-note span {
+    background-color: #dcdcdc !important;
+    text-align: center;
+    width: 10rem;
+    display: block;
+    margin: 0 auto;
+  }
+</style>
+
+
+
+

+ 64 - 0
FS HJZ LF.svelte

@@ -0,0 +1,64 @@
+{#each schueler as s (s.ID)}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader art="daten/zeugnis.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <div style="font-size: 15pt; line-height: 1.5em">
+          {bg(s, 'Schulform')}
+        </div>
+        <div style="font-size: 12pt; line-height: 1.2em">
+          {bg(s, 'Bereich')}
+        </div>
+        <Voffset v="1"/>
+        <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+        <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},<br />
+        besuchte im Schuljahr {hj.schuljahr} die Klasse {hj.Klasse}
+        <Voffset v="2"/>
+        Leistungen laut Konferenzbeschluss vom {datum(hj.Konferenzdatum)}:
+        <div class="lf-noten">
+          <Noten lernfeld noten={hj.noten} fachGliederungen={s.fachklasse.fach_gliederungen}></Noten>
+        </div>
+        <hr />
+        <b>Bemerkungen</b><br />{@html bemerkungen(hj)}
+      </div>
+      <div class="footer">
+        <div class="flex-grid">
+          <div class="col-2">
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            <hr />
+            {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+          </div>
+          <div class="col text-center klein">
+            <Voffset v="3"/>
+            Siegel
+          </div>
+        </div>
+        <Fussnote schule={schule}></Fussnote>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  import { datum, versetzungsvermerk, volljaehrigBei, bemerkungen, bg }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Noten from './partials/Noten.svelte'
+  import Fussnote from './partials/Fussnoten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  const aktHalbjahr = a => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+  .lf-noten {
+    font-size: 0.9rem;
+  }
+</style>

+ 73 - 0
FS JZ LF.svelte

@@ -0,0 +1,73 @@
+{#each schueler as s (s.ID)}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader art="daten/zeugnis.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <div style="font-size: 15pt; line-height: 1.5em">
+          {bg(s, 'Schulform')}
+        </div>
+        <div style="font-size: 12pt; line-height: 1.2em">
+          {bg(s, 'Bereich')}
+        </div>
+        <Voffset v="1"/>
+        <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+        <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},<br />
+        {#if s.ASDSchulform.startsWith('E')}
+          besuchte das Schuljahr {hj.schuljahr} in der Klasse {hj.Klasse}
+        {:else}
+          besuchte im {hj.Abschnitt}. Halbjahr des Schuljahres {hj.schuljahr} die Klasse {hj.Klasse}
+        {/if}
+        <Voffset v="2"/>
+        Leistungen laut Konferenzbeschluss vom {datum(hj.Konferenzdatum)}:
+        <Noten lernfeld noten={hj.noten} fachGliederungen={s.fachklasse.fach_gliederungen}></Noten>
+        <hr />
+        <Voffset v="1"/>
+        <b>{versetzungsvermerk(hj)}</b>
+        <Voffset v="1"/>
+        <b>Bemerkungen</b><br />{@html bemerkungen(hj)}
+      </div>
+      <div class="footer">
+        <div class="flex-grid">
+          <div class="col-2">
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            <hr />
+            {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            Siegel
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            <hr />
+            {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+          </div>
+        </div>
+        <div class="flex-grid">
+        </div>
+        <Fussnote schule={schule}></Fussnote>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  import { datum, versetzungsvermerk, volljaehrigBei, bemerkungen, bg }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Noten from './partials/Noten.svelte'
+  import Fussnote from './partials/Fussnoten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  const aktHalbjahr = a => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+</style>

+ 100 - 0
FS JZ Übergang BP.svelte

@@ -0,0 +1,100 @@
+{#each schueler as s (s.ID)}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
+    <div class="page grid" orientation="portrait" size="A4" style="font-size: 1.0rem">
+      <Seitenlogo logo="{privat.traegerLogo}"/>
+      <Pageheader art="daten/zeugnis.svg" logo="{privat.logo}" untertitel="{privat.untertitel}"/>
+      <div class="main">
+        <span style="font-size: 15pt; line-height: 1.5em">
+          {bg(s, 'Schulform')} |
+        </span>
+        <span style="font-size: 12pt; line-height: 1.2em">
+          {bg(s, 'Bereich')}
+        </span>
+        <Voffset v="1"/>
+        <b>{s.anrede} {s.Vorname} {s.Zusatz || ''} {s.Name},</b>
+        <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort}, besuchte im Schuljahr {hj.schuljahr} die Klasse {hj.Klasse}
+        <Voffset v="2"/>
+        Leistungen laut Konferenzbeschluss vom {datum(hj.Konferenzdatum)}:
+        <div class="lf-noten" style="font-size: 0.9rem">
+          <Noten
+            noten={hj.noten}
+            fachGliederungen={s.fachklasse.fach_gliederungen}
+            lernfeld
+            fachklasse={s.fachklasse.Kennung}
+            faechergruppenIds={[10,20,30]}
+          ></Noten>
+        </div>
+        <hr />
+        <Voffset v="1"/>
+        <div class="text-center">
+          <b>{s.Geschlecht === 3 ? "Der Studierende":"Die Studierende"} hat laut Konferenzbeschluss vom {datum(hj.Konferenzdatum)}
+          <br>die Berechtigung zum Übergang in das Berufspraktikum erworben.</b>
+        </div>
+        <Voffset v="1"/>
+        <b>Bemerkungen</b><br />{@html bemerkungen(hj)}
+      </div>
+      <div class="footer">
+        <div class="flex-grid">
+          <div class="col-2">
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            <hr />
+            {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            Siegel
+          </div>
+          <div class="col text-center klein">
+          <Voffset v="3"/>
+            <hr />
+            {hj.lehrer.Vorname} {hj.lehrer.Nachname}<br />{hj.klassenlehrer_in}
+          </div>
+        </div>
+        <div class="klein eng">
+          <Voffset v="2"/>
+          <div class="schulnummer text-center">
+            Schulnummer: {schule.SchulNr}
+          </div>
+          <hr class="hr-grau" />
+          <div class="grau text-center">
+              Notenstufen gemäß § 48 SchulG: 1 = sehr gut, 2 = gut, 3 = befriedigend,
+              4 = ausreichend, 5 = mangelhaft, 6 = ungenügend
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="page grid" orientation="portrait" size="A4">
+      <div class="footer grau">
+        <Fussnote notenstufen={false} {schule} verordnung={true}></Fussnote>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  import { datum, versetzungsvermerk, volljaehrigBei, bemerkungen, bg }  from './helfer'
+
+  import Seitenlogo from './partials/Seitenlogo.svelte'
+  import Pageheader from './partials/Pageheader.svelte'
+  import Voffset from './partials/Voffset.svelte'
+  import Noten from './partials/Noten.svelte'
+  import Fussnote from './partials/Fussnoten.svelte'
+
+  export let schueler, schule, privat, jahr, abschnitt
+  let zeigeVersetzungsvermerk = true
+  const aktHalbjahr = a => a.Jahr === jahr && a.Abschnitt === abschnitt
+</script>
+
+<style>
+  @import 'css/main.css';
+  .lf-noten {
+    font-size: 0.9rem;
+  }
+  .vbutton {
+    background-color: red;
+    color: white;
+  }
+</style>

+ 73 - 0
partials/Fussnoten.svelte

@@ -0,0 +1,73 @@
+<!-- Allgemeine Fussnoten
+
+Folgende Attribute werden unterstützt:
+schule:     Hier stehen die SchulNr etc drin. Muss mitgegeben werden
+ger:        Wenn der GER für AGZ oder ASZ verwendet werden soll, mitangeben.
+            true|false Standardwert ist false
+notenstufen:Wenn die Notenstufen mit angegeben werden sollen.
+            true|false Standardwert ist false
+verordnung :true|false Standartwert false
+bfs:        true|false Standardwert false
+rechtsbehlfsbelehrung :true|false Standartwert true
+
+Beachte, true|false nicht als String setzen, sondern als statement:
+notenstufen={false} -->
+
+<div class="klein eng">
+  <Voffset v="2"/>
+  <div class="schulnummer">
+    Schulnummer: {schule.SchulNr}
+  </div>
+  <hr class="hr-grau" />
+  <div class="grau">
+    {#if notenstufen}
+      Notenstufen gemäß § 48 SchulG: 1 = sehr gut, 2 = gut, 3 = befriedigend,
+      4 = ausreichend, 5 = mangelhaft, 6 = ungenügend
+      <Voffset v=".5"/>
+    {/if}
+    {#if ger}
+      <sup>1</sup>Der Unterricht in den modernen Fremdsprachen hat auf der nach dem Fach in
+      Klammern angegebenen Niveaustufe des „Europäischen Referenzrahmens für
+      Sprachen: Lernen, Lehren, Beurteilen“ stattgefunden. Sind zwei
+      Referenzniveaus ausgewiesen, ist das niedrigere in vollem Umfang, das höhere
+      in Anteilen erreicht. Bei mindestens ausreichenden Leistungen wird der
+      sprachliche Kompetenzerwerb auf diesem Niveau bescheinigt.
+      <Voffset v=".5"/>
+    {/if}
+    {#if verordnung}
+      Dem Zeugnis liegen zugrunde: Die Verordnung über die Ausbildung und Prüfung
+      in den Bildungsgängen des Berufskollegs (Ausbildungs- und Prüfungsordnung
+      Berufskolleg, APO-BK) vom 26. Mai 1999 (SGV. NRW. 223/BASS 13 – 33 Nr. 1.1).
+    {#if bfs}
+      <br>Die Rahmenvereinbarung über die Berufsfachschulen (Beschluss der
+      Kultusministerkonferenz vom 17.10.2013) in der jeweils geltenden Fassung.
+    {:else if fs}
+      <br>Die Vereinbarung über Fachschulen (Beschluss der
+      Kultusministerkonferenz vom 07. November 2002 in der jeweils geltenden
+      Fassung).
+    {:else if fsasz}
+      <br>Abschluss der Fachschule entspricht der Rahmenvereinbarung über
+      Fachschulen (Beschluss der Kultusministerkonferenz vom 07.11.2002 in
+      der jeweils geltenden Fassung) und wird von allen Ländern in der
+      Bundesrepublik Deutschland anerkannt.
+    {/if}
+      <Voffset v=".5"/>
+    {/if}
+    {#if rechtsbehelfsbelehrung}
+      Rechtsbehelfsbelehrung: Gegen dieses Zeugnis kann innerhalb eines Monats
+      nach Bekanntgabe des Zeugnisses Widerspruch eingelegt werden. Der Widerspruch
+      ist beim {schule.Bezeichnung2}, {schule.Strasse}, {schule.PLZ} {schule.Ort},
+      schriftlich oder zur Niederschrift zu erheben. <br />Falls die Frist durch
+      das Verschulden einer/eines Bevollmächtigten versäumt wird, wird dieses
+      Verschulden der Widerspruchsführerin/dem Widerspruchsführer zugerechnet.
+    {/if}
+  </div>
+</div>
+
+<script>
+  export let schule, notenstufen, verordnung, fs, fsasz
+  export let rechtsbehelfsbelehrung = true
+  export let ger = false
+  export let bfs = false
+  import Voffset from './Voffset.svelte'
+</script>

+ 167 - 0
partials/Noten.svelte

@@ -0,0 +1,167 @@
+<!--
+Allgemeine Notentabelle für Berufskollegs, die z.B. die etwas langtextigen
+Lernfeldfächer unterstützt oder verschiedene Abschlussnoten.
+
+Folgende Attribute werden unterstützt:
+lernfeld: Sorgt dafür, dass die Klasse `fach-bezeichnung` nicht gesetzt wird und
+          Fächer dementsprechend nicht eingerückt werden (nur Lernfeldfächer)
+          true|false Standardwert false
+noten:    Hier können Abschnittsnoten oder Abschlussnoten gesetzt werden, z.B.
+          hj.noten oder s.bk_abschluss_faecher oder s.fhr_abschluss_faecher
+          Muss gesetzt werden
+fachGliederungen: sollten mitgegeben werden, wenn die für verschiedene Bildungsgänge
+          geänderten Werte berücksichtigt werden sollen, z.B. andere Bezeichnungen
+          in den verschiedenen Bildungsgängen
+ger:      Wenn ein Referenzniveau für die Fremdsprachen angegeben werden soll
+          true|false, Standardwert false,
+fachklasse: muss mitgegeben werden, wenn aus der Fachklassen.json Datei der Standard-
+          Wert gelesen werden soll. Ansonsten über Lernentw festlegen, was eigetragen wird
+faechergruppenIds: legt fest, welche Fächergruppen gezogen werden sollen. Standartwert ist
+          ein leerer Array, d.h. alle Fächergruppen werden gezogen. Ansonsten können
+          nur bestimmte festgelegt werden z.B. [10, 20, 30]
+fhrSternchen: Legt fest, ob die für die FHR relevanten Fächer ein Sternchen
+          bekommen. Standardwert ist false
+gruppenbezeichnungNeu: Legt für eine GruppenID eine neue Gruppenbezeichnung fest
+          Es wird ein Objekt erwartet, z.B. {40: 'Fachpraktische Prüfung'}
+berufsbezogenZuerst: Diese Einstellung legt fest, dass die gen. Fächer zuerst auf
+          dem Zeugnis als Fächergruppe erscheinen wie in der BASS vorgegeben.
+-->
+
+<table class="table-noten">
+  {#each faechergruppen as [gruppen_id, gruppenFaecher]}
+    <tr>
+      <td class="fachgruppe-margin">
+        <b>{gruppenbezeichnung(gruppen_id)}</b>
+      </td>
+    </tr>
+    {#each lernbereicheUndFaecher(gruppenFaecher) as [lernbereich, faecher]}
+      {#if lernbereich != faecher[0].fach.Zeugnisbez}
+        <tr><td colspan="2" class="{lernfeld ? '' : 'fach-bezeichnung'}">{lernbereich}</td></tr>
+      {/if}
+      {#each faecher as f (f.ID)}
+        {#if f.fach.AufZeugnis === '+'}
+          <tr>
+            <td class="{lernfeld ? '' : 'fach-bezeichnung'} {lernbereich != faecher[0].fach.Zeugnisbez ? 'lernfeld-lernbereich' : ''}">
+              {#if f.fach.Zeugnisbez.includes("Projekt")}
+                <!-- Funktioniert nicht mit Abschlussnoten, da diese keine Spalte `Lernentw` haben -->
+                {f.Lernentw}
+              {:else}
+                <!-- Die Zeugnisbezeichnung hat bei gesetzten fachGliederungen einen anderen Namen... -->
+                {f.fach.ZeugnisBez || f.fach.Zeugnisbez}
+                <!-- Ist ger gesetzt, unter Lernentw nach Eintrag schauen. Wenn dort nichts steht,
+                in der Fachklassen.json nach Einträgen für Fremdsprache und Fach_ID suchen
+                Mit der Fussnote 1 muss natürlich auch tatsächlich eine Fussnote zum GER existieren … -->
+                {#if ger && f.fach.IstSprache === '+'}
+                  {fremdsprache(f, fachklasse)}<sup>1</sup>
+                {/if}
+                <!-- Die für die FHR Durchschnittsnote einbezogenen Noten bekommen in
+                den FS-Zeugnissen ein Sternchen -->
+                {#if fhrSternchen && f.fach.GewichtungFHR > 0}
+                  <sup>*</sup>
+                {/if}
+              {/if}
+            </td>
+            <!-- Entweder Abschlussnote, wenn gesetzt oder Abschnittsnote oder nix -->
+            <!-- Wenn als Note eines der 'Teilgenommen' steht, dann ohne graue Hinterlegung.
+            Außer es ist eine Sprache, dann wird es wohl ein 'teilgenommen' sein,
+            das auf eine Fremdsprachenprüfung hinweist und nicht mit den anderen
+            Fächern im Diff-Bereich steht. Optisch besser. -->
+            {#if (f.fach.IstSprache==='-') && ((f.NoteAbschluss && f.NoteAbschluss.startsWith('E')) || (f.NotenKrz && f.NotenKrz.startsWith('E')))}
+              <td class="td-fach-note"><span class="e-note">{note(f.NoteAbschluss) || note(f.NotenKrz)}</span></td>
+            {:else}
+              <td class="td-fach-note"><span>{note(f.NoteAbschluss) || note(f.NotenKrz) || '–––––'}</span></td>
+            {/if}
+          </tr>
+        {/if}
+      {/each}
+    {/each}
+    <tr>
+    </tr>
+  {/each}
+</table>
+
+<script>
+  import { gruppenIds } from './gruppenIDs'
+  import { note, fremdsprache, groupBy } from '../helfer'
+
+  export let lernfeld
+  export let ger = false
+  export let faechergruppenIds = []
+  export let noten, fachGliederungen, fachklasse
+  export let fhrSternchen, gruppenbezeichnungNeu
+  export let berufsbezogenZuerst = true
+
+  let faechergruppen
+
+  // Berechne die Noten neu, wenn sich die Notenquelle ändert
+  $: noten && faechergruppen_calc()
+
+  Object.assign(gruppenIds, gruppenbezeichnungNeu)
+
+  const faechergruppen_calc = () => {
+    // noten werden im jeweiligen Dokument über das *noten*-Attribut mitgegeben.
+    // z.B. die Abschnittsnote oder die Noten aus *s.bk_abschluss_faecher* und co.
+    // Nutzer über Konsole auf Änderungen in den Fächern hinweisen
+    if (fachGliederungen && fachGliederungen.length > 0) console.log('Es wurden Fachgliederungswerte gesetzt: ', fachGliederungen)
+    // suche in den fachGliederungen, ob für die jeweilige Fachklasse was besonderes festgelegt wurde
+    // vorausgesetzt, fachGliederungen wurde mitgegeben
+    const faecher = fachGliederungen
+      ? noten.map(f => {return {...f, fach: Object.assign(f.fach, fachGliederungen.find(fg => fg.Fach_ID === f.Fach_ID))}})
+      : noten
+    // nun alle Fächer rauswerfen, die nicht in den FaechergruppenIds zugeordnet sind, z.B. Abschlussarbeiten, Projekte etc.
+    const faecherBereinigt = faechergruppenIds.length === 0
+      ? faecher
+      : faecher.filter(f => faechergruppenIds.find(id => f.fach.Fachgruppe_ID === id))
+    // erstmal alle Fächer sortieren in der passenden Reihenfolge,
+    // dann nach Fachgruppe gruppieren
+    const sortiert = faecherBereinigt.sort((a, b) => a.fach.SortierungS2 < b.fach.SortierungS2 ? 1 : -1)
+    let gruppiert = groupBy(sortiert, 'fach.Fachgruppe_ID')
+    // Die BK-Zeugnisse führen zuerst die berufsbezogenen Fächer auf.
+    // D.h. Gruppen_ID 20 muss auf 0 gesetzt werden, damit es an den Anfang kommt
+    if (berufsbezogenZuerst && gruppiert.get(20)) {
+      gruppiert.set(0, gruppiert.get(20))
+      gruppiert.delete(20)
+      gruppenIds[0] = gruppenIds[20]
+    }
+    faechergruppen = [...gruppiert.entries()].sort((a,b) => a[0] - b[0])
+  }
+  const gruppenbezeichnung = gruppe => gruppenIds[gruppe]
+  const lernbereicheUndFaecher = gruppenFaecher => [...groupBy(gruppenFaecher, 'fach.Bezeichnung').entries()].reverse()
+</script>
+
+<style>
+.table-noten {
+  width: 100%;
+  border: none;
+  border-collapse: collapse;
+  margin-bottom: 1rem;
+}
+.fach-bezeichnung {
+  padding-left: 10mm;
+}
+.td-fach-note {
+  padding-bottom: .2rem;
+  padding-top: .2rem;
+  width: 12rem;
+}
+.td-fach-note span {
+  background-color: #dcdcdc !important;
+  text-align: center;
+  width: 10rem;
+  display: block;
+  margin: 0 auto;
+}
+.td-fach-note span.e-note {
+  background-color: white !important;
+  width: 17em;
+  margin: 0;
+  padding: 0;
+}
+.fachgruppe-margin {
+  padding-top: 0.3rem;
+}
+.lernfeld-lernbereich {
+  padding-left: 2rem;
+  padding-bottom: 0;
+}
+</style>

+ 51 - 0
partials/Pageheader.svelte

@@ -0,0 +1,51 @@
+<!-- Folgende Attribute werden unterstützt:
+art:  z.B. Zeugnis, Abgangszeugnis etc. Sollte auf eine vorhandene Datei zeigen
+      wird unten links platziert im Header
+logo: z.B Schullogo. Wird oben recht splatziert
+untertitel: Wird unterhalb des Logos platziert.
+hr:   Wenn eine rote Linie unter das Logo soll. Standard an -->
+<div class="header">
+    {#if art}
+      <img class="art" src="{art}" alt="logo_art"/>
+    {/if}
+    {#if logo}
+      <img class="logo" src="{logo}" alt="logo"/>
+    {/if}
+    {#if untertitel}
+      <img class="untertitel" src="{untertitel}" alt="logo_untertitel"/>
+    {/if}
+    {#if hr}
+      <hr class="hr-rot"/>
+    {/if}
+</div>
+<script>
+  export let art, logo, untertitel
+  export let hr = true
+</script>
+
+<style>
+  .header {
+    position: relative;
+    height: 115px;
+  }
+  .art {
+    position: absolute;
+    bottom: 12px;
+  }
+  .logo {
+    position: absolute;
+    right: 0px;
+  }
+  .untertitel {
+    position: absolute;
+    right: 0px;
+    bottom: 12px;
+  }
+  .hr-rot {
+    border-color: #ff2700;
+    margin: 8px 0;
+    position: absolute;
+    bottom: 0px;
+    width: -webkit-fill-available;
+  }
+</style>

+ 51 - 0
partials/SOA-Tabelle.svelte

@@ -0,0 +1,51 @@
+<table class="table table-bordered" style="width: 100%">
+  <tr>
+    <th width="35%">Bereichsspezifische Fächer</th>
+    <th>Zugeordnete Lernfelder</th>
+  </tr>
+  <tr>
+    <td>Erziehung und Soziales</td>
+    <td>
+      <ul class="dashes">
+        <li>Bedürfnisse und Potentiale wahrnehmen, beobachten und analysieren</li>
+        <li>Mit Konzepten in sozialpädagogischen Einrichtungen arbeiten</li>
+        <li>Beziehungen in der sozialpädagogischen und pflegerischen Arbeit gestalten</li>
+        <li>Gestaltungsprinzipien und Gestaltungsmittel in Räumen sozialpflegerischer Einrichtungen</li>
+      </ul>
+    </td>
+  </tr>
+  <tr>
+    <td>Gesundheitsförderung und Pflege</td>
+    <td>
+      <ul class="dashes">
+        <li>Sozialpflegerische Handlungsprozesse systematisch planen, umsetzen, dokumentieren und evaluieren</li>
+        <li>Pflegekonzepte als Grundlage der pflegerischen Tätigkeiten anwenden</li>
+        <li>Kompetenzen, Ressourcen und Potentiale erkennen und fördern</li>
+        <li>Gesunde Lebensführung fördern</li>
+      </ul>
+    </td>
+  </tr>
+  <tr>
+    <td>Arbeitsorganisation und Recht</td>
+    <td>
+      <ul class="dashes">
+        <li>Sich im Berufsfeld orientieren, auf Anforderungen einlassen und die eigene Person darstellen</li>
+        <li>Rechte und Pflichten des Sozialassistenten kennen und wahrnehmen</li>
+        <li>Außendarstellung der sozialpädagogischen bzw. -pflegerischen Einrichtungen unterstützen</li>
+        <li>Wirtschaftlich mit Materialien umgehen</li>
+      </ul>
+    </td>
+  </tr>
+</table>
+
+<style>
+  .table-bordered {
+    border-collapse: collapse;
+  }
+  .table-bordered tr {
+    border-bottom: thin solid #333;
+  }
+  .schulnummer {
+    text-align: right;
+  }
+</style>

+ 10 - 0
partials/Seite2Fussnoten.svelte

@@ -0,0 +1,10 @@
+<div class="page grid" orientation="portrait" size="A4">
+  <div class="footer grau">
+    <Fussnote notenstufen={false} {schule} {ger}></Fussnote>
+  </div>
+</div>
+
+<script>
+export let schule, ger, notenstufen
+import Fussnote from './Fussnoten.svelte'
+</script>

+ 17 - 0
partials/Seitenlogo.svelte

@@ -0,0 +1,17 @@
+<div class="seitenlogo">
+  {#if logo}
+    <img src="{logo}" height="160" alt="traeger_logo"/>
+  {/if}
+</div>
+
+<script>
+  export let logo
+</script>
+
+<style>
+  .seitenlogo {
+    position: absolute;
+    bottom: 10mm;
+    left: 10mm;
+  }
+</style>

+ 4 - 0
partials/Voffset.svelte

@@ -0,0 +1,4 @@
+<div style="margin-top: {v}em"></div>
+<script>
+  export let v
+</script>