The document that contains all certification data
- HARDWAREVEREISTEN
- 3.1. CE-MARKERING
- 3.2. OPSLAG
- 3.3. PROCESSOR
- 3.4. CHIP MET SECURE ELEMENT
- 3.5. ANDERE HARDWAREVEREISTEN
- 3.6. GEZONDHEIDSINDICATOREN
- 3.7. LABELS – SERIENUMMERS
- Back Office Module
- Beveiliging van de Backoffice Module
- Raadpleging Tellers
- Raadpleging Buffer historiek
- Raadpleging Transacties in de Buffer
- Raadpleging Failed Requests
- Raadpleging Error Log
- Raadpleging Client Certificaat
- Configuratie Netwerk
- Raadpleging data elementen
- Configuratie ws_init url
- Configuratie en Synchronisatie Ntp
- Raadplegen huidige versie FDM-Parameters
- Manueel oproepen query webservice
- Extra functies
- Opslaan van PBit en CBit
- Checkbox Bridge
- Local mDns
- Disable Fod Link
- GraphQl Pos Status
- Buffer Messages
- Buffer Sent Messages
- FODFIN-Cloud
- Api Protocol Algemeen
- FDM Certificaatbeheer
- Systeemklok
- Booting de FDM
- Ontvangen en verzenden van business transacties
- FDM service onderbreking
- Webservices
- POS - FDM Connectie
- Connectie mogelijkheden
- GraphQl Pos
- GraphQl Ac
- GraphQl Berekeningen
- Speciale gevallen
- Updaten van de Parameters
- Firmware
- Negatieve Testen
- Taal
- Vat No
- Est No
- PosId
- PosFiscalTicketNo
- PosSwVersion
- DeviceId
- TerminalId
- bookingPeriodId
- bookingDate
- employeeId
- InvoiceNo
- ticketMedium
- Costcenter
- PosDateTime
- TODO Transaction
- Bijlagen
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.
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.
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:
- Write/erase-cycli: 500 – 3000; 2 TBW
- Snelheidsklasse: Class 10
De SD-kaart is getest op zowel duurzaamheid als capaciteit. De datasheet is op aanvraag beschikbaar.
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.
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)
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.
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.
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.
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
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
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.
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 |
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 |
|
|
|
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 |
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 |

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 |
|
Kleur |
Betekenis |
---|---|---|
|
Groen* |
Succesvolle bidirectionele communicatie |
|
Rood* |
POS onbereikbaar, fout in berichtuitwisseling |
|
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.
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.
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
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.
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.
Of anderzijds bij de details van een Checkbox kan je via de Admin Console 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.
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 knop een subscherm oproepen waar je vervolgens Admin Info kunt opvragen.
En bij het tabblad User Params kun je het vervolg terugvinden
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.
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
Daarna krijg je een lijst met failed requests
Raadpleging Error Log
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 knop een subscherm oproepen waar je vervolgens Admin Info kunt opvragen.
Configuratie Netwerk
GraphQl
Backoffice Tools
Anderzijds bij de details van een Checkbox kan je via de Settings knop een subscherm oproepen waar je vervolgens de instellingen kunt zien en wijzigen.

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 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.
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 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.
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 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.
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 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
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 knop een subscherm oproepen waar je vervolgens Run Ws Query oproepen zodat de Checkbox manueel deze functie zal uitvoeren.
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.
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.
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.
Dit toont ons de laatste status van de CBit. Daar kan Taiger ook de geschiedenis van zien
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
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 |
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
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.
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
}
}
}
}
Buffer Messages
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.
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.
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.
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.
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.
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:
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.
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 |
- Groen: NTP tijd synchronisatie
- Rood: De checkbox rapporteert dat er geen configuratie gevonden kan worden.
- Blauw: Genereren van de JWT-token
- Paars: Verwerken van de response
- 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 |
- Groen: NTP tijd synchronisatie
- Blauw: Valideer of er niet-verzonden transacties zijn, zoniet dan stuur een NOP
- 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 |
- Groen: NTP tijd synchronisatie
- Blauw: Valideer of er niet-verzonden transacties zijn, start ophalen van niet verzonden transacties
- 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
{ }
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 |
–
|
Ja |
Verdeelt in blokken van 10.000 files |
Subdir (2e) |
max. 100 |
–
|
Ja |
max. 100 files per directory |
Bestand |
per event |
|
Ja |
Bestandsnaam is globaal uniek waar index de |
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 1748456751
staat voor 2025-05-28T18:25:51.000Z.
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.
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 |
- Groen: Aankondiging WS_INIT samen met de extra informatie
- Blauw: Genereren van de JWT-token
- 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 |
- Rood: Verwerken van set FDM lock is niet geslaagd
- 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:
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 |
- Groen: versturen naar WS_REG gedurende het 22ste uur
- 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
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.
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
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.
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
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
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",
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"
}
}
]
}
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.
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
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 |
PASS |
|
00:00:00.257 |
20250602 23:04:42.394 |
|
BasicSet . Test M111 Sign Sale Refund |
PASS |
|
00:00:00.248 |
20250602 23:04:42.652 |
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 |
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 |
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 |
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 |
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 |
BasicSet . Test M122 Sign Cost Center Change |
PASS |
|
00:00:00.304 |
20250602 23:04:44.028 |
BasicSet . Test M123 Sign Prebill |
PASS |
|
00:00:00.203 |
20250602 23:04:44.332 |
BasicSet . Test M130 Sign Money In Out |
PASS |
|
00:00:00.208 |
20250602 23:04:44.536 |
BasicSet . Test M131 Sign Drawer Open |
PASS |
|
00:00:00.305 |
20250602 23:04:44.744 |
BasicSet . Test M132 Sign Payment Correction |
PASS |
|
00:00:00.203 |
20250602 23:04:45.049 |
BasicSet . Test M133 Sign Money In Out Drawer Declaration |
PASS |
|
00:00:00.207 |
20250602 23:04:45.252 |
BasicSet . Test M140 Sign Work In |
PASS |
|
00:00:00.202 |
20250602 23:04:45.459 |
BasicSet . Test M141 Sign Work Out |
PASS |
|
00:00:00.203 |
20250602 23:04:45.661 |
BasicSet . Test M150 Sign Invoice |
PASS |
|
00:00:00.174 |
20250602 23:04:45.863 |
BasicSet . Test M160 Sign Copy Sale |
PASS |
|
00:00:00.164 |
20250602 23:04:46.037 |
BasicSet . Test M161 Sign Copy Order |
PASS |
|
00:00:00.281 |
20250602 23:04:46.201 |
BasicSet . Test M170 Sign Work In Training |
PASS |
|
00:00:00.164 |
20250602 23:04:46.482 |
BasicSet . Test M171 Sign Sale Training |
PASS |
|
00:00:00.243 |
20250602 23:04:46.647 |
BasicSet . Test M172 Sign Copy Training |
PASS |
|
00:00:00.202 |
20250602 23:04:46.890 |
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 |
ReportSet . Test Input Report T2 |
PASS |
|
00:00:00.349 |
20250602 23:08:22.304 |
ReportSet . Test Input Report T3 |
PASS |
|
00:00:00.309 |
20250602 23:08:22.654 |
ReportSet . Test Input Report T4 |
PASS |
|
00:00:00.306 |
20250602 23:08:22.963 |
ReportSet . Test Input Report T5 |
PASS |
|
00:00:00.203 |
20250602 23:08:23.269 |
ReportSet . Test Input Report T6 |
PASS |
|
00:00:00.305 |
20250602 23:08:23.473 |
ReportSet . Test Input Report T7 |
PASS |
|
00:00:00.204 |
20250602 23:08:23.778 |
ReportSet . Test Input Report T8 |
PASS |
|
00:00:00.308 |
20250602 23:08:23.982 |
ReportSet . Test M180 Sign Report Tunover X |
PASS |
|
00:00:00.310 |
20250602 23:08:24.290 |
ReportSet . Test M180 Sign Report Tunover X T1 |
PASS |
|
00:00:00.093 |
20250602 23:08:24.600 |
ReportSet . Test M180 Sign Report Tunover X T2 |
PASS |
|
00:00:00.116 |
20250602 23:08:24.694 |
ReportSet . Test M180 Sign Report Tunover X T3 |
PASS |
|
00:00:00.107 |
20250602 23:08:24.810 |
ReportSet . Test M180 Sign Report Tunover X T4 |
PASS |
|
00:00:00.090 |
20250602 23:08:24.917 |
ReportSet . Test M180 Sign Report Tunover X T5 |
PASS |
|
00:00:00.088 |
20250602 23:08:25.007 |
ReportSet . Test M180 Sign Report Tunover X T6 |
PASS |
|
00:00:00.118 |
20250602 23:08:25.096 |
ReportSet . Test M180 Sign Report Tunover X T7 |
PASS |
|
00:00:00.087 |
20250602 23:08:25.214 |
ReportSet . Test M180 Sign Report Tunover X T8 |
PASS |
|
00:00:00.106 |
20250602 23:08:25.301 |
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 |
ReportSet . Test M182 Sign Report User |
PASS |
|
00:00:00.309 |
20250602 23:08:25.724 |
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 |
20250523_UC_AdvancedSet_POS_FDM_1.4
AdvancedSet . Test UC200 Composite Product |
PASS |
|
00:00:00.301 |
20250604 00:39:01.880 |
AdvancedSet . Test UC201 Sign Sale Rounding |
PASS |
|
00:00:00.394 |
20250604 00:39:02.181 |
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 |
AdvancedSet . Test UC221A Line Price Change |
PASS |
|
00:00:00.428 |
20250604 00:39:02.937 |
AdvancedSet . Test UC221B Line Price Change |
PASS |
|
00:00:00.332 |
20250604 00:39:03.366 |
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 |
AdvancedSet . Test UC223 Event Price Change |
PASS |
|
00:00:00.328 |
20250604 00:39:03.850 |
AdvancedSet . Test UC224 Multiple Price Change |
PASS |
|
00:00:00.337 |
20250604 00:39:04.179 |
AdvancedSet . Test UC225A Step 1 Order |
PASS |
|
00:00:00.296 |
20250604 00:39:04.516 |
AdvancedSet . Test UC225A Step 2 Order |
PASS |
|
00:00:00.341 |
20250604 00:39:04.812 |
AdvancedSet . Test UC225A Step 3 Sale |
PASS |
|
00:00:00.375 |
20250604 00:39:05.153 |
AdvancedSet . Test UC225B Step 1 Order |
PASS |
|
00:00:00.093 |
20250604 00:39:05.529 |
AdvancedSet . Test UC225B Step 2 Sale |
PASS |
|
00:00:01.207 |
20250604 00:39:05.622 |
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 |
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 |
AdvancedSet . Test UC229B Free Article Direct Sale |
PASS |
|
00:00:00.360 |
20250604 00:39:07.136 |
AdvancedSet . Test UC230 Correction |
PASS |
|
00:00:00.379 |
20250604 00:39:07.496 |
AdvancedSet . Test UC240 Step 1 Order |
PASS |
|
00:00:00.415 |
20250604 00:39:07.876 |
AdvancedSet . Test UC240 Step 2 CostCenterChange |
PASS |
|
00:00:00.420 |
20250604 00:39:08.291 |
AdvancedSet . Test UC240 Step 3 Prebill T1 |
PASS |
|
00:00:00.356 |
20250604 00:39:08.711 |
AdvancedSet . Test UC240 Step 4 Prebill T2 |
PASS |
|
00:00:00.383 |
20250604 00:39:09.068 |
AdvancedSet . Test UC240 Step 5 Sale T1 |
PASS |
|
00:00:00.426 |
20250604 00:39:09.451 |
AdvancedSet . Test UC240 Step 6 Sale T2 |
PASS |
|
00:00:00.518 |
20250604 00:39:09.877 |
AdvancedSet . Test UC241 Table Split To Existing - Order T1 |
PASS |
|
00:00:00.918 |
20250604 00:39:10.396 |
AdvancedSet . Test UC241 Table Split To Existing - Order T2 |
PASS |
|
00:00:00.395 |
20250604 00:39:11.314 |
AdvancedSet . Test UC241 Table Split To Existing - Cost Center Change |
PASS |
|
00:00:00.468 |
20250604 00:39:11.709 |
AdvancedSet . Test UC241 Table Split To Existing - Sale T1 |
PASS |
|
00:00:00.511 |
20250604 00:39:12.178 |
AdvancedSet . Test UC241 Table Split To Existing - Sale T2 |
PASS |
|
00:00:00.498 |
20250604 00:39:12.689 |
AdvancedSet . Test UC242 Table Split To 2 New - Order T1 |
PASS |
|
00:00:00.357 |
20250604 00:39:13.186 |
AdvancedSet . Test UC242 Table Split To 2 New - Cost Center Change |
PASS |
|
00:00:00.357 |
20250604 00:39:13.544 |
AdvancedSet . Test UC242 Table Split To 2 New - Sale T35 |
PASS |
|
00:00:00.324 |
20250604 00:39:13.901 |
AdvancedSet . Test UC242 Table Split To 2 New - Sale T2 |
PASS |
|
00:00:00.391 |
20250604 00:39:14.226 |
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 |
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 |
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 |
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 |
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 |
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 |
AdvancedSet . Test UC250 Table Merge - Order T1 |
PASS |
|
00:00:00.466 |
20250604 00:39:15.496 |
AdvancedSet . Test UC250 Table Merge - Order T2 |
PASS |
|
00:00:00.457 |
20250604 00:39:15.962 |
AdvancedSet . Test UC250 Table Merge - Cost Center Change |
PASS |
|
00:00:00.633 |
20250604 00:39:16.419 |
AdvancedSet . Test UC250 Table Merge - Sale |
PASS |
|
00:00:00.510 |
20250604 00:39:17.052 |
AdvancedSet . Test UC251 Table Merge - Order T1 |
PASS |
|
00:00:00.490 |
20250604 00:39:17.562 |
AdvancedSet . Test UC251 Table Merge - Order T2 |
PASS |
|
00:00:00.924 |
20250604 00:39:18.052 |
AdvancedSet . Test UC251 Table Merge - Cost Center Change |
PASS |
|
00:00:00.638 |
20250604 00:39:18.976 |
AdvancedSet . Test UC251 Table Merge - Sale |
PASS |
|
00:00:00.510 |
20250604 00:39:19.615 |
AdvancedSet . Test UC252 Table Merge Discount - Order T1 |
PASS |
|
00:00:00.148 |
20250604 00:39:20.125 |
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 |
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 |
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 |
AdvancedSet . Test UC261 MPV Use - Order |
PASS |
|
00:00:00.584 |
20250604 00:39:20.845 |
AdvancedSet . Test UC261 MPV Use - Sale |
PASS |
|
00:00:00.394 |
20250604 00:39:21.429 |
AdvancedSet . Test UC262 MPV Use |
PASS |
|
00:00:00.367 |
20250604 00:39:21.824 |
AdvancedSet . Test UC270 SPV Sale |
PASS |
|
00:00:00.380 |
20250604 00:39:22.191 |
AdvancedSet . Test UC271 SPV Use - Order 1 |
PASS |
|
00:00:00.486 |
20250604 00:39:22.572 |
AdvancedSet . Test UC271 SPV Use - Order 2 |
PASS |
|
00:00:00.366 |
20250604 00:39:23.058 |
AdvancedSet . Test UC271 SPV Use - Prebill |
PASS |
|
00:00:00.435 |
20250604 00:39:23.424 |
AdvancedSet . Test UC271 SPV Use - Sale |
PASS |
|
00:00:00.931 |
20250604 00:39:23.860 |
AdvancedSet . Test UC280 Composite Product |
PASS |
|
00:00:01.044 |
20250604 00:39:24.791 |
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 |
AdvancedSet . Test UC291 Payment Foreign Currency |
PASS |
|
00:00:00.867 |
20250604 00:39:25.982 |
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 |
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 |
AdvancedSet . Test UC295 Payment Foreign Currency |
PASS |
|
00:00:00.942 |
20250604 00:39:27.121 |
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 |
AdvancedSet . Test UC4100 Customer Account - Step 1 Money In |
PASS |
|
00:00:01.307 |
20250604 00:39:28.221 |
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 |
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 |
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 |
AdvancedSet . Test UC4102 Full Flow - Sign Order 1 |
PASS |
|
00:00:00.926 |
20250604 00:39:29.926 |
AdvancedSet . Test UC4102 Full Flow - Sign Order 2 |
PASS |
|
00:00:00.399 |
20250604 00:39:30.853 |
AdvancedSet . Test UC4102 Full Flow - Sign Prebill |
PASS |
|
00:00:00.462 |
20250604 00:39:31.252 |
AdvancedSet . Test UC4102 Full Flow - Sign Sale |
PASS |
|
00:00:00.491 |
20250604 00:39:31.714 |
AdvancedSet . Test UC4102 Full Flow - Copy Bill |
PASS |
|
00:00:01.133 |
20250604 00:39:32.205 |
AdvancedSet . Test UC4102 Full Flow - Invoice |
PASS |
|
00:00:00.333 |
20250604 00:39:33.338 |
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 |
AdvancedSet . Test UC4103bis Split Bill - Bill 1 |
PASS |
|
00:00:00.923 |
20250604 00:39:33.801 |
AdvancedSet . Test UC4103bis Split Bill - Bill 2 |
PASS |
|
00:00:00.399 |
20250604 00:39:34.724 |
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 |
AdvancedSet . Test UC4103 Cost Center Change Split - Cost Center Change |
PASS |
|
00:00:00.745 |
20250604 00:39:35.269 |
AdvancedSet . Test UC4103 Cost Center Change Split - Bill 1 |
PASS |
|
00:00:00.503 |
20250604 00:39:36.014 |
AdvancedSet . Test UC4103 Cost Center Change Split - Bill 2 |
PASS |
|
00:00:01.331 |
20250604 00:39:36.517 |
AdvancedSet . Test UC4104 Full Flow - Step 1 Order |
PASS |
|
00:00:00.343 |
20250604 00:39:37.848 |
AdvancedSet . Test UC4104 Full Flow - Step 2 Order |
PASS |
|
00:00:00.919 |
20250604 00:39:38.191 |
AdvancedSet . Test UC4104 Full Flow - Step 3 Order |
PASS |
|
00:00:00.406 |
20250604 00:39:39.111 |
AdvancedSet . Test UC4104 Full Flow - Step 4 Bill 1 |
PASS |
|
00:00:00.462 |
20250604 00:39:39.518 |
AdvancedSet . Test UC4104 Full Flow - Step 5 Price Change |
PASS |
|
00:00:00.520 |
20250604 00:39:39.980 |
AdvancedSet . Test UC4104 Full Flow - Step 6 Prebill |
PASS |
|
00:00:01.100 |
20250604 00:39:40.501 |
AdvancedSet . Test UC4104 Full Flow - Step 7 Bill 2 |
PASS |
|
00:00:00.475 |
20250604 00:39:41.601 |
AdvancedSet . Test UC4104 Full Flow - Step 8 Bill 3 |
PASS |
|
00:00:00.945 |
20250604 00:39:42.077 |
AdvancedSet . Test UC4104 Full Flow - Step 9 Payment Correction |
PASS |
|
00:00:01.028 |
20250604 00:39:43.022 |
AdvancedSet . Test UC4104 Full Flow - Step 10 Copy Bill 2 |
PASS |
|
00:00:00.332 |
20250604 00:39:44.050 |
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 |
AdvancedSet . Test UC4105 MPV to Cash |
PASS |
|
00:00:01.273 |
20250604 00:39:44.520 |
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 |
AdvancedSet . Test UC4107 Vat Labels ABC - Order |
PASS |
|
00:00:00.313 |
20250604 00:39:45.932 |
AdvancedSet . Test UC4107 Vat Labels ABC - Price Change |
PASS |
|
00:00:00.350 |
20250604 00:39:46.245 |
AdvancedSet . Test UC4107 Vat Labels ABC - Prebill |
PASS |
|
00:00:00.319 |
20250604 00:39:46.595 |
AdvancedSet . Test UC4107 Vat Labels ABC - Order Takeaway |
PASS |
|
00:00:00.434 |
20250604 00:39:46.915 |
AdvancedSet . Test UC4107 Vat Labels ABC - Sale |
PASS |
|
00:00:00.461 |
20250604 00:39:47.349 |
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 |
AdvancedSet . Test UC4109 No Payment - Order |
PASS |
|
00:00:01.076 |
20250604 00:39:47.957 |
AdvancedSet . Test UC4109 No Payment - Sale |
PASS |
|
00:00:01.091 |
20250604 00:39:49.033 |
AdvancedSet . Test UC4110 Advanced Payment - Prepayment |
PASS |
|
00:00:01.122 |
20250604 00:39:50.124 |
AdvancedSet . Test UC4110 Advanced Payment - Order |
PASS |
|
00:00:00.338 |
20250604 00:39:51.247 |
AdvancedSet . Test UC4110 Advanced Payment - Sale |
PASS |
|
00:00:01.130 |
20250604 00:39:51.586 |
AdvancedSet . Test UC4111 Advanced Payment % of Price - Prepayment |
PASS |
|
00:00:01.028 |
20250604 00:39:52.716 |
AdvancedSet . Test UC4111 Advanced Payment % of Price - Order |
PASS |
|
00:00:00.303 |
20250604 00:39:53.744 |
AdvancedSet . Test UC4111 Advanced Payment % of Price - Sale |
PASS |
|
00:00:00.341 |
20250604 00:39:54.048 |
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 |
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 |
AdvancedSet . Test UC4113 Prepayment Reservation - Order |
PASS |
|
00:00:00.392 |
20250604 00:39:54.670 |
AdvancedSet . Test UC4113 Prepayment Reservation - Order 2 |
PASS |
|
00:00:00.370 |
20250604 00:39:55.062 |
AdvancedSet . Test UC4113 Prepayment Reservation - Prebill |
PASS |
|
00:00:01.188 |
20250604 00:39:55.433 |
AdvancedSet . Test UC4113 Prepayment Reservation - Sale Final |
PASS |
|
00:00:00.584 |
20250604 00:39:56.621 |
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 |
AdvancedSet . Test UC4114 Festival Deposit - Refund |
PASS |
|
00:00:00.695 |
20250604 00:39:57.339 |
AdvancedSet . Test UC4116 Correction Price Change - Step 1 |
PASS |
|
00:00:00.414 |
20250604 00:39:58.035 |
AdvancedSet . Test UC4116 Correction Price Change - Step 2 |
PASS |
|
00:00:01.322 |
20250604 00:39:58.449 |
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 |
AdvancedSet . Test UC4118 Payment Correction - Sale |
PASS |
|
00:00:00.335 |
20250604 00:39:59.903 |
AdvancedSet . Test UC4118 Payment Correction - Correction |
PASS |
|
00:00:00.300 |
20250604 00:40:00.238 |
AdvancedSet . Test UC4119bis Split Bill - Order |
PASS |
|
00:00:00.317 |
20250604 00:40:00.539 |
AdvancedSet . Test UC4119bis Split Bill - Sale 1 |
PASS |
|
00:00:00.415 |
20250604 00:40:00.856 |
AdvancedSet . Test UC4119bis Split Bill - Sale 2 |
PASS |
|
00:00:00.394 |
20250604 00:40:01.271 |
AdvancedSet . Test UC4119bis Split Bill - Sale 3 |
PASS |
|
00:00:00.409 |
20250604 00:40:01.665 |
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 |
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 |
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 |
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 |
AdvancedSet . Test UC4121 Customer Invoice - Sale 1 |
PASS |
|
00:00:00.400 |
20250604 00:40:02.641 |
AdvancedSet . Test UC4121 Customer Invoice - Sale 2 |
PASS |
|
00:00:01.047 |
20250604 00:40:03.042 |
AdvancedSet . Test UC4121 Customer Invoice - Sale 3 |
PASS |
|
00:00:00.112 |
20250604 00:40:04.089 |
AdvancedSet . Test UC4121 Customer Invoice - Invoice |
PASS |
|
00:00:01.117 |
20250604 00:40:04.202 |
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 |
AdvancedSet . Test UC4122 Credit Note - Step 2 |
PASS |
|
00:00:01.314 |
20250604 00:40:05.453 |
AdvancedSet . Test UC4122 Credit Note - Step 3 |
PASS |
|
00:00:00.331 |
20250604 00:40:06.767 |
AdvancedSet . Test UC4122 Credit Note - Step 4 |
PASS |
|
00:00:00.322 |
20250604 00:40:07.099 |
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 |
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.
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
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.
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": []
}
]
}
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": []
}
]
}
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": []
}
]
}
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": []
}
]
}
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": []
}
]
}
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": []
}
]
}
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": []
}
]
}
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": []
}
]
}
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": []
}
]
}
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": []
}
]
}
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": []
}
]
}
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": []
}
]
}
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": []
}
]
}
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": []
}
]
}
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": []
}
]
}
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