|
8 | 8 | class ResCompanyInterest(models.Model):
|
9 | 9 | _inherit = 'res.company.interest'
|
10 | 10 |
|
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) |
17 | 13 | if res:
|
18 | 14 | res.update({
|
19 |
| - 'student_id': student.id, |
20 |
| - 'partner_id': partner.id, |
| 15 | + 'student_id': partner.id, |
| 16 | + 'partner_id': debt['partner_id'].id, |
21 | 17 | })
|
22 | 18 | return res
|
23 | 19 |
|
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 = {} |
26 | 22 |
|
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')] |
30 | 82 | return res
|
0 commit comments