From aaff9c4fa47ca2ee114ab1dc3a8140aec300ce26 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 17 Sep 2025 16:29:04 +0700 Subject: (andri) button surat lanjutan + fix bug --- indoteknik_custom/__manifest__.py | 2 +- indoteknik_custom/models/letter_receivable.py | 83 ++++++++++++++++++++++++--- indoteknik_custom/views/letter_receivable.xml | 48 ++++++++++++---- 3 files changed, 113 insertions(+), 20 deletions(-) diff --git a/indoteknik_custom/__manifest__.py b/indoteknik_custom/__manifest__.py index 806d5706..cf7cf1e4 100755 --- a/indoteknik_custom/__manifest__.py +++ b/indoteknik_custom/__manifest__.py @@ -181,7 +181,7 @@ 'views/update_date_planned_po_wizard_view.xml', 'views/unpaid_invoice_view.xml', 'views/letter_receivable.xml', - 'views/letter_receivable_mail_template.xml' + 'views/letter_receivable_mail_template.xml', # 'views/reimburse.xml', 'views/sj_tele.xml' ], diff --git a/indoteknik_custom/models/letter_receivable.py b/indoteknik_custom/models/letter_receivable.py index 84a3fc35..b1c82b12 100644 --- a/indoteknik_custom/models/letter_receivable.py +++ b/indoteknik_custom/models/letter_receivable.py @@ -32,11 +32,11 @@ class SuratPiutang(models.Model): state = fields.Selection([ ("draft", "Draft"), ("waiting_approval_sales", "Menunggu Approval Sales Manager"), - ("waiting_approval_pimpinan", "Menunggu Approval Pimpinan"), + ("waiting_approval_pimpinan", "Menunggu Approval Pimpinan / Kirim Surat"), ("sent", "Approved & Sent") ], default="draft", tracking=True) send_date = fields.Datetime(string="Tanggal Kirim", tracking=True) - seven_days_after_sent_date = fields.Char(string="7 Hari Setelah Tanggal Kirim", tracking=True) + seven_days_after_sent_date = fields.Char(string="7 Hari Setelah Tanggal Kirim") periode_invoices_terpilih = fields.Char( string="Periode Invoices Terpilih", compute="_compute_periode_invoices", @@ -62,6 +62,12 @@ class SuratPiutang(models.Model): sales_person_id = fields.Many2one('res.users', string='Salesperson', related='partner_id.user_id', readonly=True) + PERIHAL_SEQUENCE = { + "penagihan": "sp1", + "sp1": "sp2", + "sp2": "sp3", + } + @api.onchange('partner_id') def _onchange_partner_id_domain(self): unpaid_partner_ids = self.env['unpaid.invoice.view'].search([]).mapped('partner_id.id') @@ -74,9 +80,68 @@ class SuratPiutang(models.Model): for rec in self: rec.perihal_label = dict(self._fields['perihal'].selection).get(rec.perihal, '') - # def action_print_surat_piutang(self): - # self.ensure_one() - # return self.env.ref('indoteknik_custom.report_surat_piutang_formal').report_action(self) + def action_create_next_letter(self): + for rec in self: + if rec.state != "sent": + raise UserError("Surat harus sudah terkirim sebelum bisa membuat surat lanjutan.") + + next_perihal = self.PERIHAL_SEQUENCE.get(rec.perihal) + if not next_perihal: + raise UserError("Surat ini sudah pada tahap terakhir (SP3). Tidak bisa membuat lanjutan lagi.") + + existing = self.search([ + ('partner_id', '=', rec.partner_id.id), + ('perihal', '=', next_perihal), + ('state', '!=', 'draft') # optional: cek hanya yang sudah dikirim + ]) + if existing: + raise UserError(f"Surat lanjutan {dict(self._fields['perihal'].selection).get(next_perihal)} " + f"untuk customer ini sudah dibuat: {', '.join(existing.mapped('name'))}") + + # copy surat lama + new_vals = { + "tujuan_nama": rec.tujuan_nama, + "tujuan_email": rec.tujuan_email, + "perihal": next_perihal, + "partner_id": rec.partner_id.id, + "line_ids": [(0, 0, { + 'invoice_id': line.invoice_id.id, + 'invoice_number': line.invoice_number, + 'invoice_date': line.invoice_date, + 'invoice_date_due': line.invoice_date_due, + 'invoice_day_to_due': line.invoice_day_to_due, + 'new_invoice_day_to_due': line.new_invoice_day_to_due, + 'ref': line.ref, + 'amount_residual': line.amount_residual, + 'currency_id': line.currency_id.id, + 'payment_term_id': line.payment_term_id.id, + 'date_kirim_tukar_faktur': line.date_kirim_tukar_faktur, + 'date_terima_tukar_faktur': line.date_terima_tukar_faktur, + 'invoice_user_id': line.invoice_user_id.id, + 'sale_id': line.sale_id.id, + "selected": line.selected, + }) for line in rec.line_ids], + } + new_letter = self.create(new_vals) + self.env.user.notify_info( + message=f"Surat lanjutan {dict(self._fields['perihal'].selection).get(next_perihal)} berhasil dibuat ({new_letter.name}).", + title="Informasi", + sticky=False + ) + new_letter.message_post( + body= + f"Surat lanjutan dengan perihal {dict(self._fields['perihal'].selection).get(next_perihal)} " + f"berhasil dibuat berdasarkan surat sebelumnya.
" + f"Nomor Surat: {new_letter.name}" + ) + rec.message_post( + body=( + f"Surat lanjutan dengan perihal {dict(self._fields['perihal'].selection).get(next_perihal)} " + f"telah dibuat sebagai kelanjutan dari surat ini.
" + f"Nomor Surat Baru: {new_letter.name}" + ) + ) + return True @api.depends("line_ids.selected", "line_ids.invoice_date") @@ -170,7 +235,7 @@ class SuratPiutang(models.Model): now_utc = now_wib.astimezone(pytz.UTC).replace(tzinfo=None) rec.send_date = now_utc rec.action_send_letter() - rec.message_post(body="Surat Penagihan disetujui Pimpinan dan berhasil dikirim.") + rec.message_post(body="Surat Penagihan disetujui dan berhasil dikirim.") self.env.user.notify_info( message=f"Surat piutang {rec.name} berhasil dikirim ke {rec.partner_id.name} ({rec.tujuan_email})", @@ -268,7 +333,11 @@ class SuratPiutang(models.Model): 'reply_to': 'finance@indoteknik.co.id', } - template.send_mail(self.id, force_send=True, email_values=values) + template.with_context(mail_post_autofollow=False).send_mail( + self.id, + force_send=True, + email_values=values + ) _logger.info( f"Surat Piutang {self.name} terkirim ke {self.tujuan_email} " diff --git a/indoteknik_custom/views/letter_receivable.xml b/indoteknik_custom/views/letter_receivable.xml index 1a8980a3..86c28765 100644 --- a/indoteknik_custom/views/letter_receivable.xml +++ b/indoteknik_custom/views/letter_receivable.xml @@ -26,7 +26,17 @@
-
+ +
@@ -55,10 +79,10 @@
- - - - + + + + @@ -66,13 +90,13 @@ - +
- + -- cgit v1.2.3