🇫🇷 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.
Setting | Value | Organization unit | Description |
---|---|---|---|
Auditing:Provider | NF525 or DEFAULT | NF525 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 |
UseInvoiceOutputFacade | true | Root level or container level | Attaches 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:UseInvoiceCloning | true | Root level or container level | Used to create a duplicate of an original invoice whenever a customer is attached or mutated |
Auditing:PublicKeyBlobID | - | Root level or container level | ID 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 level | Part 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:EnforceTransactionValidation | true | Root level or container level | To check if all auditing fields have been filled properly upon conducting any sales transction |
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
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.
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 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 name | Description | Corresponding field in EVA | Sample |
---|---|---|---|
SIREN number | The 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 number | The 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 form | The registered legal form of the company. | This can be filled in via the Companies chapter, namely the Entity type field. | SARL, SA, SAS |
Social capital | Social capital is the company “Equity ”. | This can be filled in via the Companies chapter, namely the Social capital field. | 25,000,000 |
NAF code | The 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 number | The 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 |
RCS | All 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 number | The 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
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
- 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 beDEFAULT
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.
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).
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 shops2
for webshops) - Email address - (Again, this is an optional field but quite handy in case the task run fails).
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.
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>
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".
- In POS App under more options.
- In the EVA Checkout App under profile.
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).