Skip to content

Commit 37f7c3d

Browse files
committed
[ADD] academic_account_interests: refactor
refactor por cambio en este PR ingadhoc/account-financial-tools#608
1 parent f7f5567 commit 37f7c3d

File tree

1 file changed

+65
-13
lines changed

1 file changed

+65
-13
lines changed

academic_account_interests/models/res_company_interest.py

+65-13
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,75 @@
88
class ResCompanyInterest(models.Model):
99
_inherit = 'res.company.interest'
1010

11-
def _prepare_interest_invoice(self, line, to_date, journal):
12-
line = list(line)
13-
student = line[0]
14-
partner = line[1]
15-
line.pop(0)
16-
res = super()._prepare_interest_invoice(line, to_date, journal)
11+
def _prepare_interest_invoice(self, partner, debt, to_date, journal):
12+
res = super()._prepare_interest_invoice(partner, debt, to_date, journal)
1713
if res:
1814
res.update({
19-
'student_id': student.id,
20-
'partner_id': partner.id,
15+
'student_id': partner.id,
16+
'partner_id': debt['partner_id'].id,
2117
})
2218
return res
2319

24-
def create_invoices(self, to_date, groupby=['student_id', 'partner_id']):
25-
return super().create_invoices(to_date, groupby=groupby)
20+
def _calculate_debts(self, from_date, to_date, groupby=['student_id', 'partner_id']):
21+
deuda = {}
2622

27-
def _get_move_line_domains(self, to_date):
28-
res = super()._get_move_line_domains(to_date)
29-
res += [('journal_id.type', '=', 'sale'), ('move_id.state', '=', 'posted')]
23+
interest_rate = {
24+
'daily': 1,
25+
'weekly': 7,
26+
'monthly': 30,
27+
'yearly': 360,
28+
}
29+
30+
# Deudas de períodos anteriores
31+
previous_grouped_lines = self.env['account.move.line']._read_group(
32+
domain=self._get_move_line_domains() + [('full_reconcile_id', '=', False), ('date_maturity', '<', from_date)],
33+
groupby=groupby,
34+
aggregates=['amount_residual:sum'],
35+
)
36+
for x in previous_grouped_lines:
37+
self._update_deuda(deuda, x[0], 'Deuda periodos anteriores', x[2] * self.rate)
38+
deuda[x[0]]['partner_id'] = x[1]
39+
40+
# Intereses por el último período
41+
last_period_lines = self.env['account.move.line'].search(
42+
self._get_move_line_domains() + [('amount_residual', '>', 0), ('date_maturity', '>=', from_date), ('date_maturity', '<', to_date)]
43+
)
44+
for student, amls in last_period_lines.grouped('student_id').items():
45+
interest = sum(
46+
move.amount_residual * ((to_date - move.invoice_date_due).days - 1) * (self.rate / interest_rate[self.rule_type])
47+
for move, lines in amls.grouped('move_id').items()
48+
)
49+
self._update_deuda(deuda, student, 'Deuda último periodo', interest)
50+
deuda[student]['partner_id'] = amls[0].partner_id
51+
52+
# Intereses por pagos tardíos
53+
if self.late_payment_interest:
54+
55+
partials = self.env['account.partial.reconcile'].search([
56+
# lo dejamos para NTH
57+
# debit_move_id. safe eval domain
58+
('debit_move_id.partner_id.active', '=', True),
59+
('debit_move_id.date_maturity', '>=', from_date),
60+
('debit_move_id.date_maturity', '<=', to_date),
61+
('debit_move_id.parent_state', '=', 'posted'),
62+
('debit_move_id.account_id', 'in', self.receivable_account_ids.ids),
63+
('credit_move_id.date', '>=', from_date),
64+
('credit_move_id.date', '<', to_date)]).grouped('debit_move_id')
65+
66+
for move_line, parts in partials.items():
67+
due_payments = parts.filtered(lambda x: x.credit_move_id.date > x.debit_move_id.date_maturity)
68+
interest = 0
69+
if due_payments:
70+
due_payments_amount = sum(due_payments.mapped('amount'))
71+
last_date_payment = parts.filtered(lambda x: x.credit_move_id.date > x.debit_move_id.date_maturity).sorted('max_date')[-1].max_date
72+
days = (last_date_payment - move_line.date_maturity).days
73+
interest += due_payments_amount * days * (self.rate / interest_rate[self.rule_type])
74+
self._update_deuda(deuda, move_line.student_id, 'Deuda pagos vencidos', interest)
75+
deuda[student]['partner_id'] = move_line.partner_id
76+
77+
return deuda
78+
79+
def _get_move_line_domains(self):
80+
res = super()._get_move_line_domains()
81+
res += [('journal_id.type', '=', 'sale')]
3082
return res

0 commit comments

Comments
 (0)