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) ], order='sla_version asc', limit=limit) i = 1 indexMatch = 1 for product in products: qty_available = 0 for stock in product.stock_quant_ids: if stock.location_id.id == 57: qty_available += stock.quantity qty_available -= 10 _logger.info(f'Product SLA: {i}/{len(products)}') i += 1 if len(product.stock_move_ids) == 0 and qty_available <= 0: continue _logger.info(f'Match Product SLA: {indexMatch}') indexMatch += 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(qty_available) def generate_product_sla(self, qty_available): self.avg_leadtime = '-' self.sla = '-' total_stock_moves = len(self.product_variant_id.stock_move_ids) if total_stock_moves > 0: if qty_available > 10: self.sla = '1 Hari' elif qty_available <= 0: self.sla = 'barang mempunyai stock move tetapi tidak ada qty available' query = [ ('product_id', '=', self.product_variant_id.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-6 Hari' elif rounded_leadtime >= 6 and rounded_leadtime <= 10: self.sla = '4-12 Hari' elif rounded_leadtime >= 11: self.sla = 'Indent' else: self.sla = 'tidak masuk kondisi manapun' self.product_variant_id.sla_version += 1