diff options
| -rw-r--r-- | indoteknik_custom/models/refund_sale_order.py | 39 | ||||
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 10 |
2 files changed, 31 insertions, 18 deletions
diff --git a/indoteknik_custom/models/refund_sale_order.py b/indoteknik_custom/models/refund_sale_order.py index 4ee76006..687acd6d 100644 --- a/indoteknik_custom/models/refund_sale_order.py +++ b/indoteknik_custom/models/refund_sale_order.py @@ -57,6 +57,7 @@ class RefundSaleOrder(models.Model): refund_type = fields.Selection([ ('barang_kosong_sebagian', 'Refund Barang Kosong Sebagian'), ('barang_kosong', 'Refund Barang Kosong Full'), + ('barang_kosong_indent', 'Refund Barang Kosong Sebagian(Indent)'), ('uang', 'Refund Lebih Bayar'), ('retur_half', 'Refund Retur Sebagian'), ('retur', 'Refund Retur Full'), @@ -216,7 +217,7 @@ class RefundSaleOrder(models.Model): vals['created_date'] = fields.Date.context_today(self) vals['create_uid'] = self.env.user.id - + refund_type = vals.get('refund_type') if 'sale_order_ids' in vals: so_cmd = vals['sale_order_ids'] so_ids = so_cmd[0][2] if so_cmd and so_cmd[0][0] == 6 else [] @@ -226,6 +227,18 @@ class RefundSaleOrder(models.Model): if len(partner) > 1: raise UserError("❌ Tidak dapat membuat refund untuk Multi SO dengan Customer berbeda. Harus memiliki Customer yang sama.") vals['partner_id'] = sale_orders[0].partner_id.id + if refund_type not in ['barang_kosong_indent', 'salah_transfer']: + for so in sale_orders: + if so.state not in ['cancel', 'sale']: + raise UserError(f"❌ SO {so.name} tidak bisa direfund. Status harus Cancel atau Sale.") + if so.state == 'sale': + not_done_pickings = so.picking_ids.filtered(lambda p: p.state not in ['done', 'cancel']) + if not_done_pickings: + raise UserError( + f"❌ SO {so.name} Belum melakukan kirim barang " + f"({', '.join(not_done_pickings.mapped('name'))}). " + "Selesaikan Pengiriman untuk melakukan refund." + ) invoices = sale_orders.mapped('invoice_ids').filtered( lambda inv: inv.move_type in ['out_invoice', 'out_refund'] and inv.state != 'cancel' @@ -234,7 +247,6 @@ class RefundSaleOrder(models.Model): vals['invoice_ids'] = [(6, 0, invoices.ids)] - 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) @@ -244,7 +256,7 @@ class RefundSaleOrder(models.Model): if not invoice_ids and refund_type and refund_type in ['uang', 'barang_kosong_sebagian', 'retur_half']: raise UserError("Refund type Lebih Bayar dan Barang Kosong Sebagian Hanya Bisa dipilih Jika Ada Invoice") - if refund_type in ['barang_kosong', 'barang_kosong_sebagian'] and so_ids: + if refund_type in ['barang_kosong', 'barang_kosong_sebagian', 'barang_kosong_indent'] and so_ids: sale_orders = self.env['sale.order'].browse(so_ids) if refund_type == 'barang_kosong': @@ -382,6 +394,7 @@ class RefundSaleOrder(models.Model): sale_orders = self.env['sale.order'].browse(so_ids) + valid_invoices = sale_orders.mapped('invoice_ids').filtered( lambda inv: inv.move_type in ['out_invoice', 'out_refund'] and inv.state != 'cancel' ) @@ -391,9 +404,19 @@ class RefundSaleOrder(models.Model): so_ids = rec.sale_order_ids.ids sale_orders = self.env['sale.order'].browse(so_ids) - - refund_type = vals.get('refund_type', rec.refund_type) + if refund_type not in ['barang_kosong_indent', 'salah_transfer']: + for so in sale_orders: + if so.state not in ['cancel', 'sale']: + raise UserError(f"❌ SO {so.name} tidak bisa direfund. Status harus Cancel atau Sale.") + if so.state == 'sale': + not_done_pickings = so.picking_ids.filtered(lambda p: p.state not in ['done', 'cancel']) + if not_done_pickings: + raise UserError( + f"❌ SO {so.name} Belum melakukan kirim barang " + f"({', '.join(not_done_pickings.mapped('name'))}). " + "Selesaikan Pengiriman untuk melakukan refund." + ) if refund_type in ['barang_kosong', 'barang_kosong_sebagian'] and sale_orders: zero_delivery_lines = sale_orders.mapped('order_line').filtered(lambda l: l.qty_delivered >= 0 or l.product_uom_qty > l.qty_delivered) @@ -625,7 +648,7 @@ class RefundSaleOrder(models.Model): @api.onchange('refund_type') def _onchange_refund_type(self): self.line_ids = [(5, 0, 0)] - if self.refund_type in ['barang_kosong_sebagian', 'barang_kosong'] and self.sale_order_ids: + if self.refund_type in ['barang_kosong_sebagian', 'barang_kosong', 'barang_kosong_indent'] and self.sale_order_ids: line_vals = [] for so in self.sale_order_ids: for line in so.order_line: @@ -920,7 +943,7 @@ class RefundSaleOrder(models.Model): # Normalisasi refund_type_label = refund_type_label.upper() - if refund.refund_type in ['barang_kosong', 'barang_kosong_sebagian']: + if refund.refund_type in ['barang_kosong', 'barang_kosong_sebagian', 'barang_kosong_indent']: refund_type_label = "REFUND BARANG KOSONG" elif refund.refund_type in ['retur_half', 'retur']: refund_type_label = "REFUND RETUR BARANG" @@ -1146,7 +1169,7 @@ class RefundSaleOrder(models.Model): 'origin': ','.join(refund.sale_order_ids.mapped('name')), 'origin_so': refund.sale_order_ids.id, 'operations': picking.id, - 'return_type': 'revisi_so', + 'return_type': 'retur_so', 'invoice_id': [(6, 0, refund.invoice_ids.ids)], 'refund_id': refund.id, 'line_ids': line_vals, diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 2d8567b0..39830ffc 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -3259,16 +3259,6 @@ class SaleOrder(models.Model): def button_refund(self): self.ensure_one() - - if self.state not in ['cancel', 'sale']: - raise UserError(f"❌ SO {self.name} tidak bisa direfund. Status harus Cancel atau Sale.") - if self.state == 'sale': - not_done_pickings = self.picking_ids.filtered(lambda p: p.state not in ['done', 'cancel']) - if not_done_pickings: - raise UserError( - 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') |
