129 lines
5.6 KiB
Python
129 lines
5.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models, _
|
|
|
|
TEST_GST_NUMBER = "36AABCT1332L011"
|
|
|
|
class ResPartner(models.Model):
|
|
_inherit = 'res.partner'
|
|
|
|
l10n_in_gst_treatment = fields.Selection([
|
|
('regular', 'Registered Business - Regular'),
|
|
('composition', 'Registered Business - Composition'),
|
|
('unregistered', 'Unregistered Business'),
|
|
('consumer', 'Consumer'),
|
|
('overseas', 'Overseas'),
|
|
('special_economic_zone', 'Special Economic Zone'),
|
|
('deemed_export', 'Deemed Export'),
|
|
('uin_holders', 'UIN Holders'),
|
|
], string="GST Treatment")
|
|
|
|
l10n_in_pan = fields.Char(
|
|
string="PAN",
|
|
help="PAN enables the department to link all transactions of the person with the department.\n"
|
|
"These transactions include taxpayments, TDS/TCS credits, returns of income/wealth/gift/FBT,"
|
|
" specified transactions, correspondence, and so on.\n"
|
|
"Thus, PAN acts as an identifier for the person with the tax department."
|
|
)
|
|
|
|
display_pan_warning = fields.Boolean(string="Display pan warning", compute="_compute_display_pan_warning")
|
|
l10n_in_gst_state_warning = fields.Char(compute="_compute_l10n_in_gst_state_warning")
|
|
|
|
@api.depends('vat', 'state_id', 'country_id', 'fiscal_country_codes')
|
|
def _compute_l10n_in_gst_state_warning(self):
|
|
for partner in self:
|
|
if (
|
|
"IN" in partner.fiscal_country_codes
|
|
and partner.check_vat_in(partner.vat)
|
|
):
|
|
if partner.vat[:2] == "99":
|
|
partner.l10n_in_gst_state_warning = _(
|
|
"As per GSTN the country should be other than India, so it's recommended to"
|
|
)
|
|
else:
|
|
state_id = self.env['res.country.state'].search([('l10n_in_tin', '=', partner.vat[:2])])
|
|
if state_id and state_id != partner.state_id:
|
|
partner.l10n_in_gst_state_warning = _(
|
|
"As per GSTN the state should be %s, so it's recommended to", state_id.name
|
|
)
|
|
else:
|
|
partner.l10n_in_gst_state_warning = False
|
|
else:
|
|
partner.l10n_in_gst_state_warning = False
|
|
|
|
@api.depends('l10n_in_pan')
|
|
def _compute_display_pan_warning(self):
|
|
for partner in self:
|
|
partner.display_pan_warning = partner.vat and partner.l10n_in_pan and partner.l10n_in_pan != partner.vat[2:12]
|
|
|
|
@api.onchange('company_type')
|
|
def onchange_company_type(self):
|
|
res = super().onchange_company_type()
|
|
if self.country_id and self.country_id.code == 'IN':
|
|
self.l10n_in_gst_treatment = (self.company_type == 'company') and 'regular' or 'consumer'
|
|
return res
|
|
|
|
@api.onchange('country_id')
|
|
def _onchange_country_id(self):
|
|
res = super()._onchange_country_id()
|
|
if self.country_id and self.country_id.code != 'IN':
|
|
self.l10n_in_gst_treatment = 'overseas'
|
|
elif self.country_id and self.country_id.code == 'IN':
|
|
self.l10n_in_gst_treatment = (self.company_type == 'company') and 'regular' or 'consumer'
|
|
return res
|
|
|
|
@api.onchange('vat')
|
|
def onchange_vat(self):
|
|
if self.vat and self.check_vat_in(self.vat):
|
|
state_id = self.env['res.country.state'].search([('l10n_in_tin', '=', self.vat[:2])], limit=1)
|
|
if state_id:
|
|
self.state_id = state_id
|
|
if self.vat[2].isalpha():
|
|
self.l10n_in_pan = self.vat[2:12]
|
|
|
|
@api.model
|
|
def _commercial_fields(self):
|
|
res = super()._commercial_fields()
|
|
return res + ['l10n_in_gst_treatment', 'l10n_in_pan']
|
|
|
|
def check_vat_in(self, vat):
|
|
"""
|
|
This TEST_GST_NUMBER is used as test credentials for EDI
|
|
but this is not a valid number as per the regular expression
|
|
so TEST_GST_NUMBER is considered always valid
|
|
"""
|
|
if vat == TEST_GST_NUMBER:
|
|
return True
|
|
return super().check_vat_in(vat)
|
|
|
|
@api.model
|
|
def _l10n_in_get_partner_vals_by_vat(self, vat):
|
|
partner_details = self.read_by_vat(vat)
|
|
partner_data = partner_details[0] if partner_details else {}
|
|
if partner_data:
|
|
partner_gid = partner_data.get('partner_gid')
|
|
if partner_gid:
|
|
partner_data = self.enrich_company(company_domain=None, partner_gid=partner_gid, vat=partner_data.get('vat'))
|
|
partner_data = self._iap_replace_logo(partner_data)
|
|
return {
|
|
'name': partner_data.get('name'),
|
|
'company_type': 'company',
|
|
'partner_gid': partner_gid,
|
|
'vat': partner_data.get('vat'),
|
|
'l10n_in_gst_treatment': 'regular',
|
|
'image_1920': partner_data.get('image_1920'),
|
|
'street': partner_data.get('street'),
|
|
'street2': partner_data.get('street2'),
|
|
'city': partner_data.get('city'),
|
|
'state_id': partner_data.get('state_id', {}).get('id', False),
|
|
'country_id': partner_data.get('country_id', {}).get('id', False),
|
|
'zip': partner_data.get('zip'),
|
|
}
|
|
return {}
|
|
|
|
def action_update_state_as_per_gstin(self):
|
|
self.ensure_one()
|
|
state_id = self.env['res.country.state'].search([('l10n_in_tin', '=', self.vat[:2])], limit=1)
|
|
self.state_id = state_id
|