Files
Odoo-Modules/fusion_claims/models/product_template.py
gsinghpal e71bc503f9 changes
2026-02-25 09:40:41 -05:00

187 lines
6.3 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2024-2025 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Claim Assistant product family.
from odoo import api, fields, models
class ProductTemplate(models.Model):
_inherit = 'product.template'
# ==========================================================================
# ADP PRODUCT FIELDS
# These are the module's own fields - independent of Odoo Studio
# ==========================================================================
x_fc_adp_device_code = fields.Char(
string='ADP Device Code',
help='Device code used for ADP claims export',
copy=True,
tracking=True,
)
x_fc_adp_price = fields.Float(
string='ADP Price',
digits='Product Price',
help='ADP retail price for this product. Used in ADP reports and claims.',
copy=True,
tracking=True,
)
x_fc_is_adp_product = fields.Boolean(
string='Is ADP Product',
compute='_compute_is_adp_product',
store=True,
help='Indicates if this product has ADP pricing set up',
)
# ==========================================================================
# LOANER PRODUCT FIELDS
# ==========================================================================
x_fc_can_be_loaned = fields.Boolean(
string='Can be Loaned',
default=False,
help='If checked, this product can be loaned out to clients',
)
x_fc_loaner_period_days = fields.Integer(
string='Loaner Period (Days)',
default=7,
help='Default number of free loaner days before rental conversion',
)
x_fc_rental_price_weekly = fields.Float(
string='Weekly Rental Price',
digits='Product Price',
help='Rental price per week if loaner converts to rental',
)
x_fc_rental_price_monthly = fields.Float(
string='Monthly Rental Price',
digits='Product Price',
help='Rental price per month if loaner converts to rental',
)
# ==========================================================================
# LOANER EQUIPMENT FIELDS
# ==========================================================================
x_fc_equipment_type = fields.Selection([
('type_1_walker', 'Type 1 Walker'),
('type_2_mw', 'Type 2 MW'),
('type_2_pw', 'Type 2 PW'),
('type_2_walker', 'Type 2 Walker'),
('type_3_mw', 'Type 3 MW'),
('type_3_pw', 'Type 3 PW'),
('type_3_walker', 'Type 3 Walker'),
('type_4_mw', 'Type 4 MW'),
('type_5_mw', 'Type 5 MW'),
('ceiling_lift', 'Ceiling Lift'),
('mobility_scooter', 'Mobility Scooter'),
('patient_lift', 'Patient Lift'),
('transport_wheelchair', 'Transport Wheelchair'),
('standard_wheelchair', 'Standard Wheelchair'),
('power_wheelchair', 'Power Wheelchair'),
('cushion', 'Cushion'),
('backrest', 'Backrest'),
('stairlift', 'Stairlift'),
('others', 'Others'),
], string='Equipment Type')
x_fc_wheelchair_category = fields.Selection([
('type_1', 'Type 1'),
('type_2', 'Type 2'),
('type_3', 'Type 3'),
('type_4', 'Type 4'),
('type_5', 'Type 5'),
], string='Wheelchair Category')
x_fc_seat_width = fields.Char(string='Seat Width')
x_fc_seat_depth = fields.Char(string='Seat Depth')
x_fc_seat_height = fields.Char(string='Seat Height')
x_fc_storage_location = fields.Selection([
('warehouse', 'Warehouse'),
('westin_brampton', 'Westin Brampton'),
('mobility_etobicoke', 'Mobility Etobicoke'),
('scarborough_storage', 'Scarborough Storage'),
('client_loaned', 'Client/Loaned'),
('rented_out', 'Rented Out'),
], string='Storage Location')
x_fc_listing_type = fields.Selection([
('owned', 'Owned'),
('borrowed', 'Borrowed'),
], string='Listing Type')
x_fc_asset_number = fields.Char(string='Asset Number')
x_fc_package_info = fields.Text(string='Package Information')
# ==========================================================================
# COMPUTED FIELDS
# ==========================================================================
@api.depends('x_fc_adp_device_code', 'x_fc_adp_price')
def _compute_is_adp_product(self):
"""Determine if this is an ADP product based on having device code or price."""
for product in self:
product.x_fc_is_adp_product = bool(
product.x_fc_adp_device_code or product.x_fc_adp_price
)
# ==========================================================================
# HELPER METHODS
# ==========================================================================
def get_adp_price(self):
"""
Get ADP price with fallback to Studio field.
Checks in order:
1. x_fc_adp_price (module field)
2. list_price (default product price)
"""
self.ensure_one()
if self.x_fc_adp_price:
return self.x_fc_adp_price
return self.list_price or 0.0
def get_adp_device_code(self):
"""
Get ADP device code.
Checks in order:
1. x_fc_adp_device_code (module field)
2. default_code (internal reference)
"""
self.ensure_one()
if self.x_fc_adp_device_code:
return self.x_fc_adp_device_code
return self.default_code or ''
# ==========================================================================
# SECURITY DEPOSIT (added by fusion_rental)
# ==========================================================================
x_fc_security_deposit_type = fields.Selection(
[
('fixed', 'Fixed Amount'),
('percentage', 'Percentage of Rental Price'),
],
string='Security Deposit Type',
help='How the security deposit is calculated for this rental product.',
)
x_fc_security_deposit_amount = fields.Float(
string='Security Deposit Amount',
digits='Product Price',
help='Fixed dollar amount for the security deposit.',
)
x_fc_security_deposit_percent = fields.Float(
string='Security Deposit (%)',
help='Percentage of the rental line price to charge as deposit.',
)