TIP: You can type at any time to perform a new search.
France - E-Invoicing (Approved Platform)
l10n_fr_pdp · odoo/odoo
- Repository
- odoo/odoo · module folder
- Module version
- 0.1.0
- Category
- Accounting/Localizations/EDI
- Folder size
- 0.65 MB
- License
- LGPL-3
- Application
- No
- Auto-installable
- Yes
- Website
- https://www.odoo.com/documentation/18.0/applications/finance/fiscal_localizations/france.html#PDP
- Last tracking update
- 2026-08-19 16:16:15
- Authors
- Odoo S.A.
- Maintainers
- Odoo S.A.
- Committers
- Odoo Translation Bot, Florian Gilbert, Pierrot (prro), jbw-odoo, Gauthier Wala (gawa), Sven Fuehr, Louis Gobert, Léo Gizard, Anton Romanova (roan), Corentin Heinix (cohe), Tyler Landivar (tylan), bhra-odoo, Jugurtha, Martin Doyen, Victor Decleire, cro, 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 (24)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
account_journal_dashboard_kanban_view |
account.journal.dashboard.kanban | account.journal | kanban | Inherits account.account_journal_dashboard_kanban_view |
account_peppol_response_view_form |
account.peppol.response.view.form.l10n.fr.pdp | account.peppol.response | form | Inherits account_peppol_response.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_response.account_peppol_response_view_list |
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_config_wizard_form |
pdp.config.wizard.form | pdp.config.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_response.res_partner_form_account_peppol_response |
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 (19)
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=Falseselection=[('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)
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>
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, check_totp=True)Send flow payload to transport gateway. The parameter check totp is no longer useful and will be remove in master -
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 (5)
-
account_peppol_contact_emailCharreadonly=Falserelated='company_id.account_peppol_contact_email'required=True -
account_peppol_edi_identificationCharrelated='account_peppol_edi_user.edi_identification' -
account_peppol_edi_userMany2one → account_edi_proxy_client.usercomodel_name='account_edi_proxy_client.user'compute='_compute_account_peppol_edi_user' -
account_peppol_proxy_stateSelectionreadonly=Falserelated='company_id.account_peppol_proxy_state' -
company_idMany2one → res.companycomodel_name='res.company'default=<expr>required=True
-
button_peppol_unregister(self)Unregister the user from Peppol network. -
button_sync_form_with_peppol_proxy(self)Update the peppol contact email on IAP. Note: The service configuration is DEPRECATED / hidden in the view. Disabling services can lead to complicance issues and is not necessary since all existing services should just work.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (12)
-
account_peppol_proxy_stateSelectionreadonly=Falserelated='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'inverse='_inverse_pdp_identifier'readonly=Falserequired=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')] -
show_reason_codeBooleancompute='_compute_show_reason_code'help="Technical field to hide / show the 'Reason Code' in the view." -
statusSelectionselection=[('PD', 'Paid'), ('cancelled', 'Cancelled'), ('refused', 'Refused'), ('AP', 'Approved'), ('in_hand', 'In Hand')]
-
button_send(self)
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_pdp_form(self) -
action_open_peppol_form(self) -
button_open_pdp_config_wizard(self) -
button_open_peppol_config_wizard(self)
New fields (2)
-
invoice_edi_formatSelectionselection_add=[('ubl_21_fr', 'France E-Invoicing (UBL 2.1)')] -
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'
-
button_account_peppol_check_partner_endpoint(self, company=None)@handle_demo -
fields_get(self, allfields=None, attributes=None)@api.model
Loading…
Loading…