diff options
| -rw-r--r-- | indoteknik_custom/models/letter_receivable.py | 39 | ||||
| -rw-r--r-- | indoteknik_custom/views/letter_receivable.xml | 29 |
2 files changed, 63 insertions, 5 deletions
diff --git a/indoteknik_custom/models/letter_receivable.py b/indoteknik_custom/models/letter_receivable.py index 10198fbf..550aa9e3 100644 --- a/indoteknik_custom/models/letter_receivable.py +++ b/indoteknik_custom/models/letter_receivable.py @@ -1,4 +1,8 @@ -from odoo import models, fields, api +from odoo import models, fields, api, _ +from odoo.exceptions import UserError +from odoo.exceptions import ValidationError +from odoo.tools import mail +from terbilang import Terbilang class SuratPiutang(models.Model): _name = "surat.piutang" @@ -33,6 +37,23 @@ class SuratPiutang(models.Model): compute='_compute_grand_total', ) + grand_total_text = fields.Char( + string="Total Terbilang", + compute="_compute_grand_total_text", + ) + + def _compute_grand_total_text(self): + tb = Terbilang() + for record in self: + res = "" + if record.grand_total and record.grand_total > 0: + try: + tb.parse(int(record.grand_total)) + res = tb.getresult().title() + " Rupiah" + except Exception: + res = "" + record.grand_total_text = res + @api.depends('line_ids.amount_residual', 'line_ids.selected') def _compute_grand_total(self): for rec in self: @@ -40,6 +61,21 @@ class SuratPiutang(models.Model): line.amount_residual or 0.0 for line in rec.line_ids if line.selected ) + @api.constrains("tujuan_email") + def _check_email_format(self): + for rec in self: + if rec.tujuan_email and not mail.single_email_re.match(rec.tujuan_email): + raise ValidationError(_("Format email tidak valid: %s") % rec.tujuan_email) + + def action_approve(self): + pimpinan_user_ids = [7] # Pak Akbar + if self.env.user.id not in pimpinan_user_ids: + raise UserError("Hanya Pimpinan yang berhak menyetujui tahap ini.") + for rec in self: + if rec.state == "approval_pimpinan": + rec.state = "sent" + rec.send_date = fields.Datetime.now() + @api.onchange('partner_id') def _onchange_partner_id(self): if self.partner_id: @@ -128,6 +164,7 @@ class SuratPiutang(models.Model): tahun = today.strftime("%y") vals["name"] = f"{seq}/LO/FAT/IDG/{bulan_romawi}/{tahun}" + vals["state"] = "approval_pimpinan" return super().create(vals) class SuratPiutangLine(models.Model): diff --git a/indoteknik_custom/views/letter_receivable.xml b/indoteknik_custom/views/letter_receivable.xml index fe60eb39..15875da9 100644 --- a/indoteknik_custom/views/letter_receivable.xml +++ b/indoteknik_custom/views/letter_receivable.xml @@ -26,8 +26,7 @@ <form string="Surat Piutang"> <header> <field name="state" widget="statusbar" statusbar_visible="draft,approval_pimpinan,sent"/> - <!-- <button name="action_send_surat" type="object" string="Kirim Surat" - states="draft" class="btn-primary"/> --> + <button name="action_approve" type="object" string="Approval & Send" class="btn-primary"/> </header> <div class="alert alert-info" role="alert" @@ -39,7 +38,7 @@ role="alert" style="height: 40px; margin-bottom:0px;" attrs="{'invisible':[('state', '!=', 'approval_pimpinan')]}"> - Surat piutang telah diajukan & surat otomatis terkirim bila telah di Approved Pimpinan. + <strong>Info!</strong> Surat piutang telah diajukan & surat otomatis terkirim bila telah di Approved Pimpinan. </div> <div class="alert alert-success" role="alert" @@ -69,8 +68,20 @@ </group> <notebook> <page string="Invoice Lines"> + <div class="alert alert-info" + role="alert" + style="height: 40px; margin-bottom:0px;"> + <strong>Info!</strong> Hanya invoice yang dipilih (tercentang) akan disertakan dalam dokumen surat piutang. + </div> + <div> + <strong>Grand Total Invoice Terpilih: Rp. + <field name="grand_total"/> ( + <field name="grand_total_text"/> + ) + </strong> + </div> <field name="line_ids"> - <tree editable="bottom"> + <tree editable="bottom" create="false" delete="false"> <field name="selected"/> <field name="invoice_number" readonly="1" force_save="1"/> <field name="ref" readonly="1" force_save="1"/> @@ -84,6 +95,16 @@ </field> </page> </notebook> + <div style="margin-top:4px; font-size:13px; color:#444; line-height:1.5;"> + Surat piutang akan diterbitkan berdasarkan lama keterlambatan pembayaran.<br/> + Pilih invoice yang sesuai dengan kriteria berikut: + <ul style="margin:4px 0 0 18px;"> + <li>Keterlambatan ≥ 45 hari → <em>Surat Resmi Penagihan</em></li> + <li>Keterlambatan ≥ 60 hari → <em>Surat Peringatan Piutang ke-1</em></li> + <li>Keterlambatan ≥ 70 hari → <em>Surat Peringatan Piutang ke-2</em></li> + <li>Keterlambatan ≥ 80 hari → <em>Surat Peringatan Piutang ke-3</em></li> + </ul> + </div> </sheet> </form> </field> |
