Files
Odoo-Modules/Work in Progress/fusion_quotations/models/wc_upcharge_rule.py
gsinghpal fc3c966484 changes
2026-03-13 12:38:28 -04:00

110 lines
4.1 KiB
Python

# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
class WheelchairUpchargeRule(models.Model):
_name = 'fusion.wc.upcharge.rule'
_description = 'Wheelchair Upcharge Rule'
_order = 'sequence, id'
name = fields.Char(string='Name', required=True,
help='e.g. "Width > 18 inches (WAMA)"')
active = fields.Boolean(string='Active', default=True)
sequence = fields.Integer(string='Sequence', default=10)
# Trigger configuration
trigger_type = fields.Selection([
('measurement', 'Measurement Threshold'),
('weight', 'Client Weight'),
('dimension_mismatch', 'Dimension Mismatch'),
], string='Trigger Type', required=True)
# For measurement triggers
measurement_field = fields.Selection([
('seat_width', 'Seat Width'),
('seat_depth', 'Seat Depth'),
('back_width', 'Backrest Width'),
('back_height', 'Back Height'),
('seat_to_floor', 'Seat to Floor Height'),
('leg_rest_length', 'Leg Rest Length'),
], string='Measurement Field')
comparison = fields.Selection([
('gt', 'Greater Than'),
('gte', 'Greater Than or Equal'),
('lt', 'Less Than'),
('eq', 'Equal To'),
('neq', 'Not Equal To'),
], string='Comparison', default='gt')
threshold_value = fields.Float(string='Threshold Value',
help='e.g. 18.0 for WAMA width threshold')
# For weight triggers
weight_min = fields.Float(string='Min Weight (lbs)',
help='Trigger when client weight exceeds this value')
weight_max = fields.Float(string='Max Weight (lbs)',
help='Upper bound (0 or empty = no upper limit)')
# For dimension mismatch
compare_field_1 = fields.Selection([
('seat_width', 'Seat Width'),
('back_width', 'Backrest Width'),
('seat_depth', 'Seat Depth'),
], string='Compare Field 1')
compare_field_2 = fields.Selection([
('seat_width', 'Seat Width'),
('back_width', 'Backrest Width'),
('seat_depth', 'Seat Depth'),
], string='Compare Field 2')
# What to add when triggered
adp_device_code = fields.Char(string='ADP Device Code', required=True,
help='ADP code to add (e.g. WAMA, WAMB, WAMF)')
product_id = fields.Many2one('product.product', string='Product to Add',
help='If set, this product will be added to the quotation. '
'If empty, a generic line is created from the ADP code.')
# Equipment type applicability
equipment_type = fields.Selection(
selection='_get_equipment_type_selection',
string='Equipment Type', default='both', required=True)
@api.model
def _get_equipment_type_selection(self):
types = self.env['fusion.equipment.type'].sudo().search([], order='sequence')
if types:
result = [(t.code, t.name) for t in types]
result.append(('both', 'Both (All Types)'))
return result
return [
('manual_wheelchair', 'Manual Wheelchair'),
('power_wheelchair', 'Power Wheelchair'),
('both', 'Both'),
]
# Mutual exclusion
mutually_exclusive_group = fields.Char(string='Exclusive Group',
help='Rules in the same group are mutually exclusive '
'(only the highest-priority matching rule applies). '
'e.g. "weight" for WAMF/WAMG/WAMH')
description = fields.Text(string='Description',
help='Explanation shown to the sales rep when this rule triggers')
# Linked ADP device code record (for price lookup)
adp_device_code_id = fields.Many2one('fusion.adp.device.code',
string='ADP Device Code Record',
compute='_compute_adp_device_code_id', store=True)
@api.depends('adp_device_code')
def _compute_adp_device_code_id(self):
ADPDevice = self.env['fusion.adp.device.code'].sudo()
for record in self:
if record.adp_device_code:
record.adp_device_code_id = ADPDevice.search(
[('device_code', '=', record.adp_device_code), ('active', '=', True)],
limit=1
)
else:
record.adp_device_code_id = False