Yes, this is achievable in Business Central using a combination of standard approvals, a custom Sales Header field to indicate the desired discount, and either custom workflow events (AL) or Power Automate for per-discount approvals; each discount can be routed and approved separately before a discount line is added. The process hinges on a “Requested Discount” field on the Sales Header that triggers approval, line-level gating, and separate approval entries for each discount type as needed.
Is it possible
-
Business Central supports approvals on sales documents and can be extended with custom workflow events/responses to react to new fields or conditions beyond the out‑of‑the‑box templates, enabling tailored approval logic for discounts before allowing line entry or release
-
Power Automate adds flexible triggers for approval workflows tied to Business Central record events and even action-based flows, making it practical to implement per-discount approval routing without being limited to header-only conditions.
Trigger by header note/field
-
Create a custom field on Sales Header (e.g., “Requested Discount Code”) and expose it on the page; standard workflow can listen to record changes or approval requests, while a custom workflow event can fire when that field changes to a non-blank value to start a discount approval.
-
If using Power Automate, configure a flow triggered by Business Central record-change triggers or add an action “For a selected record” to explicitly request discount approval from the Sales Order when the note/field is set, ensuring the flow only runs when the field contains a discount identifier.
Separate approval per discount
-
Standard approval entries support approver assignment and chains; generating one approval request per discount item/requested code ensures that each discount is independently approved, even for the same document and approver, by issuing multiple approval entries or multiple Power Automate approval tasks keyed to each discount.
-
For line-level control, a common pattern is to iterate lines or a list of requested discounts and create approval requests per value in automation, which Power Automate handles well; this mirrors known line-level approval designs where each distinct driver (e.g., department/discount) gets a separate approval unit.
Proposed structure in BC
-
Add a Sales Header field “Requested Discount Codes” (text or related to an item list) and block discount line insertion until approvals are completed; use event subscribers to enforce business rules and populate Approval Entry context for clarity in the approver experience.
-
Implement a workflow: when “Requested Discount Code” changes from blank to a value, create approval entries per requested discount and lock the Sales Order (or specifically the discount item code) until approved; releasing or enabling line insert occurs in the workflow response “On approval”.
Implementation options
-
Option A: Standard workflow + custom events
-
Define a new workflow event “Requested Discount set on Sales Header” and corresponding responses “Create approval request for discount X” and “Unlock discount item insertion on approval,” registering them per Microsoft guidance on adding workflow events/responses.
-
Use Approvals Mgmt. hooks to enrich Approval Entry with discount metadata (e.g., item number, description) for approvers, as shown by community patterns for populating Approval Entry custom fields.
-
Option B: Power Automate per-discount approvals
-
Trigger on record change or “For a selected record,” read the header’s requested discount list, then loop and create separate modern approvals for each discount; on approval callback, update a custom status table per discount and permit line insertion for approved ones only.
Controlling line addition
-
Enforce a guard in AL: in Sales Line OnBeforeValidate(Type/No.) or via a page action override, prevent adding a “discount item” line if its matching discount hasn’t been approved; allow after approval response marks that discount as “Approved” on the Sales Header or a child table.
-
Alternatively, hold the document in an on-hold state and auto-release once all requested discounts are approved; automatic release upon all approvals is a common pattern in approval designs and can be implemented in the response step.
Prepayments compatibility
-
Prepayments are standard and can coexist; ensure the approval gating happens before adding discount lines and before final invoice, while prepayment invoices can be generated and collected as usual according to prepayment setup and workflow timing.
-
If discount approvals affect pricing or amounts that impact prepayment percentage, align the approval timing with steps in the prepayment walkthrough so that approved discounts are reflected before invoicing prepayments or final invoice.
Practical steps to start
-
Build the Sales Header field and page extension, add a small approval status table keyed by Document No. and Discount Code, and wire a workflow event on field change to spawn per-discount approvals and lock discount line insert until approved.
-
If rapid delivery is preferred, implement with Power Automate using Business Central triggers and approval actions, iterating requested discounts and writing back individual approval results, then AL validates on line add based on those results.
Notes on discounts as items
-
Business Central also supports price/discount frameworks natively; when modeling discounts as items, approval logic must specifically target those item numbers or a category code to avoid gating regular lines; mapping by item or dimension is common in line-level approval designs
-
Consider documenting the list of discount items and using that as the allow-list for the line gating and approval generation so that maintenance is centralized and approval routing can vary by discount type if needed.
If desired, a sample blueprint can be shared: new field on Sales Header, custom workflow event and response, Approval Entry enrichment for clarity, and AL guard on discount item insertion; or a Power Automate variant with per-discount loops and callbacks to unlock each discount line path after approval.