Introduction

The utilization of various discounts and surcharges is widely employed in the service sector to develop an optimal customer service policy and attract clients.
R_keeper 7 has a flexible, customizable system of discounts and markups. 

Types of discounts and markups

Discounts and markups are:

Sources of discounts and markups

When working with discounts, different sources of discounts are used:

Discounts and markups on payment

A discount or markup on payment is applied automatically either to an order or a seat depending on what is being paid for.

PDS discounts/markups

PDS discounts or markups are selected by the code that is recorded in the PDS card. Along with the code from the PDS, the Bonus Type and the Non-cash Payer Type (Defaulter Type) are sent, which are saved in the discount record and are used to select the Detail level level level.

Discounts by Cards

Card discounts may be offered both through dedicated discount cards as well as any other types of cards.

Undistributed Markups

The markup is considered undistributed if a menu item is specified for it. For r_keeper version 7.6.0 and earlier — a tax group is specified. Taxes will be calculated in accordance with the menu item and its tax group, and the menu item will be printed on the fiscal registrar.

Tips from change

A special type of undistributed markup is tips formed from change.

Applying discounts

The application of discounts and markups is set using:

Scope of application

A discount or markup has a scope of application. It can be:

Automatic discounts always have an area of ​​application—an order, or a visit when calculating the visit.

A discount or markup on a payment applies to either an order, a visit, or a seat, depending on what the payment relates to.

There are 3 preset application rules:

The application rules are selected for the package depending on the period, trade group and other conditions by priority.

A script rule, if it has been selected according to the conditions and priority, executes a script that determines one of the values:

A discount or markup may be applied to an order or seat if it can be applied to at least one package.

To apply a discount or markup, it is necessary that:

Automatic discounts/markups

An automatic discount or markup is added only if it has not been given manually anywhere in the application area. The application rules can be different for different packages, it is enough that at least one package has a discount with the Automatic rule.

If the Not Manually flag is set, the discount or markup cannot be given manually, but can be used as a discount or markup on payment, assigned by card, through an interface such as PDS, or as a markup for tips.

Multiple application of discounts

The same percentage discount or markup cannot be given twice on the same menu item or seat.

Amount discounts and markups can be set up for multiple use. In addition, after payment of the undistributed markup, an identical additional markup may be applied upon reordering. For example, if you give a discount on a common dish, then you can no longer give the same discount on any place. If the order was partially paid in one currency with a discount, and then in another currency with the same discount, then one discount will be added with a scope combining the dishes paid for by both payments.

Composition of discounts

When defining discount compositions, you specify composition operations for various ordered sets of discounts. For example:

All discounts except freely combinable ones can be included in sets. When setting the Freely combinable property for a discount, a check is performed for the presence of compositions.

All markups are freely combined. Compositions are applied separately for each menu item.

To select the desired composition, all discounts are used, except for freely combinable ones, which are applied:

If at least one menu item lacks the required composition, the set of discounts for this dish is compositionally impossible. A discount cannot be applied if it is compositionally impossible for at least one menu item in the application area.

Calculation of discounts

Scope (area of application)

The scope of the discount or markup is a set of menu items or parts, with partial payment from the scope of application, for which:

To check the validity of a discount or markup on a menu item, the following is checked:

If the rules for exceeding quantities are set — FromAmount, then the discount amount depends on the input sequence. The discount amount may change, including during packaging.

If a discount or markup on an order is given manually or it is a discount or markup on payment, then it is valid in packages where it is allowed and where it is given automatically.

If a discount or markup is given automatically, it is valid only in those packages where it is given automatically according to the rule. Therefore, the amount of the discount applied automatically may not match the amount of the same discount applied manually.

Selecting a Detail level

At least one Detail level level is created for each discount or markup. Detail levels define the value of the discount or markup as a percentage or the amount of the discount or markup and the conditions required for the discount or markup to take effect.

The category in the Detail level levels is set from the classifier specified in the discount or markup header. If the classifier is specified in the header, but the group is not specified in the Detail level levels, then this Detail level level refers to menu items that do not have a group specified by the discount or markup classifier. This applies to both percentage and amount discounts and markups.

Discount detail level may depend on the order category. In the case of a visit discount, the order category to which the discount was added is used — the total order category.

A discount detail level is considered zero if it specifies a zero percentage or an amount and a zero bonus percentage.

If no detail level matches any menu item, the discount is considered zero and is not included in compositions. However, if a discount becomes zero due to composition validation checks, it still participates in compositions, including payment-level discounts. Zero-value discounts without the Remember even when their value equals zero flag are not printed on receipts or guest bills ("PreReceipts").

Quantity dependent detail leveling

If more than one discount with detail leveling dependent on quantity of the type For each N or For excess quantity applies to one line, then if a composition is used for discounts, such discounts after the first are ignored. The check for the simultaneous effect of such discounts is carried out immediately after the check for the effect of discounts by composition—the rule the Next does not apply.

Discount Composition

Discount compositions are processed twice, with each process occurring separately for each menu item. Initially, they are evaluated to determine any potential limitations on the scope of the discounts by applying the "Next Does Not Apply" operation. Once the amounts have been allocated to the menu items within the defined scope, the compositions are then processed to account for restrictions through the following operations: "Reduce Next," "Maximum Discount Applies," and "Maximum Percentage." The "Reduce Next" operation is applied on a per-menu item basis, which may result in rounding errors.

If a maximum percentage discount is specified within the composition, the amount calculated based on this percentage is distributed among the discounts in proportion to the amounts determined prior to the combination or after the application of the "Reduce Next" operation. It is important to note that recalculation of total discounts after combination is not performed. The same principle applies to compositions involving the "Maximum Discount Applies" operation.

Example: A discount of 100 rubles is applied to an order totaling 500 rubles. For a specific menu item amounting to 50 rubles, a discount of 10 rubles was allocated. However, within the composition for this menu item, there is a restriction stating that the discount for this menu item will be limited to 5 rubles. Consequently, the total discount will be reduced by 5 rubles, resulting in a new total discount of 95 rubles instead of 100 rubles.

Minimum Price and Discount Recalculation upon Exceedance

The total amount of a dish according to the price list, including applicable discounts and markups, must not be less than its minimum price or zero. The check against the minimum price is performed last but before redistribution. If necessary, discount amounts are adjusted so that the total sum per menu item equals the minimum price multiplied by quantity. This is the only scenario where freely combinable discounts may affect each other.

The amounts of all discounts applicable to a specific menu item will be adjusted proportionally based on the calculated totals for that menu item. Any excess will be disregarded if there is no redistribution of surplus among the discounts.

If a discount applies to a quantity less than that specified in the line item, the minimum price will be verified against the lesser of the two quantities.

Example: Consider a 30% discount on an order and a promotion offering every fifth menu item for free. For a line item with a quantity of 5 and a total amount of 100 rubles, both discounts will apply to the fifth menu item, which has a value of 20 rubles. The total discounts would exceed the value of the menu item, amounting to 26 rubles (20 rubles for the free menu item and 6 rubles from the 30% discount). Consequently, the overall discount will be reduced by 6 rubles, resulting in a total discount of 44 rubles instead of 50. The first discount will then be calculated as: -30*(44/50) = -26.4. The second discount will be calculated as: -20*(44/50) = -17.6.

Redistribution of Discounts

The total amount of discounts applied to a menu item is limited by the minimum price of that menu item; however, the total amount of discounts for a specific menu item cannot exceed 100%.

If discount redistribution is not configured, the discount amount will be reduced when the limit for the menu item is reached.

If surplus redistribution is enabled, any excess discount from one menu item may be transferred to another menu item. 
Example: Consider two menu items, A and B, each priced at 100 rubles. Menu item A has a minimum price of 10 rubles, while menu item B has a minimum price of 70 rubles. If a 50% discount is applied without redistribution, the discount for menu item A will be 50 rubles, and for menu item B, it will be 30 rubles. Consequently, the total discount will amount to 80 rubles instead of 100.
If surplus redistribution is activated, the excess discount of 20 rubles (70 - 50) will be transferred to menu item A, resulting in a total discount of 100 rubles.
Surplus redistribution is only possible for freely combinable discounts. Starting from version r_k 7.7.0.112, it is also applicable to discounts that are part of a composition with the "Sum" operation.

The redistribution of the total discount amount aims to optimize taxation when different tax rates are applied. In this scenario, the maximum allowable discount amount, down to the minimum price, is allocated to menu items with the highest tax rate at the expense of those with the lowest tax rate.
Example: Consider two menu items, A and B, each priced at 100 rubles. Both menu items have minimum prices of 20 rubles; however, menu item A has a higher tax rate. In this case, the total 50% discount amounting to 100 rubles will be redistributed such that menu item A receives 80 rubles, down to its minimum price of 20 rubles, while the remaining 20 rubles will be allocated to menu item B, resulting in a final price of 80 rubles for it. The total discount will remain at 100 rubles, which represents 50% of the order. If total discount redistribution is enabled but surplus redistribution is disabled, then the total discount amount will be the same as if no total discount redistribution were applied.

Total discount redistribution and surplus redistribution are only possible if payment discounts are not utilized. There exists a parameter called "Redistribute Discounts," which enables the option for discount redistribution but simultaneously disables payment discounts.

Order Operations

Distribution of Discounts When Allocating Menu Items

If a total discount is applied to a menu item, the same discount will be added to newly created menu items during the allocation of the menu item to seating areas or packages. If the amount is manually entered, the discount will be distributed proportionally based on the quantities.

Partially Paid Orders at Shift Closure

Upon the conclusion of a common shift, unpaid orders are carried over to the new shift.

If an order has been partially paid, the amount that has been paid will remain with the original order, while the unpaid portion will be transferred to the new order. As a result, the total amount of the new order will be less than it was prior to the shift closure, which may lead to the cancellation of any applicable discounts. If a portion of the non-allocable surcharge was paid during the previous shift, the amount paid towards the surcharge in the new order will be recorded as a removed amount:

Employee Rights

To work with discounts at the manager's station, an employee must possess the following rights: 

Employee Rights for Discount Management at the cash station: