218 lines
11 KiB
Python
218 lines
11 KiB
Python
from odoo import fields, models, api, _
|
|
from odoo.exceptions import UserError, ValidationError
|
|
from datetime import timedelta
|
|
from dateutil.relativedelta import relativedelta
|
|
|
|
|
|
class SeasonalService(models.Model):
|
|
_name = 'seasonal.service'
|
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
|
|
|
name = fields.Char(string='Reference', required=True, copy=False, readonly=True, index=True,default=lambda self: _('New'))
|
|
date = fields.Datetime(string='Request Date', default=fields.Datetime.now, copy=False)
|
|
service_type_id = fields.Many2one('services.settings', domain="[('is_seasonal_service','=',True)]",string="Seasonal Service Type", required=True)
|
|
branch_ids = fields.Many2many('branch.settings', 'service_branch_rel', 'service_id', 'branch_id', string='Branches', required=True)
|
|
family_category_ids = fields.Many2many(
|
|
'benefit.category',
|
|
'service_category_rel',
|
|
'service_id',
|
|
'category_id',
|
|
string='Family Category',
|
|
compute='_compute_family_category_ids' ,
|
|
|
|
|
|
)
|
|
|
|
|
|
family_ids = fields.One2many('seasonal.grant.benefit', 'seasonal_service_id', string='Family')
|
|
aid_amount = fields.Float(string="Aid Amount",compute="_compute_aid_amount", store=True)
|
|
benefit_member_count = fields.Integer(string="Benefit Member count", compute="compute_family_benefit", store=True)
|
|
family_count = fields.Integer(string="Family count", compute="compute_family_benefit", store=True)
|
|
family_disbursement_total_amount = fields.Float(string="Total Family Disbursement Amount", compute="_compute_family_disbursement", store=True)
|
|
payment_order_id = fields.Many2one('payment.orders',string='Payment Order', copy= False)
|
|
state = fields.Selection(selection=[
|
|
('draft', 'Draft'),
|
|
('approval_of_beneficiary_services', 'Approval of beneficiary services'),
|
|
('accounting_approve', 'Accounting Approve'),
|
|
|
|
], string='state', default='draft', tracking=True, copy=False)
|
|
is_payment_order_done = fields.Boolean(string='Is Payment Order Done?', copy=False)
|
|
account_id = fields.Many2one('account.account', string='Expenses Account', related="service_type_id.account_id")
|
|
@api.depends('service_type_id','service_type_id.benefit_category_ids')
|
|
def _compute_family_category_ids(self):
|
|
for record in self:
|
|
if record.service_type_id and record.service_type_id.benefit_category_ids:
|
|
record.family_category_ids = record.service_type_id.benefit_category_ids
|
|
else:
|
|
record.family_category_ids = []
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
res = super(SeasonalService, self).create(vals)
|
|
if not res.name or res.name == _('New'):
|
|
res.name = self.env['ir.sequence'].sudo().next_by_code('seasonal.service.sequence') or _('New')
|
|
return res
|
|
|
|
@api.onchange('service_type_id')
|
|
def _onchange_service_type_id(self):
|
|
"""
|
|
Clears the One2many field when service_type_id is changed and data exists in the other field.
|
|
"""
|
|
if self.family_ids:
|
|
self.family_ids = [(5, 0, 0)]
|
|
|
|
def action_open_exchange_order_wizard(self):
|
|
ids = []
|
|
for rec in self:
|
|
ids.append(rec.id)
|
|
seasonal_services = self.env['seasonal.service'].browse(ids)
|
|
if any(request.state not in 'accounting_approve' for request in seasonal_services):
|
|
raise UserError(_("All selected requests should be in Accounting Approve state"))
|
|
if any(request.payment_order_id for request in seasonal_services):
|
|
raise UserError(_("There are already disbursement orders associated with the request(s)."))
|
|
else:
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'name': 'Exchange Order',
|
|
'res_model': 'exchange.order.wizard',
|
|
'view_mode': 'form',
|
|
'target': 'new',
|
|
'context': {'default_service_ids': ids,
|
|
'seasonal_service': True,
|
|
}
|
|
}
|
|
|
|
@api.depends('family_ids', 'family_ids.family_id')
|
|
def compute_family_benefit(self):
|
|
for record in self:
|
|
record.family_count = len(record.family_ids)
|
|
if record.service_type_id and record.service_type_id.service_type == 'eid_gift':
|
|
record.benefit_member_count = len(record.family_ids.family_id.member_ids.filtered(
|
|
lambda x: x.member_status == 'benefit' and x.age <= self.service_type_id.eid_gift_max_age))
|
|
else:
|
|
record.benefit_member_count = sum(record.family_ids.family_id.mapped('benefit_member_count'))
|
|
|
|
@api.depends('service_type_id')
|
|
def _compute_aid_amount(self):
|
|
""" Compute Aid Amount based on service_type_id """
|
|
for record in self:
|
|
aid_amount = 0.0
|
|
if record.service_type_id:
|
|
if record.service_type_id.service_type == 'ramadan_basket':
|
|
aid_amount = record.service_type_id.ramadan_basket_member_amount
|
|
elif record.service_type_id.service_type == 'eid_gift':
|
|
aid_amount = record.service_type_id.eid_gift_member_amount
|
|
elif record.service_type_id.service_type == 'winter_clothing':
|
|
aid_amount = record.service_type_id.winter_clothing_member_amount
|
|
record.write({'aid_amount': aid_amount})
|
|
|
|
@api.depends('service_type_id', 'aid_amount', 'benefit_member_count', 'family_count')
|
|
def _compute_family_disbursement(self):
|
|
""" Compute total disbursement amount based on service type """
|
|
for record in self:
|
|
if record.service_type_id:
|
|
if record.service_type_id.service_type == 'ramadan_basket':
|
|
record.family_disbursement_total_amount = record.aid_amount * record.family_count
|
|
elif record.service_type_id.service_type == 'eid_gift':
|
|
record.family_disbursement_total_amount = record.aid_amount * record.benefit_member_count
|
|
elif record.service_type_id.service_type == 'winter_clothing':
|
|
record.family_disbursement_total_amount = record.aid_amount * record.benefit_member_count
|
|
else:
|
|
record.family_disbursement_total_amount = 0.0
|
|
else:
|
|
record.family_disbursement_total_amount = 0.0
|
|
|
|
|
|
def action_approval_of_beneficiary_services(self):
|
|
for rec in self:
|
|
if not rec.family_ids:
|
|
raise UserError(_("You Must Enter Families First"))
|
|
rec.state = 'approval_of_beneficiary_services'
|
|
|
|
def action_accounting_approve(self):
|
|
for rec in self:
|
|
rec.state = 'accounting_approve'
|
|
|
|
|
|
def get_families(self):
|
|
if self.family_ids:
|
|
self.family_ids.unlink()
|
|
domain = ['|', ('state', '=', 'second_approve'), '&', ('state', 'in', ('waiting_approve','first_approve')),('action_type', '=', 'suspended')]
|
|
if self.branch_ids:
|
|
domain.append(('branch_custom_id', 'in', self.branch_ids.ids)) # Filter by selected branches
|
|
|
|
if self.family_category_ids:
|
|
domain.append(('benefit_category_id', 'in', self.family_category_ids.ids)) # Filter by selected family categories
|
|
|
|
if self.service_type_id and self.service_type_id.service_type == 'eid_gift':
|
|
family_ids = self.env['family.member'].search(
|
|
[('age', '<=', self.service_type_id.eid_gift_max_age),('member_status','=','benefit')]).benefit_id
|
|
|
|
domain.append(('id', 'in', family_ids.ids)) # Append the filtered family IDs to domain
|
|
families = self.env['grant.benefit'].sudo().search(domain)
|
|
if not self.family_ids and families:
|
|
for rec in families:
|
|
self.family_ids = [(0, 0, {
|
|
'family_id': rec.id,
|
|
})]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SeasonalGrantBenefit(models.Model):
|
|
_name = 'seasonal.grant.benefit'
|
|
|
|
family_id = fields.Many2one('grant.benefit',string='Family', required=True)
|
|
family_category = fields.Many2one('benefit.category', string='Family Category',
|
|
related='family_id.benefit_category_id')
|
|
branch_custom_id = fields.Many2one('branch.settings', string="Branch", related='family_id.branch_custom_id',
|
|
store=True)
|
|
aid_amount = fields.Float(string="Aid Amount", compute="_compute_aid_amount", store=True)
|
|
account_id = fields.Many2one('account.account', string='Expenses Account', related='seasonal_service_id.account_id')
|
|
name = fields.Char(string='Reference', related='seasonal_service_id.name')
|
|
service_type_id = fields.Many2one('services.settings', related='seasonal_service_id.service_type_id', string="Seasonal Service Type")
|
|
seasonal_service_id = fields.Many2one('seasonal.service',string='Seasonal Service')
|
|
payment_order_id = fields.Many2one('payment.orders',string='Payment Order')
|
|
|
|
|
|
@api.depends('family_id','service_type_id')
|
|
def _compute_aid_amount(self):
|
|
""" Compute Aid Amount based on service_type_id """
|
|
for record in self:
|
|
aid_amount = 0.0
|
|
# benefit_members = 1
|
|
if record.service_type_id:
|
|
if record.service_type_id.service_type == 'ramadan_basket':
|
|
aid_amount = record.service_type_id.ramadan_basket_member_amount
|
|
elif record.service_type_id.service_type == 'eid_gift' and record.family_id:
|
|
benefit_members = len(record.family_id.member_ids.filtered(lambda x: x.member_status == 'benefit' and x.age <= record.service_type_id.eid_gift_max_age))
|
|
aid_amount = record.service_type_id.eid_gift_member_amount * benefit_members
|
|
elif record.service_type_id.service_type == 'winter_clothing' and record.family_id:
|
|
benefit_members = record.family_id.mapped('benefit_member_count')[0]
|
|
aid_amount = record.service_type_id.winter_clothing_member_amount * benefit_members
|
|
record.write({'aid_amount': aid_amount})
|
|
|
|
@api.onchange('family_id')
|
|
def get_family_id_domain(self):
|
|
domain = ['|', ('state', '=', 'second_approve'), '&', ('state', 'in', ('waiting_approve','first_approve')),('action_type', '=', 'suspended')]
|
|
if self.seasonal_service_id:
|
|
if self.seasonal_service_id.branch_ids:
|
|
domain.append(('branch_custom_id', 'in', self.seasonal_service_id.branch_ids.ids)) # Filter by selected branches
|
|
|
|
if self.seasonal_service_id.family_category_ids:
|
|
domain.append(('benefit_category_id', 'in', self.seasonal_service_id.family_category_ids.ids)) # Filter by selected family categories
|
|
|
|
if self.service_type_id and self.service_type_id.service_type == 'eid_gift':
|
|
family_ids = self.env['family.member'].search(
|
|
[('age', '<=', self.service_type_id.eid_gift_max_age),('member_status','=','benefit')]).benefit_id
|
|
|
|
domain.append(('id', 'in', family_ids.ids)) # Append the filtered family IDs to domain
|
|
families = self.seasonal_service_id.family_ids.mapped('family_id')
|
|
domain.append(('id', 'not in', families.ids))
|
|
return {'domain': {'family_id': domain}}
|
|
|
|
|
|
|