Flexibele kluissoorten: soorten in de database, beheer op de website

- Tabellen vault_categories en vault_category_fields (db/21), startrijen handmatig (db/handmatig/21b)
- VaultCategoryService met regels voor zichtbaarheid, gebruik en eigen velden
- Beheer > Kluissoorten (/beheer/soorten) met gebruikstellers; soort in gebruik niet te verwijderen
- Kluis en Nalatenschap (web en app) tonen soorten en eigen velden uit de database
- Socketprotocol: vault.categories; GRANTs voor mijnbesluit_app in db/02
- db/20 herhaalbaar gemaakt
- App versie 1.1 (versiecode 3)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014MGLqt1uKfNARQHut9ifcx
This commit is contained in:
jf
2026-10-20 08:15:40 +00:00
co-authored by Claude Sonnet 5.5
parent a3a0bcfc05
commit af13d0e533
36 changed files with 2540 additions and 94 deletions
+76
View File
@@ -0,0 +1,76 @@
-- MijnBesluit - kluissoorten uit de database in plaats van uit de code
--
-- Tot nu toe stond de lijst "Wachtwoord, Polis, Uitvaartwens, ..." vast in de code, met per soort
-- een eigen invulscherm. Elke nieuwe soort (denk aan "Dementie" of "Niet reanimeren") vroeg dus
-- een nieuwe versie van de app in de Play Store en de App Store. Nu staan de soorten hier, en de
-- velden van een nieuwe soort ook: de beheerder onderhoudt ze op de website (/beheer/soorten) en
-- de app tekent het formulier naar wat de server beschrijft.
--
-- vault_categories de soorten. De elf ingebouwde en "Overig" (nummer 99) krijgen hier
-- hun startrij; nieuwe soorten beginnen bij nummer 100.
-- vault_category_fields de velden van een nieuwe soort. Ingebouwde soorten hebben hier geen
-- rijen: hun invulscherm zit nog in de app zelf.
--
-- Regels die de server afdwingt (niet de database):
-- * Een soort waar kluisitems mee zijn gemaakt kan niet worden verwijderd, alleen op niet-actief
-- gezet. Niet-actief verdwijnt uit de keuzelijst van wie er nog nooit een item mee maakte;
-- wie dat wel deed, blijft de soort zien.
-- * Nieuwe items kunnen alleen in een actieve soort, of in een soort waar de eigenaar al een
-- item van heeft.
--
-- vault_items.category blijft een gewoon getal; er komt bewust geen foreign key bij, zodat
-- bestaande gegevens en oudere apps niet in de weg zitten.
--
-- Draaien met:
-- mysql -u root -p mijnbesluit < db\21_kluissoorten.sql
--
-- Opnieuw draaien mag: er gebeurt dan niets.
--
-- Na dit script, eenmalig als root:
-- mysql -u root -p < db\02_applicatiegebruiker.sql (rechten op de nieuwe tabellen)
-- mysql -u root -p mijnbesluit < db\handmatig\21b_kluissoorten_startrijen.sql (de startrijen)
USE `mijnbesluit`;
-- ---------------------------------------------------------------- vault_categories
CREATE TABLE IF NOT EXISTS `vault_categories` (
`id` INT NOT NULL AUTO_INCREMENT,
`naam` VARCHAR(80) NOT NULL,
`uitleg` VARCHAR(500) NULL, -- verschijnt onder de keuzelijst in de app
`actief` TINYINT(1) NOT NULL DEFAULT 1,
`volgorde` INT NOT NULL DEFAULT 1000,
`bespreken_met` TINYINT(1) NOT NULL DEFAULT 0, -- mag de eigenaar een beheerder kiezen om vooraf mee te bespreken?
`ingebouwd` TINYINT(1) NOT NULL DEFAULT 0, -- 1 = invulscherm zit in de app; velden hier niet te wijzigen
`aangemaakt_op` DATETIME(3) NOT NULL,
`gewijzigd_op` DATETIME(3) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_vault_categories_naam` (`naam`)
) ENGINE=InnoDB AUTO_INCREMENT=100;
-- ---------------------------------------------------------------- vault_category_fields
CREATE TABLE IF NOT EXISTS `vault_category_fields` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`category_id` INT NOT NULL,
`sleutel` VARCHAR(40) NOT NULL, -- vaste naam in de versleutelde inhoud; wijzigt nooit
`label` VARCHAR(100) NOT NULL,
`soort` VARCHAR(10) NOT NULL DEFAULT 'tekst', -- tekst | lang | datum | keuze | uitleg
`opties` VARCHAR(1000) NULL, -- bij 'keuze': één optie per regel
`hulptekst` VARCHAR(300) NULL,
`verplicht` TINYINT(1) NOT NULL DEFAULT 0,
`actief` TINYINT(1) NOT NULL DEFAULT 1,
`volgorde` INT NOT NULL DEFAULT 1000,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_vault_category_fields_sleutel` (`category_id`, `sleutel`),
CONSTRAINT `fk_vcf_category` FOREIGN KEY (`category_id`) REFERENCES `vault_categories` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB;
-- ---------------------------------------------------------------- startrijen
-- De startrijen (de elf ingebouwde soorten en Overig) staan NIET hier maar in
-- handmatig\21b_kluissoorten_startrijen.sql.
--
-- Waarom: dit script wordt ook door de uitrolagent gedraaid, met een beperkt databaseaccount dat
-- tabellen mag maken maar er geen gegevens in mag zetten. Een INSERT hier laat de hele uitrol
-- struikelen (ERROR 1142: INSERT command denied). Gegevens neerzetten is inrichten, en dat doet een
-- mens één keer als root, net als de rechten in 02_applicatiegebruiker.sql.
SELECT 'Klaar. De tabellen voor kluissoorten staan klaar. Vergeet handmatig\\21b_kluissoorten_startrijen.sql en 02_applicatiegebruiker.sql niet (als root).' AS melding;