System behaviour with SAF-T enabled
POS receipts are always printed
When the SAF-T active setting is enabled in SydAdmin, all points of sale (POS) within the corresponding division must comply with SAF-T requirements.
Mandatory receipt printing
A POS receipt must always be printed when SAF-T is active.
To enforce this, the setting Print POS receipt (Modify point of sale screen > tab POS receipt) is automatically set to Always.
System behavior
If a user attempts to save a POS configuration where Print POS receipt (1) is not set to Always, the system will take the following actions:

Display a warning message (2). The message informs the user that the setting will be changed to Always to ensure compliance.
Change the setting back to Always (3). This change is applied if the user confirms by clicking Yes in the message.
Events and transactions are stored
When SAF-T is enabled, the system stores events and transactions in a new electronic journal.
The journal entries can be retrieved using the following SQL query:
SELECT * FROM SAFTElectronicJournals
The codes used for logging cash register data are listed in the following document:
The codes are prefixed with a basic type:
Codes starting with 11 represent transactions.
Codes starting with 13 represent events.
The full list of cash register event codes is available in the mentioned document: Norwegian SAF-T Cash Register Data – Code Lists v1.2 (PDF)
All transactions and events are logged in the electronic journal.
Transactions are digitally signed to ensure data integrity.
SAF-T event and transaction codes
Optional? (Include when monitored.) | Included | Basic type | Code | Description | Trigger |
|---|---|---|---|---|---|
YES | 11 | 11001 | CashSale | At sale creation. A signature is added to the log. That signature is based on the previous signature and the data of the sales header. public string GetDataToSign()
{
if (string.IsNullOrEmpty(PreviousSignature))
PreviousSignature = "0";
return $"{PreviousSignature};" +
$"{SalesHeader.Date.ToString("yyyy-MM-dd")}" +
$"{SalesHeader.Date.ToString("HH:mm:ss")};" +
$"{SalesHeader.SalesNo};" +
GetFormattedDecimal(SalesHeader.CurrentAmount) + ";" +
GetFormattedDecimal(SalesHeader.CurrentLineAmount) + "";
} | |
YES | 11 | 11002 | CreditSale | Same as CashSale, but registered when a sale is credited. | |
YES | YES | 13 | 13001 | POS application start | At shift start. |
YES | YES | 13 | 13002 | POS application shut down | At shift end. |
YES | 13 | 13003 | Employee log in | At employee login. | |
YES | 13 | 13004 | Employee log out | At employee log out. | |
YES | 13 | 13005 | Open cash drawer | At opening cash drawer
| |
YES | NO | 13 | 13006 | Close cash drawer | Cannot be implemented. No trigger when cash drawer is closed. |
YES | 13 | 13007 | Update of POS application | Triggered when the version in SystemParameterSetup differs from the last event. The new version is written in the Info field. | |
YES | 13 | 13008 | X report | See the section below. | |
YES | 13 | 13009 | Z report | See the section below. | |
N/A | 13 | 13010 | Suspend transaction | ||
N/A | 13 | 13011 | Resume transaction | ||
YES | 13 | 13012 | Sales receipt printed | When the sales receipt is printed. | |
YES | 13 | 13013 | Return receipt | When the return receipt is printed. | |
YES | 13 | 13014 | Copy receipt | When the receipt is copied. | |
YES | 13 | 13015 | Provisional receipt | When an intermediate ticket is printed (to put on the table). | |
N/A | 13 | 13016 | Delivery receipt | ||
N/A | 13 | 13017 | Training receipt | ||
N/A | 13 | 13018 | Other reports or receipts | ||
N/A | 13 | 13019 | Cash withdrawal | ||
YES | NO | 13 | 13020 | Export of journal to external storage (cash register) | |
YES | 13 | 13021 | Price change | When the article price form is saved. | |
YES | 13 | 13022 | Price lookup | When the Price tab is opened in article form. | |
N/A | 13 | 13023 | Training mode on | ||
N/A | 13 | 13024 | Training mode off | ||
YES | NO | 13 | 13025 | Memory full | |
N/A | 13 | 13026 | Emergency mode on | ||
N/A | 13 | 13027 | Emergency mode off | ||
N/A | 13 | 13028 | Void receipt | ||
N/A | 13 | 13029 | STEB receipt | ||
N/A | 13 | 13030 | Concluded sale without receipt printed | ||
N/A | 13 | 13999 | Other |
Event 13008: X report and Event 13009: Z report
When exporting cash register data for SAF-T, it is essential to include specific events in the XML export file. Among these, the X-report and Z-report events are particularly important.
To ensure accurate data retrieval during SAF-T export, the system must store relevant information at the moment the X or Z report is generated. This is especially critical for X-report data, which is non-final and cannot be retrieved from the database after generation.
To support this requirement:
An event is created in the SAFTElectronicJournals table when an X or Z report is generated.
The relevant event types are:
Event type 13008: X Report
Event type 13009: Z Report
Info field: Contains details about the report type and associated shifts.
Example: X Report | Shifts: [325]
EventData field: Includes a dynamically generated EventReport node.
This node is automatically integrated into the SAF-T export to ensure complete data inclusion.
<eventReport>
<reportID>13FD311F620E461CAD9EE2069CA64783</reportID>
<reportType>x report</reportType>
<companyIdent>GANTNER</companyIdent>
<companyName>GANTNER</companyName>
<reportDate>2023-12-18</reportDate>
<reportTime>16:49:31</reportTime>
<registerID>DEFAULT</registerID>
<reportTotalCashSales>3.00</reportTotalCashSales>
<reportArtGroups>
<reportArtGroup>
<artGroupID>EEB7A92D-9E9F-418E-9F5E-02EC09A200C0</artGroupID>
<artGroupNum>1</artGroupNum>
<artGroupAmnt>3.00</artGroupAmnt>
</reportArtGroup>
</reportArtGroups>
<reportPayments>
<reportPayment>
<paymentType>C</paymentType>
<paymentNum>1</paymentNum>
<paymentAmnt>3.00</paymentAmnt>
</reportPayment>
</reportPayments>
</reportCashSaleVats>
<reportCashSaleVat>
<vatCode>2</vatCode>
<vatPerc>21.00</vatPerc>
<cashSaleAmnt>2.4793</cashSaleAmnt>
<vatAmnt>0.5207</vatAmnt>
</reportCashSaleVat>
</reportCashSaleVats>
<reportOpeningChangeFloat>200.00</reportOpeningChangeFloat>
<reportReceiptNum>1</reportReceiptNum>
<reportOpenCashBoxNum>1</reportOpenCashBoxNum>
<reportReceiptCopyNum>0</reportReceiptCopyNum>
<reportReceiptCopyAmnt>0.00</reportReceiptCopyAmnt>
<reportReceiptProformaNum>0</reportReceiptProformaNum>
<reportReceiptProformaAmnt>0.00</reportReceiptProformaAmnt>
<reportReturnNum>0</reportReturnNum>
<reportReturnAmnt>0</reportReturnAmnt>
<reportDiscountNum>0</reportDiscountNum>
<reportDiscountAmnt>0.00</reportDiscountAmnt>
<reportVoidTransNum>0</reportVoidTransNum>
<reportVoidTransAmnt>0</reportVoidTransAmnt>
</eventReport>Transactions are signed
When a transaction is completed, either a sale or a credit, the system creates an entry in the electronic journal stored in the database. This journal entry must be signed.
The signature is linked to the signature of the previous transaction. This creates a chain of signatures that ensures data integrity and traceability. If any transaction in the sequence is altered, the chain is broken, making tampering detectable.
X and Z reports include mandatory data
To ensure compliance with SAF-T requirements, the X and Z reports have been updated to include specific mandatory information on the printed ticket.

Total number of times the cash drawer was opened (1)
Number of receipt copies printed (2)
Price lookups per article group (3)
These additions ensure that the reports meet regulatory standards and provide a complete audit trail.
Sales receipts include mandatory header information
To ensure SAF-T compliance, printed sales receipts now include an additional header. The content of this header varies depending on the context in which the receipt is generated:
Whether the transaction is a sale or a credit
Whether the receipt is a temporary ticket (e.g. printed from a table)
Whether the receipt is a digital receipt (e.g. sent by email)
This enhancement ensures that all relevant transaction details are clearly indicated on the receipt, regardless of format or delivery method.