idg_region_tax_potency.py
5.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import logging
from datetime import datetime
from psycopg2 import DatabaseError, sql
from odoo import fields, models, api, _
from odoo.exceptions import UserError
# from odoo.tools import sql
_logger = logging.getLogger(__name__)
class IdgRegionTaxPotency(models.Model):
_name = 'idg.region.tax.potency'
_inherit = 'portal.mixin'
_description = 'Region Tax Potency'
country_id = fields.Many2one('res.country', required=True,
default=lambda self: self.env.company.country_id.id
if not self.country_id else False)
state_id = fields.Many2one('res.country.state', required=True,
domain="[('country_id', '=?', country_id)]")
district_id = fields.Many2one('res.district',
domain="[('state_id', '=?', state_id)]")
account_id = fields.Many2one('account.account', required=True)
year = fields.Integer(required=True, default=datetime.now().year)
qty = fields.Integer(required=True, default=0)
amount = fields.Integer(required=True, default=0)
def update_group(self, vals):
for r in self:
query = """
SELECT id FROM account_group agroup
WHERE agroup.code_prefix_start <= LEFT('{code}', char_length(agroup.code_prefix_start))
AND agroup.code_prefix_end >= LEFT('{code}', char_length(agroup.code_prefix_end))
""".format(code=r.account_id.code)
self.env.cr.execute(query)
group_ids = self.env.cr.fetchall()
for group_id in group_ids:
rows = self.env['idg.region.tax.potency.sum']. \
search([("country_id", '=', r.country_id.id),
("state_id", '=', r.state_id.id),
("district_id", '=', r.district_id.id),
("account_group_id", '=', group_id[0]),
("year", "=", r.year)])
if not rows:
value = {
"country_id": r.country_id.id,
"state_id": r.state_id.id,
"district_id": r.district_id.id,
"account_group_id": group_id[0],
"year": r.year
}
self.env["idg.region.tax.potency.sum"]. \
create(value)
def name_get(self):
result = []
for record in self:
result.append((record.id, f"{record.account_id.name} ({record.account_id.code})"))
return result
def create(self, vals):
res = super(IdgRegionTaxPotency, self).create(vals)
self.update_group(vals)
return res
def write(self, vals):
res = super(IdgRegionTaxPotency, self).write(vals)
self.update_group(vals)
return res
@api.onchange('district_id')
def _onchange_district_id(self):
if self.district_id and self.district_id.state_id != self.state_id:
self.state_id = self.district_id.state_id
if not self.district_id or self.district_id != self.sub_district_id.district_id:
self.sub_district_id = False
@api.onchange('state_id')
def _onchange_state_id(self):
if not self.state_id or self.state_id != self.district_id.state_id:
self.district_id = False
@api.onchange('country_id')
def _onchange_country_id(self):
if not self.country_id or self.country_id != self.state_id.country_id:
self.state_id = False
class IdgRegionTaxPotencySum(models.Model):
_name = 'idg.region.tax.potency.sum'
_inherit = 'portal.mixin'
_description = 'Region Tax Potency Summary'
country_id = fields.Many2one('res.country', required=True)
state_id = fields.Many2one('res.country.state', required=True,
domain="[('country_id', '=?', country_id)]")
district_id = fields.Many2one('res.district',
domain="[('state_id', '=?', state_id)]")
account_group_id = fields.Many2one('account.group', required=True)
year = fields.Integer(required=True, default=datetime.now().year)
qty = fields.Integer(compute='_compute_summary', default=0)
amount = fields.Integer(compute="_compute_summary", default=0)
level = fields.Integer(compute="_compute_level", store=True)
def name_get(self):
result = []
for record in self:
result.append((record.id, f"{record.account_group_id.name}"))
return result
def _compute_level(self):
for r in self:
r.level = len(r.account_group_id.code_prefix_start)
def _compute_summary(self):
for r in self:
code_prefix_start = r.account_group_id.code_prefix_start
code_prefix_end = r.account_group_id.code_prefix_end
if r.district_id:
district = f"AND idg_rtp.district_id= {r.district_id.id}"
else:
district = "AND idg_rtp.district_id is null"
query = f"""
SELECT SUM(idg_rtp.qty) as qty, SUM(idg_rtp.amount) as amount
FROM idg_region_tax_potency idg_rtp
JOIN account_account aa on idg_rtp.account_id = aa.id
WHERE idg_rtp.country_id = {r.country_id.id}
AND idg_rtp.state_id = {r.state_id.id}
{district}
AND '{code_prefix_start}' <= LEFT(aa.code, char_length('{code_prefix_start}'))
AND '{code_prefix_end}' >= LEFT(aa.code, char_length('{code_prefix_end}'))
AND year = {r.year}
"""
self.env.cr.execute(query)
row = self.env.cr.dictfetchone()
r.qty = row['qty']
r.amount = row['amount']