From 383bf63f1976be4c4bf447a4dcd67a29b1180c54 Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Fri, 5 Jun 2026 15:40:46 +0700 Subject: [PATCH] feat: prevent refunding cancelled pos orders on both server and client side --- models/pos_order.py | 9 ++++++++- .../src/app/screens/ticket_screen/ticket_screen.js | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/models/pos_order.py b/models/pos_order.py index 3590988..14b07d7 100644 --- a/models/pos_order.py +++ b/models/pos_order.py @@ -1,4 +1,5 @@ -from odoo import models, fields, api +from odoo import models, fields, api, _ +from odoo.exceptions import UserError class PosOrder(models.Model): _inherit = 'pos.order' @@ -8,3 +9,9 @@ class PosOrder(models.Model): # Existing Odoo/POS fields renamed for clarity user_id = fields.Many2one('res.users', string='Session User', help='Odoo user who opened the session') employee_id = fields.Many2one('hr.employee', string='Order Taker', help='Employee who uses the cash register') + + def _refund(self): + for order in self: + if order.state == 'cancel': + raise UserError(_("You cannot refund a cancelled order.")) + return super()._refund() diff --git a/static/src/app/screens/ticket_screen/ticket_screen.js b/static/src/app/screens/ticket_screen/ticket_screen.js index f603ccf..26531ec 100644 --- a/static/src/app/screens/ticket_screen/ticket_screen.js +++ b/static/src/app/screens/ticket_screen/ticket_screen.js @@ -2,6 +2,8 @@ import { patch } from "@web/core/utils/patch"; import { TicketScreen } from "@point_of_sale/app/screens/ticket_screen/ticket_screen"; +import { AlertDialog } from "@web/core/confirmation_dialog/confirmation_dialog"; +import { _t } from "@web/core/l10n/translation"; patch(TicketScreen.prototype, { async setOrder(order) { @@ -25,5 +27,17 @@ patch(TicketScreen.prototype, { } return super.setOrder(order); + }, + + async onDoRefund() { + const order = this.getSelectedOrder(); + if (order && order.state === 'cancel') { + this.dialog.add(AlertDialog, { + title: _t("Refund Blocked"), + body: _t("You cannot refund a cancelled order."), + }); + return; + } + return super.onDoRefund(); } });