| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Approvals (approvals)
• Discuss (mail) • Point of Sale (point_of_sale) • Employees (hr) • Inventory (stock) • Invoicing (account) |
| Lines of code | 987 |
| Technical Name |
crowe_pos_discount_approval |
| License | LGPL-3 |
| Website | https://www.crowe.mv |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Approvals (approvals)
• Discuss (mail) • Point of Sale (point_of_sale) • Employees (hr) • Inventory (stock) • Invoicing (account) |
| Lines of code | 987 |
| Technical Name |
crowe_pos_discount_approval |
| License | LGPL-3 |
| Website | https://www.crowe.mv |
POS Discount Approval
Require manager sign-off before discounts reach the customer
Give your managers control over POS discounts. When a cashier applies a discount that exceeds your configured threshold, the POS displays a Request Approval button. The request flows through Odoo’s native Approvals app and payment is blocked until a designated manager approves it — all without leaving the POS screen.
Key Features
Configurable Thresholds
Set a maximum discount by amount (e.g. MVR 50) or by percentage (e.g. 5%). Each POS can have its own threshold and its own list of authorised approvers.
Real-time Approval
The POS polls for the approval decision every 10 seconds. As soon as a manager approves in the back office, the cashier sees a success notification and can proceed to payment immediately — no page reload needed.
Payment Enforcement
If the order contains a discount above the threshold and approval has not been granted, the payment screen is blocked with a clear message. No workarounds, no override without a manager.
How It Works
A real example: cashier requests a 15% discount
Step 1 — Enable in POS Settings
Open your POS configuration and enable Discount Approval. Choose a threshold type (Amount or Percentage), enter the limit value, and assign one or more approvers. Settings are locked while a session is active.
Step 2 — Request Approval button appears
When the cashier applies a discount that exceeds the threshold, a Request Approval button appears in the POS control bar. Trying to proceed to payment first shows a clear warning that approval is required.
Step 3 — Cashier enters a reason
Clicking the button opens a reason dialog. The cashier types a brief explanation (e.g. “Returnee customer”) and clicks Apply. The discount request is created and submitted to the approver automatically.
Step 4 — POS waits, manager reviews
The button changes to Approval Pending… while the POS polls silently in the background. Meanwhile the manager opens the Approvals app, inspects the discount lines, amount, and reason on the dedicated Discount Details tab.
Step 5 — Manager approves in back office
The approval request appears in the manager’s Odoo Approvals list under the
POS Discounts category (sequence POS-DISC). The
Discount Details tab shows every discounted product line with original price,
discount percentage, and final price. One click on Approve completes
the review.
Step 6 — POS updates in real time
Within seconds the cashier sees a green Approved ✓ button and a success toast. Payment can now proceed normally. If the manager refuses instead, a danger notification appears immediately so the cashier can adjust the order and re-submit.
Configuration
A single settings panel in the POS configuration
- Open Point of Sale → Configuration → Settings and select your POS.
- Under Discount Approval, enable Require Discount Approval.
-
Choose the Threshold Type:
- Amount — trigger when the total discount value exceeds a fixed amount.
- Percentage — trigger when any line discount percentage exceeds a limit.
- Enter the threshold value and select one or more Discount Approvers.
- Save. The approval button will appear in the POS as soon as the session is opened.
Benefits
Prevent unauthorised discounts
Cashiers can no longer complete large discounts without explicit manager approval, reducing revenue leakage and ad-hoc price negotiations at the counter.
Full audit trail
Every discount request is stored as a pos.discount.request record with
the cashier name, session, approval date, and approver — searchable from the
POS menu.
Zero disruption to checkout
The approval flow is non-intrusive: the POS keeps operating normally while waiting. Expired requests (after 2 minutes) are cleaned up automatically so the cashier can re-submit.
Supports line and global discounts
Works with both per-line percentage discounts and global discount products (negative price lines), covering all standard POS discount patterns.
Feature Summary
In the POS
Request Approval button appears when threshold is exceeded.
Button shows live status: Pending / Approved ✓.
Rejection surfaces immediately; cashier can re-submit.
Payment screen blocked until approval is confirmed.
In the Back Office
Native Odoo Approvals workflow (POS-DISC sequence).
Discount Details tab with per-line breakdown and totals.
Per-POS threshold (amount or percentage) and approver list.
Searchable discount request history with state filters.
Technical Details
Server Side
- pos.discount.request — tracks each approval request with session, cashier, discount lines, totals, state and approver.
- pos.discount.request.line — one row per discounted product, storing original price, discount amount or percentage, and computed final price.
- pos.config — extended with threshold mode, threshold value, and a many2many approver list.
-
approval.request — overrides
action_approve/action_refuseto sync status back to the POS discount record.
Front End (OWL)
- Patches PosOrder to track the approval request ID and status per order.
- Adds a DiscountApprovalButton component to the POS control bar via template inheritance.
- Polls
pos.discount.request.check_approval_statusevery 10 seconds and updates the button reactively. - Patches PosStore.pay() to block payment when unapproved discounts are present.
- Auto-cleans expired requests (2-minute TTL) from the server and resets UI state.
Compatibility & Dependencies
Version
Built for Odoo 19.0, compatible with both Community and Enterprise editions.
Dependencies
Requires base, mail, approvals and point_of_sale.
Support
Brought to you by Crowe Maldives LLP
Author
Crowe Maldives LLP
Website
www.crowe.mv
Licensed under LGPL-3.
Please log in to comment on this module