330 lines
11 KiB
Python
330 lines
11 KiB
Python
from odoo import fields, models, api, _
|
|
|
|
|
|
class BenefitsNeeds(models.Model):
|
|
_name = 'benefits.needs'
|
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
|
_description = 'percentage of need of benefit '
|
|
|
|
name = fields.Char(string='', required=False)
|
|
benefit_need_type = fields.Selection(
|
|
string='',
|
|
selection=[('special', 'special (for one)'),
|
|
('general', 'general(for group)'), ],
|
|
required=False, )
|
|
date = fields.Datetime(
|
|
string='',
|
|
required=False)
|
|
benefit_id = fields.Many2one(
|
|
'grant.benefit',
|
|
string='',
|
|
required=False)
|
|
description = fields.Char(
|
|
string='',
|
|
required=False)
|
|
benefit_type = fields.Selection(
|
|
string='Benefits Type',
|
|
selection=[('orphans', _('orphans')),
|
|
('widows', _('widows')),
|
|
('both', _('Both')),
|
|
],
|
|
compute='_onchange_benefit_ids',
|
|
required=False, store=True)
|
|
need_status = fields.Selection(string='',
|
|
selection=[('urgent', 'urgent'),
|
|
('not_urgent', 'Not urgent'), ],
|
|
required=False, )
|
|
need_category = fields.Many2one('needs.categories', required=False)
|
|
category_name = fields.Char(related='need_category.name')
|
|
need_type_ids = fields.Many2many('product.product', string='')
|
|
city_id = fields.Many2one('res.country.city')
|
|
city_name = fields.Char(related='city_id.name')
|
|
benefit_ids = fields.Many2many('grant.benefit', string='')
|
|
target_amount = fields.Float(string='', compute="_onchange_paid_amount")
|
|
f_amount = fields.Float(string='')
|
|
paid_amount = fields.Float(string='', compute='_onchange_paid_amount')
|
|
remaining_amount = fields.Float(string='', compute='_onchange_paid_amount')
|
|
completion_ratio = fields.Float(string='', compute='_onchange_paid_amount')
|
|
payments_ids = fields.One2many('needs.payment.line', 'need_id')
|
|
need_attach = fields.Binary(string="", )
|
|
state = fields.Selection([
|
|
('draft', 'Draft'),
|
|
('sent', 'sent'),
|
|
('review', 'Under Review'),
|
|
('approve', 'Approved'),
|
|
('published', 'Published'),
|
|
('refused', 'Refused'),
|
|
('done', 'Done'),
|
|
], string='state', default="draft", tracking=True)
|
|
|
|
benefit_count = fields.Integer(string='Benefits count for needs',
|
|
compute='_compute_needs_benefit_count', store=True)
|
|
|
|
@api.depends('benefit_id', 'benefit_ids')
|
|
def _compute_needs_benefit_count(self):
|
|
""" Calculate needs benefits count """
|
|
for rec in self:
|
|
if rec.benefit_ids:
|
|
rec.benefit_count = len(rec.benefit_ids)
|
|
elif rec.benefit_id:
|
|
rec.benefit_count = 1
|
|
else:
|
|
rec.benefit_count = 0
|
|
|
|
def action_submit(self):
|
|
for rec in self:
|
|
rec.state = 'sent'
|
|
|
|
def action_review(self):
|
|
for rec in self:
|
|
rec.state = 'review'
|
|
|
|
def action_approve(self):
|
|
for rec in self:
|
|
rec.state = 'approve'
|
|
|
|
def action_published(self):
|
|
for rec in self:
|
|
rec.state = 'published'
|
|
|
|
def action_refused(self):
|
|
for rec in self:
|
|
rec.state = 'refused'
|
|
|
|
def action_done(self):
|
|
for rec in self:
|
|
rec.state = 'done'
|
|
|
|
@api.onchange('need_category')
|
|
def _onchange_need_category(self):
|
|
for rec in self:
|
|
need_list = []
|
|
for i in rec.need_category.product_ids:
|
|
need_list.append(i.id)
|
|
rec.need_type_ids = [(6, 0, need_list)]
|
|
|
|
@api.onchange('benefit_ids', 'benefit_id')
|
|
def _onchange_benefit_ids(self):
|
|
for rec in self:
|
|
b_type = []
|
|
if rec.benefit_ids:
|
|
for i in rec.benefit_ids:
|
|
b_type.append(i.benefit_type)
|
|
if rec.benefit_id:
|
|
for i in rec.benefit_id:
|
|
b_type.append(i.benefit_type)
|
|
if 'orphan' in b_type and 'widow' not in b_type:
|
|
rec.benefit_type = 'orphans'
|
|
if 'widow' in b_type and 'orphan' not in b_type:
|
|
rec.benefit_type = 'widows'
|
|
if 'widow' in b_type and 'orphan' in b_type:
|
|
rec.benefit_type = 'both'
|
|
if b_type == []:
|
|
rec.benefit_type = False
|
|
|
|
@api.onchange('need_type_ids', 'paid_amount', 'need_category')
|
|
def _onchange_paid_amount(self):
|
|
for rec in self:
|
|
paid_amount = 0.0
|
|
target_amount = 0.0
|
|
for pay in rec.payments_ids:
|
|
if pay.state == 'paid':
|
|
paid_amount += pay.amount
|
|
rec.paid_amount = format(paid_amount, '.2f')
|
|
for i in rec.need_type_ids:
|
|
if rec.f_amount > 0:
|
|
target_amount = rec.f_amount
|
|
else:
|
|
target_amount += i.lst_price
|
|
rec.target_amount = format(target_amount, '.2f')
|
|
if rec.target_amount:
|
|
remaining_amount = format(rec.target_amount - rec.paid_amount, '.2f')
|
|
rec.remaining_amount = remaining_amount
|
|
if not rec.target_amount == 0.0 and rec.target_amount >= rec.paid_amount:
|
|
completion_ratio = 100 - ((rec.remaining_amount / rec.target_amount) * 100)
|
|
rec.completion_ratio = format(completion_ratio, '.2f')
|
|
else:
|
|
rec.completion_ratio = 0.0
|
|
else:
|
|
rec.remaining_amount = 0.0
|
|
rec.completion_ratio = 0.0
|
|
# else:
|
|
# raise ValidationError(
|
|
# _(u' You cant Add pay anymore'))
|
|
|
|
|
|
class Payments(models.Model):
|
|
_name = 'needs.payment.line'
|
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
|
_description = 'Payments'
|
|
|
|
need_id = fields.Many2one('benefits.needs')
|
|
invoice_id = fields.Many2one('account.move')
|
|
partner_id = fields.Many2one('res.partner', related="invoice_id.partner_id")
|
|
amount = fields.Monetary(related="invoice_id.amount_total")
|
|
currency_id = fields.Many2one('res.currency', string='Currency', readonly=True, related="invoice_id.currency_id")
|
|
state = fields.Selection([
|
|
('draft', 'Draft'),
|
|
('open', 'Open'),
|
|
('paid', 'Paid'),
|
|
('cancel', 'Cancelled'), ], store=True, related="invoice_id.state")
|
|
date = fields.Date(related="invoice_id.invoice_date")
|
|
|
|
|
|
class NeedsCategories(models.Model):
|
|
_name = 'needs.categories'
|
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
|
_description = 'Categories of need of benefit '
|
|
|
|
name = fields.Char(
|
|
string='',
|
|
required=False)
|
|
description = fields.Char(
|
|
string='',
|
|
required=False)
|
|
product_ids = fields.Many2many('product.product')
|
|
|
|
|
|
class PercentageOfNeed(models.Model):
|
|
_name = 'benefit.need'
|
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
|
_description = 'percentage of need of benefit '
|
|
|
|
name = fields.Char()
|
|
housing_id = fields.Many2one(
|
|
'benefit.housing',
|
|
string='',
|
|
tracking=True,
|
|
required=False)
|
|
benefit_ids = fields.One2many('grant.benefit', 'housing_id', string="Benefits")
|
|
house_need = fields.One2many(
|
|
comodel_name='house.need',
|
|
inverse_name='benefit_need_id',
|
|
string='',
|
|
required=False)
|
|
total_expenses = fields.Float(
|
|
compute='_get_total_expenses',
|
|
store=True,
|
|
tracking=True,
|
|
string='',
|
|
required=False)
|
|
expenses_ids = fields.Many2many(
|
|
comodel_name='grant.benefit',relation='grant_benefit_group_rel',compute='_get_total_expenses',column1='benefit_id',column2='grant_id',tracking=True,
|
|
store=True,
|
|
string='',
|
|
required=False)
|
|
income_ids = fields.Many2many(
|
|
'grant.benefit',
|
|
compute='_get_total_income',
|
|
tracking=True,
|
|
store=True,
|
|
string='',
|
|
required=False)
|
|
total_income = fields.Float(
|
|
compute='_get_total_income',
|
|
tracking=True,
|
|
store=True,
|
|
string='total income',
|
|
required=False)
|
|
total_net = fields.Float(
|
|
string='net',
|
|
store=True,
|
|
compute='_get_total_net',
|
|
tracking=True,
|
|
required=False)
|
|
financial_aid = fields.Float(
|
|
string='Financial Aid',
|
|
store=True,
|
|
compute='_get_total_net',
|
|
tracking=True,
|
|
required=False)
|
|
state = fields.Selection([
|
|
('draft', 'Draft'),
|
|
('visit', 'field visit'),
|
|
('waiting_approve', 'Waiting Approved'),
|
|
('approve', 'Approved'),
|
|
('refused', 'Refused'),
|
|
], string='state', default="draft", tracking=True)
|
|
|
|
def action_visit(self):
|
|
self.state = 'visit'
|
|
|
|
def action_waiting_approve(self):
|
|
self.state = 'waiting_approve'
|
|
|
|
def action_approve(self):
|
|
self.state = 'approve'
|
|
|
|
def action_refused(self):
|
|
self.state = 'refused'
|
|
|
|
@api.depends('housing_id')
|
|
def _get_total_expenses(self):
|
|
for rec in self:
|
|
if rec.state == 'draft':
|
|
benefit_id = rec.env['grant.benefit'].sudo().search([('housing_id', '=', rec.housing_id.id)])
|
|
benefit_ids = rec.env['grant.benefit'].sudo().search(
|
|
[('housing_id', '=', rec.housing_id.id), ('benefit_type', '=', 'benefit')])
|
|
benefit = []
|
|
total_expenses = 0.0
|
|
for i in benefit_id:
|
|
benefit.append(i.id)
|
|
total_expenses += i.total_expenses
|
|
for r in self:
|
|
r.expenses_ids = [(6, 0, benefit)]
|
|
r.total_expenses = total_expenses
|
|
|
|
@api.depends('housing_id')
|
|
def _get_total_income(self):
|
|
for rec in self:
|
|
if rec.state == 'draft':
|
|
benefit_ids = rec.env['grant.benefit'].sudo().search(
|
|
[('housing_id', '=', rec.housing_id.id), ('benefit_type', '=', 'benefit')])
|
|
benefit = []
|
|
total_income = 0.0
|
|
for i in benefit_ids:
|
|
benefit.append(i.id)
|
|
total_income += i.total_income
|
|
for r in rec:
|
|
r.income_ids = [(6, 0, benefit)]
|
|
r.total_income = total_income
|
|
|
|
@api.depends('housing_id')
|
|
def _get_total_net(self):
|
|
for rec in self:
|
|
if rec.state == 'draft':
|
|
rec.total_net = 0.0
|
|
rec.financial_aid = 0.0
|
|
if rec.total_expenses >= rec.total_income:
|
|
rec.total_net = rec.total_expenses - rec.total_income
|
|
else:
|
|
rec.total_net = rec.total_income - rec.total_expenses
|
|
if rec.total_net < 0:
|
|
rec.financial_aid = (abs(rec.total_net) * .5)
|
|
|
|
|
|
class HouseNeed(models.Model):
|
|
_name = 'house.need'
|
|
_description = 'House Need'
|
|
|
|
benefit_need_id = fields.Many2one(
|
|
'benefit.need',
|
|
string='',
|
|
required=False)
|
|
housing_id = fields.Many2one(
|
|
'benefit.housing',
|
|
string='',
|
|
related="benefit_need_id.housing_id",
|
|
required=False)
|
|
room_id = fields.Many2one(
|
|
'benefit.housing.rooms',
|
|
string='',
|
|
domain="[('housing_id', '=', housing_id)]",
|
|
required=False)
|
|
needs = fields.Char(
|
|
string='',
|
|
required=False)
|
|
needs_percentage = fields.Float(
|
|
string='',
|
|
required=False)
|