1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
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)
|