from odoo import models, fields, api
import math
from collections import defaultdict
from odoo.tools.misc import format_amount

class Battery_Installation_Requirement(models.Model):
    _name = 'sos_proposal_boq'
    _description = 'Battery Installation Details'
    _rec_name="proposal_id"
    _order = 'proposal_id asc' 
    _sql_constraints = [
    ('unique_proposal_id', 'unique(proposal_id)', 'Proposal ID must be unique!')
]
    proposal_id = fields.Many2one('sos_proposal_customer_requirement',string="Proposal ID", required= True,
                                  domain=lambda self: [('id', 'not in', self.env['sos_proposal_boq'].search([]).mapped('proposal_id').ids)])
    customer_name = fields.Char(string="Customer Name")
    location = fields.Char(string="Location")
    number_of_batteries = fields.Integer(string="Number of Batteries")
    number_of_strings = fields.Integer(string="Number of Strings")
    number_of_ups = fields.Integer(string="Number of UPS",store=True)
    ups_rating_kva = fields.Integer(string="UPS Rating (KVA)")
    no_of_electrical_panel = fields.Integer(string="No of Electrical Panel")
    battery_capacity_ah = fields.Integer(string="Battery Capacity (AH)")
    products = fields.Selection([
        ('BHMS 1.2V', 'BHMS 1.2V'), 
                ('BHMS 2V', 'BHMS 2V'), 
                ('BHMS 12V', 'BHMS 12V'),  
                ('BHMS 48V', 'BHMS 48V'),
                ('BMS-HV', 'BMS-HV'),
                ('BMS-LV 100A', 'BMS-LV 100A'), 
                ('BMS-LV 40A', 'BMS-LV 40A'), 
                ('SBMS 55A', 'SBMS 55A'),              
                ('MC 250W', 'MC 250W'),                                
                ('HeartTarang', 'HeartTarang')                  
    ], string="Products")
    main_master_count= fields.Integer(string="No of Master")
    main_slave_count= fields.Integer(string="No of Slave")
    line_ids_material = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Materials",copy=True)
    line_ids_sfg = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="Semi-Finished Goods",copy=True)
    line_ids_fg = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="Finished Goods",copy=True)
    line_ids_miscellaneous = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id',string="")
    line_ids_installation_kit = fields.One2many('sos_proposal_line_material_installation', 'ref_id',string="")
    boq_submitted_by_name = fields.Many2one('res.users', string='BOQ Submitted By')
    boq_submitted_by_image = fields.Image(related="boq_submitted_by_name.signature_image",readonly=True)
    boq_submitted_by_approved_on = fields.Datetime(string="Submitted On")
    currency_id = fields.Many2one(
    'res.currency',
    string='Currency',
    default=lambda self: self.env['res.currency'].search([('name', '=', 'INR')], limit=1).id or False
)
    total_fg_cost = fields.Monetary(compute='_compute_total_fg_cost', string="Total FG Cost", currency_field='currency_id', readonly=True)
    total_sfg_cost = fields.Monetary(compute='_compute_total_sfg_cost', string="Total SFG Cost", currency_field='currency_id', readonly=True)
    total_material_cost = fields.Monetary(compute='_compute_total_material_cost', string="Total Material Cost", currency_field='currency_id', readonly=True)
    total_installation_material_cost = fields.Monetary(compute='_compute_total_installation_material_cost', string="Total Installation Cost", currency_field='currency_id', readonly=True)
    total_miscellaneous_cost = fields.Monetary(compute='_compute_total_miscellaneous_cost', string="Total Miscellaneous Cost", currency_field='currency_id', readonly=True)
    total_cost = fields.Monetary(compute='_compute_total_cost', string="Total Cost", currency_field='currency_id', readonly=True)
    acc_approved_by_name = fields.Many2one('res.users', string='Accounts By')
    acc_approved_by_image = fields.Image(related="acc_approved_by_name.signature_image",readonly=True)
    acc_approved_on = fields.Datetime(string="Approved On")
    warranty_cost = fields.Monetary(string="Warranty Cost", compute='_compute_warranty', store=True, currency_field='currency_id')
    margin = fields.Monetary(string="Opreational Cost",compute='_compute_margin', currency_field='currency_id')
    margin_per_battery = fields.Monetary(string="Opreational Cost per Battery", currency_field='currency_id')
    warranty_percentage = fields.Float(string="Warranty(%)")
    final_cost = fields.Monetary(string="Final Cost", compute='_compute_final_cost', store=True, currency_field='currency_id')
    final_cost_per_battery = fields.Monetary(string="Final Cost", compute='_compute_final_cost_per_battery', store=True, currency_field='currency_id')
    communication_type = fields.Selection([
        ('wired', 'Wired'),
        ('wireless', 'Wireless')
    ], string="Communication Type", default='wired')
    specific_requirements = fields.Html(string="Specific Requirements")

    #CE Team Fields
    engineers_nos=fields.Integer(string="No of engineers required")
    no_of_days=fields.Integer(string="No of days")
    extra_cost_line_ids = fields.One2many('sos_extra_cost_lines', 'ref_id',copy=True)

    # mode_of_transport = fields.Selection([('car','🚗 Car'),('bus','🚌 Bus'),('train','🚂 Train'),('flight','🛩️ Flight')],string='Mode of Transport',default="train")
    # transport_expense = fields.Monetary(readonly=False,string="Transport", compute='_compute_transport_expense', store=True, currency_field='currency_id')
    # food_expense = fields.Monetary(readonly=False,string="Food", compute='_compute_food_expense', store=True, currency_field='currency_id')
    # stay_expense = fields.Monetary(readonly=False,string="Room Rent", compute='_compute_stay_expense', store=True, currency_field='currency_id')
    # local_expense = fields.Monetary(readonly=False,string="Local Conveyance", compute='_compute_local_expense', store=True, currency_field='currency_id')
    man_month_1to2_yrs_persons = fields.Integer(string="Man Month (Persons) 1 to 2 Yrs")
    man_month_2to3_yrs_persons = fields.Integer(string="Man Month (Persons) 2 to 3 Yrs")
    man_month_manager_persons = fields.Integer(string="Man Month (Persons) Manager Yrs")
    man_month_1to2_yrs_cost = fields.Monetary(string="Cost", currency_field='currency_id')
    man_month_2to3_yrs_cost = fields.Monetary(string="Cost", currency_field='currency_id')
    man_month_manager_cost = fields.Monetary(string="Cost", currency_field='currency_id')
    iandc_costing=fields.Monetary(readonly=False,string="I & C Costing",currency_field='currency_id',compute='_compute_iandc_expense')
    #FG Fields
    line_ids_fg_ups1 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 1",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups2 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 2",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups3 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 3",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups4 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 4",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups5 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 5",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups6 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 6",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups7 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 7",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups8 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 8",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups9 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 9",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups10 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 10",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups11 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 11",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups12 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 12",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups13 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 13",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups14 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 14",compute='_compute_line_ids_by_ups',store=False)
    line_ids_fg_ups15 = fields.One2many('sos_proposal_boq_fg', 'ref_id', string="FG UPS 15",compute='_compute_line_ids_by_ups',store=False)
    merged_fg_html = fields.Html(string="FG (Merged)", compute="_compute_merged_fg_html", sanitize=False)
    merged_sfg_html = fields.Html(string="SFG (Merged)", compute="_compute_merged_sfg_html", sanitize=False)
    merged_material_html = fields.Html(string="Materials (Merged)", compute="_compute_merged_material_html", sanitize=False)
    merged_installation_kit_html = fields.Html(string="InstallationKit (Merged)", compute="_compute_merged_installation_kit_html", sanitize=False)
    merged_miscellaneous_html = fields.Html(string="Miscellaneous (Merged)", compute="_compute_merged_miscellaneous_html", sanitize=False)
    merged_spare_html = fields.Html(string="Spare (Merged)", compute="_compute_merged_spare_html", sanitize=False)



    #SFG Fields
    line_ids_sfg_ups1 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 1",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups2 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 2",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups3 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 3",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups4 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 4",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups5 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 5",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups6 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 6",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups7 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 7",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups8 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 8",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups9 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 9",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups10 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 10",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups11 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 11",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups12 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 12",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups13 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 13",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups14 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 14",compute='_compute_line_ids_by_ups',store=False)
    line_ids_sfg_ups15 = fields.One2many('sos_proposal_boq_sfg', 'ref_id', string="SFG UPS 15",compute='_compute_line_ids_by_ups',store=False)


    #Material Fields
    line_ids_material_ups1 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 1",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups2 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 2",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups3 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 3",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups4 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 4",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups5 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 5",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups6 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 6",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups7 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 7",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups8 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 8",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups9 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 9",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups10 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 10",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups11 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 11",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups12 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 12",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups13 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 13",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups14 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 14",compute='_compute_line_ids_by_ups',store=False,readonly=False)
    line_ids_material_ups15 = fields.One2many('sos_proposal_boq_material', 'ref_id', string="Material UPS 15",compute='_compute_line_ids_by_ups',store=False,readonly=False)


    #Installation Kit Fields
    line_ids_installation_kit_ups1 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 1",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups2 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 2",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups3 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 3",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups4 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 4",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups5 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 5",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups6 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 6",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups7 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 7",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups8 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 8",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups9 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 9",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups10 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 10",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups11 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 11",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups12 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 12",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups13 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 13",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups14 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 14",compute='_compute_line_ids_by_ups',store=False)
    line_ids_installation_kit_ups15 = fields.One2many('sos_proposal_line_material_installation', 'ref_id', string="Installation Kit UPS 15",compute='_compute_line_ids_by_ups',store=False)

    #Miscellaneous Kit Fields
    line_ids_miscellaneous_ups1 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 1",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups2 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 2",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups3 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 3",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups4 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 4",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups5 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 5",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups6 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 6",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups7 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 7",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups8 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 8",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups9 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 9",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups10 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 10",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups11 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 11",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups12 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 12",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups13 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 13",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups14 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 14",compute='_compute_line_ids_by_ups',store=False)
    line_ids_miscellaneous_ups15 = fields.One2many('sos_proposal_miscellaneous_items', 'ref_id', string="Miscellaneous UPS 15",compute='_compute_line_ids_by_ups',store=False)
    
    #ups totals
    ups1_total = fields.Float(string="UPS 1 Total Cost",compute='_compute_ups_total',store=True)
    ups2_total = fields.Float(string="UPS 2 Total Cost", compute='_compute_ups_total', store=True)
    ups3_total = fields.Float(string="UPS 3 Total Cost", compute='_compute_ups_total', store=True)
    ups4_total = fields.Float(string="UPS 4 Total Cost", compute='_compute_ups_total', store=True)
    ups5_total = fields.Float(string="UPS 5 Total Cost", compute='_compute_ups_total', store=True)
    ups6_total = fields.Float(string="UPS 6 Total Cost", compute='_compute_ups_total', store=True)
    ups7_total = fields.Float(string="UPS 7 Total Cost", compute='_compute_ups_total', store=True)
    ups8_total = fields.Float(string="UPS 8 Total Cost", compute='_compute_ups_total', store=True)
    ups9_total = fields.Float(string="UPS 9 Total Cost", compute='_compute_ups_total', store=True)
    ups10_total = fields.Float(string="UPS 10 Total Cost", compute='_compute_ups_total', store=True)
    ups11_total = fields.Float(string="UPS 11 Total Cost", compute='_compute_ups_total', store=True)
    ups12_total = fields.Float(string="UPS 12 Total Cost", compute='_compute_ups_total', store=True)
    ups13_total = fields.Float(string="UPS 13 Total Cost", compute='_compute_ups_total', store=True)
    ups14_total = fields.Float(string="UPS 14 Total Cost", compute='_compute_ups_total', store=True)
    ups15_total = fields.Float(string="UPS 15 Total Cost", compute='_compute_ups_total', store=True)

    extra_lines_cost = fields.Monetary(string="Cost", compute='_compute_extra_lines_cost', store=True, currency_field='currency_id')
    packing_and_forwarding = fields.Monetary(string="Packing & Forwarding", currency_field='currency_id',store=True)
    additional_warranty = fields.Monetary(string="Additional Warranty", currency_field='currency_id',store=True)
    line_ids_spare_ups1 = fields.One2many('sos_proposal_line_spare_ups1','ref_id', string="Spare UPS 1")
    line_ids_spare_ups2 = fields.One2many('sos_proposal_line_spare_ups2', 'ref_id',string="Spare UPS 2")
    line_ids_spare_ups3 = fields.One2many('sos_proposal_line_spare_ups3','ref_id', string="Spare UPS 3")
    line_ids_spare_ups4 = fields.One2many('sos_proposal_line_spare_ups4', 'ref_id',string="Spare UPS 4")
    line_ids_spare_ups5 = fields.One2many('sos_proposal_line_spare_ups5','ref_id', string="Spare UPS 5")
    line_ids_spare_ups6 = fields.One2many('sos_proposal_line_spare_ups6', 'ref_id',string="Spare UPS 6")
    line_ids_spare_ups7 = fields.One2many('sos_proposal_line_spare_ups7','ref_id', string="Spare UPS 7")
    line_ids_spare_ups8 = fields.One2many('sos_proposal_line_spare_ups8','ref_id', string="Spare UPS 8")
    line_ids_spare_ups9 = fields.One2many('sos_proposal_line_spare_ups9','ref_id', string="Spare UPS 9")
    line_ids_spare_ups10 = fields.One2many('sos_proposal_line_spare_ups10','ref_id', string="Spare UPS 10")
    line_ids_spare_ups11 = fields.One2many('sos_proposal_line_spare_ups11','ref_id', string="Spare UPS 11")
    line_ids_spare_ups12 = fields.One2many('sos_proposal_line_spare_ups12','ref_id', string="Spare UPS 12")
    line_ids_spare_ups13 = fields.One2many('sos_proposal_line_spare_ups13','ref_id', string="Spare UPS 13")
    line_ids_spare_ups14 = fields.One2many('sos_proposal_line_spare_ups14','ref_id', string="Spare UPS 14")
    line_ids_spare_ups15 = fields.One2many('sos_proposal_line_spare_ups15','ref_id', string="Spare UPS 15")
    def _compute_merged_spare_html(self):
        for rec in self:
            # Collect lines from ups1..ups15 (skip models that don't exist)
            models = [f'sos_proposal_line_spare_ups{i}' for i in range(1, 16)]

            agg = defaultdict(float)  # (component_id, uom, currency_id, unit_price) -> qty
            name_map, curr_map, price_map = {}, {}, {}

            for model in models:
                if model not in self.env:
                    continue
                for l in self.env[model].search([('ref_id', '=', rec.id)]):
                    unit_price = l.unit_price or 0.0
                    curr_id = l.currency_id.id if l.currency_id else False
                    key = (l.component_id.id, l.uom, curr_id, unit_price)

                    agg[key] += float(l.quantity or 0)
                    if key not in name_map:
                        # Use part number (fallback to component name if needed)
                        name_map[key] = (getattr(l.component_id, 'part_no', False) or l.component_id.name or '')
                        curr_map[key] = l.currency_id if l.currency_id else False
                        price_map[key] = unit_price

            rows_sorted = sorted(agg.items(), key=lambda it: name_map[it[0]].lower())
            if not rows_sorted:
                rec.merged_spare_html = "<em>No Material items.</em>"
                continue

            def fmt_price(amount, currency):
                return format_amount(self.env, amount, currency) if currency else f"{amount:.2f}"

            total_sum = 0.0
            rows_html = ""
            for key, qty in rows_sorted:
                if not qty:
                    continue
                total_price = qty * price_map[key]
                total_sum += total_price
                rows_html += (
                    f"<tr>"
                    f"<td>{name_map[key]}</td>"
                    f"<td>{key[1] or ''}</td>"
                    f"<td style='text-align:right'>{fmt_price(price_map[key], curr_map[key])}</td>"
                    f"<td style='text-align:right'>{qty:.2f}</td>"
                    f"<td style='text-align:right'>{fmt_price(total_price, curr_map[key])}</td>"
                    f"</tr>"
                )

            if not rows_html:
                rec.merged_spare_html = "<em>No Material items.</em>"
                continue

            currency_for_total = curr_map[rows_sorted[0][0]] if rows_sorted else False
            rows_html += (
                f"<tr style='font-weight:bold;'>"
                f"<td colspan='4' style='text-align:right'>Grand Total:</td>"
                f"<td style='text-align:right'>{fmt_price(total_sum, currency_for_total)}</td>"
                f"</tr>"
            )

            rec.merged_spare_html = f"""
                <table class="table table-sm" style="width:100%;">
                <thead>
                    <tr>
                    <th><b>Material Name</b></th>
                    <th><b>UoM</b></th>
                    <th style="text-align:right"><b>Unit Price</b></th>
                    <th style="text-align:right"><b>Total Qty</b></th>
                    <th style="text-align:right"><b>Total Price</b></th>
                    </tr>
                </thead>
                <tbody>{rows_html}</tbody>
                </table>
            """
    def _compute_merged_miscellaneous_html(self):
        for rec in self:
            lines = self.env['sos_proposal_miscellaneous_items'].search([('ref_id', '=', rec.id)])

            # Group by (component, currency, cost)
            agg = defaultdict(float)
            name_map = {}
            curr_map = {}
            price_map = {}

            for l in lines:
                cost = l.cost or 0.0
                curr_id = l.currency_id.id if l.currency_id else False
                key = (l.name, curr_id, cost)

                agg[key] += float(l.quantity or 0)
                if key not in name_map:
                    name_map[key] = l.name or ''
                    curr_map[key] = l.currency_id if l.currency_id else False
                    price_map[key] = cost

            rows_sorted = sorted(agg.items(), key=lambda it: name_map[it[0]].lower())
            if not rows_sorted:
                rec.merged_miscellaneous_html = "<em>No Miscellaneous items.</em>"
                continue

            def fmt_price(amount, currency):
                if currency:
                    return format_amount(self.env, amount, currency)
                return f"{amount:.2f}"

            total_sum = 0.0
            rows_html = ""
            for key, qty in rows_sorted:
                if not qty:  # Skip rows with qty = 0
                    continue
                total_price = qty * price_map[key]
                total_sum += total_price
                rows_html += (
                    f"<tr>"
                    f"<td>{name_map[key]}</td>"
                    f"<td style='text-align:right'>{fmt_price(price_map[key], curr_map[key])}</td>"
                    f"<td style='text-align:right'>{qty:.2f}</td>"
                    f"<td style='text-align:right'>{fmt_price(total_price, curr_map[key])}</td>"
                    f"</tr>"
                )

            if not rows_html:  # If all rows were skipped
                rec.merged_miscellaneous_html = "<em>No Miscellaneous items.</em>"
                continue

            # Add grand total row
            currency_for_total = curr_map[rows_sorted[0][0]] if rows_sorted else False
            rows_html += (
                f"<tr style='font-weight:bold;'>"
                f"<td colspan='3' style='text-align:right'>Grand Total:</td>"
                f"<td style='text-align:right'>{fmt_price(total_sum, currency_for_total)}</td>"
                f"</tr>"
            )

            rec.merged_miscellaneous_html = f"""
                <table class="table table-sm" style="width:100%;">
                <thead>
                    <tr>
                    <th><b>Name</b></th>
                    <th style="text-align:right"><b>Unit Price</b></th>
                    <th style="text-align:right"><b>Total Qty</b></th>
                    <th style="text-align:right"><b>Total Price</b></th>
                    </tr>
                </thead>
                <tbody>{rows_html}</tbody>
                </table>
            """
    def _compute_merged_installation_kit_html(self):
        for rec in self:
            lines = self.env['sos_proposal_line_material_installation'].search([('ref_id', '=', rec.id)])

            # Group by (component, uom, currency, unit_price)
            agg = defaultdict(float)
            name_map = {}
            curr_map = {}
            price_map = {}

            for l in lines:
                unit_price = l.unit_price or 0.0
                curr_id = l.currency_id.id if l.currency_id else False
                key = (l.component_id.id, l.uom, curr_id, unit_price)

                agg[key] += float(l.quantity or 0)
                if key not in name_map:
                    name_map[key] = l.component_id.part_no or ''
                    curr_map[key] = l.currency_id if l.currency_id else False
                    price_map[key] = unit_price

            rows_sorted = sorted(agg.items(), key=lambda it: name_map[it[0]].lower())
            if not rows_sorted:
                rec.merged_installation_kit_html = "<em>No Material items.</em>"
                continue

            def fmt_price(amount, currency):
                if currency:
                    return format_amount(self.env, amount, currency)
                return f"{amount:.2f}"

            total_sum = 0.0
            rows_html = ""
            for key, qty in rows_sorted:
                if not qty:  # Skip rows with qty = 0
                    continue
                total_price = qty * price_map[key]
                total_sum += total_price
                rows_html += (
                    f"<tr>"
                    f"<td>{name_map[key]}</td>"
                    f"<td>{key[1] or ''}</td>"
                    f"<td style='text-align:right'>{fmt_price(price_map[key], curr_map[key])}</td>"
                    f"<td style='text-align:right'>{qty:.2f}</td>"
                    f"<td style='text-align:right'>{fmt_price(total_price, curr_map[key])}</td>"
                    f"</tr>"
                )

            if not rows_html:  # If all rows were skipped
                rec.merged_installation_kit_html = "<em>No Material items.</em>"
                continue

            # Add grand total row
            currency_for_total = curr_map[rows_sorted[0][0]] if rows_sorted else False
            rows_html += (
                f"<tr style='font-weight:bold;'>"
                f"<td colspan='4' style='text-align:right'>Grand Total:</td>"
                f"<td style='text-align:right'>{fmt_price(total_sum, currency_for_total)}</td>"
                f"</tr>"
            )

            rec.merged_installation_kit_html = f"""
                <table class="table table-sm" style="width:100%;">
                <thead>
                    <tr>
                    <th><b>Material Name</b></th>
                    <th><b>UoM</b></th>
                    <th style="text-align:right"><b>Unit Price</b></th>
                    <th style="text-align:right"><b>Total Qty</b></th>
                    <th style="text-align:right"><b>Total Price</b></th>
                    </tr>
                </thead>
                <tbody>{rows_html}</tbody>
                </table>
            """
    def _compute_merged_material_html(self):
        for rec in self:
            lines = self.env['sos_proposal_boq_material'].search([('ref_id', '=', rec.id)])

            # Group by (component, uom, currency, unit_price)
            agg = defaultdict(float)
            name_map = {}
            curr_map = {}
            price_map = {}

            for l in lines:
                unit_price = l.unit_price or 0.0
                curr_id = l.currency_id.id if l.currency_id else False
                key = (l.component_id.id, l.uom, curr_id, unit_price)

                agg[key] += float(l.quantity or 0)
                if key not in name_map:
                    name_map[key] = l.component_id.part_no or ''
                    curr_map[key] = l.currency_id if l.currency_id else False
                    price_map[key] = unit_price

            rows_sorted = sorted(agg.items(), key=lambda it: name_map[it[0]].lower())
            if not rows_sorted:
                rec.merged_material_html = "<em>No Material items.</em>"
                continue

            def fmt_price(amount, currency):
                if currency:
                    return format_amount(self.env, amount, currency)
                return f"{amount:.2f}"

            total_sum = 0.0
            rows_html = ""
            for key, qty in rows_sorted:
                if not qty:  # Skip rows with qty = 0
                    continue
                total_price = qty * price_map[key]
                total_sum += total_price
                rows_html += (
                    f"<tr>"
                    f"<td>{name_map[key]}</td>"
                    f"<td>{key[1] or ''}</td>"
                    f"<td style='text-align:right'>{fmt_price(price_map[key], curr_map[key])}</td>"
                    f"<td style='text-align:right'>{qty:.2f}</td>"
                    f"<td style='text-align:right'>{fmt_price(total_price, curr_map[key])}</td>"
                    f"</tr>"
                )

            if not rows_html:  # If all rows were skipped
                rec.merged_material_html = "<em>No Material items.</em>"
                continue

            # Add grand total row
            currency_for_total = curr_map[rows_sorted[0][0]] if rows_sorted else False
            rows_html += (
                f"<tr style='font-weight:bold;'>"
                f"<td colspan='4' style='text-align:right'>Grand Total:</td>"
                f"<td style='text-align:right'>{fmt_price(total_sum, currency_for_total)}</td>"
                f"</tr>"
            )

            rec.merged_material_html = f"""
                <table class="table table-sm" style="width:100%;">
                <thead>
                    <tr>
                    <th><b>Material Name</b></th>
                    <th><b>UoM</b></th>
                    <th style="text-align:right"><b>Unit Price</b></th>
                    <th style="text-align:right"><b>Total Qty</b></th>
                    <th style="text-align:right"><b>Total Price</b></th>
                    </tr>
                </thead>
                <tbody>{rows_html}</tbody>
                </table>
            """
    def _compute_merged_sfg_html(self):
        for rec in self:
            lines = self.env['sos_proposal_boq_sfg'].search([('ref_id', '=', rec.id)])

            # Group by (component, uom, currency, unit_price)
            agg = defaultdict(float)
            name_map = {}
            curr_map = {}
            price_map = {}

            for l in lines:
                unit_price = l.unit_price or 0.0
                curr_id = l.currency_id.id if l.currency_id else False
                key = (l.component_id.id, l.uom, curr_id, unit_price)

                agg[key] += float(l.quantity or 0)
                if key not in name_map:
                    name_map[key] = l.component_id.name or ''
                    curr_map[key] = l.currency_id if l.currency_id else False
                    price_map[key] = unit_price

            rows_sorted = sorted(agg.items(), key=lambda it: name_map[it[0]].lower())
            if not rows_sorted:
                rec.merged_sfg_html = "<em>No SFG items.</em>"
                continue

            def fmt_price(amount, currency):
                if currency:
                    return format_amount(self.env, amount, currency)
                return f"{amount:.2f}"

            total_sum = 0.0
            rows_html = ""
            for key, qty in rows_sorted:
                if not qty:  # Skip rows with qty = 0
                    continue
                total_price = qty * price_map[key]
                total_sum += total_price
                rows_html += (
                    f"<tr>"
                    f"<td>{name_map[key]}</td>"
                    f"<td>{key[1] or ''}</td>"
                    f"<td style='text-align:right'>{fmt_price(price_map[key], curr_map[key])}</td>"
                    f"<td style='text-align:right'>{qty:.2f}</td>"
                    f"<td style='text-align:right'>{fmt_price(total_price, curr_map[key])}</td>"
                    f"</tr>"
                )

            if not rows_html:  # If all rows were skipped
                rec.merged_sfg_html = "<em>No SFG items.</em>"
                continue

            # Add grand total row
            currency_for_total = curr_map[rows_sorted[0][0]] if rows_sorted else False
            rows_html += (
                f"<tr style='font-weight:bold;'>"
                f"<td colspan='4' style='text-align:right'>Grand Total:</td>"
                f"<td style='text-align:right'>{fmt_price(total_sum, currency_for_total)}</td>"
                f"</tr>"
            )

            rec.merged_sfg_html = f"""
                <table class="table table-sm" style="width:100%;">
                <thead>
                    <tr>
                    <th><b>SFG Name</b></th>
                    <th><b>UoM</b></th>
                    <th style="text-align:right"><b>Unit Price</b></th>
                    <th style="text-align:right"><b>Total Qty</b></th>
                    <th style="text-align:right"><b>Total Price</b></th>
                    </tr>
                </thead>
                <tbody>{rows_html}</tbody>
                </table>
            """
    def _compute_merged_fg_html(self):
        for rec in self:
            lines = self.env['sos_proposal_boq_fg'].search([('ref_id', '=', rec.id)])

            # Group by (component, uom, currency, unit_price)
            agg = defaultdict(float)
            name_map = {}
            curr_map = {}
            price_map = {}

            for l in lines:
                unit_price = l.unit_price or 0.0
                curr_id = l.currency_id.id if l.currency_id else False
                key = (l.component_id.id, l.uom, curr_id, unit_price)

                agg[key] += float(l.quantity or 0)
                if key not in name_map:
                    name_map[key] = l.component_id.name or ''
                    curr_map[key] = l.currency_id if l.currency_id else False
                    price_map[key] = unit_price

            rows_sorted = sorted(agg.items(), key=lambda it: name_map[it[0]].lower())
            if not rows_sorted:
                rec.merged_fg_html = "<em>No FG items.</em>"
                continue

            def fmt_price(amount, currency):
                if currency:
                    return format_amount(self.env, amount, currency)
                return f"{amount:.2f}"

            total_sum = 0.0
            rows_html = ""
            for key, qty in rows_sorted:
                if not qty:  # Skip rows with qty = 0
                    continue
                total_price = qty * price_map[key]
                total_sum += total_price
                rows_html += (
                    f"<tr>"
                    f"<td>{name_map[key]}</td>"
                    f"<td>{key[1] or ''}</td>"
                    f"<td style='text-align:right'>{fmt_price(price_map[key], curr_map[key])}</td>"
                    f"<td style='text-align:right'>{qty:.2f}</td>"
                    f"<td style='text-align:right'>{fmt_price(total_price, curr_map[key])}</td>"
                    f"</tr>"
                )

            if not rows_html:  # If all rows were skipped
                rec.merged_fg_html = "<em>No FG items.</em>"
                continue

            # Add grand total row
            currency_for_total = curr_map[rows_sorted[0][0]] if rows_sorted else False
            rows_html += (
                f"<tr style='font-weight:bold;'>"
                f"<td colspan='4' style='text-align:right'>Grand Total:</td>"
                f"<td style='text-align:right'>{fmt_price(total_sum, currency_for_total)}</td>"
                f"</tr>"
            )

            rec.merged_fg_html = f"""
                <table class="table table-sm" style="width:100%;">
                <thead>
                    <tr>
                    <th><b>FG Name</b></th>
                    <th><b>UoM</b></th>
                    <th style="text-align:right"><b>Unit Price</b></th>
                    <th style="text-align:right"><b>Total Qty</b></th>
                    <th style="text-align:right"><b>Total Price</b></th>
                    </tr>
                </thead>
                <tbody>{rows_html}</tbody>
                </table>
            """

    @api.model
    def create(self, vals):
        res = super().create(vals)
        if 'boq_submitted_by_name' in vals:
            res._trigger_recompute_on_target_model()
        elif 'acc_approved_by_name' in vals:
            res._trigger_recompute_on_target_model_acc()
        return res

    def write(self, vals):
        result = super().write(vals)
        if 'boq_submitted_by_name' in vals:
            self._trigger_recompute_on_target_model()
        elif 'acc_approved_by_name' in vals:
            self._trigger_recompute_on_target_model_acc()
        return result

    def _trigger_recompute_on_target_model(self):
        related_records = self.env['sos_proposal_customer_requirement'].search([('proposal_id', '=', self.proposal_id.id)])
        for rec in related_records:
            rec._compute_boq_submitted_by()
    def _trigger_recompute_on_target_model_acc(self):
        related_records = self.env['sos_proposal_customer_requirement'].search([('proposal_id', '=', self.proposal_id.id)])
        for rec in related_records:
            rec._compute_acc_costing_submitted_by()

    # @api.depends('no_of_days')
    # def _compute_local_expense(self):
    #     for rec in self:
    #         rec.local_expense = rec.no_of_days * 500
    # @api.depends('no_of_days')
    # def _compute_stay_expense(self):
    #     for rec in self:
    #         rec.stay_expense = rec.no_of_days * 2500
    # @api.depends('no_of_days')
    # def _compute_food_expense(self):
    #     for rec in self:
    #         rec.food_expense = rec.no_of_days * 600
    # @api.depends('no_of_days')
    # def _compute_transport_expense(self):
    #     for rec in self:
    #         rec.transport_expense = 5000

    @api.depends('no_of_days','man_month_1to2_yrs_persons','man_month_2to3_yrs_persons','man_month_manager_persons','man_month_1to2_yrs_cost','man_month_2to3_yrs_cost','man_month_manager_cost')
    def _compute_iandc_expense(self):
        for rec in self:
            rec.iandc_costing = ((rec.man_month_1to2_yrs_persons * rec.man_month_1to2_yrs_cost) +
                                (rec.man_month_2to3_yrs_persons * rec.man_month_2to3_yrs_cost) +
                                (rec.man_month_manager_persons * rec.man_month_manager_cost)) * rec.no_of_days
    
    @api.depends('extra_cost_line_ids.cost')
    def _compute_extra_lines_cost(self):
        for record in self:
            record.extra_lines_cost = sum(line.cost for line in record.extra_cost_line_ids)
    
    @api.depends('iandc_costing','warranty_cost', 'total_cost','margin','extra_lines_cost','packing_and_forwarding','additional_warranty')
    def _compute_final_cost(self):
        for rec in self:
            rec.final_cost = rec.warranty_cost + rec.total_cost + rec.margin + rec.extra_lines_cost + rec.packing_and_forwarding + rec.additional_warranty + rec.iandc_costing

    @api.depends('total_cost', 'warranty_percentage')
    def _compute_warranty(self):
        for rec in self:
            base = rec.total_cost or 0.0
            percent = rec.warranty_percentage or 0
            rec.warranty_cost = (percent / 100.0) * base
    @api.depends('margin_per_battery', 'number_of_batteries')
    def _compute_margin(self):
        for rec in self:
            if rec.number_of_batteries:
                rec.margin= rec.margin_per_battery * rec.number_of_batteries
            else:
                rec.margin = 0.0
    @api.depends('final_cost', 'number_of_batteries')
    def _compute_final_cost_per_battery(self):
        for rec in self:
            if rec.number_of_batteries:
                rec.final_cost_per_battery = rec.final_cost / rec.number_of_batteries
            else:
                rec.final_cost_per_battery = 0.0
        
    @api.depends(
    'line_ids_fg.total_price', 'line_ids_fg.ups_index', 'line_ids_fg.production_cost',
    'line_ids_sfg.total_price', 'line_ids_sfg.ups_index', 'line_ids_sfg.production_cost',
    'line_ids_material.total_price', 'line_ids_material.ups_index', 'line_ids_material.production_cost',
    'line_ids_installation_kit.total_price', 'line_ids_installation_kit.ups_index', 'line_ids_installation_kit.production_cost',
    'line_ids_miscellaneous.total_price', 'line_ids_miscellaneous.ups_index', 'line_ids_miscellaneous.production_cost',
    'line_ids_spare_ups1.total_price', 'line_ids_spare_ups1.production_cost',
    'line_ids_spare_ups2.total_price', 'line_ids_spare_ups2.production_cost',
    'line_ids_spare_ups3.total_price', 'line_ids_spare_ups3.production_cost',
    'line_ids_spare_ups4.total_price', 'line_ids_spare_ups4.production_cost',
    'line_ids_spare_ups5.total_price', 'line_ids_spare_ups5.production_cost',
    'line_ids_spare_ups6.total_price', 'line_ids_spare_ups6.production_cost',
    'line_ids_spare_ups7.total_price', 'line_ids_spare_ups7.production_cost',
    'line_ids_spare_ups8.total_price', 'line_ids_spare_ups8.production_cost',
    'line_ids_spare_ups9.total_price', 'line_ids_spare_ups9.production_cost',
    'line_ids_spare_ups10.total_price', 'line_ids_spare_ups10.production_cost',
    'line_ids_spare_ups11.total_price', 'line_ids_spare_ups11.production_cost',
    'line_ids_spare_ups12.total_price', 'line_ids_spare_ups12.production_cost',
    'line_ids_spare_ups13.total_price', 'line_ids_spare_ups13.production_cost',
    'line_ids_spare_ups14.total_price', 'line_ids_spare_ups14.production_cost',
    'line_ids_spare_ups15.total_price', 'line_ids_spare_ups15.production_cost'
    )
    def _compute_ups_total(self):
        for rec in self:
            for i in range(1, 16):
                total = 0
                for field_name in [
                    'line_ids_fg',
                    'line_ids_sfg',
                    'line_ids_material',
                    'line_ids_installation_kit',
                    'line_ids_miscellaneous',
                     f'line_ids_spare_ups{i}',
                ]:
                    lines = getattr(rec, field_name)
                    total += sum(
                        line.total_price for line in lines
                        if line.ups_index == i and line.production_cost
                    )
                setattr(rec, f'ups{i}_total', total)
    @api.depends(
    'line_ids_fg.ups_index',
    'line_ids_sfg.ups_index',
    'line_ids_material.ups_index',
    'line_ids_installation_kit.ups_index',
    'line_ids_miscellaneous.ups_index'
    )
    def _compute_line_ids_by_ups(self):
        for rec in self:
            rec.line_ids_fg_ups1 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 1)
            rec.line_ids_fg_ups2 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 2)
            rec.line_ids_fg_ups3 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 3)
            rec.line_ids_fg_ups4 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 4)
            rec.line_ids_fg_ups5 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 5)
            rec.line_ids_fg_ups6 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 6)
            rec.line_ids_fg_ups7 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 7)
            rec.line_ids_fg_ups8 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 8)
            rec.line_ids_fg_ups9 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 9)
            rec.line_ids_fg_ups10 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 10)
            rec.line_ids_fg_ups11 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 11)
            rec.line_ids_fg_ups12 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 12)
            rec.line_ids_fg_ups13 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 13)
            rec.line_ids_fg_ups14 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 14)
            rec.line_ids_fg_ups15 = rec.line_ids_fg.filtered(lambda l: l.ups_index == 15)

            rec.line_ids_sfg_ups1 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 1)
            rec.line_ids_sfg_ups2 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 2)
            rec.line_ids_sfg_ups3 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 3)
            rec.line_ids_sfg_ups4 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 4)
            rec.line_ids_sfg_ups5 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 5)
            rec.line_ids_sfg_ups6 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 6)
            rec.line_ids_sfg_ups7 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 7)
            rec.line_ids_sfg_ups8 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 8)
            rec.line_ids_sfg_ups9 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 9)
            rec.line_ids_sfg_ups10 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 10)
            rec.line_ids_sfg_ups11 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 11)
            rec.line_ids_sfg_ups12 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 12)
            rec.line_ids_sfg_ups13 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 13)
            rec.line_ids_sfg_ups14 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 14)
            rec.line_ids_sfg_ups15 = rec.line_ids_sfg.filtered(lambda l: l.ups_index == 15)

            rec.line_ids_material_ups1 = rec.line_ids_material.filtered(lambda l: l.ups_index == 1)
            rec.line_ids_material_ups2 = rec.line_ids_material.filtered(lambda l: l.ups_index == 2)
            rec.line_ids_material_ups3 = rec.line_ids_material.filtered(lambda l: l.ups_index == 3)
            rec.line_ids_material_ups4 = rec.line_ids_material.filtered(lambda l: l.ups_index == 4)
            rec.line_ids_material_ups5 = rec.line_ids_material.filtered(lambda l: l.ups_index == 5)
            rec.line_ids_material_ups6 = rec.line_ids_material.filtered(lambda l: l.ups_index == 6)
            rec.line_ids_material_ups7 = rec.line_ids_material.filtered(lambda l: l.ups_index == 7)
            rec.line_ids_material_ups8 = rec.line_ids_material.filtered(lambda l: l.ups_index == 8)
            rec.line_ids_material_ups9 = rec.line_ids_material.filtered(lambda l: l.ups_index == 9)
            rec.line_ids_material_ups10 = rec.line_ids_material.filtered(lambda l: l.ups_index == 10)
            rec.line_ids_material_ups11 = rec.line_ids_material.filtered(lambda l: l.ups_index == 11)
            rec.line_ids_material_ups12 = rec.line_ids_material.filtered(lambda l: l.ups_index == 12)
            rec.line_ids_material_ups13 = rec.line_ids_material.filtered(lambda l: l.ups_index == 13)
            rec.line_ids_material_ups14 = rec.line_ids_material.filtered(lambda l: l.ups_index == 14)
            rec.line_ids_material_ups15 = rec.line_ids_material.filtered(lambda l: l.ups_index == 15)
            

            rec.line_ids_installation_kit_ups1 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 1)
            rec.line_ids_installation_kit_ups2 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 2)
            rec.line_ids_installation_kit_ups3 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 3)
            rec.line_ids_installation_kit_ups4 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 4)
            rec.line_ids_installation_kit_ups5 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 5)
            rec.line_ids_installation_kit_ups6 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 6)
            rec.line_ids_installation_kit_ups7 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 7)
            rec.line_ids_installation_kit_ups8 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 8)
            rec.line_ids_installation_kit_ups9 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 9)
            rec.line_ids_installation_kit_ups10 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 10)
            rec.line_ids_installation_kit_ups11 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 11)
            rec.line_ids_installation_kit_ups12 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 12)
            rec.line_ids_installation_kit_ups13 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 13)
            rec.line_ids_installation_kit_ups14 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 14)
            rec.line_ids_installation_kit_ups15 = rec.line_ids_installation_kit.filtered(lambda l: l.ups_index == 15)

            rec.line_ids_miscellaneous_ups1 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 1)
            rec.line_ids_miscellaneous_ups2 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 2)
            rec.line_ids_miscellaneous_ups3 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 3)
            rec.line_ids_miscellaneous_ups4 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 4)
            rec.line_ids_miscellaneous_ups5 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 5)
            rec.line_ids_miscellaneous_ups6 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 6)
            rec.line_ids_miscellaneous_ups7 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 7)
            rec.line_ids_miscellaneous_ups8 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 8)
            rec.line_ids_miscellaneous_ups9 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 9)
            rec.line_ids_miscellaneous_ups10 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 10)
            rec.line_ids_miscellaneous_ups11 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 11)
            rec.line_ids_miscellaneous_ups12 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 12)
            rec.line_ids_miscellaneous_ups13 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 13)
            rec.line_ids_miscellaneous_ups14 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 14)
            rec.line_ids_miscellaneous_ups15 = rec.line_ids_miscellaneous.filtered(lambda l: l.ups_index == 15)


    @api.model
    def create(self, vals):
        record = super().create(vals)
        if vals.get('proposal_id'):
            record._generate_boq_lines_from_proposal()
        return record

    @api.onchange('proposal_id')
    def _onchange_proposal_id(self):
        if not self.proposal_id:
            return

        if self.line_ids_fg or self.line_ids_material or self.line_ids_sfg:
            return

        self.customer_name = self.proposal_id.customer_name
        self.location = self.proposal_id.location
        self.no_of_electrical_panel = self.proposal_id.no_of_electrical_panel
        self.number_of_batteries = self.proposal_id.number_of_batteries
        self.number_of_ups = self.proposal_id.number_of_ups
        self.products = self.proposal_id.products
        self.communication_type = self.proposal_id.communication_type
        self.specific_requirements = self.proposal_id.specific_requirements
        multiplier = max(1, math.ceil(self.proposal_id.number_of_batteries / 20))
        if self.proposal_id.number_of_batteries < 100:
            self.engineers_nos = 1
            self.no_of_days = multiplier
        else:
            self.engineers_nos = 2
            self.no_of_days = multiplier / 2
        packing_calculation = 1200 
        packing_kg_12V = 100 * self.proposal_id.number_of_ups
        direction = self.proposal_id.direction
        if direction == "North":
            forwarding_calculation = 20 * packing_kg_12V
        elif direction == "West":
            forwarding_calculation = 19 * packing_kg_12V
        elif direction == "East":
            forwarding_calculation = 23 * packing_kg_12V
        else:
            forwarding_calculation = 13 * packing_kg_12V
        base_amount = 1.20 * (packing_calculation + forwarding_calculation)
        self.packing_and_forwarding = base_amount * 1.18

        # Clear all lines
        self.line_ids_fg = [(5, 0, 0)]
        self.line_ids_sfg = [(5, 0, 0)]
        self.line_ids_material = [(5, 0, 0)]
        self.line_ids_installation_kit = [(5, 0, 0)]
        self.line_ids_miscellaneous = [(5, 0, 0)]
        self._generate_boq_lines_from_proposal()

    def _generate_boq_lines_from_proposal(self):
        if not self.proposal_id:
            return

        record = self.env['sos_deliverables_config'].search([
            ('fg_name', '=', self.products),
            ('communication_type', '=', self.communication_type)
        ], limit=1)

        if record and self.number_of_ups:
            fg_lines = []
            sfg_lines = []
            material_lines = []
            install_kit_lines = []
            misc_lines = []

            for ups_index in range(1, self.number_of_ups + 1):
                for line in record.fg_ids:
                    single_set_qty = 1
                    if line.item_type == 'Master Panel':
                        single_set_qty = 1 
                    elif line.item_type == 'CT Module':
                        matching_ups_line = self.proposal_id.ups_line_ids.filtered(lambda l: l.ups_index == ups_index)
                        if matching_ups_line:
                            number_of_strings_per_battery = matching_ups_line.number_of_strings_per_battery
                            single_set_qty = number_of_strings_per_battery 
                            ct_module = ((matching_ups_line.ups_capacity_kva * 1000) / (12 * matching_ups_line.number_of_batteries)) / 10
                            if 0 <= ct_module < 100:
                                material_code="MDS070"
                            elif 100 <= ct_module < 200:
                                material_code="MDS071"
                            elif 200 <= ct_module < 300:
                                material_code="MDS069"
                            else:
                                material_code="MDS040"
                            material_record=self.env['sos_material'].search([('material_code', '=', material_code)],limit=1)
                            material_lines.append((0, 0, {
                                'component_id': material_record.id,
                                'uom': material_record.uom,
                                'singet_set_qty':single_set_qty,
                                'unit_price': material_record.unit_price,
                                'description': material_record.description,
                                'ups_index': ups_index,
                                'production_cost':True
                            }))
                    elif line.item_type == 'Slave Module':
                        matching_ups_line = self.proposal_id.ups_line_ids.filtered(lambda l: l.ups_index == ups_index)
                        if matching_ups_line:
                            single_set_qty = math.ceil((matching_ups_line.number_of_batteries)/4) * matching_ups_line.number_of_strings_per_battery
                    name_lower = (line.component_id.name or "").lower()
                    is_electrical_panel = "electrical panel" in name_lower
                    is_panel_exceeding = self.proposal_id.no_of_electrical_panel < ups_index

                    fg_lines.append((0, 0, {
                        'component_id': line.component_id.id,
                        'uom': line.uom,
                        'unit_price': 0.00 if is_panel_exceeding and is_electrical_panel else line.component_id.unit_price,
                        'description': line.description,
                        'item_type': line.item_type,
                        'total_set': 0 if is_panel_exceeding and is_electrical_panel else 1,
                        'singet_set_qty': 0 if is_panel_exceeding and is_electrical_panel else single_set_qty,
                        'production_cost': line.add_production_cost,
                        'ups_index': ups_index
                    }))

                for line in record.sfg_ids:
                    if line.item_type == 'Master Panel':
                        single_set_qty = 1 
                    elif line.item_type == 'CT Module':
                        matching_ups_line = self.proposal_id.ups_line_ids.filtered(lambda l: l.ups_index == ups_index)
                        if matching_ups_line:
                            number_of_strings_per_battery = matching_ups_line.number_of_strings_per_battery
                            single_set_qty = number_of_strings_per_battery # example logic
                    elif line.item_type == 'Slave Module':
                        matching_ups_line = self.proposal_id.ups_line_ids.filtered(lambda l: l.ups_index == ups_index)
                        if matching_ups_line:
                            single_set_qty = math.ceil((matching_ups_line.number_of_batteries)/4) * matching_ups_line.number_of_strings_per_battery

                    sfg_lines.append((0, 0, {
                        'component_id': line.component_id.id,
                        'uom': line.uom,
                        'unit_price': line.component_id.unit_price,
                        'description': line.description,
                        'item_type': line.item_type,
                        'singet_set_qty': single_set_qty,
                        'production_cost': line.add_production_cost,
                        'ups_index': ups_index
                    }))


                for line in record.material_ids:
                    if line.item_type == 'Internet Module' and self.proposal_id.internet_connectivity != 'yes':
                        continue
                    if line.item_type == 'Master Panel':
                        single_set_qty = 1 * line.quantity
                    elif line.item_type == 'CT Module':
                        matching_ups_line = self.proposal_id.ups_line_ids.filtered(lambda l: l.ups_index == ups_index)
                        if matching_ups_line:
                            number_of_strings_per_battery = matching_ups_line.number_of_strings_per_battery
                            single_set_qty = number_of_strings_per_battery * line.quantity
                    elif line.item_type == 'Slave Module':
                        matching_ups_line = self.proposal_id.ups_line_ids.filtered(lambda l: l.ups_index == ups_index)
                        if matching_ups_line:
                            single_set_qty = (math.ceil((matching_ups_line.number_of_batteries)/4) * matching_ups_line.number_of_strings_per_battery) *  line.quantity

                    material_lines.append((0, 0, {
                        'component_id': line.component_id.id,
                        'uom': line.uom,
                        'unit_price': line.component_id.unit_price,
                        'description': line.description,
                        'item_type': line.item_type,
                        'singet_set_qty': single_set_qty,
                        'production_cost': line.add_production_cost,
                        'ups_index': ups_index
                    }))

                for line in record.installation_kit_ids:
                    if line.item_type == 'Master Panel':
                        single_set_qty = 1 * line.quantity
                    elif line.item_type == 'CT Module':
                        matching_ups_line = self.proposal_id.ups_line_ids.filtered(lambda l: l.ups_index == ups_index)
                        if matching_ups_line:
                            number_of_strings_per_battery = matching_ups_line.number_of_strings_per_battery
                            single_set_qty = number_of_strings_per_battery * line.quantity
                    elif line.item_type == 'Slave Module':
                        matching_ups_line = self.proposal_id.ups_line_ids.filtered(lambda l: l.ups_index == ups_index)
                        if matching_ups_line:
                            single_set_qty = (math.ceil((matching_ups_line.number_of_batteries)/4) * matching_ups_line.number_of_strings_per_battery) *  line.quantity

                    install_kit_lines.append((0, 0, {
                        'component_id': line.component_id.id,
                        'uom': line.uom,
                        'unit_price': line.component_id.unit_price,
                        'description': line.description,
                        'item_type': line.item_type,
                        'singet_set_qty': single_set_qty,
                        'production_cost': line.add_production_cost,
                        'ups_index': ups_index
                    }))

                misc_lines += [(0, 0, {
                    'name': line.name,
                    'cost': line.cost,
                    'quantity': line.quantity,
                    'ups_index': ups_index
                }) for line in record.miscellaneous_ids]

            self.write({
                'line_ids_fg': fg_lines,
                'line_ids_sfg': sfg_lines,
                'line_ids_material': material_lines,
                'line_ids_installation_kit': install_kit_lines,
                'line_ids_miscellaneous': misc_lines
            })



    def action_report_btn(self):
        try:
            action = self.env.ref("sos_sales.action_report_proposal_boq").report_action(self)
            return action
        except ValueError as e:
            print(f"Failed to find report action: {e}")
    @api.depends('ups1_total','ups2_total','ups3_total','ups4_total','ups5_total','ups6_total','ups7_total','ups8_total','ups9_total','ups10_total')
    def _compute_total_cost(self):
        for record in self:
            record.total_cost = record.ups1_total + record.ups2_total + record.ups3_total + record.ups4_total + record.ups5_total + record.ups6_total + record.ups7_total + record.ups8_total + record.ups9_total + record.ups10_total 
    
    @api.depends('line_ids_miscellaneous.cost')
    def _compute_total_miscellaneous_cost(self):
        for record in self:
            record.total_miscellaneous_cost = sum(line.total_price for line in record.line_ids_miscellaneous)
    
    @api.depends('line_ids_installation_kit.unit_price')
    def _compute_total_installation_material_cost(self):
        for record in self:
            record.total_installation_material_cost = sum(line.total_price for line in record.line_ids_installation_kit)
    
    @api.depends('line_ids_material.unit_price')
    def _compute_total_material_cost(self):
        for record in self:
            record.total_material_cost = sum(line.total_price for line in record.line_ids_material)
    @api.depends('line_ids_sfg.unit_price')
    def _compute_total_sfg_cost(self):
        for record in self:
            record.total_sfg_cost = sum(line.total_price for line in record.line_ids_sfg)
    @api.depends('line_ids_fg.unit_price')
    def _compute_total_fg_cost(self):
        for record in self:
            record.total_fg_cost = sum(line.total_price for line in record.line_ids_fg)
    def action_ce_esign_btn(self):
        body_html = f"""
            <p>Below <b>BOQ</b> is waiting for your updation.</p>
            <p><b>Customer Name:</b> {self.customer_name or ''}</p>
            <p><b>Location:</b> {self.location or ''}</p>
            <p><b>Number of Batteries:</b> {self.number_of_batteries or ''}</p>
        """

        sequence_util = self.env['sos_common_scripts']
        sequence_util.send_group_email(
                self.env,
                'sos_proposal_boq',
                self.id,
                "deenalaura.m@sosaley.in",
                f"Proposal System - BOQ Submitted for {self.customer_name}",
                body_html,
                'sos_inventory.sos_finance_user'
            )
        return sequence_util.action_assign_signature(
        self, 
        'boq_submitted_by_name',
        'boq_submitted_by_approved_on'
    )
    def action_acc_esign_btn(self):
        sequence_util = self.env['sos_common_scripts']

        body_html = """
        <p>Below <b>Proposal</b> is waiting for your Updation</p>
        """
        req_submitted_by = self.env['sos_proposal_customer_requirement'].search([
            ('proposal_id', '=', self.proposal_id.proposal_id)
        ], limit=1)

        # Send email only if login exists
        if req_submitted_by and req_submitted_by.requirement_submitted_by_name and req_submitted_by.requirement_submitted_by_name.login:
            sequence_util.send_direct_email(
                self.env,
                "sos_proposal_boq",
                self.id,
                req_submitted_by.requirement_submitted_by_name.login,
                f"Costing Done - {self.proposal_id.proposal_id}",
                body_html
            )

        # Assign signature
        return sequence_util.action_assign_signature(
            self, 
            'acc_approved_by_name',
            'acc_approved_on'
        )

class SOS_Proposal_BOQ_Material(models.Model):
    _name = 'sos_proposal_boq_material'
    _description = 'Proposal BOQ Material Lines'

    ref_id = fields.Many2one('sos_proposal_boq', string="Materials", ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'), ('Packs', 'Packs'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",store=True)
    unit_price = fields.Monetary(currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    item_type = fields.Selection([
        ('Master Panel', 'Master Panel'),
        ('CT Module', 'CT Module'),
        ('Slave Module', 'Slave Module'),
        ('Internet Module', 'Internet Module')
    ], string="Type",default="Master Panel")
    production_cost = fields.Boolean(string="Include in Costing")
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price','quantity')
    def _compute_total_price(self):
        for record in self:
            record.total_price = record.unit_price * record.quantity

class SOS_Proposal_BOQ_SFG(models.Model):
    _name = 'sos_proposal_boq_sfg'
    _description = 'Proposal BOQ SFG Lines'

    ref_id = fields.Many2one('sos_proposal_boq', string="SFG", ondelete="cascade")
    currency_id = fields.Many2one('res.currency', string='Currency')
    component_id = fields.Many2one('sos_sfg', string="SFG Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    sfg_code = fields.Char(related="component_id.sfg_code",string="SFG Code")
    sfg_name = fields.Char(related="component_id.name",string="SFG Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",store=True)
    unit_price = fields.Monetary(currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    item_type = fields.Selection([
        ('Master Panel', 'Master Panel'),
        ('CT Module', 'CT Module'),
        ('Slave Module', 'Slave Module'),
        ('Internet Module', 'Internet Module')
    ], string="Type",default="Master Panel")
    production_cost = fields.Boolean(string="Include in Costing")
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        """
        Set the initial value of `unit_price` when `component_id` is changed.
        """
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price','quantity')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00

  
class SOS_Proposal_BOQ_FG(models.Model):
    _name = 'sos_proposal_boq_fg'
    _description = 'Proposal BOQ FG Lines'

    ref_id = fields.Many2one('sos_proposal_boq', string="FG", ondelete="cascade")
    currency_id = fields.Many2one('res.currency', string='Currency')
    component_id = fields.Many2one('sos_fg',string="FG Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    fg_code = fields.Char(related="component_id.fg_code",string="FG Code")
    fg_name = fields.Char(related="component_id.name",string="FG Name")
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",store=True)
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    unit_price = fields.Monetary(currency_field='currency_id',string="Unit Price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    item_type = fields.Selection([
        ('Master Panel', 'Master Panel'),
        ('CT Module', 'CT Module'),
        ('Slave Module', 'Slave Module'),
        ('Internet Module', 'Internet Module')
    ], string="Type",default="Master Panel")
    production_cost = fields.Boolean(string="Include in Costing")    
    ups_index = fields.Integer(string="UPS Index",store=True)       
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price','quantity')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00

class sos_proposal_MiscellaneousCost(models.Model):
    _name = 'sos_proposal_miscellaneous_items'
    _description = 'Miscellaneous Items'

    ref_id = fields.Many2one('sos_proposal_boq', string="Miscellaneous", ondelete="cascade")
    name = fields.Char(string='Name')
    cost = fields.Float(string='Cost')
    quantity = fields.Integer(string="Quantity")
    currency_id = fields.Many2one('res.currency', string='Currency')
    total_price = fields.Monetary(string="Total", currency_field='currency_id',compute="_compute_total_price")
    ups_index = fields.Integer(string="UPS Index",store=True)
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    @api.depends('cost','quantity')
    def _compute_total_price(self):
        for record in self:
            record.total_price = record.cost * record.quantity


class sos_proposal_Material_installationkit(models.Model):
    _name = 'sos_proposal_line_material_installation'
    _description = 'Installation Kit Lines'

    ref_id = fields.Many2one('sos_proposal_boq', string="Materials", ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    item_type = fields.Selection([
        ('Master Panel', 'Master Panel'),
        ('CT Module', 'CT Module'),
        ('Slave Module', 'Slave Module'),
        ('Internet Module', 'Internet Module')
    ], string="Type",default="Master Panel")
    production_cost = fields.Boolean(string="Include in Costing")
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price','quantity','production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00
class sos_proposal_Material_installationkit(models.Model):
    _name = 'sos_proposal_line_spare'
    _description = 'Spare Lines'

    ref_id = fields.Many2one('sos_proposal_boq', string="Materials", ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing")
    ups_index = fields.Integer(string="UPS Index",store=True)

    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price','quantity')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00
class sos_extra_cost_lines(models.Model):
    _name = 'sos_extra_cost_lines'
    _description = 'Extra Lines'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    field_name = fields.Char(string="Name")
    currency_id = fields.Many2one(
    'res.currency',
    string='Currency',
    default=lambda self: self.env['res.currency'].search([('name', '=', 'INR')], limit=1).id or False
)
    cost = fields.Monetary(string="Cost", currency_field='currency_id', store=True)


class sos_spare_material1(models.Model):
    _name = 'sos_proposal_line_spare_ups1'
    _description = 'Spare Material 1'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00

class sos_spare_material2(models.Model):
    _name = 'sos_proposal_line_spare_ups2'
    _description = 'Spare Material 2'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00

class sos_spare_material3(models.Model):
    _name = 'sos_proposal_line_spare_ups3'
    _description = 'Spare Material 3'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00

class sos_spare_material4(models.Model):
    _name = 'sos_proposal_line_spare_ups4'
    _description = 'Spare Material 4'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00

class sos_spare_material5(models.Model):
    _name = 'sos_proposal_line_spare_ups5'
    _description = 'Spare Material 5'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00

class sos_spare_material6(models.Model):
    _name = 'sos_proposal_line_spare_ups6'
    _description = 'Spare Material 6'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00

class sos_spare_material7(models.Model):
    _name = 'sos_proposal_line_spare_ups7'
    _description = 'Spare Material 7'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00

class sos_spare_material8(models.Model):
    _name = 'sos_proposal_line_spare_ups8'
    _description = 'Spare Material 8'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00

class sos_spare_material9(models.Model):
    _name = 'sos_proposal_line_spare_ups9'
    _description = 'Spare Material 9'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00

class sos_spare_material10(models.Model):
    _name = 'sos_proposal_line_spare_ups10'
    _description = 'Spare Material 10'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00
class sos_spare_material11(models.Model):
    _name = 'sos_proposal_line_spare_ups11'
    _description = 'Spare Material 11'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00
class sos_spare_material12(models.Model):
    _name = 'sos_proposal_line_spare_ups12'
    _description = 'Spare Material 12'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00
class sos_spare_material13(models.Model):
    _name = 'sos_proposal_line_spare_ups13'
    _description = 'Spare Material 13'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00
class sos_spare_material14(models.Model):
    _name = 'sos_proposal_line_spare_ups14'
    _description = 'Spare Material 14'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00
class sos_spare_material15(models.Model):
    _name = 'sos_proposal_line_spare_ups15'
    _description = 'Spare Material 15'

    ref_id = fields.Many2one('sos_proposal_boq', ondelete="cascade")
    component_id = fields.Many2one('sos_material', string="Material Name", required=True)
    uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom")
    currency_id = fields.Many2one('res.currency', string='Currency')
    material_code = fields.Char(related="component_id.material_code",string="Material Code")
    material_name = fields.Char(related="component_id.part_no",string="Material Name")
    singet_set_qty = fields.Integer(string="Single Set Quantity",default=1)
    total_set =  fields.Integer(string="Total Set",default=1)
    quantity = fields.Integer(string="Quantity",compute="_compute_set_wise",readonly=False)
    unit_price = fields.Monetary(store=True,currency_field='currency_id',string="Unit Price",related="component_id.unit_price")
    total_price = fields.Monetary(string="Total",compute="_compute_total_price")
    description = fields.Char(string="Description")
    production_cost = fields.Boolean(string="Include in Costing",default=True)
    ups_index = fields.Integer(string="UPS Index",store=True)
    @api.onchange('component_id')
    def _onchange_component_id(self):
        for record in self:
            if record.component_id:
                record.unit_price = record.component_id.unit_price
    @api.depends('singet_set_qty','total_set')
    def _compute_set_wise(self):
        for record in self:
            record.quantity = record.singet_set_qty * record.total_set
    @api.depends('unit_price', 'quantity', 'production_cost')
    def _compute_total_price(self):
        for record in self:
            if record.production_cost:
                record.total_price = record.unit_price * record.quantity
            else:
                record.total_price = 0.00