Files
enterprise-addons/l10n_be_codabox/models/res_company.py
T

111 lines
5.1 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_company_vat = fields.Char(string="Company VAT/ID", compute="_compute_l10n_be_codabox_company_vat")
l10n_be_codabox_fiduciary_vat = fields.Char(string="Accounting Firm VAT", compute="_compute_l10n_be_codabox_fiduciary_vat")
l10n_be_codabox_iap_token = fields.Char(string="Codabox IAP Access Token", 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_soda_journal = fields.Many2one("account.journal", string="Journal in which SODA's will be imported", domain="[('type', '=', 'general')]")
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": self.l10n_be_codabox_company_vat,
"fidu_vat": self.l10n_be_codabox_fiduciary_vat,
}
def _compute_l10n_be_codabox_company_vat(self):
for company in self:
if company.vat and company.vat != "/":
company.l10n_be_codabox_company_vat = company.vat
else:
company.l10n_be_codabox_company_vat = company.company_registry
company.l10n_be_codabox_company_vat = re.sub(r"[^0-9]", "", company.l10n_be_codabox_company_vat or "")
def _compute_l10n_be_codabox_fiduciary_vat(self):
for company in self:
if codabox_contract_sys_param := self.env['ir.config_parameter'].sudo().get_param("l10n_be_codabox.codabox_contract"):
company.l10n_be_codabox_fiduciary_vat = codabox_contract_sys_param
elif company.account_representative_id:
company.l10n_be_codabox_fiduciary_vat = company.account_representative_id.vat or company.company_registry
else:
company.l10n_be_codabox_fiduciary_vat = company.l10n_be_codabox_company_vat
company.l10n_be_codabox_fiduciary_vat = re.sub(r"[^0-9]", "", company.l10n_be_codabox_fiduciary_vat or "")
@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):
if self.env.context.get("read_only"):
self.check_access('read')
else:
self.check_access('write')
self.ensure_one()
if not self.l10n_be_codabox_company_vat:
raise UserError(_("The company VAT/ID number is not set."))
@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