TIP: You can type at any time to perform a new search.
France - E-Invoicing (Approved Platform)
l10n_fr_pdp · odoo/odoo
Security findings
- Repository
- odoo/odoo · module folder
- Module version
- 0.1.0
- Category
- Accounting/Localizations/EDI
- Folder size
- 0.82 MB
- License
- LGPL-3
- Application
- No
- Auto-installable
- Yes
- Website
- https://www.odoo.com/documentation/latest/applications/finance/fiscal_localizations/france.html#PDP
- Last tracking update
- 2026-10-05 00:19:46
- Authors
- Odoo S.A.
- Maintainers
- Odoo S.A.
- Committers
- Xavier Morel, Raphael Collet, Odoo Translation Bot, Christophe Matthieu, Andrea Grazioso (agr-odoo), Anh Thao Pham (pta), Miquel Raïch, Florian Gilbert, Pierrot (prro), jbw-odoo, Gauthier Wala (gawa), Dylan Kiss (dyki), Antoine Boonen, Sven Fuehr, Louis Gobert, hatr-odoo, Claire (clbr), Léo Gizard, roto-odoo, Anton Romanova (roan), Corentin Heinix (cohe), Krzysztof Magusiak (krma), Guillaume V, Tyler Landivar (tylan), bhra-odoo, Jugurtha, igbe, times-odoo, Jeanne Delneste, Julien Launois (jula), Martin Doyen, Ayush Modi, Victor Decleire, Jeremy Lawson (jelaw), pkri-odoo, Jérémy Bazin (baje), Maximilien, Kyrillos, Adham Abdeltawab
- Odoo dependencies
- Python dependencies
- phonenumbers
- System dependencies
- None
- Required by
- l10n_fr_pdp_pos
- Description
- Support for the mandatory electronic invoicing in France - Send and receive documents via the Odoo approved platform
Code Analysis
Views touched (25)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
account_peppol_response_view_form |
account.peppol.response.view.form.l10n.fr.pdp | account.peppol.response | form | Inherits account_peppol.account_peppol_response_view_form |
account_peppol_response_view_list |
account.peppol.response.view.list.l10n.fr.pdp | account.peppol.response | list | Inherits account_peppol.account_peppol_response_view_list |
l10n_fr_pdp_list_view_move_ereporting |
account.move.list.l10n.fr.pdp.move.ereporting | account.move | list | New |
l10n_fr_pdp_reports_view_flow_form |
l10n.fr.pdp.reports.flow.form.reporting | l10n.fr.pdp.reports.flow | form | New |
l10n_fr_pdp_reports_view_flow_list |
l10n.fr.pdp.reports.flow.list.reporting | l10n.fr.pdp.reports.flow | list | New |
l10n_fr_pdp_reports_view_flow_search |
l10n.fr.pdp.reports.flow.search.reporting | l10n.fr.pdp.reports.flow | search | New |
l10n_fr_pdp_reports_view_in_invoice_tree |
account.move.in.invoice.tree.l10n.fr.pdp.status | account.move | tree | Inherits account.view_in_invoice_tree |
l10n_fr_pdp_reports_view_move_form |
account.move.form.l10n.fr.pdp.status | account.move | form | Inherits account.view_move_form |
l10n_fr_pdp_reports_view_move_kanban |
account.move.kanban.l10n.fr.pdp.status | account.move | kanban | Inherits account.view_account_move_kanban |
l10n_fr_pdp_reports_view_move_search |
account.move.search.l10n.fr.pdp.status | account.move | search | Inherits account.view_account_invoice_filter |
l10n_fr_pdp_reports_view_out_credit_note_tree |
account.move.refund.tree.l10n.fr.pdp.flow10.status | account.move | tree | Inherits account.view_out_credit_note_tree |
l10n_fr_pdp_reports_view_out_invoice_tree |
account.move.tree.l10n.fr.pdp.status | account.move | tree | Inherits account.view_out_invoice_tree |
l10n_fr_pdp_view_account_invoice_filter |
account.invoice.select.inherit | account.move | Inherits account_peppol.account_peppol_view_account_invoice_filter | |
l10n_fr_pdp_view_in_bill_tree_inherit |
account.move.tree.inherit | account.move | tree | Inherits account.view_in_invoice_bill_tree |
l10n_fr_pdp_view_in_invoice_refund_tree_inherit |
account.move.list.inherit | account.move | list | Inherits account.view_in_invoice_refund_tree |
l10n_fr_pdp_view_move_form |
l10n.fr.pdp.view.move.form | account.move | form | Inherits account_peppol.account_peppol_view_move_form |
l10n_fr_pdp_view_out_credit_note_tree |
account.move.refund.tree.l10n.fr.pdp.status | account.move | tree | Inherits account_peppol.account_peppol_view_out_credit_note_tree_inherit |
l10n_fr_pdp_view_out_invoice_tree |
account.move.tree.l10n.fr.pdp.status | account.move | tree | Inherits account_peppol.account_peppol_view_out_invoice_tree_inherit |
l10n_fr_pdp_view_send_wizard_form |
l10n.fr.pdp.reports.send.wizard.form.reporting | l10n.fr.pdp.reports.send.wizard | form | New |
pdp_registration_form |
pdp.registration.form | pdp.registration | form | New |
pdp_response_wizard_form |
pdp.response.wizard.form | pdp.response.wizard | form | New |
res_config_settings_view_form |
res.config.settings.view.form.inherit.proxy.user | res.config.settings | form | Inherits account_peppol.res_config_settings_view_form |
res_partner_form_l10n_fr_pdp |
res.partner.form.l10n.fr.pdp | res.partner | form | Inherits account_peppol.res_partner_form_account_peppol |
view_l10n_fr_pdp_annuaire_line_tree |
l10n_fr_pdp.annuaire.line.tree | l10n_fr_pdp.annuaire.line | list | New |
view_l10n_fr_pdp_partner_lookup_form |
l10n_fr_pdp.partner.lookup.form | l10n_fr_pdp.partner.lookup | form | New |
HTTP endpoints (2)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/api/signaturit_authentication_status/1/webhooks |
IapAuthenticationWebhook.notify_authentication_status |
public | http | POST | csrf off sudo |
/peppol/webhook/new-regulatory-message |
PdpWebhookController.webhook_regulatory_message |
public | http | POST | csrf off sudo |
Models touched (23)
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (0)
No new fields.
Public methods (1)-
button_fetch_in_einvoices(self)Extend to also fetch regulatory messages (exchanged with the PPF). This also includes outgoing messages sent by the user (i.e. to update the status in case of a sending error).
New fields (15)
-
l10n_fr_pdp_display_infoBooleanrelated='company_id.l10n_fr_f10_enable_reporting' -
l10n_fr_pdp_error_messageTextcompute='_compute_l10n_fr_pdp_error_message'string='Flow 10 blocking errors' -
l10n_fr_pdp_flow_10_operation_typeSelectioncompute='_compute_l10n_fr_pdp_flow_10_operation_type'copy=Falseselection=[('sale', 'Sale'), ('purchase', 'Purchase')]store=True -
l10n_fr_pdp_flow_10_report_typeSelectioncompute='_compute_l10n_fr_pdp_flow_10_report_type'copy=Falserecursive=Trueselection=[('transaction', 'Transaction'), ('payment', 'Payment')]store=True -
l10n_fr_pdp_has_errorBooleancompute='_compute_l10n_fr_pdp_has_error'copy=Falsereadonly=Truestore=True -
l10n_fr_pdp_last_flow_idMany2one → l10n.fr.pdp.reports.flowcomodel_name='l10n.fr.pdp.reports.flow'compute='_compute_l10n_fr_pdp_last_flow_id'copy=Falsestore=Truestring='Last PDP Flow'tracking=True -
l10n_fr_pdp_sent_in_flow_idsMany2many → l10n.fr.pdp.reports.flowcolumn1='move_id'column2='flow_id'comodel_name='l10n.fr.pdp.reports.flow'copy=Falserelation='sent_account_move__pdp_flow'string='Sent in PDP Flows' -
l10n_fr_pdp_statusSelectioncompute='_compute_l10n_fr_pdp_status'copy=Falseselection=<expr>store=Truestring='E-Reporting Status'tracking=True -
pdp_can_send_responseBooleancompute='_compute_pdp_can_send_response' -
pdp_is_sentBooleancompute='_compute_pdp_is_sent' -
pdp_lifecycle_residualMonetarycompute='_compute_pdp_lifecycle_residual'copy=Falsehelp='Technical field indicating the amount of collected money we have still to report to the PPF via a lifecycle.'store=Truestring='Lifecycle Residual' -
pdp_ppf_lifecycle_stateSelectioncompute='_compute_pdp_ppf_state'copy=Falseselection=[('in_progress', 'In Progress'), ('sent', 'Sent'), ('done', 'Done'), ('error', 'Error')]store=Truestring='PPF Lifeycle Status' -
pdp_ppf_move_stateSelectioncompute='_compute_pdp_ppf_state'copy=Falseselection=[('in_progress', 'In Progress'), ('sent', 'Sent'), ('done', 'Done'), ('error', 'Error')]store=Truestring='PPF Invoice Status' -
pdp_uses_pdpBooleancompute='_compute_pdp_uses_pdp' -
peppol_move_stateSelectionselection_add=[('PD', 'With Payments'), *<expr>]string='E-Invoicing Status'
-
action_pdp_open_response_wizard(self, **wizard_kwargs) -
button_cancel(self) -
button_draft(self) -
fields_get(self, allfields=None, attributes=None)@api.model
New fields (0)
No new fields.
Public methods (1)-
action_what_is_peppol_activate(self, moves)
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (8)
-
pdp_flow_numberSelectionselection=[('1', 'Tax Extract'), ('2', 'Status'), ('6', 'Mandatory Status'), ('10', 'Report')]string='Flow Number' -
pdp_issue_dateDatetimestring='Issue Date' -
pdp_payment_infoJsonstring='Payment Info' -
pdp_ppf_stateSelectioncompute='_compute_pdp_ppf_state'selection=[('sent', 'Sent'), ('received', 'received'), ('error', 'Error')]store=Truestring='PPF Status' -
pdp_ref_response_codeSelectionselection=<expr>string='Original Response Code' -
pdp_ref_uuidCharargs: 'Referenced UUID' -
pdp_status_infoTextstring='Status Info' -
response_codeSelectionondelete=<expr>selection_add=<expr>
-
fields_get(self, allfields=None, attributes=None)@api.model
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (1)
-
proxy_typeSelectionondelete={'pdp': 'cascade'}selection_add=[('pdp', 'Approved Platform')]
No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (22)
-
company_idMany2one → res.companycomodel_name='res.company'default=<expr>required=Truestring='Company' -
due_period_endDaterequired=True -
due_period_startDaterequired=True -
error_move_messageTextstring='Invalid Invoice Details' -
error_moves_countIntegercompute='_compute_move_ids' -
initial_flow_idMany2one → l10n.fr.pdp.reports.flowcomodel_name='l10n.fr.pdp.reports.flow' -
move_idsMany2many → account.movecomodel_name='account.move'compute='_compute_move_ids'help='Invoices/Payments reported in this flow.' -
nameChar -
operation_typeSelectiondefault='sale'help='Defines whether the flow reports sales or acquisition transactions.'required=Trueselection=[('sale', 'Sales'), ('purchase', 'Acquisitions')] -
payload_idMany2one → ir.attachmentcompute='_compute_payload_attachment'string='XML Payload' args: 'ir.attachment' -
pdp_flow_idCharreadonly=True -
period_endDaterequired=True -
period_startDaterequired=True -
period_statusSelectioncompute='_compute_period_status'help='Current status of the reporting period: Open (before grace), Grace (can send), Closed (after deadline).'selection=[('open', 'Open'), ('grace', 'Grace'), ('closed', 'Closed')]string='Period Status' -
periodicity_codeChar -
rectificative_flow_idsOne2many → l10n.fr.pdp.reports.flowcomodel_name='l10n.fr.pdp.reports.flow'inverse_name='initial_flow_id' -
report_typeSelectiondefault='transaction'required=Trueselection=[('transaction', 'Transaction'), ('payment', 'Payment')] -
sent_move_idsMany2many → account.movecolumn1='flow_id'column2='move_id'comodel_name='account.move'relation='sent_account_move__pdp_flow' -
stateSelectiondefault='ready'required=Trueselection=<expr>string='Status' -
transmission_typeSelectioncompute='_compute_transmission_type'help='Type of flow transmission.'selection=[('initial', 'Initial'), ('rectificative', 'Rectificative')] -
transport_messageTexthelp='Additional message or error returned by the PDP transport API.' -
transport_statusCharhelp='Raw status returned by the PDP transport API.'
-
action_build_payload_manual(self)Manual trigger for payload building. -
action_open_send_wizard(self)Open send wizard if errors exist, otherwise send directly. -
action_send(self)Send flow payload to transport gateway. -
action_send_from_ui(self)Send flow from UI with error checking. -
action_view_error_moves(self)Open list view of invalid invoices. -
action_view_initial(self) -
action_view_moves(self)Open list view of related invoices.
New fields (2)
-
flow_idMany2one → l10n.fr.pdp.reports.flowcomodel_name='l10n.fr.pdp.reports.flow'default=<expr>ondelete='cascade'required=True -
warningTextdefault=<expr>readonly=True
-
action_send_anyway(self)Send flow excluding invalid invoices. -
action_view_errors(self)Open list of invalid invoices.
New fields (3)
-
identifierChar -
natureChar -
platform_idChar
No public methods.
New fields (3)
-
available_annuaire_line_idsMany2many → l10n_fr_pdp.annuaire.linecomodel_name='l10n_fr_pdp.annuaire.line'string='Available Annuaire Lines' -
partner_idMany2one → res.partnerrequired=True args: 'res.partner' -
selected_line_idMany2one → l10n_fr_pdp.annuaire.linecomodel_name='l10n_fr_pdp.annuaire.line'compute='_compute_selected_line_id'domain="[('id', 'in', available_annuaire_line_ids)]"readonly=Falsestore=Truestring='Selected Line'
-
action_change_pdp_endpoint(self)
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (12)
-
account_peppol_proxy_stateSelectionrelated='company_id.account_peppol_proxy_state' -
auth_url_hashCharreadonly=Falserelated='company_id.pdp_authentication_uuid'string='Company Authentication IAP UUID' -
company_idMany2one → res.companycomodel_name='res.company'default=<expr>required=True -
contact_emailCharreadonly=Falserelated='company_id.account_peppol_contact_email'required=True -
edi_modeSelectioncompute='_compute_edi_mode'readonly=Falseselection=[('demo', 'Demo'), ('test', 'Test'), ('prod', 'Live')]string='EDI mode' -
edi_user_idMany2one → account_edi_proxy_client.usercomodel_name='account_edi_proxy_client.user'compute='_compute_edi_user_id'string='EDI user' -
pdp_authentication_uuidCharreadonly=Falserelated='company_id.pdp_authentication_uuid'store=Truestring='Authentication IAP UUID' -
pdp_identifierCharcompute='_compute_pdp_identifier'help='The identifier starts with the SIREN, the part after the SIREN is optional. The expected format of the identifier is: SIREN, SIREN_SIRET, SIREN_SIRET_CodeRoutage or SIREN_SuffixeAdressage'readonly=Falsestore=True -
pdp_kyc_statusSelectionreadonly=Falserelated='company_id.pdp_kyc_status'string='Authentication status' -
pdp_pilot_phaseBooleanhelp='Participate in the Pilot Phase of the French E-Invoicing. This way you are able to test it before it becomes mandatory.'readonly=Falserelated='company_id.l10n_fr_pdp_pilot_phase'string=' Pilot Phase' -
siren_numberCharcompute='_compute_siren_number'readonly=Falsestore=True -
warningsJsoncompute='_compute_warnings'string='Warnings'
-
button_cancel_authentication(self) -
button_deregister_pdp_participant(self)Deregister the edi user from PDP network -
button_open_authentication_link(self) -
button_refresh_authentication(self) -
button_register_pdp_participant(self) -
button_trigger_authentication(self)@handle_demo -
display_status_notification_from_uuid(self)
New fields (10)
-
available_statusesCharcompute='_compute_available_statuses'help='Technical field to enable dynamic selection of status.' -
currency_idMany2one → res.currencycomodel_name='res.currency'compute='_compute_currency_id'help="The payment's currency."precompute=Truestore=Truestring='Currency' -
fully_paidBooleancompute='_compute_paid_amount'readonly=Falsestore=Truestring='Fully paid' -
move_countIntegercompute='_compute_move_count'store=True -
move_idsMany2many → account.movecomodel_name='account.move'required=True -
noteTextargs: 'Additional note' -
paid_amountMonetarycompute='_compute_paid_amount'currency_field='currency_id'readonly=Falsestore=Truestring='Payment Amount' -
reason_codeSelectionselection=[('TX_TVA_ERR', 'Incorrect VAT rate'), ('MONTANTTOTAL_ERR', 'Incorrect Total Amount'), ('CALCUL_ERR', 'Billing calculation error'), ('NON_CONFORME', 'Legal information missing'), ('DEST_ERR', 'Wrong recipient'), ('TRANSAC_INC', 'Unknown transaction'), ('EMMET_INC', 'Unknown sender'), ('CONTRAT_TERM', 'Contract completed'), ('DOUBLE_FACT', 'Duplicate Invoice'), ('CMD_ERR', 'Order number is incorrect or missing'), ('ADR_ERR', 'Incorrect electronic billing address'), ('REF_CT_ABSENT', 'Contract reference required to process the missing invoice'), ('JUSTIF_ABS', 'Missing or Insufficient Supporting Documentation'), ('COORD_BANC_ERR', 'Bank Account Information Error'), ('SIRET_ERR', 'Incorrect or missing SIRET number'), ('CODE_ROUTAGE_ERR', 'Missing or incorrect CODE_ROUTAGE'), ('REF_ERR', 'Incorrect reference')] -
show_reason_codeBooleancompute='_compute_show_reason_code'help="Technical field to hide / show the 'Reason Code' in the view." -
statusSelectionselection=[('PD', 'Paid'), ('cancelled', 'Cancelled'), ('suspended', 'Suspended'), ('refused', 'Refused'), ('AP', 'Approved'), ('in_hand', 'In Hand'), ('completed', 'Completed')]
-
button_send(self) -
fields_get(self, allfields=None, attributes=None)@api.model
New fields (10)
-
l10n_fr_f10_enable_reportingBooleancompute='_compute_l10n_fr_f10_enable_reporting'groups='base.group_user'readonly=Truestore=Truestring='Enable Flux 10 Reporting' -
l10n_fr_pdp_annuaire_start_dateDategroups='base.group_user'help='The date on which the company is registered on the annuaire for the French e-invoicing.'string='Annuaire Start Date' -
l10n_fr_pdp_flow_10_start_dateDatecompute='_compute_l10n_fr_pdp_flow_10_start_date'groups='base.group_user' -
l10n_fr_pdp_periodicitySelectiondefault='normal_monthly'groups='base.group_user'help='Legal reporting period for transaction and payments flows according to the TVA regime table.\n Real Monthly Normal Regime : transactions reported by decade, payments reported monthly\n Real Normal Quarterly Regime : transactions reported monthly, payments reported monthly\n Simplified VAT Regime (Monthly) : transactions reported monthly, payments reported monthly\n Franchised VAT Regime (Bimonthly) : transactions reported bimonthly, payments reported bimonthly\n 'required=Trueselection=[('normal_monthly', 'Real Monthly Normal Regime'), ('normal_quarterly', 'Real Normal Quarterly Regime'), ('simplified_monthly', 'Simplified VAT Regime (Monthly)'), ('simplified_bimonthly', 'Franchised VAT Regime (Bimonthly)')]string='Flow 10 Report Periodicity' -
l10n_fr_pdp_pilot_phaseBooleangroups='base.group_user'help='Participate in the Pilot Phase of the French E-Invoicing. This way you are able to test it before it becomes mandatory.'string='E-Invoicing Pilot Phase' -
l10n_fr_pdp_registeredBooleancompute='_compute_l10n_fr_pdp_registered'groups='base.group_user'string='Approved Platform Registerd' -
l10n_fr_pdp_send_to_ppfBooleandefault=Truegroups='base.group_user'help='Activate Flux 1 regulatory data, Flux 6 mandatory statuses and Flux 10 e-reporting generation for this company.'string='Send to PPF' -
pdp_authentication_uuidChargroups='account.group_account_invoice'string='Authentication IAP UUID' -
pdp_identifierCharcompute='_compute_pdp_identifier'groups='base.group_user'inverse='_inverse_pdp_identifier' -
pdp_kyc_statusSelectiongroups='base.group_user'selection=[('processing', 'Processing'), ('success', 'Success'), ('fail', 'Fail')]
No public methods.
New fields (5)
-
l10n_fr_pdp_annuaire_start_dateDatehelp='The date on which the company is registered on the annuaire for the French e-invoicing.'related='company_id.l10n_fr_pdp_annuaire_start_date'string='Annuaire Start Date' -
l10n_fr_pdp_periodicitySelectionhelp='Legal reporting period for transaction and payments flows according to the TVA regime table.\n Real Monthly Normal Regime : transactions reported by decade, payments reported monthly\n Real Normal Quarterly Regime : transactions reported monthly, payments reported monthly\n Simplified VAT Regime (Monthly) : transactions reported monthly, payments reported monthly\n Franchised VAT Regime (Bimonthly) : transactions reported bimonthly, payments reported bimonthly\n 'readonly=Falserelated='company_id.l10n_fr_pdp_periodicity'required=Truestring='Flow 10 Report Periodicity' -
l10n_fr_pdp_pilot_phaseBooleancompute='_compute_l10n_fr_pdp_pilot_phase'help='Participate in the Pilot Phase of the French E-Invoicing. This way you are able to test it before it becomes mandatory.'inverse='_inverse_l10n_fr_pdp_pilot_phase'string='Pilot Phase' -
l10n_fr_pdp_registeredBooleanrelated='company_id.l10n_fr_pdp_registered'string='Approved Platform Registered' -
l10n_fr_pdp_send_to_ppfBooleanhelp='Activate Flux 1 regulatory data, Flux 6 mandatory statuses and Flux 10 e-reporting generation for this company.'readonly=Falserelated='company_id.l10n_fr_pdp_send_to_ppf'string='Send to PPF'
-
action_open_peppol_form(self)
New fields (3)
-
invoice_edi_formatSelectionselection_add=[('ubl_21_fr', 'France E-Invoicing (UBL 2.1)')] -
l10n_fr_is_pdpBooleancompute='_compute_l10n_fr_is_pdp' -
pdp_verification_display_stateSelectioncompute='_compute_pdp_verification_display_state'selection=[('not_verified', 'Not verified yet'), ('pdp_not_valid', 'Partner is not in the annuaire'), ('pdp_not_valid_format', 'Partner cannot receive format'), ('pdp_valid', 'Partner is in the annuaire'), ('peppol_not_valid', 'Partner is not on Peppol'), ('peppol_not_valid_format', 'Partner cannot receive format'), ('peppol_valid', 'Partner is on Peppol')]string='E-Invoicing State'
-
action_pdp_annuaire_lookup(self) -
fields_get(self, allfields=None, attributes=None)@api.model
Loading…
Loading…
Loading…