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') 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) 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 Hari' 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_so_confirmed = stock.picking_id.sale_id.date_order if date_delivered and date_so_confirmed: leadtime = date_delivered - date_so_confirmed 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) self.avg_leadtime = rounded_leadtime if rounded_leadtime >= 1 and rounded_leadtime <= 5: self.sla = '3-7 Hari' elif rounded_leadtime >= 6 and rounded_leadtime <= 10: self.sla = '4-12 Hari' elif rounded_leadtime >= 11: self.sla = 'Indent'