Skip to main content

πŸ‡ΈπŸ‡ͺ Sweden

docs image

Sweden

A configuration guide to being compliant in Sweden

This document provides a step-by-step configuration guide for a compliant setup in Sweden.

Compliance in Sweden at a glance​

Which flows are affected?


In case of a B2B sale the transaction is sent to Infrasec identical to the B2C flow to register the sale. EVA will generate a receipt including the VAT number of the customer. EVA supports B2B sales, but only for receipts not for invoices.

Which type of fiscalization is required?


Who needs certification?


Introduction​

Here are some concepts you need to familiarize yourself with before we go deeper into Sweden's fiscalization:

  • Sweden makes use of Infrasec to comply with the POS regulations;
  • Infrasec is a cloud based provider of the tax control unit. It is used to sync all EVA Point-of-Sale station transactions are synced to. This requirement will be pushed by EVA towards Infrasec automagically when properly configured.
  • All in-store transactional data are shared with infrasec and in turn with the tax control unit.

About Infrasec​

Infrasec is accredited by the Swedish Tax Authority, Skatteverket, as a certified provider for VAT registration through a VAT Control Unit - referred to as "kontrollenhet" in Swedish.

This enables direct communication of all actions from the Infrasec Web & API portal (IDM) to the Swedish Tax Agency.

  • Procedures such as new registrations, updates, and openings are managed exclusively through the IDM portal.
  • The deregistration of cash register(s) involves an additional step: it must be completed on the Swedish Tax Agency's website under My Pages.

Special considerations​

A few considerations need to be taken into account when it comes to compliancy in Sweden, as follows:

Local mode support​


Local mode is currently not supported in Sweden. Activating local mode is done at your own discretion and risk. We strongly recommend conducting thorough testing of local mode before going live to ensure it aligns with your expectations.

If you require support for local mode in Sweden, please submit a JIRA development ticket, namely a request for change.

Unreferenced returns​


In Sweden, unreferenced returned orders are permitted (a return that is not linked to an original order sold via EVA).

Ecom​


For e-commerce in Sweden, we adopt a Default auditing provider.

This approach allows for fully customizable invoice templates according to customer preferences. Moreover, the sequencing of documents will adhere to a specific format: OU ID - Sequential Number.

Please configure the followins settings:

  • Auditing:Provider - DEFAULT
  • Auditing:UseOrganizationUnitSequence - true

Note that you must also have the stencil template for the non-certified invoice configured.

Step-by-step configuration​

This is a step-by-step guide to configurations that need to be performed within EVA for a compliant setup in Sweden. The steps should be followed in the same order as presented hereunder.

Step 1: Signing the POA​

Reach out to New Black for to sign the POA. For that, please submit a ticket via our support system.

The POA will be signed by you and us. It provides Infrasec with the rights to use our data for registration purposes with Swedish tax authorities.

Step 2: Setting up a Company on EVA​

A company needs to be created in EVA, this can be done via the Admin Suite under the Companies chapter.

Your company in this essence serves as the countries top-level legal entity, which will then house all your stores, creating a hierarchical set-up that would then inherit configurations.

Make sure the following fields are filled in:

  • Name
  • Vat Number (Momsregistreringsnummer or Momsnummer - sample: SE999999999999)
  • Registration Number (Organisationsnummer - sample: 555555-5555)
  • Address (VisitorAddress)
    • Country
    • ZipCode
    • City
    • Address 1

Step 3: Create your store(s)​

Now that you have a company in place, you need to attach it to Organization Unit of type Store.

Creating those can be done via the Admin Suite under the Organization Unit chapter.

Make sure the following fields are filled in:

  • Name
  • Email address (in the Basic information tab)
  • Address
    • Country
    • ZipCode
    • City
    • Address 1
  • CompanyID (Make sure to select the company you've created in Step 1)

Shop identifier on Infrasec

New Black will set the shop identifier on Infrasec for you. This number will be based on your OU ID.

Additional step for multiple stores​


In scenarios where multiple Organization Units/Stores operate in the same country, a grouping should first be done to ease setting inheritance.

The grouping can be done by creating an Organization Unit of type Container. This Organization Unit type can be created in the same way i.e. via the Admin Suite under the Organization Unit chapter but this time, select the Organization unit type as Container & Country.

Once created, attach all your stores (Organization Units of type Store) under the created Container for this country.

Step 4: Check payment types​

For transaction reporting, EVA groups your payment types into a number of predefined categories (e.g. Cash, Credit, Voucher, Online, etc.). To perform transactions, ensure that all Payment types you offer in this country have a Payment Category defined. Payments are configured via the Admin Suite under the Payment methods chapter -> Payment Types -> Payment Category field.

Step 5: Settings for auditing provider and invoices​

The following settings need to be added. This can be done via the Admin Suite under the Settings chapter.

SettingValueOrganization unitDescription
Auditing:ProviderSWEDENSweden - On Country levelSets the certified aspects
Auditing:Provider (for E-com)SWEDENSweden - On Country levelSets the certified aspects
Auditing:Sweden:Tenant:NameAs desired-Merchant name - Using the name of your company is recommended here.
Auditing:GenerateTerminalTotalstrue--
Auditing:UseNopeCattrue-Disables printing of more than 1 duplicate, which is not allowed
Auditing:Sweden:InfrasecApiCertificate:Urlhttps://idm-verify.infrasec.se/api/EnrollCCU.php (test)
https://ccu-idm.infrasec.se/api/EnrollCCU.php (production)
-Endpoint for the point-of-sale synchronization
Auditing:Sweden:InfrasecReceiptApiCertificate:Urlhttps://pcx-verify.infrasec.se/pcxserver (test)
https://pcx-ccu.infrasec.se/pcxserver (production)
-Endpoint for the receipt synchronization

Step 6: Request Infrasec​

For the following settings, reach out to us via a support ticket within the ticket please ensure to state the Container OU ID and/or Store IDs whichever applies to you:

SettingValueOrganization unitDescription
Auditing:Sweden:Tenant:CodeUsually the name of your company-Done by us & should be unique (Max. 5 characters)
Auditing:Sweden:InfrasecEnrollmentCertPfx:BlobGuid--Done by us
Auditing:Sweden:InfrasecEnrollmentCertPfx:Key--Done by us
Auditing:Sweden:InfrasecEnrollmentCertServerTrustPem:BlobGuid--Done by us
Auditing:Sweden:InfrasecReceiptCertPfx:BlobGuid--Done by us
Auditing:Sweden:InfrasecReceiptCertPfx:Key--Done by us
Auditing:Sweden:InfrasecReceiptCertServerTrustPem:BlobGuid--Done by us
Auditing:Sweden:InfrasecApi:PosAuthorityCode--Done by us

Step 7: Create stations​

For the Organization Unit(s) of type Store where transactions will be performed, you'll need to create Station(s) for each (if applicable). Adding a station can be done by following the steps here.

When creating the Station(s), make sure the following fields are filled in:

  • The underlying Organization Unit where the station will be used i.e. attached to the OU of type Store.
  • The station name.
  • The box This station is a fiscal station and will be used for transactions needs to be checked.

(un)successful station syncs with Infrasec & deleting

If your sync with Infrasec is successful, the Fiscal system ID field in the General information card of that station will have a value. If the sync is unsuccessful, please submit a ticket stating the created Station ID so that we can initiate a resync. Attempting to delete a station without a Fiscal System ID will result in an error. In this case, please submit a ticket to have the station deleted.


Step 8 (optional): Auto open close financial period​

This is an optional step where you can configure auto open and close of your financial period.

Step 9: X/Z reports​

Reports are essential for daily financial reconciliation, inventory management, and ensuring accuracy in sales tracking and reporting.

In EVA we make the differentiation between two types of reports: X report and Z report.

  • X reportβ€―(Middle of Day report): Summary statement of the day's sales totals without any notion of closing or generation of cumulative data.

    • X reports can be generated at any time during the day without affecting the ongoing totals.
    • It provides a snapshot of sales, VAT collected, breakdown of payment methods, date and time, without resetting counters.
    • It is not possible to re-generate a specific X report as they are snapshots of the current state.
    • The X report is station specific.
  • Z reportβ€―(End of Day report): Definitive summary statement of sales totals associated with a daily closing and the generation of daily cumulative data.

    • Z reports are generated by closing of the financial period in EVA, typically at the end of a business day.
    • Summaries of certain data, and therefore don’t contain any detailed data at transactions level. The Z total reports and all data supporting the reports will need to be retained.
    • It provides a summary of total sales, VAT collected, the breakdown of payment methods, date, time and sequential number
    • The Z report is station specific.

How to generate the reports​

EVA can generate a daily X and Z reports by closing the Financial Period, or via the terminal report service: GenerateTerminalReport. Theβ€―Event ledger in EVA will show all the generated reports.

Each report will be tagged with a unique, sequential identification number that follows a chronological order. It maintains a database of these reports for the current year (or financial period) and archives the data from the six preceding years (or financial periods) that have been concluded.

How to set-up the TerminalReport stencil​

Sample stencil

<report>
<scope bold="true" align="center">
{{>Document.Type == 0 ? 'X Report' : 'Z Report'}} {{if Number && Number > 0}}#{{>Number}}{{/if}}
</scope>

<feed amount="32" />

{{if Document.Supplier}}
<scope align="center">
{{>Document.Supplier.Name}}

{{if Document.Supplier.Address}}
{{>Document.Supplier.Address.Address1}} {{>Document.Supplier.Address.Number}}
{{>Document.Supplier.Address.Address2}}
{{/if}}

{{>Document.Supplier.PhoneNumber}}
{{>Document.Supplier.Email}}

{{if Document.Supplier.EstablishmentNumber }}
Establishment number {{>Document.Supplier.EstablishmentNumber}}
{{/if}}

{{if Document.Company}}
{{if Document.Company.RegistrationNumber}}
Registration number: {{>Document.Company.RegistrationNumber}}
{{/if}}

{{if Document.Company.IndustryCode}}
Industry code: {{>Document.Company.IndustryCode}}
{{/if}}

{{if Document.Company.TaxRegistrationNumber}}
VAT number: {{>Document.Company.TaxRegistrationNumber}}
{{/if}}
{{/if}}
</scope>

<feed amount="32" />
{{/if}}


<feed amount="32"/>

Date: {{:~date(Document.Date, 'DD.MM.YYYY', 'sv-SE', 'Europe/Stockholm')}}
Hour: {{:~date(Document.Date, 'HH:mm:ss', 'sv-SE', 'Europe/Stockholm')}}

<feed amount="32"/>

<grid positions="0, 30">
<row>
<col width="20">
<bold>Change</bold>
</col>
<col>{{:~currency(Document.Change, ~root.CurrencyID)}}</col>
</row>
<row>
<col width="20">
<bold>Cash drawer openings</bold>
</col>
<col>{{>Document.CashDrawerOpenings}}</col>
</row>

<row>
<col width="20">
<bold>OpeningAmount</bold>
</col>
<col>{{>Document.OpeningAmount}}</col>
</row>

<row>
<col width="20">
<bold>ClosingAmount</bold>
</col>
<col>{{>Document.ClosingAmount}}</col>
</row>

<row>
<col width="20">
<bold>CashDepositsTotalAmount</bold>
</col>
<col>{{>Document.CashDepositsTotalAmount}}</col>
</row>

<row>
<col width="20">
<bold>Payments</bold>
</col>
<col>{{: Document.Payments ? Document.Payments.length : 0}}</col>
</row>

{{for Document.Payments}}
<row>
<col width="20">
{{>Type.Name}} ({{>Count}})
</col>
<col>{{:~currency(Amount, ~root.CurrencyID)}}</col>
</row>
{{/for}}

<row>
<col width="20">
<bold>Taxes</bold>
</col>
<col>{{: Document.Taxes ? Document.Taxes.length : 0}}</col>
</row>

{{for Document.Taxes}}
<row>
<col width="20">
{{>Name}} ({{:~rateToPercentage(Rate)}})
</col>
<col>{{:~currency(Amount, ~root.CurrencyID)}}</col>
</row>
{{/for}}

<row>
<col width="20">
<bold>Payments per employee</bold>
</col>
<col>{{: Document.PaymentsPerUser ? Document.PaymentsPerUser.length : 0}}</col>
</row>

{{if Document.PaymentsPerUser}}
{{for Document.PaymentsPerUser}}
<row>
<col width="20">
Employee(s) {{>UserID}} ({{>Count}})
</col>
<col>{{:~currency(Amount, ~root.CurrencyID)}} ({{>Description}})</col>
</row>
{{/for}}
{{/if}}

<row>
<col width="20">
<bold>Product groups</bold>
</col>
<col>{{>Document.ProductGroups.length}}</col>
</row>

{{for Document.ProductGroups}}
<row>
<col width="20">
{{>Code}} ({{>Count}})
</col>
<col>{{:~currency(Amount, ~root.CurrencyID)}}</col>
</row>
{{/for}}

<row>
<col width="20">
<bold>Number of discounts</bold>
</col>
<col>{{>Document.DiscountCount}}</col>
</row>
<row>
<col width="20">
<bold>Total discounts</bold>
</col>
<col>{{:~currency(Document.TotalDiscounts, ~root.CurrencyID)}}</col>
</row>

<row>
<col width="20">
<bold>Number of returns</bold>
</col>
<col>{{>Document.ReturnCount}}</col>
</row>
<row>
<col width="20">
<bold>Total of returns</bold>
</col>
<col>{{:~currency(Document.TotalReturnsAmount, ~root.CurrencyID)}}</col>
</row>

<row>
<col width="20">
<bold>Number of duplicate receipts</bold>
</col>
<col>{{>Document.CopyReceiptsPrinted}}</col>
</row>
<row>
<col width="20">
<bold>Total receipts</bold>
</col>
<col>{{:~currency(Document.TotalCopyReceiptsAmount, ~root.CurrencyID)}}</col>
</row>

{{* Grand totals *}}
<row>
<col width="20">
<bold>Grand total (cash payment)</bold>
</col>
<col>{{:~currency(Document.GrandTotalCash, ~root.CurrencyID)}}</col>
</row>
<row>
<col width="20">
<bold>Grand total</bold>
</col>
<col>{{:~currency(Document.GrandTotal, ~root.CurrencyID)}}</col>
</row>
<row>
<col width="20">
<bold>Grand total (returns)</bold>
</col>
<col>{{:~currency(Document.GrandTotalReturns, ~root.CurrencyID)}}</col>
</row>
<row>
<col width="20">
<bold>Grand total (excluding tax)</bold>
</col>
<col>{{:~currency(Document.GrandTotalNet, ~root.CurrencyID)}}</col>
</row>
</grid>

<feed amount="32"/>

Terminal: {{>TerminalCode}}
StationID: {{>StationID}}
Station name: {{>StationName}}

<feed amount="16"/>

<scope align="center">
<qrcode data="{{:ZippedSignature}}" size="6"/>
</scope>

<feed amount="16"/>
</report>

Automated printing Z report(s)​

When the setting Auditing:PrintTerminalReport is enabled and you have set the stencil TerminalReport we will automatically print the Zreport when you close your financial period. If you have multiple stations on your store, we will print all the Z reports on the stations that you are logged into when closing your financial period. Be aware that this station needs to have a printer otherwise the Zreports will not be printed.

Step 10: Stencils​

This step impacts what your certified invoices (thermal & PDF) will look like.

For configuration and more details about Certified Invoices please refer to the general concepts section under Certified invoice stencil for thermal &/or PDF . A separate stencil is required to set up the email in which a certified invoice would be attached to. Configurations for such stencil can be found under Email invoice stencil.

Sample PDF and thermal receipts

Step 11: Validation & testing​

Now is a good moment to validate and test your setup, as follows:

Validation​


Once you're done with all the above steps, a service can be used to check if you've missed any steps (or possibly something we've missed documenting). The service is called AuditingValidateConfiguration.

In the service request form, add your Auditing provider setting value SWEDEN, and the Organization Unit ID of type Store that you want to validate, then hit the Submit button. A zero error response means that your configurations are in order. Otherwise, missing configurations or data will be displayed.

Testing​


Start placing some orders and check the following:

  • Check that thermal receipts include: SWEDEN.ControlUnitCode and Kontrolkod: SWEDEN.ControlCode
  • Check that the PDF Certified invoice looks similar to the sample stencil priovided (check step 9)
  • Check that all station are successfuly synced (check step 7)

Managing your country​

Once you've got everything up and running for the country, you might have situations where a station needs to be removed.

Deleting stations from Swedish Tax Agency​

As of December 18th 2022, the Swedish Tax Agency has changed its handling of the deregistration of cash registers.

A cash register is administered via the Infrasec Web & API portal (IDM) and from that portal all measures are communicated directly to the Swedish Tax Agency. With the new guidelines that have come into force, the Swedish Tax Agency no longer handles the deregistration of cash registers (Deleting a station).

The Swedish Tax Agency refers to the owner deregistering his cash register under My Pages on the Swedish Tax Agency's website.

Other actions such as new registration (New), change (Change) and opening (Open) will continue to be handled via the IDM portal to the Tax Agency as usual. Deregistration (Close) will continue to be processed by the IDM portal, so that invoicing and access to the CCU is managed.

Deleting stations from EVA​

Stations that are not marked as a fiscal station can be delete at any time from EVA. Stations that are marked as a fiscal station will also be deleted on the side of Infrasec.

The deletion request to Infrasec is based on the Fiscal System ID that is present on the station. It could happen that the initial creation of station failed on the side of Infrasec.

In that case the FiscalSystemID field of the station is empty or manually set with an invalid Fiscal System ID. When this occurs it’s not possible to delete the station as it’s not known by Infrasec. You could for example receive the following error:

"The FiscalID/RegisterID for station with ID β€˜<ID’> is null or whitespace."

The station can only be removed by New Black. Please raise a support ticket when this occurs and include the station ID of the station to be deleted