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

# Cron-eindpunten

> Geautomatiseerde taken — weekrapport en andere geplande jobs

## Overzicht

Klantel heeft elf HTTP-eindpunten die periodiek worden aangeroepen door de VPS-root-crontab
(zie [ADR-0014](https://github.com/AethronTech/klantel/blob/main/docs/adr/0014-cron-scheduling-vps-crontab.md)).
Coolify Scheduled Tasks worden niet gebruikt.

## Beveiliging

Alle cron-eindpunten vereisen een `Authorization: Bearer`-header met het `CRON_SECRET`:

```http theme={null}
Authorization: Bearer <CRON_SECRET>
```

Stel `CRON_SECRET` in als omgevingsvariabele. Genereer een sterk geheim:

```bash theme={null}
openssl rand -hex 32
```

<Warning>
  Nooit het `CRON_SECRET` in code, logs of platte-tekst crontab-regels opslaan. Beheer het via
  `/etc/klantel-cron.env` (`chmod 600`) op de VPS — elke crontab-regel source-t deze file.
</Warning>

## Eindpunten

### POST /api/cron/weekrapport

Verstuurt een wekelijks samenvattingsrapport per e-mail aan alle beheerders van elke actieve tenant.

**Schema (VPS-crontab):** iedere zondag om 18:00 UTC (19:00 Belgische wintertijd)

```
0 18 * * 0
```

**Aanroepvoorbeeld:**

```bash theme={null}
curl -X POST https://app.klantel.be/api/cron/weekrapport \
  -H "Authorization: Bearer $CRON_SECRET" \
  -H "Content-Type: application/json"
```

**Respons bij succes:**

```json theme={null}
{ "verstuurd": 12, "fouten": 0 }
```

**Foutrespons:**

```json theme={null}
{ "error": "Onbevoegd" }
```

HTTP 401 bij ontbrekende of ongeldige token.

### POST /api/cron/audit-retentie

Verwijdert `AuditEntry`-rijen ouder dan `AUDIT_RETENTIE_DAGEN` dagen (default **2555 = 7 jaar**).
Voldoet aan GDPR-opslagbeperking: audit-logboek niet langer bewaren dan wettelijk vereist.

**Omgevingsvariabele:** `AUDIT_RETENTIE_DAGEN` (optioneel, default 2555)

**Schema (VPS-crontab):** jaarlijks op 1 januari om 02:00 UTC

```
0 2 1 1 *
```

**Aanroepvoorbeeld:**

```bash theme={null}
curl -X POST https://app.klantel.be/api/cron/audit-retentie \
  -H "Authorization: Bearer $CRON_SECRET"
```

**Respons bij succes:**

```json theme={null}
{ "ok": true, "verwijderd": 42, "retentieDagen": 2555, "grens": "2017-01-01T02:00:00.000Z" }
```

<Note>
  Na opschoning blijft de hashketen-verificatie (`/api/cron/audit-verificatie`) groen: de
  verificatie-cron gebruikt de oudste resterende entry als nieuw ankerpunt.
</Note>

### POST /api/cron/beveiligingslog-retentie

Verwijdert `BeveiligingsLog`-rijen (inlogpogingen) ouder dan `BEVEILIGINGSLOG_RETENTIE_DAGEN` dagen
(default **90**).

**Omgevingsvariabele:** `BEVEILIGINGSLOG_RETENTIE_DAGEN` (optioneel, default 90)

**Schema (VPS-crontab):** dagelijks om 03:00 UTC

```
0 3 * * *
```

**Aanroepvoorbeeld:**

```bash theme={null}
curl -X POST https://app.klantel.be/api/cron/beveiligingslog-retentie \
  -H "Authorization: Bearer $CRON_SECRET"
```

**Respons bij succes:**

```json theme={null}
{ "ok": true, "verwijderd": 5, "retentieDagen": 90, "grens": "2026-03-24T03:00:00.000Z" }
```

### POST /api/cron/audit-verificatie

Verifieert de SHA-256 hashketen van alle `AuditEntry`-records per tenant. Alarmeert bij een
gebroken keten (mogelijke manipulatie).

**Schema (VPS-crontab):** dagelijks om 01:00 UTC

```
0 1 * * *
```

**Aanroepvoorbeeld:**

```bash theme={null}
curl -X POST https://app.klantel.be/api/cron/audit-verificatie \
  -H "Authorization: Bearer $CRON_SECRET"
```

**Respons bij succes (keten intact):** HTTP 200

```json theme={null}
{ "gecontroleerd": 3, "aantalGebroken": 0, "resultaten": [...], "tijdstip": "..." }
```

**Respons bij gebroken keten:** HTTP 409

```json theme={null}
{ "gecontroleerd": 3, "aantalGebroken": 1, "resultaten": [...] }
```

### POST /api/cron/backup-status

Rapporteer-eindpunt voor de host-cron (`scripts/backup.sh` → `/opt/klantel/backup.sh`). De host-cron
stuurt na elke back-up-run de exit-status en bestandsgrootte door. Het resultaat wordt bewaard
(`BackupStatus`) zodat het dagrapport de back-up-status als vaste rubriek kan tonen. Bij een mislukte
run (`exitCode ≠ 0`) volgt een **Sentry-event** met tag `type: backup-failure` — zo wordt stille
faling alsnog gemeld (KLANTEL-354).

**Body (JSON):**

```json theme={null}
{ "exitCode": 0, "bestandsnaam": "klantel_20260629.dump", "grootte": 20480, "foutmelding": "" }
```

`exitCode` is verplicht; `bestandsnaam`, `grootte` (bytes) en `foutmelding` zijn optioneel.

**Aanroepvoorbeeld:**

```bash theme={null}
curl -X POST https://app.klantel.be/api/cron/backup-status \
  -H "Authorization: Bearer $CRON_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"exitCode":0,"bestandsnaam":"klantel.dump","grootte":20480}'
```

**Respons bij succes:**

```json theme={null}
{ "ok": true, "gelukt": true }
```

HTTP 400 bij ongeldige body, 401 bij ontbrekende/ongeldige token.

### POST /api/cron/dagrapport

Dagelijks operationeel rapport voor de beheerder. Toont de back-up-status als vaste rubriek
(datum + grootte + OK/FOUT), gevoed door `BackupStatus`. Wordt gemaild naar `DAGRAPPORT_EMAIL`
(val terug op `SUPPORT_EMAIL`). Zonder ontvanger wordt het rapport niet verstuurd maar wel als JSON
teruggegeven (KLANTEL-354).

**Schema (VPS-crontab):** dagelijks om 06:00 UTC

```
0 6 * * *
```

**Aanroepvoorbeeld:**

```bash theme={null}
curl -X POST https://app.klantel.be/api/cron/dagrapport \
  -H "Authorization: Bearer $CRON_SECRET"
```

**Respons bij succes:**

```json theme={null}
{ "ok": true, "verzonden": true, "backup": { "resultaat": "OK", "gelukt": true, "datum": "29/06/2026 08:00", "grootte": "20.0 KB", "bron": "host-cron" } }
```

## VPS-crontab-configuratie

Alle cron-endpoints worden aangeroepen vanuit de **root-crontab op de VPS** (zie [ADR-0014](https://github.com/AethronTech/klantel/blob/main/docs/adr/0014-cron-scheduling-vps-crontab.md) en `DEPLOYMENT_OVH_COOLIFY.md` §3.9 voor de volledige regelset).

<Steps>
  <Step title="Env-file aanmaken">
    Maak `/etc/klantel-cron.env` aan als root met `CRON_SECRET=<geheim>` en stel de rechten in:

    ```bash theme={null}
    chmod 600 /etc/klantel-cron.env
    ```
  </Step>

  <Step title="Crontab-regels toevoegen">
    Voer `crontab -e` uit als root. Elke regel source-t de env-file:

    ```cron theme={null}
    0 18 * * 0 . /etc/klantel-cron.env; curl -s -X POST https://klantel.be/api/cron/weekrapport -H "Authorization: Bearer $CRON_SECRET" >> /var/log/klantel-cron.log 2>&1
    ```

    Zie `DEPLOYMENT_OVH_COOLIFY.md` §3.9 voor de volledige regelset van alle negen endpoints.
  </Step>

  <Step title="Testen">
    Roep het endpoint manueel aan en controleer de log:

    ```bash theme={null}
    . /etc/klantel-cron.env && curl -s -X POST https://klantel.be/api/cron/weekrapport \
      -H "Authorization: Bearer $CRON_SECRET"
    tail -f /var/log/klantel-cron.log
    ```
  </Step>
</Steps>

## Verwante pagina's

<CardGroup cols={2}>
  <Card title="API-overzicht" icon="book" href="/api/overzicht">
    Basis-URL, rate limits en foutformaten
  </Card>

  <Card title="Rapporten" icon="chart-bar" href="/handleiding/rapporten">
    Manueel rapporten bekijken
  </Card>
</CardGroup>
