92 lines
3.6 KiB
Python
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
|