update
This commit is contained in:
@@ -263,96 +263,6 @@ class SaleOrder(models.Model):
|
||||
action['res_id'] = self.x_fc_technician_task_ids.id
|
||||
return action
|
||||
|
||||
# LOANER EQUIPMENT TRACKING
|
||||
# ==========================================================================
|
||||
x_fc_loaner_checkout_ids = fields.One2many(
|
||||
'fusion.loaner.checkout',
|
||||
'sale_order_id',
|
||||
string='Loaner Checkouts',
|
||||
help='Loaner equipment checked out for this order',
|
||||
)
|
||||
x_fc_loaner_count = fields.Integer(
|
||||
string='Loaners',
|
||||
compute='_compute_loaner_count',
|
||||
)
|
||||
x_fc_active_loaner_count = fields.Integer(
|
||||
string='Active Loaners',
|
||||
compute='_compute_loaner_count',
|
||||
)
|
||||
x_fc_has_overdue_loaner = fields.Boolean(
|
||||
string='Has Overdue Loaner',
|
||||
compute='_compute_loaner_count',
|
||||
help='True if any active loaner is past its expected return date',
|
||||
)
|
||||
|
||||
@api.depends('x_fc_loaner_checkout_ids', 'x_fc_loaner_checkout_ids.state',
|
||||
'x_fc_loaner_checkout_ids.expected_return_date')
|
||||
def _compute_loaner_count(self):
|
||||
"""Compute loaner counts and overdue status for this order."""
|
||||
today = fields.Date.today()
|
||||
for order in self:
|
||||
active = order.x_fc_loaner_checkout_ids.filtered(
|
||||
lambda l: l.state in ('checked_out', 'overdue', 'rental_pending')
|
||||
)
|
||||
order.x_fc_loaner_count = len(order.x_fc_loaner_checkout_ids)
|
||||
order.x_fc_active_loaner_count = len(active)
|
||||
order.x_fc_has_overdue_loaner = any(
|
||||
l.state == 'overdue' or (l.expected_return_date and l.expected_return_date < today)
|
||||
for l in active
|
||||
)
|
||||
|
||||
def action_view_loaners(self):
|
||||
"""Open the loaner checkouts for this order."""
|
||||
self.ensure_one()
|
||||
action = {
|
||||
'name': 'Loaner Checkouts',
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_model': 'fusion.loaner.checkout',
|
||||
'view_mode': 'tree,form',
|
||||
'domain': [('sale_order_id', '=', self.id)],
|
||||
'context': {'default_sale_order_id': self.id},
|
||||
}
|
||||
if len(self.x_fc_loaner_checkout_ids) == 1:
|
||||
action['view_mode'] = 'form'
|
||||
action['res_id'] = self.x_fc_loaner_checkout_ids.id
|
||||
return action
|
||||
|
||||
def action_checkout_loaner(self):
|
||||
"""Open the loaner checkout wizard."""
|
||||
self.ensure_one()
|
||||
return {
|
||||
'name': 'Checkout Loaner',
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_model': 'fusion.loaner.checkout.wizard',
|
||||
'view_mode': 'form',
|
||||
'target': 'new',
|
||||
'context': {
|
||||
'default_sale_order_id': self.id,
|
||||
'default_partner_id': self.partner_id.id,
|
||||
'default_authorizer_id': self.x_fc_authorizer_id.id if self.x_fc_authorizer_id else False,
|
||||
},
|
||||
}
|
||||
|
||||
def action_checkin_loaner(self):
|
||||
"""Open the return wizard for the active loaner on this order."""
|
||||
self.ensure_one()
|
||||
active_loaners = self.x_fc_loaner_checkout_ids.filtered(
|
||||
lambda l: l.state in ('checked_out', 'overdue', 'rental_pending')
|
||||
)
|
||||
if not active_loaners:
|
||||
raise UserError("No active loaners to check in for this order.")
|
||||
if len(active_loaners) == 1:
|
||||
return active_loaners.action_return()
|
||||
# Multiple active loaners - show the list so user can pick which one to return
|
||||
return {
|
||||
'name': 'Return Loaner',
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_model': 'fusion.loaner.checkout',
|
||||
'view_mode': 'tree,form',
|
||||
'domain': [('id', 'in', active_loaners.ids)],
|
||||
'target': 'current',
|
||||
}
|
||||
|
||||
def action_ready_for_delivery(self):
|
||||
"""Open the task scheduling form to schedule a delivery task.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user