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
|