Odoo18-Base/addons/account_peppol/wizard/service_wizard.py
2025-01-06 10:57:38 +07:00

110 lines
4.2 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
import logging
from markupsafe import Markup
from odoo import api, fields, models, _
_logger = logging.getLogger(__name__)
class PeppolService(models.TransientModel):
_name = 'account_peppol.service'
_order = 'document_name, id'
_description = 'Peppol Service'
wizard_id = fields.Many2one(comodel_name='account_peppol.service.wizard')
document_identifier = fields.Char()
document_name = fields.Char()
enabled = fields.Boolean()
class PeppolServiceConfig(models.TransientModel):
_name = 'account_peppol.service.wizard'
_description = 'Peppol Services Wizard'
edi_user_id = fields.Many2one(comodel_name='account_edi_proxy_client.user', string='EDI user')
service_json = fields.Json(help="JSON representation of peppol services as retrieved from the peppol server.")
service_info = fields.Html(compute='_compute_service_info')
service_ids = fields.One2many(
comodel_name='account_peppol.service',
inverse_name='wizard_id',
readonly=False,
)
# -------------------------------------------------------------------------
# COMPUTES
# -------------------------------------------------------------------------
def _compute_service_info(self):
for wizard in self:
message = ''
supported_doctypes = self.env['res.company']._peppol_supported_document_types()
if (non_configurable := [
identifier
for identifier in (wizard.service_json or {})
if identifier not in supported_doctypes
]):
message = Markup('%s<ul>%s</ul>') % (
_(
"The following services are listed on your participant but cannot be configured here. "
"If you wish to configure them differently, please contact support."
),
Markup().join(
Markup('<li>%s</li>') % (wizard.service_json[identifier]['document_name'])
for identifier in non_configurable
),
)
wizard.service_info = message
# -------------------------------------------------------------------------
# OVERRIDES
# -------------------------------------------------------------------------
@api.model_create_multi
def create(self, vals_list):
"""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.
"""
wizards = super().create(vals_list)
supported_doctypes = self.env['res.company']._peppol_supported_document_types()
for wizard in wizards:
wizard.service_ids.create([
{
'document_identifier': identifier,
'document_name': document_name,
'enabled': identifier in (wizard.service_json or {}),
'wizard_id': wizard.id,
}
for identifier, document_name in supported_doctypes.items()
])
return wizards
def confirm(self):
"""Interpret changes to the services, and add or remove them on the IAP accordingly."""
services = self.service_ids.read(['document_identifier', 'enabled'])
service_json = self.service_json or {}
to_add, to_remove = [], []
for service in services:
if service['document_identifier'] in service_json and not service['enabled']:
to_remove.append(service['document_identifier'])
if service['document_identifier'] not in service_json and service['enabled']:
to_add.append(service['document_identifier'])
if to_add:
self.edi_user_id._call_peppol_proxy(
"/api/peppol/2/add_services", {
'document_identifiers': to_add,
},
)
if to_remove:
self.edi_user_id._call_peppol_proxy(
"/api/peppol/2/remove_services", {
'document_identifiers': to_remove,
},
)