summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndoteknik . <it@fixcomart.co.id>2025-08-04 09:15:55 +0700
committerIndoteknik . <it@fixcomart.co.id>2025-08-04 09:15:55 +0700
commit09057a3d5074492dfd4de0a48644afb06391102d (patch)
tree7c0b9ee7de008503f1f6900253d9a049cce3b4fb
parent4aa9ca7105297079d109e20c793769476af91d02 (diff)
(andri) uncomment remnider
-rw-r--r--indoteknik_custom/models/account_move.py214
1 files changed, 107 insertions, 107 deletions
diff --git a/indoteknik_custom/models/account_move.py b/indoteknik_custom/models/account_move.py
index 945a96f9..14927bec 100644
--- a/indoteknik_custom/models/account_move.py
+++ b/indoteknik_custom/models/account_move.py
@@ -109,113 +109,113 @@ class AccountMove(models.Model):
# result.append((move.id, move.display_name))
# return result
- # def send_due_invoice_reminder(self):
- # today = fields.Date.today()
- # target_dates = [
- # today - timedelta(days=7),
- # today - timedelta(days=3),
- # today,
- # today + timedelta(days=3),
- # today + timedelta(days=7),
- # ]
-
- # # Contoh khusus partner tertentu
- # partner = self.env['res.partner'].search([('name', 'ilike', 'BANGUNAN TEKNIK GRUP')], limit=1)
- # if not partner:
- # _logger.info("Partner tidak ditemukan.")
- # return
-
- # invoices = self.env['account.move'].search([
- # ('move_type', '=', 'out_invoice'),
- # ('state', '=', 'posted'),
- # ('payment_state', 'not in', ['paid', 'in_payment', 'reversed']),
- # ('invoice_date_due', 'in', target_dates),
- # ('partner_id', '=', partner.id),
- # ])
-
- # _logger.info(f"Invoices tahap 1: {invoices}")
-
- # invoices = invoices.filtered(
- # lambda inv: inv.invoice_payment_term_id and 'tempo' in (inv.invoice_payment_term_id.name or '').lower()
- # )
- # _logger.info(f"Invoices tahap 2: {invoices}")
-
- # if not invoices:
- # _logger.info(f"Tidak ada invoice yang due untuk partner: {partner.name}")
- # return
-
- # grouped = {}
- # for inv in invoices:
- # grouped.setdefault(inv.partner_id, []).append(inv)
-
- # template = self.env.ref('indoteknik_custom.mail_template_invoice_due_reminder')
-
- # for partner, invs in grouped.items():
- # # Cari semua kontak anak yang reminder_invoices = True dan punya email
- # reminder_contacts = self.env['res.partner'].search([
- # ('parent_id', '=', partner.id),
- # ('reminder_invoices', '=', True),
- # ('email', '!=', False),
- # ])
-
- # # Gabungkan partner.email utama + semua email dari child contact reminder
- # emails = list(filter(None, [partner.email])) + reminder_contacts.mapped('email')
-
- # if not emails:
- # _logger.info(f"Partner {partner.name} tidak memiliki email yang bisa dikirimi")
- # continue
-
- # email_to = ",".join(emails)
- # _logger.info(f"Email tujuan: {email_to}")
-
- # # Buat isi tabel invoice
- # invoice_table_rows = ""
- # for inv in invs:
- # days_to_due = (inv.invoice_date_due - today).days if inv.invoice_date_due else 0
- # invoice_table_rows += f"""
- # <tr>
- # <td>{inv.name}</td>
- # <td>{fields.Date.to_string(inv.invoice_date) or '-'}</td>
- # <td>{fields.Date.to_string(inv.invoice_date_due) or '-'}</td>
- # <td>{days_to_due}</td>
- # <td>{formatLang(self.env, inv.amount_total, currency_obj=inv.currency_id)}</td>
- # <td>{inv.ref or '-'}</td>
- # </tr>
- # """
-
- # subject = f"Reminder Invoice Due - {partner.name}"
- # body_html = re.sub(
- # r"<tbody[^>]*>.*?</tbody>",
- # f"<tbody>{invoice_table_rows}</tbody>",
- # template.body_html,
- # flags=re.DOTALL
- # ).replace('${object.name}', partner.name) \
- # .replace('${object.partner_id.name}', partner.name)
-
- # values = {
- # 'subject': subject,
- # 'email_to': email_to,
- # 'email_from': 'finance@indoteknik.co.id',
- # 'body_html': body_html,
- # 'reply_to': f'invoice+account.move_{invs[0].id}@indoteknik.co.id',
- # }
-
- # _logger.info(f"Mengirim email ke: {email_to}")
- # template.send_mail(invs[0].id, force_send=True, email_values=values)
-
- # # Post ke chatter
- # user_system = self.env['res.users'].browse(25)
- # system_id = user_system.partner_id.id if user_system else False
-
- # for inv in invs:
- # inv.message_post(
- # subject=subject,
- # body=body_html,
- # subtype_id=self.env.ref('mail.mt_note').id,
- # author_id=system_id,
- # )
-
- # _logger.info(f"Reminder terkirim ke {partner.name} ({email_to}) → {len(invs)} invoice")
+ def send_due_invoice_reminder(self):
+ today = fields.Date.today()
+ target_dates = [
+ today - timedelta(days=7),
+ today - timedelta(days=3),
+ today,
+ today + timedelta(days=3),
+ today + timedelta(days=7),
+ ]
+
+ # Contoh khusus partner tertentu
+ partner = self.env['res.partner'].search([('name', 'ilike', 'BANGUNAN TEKNIK GRUP')], limit=1)
+ if not partner:
+ _logger.info("Partner tidak ditemukan.")
+ return
+
+ invoices = self.env['account.move'].search([
+ ('move_type', '=', 'out_invoice'),
+ ('state', '=', 'posted'),
+ ('payment_state', 'not in', ['paid', 'in_payment', 'reversed']),
+ ('invoice_date_due', 'in', target_dates),
+ ('partner_id', '=', partner.id),
+ ])
+
+ _logger.info(f"Invoices tahap 1: {invoices}")
+
+ invoices = invoices.filtered(
+ lambda inv: inv.invoice_payment_term_id and 'tempo' in (inv.invoice_payment_term_id.name or '').lower()
+ )
+ _logger.info(f"Invoices tahap 2: {invoices}")
+
+ if not invoices:
+ _logger.info(f"Tidak ada invoice yang due untuk partner: {partner.name}")
+ return
+
+ grouped = {}
+ for inv in invoices:
+ grouped.setdefault(inv.partner_id, []).append(inv)
+
+ template = self.env.ref('indoteknik_custom.mail_template_invoice_due_reminder')
+
+ for partner, invs in grouped.items():
+ # Cari semua kontak anak yang reminder_invoices = True dan punya email
+ reminder_contacts = self.env['res.partner'].search([
+ ('parent_id', '=', partner.id),
+ ('reminder_invoices', '=', True),
+ ('email', '!=', False),
+ ])
+
+ # Gabungkan partner.email utama + semua email dari child contact reminder
+ emails = list(filter(None, [partner.email])) + reminder_contacts.mapped('email')
+
+ if not emails:
+ _logger.info(f"Partner {partner.name} tidak memiliki email yang bisa dikirimi")
+ continue
+
+ email_to = ",".join(emails)
+ _logger.info(f"Email tujuan: {email_to}")
+
+ # Buat isi tabel invoice
+ invoice_table_rows = ""
+ for inv in invs:
+ days_to_due = (inv.invoice_date_due - today).days if inv.invoice_date_due else 0
+ invoice_table_rows += f"""
+ <tr>
+ <td>{inv.name}</td>
+ <td>{fields.Date.to_string(inv.invoice_date) or '-'}</td>
+ <td>{fields.Date.to_string(inv.invoice_date_due) or '-'}</td>
+ <td>{days_to_due}</td>
+ <td>{formatLang(self.env, inv.amount_total, currency_obj=inv.currency_id)}</td>
+ <td>{inv.ref or '-'}</td>
+ </tr>
+ """
+
+ subject = f"Reminder Invoice Due - {partner.name}"
+ body_html = re.sub(
+ r"<tbody[^>]*>.*?</tbody>",
+ f"<tbody>{invoice_table_rows}</tbody>",
+ template.body_html,
+ flags=re.DOTALL
+ ).replace('${object.name}', partner.name) \
+ .replace('${object.partner_id.name}', partner.name)
+
+ values = {
+ 'subject': subject,
+ 'email_to': email_to,
+ 'email_from': 'finance@indoteknik.co.id',
+ 'body_html': body_html,
+ 'reply_to': f'invoice+account.move_{invs[0].id}@indoteknik.co.id',
+ }
+
+ _logger.info(f"Mengirim email ke: {email_to}")
+ template.send_mail(invs[0].id, force_send=True, email_values=values)
+
+ # Post ke chatter
+ user_system = self.env['res.users'].browse(25)
+ system_id = user_system.partner_id.id if user_system else False
+
+ for inv in invs:
+ inv.message_post(
+ subject=subject,
+ body=body_html,
+ subtype_id=self.env.ref('mail.mt_note').id,
+ author_id=system_id,
+ )
+
+ _logger.info(f"Reminder terkirim ke {partner.name} ({email_to}) → {len(invs)} invoice")
@api.onchange('invoice_date')