You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

178 lines
7.5 KiB

  1. import logging
  2. from odoo import api, fields, models, _
  3. _logger = logging.getLogger(__name__)
  4. class LoanIssue(models.Model):
  5. _name = 'loan.issue'
  6. _description = 'Loan Issue'
  7. @api.multi
  8. def _compute_subscribed_amount(self):
  9. for issue in self:
  10. susbscribed_amount = 0.0
  11. for line in issue.loan_issue_lines.filtered(
  12. lambda record: record.state != 'cancelled'):
  13. susbscribed_amount += line.amount
  14. issue.subscribed_amount = susbscribed_amount
  15. name = fields.Char(string="Name",
  16. translate=True)
  17. default_issue = fields.Boolean(string="Default issue")
  18. subscription_start_date = fields.Date(string="Start date subscription period")
  19. subscription_end_date = fields.Date(string="End date subscription period")
  20. user_id = fields.Many2one('res.users',
  21. string="Responsible")
  22. term_date = fields.Date(string="Term date")
  23. loan_term = fields.Float(string="Duration of the loan in month")
  24. rate = fields.Float(string="Interest rate")
  25. face_value = fields.Monetary(string="Facial value",
  26. currency_field='company_currency_id',
  27. required=True)
  28. minimum_amount = fields.Monetary(string="Minimum amount of issue",
  29. currency_field='company_currency_id')
  30. maximum_amount = fields.Monetary(string="Maximum amount of issue",
  31. currency_field='company_currency_id')
  32. min_amount_company = fields.Monetary(string="Minimum amount for a company",
  33. currency_field='company_currency_id')
  34. max_amount_company = fields.Monetary(string="Maximum amount for a company",
  35. currency_field='company_currency_id')
  36. min_amount_person = fields.Monetary(string="Minimum amount for a person",
  37. currency_field='company_currency_id')
  38. max_amount_person = fields.Monetary(string="Maximum amount for a person",
  39. currency_field='company_currency_id')
  40. subscribed_amount = fields.Monetary(string="Subscribed amount",
  41. compute="_compute_subscribed_amount",
  42. currency_field='company_currency_id')
  43. interest_payment = fields.Selection([('end', 'End'),
  44. ('yearly', 'Yearly')],
  45. string="Interest payment")
  46. interest_payment_info = fields.Char(string="Yearly payment on")
  47. loan_issue_lines = fields.One2many('loan.issue.line',
  48. 'loan_issue_id',
  49. string="Loan issue lines")
  50. state = fields.Selection([('draft', 'Draft'),
  51. ('confirmed', 'Confirmed'),
  52. ('cancelled', 'Cancelled'),
  53. ('ongoing', 'Ongoing'),
  54. ('closed', 'Closed')],
  55. string="State",
  56. default='draft')
  57. company_currency_id = fields.Many2one('res.currency',
  58. related='company_id.currency_id',
  59. string="Company Currency",
  60. readonly=True)
  61. company_id = fields.Many2one('res.company',
  62. string='Company',
  63. required=True,
  64. readonly=True,
  65. default=lambda self: self.env['res.company']._company_default_get()) # noqa
  66. by_company = fields.Boolean(string="By company")
  67. by_individual = fields.Boolean(string='By individuals')
  68. display_on_website = fields.Boolean(sting='Display on website')
  69. taxes_rate = fields.Float(string="Taxes on interest",
  70. required=True)
  71. @api.multi
  72. def get_max_amount(self, partner):
  73. lines = self.loan_issue_lines.filtered(
  74. lambda r: r.partner_id == partner and r.state != 'cancelled')
  75. already_subscribed = sum(line.amount for line in lines)
  76. if partner.is_company:
  77. max_amount = self.max_amount_company - already_subscribed
  78. else:
  79. max_amount = self.max_amount_person - already_subscribed
  80. return max_amount
  81. # @api.multi
  82. # def toggle_display(self):
  83. # for loan_issue in self:
  84. # loan_issue.display_on_website = not loan_issue.display_on_website
  85. @api.multi
  86. def get_web_issues(self, is_company):
  87. bond_issues = self.search([
  88. ('display_on_website', '=', True),
  89. ('state', '=', 'ongoing')
  90. ])
  91. if is_company is True:
  92. return bond_issues.filtered('by_company')
  93. else:
  94. return bond_issues.filtered('by_company')
  95. @api.multi
  96. def action_confirm(self):
  97. self.ensure_one()
  98. self.write({'state': 'confirmed'})
  99. @api.multi
  100. def action_open(self):
  101. self.ensure_one()
  102. self.write({'state': 'ongoing'})
  103. @api.multi
  104. def action_draft(self):
  105. self.ensure_one()
  106. self.write({'state': 'draft'})
  107. @api.multi
  108. def action_cancel(self):
  109. self.ensure_one()
  110. self.write({'state': 'cancelled'})
  111. @api.multi
  112. def action_close(self):
  113. self.ensure_one()
  114. self.write({'state': 'closed'})
  115. def get_interest_vals(self, line, vals):
  116. interest_obj = self.env['loan.interest.line']
  117. accrued_amount = line.amount
  118. accrued_interest = 0
  119. accrued_net_interest = 0
  120. accrued_taxes = 0
  121. for year in range(1, int(self.loan_term) + 1):
  122. interest = accrued_amount * (line.loan_issue_id.rate / 100)
  123. accrued_amount += interest
  124. taxes_amount = interest * (self.taxes_rate / 100)
  125. net_interest = interest - taxes_amount
  126. accrued_interest += interest
  127. accrued_net_interest += net_interest
  128. accrued_taxes += taxes_amount
  129. vals['interest'] = interest
  130. vals['net_interest'] = net_interest
  131. vals['taxes_amount'] = taxes_amount
  132. vals['accrued_amount'] = accrued_amount
  133. vals['accrued_interest'] = accrued_interest
  134. vals['accrued_net_interest'] = accrued_net_interest
  135. vals['accrued_taxes'] = accrued_taxes
  136. vals['name'] = year
  137. interest_obj.create(vals)
  138. @api.multi
  139. def compute_loan_interest(self):
  140. self.ensure_one()
  141. if self.interest_payment == 'end':
  142. due_date = self.term_date
  143. else:
  144. raise NotImplementedError(_("Interest payment by year hasn't been "
  145. "implemented yet"))
  146. for line in self.loan_issue_lines:
  147. # TODO remove this line
  148. line.interest_lines.unlink()
  149. # Please Do not Forget
  150. vals = {
  151. 'issue_line': line.id,
  152. 'due_date': due_date,
  153. 'taxes_rate': self.taxes_rate
  154. }
  155. self.get_interest_vals(line, vals)
  156. rounded_term = int(self.loan_term)
  157. if self.loan_term - rounded_term > 0:
  158. # TODO Handle this case
  159. raise NotImplementedError(_("Calculation on non entire year "
  160. "hasn't been implemented yet"))