diff options
| author | IT Fixcomart <it@fixcomart.co.id> | 2025-09-16 10:04:16 +0000 |
|---|---|---|
| committer | IT Fixcomart <it@fixcomart.co.id> | 2025-09-16 10:04:16 +0000 |
| commit | 940a2c02cfef4b4fa9fa56ed7887116795beab5b (patch) | |
| tree | 18e9ae9a96c543c2977ad6853060a4c5b549dc24 | |
| parent | 07d8129d96f1e48838e27c33ad762673a04d465e (diff) | |
| parent | 9e6ab83ccd890c2ddd4e74cc0ed650d35a12f31e (diff) | |
Merged in refund_system (pull request #419)
<hafid> journal payment tempo
| -rw-r--r-- | indoteknik_custom/models/refund_sale_order.py | 118 | ||||
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 22 |
2 files changed, 117 insertions, 23 deletions
diff --git a/indoteknik_custom/models/refund_sale_order.py b/indoteknik_custom/models/refund_sale_order.py index 55128080..4ee76006 100644 --- a/indoteknik_custom/models/refund_sale_order.py +++ b/indoteknik_custom/models/refund_sale_order.py @@ -113,7 +113,7 @@ class RefundSaleOrder(models.Model): string='Customer', required=True ) - advance_move_names = fields.Html(string="Group Journal SO", compute="_compute_advance_move_names") + advance_move_names = fields.Html(string="Group Journal Payment", compute="_compute_advance_move_names") uang_masuk_type = fields.Selection([ ('pdf', 'PDF'), ('image', 'Image'), @@ -237,6 +237,7 @@ class RefundSaleOrder(models.Model): refund_type = vals.get('refund_type') invoice_ids_data = vals.get('invoice_ids', []) invoice_ids = invoice_ids_data[0][2] if invoice_ids_data and invoice_ids_data[0][0] == 6 else [] + invoices = self.env['account.move'].browse(invoice_ids) if invoice_ids and refund_type and refund_type not in ['uang', 'barang_kosong_sebagian', 'barang_kosong', 'retur_half']: raise UserError("Refund type Hanya Bisa Lebih Bayar, Barang Kosong Sebagian, atau Retur jika ada invoice") @@ -276,18 +277,46 @@ class RefundSaleOrder(models.Model): ('journal_id', '=', 11), ('state', '=', 'posted'), ]) - total_uang_muka = sum(moves.mapped('amount_total_signed')) if moves else 0.0 - total_midtrans = sum(self.env['sale.order'].browse(so_ids).mapped('gross_amount')) if so_ids else 0.0 - total_pembayaran = total_uang_muka + total_midtrans + piutangbca = self.env['account.move'].search([ + ('ref', 'in', invoices.mapped('name')), + ('journal_id', '=', 4), + ('state', '=', 'posted'), + ]) + piutangmdr = self.env['account.move'].search([ + ('ref', 'in', invoices.mapped('name')), + ('journal_id', '=', 7), + ('state', '=', 'posted'), + ]) + has_moves = bool(moves) + has_piutangmdr = bool(piutangmdr) + has_piutangbca = bool(piutangbca) + ssos = self.env['sale.order'].browse(so_ids) + has_settlement = any(so.payment_status == 'settlement' for so in ssos) + + sisa_uang_masuk = 0.0 + if has_moves and has_settlement: + sisa_uang_masuk = sum(moves.mapped('amount_total_signed')) + sum(ssos.mapped('gross_amount')) + elif has_moves: + sisa_uang_masuk = sum(moves.mapped('amount_total_signed')) + elif has_settlement: + sisa_uang_masuk = sum(ssos.mapped('gross_amount')) + elif has_piutangbca: + sisa_uang_masuk = sum(piutangbca.mapped('amount_total_signed')) + elif has_piutangmdr: + sisa_uang_masuk = sum(piutangmdr.mapped('amount_total_signed')) + else: + raise UserError( + "❌ Tidak bisa melakukan refund karena SO tidak memiliki Record Uang Masuk " + "(Journal Uang Muka / Payment Invoices / Midtrans Payment)." + ) + existing_refunds = self.env['refund.sale.order'].search([ ('sale_order_ids', 'in', so_ids) ], order='id desc', limit=1) if existing_refunds: sisa_uang_masuk = existing_refunds.remaining_refundable - else: - sisa_uang_masuk = total_pembayaran if sisa_uang_masuk < 0: raise UserError("❌ Tidak ada sisa transaksi untuk di-refund.") @@ -452,15 +481,34 @@ class RefundSaleOrder(models.Model): def _compute_advance_move_names(self): for rec in self: move_links = [] + + invoice_ids = rec.sale_order_ids.mapped('invoice_ids') + moves = self.env['account.move'].search([ ('sale_id', 'in', rec.sale_order_ids.ids), ('journal_id', '=', 11), - ('state', '=', 'posted') + ('state', '=', 'posted'), ]) - for move in moves: + + piutangbca = self.env['account.move'].search([ + ('ref', 'in', invoice_ids.mapped('name')), + ('journal_id', '=', 4), + ('state', '=', 'posted'), + ]) + + piutangmdr = self.env['account.move'].search([ + ('ref', 'in', invoice_ids.mapped('name')), + ('journal_id', '=', 7), + ('state', '=', 'posted'), + ]) + + all_moves = moves | piutangbca | piutangmdr + + for move in all_moves: url = f"/web#id={move.id}&model=account.move&view_type=form" name = html_escape(move.name or 'Unnamed') move_links.append(f'<a href="{url}" target="_blank">{name}</a>') + rec.advance_move_names = ', '.join(move_links) if move_links else "-" @api.depends('sale_order_ids.user_id') @@ -496,9 +544,35 @@ class RefundSaleOrder(models.Model): ('journal_id', '=', 11), ('state', '=', 'posted'), ]) - total_uang_muka = sum(moves.mapped('amount_total_signed')) if moves else 0.0 - total_midtrans = sum(self.env['sale.order'].browse(so_ids).mapped('gross_amount')) if so_ids else 0.0 - self.uang_masuk = (total_uang_muka + total_midtrans) - amount_refund_before + piutangbca = self.env['account.move'].search([ + ('ref', 'in', all_invoices.mapped('name')), + ('journal_id', '=', 4), + ('state', '=', 'posted'), + ]) + piutangmdr = self.env['account.move'].search([ + ('ref', 'in', all_invoices.mapped('name')), + ('journal_id', '=', 7), + ('state', '=', 'posted'), + ]) + has_moves = bool(moves) + has_piutangmdr = bool(piutangmdr) + has_piutangbca = bool(piutangbca) + ssos = self.env['sale.order'].browse(so_ids) + has_settlement = any(so.payment_status == 'settlement' for so in ssos) + + sisa_uang_masuk = 0.0 + if has_moves and has_settlement: + sisa_uang_masuk = sum(moves.mapped('amount_total_signed')) + sum(ssos.mapped('gross_amount')) + elif has_moves: + sisa_uang_masuk = sum(moves.mapped('amount_total_signed')) + elif has_settlement: + sisa_uang_masuk = sum(ssos.mapped('gross_amount')) + elif has_piutangbca: + sisa_uang_masuk = sum(piutangbca.mapped('amount_total_signed')) + elif has_piutangmdr: + sisa_uang_masuk = sum(piutangmdr.mapped('amount_total_signed')) + + self.uang_masuk = sisa_uang_masuk - amount_refund_before self.invoice_ids = all_invoices @@ -519,7 +593,6 @@ class RefundSaleOrder(models.Model): """ Validasi SO harus punya uang masuk (Journal Uang Muka / Midtrans) """ for rec in self: invalid_orders = [] - total_uang_masuk = 0.0 for so in rec.sale_order_ids: # cari journal uang muka @@ -528,21 +601,24 @@ class RefundSaleOrder(models.Model): ('journal_id', '=', 11), # Journal Uang Muka ('state', '=', 'posted'), ]) + piutangbca = self.env['account.move'].search([ + ('ref', 'in', rec.invoice_ids.mapped('name')), + ('journal_id', '=', 4), + ('state', '=', 'posted'), + ]) + piutangmdr = self.env['account.move'].search([ + ('ref', 'in', rec.invoice_ids.mapped('name')), + ('journal_id', '=', 7), + ('state', '=', 'posted'), + ]) - if not moves and so.payment_status != 'settlement': + if not moves and so.payment_status != 'settlement' and not piutangbca and not piutangmdr: invalid_orders.append(so.name) - if moves: - total_uang_muka = sum(moves.mapped('amount_total_signed')) or 0.0 - total_uang_masuk += total_uang_muka - else: - # fallback Midtrans gross_amount - total_uang_masuk += so.gross_amount or 0.0 - if invalid_orders: raise ValidationError( f"Tidak dapat membuat refund untuk SO {', '.join(invalid_orders)} " - "karena tidak memiliki Record Uang Masuk (Journal Uang Muka/Midtrans).\n" + "karena tidak memiliki Record Uang Masuk (Journal Uang Muka/Payment Invoice/Midtrans).\n" "Pastikan semua SO yang dipilih sudah memiliki Record pembayaran yang valid." ) diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 136663ba..484a9016 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -3261,16 +3261,31 @@ class SaleOrder(models.Model): f"❌ SO {self.name} Belum melakukan kirim barang " f"({', '.join(not_done_pickings.mapped('name'))}). Selesaikan Pengiriman untuk melakukan refund." ) + + invoice_ids = self.invoice_ids.filtered(lambda inv: inv.state != 'cancel') + moves = self.env['account.move'].search([ ('sale_id', '=', self.id), ('journal_id', '=', 11), ('state', '=', 'posted'), ]) + piutangbca = self.env['account.move'].search([ + ('ref', 'in', invoice_ids.mapped('name')), + ('journal_id', '=', 4), + ('state', '=', 'posted'), + ]) + piutangmdr = self.env['account.move'].search([ + ('ref', 'in', invoice_ids.mapped('name')), + ('journal_id', '=', 7), + ('state', '=', 'posted'), + ]) # Default 0 total_uang_muka = 0.0 has_moves = bool(moves) + has_piutangmdr = bool(piutangmdr) + has_piutangbca = bool(piutangbca) has_settlement = self.payment_status == 'settlement' if has_moves and has_settlement: @@ -3279,12 +3294,15 @@ class SaleOrder(models.Model): total_uang_muka = sum(moves.mapped('amount_total_signed')) elif has_settlement: total_uang_muka = self.gross_amount + elif has_piutangbca: + total_uang_muka = sum(piutangbca.mapped('amount_total_signed')) + elif has_piutangmdr: + total_uang_muka = sum(piutangmdr.mapped('amount_total_signed')) else: raise UserError( "Tidak bisa melakukan refund karena SO tidak memiliki Record Uang Masuk " - "(Journal Uang Muka/Midtrans Payment)." + "(Journal Uang Muka/Payment Invoices/Midtrans Payment)." ) - invoice_ids = self.invoice_ids.filtered(lambda inv: inv.state != 'cancel') total_refunded = sum(self.refund_ids.mapped('amount_refund')) sisa_uang_muka = total_uang_muka - total_refunded |
