> ## 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.

# Transactietypes en invoerbronnen in het Kaspert-kasboek

> Leer hoe Kaspert elke kasboekboeking classificeert op type (inkomsten, onkosten, pending_expense) en bron (handmatig, bankimport, afgegrendeld).

Elke boeking in het Kaspert-kasboek is een **transactie**: een enkel financieel gebeuren dat geld aan de balans van je organisatie toevoegt of ervan aftrekt. Om rapportage, filtering en afstemming betrouwbaar te maken, draagt elke transactie twee classificatievelden: een `type` dat de economische richting van het geld beschrijft, en een `source` dat registreert hoe de transactie het systeem is binnengekomen. Als je deze twee velden begrijpt, kun je elk getal in het kasboek en in het jaarrapport goed interpreteren.

***

## Transactietypes

Het veld `type` beantwoordt de vraag: *wat voor soort financieel gebeuren is dit?*

| Type              | Beschrijving                                                                                                                                            |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `income`          | Geld **ontvangen** door de organisatie, bijvoorbeeld lidgeld betaald door ouders, verkoop uit de webshop, opbrengsten van fondsenwerving of donaties.   |
| `expense`         | Geld **uitgegeven** door de organisatie, bijvoorbeeld kampkosten, materiaal, verzekeringspremies, activiteitskosten.                                    |
| `pending_expense` | Een onkostenverzoek **ingediend door een lid** via de Onkosten-module, in afwachting van goedkeuring door een admin. Nog niet meegerekend in het saldo. |

### Hoe `pending_expense` werkt

Wanneer een lid (of een admin in iemands naam) een terugbetalingsverzoek indient in de **Onkosten**-module op `/onkosten`, maakt Kaspert een `pending_expense`-transactie aan. Dit houdt het verzoek zichtbaar in het kasboek naast andere boekingen zonder het huidige saldo te verstoren. Het bedrag blijft in een aparte wachtrij tot een admin erop acteert.

<Steps>
  <Step title="Lid dient een onkostenverzoek in">
    Het lid vult het bedrag, de beschrijving, de datum in en voegt optioneel een foto van het bonnetje toe. Kaspert maakt een `pending_expense`-transactie aan gekoppeld aan diens account.
  </Step>

  <Step title="Admin beoordeelt het verzoek">
    Admins zien alle openstaande onkostenverzoeken in **Onkosten (`/onkosten`)**. Ze kunnen elk verzoek openen, het bonnetje bekijken en kiezen om het goed te keuren of af te wijzen.
  </Step>

  <Step title="Goedkeuring converteert het type">
    Na goedkeuring verandert het `type` van de transactie van `pending_expense` naar `expense`. Het bedrag wordt nu meegerekend in de saldoberekening en de transactie verschijnt in het kasboek als een gewone onkosten.
  </Step>

  <Step title="Afwijzing verwijdert het">
    Als het verzoek wordt afgewezen, wordt de `pending_expense`-transactie volledig uit het kasboek verwijderd en wordt het lid op de hoogte gebracht.
  </Step>
</Steps>

<Note>
  Alleen `income`- en `expense`-transacties beinvloeden het kasboeksaldo. Een `pending_expense` is zichtbaar in de transactielijst maar wordt **uitgesloten van het lopende totaal** tot het is goedgekeurd.
</Note>

***

## Transactiebronnen

Het veld `source` beantwoordt de vraag: *hoe is deze transactie Kaspert binnengekomen?*

| Bron          | Beschrijving                                                                                                                                                                                                     |
| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `manual`      | Handmatig ingevoerd in het kasboek door een admin. De meest voorkomende bron voor dagelijkse boekhouding.                                                                                                        |
| `bank_import` | Geimporteerd uit een CSV-export van de bank. Kaspert parseert het bestand en maakt één transactie per rij, waarbij de originele bankreferentie in de beschrijving wordt bewaard.                                 |
| `reconciled`  | Automatisch gekoppeld aan een betalingsverplichting in de betalingsopvolgingsmodule. Kaspert maakt of labelt deze transactie wanneer een binnenkomende betaling wordt gematcht met een openstaande verplichting. |

<Info>
  Het veld `source` is optioneel in het datamodel (het kan `undefined` zijn voor legacy-records), maar alle nieuwe transacties die via de Kaspert-interface worden aangemaakt dragen altijd een expliciete bronwaarde.
</Info>

***

## Bedragsconventies

Kaspert slaat alle bedragen op als **positieve getallen**, ongeacht het type. Het veld `type`, niet een minteken, bepaalt of het bedrag het saldo verhoogt of verlaagt:

* `income` van `€50.00` -> saldo **stijgt** met €50,00
* `expense` van `€50.00` -> saldo **daalt** met €50,00
* `pending_expense` van `€50.00` -> saldo **onveranderd** tot goedkeuring

Deze conventie maakt filtering en optellen over een enkele `amount`-kolom eenvoudig en voorkomt verwarring over tekens bij het lezen van records.

***

## TypeScript-referentie

De volledige typedefinities die doorheen de Kaspert-frontend worden gebruikt:

```typescript title="src/types/transaction.ts" theme={null}
export interface Transaction {
  id: string;
  type: "income" | "expense" | "pending_expense";
  amount: number;               // always positive (> 0)
  description: string;
  date: string;                 // YYYY-MM-DD
  category: string;
  receiptUrl?: string;          // URL to receipt image in storage
  source?: "manual" | "bank_import" | "reconciled";
  linkedTransactionId?: string; // links income to expense for reconciliation
}
```

Het veld `linkedTransactionId` wordt door de betalingsopvolgingsmodule gebruikt om een tweerichtingsreferentie te maken tussen een binnenkomende betaling (`income`, bron `reconciled`) en de verplichting die ermee wordt vereffend. Zo kun je makkelijk traceren welke bankoverschrijving welke openstaande vergoeding heeft betaald.

***

## Alles samen

<Accordion title="Voorbeeld: een volledig seizoen aan transacties">
  Een typisch werkjaar voor een Chiro-groep kan de volgende mix van types en bronnen bevatten:

  | Datum      | Beschrijving                      | Type              | Bron          | Bedrag  |
  | ---------- | --------------------------------- | ----------------- | ------------- | ------- |
  | 2024-09-05 | Lidgeld Tibo                      | `income`          | `reconciled`  | €45,00  |
  | 2024-09-05 | Lidgeld Sara                      | `income`          | `bank_import` | €45,00  |
  | 2024-10-12 | Kamp materiaal                    | `expense`         | `manual`      | €120,00 |
  | 2024-11-03 | Benzine terugbetaling             | `pending_expense` | `manual`      | €38,50  |
  | 2024-11-04 | Benzine terugbetaling goedgekeurd | `expense`         | `manual`      | €38,50  |

  In dit voorbeeld werd het benzineverzoek op de 3e ingediend als `pending_expense` en op de 4e goedgekeurd. Op dat punt werd het oorspronkelijke pending-record vervangen door een bevestigde `expense`.
</Accordion>
