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:
- Klant kiest "Zwerfkei Givacard / Cadeaukaart" als betaalmethode op de betaalpagina
- Klant voert het kaartnummer in (19 cijfers, verdeeld over 5 invoervelden)
- Saldo wordt geverifieerd via
GivacardApi::verifyCard() - Bij voldoende saldo:
GivacardApi::pay()wordt aangeroepen - Er wordt een
Payment-record aangemaakt mettype = Payment_type::givacard(id: 10) - 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.nlGivacard_item::reportPayByGivacard()— rapport van givacard-betalingen viaPayment-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:
GivacardApilogt 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
.aspxendpoint 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 typeV662) als in de legacygiveacard-tabel
Target situatie¶
Verbetering gepland
De sessie-scraping integratie en het gecombineerde betaalmodel worden herontworpen. De geplande aanpak is uitgewerkt in de onderstaande milestone.