diff --git a/content/applications/finance/accounting/fiscal_localizations/localizations/france.rst b/content/applications/finance/accounting/fiscal_localizations/localizations/france.rst index d97bcd514..d72ade118 100644 --- a/content/applications/finance/accounting/fiscal_localizations/localizations/france.rst +++ b/content/applications/finance/accounting/fiscal_localizations/localizations/france.rst @@ -2,44 +2,364 @@ France ====== -FEC -=== +.. _france/fec: -If you have installed the French Accounting, you will be able to download the FEC. -For this, go in :menuselection:`Accounting --> Reporting --> France --> FEC`. +FEC - Fichier des Écritures Comptables +====================================== + +An FEC :dfn:`Fichier des Écritures Comptables` audit file contains all the accounting data and entries +recorded in all the accounting journals for a financial year. The entries in the file must be +arranged in chronological order. + +Since January 1st, 2014, every French company is required to produce and transmit this file upon +request by the tax authorities for audit purposes. + +FEC Import +---------- + +To make the onboarding of new users easier, Odoo Enterprise's French :doc:`fiscal localization +<../overview/fiscal_localization_packages>` includes the **FEC Import** feature (module name: +``l10n_fr_fec_import``), which enables the import of existing FEC files from older software. + +To enable this feature, go to :menuselection:`Accounting --> Configuration --> Settings --> +Accounting Import`, enable **FEC Import**, and *Save*. + +Next, go to :menuselection:`Accounting --> Configuration --> FEC Import`, upload your FEC file, and +click on *Import*. + +.. note:: + + | Importing FEC files from different year takes no particular action or computation. + | Should multiple files contain any "Reports à Nouveaux" (RAN) with the starting balance of the + year, you might need to cancel those entries in the User Interface. Odoo makes those entries + (RAN) useless. + +File formats +~~~~~~~~~~~~ + +FEC files can only be in CSV format, as the XML format is not supported. + +.. note:: + + The FEC CSV file has a plain text format representing a data table, with the first line being a + header and defining the list of fields for each entry, and each following line representing one + accounting entry, in no predetermined order. + +Our module expects the files to meet the following technical specifications: + +- **Encoding**: UTF-8, UTF-8-SIG and iso8859_15. +- **Separator**: any of these: `;` or `|` or `,` or `TAB`. +- **Line terminators**: both CR+LF (`\\r\\n`) and LF (`\\n`) character groups are supported. +- **Date format**: `%Y%m%d` + +Fields description and use +~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| # | Field name | Description | Use | Format | ++====+===============+======================================+===================================+=================+ +| 01 | JournalCode | Journal Code | `journal.code` and `journal.name` | Alphanumeric | +| | | | if `JournalLib` is not provided | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 02 | JournalLib | Journal Label | `journal.name` | Alphanumeric | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 03 | EcritureNum | Numbering specific to each journal | `move.name` | Alphanumeric | +| | | sequence number of the entry | | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 04 | EcritureDate | Accounting entry Date | `move.date` | Date (yyyyMMdd) | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 05 | CompteNum | Account Number | `account.code` | Alphanumeric | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 06 | CompteLib | Account Label | `account.name` | Alphanumeric | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 07 | CompAuxNum | Secondary account Number | `partner.ref` | Alphanumeric | +| | | (accepts null) | | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 08 | CompAuxLib | Secondary account Label | `partner.name` | Alphanumeric | +| | | (accepts null) | | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 09 | PieceRef | Document Reference | `move.ref` and `move.name` | Alphanumeric | +| | | | if `EcritureNum` is not provided | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 10 | PieceDate | Document Date | `move.date` | Date (yyyyMMdd) | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 11 | EcritureLib | Account entry Label | `move_line.name` | Alphanumeric | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 12 | Debit | Debit amount | `move_line.debit` | Float | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 13 | Credit | Credit amount | `move_line.credit` | Float | +| | | (Field name "Crédit" is not allowed) | | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 14 | EcritureLet | Accounting entry cross reference | `move_line.fec_matching_number` | Alphanumeric | +| | | (accepts null) | | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 15 | DateLet | Accounting entry date | unused | Date (yyyyMMdd) | +| | | (accepts null) | | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 16 | ValidDate | Accounting entry validation date | unused | Date (yyyyMMdd) | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 17 | Montantdevise | Currency amount | `move_line.amount_currency` | Float | +| | | (accepts null) | | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 18 | Idevise | Currency identifier | `currency.name` | Alphanumeric | +| | | (accepts null) | | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ + +These two fields can be found in place of the others in the sence above. + ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 12 | Montant | Amount | `move_line.debit` | Float | +| | | | or `move_line.credit` | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 13 | Sens | Can be "C" for Credit | determines `move_line.debit` | Char | +| | | or "D" for Debit | or `move_line.credit` | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ + +Implementation details +~~~~~~~~~~~~~~~~~~~~~~ + +The following accounting entities are imported from the FEC files: **Accounts, Journals, Partners**, +and **Moves**. + +Our module determines the encoding, the line-terminator character, and the separator that are used +in the file. + +A check is then performed to see if every line has the correct number of fields corresponding to the +header. + +If the check passes, then the file is read in full, kept in memory, and scanned. Accounting entities +are imported one type at a time, in the following order. + +Accounts +******** + +Every accounting entry is related to an account, which should be determined by the field +`CompteNum`. + +Code matching +************* + +Should a similar account code already be present in the system, the existing one is used instead of +creating a new one. + +Accounts in Odoo generally have a number of digits that are default for the fiscal localization. As +the FEC module is related to the French localization, the default number of relevant digits is 6. + +This means that the account codes the trailing zeroes are right-trimmed, and that the comparison +between the account codes in the FEC file and the ones already existing in Odoo is performed only on +the first six digits of the codes. + +.. admonition:: Example + + The account code `65800000` in the file is matched against an existing `658000` account in + Odoo, and that account is used instead of creating a new one. + +Reconcilable flag +***************** + +An account is technically flagged as *reconcilable* if the first line in which it appears has the +`EcritureLet` field filled out, as this flag means that the accounting entry is going to be +reconciled with another one. + +.. note:: + + In case the line somehow has this field not filled out, but the entry still has to be reconciled + with a payment that hasn't yet been recorded, this isn't a problem anyway; the account is + flagged as reconcilable as soon as the import of the move lines requires it. + +Account type and Templates matching +*********************************** + +As the **type** of the account is not specified in the FEC format, **new** accounts are created +with the default type *Current Assets* and then, at the end of the import process, they are +matched against the installed Chart of Account templates. Also, the *reconcile* flag is also +computed this way. + +The match is done with the left-most digits, starting by using all digits, then 3, then 2. + +.. admonition:: Example + + +------------+------------+-----------------+---------------------+---------------------+ + | Name | Code | Full comparison | 3-digits comparison | 2-digits comparison | + +============+============+=================+=====================+=====================+ + | Template | `400000` | `400000` | `400` | `40` | + +------------+------------+-----------------+---------------------+---------------------+ + | CompteNum | `40100000` | `40100000` | `401` | `40` | + +------------+------------+-----------------+---------------------+---------------------+ + | **Result** | | | | Match **found** | + +------------+------------+-----------------+---------------------+---------------------+ + +The type of the account is then flagged as *payable* and *reconcilable* as per the account template. + +Journals +******** + +Journals are also checked against those already existing in Odoo to avoid duplicates, also in the +case of multiple FEC files imports. + +Should a similar journal code already be present in the system, the existing one is used instead of +creating a new one. + +New journals have their name prefixed by the string ``FEC-``. + +.. admonition:: Example + + `ACHATS` -> `FEC-ACHATS` + +The journals are *not* archived, the user is entitled to handle them as he wishes. + +Journal type determination +************************** + +The journal type is also not specified in the format (as per the accounts) and therefore it is +at first created with the default type `general`. + +At the end of the import process, the type is determined as per these rules regarding related +moves and accounts: + +- | `bank`: Moves in these journals always have a line (debit or credit) impacting a + liquidity account. + | `cash` / `bank` can be interchanged, so `bank` is set everywhere when this condition is met. +- | `sale`: Moves in these journals mostly have debit lines on receivable accounts and + credit lines on tax income accounts. + | Sale refund journal items are debit/credit inverted. +- | `purchase`: Moves in these journals mostly have credit lines on payable accounts and + debit lines on expense accounts. + | Purchase refund journal items are debit/credit inverted. +- | `general`: for everything else. + +.. note:: + + - A minimum of three moves is necessary for journal type identification. + - A threshold of 70% of moves must correspond to a criteria for a journal type to be determined. + +.. admonition:: Example + + Suppose we are analyzing the moves that share a certain `journal_id` + + +------------------------------------------------------------+-------+------------+ + | Moves | Count | Percentage | + +============================================================+=======+============+ + | that have a sale account line and no purchase account line | 0 | 0 | + +------------------------------------------------------------+-------+------------+ + | that have a purchase account line and no sale account line | 1 | 25% | + +------------------------------------------------------------+-------+------------+ + | that have a liquidity account line | 3 | **75%** | + +------------------------------------------------------------+-------+------------+ + | **Total** | 4 | 100% | + +------------------------------------------------------------+-------+------------+ + + The journal `type` would be `bank`, because the bank moves percentage (75%) + exceeds the threshold (70%). + +Partners +******** + +Each partner keeps its `Reference` from the field `CompAuxNum`. + +.. note:: + + These fields are searchable, in line with former FEC imports on the accounting expert's side for + fiscal/audit purposes. .. tip:: - If you do not see the submenu **FEC**, go in **Apps** and search for the module - called **France-FEC** and verify if it is well installed. + + Users can merge partners with the Data Cleaning App, where Vendors and Customers or similar + partner entries may be merged by the user, with assistance from the system that groups them by + similar entries. + +Moves +***** + +Entries are immediately posted and reconciled after submission, using the `EcritureLet` field to +do the matching between the entries themselves. + +The `EcritureNum` field represents the name of the moves. We noticed that sometimes it may not be +filled out. In this case, the field `PieceRef` is used. + +Rounding issues +*************** + +There is a rounding tolerance with a currency-related precision on debit and credit (i.e., 0.01 for +EUR). Under this tolerance, a new line is added to the move, named *Import rounding difference*, +targeting the accounts: + +- `658000` Charges diverses de gestion courante, for added debits +- `758000` Produits divers de gestion courante, for added credits + +Missing move name +***************** + +Should the `EcritureNum` not be filled out, it may also happen that the `PieceRef` field is also +not suited to determine the move name (it may be used as an accounting move line reference) leaving +no way to actually find which lines are to be grouped in a single move, and effectively impeding the +creation of balanced moves. + +One last attempt is made, grouping all lines from the same journal and date (`JournalLib`, +`EcritureDate`). Should this grouping generate balanced moves (sum(credit) - sum(debit) = 0), then +each different combination of journal and date creates a new move. + +.. admonition:: Example + + `ACH` + `2021/05/01` --> new move on journal `ACH` with name `20210501`. + +Should this attempt fail, the user is prompted an error message with all the move lines that are +supposedly unbalanced. + +Partner information +******************* + +If a line has the partner information specified, the information is copied to the accounting move +itself if the targeted Journal is of type *payable* or *receivable*. + +Export +------ + +If you have installed the French :doc:`fiscal localization +<../overview/fiscal_localization_packages>`, you should be able to download the FEC. To do so, go to +:menuselection:`Accounting --> Reporting --> France --> FEC`. + +.. tip:: + + If you do not see the submenu **FEC**, go to :menuselection:`Apps`, remove the *Apps* filter, + then search for the module named **France-FEC** and make sure it is installed. + +.. seealso:: + + - `Official Technical Specification (fr) + `_ + - `Test-Compta-Demat (Official FEC Testing tool) + `_ French Accounting Reports ========================= -If you have installed the French Accounting, you will have access to some accounting reports specific to France: +If you have installed the French Accounting, you will have access to some accounting reports +specific to France: - Bilan comptable - Compte de résultats -- Plan de Taxes France +- Plan de Taxes France Get the VAT anti-fraud certification with Odoo ============================================== -As of January 1st 2018, a new anti-fraud legislation comes into effect -in France and DOM-TOM. This new legislation stipulates certain criteria -concerning the inalterability, security, storage and archiving of sales data. -These legal requirements are implemented in Odoo, version 9 onward, +As of January 1st 2018, a new anti-fraud legislation comes into effect +in France and DOM-TOM. This new legislation stipulates certain criteria +concerning the inalterability, security, storage and archiving of sales data. +These legal requirements are implemented in Odoo, version 9 onward, through a module and a certificate of conformity to download. -Is my company required to use an anti-fraud software? ------------------------------------------------------ +Is my company required to use anti-fraud software? +-------------------------------------------------- -Your company is required to use an anti-fraud cash register software like +Your company is required to use an anti-fraud cash register software like Odoo (CGI art. 286, I. 3° bis) if: -* You are taxable (not VAT exempt) in France or any DOM-TOM, -* Some of your customers are private individuals (B2C). +- You are taxable (not VAT exempt) in France or any DOM-TOM, +- Some of your customers are private individuals (B2C). -This rule applies to any company size. Auto-entrepreneurs are exempted from +This rule applies to any company size. Auto-entrepreneurs are exempted from VAT and therefore are not affected. Get certified with Odoo @@ -47,135 +367,143 @@ Get certified with Odoo Getting compliant with Odoo is very easy. -Your company is requested by the tax administration to deliver a certificate -of conformity testifying that your software complies with the anti-fraud -legislation. This certificate is granted by Odoo SA to Odoo Enterprise users +Your company is requested by the tax administration to deliver a certificate +of conformity testifying that your software complies with the anti-fraud +legislation. This certificate is granted by Odoo SA to Odoo Enterprise users `here `_. If you use Odoo Community, you should :doc:`upgrade to Odoo Enterprise ` or contact your Odoo service provider. In case of non-conformity, your company risks a fine of €7,500. -To get the certification just follow the following steps: +To get the certification, just follow the following steps: -* If you use **Odoo Point of Sale**, :ref:`install ` the **France - VAT Anti-Fraud +- If you use **Odoo Point of Sale**, :ref:`install ` the **France - VAT Anti-Fraud Certification for Point of Sale (CGI 286 I-3 bis)** module by going to :menuselection:`Apps`, removing the *Apps* filter, then searching for *l10n_fr_pos_cert*, and installing the module. -* Make sure a country is set on your company, otherwise your entries won’t be +- Make sure a country is set on your company, otherwise your entries won’t be encrypted for the inalterability check. To edit your company’s data, go to :menuselection:`Settings --> Users & Companies --> Companies`. Select a country from the list; Do not create a new country. -* Download the mandatory certificate of conformity delivered by Odoo SA `here `__. +- Download the mandatory certificate of conformity delivered by Odoo SA `here `__. .. note:: - * To install the module in any system created before - December 18th 2017, you should update the modules list. - To do so, activate the :ref:`developer mode `. - Then go to the *Apps* menu and press *Update Modules List* in the top-menu. - * In case you run Odoo on-premise, you need to update your installation - and restart your server beforehand. - * If you have installed the initial version of the anti-fraud module - (prior to December 18th 2017), you need to update it. - The module's name was *France - Accounting - Certified CGI 286 I-3 bis*. - After an update of the modules list, search for - the updated module in *Apps*, select it and click *Upgrade*. - Finally, make sure the following module *l10n_fr_sale_closing* - is installed. + + - To install the module in any system created before + December 18th 2017, you should update the modules list. + To do so, activate the :ref:`developer mode `. + Then go to the *Apps* menu and press *Update Modules List* in the top-menu. + - In case you run Odoo on-premise, you need to update your installation + and restart your server beforehand. + - If you have installed the initial version of the anti-fraud module + (prior to December 18th 2017), you need to update it. + The module's name was *France - Accounting - Certified CGI 286 I-3 bis*. + After an update of the modules list, search for + the updated module in *Apps*, select it and click *Upgrade*. + Finally, make sure the following module *l10n_fr_sale_closing* + is installed. Anti-fraud features ------------------- The anti-fraud module introduces the following features: -* **Inalterability**: deactivation of all the ways to cancel or modify +- **Inalterability**: deactivation of all the ways to cancel or modify key data of POS orders, invoices and journal entries; -* **Security**: chaining algorithm to verify the inalterability; -* **Storage**: automatic sales closings with computation of both period +- **Security**: chaining algorithm to verify the inalterability; +- **Storage**: automatic sales closings with computation of both period and cumulative totals (daily, monthly, annually). Inalterability ~~~~~~~~~~~~~~ -All the possible ways to cancel and modify key data of paid POS orders, -confirmed invoices and journal entries are deactivated, -if the company is located in France or in any DOM-TOM. +All the possible ways to cancel and modify key data of paid POS orders, +confirmed invoices and journal entries are deactivated, +if the company is located in France or in any DOM-TOM. -.. note:: If you run a multi-companies environment, only the documents of - such companies are impacted. +.. note:: + + If you run a multi-companies environment, only the documents of such companies are impacted. Security ~~~~~~~~ -To ensure the inalterability, every order or journal entry is encrypted -upon validation. -This number (or hash) is calculated from the key data of the document as +To ensure inalterability, every order or journal entry is encrypted +upon validation. +This number (or hash) is calculated from the key data of the document as well as from the hash of the precedent documents. -The module introduces an interface to test the data inalterability. -If any information is modified on a document after its validation, -the test will fail. The algorithm recomputes all the hashes and compares them -against the initial ones. In case of failure, the system points out the first +The module introduces an interface to test the data inalterability. +If any information is modified on a document after its validation, +the test will fail. The algorithm recomputes all the hashes and compares them +against the initial ones. In case of failure, the system points out the first corrupted document recorded in the system. -Users with *Manager* access rights can launch the inalterability check. -For POS orders, go to -:menuselection:`Point of Sales --> Reporting --> French Statements`. -For invoices or journal entries, +Users with *Manager* access rights can launch the inalterability check. +For POS orders, go to +:menuselection:`Point of Sales --> Reporting --> French Statements`. +For invoices or journal entries, go to :menuselection:`Invoicing/Accounting --> Reporting --> French Statements`. Storage ~~~~~~~ -The system also processes automatic sales closings on a daily, monthly +The system also processes automatic sales closings on a daily, monthly and annual basis. -Such closings distinctly compute the sales total of the period as well as -the cumulative grand totals from the very first sales entry recorded +Such closings distinctly compute the sales total of the period as well as +the cumulative grand totals from the very first sales entry recorded in the system. -Closings can be found in the *French Statements* menu of Point of Sale, +Closings can be found in the *French Statements* menu of Point of Sale, Invoicing and Accounting apps. .. note:: - * Closings compute the totals for journal entries of sales journals (Journal Type = Sales). - * For multi-companies environments, such closings are performed by company. + - Closings compute the totals for journal entries of sales journals (Journal Type = Sales). - * POS orders are posted as journal entries at the closing of the POS session. - Closing a POS session can be done anytime. - To prompt users to do it on a daily basis, the module prevents from resuming - a session opened more than 24 hours ago. - Such a session must be closed before selling again. + - For multi-companies environments, such closings are performed by company. - * A period’s total is computed from all the journal entries posted after the - previous closing of the same type, regardless of their posting date. - If you record a new sales transaction for a period already closed, - it will be counted in the very next closing. + - POS orders are posted as journal entries at the closing of the POS session. + Closing a POS session can be done anytime. + To prompt users to do it on a daily basis, the module prevents from resuming + a session opened more than 24 hours ago. + Such a session must be closed before selling again. -.. tip:: For test & audit purposes such closings can be manually generated in the - :ref:`developer mode `. Then go to :menuselection:`Settings --> - Technical --> Automation --> Scheduled Actions`. + - A period’s total is computed from all the journal entries posted after the + previous closing of the same type, regardless of their posting date. + If you record a new sales transaction for a period already closed, + it will be counted in the very next closing. +.. tip:: + + - For test & audit purposes such closings can be manually generated in the + :ref:`developer mode `. + - Then go to :menuselection:`Settings --> Technical --> Automation --> Scheduled Actions`. Responsibilities ---------------- -Do not uninstall the module! If you do so, the hashes will be reset and none +Do not uninstall the module! If you do so, the hashes will be reset and none of your past data will be longer guaranteed as being inalterable. -Users remain responsible for their Odoo instance and must use it with -due diligence. It is not permitted to modify the source code which guarantees +Users remain responsible for their Odoo instance and must use it with +due diligence. It is not permitted to modify the source code which guarantees the inalterability of data. - -Odoo absolves itself of all and any responsibility in case of changes -in the module’s functions caused by 3rd party applications not certified by Odoo. +Odoo absolves itself of all and any responsibility in case of changes +in the module’s functions caused by 3rd party applications not certified by Odoo. More Information ---------------- -You will find more information about this legislation in the official documents: +You can find more information about this legislation in the following official documents. -* `Frequently Asked Questions `_ -* `Official Statement `_ -* `Item 88 of Finance Law 2016 `_ +.. seealso:: + + - `Frequently Asked Questions + `_ + - `Official Statement + `_ + - `Item 88 of Finance Law 2016 + `_