E-Reporting
The E-Reporting screen is the operational entry point for the e-reporting workflow of NomaUBL — the declaration track of the French Réforme de la Facturation Électronique (RFE). Where E-Invoicing sends a structured invoice to the recipient's Plateforme Agréée, E-Reporting sends an aggregated declaration to the tax authority through the same PA — covering the transactions that fall outside the e-invoicing flow:
- B2C transactions — sales to private individuals.
- Intra-EU B2B transactions — sales to a buyer in another EU member state.
- Export and other out-of-scope transactions — sales to non-EU buyers, intra-group internal flows, etc.
For these transactions the buyer never receives a structured invoice via the PA; the seller still declares the turnover so the tax authority can compute the VAT obligation. NomaUBL groups the relevant transactions, builds the corresponding XML, submits it to the PA and tracks its lifecycle.
The page applies regardless of source system — JD Edwards, SAP, NetSuite or a custom ERP.
Where e-reporting fits
E-reporting is the declaration-only track of the French reform — the e-invoicing flow handles the structured B2B invoice, while e-reporting covers everything that does not go through that flow but still needs to be reported for VAT.
The BAR routing rule defined in UBL Defaults → Document Type / BAR Routing drives the split — set it correctly upstream and the right transactions land in the right flux automatically.
Two flux, four document types
The French e-reporting specification defines two flux for outgoing declarations and four document types that describe whether a report is an initial submission or a correction.
| Flux | Scope | Content shape |
|---|---|---|
10.1 | B2BINT invoice detail | One <Invoice> element per international B2B invoice in the period — ID, issue date, type code, currency, Seller (declarer), Buyer (counterparty), monetary totals, and one <TaxSubTotal> per VAT rate. B2C invoices are never emitted here, in line with the routing rule of the specification. |
10.3 | B2C / OUTOFSCOPE aggregated | One <Transactions> block per (category code, currency), with nested <TaxSubTotal> entries per rate carrying the taxable base (in source currency) and the VAT amount (always in EUR). |
| Code | Meaning | Typical use |
|---|---|---|
IN | Initial | First declaration for the period — the default. |
RE | Replacement | Replaces a previously submitted report for the same period after a correction. |
CO | Cancellation | Cancels a previously submitted report (e.g. submitted by mistake). |
MO | Modification | Adjusts specific lines of a previous report without full replacement. |
Reports follow a configurable frequency — MONTHLY (calendar month, default), DECADAL (1-10, 11-20, 21-end of month) or WEEKLY (ISO Monday → Sunday) — defined in the e-reporting template of config.json.
Transaction category codes (flux 10.3)
The <Transactions> block in flux 10.3 carries a <CategoryCode> (TT-81) that classifies the underlying operation against the four codes accepted by the specification:
| Code | Meaning | Typical use |
|---|---|---|
TLB1 | Taxable goods deliveries | Standard sales of goods subject to French VAT. |
TPS1 | Taxable services | Service supplies subject to French VAT. |
TNT1 | Non-taxable | Operations outside the scope of French VAT — intra-EU distance sales, services covered by Article 259 B CGI, exports. |
TMA1 | Margin regime | Operations under the VAT-on-margin regime (Articles 266 e, 268, 297 A CGI). |
NomaUBL derives the category from the underlying invoice line. When a source line carries a value outside the accepted set, the platform falls back automatically to TLB1 (positive rate) or TNT1 (zero rate).
Every <TaxAmount> and <TaxTotal> element produced by NomaUBL is forced to euros, regardless of the source invoice's currency. The <TaxableAmount> keeps the source invoice's original currency so the underlying operation amount stays auditable.
Lifecycle statuses
E-reporting reports go through a dedicated lifecycle distinct from the invoice statuses. NomaUBL writes one of these eight codes on each transition between generation and PA acknowledgement (or rejection):
| Code | Tag | Meaning |
|---|---|---|
9950 | EREPORT_CREATED | Report XML built and persisted; no submission attempt yet. |
9951 | EREPORT_SUBMIT_SKIPPED | Report generated; submission to the PA disabled (sendToPA=N on the e-reporting template). The XML is available for download but never reaches the PA. |
9952 | EREPORT_SENT_TO_PA | Report submitted to the PA over HTTP; awaiting initial acknowledgement. |
9953 | EREPORT_PENDING | PA has acknowledged receipt and is processing the report. |
9954 | EREPORT_ERROR_SENT | Submission to the PA failed at the network or HTTP level — typically transient. Resend can recover. |
9955 | EREPORT_DEPOSITED | PA accepted and registered the report — terminal success. |
9956 | EREPORT_FAILED_IMPORT | PA could not import the report (post-acknowledgement processing error). |
9957 | EREPORT_REJECTED | PA rejected the report on a validation rule — terminal failure. The next attempt requires a corrected RE. |
Codes 9950 – 9954 are transient (the report is still moving). 9955 – 9957 are terminal (no further automatic transition); a RE (replacement) report is the only way to override a 9957 for the same period.
At a glance
Toolbar
The toolbar above the table combines three free-text filters with two quick actions.
| Field | What it matches |
|---|---|
| Company | The company code (Kco) the report is bound to (e.g. 00070). |
| Flux | The flux code — 10.1 (B2BINT invoice detail) or 10.3 (B2C / OUTOFSCOPE aggregated). |
| Status | Free-text match on the lifecycle status code or label. |
| Refresh | Re-runs the current query without changing filters. |
| Generate report | Opens the Generate dialog — described below. Hidden on read-only sessions. |
Advanced Filters (2026.05.10)
A collapsible Advanced Filters panel below the toolbar exposes one row per filterable column from the active List Views spec (view.ereporting) — with per-column operator pickers (contains, equals, ≠, <, ≤, >, ≥, between, empty, not empty). Edits stay in draft until Run commits them.
Since 2026.05.12 the page runs in hybrid client-side mode — one capped server slice per Run (spec.maxRows, default 5000), then TanStack handles filter / sort / paginate inside the slice. An X / Y rows notice next to Run signals when the cap is hit. Since 2026.05.13, the status refList column gets a multi-select picker that issues an IN (?,?,?) clause on the server so picking several status codes returns the union.
Reports list
The table shows one row per report. Default sort: most recent RGDOC first. Click any column header to sort by that column; click any row to open the Detail modal.
Since 2026.05.10 the table renders through DataTableV2 in spec-driven mode: the column shape comes from the view.ereporting spec on db-nomaubl and the bundled default ships every column listed below. Adding columns from the catalog or trimming the filter allow-list is done from the List Views editor.
Default columns
| Column | Description |
|---|---|
| ID | Internal report identifier (RGDOC). Auto-incremented. |
| Flux | 10.1 (B2C detail) or 10.3 (B2BINT aggregated). |
| Company | Company code (Kco) the report applies to. |
| Type | Document type — IN / RE / CO / MO. |
| Period | Declaration period — start → end (ISO 8601). |
| Invoices | Number of source invoices included in the report. |
| Status | Lifecycle status badge — code + label, coloured by family. |
| PA UUID | Universally-unique identifier returned by the PA after acceptance. Truncated to 8…8; full value visible on hover. |
| Created | Generation timestamp. |
A page-size selector at the bottom defaults to 50 rows per page; values up to 500 are accepted. The total count of matching reports is shown next to the pagination controls.
CSV export
The standard Export button in the toolbar exports the current view (filters applied) as a CSV file named ereporting.csv.
Detail modal
Clicking a row opens a modal with three tabs along the top: Header, Invoices, History. The modal title shows the report's Flux / Kco / Rgdoc triplet.
Header tab (default)
Field grid summarising the report identity and submission outcome.
| Field | Description |
|---|---|
| RGDOC | Internal report identifier. |
| FLUX | 10.1 or 10.3. |
| KCO | Company code. |
| Type | IN / RE / CO / MO. |
| Period start / Period end | ISO 8601 dates of the declaration window. |
| Sender | Transmitter matricule, list ID 0238 — typically the entity registered with the PA. |
| Issuer | Legal issuer's identifier, list ID 0002 (SIREN). |
| PA UUID | Identifier returned by the PA on acceptance. Empty until the report has been accepted. |
| Status | Current lifecycle status — code + label. |
| Status message | Last message received from the PA — typically the rejection reason for failed submissions. |
| Invoices | Number of source invoices included in the report. |
| Created | Generation timestamp. |
Invoices tab
Tabular view of every source invoice included in the report. The columns map directly to the underlying e-invoicing record so the report and its sources can be cross-referenced.
| Column | Description |
|---|---|
| Number | Invoice number — UBL BT-1 when set, otherwise DOC/DCT/KCO. |
| Date | Issue date (BT-2). |
| BAR | BAR routing code carried by the invoice (B2C, B2BINT, OUTOFSCOPE, …). |
| Customer | Buyer party name. |
| HT | Total amount excluding VAT. |
| VAT | Total VAT amount. |
| TTC | Total amount including VAT. |
| CCY | ISO 4217 currency code. |
The list reflects the rows persisted at generation time — re-running a report (RE) does not retroactively reshape the prior IN view.
History tab
The lifecycle of the report — every status it has been in, append-only, in submission order.
| Column | Description |
|---|---|
| # | Sequence number — 1 is the initial state at generation, subsequent rows are events from the PA. |
| Status | Status code + label drawn from the e-reporting catalogue (e.g. 9950 Created, 9952 Sent to PA, 9953 Pending, 9955 Deposited, 9957 Rejected). See Lifecycle statuses above. |
| Message | Free-text message returned by the PA — typically the rejection reason or acceptance note. |
| Date | Event timestamp. |
The lifecycle is read-only here; the only action is Resend to PA at the modal header, which appends a new event after a successful resubmission.
Header actions
| Button | Behaviour |
|---|---|
| Download XML | Downloads the formatted XML of the report (filename pattern ereporting-<flux>-<kco>-<rgdoc>.xml). The XML is pretty-printed when possible, with a fallback to the raw stored content. |
| Resend to PA | Re-submits the existing report XML to the Plateforme Agréée. Useful after a transient PA error. Hidden on read-only sessions. The lifecycle is updated with the new submission outcome. |
| Close (✕) | Closes the modal without modification. |
Generate dialog
Opens from Generate report in the toolbar. Builds and submits one or several reports for a chosen company / flux / period combination.
| Field | Description |
|---|---|
| Company (kco) | Restricts the generation to a single company. Leave blank to apply to all companies declared in the e-reporting template. |
| Flux to generate | Multi-select between 10.1 and 10.3. Both are selected by default — the generator emits one report per active flux. |
| Document type | One of IN (initial), RE (replacement), CO (cancellation), MO (modification). The default is IN. |
| Period start / end | ISO 8601 dates that delimit the declaration window. |
| Compute period | Auto-fills Period start / Period end with the next due window using the configured frequency (MONTHLY / DECADAL / WEEKLY). |
| Cancel | Closes the dialog without generating. |
| Generate | Builds the XML for each selected flux, persists the report row, and submits to the PA. The list refreshes on success. |
When the generator builds a report, it derives the per-invoice Sender, Issuer and Business Process blocks (TT-7 / TT-12 / TT-28 / TT-29) from the e-reporting template — those defaults are configured once in Settings → System → E-Reporting (Sender / PA matricule + role WK, Issuer / SIREN scheme 0002 for French companies, Business Process emitted only on B2BINT invoices). When no transmission ID is provided manually, the report is identified as {siren}-{flux}-{start}-{end} so it stays stable across regenerations of the same period and lets the PA deduplicate identical retransmissions.
After a successful run, the new reports appear at the top of the list with a 9950 (Created) status that quickly progresses through 9952 (Sent to PA) and 9953 (Pending), then lands on 9955 (Deposited) once the PA acknowledges receipt. When the Send to PA flag is off (sendToPA=N), the report stays at 9951 (Submit skipped) and the XML can still be downloaded for offline review.
Tips & best practices
- Set the BAR routing first. The list of invoices that ends up in flux 10.1 / 10.3 is driven by UBL Defaults → Document Type / BAR Routing.
B2BINTfeeds flux 10.1 (per-invoice detail);B2CandOUTOFSCOPEfeed flux 10.3 (aggregated). A misclassified invoice will be missed by both tracks — ensure every document type maps to one ofB2B,B2G,B2C,B2BINT,OUTOFSCOPEbefore the first run. - Use Compute period rather than manual dates. It honours the frequency configured in the e-reporting template, so the suggested window matches the regulatory deadline (previous full month for
MONTHLY, previous decade forDECADAL, previous ISO week forWEEKLY). INfirst, thenREfor corrections. A late-arriving invoice or a corrected amount calls for aREreport covering the same period — never re-issue anINfor a period that has already been declared.- Reserve
COfor full cancellation. Use it when an entire period has been declared in error; theREtrack handles partial corrections. - The PA UUID is the receipt. It is empty between submission and acceptance (statuses
9952and9953), and final once the PA acknowledges with9955(Deposited). Use it as the legal proof of the declaration when responding to an audit. - Resend after a transient PA error, not after a Schematron rejection. A
9954(Error sent) is a network or HTTP failure — Resend recovers. A9957(Rejected) carries a Schematron or business-rule reason in the Status message — fix the upstream BAR or invoice data and generate a freshRE, do not blindly resend. A9956(Failed import) sits between the two: read the message before deciding to resend or rebuild. - The Invoices tab is a snapshot. It records the source invoices as they were at generation time. Edits to those invoices afterwards do not retroactively alter the submitted report — they appear in the next
REif material. - VAT data is read from the UBL document first. When generating a report, NomaUBL parses the document-level
cac:TaxTotal/cac:TaxSubtotalof each invoice's stored UBL XML — line-level subtotals are skipped to avoid double-counting. The VAT-summary table is consulted only as a fallback. If a B2C report ships with empty<Transactions>blocks even though the invoices and their UBL documents are present, the VAT summary is most likely stale relative to the UBL — regenerating from the UBL closes the gap. - Configure the Sender / Issuer / Business Process defaults once. Settings → System → E-Reporting groups the PA matricule (Sender, default role
WK), the issuer SIREN (Issuer, default scheme0002for French companies;0223/0227/0228/0229for international cases) and the per-invoice business process (emitted only in B2BINT). Maintaining them at the template level keeps every generated report consistent and avoids per-report overrides. - Out-of-list category codes are auto-mapped. A source line carrying a tax category outside
TLB1/TPS1/TNT1/TMA1is silently coerced toTLB1(positive rate) orTNT1(zero rate) at generation time. Set the category explicitly on the source line whenever the default is wrong (e.g. a service that should land onTPS1rather thanTLB1).