flectra/addons/l10n_in_gst/models/res_company.py

108 lines
4.5 KiB
Python

# Part of Flectra See LICENSE file for full copyright and licensing details.
import time
from flectra import api, fields, models, _
from flectra.exceptions import ValidationError
class Company(models.Model):
_inherit = 'res.company'
vat = fields.Char(string='GSTIN', related='partner_id.vat')
gst_type = fields.Selection([('regular', 'Regular'),
('unregistered', 'Unregistered'),
('composite', 'Composite'),
('volunteer', 'Volunteer')],
string='GST Type',
related='partner_id.gst_type')
gst_introduce_date = fields.Date(string='GST Introduce Date',
default=time.strftime('2017-07-01'))
company_b2c_limit_line = fields.One2many('res.company.b2c.limit',
'company_id', string='B2C Limit')
rc_gst_account_id = fields.Many2one('account.account', 'Reverse Charge')
def onchange_state(self, gst_type, vat, state):
result = {'vat': '', 'country_id': False}
if gst_type == 'unregistered' and vat:
result['vat'] = False
if gst_type != 'unregistered':
result['vat'] = state.l10n_in_tin
result['country_id'] = state.country_id and \
state.country_id.id or False
return result
@api.multi
@api.constrains('vat', 'state_id')
def _check_gstin_format(self):
""" Validations for GSTIN number format and length """
for res in self:
if res.state_id and res.vat and res.state_id.l10n_in_tin \
and res.state_id.l10n_in_tin != res.vat[:2]:
raise ValidationError(_('Invalid State Code!'))
if res.vat and len(res.vat) != 15 and res.gst_type != \
'unregistered':
raise ValidationError(_('GSTIN length must be of 15 '
'characters!'))
@api.onchange('state_id', 'country_id')
def _onchange_state_id(self):
""" Set state code as a initial characters of GSTIN """
result = self.onchange_state(self.gst_type, self.vat, self.state_id)
self.vat = result['vat']
self.country_id = result['country_id']
@api.onchange('gst_type')
def onchange_gst_type(self):
""" If gst type is unregistered then GSTIN Number should be blank"""
if self.gst_type == 'unregistered':
self.vat = False
@api.model
def create(self, vals):
result = super(Company, self).create(vals)
result.partner_id.gst_company_partner = True
if vals.get('state_id', False):
result.partner_id.state_id = vals['state_id']
if vals.get('country_id', False):
result.partner_id.country_id = vals['country_id']
return result
class CompanyB2CLimit(models.Model):
_name = 'res.company.b2c.limit'
date_from = fields.Date(string='From')
date_to = fields.Date(string='To')
b2cl_limit = fields.Float(string='B2CL Limit', default=250000.0,
help='Inter state minimum limit for B2CL type '
'transactions.')
b2cs_limit = fields.Float(string='B2CS Limit', default=250000.0,
help='Inter state maximum limit for B2CS type '
'transactions.')
company_id = fields.Many2one('res.company', string='Company')
@api.constrains('date_to', 'date_from', 'company_id')
def _check_sheet_date(self):
for line in self:
self.env.cr.execute('''
SELECT id
FROM res_company_b2c_limit
WHERE (date_from <= %s and %s <= date_to)
AND company_id=%s
AND id <> %s''',
(line.date_to, line.date_from,
line.company_id.id, line.id))
if any(self.env.cr.fetchall()):
raise ValidationError(_(
'You cannot have 2 limit lines of same period that '
'overlap for %s!') % (line.company_id and
line.company_id.name))
@api.constrains('date_from', 'date_to')
def _check_dates(self):
if any(self.filtered(lambda line: line.date_from and line.
date_to and line.date_from > line.date_to)):
raise ValidationError(_(
'From date must be lower than to date.'))