96 lines
No EOL
3.1 KiB
Markdown
96 lines
No EOL
3.1 KiB
Markdown
# Dagelijkse WhatsApp samenvatting — Design
|
|
|
|
## Doel
|
|
|
|
Elke dag om 10:00 uur een WhatsApp-bericht sturen naar de admin (31620248011) met het totaal aantal dienstaanvragen van de vorige dag (00:00 t/m 23:59).
|
|
|
|
## Requirement samenvatting
|
|
|
|
| Item | Keuze |
|
|
|------|-------|
|
|
| Inhoud bericht | Alleen totaal aantal |
|
|
| Periode | Vorige kalenderdag (00:00-23:59) |
|
|
| Persistentie | In-memory (geen disk) |
|
|
| Verzendtijd | 10:00 elke ochtend |
|
|
| Ontvanger | `ADMIN_NUMBER` uit `.env` (31620248011@c.us) |
|
|
|
|
## Architectuur
|
|
|
|
### Nieuwe module: `src/dailyStats.js`
|
|
|
|
Houdt twee tellers bij in memory:
|
|
|
|
- `dailyTotal` — aantal aanvragen vandaag (lopende dag)
|
|
- `yesterdayTotal` — aantal aanvragen van gisteren (voor verzending om 10:00)
|
|
|
|
Publieke API:
|
|
|
|
- `increment()` — verhoogt `dailyTotal` met 1
|
|
- `getYesterdayTotal()` — returned `yesterdayTotal`
|
|
- `resetDay()` — zet `yesterdayTotal = dailyTotal`, dan `dailyTotal = 0`
|
|
|
|
### Scheduling: `node-cron`
|
|
|
|
Cron expressie `0 10 * * *` triggert exact om 10:00 elke dag een callback die:
|
|
|
|
1. `dailyStats.resetDay()` aanroept (snapshot van gisteren)
|
|
2. `sendTextMessage(adminNumber, bericht)` aanroept om het totaal te versturen
|
|
3. Bij falen van verzending: error loggen, maar reset blijft van kracht
|
|
|
|
### Bestaande modules — wijzigingen
|
|
|
|
**`src/index.js`**
|
|
- Importeert `node-cron` en `dailyStats`
|
|
- Registreert cron job bij server startup
|
|
- Huidige `express` setup blijft ongewijzigd
|
|
|
|
**`src/messageHandler.js`**
|
|
- Importeert `dailyStats`
|
|
- Roept `dailyStats.increment()` aan na de bestaande `increment(author)` (rate limiter)
|
|
|
|
### Data flow
|
|
|
|
```
|
|
webhook POST /webhook
|
|
→ messageHandler.handleWebhook()
|
|
→ rateLimiter.increment(author) [bestaand]
|
|
→ dailyStats.increment() [nieuw, 1 regel]
|
|
|
|
om 10:00 (node-cron trigger):
|
|
→ dailyStats.resetDay()
|
|
→ whatsappApi.sendTextMessage(admin, "Aantal dienstaanvragen gisteren: N")
|
|
```
|
|
|
|
### Foutafhandeling
|
|
|
|
- Verzending faalt → error wordt gelogd, geen retry, reset is al gedaan
|
|
- Server herstart voor 10:00 → `dailyTotal` en `yesterdayTotal` zijn 0, cron start opnieuw, om 10:00 wordt bericht met "0" verstuurd (verlies van telling geaccepteerd conform in-memory keuze)
|
|
- Server draait niet om 10:00 → geen bericht die dag
|
|
|
|
### Afhankelijkheden
|
|
|
|
- `node-cron` toevoegen aan `package.json`
|
|
- Geen nieuwe `.env` variabelen — `ADMIN_NUMBER` wordt hergebruikt
|
|
|
|
### Berichtformaat
|
|
|
|
```
|
|
Aantal dienstaanvragen gisteren: N
|
|
```
|
|
|
|
Waar `N` het totaal aantal is van 00:00 tot 23:59 van de vorige kalenderdag.
|
|
|
|
## Teststrategie
|
|
|
|
1. **`dailyStats` unit tests**
|
|
- `increment()` verhoogt `dailyTotal` correct
|
|
- `resetDay()` kopieert `dailyTotal` naar `yesterdayTotal` en zet `dailyTotal` op 0
|
|
- `getYesterdayTotal()` returned gecachte waarde
|
|
|
|
2. **Integratietest**
|
|
- Cron callback handmatig aanroepen → verifieer dat `sendTextMessage` wordt aangeroepen met juiste admin nummer en bericht
|
|
|
|
## Scope & grenzen
|
|
|
|
- Binnen scope: teller bijhouden, cron trigger, WhatsApp verzending
|
|
- Buiten scope: persistentie op disk, uitsplitsingen per gebruiker/dienst, herstel van gemiste data na crash, historische rapportages |