268 lines
13 KiB
Python
268 lines
13 KiB
Python
from asyncore import write
|
|
|
|
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']
|
|
_order = "name desc"
|
|
|
|
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)
|
|
benefit_type = fields.Selection(string='Benefit Type', related='service_type_id.benefit_type')
|
|
branch_ids = fields.Many2many('branch.settings', 'service_branch_rel', 'service_id', 'branch_id', string='Branches',
|
|
required=True, domain="[('has_employees', '=', True)]")
|
|
family_category_ids = fields.Many2many(
|
|
'benefit.category',
|
|
'service_category_rel',
|
|
'service_id',
|
|
'category_id',
|
|
string='Family Category',
|
|
compute='_compute_family_category_ids', )
|
|
aid_amount = fields.Float(string="Aid Amount", compute="_compute_amounts", store=True, readonly=False)
|
|
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, ondelete="set null")
|
|
state = fields.Selection(selection=[
|
|
('draft', 'Draft'),
|
|
('calculated', 'Calculated'),
|
|
('gm_assistant', 'Waiting Assistant General Manager'),
|
|
('accounting_approve', 'Accounting Approve'),
|
|
('waiting_receive', 'Waiting for Receive'),
|
|
('done', 'Done'),
|
|
], string='state', default='draft', tracking=True, copy=False)
|
|
is_payment_order_done = fields.Boolean(string='Is Payment Order Done?', copy=False)
|
|
payment_order_state = fields.Selection(string='Payment Order State', selection=[
|
|
('none', 'None'),
|
|
('waiting', 'Waiting Payment'),
|
|
('done', 'Done Payment'), ], copy=False, compute="_compute_payment_order_state", store=True)
|
|
account_id = fields.Many2one('account.account', string='Expenses Account', related="service_type_id.account_id")
|
|
service_requests_ids = fields.One2many('service.request', 'seasonal_service_id', string='Service Requests')
|
|
benefit_ids = fields.Many2many(comodel_name='grant.benefit', relation='benefit_grant_seasonal_service_rel',
|
|
column1='seasonal_service_id',
|
|
column2='benefit_id', string='Families', copy=False)
|
|
member_ids = fields.Many2many(comodel_name='family.member', relation='family_member_seasonal_service_rel',
|
|
column1='seasonal_service_id',
|
|
column2='family_member_id', string='Family Members', copy=False)
|
|
family_domain_ids = fields.Many2many(comodel_name='grant.benefit', compute='_compute_domain_ids',
|
|
string="Eligible Families")
|
|
service_delivery_method = fields.Selection(selection=[
|
|
('cash', 'Cash'),
|
|
('in_kind', 'In kind'), ], string='Service Delivery Method', default='cash')
|
|
is_in_kind = fields.Boolean(string="In Kind", related="service_type_id.in_kind")
|
|
company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env.user.company_id)
|
|
currency_id = fields.Many2one('res.currency', string="Currency", related='company_id.currency_id')
|
|
|
|
@api.depends('payment_order_id', 'payment_order_id.state')
|
|
def _compute_payment_order_state(self):
|
|
for rec in self:
|
|
payment_order_state = 'none'
|
|
if rec.payment_order_state:
|
|
if rec.payment_order_id.state == "done":
|
|
payment_order_state = "done"
|
|
rec.service_requests_ids.write({'state': 'send_request_to_supplier'})
|
|
rec.state = 'waiting_receive'
|
|
else:
|
|
payment_order_state = "waiting"
|
|
rec.payment_order_state = payment_order_state
|
|
|
|
@api.depends('branch_ids', 'family_category_ids')
|
|
def _compute_domain_ids(self):
|
|
for rec in self:
|
|
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))
|
|
if self.family_category_ids:
|
|
domain.append(('benefit_category_id', 'in', self.family_category_ids.ids))
|
|
|
|
families = self.env['grant.benefit'].sudo().search(domain)
|
|
rec.family_domain_ids = families
|
|
|
|
@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
|
|
|
|
def unlink(self):
|
|
for service in self:
|
|
if service.state not in ['draft']:
|
|
raise UserError(_('You cannot delete this record'))
|
|
return super(SeasonalService, self).unlink()
|
|
|
|
@api.onchange('service_type_id')
|
|
def _onchange_service_type_id(self):
|
|
if self.benefit_ids:
|
|
self.benefit_ids = [(5, 0, 0)]
|
|
if self.member_ids:
|
|
self.member_ids = [(5, 0, 0)]
|
|
|
|
def action_create_payment_order(self):
|
|
for rec in self:
|
|
if rec.state != 'accounting_approve':
|
|
raise UserError(_("All selected requests should be in Accounting Approve state"))
|
|
if rec.payment_order_id:
|
|
raise UserError(_("There are already disbursement orders associated with the request(s)."))
|
|
self.env['payment.orders'].create({
|
|
'state': 'draft',
|
|
'accountant_id': rec.service_type_id.accountant_id.id,
|
|
'seasonal_requests_ids': rec.ids,
|
|
'service_requests_ids': rec.service_requests_ids.ids,
|
|
'is_seasonal': True,
|
|
'type': 'seasonal_services',
|
|
})
|
|
# rec.payment_order_id = payment_order.id
|
|
rec.is_payment_order_done = True
|
|
|
|
@api.depends('service_requests_ids')
|
|
def compute_family_benefit(self):
|
|
for record in self:
|
|
families = record.service_requests_ids.mapped('family_id')
|
|
family_count = len(families)
|
|
member_count = sum(record.service_requests_ids.mapped('service_benefit_count'))
|
|
record.family_count = family_count
|
|
record.benefit_member_count = member_count
|
|
|
|
@api.depends('service_type_id')
|
|
def _compute_amounts(self):
|
|
for record in self:
|
|
if record.service_type_id and record.service_delivery_method == 'cash':
|
|
record.aid_amount = record.service_type_id.max_amount
|
|
else:
|
|
record.aid_amount = 0
|
|
|
|
@api.depends('service_requests_ids')
|
|
def _compute_family_disbursement(self):
|
|
for record in self:
|
|
if record.service_requests_ids:
|
|
if record.service_delivery_method == "cash":
|
|
record.family_disbursement_total_amount = sum(
|
|
record.service_requests_ids.mapped('requested_service_amount'))
|
|
else:
|
|
record.family_disbursement_total_amount = sum(
|
|
record.service_requests_ids.mapped('service_qty'))
|
|
else:
|
|
record.family_disbursement_total_amount = 0.0
|
|
|
|
def action_first_approval(self):
|
|
for rec in self:
|
|
if not rec.service_requests_ids:
|
|
raise UserError(_("You must add at least one service request."))
|
|
if rec.service_type_id.needs_beneficiary_manager_approval:
|
|
rec.state = 'gm_assistant'
|
|
rec.service_requests_ids.write({'state': 'gm_assistant'})
|
|
elif rec.service_delivery_method == "cash":
|
|
# rec.action_create_payment_order()
|
|
rec.state = "accounting_approve"
|
|
rec.service_requests_ids.write({'state': 'accounting_approve'})
|
|
elif rec.service_delivery_method == "in_kind":
|
|
rec.state = 'waiting_receive'
|
|
rec.service_requests_ids.write({'state': 'send_request_to_supplier'})
|
|
|
|
def action_approval_of_gm_assistant(self):
|
|
for rec in self:
|
|
if rec.service_delivery_method == "cash":
|
|
# rec.action_create_payment_order()
|
|
rec.state = "accounting_approve"
|
|
rec.service_requests_ids.write({'state': 'accounting_approve'})
|
|
elif rec.service_delivery_method == "in_kind":
|
|
rec.state = 'waiting_receive'
|
|
rec.service_requests_ids.write({'state': 'send_request_to_supplier'})
|
|
|
|
def action_done(self):
|
|
for rec in self:
|
|
rec.state = 'done'
|
|
rec.service_requests_ids.write({'state': 'family_received_device'})
|
|
|
|
def action_calculate(self):
|
|
for rec in self:
|
|
rec._generate_service_requests()
|
|
rec.state = 'calculated'
|
|
|
|
def action_recalculate(self):
|
|
for rec in self:
|
|
rec.service_requests_ids.unlink()
|
|
rec._generate_service_requests()
|
|
|
|
def _generate_service_requests(self):
|
|
Service = self.env['service.request']
|
|
|
|
for rec in self:
|
|
if not rec.benefit_ids:
|
|
raise UserError(_("You must add at least one family."))
|
|
|
|
if rec.benefit_type == "family":
|
|
for benefit in rec.benefit_ids:
|
|
service_request = Service.create({
|
|
'family_id': benefit.id,
|
|
'service_cat': rec.service_type_id.id,
|
|
'seasonal_service_id': rec.id,
|
|
'benefit_type': rec.benefit_type,
|
|
})
|
|
service_request.onchange_requested_service_amount()
|
|
|
|
if rec.service_delivery_method == "cash":
|
|
service_request.requested_service_amount = service_request.service_max_amount
|
|
if service_request.requested_service_amount == 0:
|
|
service_request.unlink()
|
|
else:
|
|
service_request.requested_service_amount = 0
|
|
service_request.is_in_kind = True
|
|
service_request.service_qty = rec.aid_amount
|
|
|
|
else:
|
|
if not rec.member_ids:
|
|
raise UserError(_("You must add at least one member."))
|
|
for member in rec.member_ids:
|
|
if not member.benefit_id:
|
|
raise UserError(_("Member %s has no related family (benefit).") % member.name)
|
|
|
|
service_request = Service.create({
|
|
'family_id': member.benefit_id.id,
|
|
'member_id': member.id,
|
|
'service_cat': rec.service_type_id.id,
|
|
'seasonal_service_id': rec.id,
|
|
'benefit_type': rec.benefit_type,
|
|
})
|
|
|
|
service_request.onchange_requested_service_amount()
|
|
|
|
if rec.service_delivery_method == "cash":
|
|
service_request.requested_service_amount = service_request.service_max_amount
|
|
if service_request.requested_service_amount == 0:
|
|
service_request.unlink()
|
|
else:
|
|
service_request.requested_service_amount = 0
|
|
service_request.is_in_kind = True
|
|
service_request.service_qty = rec.aid_amount
|
|
|
|
def action_reset_to_draft(self):
|
|
for rec in self:
|
|
rec.service_requests_ids.write({'state': 'draft'})
|
|
rec.service_requests_ids.unlink()
|
|
rec.state = 'draft'
|
|
|
|
def action_reset_to_calculated(self):
|
|
for rec in self:
|
|
rec.service_requests_ids.write({'state': 'draft'})
|
|
rec.state = 'calculated'
|