France - E-Invoicing (Approved Platform)

l10n_fr_pdp
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/l10n_fr_pdp
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYAccounting/Localizations/EDI
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSOdoo Translation Bot, Florian Gilbert, Pierrot (prro), jbw-odoo, Gauthier Wala (gawa), Sven Fuehr, Léo Gizard, bhra-odoo, Jugurtha, Maximilien, Jérémy Bazin (baje), Adham Abdeltawab
WEBSITE
WEBSITEhttps://www.odoo.com/documentation/18.0/applications/finance/fiscal_localizations/france.html#PDP
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - l10n_fr_account
    - base_iban
    - account
    - base_setup
    - base
    - web
    - onboarding
    - product
    - mail
    - bus
    - web_tour
    - html_editor
    - uom
    - analytic
    - portal
    - http_routing
    - auth_signup
    - digest
    - resource
    - base_vat
    - account_edi_ubl_cii
    - l10n_fr
    - account_peppol_response
    - account_peppol
    - account_edi_proxy_client
    - certificate
    - auth_totp_mail
    - auth_totp
    - iap
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES phonenumbers
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
        - Support for the mandatory electronic invoicing in France
        - Send and receive documents via the Odoo approved platform

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
account_journal_dashboard_kanban_view account.journal.dashboard.kanban account.journal data Inherits account.account_journal_dashboard_kanban_view
account_peppol_response_view_form account.peppol.response.view.form.l10n.fr.pdp account.peppol.response field 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 field 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 field Inherits account.view_in_invoice_tree
l10n_fr_pdp_reports_view_move_form account.move.form.l10n.fr.pdp.status account.move button Inherits account.view_move_form
l10n_fr_pdp_reports_view_move_kanban account.move.kanban.l10n.fr.pdp.status account.move xpath Inherits account.view_account_move_kanban
l10n_fr_pdp_reports_view_move_search account.move.search.l10n.fr.pdp.status account.move xpath 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 field Inherits account.view_out_credit_note_tree
l10n_fr_pdp_reports_view_out_invoice_tree account.move.tree.l10n.fr.pdp.status account.move field Inherits account.view_out_invoice_tree
l10n_fr_pdp_view_account_invoice_filter account.invoice.select.inherit account.move filter Inherits account_peppol.account_peppol_view_account_invoice_filter
l10n_fr_pdp_view_in_bill_tree_inherit account.move.tree.inherit account.move field Inherits account.view_in_invoice_bill_tree
l10n_fr_pdp_view_in_invoice_refund_tree_inherit account.move.list.inherit account.move field Inherits account.view_in_invoice_refund_tree
l10n_fr_pdp_view_move_form l10n.fr.pdp.view.move.form account.move button 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 field 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 field 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 xpath Inherits account_peppol.res_config_settings_view_form
res_partner_form_l10n_fr_pdp res.partner.form.l10n.fr.pdp res.partner data Inherits account_peppol_response.res_partner_form_account_peppol_response
Models touched (18)

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_info Boolean
    related='company_id.l10n_fr_f10_enable_reporting'
  • l10n_fr_pdp_error_message Text
    compute='_compute_l10n_fr_pdp_error_message' string='Flow 10 blocking errors'
  • l10n_fr_pdp_flow_10_operation_type Selection
    compute='_compute_l10n_fr_pdp_flow_10_operation_type' copy=False selection=[('sale', 'Sale'), ('purchase', 'Purchase')] store=True
  • l10n_fr_pdp_flow_10_report_type Selection
    compute='_compute_l10n_fr_pdp_flow_10_report_type' copy=False selection=[('transaction', 'Transaction'), ('payment', 'Payment')] store=True
  • l10n_fr_pdp_has_error Boolean
    compute='_compute_l10n_fr_pdp_has_error' copy=False readonly=True store=True
  • l10n_fr_pdp_last_flow_id Many2one → l10n.fr.pdp.reports.flow
    comodel_name='l10n.fr.pdp.reports.flow' compute='_compute_l10n_fr_pdp_last_flow_id' copy=False store=True string='Last PDP Flow' tracking=True
  • l10n_fr_pdp_sent_in_flow_ids Many2many → l10n.fr.pdp.reports.flow
    column1='move_id' column2='flow_id' comodel_name='l10n.fr.pdp.reports.flow' copy=False relation='sent_account_move__pdp_flow' string='Sent in PDP Flows'
  • l10n_fr_pdp_status Selection
    compute='_compute_l10n_fr_pdp_status' copy=False selection=<expr> store=True string='E-Reporting Status' tracking=True
  • pdp_can_send_response Boolean
    compute='_compute_pdp_can_send_response'
  • pdp_is_sent Boolean
    compute='_compute_pdp_is_sent'
  • pdp_lifecycle_residual Monetary
    compute='_compute_pdp_lifecycle_residual' copy=False help='Technical field indicating the amount of collected money we have still to report to the PPF via a lifecycle.' store=True string='Lifecycle Residual'
  • pdp_ppf_lifecycle_state Selection
    compute='_compute_pdp_ppf_state' copy=False selection=[('in_progress', 'In Progress'), ('sent', 'Sent'), ('done', 'Done'), ('error', 'Error')] store=True string='PPF Lifeycle Status'
  • pdp_ppf_move_state Selection
    compute='_compute_pdp_ppf_state' copy=False selection=[('in_progress', 'In Progress'), ('sent', 'Sent'), ('done', 'Done'), ('error', 'Error')] store=True string='PPF Invoice Status'
  • pdp_uses_pdp Boolean
    compute='_compute_pdp_uses_pdp'
  • peppol_move_state Selection
    selection_add=[('PD', 'With Payments'), *<expr>] string='E-Invoicing Status'
Public methods (2)
  • action_pdp_open_response_wizard(self, **wizard_kwargs)
  • button_cancel(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_number Selection
    selection=[('1', 'Tax Extract'), ('2', 'Status'), ('6', 'Mandatory Status'), ('10', 'Report')] string='Flow Number'
  • pdp_issue_date Datetime
    string='Issue Date'
  • pdp_payment_info Json
    string='Payment Info'
  • pdp_ppf_state Selection
    compute='_compute_pdp_ppf_state' selection=[('sent', 'Sent'), ('received', 'received'), ('error', 'Error')] store=True string='PPF Status'
  • pdp_ref_response_code Selection
    selection=<expr> string='Original Response Code'
  • pdp_ref_uuid Char
    args: 'Referenced UUID'
  • pdp_status_info Text
    string='Status Info'
  • response_code Selection
    ondelete=<expr> selection_add=<expr>
Public methods (0)

No public methods.

New fields (1)
  • proxy_type Selection
    ondelete={'pdp': 'cascade'} selection_add=[('pdp', 'Approved Platform')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (22)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True string='Company'
  • due_period_end Date
    required=True
  • due_period_start Date
    required=True
  • error_move_message Text
    string='Invalid Invoice Details'
  • error_moves_count Integer
    compute='_compute_move_ids'
  • initial_flow_id Many2one → l10n.fr.pdp.reports.flow
    comodel_name='l10n.fr.pdp.reports.flow'
  • move_ids Many2many → account.move
    comodel_name='account.move' compute='_compute_move_ids' help='Invoices/Payments reported in this flow.'
  • name Char
  • operation_type Selection
    default='sale' help='Defines whether the flow reports sales or acquisition transactions.' required=True selection=[('sale', 'Sales'), ('purchase', 'Acquisitions')]
  • payload_id Many2one → ir.attachment
    compute='_compute_payload_attachment' string='XML Payload' args: 'ir.attachment'
  • pdp_flow_id Char
    readonly=True
  • period_end Date
    required=True
  • period_start Date
    required=True
  • period_status Selection
    compute='_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_code Char
  • rectificative_flow_ids One2many → l10n.fr.pdp.reports.flow
    comodel_name='l10n.fr.pdp.reports.flow' inverse_name='initial_flow_id'
  • report_type Selection
    default='transaction' required=True selection=[('transaction', 'Transaction'), ('payment', 'Payment')]
  • sent_move_ids Many2many → account.move
    column1='flow_id' column2='move_id' comodel_name='account.move' relation='sent_account_move__pdp_flow'
  • state Selection
    default='ready' required=True selection=<expr> string='Status'
  • transmission_type Selection
    compute='_compute_transmission_type' help='Type of flow transmission.' selection=[('initial', 'Initial'), ('rectificative', 'Rectificative')]
  • transport_message Text
    help='Additional message or error returned by the PDP transport API.'
  • transport_status Char
    help='Raw status returned by the PDP transport API.'
Public methods (7)
  • 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_id Many2one → l10n.fr.pdp.reports.flow
    comodel_name='l10n.fr.pdp.reports.flow' default=<expr> ondelete='cascade' required=True
  • warning Text
    default=<expr> readonly=True
Public methods (2)
  • action_send_anyway(self)
    Send flow excluding invalid invoices.
  • action_view_errors(self)
    Open list of invalid invoices.

New fields (5)
  • account_peppol_contact_email Char
    readonly=False related='company_id.account_peppol_contact_email' required=True
  • account_peppol_edi_identification Char
    related='account_peppol_edi_user.edi_identification'
  • account_peppol_edi_user Many2one → account_edi_proxy_client.user
    comodel_name='account_edi_proxy_client.user' compute='_compute_account_peppol_edi_user'
  • account_peppol_proxy_state Selection
    readonly=False related='company_id.account_peppol_proxy_state'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True
Public methods (2)
  • 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_state Selection
    readonly=False related='company_id.account_peppol_proxy_state'
  • auth_url_hash Char
    readonly=False related='company_id.pdp_authentication_uuid' string='Company Authentication IAP UUID'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True
  • contact_email Char
    readonly=False related='company_id.account_peppol_contact_email' required=True
  • edi_mode Selection
    compute='_compute_edi_mode' readonly=False selection=[('demo', 'Demo'), ('test', 'Test'), ('prod', 'Live')] string='EDI mode'
  • edi_user_id Many2one → account_edi_proxy_client.user
    comodel_name='account_edi_proxy_client.user' compute='_compute_edi_user_id' string='EDI user'
  • pdp_authentication_uuid Char
    readonly=False related='company_id.pdp_authentication_uuid' store=True string='Authentication IAP UUID'
  • pdp_identifier Char
    compute='_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=False required=True
  • pdp_kyc_status Selection
    readonly=False related='company_id.pdp_kyc_status' string='Authentication status'
  • pdp_pilot_phase Boolean
    help='Participate in the Pilot Phase of the French E-Invoicing. This way you are able to test it before it becomes mandatory.' readonly=False related='company_id.l10n_fr_pdp_pilot_phase' string=' Pilot Phase'
  • siren_number Char
    compute='_compute_siren_number' readonly=False store=True
  • warnings Json
    compute='_compute_warnings' string='Warnings'
Public methods (7)
  • 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_statuses Char
    compute='_compute_available_statuses' help='Technical field to enable dynamic selection of status.'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' compute='_compute_currency_id' help="The payment's currency." precompute=True store=True string='Currency'
  • fully_paid Boolean
    compute='_compute_paid_amount' readonly=False store=True string='Fully paid'
  • move_count Integer
    compute='_compute_move_count' store=True
  • move_ids Many2many → account.move
    comodel_name='account.move' required=True
  • note Text
    args: 'Additional note'
  • paid_amount Monetary
    compute='_compute_paid_amount' currency_field='currency_id' readonly=False store=True string='Payment Amount'
  • reason_code Selection
    selection=[('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_code Boolean
    compute='_compute_show_reason_code' help="Technical field to hide / show the 'Reason Code' in the view."
  • status Selection
    selection=[('PD', 'Paid'), ('cancelled', 'Cancelled'), ('refused', 'Refused'), ('AP', 'Approved'), ('in_hand', 'In Hand')]
Public methods (1)
  • button_send(self)

New fields (10)
  • l10n_fr_f10_enable_reporting Boolean
    compute='_compute_l10n_fr_f10_enable_reporting' groups='base.group_user' readonly=True store=True string='Enable Flux 10 Reporting'
  • l10n_fr_pdp_annuaire_start_date Date
    groups='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_date Date
    compute='_compute_l10n_fr_pdp_flow_10_start_date' groups='base.group_user'
  • l10n_fr_pdp_periodicity Selection
    default='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=True selection=[('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_phase Boolean
    groups='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_registered Boolean
    compute='_compute_l10n_fr_pdp_registered' groups='base.group_user' string='Approved Platform Registerd'
  • l10n_fr_pdp_send_to_ppf Boolean
    default=True groups='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_uuid Char
    groups='account.group_account_invoice' string='Authentication IAP UUID'
  • pdp_identifier Char
    compute='_compute_pdp_identifier' groups='base.group_user' inverse='_inverse_pdp_identifier'
  • pdp_kyc_status Selection
    groups='base.group_user' selection=[('processing', 'Processing'), ('success', 'Success'), ('fail', 'Fail')]
Public methods (0)

No public methods.

New fields (5)
  • l10n_fr_pdp_annuaire_start_date Date
    help='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_periodicity Selection
    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 ' readonly=False related='company_id.l10n_fr_pdp_periodicity' required=True string='Flow 10 Report Periodicity'
  • l10n_fr_pdp_pilot_phase Boolean
    compute='_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_registered Boolean
    related='company_id.l10n_fr_pdp_registered' string='Approved Platform Registered'
  • l10n_fr_pdp_send_to_ppf Boolean
    help='Activate Flux 1 regulatory data, Flux 6 mandatory statuses and Flux 10 e-reporting generation for this company.' readonly=False related='company_id.l10n_fr_pdp_send_to_ppf' string='Send to PPF'
Public methods (4)
  • 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_format Selection
    selection_add=[('ubl_21_fr', 'France E-Invoicing (UBL 2.1)')]
  • pdp_verification_display_state Selection
    compute='_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'
Public methods (2)
  • button_account_peppol_check_partner_endpoint(self, company=None)
    @handle_demo
  • fields_get(self, allfields=None, attributes=None)
    @api.model
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/l10n_fr_pdp
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYAccounting/Localizations/EDI
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Florian Gilbert, Pierrot (prro), jbw-odoo, Gauthier Wala (gawa), Sven Fuehr, Léo Gizard, bhra-odoo, Maximilien, Jérémy Bazin (baje)
WEBSITE
WEBSITEhttps://www.odoo.com/documentation/18.0/applications/finance/fiscal_localizations/france.html#PDP
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:54
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - l10n_fr_account
    - base_iban
    - account
    - base_setup
    - base
    - web
    - onboarding
    - product
    - mail
    - bus
    - web_tour
    - html_editor
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - base_vat
    - l10n_fr
    - account_edi_ubl_cii_tax_extension
    - account_edi_ubl_cii
    - account_peppol_response
    - account_peppol
    - account_edi_proxy_client
    - certificate
    - auth_totp_mail_enforce
    - auth_totp
    - iap
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES phonenumbers
cryptography
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
        - Support for the mandatory electronic invoicing in France
        - Send and receive documents via the Odoo approved platform

Code Analysis

Views touched (23)
XML IDNameModelTypeStatus
account_journal_dashboard_kanban_view account.journal.dashboard.kanban account.journal data Inherits account_peppol.account_journal_dashboard_kanban_view
account_peppol_response_view_form account.peppol.response.view.form.l10n.fr.pdp account.peppol.response field 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 field 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 field Inherits account.view_in_invoice_tree
l10n_fr_pdp_reports_view_move_form account.move.form.l10n.fr.pdp.status account.move button Inherits account.view_move_form
l10n_fr_pdp_reports_view_move_kanban account.move.kanban.l10n.fr.pdp.status account.move xpath Inherits account.view_account_move_kanban
l10n_fr_pdp_reports_view_move_search account.move.search.l10n.fr.pdp.status account.move xpath 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 field Inherits account.view_out_credit_note_tree
l10n_fr_pdp_reports_view_out_invoice_tree account.move.tree.l10n.fr.pdp.status account.move field Inherits account.view_out_invoice_tree
l10n_fr_pdp_view_account_invoice_filter account.invoice.select.inherit account.move filter Inherits account_peppol.account_peppol_view_account_invoice_filter
l10n_fr_pdp_view_in_bill_tree_inherit account.move.tree.inherit account.move field Inherits account.view_in_invoice_bill_tree
l10n_fr_pdp_view_in_invoice_refund_tree_inherit account.move.list.inherit account.move field Inherits account.view_in_invoice_refund_tree
l10n_fr_pdp_view_move_form l10n.fr.pdp.view.move.form account.move button 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 field 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 field 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 xpath Inherits account_peppol.res_config_settings_view_form
res_partner_form_l10n_fr_pdp res.partner.form.l10n.fr.pdp res.partner data Inherits account_peppol_response.res_partner_form_account_peppol_response
Models touched (17)

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)
  • peppol_get_new_documents(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_info Boolean
    related='company_id.l10n_fr_f10_enable_reporting'
  • l10n_fr_pdp_error_message Text
    compute='_compute_l10n_fr_pdp_error_message' string='Flow 10 blocking errors'
  • l10n_fr_pdp_flow_10_operation_type Selection
    compute='_compute_l10n_fr_pdp_flow_10_operation_type' copy=False selection=[('sale', 'Sale'), ('purchase', 'Purchase')] store=True
  • l10n_fr_pdp_flow_10_report_type Selection
    compute='_compute_l10n_fr_pdp_flow_10_report_type' copy=False selection=[('transaction', 'Transaction'), ('payment', 'Payment')] store=True
  • l10n_fr_pdp_has_error Boolean
    compute='_compute_l10n_fr_pdp_has_error' copy=False readonly=True store=True
  • l10n_fr_pdp_last_flow_id Many2one → l10n.fr.pdp.reports.flow
    comodel_name='l10n.fr.pdp.reports.flow' compute='_compute_l10n_fr_pdp_last_flow_id' copy=False store=True string='Last PDP Flow' tracking=True
  • l10n_fr_pdp_sent_in_flow_ids Many2many → l10n.fr.pdp.reports.flow
    column1='move_id' column2='flow_id' comodel_name='l10n.fr.pdp.reports.flow' copy=False relation='sent_account_move__pdp_flow' string='Sent in PDP Flows'
  • l10n_fr_pdp_status Selection
    compute='_compute_l10n_fr_pdp_status' copy=False selection=<expr> store=True string='E-Reporting Status' tracking=True
  • pdp_can_send_response Boolean
    compute='_compute_pdp_can_send_response'
  • pdp_is_sent Boolean
    compute='_compute_pdp_is_sent'
  • pdp_lifecycle_residual Monetary
    compute='_compute_pdp_lifecycle_residual' copy=False help='Technical field indicating the amount of collected money we have still to report to the PPF via a lifecycle.' store=True string='Lifecycle Residual'
  • pdp_ppf_lifecycle_state Selection
    compute='_compute_pdp_ppf_state' copy=False selection=[('in_progress', 'In Progress'), ('sent', 'Sent'), ('done', 'Done'), ('error', 'Error')] store=True string='PPF Lifeycle Status'
  • pdp_ppf_move_state Selection
    compute='_compute_pdp_ppf_state' copy=False selection=[('in_progress', 'In Progress'), ('sent', 'Sent'), ('done', 'Done'), ('error', 'Error')] store=True string='PPF Invoice Status'
  • pdp_uses_pdp Boolean
    compute='_compute_pdp_uses_pdp'
  • peppol_move_state Selection
    selection_add=[('PD', 'With Payments'), *<expr>] string='E-Invoicing Status'
Public methods (2)
  • action_pdp_open_response_wizard(self, **wizard_kwargs)
  • button_cancel(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_number Selection
    selection=[('1', 'Tax Extract'), ('2', 'Status'), ('6', 'Mandatory Status'), ('10', 'Report')] string='Flow Number'
  • pdp_issue_date Datetime
    string='Issue Date'
  • pdp_payment_info Json
    string='Payment Info'
  • pdp_ppf_state Selection
    compute='_compute_pdp_ppf_state' selection=[('sent', 'Sent'), ('received', 'received'), ('error', 'Error')] store=True string='PPF Status'
  • pdp_ref_response_code Selection
    selection=<expr> string='Original Response Code'
  • pdp_ref_uuid Char
    args: 'Referenced UUID'
  • pdp_status_info Text
    string='Status Info'
  • response_code Selection
    ondelete=<expr> selection_add=<expr>
Public methods (0)

No public methods.

New fields (1)
  • proxy_type Selection
    ondelete={'pdp': 'cascade'} selection_add=[('pdp', 'Approved Platform')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (22)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True string='Company'
  • due_period_end Date
    required=True
  • due_period_start Date
    required=True
  • error_move_message Text
    string='Invalid Invoice Details'
  • error_moves_count Integer
    compute='_compute_move_ids'
  • initial_flow_id Many2one → l10n.fr.pdp.reports.flow
    comodel_name='l10n.fr.pdp.reports.flow'
  • move_ids Many2many → account.move
    comodel_name='account.move' compute='_compute_move_ids' help='Invoices/Payments reported in this flow.'
  • name Char
  • operation_type Selection
    default='sale' help='Defines whether the flow reports sales or acquisition transactions.' required=True selection=[('sale', 'Sales'), ('purchase', 'Acquisitions')]
  • payload_id Many2one → ir.attachment
    compute='_compute_payload_attachment' string='XML Payload' args: 'ir.attachment'
  • pdp_flow_id Char
    readonly=True
  • period_end Date
    required=True
  • period_start Date
    required=True
  • period_status Selection
    compute='_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_code Char
  • rectificative_flow_ids One2many → l10n.fr.pdp.reports.flow
    comodel_name='l10n.fr.pdp.reports.flow' inverse_name='initial_flow_id'
  • report_type Selection
    default='transaction' required=True selection=[('transaction', 'Transaction'), ('payment', 'Payment')]
  • sent_move_ids Many2many → account.move
    column1='flow_id' column2='move_id' comodel_name='account.move' relation='sent_account_move__pdp_flow'
  • state Selection
    default='ready' required=True selection=<expr> string='Status'
  • transmission_type Selection
    compute='_compute_transmission_type' help='Type of flow transmission.' selection=[('initial', 'Initial'), ('rectificative', 'Rectificative')]
  • transport_message Text
    help='Additional message or error returned by the PDP transport API.'
  • transport_status Char
    help='Raw status returned by the PDP transport API.'
Public methods (7)
  • 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_id Many2one → l10n.fr.pdp.reports.flow
    comodel_name='l10n.fr.pdp.reports.flow' default=<expr> ondelete='cascade' required=True
  • warning Text
    default=<expr> readonly=True
Public methods (2)
  • action_send_anyway(self)
    Send flow excluding invalid invoices.
  • action_view_errors(self)
    Open list of invalid invoices.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • account_peppol_proxy_state Selection
    readonly=False related='company_id.account_peppol_proxy_state'
  • auth_url_hash Char
    readonly=False related='company_id.pdp_authentication_uuid' string='Company Authentication IAP UUID'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True
  • contact_email Char
    readonly=False related='company_id.account_peppol_contact_email' required=True
  • edi_mode Selection
    compute='_compute_edi_mode' readonly=False selection=[('demo', 'Demo'), ('test', 'Test'), ('prod', 'Live')] string='EDI mode'
  • edi_user_id Many2one → account_edi_proxy_client.user
    comodel_name='account_edi_proxy_client.user' compute='_compute_edi_user_id' string='EDI user'
  • pdp_authentication_uuid Char
    readonly=False related='company_id.pdp_authentication_uuid' store=True string='Authentication IAP UUID'
  • pdp_identifier Char
    compute='_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=False required=True
  • pdp_kyc_status Selection
    readonly=False related='company_id.pdp_kyc_status' string='Authentication status'
  • pdp_pilot_phase Boolean
    help='Participate in the Pilot Phase of the French E-Invoicing. This way you are able to test it before it becomes mandatory.' readonly=False related='company_id.l10n_fr_pdp_pilot_phase' string=' Pilot Phase'
  • siren_number Char
    compute='_compute_siren_number' readonly=False store=True
  • warnings Json
    compute='_compute_warnings' string='Warnings'
Public methods (7)
  • 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_statuses Char
    compute='_compute_available_statuses' help='Technical field to enable dynamic selection of status.'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' compute='_compute_currency_id' help="The payment's currency." precompute=True store=True string='Currency'
  • fully_paid Boolean
    compute='_compute_paid_amount' readonly=False store=True string='Fully paid'
  • move_count Integer
    compute='_compute_move_count' store=True
  • move_ids Many2many → account.move
    comodel_name='account.move' required=True
  • note Text
    args: 'Additional note'
  • paid_amount Monetary
    compute='_compute_paid_amount' currency_field='currency_id' readonly=False store=True string='Payment Amount'
  • reason_code Selection
    selection=[('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_code Boolean
    compute='_compute_show_reason_code' help="Technical field to hide / show the 'Reason Code' in the view."
  • status Selection
    selection=[('PD', 'Paid'), ('cancelled', 'Cancelled'), ('refused', 'Refused'), ('AP', 'Approved'), ('in_hand', 'In Hand')]
Public methods (1)
  • button_send(self)

New fields (10)
  • l10n_fr_f10_enable_reporting Boolean
    compute='_compute_l10n_fr_f10_enable_reporting' groups='base.group_user' readonly=True store=True string='Enable Flux 10 Reporting'
  • l10n_fr_pdp_annuaire_start_date Date
    groups='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_date Date
    compute='_compute_l10n_fr_pdp_flow_10_start_date' groups='base.group_user'
  • l10n_fr_pdp_periodicity Selection
    default='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=True selection=[('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_phase Boolean
    groups='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_registered Boolean
    compute='_compute_l10n_fr_pdp_registered' groups='base.group_user' string='Approved Platform Registerd'
  • l10n_fr_pdp_send_to_ppf Boolean
    default=True groups='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_uuid Char
    groups='account.group_account_invoice' string='Authentication IAP UUID'
  • pdp_identifier Char
    compute='_compute_pdp_identifier' groups='base.group_user' inverse='_inverse_pdp_identifier'
  • pdp_kyc_status Selection
    groups='base.group_user' selection=[('processing', 'Processing'), ('success', 'Success'), ('fail', 'Fail')]
Public methods (0)

No public methods.

New fields (5)
  • l10n_fr_pdp_annuaire_start_date Date
    help='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_periodicity Selection
    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 ' readonly=False related='company_id.l10n_fr_pdp_periodicity' required=True string='Flow 10 Report Periodicity'
  • l10n_fr_pdp_pilot_phase Boolean
    compute='_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_registered Boolean
    related='company_id.l10n_fr_pdp_registered' string='Approved Platform Registered'
  • l10n_fr_pdp_send_to_ppf Boolean
    help='Activate Flux 1 regulatory data, Flux 6 mandatory statuses and Flux 10 e-reporting generation for this company.' readonly=False related='company_id.l10n_fr_pdp_send_to_ppf' string='Send to PPF'
Public methods (2)
  • action_open_pdp_form(self)
  • action_open_peppol_form(self)

New fields (2)
  • invoice_edi_format Selection
    selection_add=[('ubl_21_fr', 'France E-Invoicing (UBL 2.1)')]
  • pdp_verification_display_state Selection
    compute='_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'
Public methods (2)
  • button_account_peppol_check_partner_endpoint(self, company=None)
    @handle_demo
  • fields_get(self, allfields=None, attributes=None)
    @api.model