Odoo18-Base/addons/account_peppol/models/res_config_settings.py

136 lines
6.0 KiB
Python
Raw Permalink Normal View History

2025-01-06 10:57:38 +07:00
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import _, api, fields, models, modules, tools
from odoo.exceptions import UserError, ValidationError
from odoo.addons.account_peppol.tools.demo_utils import handle_demo
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
account_peppol_edi_user = fields.Many2one(
comodel_name='account_edi_proxy_client.user',
string='EDI user',
compute='_compute_account_peppol_edi_user',
)
account_peppol_edi_mode = fields.Selection(related='account_peppol_edi_user.edi_mode')
account_peppol_contact_email = fields.Char(related='company_id.account_peppol_contact_email', readonly=False)
account_peppol_eas = fields.Selection(related='company_id.peppol_eas', readonly=False)
account_peppol_edi_identification = fields.Char(related='account_peppol_edi_user.edi_identification')
account_peppol_endpoint = fields.Char(related='company_id.peppol_endpoint', readonly=False)
account_peppol_migration_key = fields.Char(related='company_id.account_peppol_migration_key', readonly=False)
account_peppol_phone_number = fields.Char(related='company_id.account_peppol_phone_number', readonly=False)
account_peppol_proxy_state = fields.Selection(related='company_id.account_peppol_proxy_state', readonly=False)
account_peppol_purchase_journal_id = fields.Many2one(related='company_id.peppol_purchase_journal_id', readonly=False)
# -------------------------------------------------------------------------
# COMPUTE METHODS
# -------------------------------------------------------------------------
@api.depends('is_account_peppol_eligible', 'account_peppol_edi_user')
def _compute_account_peppol_mode_constraint(self):
mode_constraint = self.env['ir.config_parameter'].sudo().get_param('account_peppol.mode_constraint')
trial_param = self.env['ir.config_parameter'].sudo().get_param('saas_trial.confirm_token')
self.account_peppol_mode_constraint = trial_param and 'demo' or mode_constraint or 'prod'
@api.depends("company_id.account_edi_proxy_client_ids")
def _compute_account_peppol_edi_user(self):
for config in self:
config.account_peppol_edi_user = config.company_id.account_edi_proxy_client_ids.filtered(
lambda u: u.proxy_type == 'peppol')
# -------------------------------------------------------------------------
# BUSINESS ACTIONS
# -------------------------------------------------------------------------
def action_open_peppol_form(self):
registration_wizard = self.env['peppol.registration'].create({'company_id': self.company_id.id})
registration_action = registration_wizard._action_open_peppol_form(reopen=False)
return registration_action
@handle_demo
def button_update_peppol_user_data(self):
"""
Action for the user to be able to update their contact details any time
Calls /update_user on the iap server
"""
self.ensure_one()
if not self.account_peppol_contact_email or not self.account_peppol_phone_number:
raise ValidationError(_("Contact email and mobile number are required."))
params = {
'update_data': {
'peppol_phone_number': self.account_peppol_phone_number,
'peppol_contact_email': self.account_peppol_contact_email,
}
}
self.account_peppol_edi_user._call_peppol_proxy(
endpoint='/api/peppol/1/update_user',
params=params,
)
return True
@handle_demo
def button_peppol_smp_registration(self):
"""
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.
"""
self.ensure_one()
self.account_peppol_edi_user._peppol_register_sender_as_receiver()
if self.account_peppol_proxy_state == 'smp_registration':
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': _("Registered to receive documents via Peppol."),
'type': 'success',
'message': _("Your registration on Peppol network should be activated within a day. The updated status will be visible in Settings."),
'next': {'type': 'ir.actions.act_window_close'},
}
}
return True
def 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.
"""
self.ensure_one()
if self.account_peppol_proxy_state != 'receiver':
raise UserError(_("Can't migrate unless registered to receive documents."))
self.account_peppol_edi_user._peppol_migrate_registration()
return True
@handle_demo
def button_deregister_peppol_participant(self):
"""
Deregister the edi user from Peppol network
"""
self.ensure_one()
if self.account_peppol_edi_user:
self.account_peppol_edi_user._peppol_deregister_participant()
return True
def button_account_peppol_configure_services(self):
wizard = self.env['account_peppol.service.wizard'].create({
'edi_user_id': self.account_peppol_edi_user.id,
'service_json': self.account_peppol_edi_user._peppol_get_services().get('services'),
})
return {
'type': 'ir.actions.act_window',
'name': 'Configure your peppol services',
'res_model': 'account_peppol.service.wizard',
'res_id': wizard.id,
'view_mode': 'form',
'target': 'new',
}