TIP: You can type at any time to perform a new search.
Peppol
account_peppol · odoo/odoo
Security findings
Migration considerations
- Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_attachment SET res_id = NULL WHERE id IN %s` - re-check the table/column names still match after upgrading. migration-raw-sql-write · source
Migration review checklist, not a compatibility verdict. No target version is selected: apply version-specific advice only when migrating to that version or later.
- Repository
- odoo/odoo · module folder
- Module version
- 1.2
- Category
- Accounting/Accounting
- Folder size
- 5.11 MB
- License
- LGPL-3
- Application
- No
- Auto-installable
- Yes
- Website
- None
- Last tracking update
- 2026-10-05 00:19:50
- Authors
- Odoo S.A.
- Maintainers
- Odoo S.A.
- Committers
- Xavier Morel, Raphael Collet, Thibault Delavallée, odoo, Josse Colpaert, Odoo Translation Bot, Christophe Matthieu, Jorge Pinna Puissant, Julien Mougenot, Anh Thao Pham (pta), Tiffany Chang (tic), william-andre, assellalou, Antoine Vandevenne (anv), luvi, Pierrot (prro), Thomas Becquevort (thbe), amdi-odoo, Gauthier Wala (gawa), Dylan Kiss (dyki), Paolo Gatti, Antoine Boonen, Paolo Gatti (pgi), Chong Wang (cwg), Harsh Modi, Zeel Patel, Aurelien MARIE (auma), Sven Fuehr, kcv-odoo, Louis Gobert, hatr-odoo, Claire (clbr), Antoine Dupuis, Saif (segn), Victor Miguel Armenta Carrillo, roto-odoo, Anton Romanova (roan), Corentin Heinix (cohe), Allesio, Corentin Lombard, anko-odoo, Krzysztof Magusiak (krma), Guillaume V, Ester Andreetto, bhra-odoo, Yassien Ghoniem, Jugurtha, times-odoo, Jeanne Delneste, Laurent Smet (LAS), Julien Launois (jula), Jérôme Belpaire, Martin Doyen, h4818, Ashish Nirmal, Ayush Modi, Nisarg (nipl), Lionel Piraux (lipi), GACI Jugurtha, Arnav Varshney, Sudarshan Maity (sumai), Zachary (zavan), Kadam Darji, Jérémy Bazin (baje), soza-odoo, Kyrillos, Jean Schoenlaub
- Odoo dependencies
- Python dependencies
- phonenumbers
- System dependencies
- None
- Required by
- l10n_fr_pdp, l10n_sg
- Description
- Register as a Peppol participant - Send and receive documents via Peppol network in Peppol BIS Billing 3.0 format
Code Analysis
Views touched (12)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
account_peppol_rejection_wizard_view_form |
account.peppol.rejection.wizard.view.form | account.peppol.rejection.wizard | form | New |
account_peppol_response_view_form |
account.peppol.response.view.form | account.peppol.response | form | New |
account_peppol_response_view_list |
account.peppol.response.view.list | account.peppol.response | list | New |
account_peppol_view_account_invoice_filter |
account.invoice.select.inherit | account.move | Inherits account.view_account_invoice_filter | |
account_peppol_view_move_form |
account.peppol.view.move.form | account.move | form | Inherits account.view_move_form |
account_peppol_view_out_credit_note_tree_inherit |
account.move.credit.note.list.inherit | account.move | list | Inherits account.view_out_credit_note_tree |
account_peppol_view_out_invoice_tree_inherit |
account.move.out.invoice.list.inherit | account.move | list | 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_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 | form | Inherits account.res_config_settings_view_form |
res_partner_form_account_peppol |
res.partner.form.account.peppol | res.partner | form | Inherits account_edi_ubl_cii.view_partner_property_form |
HTTP endpoints (5)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/peppol/authentication/callback |
PeppolAuthentication.peppol_authentication_callback |
user | http | GET | sudo |
/peppol/authentication/webhook |
PeppolAuthentication.peppol_authentication_webhook |
public | http | POST | csrf off sudo |
/peppol/webhook/message-state-update |
PeppolWebhookController.webhook_message_update |
public | http | POST | csrf off sudo |
/peppol/webhook/new-message |
PeppolWebhookController.webhook_new_message |
public | http | POST | csrf off sudo |
/peppol/webhook/user-state-update |
PeppolWebhookController.webhook_user_update |
public | http | POST | csrf off sudo |
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 (2)
-
account_peppol_proxy_stateSelectionrelated='company_id.account_peppol_proxy_state' -
is_peppol_journalBooleandefault=Falsestring='Account used for Peppol'
-
button_fetch_in_einvoices(self) -
button_refresh_out_einvoices_status(self)
New fields (5)
-
peppol_can_send_responseBooleancompute='_compute_peppol_can_send_response' -
peppol_is_sentBooleancompute='_compute_peppol_is_sent' -
peppol_message_uuidCharcopy=Falseindex='btree_not_null'string='Peppol message ID' -
peppol_move_stateSelectioncompute='_compute_peppol_move_state'copy=Falseselection=[('ready', 'Ready to send'), ('to_send', 'Queued'), ('processing', 'Pending Reception'), ('done', 'Done'), ('AB', 'Received'), ('AP', 'Approved'), ('RE', 'Rejected'), ('error', 'Error')]store=Truestring='Peppol status' -
peppol_response_idsOne2many → account.peppol.responseargs: 'account.peppol.response', 'move_id'
-
action_cancel_peppol_documents(self) -
action_open_peppol_reponses(self) -
action_peppol_cancel_and_remove_sequence(self) -
action_peppol_open_rejection_wizard(self) -
action_peppol_reset_documents(self, ids_to_delete=None) -
action_peppol_send_approval_response(self) -
action_send_and_print(self) -
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 (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 (4)
-
codeChar -
descriptionChar -
list_identifierSelectionstring='List identifier' args: [('OPStatusReason', 'OPStatusReason'), ('OPStatusAction', 'OPStatusAction')] -
nameChar
No public methods.
New fields (3)
-
action_idsMany2many → account.peppol.clarificationcomodel_name='account.peppol.clarification'domain="[('list_identifier', '=', 'OPStatusAction')]"help="The actions to be suggested to the document's sender in order for the document to be accepted when sent again (eventually). These will be sent to the document's sender. Not mandatory."relation='account_peppol_rejection_action_rel'string='Rejection actions' -
move_idsMany2many → account.movecomodel_name='account.move'required=True -
reason_idsMany2many → account.peppol.clarificationcomodel_name='account.peppol.clarification'default=<expr>domain="[('list_identifier', '=', 'OPStatusReason')]"help="The reasons to reject the received PEPPOL document. These will be sent to the document's sender."relation='account_peppol_rejection_reason_rel'required=Truestring='Rejection reasons'
-
button_send(self)
New fields (5)
-
company_idMany2onerelated='move_id.company_id' -
move_idMany2one → account.moveindex='btree_not_null'ondelete='cascade' args: 'account.move' -
peppol_message_uuidCharindex='btree_not_null'string='Peppol UUID' -
peppol_stateSelectionselection=[('processing', 'Pending Reception'), ('done', 'Done'), ('error', 'Error'), ('not_serviced', 'Not Serviced')]string='Peppol status' -
response_codeSelectionrequired=Trueselection=[('AB', 'Acknowledgement'), ('IP', 'In Process'), ('UQ', 'Under query'), ('CA', 'Conditionally accepted'), ('RE', 'Rejection'), ('AP', 'Approval'), ('PD', 'Paid')]
No public methods.
New fields (1)
-
proxy_typeSelectionondelete={'peppol': 'cascade'}selection_add=[('peppol', 'Peppol')]
No public methods.
New fields (21)
-
account_peppol_proxy_stateSelectionrelated='company_id.account_peppol_proxy_state' -
company_idMany2one → res.companycomodel_name='res.company'default=<expr>required=True -
contact_emailCharreadonly=Falserelated='selected_company_id.account_peppol_contact_email'required=True -
display_itsme_loginBooleancompute='_compute_peppol_can_connect_data' -
display_no_auth_buttonsBooleancompute='_compute_peppol_can_connect_data' -
display_use_parent_connection_selectionBooleancompute='_compute_display_use_parent_connection_selection' -
edi_modeSelectioncompute='_compute_edi_mode'selection=[('demo', 'Demo'), ('test', 'Test'), ('prod', 'Live')]string='EDI mode' -
edi_user_idMany2one → account_edi_proxy_client.usercomodel_name='account_edi_proxy_client.user'compute='_compute_edi_user_id'string='EDI user' -
parent_company_idMany2one → res.companycomodel_name='res.company'compute='_compute_parent_company_id' -
parent_company_nameCharrelated='parent_company_id.name' -
peppol_can_connect_dataJsoncompute='_compute_peppol_can_connect_data' -
peppol_easSelectioncompute='_compute_peppol_eas_endpoint'readonly=Falseselection='_get_peppol_eas_selection'store=True -
peppol_endpointCharcompute='_compute_peppol_eas_endpoint'readonly=Falsestore=True -
peppol_external_providerCharcompute='_compute_smp_registration_external_provider' -
peppol_identifierCharcompute='_compute_peppol_identifier' -
peppol_warningsJsoncompute='_compute_peppol_warnings'string='Peppol warnings' -
phone_numberCharreadonly=Falserelated='selected_company_id.account_peppol_phone_number' -
selected_company_idMany2one → res.companycomodel_name='res.company'compute='_compute_selected_company_id' -
smp_registrationBooleancompute='_compute_smp_registration_external_provider'string='Register as a receiver' -
use_parent_connectionBooleancompute='_compute_use_parent_connection' -
use_parent_connection_selectionSelectioncompute='_compute_use_parent_connection_selection'readonly=Falseselection=[('use_parent', 'Send from parent company'), ('use_self', 'Register this company on peppol')]store=True
-
button_register_peppol_participant(self, selected_auth=None) -
button_register_with_itsme(self)
New fields (11)
-
account_peppol_contact_emailCharcompute='_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=Falsestore=Truestring='Primary contact email' -
account_peppol_edi_userMany2one → account_edi_proxy_client.usercomodel_name='account_edi_proxy_client.user'compute='_compute_account_peppol_edi_user' -
account_peppol_migration_keyChargroups='base.group_system'string='Migration Key' -
account_peppol_phone_numberCharcompute='_compute_account_peppol_phone_number'help='This number is used for identification purposes only.'readonly=Falsestore=Truestring='Mobile number' -
account_peppol_proxy_stateSelectiondefault='not_registered'required=Trueselection=[('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_can_sendBooleancompute='_compute_peppol_can_send' -
peppol_external_providerChartracking=True -
peppol_metadataJsonstring='Peppol Metadata' -
peppol_metadata_updated_atDatetimestring='Peppol meta updated at' -
peppol_parent_company_idMany2one → res.companycomodel_name='res.company'compute='_compute_peppol_parent_company_id' -
peppol_purchase_journal_idMany2one → account.journalcomodel_name='account.journal'compute='_compute_peppol_purchase_journal_id'domain=[('type', '=', 'purchase')]inverse='_inverse_peppol_purchase_journal_id'readonly=Falsestore=Truestring='Peppol Purchase Journal'
No public methods.
New fields (16)
-
account_is_token_out_of_syncBooleanreadonly=Falserelated='account_peppol_edi_user.is_token_out_of_sync' -
account_peppol_contact_emailCharcompute='_compute_account_peppol_contact_email'inverse='_inverse_account_peppol_contact_email' -
account_peppol_edi_identificationCharrelated='account_peppol_edi_user.edi_identification' -
account_peppol_edi_modeSelectionrelated='account_peppol_edi_user.edi_mode' -
account_peppol_edi_userMany2onerelated='company_id.account_peppol_edi_user' -
account_peppol_migration_keyCharreadonly=Falserelated='company_id.account_peppol_migration_key' -
account_peppol_phone_numberCharreadonly=Falserelated='company_id.account_peppol_phone_number' -
account_peppol_proxy_stateSelectionreadonly=Falserelated='company_id.account_peppol_proxy_state' -
account_peppol_purchase_journal_idMany2onereadonly=Falserelated='company_id.peppol_purchase_journal_id' -
peppol_external_providerCharreadonly=Falserelated='company_id.peppol_external_provider' -
peppol_parent_company_nameCharcompute='_compute_peppol_use_parent_company' -
peppol_participation_roleSelectioncompute='_compute_peppol_participation_role'inverse='_inverse_peppol_participation_role'selection=[('sending_and_receiving', 'Sending & Receiving'), ('sending_only', 'Sending Only')] -
peppol_purchase_journal_requiredBooleancompute='_compute_peppol_purchase_journal_required' -
peppol_use_parent_companyBooleancompute='_compute_peppol_use_parent_company' -
routing_endpointCharreadonly=Falserelated='company_id.partner_id.routing_endpoint'string='Routing Endpoint' -
routing_schemeSelectionreadonly=Falserelated='company_id.partner_id.routing_scheme'string='Routing Scheme'
-
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_peppol_deregister(self)Unregister the user from Peppol network. -
button_peppol_disconnect_branch_from_parent(self) -
button_peppol_reregister(self) -
button_reconnect_this_database(self)Re-establish an out-of-sync connection
New fields (7)
-
available_peppol_edi_formatsJsoncompute='_compute_available_peppol_edi_formats' -
available_peppol_sending_methodsJsoncompute='_compute_available_peppol_sending_methods' -
invoice_sending_methodSelectionselection_add=[('peppol', 'by Peppol')] -
peppol_response_supportBooleancompute='_compute_response_support' args: 'Peppol Response Service' -
peppol_supported_documentsJsonargs: 'Supported Peppol Documents' -
peppol_verification_stateSelectioncompany_dependent=Trueselection=[('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' -
routing_schemeSelectionselection_add=[('odemo', 'Odoo Demo ID')]
-
button_account_peppol_check_partner_endpoint(self, company=None)A basic check for whether a participant is reachable at the explicit routing identifier (``routing_scheme:routing_endpoint``). The SML (Service Metadata Locator) assigns a DNS name to each Peppol participant, which resolves into the participant's SMP (Service Metadata Publisher). -
create(self, vals_list)@api.model_create_multi
Loading…
Loading…
Loading…
Loading…