Slink/sos_inventory/models/sos_sfg_quote_generation.py

264 lines
12 KiB
Python
Executable File

from odoo import api, fields, models, _
import logging
from datetime import date,datetime
_logger = logging.getLogger(__name__)
class SOS_SFG_Quote_Generation(models.Model):
_name = 'sos_sfg_quote_generation'
_description = 'SFG Quote Generation'
_rec_name = 'plan_ref_no'
plan_ref_no = fields.Char(
readonly=True, required=True, string='Plan ID'
)
line_ids = fields.One2many('sos_sfg_quote_generation_line', 'plan_id', string='Lines', ondelete='cascade')
def action_generate_wo(self):
wo_model = self.env['sos_wo']
wo_line_model = self.env['sos_wo_line']
supplier_dict = {}
for record in self.line_ids:
if record.final_supplier1_name:
supplier = record.final_supplier1_name
if supplier not in supplier_dict:
supplier_dict[supplier] = []
supplier_dict[supplier].append({
'name': record.material_name,
'product_qty': record.final_supplier1_qty,
'price_unit': record.final_supplier1_quoted_price
})
# if record.final_supplier2_name:
# supplier = record.final_supplier2_name
# if supplier not in supplier_dict:
# supplier_dict[supplier] = []
# supplier_dict[supplier].append({
# 'name': record.material_name,
# 'product_qty': record.final_supplier2_qty,
# 'price_unit': record.final_supplier2_quoted_price
# })
# if record.supplier3_name:
# supplier = record.supplier3_name
# if supplier not in supplier_dict:
# supplier_dict[supplier] = []
# supplier_dict[supplier].append({
# 'name': record.material_name,
# 'product_qty': record.supplier3_qty,
# 'price_unit': record.supplier3_quoted_price
# })
for x, y in supplier_dict.items():
sequence_util = self.env['sos_common_scripts']
wo_no = sequence_util.generate_sequence('sos_wo','WO', 'wo_no')
wo_record = wo_model.create({
'wo_no': wo_no, 'wo_date': date.today(),'supplier_name': x.id,
'supplier_gst_no': x.gst_no, 'sarf_no':x.service_provider_code,
'supplier_address': x.address
})
for components in y:
wo_line_model.create({
'wo_id': wo_record.id, 'component_id': components['name'].id,'qp':components['name'].qp_no,'hsn_code':components['name'].hsn_code,
'quantity': components['product_qty'],'unit_price': components['price_unit'], 'total_price': components['product_qty'] * components['price_unit']
})
message = 'Work Order(s) successfully generated.'
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'message': message,
'type': 'success',
'sticky': False
}
}
def action_generate_quotation(self):
supplier_materials = {}
for item in self.line_ids:
for supplier in item.supplier_name:
if supplier not in supplier_materials:
supplier_materials[supplier] = []
supplier_materials[supplier].append({
'material_name': item.material_name.id,
'required_qty': item.required_qty
})
wizards = []
for supplier, materials in supplier_materials.items():
wizard_lines = [(0, 0, {
'material_name': material['material_name'],
'required_qty': material['required_qty']
}) for material in materials]
wizard = self.env['supplier_sfg_quotation_wizard'].create({
'supplier_id': supplier.id,
'plan_id': self.id,
'line_ids': wizard_lines
})
wizards.append(wizard.id)
return {
'type': 'ir.actions.act_window',
'name': 'Generate Quotation',
'view_mode': 'tree,form',
'res_model': 'supplier_sfg_quotation_wizard',
'domain': [('id', 'in', wizards)],
'target': 'new',
}
class SOS_SFG_Quote_Generation_Line(models.Model):
_name = 'sos_sfg_quote_generation_line'
_description = 'SFG Quote Generation Lines'
plan_id = fields.Many2one('sos_sfg_quote_generation', string='Quote Generation', ondelete='cascade')
required_qty = fields.Integer(string='Planned Qty')
inprogress_qty = fields.Integer(string='In-Progress Qty')
purchase_type = fields.Selection([
('with_materials', 'Materials Provided'),
('without_materials', 'No Materials Provided'),
], string='Purchase Type', required=True, default='without_materials')
supplier_name = fields.Many2many('sos_service_providers', string='Supplier', domain="[('id', 'in', suppliers_ids)]")
suppliers_ids = fields.Many2many('sos_service_providers', compute='_compute_suppliers_ids', store=False)
status = fields.Selection(
[
('open', 'Open'),
('close', 'Closed')
],
default='open',
string="Status",
compute="_compute_from_ir",
inverse="_set_status",
store=True
)
material_name = fields.Many2one('sos_sfg',string="SFG Name")
supplier1_name = fields.Many2one('sos_service_providers',string="Service Provider 1")
supplier1_quoted_price = fields.Integer(string='Price')
supplier1_qty = fields.Integer(string='Qty')
supplier2_name = fields.Many2one('sos_service_providers',string="Service Provider 2")
supplier2_quoted_price = fields.Integer(string='Price')
supplier2_qty = fields.Integer(string='Qty')
supplier3_name = fields.Many2one('sos_service_providers',string="Service Provider 3")
supplier3_quoted_price = fields.Integer(string='Price')
supplier3_qty = fields.Integer(string='Qty')
# Supplier Selection
final_supplier1_name = fields.Many2one('sos_service_providers',string="Service Provider 1")
final_supplier1_quoted_price = fields.Integer(string='Price')
final_supplier1_qty = fields.Integer(string='Qty')
# final_supplier2_name = fields.Many2one('sos_service_providers',string="Service Provider 2")
# final_supplier2_quoted_price = fields.Integer(string='Price')
# final_supplier2_qty = fields.Integer(string='Qty')
# final_supplier3_name = fields.Many2one('sos_service_providers',string="Service Provider 3")
# final_supplier3_quoted_price = fields.Integer(string='Price')
# final_supplier3_qty = fields.Integer(string='Qty')
best_supplier = fields.Many2one('sos_service_providers', string="Best Deal", compute='_compute_best_supplier', store=True)
available_suppliers = fields.Many2many('sos_service_providers', compute='_compute_available_suppliers')
remarks = fields.Char(string="Remarks")
@api.onchange('required_qty', 'inprogress_qty', 'status')
def _onchange_check_inprogress_qty(self):
for rec in self:
if (rec.inprogress_qty >= rec.required_qty and rec.required_qty != 0) or rec.status == 'close':
rec.inprogress_qty = 0
@api.depends('required_qty', 'inprogress_qty')
def _compute_from_ir(self):
for record in self:
if record.inprogress_qty <= 0:
record.status = "close"
else:
record.status = "open"
def _set_status(self):
for record in self:
# Custom logic based on user changes
if record.status == 'close':
# Perform actions for 'close'
pass
elif record.status == 'open':
# Perform actions for 'open'
pass
@api.depends('supplier1_name', 'supplier2_name', 'supplier3_name')
def _compute_available_suppliers(self):
for record in self:
suppliers = []
if record.supplier1_name:
suppliers.append(record.supplier1_name.id)
if record.supplier2_name:
suppliers.append(record.supplier2_name.id)
if record.supplier3_name:
suppliers.append(record.supplier3_name.id)
record.available_suppliers = [(6, 0, suppliers)]
@api.onchange('final_supplier1_name')
def _onchange_final_supplier1_name(self):
if self.final_supplier1_name:
# Check which supplier is selected and update price and quantity accordingly
if self.final_supplier1_name == self.supplier1_name:
self.final_supplier1_quoted_price = self.supplier1_quoted_price
self.final_supplier1_qty = self.supplier1_qty
# elif self.final_supplier1_name == self.supplier2_name:
# self.final_supplier1_quoted_price = self.supplier2_quoted_price
# self.final_supplier1_qty = self.supplier2_qty
# elif self.final_supplier1_name == self.supplier3_name:
# self.final_supplier1_quoted_price = self.supplier3_quoted_price
# self.final_supplier1_qty = self.supplier3_qty
@api.depends('supplier1_quoted_price', 'supplier1_qty',
'supplier2_quoted_price', 'supplier2_qty',
'supplier3_quoted_price', 'supplier3_qty')
def _compute_best_supplier(self):
for record in self:
best_supplier = None
best_score = float('inf')
suppliers = [
(record.supplier1_name, record.supplier1_quoted_price, record.supplier1_qty),
(record.supplier2_name, record.supplier2_quoted_price, record.supplier2_qty),
(record.supplier3_name, record.supplier3_quoted_price, record.supplier3_qty)
]
final_supplier_qty = 0
final_supplier_price = 0
for supplier, price, qty in suppliers:
if supplier:
score = price / qty if qty else float('inf')
if score < best_score:
best_score = score
best_supplier = supplier
final_supplier_qty = qty
final_supplier_price = price
record.best_supplier = best_supplier
record.final_supplier1_name = best_supplier
if best_supplier:
record.final_supplier1_qty = final_supplier_qty
record.final_supplier1_quoted_price = final_supplier_price
@api.onchange('material_name')
def _onchange_material_name(self):
if self.material_name:
supplier_ids = self.material_name.suppliers.ids
if supplier_ids:
self.suppliers_ids = supplier_ids
else:
self.suppliers_ids = self.env['sos_service_providers'].search([]).ids
else:
self.suppliers_ids = self.env['sos_service_providers'].search([]).ids
@api.depends('material_name')
def _compute_suppliers_ids(self):
for record in self:
if record.material_name:
supplier_ids = record.material_name.service_providers.ids
if supplier_ids:
record.suppliers_ids = supplier_ids
else:
record.suppliers_ids = self.env['sos_service_providers'].search([]).ids
else:
record.suppliers_ids = self.env['sos_service_providers'].search([]).ids