> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kaspert.be/llms.txt
> Use this file to discover all available pages before exploring further.

# Werkjaren begrijpen, de seizoenen in Kaspert

> Een werkjaar is het datumgebonden seizoen dat elke transactie, ledeninschrijving en elk rapport in Kaspert groepeert, de basis van alle financiele data.

Een **werkjaar** (letterlijk "werkjaar") is de fundamentele tijdseenheid in Kaspert. Elke transactie die je boekt, elk lid dat je inschrijft en elk rapport dat je genereert behoort tot precies één werkjaar. Omdat jeugdverenigingen zoals Chiro, Scouts, KSA en KLJ werken met een seizoen van september tot augustus in plaats van een kalenderjaar, volgt het werkjaar dat ritme. Zo blijven de financien van vorig seizoen netjes gescheiden van dit seizoen, ongeacht wanneer je de app opent.

## Wat een werkjaar bevat

Elk werkjaar heeft drie velden:

<CardGroup cols={3}>
  <Card title="Label" icon="tag">
    Een leesbare identificatie voor het seizoen, bijvoorbeeld `"2024-2025"`. Moet uniek zijn binnen je organisatie. Dit zie je in elke dropdown en rapportkop.
  </Card>

  <Card title="Startdatum" icon="calendar-days">
    De eerste dag van het seizoen, in `YYYY-MM-DD`-formaat. Doorgaans 1 september. Alle transacties op of na deze datum behoren tot dit werkjaar.
  </Card>

  <Card title="Einddatum" icon="calendar-check">
    De laatste dag van het seizoen, in `YYYY-MM-DD`-formaat. Doorgaans 31 augustus. Transacties tot en met deze datum vallen binnen dit werkjaar.
  </Card>
</CardGroup>

### Labelformaat-conventie

Het conventionele labelformaat is `YYYY-YYYY`, bijvoorbeeld `"2024-2025"` voor het seizoen dat loopt van september 2024 tot en met augustus 2025. Kaspert **dwingt dit patroon niet af**, dus je kunt technisch gezien elke string gebruiken, maar het is aan te raden om je aan de conventie te houden. Zo sorteren labels correct en zijn ze meteen herkenbaar voor elk teamlid.

<Note>
  Labels moeten uniek zijn per organisatie. Als je probeert een duplicaatlabel op te slaan, toont Kaspert **"Dit werkjaar bestaat al"** en blokkeert het opslaan.
</Note>

***

## Hoe het "huidige" werkjaar wordt bepaald

Kaspert markeert automatisch het actieve werkjaar doorheen de interface. De logica werkt als volgt:

<Steps>
  <Step title="Controleer de datum van vandaag">
    Kaspert neemt de datum van vandaag en leidt het verwachte seizoenlabel af. Voor de maanden september tot en met december is het label `YYYY-(YYYY+1)`. Voor januari tot en met augustus is het label `(YYYY-1)-YYYY`.
  </Step>

  <Step title="Match gevonden, gebruik het">
    Als een werkjaar in je organisatie een label heeft dat overeenkomt met het verwachte seizoen van vandaag, dan wordt dat werkjaar als huidig beschouwd en vooraf geselecteerd in alle filters.
  </Step>

  <Step title="Geen match, val terug op het meest recente">
    Als geen werkjaar-label overeenkomt (bijvoorbeeld omdat je het werkjaar voor volgend seizoen nog niet hebt aangemaakt, of omdat je niet-standaard labels gebruikt), valt Kaspert terug op het meest recent aangemaakte werkjaar.
  </Step>
</Steps>

De onderliggende utility die deze logiek aandrijft is gepubliceerd voor transparantie:

```typescript title="src/lib/werkjaar.ts" theme={null}
/**
 * Werkjaar utility functions.
 * A werkjaar runs from September 1 to August 31.
 * Format: "2025-2026"
 */

/** Get the current werkjaar based on today's date */
export function getCurrentWerkjaar(date: Date = new Date()): string {
  const month = date.getMonth() + 1; // 1-based
  const year = date.getFullYear();
  if (month < 9) {
    return `${year - 1}-${year}`;
  }
  return `${year}-${year + 1}`;
}

/** Get unique werkjaren from a list, sorted descending */
export function getUniqueWerkjaren(werkjaren: string[]): string[] {
  return [...new Set(werkjaren)].sort().reverse();
}
```

***

## Waar werkjaren belangrijk zijn

Elke belangrijke module in Kaspert is gekoppeld aan een werkjaar. Zo gebruikt elke module het werkjaar:

<CardGroup cols={2}>
  <Card title="Kasboek" icon="book-open" href="/modules/kasboek/overview">
    De transactielijst en het lopende saldo worden gefilterd op werkjaar. Als je de werkjaarselector bovenaan `/dashboard` wijzigt, laadt het kasboek onmiddellijk opnieuw voor dat seizoen. Transacties met een datum buiten het geselecteerde werkjaar worden verborgen.
  </Card>

  <Card title="Ledenbeheer" icon="users" href="/modules/members/overview">
    Ledeninschrijvingen worden per werkjaar geregistreerd. Een lid dat actief was in `2023-2024` is niet automatisch ingeschreven voor `2024-2025`. Er is een nieuwe inschrijving nodig voor het nieuwe seizoen.
  </Card>

  <Card title="Jaarverslag" icon="file-chart-column">
    Rapporten worden altijd gegenereerd voor één werkjaar tegelijk. Het rapport haalt totalen, categorie-opdelingen en saldocijfers uitsluitend uit transacties binnen het datumbereik van het geselecteerde werkjaar.
  </Card>

  <Card title="Betalingsopvolging" icon="circle-check" href="/modules/payments/overview">
    Betalingsverplichtingen kunnen meerdere werkjaren beslaan, maar het kasboekfilter bepaalt welke transacties beschikbaar zijn voor matching. Stel het juiste werkjaar in voordat je verplichtingen afstemt om verwarring tussen seizoenen te voorkomen.
  </Card>
</CardGroup>

***

## Werkjaren beheren

Admins beheren werkjaren onder **Beheer (`/admin`) > Organisatie > Werkjaren**. Daar kun je:

* **Aanmaken** een nieuw werkjaar door een label, een startdatum en een einddatum in te voeren.
* **Bewerken** het label of de datums van een bestaand werkjaar (wijzigingen worden onmiddellijk doorgevoerd voor alle gefilterde weergaven).
* **Verwijderen** een werkjaar. Er verschijnt eerst een bevestigingsvenster.

<Warning>
  Het verwijderen van een werkjaar verwijdert geen gekoppelde transacties of ledenrecords, maar die records worden effectief onzichtbaar omdat geen werkjaarbereik ze meer omvat. Archiveer oude seizoenen in plaats van ze te verwijderen om je financiele geschiedenis te bewaren.
</Warning>

<Tip>
  Maak het nieuwe werkjaar **voor** het seizoen begint, idealiter in augustus. Zo kan je team op 1 september meteen beginnen met het boeken van transacties en het inschrijven van leden, zonder configuratievertraging.
</Tip>
