Skip to content

Architecture

This page documents the Zwerfkei system architecture in two stages: the current (legacy) situation and the target architecture. A full integration overview is included at the bottom.


Current Architecture

The current platform is built around Zwerfkei Old, a legacy monolithic application. It connects to Microsoft Dynamics Navision as the ERP and uses True Object Storage for file storage.

End of support

Microsoft Navision 2018 reaches end-of-support in 2026. Migration to the new architecture is required before that date.

C4Container
    title Current Architecture - Zwerfkei

    Person(employee, "Employee", "Internal user of Zwerfkei")
    Person(customer, "Customer", "External customer")

    System_Boundary(zwerfkei, "Zwerfkei Systems") {
        Container(old, "Zwerfkei Old", "Legacy application", "Central application for all business processes")
        Container(customerportal, "Zwerfkei Klant", "Customer portal", "Portal for customers")
        ContainerDb(olddb, "Zwerfkei Old Database", "MySQL", "Central database")
    }

    System_Ext(navision, "Microsoft Navision 2018", "ERP system (end-of-support 2026)")
    System_Ext(storage, "True Object Storage", "S3-compatible storage")

    Rel(employee, old, "Uses")
    Rel(customer, customerportal, "Uses")
    Rel(customer, old, "Uses (webshop)")

    Rel(old, olddb, "Reads/writes")
    Rel(old, navision, "Synchronises")
    Rel(old, storage, "File storage")

    Rel(customerportal, old, "API calls")
    Rel(customerportal, olddb, "Reads")

Notes

  • Zwerfkei Old is the central system communicating with all other components.
  • Zwerfkei Klant is a separate customer portal connecting to Zwerfkei Old and directly to the database.
  • Microsoft 365 (calendar integration) has already been phased out.

Target Architecture

The target architecture introduces a new Zwerfkei Backend, Zwerfkei Website and Zwerfkei CMS alongside the existing legacy systems. The legacy environment remains operational during the transition.

High-level flowchart of all systems, services and data flows in the target architecture.

graph TD
    subgraph Actors["Users & Actors"]
        Visitor["Website Visitor"]
        Employee["Employee"]
        ContentMgr["Content Manager"]
    end

    subgraph ZwerfkeiPlatform["Zwerfkei Platform"]
        Cloudflare["Cloudflare\nCDN & Security"]
        Website["Zwerfkei Website\nLaravel · Vue.js · TypeScript"]
        CMS["Zwerfkei CMS\nLaravel · Statamic"]
        Backend["Zwerfkei Backend\nLaravel"]
        BackendDB[("Backend Database\nMySQL")]
    end

    subgraph LegacySystems["Legacy Systems"]
        ZwerfkeiOld["Zwerfkei Old"]
        OldDB[("Zwerfkei Old Database\nMySQL")]
    end

    subgraph ExternalServices["External Services"]
        Navision["Microsoft Dynamics\nNavision ERP"]
        Ergonode["Ergonode PIM"]
        PostNL["PostNL\nShipment"]
        PayNL["PayNL\nPayments"]
        Kiyoh["Kiyoh\nReviews"]
        Copernica["Copernica\nEmail Marketing"]
        Storage["True Object Storage\nS3"]
    end

    subgraph AnalyticsTracking["Analytics & Tracking"]
        GTM["Google Tag Manager"]
        GA4["Google Analytics 4"]
    end

    Suppliers(["~17 Brand &\nSupplier Sources"])

    %% Actor flows
    Visitor --> Cloudflare
    Employee --> ZwerfkeiOld
    ContentMgr --> CMS

    %% Frontend flows
    Cloudflare --> Website
    Website -- "File Storage" --> CMS
    Website -- "HTTP / API" --> Backend
    Website --> GTM
    GTM --> GA4

    %% Backend flows
    Backend --> BackendDB
    Backend -- "Pricing & Availability" --> Navision
    Backend -- "Product Data API" --> Ergonode
    Backend --> PostNL
    Backend --> PayNL
    Backend --> Kiyoh
    Backend -- "Newsletter opt-in/out" --> Copernica
    Backend --> S3["New S3 Bucket\nObject Storage"]
    Backend -- "Legacy API" --> ZwerfkeiOld

    %% CMS
    CMS --> S3

    %% Legacy flows
    ZwerfkeiOld --> OldDB
    ZwerfkeiOld --> Navision

    %% Product data sources
    Suppliers -- "Product info &\nAvailability" --> Ergonode
    Suppliers -- "Stock & Pricing" --> Navision

Legacy API

The connection between the Zwerfkei Backend and Zwerfkei Old via the Legacy API is required during the transition period. Certain business logic and data (e.g. historical orders, account data) still reside in Zwerfkei Old and are not yet migrated to the new backend. This connection will be removed once the migration is complete.

New components

Component Technology Purpose
Cloudflare CDN & Security Traffic routing, caching, DDoS protection
Zwerfkei Website Laravel, Vue.js, TypeScript Fast public storefront with static caching
Zwerfkei CMS Laravel, Statamic (headless) Website content and translation management
Zwerfkei Backend Laravel Central business logic and all external integrations
Backend Database MySQL New database for the backend
Ergonode PIM SaaS Product information management