diff options
| author | Indoteknik . <it@fixcomart.co.id> | 2025-08-01 11:26:43 +0700 |
|---|---|---|
| committer | Indoteknik . <it@fixcomart.co.id> | 2025-08-01 11:26:43 +0700 |
| commit | 8ecb66beff5da35886d821d373e9a5dd7fe5396b (patch) | |
| tree | fc7922bd1ef0729d6cda4542bb3b280aed08993e | |
| parent | d00a277cf3144100b2ca4b8ee640a23776537349 (diff) | |
(andri) add attachment in email reminder & Testing
| -rw-r--r-- | indoteknik_custom/models/down_payment.py | 122 | ||||
| -rw-r--r-- | indoteknik_custom/views/mail_template_pum.xml | 50 |
2 files changed, 145 insertions, 27 deletions
diff --git a/indoteknik_custom/models/down_payment.py b/indoteknik_custom/models/down_payment.py index 946bd792..67172dfa 100644 --- a/indoteknik_custom/models/down_payment.py +++ b/indoteknik_custom/models/down_payment.py @@ -7,13 +7,14 @@ _logger = logging.getLogger(__name__) from terbilang import Terbilang import pytz from pytz import timezone +import base64 class DownPayment(models.Model): _name = 'down.payment' _description = 'Down Payment Management' _rec_name = 'number' - _inherit = ['mail.thread'] + _inherit = ['mail.thread', 'mail.activity.mixin'] user_id = fields.Many2one('res.users', string='Diajukan Oleh', default=lambda self: self.env.user, tracking=3) partner_id = fields.Many2one('res.partner', string='Partner', related='user_id.partner_id', readonly=True) @@ -73,7 +74,6 @@ class DownPayment(models.Model): name_approval_departement = fields.Char(string='Approval Departement', tracking=True) name_approval_ap = fields.Char(string='Approval AP', tracking=True) email_ap = fields.Char(string = 'Email AP') - email_user = fields.Char(string = 'Email User', default=lambda self: self.env.user.email) name_approval_pimpinan = fields.Char(string='Approval Pimpinan', tracking=True) date_approved_department = fields.Datetime(string="Date Approved Department") @@ -109,6 +109,124 @@ class DownPayment(models.Model): reason_reject = fields.Text(string='Alasan Penolakan') + currency_id = fields.Many2one( + 'res.currency', string='Currency', + default=lambda self: self.env.company.currency_id + ) + + + def _get_jasper_attachment(self): + self.ensure_one() + report = self.env['ir.actions.report'].browse(1134) # ID Downpayment Report + if not report: + raise UserError("Report Jasper tidak ditemukan.") + + data = report.render_jasper(self.ids, data={})[0] + filename = f"{self.number}.pdf" + return { + 'name': filename, + 'datas': base64.b64encode(data), + 'type': 'binary', + 'mimetype': 'application/pdf', + 'filename': filename, + } + + def action_send_pum_reminder(self): + """ + Kirim email reminder PUM otomatis. + - Hari ini = kirim dengan template 'mail_template_pum_reminder_today' + - H-2 dari due date = kirim dengan template 'mail_template_pum_reminder_h_2' + """ + today = date.today() + pum_ids = self.search([ + ('date_back_to_office', '!=', False), + ('status', 'not in', ['draft', 'reject']), + ]) + + template_today = self.env.ref('indoteknik_custom.mail_template_pum_reminder_today', raise_if_not_found=False) + template_h2 = self.env.ref('indoteknik_custom.mail_template_pum_reminder_h_2', raise_if_not_found=False) + + if not template_today or not template_h2: + _logger.warning("Salah satu template email tidak ditemukan.") + return + + for pum in pum_ids: + _logger.info(f"[REMINDER] Memproses PUM {pum.number}") + + if not pum.email_ap or not pum.user_id.partner_id.email: + _logger.warning(f"[REMINDER] Lewati PUM {pum.number} karena email_ap atau email user kosong.") + continue + + due_date = pum.date_back_to_office + timedelta(days=7) + days_remaining = (due_date - today).days + + realization = self.env['realization.down.payment'].search([('pum_id', '=', pum.id)], limit=1) + if not realization or realization.done_status != 'remaining': + _logger.info(f"[REMINDER] Lewati PUM {pum.number}, status realisasi bukan 'remaining'.") + continue + + # Tentukan template + if pum.date_back_to_office == today: + template = template_today + elif days_remaining == 2: + template = template_h2 + else: + _logger.info(f"[REMINDER] Lewati PUM {pum.number}, hari ini bukan tanggal pengingat.") + continue + + # Generate attachment + try: + attachment_vals = pum._get_jasper_attachment() + attachment = self.env['ir.attachment'].create({ + 'name': attachment_vals['name'], + 'type': 'binary', + 'datas': attachment_vals['datas'], + 'res_model': 'down.payment', + 'res_id': pum.id, + 'mimetype': 'application/pdf', + }) + except Exception as e: + _logger.error(f"[REMINDER] Gagal membuat attachment untuk PUM {pum.number}: {str(e)}") + continue + + email_values = { + # 'email_to': pum.user_id.partner_id.email, + 'email_to': 'andrifebriyadiputra@gmail.com', + 'email_from': pum.email_ap, + 'attachment_ids': [(6, 0, [attachment.id])], + } + + _logger.info(f"[REMINDER] Mengirim email PUM {pum.number} ke {email_values['email_to']} dari {email_values['email_from']}") + + try: + body_html = template._render_field('body_html', [pum.id])[pum.id] + + template.send_mail(pum.id, force_send=True, email_values=email_values) + _logger.info(f"[REMINDER] Email berhasil dikirim untuk PUM {pum.number}") + + # Post info sederhana + pum.message_post( + body="Email Reminder Berhasil dikirimkan", + message_type="comment", + subtype_xmlid="mail.mt_note", + ) + + user_system = self.env['res.users'].browse(25) + system_id = user_system.partner_id.id if user_system else False + + # Post isi email ke chatter + pum.message_post( + body=body_html, + message_type="comment", + subtype_xmlid="mail.mt_note", + author_id=system_id, + ) + except Exception as e: + _logger.error(f"[REMINDER] Gagal mengirim email untuk PUM {pum.number}: {str(e)}") + + return True + + @api.depends('move_id.state') def _compute_is_cab_visible(self): for rec in self: diff --git a/indoteknik_custom/views/mail_template_pum.xml b/indoteknik_custom/views/mail_template_pum.xml index 85f5de2a..2863741e 100644 --- a/indoteknik_custom/views/mail_template_pum.xml +++ b/indoteknik_custom/views/mail_template_pum.xml @@ -8,32 +8,32 @@ <field name="model_id" ref="indoteknik_custom.model_down_payment"/> <field name="subject">Reminder Realisasi PUM - ${object.number}</field> <field name="email_from">${object.email_ap}</field> - <field name="email_to">${object.email_user}</field> + <field name="email_to">andrifebriyadiputra@gmail.com</field> + <!-- <field name="email_to">${object.email_user}</field> --> <field name="body_html" type="html"> <div> - <p><b>Dengan Hormat Bpk/Ibu PIC,</b></p> + <p><b>Dengan Hormat Bpk/Ibu ${object.user_id.display_name},</b></p> <p> Berikut terlampir pengajuan PUM <b>${object.number}</b> sebesar - <b>Rp ${format_amount(object.amount, 'id_ID')}</b> dari PT. INDOTEKNIK DOTCOM GEMILANG - pada tanggal ${format_date(object.date_submit, 'd MMMM yyyy')}. + <b>${format_amount(object.nominal, object.currency_id)}</b> dari PT. INDOTEKNIK DOTCOM GEMILANG + pada tanggal ${format_date(object.create_date, 'd MMMM yyyy')}.<br/> + Tolong segera realisasikan PUM tersebut. dengan menyertakan dokumen asli untuk mendukung realisasi PUM tersebut + <b>maksimal 7 hari dari sekarang</b>.<br/> + Terima Kasih </p> - <p> - Mohon segera realisasikan PUM tersebut. Batas waktu realisasi adalah - <b>7 hari setelah kembali ke kantor</b>. - </p> + <br/><br/> - <p><i>Email ini dikirim otomatis, abaikan bila sudah melakukan realisasi.</i></p> + <p><b>Best Regards,</b></p> - <br/><br/> + <br/> <p><b> Dept. Finance<br/> PT. INDOTEKNIK DOTCOM GEMILANG<br/> <img src="https://erp.indoteknik.com/api/image/ir.attachment/datas/2135765" alt="Indoteknik" style="max-width: 18%; height: auto;"></img><br/> - <a href="https://wa.me/6285716970374" target="_blank">+62-857-1697-0374</a> | - <a href="mailto:finance@indoteknik.co.id">finance@indoteknik.co.id</a> </b></p> + <p><i>Email ini dikirim otomatis, abaikan bila sudah melakukan realisasi.</i></p> </div> </field> <field name="auto_delete" eval="True"/> @@ -45,32 +45,32 @@ <field name="model_id" ref="indoteknik_custom.model_down_payment"/> <field name="subject">Reminder Realisasi PUM (H-2) - ${object.number}</field> <field name="email_from">${object.email_ap}</field> - <field name="email_to">${object.email_user}</field> + <field name="email_to">andrifebriyadiputra@gmail.com</field> + <!-- <field name="email_to">${object.email_user}</field> --> <field name="body_html" type="html"> <div> - <p><b>Dengan Hormat Bpk/Ibu PIC,</b></p> + <p><b>Dengan Hormat Bpk/Ibu ${object.user_id.display_name},</b></p> <p> Berikut terlampir pengajuan PUM <b>${object.number}</b> sebesar - <b>Rp ${format_amount(object.amount, 'id_ID')}</b> dari PT. INDOTEKNIK DOTCOM GEMILANG - pada tanggal ${format_date(object.date_submit, 'd MMMM yyyy')}. - </p> - - <p> - Mohon segera realisasikan PUM tersebut. Batas waktu tersisa - <b>2 hari lagi</b>. + <b>${format_amount(object.nominal, object.currency_id)}</b> dari PT. INDOTEKNIK DOTCOM GEMILANG + pada tanggal ${format_date(object.create_date, 'd MMMM yyyy')}.<br/> + Tolong segera realisasikan PUM tersebut. dengan menyertakan dokumen asli untuk mendukung realisasi PUM tersebut + <b>batas waktu tersisa 2 hari lagi</b>.<br/> + Terima Kasih </p> + + <br/><br/> - <p><i>Email ini dikirim otomatis, abaikan bila sudah melakukan realisasi.</i></p> + <p><b>Best Regards,</b></p> - <br/><br/> + <br/> <p><b> Dept. Finance<br/> PT. INDOTEKNIK DOTCOM GEMILANG<br/> <img src="https://erp.indoteknik.com/api/image/ir.attachment/datas/2135765" alt="Indoteknik" style="max-width: 18%; height: auto;"></img><br/> - <a href="https://wa.me/6285716970374" target="_blank">+62-857-1697-0374</a> | - <a href="mailto:finance@indoteknik.co.id">finance@indoteknik.co.id</a> </b></p> + <p><i>Email ini dikirim otomatis, abaikan bila sudah melakukan realisasi.</i></p> </div> </field> <field name="auto_delete" eval="True"/> |
