@escapenavigator/utils 1.4.82

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 (46) hide show
  1. package/README.md +1 -0
  2. package/dist/convert-minutes-to-hhmm/index.d.ts +1 -0
  3. package/dist/convert-minutes-to-hhmm/index.js +11 -0
  4. package/dist/convert-to-options.d.ts +13 -0
  5. package/dist/convert-to-options.js +15 -0
  6. package/dist/enum-to-options.d.ts +5 -0
  7. package/dist/enum-to-options.js +8 -0
  8. package/dist/get-cancelation-fee-amount/index.d.ts +6 -0
  9. package/dist/get-cancelation-fee-amount/index.js +17 -0
  10. package/dist/get-cancelation-fee-amount/index.test.d.ts +1 -0
  11. package/dist/get-cancelation-fee-amount/index.test.js +38 -0
  12. package/dist/get-documents-links.d.ts +8 -0
  13. package/dist/get-documents-links.js +14 -0
  14. package/dist/get-handled-error-message.d.ts +1 -0
  15. package/dist/get-handled-error-message.js +5 -0
  16. package/dist/get-order-cancelation-date/index.d.ts +12 -0
  17. package/dist/get-order-cancelation-date/index.js +19 -0
  18. package/dist/get-order-cancelation-date/index.test.d.ts +1 -0
  19. package/dist/get-order-cancelation-date/index.test.js +33 -0
  20. package/dist/get-order-cancelation-state/index.d.ts +40 -0
  21. package/dist/get-order-cancelation-state/index.js +94 -0
  22. package/dist/get-order-cancelation-state/index.test.d.ts +1 -0
  23. package/dist/get-order-cancelation-state/index.test.js +193 -0
  24. package/dist/get-service-error.d.ts +25 -0
  25. package/dist/get-service-error.js +66 -0
  26. package/dist/get-slot-cancelation-date/index.d.ts +17 -0
  27. package/dist/get-slot-cancelation-date/index.js +27 -0
  28. package/dist/get-slot-cancelation-date/index.test.d.ts +1 -0
  29. package/dist/get-slot-cancelation-date/index.test.js +84 -0
  30. package/dist/index.d.ts +13 -0
  31. package/dist/index.js +29 -0
  32. package/dist/is-axios-error.d.ts +6 -0
  33. package/dist/is-axios-error.js +11 -0
  34. package/dist/is-network-error.d.ts +5 -0
  35. package/dist/is-network-error.js +18 -0
  36. package/dist/redirect.d.ts +1 -0
  37. package/dist/redirect.js +7 -0
  38. package/dist/serialize-record.d.ts +2 -0
  39. package/dist/serialize-record.js +6 -0
  40. package/dist/serialize-slot.d.ts +11 -0
  41. package/dist/serialize-slot.js +63 -0
  42. package/dist/tz-date.d.ts +17 -0
  43. package/dist/tz-date.js +19 -0
  44. package/dist/validate-by-dto.d.ts +1 -0
  45. package/dist/validate-by-dto.js +17 -0
  46. package/package.json +59 -0
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # en-utils
@@ -0,0 +1 @@
1
+ export declare const convertMinutesToHHMM: (minutes: number) => string;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertMinutesToHHMM = void 0;
4
+ const convertMinutesToHHMM = (minutes) => {
5
+ const h = Math.floor(minutes / 60);
6
+ const m = minutes % 60;
7
+ const hh = h < 10 ? `0${h}` : h;
8
+ const mm = m < 10 ? `0${m}` : m;
9
+ return `${hh}:${mm}`;
10
+ };
11
+ exports.convertMinutesToHHMM = convertMinutesToHHMM;
@@ -0,0 +1,13 @@
1
+ export declare type OptionsType<T> = Array<{
2
+ key: T;
3
+ content: any;
4
+ }>;
5
+ declare type ConvertToOptions = <T extends {
6
+ id: string | number;
7
+ [field: string]: any;
8
+ }>(data: T[]) => Array<{
9
+ key: T['id'];
10
+ content: any;
11
+ }>;
12
+ export declare const convertToOptions: ConvertToOptions;
13
+ export {};
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertToOptions = void 0;
4
+ const getContentByItemField = (item) => {
5
+ if (item.surname)
6
+ return `${item.name} ${item.surname}`;
7
+ if (item.name)
8
+ return item.name;
9
+ return item.title;
10
+ };
11
+ const convertToOptions = (data, field) => data.map((item) => ({
12
+ key: item.id,
13
+ content: field ? item[field] : getContentByItemField(item),
14
+ }));
15
+ exports.convertToOptions = convertToOptions;
@@ -0,0 +1,5 @@
1
+ import { TFunction } from 'i18next';
2
+ export declare const enumToOptions: (options: Enumerator, t?: TFunction, modelName?: string) => {
3
+ key: string;
4
+ content: string;
5
+ }[];
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.enumToOptions = void 0;
4
+ const enumToOptions = (options, t, modelName) => Object.values(options).map((option) => ({
5
+ key: option,
6
+ content: t ? t(`options.${modelName}.${option}`) : option.toString().toUpperCase(),
7
+ }));
8
+ exports.enumToOptions = enumToOptions;
@@ -0,0 +1,6 @@
1
+ import { QuestroomCancelationTypeEnum } from '@escapenavigator/types/dist/questroom/enum/questroom-cancelation-type.enum';
2
+ export declare const getCancelationFeeAmount: ({ cancelationRule, total, minimalPrice, }: {
3
+ cancelationRule: QuestroomCancelationTypeEnum;
4
+ total: number;
5
+ minimalPrice: number;
6
+ }) => number;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCancelationFeeAmount = void 0;
4
+ const questroom_cancelation_type_enum_1 = require("@escapenavigator/types/dist/questroom/enum/questroom-cancelation-type.enum");
5
+ const getCancelationFeeAmount = ({ cancelationRule, total, minimalPrice, }) => {
6
+ switch (cancelationRule) {
7
+ case questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.MIN_PRICE:
8
+ return minimalPrice;
9
+ case questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.HALF_PRICE:
10
+ return Math.floor(total / 2);
11
+ case questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE:
12
+ return total;
13
+ default:
14
+ return 0;
15
+ }
16
+ };
17
+ exports.getCancelationFeeAmount = getCancelationFeeAmount;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const questroom_cancelation_type_enum_1 = require("@escapenavigator/types/dist/questroom/enum/questroom-cancelation-type.enum");
4
+ const _1 = require(".");
5
+ describe('getCancelationFeeAmount function', () => {
6
+ test('should return correct FULL_PRICE', () => {
7
+ const result = (0, _1.getCancelationFeeAmount)({
8
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
9
+ total: 100,
10
+ minimalPrice: 20,
11
+ });
12
+ expect(result).toBe(100);
13
+ });
14
+ test('should return correct QuestroomCancelationTypeEnum HALF_PRICE', () => {
15
+ const result = (0, _1.getCancelationFeeAmount)({
16
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.HALF_PRICE,
17
+ total: 100,
18
+ minimalPrice: 20,
19
+ });
20
+ expect(result).toBe(50);
21
+ });
22
+ test('should return correct QuestroomCancelationTypeEnum MIN_PRICE', () => {
23
+ const result = (0, _1.getCancelationFeeAmount)({
24
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.MIN_PRICE,
25
+ total: 100,
26
+ minimalPrice: 20,
27
+ });
28
+ expect(result).toBe(20);
29
+ });
30
+ test('should return correct QuestroomCancelationTypeEnum NO', () => {
31
+ const result = (0, _1.getCancelationFeeAmount)({
32
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.NO,
33
+ total: 100,
34
+ minimalPrice: 20,
35
+ });
36
+ expect(result).toBe(0);
37
+ });
38
+ });
@@ -0,0 +1,8 @@
1
+ import { CountriesEnum } from '@escapenavigator/types/dist/shared/enum/countries.enum';
2
+ export declare function getLinks(lang: CountriesEnum, domain: string): {
3
+ COOKIES: string;
4
+ AGREEMENT: string;
5
+ IMPRINT: string;
6
+ PRIVACY_POLICY: string;
7
+ REGISTRATION_NEW_PROFILE: string;
8
+ };
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLinks = void 0;
4
+ const agb_type_enum_1 = require("@escapenavigator/types/dist/agb/agb-type.enum");
5
+ function getLinks(lang, domain) {
6
+ return {
7
+ COOKIES: `${domain}?type=${agb_type_enum_1.AgbTypeEnum.COOKIES}&country=${lang}`,
8
+ AGREEMENT: `${domain}?type=${agb_type_enum_1.AgbTypeEnum.AGREEMENT}&country=${lang}`,
9
+ IMPRINT: `${domain}?type=${agb_type_enum_1.AgbTypeEnum.IMPRINT}&country=${lang}`,
10
+ PRIVACY_POLICY: `${domain}?type=${agb_type_enum_1.AgbTypeEnum.PRIVACY_POLICY}&country=${lang}`,
11
+ REGISTRATION_NEW_PROFILE: `${domain}?type=${agb_type_enum_1.AgbTypeEnum.REGISTRATION_NEW_PROFILE}&country=${lang}`,
12
+ };
13
+ }
14
+ exports.getLinks = getLinks;
@@ -0,0 +1 @@
1
+ export declare const getHandledErrorMessage: (error: any) => any;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getHandledErrorMessage = void 0;
4
+ const getHandledErrorMessage = (error) => (error.response ? error.response.data.message : error.message);
5
+ exports.getHandledErrorMessage = getHandledErrorMessage;
@@ -0,0 +1,12 @@
1
+ import { QuestroomCancelationTypeEnum } from '@escapenavigator/types/dist/questroom/enum/questroom-cancelation-type.enum';
2
+ declare type Props = {
3
+ utcDate: string;
4
+ minHoursForFreeCanceling: number;
5
+ cancelationRule: QuestroomCancelationTypeEnum;
6
+ timeZone: string;
7
+ };
8
+ export declare function getOrderCancelationDate({ utcDate, minHoursForFreeCanceling, cancelationRule, timeZone, }: Props): {
9
+ orderCancelationDate: Date;
10
+ orderCancelationHumantDate: string;
11
+ };
12
+ export {};
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getOrderCancelationDate = void 0;
7
+ const questroom_cancelation_type_enum_1 = require("@escapenavigator/types/dist/questroom/enum/questroom-cancelation-type.enum");
8
+ const utcToZonedTime_1 = __importDefault(require("date-fns-tz/utcToZonedTime"));
9
+ const addHours_1 = __importDefault(require("date-fns/addHours"));
10
+ const format_1 = __importDefault(require("date-fns/format"));
11
+ function getOrderCancelationDate({ utcDate, minHoursForFreeCanceling, cancelationRule, timeZone, }) {
12
+ const minHours = cancelationRule === questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.NO ? 0 : minHoursForFreeCanceling;
13
+ const date = (0, addHours_1.default)((0, utcToZonedTime_1.default)(utcDate, timeZone), minHours * -1);
14
+ return {
15
+ orderCancelationDate: date,
16
+ orderCancelationHumantDate: (0, format_1.default)(date, 'dd.MM.yyyy, HH:mm'),
17
+ };
18
+ }
19
+ exports.getOrderCancelationDate = getOrderCancelationDate;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const questroom_cancelation_type_enum_1 = require("@escapenavigator/types/dist/questroom/enum/questroom-cancelation-type.enum");
4
+ const _1 = require(".");
5
+ describe('getOrderCancelationDate function', () => {
6
+ test('should return correct winter time', () => {
7
+ const result = (0, _1.getOrderCancelationDate)({
8
+ utcDate: '2023-01-03T08:00:00.000Z',
9
+ minHoursForFreeCanceling: 48,
10
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
11
+ timeZone: 'Europe/Berlin',
12
+ });
13
+ expect(result.orderCancelationHumantDate).toBe('01.01.2023, 09:00');
14
+ });
15
+ test('should return correct summer time', () => {
16
+ const result = (0, _1.getOrderCancelationDate)({
17
+ utcDate: '2023-06-03T08:00:00.000Z',
18
+ minHoursForFreeCanceling: 48,
19
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
20
+ timeZone: 'Europe/Berlin',
21
+ });
22
+ expect(result.orderCancelationHumantDate).toBe('01.06.2023, 10:00');
23
+ });
24
+ test('should return correct other timeZone time', () => {
25
+ const result = (0, _1.getOrderCancelationDate)({
26
+ utcDate: '2023-06-03T08:00:00.000Z',
27
+ minHoursForFreeCanceling: 48,
28
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
29
+ timeZone: 'Europe/Moscow',
30
+ });
31
+ expect(result.orderCancelationHumantDate).toBe('01.06.2023, 11:00');
32
+ });
33
+ });
@@ -0,0 +1,40 @@
1
+ import { OrderCancelReasonEnum } from '@escapenavigator/types/dist/order/enum/order-cancel-reson.enum';
2
+ import { QuestroomCancelationTypeEnum } from '@escapenavigator/types/dist/questroom/enum/questroom-cancelation-type.enum';
3
+ import { TransactionTypeEnum } from '@escapenavigator/types/dist/transaction/enum/transaction-type.enum';
4
+ declare type Props = {
5
+ date: string;
6
+ minHoursForFreeCanceling: number;
7
+ cancelationReason: OrderCancelReasonEnum;
8
+ returnCertificates: boolean;
9
+ cancelationRule: QuestroomCancelationTypeEnum;
10
+ transactions: Array<{
11
+ type: TransactionTypeEnum;
12
+ amount: number;
13
+ }>;
14
+ certificates: Array<{
15
+ nominal: number;
16
+ }>;
17
+ total: number;
18
+ payed: number;
19
+ minimalPrice: number;
20
+ };
21
+ export declare enum FineDescriptions {
22
+ FINE_TON_SETUP = "descriptionFineNotSetup",
23
+ NO_FINE = "descriptionNoFine",
24
+ AUTO_RETURN = "descriptionFineWithAutoReturn",
25
+ HAND_RETURN = "descriptionFineWithReturn",
26
+ FINE_PAID = "descriptionFinePaid",
27
+ WITH_CHARGE = "descriptionFineWithCharge"
28
+ }
29
+ export declare const isCancelationAllowed: ({ date, minHoursForFreeCanceling, }: {
30
+ date: string;
31
+ minHoursForFreeCanceling: number;
32
+ }) => boolean;
33
+ export declare function getOrderCancelationState({ cancelationReason, cancelationRule, transactions, date, returnCertificates, certificates, minHoursForFreeCanceling, total, payed, minimalPrice, }: Props): {
34
+ fineAmount: number;
35
+ returnAmount: number;
36
+ allowedCancelation: boolean;
37
+ type: FineDescriptions;
38
+ chargeAmount: number;
39
+ };
40
+ export {};
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getOrderCancelationState = exports.isCancelationAllowed = exports.FineDescriptions = void 0;
7
+ const order_cancel_reson_enum_1 = require("@escapenavigator/types/dist/order/enum/order-cancel-reson.enum");
8
+ const questroom_cancelation_type_enum_1 = require("@escapenavigator/types/dist/questroom/enum/questroom-cancelation-type.enum");
9
+ const transaction_type_enum_1 = require("@escapenavigator/types/dist/transaction/enum/transaction-type.enum");
10
+ const differenceInHours_1 = __importDefault(require("date-fns/differenceInHours"));
11
+ const get_cancelation_fee_amount_1 = require("../get-cancelation-fee-amount");
12
+ const getReceivedTransactions = (transactions) => transactions.filter((transaction) => transaction.type === transaction_type_enum_1.TransactionTypeEnum.INSIDE || transaction.type === transaction_type_enum_1.TransactionTypeEnum.PROCESSING || transaction.type === transaction_type_enum_1.TransactionTypeEnum.SUCCEEDED);
13
+ var FineDescriptions;
14
+ (function (FineDescriptions) {
15
+ FineDescriptions["FINE_TON_SETUP"] = "descriptionFineNotSetup";
16
+ FineDescriptions["NO_FINE"] = "descriptionNoFine";
17
+ FineDescriptions["AUTO_RETURN"] = "descriptionFineWithAutoReturn";
18
+ FineDescriptions["HAND_RETURN"] = "descriptionFineWithReturn";
19
+ FineDescriptions["FINE_PAID"] = "descriptionFinePaid";
20
+ FineDescriptions["WITH_CHARGE"] = "descriptionFineWithCharge";
21
+ })(FineDescriptions = exports.FineDescriptions || (exports.FineDescriptions = {}));
22
+ const isCancelationAllowed = ({ date, minHoursForFreeCanceling = 0, }) => (0, differenceInHours_1.default)(new Date(date), new Date()) > minHoursForFreeCanceling;
23
+ exports.isCancelationAllowed = isCancelationAllowed;
24
+ function getOrderCancelationState({ cancelationReason, cancelationRule, transactions, date, returnCertificates, certificates, minHoursForFreeCanceling, total, payed, minimalPrice, }) {
25
+ var _a;
26
+ /**
27
+ * В срок ли отменяется игра. Если в срок, то мы отменяем все промокоды и сертификаты, учитываем сумму возврата только с транзакций
28
+ */
29
+ const minHours = cancelationRule === questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.NO ? 0 : minHoursForFreeCanceling;
30
+ const allowedCancelation = cancelationReason === order_cancel_reson_enum_1.OrderCancelReasonEnum.QUESTROOM || (0, exports.isCancelationAllowed)({
31
+ date,
32
+ minHoursForFreeCanceling: minHours,
33
+ });
34
+ const receivedTransactions = getReceivedTransactions(transactions);
35
+ const receivedTransactionsAmount = receivedTransactions.reduce((acc, tr) => acc + tr.amount, 0);
36
+ const autoReturtAvailable = receivedTransactions.length === 1 && ((_a = receivedTransactions[0]) === null || _a === void 0 ? void 0 : _a.type) !== transaction_type_enum_1.TransactionTypeEnum.INSIDE;
37
+ const orderPayment = returnCertificates ? payed - certificates.reduce((acc, c) => acc + c.nominal, 0) : payed;
38
+ const fineAmount = (0, get_cancelation_fee_amount_1.getCancelationFeeAmount)({ cancelationRule, total, minimalPrice });
39
+ const chargeAmount = fineAmount - orderPayment;
40
+ /**
41
+ * Кейсы, если игра отменяется в срок
42
+ */
43
+ if (allowedCancelation || (!allowedCancelation && !fineAmount)) {
44
+ // если нет транзакций
45
+ if (!receivedTransactionsAmount) {
46
+ return {
47
+ fineAmount: 0,
48
+ chargeAmount: 0,
49
+ returnAmount: receivedTransactionsAmount,
50
+ allowedCancelation,
51
+ type: fineAmount ? FineDescriptions.NO_FINE : FineDescriptions.FINE_TON_SETUP,
52
+ };
53
+ }
54
+ // если транзакции есть
55
+ return {
56
+ fineAmount: 0,
57
+ chargeAmount: 0,
58
+ returnAmount: receivedTransactionsAmount,
59
+ allowedCancelation,
60
+ type: autoReturtAvailable ? FineDescriptions.AUTO_RETURN : FineDescriptions.HAND_RETURN,
61
+ };
62
+ }
63
+ /**
64
+ * Если игра отменяется не в срок - сумму оплаты определяем учитывая скидки и промокоды но опционально учитывая сертифкиаты
65
+ */
66
+ if (chargeAmount === 0) {
67
+ return {
68
+ type: FineDescriptions.FINE_PAID,
69
+ returnAmount: 0,
70
+ chargeAmount: 0,
71
+ fineAmount,
72
+ allowedCancelation,
73
+ };
74
+ }
75
+ if (chargeAmount < 0) {
76
+ const returnAmount = chargeAmount * -1;
77
+ const allowAutoReturn = autoReturtAvailable && receivedTransactionsAmount >= returnAmount;
78
+ return {
79
+ type: allowAutoReturn ? FineDescriptions.AUTO_RETURN : FineDescriptions.HAND_RETURN,
80
+ fineAmount,
81
+ chargeAmount: 0,
82
+ returnAmount,
83
+ allowedCancelation,
84
+ };
85
+ }
86
+ return {
87
+ type: FineDescriptions.WITH_CHARGE,
88
+ fineAmount,
89
+ returnAmount: 0,
90
+ chargeAmount,
91
+ allowedCancelation,
92
+ };
93
+ }
94
+ exports.getOrderCancelationState = getOrderCancelationState;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ // Файл gameCancelation.test.js
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const order_cancel_reson_enum_1 = require("@escapenavigator/types/dist/order/enum/order-cancel-reson.enum");
5
+ const questroom_cancelation_type_enum_1 = require("@escapenavigator/types/dist/questroom/enum/questroom-cancelation-type.enum");
6
+ const transaction_type_enum_1 = require("@escapenavigator/types/dist/transaction/enum/transaction-type.enum");
7
+ const date_fns_1 = require("date-fns");
8
+ const _1 = require(".");
9
+ describe('getOrderCancelationState function', () => {
10
+ test('should return "no charge / no return" if cancelationReason is QUESTROOM', () => {
11
+ const result = (0, _1.getOrderCancelationState)({
12
+ cancelationReason: order_cancel_reson_enum_1.OrderCancelReasonEnum.QUESTROOM,
13
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
14
+ transactions: [],
15
+ date: new Date().toISOString(),
16
+ returnCertificates: true,
17
+ certificates: [],
18
+ minHoursForFreeCanceling: 48,
19
+ total: 100,
20
+ payed: 20,
21
+ minimalPrice: 50,
22
+ });
23
+ expect(result).toEqual({
24
+ type: 'descriptionNoFine',
25
+ fineAmount: 0,
26
+ returnAmount: 0,
27
+ chargeAmount: 0,
28
+ allowedCancelation: true,
29
+ });
30
+ });
31
+ test('should return "no charge / no return" if cancelation in time', () => {
32
+ const result = (0, _1.getOrderCancelationState)({
33
+ cancelationReason: order_cancel_reson_enum_1.OrderCancelReasonEnum.CLIENT,
34
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
35
+ transactions: [],
36
+ date: (0, date_fns_1.addHours)(new Date(), 50).toISOString(),
37
+ returnCertificates: true,
38
+ certificates: [],
39
+ minHoursForFreeCanceling: 48,
40
+ total: 100,
41
+ payed: 30,
42
+ minimalPrice: 50,
43
+ });
44
+ expect(result).toEqual({
45
+ type: 'descriptionNoFine',
46
+ fineAmount: 0,
47
+ returnAmount: 0,
48
+ chargeAmount: 0,
49
+ allowedCancelation: true,
50
+ });
51
+ });
52
+ test('should return "no charge / no return" if cancelationType is NO', () => {
53
+ const result = (0, _1.getOrderCancelationState)({
54
+ cancelationReason: order_cancel_reson_enum_1.OrderCancelReasonEnum.CLIENT,
55
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.NO,
56
+ transactions: [],
57
+ date: new Date().toISOString(),
58
+ returnCertificates: true,
59
+ certificates: [],
60
+ minHoursForFreeCanceling: 48,
61
+ total: 100,
62
+ payed: 0,
63
+ minimalPrice: 50,
64
+ });
65
+ expect(result).toEqual({
66
+ type: 'descriptionFineNotSetup',
67
+ fineAmount: 0,
68
+ returnAmount: 0,
69
+ chargeAmount: 0,
70
+ allowedCancelation: false,
71
+ });
72
+ });
73
+ test('should return "no charge / hand return" if alowed cancelation has payments', () => {
74
+ const result = (0, _1.getOrderCancelationState)({
75
+ cancelationReason: order_cancel_reson_enum_1.OrderCancelReasonEnum.CLIENT,
76
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
77
+ transactions: [{
78
+ amount: 100,
79
+ type: transaction_type_enum_1.TransactionTypeEnum.INSIDE,
80
+ }],
81
+ date: (0, date_fns_1.addHours)(new Date(), 50).toISOString(),
82
+ returnCertificates: true,
83
+ certificates: [],
84
+ minHoursForFreeCanceling: 48,
85
+ total: 100,
86
+ payed: 20,
87
+ minimalPrice: 50,
88
+ });
89
+ expect(result).toEqual({
90
+ type: 'descriptionFineWithReturn',
91
+ fineAmount: 0,
92
+ returnAmount: 100,
93
+ chargeAmount: 0,
94
+ allowedCancelation: true,
95
+ });
96
+ });
97
+ test('should return "no charge / hand return" if not alowed cancelation has inside transaction', () => {
98
+ const result = (0, _1.getOrderCancelationState)({
99
+ cancelationReason: order_cancel_reson_enum_1.OrderCancelReasonEnum.CLIENT,
100
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.NO,
101
+ transactions: [{
102
+ amount: 100,
103
+ type: transaction_type_enum_1.TransactionTypeEnum.INSIDE,
104
+ }],
105
+ date: new Date().toISOString(),
106
+ returnCertificates: true,
107
+ certificates: [],
108
+ minHoursForFreeCanceling: 48,
109
+ total: 100,
110
+ payed: 100,
111
+ minimalPrice: 50,
112
+ });
113
+ expect(result).toEqual({
114
+ type: 'descriptionFineWithReturn',
115
+ fineAmount: 0,
116
+ returnAmount: 100,
117
+ chargeAmount: 0,
118
+ allowedCancelation: false,
119
+ });
120
+ });
121
+ test('should return "no charge / no return" if not alowed cancelation payed same price', () => {
122
+ const result = (0, _1.getOrderCancelationState)({
123
+ cancelationReason: order_cancel_reson_enum_1.OrderCancelReasonEnum.CLIENT,
124
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
125
+ transactions: [{
126
+ amount: 100,
127
+ type: transaction_type_enum_1.TransactionTypeEnum.SUCCEEDED,
128
+ }],
129
+ date: new Date().toISOString(),
130
+ returnCertificates: true,
131
+ certificates: [],
132
+ minHoursForFreeCanceling: 48,
133
+ total: 100,
134
+ payed: 100,
135
+ minimalPrice: 50,
136
+ });
137
+ expect(result).toEqual({
138
+ type: 'descriptionFinePaid',
139
+ fineAmount: 100,
140
+ returnAmount: 0,
141
+ chargeAmount: 0,
142
+ allowedCancelation: false,
143
+ });
144
+ });
145
+ test('should return "no charge / auto return" if not alowed cancelation has overpayment', () => {
146
+ const result = (0, _1.getOrderCancelationState)({
147
+ cancelationReason: order_cancel_reson_enum_1.OrderCancelReasonEnum.CLIENT,
148
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.HALF_PRICE,
149
+ transactions: [{
150
+ amount: 100,
151
+ type: transaction_type_enum_1.TransactionTypeEnum.SUCCEEDED,
152
+ }],
153
+ date: new Date().toISOString(),
154
+ returnCertificates: true,
155
+ certificates: [],
156
+ minHoursForFreeCanceling: 48,
157
+ total: 100,
158
+ payed: 100,
159
+ minimalPrice: 50,
160
+ });
161
+ expect(result).toEqual({
162
+ type: 'descriptionFineWithAutoReturn',
163
+ fineAmount: 50,
164
+ returnAmount: 50,
165
+ chargeAmount: 0,
166
+ allowedCancelation: false,
167
+ });
168
+ });
169
+ test('should return "with charge / no return" if not alowed cancelation has overpayment', () => {
170
+ const result = (0, _1.getOrderCancelationState)({
171
+ cancelationReason: order_cancel_reson_enum_1.OrderCancelReasonEnum.CLIENT,
172
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
173
+ transactions: [{
174
+ amount: 50,
175
+ type: transaction_type_enum_1.TransactionTypeEnum.SUCCEEDED,
176
+ }],
177
+ date: new Date().toISOString(),
178
+ returnCertificates: true,
179
+ certificates: [],
180
+ minHoursForFreeCanceling: 48,
181
+ total: 100,
182
+ payed: 50,
183
+ minimalPrice: 50,
184
+ });
185
+ expect(result).toEqual({
186
+ type: 'descriptionFineWithCharge',
187
+ fineAmount: 100,
188
+ returnAmount: 0,
189
+ chargeAmount: 50,
190
+ allowedCancelation: false,
191
+ });
192
+ });
193
+ });
@@ -0,0 +1,25 @@
1
+ import { AxiosError } from 'axios';
2
+ declare type ErrorData = {
3
+ errorId: string;
4
+ application: string;
5
+ errorCode: string;
6
+ message: string;
7
+ originalErrorCode?: string;
8
+ };
9
+ export declare enum ErrorType {
10
+ NETWORK = "NETWORK",
11
+ BUSINESS = "BUSINESS",
12
+ INTERNAL = "INTERNAL"
13
+ }
14
+ export declare type ServiceError = {
15
+ code: string;
16
+ message: string;
17
+ errorType: ErrorType;
18
+ originalError: unknown | AxiosError<ErrorData>;
19
+ };
20
+ /**
21
+ * Возвращает обработанную ошибку с дополнительной информацией.
22
+ * @param error Ошибка от сервиса
23
+ */
24
+ export declare function getServiceError(error: unknown): ServiceError;
25
+ export {};
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getServiceError = exports.ErrorType = void 0;
4
+ const is_axios_error_1 = require("./is-axios-error");
5
+ const is_network_error_1 = require("./is-network-error");
6
+ var ErrorType;
7
+ (function (ErrorType) {
8
+ ErrorType["NETWORK"] = "NETWORK";
9
+ ErrorType["BUSINESS"] = "BUSINESS";
10
+ ErrorType["INTERNAL"] = "INTERNAL";
11
+ })(ErrorType = exports.ErrorType || (exports.ErrorType = {}));
12
+ const ERROR_CODES = {
13
+ [ErrorType.INTERNAL]: 'INTERNAL_ERROR',
14
+ [ErrorType.NETWORK]: 'NETWORK_ERROR',
15
+ };
16
+ const ERROR_MESSAGES = {
17
+ [ErrorType.INTERNAL]: 'Please, try again later',
18
+ [ErrorType.NETWORK]: 'Please, check internet connection and try again later',
19
+ };
20
+ const INTERNAL_SERVICE_ERROR_CODES = [
21
+ 'BAD_REQUEST',
22
+ 'INTERNAL_SERVER_ERROR',
23
+ 'INTERNAL_ERROR',
24
+ 'WS_ERROR',
25
+ 'DEFAULT',
26
+ ];
27
+ /**
28
+ * Возвращает обработанную ошибку с дополнительной информацией.
29
+ * @param error Ошибка от сервиса
30
+ */
31
+ function getServiceError(error) {
32
+ if ((0, is_network_error_1.isNetworkError)(error)) {
33
+ return {
34
+ code: ERROR_CODES[ErrorType.NETWORK],
35
+ message: ERROR_MESSAGES[ErrorType.NETWORK],
36
+ errorType: ErrorType.NETWORK,
37
+ originalError: error,
38
+ };
39
+ }
40
+ if ((0, is_axios_error_1.isAxiosError)(error)) {
41
+ const { errorCode, originalErrorCode, message } = error.response.data;
42
+ let code = errorCode;
43
+ let errorType = ErrorType.BUSINESS;
44
+ if (INTERNAL_SERVICE_ERROR_CODES.includes(code)) {
45
+ if (typeof originalErrorCode === 'undefined') {
46
+ errorType = ErrorType.INTERNAL;
47
+ }
48
+ else {
49
+ code = originalErrorCode;
50
+ }
51
+ }
52
+ return {
53
+ code,
54
+ message,
55
+ errorType,
56
+ originalError: error,
57
+ };
58
+ }
59
+ return {
60
+ code: ERROR_CODES[ErrorType.INTERNAL],
61
+ message: ERROR_MESSAGES[ErrorType.INTERNAL],
62
+ errorType: ErrorType.INTERNAL,
63
+ originalError: error,
64
+ };
65
+ }
66
+ exports.getServiceError = getServiceError;
@@ -0,0 +1,17 @@
1
+ import { QuestroomCancelationTypeEnum } from '@escapenavigator/types/dist/questroom/enum/questroom-cancelation-type.enum';
2
+ declare type Props = {
3
+ date: string;
4
+ time: string;
5
+ minHoursForFreeCanceling: number;
6
+ cancelationRule: QuestroomCancelationTypeEnum;
7
+ timeZone: string;
8
+ };
9
+ /**
10
+ * Если правило отмены установлено как NO то можно отменить плоть до начала игры
11
+ */
12
+ export declare function getSlotCancelationDate({ date, time, minHoursForFreeCanceling, cancelationRule, timeZone, }: Props): {
13
+ canCancel: boolean;
14
+ slotCancelationDate: Date;
15
+ slotCancelationHumenDate: string;
16
+ };
17
+ export {};
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getSlotCancelationDate = void 0;
7
+ const questroom_cancelation_type_enum_1 = require("@escapenavigator/types/dist/questroom/enum/questroom-cancelation-type.enum");
8
+ const utcToZonedTime_1 = __importDefault(require("date-fns-tz/utcToZonedTime"));
9
+ const format_1 = __importDefault(require("date-fns/format"));
10
+ const isBefore_1 = __importDefault(require("date-fns/isBefore"));
11
+ const tz_date_1 = require("../tz-date");
12
+ /**
13
+ * Если правило отмены установлено как NO то можно отменить плоть до начала игры
14
+ */
15
+ function getSlotCancelationDate({ date, time, minHoursForFreeCanceling, cancelationRule, timeZone, }) {
16
+ const minHours = cancelationRule === questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.NO ? 0 : minHoursForFreeCanceling;
17
+ const zondedDate = (0, tz_date_1.convertDateToZonedDate)({
18
+ date, timeZone, time, offset: minHours * -1,
19
+ });
20
+ const d = (0, utcToZonedTime_1.default)(zondedDate.toISOString(), timeZone);
21
+ return {
22
+ canCancel: (0, isBefore_1.default)(new Date(), zondedDate),
23
+ slotCancelationDate: d,
24
+ slotCancelationHumenDate: (0, format_1.default)(d, 'dd.MM.yyyy, HH:mm'),
25
+ };
26
+ }
27
+ exports.getSlotCancelationDate = getSlotCancelationDate;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const questroom_cancelation_type_enum_1 = require("@escapenavigator/types/dist/questroom/enum/questroom-cancelation-type.enum");
4
+ const _1 = require(".");
5
+ describe('getSlotCancelationDate function', () => {
6
+ test('should return canCancel false in summer time', () => {
7
+ // значит в тае сейчас 19:00 а в Германии 12:00
8
+ jest.useFakeTimers().setSystemTime(new Date(Date.UTC(2023, 5, 1, 10, 1)).valueOf());
9
+ const result = (0, _1.getSlotCancelationDate)({
10
+ date: '2023-06-03',
11
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
12
+ time: '12:00',
13
+ minHoursForFreeCanceling: 48,
14
+ timeZone: 'Europe/Berlin',
15
+ });
16
+ expect(result.canCancel).toBe(false);
17
+ });
18
+ test('should return canCancel false in winter time', () => {
19
+ // значит в тае сейчас 19:00 а в Германии 11:00
20
+ jest.useFakeTimers().setSystemTime(new Date(Date.UTC(2023, 0, 1, 10, 1)).valueOf());
21
+ const result = (0, _1.getSlotCancelationDate)({
22
+ date: '2023-01-03',
23
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
24
+ time: '11:00',
25
+ minHoursForFreeCanceling: 48,
26
+ timeZone: 'Europe/Berlin',
27
+ });
28
+ expect(result.canCancel).toBe(false);
29
+ });
30
+ test('should return canCancel true in summer time', () => {
31
+ // значит в тае сейчас 19:00 а в Германии 12:00
32
+ jest.useFakeTimers().setSystemTime(new Date(Date.UTC(2023, 5, 1, 9, 59)).valueOf());
33
+ const result = (0, _1.getSlotCancelationDate)({
34
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
35
+ date: '2023-06-03',
36
+ time: '12:00',
37
+ minHoursForFreeCanceling: 48,
38
+ timeZone: 'Europe/Berlin',
39
+ });
40
+ expect(result.canCancel).toBe(true);
41
+ });
42
+ test('should return canCancel true in winter time', () => {
43
+ // значит в тае сейчас 19:00 а в Германии 11:00
44
+ jest.useFakeTimers().setSystemTime(new Date(Date.UTC(2023, 0, 1, 9, 59)).valueOf());
45
+ const result = (0, _1.getSlotCancelationDate)({
46
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
47
+ date: '2023-01-03',
48
+ time: '11:00',
49
+ minHoursForFreeCanceling: 48,
50
+ timeZone: 'Europe/Berlin',
51
+ });
52
+ expect(result.canCancel).toBe(true);
53
+ });
54
+ test('should return correct winter time', () => {
55
+ const result = (0, _1.getSlotCancelationDate)({
56
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
57
+ date: '2023-01-03',
58
+ time: '09:00',
59
+ minHoursForFreeCanceling: 48,
60
+ timeZone: 'Europe/Berlin',
61
+ });
62
+ expect(result.slotCancelationHumenDate).toBe('01.01.2023, 09:00');
63
+ });
64
+ test('should return correct summer time', () => {
65
+ const result = (0, _1.getSlotCancelationDate)({
66
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
67
+ date: '2023-06-03',
68
+ time: '09:00',
69
+ minHoursForFreeCanceling: 48,
70
+ timeZone: 'Europe/Berlin',
71
+ });
72
+ expect(result.slotCancelationHumenDate).toBe('01.06.2023, 09:00');
73
+ });
74
+ test('should return correct other timeZone time', () => {
75
+ const result = (0, _1.getSlotCancelationDate)({
76
+ cancelationRule: questroom_cancelation_type_enum_1.QuestroomCancelationTypeEnum.FULL_PRICE,
77
+ date: '2023-06-03',
78
+ time: '09:00',
79
+ minHoursForFreeCanceling: 48,
80
+ timeZone: 'Europe/Moscow',
81
+ });
82
+ expect(result.slotCancelationHumenDate).toBe('01.06.2023, 09:00');
83
+ });
84
+ });
@@ -0,0 +1,13 @@
1
+ export * from './convert-to-options';
2
+ export * from './enum-to-options';
3
+ export * from './get-documents-links';
4
+ export * from './get-handled-error-message';
5
+ export * from './get-order-cancelation-state';
6
+ export * from './get-service-error';
7
+ export * from './is-axios-error';
8
+ export * from './is-network-error';
9
+ export * from './redirect';
10
+ export * from './serialize-record';
11
+ export * from './serialize-slot';
12
+ export * from './tz-date';
13
+ export * from './validate-by-dto';
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./convert-to-options"), exports);
18
+ __exportStar(require("./enum-to-options"), exports);
19
+ __exportStar(require("./get-documents-links"), exports);
20
+ __exportStar(require("./get-handled-error-message"), exports);
21
+ __exportStar(require("./get-order-cancelation-state"), exports);
22
+ __exportStar(require("./get-service-error"), exports);
23
+ __exportStar(require("./is-axios-error"), exports);
24
+ __exportStar(require("./is-network-error"), exports);
25
+ __exportStar(require("./redirect"), exports);
26
+ __exportStar(require("./serialize-record"), exports);
27
+ __exportStar(require("./serialize-slot"), exports);
28
+ __exportStar(require("./tz-date"), exports);
29
+ __exportStar(require("./validate-by-dto"), exports);
@@ -0,0 +1,6 @@
1
+ import { AxiosError } from 'axios';
2
+ /**
3
+ * Возвращает `true`, если ошибка была выброшена axios
4
+ * @param error Ошибка от сервиса
5
+ */
6
+ export declare function isAxiosError<T>(error: unknown): error is AxiosError<T>;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isAxiosError = void 0;
4
+ /**
5
+ * Возвращает `true`, если ошибка была выброшена axios
6
+ * @param error Ошибка от сервиса
7
+ */
8
+ function isAxiosError(error) {
9
+ return Boolean(error.isAxiosError);
10
+ }
11
+ exports.isAxiosError = isAxiosError;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Возвращает `true`, если ошибка возникла из-за проблем с интернетом
3
+ * @param error Ошибка от сервиса
4
+ */
5
+ export declare function isNetworkError(error: unknown): boolean;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isNetworkError = void 0;
4
+ const is_axios_error_1 = require("./is-axios-error");
5
+ const NETWORK_ERROR_CODES = ['ENETUNREACH', 'ECONNABORTED', 'ENOTCONN'];
6
+ /**
7
+ * Возвращает `true`, если ошибка возникла из-за проблем с интернетом
8
+ * @param error Ошибка от сервиса
9
+ */
10
+ function isNetworkError(error) {
11
+ if ((0, is_axios_error_1.isAxiosError)(error)) {
12
+ const { response, code, message } = error;
13
+ return (typeof response === 'undefined' &&
14
+ (NETWORK_ERROR_CODES.includes(code) || message === 'Network Error'));
15
+ }
16
+ return false;
17
+ }
18
+ exports.isNetworkError = isNetworkError;
@@ -0,0 +1 @@
1
+ export declare const redirect: (url: any) => void;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.redirect = void 0;
4
+ const redirect = (url) => {
5
+ window.location.assign(url);
6
+ };
7
+ exports.redirect = redirect;
@@ -0,0 +1,2 @@
1
+ import { ClassConstructor } from 'class-transformer';
2
+ export declare const serializeRecord: <T, D>(Dto: ClassConstructor<T>, data: D) => T;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeRecord = void 0;
4
+ const class_transformer_1 = require("class-transformer");
5
+ const serializeRecord = (Dto, data) => (0, class_transformer_1.plainToClass)(Dto, data, { strategy: 'excludeAll' });
6
+ exports.serializeRecord = serializeRecord;
@@ -0,0 +1,11 @@
1
+ import { OrderRO } from '@escapenavigator/types/dist/order/order.ro';
2
+ import { SlotRO } from '@escapenavigator/types/dist/slot/slot.ro';
3
+ declare type Props = {
4
+ slot: any;
5
+ order?: OrderRO;
6
+ };
7
+ export declare const getClientName: (client: any) => any;
8
+ export declare const convertTime: (time: string) => string;
9
+ export declare const serializeSlotOrderData: (order: Props['order']) => SlotRO['order'];
10
+ export declare const serializeSlot: ({ slot, order }: Props) => SlotRO;
11
+ export {};
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeSlot = exports.serializeSlotOrderData = exports.convertTime = exports.getClientName = void 0;
4
+ const defailt_rule_1 = require("@escapenavigator/types/dist/slot-rule/defailt-rule");
5
+ const getClientName = (client) => {
6
+ var _a;
7
+ if (!client.name && client.surname)
8
+ return client.surname;
9
+ if (client.name && !client.surname)
10
+ return client.name;
11
+ if (client.name && client.surname)
12
+ return `${(_a = client.name) === null || _a === void 0 ? void 0 : _a.charAt(0)}. ${client.surname}`;
13
+ return client.email;
14
+ };
15
+ exports.getClientName = getClientName;
16
+ const convertTime = (time) => {
17
+ const arr = time.split(':');
18
+ return arr.length === 3 ? `${arr[0]}:${arr[1]}` : time;
19
+ };
20
+ exports.convertTime = convertTime;
21
+ const serializeSlotOrderData = (order) => {
22
+ var _a, _b, _c, _d, _e;
23
+ return order && {
24
+ id: order.id,
25
+ players: order.players,
26
+ hasDiscounts: !!((_a = order.discounts) === null || _a === void 0 ? void 0 : _a.length),
27
+ hasComments: !!((_b = order.messages) === null || _b === void 0 ? void 0 : _b.length),
28
+ hasCertificateApplies: !!((_c = order.certificates) === null || _c === void 0 ? void 0 : _c.length),
29
+ hasPenalties: !!((_d = order.penalties) === null || _d === void 0 ? void 0 : _d.length),
30
+ hasUpsellings: !!((_e = order.upsellings) === null || _e === void 0 ? void 0 : _e.length),
31
+ utcDate: order.utcDate,
32
+ moderatorId: order.moderatorId,
33
+ total: order.total,
34
+ payed: order.payed,
35
+ code: order.code,
36
+ clientName: (0, exports.getClientName)(order.client),
37
+ };
38
+ };
39
+ exports.serializeSlotOrderData = serializeSlotOrderData;
40
+ const serializeSlot = ({ slot, order }) => {
41
+ var _a;
42
+ const { prepayment, prepaymentType, title, minHoursForBooking, minHoursForFreeCanceling, cancelationRule, } = slot.rule || defailt_rule_1.defaultRule;
43
+ return {
44
+ id: slot.id,
45
+ questroomId: slot.questroomId,
46
+ date: slot.date,
47
+ start: (0, exports.convertTime)(slot.start),
48
+ end: (0, exports.convertTime)(slot.end),
49
+ tariff: (_a = slot.tariff) === null || _a === void 0 ? void 0 : _a.price,
50
+ breakReason: slot.breakReason,
51
+ customMinHours: slot.customMinHours,
52
+ rule: {
53
+ prepayment,
54
+ prepaymentType,
55
+ title,
56
+ minHoursForBooking,
57
+ minHoursForFreeCanceling,
58
+ cancelationRule,
59
+ },
60
+ order: (0, exports.serializeSlotOrderData)(order),
61
+ };
62
+ };
63
+ exports.serializeSlot = serializeSlot;
@@ -0,0 +1,17 @@
1
+ declare type Timezone = string;
2
+ declare type ToUTC = {
3
+ timeZone: Timezone;
4
+ date: string | Date;
5
+ time?: string;
6
+ offset?: number;
7
+ };
8
+ declare type ToZoned = {
9
+ timeZone: Timezone;
10
+ date: string;
11
+ offset?: number;
12
+ format?: string;
13
+ showTZ?: boolean;
14
+ };
15
+ export declare const convertDateToZonedDate: ({ date, timeZone, time, offset, }: ToUTC) => Date;
16
+ export declare const convertUTCDateToZonedDate: ({ date, timeZone, offset, format, showTZ, }: ToZoned) => string;
17
+ export {};
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertUTCDateToZonedDate = exports.convertDateToZonedDate = void 0;
4
+ const date_fns_1 = require("date-fns");
5
+ const date_fns_tz_1 = require("date-fns-tz");
6
+ const convertDateToZonedDate = ({ date, timeZone, time, offset, }) => {
7
+ let d = typeof date === 'string' ? (0, date_fns_1.parse)(time ? `${date} ${time}` : date, time ? 'yyyy-MM-dd HH:mm' : 'yyyy-MM-dd', new Date()) : date;
8
+ if (offset)
9
+ d = (0, date_fns_1.addHours)(d, offset);
10
+ return (0, date_fns_tz_1.zonedTimeToUtc)(d, timeZone);
11
+ };
12
+ exports.convertDateToZonedDate = convertDateToZonedDate;
13
+ const convertUTCDateToZonedDate = ({ date, timeZone, offset = 0, format = 'dd.MM.yyyy, HH:mm', showTZ = false, }) => {
14
+ const d = (0, date_fns_tz_1.utcToZonedTime)(date, timeZone);
15
+ const dt = (0, date_fns_1.addHours)(d, offset);
16
+ const res = (0, date_fns_1.format)(dt, format);
17
+ return showTZ ? `${res} (${timeZone})` : res;
18
+ };
19
+ exports.convertUTCDateToZonedDate = convertUTCDateToZonedDate;
@@ -0,0 +1 @@
1
+ export declare function validateByDto(t: any): <T>(data: T) => void | Record<string, unknown>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateByDto = void 0;
4
+ const class_validator_1 = require("class-validator");
5
+ function validateByDto(t) {
6
+ const validate = (data) => {
7
+ const errors = (0, class_validator_1.validateSync)(typeof data === 'object' ? data : {});
8
+ console.log({ formErrors: errors });
9
+ return Object.fromEntries(errors.map(({ property, constraints }) => {
10
+ const err = (constraints === null || constraints === void 0 ? void 0 : constraints.IsNotEmpty) || Object.values(constraints)[0];
11
+ const errorText = err.substr(err.indexOf(' ') + 1);
12
+ return [property, `${t(`validationErrors:${errorText}`)}`];
13
+ }));
14
+ };
15
+ return validate;
16
+ }
17
+ exports.validateByDto = validateByDto;
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@escapenavigator/utils",
3
+ "version": "1.4.82",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "main": "./dist",
8
+ "types": "./dist",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "rm -rf dist && tsc --project tsconfig.json",
14
+ "test": "jest"
15
+ },
16
+ "dependencies": {
17
+ "@escapenavigator/types": "^1.4.80",
18
+ "axios": "^0.21.4",
19
+ "class-transformer": "^0.5.1",
20
+ "class-validator": "^0.13.1",
21
+ "date-fns": "^2.22.1",
22
+ "date-fns-tz": "^2.0.0",
23
+ "i18next": "^21.6.4"
24
+ },
25
+ "devDependencies": {
26
+ "@rollup/plugin-node-resolve": "^13.0.0",
27
+ "@rollup/plugin-replace": "^2.4.2",
28
+ "@rollup/plugin-typescript": "^8.2.1",
29
+ "@types/jest": "^29.5.10",
30
+ "@wessberg/rollup-plugin-ts": "^1.3.14",
31
+ "alphakit-presets-lint": "^1.0.0",
32
+ "babel-jest": "^26.6.3",
33
+ "jest": "^29.7.0",
34
+ "rollup-plugin-auto-external": "^2.0.0",
35
+ "rollup-plugin-babel": "^4.4.0",
36
+ "rollup-plugin-commonjs": "^10.1.0",
37
+ "rollup-plugin-multi-input": "1.3.1",
38
+ "rollup-plugin-node-resolve": "^5.2.0",
39
+ "rollup-plugin-peer-deps-external": "^2.2.4",
40
+ "rollup-plugin-terser": "^7.0.2",
41
+ "ts-jest": "^29.1.1",
42
+ "ts-loader": "^6.2.1",
43
+ "typescript": "^4.5.4"
44
+ },
45
+ "perDependencies": {
46
+ "axios": "^0.21.1",
47
+ "utility-types": "^3.10.0",
48
+ "uuid": "^8.3.2"
49
+ },
50
+ "prettier": "./node_modules/alphakit-presets-lint/prettier.js",
51
+ "eslintConfig": {
52
+ "extends": "./node_modules/alphakit-presets-lint/eslint/index.js",
53
+ "ignorePatterns": [
54
+ "dist",
55
+ "node_modules"
56
+ ]
57
+ },
58
+ "gitHead": "75ee4a0b736f25264243eaca5971fb2d2ffdf6cf"
59
+ }