summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/vendor_sla.py
blob: 67b6ffc3adbf1d40ad72853c90f71482b9256504 (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
from odoo import models, fields, api
import logging
import math
_logger = logging.getLogger(__name__)

class VendorSLA(models.Model):
    _name = 'vendor.sla'
    _description = 'Vendor SLA'
    _rec_name = 'id_vendor'
    
    id_vendor = fields.Many2one('res.partner', string='Name', domain="[('industry_id', '=', 46)]")
    duration = fields.Integer(string='Duration', description='SLA Duration')
    unit = fields.Selection(
        [('jam', 'Jam'),('hari', 'Hari')],
        string="SLA Time"
    )
    duration_unit = fields.Char(string="Duration (Unit)", compute="_compute_duration_unit")

        # pertama, lakukan group by vendor pada modul purchase.order
        # kedua, pada setiap Purchase order pada group by vendor tersebut, lakukan penghitungan penjumlahan setiap nilai datetime field date_planed dikurangi date_approve purchase order
        # dibagi jumlah data dari setiap Purchase order pada group by vendor tersebut. hasilnya lalu di gunakan untuk mengset nilai duration
    def generate_vendor_id_sla(self):
        # Step 1: Group purchase orders by vendor (partner_id)
        po_env = self.env['purchase.order']
        pos = po_env.read_group(
            domain=[('state', '=', 'done')],
            fields=['partner_id', 'date_planned', 'date_approve'],
            groupby=['partner_id'],
            lazy=False
        )

        for group in pos:
            partner_id = group['partner_id'][0]
            total_duration = 0
            count = 0

            # Step 2: Calculate the average duration for each vendor
            pos_for_vendor = po_env.search([
                ('partner_id', '=', partner_id),
                ('state', '=', 'done'),
                ('date_planned', '>=', '2023-01-01')
            ])

            for po in pos_for_vendor:
                if po.date_planned and po.date_approve:
                    date_planned = fields.Datetime.to_datetime(po.date_planned)
                    date_approve = fields.Datetime.to_datetime(po.date_approve)
                    if date_planned < date_approve: continue
                    duration = (date_planned - date_approve).total_seconds() / 3600  # Convert to hours
                    total_duration += duration
                    count += 1

            if count > 0:
                average_duration = total_duration / count

                # Step 3: Update the duration field in the corresponding res.partner record
                vendor_sla = self.search([('id_vendor', '=', partner_id)], limit=1)

                # Konversi jam ke hari jika diperlukan
                if average_duration >= 24:
                    days = average_duration / 24
                    if days - int(days) > 0.5:  # Jika sisa lebih dari 0,5, bulatkan ke atas
                        days = int(days) + 1
                    else:  # Jika sisa 0,5 atau kurang, bulatkan ke bawah
                        days = int(days)
                    duration_to_save = days
                    unit_to_save = 'hari'
                else:
                    duration_to_save = round(average_duration)
                    unit_to_save = 'jam'

                # Update atau create vendor SLA record
                if vendor_sla:
                    vendor_sla.write({
                        'duration': duration_to_save,
                        'unit': unit_to_save
                    })
                else:
                    self.create({
                        'id_vendor': partner_id,
                        'duration': duration_to_save,
                        'unit': unit_to_save
                    })
        _logger.info(f'Proses SLA untuk Vendor selesai dilakukan')

    @api.depends('duration', 'unit')
    def _compute_duration_unit(self):
        for record in self:
            if record.duration and record.unit:
                record.duration_unit = f"{record.duration} {record.unit}"
            else:
                record.duration_unit = "-"