summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/product_sla.py
blob: 04ad2ffdf0df62213ab7c1fc9e1fab13b13a1d42 (plain)
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)