# Bronnen — juridische concepten (TEN-337)

Deze bronlijst hoort bij `privacy.html`, `voorwaarden.html` en
`ai-disclosure.html`. Zij legt vast welke uitspraken uit de huidige repository
komen. Een bron beschrijft technische werkelijkheid, geen vastgesteld juridisch
beleid. Waar een feit, termijn of keuze niet uit de repo blijkt, staat in de
concepttekst een `[EIGENAAR: …]`-punt.

## Feiten voor het privacybeleid

| Feit in het concept | Bron in de repository |
| --- | --- |
| Aqua-IT B.V. is als verwerkingsverantwoordelijke genoemd; de app is local-first en cloud is een Plus-functie. | `docs/architecture/integraties-en-privacy.md:5-9` |
| Lokale gegevens staan in Drift/SQLite; Supabase EU bevat in cloudmodus authenticatie, ledenprofielen, gesynchroniseerde huishoudgegevens en gevoelige financiële en gezondheidsgegevens. | `docs/architecture/integraties-en-privacy.md:13-21` |
| Bijlagen staan in de private `attachments`-bucket; de opslag is met household-RLS afgeschermd en signed URL's verlopen na een uur. | `docs/architecture/integraties-en-privacy.md:17-19`; `lib/core/attachments/data/attachment_storage_service.dart:1-17,42-67`; `supabase/migrations/0004_storage_rls.sql:9-57` |
| PowerSync is voor de productie in de EU geconfigureerd en gebruikt Supabase-JWT's. | `powersync_cloud/service.yaml:1-27` |
| De ene schakelaar in Instellingen › Privacy bewaart `analyticsConsent` en start of sluit zowel de optionele PostHog-productanalyse als de Sentry-foutrapportage; zonder toestemming initialiseert geen van beide externe backends. | `lib/features/settings/presentation/privacy_screen.dart:63-71`; `lib/core/settings/settings_providers.dart:100-144`; `lib/core/observability/observability_consent.dart:11-36`; `lib/core/observability/analytics.dart:49-108`; `lib/core/observability/crash_reporter.dart:59-132` |
| PostHog gebruikt alleen expliciete grove gebeurtenissen, zonder autocapture, session replay of geïdentificeerde profielen. | `lib/core/observability/posthog_analytics.dart:1-65`; `lib/core/config/app_config.dart:56-65` |
| Sentry wordt alleen bij een geconfigureerde DSN gebruikt en is ingesteld zonder standaard-PII, performance tracing of print breadcrumbs. | `lib/core/config/app_config.dart:46-54,100-104`; `lib/core/observability/sentry_crash_reporter.dart:1-71` |
| Resend verstuurt uitnodigingen via `noreply@tendlo.app`; de invite-functie gebruikt e-mailadres en uitnodigingscontext. | `supabase/functions/invite-member/index.ts:1-39,56-132`; `docs/architecture/integraties-en-privacy.md:41-50,61` |
| Weer gebruikt alleen coördinaten; Apple Health en toestelagenda worden op het toestel uitgelezen; notificaties zijn lokaal en niet via FCM/APNs. | `docs/architecture/integraties-en-privacy.md:52-76` |
| Apple Health wordt na de gekozen koppeling op het toestel uitgelezen; afgeleide gewichts- en stappengegevens staan in gesynchroniseerde tabellen en kunnen in cloudmodus via PowerSync naar Supabase EU gaan. | `ios/Runner/Info.plist:21-24`; `lib/features/gezondheid/gewicht/presentation/gewicht_health_providers.dart:225-274`; `lib/core/sync/powersync_schema.dart:515-539,900-926`; `powersync_cloud/sync-config.yaml:117-124`; `powersync_cloud/service.yaml:1-27`; Linear TEN-337-comment van 2026-09-03 (opgehaald via de Linear-API) |
| Lokale verwijdering wist in cloudmodus uitsluitend de lokale kopie en uploadwachtrij; server- en gezinsgegevens blijven dan intact. | `lib/features/settings/data/data_reset_service.dart:24-76`; `docs/architecture/integraties-en-privacy.md:30-35` |
| Een JSON-back-up is beperkt tot gegevens die het aanvragende lid mag zien. | `docs/architecture/integraties-en-privacy.md:30-33` |
| Er is geen vastgesteld retentiebeleid of automatische opschoning voor onder meer AI-gebruikslogs, auditinformatie en soft-deletes. | `docs/architecture/integraties-en-privacy.md:34-35` |
| De huidige technische backend bevat een service-role-only functie die alle serverdata van een huishouden kan verwijderen; dit is geen selfservicefunctie. | `supabase/migrations/0043_admin_settings_gdpr.sql:14-62` |
| De app gebruikt dezelfde toestemming als activeringsvoorwaarde voor productanalyse en technische foutopsporing; de AVG-duiding in het conceptbeleid volgt daarom die gedeelde toestemming. | `lib/core/settings/settings_providers.dart:100-144`; `lib/core/observability/observability_consent.dart:11-36`; `lib/core/observability/analytics.dart:49-108`; `lib/core/observability/crash_reporter.dart:59-132` |

## Feiten voor Plus en voorwaarden

| Feit in het concept | Bron in de repository |
| --- | --- |
| RevenueCat is gekoppeld via `purchases_flutter`; de app initialiseert het bij opstarten wanneer de platformgebonden sleutel aanwezig is en gebruikt de servertabel `plus_entitlements` als bron voor Plus-toegang. | `pubspec.yaml:61-79`; `lib/main.dart:89-91`; `lib/core/config/app_config.dart:98-105`; `lib/core/purchases/plus_purchases.dart:1-24,130-183,223-250`; `supabase/migrations/0042_plus_entitlements_admin.sql:1-39` |
| De beschikbare pakketnamen onderscheiden Solo/Family en maand/jaar. | `lib/core/purchases/plus_purchases.dart:19-30,341-394` |
| Een proefperiode is alleen beschikbaar wanneer een gratis introductieaanbieding van precies veertien dagen bestaat én de winkel de gebruiker geschikt acht. | `lib/core/purchases/plus_purchases.dart:34-90,326-410` |
| Aankopen worden gedaan via de platformwinkel; RevenueCat ontvangt na Supabase-auth de gebruikers-id en de app koppelt die id opnieuw vóór aankoop of herstel. | `lib/core/purchases/plus_purchases.dart:239-290,297-313,426-467` |
| AI is server-side Plus-only en de app behandelt een geldige Solo- of Family-entitlement als toegang. | `supabase/functions/ai-proxy/index.ts:149-191`; `lib/core/ai/ai_gate.dart:1-58` |
| De AI-proxy hanteert een maandlimiet per geauthenticeerde gebruiker, met server-side overrides. | `supabase/functions/ai-proxy/index.ts:13-22,64-120,243-300` |

## Feiten voor de AI-disclosure

| Feit in het concept | Bron in de repository |
| --- | --- |
| AI staat standaard uit; er is een hoofdschakelaar, toggles per mogelijkheid en een aparte opt-in voor gevoelige domeinen. | `lib/core/ai/domain/ai_settings.dart:20-59`; `lib/core/ai/data/ai_settings_table.dart:15-42`; `lib/core/ai/ai_gate.dart:32-58`; `lib/features/settings/presentation/ai_settings_section.dart:20-128` |
| De app biedt categorisatie, document-/foto-extractie, samenvattingen, suggesties, assistent-routering en receptfoto-generatie. | `lib/core/ai/domain/ai_capability.dart:5-55` |
| De assistent bepaalt alleen route/velden en zet niets zelf weg; de actie wordt een voorstel dat de gebruiker bevestigt. | `lib/features/assistant/data/assistant_router.dart:1-83`; `lib/features/assistant/data/assistant_extractor.dart:1-5` |
| Beheerde AI loopt in cloudmodus via de Supabase `ai-proxy`; eigen API-sleutels worden niet ondersteund. | `lib/core/ai/ai_providers.dart:1-7,61-82` |
| De AI-proxy stuurt de aanvraag naar OpenRouter en logt alleen huishouden, gebruiker, functielabel, model, tokenaantallen, status en kosteninschatting — niet de promptinhoud. | `supabase/functions/ai-proxy/index.ts:193-241,303-380`; `supabase/migrations/0011_ai_usage_logs.sql:14-40` |
| Een receptfoto gebruikt titel, omschrijving en ingrediënten; de functie is Plus-only, expliciet door de gebruiker te starten, heeft één cover per recept en een daglimiet per huishouden. | `supabase/functions/ai-image/index.ts:1-45,129-158,190-322`; `supabase/functions/ai-image/logic.ts:5-12` |
| De bestaande technische documentatie vermeldt OpenRouter als verwerking in de VS, met de noodzaak om doorgifte-waarborg en verwerkersovereenkomst vast te leggen. | `docs/architecture/integraties-en-privacy.md:39-50,52-61` |

## Juridische controle buiten de repository

- De opsomming van AVG-rechten, de mogelijkheid om bij de Autoriteit
  Persoonsgegevens te klagen en de voorgestelde verwerking van verzoeken zijn
  gecontroleerd tegen de officiële pagina van de [Autoriteit Persoonsgegevens
  over privacyrechten in de praktijk](https://autoriteitpersoonsgegevens.nl/themas/basis-avg/privacyrechten-avg/voor-organisaties-privacyrechten-in-de-praktijk).
- De opmerking dat een klacht bij de AP mogelijk is, is gecontroleerd tegen
  [Een tip of klacht indienen bij de AP](https://autoriteitpersoonsgegevens.nl/een-tip-of-klacht-indienen-bij-de-ap).

## Alle eigenaarpunten vóór publicatie

1. Bevestig versie, ingangsdatum, KvK-nummer, vestigingsadres en eventuele FG.
2. Bevestig dat `privacy@tendlo.app` het privacycontact is, inclusief het
   verzoekkanaal, identiteitscontrole, reactietermijn en escalatie.
3. Leg een retentiebeleid vast voor accounts, uitnodigingen, huishoudinhoud,
   bijlagen, verwijderde records, back-ups, analytics, foutmeldingen,
   AI-metering en abonnementen.
4. Leg voor gezondheidsgegevens de AVG-grondslag én de uitzondering van artikel
   9 AVG vast.
5. Bevestig voor Resend, OpenRouter, RevenueCat, Sentry en Open-Meteo de actuele
   verwerkingslocatie, gegevens, verwerkersovereenkomst en eventuele
   doorgiftewaarborgen. Bevestig voor OpenRouter ook subverwerkers en of
   providergebruik voor modeltraining is uitgesloten.
6. Verifieer welke analytics- en foutmeldingsintegraties in productie aan staan.
7. Rond TEN-282 af en bepaal de selfservice-ingang, de bevoegdheid binnen een
   huishouden, scope voor andere leden/gedeelde gegevens, back-upafhandeling en
   doorlooptijd voor accountverwijdering.
8. Bevestig minimumleeftijd, ouderlijke toestemming en regels voor
   kinderprofielen.
9. Leg de definitieve Plus-productnamen, prijzen, proefaanbiedingen,
   verlenging, herroeping, restitutie en Apple-link voor abonnementsbeheer vast.
10. Maak de actuele AI fair-usegrenzen en de route voor betwisting van een
    blokkade zichtbaar voor de gebruiker.
11. Laat de aansprakelijkheidsregeling, eventuele maximumbedragen, beëindiging,
    export bij beëindiging en de termijn/kanaal voor vooraankondiging van
    voorwaardenwijzigingen juridisch vaststellen.
