87 lines
3.3 KiB
Python
Executable File
87 lines
3.3 KiB
Python
Executable File
import base64
|
|
from odoo import models, fields, api
|
|
from openpyxl import load_workbook
|
|
from io import BytesIO
|
|
|
|
class MON_BulkUploadWizard(models.TransientModel):
|
|
_name = 'mon_bulk_upload_wizard'
|
|
_description = 'MON Wizard for Bulk Uploading Materials'
|
|
|
|
upload_file = fields.Binary("Upload File", required=True)
|
|
mon_id = fields.Many2one('sos_mon', string="MON Record")
|
|
|
|
def upload_action(self):
|
|
file_content = base64.b64decode(self.upload_file)
|
|
file_stream = BytesIO(file_content)
|
|
workbook = load_workbook(file_stream)
|
|
worksheet = workbook.active
|
|
mon_record = self.mon_id.id
|
|
|
|
|
|
missing_components = []
|
|
for row in worksheet.iter_rows(min_row=2, values_only=True): # Adjust min_row based on your file structure
|
|
try:
|
|
# Skip rows with None or NA values
|
|
if any(cell is None or cell == 'NA' for cell in row):
|
|
continue
|
|
material_name, qty = row
|
|
component = self.env['sos_material'].search([('part_no', '=', material_name)])
|
|
line_model = self.env['sos_mon_line_material']
|
|
min_line_model = self.env['sos_min_line_material']
|
|
min_record = self.env['sos_min'].search([('mon_no', '=', mon_record)], limit=1)
|
|
if component:
|
|
line_model.create({'mon_id': mon_record,
|
|
'component_id':component.id,
|
|
'quantity':qty
|
|
})
|
|
min_line_model.create({'min_id': min_record.id,
|
|
'component_id':component.id,
|
|
'quantity':qty
|
|
})
|
|
else:
|
|
missing_components.append({'name': material_name, 'quantity': qty})
|
|
except Exception as e:
|
|
# Log the error and continue with the next row
|
|
print(f"Error processing row {row}: {e}")
|
|
continue
|
|
|
|
|
|
# Implement your logic for handling missing components here
|
|
if missing_components:
|
|
# Log or create action for missing components
|
|
return self.create_wizard_with_lines(missing_components, self.id)
|
|
|
|
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'reload'
|
|
}
|
|
@api.model
|
|
def create_wizard_with_lines(self, missing_components, bulk_wizard_id):
|
|
# Create line data for missing components
|
|
line_data = [
|
|
{
|
|
'missing_component_name': component['name'],
|
|
'missing_component_quantity': component['quantity'] # Assuming you have this field in your line model
|
|
} for component in missing_components
|
|
]
|
|
|
|
# Create the wizard and lines in one go
|
|
wizard = self.env['mon_missing_component_wizard'].create({
|
|
'missing_component_line_ids': [(0, 0, line) for line in line_data]
|
|
})
|
|
|
|
view_id = self.env.ref('sos_inventory.view_mon_missing_component_wizard_form').id
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'name': 'Handle Missing Components',
|
|
'view_mode': 'form',
|
|
'res_model': 'mon_missing_component_wizard',
|
|
'view_id': view_id,
|
|
'target': 'new',
|
|
'res_id': wizard.id,
|
|
'context': {
|
|
'default_mon_id': self.id
|
|
}
|
|
}
|