from odoo import models, fields, api from odoo.exceptions import UserError import requests import json import logging, subprocess import time from collections import OrderedDict _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') def woi(self): 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}' 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 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