diff options
| author | Indoteknik . <it@fixcomart.co.id> | 2025-09-03 11:07:40 +0700 |
|---|---|---|
| committer | Indoteknik . <it@fixcomart.co.id> | 2025-09-03 11:07:40 +0700 |
| commit | 1c71710dbf42106a82c0a8e30ec9cee7f452a387 (patch) | |
| tree | 598d41f5b141b65a8a9e624455f4f0f5252677d0 | |
| parent | d43eb7ff8ffd4b11120a7354295e86736135344a (diff) | |
(andri) add refresh invoices agar data selalu update & fix layout form
| -rw-r--r-- | indoteknik_custom/models/letter_receivable.py | 61 | ||||
| -rw-r--r-- | indoteknik_custom/views/letter_receivable.xml | 44 |
2 files changed, 98 insertions, 7 deletions
diff --git a/indoteknik_custom/models/letter_receivable.py b/indoteknik_custom/models/letter_receivable.py index 541f64ff..10198fbf 100644 --- a/indoteknik_custom/models/letter_receivable.py +++ b/indoteknik_custom/models/letter_receivable.py @@ -4,19 +4,22 @@ class SuratPiutang(models.Model): _name = "surat.piutang" _description = "Surat Piutang" _inherit = ['mail.thread', 'mail.activity.mixin'] + _order = 'name desc' name = fields.Char(string="Nomor Surat", readonly=True, copy=False) partner_id = fields.Many2one("res.partner", string="Customer", required=True) tujuan_nama = fields.Char(string="Nama Tujuan") tujuan_email = fields.Char(string="Email Tujuan") perihal = fields.Selection([ - ('sp1', 'Surat Peringatan Piutang'), + ('penagihan', 'Surat Resmi Penagihan'), + ('sp1', 'Surat Peringatan Piutang ke-1'), ('sp2', 'Surat Peringatan Piutang ke-2'), ('sp3', 'Surat Peringatan Piutang ke-3') ], string="Perihal", required=True, tracking=True) line_ids = fields.One2many("surat.piutang.line", "surat_id", string="Invoice Lines") state = fields.Selection([ ("draft", "Draft"), + ("approval_pimpinan", "Menunggu Approval Pimpinan"), ("sent", "Sent") ], default="draft", tracking=True) send_date = fields.Datetime(string="Tanggal Kirim", tracking=True) @@ -59,6 +62,62 @@ class SuratPiutang(models.Model): }) for inv in invoice_lines] self.line_ids = lines + def action_refresh_lines(self): + for rec in self: + if not rec.partner_id: + continue + + # Ambil semua unpaid terbaru + invoice_views = self.env['unpaid.invoice.view'].search( + [('partner_id', '=', rec.partner_id.id)], + order='new_invoice_day_to_due asc' + ) + + existing_lines = {line.invoice_id.id: line for line in rec.line_ids} + + # Cache selected status per invoice id + selected_map = {line.invoice_id.id: line.selected for line in rec.line_ids} + + # Invoice id yang masih ada di unpaid + new_invoice_ids = invoice_views.mapped('invoice_id.id') + + for inv in invoice_views: + if inv.invoice_id.id in existing_lines: + # update line lama + line = existing_lines[inv.invoice_id.id] + line.write({ + 'invoice_view_id': inv.id, + 'invoice_number': inv.invoice_number, + 'invoice_date': inv.invoice_date, + 'invoice_date_due': inv.invoice_date_due, + 'invoice_day_to_due': inv.invoice_day_to_due, + 'ref': inv.ref, + 'amount_residual': inv.amount_residual, + 'currency_id': inv.currency_id.id, + 'payment_term_id': inv.payment_term_id.id, + 'selected': selected_map.get(inv.invoice_id.id, line.selected), + }) + else: + # preserve selected kalau pernah ada di cache + self.env['surat.piutang.line'].create({ + 'surat_id': rec.id, + 'invoice_view_id': inv.id, + 'invoice_id': inv.invoice_id.id, + 'invoice_number': inv.invoice_number, + 'invoice_date': inv.invoice_date, + 'invoice_date_due': inv.invoice_date_due, + 'invoice_day_to_due': inv.invoice_day_to_due, + 'ref': inv.ref, + 'amount_residual': inv.amount_residual, + 'currency_id': inv.currency_id.id, + 'payment_term_id': inv.payment_term_id.id, + 'selected': selected_map.get(inv.invoice_id.id, False), + }) + + # Hapus line yang tidak ada lagi di unpaid view + rec.line_ids.filtered(lambda l: l.invoice_id.id not in new_invoice_ids).unlink() + + @api.model def create(self, vals): # Generate nomor surat otomatis diff --git a/indoteknik_custom/views/letter_receivable.xml b/indoteknik_custom/views/letter_receivable.xml index 72eae640..fe60eb39 100644 --- a/indoteknik_custom/views/letter_receivable.xml +++ b/indoteknik_custom/views/letter_receivable.xml @@ -8,9 +8,12 @@ <field name="name"/> <field name="partner_id"/> <field name="perihal"/> - <field name="state"/> + <field name="state" widget="badge" + decoration-danger="state == 'draft'" + decoration-warning="state == 'approval_pimpinan'" + decoration-success="state == 'sent'"/> <field name="send_date"/> - <field name="line_ids" widget="one2many_list"/> + <!-- <field name="line_ids" widget="one2many_list"/> --> </tree> </field> </record> @@ -22,19 +25,48 @@ <field name="arch" type="xml"> <form string="Surat Piutang"> <header> - <field name="state" widget="statusbar" statusbar_visible="draft,sent"/> + <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"/> --> </header> + <div class="alert alert-info" + role="alert" + style="height: 40px; margin-bottom:0px;" + attrs="{'invisible':[('state', '!=', 'draft')]}"> + Selamat Datang di form Pengajuan Surat Piutang, Pastikan data sudah benar sebelum mengajukan approval ke Pimpinan. + </div> + <div class="alert alert-info" + 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. + </div> + <div class="alert alert-success" + role="alert" + style="height: 40px; margin-bottom:0px;" + attrs="{'invisible':[('state', '!=', 'sent')]}"> + Surat Piutang berhasil terkirim. + </div> <sheet> + <div class="oe_title"> + <h1> + <field name="name" readonly="1"/> + </h1> + </div> <group> - <field name="name" readonly="1"/> - <field name="partner_id" options="{'no_create': True}"/> - <field name="perihal"/> <field name="tujuan_nama"/> <field name="tujuan_email"/> + <field name="partner_id" options="{'no_create': True}"/> + <field name="perihal"/> <field name="send_date" readonly="1"/> </group> + <group> + <button name="action_refresh_lines" + string="Refresh Invoices" + type="object" + class="btn-primary" + help="Refresh Invoices agar data tetap update"/> + </group> <notebook> <page string="Invoice Lines"> <field name="line_ids"> |
