Ga naar inhoud
BankBird
🐦 Demo →
NL EN
← Terug naar overzicht
⚙️ Geavanceerde update

Technische release-notes

Een eerlijk kijkje onder de motorkap: wat is er gewijzigd in de codebase en wat betekent dat voor jouw BankBird-installatie. Alle wijzigingen worden automatisch meegenomen in de update — je hoeft niets handmatig te doen.

v2.1.1 📅 17 mei 2026 Vrijgegeven
1 fix — standaard Nederlandse merchants worden voortaan bij elke migrate gesynchroniseerd, ook zonder --seed flag
Bekijk wijzigingen

🏪 Standaard-merchants bij elke install Bug-fix

Seeder: MerchantSeeder::sync() Migratie: 2026_05_17_120100_seed_default_merchants

Bij verse installs waar de install-agent php artisan migrate draaide zonder --seed, ontbrak de Nederlandse standaard-merchantlijst (Albert Heijn, Jumbo, ING, Shell, Netflix, etc.) tot een handmatige db:seed stap. Vanaf v2.1.1 wordt deze lijst via een idempotente migratie automatisch bijgewerkt — zonder bestaande merchants aan te raken (firstOrCreate op normalized_name).

✅ Bekend bij ons en al opgelost. php artisan migrate na de update voegt ontbrekende standaard-merchants toe. Je eigen, handmatig aangemaakte merchants blijven onaangeraakt.
v2.1.0 📅 17 mei 2026 Vrijgegeven
6 wijzigingen — handmatig merchants + logo-upload, uitgebreide categorie-bibliotheek, transactie-detailpagina, compactere global search, plus-knop-fix in importflow, idempotente categorie-sync
Bekijk wijzigingen

🏪 Handmatig merchants toevoegen + logo-upload Nieuwe functie

Page: CreateMerchant Storage: public/merchants

Tot nu toe ontstonden merchants alleen automatisch tijdens een import. Vanaf v2.1 is er een aparte /merchants/create pagina waar je zelf een merchant kunt invoeren en een logo kunt koppelen via URL óf upload (max 2 MB, PNG/JPG/SVG). Een upload wordt opgeslagen op de public-disk in storage/app/public/merchants en heeft voorrang op een handmatig ingevulde URL.

Het logo-pad wordt door MerchantResource::resolveLogoSource() als relatieve storage/-URL opgeslagen. De bestaande logoUrl-accessor op het Merchant-model resolveert dat automatisch naar een absolute URL voor de ImageColumn in tabellen en de globale zoekresultaten.

✅ Bekend bij ons en al opgelost. De update voert php artisan storage:link niet automatisch uit — als je dat nog niet ooit gedaan hebt op je install, doe het één keer na de update zodat de geüploade logo's via /storage/... bereikbaar zijn.

🏷️ Uitgebreidere categorie-bibliotheek Nieuwe functie

Seeder: CategorySeeder::sync() Migratie: 2026_05_17_120000_seed_extra_default_categories

De standaard-set is uitgebreid van 11 naar 35 categorieën: 20 top-level (waaronder Sport & Fitness, Vakantie, Cadeaus & Donaties, Onderwijs, Kinderen, Belastingen, Bankkosten, Verzekeringen, Zakelijk) en 15 sub-categorieën onder Boodschappen, Restaurant/Eten, Transport, Wonen, Abonnementen en Inkomen. De iconen-dropdown ging van 14 naar ~45 heroicons, gegroepeerd per thema en doorzoekbaar.

Voor bestaande installs is er een eenmalige migratie die CategorySeeder::sync() aanroept. sync() gebruikt firstOrCreate op (name, parent_id) — bestaande categorieën blijven dus onaangeraakt, alleen ontbrekende defaults worden toegevoegd. Zo blijft één bron van waarheid bestaan voor zowel verse installs als migraties op lopende installs.

✅ Bekend bij ons en al opgelost. php artisan migrate na de update voegt de nieuwe categorieën toe. Je bestaande categorieën worden niet aangeraakt — als je een categorie met dezelfde naam al had, blijft de oude versie met jouw kleur en icoon staan.

👁️ Transactie-detailpagina Nieuwe functie

Page: ViewTransaction URL: /transactions/{id}

De transactie-resource had alleen een index- en edit-page. Vanaf v2.1 is er een dedicated view-page met een Filament infolist die datum, bedrag, omschrijving, originele bankregel, rekening, tegenrekening, merchant en categorie netjes weergeeft. Bewerken blijft beschikbaar via de prominente "Bewerken"-knop bovenaan.

De tabel op /transactions heeft een recordUrl die naar deze view-page wijst — klikken op een rij opent dus de detailpagina in plaats van direct het bewerkscherm. Filament's getGlobalSearchResultUrl() kiest automatisch de view-page als die bestaat, dus klikken op een zoekresultaat in de globale zoekbalk landt ook op de view-page.

✅ Bekend bij ons en al opgelost. Komt automatisch mee in de update. Een hard refresh (Ctrl+F5) helpt bij verouderde browser-cache, verder geen actie nodig.

🔍 Compactere globale zoekfunctie UX-verbetering

Concern: WithCompactGlobalSearch Limit: 5 per resource

De globale zoekbalk dumpte tot nu toe alle matches in één lange lijst. Dat werd onleesbaar zodra een zoekterm honderden transacties raakte. Vanaf v2.1 toont de dropdown maximaal 5 resultaten per resource met een extra "Alle X resultaten bekijken"-entry onderaan die naar de lijstpagina linkt met de query al ingevuld via ?search=....

Implementatie zit in een herbruikbare trait App\Filament\Concerns\WithCompactGlobalSearch die de standaard getGlobalSearchResults() overschrijft. Resources implementeren globalSearchSeeMoreUrl(string $search): string om hun eigen index-route te leveren. Toegepast op Transaction- en MerchantResource.

✅ Bekend bij ons en al opgelost. Geen actie nodig — de nieuwe zoek-flow werkt direct na de update.

➕ Plus-knop in importflow Bug-fix

Page: CreateImport Action: createAccountAction()

De geanalyseerde-bestanden tabel op /imports/create riep mountAction('createAccount') aan zonder dat de Livewire-page een bijbehorende createAccountAction()-methode had. Resultaat: klik op de plus-knop deed niets — geen modal, geen feedback. Opgelost door de actie alsnog te definiëren; aangemaakte rekening wordt direct geselecteerd voor het corresponderende analyzed bestand.

✅ Bekend bij ons en al opgelost. Komt automatisch mee in de update.

🌱 Idempotente categorie-sync via migratie Bug-fix

Patroon: firstOrCreate op (name, parent_id) Single source of truth

Tot nu toe konden nieuwe default-categorieën alleen via php artisan db:seed in bestaande installs landen — en seeders draaien niet automatisch tijdens een update. Vanaf v2.1 is de seeder-logica geëxtraheerd naar een statische CategorySeeder::sync()-methode die zowel vanuit de seeder als vanuit een migratie wordt aangeroepen.

Resultaat: het CHANGELOG en de seeder hoeven niet langer gesynchroniseerd te worden bij elke nieuwe default-categorie. Toekomstige uitbreidingen werken vanzelf voor zowel verse installs (via db:seed) als lopende installs (via een data-migratie die sync() aanroept).

✅ Bekend bij ons en al opgelost. Geen actie nodig — de nieuwe categorieën verschijnen automatisch na php artisan migrate.
v2.0.0 📅 10 mei 2026 Vrijgegeven
7 wijzigingen — SNS & Knab PDF-import, vriendelijke 403/404, top-navigation, admin-paneel op root, Vite-beveiligingsupgrade, idempotente demo-seeder, demo-login fix
Bekijk wijzigingen

📄 SNS & Knab PDF-import Nieuwe functie

Service: PdfImportService Auto-detectie van bank

Naast de bestaande ING-parser zijn er nu volwaardige parsers voor SNS- en Knab-bankafschriften. Bij een upload wordt automatisch herkend van welke bank de PDF afkomstig is op basis van keywords in de tekst — geen instelling vereist.

Knab-detail: de PDF-tekst-extractor verliest de Af/Bij-kolompositie. Debet vs. credit wordt afgeleid uit het keyword Ontvangen in de omschrijving — werkt op alle geteste afschriften.

✅ Bekend bij ons en al opgelost. Bij nieuwe installs is dit standaard meegeleverd. Bestaande installs krijgen het automatisch via de update — je hoeft niets te doen, na het binnenhalen werkt SNS- en Knab-upload meteen.

🎨 Vriendelijke 403 & 404 foutpagina's UX-verbetering

Views: resources/views/errors/

Laravel's standaard "Forbidden" en "Not Found"-pagina's zijn vervangen door BankBird-gestylde varianten met duidelijke uitleg en een terug-knop. Een rauwe error-pagina geeft de indruk dat het systeem kapot is, ook als de oorzaak gewone toegangsregels zijn — die verwarring is nu weg.

De 403 detecteert demo-modus en toont dan "Niet beschikbaar in demo" met dashboard-knop in plaats van een algemene foutmelding.

✅ Bekend bij ons en al opgelost. Niets te doen — alle bestaande installs krijgen de gestylde error-pagina's automatisch zodra de update binnen is.

🧭 Top navigation + page footer UX-verbetering

Filament v5 layout switch Volledige content-breedte

Het admin-paneel switcht van zijbalk-menu naar een top-navigatie met volledige content-breedte. De vorige sidebar-footer met versie-info is vervangen door een gecentreerde page-footer onderaan elke pagina. Versie-link gaat naar het publieke updates-overzicht in een nieuw tabblad.

✅ Bekend bij ons en al opgelost. Komt automatisch mee in de update. Een hard refresh (Ctrl+F5) kan handig zijn om verouderde browser-cache te legen, maar verder geen actie nodig.

🏠 Admin-paneel op root-URL UX-verbetering

Helper: App\Support\Demo::panelPath() Helper: App\Support\Demo::panelUrl(...)

Self-hosted installaties tonen het admin-paneel niet langer op /admin maar op de root-URL. Een verse installatie op bankbird.test opent dus direct het dashboard, niet bankbird.test/admin. De marketing-host (bankbird.app) houdt /admin om botsingen met de publieke landingspagina's te vermijden, en de combined-host blijft /dev en /demo gebruiken voor lokale ontwikkeling.

De keuze welke prefix actief is gebeurt centraal in Demo::panelPath() op basis van de host. Alle hardcoded url('/admin/...')-aanroepen in views zijn vervangen door een nieuwe Demo::panelUrl(string $path)-helper die per host het juiste pad samenstelt — admin-banner, sidebar-footer en 404-pagina werken daarmee automatisch op alle deployment-vormen.

✅ Bekend bij ons en al opgelost. Bestaande installaties op bankbird.test/admin verhuizen automatisch naar bankbird.test/ na de update. Oude bookmarks naar /admin/... blijven niet werken — vervang ze door de nieuwe URL of klik gewoon door vanaf de root.

🛡️ Vite 5 → 6 beveiligings-upgrade Beveiliging

Pakket: vite ^5.0 → ^6.0 Pakket: laravel-vite-plugin ^1.0 → ^1.2

Twee moderate npm audit-advisories opgelost: GHSA-4w7w-66w2-5vf9 (Vite path traversal in optimized deps .map handling) en GHSA-67mh-4wv8-2f99 (esbuild dev-server accepteert verzoeken van willekeurige origins). Beide adviezen raken uitsluitend de npm run dev-ontwikkelserver en zijn niet aanwezig in de productie-build.

Gekozen voor de minor-major bump van Vite 5 naar 6 in plaats van de automatische npm audit fix --force (die naar Vite 8 zou springen en ook laravel-vite-plugin naar 3.x zou bumpen). Tailwind v4 via @tailwindcss/vite@4.2.4 bleef ongemoeid en is compatibel met Vite 5/6/7/8. Geïnstalleerde versies: vite@6.4.2, laravel-vite-plugin@1.3.0. npm audit rapporteert nu 0 kwetsbaarheden.

Daarnaast is op /updates een nieuwe sectie "Geavanceerde updates" toegevoegd waar dependency- en beveiligings-advisories permanent worden gepubliceerd, met severity- en status-badges, lekentaal-uitleg en uitklapbare commando's voor ontwikkelaars.

✅ Bekend bij ons en al opgelost. Geen actie nodig op draaiende installs — de productie-build was nooit kwetsbaar. Bij toekomstige eigen builds maak één keer een npm install en npm run build na de update om de nieuwe versies binnen te halen.

🌱 Idempotente demo-seeder Bug-fix

Seeder: DemoSeeder Reproduceerbaarheid: mt_srand

De demo-seeder produceerde bij elke php artisan db:seed nieuwe willekeurige bedragen, wat leidde tot duplicate transacties en verschuivende saldi bij re-runs. Opgelost door mt_srand met een vaste seed te gebruiken voor reproduceerbare bedragen, en firstOrCreate op import_hash om dubbele inserts te voorkomen.

Resultaat: de demo-database is nu deterministisch — bij elke seed verschijnen exact dezelfde transacties met exact dezelfde bedragen, en re-runs zijn no-ops in plaats van duplicate-creators. Dit maakt het ook makkelijker om regressies in de demo-data te zien tijdens code-review.

✅ Bekend bij ons en al opgelost. Geen actie nodig — de fix is automatisch actief bij de volgende seed.

🔑 Demo-login 419-fix op gecombineerde host Bug-fix

Middleware: SwitchDatabaseForCombinedHost Symptoom: 419 Page Expired bij demo-login

Op de gecombineerde lokale host koos het Livewire-update-endpoint de verkeerde database voor demo-form-submits, waardoor de CSRF-token in de demo-database werd gevalideerd tegen de sessie van de productie-database — met een 419-mismatch als gevolg. Opgelost door een Referer-fallback toe te voegen in SwitchDatabaseForCombinedHost: als de host-header geen uitsluitsel geeft, wordt de demo-database gekozen op basis van de oorsprongs-URL van het verzoek.

✅ Bekend bij ons en al opgelost. Alleen relevant voor lokale combined-host setups. Productie-installaties op een dedicated host hadden hier geen last van.
← Terug naar updates