summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorit-fixcomart <it@fixcomart.co.id>2025-09-16 16:18:24 +0700
committerit-fixcomart <it@fixcomart.co.id>2025-09-16 16:18:24 +0700
commit9e6ab83ccd890c2ddd4e74cc0ed650d35a12f31e (patch)
treeb7eff048b7843b7be7e0e6e407012c5f6c0c5eeb
parent41b9e8084b388dca0b5b18daf0dfe9537db1ed1c (diff)
<hafid> journal payment tempo
-rw-r--r--indoteknik_custom/models/refund_sale_order.py118
-rwxr-xr-xindoteknik_custom/models/sale_order.py22
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 76d4d7e7..9cdd9a7b 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -3306,16 +3306,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:
@@ -3324,12 +3339,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