@escapenavigator/utils 2.0.48 → 2.0.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,11 +2,10 @@ import { TariffReducedRateModeEnum } from '@escapenavigator/types/dist/tariff/en
2
2
  /**
3
3
  * Льготные места внутри одной брони (школьники, студенты) и пол выручки.
4
4
  *
5
- * Ключевая идея: сколько льготных мест влезает — не отдельная настройка, а
6
- * следствие минимальной стоимости игры. Венью задаёт «ниже 98 € комната не
7
- * продаётся», и правила вида «на двоих льготных мест нет, на троих — одно»
8
- * получаются сами. Поэтому здесь нет ни лимитов по составам, ни таблицы
9
- * льготных цен: только ставка и минимум.
5
+ * Льготное место — скидка от групповой цены состава, не отдельный билет.
6
+ * Выбрать можно любое число до размера группы; если скидка пробивает
7
+ * минимум, итог остаётся на полу, выбор не блокируется. Отдельной таблицы
8
+ * льготных цен и лимитов по составам нет: только ставка и минимум.
10
9
  */
11
10
  export type ReducedPricingConfig = {
12
11
  /** `null` — тариф без льготных мест. */
@@ -52,9 +51,8 @@ export declare const getPerPersonAmount: (level: PriceLevel) => number;
52
51
  */
53
52
  export declare const getReducedSeatDiscount: (args: ReducedArgs) => number;
54
53
  /**
55
- * Сколько мест можно отдать по льготной ставке, не пробив минимум. Ноль
56
- * значит «при этом составе льготных мест нет» — так получается прочерк на
57
- * минимальной группе.
54
+ * Сколько мест реально меняют сумму, не упираясь в пол. Это не лимит
55
+ * выбора — гость может отметить больше, цена просто перестанет падать.
58
56
  */
59
57
  export declare const getMaxReducedPlayers: (args: ReducedArgs) => number;
60
58
  /**
@@ -65,4 +63,11 @@ export declare const getMaxReducedPlayers: (args: ReducedArgs) => number;
65
63
  export declare const getGroupPriceWithReduced: (args: ReducedArgs & {
66
64
  reducedPlayers?: number | null;
67
65
  }) => number;
66
+ /**
67
+ * Сколько фактически сняли со состава после пола. Меньше номинала
68
+ * `места × ставка`, если итог уже на минимуме.
69
+ */
70
+ export declare const getAppliedReducedDiscount: (args: ReducedArgs & {
71
+ reducedPlayers?: number | null;
72
+ }) => number;
68
73
  export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getGroupPriceWithReduced = exports.getMaxReducedPlayers = exports.getReducedSeatDiscount = exports.getPerPersonAmount = exports.applyMinGameAmount = exports.getMinGameAmount = exports.tariffGameSnapshot = void 0;
3
+ exports.getAppliedReducedDiscount = exports.getGroupPriceWithReduced = exports.getMaxReducedPlayers = exports.getReducedSeatDiscount = exports.getPerPersonAmount = exports.applyMinGameAmount = exports.getMinGameAmount = exports.tariffGameSnapshot = void 0;
4
4
  const tariff_reduced_rate_mode_enum_1 = require("@escapenavigator/types/dist/tariff/enum/tariff-reduced-rate-mode.enum");
5
5
  /**
6
6
  * Достаёт из тарифа поля, влияющие на цену игры. Хранить их на заказе нужно по
@@ -58,9 +58,8 @@ const getReducedSeatDiscount = (args) => {
58
58
  };
59
59
  exports.getReducedSeatDiscount = getReducedSeatDiscount;
60
60
  /**
61
- * Сколько мест можно отдать по льготной ставке, не пробив минимум. Ноль
62
- * значит «при этом составе льготных мест нет» — так получается прочерк на
63
- * минимальной группе.
61
+ * Сколько мест реально меняют сумму, не упираясь в пол. Это не лимит
62
+ * выбора — гость может отметить больше, цена просто перестанет падать.
64
63
  */
65
64
  const getMaxReducedPlayers = (args) => {
66
65
  const seatDiscount = (0, exports.getReducedSeatDiscount)(args);
@@ -88,3 +87,14 @@ const getGroupPriceWithReduced = (args) => {
88
87
  return (0, exports.applyMinGameAmount)(amount - seats * (0, exports.getReducedSeatDiscount)(args), args);
89
88
  };
90
89
  exports.getGroupPriceWithReduced = getGroupPriceWithReduced;
90
+ /**
91
+ * Сколько фактически сняли со состава после пола. Меньше номинала
92
+ * `места × ставка`, если итог уже на минимуме.
93
+ */
94
+ const getAppliedReducedDiscount = (args) => {
95
+ const amount = groupAmount(args);
96
+ if (!amount)
97
+ return 0;
98
+ return Math.max(0, amount - (0, exports.getGroupPriceWithReduced)(args));
99
+ };
100
+ exports.getAppliedReducedDiscount = getAppliedReducedDiscount;
@@ -134,6 +134,20 @@ describe('края', () => {
134
134
  ...PARIS_REDUCED,
135
135
  })).toBe(10500);
136
136
  });
137
+ it('лишние льготные места можно выбрать — скидка упирается в пол, а не режет выбор', () => {
138
+ expect((0, reduced_price_1.getAppliedReducedDiscount)({
139
+ price: PARIS,
140
+ players: 2,
141
+ reducedPlayers: 2,
142
+ ...PARIS_REDUCED,
143
+ })).toBe(0);
144
+ expect((0, reduced_price_1.getGroupPriceWithReduced)({
145
+ price: PARIS,
146
+ players: 2,
147
+ reducedPlayers: 2,
148
+ ...PARIS_REDUCED,
149
+ })).toBe(9800);
150
+ });
137
151
  it('мусор в минимуме игнорируется', () => {
138
152
  expect((0, reduced_price_1.applyMinGameAmount)(5000, { minGameAmount: null })).toBe(5000);
139
153
  expect((0, reduced_price_1.applyMinGameAmount)(5000, { minGameAmount: -100 })).toBe(5000);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@escapenavigator/utils",
3
- "version": "2.0.48",
3
+ "version": "2.0.49",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -14,7 +14,7 @@
14
14
  "test": "jest"
15
15
  },
16
16
  "dependencies": {
17
- "@escapenavigator/types": "^2.0.46",
17
+ "@escapenavigator/types": "^2.0.47",
18
18
  "axios": "^0.21.4",
19
19
  "class-transformer": "^0.5.1",
20
20
  "class-validator": "^0.13.2",
@@ -29,5 +29,5 @@
29
29
  "ts-jest": "^29.1.1",
30
30
  "typescript": "^5.6"
31
31
  },
32
- "gitHead": "af1ce55d865cc7be91336093f79c50ab2ec88f34"
32
+ "gitHead": "9eaab88a1509930c7715945ce519eaeba879f550"
33
33
  }