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') sla_logistic = fields.Char(string='SLA Logistic', readonly=True) sla_logistic_unit = fields.Selection( [('jam', 'Jam'),('hari', 'Hari')], string="SLA Logistic Time" ) sla_logistic_duration_unit = fields.Char(string="SLA Logistic Duration (Unit)") 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=500): offset = 0 # while True: products = self.env['product.product'].search([ ('active', '=', True), ('sale_ok', '=', True), ], order='sla_version asc', limit=limit, offset=offset) # if not products: # break for product in products: _logger.info(f'Memproses SLA untuk produk ID {product.id}, versi {product.sla_version}') product_sla = self.search([('product_variant_id', '=', product.id)], limit=1) if not product_sla: product_sla = self.create({'product_variant_id': product.id}) product_sla.generate_product_sla() # Tandai produk sebagai sudah diproses product.sla_version += 1 offset += limit def generate_product_sla(self): # self.sla_logistic = '-' # self.sla_logistic_duration_unit = '-' # self.sla = '-' product = self.product_variant_id q_vendor = [ ('product_id', '=', product.id), ('is_winner', '=', True) ] vendor = self.env['purchase.pricelist'].search(q_vendor) vendor_duration = 0 #SLA Vendor 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 #SLA Logistik selalu 1 hari estimation_sla = (1 * 24 * 60) + vendor_duration estimation_sla_days = estimation_sla / (24 * 60) self.sla = math.ceil(estimation_sla_days) self.sla_logistic = int(1) self.sla_logistic_unit = 'hari' self.sla_logistic_duration_unit = '1 hari' else: self.unlink() else: self.unlink() # 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)/2 # estimation_sla_days = estimation_sla / (24 * 60) # self.sla = math.ceil(estimation_sla_days) # self.avg_leadtime = int(rounded_leadtime)