From d956020b6b588e5216f1238b82f87b6fb35b2afc Mon Sep 17 00:00:00 2001 From: Miqdad Date: Wed, 3 Sep 2025 18:05:00 +0700 Subject: send bu out to tele --- indoteknik_custom/models/report_logbook_sj.py | 83 +++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) (limited to 'indoteknik_custom/models/report_logbook_sj.py') diff --git a/indoteknik_custom/models/report_logbook_sj.py b/indoteknik_custom/models/report_logbook_sj.py index 17119c12..85ab755d 100644 --- a/indoteknik_custom/models/report_logbook_sj.py +++ b/indoteknik_custom/models/report_logbook_sj.py @@ -2,6 +2,11 @@ from odoo import models, fields, api from odoo.exceptions import UserError from pytz import timezone from datetime import datetime +import requests +import json +import logging + +_logger = logging.getLogger(__name__) class ReportLogbookSJ(models.Model): _name = 'report.logbook.sj' @@ -60,6 +65,84 @@ class ReportLogbookSJ(models.Model): self.state = 'terima_semua' else: raise UserError('Hanya Accounting yang bisa Approve') + + + @api.model + def cron_daily_logbook_gap_to_telegram(self): + bot_mqdd = '8203414501:AAHy_XwiUAVrgRM2EJzW7sZx9npRLITZpb8' + chat_id_mqdd = '-4885333032' + apiURL = f'https://api.telegram.org/bot{bot_mqdd}/sendMessage' + + # ambil dari 1 Februari 2024 (UTC) + dt_from = datetime(2024, 2, 1, 0, 0, 0) + + self.env.cr.execute(""" + SELECT sp.id, sp.name + FROM stock_picking sp + LEFT JOIN report_logbook_sj_line rlsl + ON rlsl.picking_id = sp.id + OR (rlsl.name IS NOT NULL AND rlsl.name = sp.name) + WHERE sp.picking_type_id = 29 + AND sp.state = 'done' + AND sp.create_date >= %s + AND rlsl.id IS NULL + ORDER BY sp.create_date ASC limit 20 + """, (dt_from,)) + rows = self.env.cr.fetchall() + + if not rows: + return True + + header = "berikut merupakan nomor picking yang belum ada di Logbook SJ report:\n" + body = "\n".join(f"{name} ({pid})" for pid, name in rows if name) + text = header + body + + # kirim satu pesan (tanpa pemotongan) + try: + resp = requests.post(apiURL, json={'chat_id': chat_id_mqdd, 'text': text}, timeout=15) + resp.raise_for_status() + except requests.HTTPError: + _logger.error("Telegram response: %s", resp.text) # <— LIHAT DESKRIPSINYA DI LOG + raise + except Exception as e: + # log saja; biar cron tidak crash + logging.getLogger(__name__).exception("Gagal kirim Telegram: %s", e) + return True + + def action_send_to_telegram(self): + entries = [] + pickings = self.report_logbook_sj_line.mapped('picking_id') + for p in pickings: + if p: + entries.append((p.name, p.id)) + + fallback_names = [l.name for l in self.report_logbook_sj_line if not l.picking_id and l.name] + if fallback_names: + picks = self.env['stock.picking'].search([('name', 'in', list(set(fallback_names)))]) + name2id = {p.name: p.id for p in picks} + for n in fallback_names: + entries.append((n, name2id.get(n))) + + seen, unique_entries = set(), [] + for name, pid in entries: + key = pid or name + if key and key not in seen: + seen.add(key) + unique_entries.append((name, pid)) + + header = "berikut merupakan nomor picking yang belum ada di Logbook SJ report:\n" + body = "\n".join(f"{name} ({pid or '-'})" for name, pid in unique_entries) if unique_entries else "- (tidak ada)" + text = header + body + + bot_mqdd = '8203414501:AAHy_XwiUAVrgRM2EJzW7sZx9npRLITZpb8' + chat_id_mqdd = '-4885333032' + apiURL = f'https://api.telegram.org/bot{bot_mqdd}/sendMessage' + try: + hehe = requests.post(apiURL, json={'chat_id': chat_id_mqdd, 'text': text}) + _logger.info(hehe) + except Exception as e: + print(e) + class ReportLogbookSJLine(models.Model): _name = 'report.logbook.sj.line' -- cgit v1.2.3 From 4da5af474edea6a61453dcc8485cefaa7fe6dd42 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Thu, 4 Sep 2025 15:26:48 +0700 Subject: Done x --- indoteknik_custom/models/report_logbook_sj.py | 51 +++++---------------------- 1 file changed, 8 insertions(+), 43 deletions(-) (limited to 'indoteknik_custom/models/report_logbook_sj.py') diff --git a/indoteknik_custom/models/report_logbook_sj.py b/indoteknik_custom/models/report_logbook_sj.py index 85ab755d..6915ad9b 100644 --- a/indoteknik_custom/models/report_logbook_sj.py +++ b/indoteknik_custom/models/report_logbook_sj.py @@ -39,6 +39,10 @@ class ReportLogbookSJ(models.Model): count_line = fields.Char(string='Count Line', compute='_compute_count_line') + def write(self, vals): + self.action_send_to_telegram() + res = super(ReportLogbookSJ, self).write(vals) + @api.depends('report_logbook_sj_line') def _compute_count_line(self): for rec in self: @@ -67,49 +71,10 @@ class ReportLogbookSJ(models.Model): raise UserError('Hanya Accounting yang bisa Approve') - @api.model - def cron_daily_logbook_gap_to_telegram(self): - bot_mqdd = '8203414501:AAHy_XwiUAVrgRM2EJzW7sZx9npRLITZpb8' - chat_id_mqdd = '-4885333032' - apiURL = f'https://api.telegram.org/bot{bot_mqdd}/sendMessage' - - # ambil dari 1 Februari 2024 (UTC) - dt_from = datetime(2024, 2, 1, 0, 0, 0) - - self.env.cr.execute(""" - SELECT sp.id, sp.name - FROM stock_picking sp - LEFT JOIN report_logbook_sj_line rlsl - ON rlsl.picking_id = sp.id - OR (rlsl.name IS NOT NULL AND rlsl.name = sp.name) - WHERE sp.picking_type_id = 29 - AND sp.state = 'done' - AND sp.create_date >= %s - AND rlsl.id IS NULL - ORDER BY sp.create_date ASC limit 20 - """, (dt_from,)) - rows = self.env.cr.fetchall() - - if not rows: - return True - - header = "berikut merupakan nomor picking yang belum ada di Logbook SJ report:\n" - body = "\n".join(f"{name} ({pid})" for pid, name in rows if name) - text = header + body - - # kirim satu pesan (tanpa pemotongan) - try: - resp = requests.post(apiURL, json={'chat_id': chat_id_mqdd, 'text': text}, timeout=15) - resp.raise_for_status() - except requests.HTTPError: - _logger.error("Telegram response: %s", resp.text) # <— LIHAT DESKRIPSINYA DI LOG - raise - except Exception as e: - # log saja; biar cron tidak crash - logging.getLogger(__name__).exception("Gagal kirim Telegram: %s", e) - return True - def action_send_to_telegram(self): + user_logistic = self.env.ref('indoteknik_custom.group_role_logistic') + if self.user != user_logistic: + return entries = [] pickings = self.report_logbook_sj_line.mapped('picking_id') for p in pickings: @@ -130,7 +95,7 @@ class ReportLogbookSJ(models.Model): seen.add(key) unique_entries.append((name, pid)) - header = "berikut merupakan nomor picking yang belum ada di Logbook SJ report:\n" + header = f"Saya {self.env.user.name} sudah mengisi di Logbook SJ Report:\n" body = "\n".join(f"{name} ({pid or '-'})" for name, pid in unique_entries) if unique_entries else "- (tidak ada)" text = header + body -- cgit v1.2.3 From dd2bc67bbdaa771adf6bbedc01ba23a98ea03574 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Thu, 4 Sep 2025 15:46:05 +0700 Subject: Gk jadi --- indoteknik_custom/models/report_logbook_sj.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'indoteknik_custom/models/report_logbook_sj.py') diff --git a/indoteknik_custom/models/report_logbook_sj.py b/indoteknik_custom/models/report_logbook_sj.py index 6915ad9b..e67ea724 100644 --- a/indoteknik_custom/models/report_logbook_sj.py +++ b/indoteknik_custom/models/report_logbook_sj.py @@ -39,10 +39,6 @@ class ReportLogbookSJ(models.Model): count_line = fields.Char(string='Count Line', compute='_compute_count_line') - def write(self, vals): - self.action_send_to_telegram() - res = super(ReportLogbookSJ, self).write(vals) - @api.depends('report_logbook_sj_line') def _compute_count_line(self): for rec in self: @@ -51,6 +47,8 @@ class ReportLogbookSJ(models.Model): @api.model def create(self, vals): vals['name'] = self.env['ir.sequence'].next_by_code('report.logbook.sj') or '0' + # if self.env.user.has_group('indoteknik_custom.group_role_logistic'): + # self.action_send_to_telegram() result = super(ReportLogbookSJ, self).create(vals) return result @@ -72,9 +70,7 @@ class ReportLogbookSJ(models.Model): def action_send_to_telegram(self): - user_logistic = self.env.ref('indoteknik_custom.group_role_logistic') - if self.user != user_logistic: - return + entries = [] pickings = self.report_logbook_sj_line.mapped('picking_id') for p in pickings: @@ -95,7 +91,7 @@ class ReportLogbookSJ(models.Model): seen.add(key) unique_entries.append((name, pid)) - header = f"Saya {self.env.user.name} sudah mengisi di Logbook SJ Report:\n" + header = f"{self.env.user.name} sudah mengisi di Logbook SJ Report:\n" body = "\n".join(f"{name} ({pid or '-'})" for name, pid in unique_entries) if unique_entries else "- (tidak ada)" text = header + body -- cgit v1.2.3 From 1afdf5c126bc41ece2e197610a340aab1d102c58 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Mon, 15 Sep 2025 12:37:32 +0700 Subject: add line no --- indoteknik_custom/models/report_logbook_sj.py | 58 ++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) (limited to 'indoteknik_custom/models/report_logbook_sj.py') diff --git a/indoteknik_custom/models/report_logbook_sj.py b/indoteknik_custom/models/report_logbook_sj.py index 17119c12..66edbf99 100644 --- a/indoteknik_custom/models/report_logbook_sj.py +++ b/indoteknik_custom/models/report_logbook_sj.py @@ -1,3 +1,5 @@ +from operator import index + from odoo import models, fields, api from odoo.exceptions import UserError from pytz import timezone @@ -60,9 +62,30 @@ class ReportLogbookSJ(models.Model): self.state = 'terima_semua' else: raise UserError('Hanya Accounting yang bisa Approve') - + + + def write(self, vals): + res = super(ReportLogbookSJ, self).write(vals) + if 'report_logbook_sj_line' in vals or any(f in vals for f in ()): + self._resequence_lines() + return res + + def _resequence_lines(self): + for rec in self: + lines = rec.report_logbook_sj_line.sorted(key=lambda l: (l.line_num or 0, l.id)) + for idx, line in enumerate(lines, start=1): + if line.line_num != idx: + line.line_num = idx + + @api.onchange('report_logbook_sj_line') + def _onchange_report_logbook_sj_line(self): + self._resequence_lines() + +from odoo import models, fields, api + class ReportLogbookSJLine(models.Model): _name = 'report.logbook.sj.line' + _order = 'sequence, id' # urut default di UI & ORM (drag pakai sequence) name = fields.Char(string='SJ Number') driver_id = fields.Many2one(comodel_name='res.users', string='Driver') @@ -70,10 +93,41 @@ class ReportLogbookSJLine(models.Model): arrival_date = fields.Char(string='Arrival Date') carrier_id = fields.Many2one('delivery.carrier', string='Shipping Method') tracking_no = fields.Char(string='Tracking No') - logbook_sj_id = fields.Many2one('report.logbook.sj', string='Logbook SJ') # Corrected model name + + # NOTE: field ini duplikat relasi; pakai salah satu saja. + # kamu boleh hapus logbook_sj_id kalau tidak dipakai di tempat lain. + logbook_sj_id = fields.Many2one('report.logbook.sj', string='Logbook SJ') + partner_id = fields.Many2one('res.partner', string='Customer') picking_id = fields.Many2one('stock.picking', string='Picking') sale_id = fields.Many2one('sale.order', string='Sale Order') + report_logbook_sj_id = fields.Many2one('report.logbook.sj', string='Logbook SJ') not_exist = fields.Boolean(string='Not Exist') note = fields.Char(string='Note') + + sequence = fields.Integer(string='Sequence', default=0, index=True) + + line_num = fields.Integer(string='No', compute='_compute_line_num', store=False) + + @api.depends( + 'report_logbook_sj_id.report_logbook_sj_line', + 'report_logbook_sj_id.report_logbook_sj_line.sequence' + ) + def _compute_line_num(self): + for parent in self.mapped('report_logbook_sj_id'): + lines = parent.report_logbook_sj_line.sorted(key=lambda l: (l.sequence or 0, l.id)) + for i, l in enumerate(lines, start=1): + l.line_num = i + for rec in self.filtered(lambda r: not r.report_logbook_sj_id): + rec.line_num = 0 + + @api.model + def create(self, vals): + if not vals.get('sequence') and vals.get('report_logbook_sj_id'): + last = self.search( + [('report_logbook_sj_id', '=', vals['report_logbook_sj_id'])], + order='sequence desc, id desc', limit=1 + ) + vals['sequence'] = (last.sequence or 0) + 1 + return super().create(vals) -- cgit v1.2.3 From dba361e5b7a44b9ad2c0c7fa54355707f63fd49a Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 16 Sep 2025 17:11:14 +0700 Subject: fix bug --- indoteknik_custom/models/report_logbook_sj.py | 40 --------------------------- 1 file changed, 40 deletions(-) (limited to 'indoteknik_custom/models/report_logbook_sj.py') diff --git a/indoteknik_custom/models/report_logbook_sj.py b/indoteknik_custom/models/report_logbook_sj.py index b45eab03..3b07ff02 100644 --- a/indoteknik_custom/models/report_logbook_sj.py +++ b/indoteknik_custom/models/report_logbook_sj.py @@ -86,46 +86,6 @@ class ReportLogbookSJ(models.Model): def _onchange_report_logbook_sj_line(self): self._resequence_lines() -from odoo import models, fields, api - - - - def action_send_to_telegram(self): - - entries = [] - pickings = self.report_logbook_sj_line.mapped('picking_id') - for p in pickings: - if p: - entries.append((p.name, p.id)) - - fallback_names = [l.name for l in self.report_logbook_sj_line if not l.picking_id and l.name] - if fallback_names: - picks = self.env['stock.picking'].search([('name', 'in', list(set(fallback_names)))]) - name2id = {p.name: p.id for p in picks} - for n in fallback_names: - entries.append((n, name2id.get(n))) - - seen, unique_entries = set(), [] - for name, pid in entries: - key = pid or name - if key and key not in seen: - seen.add(key) - unique_entries.append((name, pid)) - - header = f"{self.env.user.name} sudah mengisi di Logbook SJ Report:\n" - body = "\n".join(f"{name} ({pid or '-'})" for name, pid in unique_entries) if unique_entries else "- (tidak ada)" - text = header + body - - bot_mqdd = '8203414501:AAHy_XwiUAVrgRM2EJzW7sZx9npRLITZpb8' - chat_id_mqdd = '-4885333032' - apiURL = f'https://api.telegram.org/bot{bot_mqdd}/sendMessage' - try: - hehe = requests.post(apiURL, json={'chat_id': chat_id_mqdd, 'text': text}) - _logger.info(hehe) - except Exception as e: - print(e) - - class ReportLogbookSJLine(models.Model): _name = 'report.logbook.sj.line' _order = 'sequence, id' # urut default di UI & ORM (drag pakai sequence) -- cgit v1.2.3