Files
enterprise-addons/l10n_uk_reports_cis/models/res_partner.py
T

92 lines
3.6 KiB
Python

import re
from odoo import api, fields, models, _
from odoo.exceptions import UserError, ValidationError
VRN_REGEX = re.compile(r'^V[0-9]{10}[A-HJ-NP-Z]{0,2}$')
class ResPartner(models.Model):
_inherit = "res.partner"
l10n_uk_cis_enabled = fields.Boolean(default=False)
l10n_uk_reports_cis_forename = fields.Char(
string="Forename",
compute='_compute_l10n_uk_cis_name_fields',
readonly=False,
store=True,
)
l10n_uk_reports_cis_second_forename = fields.Char(
string="Second Forename",
readonly=False,
store=True,
)
l10n_uk_reports_cis_surname = fields.Char(
string="Surname",
compute='_compute_l10n_uk_cis_name_fields',
readonly=False,
store=True,
)
l10n_uk_reports_cis_verification_number = fields.Char(string="Verification Number", help="Ten digits number starting with 'V' provided by HMRC when verifying this partner")
l10n_uk_reports_cis_deduction_rate = fields.Selection(
[
('unmatched', "Unmatched (30%)"),
('net', "Net (20%)"),
('gross', "Gross (0%)")
],
string="Deduction Rate",
compute='_compute_l10n_uk_reports_cis_deduction_rate',
precompute=True,
required=True,
readonly=False,
store=True,
default='unmatched',
)
@api.constrains('l10n_uk_reports_cis_verification_number')
def _check_l10n_uk_reports_cis_verification_number(self):
for partner in self:
if partner.l10n_uk_reports_cis_verification_number and not VRN_REGEX.match(partner.l10n_uk_reports_cis_verification_number):
raise ValidationError(_("Invalid CIS Verification Number."))
@api.constrains('l10n_uk_reports_cis_forename', 'is_company', 'l10n_uk_cis_enabled')
def _check_partner_l10n_uk_reports_cis_forename(self):
for partner in self:
if not partner.is_company and not partner.l10n_uk_reports_cis_forename and partner.l10n_uk_cis_enabled:
raise UserError(_("When a partner is an individual, a forename needs to be set."))
@api.constrains('l10n_uk_reports_cis_surname', 'is_company', 'l10n_uk_cis_enabled')
def _check_partner_l10n_uk_reports_cis_surname(self):
for partner in self:
if not partner.is_company and not partner.l10n_uk_reports_cis_surname and partner.l10n_uk_cis_enabled:
raise UserError(_("When a partner is an individual, a surname needs to be set."))
@api.depends('l10n_uk_reports_cis_verification_number')
def _compute_l10n_uk_reports_cis_deduction_rate(self):
for partner in self:
if not partner.l10n_uk_reports_cis_verification_number:
partner.l10n_uk_reports_cis_deduction_rate = 'unmatched'
@api.depends('company_type', 'name', 'l10n_uk_cis_enabled')
def _compute_l10n_uk_cis_name_fields(self):
for partner in self:
if partner.company_type not in 'person' or partner.l10n_uk_reports_cis_forename or partner.l10n_uk_reports_cis_surname\
or not partner.name or not partner.l10n_uk_cis_enabled:
continue
partner_split_name = partner.name.split(' ')
if len(partner_split_name) == 2:
partner.l10n_uk_reports_cis_forename = partner_split_name[0]
partner.l10n_uk_reports_cis_surname = partner_split_name[1]
def _get_deduction_amount_from_rate(self):
self.ensure_one()
if self.l10n_uk_reports_cis_deduction_rate == 'unmatched':
return -30.0
elif self.l10n_uk_reports_cis_deduction_rate == 'net':
return -20.0
return 0.0