Denmark EDI - Nemhandel

l10n_dk_nemhandel
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/l10n_dk_nemhandel
VERSION
VERSION 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, william-andre, Florian Gilbert, Pierrot (prro), Gauthier Wala (gawa), Dylan Kiss (dyki), Sven Fuehr, Claire (clbr), Léo Gizard, dvsh-odoo, igbe, Mongy (abmn), Laurent Smet (LAS), matd-odoo, steji, smjo-odoo, Adham Abdeltawab
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:40
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
    - l10n_dk
    - base_iban
    - base_vat
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
        - Send and receive documents via Nemhandel network in OIOUBL 2.1 format
    

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
account_journal_dashboard_kanban_view account.journal.dashboard.kanban account.journal data Inherits account.account_journal_dashboard_kanban_view
l10n_dk_nemhandel_view_move_form l10n.dk.nemhandel.view.move.form account.move header Inherits account.view_move_form
nemhandel_registration_form nemhandel.registration.form nemhandel.registration form New
nemhandel_view_account_invoice_filter account.invoice.select.inherit account.move xpath Inherits account.view_account_invoice_filter
nemhandel_view_out_credit_note_tree_inherit account.move.credit.note.tree.inherit account.move field Inherits account.view_out_credit_note_tree
nemhandel_view_out_invoice_tree_inherit account.move.out.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_l10n_dk_nemhandel res.partner.form.l10n.dk.nemhandel res.partner data Inherits account_edi_ubl_cii.view_partner_property_form
Models touched (11)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • is_nemhandel_journal Boolean
    string='Journal used for Nemhandel'
  • l10n_dk_nemhandel_proxy_state Selection
    related='company_id.l10n_dk_nemhandel_proxy_state'
Public methods (2)
  • button_fetch_in_einvoices(self)
  • button_refresh_out_einvoices_status(self)

New fields (2)
  • nemhandel_message_uuid Char
    copy=False string='Nemhandel message ID'
  • nemhandel_move_state Selection
    compute='_compute_nemhandel_move_state' copy=False selection=[('ready', 'Ready to send'), ('to_send', 'Queued'), ('processing', 'Pending Reception'), ('done', 'Done'), ('error', 'Error')] store=True string='Nemhandel status'
Public methods (2)
  • action_cancel_nemhandel_documents(self)
  • action_send_and_print(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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)
  • nemhandel_verification_code Char
    string='Nemhandel SMS verification code'
  • proxy_type Selection
    ondelete={'nemhandel': 'cascade'} selection_add=[('nemhandel', 'Nemhandel')]
Public methods (0)

No public methods.

New fields (9)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True
  • contact_email Char
    readonly=False related='company_id.nemhandel_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_user_id Many2one → account_edi_proxy_client.user
    comodel_name='account_edi_proxy_client.user' compute='_compute_edi_user_id' string='EDI user'
  • identifier_type Selection
    readonly=False related='company_id.nemhandel_identifier_type' required=True
  • identifier_value Char
    readonly=False related='company_id.nemhandel_identifier_value' required=True
  • l10n_dk_nemhandel_proxy_state Selection
    readonly=False related='company_id.l10n_dk_nemhandel_proxy_state'
  • phone_number Char
    inverse='_inverse_phone_number' readonly=False related='company_id.nemhandel_phone_number'
  • verification_code Char
    readonly=False related='edi_user_id.nemhandel_verification_code'
Public methods (6)
  • button_check_nemhandel_verification_code(self)
    @handle_demo
    Calls /verify_phone_number to compare user's input and the code generated on the IAP server
  • button_deregister_nemhandel_participant(self)
    @handle_demo
    Deregister the edi user from Nemhandel network
  • button_nemhandel_receiver_registration(self)
    @handle_demo
    The user is registered on the Nemhandel network, i.e. can receive documents from other Nemhandel participants.
  • button_nemhandel_registration_sms(self)
    @handle_demo
    The first step of the Nemhandel onboarding. - Creates an EDI proxy user on the iap side, then the client side - Calls /activate_participant to mark the EDI user as nemhandel user - Sends an SMS code
  • button_update_nemhandel_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
  • send_nemhandel_verification_code(self)
    Request user verification via SMS Calls the /send_verification_code to activate the participant and send the 6-digit verification code

New fields (7)
  • l10n_dk_nemhandel_proxy_state Selection
    default='not_registered' required=True selection=[('not_registered', 'Not registered'), ('in_verification', 'In verification'), ('receiver', 'Can send and receive'), ('rejected', 'Rejected')] string='Nemhandel status'
  • nemhandel_contact_email Char
    compute='_compute_nemhandel_contact_email' help='Primary contact email for Nemhandel-related communication' readonly=False store=True string='Nemhandel Contact email'
  • nemhandel_edi_user Many2one → account_edi_proxy_client.user
    comodel_name='account_edi_proxy_client.user' compute='_compute_nemhandel_edi_user'
  • nemhandel_identifier_type Selection
    readonly=False related='partner_id.nemhandel_identifier_type'
  • nemhandel_identifier_value Char
    readonly=False related='partner_id.nemhandel_identifier_value'
  • nemhandel_phone_number Char
    compute='_compute_nemhandel_phone_number' help='You will receive a verification code to this phone number' readonly=False store=True string='Nemhandel Phone number (for validation)'
  • nemhandel_purchase_journal_id Many2one → account.journal
    comodel_name='account.journal' compute='_compute_nemhandel_purchase_journal_id' domain=[('type', '=', 'purchase')] readonly=False store=True string='Nemhandel Purchase Journal'
Public methods (0)

No public methods.

New fields (9)
  • l10n_dk_nemhandel_proxy_state Selection
    readonly=False related='company_id.l10n_dk_nemhandel_proxy_state'
  • nemhandel_contact_email Char
    readonly=False related='company_id.nemhandel_contact_email'
  • nemhandel_edi_identification Char
    related='nemhandel_edi_user.edi_identification' string='Nemhandel identification'
  • nemhandel_edi_mode Selection
    related='nemhandel_edi_user.edi_mode' string='Nemhandel EDI operating mode'
  • nemhandel_edi_user Many2one
    related='company_id.nemhandel_edi_user'
  • nemhandel_identifier_type Selection
    readonly=False related='company_id.nemhandel_identifier_type'
  • nemhandel_identifier_value Char
    readonly=False related='company_id.nemhandel_identifier_value'
  • nemhandel_phone_number Char
    readonly=False related='company_id.nemhandel_phone_number'
  • nemhandel_purchase_journal_id Many2one
    readonly=False related='company_id.nemhandel_purchase_journal_id'
Public methods (3)
  • action_open_nemhandel_form(self)
  • button_deregister_nemhandel_participant(self)
    @handle_demo
    Deregister the edi user from Nemhandel network
  • button_update_nemhandel_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)
  • invoice_edi_format Selection
    selection_add=[('oioubl_21', 'OIOUBL 2.1')]
  • invoice_sending_method Selection
    selection_add=[('nemhandel', 'By Nemhandel')]
  • is_using_nemhandel Boolean
    compute='_compute_is_using_nemhandel'
  • nemhandel_identifier_type Selection
    compute='_compute_nemhandel_identifier_type' help='Unique identifier used by OIOUBL and Nemhandel' readonly=False selection=[('0088', 'EAN/GLN'), ('0184', 'CVR'), ('9918', 'IBAN'), ('0198', 'SE')] store=True string='Nemhandel Endpoint Type' tracking=True
  • nemhandel_identifier_value Char
    compute='_compute_nemhandel_identifier_value' help='Code used to identify the Endpoint on Nemhandel' readonly=False store=True string='Nemhandel Endpoint' tracking=True
  • nemhandel_verification_state Selection
    company_dependent=True selection=[('not_verified', 'Not verified yet'), ('not_valid', 'Not on Nemhandel'), ('valid', 'Valid')] string='Nemhandel endpoint verification'
Public methods (3)
  • button_nemhandel_check_partner_endpoint(self, company=None)
    @handle_demo
    A basic check for whether a participant is reachable at the given identifier_type and identifier_value
  • 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/18.0/l10n_dk_nemhandel
VERSION
VERSION 1.0
CATEGORY
CATEGORYAccounting/Localizations/EDI
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Jairo Llopis, Miquel Raïch, william-andre, Pierrot (prro), Gauthier Wala (gawa), Dylan Kiss (dyki), Sven Fuehr, Louis Gobert, Claire (clbr), Léo Gizard, dvsh-odoo, igbe, malb, steji, smjo-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 20:13:50
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
    - l10n_dk
    - base_iban
    - base_vat
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cryptography
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
        - Send and receive documents via Nemhandel network in OIOUBL 2.1 format
    

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
account_journal_dashboard_kanban_view account.journal.dashboard.kanban account.journal data Inherits account.account_journal_dashboard_kanban_view
l10n_dk_nemhandel_view_move_form l10n.dk.nemhandel.view.move.form account.move header Inherits account.view_move_form
nemhandel_registration_form nemhandel.registration.form nemhandel.registration form New
nemhandel_view_account_invoice_filter account.invoice.select.inherit account.move xpath Inherits account.view_account_invoice_filter
nemhandel_view_out_credit_note_tree_inherit account.move.credit.note.tree.inherit account.move field Inherits account.view_out_credit_note_tree
nemhandel_view_out_invoice_tree_inherit account.move.out.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_l10n_dk_nemhandel res.partner.form.l10n.dk.nemhandel res.partner data Inherits account_edi_ubl_cii.view_partner_property_form
Models touched (11)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • is_nemhandel_journal Boolean
    string='Journal used for Nemhandel'
  • l10n_dk_nemhandel_proxy_state Selection
    related='company_id.l10n_dk_nemhandel_proxy_state'
Public methods (2)
  • nemhandel_get_message_status(self)
  • nemhandel_get_new_documents(self)

New fields (2)
  • nemhandel_message_uuid Char
    copy=False string='Nemhandel message ID'
  • nemhandel_move_state Selection
    compute='_compute_nemhandel_move_state' copy=False selection=[('ready', 'Ready to send'), ('to_send', 'Queued'), ('processing', 'Pending Reception'), ('done', 'Done'), ('error', 'Error')] store=True string='Nemhandel status'
Public methods (1)
  • action_cancel_nemhandel_documents(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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)
  • nemhandel_verification_code Char
    string='Nemhandel SMS verification code'
  • proxy_type Selection
    ondelete={'nemhandel': 'cascade'} selection_add=[('nemhandel', 'Nemhandel')]
Public methods (0)

No public methods.

New fields (9)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True
  • contact_email Char
    readonly=False related='company_id.nemhandel_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_user_id Many2one → account_edi_proxy_client.user
    comodel_name='account_edi_proxy_client.user' compute='_compute_edi_user_id' string='EDI user'
  • identifier_type Selection
    readonly=False related='company_id.nemhandel_identifier_type' required=True
  • identifier_value Char
    readonly=False related='company_id.nemhandel_identifier_value' required=True
  • l10n_dk_nemhandel_proxy_state Selection
    readonly=False related='company_id.l10n_dk_nemhandel_proxy_state'
  • phone_number Char
    inverse='_inverse_phone_number' readonly=False related='company_id.nemhandel_phone_number'
  • verification_code Char
    readonly=False related='edi_user_id.nemhandel_verification_code'
Public methods (6)
  • button_check_nemhandel_verification_code(self)
    @handle_demo
    Calls /verify_phone_number to compare user's input and the code generated on the IAP server
  • button_deregister_nemhandel_participant(self)
    @handle_demo
    Deregister the edi user from Nemhandel network
  • button_nemhandel_receiver_registration(self)
    @handle_demo
    The user is registered on the Nemhandel network, i.e. can receive documents from other Nemhandel participants.
  • button_nemhandel_registration_sms(self)
    @handle_demo
    The first step of the Nemhandel onboarding. - Creates an EDI proxy user on the iap side, then the client side - Calls /activate_participant to mark the EDI user as nemhandel user - Sends an SMS code
  • button_update_nemhandel_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
  • send_nemhandel_verification_code(self)
    Request user verification via SMS Calls the /send_verification_code to activate the participant and send the 6-digit verification code

New fields (7)
  • l10n_dk_nemhandel_proxy_state Selection
    default='not_registered' required=True selection=[('not_registered', 'Not registered'), ('in_verification', 'In verification'), ('receiver', 'Can send and receive'), ('rejected', 'Rejected')] string='Nemhandel status'
  • nemhandel_contact_email Char
    compute='_compute_nemhandel_contact_email' help='Primary contact email for Nemhandel-related communication' readonly=False store=True string='Nemhandel Contact email'
  • nemhandel_edi_user Many2one → account_edi_proxy_client.user
    comodel_name='account_edi_proxy_client.user' compute='_compute_nemhandel_edi_user'
  • nemhandel_identifier_type Selection
    readonly=False related='partner_id.nemhandel_identifier_type'
  • nemhandel_identifier_value Char
    readonly=False related='partner_id.nemhandel_identifier_value'
  • nemhandel_phone_number Char
    compute='_compute_nemhandel_phone_number' help='You will receive a verification code to this phone number' readonly=False store=True string='Nemhandel Phone number (for validation)'
  • nemhandel_purchase_journal_id Many2one → account.journal
    comodel_name='account.journal' compute='_compute_nemhandel_purchase_journal_id' domain=[('type', '=', 'purchase')] readonly=False store=True string='Nemhandel Purchase Journal'
Public methods (0)

No public methods.

New fields (9)
  • l10n_dk_nemhandel_proxy_state Selection
    readonly=False related='company_id.l10n_dk_nemhandel_proxy_state'
  • nemhandel_contact_email Char
    readonly=False related='company_id.nemhandel_contact_email'
  • nemhandel_edi_identification Char
    related='nemhandel_edi_user.edi_identification' string='Nemhandel identification'
  • nemhandel_edi_mode Selection
    related='nemhandel_edi_user.edi_mode' string='Nemhandel EDI operating mode'
  • nemhandel_edi_user Many2one
    related='company_id.nemhandel_edi_user'
  • nemhandel_identifier_type Selection
    readonly=False related='company_id.nemhandel_identifier_type'
  • nemhandel_identifier_value Char
    readonly=False related='company_id.nemhandel_identifier_value'
  • nemhandel_phone_number Char
    readonly=False related='company_id.nemhandel_phone_number'
  • nemhandel_purchase_journal_id Many2one
    readonly=False related='company_id.nemhandel_purchase_journal_id'
Public methods (3)
  • action_open_nemhandel_form(self)
  • button_deregister_nemhandel_participant(self)
    @handle_demo
    Deregister the edi user from Nemhandel network
  • button_update_nemhandel_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)
  • invoice_edi_format Selection
    selection_add=[('oioubl_21', 'OIOUBL 2.1')]
  • invoice_sending_method Selection
    selection_add=[('nemhandel', 'By Nemhandel')]
  • is_using_nemhandel Boolean
    compute='_compute_is_using_nemhandel'
  • nemhandel_identifier_type Selection
    compute='_compute_nemhandel_identifier_type' help='Unique identifier used by OIOUBL and Nemhandel' readonly=False selection=[('0088', 'EAN/GLN'), ('0184', 'CVR'), ('9918', 'IBAN'), ('0198', 'SE')] store=True string='Nemhandel Endpoint Type' tracking=True
  • nemhandel_identifier_value Char
    compute='_compute_nemhandel_identifier_value' help='Code used to identify the Endpoint on Nemhandel' readonly=False store=True string='Nemhandel Endpoint' tracking=True
  • nemhandel_verification_state Selection
    company_dependent=True selection=[('not_verified', 'Not verified yet'), ('not_valid', 'Not on Nemhandel'), ('valid', 'Valid')] string='Nemhandel endpoint verification'
Public methods (3)
  • button_nemhandel_check_partner_endpoint(self, company=None)
    @handle_demo
    A basic check for whether a participant is reachable at the given identifier_type and identifier_value
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)