@escapenavigator/utils 2.1.21 → 2.1.23
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.
- package/dist/format-amount/index.d.ts +1 -0
- package/dist/format-amount/index.js +13 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/personal-data-consent.d.ts +12 -0
- package/dist/personal-data-consent.js +17 -0
- package/dist/role-finance-permissions.d.ts +12 -0
- package/dist/role-finance-permissions.js +15 -0
- package/dist/role-finance-permissions.spec.d.ts +1 -0
- package/dist/role-finance-permissions.spec.js +51 -0
- package/dist/utm-touchpoints.d.ts +5 -0
- package/package.json +3 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.formatAmount = void 0;
|
|
3
|
+
exports.formatAmount = exports.roundDisplayAmount = void 0;
|
|
4
4
|
const profile_currency_1 = require("@escapenavigator/types/dist/profile/enum/profile-currency");
|
|
5
5
|
const getCurrency = (currency) => {
|
|
6
6
|
const res = {
|
|
@@ -57,6 +57,18 @@ const currencyFirst = (currency) => currency === 'USD' ||
|
|
|
57
57
|
currency === 'GEL' ||
|
|
58
58
|
currency === 'UAH';
|
|
59
59
|
const THINSP = String.fromCharCode(8201);
|
|
60
|
+
/**
|
|
61
|
+
* Копейки у крупных сумм только шумят: 4+ цифры в целой части (≥ 1000)
|
|
62
|
+
* округляем до целых единиц. Меньше — оставляем как есть.
|
|
63
|
+
*/
|
|
64
|
+
const LARGE_MAJOR_THRESHOLD = 100_000;
|
|
65
|
+
const roundDisplayAmount = (amount) => {
|
|
66
|
+
const value = +amount || 0;
|
|
67
|
+
if (Math.abs(value) < LARGE_MAJOR_THRESHOLD)
|
|
68
|
+
return value;
|
|
69
|
+
return Math.round(value / 100) * 100;
|
|
70
|
+
};
|
|
71
|
+
exports.roundDisplayAmount = roundDisplayAmount;
|
|
60
72
|
const formatAmount = (amount, currency) => {
|
|
61
73
|
const [major, minor] = ((+amount || 0) / 100).toFixed(2).split('.');
|
|
62
74
|
const value = +minor;
|
package/dist/index.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ export * from './is-axios-error';
|
|
|
24
24
|
export * from './is-network-error';
|
|
25
25
|
export * from './is-stale-chunk-error';
|
|
26
26
|
export * from './is-valid-pt-nif';
|
|
27
|
+
export * from './personal-data-consent';
|
|
27
28
|
export * from './phone';
|
|
28
29
|
export * from './pick';
|
|
29
30
|
export * from './promocode-error-codes';
|
|
@@ -38,6 +39,7 @@ export * from './role-chat-permissions';
|
|
|
38
39
|
export * from './role-comment-permissions';
|
|
39
40
|
export * from './role-employee-report-permissions';
|
|
40
41
|
export * from './role-export-permissions';
|
|
42
|
+
export * from './role-finance-permissions';
|
|
41
43
|
export * from './role-lead-permissions';
|
|
42
44
|
export * from './role-payment-delete-permissions';
|
|
43
45
|
export * from './role-refund-permissions';
|
package/dist/index.js
CHANGED
|
@@ -40,6 +40,7 @@ __exportStar(require("./is-axios-error"), exports);
|
|
|
40
40
|
__exportStar(require("./is-network-error"), exports);
|
|
41
41
|
__exportStar(require("./is-stale-chunk-error"), exports);
|
|
42
42
|
__exportStar(require("./is-valid-pt-nif"), exports);
|
|
43
|
+
__exportStar(require("./personal-data-consent"), exports);
|
|
43
44
|
__exportStar(require("./phone"), exports);
|
|
44
45
|
__exportStar(require("./pick"), exports);
|
|
45
46
|
__exportStar(require("./promocode-error-codes"), exports);
|
|
@@ -54,6 +55,7 @@ __exportStar(require("./role-chat-permissions"), exports);
|
|
|
54
55
|
__exportStar(require("./role-comment-permissions"), exports);
|
|
55
56
|
__exportStar(require("./role-employee-report-permissions"), exports);
|
|
56
57
|
__exportStar(require("./role-export-permissions"), exports);
|
|
58
|
+
__exportStar(require("./role-finance-permissions"), exports);
|
|
57
59
|
__exportStar(require("./role-lead-permissions"), exports);
|
|
58
60
|
__exportStar(require("./role-payment-delete-permissions"), exports);
|
|
59
61
|
__exportStar(require("./role-refund-permissions"), exports);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Отдельное согласие на обработку ПДн спрашиваем только у клиентов площадок
|
|
3
|
+
* из России: после поправок 01.09.2025 РКН ждёт его отдельной галочкой, и
|
|
4
|
+
* площадка должна уметь доказать, что оно было (ч. 3 ст. 9 152-ФЗ). Бэкенд
|
|
5
|
+
* не принимает заявки, сертификаты и первое сообщение чата без него — тогда
|
|
6
|
+
* сама запись в базе и есть доказательство.
|
|
7
|
+
*
|
|
8
|
+
* В ЕС основание — договор или преддоговорный запрос (GDPR 6(1)(b)), согласие
|
|
9
|
+
* там не нужно: достаточно ссылки на политику площадки у формы (ст. 13).
|
|
10
|
+
*/
|
|
11
|
+
export declare const requiresPersonalDataConsent: (country?: string | null) => boolean;
|
|
12
|
+
export declare const PERSONAL_DATA_CONSENT_REQUIRED = "Personal data consent is required";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PERSONAL_DATA_CONSENT_REQUIRED = exports.requiresPersonalDataConsent = void 0;
|
|
4
|
+
const countries_enum_1 = require("@escapenavigator/types/dist/shared/enum/countries.enum");
|
|
5
|
+
/**
|
|
6
|
+
* Отдельное согласие на обработку ПДн спрашиваем только у клиентов площадок
|
|
7
|
+
* из России: после поправок 01.09.2025 РКН ждёт его отдельной галочкой, и
|
|
8
|
+
* площадка должна уметь доказать, что оно было (ч. 3 ст. 9 152-ФЗ). Бэкенд
|
|
9
|
+
* не принимает заявки, сертификаты и первое сообщение чата без него — тогда
|
|
10
|
+
* сама запись в базе и есть доказательство.
|
|
11
|
+
*
|
|
12
|
+
* В ЕС основание — договор или преддоговорный запрос (GDPR 6(1)(b)), согласие
|
|
13
|
+
* там не нужно: достаточно ссылки на политику площадки у формы (ст. 13).
|
|
14
|
+
*/
|
|
15
|
+
const requiresPersonalDataConsent = (country) => country === countries_enum_1.CountriesEnum.RUSSIA;
|
|
16
|
+
exports.requiresPersonalDataConsent = requiresPersonalDataConsent;
|
|
17
|
+
exports.PERSONAL_DATA_CONSENT_REQUIRED = 'Personal data consent is required';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { RoleRO } from '@escapenavigator/types/dist/role/role.ro';
|
|
2
|
+
export type RoleFinancePermissions = Pick<RoleRO, 'totalAccess' | 'accessToFinanceSection' | 'financePaymentsOnly'>;
|
|
3
|
+
/**
|
|
4
|
+
* Вкладка платежей и сам раздел бухгалтерии.
|
|
5
|
+
* Владелец (`totalAccess`) — как будто доступ включён.
|
|
6
|
+
*/
|
|
7
|
+
export declare const canAccessFinance: (role?: RoleFinancePermissions | null) => boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Кассы, статьи, схемы зарплат и партнёры.
|
|
10
|
+
* `financePaymentsOnly` оставляет только платежи. На владельца не действует.
|
|
11
|
+
*/
|
|
12
|
+
export declare const canAccessFullFinance: (role?: RoleFinancePermissions | null) => boolean;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.canAccessFullFinance = exports.canAccessFinance = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Вкладка платежей и сам раздел бухгалтерии.
|
|
6
|
+
* Владелец (`totalAccess`) — как будто доступ включён.
|
|
7
|
+
*/
|
|
8
|
+
const canAccessFinance = (role) => !!role?.totalAccess || !!role?.accessToFinanceSection;
|
|
9
|
+
exports.canAccessFinance = canAccessFinance;
|
|
10
|
+
/**
|
|
11
|
+
* Кассы, статьи, схемы зарплат и партнёры.
|
|
12
|
+
* `financePaymentsOnly` оставляет только платежи. На владельца не действует.
|
|
13
|
+
*/
|
|
14
|
+
const canAccessFullFinance = (role) => !!role?.totalAccess || (!!role?.accessToFinanceSection && !role?.financePaymentsOnly);
|
|
15
|
+
exports.canAccessFullFinance = canAccessFullFinance;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const role_finance_permissions_1 = require("./role-finance-permissions");
|
|
4
|
+
describe('canAccessFinance', () => {
|
|
5
|
+
it('закрыт без роли и без флага', () => {
|
|
6
|
+
expect((0, role_finance_permissions_1.canAccessFinance)()).toBe(false);
|
|
7
|
+
expect((0, role_finance_permissions_1.canAccessFinance)(null)).toBe(false);
|
|
8
|
+
expect((0, role_finance_permissions_1.canAccessFinance)({
|
|
9
|
+
totalAccess: false,
|
|
10
|
+
accessToFinanceSection: false,
|
|
11
|
+
financePaymentsOnly: false,
|
|
12
|
+
})).toBe(false);
|
|
13
|
+
});
|
|
14
|
+
it('открыт при доступе к бухгалтерии', () => {
|
|
15
|
+
expect((0, role_finance_permissions_1.canAccessFinance)({
|
|
16
|
+
totalAccess: false,
|
|
17
|
+
accessToFinanceSection: true,
|
|
18
|
+
financePaymentsOnly: true,
|
|
19
|
+
})).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
it('открыт владельцу', () => {
|
|
22
|
+
expect((0, role_finance_permissions_1.canAccessFinance)({
|
|
23
|
+
totalAccess: true,
|
|
24
|
+
accessToFinanceSection: false,
|
|
25
|
+
financePaymentsOnly: true,
|
|
26
|
+
})).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('canAccessFullFinance', () => {
|
|
30
|
+
it('закрыт, если бухгалтерия сужена до платежей', () => {
|
|
31
|
+
expect((0, role_finance_permissions_1.canAccessFullFinance)({
|
|
32
|
+
totalAccess: false,
|
|
33
|
+
accessToFinanceSection: true,
|
|
34
|
+
financePaymentsOnly: true,
|
|
35
|
+
})).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
it('открыт при полном доступе к бухгалтерии', () => {
|
|
38
|
+
expect((0, role_finance_permissions_1.canAccessFullFinance)({
|
|
39
|
+
totalAccess: false,
|
|
40
|
+
accessToFinanceSection: true,
|
|
41
|
+
financePaymentsOnly: false,
|
|
42
|
+
})).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
it('владелец видит весь раздел', () => {
|
|
45
|
+
expect((0, role_finance_permissions_1.canAccessFullFinance)({
|
|
46
|
+
totalAccess: true,
|
|
47
|
+
accessToFinanceSection: false,
|
|
48
|
+
financePaymentsOnly: true,
|
|
49
|
+
})).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -27,6 +27,11 @@ export type UtmFields = {
|
|
|
27
27
|
fbclid?: string | null;
|
|
28
28
|
ttclid?: string | null;
|
|
29
29
|
msclkid?: string | null;
|
|
30
|
+
/**
|
|
31
|
+
* ClientID Яндекс.Метрики. Как click-id: в touchpoint-нормализацию
|
|
32
|
+
* не входит, пишется в денорм-колонку заказа / продажи сертификата.
|
|
33
|
+
*/
|
|
34
|
+
ymClientId?: string | null;
|
|
30
35
|
};
|
|
31
36
|
/**
|
|
32
37
|
* Нормализация одного UTM-поля для индекса/поиска: trim + lowercase.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@escapenavigator/utils",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.23",
|
|
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.1.
|
|
17
|
+
"@escapenavigator/types": "^2.1.23",
|
|
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": "
|
|
32
|
+
"gitHead": "533e344e432372b89b80d81c0ce35bc27463b677"
|
|
33
33
|
}
|