Implementatie Status

Laatste update: 18 december 2025

Database Setup - βœ… VOLTOOID

  • βœ… Tabel licence_regio aangemaakt (13 regio's)
  • βœ… Tabel licence_products aangemaakt (6 sample producten)
  • βœ… Tabel orders uitgebreid (6 nieuwe kolommen)
  • βœ… View vw_active_licences aangemaakt
  • βœ… 3 Stored procedures aangemaakt
  • βœ… Test queries beschikbaar

Scripts: /NED/database/licence_system_setup.sql
/NED/database/licence_system_test_queries.sql

Volgende Stappen

  • ⏳ Product catalogus beheer pagina
  • ⏳ Registreren/bestellen flow aanpassen
  • ⏳ Rechten controle in zoekpagina's
  • ⏳ Account dashboard (mijn licenties)
  • ⏳ Download limiet implementatie

GeΓ―mplementeerde Database Structuur

Status: βœ… Volledig geΓ―mplementeerd op 18 december 2025

Aanpak: Vereenvoudigd systeem met hergebruik van bestaande orders tabel

1. licence_regio (NIEUW)

CREATE TABLE [dbo].[licence_regio]( [regioID] INT IDENTITY(1,1) PRIMARY KEY, [regio_code] VARCHAR(20) UNIQUE NOT NULL, [regioNL] NVARCHAR(100) NOT NULL, [regioFR] NVARCHAR(100) NOT NULL, [regioEN] NVARCHAR(100) NULL, [website] VARCHAR(100) NOT NULL DEFAULT 'syndi.be', [active] BIT NOT NULL DEFAULT 1, [sort_order] INT NOT NULL DEFAULT 0, [created_date] DATETIME NOT NULL DEFAULT GETDATE(), [modified_date] DATETIME NOT NULL DEFAULT GETDATE() )

Sample Data (13 regio's):

  • BE - BelgiΓ« / Belgique
  • ANT - Antwerpen / Anvers
  • LIM - Limburg / Limbourg
  • OVL - Oost-Vlaanderen / Flandre-Orientale
  • WVL - West-Vlaanderen / Flandre-Occidentale
  • VBR - Vlaams-Brabant / Brabant flamand
  • LUI - Luik / LiΓ¨ge
  • LUX - Luxemburg / Luxembourg
  • NAM - Namen / Namur
  • HEN - Henegouwen / Hainaut
  • WBR - Waals-Brabant / Brabant wallon
  • BHG - Brussels Hoofdstedelijk Gewest
  • NL - Nederland (inactive - toekomst)

2. licence_products (NIEUW)

CREATE TABLE [dbo].[licence_products]( [listID] INT IDENTITY(1,1) PRIMARY KEY, [product_code] VARCHAR(50) UNIQUE NOT NULL, [licence_type] VARCHAR(20) NOT NULL, -- 'master', 'executive', 'excel' [regioID] INT NULL, -- FK, NULL = all regions [duration_months] INT NOT NULL, [titelNL] NVARCHAR(200) NOT NULL, [titelFR] NVARCHAR(200) NOT NULL, [beschrijvingNL] NVARCHAR(MAX) NULL, [beschrijvingFR] NVARCHAR(MAX) NULL, [price_excl_btw] MONEY NOT NULL, [promo_price_excl_btw] MONEY NULL, [max_downloads] INT NULL, -- NULL = unlimited [active] BIT NOT NULL DEFAULT 1, [visible] BIT NOT NULL DEFAULT 1, [created_date] DATETIME NOT NULL DEFAULT GETDATE(), [modified_date] DATETIME NOT NULL DEFAULT GETDATE(), CONSTRAINT [FK_licence_products_regio] FOREIGN KEY ([regioID]) REFERENCES [dbo].[licence_regio]([regioID]) )

Sample Products (6 producten):

  • MASTER-BE-12 - Master BelgiΓ« 1 jaar (€1299)
  • MASTER-BE-24 - Master BelgiΓ« 2 jaar (€2468, promo €2340)
  • MASTER-ANT-12 - Master Antwerpen 1 jaar (€499)
  • EXEC-LUI-12 - Executive Luik 1 jaar (€299)
  • EXCEL-BE-12 - Excel Downloads BelgiΓ« 1 jaar (€399, max 100 downloads)
  • EXCEL-BE-24 - Excel Downloads BelgiΓ« 2 jaar (€699, unlimited)

3. orders (BESTAAND - UITGEBREID)

-- Nieuwe kolommen toegevoegd aan bestaande orders tabel: ALTER TABLE [dbo].[orders] ADD [listID] INT NULL ALTER TABLE [dbo].[orders] ADD [regioID] INT NULL ALTER TABLE [dbo].[orders] ADD [duration_months] INT NULL ALTER TABLE [dbo].[orders] ADD [start_date] DATE NULL ALTER TABLE [dbo].[orders] ADD [download_count] INT NOT NULL DEFAULT 0 ALTER TABLE [dbo].[orders] ADD [max_downloads] INT NULL -- Foreign keys: CONSTRAINT [FK_orders_licence_products] FOREIGN KEY ([listID]) CONSTRAINT [FK_orders_licence_regio] FOREIGN KEY ([regioID])

Bestaande velden hergebruikt:

  • orderID - Primary key
  • clientID - Link naar klant
  • invoiceID - NULL = onbetaald, NOT NULL = betaald
  • subscription - Licentie type ('master', 'executive', 'excel')
  • expirationdate - Einddatum (berekend: start_date + duration_months)
  • VATpct - BTW percentage (0 of 21)
  • payment - Betaalstatus ('openstaand', 'mollie', 'factuur')
  • total - Totaalbedrag incl BTW

4. Hulpmiddelen

View: vw_active_licences

Overzicht van alle actieve licenties met status berekening.

Stored Procedures:

  • sp_check_licence_access - Controleer of klant toegang heeft tot regio
  • sp_get_client_licences - Haal alle licenties van klant op
  • sp_increment_download - Verhoog download teller met limiet check

Belangrijke Beslissingen

Waarom Vereenvoudigd?

  • βœ… Backwards Compatible: Bestaande orders en factuur systeem blijven werken
  • βœ… Geen Data Migratie: Oude orders blijven in dezelfde tabel
  • βœ… Klein Project: ~100 orders/jaar, geen overkill nodig
  • βœ… Simpel Onderhoud: Slechts 2 nieuwe tabellen + 6 kolommen

Actieve Licentie Logica

-- Een licentie is actief als: WHERE invoiceID IS NOT NULL -- Betaald AND expirationdate >= GETDATE() -- Niet verlopen AND listID IS NOT NULL -- Nieuwe licentie order -- Bij dubbele licenties: neem langst geldende ORDER BY expirationdate DESC

Implementatie Notities (18 december 2025)

Belangrijke Implementatie Details

Database: kbo (SQL Server)

Scripts uitgevoerd: licence_system_setup.sql

Status: Volledig operationeel en getest

Aanpassingen aan bestaande orders tabel:
  • listID INT NULL - Link naar product catalogus (licence_products)
  • regioID INT NULL - Link naar regio (licence_regio)
  • duration_months INT NULL - Looptijd in maanden (12, 24, 36, 60)
  • start_date DATE NULL - Startdatum licentie (standaard = orderdate)
  • download_count INT DEFAULT 0 - Teller voor Excel downloads
  • max_downloads INT NULL - Limiet downloads (NULL = unlimited)

Waarom NULL values? Oude orders (voor licentiesysteem) hebben deze velden niet. Dit maakt het backwards compatible.

Bestaande velden hergebruikt:
  • subscription VARCHAR(50) - Nu gebruikt voor licence_type ('master', 'executive', 'excel')
  • invoiceID INT - NULL = onbetaald, NOT NULL = betaald en actief
  • expirationdate DATETIME - Berekend als start_date + duration_months
  • VATpct INT - Altijd 0 of 21 (B2B bepaald bij order aanmaken)
  • payment VARCHAR(50) - 'openstaand', 'mollie', 'factuur', 'bank'

Quick Reference: Veel Gebruikte Queries

1. Check of klant toegang heeft tot regio

-- Via stored procedure (aanbevolen) EXEC sp_check_licence_access @clientID = 123, @regioID = 2; -- ANT -- Direct query SELECT TOP 1 1 FROM orders WHERE clientID = @clientID AND regioID = @regioID AND subscription IN ('master', 'executive') AND invoiceID IS NOT NULL AND expirationdate >= GETDATE() ORDER BY expirationdate DESC;

2. Alle actieve licenties van klant ophalen

-- Via stored procedure EXEC sp_get_client_licences @clientID = 123; -- Via view SELECT * FROM vw_active_licences WHERE clientID = 123 AND status = 'active' ORDER BY end_date DESC;

3. Download limiet checken en verhogen

DECLARE @errorMsg NVARCHAR(500); EXEC sp_increment_download @orderID = 456, @errorMessage = @errorMsg OUTPUT; IF @errorMsg IS NOT NULL PRINT 'Error: ' + @errorMsg; ELSE PRINT 'Download toegestaan';

4. Nieuwe order aanmaken (PHPvoorbeeld)

// Product ophalen uit catalogus $sql = "SELECT * FROM licence_products WHERE product_code = ?"; $stmt = sqlsrv_query($conn, $sql, ['MASTER-ANT-12']); $product = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); // Datums berekenen $startDate = date('Y-m-d'); $durationMonths = $product['duration_months']; $endDate = date('Y-m-d', strtotime("+{$durationMonths} months")); // BTW bepalen (0 voor buitenland, 21 voor BelgiΓ«) $vatPct = validateKBO($vatNumber) ? 21 : 0; $total = $product['price_excl_btw'] * (1 + $vatPct/100); // Order insert $sql = "INSERT INTO orders ( userID, clientID, listID, regioID, subscription, duration_months, start_date, expirationdate, orderdate, VATpct, total, product, payment, max_downloads, quantiy, credits ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, GETDATE(), ?, ?, ?, 'openstaand', ?, 1, 0)"; $params = [ $userID, // ID van de gebruiker die bestelt $clientID, $product['listID'], $product['regioID'], $product['licence_type'], $durationMonths, $startDate, $endDate, $vatPct, $total, $product['titelNL'], $product['max_downloads'] ]; sqlsrv_query($conn, $sql, $params);

Productbeheer

Nieuw product toevoegen

INSERT INTO licence_products ( product_code, licence_type, regioID, duration_months, titelNL, titelFR, beschrijvingNL, beschrijvingFR, price_excl_btw, promo_price_excl_btw, max_downloads ) VALUES ( 'MASTER-OVL-12', -- Unieke code 'master', -- Type 4, -- Oost-Vlaanderen (uit licence_regio) 12, -- 1 jaar 'Master Oost-Vlaanderen 1 jaar', 'Master Flandre-Orientale 1 an', 'Volledige toegang tot alle VME''s...', 'Accès complet à toutes les ACP...', 499.00, -- Prijs excl BTW NULL, -- Geen promo NULL -- Unlimited downloads );

Prijs aanpassen

UPDATE licence_products SET price_excl_btw = 549.00, promo_price_excl_btw = 499.00, modified_date = GETDATE() WHERE product_code = 'MASTER-ANT-12';

Product deactiveren (niet verwijderen!)

UPDATE licence_products SET active = 0, visible = 0 WHERE product_code = 'OLD-PRODUCT-12';

Troubleshooting & Veelgestelde Vragen

Q: Oude orders werken niet meer?

A: Oude orders (van voor licentiesysteem) hebben listID = NULL. Check altijd:

WHERE (listID IS NOT NULL OR subscription IS NOT NULL)

Q: Klant heeft dubbele licentie voor zelfde regio?

A: Neem altijd de langst geldende met ORDER BY expirationdate DESC. De stored procedures doen dit automatisch.

Q: Download limiet werkt niet?

A: Check of max_downloads is opgeslagen bij order aanmaken (snapshot van product). NULL = unlimited.

Q: BTW berekening klopt niet?

A: BTW wordt bepaald bij order aanmaken (niet bij betaling). Buitenlandse B2B = 0%, Belgische B2B = 21%. Check KBO validatie.

Q: Hoe verlengen van licentie?

A: Maak nieuwe order aan met start_date = oude expirationdate. Beide orders blijven in tabel, langste geldt.

Q: Kan ik products verwijderen?

A: NEE! Nooit verwijderen (bestaande orders verwijzen ernaar). Gebruik active=0 en visible=0 i.p.v. DELETE.

Testing Checklist

Voor Go-Live:

  • ☐ Test order aanmaken voor elk product type
  • ☐ Test betaling verwerking (invoiceID update)
  • ☐ Test toegangscontrole per regio
  • ☐ Test download limiet (met en zonder limiet)
  • ☐ Test verlopen licentie (expirationdate in verleden)
  • ☐ Test dubbele licenties (meerdere voor zelfde regio)
  • ☐ Test BTW berekening (0% en 21%)
  • ☐ Test meertaligheid (NL/FR product titels)
  • ☐ Test oude orders compatibiliteit (listID = NULL)
  • ☐ Performance test (1000+ orders query < 100ms)

Migratie Pad (Toekomst)

Voor bestaande klanten met oude subscription veld:

-- Optioneel: Converteer oude orders naar nieuw systeem -- Alleen uitvoeren als je oude data wilt migreren! UPDATE orders SET listID = ( SELECT TOP 1 listID FROM licence_products WHERE licence_type = orders.subscription AND duration_months = 12 ), regioID = (SELECT regioID FROM licence_regio WHERE regio_code = 'BE'), duration_months = 12, start_date = orderdate, download_count = 0 WHERE listID IS NULL AND subscription IN ('master', 'executive') AND invoiceID IS NOT NULL;

Waarschuwing: Test dit eerst op development database!

Performance Optimalisatie

-- Indices voor snelle queries (nog toe te voegen indien nodig) CREATE NONCLUSTERED INDEX IX_orders_active_licences ON orders (clientID, invoiceID, expirationdate, listID) INCLUDE (subscription, regioID); CREATE NONCLUSTERED INDEX IX_orders_region_lookup ON orders (regioID, subscription, expirationdate) WHERE invoiceID IS NOT NULL AND listID IS NOT NULL; CREATE NONCLUSTERED INDEX IX_products_active ON licence_products (active, visible, licence_type) INCLUDE (product_code, titelNL, price_excl_btw);

1. Conceptueel Model

Van Single Subscription β†’ Multi-License Portfolio

Huidig: Klant = 1 Abonnement (Basic/Pro/Master/Executive) voor heel BelgiΓ« of 1 regio

Nieuw: Klant = Portfolio van Licenties met verschillende types, regio's en looptijden

Het nieuwe systeem biedt volledige flexibiliteit: een klant kan tegelijkertijd een Master licentie voor Antwerpen hebben met einddatum 15/03/2026, een Executive licentie voor Luik met einddatum 01/09/2025, en een Excel Download licentie voor heel BelgiΓ« met weer een andere einddatum.

2. Database Structuur Voorstel

A. Hoofdtabellen

clients (bestaande members tabel - aangepast)

  • Blijft de hoofdtabel voor bedrijfsgegevens
  • Verwijder velden: subscription, expirationdate, beperking
  • Behoud: company, contactgegevens, login credentials, clientID

licenses (NIEUW - kern van het systeem)

Velden:
- licenseID (Primary key)
- clientID (Link naar klant)
- license_type ('master', 'executive', 'excel_download')
- scope ('provincie_name', 'belgium', 'multi_province')
- province (Specifieke provincie of NULL voor BelgiΓ«-breed)
- start_date (Startdatum licentie)
- end_date (Einddatum licentie)
- duration_years (1, 2, 3 jaar)
- status ('active', 'expired', 'cancelled')
- auto_renew (Boolean)
- purchase_date (Aankoopdatum)
- price_paid (Bedrag betaald)
- discount_percentage (Korting toegepast bij meerjarig)

license_permissions (NIEUW - rechten per licentie)

Velden:
- licenseID (Link naar licentie)
- can_search_vme (Boolean)
- can_search_syndicus (Boolean)
- can_export_excel (Boolean)
- can_download_updates (Boolean - voor Excel licenties)
- max_exports_per_month (Integer of NULL)
- max_search_results (Integer of NULL)

license_purchases (NIEUW - aankoophistoriek)

Velden:
- purchaseID (Primary key)
- clientID (Klant)
- licenseID (Aangemaakte licentie)
- purchase_date (Datum)
- amount_paid (Bedrag)
- payment_method ('mollie', 'invoice', 'bank')
- invoice_number (Factuurnummer)
- transaction_id (Externe betalings-ID)

3. Product Configuratie

Licentie Types

A. MASTER Licentie

  • Per provincie beschikbaar
  • Toegang tot alle VME's en Syndici in die provincie
  • Onbeperkt zoeken en exporteren
  • Kan Excel downloads bevatten (optioneel)

B. EXECUTIVE Licentie

  • Per provincie beschikbaar
  • Beperktere rechten dan Master
  • Mogelijk met exportlimiet per maand
  • Basis zoekfunctionaliteit

C. EXCEL DOWNLOAD Licentie

  • Losse licentie voor Excel downloads
  • Kan gekoppeld zijn aan provincie of heel BelgiΓ«
  • Tijdens looptijd altijd laatste versie downloaden
  • Geen zoekfunctie, enkel download rechten

Looptijd & Kortingen

Standaard: 1 jaar

Basisprijs per licentie type

Meerjarig met korting:

  • 2 jaar: 5% korting
  • 3 jaar: 10% korting
  • 5 jaar: 15% korting

Combinatie kortingen:

  • 3+ licenties tegelijk: extra 5%
  • Bestaande klant uitbreiding: 5% loyaliteitskorting

4. Gebruikers Interface Flow

A. Account Dashboard - "Mijn Licenties"

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ ACTIEVE LICENTIES β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β–‘ Master - Provincie Antwerpen β”‚ β”‚ Geldig t/m: 15/03/2026 β”‚ β”‚ [Verlengen] [Details] β”‚ β”‚ β”‚ β”‚ β–‘ Executive - Provincie Luik β”‚ β”‚ Geldig t/m: 01/09/2025 β”‚ β”‚ [Verlengen] [Details] β”‚ β”‚ β”‚ β”‚ β–‘ Excel Downloads - BelgiΓ« β”‚ β”‚ Geldig t/m: 31/12/2025 β”‚ β”‚ [Download Laatste Versie] β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ [+ Nieuwe Licentie Toevoegen] β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

B. Nieuwe Licentie Aanschaffen

  1. Stap 1: Kies Type
    • Master Provincie
    • Executive Provincie
    • Excel Downloads
    • Pakket (combinatie met extra korting)
  2. Stap 2: Selecteer Scope
    • Voor Master/Executive: kies provincie(s)
    • Voor Excel: kies provincie of heel BelgiΓ«
  3. Stap 3: Kies Looptijd
    • 1 jaar (basisprijs)
    • 2 jaar (5% korting)
    • 3 jaar (10% korting)
    • 5 jaar (15% korting)
  4. Stap 4: Overzicht & Betaling
    • Toon totaalprijs met kortingen
    • Toon alle actieve + nieuwe licenties in overzicht
    • Betalingsopties: Online / Factuur

5. Business Logica

A. Licentie Activatie

Bij zoeken/exporteren:

  1. Check of klant ingelogd is
  2. Haal ALLE actieve licenties op (WHERE status='active' AND end_date >= TODAY)
  3. Voor huidige actie: check welke licenties van toepassing zijn
  4. Voor VME zoeken in Antwerpen: check of actieve Master/Executive licentie voor Antwerpen bestaat
  5. Voor Excel download: check of Excel licentie actief is voor die regio

Gecombineerde rechten:

  • Als klant Master Antwerpen + Master Limburg heeft: beide provincies toegankelijk
  • Als klant Executive Luik + Excel BelgiΓ« heeft: kan in Luik zoeken EN overal Excel downloaden

B. Verlopen Licenties

Automatisch:

  • Dagelijkse cronjob checkt expiring licenties
  • 30 dagen voor expiratie: eerste herinnering mail
  • 14 dagen voor: tweede herinnering
  • 7 dagen voor: laatste herinnering
  • Op expiratiedatum: status β†’ 'expired', mail met verlengingslink

Manueel verlengen:

  • Klant kan zelf verlengen vanuit dashboard
  • Kies nieuwe looptijd (1-5 jaar)
  • Als binnen 30 dagen na expiratie: naadloze voortzetting
  • Als later: nieuwe startdatum = vandaag

C. Excel Download Licentie

Werking:

  • Licentie geeft toegang tot download functie
  • Elke keer dat klant inlogt: check of nieuwe versie beschikbaar
  • "Download Laatste Versie" knop altijd zichtbaar bij actieve licentie
  • Tracking: log elke download (datum, versie, provincie)
  • Bij verlenging: direct toegang tot meest recente versie

6. Migratie Strategie (Bestaande Klanten)

Optie A: Automatische Conversie

  • Bestaande subscription β†’ nieuwe licentie
  • Basic/Pro/Master/Executive BelgiΓ« β†’ Master BelgiΓ« licentie
  • Executive Provincie X β†’ Executive Provincie X licentie
  • Behoud huidige expirationdate
  • Email naar klanten: "Uw account is geΓΌpgraded naar ons nieuwe systeem"

Optie B: Geleidelijke Migratie

  • Bestaande klanten blijven op oud systeem tot verlenging
  • Bij verlenging: automatisch naar nieuw systeem
  • Voordeel: zachte overgang
  • Nadeel: dubbele logica onderhouden (tijdelijk)

Aanbeveling: Optie A met grandfathering

  • Direct migreren naar nieuw systeem
  • Bestaande klanten behouden huidige prijs voor eerste verlenging
  • Volledige flexibiliteit om extra licenties toe te voegen

7. Pricing Tabel Voorbeeld

Licentie Type Scope 1 jaar 2 jaar 3 jaar
Master Per provincie €499 €949 (5%) €1.347 (10%)
Master BelgiΓ« €1.299 €2.468 (5%) €3.507 (10%)
Executive Per provincie €299 €568 (5%) €807 (10%)
Executive BelgiΓ« €899 €1.708 (5%) €2.427 (10%)
Excel Download Per provincie €149 €283 (5%) €402 (10%)
Excel Download BelgiΓ« €399 €758 (5%) €1.077 (10%)

Pakket Deals

  • 3 provincies Master: prijs van 2,5 provincies
  • Master + Excel combo: 15% korting op Excel
  • Heel BelgiΓ« vs 10 provincies: BelgiΓ« = prijs van 6 provincies

8. Voordelen van dit Systeem

Voor Klanten

  • βœ“ Flexibiliteit: Koop alleen wat je nodig hebt
  • βœ“ Schaalbaar: Start klein, groei mee
  • βœ“ KostenefficiΓ«nt: Betaal niet voor ongebruikte regio's
  • βœ“ Meerjarig voordeel: Kortingen bij langere commitment
  • βœ“ Altijd actueel: Excel downloads altijd laatste versie

Voor Syndi.be

  • βœ“ Hogere omzet: Cross-sell en up-sell mogelijkheden
  • βœ“ Langere klantbinding: Meerjarige contracten
  • βœ“ Betere tracking: Precies weten welke licenties actief zijn
  • βœ“ Makkelijker facturatie: Per licentie factureren
  • βœ“ Data insights: Welke provincies/types zijn populair

9. Implementatie Fases

Fase 1: Database & Backend (2-3 weken)

Nieuwe tabellen aanmaken β€’ Migratiescript voor bestaande klanten β€’ Licentie check functionaliteit bouwen β€’ Test met dummy data

Fase 2: Account Dashboard (1-2 weken)

Licentie overzicht pagina β€’ Details per licentie β€’ Verleng functionaliteit β€’ Excel download integratie

Fase 3: Aankoop Flow (2 weken)

Nieuwe licentie wizard β€’ Pakket configurator β€’ Prijsberekening met kortingen β€’ Payment integratie (Mollie)

Fase 4: Zoek & Export Logica (1 week)

Licentie check in VME zoeken β€’ Licentie check in Syndicus zoeken β€’ Excel export rechten check β€’ Error messages bij ontbrekende licentie

Fase 5: Admin Tools (1 week)

Licentie beheer voor admins β€’ Handmatige licentie aanmaken/aanpassen β€’ Rapportage & statistieken β€’ Bulk acties

Fase 6: Testing & Launch (1 week)

User acceptance testing β€’ Performance testing β€’ Email naar bestaande klanten β€’ Soft launch β†’ Full launch

Totale Doorlooptijd: 8-10 weken

10. Technische Overwegingen

Caching & Performance

  • Cache actieve licenties per user in session
  • Refresh bij login of na aankoop
  • Index op clientID, status, end_date

Rechten Check Pattern

function hasLicenseFor($clientID, $province, $licenseType) { // Check cache eerst // Query actieve licenties voor provincie // Return boolean }

Excel Versioning

  • Nieuwe tabel: excel_versions
  • Velden: version_id, province, upload_date, file_path, changelog
  • Bij download: check welke versie laatst gedownload
  • Toon "Nieuwe versie beschikbaar!" badge

API voor Toekomst

  • Later: externe API voor partners
  • Licentie verificatie endpoint
  • Download endpoint met rate limiting

Conclusie & Volgende Stappen

Dit systeem geeft maximale flexibiliteit voor klanten en groei potentieel voor Syndi.be.

Aanbevolen Aanpak:

  1. Start met database design en migratiescript
  2. Bouw eerst backend logica (licentie checks)
  3. Daarna frontend (dashboard, aankoop flow)
  4. Test intensief met kleine groep bestaande klanten
  5. Geleidelijke uitrol met grandfathering voor bestaande klanten

Volgende Acties:

  • Database schema's in detail uitwerken
  • Specificatie voor de aankoop wizard maken
  • Prototype van het dashboard opzetten
  • Migratiescript schrijven