odex25_standard/odex25_ensan/odex_benefit/models/seasonal_service.py

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}}