from odoo import models, api, fields from odoo.exceptions import AccessError, UserError, ValidationError from datetime import timedelta, date import logging import math _logger = logging.getLogger(__name__) class ProductSla(models.Model): _name = 'product.sla' _description = 'Product Sla' _rec_name = 'product_variant_id' product_variant_id = fields.Many2one('product.product',string='Product') sla_vendor_id = fields.Many2one('vendor.sla',string='Vendor', readonly=True) sla_vendor_duration = fields.Char(string='AVG Leadtime', related='sla_vendor_id.duration_unit') avg_leadtime = fields.Char(string='AVG Leadtime', readonly=True) leadtime = fields.Char(string='Leadtime', readonly=True) sla = fields.Char(string='SLA', readonly=True) version = fields.Integer(string="Version", compute="_compute_version") def _compute_version(self): for sla in self: sla.version = sla.product_variant_id.sla_version def generate_product_variant_id_sla(self, limit=5000): # Filter produk non-Altama products = self.env['product.product'].search([ ('x_manufacture', 'not in', [10, 122, 89]), ('location_id', '=', 57), ('stock_move_ids', '!=', False), ], order='sla_version asc', limit=limit) i = 1 for product in products: _logger.info(f'Product SLA: {i}/{len(products)}') i += 1 product.sla_version += 1 product_sla = self.search([('product_variant_id', '=', product.id)], limit=1) print(product_sla.id, product.id) if not product_sla: product_sla = self.env['product.sla'].create({ 'product_variant_id': product.id, }) product_sla.generate_product_sla() def generate_product_sla(self): self.avg_leadtime = '-' self.sla = '-' product = self.product_variant_id # qty_available = 0 # qty_available = product.qty_onhand_bandengan # if qty_available > 0: # self.sla = 1 q_vendor = [ ('product_id', '=', product.id), ('is_winner', '=', True) ] vendor = self.env['purchase.pricelist'].search(q_vendor) vendor_duration = 0 if vendor: vendor_sla = self.env['vendor.sla'].search([('id_vendor', '=', vendor.vendor_id.id)], limit=1) sla_vendor = int(vendor_sla.duration) if vendor_sla else 0 if sla_vendor > 0: if vendor_sla.unit == 'hari': vendor_duration = vendor_sla.duration * 24 * 60 else : vendor_duration = vendor_sla.duration * 60 self.sla_vendor_id = vendor_sla.id if vendor_sla else False query = [ ('product_id', '=', product.id), ('picking_id', '!=', False), ('picking_id.location_id', '=', 57), ('picking_id.state', 'not in', ['cancel']) ] picking = self.env['stock.move.line'].search(query) leadtimes=[] for stock in picking: date_delivered = stock.picking_id.driver_departure_date date_do_ready = stock.picking_id.date_reserved if date_delivered and date_do_ready: leadtime = date_delivered - date_do_ready leadtime_in_days = leadtime.days leadtimes.append(leadtime_in_days) if len(leadtimes) > 0: avg_leadtime = sum(leadtimes) / len(leadtimes) rounded_leadtime = math.ceil(avg_leadtime) estimation_sla = (rounded_leadtime * 24 * 60) + vendor_duration estimation_sla_days = estimation_sla / (24 * 60) self.sla = math.ceil(estimation_sla_days) self.avg_leadtime = int(rounded_leadtime)