Certification

Erosmark Certification

The document that contains all certification data

HARDWAREVEREISTEN

De Checkbox is een Fiscale Data Module (FDM) ontworpen om te voldoen aan de strengste eisen van de Belgische wetgeving, zoals vastgelegd in het Ministerieel Besluit (MB) en de certificatiemanual van de FOD Financiën. Dit hoofdstuk beschrijft de hardwarecomponenten van de Checkbox, inclusief hun technische specificaties, conformiteitsverklaringen en beveiligingsmaatregelen.

HARDWAREVEREISTEN

3.1. CE-MARKERING

De producent verstrekt een EU-conformiteitsverklaring voor zijn elektronisch product. De technische documentatie wordt als bijlage aan de aanvraag verstrekt. Het ontbreken van deze verklaring en/of de technische documentatie schort de behandeling van het certificatiedossier op.

De CE-keuring werd uitgevoerd conform de toepasselijke Europese regelgeving inzake productveiligheid, elektromagnetische compatibiliteit en radioapparatuur.
Het product werd beoordeeld aan de hand van de relevante richtlijnen, met name:

  • Radio Equipment Directive (RED) 2014/53/EU
  • Elektromagnetische Compatibiliteit (EMC) 2014/30/EU
  • Laagspanningsrichtlijn (LVD) 2014/35/EU
  • RoHS-richtlijn 2011/65/EU

De resultaten van deze beoordeling zijn opgenomen in de EU-conformiteitsverklaring, opgesteld te Kortrijk, en terug te vinden in Bijlage A: Declaration of Conformity.

HARDWAREVEREISTEN

3.2. OPSLAG

De producent toont aan (inclusief documentatie producent) dat de FDM voldoet aan de vereisten van art. 76 en 81 van het MB, met name: De FDM heeft voldoende opslagcapaciteit om het besturingssysteem, de firmware, de tellers en een opslagcapaciteit van minimaal 2 GB aan transactiegegevens te bufferen.

Elke Checkbox is uitgerust met een SD-kaart van 4 GB, wat ruim boven de vereiste capaciteit van 2 GB ligt.

Specificaties:

  1. Write/erase-cycli: 500 – 3000; 2 TBW
  2. Snelheidsklasse: Class 10

De SD-kaart is getest op zowel duurzaamheid als capaciteit. De datasheet is op aanvraag beschikbaar.

image.png

image.png

HARDWAREVEREISTEN

3.3. PROCESSOR

De producent toont aan (inclusief documentatie producent) dat de processor voldoet aan de vereisten van art. 73 van het MB, met name: ARM/CORTEX processor of gelijkwaardig, met voldoende GPIO’s om de gevraagde functionaliteit te ondersteunen, een werktemperatuur tussen 0 °C en 70 °C en een RTC. Dit wordt gestaafd met de gedetailleerde productbeschrijving van dit hardware element, afgeleverd door de producent ervan.

De in de Checkbox toegepaste processor is de ESP32-WROOM-32E van Espressif Systems. Deze module voldoet aan de vereisten van artikel 73 van het MB, zoals hieronder toegelicht:

  • Processor: De ESP32-WROOM-32E is uitgerust met een dual-core Xtensa® 32-bit LX6 CPU. Deze dual-core Xtensa LX6-processor draait op 240 MHz, met een prestatiescore tot 600 DMIPS. Dit suggereert dat de ESP32 in theorie hogere prestaties kan leveren dan een typische Cortex-M4, vooral bij toepassingen die profiteren van hogere kloksnelheden en dual-core verwerking wat ook duidelijk gebleken is tijdens de implementatie.
  • GPIO's: De module beschikt over 26 bruikbare GPIO-pinnen, voldoende om de gevraagde functionaliteit te ondersteunen.
  • Werktemperatuurbereik: De ESP32-WROOM-32E ondersteunt een temperatuurbereik van -40 °C tot +85 °C, en voldoet daarmee ruimschoots aan de vereiste range van 0 °C tot 70 °C.
  • RTC: De module bevat een geïntegreerde Real-Time Clock (RTC) die autonoom kan functioneren tijdens de deep-sleep modus.

Een overzicht van de product specificaties van de ESP32-WROOM-32E, afgeleverd door Espressif, worden als bijlage toegevoegd ter staving.

image.png

image.png

HARDWAREVEREISTEN

3.4. CHIP MET SECURE ELEMENT

De producent toont aan (inclusief documentatie producent) dat de processor voldoet aan de vereisten van art. 77 van het MB, met name: secure element ATECC608B of gelijkwaardig, met minimaal volgende kenmerken: - niet-vluchtig geheugen, opslag van minimaal 2 tellers (telkens van minimaal 256 bit), certificaten, en gemengd read/write, read only of secret data - toegang tot de diverse secties van het geheugen is beschermd - conform de GDPR-regelgeving Dit secure element wordt gebruikt voor alle cryptografische operaties, de opslag van de certificaten en het genereren van de digitale handtekening (ECDSA, NIST P 256 curve). Dit wordt gestaafd met de gedetailleerde productbeschrijving van dit hardware element, afgeleverd door de producent ervan. Het voldoen aan deze voorwaarde is essentieel voor de certificatie.

De Checkbox maakt gebruik van het secure element ATECC608B van Microchip, waarmee voldaan wordt aan de vereisten gesteld in artikel 77 van het MB.

Package marking: Het component op de hardware is visueel te herkennen aan de markering 2248JYA. Zoals vermeld in de officiële documentatie van Microchip wordt deze markering echter opzettelijk vaag gehouden omwille van beveiligingsredenen:

"The part marking for all crypto devices is intentionally vague. The marking on the top of the package does not provide any information as to the actual device type or the manufacturer."
(Bron: Microchip documentation on package marking)

image.png

Type en referentie: Op de PCB is het component wel duidelijk met ref des U2 aangeduid. In de bijgevoegde screenshot van onze Bill of Materials (BOM) is te zien dat het hier gaat om de ATECC608B-SSHDA-B. Dit component werd aangekocht bij een geautoriseerde distributeur van Microchip (EBV) die dit kan bevestigen.

image.png

Gebruik binnen de toepassing:
Het secure element wordt in onze toepassing gebruikt voor:

  • Alle cryptografische operaties
  • Genereren van en opslag van de private key
  • Opslag van de digitale certificaten
  • Genereren van digitale handtekeningen volgens ECDSA, NIST P-256 curve
  • Opslag van de Tellers

Deze functionaliteiten kunnen softwarematig worden aangetoond. Interacties met het secure element kunnen op verzoek worden aangetoond aan de hand van firmwarecode die gebruikmaken van de functies van de ATECC608B.


HARDWAREVEREISTEN

3.5. ANDERE HARDWAREVEREISTEN

De producent beschrijft gedetailleerd de andere gebruikte hardwarecomponenten en toont voor deze vermeld in de Titel II, hoofdstuk 2 – Technische eisen ten aanzien van de FDM Afdeling 2 van het MB aan dat deze hiermee compliant zijn. 7/12 Worden hier bedoeld: - de voeding: usb-c poort (+5V) en/of Power over Ethernet (PoE) - connectiviteit: ethernet LAN, gecertificeerde Wifi-module en optioneel een 4/5 G LTE-module De producent toont aan dat hij aan deze eisen voldoet. De producent toont aan dat de FDM voldoet aan de vereisten van art. 87 van het MB, met name aan de voorwaarden van de Richtlijn (EU) 2022/2555 van het Europees Parlement en de Raad van 14 december 2022 betreffende maatregelen voor een hoog gezamenlijk niveau van cyberbeveiliging in de Unie (https://eur-lex.europa.eu/eli/dir/2022/2555/oj?locale=nl). De producent beschrijft gedetailleerd hoe de FDM fysiek beveiligd is tegen manipulatie door onbevoegden

5VDC USB Voeding

  • De FDM beschikt over een 5VDC voedingsingang via een standaard USB-C connector, aangeduid in geel op onderstaande figuur.
  • De Checkbox wordt geleverd met een USB-C kabel en adapter, die als voedingseenheid functioneren.

image.png

Ethernet connectiviteit

  • In rood gemarkeerd op de figuur is de Ethernet PHY (LAN8720) zichtbaar, inclusief de benodigde magnetics en RJ45-connector.
  • Deze componenten voorzien de FDM van een 10/100 Mbit Ethernet-verbinding, conform de eisen van het MB.

Wifi connectiviteit

  • In blauw wordt de gecertificeerde WiFi-antenne weergegeven, onderdeel van de geïntegreerde ESP32-WROOM module.
  • Deze module beschikt over alle vereiste EMC- en regionale certificeringen (FCC, CE, IC, etc.), beschikbaar via de officiële website van Espressif:
    👉 https://www.espressif.com/en/support/documents/certificates


image.png

De checkbox voldoet aan de bepalingen van Richtlijn (EU) 2022/2555). Deze conformiteit wordt gerealiseerd door de inzet van de volgende beveiligingscomponenten:

1. Secure Element – ATECC608B

De ATECC608B van Microchip biedt meerdere functies die rechtstreeks bijdragen aan de naleving van de richtlijn:

  • Hardwarematige veilige opslag van cryptografische sleutels, certificaten en gevoelige data (secret, read-only, en mixed access).
  • Ondersteuning voor ECDSA met NIST P-256, gebruikt voor digitale handtekeningen en authenticatie van berichten.
  • Beveiligde key provisioning en secure boot-verificatie in combinatie met de hoofdprocessor.
  • Bescherming tegen fysieke extractie en side-channel attacks, dankzij dedicated beveiligingslogica.
  • Unieke identiteitsvoorziening (UID) voor elke chip, bruikbaar voor toestelidentificatie en toegangsbeheer.

2. Hoofdprocessor – ESP32-WROOM-32E (Espressif)

De ESP32-WROOM-32E ondersteunt verschillende beveiligingsmaatregelen op firmwareniveau die bijdragen aan NIS2-conformiteit:

  • Secure Boot (v2): voorkomt dat ongeauthenticeerde firmware wordt uitgevoerd.
  • Flash Encryption: zorgt ervoor dat firmware en data in opslag niet leesbaar zijn buiten het toestel.
  • Hardwarematige geheugenbescherming (MMU) en toegangslimieten per taak.

3. Naleving van NIS2-vereisten

De combinatie van het secure element en de ESP32-processor voorziet in de volgende kernelementen van Richtlijn 2022/2555:

  • Beheer van cryptografische sleutels en authenticatie
  • Integriteit en authenticiteit van firmware (secure boot & signing)
  • Gecontroleerde toegang tot systemen (secure identity provisioning)
  • Veilige dataopslag en communicatie (encryptie in opslag en transit)
  • Basis voor incidentdetectie en audit logs

HARDWAREVEREISTEN

3.6. GEZONDHEIDSINDICATOREN

De producent beschrijft uitgebreid de aanwezige gezondheidsindicatoren en hun werking. Zijn minimaal beschikbaar: batterijstatus (in voorkomend geval), communicatiestatus met een aangesloten POS – succesvolle communicatie, niet-succesvolle communicatie, bufferstatus ‘near full’ en “buffer full”, internet netwerk status – succesvolle of niet-succesvolle communicatie met de FODFIN-cloud.


LED-Statusindicatoren – Gezondheidsmonitoring van de FDM

De FDM beschikt over vier afzonderlijke LED’s die elk een specifiek aspect van de systeemgezondheid of communicatie weergeven. De kleuren van de LED’s corresponderen met gedefinieerde toestanden Deze LED’s bieden visuele feedback over de werking van het toestel en zijn conform de vereisten inzake gezondheidsindicatoren zoals opgelegd door het MB.

PowerButton.png

Power LED – Systeemstatus

Geeft de algemene toestand van het toestel weer.

Status

Kleur

Betekenis

Uit (OFF)

Uit

Geen voeding

Initialisatie

Blauw

Systeem start op

OTA

Wit

Update bezig (Knipperend)

Shutdown

Yellow

Aflsluitproces bezig (Knipperend)

Gereed

Groen

Systeem volledig operationeel

Fout

Rood

Kritieke fout gedetecteerd

iconmonstr-globe-7-240.png

FODFIN LED – Communicatie met de FODFIN-cloud (Internetstatus)

Geeft de status aan van de verbinding met het internet en de FODFIN backend.

Status

Kleur

Betekenis

Uit (OFF)

Uit

Geen voeding

Initialisatie

Blauw

Netwerkconfiguratie in uitvoering / No LAN

LAN

Geel

Netwerkverbinding is LAN only

Waarschuwing

Geel

Intermitterende verbinding of fallback actief

Verbonden

Groen

WAN-verbinding / Succesvolle communicatie met de FODFIN-cloud

Fout

Rood

Niet-succesvolle FODFIN-cloud communicatie

Uitgeschakeld

Paars

Cloudcommunicatie handmatig uitgeschakeld

In uitvoering

Wit

FODFIN-cloud communicatie bezig of in verwerking

iconmonstr-database-13-240.png

Buffer LED – Gegevensbufferstatus

Toont de vulgraad van de interne opslagbuffer voor gegevens

Status

Kleur

Betekenis

Uit (OFF)

Uit

Geen voeding

Initialisatie

Blauw

Opslagmodule wordt geïnitialiseerd

Voldoende ruimte

Groen

Buffer heeft voldoende vrije capaciteit

Wordt vol

Geel

Buffercapaciteit nadert limiet (‘near full’)

Vol of fout

Rood

Buffer is vol of schrijffout opgetreden

In uitvoering

Wit

Niet-verzonden event markeren als verzonden

iconmonstr-checkout-1-240 (Custom).png
POS-Communicatie LED – Status communicatie met aangesloten kassasysteem

Geeft real-time feedback over de communicatie tussen de FDM en het gekoppelde POS-systeem.

Status

Kleur

Betekenis

Initialisatie

Blauw

De POS interface wordt geïnitialiseerd

Gereed

Groen*

De FDM is klaar voor gebruik

FDM error

Rood*

FDM error is actief

FDM warning

Geel*

FDM warning is actief

In uitvoering

Wit

POS query in verwerking

Status

Kleur

Betekenis

Verbonden en actief

Groen*

Succesvolle bidirectionele communicatie

Communicatieproblemen

Rood*

POS onbereikbaar, fout in berichtuitwisseling

Niet geconfigureerd of standby

Geel*

POS nog niet verbonden of wachtend op handshake

*Kleuren voor deze LED zijn momenteel TBD (to be defined) en worden afgestemd op de definitieve firmware. De structuur is echter voorzien en kan softwarematig worden aangetoond.

image.png

HARDWAREVEREISTEN

3.7. LABELS – SERIENUMMERS

Back Office Module

De Checkbox biedt een veelzijdige en beveiligde back office module die voldoet aan de eisen van de FOD Financiën, zoals beschreven in het communicatieprotocol en de detailbeschrijving FDM. Deze module is toegankelijk via twee kanalen.

  • GraphQl Endpoint: Een API-gebaseerde interface die directe, programmatorische toegang biedt tot alle FDM-functionaliteiten via GraphQl-queries en mutaties. Deze endpoint is ideaal voor integratie met POS systemen of andere geautomatiseerde processen
  • Online Back Office (tools.checkbox.be): Een web gebaseerde interface die toegankelijk is via eender welke browser, met een intuïtief dashboard voor handmatige configuratie en monitoring

Beide kanalen ondersteunen alle verplichte functionaliteiten, zoals raadpleging van tellers, buffers, transacties, foutlogs en certificaten, evenals netwerk- en webserviceconfiguraties. De GraphQL endpoint is ontworpen voor integratie met externe systemen, terwijl de online back office een gebruiksvriendelijke interface biedt voor beheerders. Beide toegangsmethoden zijn beveiligd met robuuste authenticatie- en encryptiemechanismen. Dit hoofdstuk beschrijft hoe de Checkbox aan de vereisten voldoet, ondersteund door bewijsstukken, en benadrukt aanvullende functionaliteiten die de gebruikservaring verbeteren.

Echter het grote verschil tussen deze 2 kanalen is dat om via de Online Back Office bereikbaar te zijn, moet de checkbox toegang hebben tot het internet. Terwijl via de GraphQl endpoint is het perfect mogelijk om dit via een toestel te doen die zich op het zelfde netwerk bevindt. Via eender welke GraphQl client kan dit worden uitgelezen. Wij voorzien ook een tool die dit kan, de tool werkt zowel op een Windows OS alsook een Linux OS.

Back Office Module

Beveiliging van de Backoffice Module

GraphQl

Wanneer een directe verbinding opgezet wordt om via de GraphQl toegang te verkrijgen is er een token nodig die in de http request header moet staan, De token is verschillend per Checkbox unit.

Authorization: Bearer <token>

De token wordt vervolgens vergangen door de bijgeleverde token.

  • Op de sticker van de Checkbox kan men deze token terugvinden
  • Op de backend tools kan deze token ook worden teruggevonden onder settings bij het desbetreffende device
    image.png

Deze token is uniek en levenslang per Checkbox, Wordt deze toch gelekt, dan kan Taiger deze token updaten naar een nieuwe.

Backoffice Tools

Deze omgeving wordt beveiligd door een aparte Identity Server via een gekend protocol OpenId.
Bij het inloggen wordt een Authorisation token gegenereerd die heel beperkt geldig is. Wanneer een aanroep wordt gedaan naar de backend wordt deze token telkens meegegeven, wanneer de token verloopt bezit de frontend een automatisch mechanisme om via een Refresh token een nieuwe Authorisation token te verkrijgen.

Wanneer iemand een Authorisation token zou kunnen bemachtigen, dan nog is dit maar een heel beperkte tijd 1 minuut ongeveer waarbinnen deze geldig is. Zodoende dat dit helemaal onbruikbaar wordt.

Back Office Module

Raadpleging Tellers

GraphQl

Via de GraphQl endpoint is er een query waarmee je deze informatie kunt opvragen,

query AdminInfos {
    adminInfos {
        counters {
            total
            n
            f
            s
            p
            c
            i
            r
            t
            rawCounter
        }
    }
}

The answer you get this way is

{
    "data": {
        "adminInfos": {
            "counters": {
                "total": 101,
                "n": 70,
                "f": 10,
                "s": 2,
                "p": 3,
                "c": 1,
                "i": 4,
                "r": 5,
                "t": 6,
                "rawCounter": 1
            }
        }
    }
}

Backoffice Tools

Bij de details van de Checkbox zie je een overzicht van de tellers.

image.png

Of anderzijds bij de details van een Checkbox kan je via de Admin Console Admin Console Knop knop een subscherm oproepen waar je vervolgens Admin Info kunt opvragen, op deze manier vraag je op dat eigenste moment de waarden live uit de Checkbox op.

image.png

Back Office Module

Raadpleging Buffer historiek

GraphQl

De buffer historiek wordt bepaald door het percentage van de gebruikte buffer, de laatste succesvolle transactie en het aantal keer dat er opnieuw geprobeerd werd door de Checkbox.

Dit kan via volgende Query opgevraagd worden

query AdminInfos {
    adminInfos {
        device {
            bufferCapacityUsed
        }
        userParams {
            fdmLastSuccessfulTrans
            retryCount
        }
    }
}

Met als antwoord

{
    "data": {
        "adminInfos": {
            "device": {
                "bufferCapacityUsed": 17.5
            },
            "userParams": {
                "fdmLastSuccessfulTrans": "2024-01-04",
                "retryCount": 5
            }
        }
    }
}

Backoffice Tools

Anderzijds bij de details van een Checkbox kan je via de Admin Console image.png knop een subscherm oproepen waar je vervolgens Admin Info kunt opvragen.

image.png

En bij het tabblad User Params kun je het vervolg terugvinden

image.png

Back Office Module

Raadpleging Transacties in de Buffer

GraphQl

Backoffice Tools

Om de transacties in de buffer op te vragen die nog niet verstuurd zijn geraakt kun je als volgt te werk gaan, Je kiest eerst de periode van de berichten die je wenst op te vragen, Vervolgens het aantal en daarna kun je met de knop Buffer Messages de lijst gaan opvragen.

image.png

Back Office Module

Raadpleging Failed Requests

GraphQl

De query om de failed requests op te halen kun je hieronder vinden. Deze aanvaardt ook een filter om de berichten te gaan filteren

  • Het maximum aantal berichten die je wenst te retourneren
  • De datums van en tot die specifiëren waartussen de failed requests moeten liggen.
query FailedRequests {
    failedRequests(
        selectRange: { maxItemCount: 20, from: "2025-05-01", to: "2025-05-22" }
    ) {
        timestamp
        requestMethod
        requestUri
        requestHeaders
        requestBody
        replyStatusCode
        replyHeaders
        replyBody
        errorMessage
    }
}

Met als mogelijk antwoord

{
    "data": {
        "failedRequests": [
            {
                "timestamp": "2025-02-17T21:32:32.000Z",
                "requestMethod": "POST",
                "requestUri": "https://acc.gks2-0.be/public/init",
                "requestHeaders": "YWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbgpEYXRlOiBNb24sIDE3IEZlYiAyMDI1IDIxOjMyOjMyIEdNVApBdXRob3JpemF0aW9uOiBCZWFyZXIgZXlKaGJHY2lPaUpGVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnpkV0lpT2lKcGJtbDBJaXdpYVdGMElqb3hOek01T0RJM09UVXlMQ0ptWkcxSlpDSTZJa05DV0RBeE1EQXdNREF4SW4wLmFhWUxKZlJkdlFOWHFNbzFXLTVzem4zNUN0OVdiaEJtdFQxNElEdWhJMVUwU0gwNjZ2T2lsYlBQdDhPUVRUdEszOFBHUlRlV0REVE5oSDVUVWY4a2JnCg==",
                "requestBody": null,
                "replyStatusCode": 401,
                "replyHeaders": "RGF0ZTpNb24sIDE3IEZlYiAyMDI1IDIxOjMyOjMzIEdNVABDb250ZW50LVR5cGU6YXBwbGljYXRpb24vanNvbgBDb250ZW50LUxlbmd0aDo2OABDb25uZWN0aW9uOmtlZXAtYWxpdmUAeC1hbXpuLVJlcXVlc3RJZDo0N2I0YzNkNC1iMDQwLTQzYWMtOWIzMC1kZGQxMTkyNjIwNGEAeC1hbXotYXBpZ3ctaWQ6R0plbHhHNkFsaUFFUE5BPQBYLUFtem4tVHJhY2UtSWQ6Um9vdD0xLTY3YjNhYWYxLTc2NzBmZjZhMTcyYWExNjU2ZTlmZDg0MztQYXJlbnQ9MTI1YTUyNGQ0Nzc3ZjliODtTYW1wbGVkPTA7TGluZWFnZT0xOmNkN2UyMTNmOjAA",
                "replyBody": "eyJtZXNzYWdlIjoiTm90IHZhbGlkIHRva2VuIEVycm9yOiBUb2tlbiBzaWduYXR1cmUgdmVyaWZ5IGZhaWxlZCEgIn0=",
                "errorMessage": "error"
            }
        ]
    }
}

Backoffice Tools

Via de Backoffice Tools kan dit eveneens worden opgevraagd

image.png

Daarna krijg je een lijst met failed requests

image.png

Back Office Module

Raadpleging Error Log

Back Office Module

Raadpleging Client Certificaat

GraphQl

Met onderstaande query kan het cliënt certificaat uitgelezen worden.

query AdminInfos {
    adminInfos {
        userParams {
            certStore {
                client
            }
        }
    }
}

Dit resulteert in een client certificaat

{
    "data": {
        "adminInfos": {
            "userParams": {
                "certStore": {
                    "client": "-----BEGIN CERTIFICATE-----\nMIIB6zCCAZECFEYC1ZTEsYWmIyM2pU8HMG949IoDMAoGCCqGSM49BAMCMDAxCzAJ\nBgNVBAYTAkJFMSEwHwYDVQQDDBhnYXRld2F5Lm9tZGF0aGV0d2Vya3QuYmUwHhcN\nMjUwMzI3MTUxNDA0WhcNMjYwMzI3MTUxNDA0WjCBvzELMAkGA1UEBhMCQkUxIDAe\nBgNVBAMMF0NCWDAxMDAwMDAzKy4rZ2tzMi0wLmJlMQ8wDQYDVQQKDAZNSU5GSU4x\nDTALBgNVBAsMBEZJU0MxETAPBgNVBAcMCEJydXNzZWxzMREwDwYDVQQIDAhCcnVz\nc2VsczEyMDAGA1UEDAwpQ2xpZW50IGNlcnRpZmljYXRlIGZvciBmZG0gc2VyaWFs\nIG51bWJlcjoxFDASBgNVBA0MC0NCWDAxMDAwMDAzMFkwEwYHKoZIzj0CAQYIKoZI\nzj0DAQcDQgAE0lkwbuoCvK8fZ1Rpe+rLfdAZJFE1CrC/YpVAvnjodQ59e4jSI5Q7\n8Vze56mfD2nMXWhjRgXQqF04gjJQ3ifQpzAKBggqhkjOPQQDAgNIADBFAiAOEj33\nrdB4NJruyyFWtZNZdEIDKmIEI8YtBqMYNFDXqAIhANQYSU2oYBOSpz94eW6qwUJs\nHdw6RavDuGs3A/ZYH/QK\n-----END CERTIFICATE-----"
                }
            }
        }
    }
}

Backoffice Tools

Anderzijds bij de details van een Checkbox kan je via de Admin Console image.png knop een subscherm oproepen waar je vervolgens Admin Info kunt opvragen.

image.png

Back Office Module

Configuratie Netwerk

GraphQl

Backoffice Tools

Anderzijds bij de details van een Checkbox kan je via de Settings image.png knop een subscherm oproepen waar je vervolgens de instellingen kunt zien en wijzigen.

image.png
Back Office Module

Raadpleging data elementen

GraphQl

Volgende Query zorgt ervoor dat alle Data elementen te vinden in de tabel uit hoofdstuk 5 op te vragen zijn.

query AdminInfos {
    adminInfos {
        userParams {
            fdmLockFromDateList {
                fdmLock
                lockReason {
                    language
                    message
                }
            }
            posIdFromDateList {
                posIdList
            }
            fdmLastActions
            fdmLastSuccessfulTrans
            retryCount
            vatFromBookingDateList {
                fromBookingDate
                vatRates {
                    vatLabel
                    vatRate
                    outOfScope
                }
            }
            footer
            url
            maxMsgSize
            webService {
                wsReg
                wsNop
                wsInit
                wsQuery
                wsNtp1
                wsNtp2
                wsNtp3
            }
            certStore {
                client
                hw
                clientSn
                claim
            }
        }
        device {
            fdmId
            fdmSwVersion
            fdmDateTime
        }
        paramsVersion
    }
}

Dit resulteert in alle gevraagde velden uit deze tabel.

{
    "data": {
        "adminInfos": {
            "userParams": {
                "fdmLockFromDateList": {
                    "fdmLock": false,
                    "lockReason": null
                },
                "posIdFromDateList": {
                    "posIdList": [
                        "PBX01000003",
                        "PBX01000999"
                    ]
                },
                "fdmLastActions": "2025-05-21T19:04:10Z",
                "fdmLastSuccessfulTrans": "2025-05-21T19:03:50Z",
                "retryCount": 0,
                "vatFromBookingDateList": {
                    "fromBookingDate": "2020-01-01",
                    "vatRates": [
                        {
                            "vatLabel": "A",
                            "vatRate": 21,
                            "outOfScope": false
                        },
                        {
                            "vatLabel": "B",
                            "vatRate": 12,
                            "outOfScope": false
                        },
                        {
                            "vatLabel": "C",
                            "vatRate": 6,
                            "outOfScope": false
                        },
                        {
                            "vatLabel": "D",
                            "vatRate": 0,
                            "outOfScope": false
                        },
                        {
                            "vatLabel": "X",
                            "vatRate": 0,
                            "outOfScope": true
                        }
                    ]
                },
                "footer": [
                    "myfootertext1",
                    "myfootertext1"
                ],
                "url": "https://www.gks2-0.be",
                "maxMsgSize": 256,
                "webService": {
                    "wsReg": "https://secure.acc.gks2-0.be/business/reg",
                    "wsNop": "https://secure.acc.gks2-0.be/business/reg",
                    "wsInit": "https://acc.gks2-0.be/public/init",
                    "wsQuery": "https://secure.acc.gks2-0.be/business/query",
                    "wsNtp1": "time.aws.com",
                    "wsNtp2": "time.belnet.com",
                    "wsNtp3": "debian.pool.ntp.org"
                },
                "certStore": {
                    "client": "-----BEGIN CERTIFICATE-----\nMIIB6zCCAZECFEYC1ZTEsYWmIyM2pU8HMG949IoDMAoGCCqGSM49BAMCMDAxCzAJ\nBgNVBAYTAkJFMSEwHwYDVQQDDBhnYXRld2F5Lm9tZGF0aGV0d2Vya3QuYmUwHhcN\nMjUwMzI3MTUxNDA0WhcNMjYwMzI3MTUxNDA0WjCBvzELMAkGA1UEBhMCQkUxIDAe\nBgNVBAMMF0NCWDAxMDAwMDAzKy4rZ2tzMi0wLmJlMQ8wDQYDVQQKDAZNSU5GSU4x\nDTALBgNVBAsMBEZJU0MxETAPBgNVBAcMCEJydXNzZWxzMREwDwYDVQQIDAhCcnVz\nc2VsczEyMDAGA1UEDAwpQ2xpZW50IGNlcnRpZmljYXRlIGZvciBmZG0gc2VyaWFs\nIG51bWJlcjoxFDASBgNVBA0MC0NCWDAxMDAwMDAzMFkwEwYHKoZIzj0CAQYIKoZI\nzj0DAQcDQgAE0lkwbuoCvK8fZ1Rpe+rLfdAZJFE1CrC/YpVAvnjodQ59e4jSI5Q7\n8Vze56mfD2nMXWhjRgXQqF04gjJQ3ifQpzAKBggqhkjOPQQDAgNIADBFAiAOEj33\nrdB4NJruyyFWtZNZdEIDKmIEI8YtBqMYNFDXqAIhANQYSU2oYBOSpz94eW6qwUJs\nHdw6RavDuGs3A/ZYH/QK\n-----END CERTIFICATE-----",
                    "hw": "-----BEGIN CERTIFICATE-----\r\nMIIBrjCCAVSgAwIBAgIKQ0JYMDFaJpWCNTAKBggqhkjOPQQDAjBiMQswCQYDVQQG\r\nEwJCRTEMMAoGA1UECBMDV1ZMMQ8wDQYDVQQKEwZUYWlnZXIxETAPBgNVBAsTCENo\r\nZWNrYm94MSEwHwYDVQQDExhDaGVja2JveCBIdyBJbnRlcm1lZGlhdGUwIBcNMjUw\r\nMzE0MjE0MjExWhgPMjEyNTAyMTIyMzU5NTlaMEIxCzAJBgNVBAYTAkJFMQwwCgYD\r\nVQQIDANXVkwxDzANBgNVBAoMBlRhaWdlcjEUMBIGA1UEAwwLQ0JYMDEwMDAwMDMw\r\nWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARxGRl/5qBowtJVAZq8KgjMDtREhJuy\r\nOQ1Co1ovBXNsL/jVmJbRypKT4iTAdcOSyXhbeHyUjwZvMEy3BEVaJ5CioxAwDjAM\r\nBgNVHRMBAf8EAjAAMAoGCCqGSM49BAMCA0gAMEUCIAeR/RrcfLIwtMFyUNo0jNVS\r\nt/xW2AhjaUl5p/UagwZnAiEAkoCIVZt+Kn8fE/KZGVqc90MXvPQFb2NF0IWnXNAS\r\nIDk=\r\n-----END CERTIFICATE-----\r\n",
                    "clientSn": "399692560988210031615062450776513391505408559619",
                    "claim": [
                        "-----BEGIN CERTIFICATE-----\nMIIB8DCCAZUCFFeMk2ygWkC/hsdhpevmwKde6X9lMAoGCCqGSM49BAMCMHYxCzAJ\nBgNVBAYTAkJFMREwDwYDVQQIDAhCcnVzc2VsczERMA8GA1UEBwwIQnJ1c3NlbHMx\nEDAOBgNVBAoMB1lvdXJPcmcxETAPBgNVBAsMCFlvdXJVbml0MRwwGgYDVQQDDBNp\nbnRlcm1lZGlhdGUucG9jLmJlMB4XDTI1MDUxNjAxMDAxOFoXDTI1MDUzMDAxMDAx\nOFowfjELMAkGA1UEBhMCQkUxETAPBgNVBAgMCEJydXNzZWxzMREwDwYDVQQHDAhC\ncnVzc2VsczEXMBUGA1UECgwOTXlPcmdhbml6YXRpb24xCzAJBgNVBAsMAklUMSMw\nIQYDVQQDDBpmaW5hbC5jbGFpbS5taW5maW4uZmdvdi5iZTBZMBMGByqGSM49AgEG\nCCqGSM49AwEHA0IABJ6+Wg23m7zD/Eqw8hUjUQct3q36hMUNoVvaLiud5Kzz37Cu\naCBXvGCLdepyye3WPlhfRtOJKTaoSIulI/oskcowCgYIKoZIzj0EAwIDSQAwRgIh\nALlIZGAzPRpNLi+l2D5qzwFaOtMoGi2GG1PADBgVg7xvAiEAxp5c/f9XaAR04OZq\nA3Sx6r/TSaOba4sUIjVHb3ZiM2I=\n-----END CERTIFICATE-----\n"
                    ]
                }
            },
            "device": {
                "fdmId": "CBX01000003",
                "fdmSwVersion": "0.1.4+dev+",
                "fdmDateTime": "2025-05-21T23:19:57Z"
            },
            "paramsVersion": "2025-03-20T12:22:53.364Z"
        }
    }
}

Backoffice Tools

Bij de details van een Checkbox kan je via de Admin Console Admin Console Knop knop een subscherm oproepen waar je vervolgens via Admin Info alle data elementen kunt terugvinden in de getoonde data. Zie de screenshots hieronder, alle data elementen die moeten getoond worden volgens de tabel kun je hier terugvinden.

image.png

image.png

image.png

image.png

Back Office Module

Configuratie ws_init url

GraphQl

De volgende mutatie zorgt ervoor dat de ws_init url kan ingesteld worden naar een gekozen waarde.

mutation SetWsInit {
    setWsInit(wsInit: "https://acc.gks2-0.be/public/init") {
        status
    }
}

Wanneer dit gelukt is zal de Checkbox antwoorden met een status 0

{
    "data": {
        "setWsInit": {
            "status": 0
        }
    }
}

Backoffice Tools

Bij de details van een Checkbox kan je via de Admin Console Admin Console Knop knop een subscherm oproepen waar je vervolgens de url van de Ws Init kunt ingeven, wanneer je op Submit klikt worden deze naar de Checkbox verstuurd.

image.png

Back Office Module

Configuratie en Synchronisatie Ntp

GraphQl

De volgende mutatie zorgt ervoor dat de ntp3 url kan ingesteld worden naar een gekozen waarde.

mutation SetWsNtp3 {
    setWsNtp3(wsNtp3: "debian.pool.ntp.org") {
        status
    }
}

Wanneer dit gelukt is zal de Checkbox antwoorden met een status 0

{
    "data": {
        "setWsNtp3": {
            "status": 0
        }
    }
}

Backoffice Tools

Bij de details van een Checkbox kan je via de Admin Console Admin Console Knop knop een subscherm oproepen waar je vervolgens de url van de NTP Server kunt ingeven, wanneer je op Submit klikt worden deze naar de Checkbox verstuurd.

image.png

Back Office Module

Raadplegen huidige versie FDM-Parameters

GraphQl

Via de volgende Query is het mogelijk om de huidige parameter versie op te vragen

query AdminInfos {
    adminInfos {
        paramsVersion
    }
}

De Checkbox zal vervolgens antwoorden met zijn versie datum

query AdminInfos {
    adminInfos {
        paramsVersion
    }
}

Backoffice Tools

Bij de details van een Checkbox kan je via de Admin Console Admin Console Knop knop een subscherm oproepen waar je vervolgens Admin Infos oproepen zodat de Checkbox de resultaten teruggeeft, onder Device kun je de Params Version terugvinden, die geeft de datum aan van de huidige versie FDM Parameters

image.png

Back Office Module

Manueel oproepen query webservice

GraphQl

Via de volgende mutatie kun je de Checkbox forceren om deze query uit te voeren

mutation CallWsQuery {
    callWsQuery {
        status
    }
}

Wanneer dit lukt stuurt de Checkbox een status 0 terug

{
    "data": {
        "callWsQuery": {
            "status": 0
        }
    }
}

Backoffice Tools

Bij de details van een Checkbox kan je via de Admin Console Admin Console Knop knop een subscherm oproepen waar je vervolgens Run Ws Query oproepen zodat de Checkbox manueel deze functie zal uitvoeren.

image.png

Extra functies

De checkbox heeft enkele extra functionaliteiten aan boord die niet door FOD werden opgelegd, maar wel zeker en vast een meerwaarde bieden bij het gebruik, op opsporen van eventuele fouten. Deze extra functionaliteiten moeten expliciet door Taiger worden ingesteld, Dit is nooit de bedoeling dat een andere partij dit kan aanpassen.

Extra functies

Opslaan van PBit en CBit

PBit

Wanneer een Checkbox boot, dan wordt een PBit (Power Built in test) uitgevoerd, De resultaten kunnen op de Backoffice worden bijgehouden, De nuttige informatie wordt weergegeven bij de details van een Checkbox.

image.png

Deze informatie is uiterst nuttig voor ons of voor troubleshooting wanneer iemand zou bellen met problemen.

CBit

Wanneer een Checkbox normaal werkt worden er intern af en toe toch testen uitgevoerd om te zien of alles nog naar behoren werkt. Dit noemt men een CBit (Continous Built in test)

Ook deze informatie is voor ons uiterst nuttig, zo kunnen we ook zien wat er in het verleden gebeurd is, of er zich fouten hebben voorgedaan in het verleden.

image.png

Dit toont ons de laatste status van de CBit. Daar kan Taiger ook de geschiedenis van zien

image.png

Deze optie zal wel standaard afliggen, Daar er toch heel wat ruimte gepaard gaat met het opslaan van deze history zal deze optie tijdelijk worden aangelegd in geval van een probleem met een of andere Checkbox

Extra functies

Checkbox Bridge

De Checkbox voorziet een bridge functionaliteit, Dit betekent dat de GQL communicatie niet naar de Checkbox direct wordt geconfigureerd, maar wel naar de Checkbox Bridge. Deze middleware is een functionaliteit die we aanbieden zodat een cloud gebaseerd systeem alle moeilijkheden niet heeft om bij de Checkbox te geraken. De bridge kan ook bij een conventioneel kassasysteem een grote hulp zijn bij de configuratie en setup van het systeem.
En klassieke setup brengt enkele moeilijkheden met zich mee, de Checkbox krijgt een IP adres men moet die zien te achterhalen, soms moeten netwerk infrastructuren aangepast worden beveiligingen opengezet, poorten opengezet van buitenaf zodat een systeem, (cloud gebaseerd of klassiek), toegang zou kunnen krijgen tot de Checkbox.

Onze bridge lost dit probleem op. Er is 1 endpoint die op elk systeem mag worden ingesteld. Er wordt in de request 2 extra headers meegegeven

  • de Api Key
  • de FDM Identifier

Via deze 2 extra headers gaat de Bridge gaan controlleren of deze gebruiker eerst en vooral recht heeft om de bridge te gebruiken, en anderzijds of deze specifieke Checkbox rechten heeft om de Bridge te gebruiken.

De fdm zet bij het booten een websocket open naar de Bridge, waardoor de Bridge de mogelijkheid heeft om te communiceren met de doos in Real time. De Bridge heeft op zijn beurt ook een GraphQl endpoint waarop alle mutaties en queries van een fysieke Checkbox terug te vinden zijn. Een kassa systeem kan vervolgens deze URL en endpoint gaan gebruiken.
Het POS syteem stuurt exact dezelfde GQL queries en mutaties door naar de Bridge, die op zijn beurt handelt slechts als een Relay, en wijzigt verder niets aan de structuur. De Checkbox ontvangt de mutatie en zo wordt het resultaat terug gestuurd.

Voordeel

Nadeel

Gemakkelijke configuratie

Altijd internet connectie nodig

Cloud applicaties veel eenvoudiger

Iets trager dan een directe verbinding

Geen speciale GQL messages

Extra headers nodig

Extra security

Werkt enkel met Checkbox

Extra functies

Local mDns

Bonjour Service

Op vraag van enkele POS fabrikanten is er een bonjour service gekomen. Er was geen enkele manier om te weten wat het adres is om de Checkbox ge configureren aan de POS zijde.
Wij hebben voorzien dat je dit kunt weten via onze Backoffice, maar dit was niet voldoende.
Dus er is nu een Bonjour service die zijn ip adres afficheert op het lokale netwerk.
Wanneer er wordt naar gescand via eender welk Bonjour browser zul je de Checkbox vinden met zijn Identifier en zijn IP adres er bij.
Zo kan een kassasysteem aan de hand van de Identifier het adres terugvinden.

Local Hostname

Wanneer je een Checkbox wenst te addresseren wordt er typisch het IP adres gebruikt, maar dit kan ook anders, men kan de locale hostname gaan gebruiken, Deze wordt als volgt opgebouwd

IDENTIFIER.local

Men kan op deze manier ook het ip adres van de Checkbox gaan terugvinden door een ping commando uit te voeren naar dit adres.

Pinging CBX01000003.local [192.168.68.107] with 32 bytes of data:
Reply from 192.168.68.107: bytes=32 time=1ms TTL=64
Reply from 192.168.68.107: bytes=32 time<1ms TTL=64
Reply from 192.168.68.107: bytes=32 time<1ms TTL=64
Reply from 192.168.68.107: bytes=32 time<1ms TTL=64

Ping statistics for 192.168.68.107:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 1ms, Average = 0ms

Dit werkt enkel via het lokale netwerk

Extra functies

Disable Fod Link

Taiger biedt de mogelijkheid om een Checkbox te configureren zonder dat deze een verbinding met de FOD-servers opzet. Deze functionaliteit was essentieel tijdens de ontwikkelingsfase, voordat de server beschikbaar was. Daarnaast kan deze optie nuttig zijn bij het troubleshooten, waarbij een debug-apparaat wordt gebruikt. Door de toevoeging van een extra beveiligingslaag, die restricties oplegt aan welke POS-systemen met welke FDM’s kunnen communiceren, kan troubleshooten bij klanten complex worden. Daarom kan het voor installateurs handig zijn om over een Checkbox te beschikken waarbij deze functie is uitgeschakeld.

Taiger verbindt zich ertoe dat geen enkele Checkbox deze modus zal deactiveren zonder uitdrukkelijke toestemming van de FOD.

Extra functies

GraphQl Pos Status

De GraphQl endpoint heeft een niet beschreven endpoint aan boord, die wat info van de Checkbox kan weergeven, zonder dat een mutatie hoeft plaats te vinden. De POS kan op deze manier zonder transactie weten of de Checkbox actief is, welke checkbox het is, of alles klopt of er errors, warnings, informations actief zijn. Men kan dit met deze query raadplegen.

query Status {
    status(language: NL) {
        initialised
        device {
            fdmId
            fdmSwVersion
            fdmDateTime
            bufferCapacityUsed
        }
        informations {
            message
            locations {
                line
                column
            }
            extensions {
                category
                code
                showPos
                data {
                    name
                    value
                }
            }
        }
        errors {
            message
            locations {
                line
                column
            }
            extensions {
                category
                code
                showPos
                data {
                    name
                    value
                }
            }
        }
        warnings {
            message
            extensions {
                category
                code
                showPos
                data {
                    name
                    value
                }
            }
            locations {
                line
                column
            }
        }
    }
}
Extra functies

Buffer Messages

Extra functies

Buffer Sent Messages

FODFIN-Cloud

In dit hoofdstuk tonen we aan dat de Checkbox de connectie en de API naar behoren implementeerd zoals voorzien door FOD.

FODFIN-Cloud

Api Protocol Algemeen

De ErosMark-firmware voor de FDM maakt gebruik van een veilige mTLS-verbinding om te communiceren met de FODFIN-Cloud.
In de onderstaande flowchart wordt de algemene werking van deze communicatie – van initiële authenticatie tot gegevensuitwisseling en foutafhandeling.

Fodfin-cloud-communication-overview.drawio.png

FODFIN-Cloud

FDM Certificaatbeheer

Root certificaat

We hebben een root certificaat aangemaakt, Dit is een Zelf ondertekend certificaat,

  • Private Key: prime256v1
  • Geldigheid: 13/02/2025 - 13/02/2125
  • Serienummer: 136F87FEBFE4C4B1
  • Onderwerp: CN=Taiger Root,OU=Checkbox,O=Taiger,ST=WVL,C=BE

Dit certificaat werd aangemaakt in een XCA Vault die nogmaals werd beveiligd met een wachtwoord.

Deze vault staat bij ons op een lokale server bij Taiger, en is niet benaderbaar via het internet.

Intermediate Certificaat

Vanaf het root certificaat hebben we vervolgens een Checkbox Intermediate certificaat gemaakt.

  • Private Key: prime256v1
  • Geldigheid: 13/02/2025 - 13/02/2125
  • Serienummer: 12F52079E54350FC
  • Onderwerp: CN=Checkbox Intermediate,OU=Checkbox,O=Taiger,ST=WVL,C=BE

Ook dit certificaat zit in de Vault die op onze server staat en enkel lokaal toegankelijk.

Voor het valideren van de claim-chain, bevattend in het init pakket, wordt dit op target opgeslaan, in een NVS partitie.

Fod Intermediate Certificaat

Vanaf het Intermediate Certificaat hebben we een Fod Intermediate Certificaat aangemaakt

  • Private Key: prime256v1
  • Geldigheid: 13/02/2025 - 13/02/2125
  • Serienummer: 69A41C78E42CCD71
  • Onderwerp: CN=Checkbox Fod Intermediate,OU=Checkbox,O=Taiger,ST=WVL,C=BE

Dit certificaat werd samen met de private key doorgestuurd aan Fod.

Hw Intermediate Certificaat

Vanaf het Intermediate Certificaat hebben we ook een Hw Intermediate Certificaat aangemaakt

  • Private Key: prime256v1
  • Geldigheid: 13/02/2025 - 13/02/2125
  • Serienummer: 3E654C444F83694C
  • Onderwerp: CN=Checkbox Hw Intermediate,OU=Checkbox,O=Taiger,ST=WVL,C=BE

Dit Intermediate Certificate en zijn key is gebruikt door onze Backend server, Beiden worden veilig in een map geplaatst op de server, deze map heeft geen rechten aan ingelogde gebruikers, enkel aan de .Net Backend applicatiei. Dit certificaat is vervolgens gebruikt om een Hw certificaat te tekenen voor een specifieke Checkbox.

Hw key en Certificaat per Checkbox

Een checkbox maakt bij een eerste boot een private key (fdmHkey) aan in zijn secure element. Deze private key verlaat nooit de Checkbox. Vervolgens wordt een CSR aangemaakt met behulp van deze sleutel, deze CSR wordt vervolgens doorgestuurd naar de Backend om te ondertekenen.
De backend ontvangt dit CSR, hij weet welke Checkbox dit heeft gestuurd, en vergelijkt dit met het onderwerp van de CSR, als deze 2 kloppen wordt een Hw Certificaat aangemaakt en opgeslagen in een database. Dit certificaat krijgt de checkbox, en slaat dit vervolgens op in het secure element. Indien de Checkbox nogmaals een CSR maakt kan het niet anders dan met dezelfde sleutel te zijn, waardoor de backend terug hetzelfde certificaat zal teruggeven, indien er nu nog een CSR van deze bepaalde checkbox zou komen met een andere key dan wordt deze geweigerd..

Dit gebeurt allemaal tijdens het productie proces, de initial boot.

Veiligheid van de procedure

Daar een checkbox maar 1 malig een certificaat kan aanvragen, gaan we ervan uit dat wanneer een checkbox productie verlaat deze veilg is. Een andere instantie kan een CSR aanmaken maar zal dit nooit kunnen met de key van deze checkbox, waardoor de backend de CSR zal resulteren in een failure.

Claim certificaten

De claimcertificaten die de checkbox ontvangt, moeten gevalideerd worden. Om de chain of trust te verifiëren, wordt het intermediate-certificaat op het target opgeslagen. Om veiligheidsredenen wordt dit certificaat apart bewaard en niet in de firmware opgenomen.

Authenticatie

De fdmHkey staat centraal in het authenticatie process, daarom is het belangrijk dat deze veilig opgeslaan wordt en de checkbox niet kan verlaten. Hiervoor is de hardware voorzien van de secure element ATECC608. Overigens gebruiken we de beperkte eeprom van het secure element alsook voor het opslaan van de counters.

image.png

Beschrijving van de slots:

Slot index

Beschrijving

Slot 0

fdmHkey - kan de enclave niet verlaten. Kan gebruikt worden voor signeren van data en laat toe om public key te extrageren.

Slot 9

HW certificate*

Slot 10

HW certificaat issue / expire date.

ATECC configuration ID

Slot 11

FDM counters

Slot 12

FDM counters

De ATECC608 heeft een zeer beperkte opslagcapaciteit. Toch heeft Microchip een manier bedacht om met de beperkte capaciteit toch een certificaat te kunnen opslaan. Dit doet men door de belangrijke en unieke stukken van een certificaat te extrageren en op te slaan in de eeprom.
De Configuratie is voorzien van een ID, dit moet het mogelijk maken om in de toekomst om te kunnen gaan met een alternatieve configuratie.dd
FDM counters, er worden 2 slots gealloceerd om de counters op te slaan. Dit om te garanderen dat er altijd 1 slot is om op terug te vallen mocht 1 van de slots corrupt geworden zijn (bvb door een plotse stroomonderbreking)

Trust certificaten

De trust certificaten dienen om het certificaat van de server te valideren bij mTLS communicatie. De checkbox maakt gebruik van de ESP HTTP Client lib, dat op zijn beurt een software laag bovenop mbedTLS is. Deze laat ons toe om een mutual TLS verbinding met FODFIN-Clout op te zetten.

Onderstaand is te zien hoe we in software de certificaten zetten. Hierbij is config van het type esp_http_client_config_t

....
    case HTTP_SECURE_MODE_MTLS:
        config->cert_pem        = wrap->ctxt->cert_store->server_cert.pem;
        config->cert_len        = wrap->ctxt->cert_store->server_cert.len;
        config->client_cert_pem = wrap->ctxt->cert_store->client_cert.pem;
        config->client_cert_len = wrap->ctxt->cert_store->client_cert.len;
        config->client_key_pem  = wrap->ctxt->cert_store->client_key.pem;
        config->client_key_len  = wrap->ctxt->cert_store->client_key.len;
        break;
....

Hierbij is het server_cert.pem het trust certificaat.

Indien het het server certificaat niet gevalideerd kan worden zal de mTLS request falen en krijgt de firmware niet de mogelijkheid om te communiceren met de (not trusted) server.

FODFIN-Cloud

Systeemklok

De systeemklok wordt gesynced aan de hand van SNTP servers, gedefineerd door ws_ntp1, ws_ntp2 en ws_ntp3.

Hierbij worden ws_ntp1 en ws_ntp2 opgelegd door FODFIN-Cloud via ws_init / ws_query call.

Logs van opstart procedure:
image.png

Indien er geen config aanwezig zoals bij de initial boot dan worden volgende defualts gebruikt

Name

index

Default URL

ws_ntp1

0

time.aws.com

ws_ntp2

1

time.belnet.be

ws_ntp3

2

be.pool.ntp.org

SNTP wordt afgehandeld door de LWIP library, deze tracht eerst te syncen met de server op index 0 vervolgens met 1 en als laatste met de server op index 2.

LWIP - SNTP code snippet:

image.png

Vervolgens zal de checkbox elke 47 minuten synchroniseren met de server en zal er een warning gegeven worden indien er in 24u geen enkele syncronisatie was. Ter controle en opvolging rapporteren we in de CBIT de timestamp van de laatste syncronisatie en de ontvangen tijd.

image.png

FODFIN-Cloud

Booting de FDM

Initialisatieboot

Het opslagmedium voor de configuratie is gewist, waarna de logs van de eerste opstart zonder configuratie werden vastgelegd. De getoonde logs zijn gefilterd op NTP- en FOD-gerelateerde berichten.

2025-05-27 21:27:01.940

tick-tock

I (17793) tick-tock: Setting system time to 1748299454

2025-05-27 21:27:01.946

tick-tock

I (17793) tick-tock: Setting NTP server 0 to time.aws.com

2025-05-27 21:27:01.951

tick-tock

I (17793) tick-tock: Setting NTP server 1 to time.belnet.be

2025-05-27 21:27:01.957

tick-tock

I (17793) tick-tock: Setting NTP server 2 to be.pool.ntp.org

2025-05-27 21:27:01.962

tick-tock

I (17803) tick-tock: Initializing SNTP

2025-05-27 21:27:02.952

tick-tock

I (18803) tick-tock: Network is online, connecting to SNTP server.

2025-05-27 21:27:06.151

tick-tock

I (22003) tick-tock: NTP synced - time is 2025-05-27T21:27:06Z

2025-05-27 21:27:19.533

fod-query

E (35373) fod-query: Failed to load "client_cert"

2025-05-27 21:27:19.545

fod-query

E (35383) fod-query: Failed to load "trust_cert"

2025-05-27 21:27:19.556

fod-query

E (35393) fod-query: Failed to load "fdm_lock"

2025-05-27 21:27:19.561

fod-query

E (35403) fod-query: Failed to load "params"

2025-05-27 21:27:19.573

fod-query

E (35413) fod-query: Failed to load "vat_rate"

2025-05-27 21:27:19.589

fod-query

E (35423) fod-query: Failed to load "pos_allowlist"

2025-05-27 21:27:19.595

fod-query

E (35433) fod-query: Failed to load "urls"

2025-05-27 21:27:19.606

fod-query

I (35443) fod-query: State: FOD_QUERY_STATE_IDLE -> FOD_QUERY_STATE_INIT

2025-05-27 21:27:20.745

fod-http

W (36583) fod-http: JWT: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJpbml0IiwiaWF0IjoxNzQ4MzgxMjQwLCJmZG1JZCI6IkNCWDAxMDAwMDAxIn0.FYWHLWVsYSVR8livxoPPTdKL1Meg9E5pBNmgHNFOzmOFkD_XfqGDBI6qXhi0_lTtZ8SRt5AnD21wANKF7oMlvA

2025-05-27 21:27:20.751

fod-query

I (36593) fod-query: State: FOD_QUERY_STATE_INIT -> FOD_QUERY_STATE_BUSY

2025-05-27 21:27:20.764

fod-reg

I (36593) fod-reg: State transition from FOD_REG_STATE_IDLE to FOD_REG_STATE_PAUSED

2025-05-27 21:27:21.568

fod-query

I (37423) fod-query: Init - HTTP status is OK

2025-05-27 21:27:21.575

fod-query

I (37423) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_INIT_PROCESS

2025-05-27 21:27:22.053

fod-query

I (37903) fod-query: Claim certificate chain is valid

2025-05-27 21:27:22.640

fod-query

I (38493) fod-query: Digital signature verification passed

2025-05-27 21:27:23.789

fod-query

I (39643) fod-query: Action "SET_CLIENT_CERT" success

2025-05-27 21:27:23.877

fod-query

I (39723) fod-query: State: FOD_QUERY_STATE_INIT_PROCESS -> FOD_QUERY_STATE_WORK

2025-05-27 21:27:24.869

fod-config

I (40723) fod-config: FDM lock status: unlocked

2025-05-27 21:27:24.884

fod-query

I (40723) fod-query: Action "SET_FDM_LOCK" success

2025-05-27 21:27:26.025

fod-query

I (41863) fod-query: Action "SET_PARAMS" success

2025-05-27 21:27:27.134

fod-query

I (42973) fod-query: Action "SET_VAT_RATES" success

2025-05-27 21:27:28.206

fod-query

I (44043) fod-query: Action "SET_POS_ALLOWLIST" success

2025-05-27 21:27:29.282

fod-query

I (45133) fod-query: Action "SET_TRUST_CERT" success

2025-05-27 21:27:30.411

tick-tock

I (46263) tick-tock: Setting NTP server 1 to time.belnet.com

2025-05-27 21:27:30.577

fod-query

I (46423) fod-query: Action "SET_URLS" success

2025-05-27 21:27:30.739

fod-query

W (46593) fod-query: All init items processed successfully

2025-05-27 21:27:30.874

fod-query

I (46723) fod-query: State: FOD_QUERY_STATE_WORK -> FOD_QUERY_STATE_IDLE

2025-05-27 21:27:30.881

fod-reg

I (46723) fod-reg: State transition from FOD_REG_STATE_PAUSED to FOD_REG_STATE_IDLE

2025-05-27 21:27:30.881

fod-reg

I (46723) fod-reg: NOP

2025-05-27 21:27:31.873

fod-query

I (47723) fod-query: State: FOD_QUERY_STATE_IDLE -> FOD_QUERY_STATE_QUERY

2025-05-27 21:27:31.878

fod-query

I (47723) fod-query: State: FOD_QUERY_STATE_QUERY -> FOD_QUERY_STATE_BUSY

2025-05-27 21:27:31.884

fod-reg

I (47723) fod-reg: State transition from FOD_REG_STATE_IDLE to FOD_REG_STATE_PAUSED

2025-05-27 21:27:32.394

fod-reg

I (48243) fod-reg: [WS_NOP] HTTP callback type[2] status[200] response[len[3]]

2025-05-27 21:27:33.104

tick-tock

I (48953) tick-tock: NTP synced - time is 2025-05-27T21:27:33Z

2025-05-27 21:27:33.160

fod-query

I (49013) fod-query: Query - HTTP status is OK

2025-05-27 21:27:33.168

fod-query

I (49013) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_QUERY_PROCESS

2025-05-27 21:27:33.867

fod-query

I (49723) fod-query: Processing 0 actions

2025-05-27 21:27:33.874

fod-query

I (49723) fod-query: State: FOD_QUERY_STATE_QUERY_PROCESS -> FOD_QUERY_STATE_WORK

2025-05-27 21:27:34.955

fod-query

W (50803) fod-query: All init items processed successfully

2025-05-27 21:27:34.966

fod-query

I (50803) fod-query: State: FOD_QUERY_STATE_WORK -> FOD_QUERY_STATE_IDLE

2025-05-27 21:27:34.970

fod-reg

I (50803) fod-reg: State transition from FOD_REG_STATE_PAUSED to FOD_REG_STATE_IDLE

  1. Groen: NTP tijd synchronisatie
  2. Rood: De checkbox rapporteert dat er geen configuratie gevonden kan worden.
  3. Blauw: Genereren van de JWT-token
  4. Paars: Verwerken van de response
  5. Donkerblauw: na ws_init een ws_query call (0 actions werden gereplied)

Ontleden JWT token:

token:

eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJpbml0IiwiaWF0IjoxNzQ4MzgxMjQwLCJmZG1JZCI6IkNCWDAxMDAwMDAxIn0.FYWHLWVsYSVR8livxoPPTdKL1Meg9E5pBNmgHNFOzmOFkD_XfqGDBI6qXhi0_lTtZ8SRt5AnD21wANKF7oMlvA

JWT-header:

{
  "alg": "ES256",
  "typ": "JWT"
}

JWT-payload

{
  "sub": "init",
  "iat": 1748381240,
  "fdmId": "CBX01000001"
}

Verwerken response

Alle ontvangen acties (GraphQL mutations) werden succesvol verwekt.

Door de filter is het niet zichtbaar in de logs

Bij het verwerken van een actie zal de checkbox meteen rapporteren als die al dan niet gelukt is. De bovenstaande logs tonen het niet door de filter maar onderstaande tonen aan dat elke response op een actie mislukt doordat er nog geen trust certificaat geïnstalleerd is

2025-05-27 21:27:26.175

http

E (42013) http: HTTP_EVENT_ERROR

2025-05-27 21:27:26.171

HTTP_CLIENT

E (42013) HTTP_CLIENT: Connection failed, sock < 0

2025-05-27 21:27:26.171

transport_base

E (42003) transport_base: Failed to open a new connection

2025-05-27 21:27:26.165

esp-tls

E (42003) esp-tls: Failed to open new connection

2025-05-27 21:27:26.160

esp-tls

E (42003) esp-tls: create_ssl_handle failed

2025-05-27 21:27:26.154

esp-tls-mbedtls

E (41993) esp-tls-mbedtls: Failed to set client configurations, returned [0x8017] (ESP_ERR_MBEDTLS_SSL_SETUP_FAILED)

2025-05-27 21:27:26.143

esp-tls-mbedtls

E (41993) esp-tls-mbedtls: No server verification option set in esp_tls_cfg_t structure. Check esp_tls API reference

2025-05-27 21:27:26.111

http

I (41963) http: Received http request to https://secure.acc.gks2-0.be/business/query/success

2025-05-27 21:27:26.025

fod-query

Het betreffende failed request rapport:

2025-05-27T21:27:26Z
Request POST https://secure.acc.gks2-0.be/business/query/success
accept: application/json Content-Type: application/json Date: Tue, 27 May 2025 21:27:26 GMT
{"actionId":"2025-04-17T13:52:05.123Z","messageDateTimeEcho":"2025-05-27T21:27:21.344Z","operationType":"SET_PARAMS","result":{"data":{"setParams":{"device":{"fdmId":"CBX01000001","fdmDateTime":"2025-05-27T21:27:25Z","bufferCapacityUsed":0},"configuration":{"paramsVersionObject":{"paramsVersion":"2025-04-17T13:52:05Z"},"fdmLockFromDateList":[{"fromSystemDate":"2025-01-01","fdmLock":false,"lockReason":null}]}}}}}
Reply 500

Eenmaal het trust - certificaat gezet werd slaagde de respnonse bvb:

tijd: 2025-05-27T21:27:29Z
Request POST https://secure.acc.gks2-0.be/business/query/success
Request header: accept: application/json Content-Type: application/json Date: Tue, 27 May 2025 21:27:29 GMT
Request payload: {"actionId":"2024-01-06T16:03:23.004Z","messageDateTimeEcho":"2025-05-27T21:27:21.352Z","operationType":"SET_TRUST_CERT","result":{"data":{"setTrustCert":{"device":{"fdmId":"CBX01000001","fdmDateTime":"2025-05-27T21:27:29Z","bufferCapacityUsed":0},"configuration":{"paramsVersionObject":{"paramsVersion":"2025-04-17T13:52:05Z"},"fdmLockFromDateList":[{"fromSystemDate":"2025-01-01","fdmLock":false,"lockReason":null}]}}}}}
Response HTTP status code: Reply 200
Response header: x-amzn-RequestId:9ad6a8ed-fb83-4dcb-99b8-1894bece5746x-amz-apigw-id:LPwqYFpAFiAFbkA=X-Amzn-Trace-Id:Root=1-68362e42-c78fc3b809d29e8391cbff61content-type:application/jsoncontent-length:0date:Tue, 27 May 2025 21:27:29 GMT

Ter volldigheid dit was het resultaat van de gezete parameters:

2025-05-27 21:27:23.144

fdm-config

I (38993) fdm-config: Client certificate set

2025-05-27 21:27:23.149

fdm-config

I (38993) fdm-config: SN: 323817399783284300501404804324502805525198389103

2025-05-27 21:27:23.156

fdm-config

I (38993) fdm-config: Expiry: 2026-02-17T22:02:21Z

2025-05-27 21:27:24.875

fdm-config

W (40723) fdm-config: FDM lock: false

2025-05-27 21:27:24.880

fdm-config

W (40723) fdm-config: FDM config params not initialized: maxBuffer

2025-05-27 21:27:25.923

fdm-config

I (41773) fdm-config: FDM configuration parameters set

2025-05-27 21:27:25.929

fdm-config

I (41773) fdm-config: Version: 2025-04-17T13:52:05Z

2025-05-27 21:27:25.934

fdm-config

I (41773) fdm-config: Init Interval: 345600

2025-05-27 21:27:25.940

fdm-config

I (41773) fdm-config: Nop Interval: 21600

2025-05-27 21:27:25.940

fdm-config

I (41783) fdm-config: Max Buffer: 100

2025-05-27 21:27:25.945

fdm-config

I (41783) fdm-config: Query Interval: 1800

2025-05-27 21:27:25.951

fdm-config

I (41793) fdm-config: Retry Intervals: 7

2025-05-27 21:27:25.951

fdm-config

I (41793) fdm-config: 0: 5

2025-05-27 21:27:25.957

fdm-config

I (41793) fdm-config: 1: 60

2025-05-27 21:27:25.957

fdm-config

I (41803) fdm-config: 2: 300

2025-05-27 21:27:25.962

fdm-config

I (41803) fdm-config: 3: 300

2025-05-27 21:27:25.962

fdm-config

I (41803) fdm-config: 4: 300

2025-05-27 21:27:25.967

fdm-config

I (41803) fdm-config: 5: 3600

2025-05-27 21:27:25.968

fdm-config

I (41813) fdm-config: 6: 10800

2025-05-27 21:27:25.973

fdm-config

I (41813) fdm-config: Retry Intervals Init: 7

2025-05-27 21:27:25.979

fdm-config

I (41813) fdm-config: 0: 5

2025-05-27 21:27:25.979

fdm-config

I (41823) fdm-config: 1: 60

2025-05-27 21:27:25.984

fdm-config

I (41823) fdm-config: 2: 300

2025-05-27 21:27:25.984

fdm-config

I (41823) fdm-config: 3: 300

2025-05-27 21:27:25.990

fdm-config

I (41833) fdm-config: 4: 300

2025-05-27 21:27:25.990

fdm-config

I (41833) fdm-config: 5: 3600

2025-05-27 21:27:25.995

fdm-config

I (41833) fdm-config: 6: 10800

2025-05-27 21:27:26.001

fdm-config

I (41843) fdm-config: Max Msg Size: 256

2025-05-27 21:27:26.001

fdm-config

I (41843) fdm-config: Postpone: false

2025-05-27 21:27:26.006

fdm-config

I (41843) fdm-config: Default Max Calls: 0

2025-05-27 21:27:26.012

fdm-config

I (41853) fdm-config: Max Calls:

2025-05-27 21:27:26.012

fdm-config

I (41853) fdm-config: Footer:

2025-05-27 21:27:26.017

fdm-config

I (41853) fdm-config: - FPS FIN Footer 1

2025-05-27 21:27:26.023

fdm-config

I (41863) fdm-config: - ParamsVerion: 2025-04-17T13:52:05Z

2025-05-27 21:27:27.111

fdm-config

I (42963) fdm-config: VAT rates set:

2025-05-27 21:27:27.117

fdm-config

I (42963) fdm-config: - 0: 21.000000, 0

2025-05-27 21:27:27.117

fdm-config

I (42963) fdm-config: - 1: 12.000000, 0

2025-05-27 21:27:27.122

fdm-config

I (42963) fdm-config: - 2: 6.000000, 0

2025-05-27 21:27:27.128

fdm-config

I (42963) fdm-config: - 3: 0.000000, 0

2025-05-27 21:27:27.128

fdm-config

I (42973) fdm-config: - 4: 0.000000, 1

2025-05-27 21:27:28.190

fdm-config

I (44043) fdm-config: Pos allowlist set to:

2025-05-27 21:27:28.195

fdm-config

I (44043) fdm-config: -CPOS0031234567

2025-05-27 21:27:28.196

fdm-config

I (44043) fdm-config: -CPOS0031234568

2025-05-27 21:27:28.201

fdm-config

I (44043) fdm-config: -CFOD0010000100

2025-05-27 21:27:30.417

fdm-config

I (46263) fdm-config: NTP servers changed, saving to FS

2025-05-27 21:27:30.541

fdm-config

I (46393) fdm-config: New URLs set:

2025-05-27 21:27:30.546

fdm-config

I (46393) fdm-config: REG: https://secure.acc.gks2-0.be/business/reg

2025-05-27 21:27:30.552

fdm-config

I (46393) fdm-config: NOP: https://secure.acc.gks2-0.be/business/reg

2025-05-27 21:27:30.558

fdm-config

I (46393) fdm-config: INIT: https://acc.gks2-0.be/public/init

2025-05-27 21:27:30.568

fdm-config

I (46403) fdm-config: QUERY: https://secure.acc.gks2-0.be/business/query

2025-05-27 21:27:30.569

fdm-config

I (46413) fdm-config: NTP1: time.aws.com

2025-05-27 21:27:30.574

fdm-config

I (46413) fdm-config: NTP2: time.belnet.com

2025-05-27 21:27:30.744

fdm-config

W (46593) fdm-config: FDM operational: true

NOP - operatie

De init procedure werd afgesloten met een NOP operatie

025-05-27 21:07:56.130

fod-reg

I (122022) fod-reg: State transition from FOD_REG_STATE_PAUSED to FOD_REG_STATE_IDLE

2025-05-27 21:07:56.130

fod-reg

I (122032) fod-reg: NOP

2025-05-27 21:07:57.151

fod-reg

I (123062) fod-reg: [WS_NOP] HTTP callback type[2] status[200] response[len[3]]

Regular boot

niet verzonden transactie buffer - leeg

Onderstaande log toont aan dat de Checkbox bij opstart een NOP verstuurt indien er geen niet-verzonden transacties zijn:

2025-05-28 18:22:46.727

checkbox

I (1454) checkbox: State transition: CHECKBOX_STATE_INIT_HW -> CHECKBOX_STATE_INIT_HMI

2025-05-28 18:22:46.819

checkbox

I (1564) checkbox: State transition: CHECKBOX_STATE_INIT_HMI -> CHECKBOX_STATE_INIT_FILESYSTEM

2025-05-28 18:22:49.540

checkbox

I (4284) checkbox: State transition: CHECKBOX_STATE_INIT_FILESYSTEM -> CHECKBOX_STATE_INIT_FDM_CONFIG

2025-05-28 18:22:49.879

checkbox

I (4614) checkbox: State transition: CHECKBOX_STATE_INIT_FDM_CONFIG -> CHECKBOX_STATE_INIT_NETWORK

2025-05-28 18:22:52.617

checkbox

I (7354) checkbox: State transition: CHECKBOX_STATE_INIT_NETWORK -> CHECKBOX_STATE_INIT_FDM_FS_MOUNT

2025-05-28 18:22:53.605

checkbox

I (8334) checkbox: State transition: CHECKBOX_STATE_INIT_FDM_FS_MOUNT -> CHECKBOX_STATE_INIT_WAIT_ONLINE

2025-05-28 18:22:57.310

checkbox

I (12044) checkbox: State transition: CHECKBOX_STATE_INIT_WAIT_ONLINE -> CHECKBOX_STATE_INIT_NTP

2025-05-28 18:22:57.447

tick-tock

I (12194) tick-tock: Setting system time to 1748455260

2025-05-28 18:22:57.453

tick-tock

I (12194) tick-tock: Setting NTP server 0 to time.aws.com

2025-05-28 18:22:57.458

tick-tock

I (12194) tick-tock: Setting NTP server 1 to time.belnet.com

2025-05-28 18:22:57.464

tick-tock

I (12194) tick-tock: Initializing SNTP

2025-05-28 18:22:57.475

checkbox

I (12204) checkbox: State transition: CHECKBOX_STATE_INIT_NTP -> CHECKBOX_STATE_INIT_HTTP

2025-05-28 18:22:57.573

checkbox

I (12314) checkbox: State transition: CHECKBOX_STATE_INIT_HTTP -> CHECKBOX_STATE_INIT_AC

2025-05-28 18:22:57.668

checkbox

I (12414) checkbox: State transition: CHECKBOX_STATE_INIT_AC -> CHECKBOX_STATE_INIT_TAIGER

2025-05-28 18:22:58.456

tick-tock

I (13204) tick-tock: Network is online, connecting to SNTP server.

2025-05-28 18:22:58.782

checkbox

I (13524) checkbox: State transition: CHECKBOX_STATE_INIT_TAIGER -> CHECKBOX_STATE_WAIT_TAIGER

2025-05-28 18:22:58.877

checkbox

I (13624) checkbox: Taiger API notification: TAIGER_API_NOTIFICATION_WS_CONNECTED[1]

2025-05-28 18:23:03.732

tick-tock

I (18474) tick-tock: NTP synced - time is 2025-05-28T20:23:03Z

2025-05-28 18:23:13.790

checkbox

I (28534) checkbox: State transition: CHECKBOX_STATE_WAIT_TAIGER -> CHECKBOX_STATE_INIT_WAIT_NTP_SYNC

2025-05-28 18:23:13.889

checkbox

I (28634) checkbox: State transition: CHECKBOX_STATE_INIT_WAIT_NTP_SYNC -> CHECKBOX_STATE_PROVISIONING

2025-05-28 18:23:14.450

checkbox

I (29194) checkbox: Vault state: provisioned[1] valid[1]

2025-05-28 18:23:14.455

checkbox

I (29194) checkbox: Vault provisioning successful!

2025-05-28 18:23:14.464

checkbox

I (29194) checkbox: State transition: CHECKBOX_STATE_PROVISIONING -> CHECKBOX_STATE_INIT_MDNS

2025-05-28 18:23:14.565

checkbox

I (29304) checkbox: State transition: CHECKBOX_STATE_INIT_MDNS -> CHECKBOX_STATE_INIT_FDM

2025-05-28 18:23:14.661

checkbox

I (29404) checkbox: State transition: CHECKBOX_STATE_INIT_FDM -> CHECKBOX_STATE_INIT_POS

2025-05-28 18:23:14.844

checkbox

I (29584) checkbox: State transition: CHECKBOX_STATE_INIT_POS -> CHECKBOX_STATE_INIT_FOD

2025-05-28 18:23:16.413

checkbox

I (31144) checkbox: State transition: CHECKBOX_STATE_INIT_FOD -> CHECKBOX_STATE_INIT_APPROVE_FIRMWARE

2025-05-28 18:23:16.510

checkbox

I (31254) checkbox: Filesystem notification: FILE_MANAGER_NOTIFICATION_PLENTY_OF_SPACE[2]

2025-05-28 18:23:16.517

checkbox

W (31254) checkbox: Firmware upgrade verify pending!

2025-05-28 18:23:16.560

checkbox

I (31304) checkbox: State transition: CHECKBOX_STATE_INIT_APPROVE_FIRMWARE -> CHECKBOX_STATE_INIT_DONE

2025-05-28 18:23:16.669

checkbox

I (31404) checkbox: State transition: CHECKBOX_STATE_INIT_DONE -> CHECKBOX_STATE_OPERATIONAL

2025-05-28 18:23:17.394

fod-reg

I (32144) fod-reg: Startup state

2025-05-28 18:23:17.400

fod-reg

I (32144) fod-reg: No unsent events found, sending NOP

2025-05-28 18:23:17.400

fod-reg

I (32144) fod-reg: [NOP] Executing

2025-05-28 18:23:17.409

fod-reg

I (32144) fod-reg: State transition from FOD_REG_STATE_BOOT to FOD_REG_STATE_IDLE

2025-05-28 18:23:18.321

fod-reg

I (33064) fod-reg: [WS_NOP] HTTP callback type[2] status[200] response[len[3]]

2025-05-28 18:24:38.536

fod-reg

I (113274) fod-reg: State transition from FOD_REG_STATE_IDLE to FOD_REG_STATE_POPULATING

2025-05-28 18:24:39.426

fod-reg

I (114174) fod-reg: Collecting items until 262144 bytes

  1. Groen: NTP tijd synchronisatie
  2. Blauw: Valideer of er niet-verzonden transacties zijn, zoniet dan stuur een NOP
  3. Paars: Versturen van NOP operatie succesvol

Het failed-request rapport (met geslaagde call):

2025-05-28T18:23:17Z
Request POST https://secure.acc.gks2-0.be/business/reg
accept: application/json Content-Type: application/json
{"unsentEventCount":0,"fdmId":"CBX01000001","events":[]}
Reply 200
x-amzn-RequestId:f1eac004-eaa9-4343-8f03-8caf4c700c01x-amz-apigw-id:LSonhEm0FiAFbtQ=X-Amzn-Trace-Id:Root=1-68375496-d5c5fc2c1b9d485d67d8ade7content-type:application/jsoncontent-length:3date:Wed, 28 May 2025 18:23:17 GMT
{ }

niet verzonden transactie buffer - niet leeg

Voorafgaand was de Checkbox belast met het ondertekenen van binnenkomende POS-transacties via de /graphql-endpoint. Tijdens de herstart bevatte de Checkbox een buffer met nog niet verzonden transacties. In de onderstaande log verwachten we dat de Checkbox, in plaats van een NOP te versturen, begint met het ophalen en verzenden van de transacties uit deze buffer.

2025-05-28 18:25:14.795

checkbox

I (1425) checkbox: State transition: CHECKBOX_STATE_INIT_HW -> CHECKBOX_STATE_INIT_HMI

2025-05-28 18:25:14.887

checkbox

I (1535) checkbox: State transition: CHECKBOX_STATE_INIT_HMI -> CHECKBOX_STATE_INIT_FILESYSTEM

2025-05-28 18:25:17.603

checkbox

I (4245) checkbox: State transition: CHECKBOX_STATE_INIT_FILESYSTEM -> CHECKBOX_STATE_INIT_FDM_CONFIG

2025-05-28 18:25:17.937

checkbox

I (4575) checkbox: State transition: CHECKBOX_STATE_INIT_FDM_CONFIG -> CHECKBOX_STATE_INIT_NETWORK

2025-05-28 18:25:20.675

checkbox

I (7315) checkbox: State transition: CHECKBOX_STATE_INIT_NETWORK -> CHECKBOX_STATE_INIT_FDM_FS_MOUNT

2025-05-28 18:25:22.110

checkbox

I (8745) checkbox: State transition: CHECKBOX_STATE_INIT_FDM_FS_MOUNT -> CHECKBOX_STATE_INIT_WAIT_ONLINE

2025-05-28 18:25:25.407

checkbox

I (12055) checkbox: State transition: CHECKBOX_STATE_INIT_WAIT_ONLINE -> CHECKBOX_STATE_INIT_NTP

2025-05-28 18:25:25.555

tick-tock

I (12205) tick-tock: Setting system time to 1748456697

2025-05-28 18:25:25.560

tick-tock

I (12205) tick-tock: Setting NTP server 0 to time.aws.com

2025-05-28 18:25:25.566

tick-tock

I (12205) tick-tock: Setting NTP server 1 to time.belnet.com

2025-05-28 18:25:25.571

tick-tock

I (12205) tick-tock: Initializing SNTP

2025-05-28 18:25:25.583

checkbox

I (12215) checkbox: State transition: CHECKBOX_STATE_INIT_NTP -> CHECKBOX_STATE_INIT_HTTP

2025-05-28 18:25:25.681

checkbox

I (12325) checkbox: State transition: CHECKBOX_STATE_INIT_HTTP -> CHECKBOX_STATE_INIT_AC

2025-05-28 18:25:25.776

checkbox

I (12425) checkbox: State transition: CHECKBOX_STATE_INIT_AC -> CHECKBOX_STATE_INIT_TAIGER

2025-05-28 18:25:26.567

tick-tock

I (13215) tick-tock: Network is online, connecting to SNTP server.

2025-05-28 18:25:26.890

checkbox

I (13535) checkbox: State transition: CHECKBOX_STATE_INIT_TAIGER -> CHECKBOX_STATE_WAIT_TAIGER

2025-05-28 18:25:26.985

checkbox

I (13635) checkbox: Taiger API notification: TAIGER_API_NOTIFICATION_WS_CONNECTED[1]

2025-05-28 18:25:31.461

tick-tock

I (18105) tick-tock: NTP synced - time is 2025-05-28T20:25:31Z

2025-05-28 18:25:41.887

checkbox

I (28535) checkbox: State transition: CHECKBOX_STATE_WAIT_TAIGER -> CHECKBOX_STATE_INIT_WAIT_NTP_SYNC

2025-05-28 18:25:41.987

checkbox

I (28635) checkbox: State transition: CHECKBOX_STATE_INIT_WAIT_NTP_SYNC -> CHECKBOX_STATE_PROVISIONING

2025-05-28 18:25:43.506

checkbox

I (30155) checkbox: Vault state: provisioned[1] valid[1]

2025-05-28 18:25:43.511

checkbox

I (30155) checkbox: Vault provisioning successful!

2025-05-28 18:25:43.520

checkbox

I (30155) checkbox: State transition: CHECKBOX_STATE_PROVISIONING -> CHECKBOX_STATE_INIT_MDNS

2025-05-28 18:25:43.622

checkbox

I (30265) checkbox: State transition: CHECKBOX_STATE_INIT_MDNS -> CHECKBOX_STATE_INIT_FDM

2025-05-28 18:25:44.931

checkbox

I (31575) checkbox: State transition: CHECKBOX_STATE_INIT_FDM -> CHECKBOX_STATE_INIT_POS

2025-05-28 18:25:45.115

checkbox

I (31765) checkbox: State transition: CHECKBOX_STATE_INIT_POS -> CHECKBOX_STATE_INIT_FOD

2025-05-28 18:25:46.633

checkbox

I (33265) checkbox: State transition: CHECKBOX_STATE_INIT_FOD -> CHECKBOX_STATE_INIT_APPROVE_FIRMWARE

2025-05-28 18:25:46.727

checkbox

I (33375) checkbox: Filesystem notification: FILE_MANAGER_NOTIFICATION_PLENTY_OF_SPACE[2]

2025-05-28 18:25:46.739

checkbox

I (33375) checkbox: State transition: CHECKBOX_STATE_INIT_APPROVE_FIRMWARE -> CHECKBOX_STATE_INIT_DONE

2025-05-28 18:25:46.846

checkbox

I (33485) checkbox: State transition: CHECKBOX_STATE_INIT_DONE -> CHECKBOX_STATE_OPERATIONAL

2025-05-28 18:25:47.612

fod-reg

I (34265) fod-reg: Startup state

2025-05-28 18:25:47.617

fod-reg

I (34265) fod-reg: Unsent events found, starting to populate outbox

2025-05-28 18:25:47.622

fod-reg

I (34265) fod-reg: State transition from FOD_REG_STATE_BOOT to FOD_REG_STATE_POPULATING

2025-05-28 18:25:48.613

fod-reg

I (35265) fod-reg: Collecting items until 262144 bytes

2025-05-28 18:25:48.666

fod-reg

I (35315) fod-reg: Processing unsent business event uid[2578012444] is_valid[1] len[1955]

2025-05-28 18:25:48.714

fod-reg

I (35355) fod-reg: Processing unsent business event uid[3114032162] is_valid[1] len[1754]

2025-05-28 18:25:48.774

fod-reg

I (35415) fod-reg: Processing unsent business event uid[1195106799] is_valid[1] len[2197]

2025-05-28 18:25:48.821

fod-reg

I (35465) fod-reg: Processing unsent business event uid[3816669867] is_valid[1] len[1451]

2025-05-28 18:25:48.828

fod-reg

I (35465) fod-reg: State transition from FOD_REG_STATE_POPULATING to FOD_REG_STATE_QUEUE_WAIT

2025-05-28 18:25:49.812

fod-reg

I (36465) fod-reg: Collecting items until 262144 bytes

2025-05-28 18:25:49.817

fod-reg

I (36465) fod-reg: - Postpone is not enabled, proceeding ...

2025-05-28 18:25:49.823

fod-reg

I (36465) fod-reg: Ready to register unsent transactions

2025-05-28 18:25:49.828

fod-reg

I (36465) fod-reg: Messages remaining in unsent queue: 4

2025-05-28 18:25:49.834

fod-reg

I (36465) fod-reg: Bundle for FOD assembled items[4] size[7/256kB]

2025-05-28 18:25:49.842

fod-reg

I (36475) fod-reg: State transition from FOD_REG_STATE_QUEUE_WAIT to FOD_REG_STATE_READY

2025-05-28 18:25:50.838

fod-reg

I (37485) fod-reg: State transition from FOD_REG_STATE_READY to FOD_REG_STATE_SENDING

2025-05-28 18:25:51.641

fod-reg

I (38285) fod-reg: [WS_REG] HTTP callback type[1] status[200] response[len[3]]

2025-05-28 18:25:51.646

fod-reg

I (38285) fod-reg: State transition from FOD_REG_STATE_SENDING to FOD_REG_STATE_SENT

2025-05-28 18:25:51.833

fod-reg

I (38485) fod-reg: POS events sent, marking as sent

2025-05-28 18:25:52.572

fod-reg

I (39215) fod-reg: State transition from FOD_REG_STATE_SENT to FOD_REG_STATE_IDLE

  1. Groen: NTP tijd synchronisatie
  2. Blauw: Valideer of er niet-verzonden transacties zijn, start ophalen van niet verzonden transacties
  3. Paars: Bundel en verstuur de niet verzonden transacties

Het (niet) failed-request rapport:

2025-05-28T18:25:50Z
Request POST https://secure.acc.gks2-0.be/business/reg
accept: application/json Content-Type: application/json
{"unsentEventCount":4,"fdmId":"CBX01000001","events": [{"enrichedEventData":{"bookingDate":"2024-07-30","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":6,"deviceId":"1631678d-7a85-4ac3-b296-bb4565e873fe","employeeId":"84022899837","estNo":"2000000042","eventCounter":25310,"eventLabel":"N","eventOperation":"SALE","fdmDateTime":"2025-05-28T18:24:56.257Z","fdmId":"CBX01000001","fdmRefs":[{"eventCounter":1000,"eventLabel":"N","fdmDateTime":"2025-05-28T18:24:56Z","fdmId":"FOD01000001","totalCounter":1200}],"fdmSwVersion":"0.1.4+dev+","financials":[{"amount":52,"amountType":"PAYMENT","drawer":{},"id":"1","inputMethod":"MANUAL","name":"CONTANT","type":"CASH"}],"language":"NL","posDateTime":"2025-05-28T18:24:56Z","posFiscalTicketNo":1001,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"TER-2-DIN","ticketMedium":"PAPER","totalCounter":122346,"transaction":{"transactionLines":[{"lineTotal":-24,"lineType":"SINGLE_PRODUCT","mainProduct":{"departmentId":"10","departmentName":"Aperitifs","negQuantityReason":"REFUND","productId":"10006","productName":"Dry Martini","quantity":-2,"quantityType":"PIECE","unitPrice":12,"vats":[{"label":"A","price":-24,"priceChanges":[]}]},"subProducts":[]},{"lineTotal":-28,"lineType":"SINGLE_PRODUCT","mainProduct":{"departmentId":"22","departmentName":"Main Dishes","negQuantityReason":"REFUND","productId":"22001","productName":"Burger of the Chef","quantity":-1,"quantityType":"PIECE","unitPrice":28,"vats":[{"label":"B","price":-28,"priceChanges":[]}]},"subProducts":[]}],"transactionTotal":-52},"vatCalc":[{"label":"A","outOfScope":false,"rate":21,"taxableAmount":-19.83,"totalAmount":-24,"vatAmount":-4.17},{"label":"B","outOfScope":false,"rate":12,"taxableAmount":-25,"totalAmount":-28,"vatAmount":-3}],"vatNo":"BE0000000097"},"digitalSignature":"MEUCIF8qyOQk6t8pD4aytHhbI70Uspw9zNliTxA7yM+idge1AiEAjTSO0R80rcgq+yiQI5g6Ca2X/UCvMfXP/yRhA/fM3DU=","shortSignature":"c7cf764a9be1b9eec1de38a1a029e320b83ee564","fdmLocalisation":{}},{"enrichedEventData":{"bookingDate":"2024-07-30","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":7,"deviceId":"1631678d-7a85-4ac3-b296-bb4565e873fe","employeeId":"84022899837","estNo":"2000000042","eventCounter":25311,"eventLabel":"N","eventOperation":"SALE","fdmDateTime":"2025-05-28T18:24:57.208Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+dev+","financials":[{"amount":52,"amountType":"PAYMENT","drawer":{},"id":"1","inputMethod":"MANUAL","name":"CONTANT","type":"CASH"}],"language":"NL","posDateTime":"2025-05-28T18:24:57Z","posFiscalTicketNo":6587,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"TER-2-DIN","ticketMedium":"PAPER","totalCounter":122347,"transaction":{"transactionLines":[{"lineTotal":24,"lineType":"SINGLE_PRODUCT","mainProduct":{"departmentId":"10","departmentName":"Aperitifs","productId":"10006","productName":"Dry Martini","quantity":2,"quantityType":"PIECE","unitPrice":12,"vats":[{"label":"A","price":24,"priceChanges":[]}]},"subProducts":[]},{"lineTotal":28,"lineType":"SINGLE_PRODUCT","mainProduct":{"departmentId":"22","departmentName":"Main Dishes","productId":"22001","productName":"Burger of the Chef","quantity":1,"quantityType":"PIECE","unitPrice":28,"vats":[{"label":"B","price":28,"priceChanges":[]}]},"subProducts":[]}],"transactionTotal":52},"vatCalc":[{"label":"A","outOfScope":false,"rate":21,"taxableAmount":19.83,"totalAmount":24,"vatAmount":4.17},{"label":"B","outOfScope":false,"rate":12,"taxableAmount":25,"totalAmount":28,"vatAmount":3}],"vatNo":"BE0000000097"},"digitalSignature":"MEQCIH1KSW5bBXQzrbFKGmWv9ZufAQCNc033YluSRvGmYzbjAiAM2UbRTZJak4tTr+xwUFhOKCQSpIDQwjky0N79tS+fwA==","shortSignature":"9a3e1b84eb643e228d3bb11ae6102498b0cb31c8","fdmLocalisation":{}},{"enrichedEventData":{"bookingDate":"2024-07-30","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":8,"deviceId":"b54a614f-39cc-4a7b-bd9f-aa6b693d769c","employeeId":"84022899837","estNo":"2000000042","eventCounter":25312,"eventLabel":"N","eventOperation":"SALE","fdmDateTime":"2025-05-28T18:24:57.612Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+dev+","financials":[{"amount":1.04,"amountType":"PAYMENT","drawer":{},"id":"1","inputMethod":"MANUAL","name":"CONTANT","type":"CASH"},{"amount":0.01,"amountType":"TIP","drawer":{},"id":"1","inputMethod":"MANUAL","name":"CONTANT","type":"CASH"}],"language":"NL","posDateTime":"2025-05-28T18:24:57Z","posFiscalTicketNo":6603,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"TER-1-BAR","ticketMedium":"PAPER","totalCounter":122348,"transaction":{"transactionLines":[{"lineTotal":-12,"lineType":"SINGLE_PRODUCT","mainProduct":{"departmentId":"10","departmentName":"Aperitifs","negQuantityReason":"REFUND","productId":"10006","productName":"Dry Martini","quantity":-1,"quantityType":"PIECE","unitPrice":12,"vats":[{"label":"A","price":-12,"priceChanges":[]}]},"subProducts":[]},{"lineTotal":3.04,"lineType":"SINGLE_PRODUCT","mainProduct":{"departmentId":"10","departmentName":"Aperitifs","productId":"12009","productName":"Coca Cola","quantity":1,"quantityType":"PIECE","unitPrice":3.04,"vats":[{"label":"A","price":3.04,"priceChanges":[]}]},"subProducts":[]},{"lineTotal":11.52,"lineType":"SINGLE_PRODUCT","mainProduct":{"departmentId":"25","departmentName":"Desserts","productId":"25008","productName":"Crème Brûlée","quantity":1,"quantityType":"PIECE","unitPrice":11.52,"vats":[{"label":"B","price":11.52,"priceChanges":[]}]},"subProducts":[]}],"transactionTotal":2.56},"vatCalc":[{"label":"A","outOfScope":false,"rate":21,"taxableAmount":-7.4,"totalAmount":-8.96,"vatAmount":-1.56},{"label":"B","outOfScope":false,"rate":12,"taxableAmount":10.29,"totalAmount":11.52,"vatAmount":1.23}],"vatNo":"BE0000000097"},"digitalSignature":"MEUCIHBZ/kFbitGnnTDMO7Aq0Zd6qoVazce6Ys+1Gm0baMAeAiEAhdYQCWaGEKtQYVq7QZfQReLJscGKstRa8PNlXDuUTTw=","shortSignature":"906dd483756d8dfa147ed6e82b104ad3184e09bc","fdmLocalisation":{}},{"enrichedEventData":{"bookingDate":"2024-07-30","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":9,"costCenter":{"id":"T1","reference":"O158","type":"TABLE"},"deviceId":"b54a614f-39cc-4a7b-bd9f-aa6b693d769c","employeeId":"75061189702","estNo":"2000000042","eventCounter":18712,"eventLabel":"P","eventOperation":"ORDER","fdmDateTime":"2025-05-28T18:24:58.550Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+dev+","language":"NL","posDateTime":"2025-05-28T18:24:58Z","posFiscalTicketNo":1003,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"TER-1-BAR","ticketMedium":"PAPER","totalCounter":122349,"transaction":{"transactionLines":[{"lineTotal":24,"lineType":"SINGLE_PRODUCT","mainProduct":{"departmentId":"10","departmentName":"Aperitifs","productId":"10006","productName":"Dry Martini","quantity":2,"quantityType":"PIECE","unitPrice":12,"vats":[{"label":"A","price":24,"priceChanges":[]}]},"subProducts":[]},{"lineTotal":13.36,"lineType":"SINGLE_PRODUCT","mainProduct":{"departmentId":"22","departmentName":"Main Dishes","productId":"28007","productName":"Tapas variation","quantity":4,"quantityType":"PIECE","unitPrice":3.34,"vats":[{"label":"B","price":13.36,"priceChanges":[]}]},"subProducts":[]}],"transactionTotal":37.36},"vatNo":"BE0000000097"},"digitalSignature":"MEQCIGALKXdrfkStGFsKdh194l27j/gCtnPf3IqZSvQpYtLPAiA2SylQeoY/PHHEZzyVOdPVRyOTqPumXkDipiIr6oP8FQ==","shortSignature":"","fdmLocalisation":{}}]}
Reply 200
x-amzn-RequestId:38bd01ea-96bb-4fd7-be21-5b037e738c47x-amz-apigw-id:LSo_eF65liAFhaw=X-Amzn-Trace-Id:Root=1-6837552f-1861064ff2c3229b78454db7content-type:application/jsoncontent-length:3date:Wed, 28 May 2025 18:25:50 GMT
{ }

FODFIN-Cloud

Ontvangen en verzenden van business transacties

Buffering

Bestandsstructuur met Bucket-systeem (FAT32)

Dit systeem implementeert een persistente, bestand-gebaseerde FIFO-structuur op een FAT32-bestandssysteem, geschikt voor embedded toepassingen zoals ESP32.
Het systeem is ontworpen om:

  • Grote hoeveelheden events te bufferen op SD-kaart
  • Efficiënte toegang te bieden met beperkte resources
  • FIFO-queue gedrag te combineren met robuuste opslag en herstelbaarheid

Zo zijn er 2 apart beheerde data structuren, voor de niet-verzonden en de verzonden transacties.

De kern van het systeem is het indexbestand, dat de status van de FIFO bijhoudt.
Elke entry in dit bestand stelt een event voor, en bevat:

Veld

Beschrijving

Timestamp

Tijdstip van het event

UID

Unieke identifier voor het event

X-bytes metadata

Event-specifieke informatie (bv. type, flags, …)

Pad naar datafile

Relatief pad naar bijhorende datafile

Data length

Lengte van de payload in de datafile

MD5 hash datafile

Verificatiewaarde van de eventdata

MD5 hash index entry

Verificatiewaarde van de gehele index entry

Daarnaast houdt het indexbestand ook bij:

  • De head en tail van de queue
  • maximum fifo elementen

Om bestandstoegang op FAT32 efficiënt te houden, worden datafiles georganiseerd in een hiërarchisch bucket-systeem met twee niveaus:

/<base_path>/<bucket>/<subdir>/F<index>.DAT

Niveau

Aantal

Naamformaat

8.3-conform?

Opmerking

base_path

 

 

 

Naam van fifo (ubt / sbt)

Bucket (1e)

max. 100

00

99

Ja

Verdeelt in blokken van 10.000 files

Subdir (2e)

max. 100

00

99

Ja

max. 100 files per directory

Bestand

per event

F<index>.DAT

Ja

Bestandsnaam is globaal uniek waar index de head van de FIFO is

Dit beperkt:

  • Het aantal bestanden per directory (max 100)
  • Het aantal directories per parent directory (max 100)
  • Lookup-tijd, RAM-verbruik en SD-kaart latentie
Het systeem combineert een persistente FIFO-queue op bestandssysteemniveau met een geoptimaliseerde FAT32-directorystructuur, waarbij het indexbestand elk event beschrijft aan de hand van tijd, identiteit, pad, lengte, metadata en checksums. Dankzij het tweelaags bucket-systeem blijven toegangstijden laag, zelfs bij zeer grote aantallen events.

Bewijsstukken

de voorrang voor het versturen van de oudste transacties

2025-05-28 18:25:51.833

fod-reg

I (38485) fod-reg: POS events sent, marking as sent

2025-05-28 18:25:51.870

file-fifo

I (38515) file-fifo: File copy completed: /sdcard/sig/u/26/21/u262115.dat -> /sdcard/sig/s/26/21/s262115.dat

2025-05-28 18:25:52.022

file-fifo

I (38665) file-fifo: File copy completed: /sdcard/sig/u/26/21/u262116.dat -> /sdcard/sig/s/26/21/s262116.dat

2025-05-28 18:25:52.237

file-fifo

I (38875) file-fifo: File copy completed: /sdcard/sig/u/26/21/u262117.dat -> /sdcard/sig/s/26/21/s262117.dat

2025-05-28 18:25:52.459

file-fifo

I (39105) file-fifo: File copy completed: /sdcard/sig/u/26/21/u262118.dat -> /sdcard/sig/s/26/21/s262118.dat

Boven staande logs toont aan de FIFO, op basis van index nummer in bestandsnaam, van oud naar naar nieuw verwerkt (index nummers zijn oplopend dus het oudste bestand heeft het laagste index nummer)

het bufferen van de volledige business transactie

Voor debug redenen wordt er meer den enkel de enriched transactie opgeslaan:

Naam

JSON-veld

Beschrijving

request

requestData

De ontvangen request

request - timestamp

requestTime

Het tijdstip van de ontvangen request

response

resultData

Het sign-result met enkel de gevraagde velden (volgens GraphQL)

response - timestamp

resultTime

Het tijdstip van antwoorden naar POS

enriched - data

rawEnriched

Het enriched object, bestemd voor FODFIN-Cloud

Sign result

rawSignResult

Voor de afhandeling van duplicaten slaan we de volledige versie van het sign result op.

Hash key-velden

keyHash

MD5 hash van de key-velden uit de request. Bij het ontvangen van nieuwe events (binnen 10 min) wordt deze gebruikt om duplicate request te onderscheppen

Hash data-velden

dataInHash

De berkende MD5 hash van de data velden.

{
   "keyHash": "269cd47126715fb8e20741e8640dc7bc",
   "dataInHash": "89fbee8e287f31e07aa824cb69f39823",
   "eventOperation": 10,
   "requestTime": "2025-05-27T00:52:21.876Z",
   "requestData": {
      "query": "mutation SignCopy($data: CopyInput!, $training: Boolean! = false) { signCopy(data: $data, isTraining: $training) { __typename bufferCapacityUsed deviceId digitalSignature eventOperation fdmRef { __typename fdmId fdmDateTime eventLabel eventCounter totalCounter } fdmSwVersion posDateTime posFiscalTicketNo posId shortSignature terminalId vatCalc { __typename label outOfScope rate taxableAmount totalAmount vatAmount } verificationUrl warnings { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } informations { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } footer } }",
      "operationName": "SignCopy",
      "variables": {
         "data": {
            "fdmRef": {
               "fdmId": "FOD01000001",
               "fdmDateTime": "2024-07-09T09:48:04Z",
               "eventLabel": "N",
               "eventCounter": 16,
               "totalCounter": 52
            },
            "language": "NL",
            "vatNo": "BE0000000097",
            "estNo": "2000000042",
            "posId": "CPOS0031234567",
            "posFiscalTicketNo": 1013,
            "posDateTime": "2025-05-27T00:52:21Z",
            "posSwVersion": "1.8.3",
            "terminalId": "TER-1-BAR",
            "deviceId": "b54a614f-39cc-4a7b-bd9f-aa6b693d769c",
            "bookingPeriodId": "dffcd829-a0e5-41ca-a0ae-9eb887f95637",
            "bookingDate": "2024-07-30",
            "ticketMedium": "PAPER",
            "employeeId": "75061189702"
         },
         "training": false
      }
   },
   "resultTime": "2025-05-27T00:52:21.898Z",
   "resultData": {
      "data": {
         "signCopy": {
            "__typename": "SignResult",
            "bufferCapacityUsed": 1.9,
            "deviceId": "b54a614f-39cc-4a7b-bd9f-aa6b693d769c",
            "digitalSignature": "YWJjZGVmMTIzNDU2Nzg5MGZha2VoYXNoMDk4NzY1NDMyMWZlZGNiYQ==",
            "eventOperation": "COPY",
            "fdmRef": {
               "__typename": "FdmReference",
               "fdmId": "CBX01000019",
               "fdmDateTime": "2025-05-27T00:52:21.876Z",
               "eventLabel": "C",
               "eventCounter": 1005,
               "totalCounter": 10052
            },
            "fdmSwVersion": "0.1.5-rc.2",
            "posDateTime": "2025-05-27T00:52:21Z",
            "posFiscalTicketNo": 1013,
            "posId": "CPOS0031234567",
            "shortSignature": null,
            "terminalId": "TER-1-BAR",
            "vatCalc": null,
            "verificationUrl": null,
            "warnings": null,
            "informations": null,
            "footer": []
         }
      }
   },
   "rawEnriched": {
      "enrichedEventData": {
         "bookingDate": "2024-07-30",
         "bookingPeriodId": "dffcd829-a0e5-41ca-a0ae-9eb887f95637",
         "bufferCapacityUsed": 1.9,
         "copyOfEvent": "N",
         "deviceId": "b54a614f-39cc-4a7b-bd9f-aa6b693d769c",
         "employeeId": "75061189702",
         "estNo": "2000000042",
         "eventCounter": 1005,
         "eventLabel": "C",
         "eventOperation": "COPY",
         "fdmDateTime": "2025-05-27T00:52:21.876Z",
         "fdmId": "CBX01000019",
         "fdmRefs": [
            {
               "eventCounter": 16,
               "eventLabel": "N",
               "fdmDateTime": "2024-07-09T09:48:04Z",
               "fdmId": "FOD01000001",
               "totalCounter": 52
            }
         ],
         "fdmSwVersion": "0.1.5-rc.2",
         "language": "NL",
         "posDateTime": "2025-05-27T00:52:21Z",
         "posFiscalTicketNo": 1013,
         "posId": "CPOS0031234567",
         "posSwVersion": "1.8.3",
         "terminalId": "TER-1-BAR",
         "ticketMedium": "PAPER",
         "totalCounter": 10052,
         "vatNo": "BE0000000097"
      },
      "digitalSignature": "YWJjZGVmMTIzNDU2Nzg5MGZha2VoYXNoMDk4NzY1NDMyMWZlZGNiYQ==",
      "shortSignature": "",
      "fdmLocalisation": {}
   },
   "rawSignResult": {
      "posId": "CPOS0031234567",
      "posFiscalTicketNo": 1013,
      "posDateTime": "2025-05-27T00:52:21Z",
      "terminalId": "TER-1-BAR",
      "deviceId": "b54a614f-39cc-4a7b-bd9f-aa6b693d769c",
      "eventOperation": "COPY",
      "fdmRef": {
         "fdmId": "CBX01000019",
         "fdmDateTime": "2025-05-27T00:52:21.876Z",
         "eventLabel": "C",
         "eventCounter": 1005,
         "totalCounter": 10052
      },
      "fdmSwVersion": "0.1.5-rc.2",
      "digitalSignature": "YWJjZGVmMTIzNDU2Nzg5MGZha2VoYXNoMDk4NzY1NDMyMWZlZGNiYQ==",
      "bufferCapacityUsed": 1.899999976158142
   }
}

het bijhouden van de timestamp van de laatste succesvolle verzending

Uit de logs blijkt dit het laatste moment te zijn dat de Checkbox een transactie had verzonden naar FODFIN-Cloud

2025-05-28 18:25:50.838

fod-reg

I (37485) fod-reg: State transition from FOD_REG_STATE_READY to FOD_REG_STATE_SENDING

2025-05-28 18:25:50.843

http

I (37485) http: Received http request to https://secure.acc.gks2-0.be/business/reg

2025-05-28 18:25:51.537

http

I (38185) http: Request to https://secure.acc.gks2-0.be/business/reg ready

2025-05-28 18:25:51.641

fod-reg

I (38285) fod-reg: [WS_REG] HTTP callback type[1] status[200] response[len[3]]

2025-05-28 18:25:51.646

fod-reg

I (38285) fod-reg: State transition from FOD_REG_STATE_SENDING to FOD_REG_STATE_SENT

2025-05-28 18:25:51.833

fod-reg

I (38485) fod-reg: POS events sent, marking as sent

2025-05-28 18:25:51.870

file-fifo

I (38515) file-fifo: File copy completed: /sdcard/sig/u/26/21/u262115.dat -> /sdcard/sig/s/26/21/s262115.dat

2025-05-28 18:25:52.022

file-fifo

I (38665) file-fifo: File copy completed: /sdcard/sig/u/26/21/u262116.dat -> /sdcard/sig/s/26/21/s262116.dat

2025-05-28 18:25:52.237

file-fifo

I (38875) file-fifo: File copy completed: /sdcard/sig/u/26/21/u262117.dat -> /sdcard/sig/s/26/21/s262117.dat

2025-05-28 18:25:52.459

file-fifo

I (39105) file-fifo: File copy completed: /sdcard/sig/u/26/21/u262118.dat -> /sdcard/sig/s/26/21/s262118.dat

Na reboot blijkt:

2025-05-28 20:58:36.229

file-manager-local-config

I (4395) file-manager-local-config: Loading fod-config from file: /sdcard/par/lc-sa.txt

2025-05-28 20:58:36.234

fdm-config

I (4405) fdm-config: Local config loaded

2025-05-28 20:58:36.235

fdm-config

I (4405) fdm-config: NTP1: time.aws.com

2025-05-28 20:58:36.240

fdm-config

I (4405) fdm-config: NTP2: time.belnet.com

2025-05-28 20:58:36.245

fdm-config

I (4405) fdm-config: POS bearer token: Lyly0HIjourgbgFO

2025-05-28 20:58:36.246

fdm-config

I (4405) fdm-config: Status:

2025-05-28 20:58:36.251

fdm-config

I (4405) fdm-config: FDM init: false

2025-05-28 20:58:36.257

fdm-config

I (4415) fdm-config: FDM last action: 1748464293

2025-05-28 20:58:36.262

fdm-config

I (4415) fdm-config: FDM last successful transaction: 1748456751

Waar epoch tijd 1748456751staat voor 2025-05-28T18:25:51.000Z.

FODFIN-Cloud

FDM service onderbreking

FDM-POS mismatch

2025-05-28 20:59:03.234

fod-query

I (31395) fod-query: Action "SET_POS_ALLOWLIST" success

2025-05-28 20:59:03.229

fdm-config

I (31385) fdm-config: -CFOD0010000100

2025-05-28 20:59:03.224

fdm-config

I (31385) fdm-config: -CPOS0031234568

2025-05-28 20:59:03.224

fdm-config

I (31385) fdm-config: -CPOS0031234567

Bovenstaande logging toont aan dat de volgende POS IDs toegelaten zijn CFOD0010000100, CPOS0031234568 en CPOS0031234567

  • Work-in met toegelaten POS ID:
--- Request ---
{"query":"mutation SignWorkIn($data: WorkInOutInput!, $training: Boolean! = false) { signWorkIn(data: $data, isTraining: $training) { __typename posId posFiscalTicketNo posDateTime terminalId deviceId fdmSwVersion eventOperation digitalSignature bufferCapacityUsed fdmRef { __typename fdmId fdmDateTime eventLabel eventCounter totalCounter } warnings { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } informations { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value
} } } footer } }","operationName":"SignWorkIn","variables":{"data":{"language":"NL","vatNo":"BE0000000097","estNo":"2000000042","posId":"CPOS0031234567","posFiscalTicketNo":1010,"posDateTime":"2025-05-28T22:02:47+00:00","posSwVersion":"1.8.3","terminalId":"POS-2-REC","deviceId":"80:1A:A6:75:66:FC","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bookingDate":"2024-10-04","ticketMedium":"NONE","employeeId":"80113078968"},"training":true}}

--- Response ---
{"data":{"signWorkIn":{"__typename":"SignResult","posId":"CPOS0031234567","posFiscalTicketNo":1010,"posDateTime":"2025-05-28T22:02:47+00:00","terminalId":"POS-2-REC","deviceId":"80:1A:A6:75:66:FC","fdmSwVersion":"0.1.4+dev+","eventOperation":"WORK_IN","digitalSignature":"MEUCIDKZEvjr41/DF0WiYnRj6kbaSHID2hlDeFFCgi1j/8hyAiEA5oAgSPUopY2AKtYbetuC4TtphTM5wqfvLUe+z4VvEt4=","bufferCapacityUsed":0,"fdmRef":{"__typename":"FdmReference","fdmId":"CBX01000001","fdmDateTime":"2025-05-28T22:02:47.184Z","eventLabel":"T","eventCounter":18164,"totalCounter":122351},"warnings":null,"informations":null,"footer":["FPS FIN Footer 1","ParamsVerion: 2025-04-17T13:52:05Z"]}}}
200
--- End of Response ---
  • Work-in met toegelaten POS ID:
--- Request ---
{"query":"mutation SignWorkIn($data: WorkInOutInput!, $training: Boolean! = false)
{ signWorkIn(data: $data, isTraining: $training) { __typename posId posFiscalTicketNo posDateTime terminalId deviceId fdmSwVersion eventOperation digitalSignature bufferCapacityUsed fdmRef { __typename fdmId fdmDateTime eventLabel eventCounter totalCounter } warnings { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } informations { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } footer } }","operationName":"SignWorkIn","variables":{"data":{"language":"NL","vatNo":"BE0000000097","estNo":"2000000042","posId":"CPOS8888888888","posFiscalTicketNo":1010,"posDateTime":"2025-05-28T22:20:03+00:00","posSwVersion":"1.8.3","terminalId":"POS-2-REC","deviceId":"80:1A:A6:75:66:FC","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bookingDate":"2024-10-04","ticketMedium":"NONE","employeeId":"80113078968"},"training":true}}

--- Response ---
{"errors":[{"message":"POS is niet geregistreerd voor gebruik met deze FDM","extensions":{"category":"FDM","code":"UNKNOWN_POS","showPos":"MANDATORY"}}]}
200
--- End of Response ---

Wanneer de Checkbox een event van een POS ontvangt met een POS-ID dat niet in de POS-allowlist staat, wordt dit niet verwerkt en krijgt de afzender als respons een GraphQL-error met UNKNOWN_POS.

FDM buffer limiet

Om aan te tonen dat de warning BUFFER_NEAR_FULL geactiveerd wordt zodra de buffer voor meer dan 70 % gevuld is, en de error optreedt wanneer de buffer vol raakt, is de onderstaande configuratie gebruikt:

Init Interval: 345600
Nop Interval: 600
Max Buffer: 5
Query Interval: 1800
Retry Intervals: 7
  0: 5
  1: 60
  2: 300
  3: 300
  4: 300
  5: 3600
  6: 10800
Retry Intervals Init: 7
  0: 5
  1: 60
  2: 300
  3: 300
  4: 300
  5: 3600
  6: 10800
Max Msg Size: 256
Postpone: true
Default Max Calls: 0
Max Calls:
Footer:
  - FPS FIN Footer 1
  - ParamsVerion: 2025-04-17T13:52:05Z

Buffer < 70%

Workin request waar buffer onder 70% is

request:

{
   "query": "mutation SignWorkIn($data: WorkInOutInput!, $training: Boolean! = false) { signWorkIn(data: $data, isTraining: $training) { __typename posId posFiscalTicketNo posDateTime terminalId deviceId fdmSwVersion eventOperation digitalSignature bufferCapacityUsed fdmRef { __typename fdmId fdmDateTime eventLabel eventCounter totalCounter } warnings { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } informations { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } footer }}",
   "operationName": "SignWorkIn",
   "variables": {
      "data": {
         "language": "NL",
         "vatNo": "BE0000000097",
         "estNo": "2000000042",
         "posId": "CPOS0031234567",
         "posFiscalTicketNo": 1010,
         "posDateTime": "2025-06-01T19:25:54+00:00",
         "posSwVersion": "1.8.3",
         "terminalId": "POS-2-REC",
         "deviceId": "80:1A:A6:75:66:FC",
         "bookingPeriodId": "dffcd829-a0e5-41ca-a0ae-9eb887f95637",
         "bookingDate": "2024-10-04",
         "ticketMedium": "NONE",
         "employeeId": "80113078968"
      },
      "training": true
   }
}

Response:

{
   "data": {
      "signWorkIn": {
         "__typename": "SignResult",
         "posId": "CPOS0031234567",
         "posFiscalTicketNo": 1010,
         "posDateTime": "2025-06-01T18:51:36+00:00",
         "terminalId": "POS-2-REC",
         "deviceId": "80:1A:A6:75:66:FC",
         "fdmSwVersion": "0.1.4+feat",
         "eventOperation": "WORK_IN",
         "digitalSignature": "MEYCIQD+zxl6swppPhjAWehAeA2EHyPB2fvNu9q2FMO+YHEjaQIhAJgrgWYq0WFVhZWyOsLE1CgCImumfHMOGHLbLPTSo3j9",
         "bufferCapacityUsed": 40,
         "fdmRef": {
            "__typename": "FdmReference",
            "fdmId": "CBX01000001",
            "fdmDateTime": "2025-06-01T18:51:36.681Z",
            "eventLabel": "T",
            "eventCounter": 18168,
            "totalCounter": 122355
         },
         "warnings": null,
         "informations": null,
         "footer": [
            "FPS FIN Footer 1",
            "ParamsVerion: 2025-04-17T13:52:05Z"
         ]
      }
   }
}

Buffer > 70%

Request

{
   "query": "mutation SignWorkIn($data: WorkInOutInput!, $training: Boolean! = false) { signWorkIn(data: $data, isTraining: $training) { __typename posId posFiscalTicketNo posDateTime terminalId deviceId fdmSwVersion eventOperation digitalSignature bufferCapacityUsed fdmRef { __typename fdmId fdmDateTime eventLabel eventCounter totalCounter } warnings { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } informations { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } footer } }",
   "operationName": "SignWorkIn",
   "variables": {
      "data": {
         "language": "NL",
         "vatNo": "BE0000000097",
         "estNo": "2000000042",
         "posId": "CPOS0031234567",
         "posFiscalTicketNo": 1010,
         "posDateTime": "2025-06-01T19:35:33+00:00",
         "posSwVersion": "1.8.3",
         "terminalId": "POS-2-REC",
         "deviceId": "80:1A:A6:75:66:FC",
         "bookingPeriodId": "dffcd829-a0e5-41ca-a0ae-9eb887f95637",
         "bookingDate": "2024-10-04",
         "ticketMedium": "NONE",
         "employeeId": "80113078968"
      },
      "training": true
   }
}

Response:

{
   "data": {
      "signWorkIn": {
         "__typename": "SignResult",
         "posId": "CPOS0031234567",
         "posFiscalTicketNo": 1010,
         "posDateTime": "2025-06-01T19:35:33+00:00",
         "terminalId": "POS-2-REC",
         "deviceId": "80:1A:A6:75:66:FC",
         "fdmSwVersion": "0.1.4+feat",
         "eventOperation": "WORK_IN",
         "digitalSignature": "MEUCIQDzkRGGCyyivLgqZRQY6BRU63PtAQNYKQDDmOoxDZsFOwIgCKp5kmiPhBbHQtZnHXafJFX14L8YX3TQzOomNnk9Xmo=",
         "bufferCapacityUsed": 80,
         "fdmRef": {
            "__typename": "FdmReference",
            "fdmId": "CBX01000001",
            "fdmDateTime": "2025-06-01T19:35:33.215Z",
            "eventLabel": "T",
            "eventCounter": 18170,
            "totalCounter": 122357
         },
         "warnings": [
            {
               "__typename": "MessageItem",
               "message": "FDM-buffergebruik overschrijdt 70 %",
               "locations": null,
               "extensions": {
                  "__typename": "ExtensionItem",
                  "category": "SPF_FOD",
                  "code": "BUFFER_NEAR_FULL",
                  "showPos": "MANDATORY",
                  "data": null
               }
            }
         ],
         "informations": null,
         "footer": [
            "FPS FIN Footer 1",
            "ParamsVerion: 2025-04-17T13:52:05Z"
         ]
      }
   }
}

Buffer == 100%

Request

{
   "query": "mutation SignWorkIn($data: WorkInOutInput!, $training: Boolean! = false) { signWorkIn(data: $data, isTraining: $training) { __typename posId posFiscalTicketNo posDateTime terminalId deviceId fdmSwVersion eventOperation digitalSignature bufferCapacityUsed fdmRef { __typename fdmId fdmDateTime eventLabel eventCounter totalCounter } warnings { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } informations { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } footer } }",
   "operationName": "SignWorkIn",
   "variables": {
      "data": {
         "language": "NL",
         "vatNo": "BE0000000097",
         "estNo": "2000000042",
         "posId": "CPOS0031234567",
         "posFiscalTicketNo": 1010,
         "posDateTime": "2025-06-01T19:36:58+00:00",
         "posSwVersion": "1.8.3",
         "terminalId": "POS-2-REC",
         "deviceId": "80:1A:A6:75:66:FC",
         "bookingPeriodId": "dffcd829-a0e5-41ca-a0ae-9eb887f95637",
         "bookingDate": "2024-10-04",
         "ticketMedium": "NONE",
         "employeeId": "80113078968"
      },
      "training": true
   }
}

Response:

{
   "errors": [
      {
         "message": "FDM-buffer is vol",
         "extensions": {
            "category": "FDM",
            "code": "BUFFER_FULL",
            "showPos": "MANDATORY"
         }
      }
   ]
}

Dit toont aan dat de Checkbox feedback geeft over het niveau van de buffer met niet-verzonden events. Onder 70 % verschijnt er geen warning; daarboven wel, en bij 100 % volgt een GraphQL-errorresponse met de melding dat de buffer vol is.

FDM lock

Onderstaande lock configuratie werd ingeladen met datum van vandaag op 01/06

{
   "dataResultUrl": "https://secure.acc.gks2-0.be/business/query/success",
   "errorResultUrl": "https://secure.acc.gks2-0.be/business/query/error",
   "actionId": "2025-04-17T13:52:05.123Z",
   "messageDateTimeEcho": "2025-05-27T21:27:21.342Z",
   "operationType": "SET_FDM_LOCK",
   "executable": {
      "query": "mutation SetFdmLock($fdmLockFromDateList: [FdmLockInput!]!) { setFdmLock(fdmLockFromDateList: $fdmLockFromDateList) { device { fdmId fdmDateTime bufferCapacityUsed } configuration { paramsVersionObject { paramsVersion } fdmLockFromDateList { fromSystemDate fdmLock lockReason { language message } } } } }",
      "operationName": "SetFdmLock",
      "variables": {
         "fdmLockFromDateList": [
            {
               "fdmLock": false,
               "lockReason": null,
               "fromSystemDate": "2025-01-01"
            },
            {
               "fromSystemDate": "2025-05-01",
               "fdmLock": true,
               "lockReason": [
                  {
                     "language": "EN",
                     "message": "FDM_LOCKED-EN"
                  },
                  {
                     "language": "NL",
                     "message": "FDM_LOCKED-NL"
                  },
                  {
                     "language": "FR",
                     "message": "FDM_LOCKED-FR"
                  },
                  {
                     "language": "DE",
                     "message": "FDM_LOCKED-DE"
                  }
               ]
            }
         ]
      }
   }
}

Het sturen van onderstaande Work-In sign request

{
   "query": "mutation SignWorkIn($data: WorkInOutInput!, $training: Boolean! = false) { signWorkIn(data: $data, isTraining: $training) { __typename posId posFiscalTicketNo posDateTime terminalId deviceId fdmSwVersion eventOperation digitalSignature bufferCapacityUsed fdmRef { __typename fdmId fdmDateTime eventLabel eventCounter totalCounter } warnings { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } informations { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } footer } }",
   "operationName": "SignWorkIn",
   "variables": {
      "data": {
         "language": "NL",
         "vatNo": "BE0000000097",
         "estNo": "2000000042",
         "posId": "CPOS0031234567",
         "posFiscalTicketNo": 1010,
         "posDateTime": "2025-06-01T20:13:13+00:00",
         "posSwVersion": "1.8.3",
         "terminalId": "POS-2-REC",
         "deviceId": "80:1A:A6:75:66:FC",
         "bookingPeriodId": "dffcd829-a0e5-41ca-a0ae-9eb887f95637",
         "bookingDate": "2024-10-04",
         "ticketMedium": "NONE",
         "employeeId": "80113078968"
      },
      "training": true
   }
}

geeft al response:

{
   "errors": [
      {
         "message": "FDM_LOCKED-NL",
         "extensions": {
            "category": "FDM",
            "code": "FDM_LOCKED",
            "showPos": "MANDATORY"
         }
      }
   ]
}

Wanneer de Checkbox vergrendeld is, wordt er een FDM_LOCKED-error teruggegeven.

FODFIN-Cloud

Webservices

WS_INIT

Voor de initial boot werd de call naar ws_init en het genereren van de JWT-token werd uitvoerig besproken in het het hoofdstuck FODFIN-Cloud/Booting-de-fdm.

Met geldig certificaat

Indien, ws_query voor het interval initInterval niet succesvol aangeroepen kon worden dan moet de Checkbox ws_init call uitvoeren waar de payload het serienummer van het client certificaat bevat, indien niet vervallen.

Om dit te testen werd fdmLastActions gemanipuleerd, zodoende dat de checkbox bij opstart dit zal uitvoeren.

2025-06-01 21:12:52.979

fod-query

I (32074) fod-query: State: FOD_QUERY_STATE_IDLE -> FOD_QUERY_STATE_INIT

2025-06-01 21:12:53.985

fod-query

I (33084) fod-query: WS_INIT: fdmLastActions[1740000000] initInterval[345600] now[1748812373] retryCount[0] retryInterval[600]

2025-06-01 21:12:54.143

fod-http

W (33224) fod-http: JWT: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJpbml0IiwiaWF0IjoxNzQ4ODEyMzczLCJmZG1JZCI6IkNCWDAxMDAwMDAxIiwiY2xpZW50Q2VydFNuIjoiMzIzODE3Mzk5NzgzMjg0MzAwNTAxNDA0ODA0MzI0NTAyODA1NTI1MTk4Mzg5MTAzIn0.L3m4_jk3M9f9W4Y2mMNc6by8trtojFWuka0A6437ZKsT6sq7XrVihAQxbF_zvfj2DaGAFGxnQAzAF5BTwqQdEw

2025-06-01 21:12:54.159

fod-query

I (33234) fod-query: State: FOD_QUERY_STATE_INIT -> FOD_QUERY_STATE_BUSY

2025-06-01 21:12:55.350

fod-query

I (34454) fod-query: Init - HTTP status is OK

2025-06-01 21:12:55.357

fod-query

I (34454) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_INIT_PROCESS

2025-06-01 21:12:56.485

fod-query

I (35584) fod-query: Claim certificate chain is valid

2025-06-01 21:12:56.779

fod-query

I (35874) fod-query: Digital signature verification passed

2025-06-01 21:12:57.106

fod-query

I (36204) fod-query: State: FOD_QUERY_STATE_INIT_PROCESS -> FOD_QUERY_STATE_WORK

2025-06-01 21:12:58.116

fod-query

I (37204) fod-query: Action "SET_FDM_LOCK" success

2025-06-01 21:12:59.319

fod-query

I (38414) fod-query: Action "SET_PARAMS" success

2025-06-01 21:13:00.479

fod-query

I (39574) fod-query: Action "SET_VAT_RATES" success

2025-06-01 21:13:01.600

fod-query

I (40694) fod-query: Action "SET_POS_ALLOWLIST" success

2025-06-01 21:13:02.737

fod-query

I (41834) fod-query: Action "SET_TRUST_CERT" success

2025-06-01 21:13:03.935

fod-query

I (43024) fod-query: Action "SET_URLS" success

2025-06-01 21:13:04.142

fod-query

W (43244) fod-query: All init items processed successfully

2025-06-01 21:13:04.251

fod-query

I (43344) fod-query: State: FOD_QUERY_STATE_WORK -> FOD_QUERY_STATE_IDLE

  1. Groen: Aankondiging WS_INIT samen met de extra informatie
  2. Blauw: Genereren van de JWT-token
  3. Paars: Verwerken van de response

Ontleden JWT token:

token:

eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJpbml0IiwiaWF0IjoxNzQ4ODEwNjQ0LCJmZG1JZCI6IkNCWDAxMDAwMDAxIiwiY2xpZW50Q2VydFNuIjoiMzIzODE3Mzk5NzgzMjg0MzAwNTAxNDA0ODA0MzI0NTAyODA1NTI1MTk4Mzg5MTAzIn0.TjmvB08-BA1OXZGVxUlGvP5UStN8jSIogGtpUyeV1ofrYOkx3Km81Nmes705_nOPpX49xC4ms3NYackdHOQv4A

JWT-header:

{
  "alg": "ES256",
  "typ": "JWT"
}

JWT-payload

{
  "sub": "init",
  "iat": 1748810644,
  "fdmId": "CBX01000001",
  "clientCertSn": "323817399783284300501404804324502805525198389103"
}

-> Het serienummer van het actieve client certificaat is toegevoegd aan aan de JWT payload

Verwerken response

Alle action item in de WS_INIT response werden succesvol verwerkt en geregistreerd via succes endpoint:

Voor testing redenen worden alle calls naar FODFIN-Cloud in de failed requests buffer bijgehouden en dit werd uitgelezen:

2025-06-01T21:13:04Z
Request POST https://secure.acc.gks2-0.be/business/query/success
accept: application/json Content-Type: application/json Date: Sun, 01 Jun 2025 21:13:04 GMT
{"actionId":"2025-05-05T09:11:06.392Z","messageDateTimeEcho":"2025-06-01T21:12:55.117Z","operationType":"SET_URLS","result":{"data":{"setUrls":{"device":{"fdmId":"CBX01000001","fdmDateTime":"2025-06-01T21:13:03Z","bufferCapacityUsed":0},"configuration":{"paramsVersionObject":{"paramsVersion":"2025-04-17T13:52:05Z"},"fdmLockFromDateList":[{"fromSystemDate":"2025-01-01","fdmLock":false,"lockReason":null}]}}}}}
Reply 200
x-amzn-RequestId:b3b455db-7255-4793-909f-f81eccf4de42x-amz-apigw-id:LgNPlF-kFiAFrZA=X-Amzn-Trace-Id:Root=1-683cc263-eee26d0333d3573c1608d14fcontent-type:application/jsoncontent-length:0date:Sun, 01 Jun 2025 21:13:06 GMT

2025-06-01T21:13:02Z
Request POST https://secure.acc.gks2-0.be/business/query/success
accept: application/json Content-Type: application/json Date: Sun, 01 Jun 2025 21:13:02 GMT
{"actionId":"2024-01-06T16:03:23.004Z","messageDateTimeEcho":"2025-06-01T21:12:55.107Z","operationType":"SET_TRUST_CERT","result":{"data":{"setTrustCert":{"device":{"fdmId":"CBX01000001","fdmDateTime":"2025-06-01T21:13:02Z","bufferCapacityUsed":0},"configuration":{"paramsVersionObject":{"paramsVersion":"2025-04-17T13:52:05Z"},"fdmLockFromDateList":[{"fromSystemDate":"2025-01-01","fdmLock":false,"lockReason":null}]}}}}}
Reply 200
x-amzn-RequestId:c0e2e91d-f2d6-49f6-b410-ebe6bd9487e0x-amz-apigw-id:LgNPcG3pFiAFcmA=X-Amzn-Trace-Id:Root=1-683cc262-89303e9d1acb454cb97bff56content-type:application/jsoncontent-length:0date:Sun, 01 Jun 2025 21:13:06 GMT

2025-06-01T21:13:01Z
Request POST https://secure.acc.gks2-0.be/business/query/success
accept: application/json Content-Type: application/json Date: Sun, 01 Jun 2025 21:13:01 GMT
{"actionId":"2025-04-17T13:52:05.123Z","messageDateTimeEcho":"2025-06-01T21:12:55.101Z","operationType":"SET_POS_ALLOWLIST","result":{"data":{"setPosAllowlist":{"device":{"fdmId":"CBX01000001","fdmDateTime":"2025-06-01T21:13:01Z","bufferCapacityUsed":0},"configuration":{"paramsVersionObject":{"paramsVersion":"2025-04-17T13:52:05Z"},"fdmLockFromDateList":[{"fromSystemDate":"2025-01-01","fdmLock":false,"lockReason":null}],"posIdFromDateList":[{"fromSystemDate":"2024-01-01","posIdList":["Csnpos00000001","Csnpos00000003"]},{"fromSystemDate":"2025-01-01","posIdList":["Csnpos00000001","Csnpos00000003","Csnpos00000004"]},{"fromSystemDate":"2025-04-01","posIdList":["CPOS0031234567","CPOS0031234568","CFOD0010000100"]}]}}}}}
Reply 200
x-amzn-RequestId:b7f2e870-317a-4373-b487-4b4a79faaca3x-amz-apigw-id:LgNPSFvhFiAFmaA=X-Amzn-Trace-Id:Root=1-683cc261-9db29a69c691dbc43de1f53econtent-type:application/jsoncontent-length:0date:Sun, 01 Jun 2025 21:13:05 GMT

2025-06-01T21:13:00Z
Request POST https://secure.acc.gks2-0.be/business/query/success
accept: application/json Content-Type: application/json Date: Sun, 01 Jun 2025 21:13:00 GMT
{"actionId":"2025-04-17T13:52:05.123Z","messageDateTimeEcho":"2025-06-01T21:12:55.097Z","operationType":"SET_VAT_RATES","result":{"data":{"setVatRates":{"device":{"fdmId":"CBX01000001","fdmDateTime":"2025-06-01T21:13:00Z","bufferCapacityUsed":0},"configuration":{"paramsVersionObject":{"paramsVersion":"2025-04-17T13:52:05Z"},"fdmLockFromDateList":[{"fromSystemDate":"2025-01-01","fdmLock":false,"lockReason":null}]}}}}}
Reply 200
x-amzn-RequestId:9e9fe342-4746-4d6a-8de3-4317fdef5961x-amz-apigw-id:LgNPJFiDliAFpNg=X-Amzn-Trace-Id:Root=1-683cc260-ad01a792492c4e875f90f866content-type:application/jsoncontent-length:0date:Sun, 01 Jun 2025 21:13:03 GMT

2025-06-01T21:12:59Z
Request POST https://secure.acc.gks2-0.be/business/query/success
accept: application/json Content-Type: application/json Date: Sun, 01 Jun 2025 21:12:59 GMT
{"actionId":"2025-04-17T13:52:05.123Z","messageDateTimeEcho":"2025-06-01T21:12:55.094Z","operationType":"SET_PARAMS","result":{"data":{"setParams":{"device":{"fdmId":"CBX01000001","fdmDateTime":"2025-06-01T21:12:59Z","bufferCapacityUsed":0},"configuration":{"paramsVersionObject":{"paramsVersion":"2025-04-17T13:52:05Z"},"fdmLockFromDateList":[{"fromSystemDate":"2025-01-01","fdmLock":false,"lockReason":null}]}}}}}
Reply 200
x-amzn-RequestId:1941fdf2-1a28-4863-97f7-0fa0698c5b79x-amz-apigw-id:LgNOmHNDliAFlJw=X-Amzn-Trace-Id:Root=1-683cc25d-c2dd998b864ce4ba81c922d7content-type:application/jsoncontent-length:0date:Sun, 01 Jun 2025 21:13:02 GMT

2025-06-01T21:12:58Z
Request POST https://secure.acc.gks2-0.be/business/query/success
accept: application/json Content-Type: application/json Date: Sun, 01 Jun 2025 21:12:58 GMT
{"actionId":"2025-04-17T13:52:05.123Z","messageDateTimeEcho":"2025-06-01T21:12:55.088Z","operationType":"SET_FDM_LOCK","result":{"data":{"setFdmLock":{"device":{"fdmId":"CBX01000001","fdmDateTime":"2025-06-01T21:12:58Z","bufferCapacityUsed":0},"configuration":{"paramsVersionObject":{"paramsVersion":"2025-04-17T13:52:05Z"},"fdmLockFromDateList":[{"fromSystemDate":"2025-01-01","fdmLock":false,"lockReason":null}]}}}}}
Reply 200
x-amzn-RequestId:cc70043e-63dd-4f5e-aa44-fbd520179ffex-amz-apigw-id:LgNOQGOHliAFQOA=X-Amzn-Trace-Id:Root=1-683cc25a-02d5a4a02500b982e454df97content-type:application/jsoncontent-length:0date:Sun, 01 Jun 2025 21:12:59 GMT

De response bevat elke keer het actionId, messageDateTmeEcho en operationType

Met failure

Deze actie werd herhaalt maar er werd de code werd aangepast, zodoende de verwerking van setFdmLock zou falen.

2025-06-01 21:39:39.458

fod-query

I (31969) fod-query: State: FOD_QUERY_STATE_IDLE -> FOD_QUERY_STATE_INIT

2025-06-01 21:39:40.462

fod-query

I (32979) fod-query: WS_INIT: fdmLastActions[1740000000] initInterval[345600] now[1748813980] retryCount[0] retryInterval[600]

2025-06-01 21:39:40.620

fod-http

W (33119) fod-http: JWT: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJpbml0IiwiaWF0IjoxNzQ4ODEzOTgwLCJmZG1JZCI6IkNCWDAxMDAwMDAxIiwiY2xpZW50Q2VydFNuIjoiMzIzODE3Mzk5NzgzMjg0MzAwNTAxNDA0ODA0MzI0NTAyODA1NTI1MTk4Mzg5MTAzIn0.vt18D49ei5pspNz_CpiMImGS9qkyY9yG-O04c_JDfhAMOqbOYlVZhIY1dwkK_NWu4Rn7434Cr-jMGM7TsR2wMw

2025-06-01 21:39:40.637

fod-query

I (33129) fod-query: State: FOD_QUERY_STATE_INIT -> FOD_QUERY_STATE_BUSY

2025-06-01 21:39:41.527

fod-query

I (34049) fod-query: Init - HTTP status is OK

2025-06-01 21:39:41.534

fod-query

I (34049) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_INIT_PROCESS

2025-06-01 21:39:42.016

fod-query

I (34529) fod-query: Claim certificate chain is valid

2025-06-01 21:39:42.436

fod-query

I (34949) fod-query: Digital signature verification passed

2025-06-01 21:39:42.752

fod-query

I (35269) fod-query: State: FOD_QUERY_STATE_INIT_PROCESS -> FOD_QUERY_STATE_WORK

2025-06-01 21:39:43.810

fod-query

E (36319) fod-query: Failed to process GQL

2025-06-01 21:39:43.815

fod-query

I (36319) fod-query: Action "SET_FDM_LOCK" failed

2025-06-01 21:39:43.824

fod-query

E (36329) fod-query: Failed to handle mutation

2025-06-01 21:39:44.926

fod-query

I (37439) fod-query: Action "SET_PARAMS" success

2025-06-01 21:39:46.091

fod-query

I (38599) fod-query: Action "SET_VAT_RATES" success

2025-06-01 21:39:47.346

fod-query

I (39859) fod-query: Action "SET_POS_ALLOWLIST" success

2025-06-01 21:39:48.465

fod-query

I (40979) fod-query: Action "SET_TRUST_CERT" success

2025-06-01 21:39:49.659

fod-query

I (42169) fod-query: Action "SET_URLS" success

2025-06-01 21:39:49.752

fod-query

W (42269) fod-query: All init items processed with error

2025-06-01 21:39:49.761

fod-query

I (42269) fod-query: State: FOD_QUERY_STATE_WORK -> FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY

  1. Rood: Verwerken van set FDM lock is niet geslaagd
  2. Blauw: Omdat 1 van de actions niet succesvol verwerkt wordt er een nieuwe ws_init gepland
2025-06-01T21:41:16Z
Request POST https://secure.acc.gks2-0.be/business/query/success
accept: application/json Content-Type: application/json Date: Sun, 01 Jun 2025 21:41:16 GMT
{"actionId":"2025-05-05T09:11:06.392Z","messageDateTimeEcho":"2025-06-01T21:41:08.323Z","operationType":"SET_URLS","result":{"data":{"setUrls":{"device":{"fdmId":"CBX01000001","fdmDateTime":"2025-06-01T21:41:16Z","bufferCapacityUsed":0},"configuration":{"paramsVersionObject":{"paramsVersion":"2025-04-17T13:52:05Z"},"fdmLockFromDateList":[{"fromSystemDate":"2025-01-01","fdmLock":false,"lockReason":null}]}}}}}
Reply 200

x-amzn-RequestId:12f4efe2-fcab-4fe6-8dd0-194f5401a16fx-amz-apigw-id:LgRXmFf9liAFrKA=X-Amzn-Trace-Id:Root=1-683cc8fd-0d84f32bee1a975078bdd97ccontent-type:application/jsoncontent-length:0date:Sun, 01 Jun 2025 21:41:17 GMT
2025-06-01T21:41:15Z
Request POST https://secure.acc.gks2-0.be/business/query/success
accept: application/json Content-Type: application/json Date: Sun, 01 Jun 2025 21:41:15 GMT
{"actionId":"2024-01-06T16:03:23.004Z","messageDateTimeEcho":"2025-06-01T21:41:08.319Z","operationType":"SET_TRUST_CERT","result":{"data":{"setTrustCert":{"device":{"fdmId":"CBX01000001","fdmDateTime":"2025-06-01T21:41:15Z","bufferCapacityUsed":0},"configuration":{"paramsVersionObject":{"paramsVersion":"2025-04-17T13:52:05Z"},"fdmLockFromDateList":[{"fromSystemDate":"2025-01-01","fdmLock":false,"lockReason":null}]}}}}}
Reply 200
x-amzn-RequestId:00cd994a-d6de-4517-9232-34e43648576fx-amz-apigw-id:LgRXbFIyFiAFpWw=X-Amzn-Trace-Id:Root=1-683cc8fb-d717837f558db102885002cccontent-type:application/jsoncontent-length:0date:Sun, 01 Jun 2025 21:41:15 GMT

2025-06-01T21:41:14Z
Request POST https://secure.acc.gks2-0.be/business/query/success
accept: application/json Content-Type: application/json Date: Sun, 01 Jun 2025 21:41:14 GMT
{"actionId":"2025-04-17T13:52:05.123Z","messageDateTimeEcho":"2025-06-01T21:41:08.316Z","operationType":"SET_POS_ALLOWLIST","result":{"data":{"setPosAllowlist":{"device":{"fdmId":"CBX01000001","fdmDateTime":"2025-06-01T21:41:14Z","bufferCapacityUsed":0},"configuration":{"paramsVersionObject":{"paramsVersion":"2025-04-17T13:52:05Z"},"fdmLockFromDateList":[{"fromSystemDate":"2025-01-01","fdmLock":false,"lockReason":null}],"posIdFromDateList":[{"fromSystemDate":"2024-01-01","posIdList":["Csnpos00000001","Csnpos00000003"]},{"fromSystemDate":"2025-01-01","posIdList":["Csnpos00000001","Csnpos00000003","Csnpos00000004"]},{"fromSystemDate":"2025-04-01","posIdList":["CPOS0031234567","CPOS0031234568","CFOD0010000100"]}]}}}}}
Reply 200
x-amzn-RequestId:1634ea6f-6e67-42ed-8f5f-ae21862c9d63x-amz-apigw-id:LgRXQEe7FiAFpsg=X-Amzn-Trace-Id:Root=1-683cc8fa-1956de647954aa47e07ea9f3content-type:application/jsoncontent-length:0date:Sun, 01 Jun 2025 21:41:14 GMT

2025-06-01T21:41:13Z
Request POST https://secure.acc.gks2-0.be/business/query/success
accept: application/json Content-Type: application/json Date: Sun, 01 Jun 2025 21:41:13 GMT
{"actionId":"2025-04-17T13:52:05.123Z","messageDateTimeEcho":"2025-06-01T21:41:08.314Z","operationType":"SET_VAT_RATES","result":{"data":{"setVatRates":{"device":{"fdmId":"CBX01000001","fdmDateTime":"2025-06-01T21:41:12Z","bufferCapacityUsed":0},"configuration":{"paramsVersionObject":{"paramsVersion":"2025-04-17T13:52:05Z"},"fdmLockFromDateList":[{"fromSystemDate":"2025-01-01","fdmLock":false,"lockReason":null}]}}}}}
Reply 200
x-amzn-RequestId:0fd6ae6e-e487-480a-98a5-0d15206326afx-amz-apigw-id:LgRXFG16liAFdCQ=X-Amzn-Trace-Id:Root=1-683cc8f9-632c728687643d35eebddfc7content-type:application/jsoncontent-length:0date:Sun, 01 Jun 2025 21:41:13 GMT

2025-06-01T21:41:11Z
Request POST https://secure.acc.gks2-0.be/business/query/success
accept: application/json Content-Type: application/json Date: Sun, 01 Jun 2025 21:41:11 GMT
{"actionId":"2025-04-17T13:52:05.123Z","messageDateTimeEcho":"2025-06-01T21:41:08.310Z","operationType":"SET_PARAMS","result":{"data":{"setParams":{"device":{"fdmId":"CBX01000001","fdmDateTime":"2025-06-01T21:41:11Z","bufferCapacityUsed":0},"configuration":{"paramsVersionObject":{"paramsVersion":"2025-04-17T13:52:05Z"},"fdmLockFromDateList":[{"fromSystemDate":"2025-01-01","fdmLock":false,"lockReason":null}]}}}}}
Reply 200
x-amzn-RequestId:1374bf6d-bbe3-4d73-a9f4-adacde33e418x-amz-apigw-id:LgRW6HNSliAFqow=X-Amzn-Trace-Id:Root=1-683cc8f8-48a192fbd0fecbc7dc11f42ccontent-type:application/jsoncontent-length:0date:Sun, 01 Jun 2025 21:41:12 GMT

2025-06-01T21:41:10Z
Request POST https://secure.acc.gks2-0.be/business/query/error
accept: application/json Content-Type: application/json Date: Sun, 01 Jun 2025 21:41:10 GMT
{"actionId":"2025-04-17T13:52:05.123Z","messageDateTimeEcho":"2025-06-01T21:41:08.307Z","operationType":"SET_FDM_LOCK","result":{"errors":[{"message":"Mutation 'setFdmLock' processing error","locations":[],"extensions":{"fdmId":"CBX01000001","timestamp":"2025-06-01T21:41:10Z"}}]}}
Reply 200
x-amzn-RequestId:22c47b65-dcba-4729-9b64-a0ff2bb8ddf2x-amz-apigw-id:LgRWuG1oFiAFeUA=X-Amzn-Trace-Id:Root=1-683cc8f7-ac4bd0ac009c378ee809ad47content-type:application/jsoncontent-length:0date:Sun, 01 Jun 2025 21:41:11 GMT

Voor SET_FDM_LOCK werd het endpoint https://secure.acc.gks2-0.be/business/query/error aangeroepen

Behandelen van retry

2025-06-01 21:39:40.462

fod-query

I (32979) fod-query: WS_INIT: fdmLastActions[1740000000] initInterval[345600] now[1748813980] retryCount[0] retryInterval[600]

2025-06-01 21:39:56.753

fod-query

I (49269) fod-query: WS_INIT: fdmLastActions[1740000000] initInterval[345600] now[1748813996] retryCount[1] retryInterval[5]

2025-06-01 21:41:07.622

fod-query

I (120139) fod-query: WS_INIT: fdmLastActions[1740000000] initInterval[345600] now[1748814067] retryCount[2] retryInterval[60]

2025-06-01 21:46:18.467

fod-query

I (430979) fod-query: WS_INIT: fdmLastActions[1740000000] initInterval[345600] now[1748814378] retryCount[3] retryInterval[300]

2025-06-01 21:51:29.469

fod-query

I (741979) fod-query: WS_INIT: fdmLastActions[1740000000] initInterval[345600] now[1748814689] retryCount[4] retryInterval[300]

2025-06-01 21:56:40.293

fod-query

I (1052799) fod-query: WS_INIT: fdmLastActions[1740000000] initInterval[345600] now[1748815000] retryCount[5] retryInterval[300]

Verderbouwend op voorgaande test waar setFDMLock faalt, zien we nu dat de checkbox de WS_SERVICE aanroept met het gewenste retryInterval.

Het retryInterval bij retryCount kan genegeerd worden. Als de logregel bijvoorbeeld “retryInterval 300” toont, betekent dit dat de Checkbox 300 seconden heeft gewacht voordat hij een retry uitvoerde.

Gedurende deze tijd is de error FDM_NOT_OPERATIONAL actief

Request retry via admin-console

Voorwaarde is dat INITIALIZATION_FAILED warning actief, om hieraan te voldoen werd alle config van de Checkbox verwijderd en werd er een ongeldige URL als WS_INIT gezet via de admin console:

image.png

De default retry waardes zijn:

static const int _retry_intervals_default[] = { [0]=5, [1]=60, [2]=300, [3]=300, [4]=300, [5]=3600, [6]=10800};

De Checkbox werd opgestart en dit zijn de initiële log:

2025-06-02 19:48:45.681

fod-query

I (31121) fod-query: State: FOD_QUERY_STATE_IDLE -> FOD_QUERY_STATE_INIT

2025-06-02 19:48:46.708

fod-query

I (32151) fod-query: WS_INIT: fdmLastActions[0] initInterval[720] now[1748893726] retryCount[0] retryInterval[0]

2025-06-02 19:48:46.862

fod-query

I (32291) fod-query: State: FOD_QUERY_STATE_INIT -> FOD_QUERY_STATE_BUSY

2025-06-02 19:48:47.036

fod-query

E (32491) fod-query: Init - HTTP status is not OK

2025-06-02 19:48:47.046

fod-query

I (32491) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY

2025-06-02 19:48:47.941

fod-query

I (33391) fod-query: Scheduling retry in 5 s

2025-06-02 19:48:47.952

fod-query

I (33391) fod-query: State: FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY -> FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL

2025-06-02 19:48:52.962

fod-query

E (38401) fod-query: FOD HTTP fallback to WS_INIT required, URL[NULL] client cert valid[0] trust cert valid[0]

2025-06-02 19:48:52.967

fod-query

I (38401) fod-query: State: FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL -> FOD_QUERY_STATE_INIT

2025-06-02 19:48:53.974

fod-query

I (39411) fod-query: WS_INIT: fdmLastActions[0] initInterval[720] now[1748893733] retryCount[1] retryInterval[5]

2025-06-02 19:48:54.129

fod-query

I (39561) fod-query: State: FOD_QUERY_STATE_INIT -> FOD_QUERY_STATE_BUSY

2025-06-02 19:48:54.265

fod-query

E (39721) fod-query: Init - HTTP status is not OK

2025-06-02 19:48:54.276

fod-query

I (39721) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY

2025-06-02 19:48:55.121

fod-query

I (40571) fod-query: Scheduling retry in 60 s

2025-06-02 19:48:55.132

fod-query

I (40571) fod-query: State: FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY -> FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL

2025-06-02 19:49:55.132

fod-query

E (100571) fod-query: FOD HTTP fallback to WS_INIT required, URL[NULL] client cert valid[0] trust cert valid[0]

2025-06-02 19:49:55.140

fod-query

I (100571) fod-query: State: FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL -> FOD_QUERY_STATE_INIT

2025-06-02 19:49:56.145

fod-query

I (101581) fod-query: WS_INIT: fdmLastActions[0] initInterval[720] now[1748893796] retryCount[2] retryInterval[60]

2025-06-02 19:49:56.299

fod-query

I (101731) fod-query: State: FOD_QUERY_STATE_INIT -> FOD_QUERY_STATE_BUSY

2025-06-02 19:49:56.426

fod-query

E (101881) fod-query: Init - HTTP status is not OK

2025-06-02 19:49:56.437

fod-query

I (101881) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY

2025-06-02 19:49:57.291

fod-query

I (102741) fod-query: Scheduling retry in 300 s

2025-06-02 19:49:57.303

fod-query

I (102741) fod-query: State: FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY -> FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL

2025-06-02 19:54:57.315

fod-query

E (402751) fod-query: FOD HTTP fallback to WS_INIT required, URL[NULL] client cert valid[0] trust cert valid[0]

2025-06-02 19:54:57.323

fod-query

I (402751) fod-query: State: FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL -> FOD_QUERY_STATE_INIT

2025-06-02 19:54:58.328

fod-query

I (403761) fod-query: WS_INIT: fdmLastActions[0] initInterval[720] now[1748894098] retryCount[3] retryInterval[300]

2025-06-02 19:54:58.483

fod-query

I (403911) fod-query: State: FOD_QUERY_STATE_INIT -> FOD_QUERY_STATE_BUSY

2025-06-02 19:54:58.619

fod-query

E (404071) fod-query: Init - HTTP status is not OK

2025-06-02 19:54:58.630

fod-query

I (404071) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY

2025-06-02 19:54:59.474

fod-query

I (404921) fod-query: Scheduling retry in 300 s

2025-06-02 19:54:59.486

fod-query

I (404921) fod-query: State: FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY -> FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL

2025-06-02 19:59:59.508

fod-query

E (704941) fod-query: FOD HTTP fallback to WS_INIT required, URL[NULL] client cert valid[0] trust cert valid[0]

2025-06-02 19:59:59.515

fod-query

I (704941) fod-query: State: FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL -> FOD_QUERY_STATE_INIT

2025-06-02 20:00:00.520

fod-query

I (705951) fod-query: WS_INIT: fdmLastActions[0] initInterval[720] now[1748894400] retryCount[4] retryInterval[300]

2025-06-02 20:00:00.673

fod-query

I (706101) fod-query: State: FOD_QUERY_STATE_INIT -> FOD_QUERY_STATE_BUSY

2025-06-02 20:00:00.812

fod-query

E (706261) fod-query: Init - HTTP status is not OK

2025-06-02 20:00:00.823

fod-query

I (706261) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY

2025-06-02 20:00:01.667

fod-query

I (707111) fod-query: Scheduling retry in 300 s

2025-06-02 20:00:01.678

fod-query

I (707111) fod-query: State: FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY -> FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL

De volgende retry is gepland rond 20:05, dus

2025-06-02 20:04:34.855

fod-query

I (980291) fod-query: User FOD settings changed (Initiating retry[1])

2025-06-02 20:04:34.877

fod-query

E (980301) fod-query: FOD HTTP fallback to WS_INIT required, URL[NULL] client cert valid[0] trust cert valid[0]

2025-06-02 20:04:34.882

fod-query

I (980311) fod-query: State: FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL -> FOD_QUERY_STATE_INIT

2025-06-02 20:04:35.893

fod-query

I (981321) fod-query: WS_INIT: fdmLastActions[0] initInterval[720] now[1748894675] retryCount[5] retryInterval[300]

2025-06-02 20:04:36.049

fod-query

I (981471) fod-query: State: FOD_QUERY_STATE_INIT -> FOD_QUERY_STATE_BUSY

2025-06-02 20:04:36.174

fod-query

E (981621) fod-query: Init - HTTP status is not OK

2025-06-02 20:04:36.185

fod-query

I (981621) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY

2025-06-02 20:04:37.040

fod-query

I (982481) fod-query: Scheduling retry in 3600 s

2025-06-02 20:04:37.051

fod-query

I (982481) fod-query: State: FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY -> FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL

Dit heeft een nieuw poging tot aanroepen van WS_INIT gestart. Gevolg is terug een gefaalde actie met als volgende retry gepland na 3600 seconden. Als we dit nog eens herhalen krijgen we

2025-06-02 20:08:30.027

fod-query

I (1215461) fod-query: User FOD settings changed (Initiating retry[1])

2025-06-02 20:08:30.049

fod-query

E (1215471) fod-query: FOD HTTP fallback to WS_INIT required, URL[NULL] client cert valid[0] trust cert valid[0]

2025-06-02 20:08:30.055

fod-query

I (1215481) fod-query: State: FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL -> FOD_QUERY_STATE_INIT

2025-06-02 20:08:31.066

fod-query

I (1216491) fod-query: WS_INIT: fdmLastActions[0] initInterval[720] now[1748894911] retryCount[6] retryInterval[3600]

2025-06-02 20:08:31.221

fod-query

I (1216641) fod-query: State: FOD_QUERY_STATE_INIT -> FOD_QUERY_STATE_BUSY

2025-06-02 20:08:31.367

fod-query

E (1216811) fod-query: Init - HTTP status is not OK

2025-06-02 20:08:31.377

fod-query

I (1216811) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY

2025-06-02 20:08:32.217

fod-query

I (1217651) fod-query: Scheduling retry in 10800 s

2025-06-02 20:08:32.224

fod-query

I (1217651) fod-query: State: FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY -> FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL

Opnieuw werd er vervroegd een WS_INIT actie uitgevoerd. Dit moet aantonen dat de gebruiker WS_INIT request kan uitvoeren via de admin console.

WS_REG

De actieve parameter configuratie:

Init Interval: 345600
Nop Interval: 600
Max Buffer: 5
Query Interval: 1800
Retry Intervals: 7
  0: 5
  1: 60
  2: 300
  3: 300
  4: 300
  5: 3600
  6: 10800
Retry Intervals Init: 7
  0: 5
  1: 60
  2: 300
  3: 300
  4: 300
  5: 3600
  6: 10800
Max Msg Size: 3
Postpone: true
Default Max Calls: 0
Max Calls:
Footer:
  - FPS FIN Footer 1
  - ParamsVerion: 2025-04-17T13:52:05Z

Postpone - disabled

Postpone - enable

MaxDefaultCalls == 0

Uit de onderstaande logs blijkt dat de Checkbox vijf events van elk 748 bytes ontvangt. Dat zou een gebundeld WS_REG-pakket van meer dan 3 kB (=maxMsgSize) opleveren. Daarom sluit de Checkbox het laatst ontvangen event uit, zodat het pakket niet groter is dan 3 kB. De Checkbox streeft ernaar pakketten van maximaal 3 kB samen te stellen; zodra een volgend event niet meer in het pakket past, wordt het huidige pakket meteen verzonden, zonder dat extra event.

2025-06-01 23:06:41.577

fod-reg

I (35039) fod-reg: Processing unsent business event uid[3810359774] is_valid[1] len[748]

2025-06-01 23:06:41.585

fod-reg

I (35039) fod-reg: State transition from FOD_REG_STATE_POPULATING to FOD_REG_STATE_QUEUE_WAIT

2025-06-01 23:09:42.304

fod-reg

I (215769) fod-reg: Processing unsent business event uid[3992674264] is_valid[1] len[748]

2025-06-01 23:09:44.194

fod-reg

I (217659) fod-reg: Processing unsent business event uid[1484057684] is_valid[1] len[748]

2025-06-01 23:09:45.947

fod-reg

I (219409) fod-reg: Processing unsent business event uid[2036169995] is_valid[1] len[748]

2025-06-01 23:10:47.704

fod-reg

I (281159) fod-reg: Processing unsent business event uid[1484635009] is_valid[1] len[748]

2025-06-01 23:10:47.715

fod-reg

I (281169) fod-reg: Max calls condition is met (last-action[1748819201] allowed-from[1748819201] now[1748819447] bundle-size[2kB]), proceeding ...

2025-06-01 23:10:47.726

fod-reg

I (281179) fod-reg: Ready to register unsent transactions

2025-06-01 23:10:47.731

fod-reg

I (281189) fod-reg: Messages remaining in unsent queue: 5

2025-06-01 23:10:47.737

fod-reg

I (281189) fod-reg: Bundle for FOD assembled items[4] size[2/3kB]

MaxDefaultCalls > 0

maxDefaultCalls is ingesteld op 3 en er is geen tijdslot actief in maxCalls. Uit de onderstaande log blijkt dat WS_REG gedurende het 22e uur slechts drie keer wordt uitgevoerd.

2025-06-02 21:52:03.999

fod-reg

I (5448161) fod-reg: [WS_NOP] HTTP callback type[2] status[200] response[len[3]]

2025-06-02 21:56:16.370

fod-reg

I (5700531) fod-reg: State transition from FOD_REG_STATE_IDLE to FOD_REG_STATE_POPULATING

2025-06-02 21:56:17.363

fod-reg

I (5701531) fod-reg: Collecting items until 3072 bytes

2025-06-02 21:56:17.423

fod-reg

I (5701581) fod-reg: Processing unsent business event uid[787453010] is_valid[1] len[1515]

2025-06-02 21:56:17.430

fod-reg

I (5701581) fod-reg: State transition from FOD_REG_STATE_POPULATING to FOD_REG_STATE_QUEUE_WAIT

2025-06-02 22:00:42.094

fod-reg

I (5966251) fod-reg: Processing unsent business event uid[2628533689] is_valid[1] len[748]

2025-06-02 22:02:46.313

fod-reg

I (6090471) fod-reg: Processing unsent business event uid[3029040225] is_valid[1] len[1760]

2025-06-02 22:12:03.230

fod-reg

I (6647361) fod-reg: Max calls condition is met (last-action[1748901123] allowed-from[1748902323] now[1748902323] bundle-size[2kB]), proceeding ...

2025-06-02 22:12:03.230

fod-reg

I (6647371) fod-reg: Ready to register unsent transactions

2025-06-02 22:12:03.236

fod-reg

I (6647381) fod-reg: Messages remaining in unsent queue: 5

2025-06-02 22:12:03.241

fod-reg

I (6647381) fod-reg: Bundle for FOD assembled items[2] size[2/3kB]

2025-06-02 22:12:03.251

fod-reg

I (6647391) fod-reg: State transition from FOD_REG_STATE_QUEUE_WAIT to FOD_REG_STATE_READY

2025-06-02 22:12:04.247

fod-reg

I (6648401) fod-reg: State transition from FOD_REG_STATE_READY to FOD_REG_STATE_SENDING

2025-06-02 22:12:05.081

fod-reg

I (6649231) fod-reg: [WS_REG] HTTP callback type[1] status[200] response[len[3]]

2025-06-02 22:12:05.086

fod-reg

I (6649231) fod-reg: State transition from FOD_REG_STATE_SENDING to FOD_REG_STATE_SENT

2025-06-02 22:12:05.242

fod-reg

I (6649401) fod-reg: POS events sent, marking as sent

2025-06-02 22:12:05.487

fod-reg

I (6649631) fod-reg: State transition from FOD_REG_STATE_SENT to FOD_REG_STATE_IDLE

2025-06-02 22:12:06.476

fod-reg

I (6650631) fod-reg: State transition from FOD_REG_STATE_IDLE to FOD_REG_STATE_POPULATING

2025-06-02 22:12:07.473

fod-reg

I (6651631) fod-reg: Collecting items until 3072 bytes

2025-06-02 22:12:07.535

fod-reg

I (6651681) fod-reg: Processing unsent business event uid[3029040225] is_valid[1] len[1760]

2025-06-02 22:12:07.574

fod-reg

I (6651721) fod-reg: Processing unsent business event uid[1934520640] is_valid[1] len[748]

2025-06-02 22:12:07.613

fod-reg

I (6651761) fod-reg: Processing unsent business event uid[694854586] is_valid[1] len[748]

2025-06-02 22:12:07.620

fod-reg

I (6651761) fod-reg: State transition from FOD_REG_STATE_POPULATING to FOD_REG_STATE_QUEUE_WAIT

2025-06-02 22:12:59.648

fod-reg

I (6703791) fod-reg: State transition from FOD_REG_STATE_QUEUE_WAIT to FOD_REG_STATE_PAUSED

2025-06-02 22:13:03.748

fod-reg

I (6707891) fod-reg: State transition from FOD_REG_STATE_PAUSED to FOD_REG_STATE_QUEUE_WAIT

2025-06-02 22:32:05.231

fod-reg

I (7849351) fod-reg: Max calls condition is met (last-action[1748902325] allowed-from[1748903525] now[1748903525] bundle-size[2kB]), proceeding ...

2025-06-02 22:32:05.231

fod-reg

I (7849361) fod-reg: Ready to register unsent transactions

2025-06-02 22:32:05.237

fod-reg

I (7849371) fod-reg: Messages remaining in unsent queue: 5

2025-06-02 22:32:05.243

fod-reg

I (7849371) fod-reg: Bundle for FOD assembled items[2] size[2/3kB]

2025-06-02 22:32:05.252

fod-reg

I (7849381) fod-reg: State transition from FOD_REG_STATE_QUEUE_WAIT to FOD_REG_STATE_READY

2025-06-02 22:32:06.249

fod-reg

I (7850391) fod-reg: State transition from FOD_REG_STATE_READY to FOD_REG_STATE_SENDING

2025-06-02 22:32:07.082

fod-reg

I (7851221) fod-reg: [WS_REG] HTTP callback type[1] status[200] response[len[3]]

2025-06-02 22:32:07.087

fod-reg

I (7851221) fod-reg: State transition from FOD_REG_STATE_SENDING to FOD_REG_STATE_SENT

2025-06-02 22:32:07.244

fod-reg

I (7851391) fod-reg: POS events sent, marking as sent

2025-06-02 22:32:07.431

fod-reg

I (7851561) fod-reg: State transition from FOD_REG_STATE_SENT to FOD_REG_STATE_IDLE

2025-06-02 22:32:08.427

fod-reg

I (7852571) fod-reg: State transition from FOD_REG_STATE_IDLE to FOD_REG_STATE_POPULATING

2025-06-02 22:32:09.424

fod-reg

I (7853571) fod-reg: Collecting items until 3072 bytes

2025-06-02 22:32:09.465

fod-reg

I (7853601) fod-reg: Processing unsent business event uid[694854586] is_valid[1] len[748]

2025-06-02 22:32:09.524

fod-reg

I (7853661) fod-reg: Processing unsent business event uid[614348190] is_valid[1] len[1760]

2025-06-02 22:32:09.589

fod-reg

I (7853731) fod-reg: Processing unsent business event uid[1862688490] is_valid[1] len[1760]

2025-06-02 22:32:09.596

fod-reg

I (7853731) fod-reg: State transition from FOD_REG_STATE_POPULATING to FOD_REG_STATE_QUEUE_WAIT

2025-06-02 22:43:04.635

fod-reg

I (8508761) fod-reg: State transition from FOD_REG_STATE_QUEUE_WAIT to FOD_REG_STATE_PAUSED

2025-06-02 22:43:11.739

fod-reg

I (8515861) fod-reg: State transition from FOD_REG_STATE_PAUSED to FOD_REG_STATE_QUEUE_WAIT

2025-06-02 22:52:07.765

fod-reg

I (9051891) fod-reg: Max calls condition is met (last-action[1748903527] allowed-from[1748904727] now[1748904727] bundle-size[2kB]), proceeding ...

2025-06-02 22:52:07.771

fod-reg

I (9051891) fod-reg: Ready to register unsent transactions

2025-06-02 22:52:07.776

fod-reg

I (9051891) fod-reg: Messages remaining in unsent queue: 3

2025-06-02 22:52:07.782

fod-reg

I (9051901) fod-reg: Bundle for FOD assembled items[2] size[2/3kB]

2025-06-02 22:52:07.788

fod-reg

I (9051901) fod-reg: State transition from FOD_REG_STATE_QUEUE_WAIT to FOD_REG_STATE_READY

2025-06-02 22:52:08.780

fod-reg

I (9052911) fod-reg: State transition from FOD_REG_STATE_READY to FOD_REG_STATE_SENDING

2025-06-02 22:52:09.633

fod-reg

I (9053761) fod-reg: [WS_REG] HTTP callback type[1] status[200] response[len[3]]

2025-06-02 22:52:09.638

fod-reg

I (9053761) fod-reg: State transition from FOD_REG_STATE_SENDING to FOD_REG_STATE_SENT

2025-06-02 22:52:09.775

fod-reg

I (9053911) fod-reg: POS events sent, marking as sent

2025-06-02 22:52:09.941

fod-reg

I (9054071) fod-reg: State transition from FOD_REG_STATE_SENT to FOD_REG_STATE_IDLE

2025-06-02 22:52:10.938

fod-reg

I (9055071) fod-reg: State transition from FOD_REG_STATE_IDLE to FOD_REG_STATE_POPULATING

2025-06-02 22:52:11.935

fod-reg

I (9056071) fod-reg: Collecting items until 3072 bytes

2025-06-02 22:52:12.001

fod-reg

I (9056131) fod-reg: Processing unsent business event uid[1862688490] is_valid[1] len[1760]

2025-06-02 22:52:12.009

fod-reg

I (9056131) fod-reg: State transition from FOD_REG_STATE_POPULATING to FOD_REG_STATE_QUEUE_WAIT

2025-06-02 22:58:18.523

fod-reg

I (9422641) fod-reg: Processing unsent business event uid[423487718] is_valid[1] len[748]

2025-06-02 22:58:20.254

fod-reg

I (9424381) fod-reg: Processing unsent business event uid[1265394205] is_valid[1] len[748]

2025-06-02 23:12:10.006

fod-reg

I (10254121) fod-reg: Max calls condition is met (last-action[1748904729] allowed-from[1748905929] now[1748905929] bundle-size[2kB]), proceeding ...

2025-06-02 23:12:10.012

fod-reg

I (10254121) fod-reg: Ready to register unsent transactions

2025-06-02 23:12:10.017

fod-reg

I (10254121) fod-reg: Messages remaining in unsent queue: 5

2025-06-02 23:12:10.023

fod-reg

I (10254131) fod-reg: Bundle for FOD assembled items[2] size[2/3kB]

2025-06-02 23:12:10.029

fod-reg

I (10254131) fod-reg: State transition from FOD_REG_STATE_QUEUE_WAIT to FOD_REG_STATE_READY

2025-06-02 23:12:11.021

fod-reg

I (10255141) fod-reg: State transition from FOD_REG_STATE_READY to FOD_REG_STATE_SENDING

2025-06-02 23:12:11.924

fod-reg

I (10256041) fod-reg: [WS_REG] HTTP callback type[1] status[200] response[len[3]]

2025-06-02 23:12:11.930

fod-reg

I (10256041) fod-reg: State transition from FOD_REG_STATE_SENDING to FOD_REG_STATE_SENT

2025-06-02 23:12:12.017

fod-reg

I (10256141) fod-reg: POS events sent, marking as sent

2025-06-02 23:12:12.427

fod-reg

I (10256531) fod-reg: State transition from FOD_REG_STATE_SENT to FOD_REG_STATE_IDLE

2025-06-02 23:12:13.420

fod-reg

I (10257541) fod-reg: State transition from FOD_REG_STATE_IDLE to FOD_REG_STATE_POPULATING

2025-06-02 23:12:14.416

fod-reg

I (10258541) fod-reg: Collecting items until 3072 bytes

2025-06-02 23:12:14.456

fod-reg

I (10258571) fod-reg: Processing unsent business event uid[1265394205] is_valid[1] len[748]

2025-06-02 23:12:14.492

fod-reg

I (10258611) fod-reg: Processing unsent business event uid[2138655800] is_valid[1] len[748]

2025-06-02 23:12:14.530

fod-reg

I (10258641) fod-reg: Processing unsent business event uid[1387643511] is_valid[1] len[748]

2025-06-02 23:12:14.538

fod-reg

I (10258651) fod-reg: State transition from FOD_REG_STATE_POPULATING to FOD_REG_STATE_QUEUE_WAIT

2025-06-02 23:13:12.572

fod-reg

I (10316681) fod-reg: State transition from FOD_REG_STATE_QUEUE_WAIT to FOD_REG_STATE_PAUSED

2025-06-02 23:13:16.764

fod-reg

I (10320871) fod-reg: State transition from FOD_REG_STATE_PAUSED to FOD_REG_STATE_QUEUE_WAIT

  1. Groen: versturen naar WS_REG gedurende het 22ste uur
  2. Paars: versturen naar WS_REG gedurende het 23ste uur

MaxCalls active slot

Hier werd maxBuffer op 10 gezet

Gebruikte config:

{
   "dataResultUrl": "https://secure.acc.gks2-0.be/business/query/success",
   "errorResultUrl": "https://secure.acc.gks2-0.be/business/query/error",
   "actionId": "2025-04-17T13:52:05.123Z",
   "messageDateTimeEcho": "2025-06-01T22:12:38.747Z",
   "operationType": "SET_PARAMS",
   "executable": {
      "query": "mutation SetParams($paramsVersionObject: ParamsVersionObjectInput!) { setParams(paramsVersionObject: $paramsVersionObject) { device { fdmId fdmDateTime bufferCapacityUsed } configuration { paramsVersionObject { paramsVersion } fdmLockFromDateList { fromSystemDate fdmLock lockReason { language message } } } } }",
      "operationName": "SetParams",
      "variables": {
         "paramsVersionObject": {
            "paramsArray": [
               {
                  "params": {
                     "url": "https://www.gks2-0.be",
                     "footer": [
                        "FPS FIN Footer 1",
                        "ParamsVerion: 2025-04-07T09:33:03Z"
                     ],
                     "maxCalls": [
                        {
                           "hour": 18,
                           "dayOfWeek": "SATURDAY",
                           "maxCallsInSlot": 0
                        },
                        {
                           "hour": 13,
                           "dayOfWeek": "MONDAY",
                           "maxCallsInSlot": 2
                        },
                        {
                           "hour": 11,
                           "dayOfWeek": "MONDAY",
                           "maxCallsInSlot": 0
                        }
                     ],
                     "postpone": true,
                     "maxBuffer": 5,
                     "maxMsgSize": 3,
                     "nopInterval": 600,
                     "initInterval": 345600,
                     "queryInterval": 1800,
                     "retryIntervals": [
                        5,
                        60,
                        300,
                        300,
                        300,
                        3600,
                        10800
                     ],
                     "defaultMaxCalls": 30,
                     "retryIntervalsInit": [
                        5,
                        60,
                        300,
                        300,
                        300,
                        3600,
                        10800
                     ]
                  },
                  "fromSystemDate": "2025-04-01"
               }
            ],
            "paramsVersion": "2025-04-17T13:52:05Z"
         }
      }
   }
}

onderstaande log toont aan dat op maandag omstreeks 11 uur UTC tijd er geen niet-verzonden transaties naar FODFIN-CLOUD werden verzonden:

2025-06-02 11:14:22.851

fod-reg

I (119436) fod-reg: State transition from FOD_REG_STATE_IDLE to FOD_REG_STATE_POPULATING

2025-06-02 11:14:23.839

fod-reg

I (120436) fod-reg: Collecting items until 3072 bytes

2025-06-02 11:14:23.881

fod-reg

I (120466) fod-reg: Processing unsent business event uid[3745832586] is_valid[1] len[747]

2025-06-02 11:14:23.888

fod-reg

I (120466) fod-reg: State transition from FOD_REG_STATE_POPULATING to FOD_REG_STATE_QUEUE_WAIT

2025-06-02 11:14:30.158

fod-reg

I (126746) fod-reg: Processing unsent business event uid[3296070621] is_valid[1] len[747]

2025-06-02 11:14:37.066

fod-reg

I (133656) fod-reg: Processing unsent business event uid[1598737180] is_valid[1] len[748]

2025-06-02 11:14:42.934

fod-reg

I (139526) fod-reg: Processing unsent business event uid[141989956] is_valid[1] len[748]

2025-06-02 11:14:46.698

fod-reg

I (143286) fod-reg: Processing unsent business event uid[1514572897] is_valid[1] len[748]

2025-06-02 11:15:49.185

fod-reg

I (205756) fod-reg: State transition from FOD_REG_STATE_QUEUE_WAIT to FOD_REG_STATE_PAUSED

2025-06-02 11:15:51.280

fod-reg

I (207856) fod-reg: Setting NOP interval: nop-interval[600] last-action[1748862778] now[1748862951] elapsed[173] togo[427] next-run-time[1748863378] call-scheduled[false]

2025-06-02 11:15:51.288

fod-reg

I (207866) fod-reg: State transition from FOD_REG_STATE_PAUSED to FOD_REG_STATE_QUEUE_WAIT

2025-06-02 11:22:04.328

fod-reg

I (580906) fod-reg: State transition from FOD_REG_STATE_QUEUE_WAIT to FOD_REG_STATE_PAUSED

2025-06-02 11:22:08.433

fod-reg

I (585006) fod-reg: Setting NOP interval: nop-interval[600] last-action[1748862778] now[1748863328] elapsed[550] togo[50] next-run-time[1748863378] call-scheduled[false]

2025-06-02 11:22:08.442

fod-reg

I (585016) fod-reg: State transition from FOD_REG_STATE_PAUSED to FOD_REG_STATE_QUEUE_WAIT

2025-06-02 11:22:58.432

fod-reg

I (635026) fod-reg: NOP

2025-06-02 11:22:58.438

fod-reg

I (635026) fod-reg: [NOP] Last action: 600s ago, NOP interval[600] unsentEventCount[6] do_nop[false]

2025-06-02 11:22:58.454

fod-reg

I (635026) fod-reg: Setting NOP interval: nop-interval[600] last-action[1748863378] now[1748863378] elapsed[0] togo[600] next-run-time[1748863978] call-scheduled[true]

2025-06-02 11:32:58.448

fod-reg

I (1235036) fod-reg: NOP

2025-06-02 11:32:58.458

fod-reg

I (1235036) fod-reg: [NOP] Last action: 1200s ago, NOP interval[600] unsentEventCount[6] do_nop[false]

2025-06-02 11:32:58.470

fod-reg

I (1235036) fod-reg: Setting NOP interval: nop-interval[600] last-action[1748863978] now[1748863978] elapsed[0] togo[600] next-run-time[1748864578] call-scheduled[true]

2025-06-02 11:42:58.463

fod-reg

I (1835046) fod-reg: NOP

2025-06-02 11:42:58.474

fod-reg

I (1835046) fod-reg: [NOP] Last action: 1800s ago, NOP interval[600] unsentEventCount[6] do_nop[false]

2025-06-02 11:42:58.485

fod-reg

I (1835046) fod-reg: Setting NOP interval: nop-interval[600] last-action[1748864578] now[1748864578] elapsed[0] togo[600] next-run-time[1748865178] call-scheduled[true]

2025-06-02 11:52:09.514

fod-reg

I (2386066) fod-reg: State transition from FOD_REG_STATE_QUEUE_WAIT to FOD_REG_STATE_PAUSED

2025-06-02 11:52:14.614

fod-reg

I (2391166) fod-reg: Setting NOP interval: nop-interval[600] last-action[1748862778] now[1748865134] elapsed[2356] togo[0] next-run-time[1748865134] call-scheduled[false]

2025-06-02 11:52:14.625

fod-reg

I (2391186) fod-reg: State transition from FOD_REG_STATE_PAUSED to FOD_REG_STATE_QUEUE_WAIT

2025-06-02 11:52:14.625

fod-reg

I (2391186) fod-reg: NOP

2025-06-02 11:52:14.636

fod-reg

I (2391196) fod-reg: [NOP] Last action: 2356s ago, NOP interval[600] unsentEventCount[6] do_nop[false]

2025-06-02 11:52:14.649

fod-reg

I (2391196) fod-reg: Setting NOP interval: nop-interval[600] last-action[1748865134] now[1748865134] elapsed[0] togo[600] next-run-time[1748865734] call-scheduled[true]

2025-06-02 12:00:00.653

fod-reg

I (2857216) fod-reg: Max calls condition is met (last-action[1748862778] allowed-from[1748862898] now[1748865600] bundle-size[2kB]), proceeding ...

2025-06-02 12:00:00.659

fod-reg

I (2857216) fod-reg: Ready to register unsent transactions

2025-06-02 12:00:00.665

fod-reg

I (2857216) fod-reg: Messages remaining in unsent queue: 6

2025-06-02 12:00:00.670

fod-reg

I (2857226) fod-reg: Bundle for FOD assembled items[4] size[2/3kB]

2025-06-02 12:00:00.676

fod-reg

I (2857226) fod-reg: State transition from FOD_REG_STATE_QUEUE_WAIT to FOD_REG_STATE_READY

2025-06-02 12:00:01.668

fod-reg

I (2858236) fod-reg: State transition from FOD_REG_STATE_READY to FOD_REG_STATE_SENDING

2025-06-02 12:00:02.582

fod-reg

I (2859146) fod-reg: [WS_REG] HTTP callback type[1] status[200] response[len[3]]

2025-06-02 12:00:02.587

fod-reg

I (2859146) fod-reg: State transition from FOD_REG_STATE_SENDING to FOD_REG_STATE_SENT

2025-06-02 12:00:02.664

fod-reg

I (2859236) fod-reg: POS events sent, marking as sent

De transacties ontvangen in het tijdslot van 11 uur werden pas in het slot van 12u verzonden.

Hetzelfde word nu herhaalt maar in het tijdslot van 13 uur, om aan te tonen dat we slechts 2 maal WS_REG contacteren. Dit tonen we aan de de failed-requests (met inclusief geslaagde requests) te printen:

Bij aanvang van het timeslot werden 2 POS events naar de Checkbox verzonden, voldoende om een pakket van 3kB (=maxMsgSize) te vormen.

2025-06-02T14:00:01Z
Request POST https://secure.acc.gks2-0.be/business/reg
accept: application/json Content-Type: application/json
{"unsentEventCount":6,"fdmId":"CBX01000001","events": [{"enrichedEventData":{"bookingDate":"2024-10-04","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":20,"deviceId":"80:1A:A6:75:66:FC","employeeId":"80113078968","estNo":"2000000042","eventCounter":18219,"eventLabel":"T","eventOperation":"WORK_IN","fdmDateTime":"2025-06-02T13:00:42.025Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+feat","language":"NL","posDateTime":"2025-06-02T13:00:42+00:00","posFiscalTicketNo":1010,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"POS-2-REC","ticketMedium":"NONE","totalCounter":122406,"vatNo":"BE0000000097"},"digitalSignature":"MEQCIBmKtYCf4ympdQYU+bvUHBvzlF3UWb6vwyGBANJ8yaPvAiBrHUOT08kyUXHyvedbYWAtx8/2ueoGTmVT6xub9CqgDg==","shortSignature":"","fdmLocalisation":{}},{"enrichedEventData":{"bookingDate":"2024-10-04","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":25,"deviceId":"80:1A:A6:75:66:FC","employeeId":"80113078968","estNo":"2000000042","eventCounter":18220,"eventLabel":"T","eventOperation":"WORK_IN","fdmDateTime":"2025-06-02T13:00:43.357Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+feat","language":"NL","posDateTime":"2025-06-02T13:00:43+00:00","posFiscalTicketNo":1010,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"POS-2-REC","ticketMedium":"NONE","totalCounter":122407,"vatNo":"BE0000000097"},"digitalSignature":"MEUCIQCiUbmPLa1CarBy6j7JArsBw9KlpEAynSOv7yHiEmEXPAIgEywd5vgaUZE5F77w3aWJavUUwbM+l7114V3U+o+s9TY=","shortSignature":"","fdmLocalisation":{}},{"enrichedEventData":{"bookingDate":"2024-10-04","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":30,"deviceId":"80:1A:A6:75:66:FC","employeeId":"80113078968","estNo":"2000000042","eventCounter":18221,"eventLabel":"T","eventOperation":"WORK_IN","fdmDateTime":"2025-06-02T13:00:44.483Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+feat","language":"NL","posDateTime":"2025-06-02T13:00:44+00:00","posFiscalTicketNo":1010,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"POS-2-REC","ticketMedium":"NONE","totalCounter":122408,"vatNo":"BE0000000097"},"digitalSignature":"MEYCIQCzd1Wn19d0yhvO1xhiHoZDPsUC/A2SY+YPYP4hWZxWVwIhAKoJCBLUeOf+yfGxM+7fPMhK+5dIMcSdNFyStTbMsyHL","shortSignature":"","fdmLocalisation":{}},{"enrichedEventData":{"bookingDate":"2024-10-04","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":35,"deviceId":"80:1A:A6:75:66:FC","employeeId":"80113078968","estNo":"2000000042","eventCounter":18222,"eventLabel":"T","eventOperation":"WORK_IN","fdmDateTime":"2025-06-02T13:00:45.814Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+feat","language":"NL","posDateTime":"2025-06-02T13:00:45+00:00","posFiscalTicketNo":1010,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"POS-2-REC","ticketMedium":"NONE","totalCounter":122409,"vatNo":"BE0000000097"},"digitalSignature":"MEQCIF0lsvsh2iQg1PC8zpaO5ahb9OwbgC00RvUe6rbV6QkKAiAbgH+EhnYvrIpV2PGh5feONpWnxBUjlKlRf/iiAUxiCQ==","shortSignature":"","fdmLocalisation":{}}]}
Reply 200
x-amzn-RequestId:612389b1-fb09-45ea-8a32-d6fe2d6afff3x-amz-apigw-id:LigvYHOTFiAFQPg=X-Amzn-Trace-Id:Root=1-683dae62-03a95228a5829bd4bff39909content-type:application/jsoncontent-length:3date:Mon, 02 Jun 2025 14:00:01 GMT
{ }

2025-06-02T13:30:38Z
Request POST https://secure.acc.gks2-0.be/business/reg
accept: application/json Content-Type: application/json
{"unsentEventCount":3,"fdmId":"CBX01000001","events": [{"enrichedEventData":{"bookingDate":"2024-10-04","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":20,"deviceId":"80:1A:A6:75:66:FC","employeeId":"80113078968","estNo":"2000000042","eventCounter":18215,"eventLabel":"T","eventOperation":"WORK_IN","fdmDateTime":"2025-06-02T13:00:34.959Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+feat","language":"NL","posDateTime":"2025-06-02T13:00:34+00:00","posFiscalTicketNo":1010,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"POS-2-REC","ticketMedium":"NONE","totalCounter":122402,"vatNo":"BE0000000097"},"digitalSignature":"MEQCIH0z1LXrqmVX4N7pfou0tFixWt6BqyGhqMgFwXwkrppoAiALwgwWJP11nxvfYVzSnlX8VKHLq4TSGgvuHc1VkC/ohA==","shortSignature":"","fdmLocalisation":{}},{"enrichedEventData":{"bookingDate":"2024-10-04","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":25,"deviceId":"80:1A:A6:75:66:FC","employeeId":"80113078968","estNo":"2000000042","eventCounter":18216,"eventLabel":"T","eventOperation":"WORK_IN","fdmDateTime":"2025-06-02T13:00:36.805Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+feat","language":"NL","posDateTime":"2025-06-02T13:00:36+00:00","posFiscalTicketNo":1010,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"POS-2-REC","ticketMedium":"NONE","totalCounter":122403,"vatNo":"BE0000000097"},"digitalSignature":"MEUCIQCh6pqJSjH5N19dES7mwgmlAk6YqKv3PGQ/XCWBksJHSAIgSXjw0njO4AUa+cAgHrHDDkX7ylrDYGLcpXeZdOuL7Yw=","shortSignature":"","fdmLocalisation":{}},{"enrichedEventData":{"bookingDate":"2024-10-04","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":25,"deviceId":"80:1A:A6:75:66:FC","employeeId":"80113078968","estNo":"2000000042","eventCounter":18217,"eventLabel":"T","eventOperation":"WORK_IN","fdmDateTime":"2025-06-02T13:00:38.240Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+feat","language":"NL","posDateTime":"2025-06-02T13:00:38+00:00","posFiscalTicketNo":1010,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"POS-2-REC","ticketMedium":"NONE","totalCounter":122404,"vatNo":"BE0000000097"},"digitalSignature":"MEUCIB5vv/PhpQ/Kclt3p+0AXp/zt2kJX18BXtAaaW2FXJJQAiEArEIW5W2VO239v15/JLKzmrH9EZocw6Op1NIOMrZPOU0=","shortSignature":"","fdmLocalisation":{}},{"enrichedEventData":{"bookingDate":"2024-10-04","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":15,"deviceId":"80:1A:A6:75:66:FC","employeeId":"80113078968","estNo":"2000000042","eventCounter":18218,"eventLabel":"T","eventOperation":"WORK_IN","fdmDateTime":"2025-06-02T13:00:40.488Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+feat","language":"NL","posDateTime":"2025-06-02T13:00:40+00:00","posFiscalTicketNo":1010,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"POS-2-REC","ticketMedium":"NONE","totalCounter":122405,"vatNo":"BE0000000097"},"digitalSignature":"MEUCIQDRmv38shtdDn4mLHEUkJt62MuX9btu8cdSQQ5qoTue4AIgXyI9J8Im8YBmXRRA50IZp5yqD9lVX69iVyXhm9Tv+Dg=","shortSignature":"","fdmLocalisation":{}}]}
Reply 200
x-amzn-RequestId:ddd7ed9e-e312-4c88-971a-4a7681795510x-amz-apigw-id:Licb7GQLliAFV6w=X-Amzn-Trace-Id:Root=1-683da77f-3f71f33cde083bfc8a54c708content-type:application/jsoncontent-length:3date:Mon, 02 Jun 2025 13:30:38 GMT
{ }


2025-06-02T13:00:36Z
Request POST https://secure.acc.gks2-0.be/business/reg
accept: application/json Content-Type: application/json
{"unsentEventCount":3,"fdmId":"CBX01000001","events": [{"enrichedEventData":{"bookingDate":"2024-10-04","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":40,"deviceId":"80:1A:A6:75:66:FC","employeeId":"80113078968","estNo":"2000000042","eventCounter":18211,"eventLabel":"T","eventOperation":"WORK_IN","fdmDateTime":"2025-06-02T12:23:39.606Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+feat","language":"NL","posDateTime":"2025-06-02T12:23:39+00:00","posFiscalTicketNo":1010,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"POS-2-REC","ticketMedium":"NONE","totalCounter":122398,"vatNo":"BE0000000097"},"digitalSignature":"MEQCIC+lni8wd939d4wrXEDuboovMQtHZgCLh5Gg7/8mOGBbAiA43/CMbR4ZXvWPWWt6mO4e61h/gN7VAqI0AKR6vQtXiA==","shortSignature":"","fdmLocalisation":{}},{"enrichedEventData":{"bookingDate":"2024-10-04","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":45,"deviceId":"80:1A:A6:75:66:FC","employeeId":"80113078968","estNo":"2000000042","eventCounter":18212,"eventLabel":"T","eventOperation":"WORK_IN","fdmDateTime":"2025-06-02T12:23:40.732Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+feat","language":"NL","posDateTime":"2025-06-02T12:23:40+00:00","posFiscalTicketNo":1010,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"POS-2-REC","ticketMedium":"NONE","totalCounter":122399,"vatNo":"BE0000000097"},"digitalSignature":"MEQCIGKicfRikU9/jcl6RyMEZpPNmyVTJyQD8Ycxj0ZROf0cAiA6ZoPG3SkfxdleOoQV6plWMtNk56GMkWk7P2NYTx+oKw==","shortSignature":"","fdmLocalisation":{}},{"enrichedEventData":{"bookingDate":"2024-10-04","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":50,"deviceId":"80:1A:A6:75:66:FC","employeeId":"80113078968","estNo":"2000000042","eventCounter":18213,"eventLabel":"T","eventOperation":"WORK_IN","fdmDateTime":"2025-06-02T12:23:42.061Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+feat","language":"NL","posDateTime":"2025-06-02T12:23:42+00:00","posFiscalTicketNo":1010,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"POS-2-REC","ticketMedium":"NONE","totalCounter":122400,"vatNo":"BE0000000097"},"digitalSignature":"MEQCIF3wh3B3nOVmUu1ms738R5jtyoKwjowfNfigGreazQHXAiB/UzGx06CeJV+Yy26HvBoWT3JDab81hYgdgrKXaJXdZQ==","shortSignature":"","fdmLocalisation":{}},{"enrichedEventData":{"bookingDate":"2024-10-04","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":15,"deviceId":"80:1A:A6:75:66:FC","employeeId":"80113078968","estNo":"2000000042","eventCounter":18214,"eventLabel":"T","eventOperation":"WORK_IN","fdmDateTime":"2025-06-02T13:00:33.697Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+feat","language":"NL","posDateTime":"2025-06-02T13:00:33+00:00","posFiscalTicketNo":1010,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"POS-2-REC","ticketMedium":"NONE","totalCounter":122401,"vatNo":"BE0000000097"},"digitalSignature":"MEQCIEz9Kuavk4odt3CvnTYlx4ee2NLlL5w7tg+xQPumV0dgAiBUGsEd36gdDWDAdG4dC+DQKGjJMQCtV5Qfogi0gRPlYw==","shortSignature":"","fdmLocalisation":{}}]}
Reply 200
x-amzn-RequestId:d9b6f70a-5711-4646-a2eb-794d2df6e0a5x-amz-apigw-id:LiYCXFLOFiAFrZA=X-Amzn-Trace-Id:Root=1-683da075-b513a58e6c8f3edda8125ea8content-type:application/jsoncontent-length:3date:Mon, 02 Jun 2025 13:00:36 GMT
{ }

Bovenstaande records tonen aan dat er slechts 2 regitraties via WS_REG uitgevoerd zijn in het slot van 13 uur. Zodra het uur verstreken was werd het volgende pakket verzonden

Postpone - timeout

Wanner postpone actief en er zijn niet verzonden transacties in de buffer maar niet genoeg om een pakket met grote van maxMsgSize te maken. Dan worden deze events uiterlijk 1 uur later verstuurd, sinds de timeout dan verstreken is.

In het onderstaande bewijst stuk is te zien dat om 2025-06-02T09:37:43Z een pakket verzonden is naar WS_REG met slechts 1 event.

2025-06-02T09:47:44Z
Request POST https://secure.acc.gks2-0.be/business/reg
accept: application/json Content-Type: application/json
{"unsentEventCount":0,"fdmId":"CBX01000001","events":[]}
Reply 200
x-amzn-RequestId:f07afb75-ef69-40d8-988c-bd778d5ecf46x-amz-apigw-id:Lh7yRGihFiAFpNg=X-Amzn-Trace-Id:Root=1-683d7341-4f90cf1f76e3a1b3a447f6e2content-type:application/jsoncontent-length:3date:Mon, 02 Jun 2025 09:47:44 GMT
{ }

2025-06-02T09:37:43Z
Request POST https://secure.acc.gks2-0.be/business/reg
accept: application/json Content-Type: application/json
{"unsentEventCount":1,"fdmId":"CBX01000001","events": [{"enrichedEventData":{"bookingDate":"2024-10-04","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":0,"deviceId":"80:1A:A6:75:66:FC","employeeId":"80113078968","estNo":"2000000042","eventCounter":18193,"eventLabel":"T","eventOperation":"WORK_IN","fdmDateTime":"2025-06-02T08:38:06.574Z","fdmId":"CBX01000001","fdmSwVersion":"0.1.4+feat","language":"NL","posDateTime":"2025-06-02T08:38:06+00:00","posFiscalTicketNo":1010,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"POS-2-REC","ticketMedium":"NONE","totalCounter":122380,"vatNo":"BE0000000097"},"digitalSignature":"MEUCIHq9gg//deaHcny5Kvrgdjm9XorJXpGKTF+WfUvudMeDAiEA89UrGt5rX/cE8gbP3r00H1r7sXzDUMuIYNFpJPkMS74=","shortSignature":"","fdmLocalisation":{}}]}
Reply 200
x-amzn-RequestId:e52209d1-2d23-4577-8275-6a80a47c9ffax-amz-apigw-id:Lh6UTF67FiAFVxQ=X-Amzn-Trace-Id:Root=1-683d70e7-1613beff2c58ec4fd8593c25content-type:application/jsoncontent-length:3date:Mon, 02 Jun 2025 09:37:43 GMT
{ }

2025-06-02T08:37:40Z
Request POST https://secure.acc.gks2-0.be/business/reg
accept: application/json Content-Type: application/json
{"unsentEventCount":0,"fdmId":"CBX01000001","events":[]}
Reply 200
x-amzn-RequestId:109ba499-bcf8-47b0-a2e4-724e5d18a049x-amz-apigw-id:LhxhkH2lFiAFkwQ=X-Amzn-Trace-Id:Root=1-683d62d6-e5c033a6b400484bf980da27content-type:application/jsoncontent-length:3date:Mon, 02 Jun 2025 08:37:42 GMT
{ }

WS_NOP

Onderstaande activiteit op WS_NOP werd geregistreerd, met nopInterval op 600

2025-06-02T21:41:59Z
Request POST https://secure.acc.gks2-0.be/business/reg
accept: application/json Content-Type: application/json
{"unsentEventCount":0,"fdmId":"CBX01000001","events":[]}
Reply 200
x-amzn-RequestId:5f3a9e0e-3b96-4890-a825-11dcb2491c98x-amz-apigw-id:LjkaaHEXFiAFukg=X-Amzn-Trace-Id:Root=1-683e1aa8-dfbd22177c7aa1fa01e3f5decontent-type:application/jsoncontent-length:3date:Mon, 02 Jun 2025 21:42:02 GMT
{ }

2025-06-02T21:31:58Z
Request POST https://secure.acc.gks2-0.be/business/reg
accept: application/json Content-Type: application/json
{"unsentEventCount":0,"fdmId":"CBX01000001","events":[]}
Reply 200
x-amzn-RequestId:1198c205-a6b2-4f0a-b133-d5b227278ba7x-amz-apigw-id:Lji8gHE7FiAFrqQ=X-Amzn-Trace-Id:Root=1-683e184f-cd9e263126d94a0d2c22bc6acontent-type:application/jsoncontent-length:3date:Mon, 02 Jun 2025 21:31:59 GMT
{ }

2025-06-02T21:21:57Z
Request POST https://secure.acc.gks2-0.be/business/reg
accept: application/json Content-Type: application/json
{"unsentEventCount":0,"fdmId":"CBX01000001","events":[]}
Reply 200
x-amzn-RequestId:ecfbff49-fa26-4789-b49f-d8c9f3a8cd61x-amz-apigw-id:LjhemEbTFiAFgZg=X-Amzn-Trace-Id:Root=1-683e15f6-1b68a7b3ae3e254a93c04146content-type:application/jsoncontent-length:3date:Mon, 02 Jun 2025 21:21:58 GMT
{ }

2025-06-02T21:11:56Z
Request POST https://secure.acc.gks2-0.be/business/reg
accept: application/json Content-Type: application/json
{"unsentEventCount":0,"fdmId":"CBX01000001","events":[]}
Reply 200
x-amzn-RequestId:66d8721a-b908-4edf-b474-26795c24c47ax-amz-apigw-id:LjgAqFM9FiAFZQQ=X-Amzn-Trace-Id:Root=1-683e139d-309f449bbd1fd411d4842b16content-type:application/jsoncontent-length:3date:Mon, 02 Jun 2025 21:11:56 GMT
{ }

Dit toont aan dat de NOP bij een lege buffer elke nopInterval WS_NOP aanroept.

WS_QUERY

Werking queryInterval

De actieve parameter configuratie:

Init Interval: 345600
Nop Interval: 600
Max Buffer: 5
Query Interval: 1800
Retry Intervals: 7
  0: 5
  1: 60
  2: 300
  3: 300
  4: 300
  5: 3600
  6: 10800
Retry Intervals Init: 7
  0: 5
  1: 60
  2: 300
  3: 300
  4: 300
  5: 3600
  6: 10800
Max Msg Size: 3
Postpone: true
Default Max Calls: 0
Max Calls:
Footer:
  - FPS FIN Footer 1
  - ParamsVerion: 2025-04-17T13:52:05Z

Met deze parameters wordt de WS_QUERY-service elke 1800 seconden (30 minuten) aangeroepen.

Om dit te bewijzen werd de failed-request buffer gebruikt, dat in deze test build alle communicatie met FODFIN-Cloud registreert:

2025-06-02T01:43:24Z
Request GET https://secure.acc.gks2-0.be/business/query
accept: application/json Date: Mon, 02 Jun 2025 01:43:24 GMT
Reply 200
x-amzn-RequestId:232011ef-a233-4eb2-a462-48517c41b153x-amz-apigw-id:Lg01qGzRFiAFnjA=X-Amzn-Trace-Id:Root=1-683d01bd-abdcb82c2b08ddb8de05f576content-type:application/jsoncontent-length:2date:Mon, 02 Jun 2025 01:43:26 GMT
[]

2025-06-02T01:13:19Z
Request GET https://secure.acc.gks2-0.be/business/query
accept: application/json Date: Mon, 02 Jun 2025 01:13:19 GMT
Reply 200
x-amzn-RequestId:3012ee72-607b-4e9b-981d-d62b2e66b417x-amz-apigw-id:LgwbmE0MFiAFrgg=X-Amzn-Trace-Id:Root=1-683cfab0-96fa4358c28c8468675d9ff9content-type:application/jsoncontent-length:2date:Mon, 02 Jun 2025 01:13:21 GMT
[]

2025-06-02T00:43:15Z
Request GET https://secure.acc.gks2-0.be/business/query
accept: application/json Date: Mon, 02 Jun 2025 00:43:15 GMT
Reply 200
x-amzn-RequestId:15182912-8209-49be-8a1a-7b3513232060x-amz-apigw-id:LgsBrGTXliAFdZg=X-Amzn-Trace-Id:Root=1-683cf3a3-7260fe7687608a1cfa4d7cffcontent-type:application/jsoncontent-length:2date:Mon, 02 Jun 2025 00:43:16 GMT
[]

Dit toont aan, dat de Checkbox effectief elke 30 minuten de WS_QUERY service aanroept.

Updating fdmLastActions

Bij het succesvol uitvoeren van WS_INIT of WS_QUERY wordt fdmLastActions timestamp aangepast.

WS_QUERY werd laatst uitgevoerd op 2025-06-02T12:22:15Z, zie onderstaande logging:

2025-06-02T12:22:15Z
Request GET https://secure.acc.gks2-0.be/business/query
accept: application/json Date: Mon, 02 Jun 2025 12:22:15 GMT
Reply 200
x-amzn-RequestId:197306cb-d1b9-446c-b10d-9da47c101710x-amz-apigw-id:LiSaxEnqFiAFb7A=X-Amzn-Trace-Id:Root=1-683d9777-1d62953bd6808ca36580be55content-type:application/jsoncontent-length:2date:Mon, 02 Jun 2025 12:22:15 GMT
[]

Vervolgens herstarten we de Checkbox en zien op de console volgende timestamps verschijnen:

2025-06-02 12:46:36.607

fdm-config

I (4406) fdm-config: Local config loaded

2025-06-02 12:46:36.612

fdm-config

I (4406) fdm-config: NTP1: time.aws.com

2025-06-02 12:46:36.613

fdm-config

I (4406) fdm-config: NTP2: time.belnet.com

2025-06-02 12:46:36.618

fdm-config

I (4416) fdm-config: POS bearer token: Lyly0HIjourgbgFO

2025-06-02 12:46:36.623

fdm-config

I (4416) fdm-config: Status:

2025-06-02 12:46:36.623

fdm-config

I (4416) fdm-config: FDM init: false

2025-06-02 12:46:36.629

fdm-config

I (4426) fdm-config: FDM last action: 1748866937

2025-06-02 12:46:36.635

fdm-config

I (4426) fdm-config: FDM last successful transaction: 1748867251

De epoch tijd 1748866937 werd als laatste opgeslaan, dit vertaalt naar UTC is 2025-06-02T12:22:17Z (het moment dat reply ontvangen werd)

Failure

Indien WS_QUERY faalt dan zal de boodschap UPDATE_TASK_LIST_FAILED zichtbaar worden:

Simulatie van de fout, een mutatie in de code zorgt ervoor alsof WS_QUERY HTTP status code 500 teruggaf:

2025-06-02T18:42:36Z
Request GET https://secure.acc.gks2-0.be/business/query
accept: application/json Date: Mon, 02 Jun 2025 18:42:36 GMT
Reply 500
x-amzn-RequestId:d1ac686f-a0b1-4f7a-87b2-67ae70ac717dx-amz-apigw-id:LjKIiFfiFiAFVxQ=X-Amzn-Trace-Id:Root=1-683df09c-0689b049341c4d70011b1d8ccontent-type:application/jsoncontent-length:2date:Mon, 02 Jun 2025 18:42:35 GMT
[]

Bij het sturen van volgende request:

{
   "query": "mutation SignWorkIn($data: WorkInOutInput!, $training: Boolean! = false) { signWorkIn(data: $data, isTraining: $training) { __typename posId posFiscalTicketNo posDateTime terminalId deviceId fdmSwVersion eventOperation digitalSignature bufferCapacityUsed fdmRef { __typename fdmId fdmDateTime eventLabel eventCounter totalCounter } warnings { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } informations { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } footer } }",
   "operationName": "SignWorkIn",
   "variables": {
      "data": {
         "language": "NL",
         "vatNo": "BE0000000097",
         "estNo": "2000000042",
         "posId": "CPOS0031234567",
         "posFiscalTicketNo": 1010,
         "posDateTime": "2025-06-02T18:50:02+00:00",
         "posSwVersion": "1.8.3",
         "terminalId": "POS-2-REC",
         "deviceId": "80:1A:A6:75:66:FC",
         "bookingPeriodId": "dffcd829-a0e5-41ca-a0ae-9eb887f95637",
         "bookingDate": "2024-10-04",
         "ticketMedium": "NONE",
         "employeeId": "80113078968"
      },
      "training": true
   }
}

werd het volgende geantwoord

{
   "data": {
      "signWorkIn": {
         "__typename": "SignResult",
         "posId": "CPOS0031234567",
         "posFiscalTicketNo": 1010,
         "posDateTime": "2025-06-02T18:50:02+00:00",
         "terminalId": "POS-2-REC",
         "deviceId": "80:1A:A6:75:66:FC",
         "fdmSwVersion": "0.1.4+feat",
         "eventOperation": "WORK_IN",
         "digitalSignature": "MEYCIQC2cllr8kUcvDyjdO/iZsLFZtdLX2P1JQKMB7zsUXH8QgIhAK1PwxNYbOEMBzVPT2kgATeJPatmje3FhkIPsq5kyzqV",
         "bufferCapacityUsed": 0,
         "fdmRef": {
            "__typename": "FdmReference",
            "fdmId": "CBX01000001",
            "fdmDateTime": "2025-06-02T18:50:02.636Z",
            "eventLabel": "T",
            "eventCounter": 18226,
            "totalCounter": 122413
         },
         "warnings": [
            {
               "__typename": "MessageItem",
               "message": "FDM kon de actieverzoeken takenlijst niet verkrijgen.",
               "locations": null,
               "extensions": {
                  "__typename": "ExtensionItem",
                  "category": "SPF_FOD",
                  "code": "UPDATE_TASK_LIST_FAILED",
                  "showPos": "OPTIONAL",
                  "data": null
               }
            }
         ],
         "informations": null,
         "footer": [
            "FPS FIN Footer 1",
            "ParamsVerion: 2025-04-17T13:52:05Z"
         ]
      }
   }
}

Dit antwoord geeft aan de de Checkbox status UPDATE_TASK_LIST_FAILED zichtbaar maakt bij het falen van WS_QUERY.

niet geldig/ontbrekend client of trust certificaat of een verkeerde url

Ter voorbereiding op WS_QUERY controleert de Checkbox-firmware eerst of zowel het client- als trustcertificaat aanwezig en geldig zijn, en of de URL niet NULL is. Is dat niet het geval, dan wordt de fout FDM_NOT_OPERATIONAL geactiveerd, gevolgd door een WS_INIT-call.

code snippit

const char *ws_query_url        = fdm_config_url_get(FDM_CONFIG_URL_QUERY);
    const bool client_cert_is_valid = fod_http_client_cert_is_valid(ctxt->http_ctxt);
    const bool trust_cert_is_valid  = fod_http_trust_cert_is_valid(ctxt->http_ctxt);
    if (!ws_query_url || !client_cert_is_valid || !trust_cert_is_valid) {
        ESP_LOGE(TAG, "FOD HTTP fallback to WS_INIT required, URL[%s] client cert valid[%d] trust cert valid[%d]",
                 STRING_SAFE_PRINT(ws_query_url), client_cert_is_valid, trust_cert_is_valid);
        fdm_config_fdm_init_set(true);
    }

Logs met emulatie van ongeldig trust certificaat:

025-06-02 14:21:30.621

fod-http

E (32444) fod-http: Trust certificate is not installed

2025-06-02 14:21:30.632

fod-query

E (32444) fod-query: FOD HTTP fallback to WS_INIT required, URL[https://secure.acc.gks2-0.be/business/query] client cert valid[1] trust cert valid[0]

2025-06-02 14:21:30.719

fod-query

I (32544) fod-query: State: FOD_QUERY_STATE_IDLE -> FOD_QUERY_STATE_INIT

2025-06-02 14:21:31.721

fod-query

I (33554) fod-query: WS_INIT: fdmLastActions[1748872355] initInterval[345600] now[1748874091] retryCount[0] retryInterval[600]

2025-06-02 14:21:31.880

fod-http

W (33694) fod-http: JWT: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJpbml0IiwiaWF0IjoxNzQ4ODc0MDkxLCJmZG1JZCI6IkNCWDAxMDAwMDAxIiwiY2xpZW50Q2VydFNuIjoiMzIzODE3Mzk5NzgzMjg0MzAwNTAxNDA0ODA0MzI0NTAyODA1NTI1MTk4Mzg5MTAzIn0.xkiRQsRezZNIDxmEvGQbUD6BP7acTunFUN3PbQIV0ahJlr4KzoKO30ssWUhzYbOFxo7RGDRXqHwmFftrdK_8Rw

2025-06-02 14:21:31.896

fod-query

I (33704) fod-query: State: FOD_QUERY_STATE_INIT -> FOD_QUERY_STATE_BUSY

2025-06-02 14:21:32.746

fod-query

I (34584) fod-query: Init - HTTP status is OK

2025-06-02 14:21:32.753

fod-query

I (34584) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_INIT_PROCESS

2025-06-02 14:21:33.233

fod-query

I (35064) fod-query: Claim certificate chain is valid

2025-06-02 14:21:33.514

fod-query

I (35344) fod-query: Digital signature verification passed

2025-06-02 14:21:33.756

fod-query

I (35584) fod-query: State: FOD_QUERY_STATE_INIT_PROCESS -> FOD_QUERY_STATE_WORK

2025-06-02 14:21:34.837

fod-query

I (36664) fod-query: Action "SET_FDM_LOCK" success

2025-06-02 14:21:35.004

fod-query

W (36834) fod-query: All init items processed successfully

Retry procedure

Hiervoor laten we WS_QUERY opzettelijk falen, door de HTTP return status code in de firmware vast te zetten op 500.

2025-06-02 18:53:12.992

fod-query

I (947114) fod-query: State: FOD_QUERY_STATE_IDLE -> FOD_QUERY_STATE_QUERY

2025-06-02 18:53:13.004

fod-query

I (947114) fod-query: WS_QUERY: fdmLastActions[1748888591] queryInterval[1800] now[1748890392] retryCount[0] retryInterval[600]

2025-06-02 18:53:13.015

fod-query

I (947114) fod-query: State: FOD_QUERY_STATE_QUERY -> FOD_QUERY_STATE_BUSY

2025-06-02 18:53:13.951

fod-query

E (948074) fod-query: Query - HTTP status is not OK

2025-06-02 18:53:13.961

fod-query

I (948074) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY

2025-06-02 18:53:14.007

fod-query

I (948134) fod-query: Scheduling retry in 5 s

2025-06-02 18:53:14.017

fod-query

I (948134) fod-query: State: FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY -> FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL

2025-06-02 18:53:19.012

fod-query

I (953134) fod-query: State: FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL -> FOD_QUERY_STATE_QUERY

2025-06-02 18:53:20.013

fod-query

I (954134) fod-query: WS_QUERY: fdmLastActions[1748888591] queryInterval[1800] now[1748890399] retryCount[1] retryInterval[5]

2025-06-02 18:53:20.028

fod-query

I (954134) fod-query: State: FOD_QUERY_STATE_QUERY -> FOD_QUERY_STATE_BUSY

2025-06-02 18:53:20.811

fod-query

E (954934) fod-query: Query - HTTP status is not OK

2025-06-02 18:53:20.822

fod-query

I (954934) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY

2025-06-02 18:53:21.017

fod-query

I (955144) fod-query: Scheduling retry in 60 s

2025-06-02 18:53:21.027

fod-query

I (955144) fod-query: State: FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY -> FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL

2025-06-02 18:54:21.023

fod-query

I (1015144) fod-query: State: FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL -> FOD_QUERY_STATE_QUERY

2025-06-02 18:54:22.029

fod-query

I (1016144) fod-query: WS_QUERY: fdmLastActions[1748888591] queryInterval[1800] now[1748890461] retryCount[2] retryInterval[60]

2025-06-02 18:54:22.039

fod-query

I (1016144) fod-query: State: FOD_QUERY_STATE_QUERY -> FOD_QUERY_STATE_BUSY

2025-06-02 18:54:22.801

fod-query

E (1016924) fod-query: Query - HTTP status is not OK

2025-06-02 18:54:22.812

fod-query

I (1016924) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY

2025-06-02 18:54:23.028

fod-query

I (1017154) fod-query: Scheduling retry in 300 s

2025-06-02 18:54:23.038

fod-query

I (1017154) fod-query: State: FOD_QUERY_STATE_ERROR_SCHEDULE_RETRY -> FOD_QUERY_STATE_ERROR_WAIT_RETRY_INTERVAL

Bovenstaande logs tonen aan dat bij WS_QUERY reeds 3x faalde en er vervolgens telkens een retry gepland was met de gepaste tijd.

Verwerken actie lijst

Hiervoor werd de response van WS_QUERY gestubbed met actielijst in code. Dit was nodig om een antwoord met acties te kunnen simuleren

Gebruikte actielijst:

[
   {
      "dataResultUrl": "https://secure.acc.gks2-0.be/business/query/success",
      "errorResultUrl": "https://secure.acc.gks2-0.be/business/query/error",
      "actionId": "2025-04-17T13:52:05.123Z",
      "messageDateTimeEcho": "2025-06-02T14:52:01.173Z",
      "operationType": "SET_FDM_LOCK",
      "executable": {
         "query": "mutation SetFdmLock($fdmLockFromDateList: [FdmLockInput!]!) { setFdmLock(fdmLockFromDateList: $fdmLockFromDateList) { device { fdmId fdmDateTime bufferCapacityUsed } configuration { paramsVersionObject { paramsVersion } fdmLockFromDateList { fromSystemDate fdmLock lockReason { language message } } } } }",
         "operationName": "SetFdmLock",
         "variables": {
            "fdmLockFromDateList": [
               {
                  "fdmLock": false,
                  "lockReason": null,
                  "fromSystemDate": "2025-01-01"
               }
            ]
         }
      }
   },
   {
      "dataResultUrl": "https://secure.acc.gks2-0.be/business/query/success",
      "errorResultUrl": "https://secure.acc.gks2-0.be/business/query/error",
      "actionId": "2025-04-17T13:52:05.123Z",
      "messageDateTimeEcho": "2025-06-02T14:52:01.185Z",
      "operationType": "SET_PARAMS",
      "executable": {
         "query": "mutation SetParams($paramsVersionObject: ParamsVersionObjectInput!) { setParams(paramsVersionObject: $paramsVersionObject) { device { fdmId fdmDateTime bufferCapacityUsed } configuration { paramsVersionObject { paramsVersion } fdmLockFromDateList { fromSystemDate fdmLock lockReason { language message } } } } }",
         "operationName": "SetParams",
         "variables": {
            "paramsVersionObject": {
               "paramsArray": [
                  {
                     "params": {
                        "url": "https://www.gks2-0.be",
                        "footer": [
                           "FPS FIN Footer 1",
                           "ParamsVerion: 2025-04-07T09:33:03Z"
                        ],
                        "maxCalls": [
                           {
                              "hour": 18,
                              "dayOfWeek": "SATURDAY",
                              "maxCallsInSlot": 0
                           },
                           {
                              "hour": 12,
                              "dayOfWeek": "SUNDAY",
                              "maxCallsInSlot": 100
                           },
                           {
                              "hour": 17,
                              "dayOfWeek": "MONDAY",
                              "maxCallsInSlot": 0
                           }
                        ],
                        "postpone": false,
                        "maxBuffer": 5,
                        "maxMsgSize": 256,
                        "nopInterval": 21600,
                        "initInterval": 345600,
                        "queryInterval": 1800,
                        "retryIntervals": [
                           5,
                           60,
                           300,
                           300,
                           300,
                           3600,
                           10800
                        ],
                        "defaultMaxCalls": 30,
                        "retryIntervalsInit": [
                           5,
                           60,
                           300,
                           300,
                           300,
                           3600,
                           10800
                        ]
                     },
                     "fromSystemDate": "2025-04-01"
                  },
                  {
                     "params": {
                        "url": "https://www.gks2-0.be",
                        "footer": [
                           "FPS FIN Footer 1",
                           "ParamsVerion: 2025-04-17T13:52:05Z"
                        ],
                        "maxCalls": [],
                        "postpone": false,
                        "maxBuffer": 100,
                        "maxMsgSize": 256,
                        "nopInterval": 21600,
                        "initInterval": 345600,
                        "queryInterval": 1800,
                        "retryIntervals": [
                           5,
                           60,
                           300,
                           300,
                           300,
                           3600,
                           10800
                        ],
                        "defaultMaxCalls": 0,
                        "retryIntervalsInit": [
                           5,
                           60,
                           300,
                           300,
                           300,
                           3600,
                           10800
                        ]
                     },
                     "fromSystemDate": "2025-04-10"
                  }
               ],
               "paramsVersion": "2025-04-17T13:52:05Z"
            }
         }
      }
   },
   {
      "dataResultUrl": "https://secure.acc.gks2-0.be/business/query/success",
      "errorResultUrl": "https://secure.acc.gks2-0.be/business/query/error",
      "actionId": "2025-04-17T13:52:05.123Z",
      "messageDateTimeEcho": "2025-06-02T14:52:01.190Z",
      "operationType": "SET_VAT_RATES",
      "executable": {
         "query": "mutation SetVatRates($vatFromBookingDateList: [VatRatesInput!]!) { setVatRates(vatFromBookingDateList: $vatFromBookingDateList) { device { fdmId fdmDateTime bufferCapacityUsed } configuration { paramsVersionObject { paramsVersion } fdmLockFromDateList { fromSystemDate fdmLock lockReason { language message } } } } }",
         "operationName": "SetVatRates",
         "variables": {
            "vatFromBookingDateList": [
               {
                  "vatRates": [
                     {
                        "vatRate": 21,
                        "vatLabel": "A",
                        "outOfScope": false
                     },
                     {
                        "vatRate": 12,
                        "vatLabel": "B",
                        "outOfScope": false
                     },
                     {
                        "vatRate": 6,
                        "vatLabel": "C",
                        "outOfScope": false
                     },
                     {
                        "vatRate": 0,
                        "vatLabel": "D",
                        "outOfScope": false
                     },
                     {
                        "vatRate": 0,
                        "vatLabel": "X",
                        "outOfScope": true
                     }
                  ],
                  "fromBookingDate": "2020-01-01"
               },
               {
                  "vatRates": [
                     {
                        "vatRate": 24,
                        "vatLabel": "A",
                        "outOfScope": false
                     },
                     {
                        "vatRate": 15,
                        "vatLabel": "B",
                        "outOfScope": false
                     },
                     {
                        "vatRate": 8,
                        "vatLabel": "C",
                        "outOfScope": false
                     },
                     {
                        "vatRate": 0,
                        "vatLabel": "D",
                        "outOfScope": false
                     },
                     {
                        "vatRate": 0,
                        "vatLabel": "X",
                        "outOfScope": true
                     }
                  ],
                  "fromBookingDate": "2026-01-01"
               }
            ]
         }
      }
   },
   {
      "dataResultUrl": "https://secure.acc.gks2-0.be/business/query/success",
      "errorResultUrl": "https://secure.acc.gks2-0.be/business/query/error",
      "actionId": "2025-04-17T13:52:05.123Z",
      "messageDateTimeEcho": "2025-06-02T14:52:01.207Z",
      "operationType": "SET_POS_ALLOWLIST",
      "executable": {
         "query": "mutation SetPosAllowlist($posIdFromDateList: [PosAllowlistInput!]!) { setPosAllowlist (posIdFromDateList: $posIdFromDateList) { device { fdmId fdmDateTime bufferCapacityUsed } configuration { paramsVersionObject { paramsVersion } fdmLockFromDateList { fromSystemDate fdmLock lockReason { language message } } posIdFromDateList { fromSystemDate posIdList } } } }",
         "operationName": "SetPosAllowlist",
         "variables": {
            "posIdFromDateList": [
               {
                  "posIdList": [
                     "Csnpos00000001",
                     "Csnpos00000003"
                  ],
                  "fromSystemDate": "2024-01-01"
               },
               {
                  "posIdList": [
                     "Csnpos00000001",
                     "Csnpos00000003",
                     "Csnpos00000004"
                  ],
                  "fromSystemDate": "2025-01-01"
               },
               {
                  "posIdList": [
                     "CPOS0031234567",
                     "CPOS0031234568",
                     "CFOD0010000100"
                  ],
                  "fromSystemDate": "2025-04-01"
               }
            ]
         }
      }
   },
   {
      "dataResultUrl": "https://secure.acc.gks2-0.be/business/query/success",
      "errorResultUrl": "https://secure.acc.gks2-0.be/business/query/error",
      "actionId": "2024-01-06T16:03:23.004Z",
      "messageDateTimeEcho": "2025-06-02T14:52:01.210Z",
      "operationType": "SET_TRUST_CERT",
      "executable": {
         "query": "mutation SetTrustCert($trustCertFromDateList: [TrustCertInput!]!) { setTrustCert(trustCertFromDateList: $trustCertFromDateList) { device { fdmId fdmDateTime bufferCapacityUsed } configuration { paramsVersionObject { paramsVersion } fdmLockFromDateList { fromSystemDate fdmLock lockReason { language message } } } } }",
         "operationName": "SetTrustCert",
         "variables": {
            "trustCertFromDateList": [
               {
                  "fromSystemDate": "2025-06-02",
                  "trustCert": [
                     "-----BEGIN CERTIFICATE-----\r\nMIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\r\nADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\r\nb24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\r\nMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\r\nb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\r\nca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\r\n9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\r\nIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\r\nVOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\r\n93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\r\njgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\r\nAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\r\nA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\r\nU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\r\nN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\r\no/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\r\n5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\r\nrqXRfboQnoZsG4q5WTP468SQvvG5\r\n-----END CERTIFICATE-----\r\n",
                     "-----BEGIN CERTIFICATE-----\r\nMIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF\r\nADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\r\nb24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL\r\nMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\r\nb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK\r\ngXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ\r\nW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg\r\n1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K\r\n8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r\r\n2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me\r\nz/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR\r\n8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj\r\nmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz\r\n7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6\r\n+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI\r\n0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB\r\nAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm\r\nUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2\r\nLIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY\r\n+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS\r\nk5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl\r\n7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm\r\nbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl\r\nurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+\r\nfUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63\r\nn749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE\r\n76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H\r\n9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT\r\n4PsJYGw=\r\n-----END CERTIFICATE-----\r\n",
                     "-----BEGIN CERTIFICATE-----\r\nMIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5\r\nMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\r\nUm9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\r\nA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\r\nQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl\r\nui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j\r\nQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr\r\nttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr\r\nBqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM\r\nYyRIHN8wfdVoOw==\r\n-----END CERTIFICATE-----",
                     "-----BEGIN CERTIFICATE-----\r\nMIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5\r\nMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\r\nUm9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\r\nA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\r\nQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi\r\n9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk\r\nM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB\r\n/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB\r\nMAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw\r\nCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW\r\n1KyLa2tJElMzrdfkviT8tQp21KW8EA==\r\n-----END CERTIFICATE-----\r\n",
                     "-----BEGIN CERTIFICATE-----\r\nMIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx\r\nEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\r\nHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs\r\nZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\r\nMDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD\r\nVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy\r\nZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy\r\ndmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\r\nhvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p\r\nOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2\r\n8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K\r\nTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe\r\nhRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk\r\n6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw\r\nDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q\r\nAdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI\r\nbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB\r\nve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z\r\nqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\r\niEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn\r\n0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN\r\nsSi6\r\n-----END CERTIFICATE-----\r\n"
                  ]
               }
            ]
         }
      }
   },
   {
      "dataResultUrl": "https://secure.acc.gks2-0.be/business/query/success",
      "errorResultUrl": "https://secure.acc.gks2-0.be/business/query/error",
      "actionId": "2025-05-05T09:11:06.392Z",
      "messageDateTimeEcho": "2025-06-02T14:52:01.212Z",
      "operationType": "SET_URLS",
      "executable": {
         "query": "mutation SetUrls($urlsFromDateList: [UrlInput!]!) { setUrls(urlsFromDateList: $urlsFromDateList) { device { fdmId fdmDateTime bufferCapacityUsed } configuration { paramsVersionObject { paramsVersion } fdmLockFromDateList { fromSystemDate fdmLock lockReason { language message } } } } }",
         "operationName": "SetUrls",
         "variables": {
            "urlsFromDateList": [
               {
                  "urls": [
                     {
                        "key": "ws_reg",
                        "value": "https://secure.acc.gks2-0.be/business/reg"
                     },
                     {
                        "key": "ws_nop",
                        "value": "https://secure.acc.gks2-0.be/business/reg"
                     },
                     {
                        "key": "ws_query",
                        "value": "https://secure.acc.gks2-0.be/business/query"
                     },
                     {
                        "key": "ws_init",
                        "value": "https://acc.gks2-0.be/public/init"
                     },
                     {
                        "key": "ws_ntp1",
                        "value": "time.aws.com"
                     },
                     {
                        "key": "ws_ntp2",
                        "value": "time.belnet.com"
                     }
                  ],
                  "fromSystemDate": "2025-01-01"
               },
               {
                  "urls": [
                     {
                        "key": "ws_reg",
                        "value": "https://secure.acc.gks2-0.be/business/reg"
                     },
                     {
                        "key": "ws_nop",
                        "value": "https://secure.acc.gks2-0.be/business/reg"
                     },
                     {
                        "key": "ws_query",
                        "value": "https://secure.acc.gks2-0.be/business/query"
                     },
                     {
                        "key": "ws_init",
                        "value": "https://acc.gks2-0.be/public/init"
                     },
                     {
                        "key": "ws_ntp1",
                        "value": "time.aws.com"
                     },
                     {
                        "key": "ws_ntp2",
                        "value": "ntp.belnet.com"
                     }
                  ],
                  "fromSystemDate": "2026-01-01"
               }
            ]
         }
      }
   }
]

2025-06-02 16:52:18.059

fod-query

I (3665870) fod-query: State: FOD_QUERY_STATE_IDLE -> FOD_QUERY_STATE_QUERY

2025-06-02 16:52:18.070

fod-query

I (3665870) fod-query: WS_QUERY: fdmLastActions[1748881337] queryInterval[1800] now[1748883138] retryCount[0] retryInterval[600]

2025-06-02 16:52:18.076

fod-query

I (3665870) fod-query: State: FOD_QUERY_STATE_QUERY -> FOD_QUERY_STATE_BUSY

2025-06-02 16:52:22.977

fod-query

I (3670790) fod-query: Query - HTTP status is OK

2025-06-02 16:52:22.988

fod-query

I (3670790) fod-query: State: FOD_QUERY_STATE_BUSY -> FOD_QUERY_STATE_QUERY_PROCESS

2025-06-02 16:52:23.083

fod-query

I (3670890) fod-query: Processing 6 actions

2025-06-02 16:52:23.090

fod-query

I (3670900) fod-query: State: FOD_QUERY_STATE_QUERY_PROCESS -> FOD_QUERY_STATE_WORK

2025-06-02 16:52:24.092

fdm-config

W (3671900) fdm-config: FDM lock: false

2025-06-02 16:52:24.096

fod-query

I (3671900) fod-query: Action "SET_FDM_LOCK" success

2025-06-02 16:52:25.181

fdm-config

I (3672990) fdm-config: FDM configuration parameters set

2025-06-02 16:52:25.187

fdm-config

I (3672990) fdm-config: Version: 2025-04-17T13:52:05Z

2025-06-02 16:52:25.192

fdm-config

I (3672990) fdm-config: Init Interval: 345600

2025-06-02 16:52:25.198

fdm-config

I (3673000) fdm-config: Nop Interval: 21600

2025-06-02 16:52:25.198

fdm-config

I (3673000) fdm-config: Max Buffer: 100

2025-06-02 16:52:25.203

fdm-config

I (3673000) fdm-config: Query Interval: 1800

2025-06-02 16:52:25.209

fdm-config

I (3673010) fdm-config: Retry Intervals: 7

2025-06-02 16:52:25.209

fdm-config

I (3673010) fdm-config: 0: 5

2025-06-02 16:52:25.214

fdm-config

I (3673020) fdm-config: 1: 60

2025-06-02 16:52:25.220

fdm-config

I (3673020) fdm-config: 2: 300

2025-06-02 16:52:25.220

fdm-config

I (3673020) fdm-config: 3: 300

2025-06-02 16:52:25.225

fdm-config

I (3673020) fdm-config: 4: 300

2025-06-02 16:52:25.225

fdm-config

I (3673030) fdm-config: 5: 3600

2025-06-02 16:52:25.231

fdm-config

I (3673030) fdm-config: 6: 10800

2025-06-02 16:52:25.237

fdm-config

I (3673030) fdm-config: Retry Intervals Init: 7

2025-06-02 16:52:25.237

fdm-config

I (3673040) fdm-config: 0: 5

2025-06-02 16:52:25.242

fdm-config

I (3673040) fdm-config: 1: 60

2025-06-02 16:52:25.242

fdm-config

I (3673040) fdm-config: 2: 300

2025-06-02 16:52:25.248

fdm-config

I (3673050) fdm-config: 3: 300

2025-06-02 16:52:25.248

fdm-config

I (3673050) fdm-config: 4: 300

2025-06-02 16:52:25.253

fdm-config

I (3673050) fdm-config: 5: 3600

2025-06-02 16:52:25.259

fdm-config

I (3673060) fdm-config: 6: 10800

2025-06-02 16:52:25.259

fdm-config

I (3673060) fdm-config: Max Msg Size: 256

2025-06-02 16:52:25.264

fdm-config

I (3673060) fdm-config: Postpone: false

2025-06-02 16:52:25.270

fdm-config

I (3673070) fdm-config: Default Max Calls: 0

2025-06-02 16:52:25.270

fdm-config

I (3673070) fdm-config: Max Calls:

2025-06-02 16:52:25.275

fdm-config

I (3673080) fdm-config: Footer:

2025-06-02 16:52:25.281

fdm-config

I (3673080) fdm-config: - FPS FIN Footer 1

2025-06-02 16:52:25.288

fdm-config

I (3673080) fdm-config: - ParamsVerion: 2025-04-17T13:52:05Z

2025-06-02 16:52:25.288

fod-query

I (3673090) fod-query: Action "SET_PARAMS" success

2025-06-02 16:52:26.373

fdm-config

I (3674180) fdm-config: VAT rates set:

2025-06-02 16:52:26.378

fdm-config

I (3674180) fdm-config: - 0: 21.000000, 0

2025-06-02 16:52:26.384

fdm-config

I (3674190) fdm-config: - 1: 12.000000, 0

2025-06-02 16:52:26.384

fdm-config

I (3674190) fdm-config: - 2: 6.000000, 0

2025-06-02 16:52:26.389

fdm-config

I (3674190) fdm-config: - 3: 0.000000, 0

2025-06-02 16:52:26.396

fdm-config

I (3674190) fdm-config: - 4: 0.000000, 1

2025-06-02 16:52:26.397

fod-query

I (3674200) fod-query: Action "SET_VAT_RATES" success

2025-06-02 16:52:27.518

fdm-config

I (3675330) fdm-config: Pos allowlist set to:

2025-06-02 16:52:27.524

fdm-config

I (3675330) fdm-config: -CPOS0031234567

2025-06-02 16:52:27.529

fdm-config

I (3675330) fdm-config: -CPOS0031234568

2025-06-02 16:52:27.529

fdm-config

I (3675330) fdm-config: -CFOD0010000100

2025-06-02 16:52:27.535

fod-query

I (3675340) fod-query: Action "SET_POS_ALLOWLIST" success

2025-06-02 16:52:28.721

fod-query

I (3676530) fod-query: Action "SET_TRUST_CERT" success

2025-06-02 16:52:29.900

fdm-config

I (3677710) fdm-config: New URLs set:

2025-06-02 16:52:29.905

fdm-config

I (3677710) fdm-config: REG: https://secure.acc.gks2-0.be/business/reg

2025-06-02 16:52:29.911

fdm-config

I (3677710) fdm-config: NOP: https://secure.acc.gks2-0.be/business/reg

2025-06-02 16:52:29.917

fdm-config

I (3677720) fdm-config: INIT: https://acc.gks2-0.be/public/init

2025-06-02 16:52:29.928

fdm-config

I (3677720) fdm-config: QUERY: https://secure.acc.gks2-0.be/business/query

2025-06-02 16:52:29.928

fdm-config

I (3677730) fdm-config: NTP1: time.aws.com

2025-06-02 16:52:29.933

fdm-config

I (3677730) fdm-config: NTP2: time.belnet.com

2025-06-02 16:52:29.938

fod-query

I (3677740) fod-query: Action "SET_URLS" success

2025-06-02 16:52:30.314

fod-query

W (3678130) fod-query: All init items processed successfully

2025-06-02 16:52:30.325

fod-query

I (3678130) fod-query: State: FOD_QUERY_STATE_WORK -> FOD_QUERY_STATE_IDLE

De geprinte geconfiguratie door fdm-config, is enkel de actieve configuratie voor de dataum 02/06.

Uit de log kunnen we besluiten dat alle acties correct verwerkt werden.

User WS_QUERY request

Via de admin console is mogelijk om een op vraag van de gebruike WS_QUERY service aan te roepen.

onderstaand werd 3 maal een WS_QUERY gevraagd via de admin console:

2025-06-02T19:14:15Z
Request GET https://secure.acc.gks2-0.be/business/query
accept: application/json Date: Mon, 02 Jun 2025 19:14:15 GMT
Reply 200
x-amzn-RequestId:9546b430-464f-499a-b3d7-3cd806edd3fcx-amz-apigw-id:LjOxVFv5FiAFmyw=X-Amzn-Trace-Id:Root=1-683df808-93f6758a418003f5821cc6d8content-type:application/jsoncontent-length:2date:Mon, 02 Jun 2025 19:14:15 GMT
[]

2025-06-02T19:14:10Z
Request GET https://secure.acc.gks2-0.be/business/query
accept: application/json Date: Mon, 02 Jun 2025 19:14:10 GMT
Reply 200
x-amzn-RequestId:58a91fff-9422-4ed1-9c1d-1a1b3bdd583fx-amz-apigw-id:LjOwhEyiFiAFpNg=X-Amzn-Trace-Id:Root=1-683df802-019032738b563bfdabfb11e0content-type:application/jsoncontent-length:2date:Mon, 02 Jun 2025 19:14:10 GMT
[]

2025-06-02T19:14:05Z
Request GET https://secure.acc.gks2-0.be/business/query
accept: application/json Date: Mon, 02 Jun 2025 19:14:05 GMT
Reply 200
x-amzn-RequestId:c31abba2-f3cb-4e8c-9096-6d62c419e99dx-amz-apigw-id:LjOvuG4kFiAFtfw=X-Amzn-Trace-Id:Root=1-683df7fd-52d764ee09c829eb34591a51content-type:application/jsoncontent-length:2date:Mon, 02 Jun 2025 19:14:05 GMT
[]

Beveiliging

Alle communicatie met de FODFIN-Cloud server gebeurt over een beveiligde mTLS verbinding gebruikmakend van het ontvangen client certificaat en Trust certificaat.

WS_NTP1/2/3

Dit werd besproken in FODFIN-Cloud/Systeemklok

POS - FDM Connectie

Hier beschrijven we hoe de POS en de FDM kunnen communiceren

POS - FDM Connectie

Connectie mogelijkheden

LAN

Wanneer de POS en de FDM zich in het zelfde netwerk bevinden, dan kan een directe Http connectie worden opgezet tussen de apparaten.

Weliswaar is er verder nog een Bearer token nodig om de communicatie mogelijk te maken. Bij elke request moet deze bearer token in de headers worden meegegeven.

Binnen een lokaal netwerk kan het adres op de Backend Tools worden gevonden.

image.png

Een andere mogelijkheid is via een Bonjour monitor tool.

Er is geen https voorhanden direct op de checkbox

WAN

Deze kan ingesteld worden in de Backoffice Tools

image.png

Dit zorgt er niet voor dat er instellingen worden gewijzigd aan enig toestel. De verantwoordelijkheid om deze reverse proxy op te zetten ligt volledig bij de installateur. dit kan Http, Https worden, alles hangt af van de instellingen van deze reverse proxy.

Deze url die men in de backoffice kan instellen heeft enkel maar nu indien men de SDK gaat gebruiken

Checkbox Bridge

De bridge kan gezien worden als een gewoon adres van de checkbox, maar dan geen lokaal ip adres, maar wel een van overal toegankelijk adres zodat dit van eender waar aanspreekbaar wordt.

Basis adres voor de POS interface is: https://api.checkbox.be/bridge/v1/pos/graphql
Basis adres voor de AC interface is: https://api.checkbox.be/bridge/v1/ac/graphql

Een gebruiker van een Checkbox kan in hun Backoffice Tools een API Key terugvinden waarmee ze al dan niet rechten hebben om de bridge te gaan gebruiken. Deze API key moet bij elke GraphQl request in de header worden meegestuurd
Verder is er een twede header nodig die zegt welke checkbox moet worden aangesproken om deze GraphQl mutatie uit te voeren.

checkbox-client-key: 0a553a5b-09f9-4182-bee7-caaef31990b0
checkbox-id: CBX01000003

Indien zowel de API Key rechten heeft alsook de Checkbox rechten heeft dan kan de kassa software hun mutaties gaan doorsturen naar de FDM.

POS - FDM Connectie

GraphQl Pos

De Fdm is uitgerust met een verplichte GraphQl endpoint die alle opgelegde mutaties kan behandelen en uitvoeren.
Via introspectie query kunnen we alle ondersteunde queries en mutaties terugvinden

Het aders van de endpoint

http://<IP-ADDRESS>/graphql

{"query":"
    query IntrospectionQuery {
      __schema {
        
        queryType { name }
        mutationType { name }
        subscriptionType { name }
        types {
          ...FullType
        }
        directives {
          name
          description
          
          locations
          args {
            ...InputValue
          }
        }
      }
    }

    fragment FullType on __Type {
      kind
      name
      description
      
      fields(includeDeprecated: true) {
        name
        description
        args {
          ...InputValue
        }
        type {
          ...TypeRef
        }
        isDeprecated
        deprecationReason
      }
      inputFields {
        ...InputValue
      }
      interfaces {
        ...TypeRef
      }
      enumValues(includeDeprecated: true) {
        name
        description
        isDeprecated
        deprecationReason
      }
      possibleTypes {
        ...TypeRef
      }
    }

    fragment InputValue on __InputValue {
      name
      description
      type { ...TypeRef }
      defaultValue
      
      
    }

    fragment TypeRef on __Type {
      kind
      name
      ofType {
        kind
        name
        ofType {
          kind
          name
          ofType {
            kind
            name
            ofType {
              kind
              name
              ofType {
                kind
                name
                ofType {
                  kind
                  name
                  ofType {
                    kind
                    name
                  }
                }
              }
            }
          }
        }
      }
    }
  ","variables":{}}

Als je deze query naar bovenstaand endpoint stuurt, dan krij je alle geimplementeerde queries en mutaties. In de attachments folder kun je het resultaat terugvinden in onderstaande file.

POS_GraphQl_Introspection_Result.json

POS - FDM Connectie

GraphQl Ac

De Fdm is uitgerust met een optionele GraphQl endpoint die de Admin Console bewerkingen en alle opgelegde mutaties kan behandelen en uitvoeren. Via introspectie query kunnen we alle ondersteunde queries en mutaties terugvinden

Het adres van de Endpoint

http://<IP-ADDRESS>/ac/graphql

{"query":"
    query IntrospectionQuery {
      __schema {
        
        queryType { name }
        mutationType { name }
        subscriptionType { name }
        types {
          ...FullType
        }
        directives {
          name
          description
          
          locations
          args {
            ...InputValue
          }
        }
      }
    }

    fragment FullType on __Type {
      kind
      name
      description
      
      fields(includeDeprecated: true) {
        name
        description
        args {
          ...InputValue
        }
        type {
          ...TypeRef
        }
        isDeprecated
        deprecationReason
      }
      inputFields {
        ...InputValue
      }
      interfaces {
        ...TypeRef
      }
      enumValues(includeDeprecated: true) {
        name
        description
        isDeprecated
        deprecationReason
      }
      possibleTypes {
        ...TypeRef
      }
    }

    fragment InputValue on __InputValue {
      name
      description
      type { ...TypeRef }
      defaultValue
      
      
    }

    fragment TypeRef on __Type {
      kind
      name
      ofType {
        kind
        name
        ofType {
          kind
          name
          ofType {
            kind
            name
            ofType {
              kind
              name
              ofType {
                kind
                name
                ofType {
                  kind
                  name
                  ofType {
                    kind
                    name
                  }
                }
              }
            }
          }
        }
      }
    }
  ","variables":{}}

Als je deze query naar bovenstaand endpoint stuurt, dan krij je alle geimplementeerde queries en mutaties. In de attachments folder kun je het resultaat terugvinden in onderstaande file.

AC_GraphQl_Introspection_Result.json

POS - FDM Connectie

GraphQl Berekeningen

SignSale Mutation

Voor alle volgende testen gaan we deze Sale mutatie gebruiken.

mutation UC225A_PriceChange_IndirectSale_3_Sale($data: SaleInput!, $training: Boolean! = false) {
  signSale(data: $data, isTraining: $training) {
    posId
    posFiscalTicketNo
    posDateTime
    terminalId
    deviceId
    fdmSwVersion
    eventOperation
    digitalSignature
    shortSignature
    verificationUrl
    bufferCapacityUsed
    fdmRef {
      fdmId
      fdmDateTime
      eventLabel
      eventCounter
      totalCounter
    }
    vatCalc {
      label
      rate
      taxableAmount
      vatAmount
      totalAmount
      outOfScope
    }
    warnings {
      message
      locations {
        line
        column
      }
      extensions {
        category
        code
        data {
          name
          value
        }
        showPos
      }
    }
    informations {
      message
      locations {
        line
        column
      }
      extensions {
        category
        code
        data {
          name
          value
        }
        showPos
      }
    }
  }
}

The first request is with all Valid Data

{
  "data": {
    "language": "NL",
    "vatNo": "BE0000000097",
    "estNo": "2000000042",
    "posId": "PBX01000003",
    "posFiscalTicketNo": 5004,
    "posDateTime": "2025-05-31T11:27:49.377Z",
    "posSwVersion": "1.8.3",
    "deviceId": "1631678d-7a85-4ac3-b296-bb4565e873fe",
    "terminalId": "TER-2-DIN",
    "bookingPeriodId": "defcd829-a0e5-41ca-a0ae-9eb887f95637",
    "bookingDate": "2024-09-02",
    "ticketMedium": "PAPER",
    "employeeId": "84022899837",
    "costCenter": {
      "id": "1",
      "type": "TABLE",
      "reference": "O158"
    },
    "transaction": {
      "transactionLines": [
        {
          "lineType": "SINGLE_PRODUCT",
          "mainProduct": {
            "productId": "20001",
            "productName": "Carpaccio Beef",
            "departmentId": "20",
            "departmentName": "Starters",
            "quantity": 2,
            "quantityType": "PIECE",
            "unitPrice": 20,
            "vats": [
              {
                "label": "B",
                "price": 40,
                "priceChanges": [
                  {
                    "id": "1",
                    "groupingId": 1,
                    "name": "DISCOUNT20P",
                    "scope": "LINE",
                    "type": "PUBLIC",
                    "amount": -8
                  }
                ]
              }
            ]
          },
          "lineTotal": 32
        }
      ],
      "transactionTotal": 32
    },
    "financials": [
      {
        "id": "1",
        "name": "CONTANT",
        "type": "CASH",
        "inputMethod": "MANUAL",
        "amount": 32,
        "amountType": "PAYMENT",
        "drawer": {
          "id": "1",
          "name": "Drawer 1"
        }
      }
    ]
  }
}

Dit geeft ons volgende geldig resultaat terug

{
    "data": {
        "signSale": {
            "posId": "PBX01000003",
            "posFiscalTicketNo": 5004,
            "posDateTime": "2025-05-31T11:27:49.377Z",
            "terminalId": "TER-2-DIN",
            "deviceId": "1631678d-7a85-4ac3-b296-bb4565e873fe",
            "fdmSwVersion": "0.1.5-rc.2",
            "eventOperation": "SALE",
            "digitalSignature": "MEYCIQCruQGz3UZPS5nZ6bFVC9jvxM0tvytr0UoumtV5EH8E4QIhALZDQbSr/n32cHaNWAU77vxm/Pahw/0MbxsbnT7TI82M",
            "shortSignature": "7230dbceb56881f44db2a1fdcc49c4d4edd4edcf",
            "verificationUrl": "https://www.gks2-0.be/qr5MKD9fbCJvCgSYtPI",
            "bufferCapacityUsed": 0,
            "fdmRef": {
                "fdmId": "CBX01000003",
                "fdmDateTime": "2025-05-31T11:27:46.788Z",
                "eventLabel": "N",
                "eventCounter": 879,
                "totalCounter": 2451
            },
            "vatCalc": [
                {
                    "label": "B",
                    "rate": 12,
                    "taxableAmount": 28.57,
                    "vatAmount": 3.43,
                    "totalAmount": 32,
                    "outOfScope": false
                }
            ],
            "warnings": null,
            "informations": null
        }
    }
}

Ongeldig Pos Id, niet toegestaan in de lijst

We hebben de Pos Id zodanig gewijzigd dat deze niet in de lijst staat die deze FDM mag gebruiken.

{
    "errors": [
        {
            "message": "POS is niet geregistreerd voor gebruik met deze FDM",
            "extensions": {
                "category": "FDM",
                "code": "UNKNOWN_POS",
                "showPos": "MANDATORY"
            }
        }
    ]
}

Ongeldig Employee Id, geen MOD97

De waarde die we hebben gebruikt om te testen is 8422899836 which is not a valid Mod97 value.

{
    "errors": [
        {
            "message": "Ongeldige aanvraag",
            "extensions": {
                "category": "FDM",
                "code": "INVALID_REQUEST",
                "showPos": "OPTIONAL"
            }
        }
    ]
}

Ongeldig vatNo, geen MOD97

De waarde die we hebben gebruikt om te testen is BE0000000096 which is not a valid Mod97 value.

{
    "errors": [
        {
            "message": "Ongeldige aanvraag",
            "extensions": {
                "category": "FDM",
                "code": "INVALID_REQUEST",
                "showPos": "OPTIONAL"
            }
        }
    ]
}

Ongeldig establishmentNo, geen MOD97

De waarde die we hebben gebruikt om te testen is 2000000041, deze waarde is geen geldige MOD97.

{
    "errors": [
        {
            "message": "Ongeldige aanvraag",
            "extensions": {
                "category": "FDM",
                "code": "INVALID_REQUEST",
                "showPos": "OPTIONAL"
            }
        }
    ]
}

BTW Berekening

In dit voorbeeld zien we een item die 40€ kost aan de consument. Daarop werd een korting toegepast van 8€, het verkochte product valt onder de 12% BTW regel.
De FDM geeft dit resultaat, net zoals we verwachten.

"vatCalc": [
    {
        "label": "B",
        "rate": 12,
        "taxableAmount": 28.57,
        "vatAmount": 3.43,
        "totalAmount": 32,
        "outOfScope": false
    }
],

Updaten van de tellers

De tellers kunnen worden aangetoond door meermaals een mutatie te sturen, en te zien dat de geldige teller aangepast wordt.
Dit kan je zien in zowel het antwoord van de FDM, maar evengoed kan dit via de Admin Console worden opgevraagd, als laatste kun je deze teller ook zien op de Backoffice.

Volgende test is telkens de zelfde mutatie herhalen (mits een update van de timestamp, zo zien we dat de overeenkomstige teller en totaalteller zullen omhoog gaan

"fdmRef": {
    "fdmId": "CBX01000003",
    "fdmDateTime": "2025-05-31T11:44:40.548Z",
    "eventLabel": "N",
    "eventCounter": 880,
    "totalCounter": 2454
},
"fdmRef": {
    "fdmId": "CBX01000003",
    "fdmDateTime": "2025-05-31T12:01:47.875Z",
    "eventLabel": "N",
    "eventCounter": 881,
    "totalCounter": 2455
},
"fdmRef": {
    "fdmId": "CBX01000003",
    "fdmDateTime": "2025-05-31T12:02:18.619Z",
    "eventLabel": "N",
    "eventCounter": 882,
    "totalCounter": 2456
},

Hier zie je telkens het stukje fdmRef uit het antwoord. Met de teller die telkens mooi omhoog gaat.

Signature, Short Signature and QR Code Url

Bij het antwoord van een sale moeten deze waarden in het antwoord staan.

"digitalSignature": "MEYCIQCruQGz3UZPS5nZ6bFVC9jvxM0tvytr0UoumtV5EH8E4QIhALZDQbSr/n32cHaNWAU77vxm/Pahw/0MbxsbnT7TI82M",
"shortSignature": "7230dbceb56881f44db2a1fdcc49c4d4edd4edcf",
"verificationUrl": "https://www.gks2-0.be/qr5MKD9fbCJvCgSYtPI",

POS - FDM Connectie

Speciale gevallen

Nullable velden bij het antwoord

Bij het voorbeeld die we hebben gebruikt zien we dat de verwachte waarden aanwezig zijn. Wanneer we de zelfde mutatie naar de FDM sturen als Training, dan mogen deze velden niet worden ingevuld.

mutation UC225A_PriceChange_IndirectSale_3_Sale($data: SaleInput!, $training: Boolean! = true) {
  signSale(data: $data, isTraining: $training) {
  ...

Dit is vervolgens het antwoord die we van de FDM terugkrijen.

{
    "data": {
        "signSale": {
            "posId": "PBX01000003",
            "posFiscalTicketNo": 5004,
            "posDateTime": "2025-05-31T12:08:36.125Z",
            "terminalId": "TER-2-DIN",
            "deviceId": "1631678d-7a85-4ac3-b296-bb4565e873fe",
            "fdmSwVersion": "0.1.5-rc.2",
            "eventOperation": "SALE",
            "digitalSignature": "MEQCIEhpJL1fe7J/4qP5b2C2FT2dIqTgMjvvkn18DFFxSUQcAiAV+WAjrvVFTs8GehwTrR87xHp15HB2hTdCKaHDYOBWLA==",
            "shortSignature": null,
            "verificationUrl": null,
            "bufferCapacityUsed": 0,
            "fdmRef": {
                "fdmId": "CBX01000003",
                "fdmDateTime": "2025-05-31T12:08:33.495Z",
                "eventLabel": "T",
                "eventCounter": 271,
                "totalCounter": 2457
            },
            "vatCalc": null,
            "warnings": null,
            "informations": null
        }
    }
}

Hier zien we zowel shortSignature, verificationUrl en vatCalc op null staan zoals verwacht.

Duplicate exact hetzelfde request

Wanneer we een geldige mutatie sturen, maar we sturen deze binnen de 10 minuten opnieuw, dan moet de FDM in staat zijn dit als een duplicate te aanzien. Het antwoord komt met alle geldige data, maar er is een warning die aangeeft dat het om een duplicate gaat.

Hieronder zie je 2 antwoorden van het zelfde request, de eerste keer en de tweede keer.

Eerste aanvraag

{
    "data": {
        "signSale": {
            "posId": "PBX01000003",
            "posFiscalTicketNo": 5004,
            "posDateTime": "2025-05-31T13:08:36.125Z",
            "terminalId": "TER-2-DIN",
            "deviceId": "1631678d-7a85-4ac3-b296-bb4565e873fe",
            "fdmSwVersion": "0.1.4+dev+",
            "eventOperation": "SALE",
            "digitalSignature": "MEYCIQCsRTnlw+MQiEtt7Ceuzl8HVuqGxdjuKtqtdyfy939JNgIhAKCv5ZNbepCz3g+GgdRVtqMmN1YRGHX7TNcjpA+7QiOR",
            "shortSignature": "1fc449ca62754b54ad05898a9f00ee127e141f9d",
            "verificationUrl": "https://www.gks2-0.be/qr5MKD9fbCJvCgSYtP8",
            "bufferCapacityUsed": 0,
            "fdmRef": {
                "fdmId": "CBX01000003",
                "fdmDateTime": "2025-06-02T07:43:01.052Z",
                "eventLabel": "N",
                "eventCounter": 887,
                "totalCounter": 2462
            },
            "vatCalc": [
                {
                    "label": "B",
                    "rate": 12,
                    "taxableAmount": 28.57,
                    "vatAmount": 3.43,
                    "totalAmount": 32,
                    "outOfScope": false
                }
            ],
            "warnings": null,
            "informations": null
        }
    }
}

Tweede aanvraag

{
    "data": {
        "signSale": {
            "posId": "PBX01000003",
            "posFiscalTicketNo": 5004,
            "posDateTime": "2025-05-31T13:08:36.125Z",
            "terminalId": "TER-2-DIN",
            "deviceId": "1631678d-7a85-4ac3-b296-bb4565e873fe",
            "fdmSwVersion": "0.1.4+dev+",
            "eventOperation": "SALE",
            "digitalSignature": "MEYCIQCsRTnlw+MQiEtt7Ceuzl8HVuqGxdjuKtqtdyfy939JNgIhAKCv5ZNbepCz3g+GgdRVtqMmN1YRGHX7TNcjpA+7QiOR",
            "shortSignature": "1fc449ca62754b54ad05898a9f00ee127e141f9d",
            "verificationUrl": "https://www.gks2-0.be/qr5MKD9fbCJvCgSYtP8",
            "bufferCapacityUsed": 0,
            "fdmRef": {
                "fdmId": "CBX01000003",
                "fdmDateTime": "2025-06-02T07:43:01.052Z",
                "eventLabel": "N",
                "eventCounter": 887,
                "totalCounter": 2462
            },
            "vatCalc": [
                {
                    "label": "B",
                    "rate": 12,
                    "taxableAmount": 28.57,
                    "vatAmount": 3.43,
                    "totalAmount": 32,
                    "outOfScope": false
                }
            ],
            "warnings": [
                {
                    "message": "Dubbele aanvraag",
                    "locations": null,
                    "extensions": {
                        "category": "FDM",
                        "code": "DUPLICATE_REQUEST",
                        "data": null,
                        "showPos": "NEVER"
                    }
                }
            ],
            "informations": null
        }
    }
}

Bij de tweede aanvraag zien we een warning die aangeeft dat dit om een duplicate_request gaat, we zien ook dat het antwoord de tellers niet heeft aangepast, maar wel alle zelfde data terugstuurt.

Duplicate Request, zelfde keyvalues maar ander request

Wanneer dit gebeurt negeert de FDM het request, maar geeft ons een error terug.

{
    "errors": [
        {
            "message": "Dubbele aanvraag",
            "extensions": {
                "category": "FDM",
                "code": "DUPLICATE_REQUEST",
                "showPos": "NEVER"
            }
        }
    ]
}

POS - FDM Connectie

Updaten van de Parameters

Via de GraphQl AC endpoint is het mogelijk om zowel de WS Init url te gaan updaten alsook de NTP3 server in te stellen.

We kunnen dit aantonen via een combinatie van de Checkbox.Admin-Console tool, de Tools backend en een Checkbox.

Ws-Init url aanpassen

Via de tool Checkbox.Admin-Console gaan we de url aanpassen.

A: Get Admin Info
B: Get Buffered Messages
C: Get Sent Messages
D: Get Failed Requests
E: Set Network Configuration
F: Set Ws Init Url
G: Set Ntp3 Url
H: Call Ws Init
I: Sync Ntp
J: Do Reboot
Q: QUIT
---------------------------------------------------------------
-- Set Ws Init Url                                           --
---------------------------------------------------------------
Enter the custom WS Init url to configure:
https://acc.gks2-0.be/public/initDummy

Vervolgens kun je via de Tools website deze update zien.

image.png

NTP3 url aanpassen

Via de tool Checkbox.Admin-Console gaan we de url aanpassen

A: Get Admin Info
B: Get Buffered Messages
C: Get Sent Messages
D: Get Failed Requests
E: Set Network Configuration
F: Set Ws Init Url
G: Set Ntp3 Url
H: Call Ws Init
I: Sync Ntp
J: Do Reboot
Q: QUIT
---------------------------------------------------------------
-- Set Ntp 3 Url                                             --
---------------------------------------------------------------
Enter the custom NTP url to configure:
debian.pool.ntp.orgDummy

Vervolgens kun je via de Tools website deze update zien

image.png

Firmware

 

Firmware

Usecases

Om aan te tonen dat data van de POS op een correcte wijze ontvangen en verwerkt wordt werd er een functionele test gemaakt dat alle usecases uitvoert en de response vergelijkt met het verwachte resultaat.

Deze test werd gemaakt, gebruikmakend van het python based test framework genaamd "Robot Framwork"

De test zal de volledige JSON vergelijken behalve FDM specifiek velden.

Het is echter zo dat niet alle usecases na elkaar kunnen uitgevoerd worden vermits ze duplicate requests triggeren

Gefaalde usecases met duplicate requests worden dus voorlopig genegeerd tot deze upgedate worden, dit werd gemeld op 23/05/2025.

Een Gefaalde test met *_response.json file niet gevonden, betekend dat er geen referentie gevonden was.

De actie werd ondernomen om de gefaalde testen te valideren en daar werden geen foutern teruggevonden

20250523_UC_BasicSet_POS_FDM_1.6

Name

Status

×Message

×Elapsed

×Start / End

BasicSet . Test M110 Sign Sale

PASS

 

00:00:00.257

20250602 23:04:42.394
20250602 23:04:42.651

BasicSet . Test M111 Sign Sale Refund

PASS

 

00:00:00.248

20250602 23:04:42.652
20250602 23:04:42.900

BasicSet . Test M112A_1 Original Sale

FAIL

FileNotFoundError: No *_response.json file found in 'usecases/20250523_UC_BasicSet_POS_FDM_1.6/M112A_signSale_RefundPartial/M112A_1_OriginalSale'.

00:00:00.305

20250602 23:04:42.900
20250602 23:04:43.205

BasicSet . Test M112A_2 Partial Refund

FAIL

FileNotFoundError: No *_response.json file found in 'usecases/20250523_UC_BasicSet_POS_FDM_1.6/M112A_signSale_RefundPartial/M112A_2_PartialRefund'.

00:00:00.307

20250602 23:04:43.205
20250602 23:04:43.512

BasicSet . Test M112B_1 Original Sale

FAIL

FileNotFoundError: No *_response.json file found in 'usecases/20250523_UC_BasicSet_POS_FDM_1.6/M112B_signSale_RefundPartial/M112B_1_OriginalSale'.

00:00:00.098

20250602 23:04:43.513
20250602 23:04:43.611

BasicSet . Test M112B_2 Partial Refund

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.101

20250602 23:04:43.611
20250602 23:04:43.712

BasicSet . Test M121 Sign Order

FAIL

JSON mismatch after ignoring fields: Value mismatch at data.signOrder.terminalId: expected 'TER-1-BAR ', got 'TER-1-BAR'

 

De verzonden Qeury bevat een trailing spatie op het einde van terminalId terwijl in de response file dit niet het geval is

00:00:00.315

20250602 23:04:43.713
20250602 23:04:44.028

BasicSet . Test M122 Sign Cost Center Change

PASS

 

00:00:00.304

20250602 23:04:44.028
20250602 23:04:44.332

BasicSet . Test M123 Sign Prebill

PASS

 

00:00:00.203

20250602 23:04:44.332
20250602 23:04:44.535

BasicSet . Test M130 Sign Money In Out

PASS

 

00:00:00.208

20250602 23:04:44.536
20250602 23:04:44.744

BasicSet . Test M131 Sign Drawer Open

PASS

 

00:00:00.305

20250602 23:04:44.744
20250602 23:04:45.049

BasicSet . Test M132 Sign Payment Correction

PASS

 

00:00:00.203

20250602 23:04:45.049
20250602 23:04:45.252

BasicSet . Test M133 Sign Money In Out Drawer Declaration

PASS

 

00:00:00.207

20250602 23:04:45.252
20250602 23:04:45.459

BasicSet . Test M140 Sign Work In

PASS

 

00:00:00.202

20250602 23:04:45.459
20250602 23:04:45.661

BasicSet . Test M141 Sign Work Out

PASS

 

00:00:00.203

20250602 23:04:45.661
20250602 23:04:45.864

BasicSet . Test M150 Sign Invoice

PASS

 

00:00:00.174

20250602 23:04:45.863
20250602 23:04:46.037

BasicSet . Test M160 Sign Copy Sale

PASS

 

00:00:00.164

20250602 23:04:46.037
20250602 23:04:46.201

BasicSet . Test M161 Sign Copy Order

PASS

 

00:00:00.281

20250602 23:04:46.201
20250602 23:04:46.482

BasicSet . Test M170 Sign Work In Training

PASS

 

00:00:00.164

20250602 23:04:46.482
20250602 23:04:46.646

BasicSet . Test M171 Sign Sale Training

PASS

 

00:00:00.243

20250602 23:04:46.647
20250602 23:04:46.890

BasicSet . Test M172 Sign Copy Training

PASS

 

00:00:00.202

20250602 23:04:46.890
20250602 23:04:47.092

20250523_UC_Reports_1.2

Name

Status

×Message

×Elapsed

×Start / End

ReportSet . Test Input Report T1

PASS

 

00:00:00.252

20250602 23:08:22.052
20250602 23:08:22.304

ReportSet . Test Input Report T2

PASS

 

00:00:00.349

20250602 23:08:22.304
20250602 23:08:22.653

ReportSet . Test Input Report T3

PASS

 

00:00:00.309

20250602 23:08:22.654
20250602 23:08:22.963

ReportSet . Test Input Report T4

PASS

 

00:00:00.306

20250602 23:08:22.963
20250602 23:08:23.269

ReportSet . Test Input Report T5

PASS

 

00:00:00.203

20250602 23:08:23.269
20250602 23:08:23.472

ReportSet . Test Input Report T6

PASS

 

00:00:00.305

20250602 23:08:23.473
20250602 23:08:23.778

ReportSet . Test Input Report T7

PASS

 

00:00:00.204

20250602 23:08:23.778
20250602 23:08:23.982

ReportSet . Test Input Report T8

PASS

 

00:00:00.308

20250602 23:08:23.982
20250602 23:08:24.290

ReportSet . Test M180 Sign Report Tunover X

PASS

 

00:00:00.310

20250602 23:08:24.290
20250602 23:08:24.600

ReportSet . Test M180 Sign Report Tunover X T1

PASS

 

00:00:00.093

20250602 23:08:24.600
20250602 23:08:24.693

ReportSet . Test M180 Sign Report Tunover X T2

PASS

 

00:00:00.116

20250602 23:08:24.694
20250602 23:08:24.810

ReportSet . Test M180 Sign Report Tunover X T3

PASS

 

00:00:00.107

20250602 23:08:24.810
20250602 23:08:24.917

ReportSet . Test M180 Sign Report Tunover X T4

PASS

 

00:00:00.090

20250602 23:08:24.917
20250602 23:08:25.007

ReportSet . Test M180 Sign Report Tunover X T5

PASS

 

00:00:00.088

20250602 23:08:25.007
20250602 23:08:25.095

ReportSet . Test M180 Sign Report Tunover X T6

PASS

 

00:00:00.118

20250602 23:08:25.096
20250602 23:08:25.214

ReportSet . Test M180 Sign Report Tunover X T7

PASS

 

00:00:00.087

20250602 23:08:25.214
20250602 23:08:25.301

ReportSet . Test M180 Sign Report Tunover X T8

PASS

 

00:00:00.106

20250602 23:08:25.301
20250602 23:08:25.407

ReportSet . Test M181 Sign Report Tunover Z

FAIL

'{'errors': [{'message': "Field 'category' is not valid", 'locations': [{'line': 20, 'column': 7}]}]}' does not contain 'data'

 

De GraphQL query is niet correct

00:00:00.317

20250602 23:08:25.407
20250602 23:08:25.724

ReportSet . Test M182 Sign Report User

PASS

 

00:00:00.309

20250602 23:08:25.724
20250602 23:08:26.033

ReportSet . Test M183 Sign Report User

FAIL

'{'errors': [{'message': 'Invalid value for argument field [lastFdmDateTime: 2024-07-30T11:10:42]', 'locations': []}]}' does not contain 'data'

 

lastFdmDateTime is geen UTC formaat (eindigt niet op Z)

00:00:00.303

20250602 23:08:26.033
20250602 23:08:26.336

20250523_UC_AdvancedSet_POS_FDM_1.4

AdvancedSet . Test UC200 Composite Product

PASS

 

00:00:00.301

20250604 00:39:01.880
20250604 00:39:02.181

AdvancedSet . Test UC201 Sign Sale Rounding

PASS

 

00:00:00.394

20250604 00:39:02.181
20250604 00:39:02.575

AdvancedSet . Test UC220 Line Price Change

FAIL

FileNotFoundError: No *_response.json file found in 'usecases/20250523_UC_AdvancedSet_POS_FDM_1.4/UC220_signSale_LinePriceChange'.

00:00:00.361

20250604 00:39:02.576
20250604 00:39:02.937

AdvancedSet . Test UC221A Line Price Change

PASS

 

00:00:00.428

20250604 00:39:02.937
20250604 00:39:03.365

AdvancedSet . Test UC221B Line Price Change

PASS

 

00:00:00.332

20250604 00:39:03.366
20250604 00:39:03.698

AdvancedSet . Test UC222 Price Change Composite

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.151

20250604 00:39:03.699
20250604 00:39:03.850

AdvancedSet . Test UC223 Event Price Change

PASS

 

00:00:00.328

20250604 00:39:03.850
20250604 00:39:04.178

AdvancedSet . Test UC224 Multiple Price Change

PASS

 

00:00:00.337

20250604 00:39:04.179
20250604 00:39:04.516

AdvancedSet . Test UC225A Step 1 Order

PASS

 

00:00:00.296

20250604 00:39:04.516
20250604 00:39:04.812

AdvancedSet . Test UC225A Step 2 Order

PASS

 

00:00:00.341

20250604 00:39:04.812
20250604 00:39:05.153

AdvancedSet . Test UC225A Step 3 Sale

PASS

 

00:00:00.375

20250604 00:39:05.153
20250604 00:39:05.528

AdvancedSet . Test UC225B Step 1 Order

PASS

 

00:00:00.093

20250604 00:39:05.529
20250604 00:39:05.622

AdvancedSet . Test UC225B Step 2 Sale

PASS

 

00:00:01.207

20250604 00:39:05.622
20250604 00:39:06.829

AdvancedSet . Test UC226 Order

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.162

20250604 00:39:06.829
20250604 00:39:06.991

AdvancedSet . Test UC226 Correction

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.145

20250604 00:39:06.991
20250604 00:39:07.136

AdvancedSet . Test UC229B Free Article Direct Sale

PASS

 

00:00:00.360

20250604 00:39:07.136
20250604 00:39:07.496

AdvancedSet . Test UC230 Correction

PASS

 

00:00:00.379

20250604 00:39:07.496
20250604 00:39:07.875

AdvancedSet . Test UC240 Step 1 Order

PASS

 

00:00:00.415

20250604 00:39:07.876
20250604 00:39:08.291

AdvancedSet . Test UC240 Step 2 CostCenterChange

PASS

 

00:00:00.420

20250604 00:39:08.291
20250604 00:39:08.711

AdvancedSet . Test UC240 Step 3 Prebill T1

PASS

 

00:00:00.356

20250604 00:39:08.711
20250604 00:39:09.067

AdvancedSet . Test UC240 Step 4 Prebill T2

PASS

 

00:00:00.383

20250604 00:39:09.068
20250604 00:39:09.451

AdvancedSet . Test UC240 Step 5 Sale T1

PASS

 

00:00:00.426

20250604 00:39:09.451
20250604 00:39:09.877

AdvancedSet . Test UC240 Step 6 Sale T2

PASS

 

00:00:00.518

20250604 00:39:09.877
20250604 00:39:10.395

AdvancedSet . Test UC241 Table Split To Existing - Order T1

PASS

 

00:00:00.918

20250604 00:39:10.396
20250604 00:39:11.314

AdvancedSet . Test UC241 Table Split To Existing - Order T2

PASS

 

00:00:00.395

20250604 00:39:11.314
20250604 00:39:11.709

AdvancedSet . Test UC241 Table Split To Existing - Cost Center Change

PASS

 

00:00:00.468

20250604 00:39:11.709
20250604 00:39:12.177

AdvancedSet . Test UC241 Table Split To Existing - Sale T1

PASS

 

00:00:00.511

20250604 00:39:12.178
20250604 00:39:12.689

AdvancedSet . Test UC241 Table Split To Existing - Sale T2

PASS

 

00:00:00.498

20250604 00:39:12.689
20250604 00:39:13.187

AdvancedSet . Test UC242 Table Split To 2 New - Order T1

PASS

 

00:00:00.357

20250604 00:39:13.186
20250604 00:39:13.543

AdvancedSet . Test UC242 Table Split To 2 New - Cost Center Change

PASS

 

00:00:00.357

20250604 00:39:13.544
20250604 00:39:13.901

AdvancedSet . Test UC242 Table Split To 2 New - Sale T35

PASS

 

00:00:00.324

20250604 00:39:13.901
20250604 00:39:14.225

AdvancedSet . Test UC242 Table Split To 2 New - Sale T2

PASS

 

00:00:00.391

20250604 00:39:14.226
20250604 00:39:14.617

AdvancedSet . Test UC243 Table Split Discount - Order T1

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.141

20250604 00:39:14.618
20250604 00:39:14.759

AdvancedSet . Test UC243 Table Split Discount - Cost Center Change

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.141

20250604 00:39:14.759
20250604 00:39:14.900

AdvancedSet . Test UC243 Table Split Discount - Prebill T1

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.156

20250604 00:39:14.900
20250604 00:39:15.056

AdvancedSet . Test UC243 Table Split Discount - Prebill T2

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.136

20250604 00:39:15.056
20250604 00:39:15.192

AdvancedSet . Test UC243 Table Split Discount - Sale T1

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.158

20250604 00:39:15.193
20250604 00:39:15.351

AdvancedSet . Test UC243 Table Split Discount - Sale T2

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.145

20250604 00:39:15.351
20250604 00:39:15.496

AdvancedSet . Test UC250 Table Merge - Order T1

PASS

 

00:00:00.466

20250604 00:39:15.496
20250604 00:39:15.962

AdvancedSet . Test UC250 Table Merge - Order T2

PASS

 

00:00:00.457

20250604 00:39:15.962
20250604 00:39:16.419

AdvancedSet . Test UC250 Table Merge - Cost Center Change

PASS

 

00:00:00.633

20250604 00:39:16.419
20250604 00:39:17.052

AdvancedSet . Test UC250 Table Merge - Sale

PASS

 

00:00:00.510

20250604 00:39:17.052
20250604 00:39:17.562

AdvancedSet . Test UC251 Table Merge - Order T1

PASS

 

00:00:00.490

20250604 00:39:17.562
20250604 00:39:18.052

AdvancedSet . Test UC251 Table Merge - Order T2

PASS

 

00:00:00.924

20250604 00:39:18.052
20250604 00:39:18.976

AdvancedSet . Test UC251 Table Merge - Cost Center Change

PASS

 

00:00:00.638

20250604 00:39:18.976
20250604 00:39:19.614

AdvancedSet . Test UC251 Table Merge - Sale

PASS

 

00:00:00.510

20250604 00:39:19.615
20250604 00:39:20.125

AdvancedSet . Test UC252 Table Merge Discount - Order T1

PASS

 

00:00:00.148

20250604 00:39:20.125
20250604 00:39:20.273

AdvancedSet . Test UC252 Table Merge Discount - Order T2

FAIL

'{'errors': [{'message': 'Demande en double', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.181

20250604 00:39:20.273
20250604 00:39:20.454

AdvancedSet . Test UC252 Table Merge Discount - Cost Center Change

FAIL

'{'errors': [{'message': 'Demande en double', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.201

20250604 00:39:20.453
20250604 00:39:20.654

AdvancedSet . Test UC252 Table Merge Discount - Sale

FAIL

'{'errors': [{'message': 'Demande en double', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.190

20250604 00:39:20.655
20250604 00:39:20.845

AdvancedSet . Test UC261 MPV Use - Order

PASS

 

00:00:00.584

20250604 00:39:20.845
20250604 00:39:21.429

AdvancedSet . Test UC261 MPV Use - Sale

PASS

 

00:00:00.394

20250604 00:39:21.429
20250604 00:39:21.823

AdvancedSet . Test UC262 MPV Use

PASS

 

00:00:00.367

20250604 00:39:21.824
20250604 00:39:22.191

AdvancedSet . Test UC270 SPV Sale

PASS

 

00:00:00.380

20250604 00:39:22.191
20250604 00:39:22.571

AdvancedSet . Test UC271 SPV Use - Order 1

PASS

 

00:00:00.486

20250604 00:39:22.572
20250604 00:39:23.058

AdvancedSet . Test UC271 SPV Use - Order 2

PASS

 

00:00:00.366

20250604 00:39:23.058
20250604 00:39:23.424

AdvancedSet . Test UC271 SPV Use - Prebill

PASS

 

00:00:00.435

20250604 00:39:23.424
20250604 00:39:23.859

AdvancedSet . Test UC271 SPV Use - Sale

PASS

 

00:00:00.931

20250604 00:39:23.860
20250604 00:39:24.791

AdvancedSet . Test UC280 Composite Product

PASS

 

00:00:01.044

20250604 00:39:24.791
20250604 00:39:25.835

AdvancedSet . Test UC290 Payment Foreign Currency Mix

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.146

20250604 00:39:25.835
20250604 00:39:25.981

AdvancedSet . Test UC291 Payment Foreign Currency

PASS

 

00:00:00.867

20250604 00:39:25.982
20250604 00:39:26.849

AdvancedSet . Test UC292 Tip

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.141

20250604 00:39:26.849
20250604 00:39:26.990

AdvancedSet . Test UC294 Payment Foreign Currency

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.130

20250604 00:39:26.990
20250604 00:39:27.120

AdvancedSet . Test UC295 Payment Foreign Currency

PASS

 

00:00:00.942

20250604 00:39:27.121
20250604 00:39:28.063

AdvancedSet . Test UC296 Payment Foreign Currency with Tip

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.158

20250604 00:39:28.062
20250604 00:39:28.220

AdvancedSet . Test UC4100 Customer Account - Step 1 Money In

PASS

 

00:00:01.307

20250604 00:39:28.221
20250604 00:39:29.528

AdvancedSet . Test UC4100 Customer Account - Step 2 Sale

FAIL

'{'errors': [{'message': 'Invalid value for argument field [employeeId: 75061189731]', 'locations': []}]}' does not contain 'data'

 

 

Invalid EmployeeId

00:00:00.132

20250604 00:39:29.528
20250604 00:39:29.660

AdvancedSet . Test UC4101 Cost Center Change Table to Room - Order

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.138

20250604 00:39:29.661
20250604 00:39:29.799

AdvancedSet . Test UC4101 Cost Center Change Table to Room - Change

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.127

20250604 00:39:29.799
20250604 00:39:29.926

AdvancedSet . Test UC4102 Full Flow - Sign Order 1

PASS

 

00:00:00.926

20250604 00:39:29.926
20250604 00:39:30.852

AdvancedSet . Test UC4102 Full Flow - Sign Order 2

PASS

 

00:00:00.399

20250604 00:39:30.853
20250604 00:39:31.252

AdvancedSet . Test UC4102 Full Flow - Sign Prebill

PASS

 

00:00:00.462

20250604 00:39:31.252
20250604 00:39:31.714

AdvancedSet . Test UC4102 Full Flow - Sign Sale

PASS

 

00:00:00.491

20250604 00:39:31.714
20250604 00:39:32.205

AdvancedSet . Test UC4102 Full Flow - Copy Bill

PASS

 

00:00:01.133

20250604 00:39:32.205
20250604 00:39:33.338

AdvancedSet . Test UC4102 Full Flow - Invoice

PASS

 

00:00:00.333

20250604 00:39:33.338
20250604 00:39:33.671

AdvancedSet . Test UC4103bis Split Bill - Order

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.129

20250604 00:39:33.672
20250604 00:39:33.801

AdvancedSet . Test UC4103bis Split Bill - Bill 1

PASS

 

00:00:00.923

20250604 00:39:33.801
20250604 00:39:34.724

AdvancedSet . Test UC4103bis Split Bill - Bill 2

PASS

 

00:00:00.399

20250604 00:39:34.724
20250604 00:39:35.123

AdvancedSet . Test UC4103 Cost Center Change Split - Order

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.146

20250604 00:39:35.123
20250604 00:39:35.269

AdvancedSet . Test UC4103 Cost Center Change Split - Cost Center Change

PASS

 

00:00:00.745

20250604 00:39:35.269
20250604 00:39:36.014

AdvancedSet . Test UC4103 Cost Center Change Split - Bill 1

PASS

 

00:00:00.503

20250604 00:39:36.014
20250604 00:39:36.517

AdvancedSet . Test UC4103 Cost Center Change Split - Bill 2

PASS

 

00:00:01.331

20250604 00:39:36.517
20250604 00:39:37.848

AdvancedSet . Test UC4104 Full Flow - Step 1 Order

PASS

 

00:00:00.343

20250604 00:39:37.848
20250604 00:39:38.191

AdvancedSet . Test UC4104 Full Flow - Step 2 Order

PASS

 

00:00:00.919

20250604 00:39:38.191
20250604 00:39:39.110

AdvancedSet . Test UC4104 Full Flow - Step 3 Order

PASS

 

00:00:00.406

20250604 00:39:39.111
20250604 00:39:39.517

AdvancedSet . Test UC4104 Full Flow - Step 4 Bill 1

PASS

 

00:00:00.462

20250604 00:39:39.518
20250604 00:39:39.980

AdvancedSet . Test UC4104 Full Flow - Step 5 Price Change

PASS

 

00:00:00.520

20250604 00:39:39.980
20250604 00:39:40.500

AdvancedSet . Test UC4104 Full Flow - Step 6 Prebill

PASS

 

00:00:01.100

20250604 00:39:40.501
20250604 00:39:41.601

AdvancedSet . Test UC4104 Full Flow - Step 7 Bill 2

PASS

 

00:00:00.475

20250604 00:39:41.601
20250604 00:39:42.076

AdvancedSet . Test UC4104 Full Flow - Step 8 Bill 3

PASS

 

00:00:00.945

20250604 00:39:42.077
20250604 00:39:43.022

AdvancedSet . Test UC4104 Full Flow - Step 9 Payment Correction

PASS

 

00:00:01.028

20250604 00:39:43.022
20250604 00:39:44.050

AdvancedSet . Test UC4104 Full Flow - Step 10 Copy Bill 2

PASS

 

00:00:00.332

20250604 00:39:44.050
20250604 00:39:44.382

AdvancedSet . Test UC4104 Full Flow - Step 11 Invoice Bill 3

FAIL

'{'errors': [{'message': "Mutation 'signInvoice' processing error", 'locations': []}]}' does not contain 'data'

00:00:00.138

20250604 00:39:44.382
20250604 00:39:44.520

AdvancedSet . Test UC4105 MPV to Cash

PASS

 

00:00:01.273

20250604 00:39:44.520
20250604 00:39:45.793

AdvancedSet . Test UC4106 Menu All-In Price Change

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.139

20250604 00:39:45.793
20250604 00:39:45.932

AdvancedSet . Test UC4107 Vat Labels ABC - Order

PASS

 

00:00:00.313

20250604 00:39:45.932
20250604 00:39:46.245

AdvancedSet . Test UC4107 Vat Labels ABC - Price Change

PASS

 

00:00:00.350

20250604 00:39:46.245
20250604 00:39:46.595

AdvancedSet . Test UC4107 Vat Labels ABC - Prebill

PASS

 

00:00:00.319

20250604 00:39:46.595
20250604 00:39:46.914

AdvancedSet . Test UC4107 Vat Labels ABC - Order Takeaway

PASS

 

00:00:00.434

20250604 00:39:46.915
20250604 00:39:47.349

AdvancedSet . Test UC4107 Vat Labels ABC - Sale

PASS

 

00:00:00.461

20250604 00:39:47.349
20250604 00:39:47.810

AdvancedSet . Test UC4108 Vat Label X Sale

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.147

20250604 00:39:47.810
20250604 00:39:47.957

AdvancedSet . Test UC4109 No Payment - Order

PASS

 

00:00:01.076

20250604 00:39:47.957
20250604 00:39:49.033

AdvancedSet . Test UC4109 No Payment - Sale

PASS

 

00:00:01.091

20250604 00:39:49.033
20250604 00:39:50.124

AdvancedSet . Test UC4110 Advanced Payment - Prepayment

PASS

 

00:00:01.122

20250604 00:39:50.124
20250604 00:39:51.246

AdvancedSet . Test UC4110 Advanced Payment - Order

PASS

 

00:00:00.338

20250604 00:39:51.247
20250604 00:39:51.585

AdvancedSet . Test UC4110 Advanced Payment - Sale

PASS

 

00:00:01.130

20250604 00:39:51.586
20250604 00:39:52.716

AdvancedSet . Test UC4111 Advanced Payment % of Price - Prepayment

PASS

 

00:00:01.028

20250604 00:39:52.716
20250604 00:39:53.744

AdvancedSet . Test UC4111 Advanced Payment % of Price - Order

PASS

 

00:00:00.303

20250604 00:39:53.744
20250604 00:39:54.047

AdvancedSet . Test UC4111 Advanced Payment % of Price - Sale

PASS

 

00:00:00.341

20250604 00:39:54.048
20250604 00:39:54.389

AdvancedSet . Test UC4112 Weighted Product

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.133

20250604 00:39:54.389
20250604 00:39:54.522

AdvancedSet . Test UC4113 Prepayment Reservation - Sale

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.147

20250604 00:39:54.522
20250604 00:39:54.669

AdvancedSet . Test UC4113 Prepayment Reservation - Order

PASS

 

00:00:00.392

20250604 00:39:54.670
20250604 00:39:55.062

AdvancedSet . Test UC4113 Prepayment Reservation - Order 2

PASS

 

00:00:00.370

20250604 00:39:55.062
20250604 00:39:55.432

AdvancedSet . Test UC4113 Prepayment Reservation - Prebill

PASS

 

00:00:01.188

20250604 00:39:55.433
20250604 00:39:56.621

AdvancedSet . Test UC4113 Prepayment Reservation - Sale Final

PASS

 

00:00:00.584

20250604 00:39:56.621
20250604 00:39:57.205

AdvancedSet . Test UC4114 Festival Deposit - Sale

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.134

20250604 00:39:57.205
20250604 00:39:57.339

AdvancedSet . Test UC4114 Festival Deposit - Refund

PASS

 

00:00:00.695

20250604 00:39:57.339
20250604 00:39:58.034

AdvancedSet . Test UC4116 Correction Price Change - Step 1

PASS

 

00:00:00.414

20250604 00:39:58.035
20250604 00:39:58.449

AdvancedSet . Test UC4116 Correction Price Change - Step 2

PASS

 

00:00:01.322

20250604 00:39:58.449
20250604 00:39:59.771

AdvancedSet . Test UC4117 GTIN

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.131

20250604 00:39:59.772
20250604 00:39:59.903

AdvancedSet . Test UC4118 Payment Correction - Sale

PASS

 

00:00:00.335

20250604 00:39:59.903
20250604 00:40:00.238

AdvancedSet . Test UC4118 Payment Correction - Correction

PASS

 

00:00:00.300

20250604 00:40:00.238
20250604 00:40:00.538

AdvancedSet . Test UC4119bis Split Bill - Order

PASS

 

00:00:00.317

20250604 00:40:00.539
20250604 00:40:00.856

AdvancedSet . Test UC4119bis Split Bill - Sale 1

PASS

 

00:00:00.415

20250604 00:40:00.856
20250604 00:40:01.271

AdvancedSet . Test UC4119bis Split Bill - Sale 2

PASS

 

00:00:00.394

20250604 00:40:01.271
20250604 00:40:01.665

AdvancedSet . Test UC4119bis Split Bill - Sale 3

PASS

 

00:00:00.409

20250604 00:40:01.665
20250604 00:40:02.074

AdvancedSet . Test UC4119 Split Payment - Order

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.132

20250604 00:40:02.074
20250604 00:40:02.206

AdvancedSet . Test UC4119 Split Payment - Sale

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.159

20250604 00:40:02.206
20250604 00:40:02.365

AdvancedSet . Test UC4120bis Supplement Transaction Line

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.135

20250604 00:40:02.366
20250604 00:40:02.501

AdvancedSet . Test UC4120 Supplement Price Change

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.140

20250604 00:40:02.502
20250604 00:40:02.642

AdvancedSet . Test UC4121 Customer Invoice - Sale 1

PASS

 

00:00:00.400

20250604 00:40:02.641
20250604 00:40:03.041

AdvancedSet . Test UC4121 Customer Invoice - Sale 2

PASS

 

00:00:01.047

20250604 00:40:03.042
20250604 00:40:04.089

AdvancedSet . Test UC4121 Customer Invoice - Sale 3

PASS

 

00:00:00.112

20250604 00:40:04.089
20250604 00:40:04.201

AdvancedSet . Test UC4121 Customer Invoice - Invoice

PASS

 

00:00:01.117

20250604 00:40:04.202
20250604 00:40:05.319

AdvancedSet . Test UC4122 Credit Note - Step 1

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.133

20250604 00:40:05.320
20250604 00:40:05.453

AdvancedSet . Test UC4122 Credit Note - Step 2

PASS

 

00:00:01.314

20250604 00:40:05.453
20250604 00:40:06.767

AdvancedSet . Test UC4122 Credit Note - Step 3

PASS

 

00:00:00.331

20250604 00:40:06.767
20250604 00:40:07.098

AdvancedSet . Test UC4122 Credit Note - Step 4

PASS

 

00:00:00.322

20250604 00:40:07.099
20250604 00:40:07.421

AdvancedSet . Test UC4123 Cost Center Chair

FAIL

'{'errors': [{'message': 'Dubbele aanvraag', 'extensions': {'category': 'FDM', 'code': 'DUPLICATE_REQUEST', 'showPos': 'NEVER'}}]}' does not contain 'data'

00:00:00.147

20250604 00:40:07.421
20250604 00:40:07.568

Firmware

Canonical JSON

Onderstaande Python script werd gebruikt om te valideren indien het Enriched object Canonical JSON is:

from canonicaljson import encode_canonical_json

obj = {
      "enrichedEventData": {
         "bookingDate": "2024-07-30",
         "bookingPeriodId": "dffcd829-a0e5-41ca-a0ae-9eb887f95637",
         "bufferCapacityUsed": 1.9,
         "deviceId": "b54a614f-39cc-4a7b-bd9f-aa6b693d769c",
         "employeeId": "75061189702",
         "estNo": "2000000042",
         "eventCounter": 1,
         "eventLabel": "R",
         "eventOperation": "REPORT_TURNOVER_X",
         "fdmDateTime": "2025-05-26T23:03:50.250Z",
         "fdmDevices": [
            {
               "fdmId": "FOD01000001",
               "firstFdmDateTime": "2023-12-31T23:00:00Z",
               "firstTotalCounter": 49,
               "lastFdmDateTime": "2023-12-31T23:00:00Z",
               "lastTotalCounter": 50
            }
         ],
         "fdmId": "CBX01000019",
         "fdmSwVersion": "0.1.5-rc.2",
         "language": "NL",
         "posDateTime": "2025-05-26T23:03:50Z",
         "posDevices": [
            {
               "firstPosDateTime": "2023-12-31T23:00:00Z",
               "lastPosDateTime": "2023-12-31T23:00:00Z",
               "posId": "CPOS0031234567",
               "terminalId": "b54a614f-39cc-4a7b-bd9f-aa6b693d769c"
            }
         ],
         "posFiscalTicketNo": 1017,
         "posId": "CPOS0031234567",
         "posSwVersion": "1.8.3",
         "terminalId": "TER-1-BAR",
         "ticketMedium": "NONE",
         "totalCounter": 20,
         "turnover": {
            "departments": [],
            "drawersOpenCount": 0,
            "invoices": [],
            "negQuantities": [],
            "payments": [],
            "priceChanges": [],
            "transactions": [],
            "vats": []
         },
         "vatNo": "BE0000000097"
      },
      "digitalSignature": "YWJjZGVmMTIzNDU2Nzg5MGZha2VoYXNoMDk4NzY1NDMyMWZlZGNiYQ==",
      "shortSignature": "",
      "fdmLocalisation": {}
}

# Returns a `bytes` object containing the UTF-8–encoded canonical JSON.
canon_bytes = encode_canonical_json(obj)
print(canon_bytes.decode("utf-8"))

Het resultaat is

{"bookingDate":"2024-07-30","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":1.9,"deviceId":"b54a614f-39cc-4a7b-bd9f-aa6b693d769c","employeeId":"75061189702","estNo":"2000000042","eventCounter":1,"eventLabel":"R","eventOperation":"REPORT_TURNOVER_X","fdmDateTime":"2025-05-26T23:03:50.250Z","fdmDevices":[{"fdmId":"FOD01000001","firstFdmDateTime":"2023-12-31T23:00:00Z","firstTotalCounter":49,"lastFdmDateTime":"2023-12-31T23:00:00Z","lastTotalCounter":50}],"fdmId":"CBX01000019","fdmSwVersion":"0.1.5-rc.2","language":"NL","posDateTime":"2025-05-26T23:03:50Z","posDevices":[{"firstPosDateTime":"2023-12-31T23:00:00Z","lastPosDateTime":"2023-12-31T23:00:00Z","posId":"CPOS0031234567","terminalId":"b54a614f-39cc-4a7b-bd9f-aa6b693d769c"}],"posFiscalTicketNo":1017,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"TER-1-BAR","ticketMedium":"NONE","totalCounter":20,"turnover":{"departments":[],"drawersOpenCount":0,"invoices":[],"negQuantities":[],"payments":[],"priceChanges":[],"transactions":[],"vats":[]},"vatNo":"BE0000000097"}

Het enriched object geëxtraheerd van de Checkbox:

{"bookingDate":"2024-07-30","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":1.9,"deviceId":"b54a614f-39cc-4a7b-bd9f-aa6b693d769c","employeeId":"75061189702","estNo":"2000000042","eventCounter":1,"eventLabel":"R","eventOperation":"REPORT_TURNOVER_X","fdmDateTime":"2025-05-26T23:03:50.250Z","fdmDevices":[{"fdmId":"FOD01000001","firstFdmDateTime":"2023-12-31T23:00:00Z","firstTotalCounter":49,"lastFdmDateTime":"2023-12-31T23:00:00Z","lastTotalCounter":50}],"fdmId":"CBX01000019","fdmSwVersion":"0.1.5-rc.2","language":"NL","posDateTime":"2025-05-26T23:03:50Z","posDevices":[{"firstPosDateTime":"2023-12-31T23:00:00Z","lastPosDateTime":"2023-12-31T23:00:00Z","posId":"CPOS0031234567","terminalId":"b54a614f-39cc-4a7b-bd9f-aa6b693d769c"}],"posFiscalTicketNo":1017,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"TER-1-BAR","ticketMedium":"NONE","totalCounter":20,"turnover":{"departments":[],"drawersOpenCount":0,"invoices":[],"negQuantities":[],"payments":[],"priceChanges":[],"transactions":[],"vats":[]},"vatNo":"BE0000000097"}

Deze zijn identiek.

Dit wordt als volgt opgeslaan in de event buffer:

{"keyHash":"c75ca17fcdaea092f9517d0617e86dcc", "dataInHash":"b7a3eb1563fdd926c8343c5a9272443d", "eventOperation":11, "requestTime":"2025-05-26T23:03:50.250Z", "requestData":{"query":"mutation SignReportTurnoverX($data: ReportTurnoverXInput!, $training: Boolean! = false) { signReportTurnoverX(data: $data, isTraining: $training) { __typename bufferCapacityUsed deviceId digitalSignature eventOperation fdmRef { __typename fdmId fdmDateTime eventLabel eventCounter totalCounter } fdmSwVersion posDateTime posFiscalTicketNo posId shortSignature terminalId vatCalc { __typename label outOfScope rate taxableAmount totalAmount vatAmount } verificationUrl warnings { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } informations { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } footer } }","operationName":"SignReportTurnoverX","variables":{"data":{"posDevices":[{"posId":"CPOS0031234567","terminalId":"b54a614f-39cc-4a7b-bd9f-aa6b693d769c","firstPosDateTime":"2023-12-31T23:00:00Z","lastPosDateTime":"2023-12-31T23:00:00Z"}],"fdmDevices":[{"fdmId":"FOD01000001","firstFdmDateTime":"2023-12-31T23:00:00Z","firstTotalCounter":49,"lastFdmDateTime":"2023-12-31T23:00:00Z","lastTotalCounter":50}],"turnover":{"transactions":[],"departments":[],"vats":[],"payments":[],"drawersOpenCount":0,"negQuantities":[],"priceChanges":[],"invoices":[]},"language":"NL","vatNo":"BE0000000097","estNo":"2000000042","posId":"CPOS0031234567","posFiscalTicketNo":1017,"posDateTime":"2025-05-26T23:03:50Z","posSwVersion":"1.8.3","terminalId":"TER-1-BAR","deviceId":"b54a614f-39cc-4a7b-bd9f-aa6b693d769c","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bookingDate":"2024-07-30","ticketMedium":"NONE","employeeId":"75061189702"},"training":false}}, "resultTime":"2025-05-26T23:03:50.274Z", "resultData":{"data":{"signReportTurnoverX":{"__typename":"SignResult","bufferCapacityUsed":1.9,"deviceId":"b54a614f-39cc-4a7b-bd9f-aa6b693d769c","digitalSignature":"YWJjZGVmMTIzNDU2Nzg5MGZha2VoYXNoMDk4NzY1NDMyMWZlZGNiYQ==","eventOperation":"REPORT_TURNOVER_X","fdmRef":{"__typename":"FdmReference","fdmId":"CBX01000019","fdmDateTime":"2025-05-26T23:03:50.250Z","eventLabel":"R","eventCounter":1,"totalCounter":20},"fdmSwVersion":"0.1.5-rc.2","posDateTime":"2025-05-26T23:03:50Z","posFiscalTicketNo":1017,"posId":"CPOS0031234567","shortSignature":null,"terminalId":"TER-1-BAR","vatCalc":null,"verificationUrl":null,"warnings":null,"informations":null,"footer":[]}}}, "rawEnriched":{"enrichedEventData":{"bookingDate":"2024-07-30","bookingPeriodId":"dffcd829-a0e5-41ca-a0ae-9eb887f95637","bufferCapacityUsed":1.9,"deviceId":"b54a614f-39cc-4a7b-bd9f-aa6b693d769c","employeeId":"75061189702","estNo":"2000000042","eventCounter":1,"eventLabel":"R","eventOperation":"REPORT_TURNOVER_X","fdmDateTime":"2025-05-26T23:03:50.250Z","fdmDevices":[{"fdmId":"FOD01000001","firstFdmDateTime":"2023-12-31T23:00:00Z","firstTotalCounter":49,"lastFdmDateTime":"2023-12-31T23:00:00Z","lastTotalCounter":50}],"fdmId":"CBX01000019","fdmSwVersion":"0.1.5-rc.2","language":"NL","posDateTime":"2025-05-26T23:03:50Z","posDevices":[{"firstPosDateTime":"2023-12-31T23:00:00Z","lastPosDateTime":"2023-12-31T23:00:00Z","posId":"CPOS0031234567","terminalId":"b54a614f-39cc-4a7b-bd9f-aa6b693d769c"}],"posFiscalTicketNo":1017,"posId":"CPOS0031234567","posSwVersion":"1.8.3","terminalId":"TER-1-BAR","ticketMedium":"NONE","totalCounter":20,"turnover":{"departments":[],"drawersOpenCount":0,"invoices":[],"negQuantities":[],"payments":[],"priceChanges":[],"transactions":[],"vats":[]},"vatNo":"BE0000000097"},"digitalSignature":"YWJjZGVmMTIzNDU2Nzg5MGZha2VoYXNoMDk4NzY1NDMyMWZlZGNiYQ==","shortSignature":"","fdmLocalisation":{}}, "rawSignResult":{"posId":"CPOS0031234567","posFiscalTicketNo":1017,"posDateTime":"2025-05-26T23:03:50Z","terminalId":"TER-1-BAR","deviceId":"b54a614f-39cc-4a7b-bd9f-aa6b693d769c","eventOperation":"REPORT_TURNOVER_X","fdmRef":{"fdmId":"CBX01000019","fdmDateTime":"2025-05-26T23:03:50.250Z","eventLabel":"R","eventCounter":1,"totalCounter":20},"fdmSwVersion":"0.1.5-rc.2","digitalSignature":"YWJjZGVmMTIzNDU2Nzg5MGZha2VoYXNoMDk4NzY1NDMyMWZlZGNiYQ==","bufferCapacityUsed":1.8999999761581421}}

Dit toont aan dat events in canonical JSON formaat worden opgeslaan.

Firmware

Handtekeningen

Om aan te tonen dat de handtekeningen correct teruggeven worden aan de POS werd het volgende events uitgevoerd:

signSale:

{
   "query": "mutation SignSale($data: SaleInput!, $training: Boolean! = false) { signSale(data: $data, isTraining: $training) { __typename bufferCapacityUsed deviceId digitalSignature eventOperation fdmRef { __typename fdmId fdmDateTime eventLabel eventCounter totalCounter } fdmSwVersion posDateTime posFiscalTicketNo posId shortSignature terminalId vatCalc { __typename label outOfScope rate taxableAmount totalAmount vatAmount } verificationUrl warnings { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } informations { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } footer } }",
   "operationName": "SignSale",
   "variables": {
      "data": {
         "fdmRef": null,
         "costCenter": null,
         "transaction": {
            "transactionLines": [
               {
                  "lineType": "SINGLE_PRODUCT",
                  "mainProduct": {
                     "gtin": null,
                     "productId": "10006",
                     "productName": "Dry Martini",
                     "departmentId": "10",
                     "departmentName": "Aperitifs",
                     "quantity": 2,
                     "quantityType": "PIECE",
                     "negQuantityReason": null,
                     "unitPrice": 12,
                     "vats": [
                        {
                           "label": "A",
                           "price": 24,
                           "priceChanges": []
                        }
                     ]
                  },
                  "subProducts": [],
                  "costCenter": null,
                  "lineTotal": 24
               },
               {
                  "lineType": "SINGLE_PRODUCT",
                  "mainProduct": {
                     "gtin": null,
                     "productId": "22001",
                     "productName": "Burger of the Chef",
                     "departmentId": "22",
                     "departmentName": "Main Dishes",
                     "quantity": 1,
                     "quantityType": "PIECE",
                     "negQuantityReason": null,
                     "unitPrice": 28,
                     "vats": [
                        {
                           "label": "B",
                           "price": 28,
                           "priceChanges": []
                        }
                     ]
                  },
                  "subProducts": [],
                  "costCenter": null,
                  "lineTotal": 28
               }
            ],
            "transactionTotal": 52
         },
         "financials": [
            {
               "id": "1",
               "name": "CONTANT",
               "type": "CASH",
               "provider": null,
               "inputMethod": "MANUAL",
               "amount": 52,
               "amountType": "PAYMENT",
               "foreignCurrency": null,
               "reference": null,
               "drawer": null
            }
         ],
         "language": "NL",
         "vatNo": "BE0000000097",
         "estNo": "2000000042",
         "posId": "CPOS0031234567",
         "posFiscalTicketNo": 1000,
         "posDateTime": "2025-06-02T21:56:16+00:00",
         "posSwVersion": "1.8.3",
         "terminalId": "TER-2-DIN",
         "deviceId": "1631678d-7a85-4ac3-b296-bb4565e873fe",
         "bookingPeriodId": "dffcd829-a0e5-41ca-a0ae-9eb887f95637",
         "bookingDate": "2024-10-03",
         "ticketMedium": "PAPER",
         "employeeId": "84022899837"
      },
      "training": false
   }
}

Het sign result is:

{
   "data": {
      "signSale": {
         "__typename": "SignResult",
         "bufferCapacityUsed": 40,
         "deviceId": "1631678d-7a85-4ac3-b296-bb4565e873fe",
         "digitalSignature": "MEUCIHvD2BlJwdAhwu63LS2ZjXdZ7IFqG3HMfAy3fvmIWzvHAiEAn+xPbYmD5099P7OO6z9NOolX3pto8Mk9MiED963XaqA=",
         "eventOperation": "SALE",
         "fdmRef": {
            "__typename": "FdmReference",
            "fdmId": "CBX01000001",
            "fdmDateTime": "2025-06-02T22:02:45.992Z",
            "eventLabel": "N",
            "eventCounter": 25313,
            "totalCounter": 122417
         },
         "fdmSwVersion": "0.1.4+feat",
         "posDateTime": "2025-06-02T22:02:45+00:00",
         "posFiscalTicketNo": 1000,
         "posId": "CPOS0031234567",
         "shortSignature": "33c9ce5e66724ba7625fea8fe9dbd2273b860363",
         "terminalId": "TER-2-DIN",
         "vatCalc": [
            {
               "__typename": "VatCalcItem",
               "label": "A",
               "outOfScope": false,
               "rate": 21,
               "taxableAmount": 19.83,
               "totalAmount": 24,
               "vatAmount": 4.17
            },
            {
               "__typename": "VatCalcItem",
               "label": "B",
               "outOfScope": false,
               "rate": 12,
               "taxableAmount": 25,
               "totalAmount": 28,
               "vatAmount": 3
            }
         ],
         "verificationUrl": "https://www.gks2-0.be/qr5LKD9fbCJMsASYDaM",
         "warnings": null,
         "informations": null,
         "footer": [
            "FPS FIN Footer 1",
            "ParamsVerion: 2025-04-07T09:33:03Z"
         ]
      }
   }
}

Digitalsignature, shortsignature en verificationUrl werden op correcte wijze teruggeven aan de POS

Work in:

request:

{
   "query": "mutation SignWorkIn($data: WorkInOutInput!, $training: Boolean! = false) { signWorkIn(data: $data, isTraining: $training) { __typename posId posFiscalTicketNo posDateTime terminalId deviceId fdmSwVersion eventOperation digitalSignature bufferCapacityUsed fdmRef { __typename fdmId fdmDateTime eventLabel eventCounter totalCounter } warnings { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } informations { __typename message locations { __typename line column } extensions { __typename category code showPos data { __typename name value } } } footer } }",
   "operationName": "SignWorkIn",
   "variables": {
      "data": {
         "language": "NL",
         "vatNo": "BE0000000097",
         "estNo": "2000000042",
         "posId": "CPOS0031234567",
         "posFiscalTicketNo": 1010,
         "posDateTime": "2025-06-02T22:00:41+00:00",
         "posSwVersion": "1.8.3",
         "terminalId": "POS-2-REC",
         "deviceId": "80:1A:A6:75:66:FC",
         "bookingPeriodId": "dffcd829-a0e5-41ca-a0ae-9eb887f95637",
         "bookingDate": "2024-10-04",
         "ticketMedium": "NONE",
         "employeeId": "80113078968"
      },
      "training": false
   }
}

response:

{
   "data": {
      "signWorkIn": {
         "__typename": "SignResult",
         "posId": "CPOS0031234567",
         "posFiscalTicketNo": 1010,
         "posDateTime": "2025-06-02T22:04:28+00:00",
         "terminalId": "POS-2-REC",
         "deviceId": "80:1A:A6:75:66:FC",
         "fdmSwVersion": "0.1.4+feat",
         "eventOperation": "WORK_IN",
         "digitalSignature": "MEUCIHzydlU9FZ5urEEqT/KNR8hnbFUR8JqYri4Td2Rp1rEgAiEAtdfvLEuuj1YmaNnOugji5GehY2U1nzo8KywyU4dwpdo=",
         "bufferCapacityUsed": 60,
         "fdmRef": {
            "__typename": "FdmReference",
            "fdmId": "CBX01000001",
            "fdmDateTime": "2025-06-02T22:04:28.372Z",
            "eventLabel": "S",
            "eventCounter": 12043,
            "totalCounter": 122418
         },
         "warnings": null,
         "informations": null,
         "footer": [
            "FPS FIN Footer 1",
            "ParamsVerion: 2025-04-07T09:33:03Z"
         ]
      }
   }
}

Enkel digitalsignature werd gezet

Firmware

Bufferingscapaciteit

Alle events worden in den FIFO opgeslaan dat maximaal 262144 events kan bevatten, zowel de events als de FIFO buffer worden op een opslagmedium van 4 GB opgeslaan.

De buffercapaciteit gezet door FODFIN-Cloud beperkt het aantal element, de buffer berekening is als volgt:

bufferingscapaciteit = unsentEventCount / maxBuffer

Meer informatie kan gevonden worden in het hoofdstuk FODFIN-Cloud/Ontvangen en verzenden van business transacties.

Negatieve Testen

Uitgebreide set aan negatieve testen worden hier beschreven met telkens het relevante resultaat die aantonen dat die testen goed worden afgehandeld.

Negatieve Testen

Taal

Hier gaan we "language" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Verkeerde taal "NT"

{
    "errors": [
        {
            "message": "Field 'language' value is not valid",
            "locations": []
        }
    ]
}

Geen taal (null)

{
    "errors": [
        {
            "message": "Field 'language' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen taal ("")

{
    "errors": [
        {
            "message": "Field 'language' value is not valid",
            "locations": []
        }
    ]
}

Verkeerd type (int, [], {})

{
    "errors": [
        {
            "message": "Field 'language' value is not valid",
            "locations": []
        }
    ]
}

Negatieve Testen

Vat No

Hier gaan we "vatNo" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Geen Mod97 "BE0000000096"

{
    "errors": [
        {
            "message": "Invalid value for argument field [vatNo: BE0000000096]",
            "locations": []
        }
    ]
}

Ongeldige Lengte "BE000000097"

{
    "errors": [
        {
            "message": "Invalid value for argument field [vatNo: BE000000097]",
            "locations": []
        }
    ]
}

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'vatNo' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen waarde ("")

{
    "errors": [
        {
            "message": "Invalid value for argument field [vatNo: ]",
            "locations": []
        }
    ]
}

Verkeerd type (int, [], {})

{
    "errors": [
        {
            "message": "Field 'vatNo' value is not valid",
            "locations": []
        }
    ]
}

Negatieve Testen

Est No

Hier gaan we "estNo" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Geen Mod97 "2000000041"

{
    "errors": [
        {
            "message": "Invalid value for argument field [estNo: 2000000041]",
            "locations": []
        }
    ]
}

Ongeldige Lengte wel Mod97 "200000043"

{
    "errors": [
        {
            "message": "Invalid value for argument field [estNo: 200000043]",
            "locations": []
        }
    ]
}

Verkeerd type (int, [], {})

{
    "errors": [
        {
            "message": "Field 'estNo' value is not valid",
            "locations": []
        }
    ]
}

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'estNo' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen waarde ("")

{
    "errors": [
        {
            "message": "Invalid value for argument field [estNo: ]",
            "locations": []
        }
    ]
}

Negatieve Testen

PosId

Hier gaan we "posId" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Een PosId die niet in de lijst staat of niet geldig is "ABC"

{
    "errors": [
        {
            "message": "Invalid value for argument field [posId: ABC]",
            "locations": []
        }
    ]
}

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'posId' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen waarde ("")

{
    "errors": [
        {
            "message": "Invalid value for argument field [posId: ]",
            "locations": []
        }
    ]
}

Verkeerd type (int, [], {})

{
    "errors": [
        {
            "message": "Field 'posId' value is not valid",
            "locations": []
        }
    ]
}

Kleine letters "pbx01000003"

{
    "errors": [
        {
            "message": "Invalid value for argument field [posId: pbx01000003]",
            "locations": []
        }
    ]
}

Negatieve Testen

PosFiscalTicketNo

Hier gaan we "posFiscalTicketNo" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Verkeerd Type ("", [], {})

{
    "errors": [
        {
            "message": "Field 'posFiscalTicketNo' value is not valid",
            "locations": []
        }
    ]
}

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'posFiscalTicketNo' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Waarde buiten range (<1)

{
    "errors": [
        {
            "message": "Invalid value for argument field [posFiscalTicketNo: 0]",
            "locations": []
        }
    ]
}

Waarde buiten range (>999999999)

{
    "errors": [
        {
            "message": "Invalid value for argument field [posFiscalTicketNo: 1000000000]",
            "locations": []
        }
    ]
}

Negatieve Testen

PosSwVersion

Hier gaan we "posSwVersion" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'posSwVersion' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen waarde ("")

{
    "errors": [
        {
            "message": "Invalid value for argument field [posSwVersion: ]",
            "locations": []
        }
    ]
}

Waarde langer dan 36 tekens

{
    "errors": [
        {
            "message": "Invalid value for argument field [posSwVersion: 1234567890123456789012345678901234567]",
            "locations": []
        }
    ]
}

Negatieve Testen

DeviceId

Hier gaan we "deviceId" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'deviceId' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen waarde ("")

{
    "errors": [
        {
            "message": "Invalid value for argument field [deviceId: ]",
            "locations": []
        }
    ]
}

Waarde te lang > 600 tekens

{
    "errors": [
        {
            "message": "Invalid value for argument field [deviceId: 1234567890123456789012345678901234567890123456789012345678901234...]",
            "locations": []
        }
    ]
}

Negatieve Testen

TerminalId

Hier gaan we "terminalId" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'terminalId' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen waarde ("")

{
    "errors": [
        {
            "message": "Invalid value for argument field [terminalId: ]",
            "locations": []
        }
    ]
}

Waarde te lang > 600 tekens

{
    "errors": [
        {
            "message": "Invalid value for argument field [terminalId: 1234567890123456789012345678901234567890123456789012345678901234...]",
            "locations": []
        }
    ]
}

Negatieve Testen

bookingPeriodId

Hier gaan we "bookingPeriodId" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'bookingPeriodId' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen Guid formaat

{
    "errors": [
        {
            "message": "Invalid value for argument field [bookingPeriodId: defcd82-a0e5-41ca-a0ae-9eb887f95637]",
            "locations": []
        }
    ]
}

Guid met hoofdletters

{
    "errors": [
        {
            "message": "Invalid value for argument field [bookingPeriodId: E573e6f1-e167-4b1b-b432-230871cdaa42]",
            "locations": []
        }
    ]
}

Negatieve Testen

bookingDate

Hier gaan we "bookingDate" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'bookingDate' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen datum ISO8601

{
    "errors": [
        {
            "message": "Invalid value for argument field [bookingDate: ABCD]",
            "locations": []
        }
    ]
}

Negatieve Testen

employeeId

Hier gaan we "employeeId" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'employeeId' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen Mod97 "00000000096"

{
    "errors": [
        {
            "message": "Invalid value for argument field [employeeId: 00000000096]",
            "locations": []
        }
    ]
}

Geen 11 karakters "0000000097"

{
    "errors": [
        {
            "message": "Invalid value for argument field [employeeId: 0000000097]",
            "locations": []
        }
    ]
}
Negatieve Testen

InvoiceNo

Hier gaan we "invoiceNo" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'invoiceNo' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Ongeldige lengte (<1)

{
    "errors": [
        {
            "message": "Invalid value for argument field [invoiceNo: ]",
            "locations": []
        }
    ]
}

Ongeldige lengte (>600)

{
    "errors": [
        {
            "message": "Invalid value for argument field [invoiceNo: 1234567890123456789012345678901234567890123456789012345678901234...]",
            "locations": []
        }
    ]
}

Negatieve Testen

ticketMedium

Hier gaan we "ticketMedium" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'ticketMedium' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen waarde ("")

{
    "errors": [
        {
            "message": "Field 'ticketMedium' value is not valid",
            "locations": []
        }
    ]
}

Ongeldige waarde ("papier")

{
    "errors": [
        {
            "message": "Field 'ticketMedium' value is not valid",
            "locations": []
        }
    ]
}

Negatieve Testen

Costcenter

Hier gaan we "Costcenter" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Id

Geen Id (null)

{
    "errors": [
        {
            "message": "Field 'id' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Lengte < 0 en > 600

{
    "errors": [
        {
            "message": "Invalid value for argument field [id: 1234567890123456789012345678901234567890123456789012345678901234...]",
            "locations": []
        }
    ]
}

Type

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'type' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen waarde ("")

{
    "errors": [
        {
            "message": "Field 'type' value is not valid",
            "locations": []
        }
    ]
}

Ongeldige waarde

{
    "errors": [
        {
            "message": "Field 'type' value is not valid",
            "locations": []
        }
    ]
}

Reference

Geen waarde (null)

{
    "errors": [
        {
            "message": "Operation 'data' argument value is missing",
            "locations": []
        }
    ]
}

Ongeldige lengte <0 en >600

{
    "errors": [
        {
            "message": "Invalid value for argument field [reference: 1234567890123456789012345678901234567890123456789012345678901234...]",
            "locations": []
        }
    ]
}

Ongeldige diepte (meer dan 2 niveaus)

{
    "errors": [
        {
            "message": "Invalid value for argument field [costCenter:<invalid type>]",
            "locations": []
        }
    ]
}
Negatieve Testen

PosDateTime

Hier gaan we "posDateTime" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Geen waarde (null)

{
    "errors": [
        {
            "message": "Field 'posDateTime' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen ISO8601 formaat

{
    "errors": [
        {
            "message": "Invalid value for argument field [posDateTime: 2026-33-32]",
            "locations": []
        }
    ]
}

Negatieve Testen

TODO Transaction

Hier gaan we "transaction" aan verkeerd, en vooral ongeldige data onderwerpen, en zo zien dat de Checkbox dit afhandelt zoals verwacht.

Geen object bij een type Sale

{
    "errors": [
        {
            "message": "Field 'transaction' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen object bij een type PreBill

{
    "errors": [
        {
            "message": "Field 'transaction' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen object bij een type Order

{
    "errors": [
        {
            "message": "Field 'transaction' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Geen object bij een type Cost_Center_Change

{
    "errors": [
        {
            "message": "Field 'transaction' is non-nullable and has no value",
            "locations": []
        }
    ]
}

Wel object bij WorkIn

TODO

Wel object bij WorkOut

TODO

Wel object bij Invoice

TODO

Wel object bij MoneyInOut

TODO

Wel object bij DrawerOpen

TODO

Wel object bij PaymentCorrection

TODO

Wel object bij ReportTurnoverX

TODO

Wel object bij ReportTurnoverZ

TODO

Wel object bij ReportUserX

TODO

Wel object bij ReportUserZ

TODO

Wel object bij Copy

TODO

Bijlagen

 

Bijlagen

Bijlage A: EC Declaration of Conformity

CE_DEclaration.png