Skip to main content

🇫🇷 France

This document describes all necessary configuration for a compliant setup in France (NF525 compliant).

Configuration

In order to configure your store in France to be compliant, the following configurations need to take place.

Settings

All settings below should be set on the most convenient level possible. In other words, if your organization structure has a country organization which houses all French stores, then that's where they should go.

SettingValueOrganization unitDescription
Auditing:ProviderNF525 or DEFAULTNF525 on store OU's when go-live is in phases or on country level when big bang go live. DEFAULT on ecom organization units.Triggers the NF525 related logic on orders and invoices
UseInvoiceOutputFacadetrueRoot level or container levelAttaches the Certified Invoice PDF when emailing the Invoice from POS &/or Companion App. This setting enables the use of the CertifiedInvoice stencil with destination Mail
Auditing:UseInvoiceCloningtrueRoot level or container levelUsed to create a duplicate of an original invoice whenever a customer is attached or mutated
Auditing:PublicKeyBlobID-Root level or container levelID of the blob that was uploaded that contains the public key. This setting will be set by us (see below how to request this).
Auditing:PrivateKeyBlobID-Root level or container levelPart of the key-pair used in your public key blob setting. This setting will be set by us (see below how to request this).
Auditing:EnforceTransactionValidationtrueRoot level or container levelTo check if all auditing fields have been filled properly upon conducting any sales transction
Checking missed configuration(s)

Once you're done with all configuration steps. Make sure to run the service: AuditingValidateConfiguration which should return any step(s) that you may have missed or possibly undocumented.

Setting for local mode

note

This setting is for testing purposes only.

We've created a setting which would block checkout after a certain number of days in local mode scenarios. The setting is called Auditing:NF525:MaxOfflinePeriodDurationInDays and expects a value in days as pointed out in its name. Once set, the setting first needs to be synced to the Watchtower in order for this testing to work.

Example: Adding the setting with a value of 2 would mean that all checkout flows will be blocked if the offline period is longer than 2 days (calculated from the day of 1st offline transaction). If so, an error will be thrown to the frontend user on the respective App during checkout stating the same.

note

The offline period in days accepts a maximum of 31 days after that, the checkout will be blocked, and it will no longer be possible to make any payments.

Request Public and Private keys


For the Auditing:PublicKeyBlobID and Auditing:PrivateKeyBlobID settings, please reach out to us by submitting a ticket via support.

After we do our part, we will go ahead and set those in your environment.

Do not tamper

Do not change the values of those two settings unless explicitly advised by us to do so.

Infrastructure

Cosmos DB will be setup by us, as this is required to keep track of the technical event log and the X/Z reports. If this is not set up, you won't be able to see any details in de technical event log section of Admin Suite.

Auditing fields


The following table provides a brief description of a few required fields when creating your French Company and Organization unit(s), including their corresponding field names and places on Admin Suite, and a sample.

Field nameDescriptionCorresponding field in EVASample
SIREN numberThe SIREN number is a 9-digit number (used in the business directory identification system) is a unique identification number given for each company operating in France. It is this number which makes it possible to identify each company across the different government and non-government administrations.This can be filled in via the Companies chapter, namely the Registration number field.804 544 674
SIRET numberThe SIRET number is made up of 14 digits that consists of the 9 digits of the SIREN number + the 5 digits of the NIC (a unique internal classification number given to each establishment). This allows for each establishment within one company to be uniquely identified. Therefore, there are as many SIRET numbers as establishments within a company.This can be filled in via the Organizations chapter, namely the Establishment number field under the Basic information tab.804 544 674 00372
Legal formThe registered legal form of the company.This can be filled in via the Companies chapter, namely the Entity type field.SARL, SA, SAS
Social capitalSocial capital is the company “Equity ”.This can be filled in via the Companies chapter, namely the Social capital field.25,000,000
NAF codeThe APE code which refers to the "main activity code", or also referred to as NAF code, based on the Nomenclature of French activities "French activity nomenclature", is used to make it possible to identify the main activity of the company and each of its establishments. It has a mainly used by The National Institute of Statistics and Economic Studies to craft statistics since the code provides a presumption of the type of activity your establishments perform. The code is composed of 5 characters (4 digits and a letter), and is allocated during the registration of the company along with the SIREN and SIRET.This can be filled in via the Companies chapter, namely the Industry code field.47.75Z
EORI numberThe EORI number (Economic Operator Registration and Identification) is a unique community number used to identify economic operators with regard to customs authorities. In France, the EORI number is composed of the country code (FR) + the SIRET number.This is computed by EVA.FR 804 544 674
RCSAll companies with a commercial activity must register with the Trade and Companies Register (RCS). The RCS number is made up of the letters RCS, followed by the city code of registration, and the company's SIREN number.This is computed by EVA.RCS 804 544 674 Paris
VAT numberThe VAT number of the company consists of the country code (FR) followed by 11 digits.This can be filled in via the Companies chapter, namely the VAT number field.FR12345678901

Company

When configuring your French organization unit(s), a company needs to be attached. If there is no French company present yet on EVA, a new one should be created within Admin Suite using the Companies chapter.

The following fields need to be filled:

  • Name
  • Vat Number
  • Registration Number (aka the SIREN number as described in Auditing fields table).
  • Entity type (aka the Legal form as described in Auditing fields table).
  • Social capital (Social capital as described in Auditing fields table).
  • Industry code (aka the NAF/APE code as described in Auditing fields table).
  • Address (VisitorAddress)
    • Street
    • HouseNumber
    • ZipCode
    • City
    • CountryID
note

Updating the Companies Registration and VAT numbers is not possible as soon as the first transaction has been made. If those numbers need to be changed a new company needs to be created and attached to the respective organization unit(s).

Organization unit(s)

Once a company is in place, you need to attach it to an organization unit(s).

Make sure the following fields are filled when creating an organization unit:

  • Name
  • BackendID (store number)
  • Establishment number (aka the SIRET number as described in Auditing fields table).
  • Address
    • Street
    • ZipCode
    • City
    • CountryID
  • CompanyID
note
  • It is crucial that you have the CompanyID field filled when creating the organization unit. You can retrieve this ID from the French company you created/have. This is the legal entity under which this OU/store is operating and will be referred to when filling in the details on the invoices and receipts.
  • Sales will not be permitted on all apps if the SIRET, VAT or NAF numbers are missing.

Ecom organization units


For web shop/ecom organization units, additional considerations are needed on the OU level as follows:

  • The setting AutoOpenCloseFinancialPeriod must be set to true.
  • The setting Auditing:Provider should be DEFAULT as earlier advised under settings section for Ecom OUs.
  • The organization unit is set to "Open".
  • The web shop organization unit must be attached to the French company.
  • The financial period of the webshop OU must be set to "Open".
  • The following tasks need to be set up:
    • EVA.Core.Finance.Periods.AutoOpenCloseFinancialPeriod
    • EVA.Auditing.Tasks.CreateFinancialPeriodAuditTask (For this one, please input the French web shop/ecom OU ID in the designated field).

Stations

You can find steps on adding a new station here.

When creating a station, make sure the following fields are filled in:

  • Station name.
  • The checkmark This station is a fiscal station and will be used for transactions needs to be checked.
note

All payment types must have a category, otherwise the payment can't be correctly mapped, and Ship Orders would fail.

Tasks

The following two tasks need be set up from Admin 1.0 under Management Tasks.

Financial period audit

The CreateFinancialPeriodAuditTask should be configured every second day of the month at 04:00. This task will basically do an automated generation of an audit file, which you can also trigger manually from the Audit files chapter of Admin suite.

The following fields need to be set:

  • Name - (can be any unique name you want).
  • Cron: 0 4 2 * *
  • Arguments
    • Type - (can be left blank).
    • Organization unit - (the ID of the country of the French OU).
    • Email address - (In case of task failures the email address you mention here will receive a notification. This is an optional field but quite handy).
note

For NF525 implementations, the audit file document output is modified to not include a billing address if (1) the customer attached to an order had no billing address details (2) the invoice template was just a ticket/receipt i.e. the address fields are not part of the receipt.

Financial reporting period

The CloseFinancialReportingPeriodsTask should be configured every night at 03:00. This task will check and close reporting periods (months, years, fiscal years).

The following fields need to be set:

  • Name - (can be any unique name you want).
  • Cron: 0 3 * * *
  • Type - (1 for shops 2 for webshops)
  • Email address - (Again, this is an optional field but quite handy in case the task run fails).
note

Unlike the financial period audit task, this task does not require an organization unit. It will simply look at all the automatically opened reporting periods and make sure to close them.

Stencil for Certified invoices

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

Stencil for Terminal report

To enable printing of X/Z reports, a stencil called TerminalReport is used.

Here is the stencil content

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

<scope align="center" font="FontB" tabs="21">
{#partial TerminalReportHeader}
</scope>

<feed amount="32"/>

Date: {{:~date(Document.CreationTime, 'DD.MM.YYYY', 'fr-FR', 'Europe/Paris')}}
Heure: {{:~date(Document.CreationTime, 'HH:mm:ss', 'fr-FR', 'Europe/Paris')}}

<feed amount="32"/>

<grid positions="0, 30">
<row>
<col width="20">
<bold>Changement</bold>
</col>
<col>{{:~currency(Document.Change, ~root.CurrencyID)}}</col>
</row>
<row>
<col width="20">
<bold>Ouverture du tiroir-caisse</bold>
</col>
<col>{{>Document.CashDrawerOpenings}}</col>
</row>

<row>
<col width="20">
<bold>Paiements</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>Paiements par employé</bold>
</col>
<col>{{: Document.PaymentsPerUser ? Document.PaymentsPerUser.length : 0}}</col>
</row>

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

<row>
<col width="20">
<bold>Groupes de produits</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>Nomber de remise</bold>
</col>
<col>{{>Document.DiscountCount}}</col>
</row>
<row>
<col width="20">
<bold>Total des remises</bold>
</col>
<col>{{:~currency(Document.TotalDiscounts, ~root.CurrencyID)}}</col>
</row>

<row>
<col width="20">
<bold>Nombre de retours</bold>
</col>
<col>{{>Document.ReturnCount}}</col>
</row>
<row>
<col width="20">
<bold>Total des retours</bold>
</col>
<col>{{:~currency(Document.TotalReturnsAmount, ~root.CurrencyID)}}</col>
</row>

<row>
<col width="20">
<bold>Nomber d'exemplaires</bold>
</col>
<col>{{>Document.CopyReceiptsPrinted}}</col>
</row>
<row>
<col width="20">
<bold>Total d'exemplaires</bold>
</col>
<col>{{:~currency(Document.TotalCopyReceiptsAmount, ~root.CurrencyID)}}</col>
</row>

{{* Grand totals *}}
<row>
<col width="20">
<bold>Total général (paiement en espèces)</bold>
</col>
<col>{{:~currency(Document.GrandTotalCash, ~root.CurrencyID)}}</col>
</row>
<row>
<col width="20">
<bold>Total général</bold>
</col>
<col>{{:~currency(Document.GrandTotal, ~root.CurrencyID)}}</col>
</row>
<row>
<col width="20">
<bold>Total général (retours)</bold>
</col>
<col>{{:~currency(Document.GrandTotalReturns, ~root.CurrencyID)}}</col>
</row>
<row>
<col width="20">
<bold>Total général (HT)</bold>
</col>
<col>{{:~currency(Document.GrandTotalNet, ~root.CurrencyID)}}</col>
</row>
</grid>

<feed amount="32"/>

Terminal: {{>TerminalCode}}

<feed amount="16"/>

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

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

For compliancy purposes, this stencil is only editable by New Black.

Auditing provider details on Apps

In the following areas, the auditor provider details and logo are visible. This is to comply with the CF certification rules when it comes to "displaying the logo and reference to the NF525 mark".

Order ID on return orders

In line with French regulations and NF525 logic, any returned order(s) should be accompanied by the Order ID of the initially performed sales transaction. In other words, unreferenced returns are not permitted as per French NF525 legislations.

Cash payment limit

In scenario where the paying customer has a Country ID outside France, the cash payment limit is set at €15,000.00 (fifteen thousand euros), per NF525 regulations.

For all other scenarios, the cash payment limit is set at €1,000.00 (one thousand euros).