summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/sj_tele.py
blob: ed363f593be2679652c14bae7b387276bec07e39 (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
from odoo import models, fields, api
from odoo.exceptions import UserError
import requests
import json
import logging, subprocess
import time
from collections import OrderedDict
import socket

_logger = logging.getLogger(__name__)

class SjTele(models.Model):
    _name = 'sj.tele'
    _description = 'sj.tele'

    picking_id = fields.Many2one('stock.picking', string='Picking')
    sale_id = fields.Many2one('sale.order', string='Sales Order')
    picking_name = fields.Char(string='Picking Name')
    sale_name = fields.Char(string='Sale Name')
    create_date = fields.Datetime(string='Create Date')
    date_doc_kirim = fields.Datetime(string='Tanggal Kirim SJ')
    is_sent = fields.Boolean(default=False)

    @staticmethod
    def is_local_env():
        hostname = socket.gethostname().lower()
        keywords = ['andri', 'miqdad', 'fin', 'stephan', 'hafid', 'nathan']
        return any(keyword in hostname for keyword in keywords)

    def woi(self):
        if self.is_local_env():
            _logger.warning("📪 Local environment detected — skip sending email reminders.")
            return
        bot_mqdd = '8203414501:AAHy_XwiUAVrgRM2EJzW7sZx9npRLITZpb8'
        chat_id_mqdd = '-1003087280519'
        api_base = f'https://api.telegram.org/bot{bot_mqdd}'
        # bot_testing = '8306689189:AAHEFe5xwAkapoQ8xKoNZs-6gVfv3kO3kaU'
        # chat_id_testing = '-4920864331'
        # api_testing = f'https://api.telegram.org/bot{bot_testing}'

        # Select Data
        data = self.search([('is_sent', '=', False)], order='create_date asc')

        # Old
        # data = self.search([], order='create_date asc')

        if not data:
            text = "✅ tidak ada data (semua sudah tercatat)."
            try:
                r = requests.post(api_base + "/sendMessage",
                                  json={'chat_id': chat_id_mqdd, 'text': text},
                                  timeout=20)
                r.raise_for_status()
            except Exception as e:
                _logger.exception("Gagal kirim Telegram (no data): %s", e)
            return True


        lines = []
        groups = OrderedDict()

        for rec in data:
            name = rec.picking_name or (rec.picking_id.name if rec.picking_id else '')
            pid  = rec.picking_id.id if rec.picking_id else ''
            so   = rec.sale_id.name or rec.sale_name or ''
            dttm = (rec.picking_id.date_doc_kirim if (rec.picking_id and rec.picking_id.date_doc_kirim)
                    else getattr(rec, 'date_doc_kirim', None))

            if dttm:
                date_header = dttm if isinstance(dttm, str) else fields.Datetime.to_string(dttm)
                date_header = date_header[:10]
            else:
                date_header = '(Tidak ada tanggal kirim SJ)'

            if name:
                groups.setdefault(date_header, []).append(f"- ({pid}) - {name} - {so}")

        for header_date, items in groups.items():
            lines.append(header_date)
            lines.extend(items)

        header = "Berikut merupakan nomor BU/OUT yang belum ada di Logbook SJ report:\n"
        BUB = 20  # jumlah baris per bubble
        total = (len(lines) + BUB - 1) // BUB  # total bubble

        for i in range(0, len(lines), BUB):
            body = "\n".join(lines[i:i + BUB])
            bagian = (i // BUB) + 1
            text = f"{header}Lampiran ke {bagian}/{total}\n{body}"
            try:
                r = requests.post(
                    api_base + "/sendMessage",
                    json={'chat_id': chat_id_mqdd, 'text': text},
                    timeout=20
                )
                r.raise_for_status()
            except Exception as e:
                _logger.exception("Gagal kirim Telegram (batch %s-%s): %s", i + 1, min(i + BUB, len(lines)), e)
            time.sleep(5)  # jeda kecil biar rapi & aman rate limit

        # Set sent = true ketika sudah terkirim
        data.write({'is_sent': True})

        return True

        # header = "Berikut merupakan nomor BU/OUT yang belum ada di Logbook SJ report:\n"
        # text = header + "\n".join(lines)
        #
        # try:
        #     r = requests.post(api_base + "/sendMessage",
        #                       json={'chat_id': chat_id_mqdd, 'text': text})
        #     r.raise_for_status()
        # except Exception as e:
        #     _logger.exception("Gagal kirim Telegram: %s", e)
        # return True