forked from Mapan/odoo17e
92 lines
3.7 KiB
Python
92 lines
3.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
import re
|
|
import requests
|
|
|
|
from odoo import models, fields, _, api
|
|
from odoo.exceptions import UserError
|
|
|
|
from odoo.addons.l10n_be_codabox.const import get_error_msg, get_iap_endpoint
|
|
|
|
|
|
class ResCompany(models.Model):
|
|
_inherit = "res.company"
|
|
|
|
l10n_be_codabox_iap_token = fields.Char(readonly=True, groups="base.group_system")
|
|
l10n_be_codabox_is_connected = fields.Boolean(string="CodaBox Is Connected", compute="_compute_l10n_be_codabox_is_connected", store=True)
|
|
l10n_be_codabox_show_iap_token = fields.Boolean()
|
|
|
|
def _l10n_be_codabox_get_iap_common_params(self):
|
|
self._l10n_be_codabox_verify_prerequisites()
|
|
return {
|
|
"db_uuid": self.env["ir.config_parameter"].sudo().get_param("database.uuid"),
|
|
"company_vat": re.sub("[^0-9]", "", self.vat or self.company_registry),
|
|
"fidu_vat": re.sub("[^0-9]", "", self.l10n_be_codabox_fiduciary_vat),
|
|
}
|
|
|
|
@api.model
|
|
def _l10n_be_codabox_return_wizard(self, name, view_id, res_model, res_id):
|
|
return {
|
|
'name': name,
|
|
'view_id': view_id,
|
|
'res_model': res_model,
|
|
'res_id': res_id,
|
|
'context': self.env.context,
|
|
'type': 'ir.actions.act_window',
|
|
'views': [(False, 'form')],
|
|
'view_mode': 'form',
|
|
'target': 'new',
|
|
}
|
|
|
|
@api.model
|
|
def _l10_be_codabox_call_iap_route(self, route, params):
|
|
response = requests.post(f"{get_iap_endpoint(self.env)}/{route}", json={"params": params}, timeout=10)
|
|
result = response.json().get("result", {})
|
|
error = result.get("error")
|
|
if error:
|
|
raise UserError(get_error_msg(error))
|
|
return result
|
|
|
|
def _l10n_be_codabox_verify_prerequisites(self):
|
|
self.check_access_rule('write')
|
|
self.check_access_rights('write')
|
|
self.ensure_one()
|
|
if not self.vat and not self.company_registry:
|
|
raise UserError(_("The company VAT number or ID is not set."))
|
|
if not self.l10n_be_codabox_fiduciary_vat:
|
|
raise UserError(_("The feature is restricted to Accounting Firms."))
|
|
|
|
@api.depends("l10n_be_codabox_iap_token")
|
|
def _compute_l10n_be_codabox_is_connected(self):
|
|
for company in self:
|
|
if company.l10n_be_codabox_iap_token:
|
|
company._l10n_be_codabox_refresh_connection_status()
|
|
else:
|
|
company.l10n_be_codabox_is_connected = False
|
|
|
|
def _l10n_be_codabox_refresh_connection_status(self):
|
|
"""
|
|
Refresh the connection status of the company with CodaBox.
|
|
:return: error message (if empty, it means there is no error)
|
|
"""
|
|
error = ""
|
|
try:
|
|
params = self._l10n_be_codabox_get_iap_common_params()
|
|
params["iap_token"] = self.l10n_be_codabox_iap_token
|
|
result = self._l10_be_codabox_call_iap_route("check_status", params)
|
|
if not result.get("connection_exists"):
|
|
self.l10n_be_codabox_is_connected = False
|
|
error = get_error_msg({"type": "error_connection_not_found"})
|
|
else:
|
|
self.l10n_be_codabox_is_connected = result.get("is_fidu_consent_valid", False)
|
|
if not self.l10n_be_codabox_is_connected:
|
|
error = _("CodaBox consent is not valid. Please reconnect.")
|
|
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
|
|
error = get_error_msg({"type": "error_connecting_iap"})
|
|
except UserError as e:
|
|
self.env.cr.rollback()
|
|
self.l10n_be_codabox_is_connected = False
|
|
self.env.cr.commit()
|
|
error = str(e)
|
|
return error
|