@escapenavigator/types 2.0.30 → 2.0.31

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.
Files changed (34) hide show
  1. package/dist/certificate-sale/create-certificatesale.dto.d.ts +4 -4
  2. package/dist/certificate-sale/create-certificatesale.dto.js +4 -4
  3. package/dist/google-calendar/initial-google-calendar.ro.d.ts +4 -0
  4. package/dist/google-calendar/initial-google-calendar.ro.js +8 -0
  5. package/dist/openapi/profiles/openapi-profile-booking-list-item.ro.d.ts +2 -0
  6. package/dist/openapi/profiles/openapi-profile-booking-list-item.ro.js +16 -0
  7. package/dist/order/order.ro.d.ts +7 -0
  8. package/dist/order/order.ro.js +8 -0
  9. package/dist/role/create-role.dto.d.ts +1 -0
  10. package/dist/role/create-role.dto.js +6 -0
  11. package/dist/role/role.ro.d.ts +1 -0
  12. package/dist/role/role.ro.js +4 -0
  13. package/dist/slot/enum/slot-staff-policy.enum.d.ts +13 -0
  14. package/dist/slot/enum/slot-staff-policy.enum.js +17 -0
  15. package/dist/slot/set-slot-resource-override.dto.d.ts +7 -0
  16. package/dist/slot/set-slot-resource-override.dto.js +24 -0
  17. package/dist/slot/slot.ro.d.ts +11 -0
  18. package/dist/slot-rule/create-rule.dto.d.ts +2 -0
  19. package/dist/slot-rule/create-rule.dto.js +8 -0
  20. package/dist/slot-rule/defailt-rule.d.ts +2 -0
  21. package/dist/slot-rule/defailt-rule.js +2 -0
  22. package/dist/slot-rule/rule.ro.d.ts +2 -0
  23. package/dist/slot-rule/rule.ro.js +5 -0
  24. package/dist/statistics/certificates.d.ts +9 -5
  25. package/dist/tsconfig.build.tsbuildinfo +1 -1
  26. package/dist/upselling/create-upselling.dto.d.ts +3 -0
  27. package/dist/upselling/create-upselling.dto.js +8 -0
  28. package/dist/upselling/enum/upselling-icon.enum.d.ts +23 -0
  29. package/dist/upselling/enum/upselling-icon.enum.js +27 -0
  30. package/dist/upselling/upselling.ro.d.ts +2 -0
  31. package/dist/upselling/upselling.ro.js +5 -0
  32. package/dist/user/task/user-task.ro.d.ts +1 -0
  33. package/dist/user/task/user-task.ro.js +4 -0
  34. package/package.json +2 -2
@@ -2,10 +2,10 @@ import { CertificatesaleDeliveryTypeEnum } from './enum/certificatesales-deliver
2
2
  /**
3
3
  * Payload для ручного оформления продажи сертификата сотрудником из app.
4
4
  * После миграции на v2-магазин продажа создаётся из `designId` + либо
5
- * `nominalId` (каталожный номинал), либо `customNominal` (произвольная сумма
6
- * по `settings.allowFreeNominal`). В отличие от виджета покупатель — это
7
- * существующий клиент (`clientId`), а `cashboxId` позволяет сразу отметить
8
- * сертификат оплаченным через офлайн-кассу.
5
+ * `nominalId` (каталожный номинал), либо `customNominal` (произвольная сумма;
6
+ * в CRM доступна всегда, без `settings.allowFreeNominal`). В отличие от
7
+ * виджета покупатель — это существующий клиент (`clientId`), а `cashboxId`
8
+ * позволяет сразу отметить сертификат оплаченным через офлайн-кассу.
9
9
  */
10
10
  export declare class CreateCertificatesaleDto {
11
11
  clientId: number;
@@ -17,10 +17,10 @@ const certificatesales_delivery_type_enum_1 = require("./enum/certificatesales-d
17
17
  /**
18
18
  * Payload для ручного оформления продажи сертификата сотрудником из app.
19
19
  * После миграции на v2-магазин продажа создаётся из `designId` + либо
20
- * `nominalId` (каталожный номинал), либо `customNominal` (произвольная сумма
21
- * по `settings.allowFreeNominal`). В отличие от виджета покупатель — это
22
- * существующий клиент (`clientId`), а `cashboxId` позволяет сразу отметить
23
- * сертификат оплаченным через офлайн-кассу.
20
+ * `nominalId` (каталожный номинал), либо `customNominal` (произвольная сумма;
21
+ * в CRM доступна всегда, без `settings.allowFreeNominal`). В отличие от
22
+ * виджета покупатель — это существующий клиент (`clientId`), а `cashboxId`
23
+ * позволяет сразу отметить сертификат оплаченным через офлайн-кассу.
24
24
  */
25
25
  class CreateCertificatesaleDto {
26
26
  }
@@ -2,4 +2,8 @@ export declare class InitialGoogleCalendarRO {
2
2
  calendarId: string;
3
3
  title: string;
4
4
  token: string;
5
+ /** Уже есть живая интеграция с этим calendarId — повторно создавать нельзя. */
6
+ alreadyConnected: boolean;
7
+ /** Есть запись с disconnectedAt — это путь «Переподключить». */
8
+ canReconnect: boolean;
5
9
  }
@@ -26,3 +26,11 @@ __decorate([
26
26
  (0, class_transformer_1.Expose)(),
27
27
  __metadata("design:type", String)
28
28
  ], InitialGoogleCalendarRO.prototype, "token", void 0);
29
+ __decorate([
30
+ (0, class_transformer_1.Expose)(),
31
+ __metadata("design:type", Boolean)
32
+ ], InitialGoogleCalendarRO.prototype, "alreadyConnected", void 0);
33
+ __decorate([
34
+ (0, class_transformer_1.Expose)(),
35
+ __metadata("design:type", Boolean)
36
+ ], InitialGoogleCalendarRO.prototype, "canReconnect", void 0);
@@ -1,3 +1,4 @@
1
+ import { Utm } from '../../order/order.ro';
1
2
  import { ProfileCurrencyEnum } from '../../profile/enum/profile-currency';
2
3
  import { SourceEnum } from '../../shared/source.enum';
3
4
  export declare class OpenapiProfileBookingQuestroomRO {
@@ -23,6 +24,7 @@ export declare class OpenapiProfileBookingListItemRO {
23
24
  toPay: number;
24
25
  currency: ProfileCurrencyEnum;
25
26
  source: SourceEnum;
27
+ utm: Utm | null;
26
28
  confirmed: boolean;
27
29
  createdAt: Date;
28
30
  client: OpenapiProfileBookingClientRO | null;
@@ -14,6 +14,7 @@ exports.OpenapiProfileBookingListItemRO = exports.OpenapiProfileBookingClientRO
14
14
  /* eslint-disable @typescript-eslint/no-unused-vars */
15
15
  const swagger_1 = require("@nestjs/swagger");
16
16
  const class_transformer_1 = require("class-transformer");
17
+ const order_ro_1 = require("../../order/order.ro");
17
18
  const profile_currency_1 = require("../../profile/enum/profile-currency");
18
19
  const source_enum_1 = require("../../shared/source.enum");
19
20
  class OpenapiProfileBookingQuestroomRO {
@@ -144,6 +145,21 @@ __decorate([
144
145
  }),
145
146
  __metadata("design:type", String)
146
147
  ], OpenapiProfileBookingListItemRO.prototype, "source", void 0);
148
+ __decorate([
149
+ (0, class_transformer_1.Expose)(),
150
+ (0, class_transformer_1.Type)(() => order_ro_1.Utm),
151
+ (0, swagger_1.ApiProperty)({
152
+ type: () => order_ro_1.Utm,
153
+ nullable: true,
154
+ description: 'UTM attribution captured at booking time (utm_source / utm_medium / utm_campaign / …). Null when none were set.',
155
+ example: {
156
+ utmSource: 'google',
157
+ utmMedium: 'cpc',
158
+ utmCampaign: 'spring_sale',
159
+ },
160
+ }),
161
+ __metadata("design:type", order_ro_1.Utm)
162
+ ], OpenapiProfileBookingListItemRO.prototype, "utm", void 0);
147
163
  __decorate([
148
164
  (0, class_transformer_1.Expose)(),
149
165
  (0, swagger_1.ApiProperty)({ example: true, description: 'Whether the booking is confirmed.' }),
@@ -95,6 +95,8 @@ declare class Upsellings extends RO {
95
95
  userId: number;
96
96
  count: number;
97
97
  nonRefundable: boolean;
98
+ /** Снимок иконки каталога на момент добавления в заказ. */
99
+ icon?: string | null;
98
100
  }
99
101
  declare class Participant {
100
102
  id: number;
@@ -211,6 +213,11 @@ export declare class OrderRO extends RO {
211
213
  certificateTotal: number;
212
214
  /** Сумма допуслуг (Σ amount × count). Денорм для бейджа на слоте. */
213
215
  upsellingsTotal: number;
216
+ /**
217
+ * Уникальные иконки допуслуг (снимки OrderUpselling.icon).
218
+ * Денорм для бейджей на слоте без JOIN к order-upsellings.
219
+ */
220
+ upsellingIcons: string[];
214
221
  /** Проблема доставки письма клиенту (красный имейл-бейдж на слоте). */
215
222
  emailTrouble: boolean;
216
223
  refundedAmount: number;
@@ -250,6 +250,10 @@ __decorate([
250
250
  (0, class_transformer_1.Expose)(),
251
251
  __metadata("design:type", Boolean)
252
252
  ], Upsellings.prototype, "nonRefundable", void 0);
253
+ __decorate([
254
+ (0, class_transformer_1.Expose)(),
255
+ __metadata("design:type", String)
256
+ ], Upsellings.prototype, "icon", void 0);
253
257
  class Participant {
254
258
  }
255
259
  __decorate([
@@ -506,6 +510,10 @@ __decorate([
506
510
  (0, class_transformer_1.Expose)(),
507
511
  __metadata("design:type", Number)
508
512
  ], OrderRO.prototype, "upsellingsTotal", void 0);
513
+ __decorate([
514
+ (0, class_transformer_1.Expose)(),
515
+ __metadata("design:type", Array)
516
+ ], OrderRO.prototype, "upsellingIcons", void 0);
509
517
  __decorate([
510
518
  (0, class_transformer_1.Expose)(),
511
519
  __metadata("design:type", Boolean)
@@ -18,6 +18,7 @@ export declare class CreateRoleDto {
18
18
  canCreateBreaks: boolean;
19
19
  canEditOwnWorkedHours: boolean;
20
20
  canDeleteFines: boolean;
21
+ canDeleteComments: boolean;
21
22
  canAddRefunds: boolean;
22
23
  canEditModerators: boolean;
23
24
  canEditSchedule: boolean;
@@ -129,6 +129,12 @@ __decorate([
129
129
  (0, class_transformer_1.Expose)(),
130
130
  __metadata("design:type", Boolean)
131
131
  ], CreateRoleDto.prototype, "canDeleteFines", void 0);
132
+ __decorate([
133
+ (0, class_validator_1.IsBoolean)(),
134
+ (0, class_transformer_1.Transform)(({ value }) => (value !== undefined ? value : false)),
135
+ (0, class_transformer_1.Expose)(),
136
+ __metadata("design:type", Boolean)
137
+ ], CreateRoleDto.prototype, "canDeleteComments", void 0);
132
138
  __decorate([
133
139
  (0, class_validator_1.IsBoolean)(),
134
140
  (0, class_transformer_1.Transform)(({ value }) => (value !== undefined ? value : false)),
@@ -17,6 +17,7 @@ export declare class RoleRO extends RoleLightRO {
17
17
  canCreateBreaks: boolean;
18
18
  canEditOwnWorkedHours: boolean;
19
19
  canDeleteFines: boolean;
20
+ canDeleteComments: boolean;
20
21
  canAddRefunds: boolean;
21
22
  canEditModerators: boolean;
22
23
  canEditSchedule: boolean;
@@ -83,6 +83,10 @@ __decorate([
83
83
  (0, class_transformer_1.Expose)(),
84
84
  __metadata("design:type", Boolean)
85
85
  ], RoleRO.prototype, "canDeleteFines", void 0);
86
+ __decorate([
87
+ (0, class_transformer_1.Expose)(),
88
+ __metadata("design:type", Boolean)
89
+ ], RoleRO.prototype, "canDeleteComments", void 0);
86
90
  __decorate([
87
91
  (0, class_transformer_1.Expose)(),
88
92
  __metadata("design:type", Boolean)
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Что делать со слотом, если ни одна смена сотрудника на локации его не
3
+ * покрывает. В отличие от окон `minMinutesForBooking`/`blockingMinutes`
4
+ * действует на всём горизонте календаря, а не только перед началом игры.
5
+ */
6
+ export declare enum SlotStaffPolicyEnum {
7
+ /** Смены не влияют на доступность слота. */
8
+ OFF = "off",
9
+ /** Без смены слот доступен только по телефону. */
10
+ PHONE = "phone",
11
+ /** Без смены онлайн-бронь закрыта. */
12
+ CLOSED = "closed"
13
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SlotStaffPolicyEnum = void 0;
4
+ /**
5
+ * Что делать со слотом, если ни одна смена сотрудника на локации его не
6
+ * покрывает. В отличие от окон `minMinutesForBooking`/`blockingMinutes`
7
+ * действует на всём горизонте календаря, а не только перед началом игры.
8
+ */
9
+ var SlotStaffPolicyEnum;
10
+ (function (SlotStaffPolicyEnum) {
11
+ /** Смены не влияют на доступность слота. */
12
+ SlotStaffPolicyEnum["OFF"] = "off";
13
+ /** Без смены слот доступен только по телефону. */
14
+ SlotStaffPolicyEnum["PHONE"] = "phone";
15
+ /** Без смены онлайн-бронь закрыта. */
16
+ SlotStaffPolicyEnum["CLOSED"] = "closed";
17
+ })(SlotStaffPolicyEnum || (exports.SlotStaffPolicyEnum = SlotStaffPolicyEnum = {}));
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Ручное открытие слота вопреки нехватке общего ресурса (статус
3
+ * `no-resources`) и возврат обычной блокировки.
4
+ */
5
+ export declare class SetSlotResourceOverrideDto {
6
+ enabled: boolean;
7
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SetSlotResourceOverrideDto = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ /**
15
+ * Ручное открытие слота вопреки нехватке общего ресурса (статус
16
+ * `no-resources`) и возврат обычной блокировки.
17
+ */
18
+ class SetSlotResourceOverrideDto {
19
+ }
20
+ exports.SetSlotResourceOverrideDto = SetSlotResourceOverrideDto;
21
+ __decorate([
22
+ (0, class_validator_1.IsBoolean)(),
23
+ __metadata("design:type", Boolean)
24
+ ], SetSlotResourceOverrideDto.prototype, "enabled", void 0);
@@ -28,6 +28,12 @@ export type SlotRO = {
28
28
  discount?: number;
29
29
  onlyPhone?: boolean;
30
30
  forceOnlineBooking?: boolean;
31
+ /**
32
+ * Слот открыт администратором вопреки нехватке общего ресурса: проверка
33
+ * `no-resources` для него отключена. Календарь показывает такой слот как
34
+ * свободный с маркером.
35
+ */
36
+ ignoreResourceLimit?: boolean;
31
37
  breakReason?: string | null;
32
38
  availableTeams?: number;
33
39
  numSeatsAvailable?: number;
@@ -54,6 +60,11 @@ export type SlotRO = {
54
60
  promocodeTotal?: number;
55
61
  certificateTotal?: number;
56
62
  upsellingsTotal?: number;
63
+ /**
64
+ * Уникальные иконки допуслуг заказа (денорм `orders.upsellingIcons`)
65
+ * для бейджей на слоте — без JOIN к order-upsellings.
66
+ */
67
+ upsellingIcons?: string[];
57
68
  /** Проблема доставки письма клиенту (красный имейл-бейдж). */
58
69
  emailTrouble?: boolean;
59
70
  /** No-show: слот сохранён, игра не состоялась. */
@@ -1,5 +1,6 @@
1
1
  import { QuestroomCancelationTypeEnum } from '../questroom/enum/questroom-cancelation-type.enum';
2
2
  import { PrepaymentTypeEnum } from '../slot/enum/prepayment-type.enum';
3
+ import { SlotStaffPolicyEnum } from '../slot/enum/slot-staff-policy.enum';
3
4
  export declare class CreateRuleDto {
4
5
  ruleId?: number;
5
6
  title: string;
@@ -14,6 +15,7 @@ export declare class CreateRuleDto {
14
15
  blockingHours: number;
15
16
  blockingMinutes: number;
16
17
  openSlotWhenUserInCalendar: boolean;
18
+ noStaffPolicy: SlotStaffPolicyEnum;
17
19
  clientCanCancel: boolean;
18
20
  prepayForTourists: boolean;
19
21
  minHoursForFullFine: number;
@@ -15,6 +15,7 @@ const class_validator_1 = require("class-validator");
15
15
  const questroom_cancelation_type_enum_1 = require("../questroom/enum/questroom-cancelation-type.enum");
16
16
  const is_not_blank_1 = require("../shared/is-not-blank");
17
17
  const prepayment_type_enum_1 = require("../slot/enum/prepayment-type.enum");
18
+ const slot_staff_policy_enum_1 = require("../slot/enum/slot-staff-policy.enum");
18
19
  class CreateRuleDto {
19
20
  }
20
21
  exports.CreateRuleDto = CreateRuleDto;
@@ -122,6 +123,13 @@ __decorate([
122
123
  (0, class_transformer_1.Expose)(),
123
124
  __metadata("design:type", Boolean)
124
125
  ], CreateRuleDto.prototype, "openSlotWhenUserInCalendar", void 0);
126
+ __decorate([
127
+ (0, class_validator_1.ValidateIf)((o) => !o.ruleId),
128
+ (0, class_transformer_1.Transform)(({ value }) => value || slot_staff_policy_enum_1.SlotStaffPolicyEnum.OFF),
129
+ (0, class_validator_1.IsEnum)(slot_staff_policy_enum_1.SlotStaffPolicyEnum),
130
+ (0, class_transformer_1.Expose)(),
131
+ __metadata("design:type", String)
132
+ ], CreateRuleDto.prototype, "noStaffPolicy", void 0);
125
133
  __decorate([
126
134
  (0, class_transformer_1.Transform)(({ value }) => value !== null && value !== void 0 ? value : true),
127
135
  (0, class_validator_1.IsBoolean)(),
@@ -1,5 +1,6 @@
1
1
  import { QuestroomCancelationTypeEnum } from '../questroom/enum/questroom-cancelation-type.enum';
2
2
  import { PrepaymentTypeEnum } from '../slot/enum/prepayment-type.enum';
3
+ import { SlotStaffPolicyEnum } from '../slot/enum/slot-staff-policy.enum';
3
4
  export declare const defaultRule: {
4
5
  title: string;
5
6
  prepayment: number;
@@ -12,6 +13,7 @@ export declare const defaultRule: {
12
13
  blockingHours: number;
13
14
  blockingMinutes: number;
14
15
  openSlotWhenUserInCalendar: boolean;
16
+ noStaffPolicy: SlotStaffPolicyEnum;
15
17
  clientCanCancel: boolean;
16
18
  prepayForTourists: boolean;
17
19
  cancelationAmount: number;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.defaultRule = void 0;
4
4
  const questroom_cancelation_type_enum_1 = require("../questroom/enum/questroom-cancelation-type.enum");
5
5
  const prepayment_type_enum_1 = require("../slot/enum/prepayment-type.enum");
6
+ const slot_staff_policy_enum_1 = require("../slot/enum/slot-staff-policy.enum");
6
7
  exports.defaultRule = {
7
8
  title: 'System rule',
8
9
  prepayment: 0,
@@ -15,6 +16,7 @@ exports.defaultRule = {
15
16
  blockingHours: 2,
16
17
  blockingMinutes: 2 * 60,
17
18
  openSlotWhenUserInCalendar: true,
19
+ noStaffPolicy: slot_staff_policy_enum_1.SlotStaffPolicyEnum.OFF,
18
20
  clientCanCancel: true,
19
21
  prepayForTourists: false,
20
22
  cancelationAmount: 0,
@@ -1,5 +1,6 @@
1
1
  import { QuestroomCancelationTypeEnum } from '../questroom/enum/questroom-cancelation-type.enum';
2
2
  import { PrepaymentTypeEnum } from '../slot/enum/prepayment-type.enum';
3
+ import { SlotStaffPolicyEnum } from '../slot/enum/slot-staff-policy.enum';
3
4
  export declare class RuleRO {
4
5
  id: number;
5
6
  profileId: number;
@@ -16,6 +17,7 @@ export declare class RuleRO {
16
17
  blockingHours: number;
17
18
  blockingMinutes: number;
18
19
  openSlotWhenUserInCalendar: boolean;
20
+ noStaffPolicy: SlotStaffPolicyEnum;
19
21
  clientCanCancel: boolean;
20
22
  prepayForTourists: boolean;
21
23
  minHoursForFullFine: number;
@@ -13,6 +13,7 @@ exports.RuleRO = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const questroom_cancelation_type_enum_1 = require("../questroom/enum/questroom-cancelation-type.enum");
15
15
  const prepayment_type_enum_1 = require("../slot/enum/prepayment-type.enum");
16
+ const slot_staff_policy_enum_1 = require("../slot/enum/slot-staff-policy.enum");
16
17
  class RuleRO {
17
18
  }
18
19
  exports.RuleRO = RuleRO;
@@ -76,6 +77,10 @@ __decorate([
76
77
  (0, class_transformer_1.Expose)(),
77
78
  __metadata("design:type", Boolean)
78
79
  ], RuleRO.prototype, "openSlotWhenUserInCalendar", void 0);
80
+ __decorate([
81
+ (0, class_transformer_1.Expose)(),
82
+ __metadata("design:type", String)
83
+ ], RuleRO.prototype, "noStaffPolicy", void 0);
79
84
  __decorate([
80
85
  (0, class_transformer_1.Expose)(),
81
86
  __metadata("design:type", Boolean)
@@ -3,15 +3,17 @@
3
3
  *
4
4
  * Все денежные суммы — в минимальных единицах валюты (копейки/центы).
5
5
  *
6
- * Когорта периода = `code != NOT_GENERATED_CODE` + `annul = false` +
7
- * `paidAt ∈ [start, end)`. ВСЕ агрегаты overview (включая остаток
8
- * номиналов, количество полностью использованных и аннулированных)
9
- * считаются по одной и той же когорте — это снимает прежний разнобой,
10
- * когда `outstandingBalance` суммировался по всей истории профиля.
6
+ * Когорта периода = `code != NOT_GENERATED_CODE` + `paidAt [start, end)`.
7
+ * ВСЕ агрегаты overview (включая остаток номиналов, количество полностью
8
+ * использованных и аннулированных) считаются по одной и той же когорте — это
9
+ * снимает прежний разнобой, когда `outstandingBalance` суммировался по всей
10
+ * истории профиля. Аннулированные из когорты не выбрасываются: их деньги
11
+ * остаются доходом, пока по ним не проведён возврат.
11
12
  *
12
13
  * Семантика финансовых полей:
13
14
  * - gross — стоимость по прайсу (SUM(total)). Не выручка.
14
15
  * - cash — нетто-выручка: SUM(cashReceived), возвраты уже учтены в транзакциях со знаком.
16
+ * - refunded — сколько вернули клиентам (SUM(refundedAmount)), уже вычтено из cash.
15
17
  * - discount — сумма ручных скидок (SUM(discountTotal)).
16
18
  * - promocode — сумма промокодов (SUM(promocodeTotal)).
17
19
  * - nominalSold — суммарный номинал когорты (SUM(nominal)).
@@ -31,6 +33,8 @@ export type CertificatesOverview = {
31
33
  gross: number;
32
34
  /** Нетто-выручка: SUM(cashReceived), возвраты уже внутри. */
33
35
  cash: number;
36
+ /** Возвращено клиентам: SUM(refundedAmount). Уже вычтено из `cash`. */
37
+ refunded: number;
34
38
  discount: number;
35
39
  promocode: number;
36
40
  /** Средний чек по cash: cash / soldCount, 0 если нет продаж. */