summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/product_sla.py
blob: dfdf7662be6b8c386e244640e7e0be9b4b61e97a (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
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')
    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)
            print(product_sla.id, product.id)
            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
            
        q_vendor = [
            ('product_id', '=', product.id),
            ('is_winner', '=', True)
        ]
        
        vendor = self.env['purchase.pricelist'].search(q_vendor)
        
        vendor_duration = 0
        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

        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
            estimation_sla_days = estimation_sla / (24 * 60)
            self.sla = math.ceil(estimation_sla_days)
            self.avg_leadtime = int(rounded_leadtime)