1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
# 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
@handle_demo
def button_migrate_peppol_registration(self):
"""
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."))
response = self.account_peppol_edi_user._call_peppol_proxy(endpoint='/api/peppol/1/migrate_peppol_registration')
self.account_peppol_migration_key = response['migration_key']
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',
}
|