diff --git a/easy_my_coop_loan/models/loan.py b/easy_my_coop_loan/models/loan.py
index f9f282f..0a92b08 100644
--- a/easy_my_coop_loan/models/loan.py
+++ b/easy_my_coop_loan/models/loan.py
@@ -1,177 +1,179 @@
-import logging
-
-from odoo import api, fields, models, _
-
-_logger = logging.getLogger(__name__)
-
-
-class LoanIssue(models.Model):
- _name = 'loan.issue'
- _description = 'Loan Issue'
-
- @api.multi
- def _compute_subscribed_amount(self):
- for issue in self:
- susbscribed_amount = 0.0
- for line in issue.loan_issue_lines.filtered(
- lambda record: record.state != 'cancelled'):
- susbscribed_amount += line.amount
- issue.subscribed_amount = susbscribed_amount
-
- name = fields.Char(string="Name",
- translate=True)
- default_issue = fields.Boolean(string="Default issue")
- subscription_start_date = fields.Date(string="Start date subscription period")
- subscription_end_date = fields.Date(string="End date subscription period")
- user_id = fields.Many2one('res.users',
- string="Responsible")
- term_date = fields.Date(string="Term date")
- loan_term = fields.Float(string="Duration of the loan in month")
- rate = fields.Float(string="Interest rate")
- face_value = fields.Monetary(string="Facial value",
- currency_field='company_currency_id',
- required=True)
- minimum_amount = fields.Monetary(string="Minimum amount of issue",
- currency_field='company_currency_id')
- maximum_amount = fields.Monetary(string="Maximum amount of issue",
- currency_field='company_currency_id')
- min_amount_company = fields.Monetary(string="Minimum amount for a company",
- currency_field='company_currency_id')
- max_amount_company = fields.Monetary(string="Maximum amount for a company",
- currency_field='company_currency_id')
- min_amount_person = fields.Monetary(string="Minimum amount for a person",
- currency_field='company_currency_id')
- max_amount_person = fields.Monetary(string="Maximum amount for a person",
- currency_field='company_currency_id')
- subscribed_amount = fields.Monetary(string="Subscribed amount",
- compute="_compute_subscribed_amount",
- currency_field='company_currency_id')
- interest_payment = fields.Selection([('end', 'End'),
- ('yearly', 'Yearly')],
- string="Interest payment")
- loan_issue_lines = fields.One2many('loan.issue.line',
- 'loan_issue_id',
- string="Loan issue lines")
- state = fields.Selection([('draft', 'Draft'),
- ('confirmed', 'Confirmed'),
- ('cancelled', 'Cancelled'),
- ('ongoing', 'Ongoing'),
- ('closed', 'Closed')],
- string="State",
- default='draft')
- company_currency_id = fields.Many2one('res.currency',
- related='company_id.currency_id',
- string="Company Currency",
- readonly=True)
- company_id = fields.Many2one('res.company',
- string='Company',
- required=True,
- readonly=True,
- default=lambda self: self.env['res.company']._company_default_get()) # noqa
- by_company = fields.Boolean(string="By company")
- by_individual = fields.Boolean(string='By individuals')
- display_on_website = fields.Boolean(sting='Display on website')
- taxes_rate = fields.Float(string="Taxes on interest",
- required=True)
-
- @api.multi
- def get_max_amount(self, partner):
- lines = self.loan_issue_lines.filtered(
- lambda r: r.partner_id == partner and r.state != 'cancelled')
- already_subscribed = sum(line.amount for line in lines)
- if partner.is_company:
- max_amount = self.max_amount_company - already_subscribed
- else:
- max_amount = self.max_amount_person - already_subscribed
- return max_amount
-
- @api.multi
- def toggle_display(self):
- for loan_issue in self:
- loan_issue.display_on_website = not loan_issue.display_on_website
-
- @api.multi
- def get_web_issues(self, is_company):
- bond_issues = self.search([
- ('display_on_website', '=', True),
- ('state', '=', 'ongoing')
- ])
- if is_company is True:
- return bond_issues.filtered('by_company')
- else:
- return bond_issues.filtered('by_company')
-
- @api.multi
- def action_confirm(self):
- self.ensure_one()
- self.write({'state': 'confirmed'})
-
- @api.multi
- def action_open(self):
- self.ensure_one()
- self.write({'state': 'ongoing'})
-
- @api.multi
- def action_draft(self):
- self.ensure_one()
- self.write({'state': 'draft'})
-
- @api.multi
- def action_cancel(self):
- self.ensure_one()
- self.write({'state': 'cancelled'})
-
- @api.multi
- def action_close(self):
- self.ensure_one()
- self.write({'state': 'closed'})
-
- def get_interest_vals(self, line, vals):
- interest_obj = self.env['loan.interest.line']
- accrued_amount = line.amount
- accrued_interest = 0
- accrued_net_interest = 0
- accrued_taxes = 0
- for year in range(1, int(self.loan_term) + 1):
- interest = accrued_amount * (line.loan_issue_id.rate / 100)
- accrued_amount += interest
- taxes_amount = interest * (self.taxes_rate / 100)
- net_interest = interest - taxes_amount
- accrued_interest += interest
- accrued_net_interest += net_interest
- accrued_taxes += taxes_amount
- vals['interest'] = interest
- vals['net_interest'] = net_interest
- vals['taxes_amount'] = taxes_amount
- vals['accrued_amount'] = accrued_amount
- vals['accrued_interest'] = accrued_interest
- vals['accrued_net_interest'] = accrued_net_interest
- vals['accrued_taxes'] = accrued_taxes
- vals['name'] = year
- interest_obj.create(vals)
-
- @api.multi
- def compute_loan_interest(self):
- self.ensure_one()
-
- if self.interest_payment == 'end':
- due_date = self.term_date
- else:
- raise NotImplementedError(_("Interest payment by year hasn't been "
- "implemented yet"))
- for line in self.loan_issue_lines:
- # TODO remove this line
- line.interest_lines.unlink()
- # Please Do not Forget
- vals = {
- 'issue_line': line.id,
- 'due_date': due_date,
- 'taxes_rate': self.taxes_rate
- }
- self.get_interest_vals(line, vals)
-
- rounded_term = int(self.loan_term)
- if self.loan_term - rounded_term > 0:
- # TODO Handle this case
- raise NotImplementedError(_("Calculation on non entire year "
- "hasn't been implemented yet"))
+import logging
+
+from odoo import api, fields, models, _
+
+_logger = logging.getLogger(__name__)
+
+
+class LoanIssue(models.Model):
+ _name = 'loan.issue'
+ _description = 'Loan Issue'
+
+ @api.multi
+ def _compute_subscribed_amount(self):
+ for issue in self:
+ susbscribed_amount = 0.0
+ for line in issue.loan_issue_lines.filtered(
+ lambda record: record.state != 'cancelled'):
+ susbscribed_amount += line.amount
+ issue.subscribed_amount = susbscribed_amount
+
+ name = fields.Char(string="Name",
+ translate=True)
+ default_issue = fields.Boolean(string="Default issue")
+ subscription_start_date = fields.Date(string="Start date subscription period")
+ subscription_end_date = fields.Date(string="End date subscription period")
+ user_id = fields.Many2one('res.users',
+ string="Responsible")
+ term_date = fields.Date(string="Term date")
+ loan_term = fields.Float(string="Duration of the loan in month")
+ rate = fields.Float(string="Interest rate")
+ face_value = fields.Monetary(string="Facial value",
+ currency_field='company_currency_id',
+ required=True)
+ minimum_amount = fields.Monetary(string="Minimum amount of issue",
+ currency_field='company_currency_id')
+ maximum_amount = fields.Monetary(string="Maximum amount of issue",
+ currency_field='company_currency_id')
+ min_amount_company = fields.Monetary(string="Minimum amount for a company",
+ currency_field='company_currency_id')
+ max_amount_company = fields.Monetary(string="Maximum amount for a company",
+ currency_field='company_currency_id')
+ min_amount_person = fields.Monetary(string="Minimum amount for a person",
+ currency_field='company_currency_id')
+ max_amount_person = fields.Monetary(string="Maximum amount for a person",
+ currency_field='company_currency_id')
+ subscribed_amount = fields.Monetary(string="Subscribed amount",
+ compute="_compute_subscribed_amount",
+ currency_field='company_currency_id')
+ interest_payment = fields.Selection([('end', 'End'),
+ ('yearly', 'Yearly')],
+ string="Interest payment")
+ payment_date = fields.Date(string="Interest payment date")
+ yearly_payement_on = fields.Char(string="Yearly payment on")
+ loan_issue_lines = fields.One2many('loan.issue.line',
+ 'loan_issue_id',
+ string="Loan issue lines")
+ state = fields.Selection([('draft', 'Draft'),
+ ('confirmed', 'Confirmed'),
+ ('cancelled', 'Cancelled'),
+ ('ongoing', 'Ongoing'),
+ ('closed', 'Closed')],
+ string="State",
+ default='draft')
+ company_currency_id = fields.Many2one('res.currency',
+ related='company_id.currency_id',
+ string="Company Currency",
+ readonly=True)
+ company_id = fields.Many2one('res.company',
+ string='Company',
+ required=True,
+ readonly=True,
+ default=lambda self: self.env['res.company']._company_default_get()) # noqa
+ by_company = fields.Boolean(string="By company")
+ by_individual = fields.Boolean(string='By individuals')
+ display_on_website = fields.Boolean(sting='Display on website')
+ taxes_rate = fields.Float(string="Taxes on interest",
+ required=True)
+
+ @api.multi
+ def get_max_amount(self, partner):
+ lines = self.loan_issue_lines.filtered(
+ lambda r: r.partner_id == partner and r.state != 'cancelled')
+ already_subscribed = sum(line.amount for line in lines)
+ if partner.is_company:
+ max_amount = self.max_amount_company - already_subscribed
+ else:
+ max_amount = self.max_amount_person - already_subscribed
+ return max_amount
+
+ @api.multi
+ def toggle_display(self):
+ for loan_issue in self:
+ loan_issue.display_on_website = not loan_issue.display_on_website
+
+ @api.multi
+ def get_web_issues(self, is_company):
+ bond_issues = self.search([
+ ('display_on_website', '=', True),
+ ('state', '=', 'ongoing')
+ ])
+ if is_company is True:
+ return bond_issues.filtered('by_company')
+ else:
+ return bond_issues.filtered('by_company')
+
+ @api.multi
+ def action_confirm(self):
+ self.ensure_one()
+ self.write({'state': 'confirmed'})
+
+ @api.multi
+ def action_open(self):
+ self.ensure_one()
+ self.write({'state': 'ongoing'})
+
+ @api.multi
+ def action_draft(self):
+ self.ensure_one()
+ self.write({'state': 'draft'})
+
+ @api.multi
+ def action_cancel(self):
+ self.ensure_one()
+ self.write({'state': 'cancelled'})
+
+ @api.multi
+ def action_close(self):
+ self.ensure_one()
+ self.write({'state': 'closed'})
+
+ def get_interest_vals(self, line, vals):
+ interest_obj = self.env['loan.interest.line']
+ accrued_amount = line.amount
+ accrued_interest = 0
+ accrued_net_interest = 0
+ accrued_taxes = 0
+ for year in range(1, int(self.loan_term) + 1):
+ interest = accrued_amount * (line.loan_issue_id.rate / 100)
+ accrued_amount += interest
+ taxes_amount = interest * (self.taxes_rate / 100)
+ net_interest = interest - taxes_amount
+ accrued_interest += interest
+ accrued_net_interest += net_interest
+ accrued_taxes += taxes_amount
+ vals['interest'] = interest
+ vals['net_interest'] = net_interest
+ vals['taxes_amount'] = taxes_amount
+ vals['accrued_amount'] = accrued_amount
+ vals['accrued_interest'] = accrued_interest
+ vals['accrued_net_interest'] = accrued_net_interest
+ vals['accrued_taxes'] = accrued_taxes
+ vals['name'] = year
+ interest_obj.create(vals)
+
+ @api.multi
+ def compute_loan_interest(self):
+ self.ensure_one()
+
+ if self.interest_payment == 'end':
+ due_date = self.term_date
+ else:
+ raise NotImplementedError(_("Interest payment by year hasn't been "
+ "implemented yet"))
+ for line in self.loan_issue_lines:
+ # TODO remove this line
+ line.interest_lines.unlink()
+ # Please Do not Forget
+ vals = {
+ 'issue_line': line.id,
+ 'due_date': due_date,
+ 'taxes_rate': self.taxes_rate
+ }
+ self.get_interest_vals(line, vals)
+
+ rounded_term = int(self.loan_term)
+ if self.loan_term - rounded_term > 0:
+ # TODO Handle this case
+ raise NotImplementedError(_("Calculation on non entire year "
+ "hasn't been implemented yet"))
diff --git a/easy_my_coop_loan/views/loan_view.xml b/easy_my_coop_loan/views/loan_view.xml
index e3786d5..a85bbff 100644
--- a/easy_my_coop_loan/views/loan_view.xml
+++ b/easy_my_coop_loan/views/loan_view.xml
@@ -1,228 +1,230 @@
-
-
-
- loan.issue.tree
- loan.issue
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- loan.issue.form
- loan.issue
-
-
-
-
-
-
- Loans Issue Search
- loan.issue
-
-
-
-
-
-
-
-
- Loan Issues
- loan.issue
- form
- tree,form
-
-
-
- Loans
- loan.issue.line
- form
- tree,form
-
-
-
- loan_issue_line_view_tree
- loan.issue.line
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- loan.issue.line.form
- loan.issue.line
-
-
-
-
-
-
- Loans Search
- loan.issue.line
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ loan.issue.tree
+ loan.issue
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ loan.issue.form
+ loan.issue
+
+
+
+
+
+
+ Loans Issue Search
+ loan.issue
+
+
+
+
+
+
+
+
+ Loan Issues
+ loan.issue
+ form
+ tree,form
+
+
+
+ Loans
+ loan.issue.line
+ form
+ tree,form
+
+
+
+ loan_issue_line_view_tree
+ loan.issue.line
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ loan.issue.line.form
+ loan.issue.line
+
+
+
+
+
+
+ Loans Search
+ loan.issue.line
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+