79 lines
3.1 KiB
Python
79 lines
3.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from odoo import api, fields, models, _
|
|
|
|
|
|
class WheelchairSectionOption(models.Model):
|
|
_name = 'fusion.wc.section.option'
|
|
_description = 'Wheelchair Section Product Option'
|
|
_order = 'is_standard desc, sequence, id'
|
|
|
|
section_id = fields.Many2one('fusion.wc.section', string='Section',
|
|
required=True, ondelete='cascade', index=True)
|
|
|
|
# ── Parent product (template level) ──
|
|
product_tmpl_id = fields.Many2one('product.template',
|
|
string='Product', required=True, index=True,
|
|
help='The parent product. Variants (size, colour) are chosen '
|
|
'when the sales rep adds this item to an assessment.')
|
|
|
|
sequence = fields.Integer(string='Sequence', default=10)
|
|
|
|
is_standard = fields.Boolean(string='Standard Option', default=False,
|
|
help='Standard options are shown prominently; non-standard found via search')
|
|
|
|
# ── Variant count (computed) ──
|
|
variant_count = fields.Integer(string='Variants',
|
|
compute='_compute_variant_count')
|
|
|
|
# ── ADP info (from template) ──
|
|
adp_device_code = fields.Char(string='ADP Code',
|
|
related='product_tmpl_id.x_fc_adp_device_code', readonly=True)
|
|
adp_price = fields.Float(string='ADP Price',
|
|
related='product_tmpl_id.x_fc_adp_price', readonly=True)
|
|
list_price = fields.Float(string='Sale Price',
|
|
related='product_tmpl_id.list_price', readonly=True)
|
|
|
|
# Build type applicability (for seating sections)
|
|
available_build_types = fields.Selection([
|
|
('modular', 'Modular Only'),
|
|
('custom_fabricated', 'Custom Fabricated Only'),
|
|
('both', 'Both'),
|
|
], string='Build Types', default='both',
|
|
help='Which build types this option is available for')
|
|
|
|
requires_clinical_rationale = fields.Boolean(string='Requires Clinical Rationale',
|
|
help='Sales rep must provide clinical rationale when selecting this option')
|
|
|
|
# Compatibility rules
|
|
incompatible_option_ids = fields.Many2many(
|
|
'fusion.wc.section.option',
|
|
'wc_option_incompatible_rel',
|
|
'option_id', 'incompatible_option_id',
|
|
string='Incompatible With',
|
|
help='Cannot be selected together with these options')
|
|
requires_option_ids = fields.Many2many(
|
|
'fusion.wc.section.option',
|
|
'wc_option_requires_rel',
|
|
'option_id', 'required_option_id',
|
|
string='Requires Options',
|
|
help='These options must be selected first')
|
|
|
|
@api.depends('product_tmpl_id')
|
|
def _compute_variant_count(self):
|
|
for record in self:
|
|
if record.product_tmpl_id:
|
|
record.variant_count = record.product_tmpl_id.product_variant_count
|
|
else:
|
|
record.variant_count = 0
|
|
|
|
@api.depends('product_tmpl_id', 'section_id')
|
|
def _compute_display_name(self):
|
|
for record in self:
|
|
parts = []
|
|
if record.section_id:
|
|
parts.append(record.section_id.name)
|
|
if record.product_tmpl_id:
|
|
parts.append(record.product_tmpl_id.display_name)
|
|
record.display_name = ' / '.join(parts) if parts else ''
|