Skip to content

Givacard / Cadeaukaart

Legacy implementatie

De givacard-integratie is een legacy implementatie in de huidige CodeIgniter-applicatie. De werking hieronder beschrijft de bestaande situatie. Deze functionaliteit wordt herontworpen — zie de milestone voor de geplande verbeteringen.


Doel

De Zwerfkei cadeaukaart ("givacard") is een fysieke of digitale cadeaukaart waarmee klanten geheel of gedeeltelijk kunnen betalen in de webshop. Het systeem integreert met een externe dienst: Loyalty in a Box (loyaltyinabox.com) die het saldo en de transacties bijhoudt.


Huidige architectuur (legacy)

Er zijn twee lagen:

Laag Beschrijving
Loyalty in a Box Extern systeem dat kaartsaldo en transacties beheert (service2.loyaltyinabox.com)
Zwerfkei backend Proxy/adapter via GivacardApi — logt in op de externe dienst en voert acties uit
sequenceDiagram
    actor Klant
    participant Webshop as zwerfkei.nl
    participant GivacardApi as GivacardApi (server-side)
    participant LoyaltyBox as Loyalty in a Box API

    Note over Klant,Webshop: Saldo opvragen (saldocheck pagina)
    Klant->>Webshop: POST /saldocheck/get_saldo_info (kaartnummer + captcha)
    Webshop->>GivacardApi: login() + verifyCard(cardnumber)
    GivacardApi->>LoyaltyBox: POST VerifyCard
    LoyaltyBox-->>GivacardApi: { Balance, ResultCode, ... }
    GivacardApi-->>Webshop: saldo info
    Webshop-->>Klant: "Saldo: €XX,XX"

    Note over Klant,Webshop: Betalen met cadeaukaart (checkout)
    Klant->>Webshop: Kiest "Givacard" als betaalmethode
    Webshop->>GivacardApi: login() + verifyCard() + pay(amount)
    GivacardApi->>LoyaltyBox: POST Pay
    LoyaltyBox-->>GivacardApi: bevestiging
    GivacardApi-->>Webshop: success
    Webshop->>Webshop: Maak Payment record aan (type=givacard)

    Note over Klant,Webshop: Restant betalen
    Klant->>Webshop: Kiest tweede betaalmethode (iDEAL, etc.)
    Webshop->>Webshop: Verwerk gecombineerde betaling

API endpoint

GET /api/givacard

Server-side proxy voor de Loyalty in a Box API. Authenticatie via sessie-cookies die de backend onderhoudt.

Parameters:

Parameter Verplicht Beschrijving
cardnumber Ja Kaartnummer (19 cijfers)
action Ja info, actions, reload, pay, activate
amount Bij pay/reload Bedrag in centen

Acties:

Action Beschrijving
info Haal saldo en kaartinfo op (VerifyCard)
actions Haal beschikbare acties op (GetCardActions)
reload Laad kaart op (Reload) — of activeer als kaart nog niet actief is
activate Activeer een nieuwe kaart (ActivateCard)
pay Betaal een bedrag af van de kaart (Pay)

Relevante bestanden:

Bestand Doel
application/modules/api/controllers/Givacard.php API controller
application/modules/api/components/GivacardApi.php Adapter naar Loyalty in a Box

Checkout flow

Klanten kunnen de cadeaukaart als (deel)betaling gebruiken:

  1. Klant kiest "Zwerfkei Givacard / Cadeaukaart" als betaalmethode op de betaalpagina
  2. Klant voert het kaartnummer in (19 cijfers, verdeeld over 5 invoervelden)
  3. Saldo wordt geverifieerd via GivacardApi::verifyCard()
  4. Bij voldoende saldo: GivacardApi::pay() wordt aangeroepen
  5. Er wordt een Payment-record aangemaakt met type = Payment_type::givacard (id: 10)
  6. Als het orderbedrag groter is dan het kaartsaldo: klant kiest een extra betaalmethode voor het restant

Session handling:

Kaartgegevens worden tijdelijk in de sessie bewaard (giftcard session key) als JSON-array, geïndexeerd op kaart-ID:

$session['giftcard'][$cardId] = json_encode([
    'saldo' => ...,
    'number' => ...,
    'pin' => ...
]);

Relevante bestanden:

Bestand Doel
application/modules/shoppingcart/components/Giftcard.php Sessie-beheer voor cadeaukaarten in checkout
application/modules/widgets/views/checkout/payment_givacard.php Betaalmethode-keuze UI
application/modules/widgets/views/checkout/payment_giftcard.php Kaartinvoer UI
application/controllers/Saldocheck.php Saldo-opvraagpagina
application/modules/widgets/views/elements/saldocheck.php Saldocheck widget

Cadeaukaart kopen (webshop)

Klanten kunnen ook zelf een cadeaukaart kopen in de webshop:

  • Vaste artikel-ID: 30108, barcode: 2000000420585
  • Klant voert een zelf te kiezen bedrag in (minimum €10,00, maximum €500,00)
  • Het bedrag wordt meegegeven als quantity (in centen) bij het toevoegen aan de winkelwagen
  • Na betaling wordt de kaart opgewaardeerd via GivacardApi::reload() / activate()

Rapportage

Maandelijks wordt automatisch een CSV-rapport gegenereerd van afgewaardeerde kaarten en givacard-betalingen:

  • Givacard_item::report() — rapport van oude/uitgegeven kaarten → administratie@zwerfkei.nl
  • Givacard_item::reportPayByGivacard() — rapport van givacard-betalingen via Payment-tabel

Twee systemen naast elkaar

Er is een legacy giveacard-tabel (model: Backend\Givacard_item) voor het bijhouden van kaarten die buiten Loyalty in a Box om werden uitgegeven (het oude systeem). Dit draait parallel aan de Loyalty in a Box-integratie. De maandelijkse rapportage dekt beide.


Knelpunten huidige implementatie

  • Session-scraping login: GivacardApi logt in op de Loyalty in a Box webinterface via cURL + HTML scraping + cookie-beheer — fragiel en afhankelijk van de paginastructuur
  • Geen echte REST API: de externe dienst biedt een .aspx endpoint aan (WebTerminal2/Index.aspx/...) — dit is niet de standaard REST API die moderne diensten aanbieden
  • Gecombineerde betaling: de flow voor deelbetaling + tweede betaalmethode is complex en verspreid over meerdere componenten
  • Dubbele registratie: zowel in Payment-tabel (Pay.nl givacard type V662) als in de legacy giveacard-tabel

Target situatie

Verbetering gepland

De sessie-scraping integratie en het gecombineerde betaalmodel worden herontworpen. De geplande aanpak is uitgewerkt in de onderstaande milestone.

Milestone: Givacard v2