---
name: zakenmaat-dag-afsluiten
description: >
  Sluit je werkdag af in Zakenmaat. Vraagt je dagtotaal en laat de app dat
  VERDELEN over klanten, in plaats van je dag te laten reconstrueren. Werkt ook
  als je geen timer hebt gebruikt, want dat is de normale situatie. Gebruik aan
  het eind van een werkdag, of bij "sluit mijn dag af", "boek mijn uren", "dag
  afsluiten" of "ik stop ermee", ook voor een dag eerder deze week. Stelt daarna
  de ritten van vandaag voor uit je afspraken op een adres, en vraagt of een
  telefoontje of besluit van vandaag in de tijdlijn hoort. Niet voor het
  overzicht (zakenmaat-start) en niet voor nieuwe taken (zakenmaat-taken-plannen).
---

# Zakenmaat, dag afsluiten

Vier van vijf: `zakenmaat-start`, `zakenmaat-aan-de-slag`,
`zakenmaat-taken-plannen`, **`zakenmaat-dag-afsluiten`**,
`zakenmaat-projectcheck`.

## Waarom deze skill bestaat

Elke urenapp heeft een timer. Geen enkele lost op dat je hem vergeet te starten.

De gebruikelijke oplossing is je dag reconstrueren: je AI vraagt "wat heb je
vandaag gedaan?" en jij graaft in je mail en je agenda. Dat is werk, het gebeurt
op het moment dat je moe bent, en het resultaat is een gok met een net gezicht.

Deze skill doet het anders, en dat is het hele punt:

> **Je meet niet wat je deed. Je verdeelt een getal dat je al vertrouwt.**

Sinds koppeling 1.21.0 rekent de app die verdeling zelf uit, met
`dag_voorstel`, en boekt `dag_boeken` hem in één keer. Je AI krijgt dan
hetzelfde voorstel als de gebruiker op het scherm Dag afsluiten. Reken het
voorstel dus niet zelf na en zet er geen eigen verdeling naast.

## Stap 0, kijk wat er uit staat en welke tools je hebt

Roep eerst `koppeling_status` aan en lees `onderdelen_uit`: de namen van de
onderdelen die de eigenaar in deze werkruimte heeft uitgezet, zoals Financieel,
Agenda of Kilometers. Is de lijst leeg of ontbreekt het veld, dan staat alles
aan.

- Staat Agenda erin, roep dan `agenda_lijst` niet aan. `dag_voorstel` laat de
  afspraken dan zelf weg.
- Staat Financieel erin, noem dan geen bedragen en stel geen facturen of kosten
  voor.
- Staat Kilometers erin, stel dan geen ritten voor.

Weigert een tool toch met de code `onderdeel-uit`, dan is dat geen fout: de
gegevens bestaan nog, ze zijn alleen verborgen. Zeg dus niet dat er niets is.
Weer aanzetten kan alleen in de app, niet via jou.

Kijk dan of `dag_voorstel` en `dag_boeken` in je toollijst staan. Zo niet, dan
draait je client op een lijst van voor koppeling 1.21.0. Zeg in één zin dat
de gebruiker zijn AI opnieuw kan verbinden, en volg voor nu de **Terugval**
onderaan deze skill.

## Stap 1, welke dag, en hoe lang

Standaard sluit je vandaag af. Noemt de gebruiker een eerdere dag ("gisteren",
"dinsdag"), dan die, als JJJJ-MM-DD. Hoe ver terug het mag, staat in zijn
instellingen; `dag_voorstel` zegt het als de dag te ver terug ligt.

**Een timer die sinds een eerdere dag loopt** (`timer_status`, of `timer_start`
gaf `timer-eerdere-dag`, sinds 1.31.0) stop je niet: stoppen boekt al die uren
op vandaag. Sluit eerst die dag af, met die `dag` en zonder `timer_id`. Gooi de
timer daarna weg met `timer_weggooien` (sinds koppeling 1.32.0, hij vraagt de
gebruiker eerst), en start pas daarna een nieuwe. Staat `timer_weggooien` niet in
je toollijst, dan gooit de gebruiker hem weg in de app, op Tijd of op Dag
afsluiten. Zeg dat zo.

Begin dan bij het dagtotaal, niet bij de taken.

> Hoeveel uur heb je vandaag in totaal gewerkt? Bijvoorbeeld 7:04 of 7,07. Was
> het je gewone dag, dan zeg je dat.

Dat getal komt uit de eigen tijdregistratie van de gebruiker, zijn telefoon of
zijn hoofd. Het is betrouwbaar, want het gaat over aanwezigheid en niet over
herinnering. Pauzes zitten er al uit.

Reken het om naar minuten voor `totaal`: 7:04 is 424, 7,07 uur is 424. Zegt de
gebruiker dat het zijn gewone dag was, of weet hij het niet, laat `totaal` dan
weg. Dan rekent de app met zijn gewone dagtotaal uit de instellingen, of, als
hij dat niet heeft, maakt hij een schatting uit de sporen. `let_op` zegt welke
van de twee.

## Stap 2, wat je alleen uit dit gesprek weet

De app ziet afspraken, afgevinkte taken, notities, facturen, checklist-stappen
en een timer. Hij ziet niet dat de gebruiker een uur met een klant belde of aan
een klant werkte zonder iets af te vinken. Heb je daar in dit gesprek iets over
gehoord, dan gaat het als `extra` mee in stap 3:

- `klant_id`: het id uit `klanten_lijst`;
- `gewicht_min`: hoe zwaar het weegt, in minuten, van 1 tot 240. Een
  telefoontje van een uur is 60;
- `waarom`: wat de gebruiker deed, in zijn woorden, tot 120 tekens.

Hooguit twintig, en alleen op een actieve klant: een inactieve klant geeft
`dag-klant-inactief` en geen voorstel. Werkte de gebruiker er toch voor, zet
die klant dan in stap 5 als eigen post met minuten. Een extra spoor krijgt
geen hele dag: de app houdt er hetzelfde plafond op als op de rest. Niets
gehoord? Laat `extra` weg en vraag er niet naar.

## Stap 3, vraag het voorstel op

Roep `dag_voorstel` aan met `dag`, en `totaal` en `extra` als je die hebt.

Laat het voorstel zien zoals het terugkomt, als een verdeling die de gebruiker
corrigeert en niet als open vraag:

```
Vandaag zie ik:
  al geboekt    1u     Bakkerij Janssen
  afgevinkt     3 taken Praktijk de Linde
  agenda        14:00 kennismaking Studio Veld

Van je 7 uur stelt Zakenmaat voor:
  Praktijk de Linde     3u30   drie afgevinkte taken
  Studio Veld           1u30   kennismaking
  Zonder klant          1u     wat ik nergens aan kan hangen

Klopt dat ongeveer, of schuif ik?
```

Wat je daarbij doet:

- **Lees `let_op` en neem over wat erin staat.** Daar staat of het een
  verdeling of een schatting is, of er een timer meetelt, of de dag al eens is
  afgesloten, en wanneer de agenda voor het laatst is opgehaald.
- **Een afspraak met `geraden: true`** staat op een klant die de app uit de
  titel of de locatie raadde. Vraag of dat klopt.
- **De post zonder klant zet je nooit op eigen houtje op een klant.** Het is
  niet factureerbare tijd, en die hoort er ook in: wie alleen klantwerk boekt
  weet aan het eind van de maand niet waar zijn week heen ging.
- **Wat al geboekt staat, staat onder `al_geboekt`** en telt al mee in het
  totaal. Boek het niet nog een keer.
- **Een regel met negatieve minuten in `al_geboekt`** is een correctie. Hij
  trekt alleen af van uren op dezelfde klant op die dag; telt er een niet of
  maar deels mee, dan zegt `let_op` hoeveel, en neem je dat over. Stel zelf
  nooit een correctie voor die op een klant meer aftrekt dan er die dag op
  staat (sinds koppeling 1.21.1).
- **Status `al-geboekt`** betekent dat er niets te verdelen valt. Zeg dat, en
  vraag of de gebruiker de dag toch wil afsluiten zonder uren.

## Stap 4, corrigeer

- **Een ander totaal, of werk dat er niet in stond:** vraag een nieuw voorstel
  met het nieuwe `totaal` of een extra spoor. Dat geeft ook een nieuwe
  `sleutel`.
- **Minuten verschuiven tussen posten:** pas de `minuten` van die posten aan
  voor stap 5. Houd de eenheid van het voorstel aan; staat alles op halve uren,
  schuif dan niet met 7 minuten.
- **Een post weghalen:** zet zijn `minuten` op 0 en laat hem in de lijst staan.
  Dan weet de app dat het voorstel er naast zat.
- **Een post die de gebruiker zelf toevoegt:** `voorgesteld_min` weglaten en
  `soort: "eigen"`.

Schrijf per post een omschrijving voor de gebruiker over drie maanden, niet
voor nu. De `omschrijving` uit het voorstel is een begin. "Werk" helpt later
niet, "menu-ontwerp en tweede correctieronde" wel.

## Stap 5, boek

Werkte de gebruiker die dag niet, roep `dag_boeken` dan aan met een lege
`posten`-lijst: dan is de dag afgesloten zonder uren, zoals de knop op Dag afsluiten
die zegt dat je die dag niet gewerkt hebt (Ik heb vandaag niet gewerkt).

Roep `dag_boeken` aan met:

- `dag` en `sleutel` uit het voorstel;
- `timer_id` als het voorstel er een gaf. Dan stopt `dag_boeken` die timer en
  boekt hem in dezelfde bevestiging. Gebruik hier geen `timer_stop`;
- `totaal` als je dat in stap 3 meegaf;
- `posten`: per post `klant_id`, `minuten` (een geheel getal), `omschrijving`,
  en uit het voorstel `voorgesteld_min`, `soort` en `taken`. Een `project_id`
  uit `projecten_lijst` mag erbij.

Komt er `bevestiging_nodig` terug, laat dan `wat` zien en wacht op ja. Stuur
daarna precies dezelfde aanroep nog een keer, met het token erbij. Eén
bevestiging geldt voor de hele dag, ook voor de timer. Of er om bevestiging
gevraagd wordt hangt af van de rechten onder "Wat je AI mag doen".

Zeg alleen dat iets geboekt is als het antwoord het noemt, onder `geboekt`.
De `melding` mag je letterlijk overnemen. Wat er mis kan gaan:

- `sleutel-hergebruikt`: deze sleutel boekte al een dag met andere posten. Wat
  toen aankwam staat erin, deze wijziging niet. Wil de gebruiker corrigeren,
  pas dan de regel aan met `uren_bijwerken`, of draai de hele afsluiting terug
  met `dag_ongedaan` en vraag een nieuw voorstel (beide sinds koppeling 1.32.0).
  Staan die niet in je toollijst, haal dan de regel weg met `item_verwijderen`
  en boek de correctie met `uren_boeken`.
- `al_geboekt: true` bij `ok`: dezelfde aanroep kwam al eerder aan. Er is niets
  dubbel geboekt.
- `dag-timer-vergeten`: er loopt een timer van vandaag die niet als `timer_id`
  meekwam, of je gaf een id mee van een timer die niet meer loopt. Er is niets
  geboekt. Boek opnieuw met het goede `timer_id` (vraag een nieuw voorstel als
  je het niet hebt), anders loopt de timer na de afsluiting door.
- `dag-timer-id-ongeldig`: `timer_id` is geen id uit `dag_voorstel`. Neem het
  over zoals het daar staat, of laat het weg als er geen timer stond. Er is
  niets gestopt en niets geboekt.
- `dag-te-veel-regels`: hooguit 20 posten met minuten boven 0 gaan in één
  afsluiting. Stel de gebruiker voor posten op dezelfde klant samen te voegen,
  of boek de rest daarna met `uren_boeken`. Er is niets geboekt.
- `dag-boeking-geweigerd`: de database weigerde de afsluiting als geheel (te
  veel regels, of een duur buiten 1 minuut tot 24 uur). Van de dag is niets
  geboekt; zeg dat, en vraag een nieuw voorstel.
- `dag-nieuwe-dag`: het werd middernacht tussen voorstel en boeken. Vraag een
  nieuw voorstel.
- Staat er `timer_gestopt` naast een fout, dan is de timer wel geboekt en de
  dag nog niet. Zeg dat zo, en probeer de dag opnieuw.

## Stap 6, ritten

Niet als Kilometers uit staat (stap 0): sla deze stap dan stil over.

Alleen als je vandaag afsluit. Gaat het om een eerdere dag, sla deze stap dan
over en zeg: "Ritten van {dag} leg je vast op Kilometers." De agenda kijkt niet
terug, dus voor een eerdere dag zijn er geen afspraken om ritten uit te halen.

1. Roep `ritten_lijst` aan voor de maand van vandaag. Staat `mag_boeken` op
   false, stop dan hier, zonder voorstel en zonder uitleg. Ritten vastleggen is
   alleen voor de eigenaar van de werkruimte, en een ritvoorstel waar je daarna
   een weigering op krijgt helpt niemand. Kent je toollijst `ritten_lijst`
   niet, sla de stap dan ook over: die tools kwamen met koppeling 1.17.0.
2. Roep `agenda_lijst` aan met `dagen: 1` (niet als Agenda uit staat) en neem
   de afspraken met een `locatie` die een adres is: een straat of een plaats,
   geen "Teams", "online" of een belnummer. `dag_voorstel` geeft geen locaties
   mee, daarom deze aanroep. Neem alleen regels met `soort` `afspraak` of
   `focustijd`: een `werklocatie` ("Kantoor", met een adres erbij) is geen rit
   naar een klant, en bij `afwezig` werkte de gebruiker niet. Geen afspraken op
   een adres, dan zeg je niets over ritten en ga je door naar stap 7.
3. Zoek per afspraak de klant: noemt de titel een klant uit `klanten_lijst`,
   dan hoort de rit bij die klant. Anders wordt de titel het doel.
4. De afstand: staat er in `ritten_lijst` al een rit naar hetzelfde adres of
   dezelfde klant, laat de afstand dan weg bij `rit_toevoegen`. Zakenmaat neemt
   hem dan over van die eerdere rit en zegt in het antwoord welke. Staat er
   niets, schat de afstand en zeg erbij dat het een schatting is.
5. Stel voor in één blok, zoals de urenverdeling:

```
Ritten van vandaag:
  14:00 Studio Veld, Kerkstraat 4, Tilburg   17 km enkele reis, heen en terug
        (zelfde afstand als je rit op 3 september)
  16:30 Bakkerij Smit, Markt 2, Goirle        9 km, geschat
Twee klanten na elkaar: reed je van Studio Veld door naar Bakkerij Smit?
Vastleggen zo, of pas ik iets aan?
```

Twee afspraken op een adres op één dag: vraag of er doorgereden is. Zo ja, leg
dan losse ritten vast zonder heen en terug (vertrekadres naar A, A naar B, B
naar het vertrekadres), en niet twee keer heen en terug.

Pas na ja: `rit_toevoegen` per rit, met `datum` expliciet op vandaag,
`km_enkel` (of niets, zie punt 4) en `retour`, en `klant_id` als de rit bij een
klant hoort, anders een `doel`. Een geschatte afstand leg je pas vast als de
gebruiker hem bevestigd of verbeterd heeft: de rittenstaat is het bewijs bij de
Belastingdienst.

## Stap 7, de tijdlijn

Niet als Tijdlijn uit staat (stap 0), en niet als `tijdlijn_toevoegen` niet in
je toollijst staat: die kwam met koppeling 1.22.0. Sla de stap dan stil over.

Stel één vraag, ook als je denkt dat het antwoord nee is:

> Was er vandaag een telefoontje of een besluit dat in de tijdlijn van een
> klant of project hoort?

Een uur aan de telefoon staat nu in je uren, maar wat er werd afgesproken staat
nergens. Over drie weken weet niemand meer waarom de livegang een week schoof.
Zegt de gebruiker nee, ga dan door naar stap 8 zonder er nog iets over te
zeggen.

Zegt hij ja, bepaal dan waar het hoort:

1. **Was het een afspraak uit de agenda**, neem dan de koppeling van die
   afspraak. `agenda_lijst` met `dagen: 1` (niet als Agenda uit staat; heb je
   hem in stap 6 al aangeroepen, gebruik dat antwoord) geeft per afspraak een `client_id` en
   een `project_id`, sinds koppeling 1.23.0. Heeft de afspraak een
   `project_id`, schrijf dan bij dat project; heeft hij alleen een
   `client_id`, bij die klant. Kies nooit een regel met `soort` `werklocatie`
   of `afwezig`: dat is geen gesprek met een klant.
2. **Geen koppeling op de afspraak, of een eerdere dag**: de agenda kijkt niet
   terug, dus neem de klant uit de afspraken van `dag_voorstel`. Staat daar
   `geraden: true`, vraag dan eerst of die klant klopt.
3. **Geen afspraak**: vraag bij welke klant of welk project het hoort. Bij een
   klant met precies één lopend project (`projecten_lijst` met `klant` en
   `stand: "lopend"`) stel je dat project voor.

**Stond er een stap voor klaar?** Was het contact met een klant (bellen,
mailen, een gesprek) en staat `opvolg_stap_gedaan` in je toollijst, kijk dan
met `taken_lijst` en `klant` of er bij die klant een open taak is die precies
dit contact was, zoals "Joop bellen over de offerte". Is die er, stel dan voor
die stap af te vinken met `opvolg_stap_gedaan` (sinds koppeling 1.29.0): `id`
van de taak, `kanaal`, en `volgende` met `volgende_datum` als de gebruiker een
vervolg noemt, allebei of geen van beide. Pas na ja. Dat zet het
contactmoment zelf op de tijdlijn van de klant, dus schrijf het dan niet ook
nog met `tijdlijn_toevoegen`. Zonder die stap bleef hij open staan alsof het
contact nog moest gebeuren. Weigert de tool met `onderdeel-uit`, dan staat
Opvolgen uit: schrijf het contactmoment dan zoals hieronder.

Laat anders de tekst zien die je wilt schrijven, in de woorden van de
gebruiker, en schrijf pas na ja met `tijdlijn_toevoegen`:

- `project_id`, of `klant_id` als het niet bij één project hoort. Precies een
  van de twee;
- `soort: "contact"` met `kanaal` (`telefoon`, `mail`, `gesprek` of `bericht`)
  voor een contactmoment, of `soort: "besluit"` voor iets wat is besloten;
- `tekst`: wat er gebeurde of besloten is, hooguit 4000 tekens;
- `op` alleen als het om een eerdere dag gaat, als JJJJ-MM-DD. Vandaag laat je
  weg;
- `alleen_geld: true` als de tekst een bedrag, een prijs of een
  documentnummer noemt. Geeft dat `tijdlijn-geld`, haal het bedrag dan uit de
  tekst en vraag opnieuw om ja.

Een stand (op schema, let op, achter) schrijf je hier niet. Dat is een oordeel
over het hele project, en dat hoort bij `zakenmaat-projectcheck`.

## Stap 8, sluit af

```
Geboekt        7 uur over 4 posten
Ritten         2 vastgelegd, samen 52 km
Tijdlijn       1 contactmoment bij Website De Brug
Deze week      24,5 uur, waarvan 19 op klantwerk
Morgen         de offerte voor Bakkerij Janssen staat als eerste
```

Het weektotaal haal je uit `uren_lijst` met `dagen: 7`, of uit `overzicht`. De
regels Ritten en Tijdlijn laat je weg als er niets is vastgelegd.

## Terugval, als `dag_voorstel` en `dag_boeken` er niet zijn

Een client met een toollijst van voor 1.21.0 kent de twee tools niet. Dan reken
je het voorstel zelf, zoals deze skill dat tot 1.21.0 deed. Stap 0, 1, 6, 7
en 8 blijven gelijk; stap 2 tot en met 5 worden dit:

1. `timer_status`. Loopt er nog een timer? Stop die eerst met `timer_stop`,
   anders boek je straks dubbel.
2. `uren_lijst` met `dagen: 1`, voor wat er vandaag al geboekt staat.
3. `agenda_lijst` met `dagen: 1`, voor de afspraken van vandaag en bij welke
   klant ze hoorden. Niet als Agenda uit staat.
4. `taken_lijst` met `afgevinkt_sinds` op de datum van vandaag, voor wat er
   vandaag af ging en bij welke klant. Kent je client die parameter niet, haal
   de afgevinkte taken dan uit dit gesprek.
5. Weet je niet bij welke klanten er gewerkt is zonder dat er iets af ging,
   vraag dat in één zin.
6. Stel een verdeling voor in hetzelfde blok als stap 3. Het totaal klopt met
   wat de gebruiker opgaf: je verdeelt een getal, je telt niet op naar een
   getal. Wat al geboekt staat hoort bij het totaal. Een half uur is de
   kleinste eenheid. Tijd die over blijft is een post zonder klant.
7. Boek per regel met `uren_boeken`, met `uren`, `klant` en `omschrijving`,
   en hang hem aan een taak met `taak` of `todo_id` waar dat kan. Hoort de
   taak bij een andere klant dan de regel, laat de taak dan weg: sinds
   koppeling 1.24.0 weigert de app dat, tenzij de taak bij de
   hoofdklant van die klant hoort, en boekt hij niets. Komt er `bevestiging_nodig` terug, laat zien wat er geboekt gaat
   worden en wacht op ja.

Deze weg boekt wel de uren, maar de app weet dan niet dat de dag is afgesloten:
Vandaag kan er nog om blijven vragen, en de app leert niet hoe ver zijn
voorstel ernaast zat. Dat is de reden om opnieuw te verbinden.

## Werk je in meerdere gesprekken of terminals tegelijk?

Dan telt elk gesprek apart en tel je dubbel: twee sessies van drie uur naast
elkaar zijn geen zes uur werk. Dat is precies waarom deze skill bij het
dagtotaal begint en niet bij de sessies. Eén getal dat klopt, verdeeld over
waar de aandacht heen ging, is nauwkeuriger dan de som van wat elke sessie
denkt te weten.

## Wat deze skill bewust niet doet

- **Geen eigen verdeling naast die van de app.** Klopt het voorstel niet, dan
  corrigeert de gebruiker het, en vraag je zo nodig een nieuw voorstel.
- **Geen oordeel over de dag.** Niet "goed bezig" en niet "je hebt weinig
  geboekt". Je AI weet niet of dat terecht is.
- **Geen facturen maken.** Andere handeling, ander gevolg, staat standaard op
  "eerst vragen".
- **Geen ritten voor een eerdere dag**, en geen rit zonder afspraak op een
  adres. Reed de gebruiker ergens heen zonder afspraak, dan legt die dat zelf
  vast op Kilometers.
- **Niets stil terugwerkend rechtzetten.** Zie je dat er gisteren niets geboekt
  is, meld dat als vraag.
