Peppol

account_peppol
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/account_peppol
VERSION
VERSION 1.2
CATEGORY
CATEGORYAccounting/Accounting
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Josse Colpaert, Xavier ALT, Xavier Morel, Laurent Smet, Julien Castiaux, Andrea Grazioso (agr-odoo), Anh Thao Pham (pta), Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, William Braeckman, william-andre, Florian Gilbert, Ruben Gomes, assellalou, luvi, Pierrot (prro), Louis Wicket (wil), Thomas Becquevort (thbe), Gauthier Wala (gawa), Claire Bretton (clbr), Yosua Nicolaus, Antoine Boonen, Dylan Kiss (dyki), Paolo Gatti, Harsh Modi, Zeel Patel, Sven Fuehr, kcv-odoo, Louis Gobert, Claire (clbr), Antoine Dupuis, Saif (segn), Victor Miguel Armenta Carrillo, Logan Staelens, roto-odoo, Anton Romanova (roan), Corentin Heinix (cohe), Corentin Lombard, Allesio, Krzysztof Magusiak (krma), hatr-odoo, dhruv, Ester Andreetto, bhra-odoo, Yassien Ghoniem, Jugurtha, igbe, Jeanne Delneste, Laurent Smet (LAS), adip-odoo, Jérôme Belpaire, Ashish Nirmal, GACI Jugurtha, Arnav Varshney, Romaric MOYEUVRE, Zachary (zavan), Cyril Moreau (cymo)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account_edi_proxy_client
    - account
    - base_setup
    - base
    - web
    - onboarding
    - product
    - mail
    - bus
    - web_tour
    - html_editor
    - uom
    - analytic
    - portal
    - http_routing
    - auth_signup
    - digest
    - resource
    - certificate
    - account_edi_ubl_cii
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES phonenumbers
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
- Register as a PEPPOL participant
- Send and receive documents via PEPPOL network in Peppol BIS Billing 3.0 format
    

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
account_peppol_view_account_invoice_filter account.invoice.select.inherit account.move xpath Inherits account.view_account_invoice_filter
account_peppol_view_move_form account.peppol.view.move.form account.move header Inherits account.view_move_form
account_peppol_view_out_credit_note_tree_inherit account.move.credit.note.list.inherit account.move field Inherits account.view_out_credit_note_tree
account_peppol_view_out_invoice_tree_inherit account.move.out.invoice.list.inherit account.move field Inherits account.view_out_invoice_tree
mail_notification_layout_with_responsible_signature_and_peppol Mail: mail notification layout with responsible signature (user_id of the record) and Peppol status ir.ui.view qweb Inherits mail.mail_notification_layout_with_responsible_signature
peppol_config_wizard_form peppol.config.wizard.form peppol.config.wizard form New
peppol_registration_form peppol.registration.form peppol.registration form New
portal_my_details portal_my_details ir.ui.view qweb Inherits portal.portal_my_details
res_config_settings_view_form res.config.settings.view.form.inherit.proxy.user res.config.settings xpath Inherits account.res_config_settings_view_form
res_partner_form_account_peppol res.partner.form.account.peppol res.partner data Inherits account_edi_ubl_cii.view_partner_property_form
Models touched (15)

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 (2)
  • account_peppol_proxy_state Selection
    related='company_id.account_peppol_proxy_state'
  • is_peppol_journal Boolean
    default=False string='Account used for Peppol'
Public methods (2)
  • button_fetch_in_einvoices(self)
  • button_refresh_out_einvoices_status(self)

New fields (3)
  • peppol_is_sent Boolean
    compute='_compute_peppol_is_sent'
  • peppol_message_uuid Char
    copy=False string='PEPPOL message ID'
  • peppol_move_state Selection
    compute='_compute_peppol_move_state' copy=False selection=[('ready', 'Ready to send'), ('to_send', 'Queued'), ('skipped', 'Skipped'), ('processing', 'Pending Reception'), ('done', 'Done'), ('error', 'Error')] store=True string='PEPPOL status'
Public methods (4)
  • action_cancel_peppol_documents(self)
  • action_peppol_cancel_and_remove_sequence(self)
  • action_peppol_reset_documents(self, ids_to_delete=None)
  • action_send_and_print(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 (1)
  • action_send_and_print(self, force_synchronous=False, allow_fallback_pdf=False)

New fields (0)

No new fields.

Public methods (1)
  • action_send_and_print(self, allow_fallback_pdf=False)

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

No public methods.

New fields (4)
  • document_identifier Char
  • document_name Char
  • enabled Boolean
  • wizard_id Many2one → peppol.config.wizard
    comodel_name='peppol.config.wizard'
Public methods (0)

No public methods.

New fields (11)
  • account_peppol_contact_email Char
    default=<expr> required=True
  • account_peppol_edi_identification Char
    related='account_peppol_edi_user.edi_identification'
  • account_peppol_edi_user Many2one
    related='company_id.account_peppol_edi_user'
  • account_peppol_migration_key Char
    readonly=False related='company_id.account_peppol_migration_key'
  • 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
  • peppol_activate_self_billing Boolean
    compute='_compute_peppol_activate_self_billing' help='If activated, you will be able to send and receive self-billed invoices via Peppol.You can still disable reception by disabling the self-billing document types below.' inverse='_inverse_peppol_activate_self_billing' string='Activate self-billing'
  • peppol_self_billing_reception_journal_id Many2one
    readonly=False related='company_id.peppol_self_billing_reception_journal_id'
  • service_ids One2many → account_peppol.service
    comodel_name='account_peppol.service' compute='_compute_service_ids' inverse_name='wizard_id' readonly=False store=True
  • service_info Html
    compute='_compute_service_info'
  • service_json Json
    compute='_compute_service_json' help='JSON representation of peppol services as retrieved from the peppol server.' readonly=False store=True
Public methods (4)
  • button_peppol_register_sender_as_receiver(self)
    Reset the participant back to sender and unregister it from the SMP
  • button_peppol_reset_to_sender(self)
    Reset the participant back to sender and unregister it from the SMP
  • 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 (24)
  • account_peppol_proxy_state Selection
    related='company_id.account_peppol_proxy_state'
  • active_parent_company Many2one
    related='parent_company_id' string='Active Parent Company'
  • active_parent_company_name Char
    related='parent_company_name' string='Active Parent Company Name'
  • can_use_parent_connection Boolean
    related='display_use_parent_connection_selection' string='Can Use Parent Connection'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True
  • contact_email Char
    readonly=False related='selected_company_id.account_peppol_contact_email' required=True
  • display_itsme_login Boolean
    compute='_compute_peppol_can_connect_data'
  • display_no_auth_buttons Boolean
    compute='_compute_peppol_can_connect_data'
  • display_use_parent_connection_selection Boolean
    compute='_compute_display_use_parent_connection_selection'
  • edi_mode Selection
    compute='_compute_edi_mode' 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'
  • is_branch_company Boolean
    store=False
  • parent_company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_parent_company_id'
  • parent_company_name Char
    related='parent_company_id.name'
  • peppol_can_connect_data Json
    compute='_compute_peppol_can_connect_data'
  • peppol_eas Selection
    readonly=False related='selected_company_id.peppol_eas' required=True
  • peppol_endpoint Char
    readonly=False related='selected_company_id.peppol_endpoint' required=True
  • peppol_external_provider Char
    compute='_compute_smp_registration_external_provider'
  • peppol_warnings Json
    compute='_compute_peppol_warnings' string='Peppol warnings'
  • phone_number Char
    readonly=False related='selected_company_id.account_peppol_phone_number'
  • selected_company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_selected_company_id'
  • smp_registration Boolean
    compute='_compute_smp_registration_external_provider' string='Register as a receiver'
  • use_parent_connection Boolean
    compute='_compute_use_parent_connection'
  • use_parent_connection_selection Selection
    compute='_compute_use_parent_connection_selection' readonly=False selection=[('use_parent', 'Send from parent company'), ('use_self', 'Register this company on peppol')] store=True
Public methods (2)
  • button_register_peppol_participant(self, selected_auth=None)
  • button_register_with_itsme(self)

New fields (15)
  • account_peppol_contact_email Char
    compute='_compute_account_peppol_contact_email' help='Primary contact email for Peppol connection related communications and notifications.\nIn particular, this email is used by Odoo to reconnect your Peppol account in case of database change.' readonly=False store=True string='Primary contact email'
  • 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_migration_key Char
    groups='base.group_system' string='Migration Key'
  • account_peppol_phone_number Char
    compute='_compute_account_peppol_phone_number' help='This number is used for identification purposes only.' readonly=False store=True string='Mobile number'
  • account_peppol_proxy_state Selection
    default='not_registered' required=True selection=[('not_registered', 'Not registered'), ('sender', 'Can send but not receive'), ('smp_registration', 'Can send, pending registration to receive'), ('receiver', 'Can send and receive'), ('rejected', 'Rejected')] string='PEPPOL status'
  • peppol_activate_self_billing_sending Boolean
    help='If activated, you will be able to send vendor bills as self-billed invoices via Peppol.' string='Activate self-billing sending'
  • peppol_can_send Boolean
    compute='_compute_peppol_can_send'
  • peppol_eas Selection
    readonly=False related='partner_id.peppol_eas'
  • peppol_endpoint Char
    readonly=False related='partner_id.peppol_endpoint'
  • peppol_external_provider Char
    tracking=True
  • peppol_metadata Json
    string='Peppol Metadata'
  • peppol_metadata_updated_at Datetime
    string='Peppol meta updated at'
  • peppol_parent_company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_peppol_parent_company_id'
  • peppol_purchase_journal_id Many2one → account.journal
    comodel_name='account.journal' compute='_compute_peppol_purchase_journal_id' domain=[('type', '=', 'purchase')] inverse='_inverse_peppol_purchase_journal_id' readonly=False store=True string='Peppol Purchase Journal'
  • peppol_self_billing_reception_journal_id Many2one → account.journal
    comodel_name='account.journal' compute='_compute_peppol_self_billing_reception_journal_id' domain=[('type', '=', 'sale')] help='Any self-billed invoices / credit notes received via Peppol will be created in draft in this journal. Defaults to the first sale journal.' inverse='_inverse_peppol_self_billing_reception_journal_id' readonly=False store=True string='Self-Billing reception journal'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (15)
  • account_is_token_out_of_sync Boolean
    readonly=False related='account_peppol_edi_user.is_token_out_of_sync'
  • account_peppol_contact_email Char
    compute='_compute_account_peppol_contact_email' inverse='_inverse_account_peppol_contact_email'
  • account_peppol_eas Selection
    readonly=False related='company_id.peppol_eas'
  • account_peppol_edi_identification Char
    related='account_peppol_edi_user.edi_identification'
  • account_peppol_edi_mode Selection
    related='account_peppol_edi_user.edi_mode'
  • account_peppol_edi_user Many2one
    related='company_id.account_peppol_edi_user'
  • account_peppol_endpoint Char
    readonly=False related='company_id.peppol_endpoint'
  • account_peppol_migration_key Char
    readonly=False related='company_id.account_peppol_migration_key'
  • account_peppol_phone_number Char
    readonly=False related='company_id.account_peppol_phone_number'
  • account_peppol_proxy_state Selection
    readonly=False related='company_id.account_peppol_proxy_state'
  • account_peppol_purchase_journal_id Many2one
    readonly=False related='company_id.peppol_purchase_journal_id'
  • peppol_external_provider Char
    readonly=False related='company_id.peppol_external_provider'
  • peppol_parent_company_name Char
    compute='_compute_peppol_use_parent_company'
  • peppol_participation_role Selection
    compute='_compute_peppol_participation_role' inverse='_inverse_peppol_participation_role' selection=[('sending_and_receiving', 'Sending & Receiving'), ('sending_only', 'Sending Only')]
  • peppol_use_parent_company Boolean
    compute='_compute_peppol_use_parent_company'
Public methods (8)
  • action_open_peppol_form(self)
  • button_disconnect_this_database(self)
    Disconnect the current database from the Peppol network. This does not delete or affect the IAP connection, which will remain intact. So don't use this to deregister the participant/connection.
  • button_open_peppol_config_wizard(self)
  • button_peppol_deregister(self)
    Unregister the user from Peppol network.
  • button_peppol_disconnect_branch_from_parent(self)
  • button_peppol_register_sender_as_receiver(self)
    Register the existing user as a receiver.
  • button_peppol_reregister(self)
  • button_reconnect_this_database(self)
    Re-establish an out-of-sync connection

New fields (5)
  • available_peppol_edi_formats Json
    compute='_compute_available_peppol_edi_formats'
  • available_peppol_sending_methods Json
    compute='_compute_available_peppol_sending_methods'
  • invoice_sending_method Selection
    selection_add=[('peppol', 'by Peppol')]
  • peppol_eas Selection
    selection_add=[('odemo', 'Odoo Demo ID')]
  • peppol_verification_state Selection
    company_dependent=True selection=[('not_verified', 'Unchecked'), ('not_valid', 'Partner is not on Peppol'), ('not_valid_format', 'Partner cannot receive format'), ('valid', 'Partner is on Peppol')] string='Peppol status'
Public methods (2)
  • button_account_peppol_check_partner_endpoint(self, company=None)
    A basic check for whether a participant is reachable at the given Peppol participant ID - peppol_eas:peppol_endpoint (ex: '9999:test') The SML (Service Metadata Locator) assigns a DNS name to each peppol participant. This DNS name resolves into the SMP (Service Metadata Publisher) of the participant. The DNS address is of the following form: strip-trailing(base32(sha256(lowercase(ID-VALUE))),"=") + "." + ID-SCHEME + "." + SML-ZONE-NAME The lookup should be done on NAPTR DNS from 2025-11-01 (ref:https://peppol.helger.com/public/locale-en_US/menuitem-docs-doc-exchange)
  • create(self, vals_list)
    @api.model_create_multi
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/account_peppol
VERSION
VERSION 1.1
CATEGORY
CATEGORYAccounting/Accounting
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Josse Colpaert, Mohammed Shekha, Aaron Bohy, Yannick Tivisse, Odoo Online, Laurent Smet, Christophe Monniez, Xavier-Do, Anh Thao Pham (pta), Tiffany Chang (tic), Gorash, Daniel Stenlöv, Miquel Raïch, william-andre, aliya, Pierrot (prro), Weblate, Habib (ayh), Thomas Lefebvre (thle), Louis Wicket (wil), Maximilien (malb), Thomas Becquevort (thbe), Gauthier Wala (gawa), Daniel Kosky (dako), Claire Bretton (clbr), Yosua Nicolaus, Antoine Boonen, Dylan Kiss (dyki), Paolo Gatti, Chong Wang (cwg), sesn-odoo, Sven Fuehr, Louis Gobert, Louis (wil), Victorien (viso), Claire (clbr), Antoine Dupuis, Victor Miguel Armenta Carrillo, AhmedElemary57, muab-odoo, Logan Staelens, roto-odoo, Anton Romanova (roan), Corentin Lombard, Allesio, stra, kusi-odoo, Odoo's Mergebot, hatr-odoo, Robin Engels (roen), dhruv, bhra-odoo, Yassien Ghoniem, Jugurtha, Laurent Smet (LAS), adip-odoo, Jérôme Belpaire, Ashish Nirmal, GACI Jugurtha, Arnav Varshney, Megaaaaaa, Cyril Moreau (cymo)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 20:13:53
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account_edi_proxy_client
    - account
    - base_setup
    - base
    - web
    - onboarding
    - product
    - mail
    - bus
    - web_tour
    - html_editor
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - certificate
    - account_edi_ubl_cii
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES phonenumbers
cryptography
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
- Register as a PEPPOL participant
- Send and receive documents via PEPPOL network in Peppol BIS Billing 3.0 format
    

Code Analysis

Views touched (11)
XML IDNameModelTypeStatus
account_journal_dashboard_kanban_view account.journal.dashboard.kanban account.journal data Inherits account.account_journal_dashboard_kanban_view
account_peppol_view_account_invoice_filter account.invoice.select.inherit account.move xpath Inherits account.view_account_invoice_filter
account_peppol_view_move_form account.peppol.view.move.form account.move header Inherits account.view_move_form
account_peppol_view_out_credit_note_tree_inherit account.move.credit.note.list.inherit account.move field Inherits account.view_out_credit_note_tree
account_peppol_view_out_invoice_tree_inherit account.move.out.invoice.list.inherit account.move field Inherits account.view_out_invoice_tree
mail_notification_layout_with_responsible_signature_and_peppol Mail: mail notification layout with responsible signature (user_id of the record) and Peppol advertisement ir.ui.view qweb Inherits mail.mail_notification_layout_with_responsible_signature
peppol_registration_form peppol.registration.form peppol.registration form New
peppol_service_configuration account.peppol.service.configuration.form account_peppol.service.wizard form New
portal_my_details_fields portal_my_details_fields ir.ui.view qweb Inherits account.portal_my_details_fields
res_config_settings_view_form res.config.settings.view.form.inherit.proxy.user res.config.settings xpath Inherits account.res_config_settings_view_form
res_partner_form_account_peppol res.partner.form.account.peppol res.partner data Inherits account_edi_ubl_cii.view_partner_property_form
Models touched (13)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • account_peppol_proxy_state Selection
    related='company_id.account_peppol_proxy_state'
  • is_peppol_journal Boolean
    default=False string='Account used for Peppol'
Public methods (3)
  • action_peppol_ready_moves(self)
  • peppol_get_message_status(self)
  • peppol_get_new_documents(self)

New fields (3)
  • peppol_is_sent Boolean
    compute='_compute_peppol_is_sent'
  • peppol_message_uuid Char
    copy=False string='PEPPOL message ID'
  • peppol_move_state Selection
    compute='_compute_peppol_move_state' copy=False selection=[('ready', 'Ready to send'), ('to_send', 'Queued'), ('skipped', 'Skipped'), ('processing', 'Pending Reception'), ('done', 'Done'), ('error', 'Error')] store=True string='PEPPOL status'
Public methods (1)
  • action_cancel_peppol_documents(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 (1)
  • action_send_and_print(self, force_synchronous=False, allow_fallback_pdf=False)

New fields (0)

No new fields.

Public methods (1)
  • action_send_and_print(self, allow_fallback_pdf=False)

New fields (2)
  • peppol_verification_code Char
    string='SMS verification code'
  • proxy_type Selection
    ondelete={'peppol': 'cascade'} selection_add=[('peppol', 'PEPPOL')]
Public methods (0)

No public methods.

New fields (4)
  • document_identifier Char
  • document_name Char
  • enabled Boolean
  • wizard_id Many2one → account_peppol.service.wizard
    comodel_name='account_peppol.service.wizard'
Public methods (0)

No public methods.

New fields (4)
  • edi_user_id Many2one → account_edi_proxy_client.user
    comodel_name='account_edi_proxy_client.user' string='EDI user'
  • service_ids One2many → account_peppol.service
    comodel_name='account_peppol.service' inverse_name='wizard_id' readonly=False
  • service_info Html
    compute='_compute_service_info'
  • service_json Json
    help='JSON representation of peppol services as retrieved from the peppol server.'
Public methods (2)
  • confirm(self)
    Interpret changes to the services, and add or remove them on the IAP accordingly.
  • create(self, vals_list)
    @api.model_create_multi
    Get the selectable document types. Synthesize a combination of locally available document types and those added to the user on the IAP, add the relevant services.

New fields (18)
  • account_peppol_migration_key Char
    readonly=False related='selected_company_id.account_peppol_migration_key'
  • 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
  • contact_email Char
    readonly=False related='selected_company_id.account_peppol_contact_email' required=True
  • edi_mode Selection
    compute='_compute_edi_mode' inverse='_inverse_edi_mode' readonly=False selection=[('demo', 'Demo'), ('test', 'Test'), ('prod', 'Live')] string='EDI mode'
  • edi_mode_constraint Selection
    compute='_compute_edi_mode_constraint' help='Using the config params, this field specifies which edi modes may be selected from the UI' selection=[('demo', 'Demo'), ('test', 'Test'), ('prod', 'Live')]
  • edi_user_id Many2one → account_edi_proxy_client.user
    comodel_name='account_edi_proxy_client.user' compute='_compute_edi_user_id' string='EDI user'
  • parent_company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_parent_company_id'
  • parent_company_name Char
    related='parent_company_id.name'
  • peppol_eas Selection
    readonly=False related='company_id.peppol_eas' required=True
  • peppol_endpoint Char
    readonly=False related='company_id.peppol_endpoint' required=True
  • peppol_warnings Json
    compute='_compute_peppol_warnings' string='Peppol warnings'
  • phone_number Char
    readonly=False related='selected_company_id.account_peppol_phone_number'
  • selected_company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_selected_company_id'
  • smp_registration Boolean
    compute='_compute_smp_registration' help='If not check, you will only be able to send invoices but not receive them.' readonly=False store=True string='Register as a receiver'
  • use_parent_connection Boolean
    compute='_compute_use_parent_connection'
  • use_parent_connection_selection Selection
    compute='_compute_use_parent_connection_selection' selection=[('use_parent', 'Register using the parent company by setting the same EAS/Endpoint'), ('use_self', 'Register using the current company')]
  • verification_code Char
    readonly=False related='edi_user_id.peppol_verification_code'
Public methods (7)
  • button_check_peppol_verification_code(self)
    @handle_demo
    TODO remove in master Calls /verify_phone_number to compare user's input and the code generated on the IAP server
  • button_deregister_peppol_participant(self)
    @handle_demo
    Deregister the edi user from Peppol network
  • button_peppol_sender_registration(self)
    @handle_demo
    TODO remove in master The first step of the Peppol onboarding. - Creates an EDI proxy user on the iap side, then the client side - Calls /activate_participant to mark the EDI user as peppol user - Allows the user to become a sender but not a receiver on the Peppol network. Basically, a Sender does not exist on the peppol network. They use our Access Point to send invoices to Peppol participants without having to register themselves.
  • button_peppol_smp_registration(self)
    @handle_demo
    TODO remove in master The second (optional) step in Peppol registration. The user can choose to become a Receiver and officially register on the Peppol network, i.e. receive documents from other Peppol participants.
  • button_register_peppol_participant(self)
    @handle_demo
  • button_send_peppol_verification_code(self)
    TODO remove in master Request user verification via SMS Calls the /send_verification_code to send the 6-digit verification code
  • button_update_peppol_user_data(self)
    @handle_demo
    Action for the user to be able to update their contact details any time Calls /update_user on the iap server

New fields (10)
  • account_peppol_contact_email Char
    compute='_compute_account_peppol_contact_email' help='Primary contact email for Peppol connection related communications and notifications.\nIn particular, this email is used by Odoo to reconnect your Peppol account in case of database change.' readonly=False store=True string='Primary contact email'
  • 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_migration_key Char
    groups='base.group_system' string='Migration Key'
  • account_peppol_phone_number Char
    compute='_compute_account_peppol_phone_number' help='This number is used for identification purposes only.' readonly=False store=True string='Mobile number'
  • account_peppol_proxy_state Selection
    default='not_registered' required=True selection=[('not_registered', 'Not registered'), ('in_verification', 'In verification'), ('sender', 'Can send but not receive'), ('smp_registration', 'Can send, pending registration to receive'), ('receiver', 'Can send and receive'), ('rejected', 'Rejected')] string='PEPPOL status'
  • peppol_can_send Boolean
    compute='_compute_peppol_can_send'
  • peppol_eas Selection
    readonly=False related='partner_id.peppol_eas'
  • peppol_endpoint Char
    readonly=False related='partner_id.peppol_endpoint'
  • peppol_parent_company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_peppol_parent_company_id' compute_sudo=True
  • peppol_purchase_journal_id Many2one → account.journal
    comodel_name='account.journal' compute='_compute_peppol_purchase_journal_id' domain=[('type', '=', 'purchase')] inverse='_inverse_peppol_purchase_journal_id' readonly=False store=True string='PEPPOL Purchase Journal'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (12)
  • account_peppol_contact_email Char
    readonly=False related='company_id.account_peppol_contact_email'
  • account_peppol_eas Selection
    readonly=False related='company_id.peppol_eas'
  • account_peppol_edi_identification Char
    related='account_peppol_edi_user.edi_identification'
  • account_peppol_edi_mode Selection
    related='account_peppol_edi_user.edi_mode'
  • account_peppol_edi_user Many2one
    related='company_id.account_peppol_edi_user'
  • account_peppol_endpoint Char
    readonly=False related='company_id.peppol_endpoint'
  • account_peppol_migration_key Char
    readonly=False related='company_id.account_peppol_migration_key'
  • account_peppol_phone_number Char
    readonly=False related='company_id.account_peppol_phone_number'
  • account_peppol_proxy_state Selection
    readonly=False related='company_id.account_peppol_proxy_state'
  • account_peppol_purchase_journal_id Many2one
    readonly=False related='company_id.peppol_purchase_journal_id'
  • peppol_parent_company_name Char
    compute='_compute_peppol_use_parent_company'
  • peppol_use_parent_company Boolean
    compute='_compute_peppol_use_parent_company'
Public methods (9)
  • action_open_peppol_form(self)
  • button_account_peppol_configure_services(self)
  • button_deregister_peppol_participant(self)
    @handle_demo
    Deregister the edi user from Peppol network
  • button_migrate_peppol_registration(self)
    Migrates AWAY from Odoo's SMP. If the user is a receiver, they need to request a migration key, generated on the IAP server. The migration key is then displayed in Peppol settings. Currently, reopening after migrating away is not supported.
  • button_peppol_disconnect_branch_from_parent(self)
  • button_peppol_reregister(self)
  • button_peppol_reset_to_sender(self)
    Reset the participant back to sender and deregister it from the SMP
  • button_peppol_smp_registration(self)
    @handle_demo
    The second (optional) step in Peppol registration. The user can choose to become a Receiver and officially register on the Peppol network, i.e. receive documents from other Peppol participants.
  • button_update_peppol_user_data(self)
    @handle_demo
    Action for the user to be able to update their contact details any time Calls /update_user on the iap server

New fields (5)
  • available_peppol_edi_formats Json
    compute='_compute_available_peppol_edi_formats'
  • available_peppol_sending_methods Json
    compute='_compute_available_peppol_sending_methods'
  • invoice_sending_method Selection
    selection_add=[('peppol', 'by Peppol')]
  • peppol_eas Selection
    selection_add=[('odemo', 'Odoo Demo ID')]
  • peppol_verification_state Selection
    company_dependent=True selection=[('not_verified', 'Unchecked'), ('not_valid', 'Partner is not on Peppol'), ('not_valid_format', 'Partner cannot receive format'), ('valid', 'Partner is on Peppol')] string='Peppol status'
Public methods (3)
  • button_account_peppol_check_partner_endpoint(self, company=None)
    @handle_demo
    A basic check for whether a participant is reachable at the given Peppol participant ID - peppol_eas:peppol_endpoint (ex: '9999:test') The SML (Service Metadata Locator) assigns a DNS name to each peppol participant. This DNS name resolves into the SMP (Service Metadata Publisher) of the participant. The DNS address is of the following form: strip-trailing(base32(sha256(lowercase(ID-VALUE))),"=") + "." + ID-SCHEME + "." + SML-ZONE-NAME The lookup should be done on NAPTR DNS from 2025-11-01 (ref:https://peppol.helger.com/public/locale-en_US/menuitem-docs-doc-exchange)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/account_peppol
VERSION
VERSION 1.0
CATEGORY
CATEGORYAccounting/Accounting
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Xavier Morel, qdp-odoo, Yannick Tivisse, Odoo Online, Laurent Smet, Jorge Pinna Puissant, Anh Thao Pham (pta), Samuel Degueldre, Brice bib Bartoletti, Tiffany Chang (tic), Gorash, Daniel Stenlöv, william-andre, aliya, Pierrot (prro), Thomas Lefebvre (thle), Thomas Becquevort (thbe), Gauthier Wala (gawa), Daniel Kosky (dako), Valentin Vallaeys (vava), Claire Bretton (clbr), Yosua Nicolaus, Antoine Boonen, Dylan Kiss (dyki), Paolo Gatti (pgi), sesn-odoo, guva-odoo, Sven Fuehr, Louis Gobert, Louis (wil), François Degrave, Victorien (viso), Claire (clbr), gteboul, Antoine Dupuis, Victor Miguel Armenta Carrillo, AhmedElemary57, muab-odoo, roto-odoo, Pierre Pulinckx (pipu), Anton Romanova (roan), Corentin Heinix (cohe), Corentin Lombard, Allesio, stra, hatr-odoo, Yassien Ghoniem, Laurent Smet (LAS), Jérôme Belpaire, Ashish Nirmal, GACI Jugurtha
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:07
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account_edi_proxy_client
    - account
    - base_setup
    - base
    - web
    - onboarding
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - account_edi_ubl_cii
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cryptography
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
- Register as a PEPPOL participant
- Send and receive documents via PEPPOL network in Peppol BIS Billing 3.0 format
    

Code Analysis

Views touched (11)
XML IDNameModelTypeStatus
account_journal_dashboard_kanban_view account.journal.dashboard.kanban account.journal data Inherits account.account_journal_dashboard_kanban_view
account_move_send_inherit_account_peppol account.move.send.form.inherit.peppol account.move.send xpath Inherits account.account_move_send_form
account_peppol_view_account_invoice_filter account.invoice.select.inherit account.move xpath Inherits account.view_account_invoice_filter
account_peppol_view_in_invoice_bill_tree_inherit account.out.invoice.tree.inherit account.move field Inherits account.view_in_invoice_tree
account_peppol_view_move_form account.peppol.view.move.form account.move header Inherits account.view_move_form
account_peppol_view_out_credit_note_tree_inherit account.move.credit.note.tree.inherit account.move field Inherits account.view_out_credit_note_tree
account_peppol_view_out_invoice_tree_inherit account.move.in.invoice.tree.inherit account.move field Inherits account.view_out_invoice_tree
mail_notification_layout_with_responsible_signature_and_peppol Mail: mail notification layout with responsible signature (user_id of the record) and Peppol advertisement ir.ui.view qweb Inherits mail.mail_notification_layout_with_responsible_signature
res_config_settings_view_form res.config.settings.view.form.inherit.proxy.user res.config.settings xpath Inherits account.res_config_settings_view_form
res_partner_form_account_peppol res.partner.form.account.peppol res.partner data Inherits account_edi_ubl_cii.view_partner_property_form
res_partner_view_tree res.partner.tree.inherit res.partner xpath Inherits account_edi_ubl_cii.res_partner_view_tree
Models touched (7)

New fields (2)
  • account_peppol_proxy_state Selection
    related='company_id.account_peppol_proxy_state'
  • is_peppol_journal Boolean
    default=False string='Account used for Peppol'
Public methods (3)
  • action_peppol_ready_moves(self)
  • peppol_get_message_status(self)
  • peppol_get_new_documents(self)

New fields (3)
  • peppol_is_demo_uuid Boolean
    compute='_compute_peppol_is_demo_uuid'
  • peppol_message_uuid Char
    string='PEPPOL message ID'
  • peppol_move_state Selection
    compute='_compute_peppol_move_state' copy=False selection=[('ready', 'Ready to send'), ('to_send', 'Queued'), ('skipped', 'Skipped'), ('processing', 'Pending Reception'), ('canceled', 'Canceled'), ('done', 'Done'), ('error', 'Error')] store=True string='PEPPOL status'
Public methods (2)
  • action_cancel_peppol_documents(self)
  • fields_get(self, allfields=None, attributes=None)
    @api.model

New fields (4)
  • account_peppol_edi_mode_info Char
    compute='_compute_account_peppol_edi_mode_info'
  • checkbox_send_peppol Boolean
    compute='_compute_checkbox_send_peppol' help='Send the invoice via PEPPOL' readonly=False store=True string='Send via PEPPOL'
  • enable_peppol Boolean
    compute='_compute_enable_peppol'
  • peppol_warning Char
    compute='_compute_peppol_warning' string='Warning'
Public methods (1)
  • action_send_and_print(self, force_synchronous=False, allow_fallback_pdf=False, **kwargs)

New fields (2)
  • peppol_verification_code Char
    string='SMS verification code'
  • proxy_type Selection
    ondelete={'peppol': 'cascade'} selection_add=[('peppol', 'PEPPOL')]
Public methods (0)

No public methods.

New fields (8)
  • account_peppol_contact_email Char
    compute='_compute_account_peppol_contact_email' help='Primary contact email for Peppol-related communication' readonly=False store=True string='Primary contact email'
  • account_peppol_migration_key Char
    groups='base.group_system' string='Migration Key'
  • account_peppol_phone_number Char
    compute='_compute_account_peppol_phone_number' help='You will receive a verification code to this mobile number' readonly=False store=True string='Mobile number (for validation)'
  • account_peppol_proxy_state Selection
    default='not_registered' required=True selection=[('not_registered', 'Not registered'), ('not_verified', 'Not verified'), ('sent_verification', 'Verification code sent'), ('pending', 'Pending'), ('active', 'Active'), ('sender', 'Can send but not receive'), ('rejected', 'Rejected'), ('canceled', 'Canceled')] string='PEPPOL status'
  • is_account_peppol_participant Boolean
    string='PEPPOL Participant'
  • peppol_eas Selection
    readonly=False related='partner_id.peppol_eas'
  • peppol_endpoint Char
    readonly=False related='partner_id.peppol_endpoint'
  • peppol_purchase_journal_id Many2one → account.journal
    comodel_name='account.journal' compute='_compute_peppol_purchase_journal_id' domain=[('type', '=', 'purchase')] inverse='_inverse_peppol_purchase_journal_id' readonly=False store=True string='PEPPOL Purchase Journal'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (15)
  • account_peppol_contact_email Char
    readonly=False related='company_id.account_peppol_contact_email'
  • account_peppol_eas Selection
    readonly=False related='company_id.peppol_eas'
  • account_peppol_edi_identification Char
    related='account_peppol_edi_user.edi_identification'
  • account_peppol_edi_mode Selection
    compute='_compute_account_peppol_edi_mode' inverse='_inverse_account_peppol_edi_mode' readonly=False selection=[('demo', 'Demo'), ('test', 'Test'), ('prod', 'Live')]
  • account_peppol_edi_user Many2one → account_edi_proxy_client.user
    comodel_name='account_edi_proxy_client.user' compute='_compute_account_peppol_edi_user' string='EDI user'
  • account_peppol_endpoint Char
    readonly=False related='company_id.peppol_endpoint'
  • account_peppol_endpoint_warning Char
    compute='_compute_account_peppol_endpoint_warning' string='Warning'
  • account_peppol_migration_key Char
    readonly=False related='company_id.account_peppol_migration_key'
  • account_peppol_mode_constraint Selection
    compute='_compute_account_peppol_mode_constraint' help='Using the config params, this field specifies which edi modes may be selected from the UI' selection=[('demo', 'Demo'), ('test', 'Test'), ('prod', 'Live')]
  • account_peppol_phone_number Char
    readonly=False related='company_id.account_peppol_phone_number'
  • account_peppol_proxy_state Selection
    readonly=False related='company_id.account_peppol_proxy_state'
  • account_peppol_purchase_journal_id Many2one
    readonly=False related='company_id.peppol_purchase_journal_id'
  • account_peppol_verification_code Char
    readonly=False related='account_peppol_edi_user.peppol_verification_code'
  • is_account_peppol_participant Boolean
    help='Register as a PEPPOL user' readonly=False related='company_id.is_account_peppol_participant' string='Use PEPPOL'
  • peppol_use_parent_company Boolean
    compute='_compute_peppol_use_parent_company'
Public methods (11)
  • button_cancel_peppol_registration(self)
    Sets the peppol registration to not_registered - If the user is active on the SMP, we can't just cancel it. They have to request a migration key using the `button_migrate_peppol_registration` action or deregister. - 'not_registered', 'rejected' proxy states mean that canceling the registration makes no sense, so we don't do it - Calls the IAP server first before setting the state as not_registered on the client side, in case they've been activated on the IAP side in the meantime
  • button_check_peppol_verification_code(self)
    Calls /verify_phone_number to compare user's input and the code generated on the IAP server
  • button_create_peppol_proxy_user(self)
    @handle_demo
    The first step of the Peppol onboarding. - Creates an EDI proxy user on the iap side, then the client side - Calls /activate_participant to mark the EDI user as peppol user - If endpoint is already on Peppol, can register as sender-only after explicit confirmation
  • button_create_peppol_proxy_user_sender_only(self)
    @handle_demo
  • button_deregister_peppol_participant(self)
    @handle_demo
    Deregister the edi user from Peppol network
  • button_migrate_peppol_registration(self)
    @handle_demo
    If the user is active, they need to request a migration key, generated on the IAP server. The migration key is then displayed in Peppol settings. Currently, reopening after migrating away is not supported.
  • button_peppol_register_sender_as_receiver(self)
    @handle_demo
    Promote a sender-only connection back to receiver flow.
  • button_peppol_reset_to_sender(self)
    @handle_demo
    Reset the participant back to sender and deregister it from the SMP.
  • button_send_peppol_verification_code(self)
    Request user verification via SMS Calls the /send_verification_code to send the 6-digit verification code
  • button_update_peppol_user_data(self)
    @handle_demo
    Action for the user to be able to update their contact details any time Calls /update_user on the iap server
  • fields_get(self, allfields=None, attributes=None)
    @api.model

New fields (4)
  • account_peppol_is_endpoint_valid Boolean
    compute='_compute_account_peppol_is_endpoint_valid' copy=False help="The partner's EAS code and PEPPOL endpoint are valid" store=True string='PEPPOL endpoint validity'
  • account_peppol_validity_last_check Date
    compute='_compute_account_peppol_is_endpoint_valid' copy=False help='Last Peppol endpoint verification' store=True string='Checked on'
  • account_peppol_verification_label Selection
    compute='_compute_account_peppol_verification_label' copy=False selection=[('not_verified', 'Unchecked'), ('not_valid', 'Partner is not on Peppol'), ('not_valid_format', 'Partner cannot receive format'), ('valid', 'Partner is on Peppol')] string='Peppol status'
  • is_peppol_edi_format Boolean
    compute='_compute_is_peppol_edi_format'
Public methods (2)
  • button_account_peppol_check_partner_endpoint(self)
    @handle_demo
    A basic check for whether a participant is reachable at the given Peppol participant ID - peppol_eas:peppol_endpoint (ex: '9999:test') The SML (Service Metadata Locator) assigns a DNS name to each peppol participant. This DNS name resolves into the SMP (Service Metadata Publisher) of the participant. The DNS address is of the following form: strip-trailing(base32(sha256(lowercase(ID-VALUE))),"=") + "." + ID-SCHEME + "." + SML-ZONE-NAME The lookup should be done on NAPTR DNS from 2025-11-01 (ref:https://peppol.helger.com/public/locale-en_US/menuitem-docs-doc-exchange)
  • 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/16.0/account_peppol
VERSION
VERSION 1.0
CATEGORY
CATEGORYAccounting/Accounting
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSAlvaro Fuentes, Gauthier Wala (gawa), Sven Fuehr, yosa-odoo, Louis Gobert, François Degrave, Claire (clbr), AhmedElemary57, Ricardo Gomes Rodrigues, roto-odoo, Anton Romanova (roan), Corentin Lombard, Allesio
WEBSITE
WEBSITEhttps://www.odoo.com/documentation/16.0/applications/finance/accounting/customer_invoices/electronic_invoicing.html#peppol
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:50
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account_edi_proxy_client
    - account_edi
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - account_edi_ubl_cii
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cryptography
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
- Register as a PEPPOL participant
- Send and receive documents via PEPPOL network in Peppol BIS Billing 3.0 format
    

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
account_invoice_send_wizard_form_inherit_account_peppol account.invoice.send.form.inherit.peppol account.invoice.send xpath Inherits account.account_invoice_send_wizard_form
account_journal_dashboard_kanban_view account.journal.dashboard.kanban account.journal data Inherits account.account_journal_dashboard_kanban_view
account_peppol_view_account_invoice_filter account.invoice.select.inherit account.move xpath Inherits account.view_account_invoice_filter
account_peppol_view_move_form account.peppol.view.move.form account.move xpath Inherits account.view_move_form
account_peppol_view_out_credit_note_tree_inherit account.move.credit.note.tree.inherit account.move field Inherits account.view_out_credit_note_tree
account_peppol_view_out_invoice_tree_inherit account.move.in.invoice.tree.inherit account.move field Inherits account.view_out_invoice_tree
res_config_settings_view_form res.config.settings.view.form.inherit.proxy.user res.config.settings xpath Inherits account.res_config_settings_view_form
res_partner_form_account_peppol res.partner.form.account.peppol res.partner data Inherits account.view_partner_property_form
res_partner_view_search res.partner.search.inherit res.partner xpath Inherits base.view_res_partner_filter
res_partner_view_tree res.partner.tree.inherit res.partner xpath Inherits base.view_partner_tree
Models touched (9)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • account_peppol_edi_mode_info Char
    compute='_compute_account_peppol_edi_mode_info'
  • checkbox_send_peppol Boolean
    compute='_compute_checkbox_send_peppol' help='Send the invoice via PEPPOL' readonly=False store=True string='Send via PEPPOL'
  • checkbox_send_peppol_readonly Boolean
    compute='_compute_checkbox_send_peppol_readonly'
  • company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_company_id' store=True
  • enable_peppol Boolean
    compute='_compute_enable_peppol'
  • peppol_invoice_ids Many2many → account.move
    comodel_name='account.move' compute='_compute_peppol_invoice_ids' store=True
  • peppol_warning Char
    compute='_compute_peppol_warning' string='Warning'
Public methods (1)
  • send_and_print_action(self)

New fields (2)
  • account_peppol_proxy_state Selection
    related='company_id.account_peppol_proxy_state'
  • is_peppol_journal Boolean
    default=False string='Is journal used for Peppol invoices reception'
Public methods (3)
  • action_peppol_ready_moves(self)
  • peppol_get_message_status(self)
  • peppol_get_new_documents(self)

New fields (3)
  • peppol_is_demo_uuid Boolean
    compute='_compute_peppol_is_demo_uuid'
  • peppol_message_uuid Char
    string='PEPPOL message ID'
  • peppol_move_state Selection
    compute='_compute_peppol_move_state' copy=False selection=[('ready', 'Ready to send'), ('processing', 'Pending Reception'), ('canceled', 'Canceled'), ('done', 'Done'), ('error', 'Error')] store=True string='PEPPOL status'
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 (7)
  • account_peppol_contact_email Char
    compute='_compute_account_peppol_contact_email' groups='base.group_user' help='Primary contact email for Peppol-related communication' readonly=False store=True string='Primary contact email'
  • account_peppol_phone_number Char
    compute='_compute_account_peppol_phone_number' groups='base.group_user' help='You will receive a verification code to this mobile number' readonly=False store=True string='Mobile number (for validation)'
  • account_peppol_proxy_state Selection
    default='not_registered' groups='base.group_user' required=True selection=[('not_registered', 'Not registered'), ('pending', 'Pending'), ('active', 'Active'), ('rejected', 'Rejected'), ('canceled', 'Canceled')] string='PEPPOL status'
  • is_account_peppol_participant Boolean
    groups='base.group_user' string='PEPPOL Participant'
  • peppol_eas Selection
    groups='base.group_user' readonly=False related='partner_id.peppol_eas'
  • peppol_endpoint Char
    groups='base.group_user' readonly=False related='partner_id.peppol_endpoint'
  • peppol_purchase_journal_id Many2one → account.journal
    comodel_name='account.journal' compute='_compute_peppol_purchase_journal_id' domain=[('type', '=', 'purchase')] groups='base.group_user' inverse='_inverse_peppol_purchase_journal_id' readonly=False store=True string='PEPPOL Purchase Journal'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (11)
  • account_peppol_contact_email Char
    readonly=False related='company_id.account_peppol_contact_email'
  • account_peppol_eas Selection
    readonly=False related='company_id.peppol_eas'
  • account_peppol_edi_identification Char
    related='account_peppol_edi_user.edi_identification'
  • account_peppol_edi_mode Selection
    compute='_compute_account_peppol_edi_mode' inverse='_inverse_account_peppol_edi_mode' readonly=False selection=[('demo', 'Demo'), ('test', 'Test'), ('prod', 'Live')]
  • account_peppol_edi_user Many2one → account_edi_proxy_client.user
    comodel_name='account_edi_proxy_client.user' compute='_compute_account_peppol_edi_user' string='EDI user'
  • account_peppol_endpoint Char
    readonly=False related='company_id.peppol_endpoint'
  • account_peppol_endpoint_warning Char
    compute='_compute_account_peppol_endpoint_warning' string='Warning'
  • account_peppol_phone_number Char
    readonly=False related='company_id.account_peppol_phone_number'
  • account_peppol_proxy_state Selection
    readonly=False related='company_id.account_peppol_proxy_state'
  • account_peppol_purchase_journal_id Many2one
    readonly=False related='company_id.peppol_purchase_journal_id'
  • is_account_peppol_participant Boolean
    help='Register as a PEPPOL user' readonly=False related='company_id.is_account_peppol_participant' string='Use PEPPOL'
Public methods (4)
  • button_cancel_peppol_registration(self)
    Sets the peppol registration to not_registered - If the user is active on the SMP, we can't just cancel it. They have to deregister. - 'not_registered', 'rejected' proxy states mean that canceling the registration makes no sense, so we don't do it - Calls the IAP server first before setting the state as not_registered on the client side, in case they've been activated on the IAP side in the meantime
  • button_create_peppol_proxy_user(self)
    @handle_demo
    The first step of the Peppol onboarding. - Creates an EDI proxy user on the iap side, then the client side - Calls /activate_participant to mark the EDI user as peppol user
  • button_deregister_peppol_participant(self)
    @handle_demo
    Deregister the edi user from Peppol network
  • button_update_peppol_user_data(self)
    @handle_demo
    Action for the user to be able to update their contact details any time Calls /update_user on the iap server

New fields (6)
  • account_peppol_is_endpoint_valid Boolean
    compute='_compute_account_peppol_is_endpoint_valid' copy=False help="The partner's EAS code and PEPPOL endpoint are valid" store=True string='PEPPOL endpoint validity'
  • account_peppol_validity_last_check Date
    compute='_compute_account_peppol_is_endpoint_valid' copy=False help='Last Peppol endpoint verification' store=True string='Checked on'
  • account_peppol_verification_label Selection
    compute='_compute_account_peppol_verification_label' copy=False selection=[('not_verified', 'Unchecked'), ('not_valid', 'Partner is not on Peppol'), ('not_valid_format', 'Partner cannot receive format'), ('valid', 'Partner is on Peppol')] string='Peppol status'
  • peppol_eas Selection
    compute='_compute_peppol_eas' help='Code used to identify the Endpoint for BIS Billing 3.0 and its derivatives.\n List available at https://docs.peppol.eu/poacc/billing/3.0/codelist/eas/' readonly=False selection=[('0002', '0002 - System Information et Repertoire des Entreprise et des Etablissements: SIRENE'), ('0007', '0007 - Organisationsnummer (Swedish legal entities)'), ('0009', '0009 - SIRET-CODE'), ('0037', '0037 - LY-tunnus'), ('0060', '0060 - Data Universal Numbering System (D-U-N-S Number)'), ('0088', '0088 - EAN Location Code'), ('0096', '0096 - DANISH CHAMBER OF COMMERCE Scheme (EDIRA compliant)'), ('0097', '0097 - FTI - Ediforum Italia, (EDIRA compliant)'), ('0106', '0106 - Association of Chambers of Commerce and Industry in the Netherlands, (EDIRA compliant)'), ('0130', '0130 - Directorates of the European Commission'), ('0135', '0135 - SIA Object Identifiers'), ('0142', '0142 - SECETI Object Identifiers'), ('0151', '0151 - Australian Business Number (ABN) Scheme'), ('0183', '0183 - Swiss Unique Business Identification Number (UIDB)'), ('0184', '0184 - DIGSTORG'), ('0188', '0188 - Corporate Number of The Social Security and Tax Number System'), ('0190', "0190 - Dutch Originator's Identification Number"), ('0191', '0191 - Centre of Registers and Information Systems of the Ministry of Justice'), ('0192', '0192 - Enhetsregisteret ved Bronnoysundregisterne'), ('0193', '0193 - UBL.BE party identifier'), ('0195', '0195 - Singapore UEN identifier'), ('0196', '0196 - Kennitala - Iceland legal id for individuals and legal entities'), ('0198', '0198 - ERSTORG'), ('0199', '0199 - Legal Entity Identifier (LEI)'), ('0200', '0200 - Legal entity code (Lithuania)'), ('0201', '0201 - Codice Univoco Unità Organizzativa iPA'), ('0202', '0202 - Indirizzo di Posta Elettronica Certificata'), ('0204', '0204 - Leitweg-ID'), ('0208', "0208 - Numero d'entreprise / ondernemingsnummer / Unternehmensnummer"), ('0209', '0209 - GS1 identification keys'), ('0210', '0210 - CODICE FISCALE'), ('0211', '0211 - PARTITA IVA'), ('0212', '0212 - Finnish Organization Identifier'), ('0213', '0213 - Finnish Organization Value Add Tax Identifier'), ('0215', '0215 - Net service ID'), ('0216', '0216 - OVTcode'), ('0218', '0218 - Unified registration number (Latvia)'), ('0221', '0221 - The registered number of the qualified invoice issuer (Japan)'), ('0225', '0225 - FRCTC Electronic Address (France)'), ('0230', '0230 - National e-Invoicing Framework (Malaysia)'), ('0235', '0235 - UAE Tax Identification Number (TIN)'), ('0240', '0240 - Register of legal persons (France)'), ('9901', '9901 - Danish Ministry of the Interior and Health'), ('9910', '9910 - Hungary VAT number'), ('9913', '9913 - Business Registers Network'), ('9914', '9914 - Österreichische Umsatzsteuer-Identifikationsnummer'), ('9915', '9915 - Österreichisches Verwaltungs bzw. Organisationskennzeichen'), ('9918', '9918 - SOCIETY FOR WORLDWIDE INTERBANK FINANCIAL, TELECOMMUNICATION S.W.I.F.T'), ('9919', '9919 - Kennziffer des Unternehmensregisters'), ('9920', '9920 - Agencia Española de Administración Tributaria'), ('9922', '9922 - Andorra VAT number'), ('9923', '9923 - Albania VAT number'), ('9924', '9924 - Bosnia and Herzegovina VAT number'), ('9925', '9925 - Belgium VAT number'), ('9926', '9926 - Bulgaria VAT number'), ('9927', '9927 - Switzerland VAT number'), ('9928', '9928 - Cyprus VAT number'), ('9929', '9929 - Czech Republic VAT number'), ('9930', '9930 - Germany VAT number'), ('9931', '9931 - Estonia VAT number'), ('9932', '9932 - United Kingdom VAT number'), ('9933', '9933 - Greece VAT number'), ('9934', '9934 - Croatia VAT number'), ('9935', '9935 - Ireland VAT number'), ('9936', '9936 - Liechtenstein VAT number'), ('9937', '9937 - Lithuania VAT number'), ('9938', '9938 - Luxemburg VAT number'), ('9939', '9939 - Latvia VAT number'), ('9940', '9940 - Monaco VAT number'), ('9941', '9941 - Montenegro VAT number'), ('9942', '9942 - Macedonia, the former Yugoslav Republic of VAT number'), ('9943', '9943 - Malta VAT number'), ('9944', '9944 - Netherlands VAT number'), ('9945', '9945 - Poland VAT number'), ('9946', '9946 - Portugal VAT number'), ('9947', '9947 - Romania VAT number'), ('9948', '9948 - Serbia VAT number'), ('9949', '9949 - Slovenia VAT number'), ('9950', '9950 - Slovakia VAT number'), ('9951', '9951 - San Marino VAT number'), ('9952', '9952 - Türkiye VAT number'), ('9953', '9953 - Holy See (Vatican City State) VAT number'), ('9955', '9955 - Swedish VAT number'), ('9957', '9957 - French VAT number'), ('9959', '9959 - Employer Identification Number (EIN, USA)'), ('AN', 'AN - O.F.T.P. (ODETTE File Transfer Protocol)'), ('AQ', 'AQ - X.400 address for mail text'), ('AS', 'AS - AS2 exchange'), ('AU', 'AU - File Transfer Protocol'), ('EM', 'EM - Electronic mail')] store=True string='Peppol e-address (EAS)' tracking=True
  • peppol_endpoint Char
    compute='_compute_peppol_endpoint' help="Unique identifier used by the BIS Billing 3.0 and its derivatives, also known as 'Endpoint ID'." readonly=False store=True string='Peppol Endpoint' tracking=True
  • ubl_cii_format Selection
    compute='_compute_ubl_cii_format' readonly=False selection=[('ubl_bis3', 'BIS Billing 3.0'), ('xrechnung', 'XRechnung CIUS'), ('nlcius', 'NLCIUS')] store=True string='Format'
Public methods (1)
  • button_account_peppol_check_partner_endpoint(self)
    @handle_demo
    A basic check for whether a participant is reachable at the given Peppol participant ID - peppol_eas:peppol_endpoint (ex: '9999:test') The SML (Service Metadata Locator) assigns a DNS name to each peppol participant. This DNS name resolves into the SMP (Service Metadata Publisher) of the participant. The DNS address is of the following form: strip-trailing(base32(sha256(lowercase(ID-VALUE))),"=") + "." + ID-SCHEME + "." + SML-ZONE-NAME The lookup should be done on NAPTR DNS from 2025-11-01 (ref:https://peppol.helger.com/public/locale-en_US/menuitem-docs-doc-exchange)