@coopenomics/notifications 2026.5.30-3 → 2026.7.17-3
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/build.config.ts +1 -9
- package/dist/index.cjs +3248 -14
- package/dist/index.d.cts +479 -280
- package/dist/index.d.mts +479 -280
- package/dist/index.d.ts +479 -280
- package/dist/index.mjs +3239 -5
- package/package.json +3 -11
- package/src/workflows/approval-request/index.ts +1 -1
- package/src/workflows/expense-advance-report-reminder/index.ts +58 -0
- package/src/workflows/index.ts +9 -0
- package/src/workflows/membership-exit-confirmation/index.ts +38 -0
- package/src/workflows/new-agenda-item/index.ts +1 -1
- package/src/workflows/payment-refunded/index.ts +51 -0
- package/dist/shared/notifications.3e0dd08c.mjs +0 -3138
- package/dist/shared/notifications.8406132d.cjs +0 -3149
- package/dist/shared/notifications.d7ceb56f.d.cts +0 -98
- package/dist/shared/notifications.d7ceb56f.d.mts +0 -98
- package/dist/shared/notifications.d7ceb56f.d.ts +0 -98
- package/dist/sync/sync-runner.cjs +0 -7288
- package/dist/sync/sync-runner.d.cts +0 -48
- package/dist/sync/sync-runner.d.mts +0 -48
- package/dist/sync/sync-runner.d.ts +0 -48
- package/dist/sync/sync-runner.mjs +0 -7273
- package/src/sync/novu-sync.service.ts +0 -246
- package/src/sync/sync-runner.ts +0 -154
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coopenomics/notifications",
|
|
3
|
-
"version": "2026.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2026.7.17-3",
|
|
4
|
+
"description": "Каталог типобезопасных типов уведомлений и шаблонов Центра уведомлений",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
7
7
|
"main": "dist/index.cjs",
|
|
@@ -22,14 +22,9 @@
|
|
|
22
22
|
"build": "unbuild",
|
|
23
23
|
"dev": "unbuild --watch",
|
|
24
24
|
"clean": "rm -rf dist",
|
|
25
|
-
"sync": "node ./dist/sync/sync-runner.cjs",
|
|
26
|
-
"sync:dev": "node ./dist/sync/sync-runner.cjs --dev",
|
|
27
|
-
"sync:watch": "node ./dist/sync/sync-runner.cjs --dev",
|
|
28
25
|
"test": "vitest run"
|
|
29
26
|
},
|
|
30
27
|
"dependencies": {
|
|
31
|
-
"axios": "^1.7.7",
|
|
32
|
-
"dotenv": "^17.1.0",
|
|
33
28
|
"transliteration": "^2.3.5",
|
|
34
29
|
"zod": "^3.22.4",
|
|
35
30
|
"zod-to-json-schema": "^3.22.5"
|
|
@@ -43,9 +38,6 @@
|
|
|
43
38
|
"unbuild": "^2.0.0",
|
|
44
39
|
"vitest": "^4.0.18"
|
|
45
40
|
},
|
|
46
|
-
"bin": {
|
|
47
|
-
"novu-sync": "./dist/sync/sync-runner.cjs"
|
|
48
|
-
},
|
|
49
41
|
"exports": {
|
|
50
42
|
".": {
|
|
51
43
|
"types": "./dist/index.d.ts",
|
|
@@ -53,5 +45,5 @@
|
|
|
53
45
|
"require": "./dist/index.cjs"
|
|
54
46
|
}
|
|
55
47
|
},
|
|
56
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "ed9b0879d5655b2c4c06a512aad28441d05f0782"
|
|
57
49
|
}
|
|
@@ -40,7 +40,7 @@ export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
|
40
40
|
createInAppStep(
|
|
41
41
|
'approval-request-notification',
|
|
42
42
|
'Новый запрос на одобрение действия',
|
|
43
|
-
'Запрос: {{payload.requestTitle}}
|
|
43
|
+
'Запрос: {{payload.requestTitle}}\nАвтор: {{payload.authorName}}'
|
|
44
44
|
),
|
|
45
45
|
createPushStep(
|
|
46
46
|
'approval-request-push',
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { WorkflowDefinition } from '../../types';
|
|
3
|
+
import { WorkflowBuilder } from '../../base/workflow-builder';
|
|
4
|
+
import { createEmailStep, createInAppStep } from '../../base/defaults';
|
|
5
|
+
import { BaseWorkflowPayload } from '../../types';
|
|
6
|
+
import { slugify } from '../../utils';
|
|
7
|
+
|
|
8
|
+
// Одна строка-аванс в дайджесте напоминания.
|
|
9
|
+
const advanceItemSchema = z.object({
|
|
10
|
+
description: z.string(), // Назначение расхода (item.description)
|
|
11
|
+
amount: z.string(), // Сумма выданного аванса (asset-строка)
|
|
12
|
+
url: z.string(), // Прямая ссылка на страницу этого расхода
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
// Напоминание пайщику отчитаться по выданным авансам под отчёт.
|
|
16
|
+
// `period` — техническое поле (ISO-неделя): входит в payload, чтобы
|
|
17
|
+
// идемпотентность Центра уведомлений гасила повторы в пределах недели и
|
|
18
|
+
// пропускала ровно одно письмо на следующей неделе. В шаблоне не рендерится.
|
|
19
|
+
export const expenseAdvanceReportReminderPayloadSchema = z.object({
|
|
20
|
+
coopName: z.string(),
|
|
21
|
+
period: z.string(),
|
|
22
|
+
count: z.number(),
|
|
23
|
+
link: z.string(), // Основная CTA-ссылка (на сам расход, если он один, иначе на личную страницу «Платежи»)
|
|
24
|
+
advances: z.array(advanceItemSchema),
|
|
25
|
+
});
|
|
26
|
+
export type IPayload = z.infer<typeof expenseAdvanceReportReminderPayloadSchema>;
|
|
27
|
+
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
28
|
+
|
|
29
|
+
export const name = 'Напоминание об отчёте по авансу';
|
|
30
|
+
export const id = slugify(name);
|
|
31
|
+
|
|
32
|
+
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
33
|
+
.create<IWorkflow>()
|
|
34
|
+
.name(name)
|
|
35
|
+
.workflowId(id)
|
|
36
|
+
.description('Еженедельное напоминание пайщику предоставить отчёт по выданному авансу под отчёт')
|
|
37
|
+
.payloadSchema(expenseAdvanceReportReminderPayloadSchema)
|
|
38
|
+
.tags(['expense', 'financial'])
|
|
39
|
+
.addSteps([
|
|
40
|
+
createEmailStep(
|
|
41
|
+
'expense-advance-report-reminder-email',
|
|
42
|
+
'Ожидается отчёт по авансу под отчёт — {{payload.coopName}}',
|
|
43
|
+
'Уважаемый пайщик!<br><br>' +
|
|
44
|
+
'По {% if payload.count > 1 %}следующим авансам под отчёт{% else %}авансу под отчёт{% endif %}, ' +
|
|
45
|
+
'полученным в кооперативе «{{payload.coopName}}», ещё не предоставлен отчёт:<br><br>' +
|
|
46
|
+
'{% for advance in payload.advances %}• {{advance.description}} — {{advance.amount}} — ' +
|
|
47
|
+
'<a href="{{advance.url}}">открыть расход</a><br>{% endfor %}' +
|
|
48
|
+
'<br>Пожалуйста, приложите подтверждающие документы (чек, акт) на странице расхода в личном ' +
|
|
49
|
+
'кабинете — после этого отчёт будет подан автоматически.<br><br>' +
|
|
50
|
+
'<a href="{{payload.link}}">Перейти к моим авансам</a>'
|
|
51
|
+
),
|
|
52
|
+
createInAppStep(
|
|
53
|
+
'expense-advance-report-reminder-inapp',
|
|
54
|
+
'Ожидается отчёт по авансу под отчёт',
|
|
55
|
+
'По вашим авансам под отчёт ещё не предоставлен отчёт. Приложите подтверждающие документы в личном кабинете.'
|
|
56
|
+
),
|
|
57
|
+
])
|
|
58
|
+
.build();
|
package/src/workflows/index.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { workflow as approvalRequestWorkflow } from './approval-request';
|
|
|
7
7
|
import { workflow as decisionApprovedWorkflow } from './decision-approved';
|
|
8
8
|
import { workflow as paymentPaidWorkflow } from './payment-paid';
|
|
9
9
|
import { workflow as paymentCancelledWorkflow } from './payment-cancelled';
|
|
10
|
+
import { workflow as paymentRefundedWorkflow } from './payment-refunded';
|
|
10
11
|
import { workflow as meetInitialWorkflow } from './meet-initial';
|
|
11
12
|
import { workflow as meetReminderStartWorkflow } from './meet-reminder-start';
|
|
12
13
|
import { workflow as meetStartedWorkflow } from './meet-started';
|
|
@@ -19,10 +20,12 @@ import { workflow as newDepositPaymentRequestWorkflow } from './new-deposit-paym
|
|
|
19
20
|
import { workflow as resetKeyWorkflow } from './reset-key';
|
|
20
21
|
import { workflow as inviteWorkflow } from './invite';
|
|
21
22
|
import { workflow as emailVerificationWorkflow } from './email-verification';
|
|
23
|
+
import { workflow as membershipExitConfirmationWorkflow } from './membership-exit-confirmation';
|
|
22
24
|
import { workflow as serverProvisionedWorkflow } from './server-provisioned';
|
|
23
25
|
import { workflow as decisionExpiredWorkflow } from './decision-expired';
|
|
24
26
|
import { workflow as chatcoopCalendarEventCreatedWorkflow } from './chatcoop-calendar-event-created';
|
|
25
27
|
import { workflow as chatcoopCalendarEventUpdatedWorkflow } from './chatcoop-calendar-event-updated';
|
|
28
|
+
import { workflow as expenseAdvanceReportReminderWorkflow } from './expense-advance-report-reminder';
|
|
26
29
|
|
|
27
30
|
// Импортируем все воркфлоу
|
|
28
31
|
export * as Welcome from './welcome';
|
|
@@ -32,6 +35,7 @@ export * as ApprovalRequest from './approval-request';
|
|
|
32
35
|
export * as DecisionApproved from './decision-approved';
|
|
33
36
|
export * as PaymentPaid from './payment-paid';
|
|
34
37
|
export * as PaymentCancelled from './payment-cancelled';
|
|
38
|
+
export * as PaymentRefunded from './payment-refunded';
|
|
35
39
|
export * as MeetInitial from './meet-initial';
|
|
36
40
|
export * as MeetReminderStart from './meet-reminder-start';
|
|
37
41
|
export * as MeetStarted from './meet-started';
|
|
@@ -44,10 +48,12 @@ export * as NewDepositPaymentRequest from './new-deposit-payment-request';
|
|
|
44
48
|
export * as ResetKey from './reset-key';
|
|
45
49
|
export * as Invite from './invite';
|
|
46
50
|
export * as EmailVerification from './email-verification';
|
|
51
|
+
export * as MembershipExitConfirmation from './membership-exit-confirmation';
|
|
47
52
|
export * as ServerProvisioned from './server-provisioned';
|
|
48
53
|
export * as DecisionExpired from './decision-expired';
|
|
49
54
|
export * as ChatCoopCalendarEventCreated from './chatcoop-calendar-event-created';
|
|
50
55
|
export * as ChatCoopCalendarEventUpdated from './chatcoop-calendar-event-updated';
|
|
56
|
+
export * as ExpenseAdvanceReportReminder from './expense-advance-report-reminder';
|
|
51
57
|
|
|
52
58
|
// Массив всех воркфлоу для автоматической регистрации
|
|
53
59
|
export const allWorkflows: WorkflowDefinition[] = [
|
|
@@ -58,6 +64,7 @@ export const allWorkflows: WorkflowDefinition[] = [
|
|
|
58
64
|
decisionApprovedWorkflow,
|
|
59
65
|
paymentPaidWorkflow,
|
|
60
66
|
paymentCancelledWorkflow,
|
|
67
|
+
paymentRefundedWorkflow,
|
|
61
68
|
meetInitialWorkflow,
|
|
62
69
|
meetReminderStartWorkflow,
|
|
63
70
|
meetStartedWorkflow,
|
|
@@ -70,10 +77,12 @@ export const allWorkflows: WorkflowDefinition[] = [
|
|
|
70
77
|
resetKeyWorkflow,
|
|
71
78
|
inviteWorkflow,
|
|
72
79
|
emailVerificationWorkflow,
|
|
80
|
+
membershipExitConfirmationWorkflow,
|
|
73
81
|
serverProvisionedWorkflow,
|
|
74
82
|
decisionExpiredWorkflow,
|
|
75
83
|
chatcoopCalendarEventCreatedWorkflow,
|
|
76
84
|
chatcoopCalendarEventUpdatedWorkflow,
|
|
85
|
+
expenseAdvanceReportReminderWorkflow,
|
|
77
86
|
];
|
|
78
87
|
|
|
79
88
|
// Экспортируем воркфлоу по ID для удобного доступа
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { WorkflowDefinition, type BaseWorkflowPayload } from '../../types';
|
|
2
|
+
import { WorkflowBuilder } from '../../base/workflow-builder';
|
|
3
|
+
import { createEmailStep } from '../../base/defaults';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { slugify } from '../../utils';
|
|
6
|
+
|
|
7
|
+
// Схема payload для письма-подтверждения выхода из кооператива
|
|
8
|
+
export const membershipExitConfirmationPayloadSchema = z.object({
|
|
9
|
+
confirmationUrl: z.string(),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export type IPayload = z.infer<typeof membershipExitConfirmationPayloadSchema>;
|
|
13
|
+
|
|
14
|
+
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
15
|
+
|
|
16
|
+
export const name = 'Подтверждение выхода из кооператива';
|
|
17
|
+
export const id = slugify(name);
|
|
18
|
+
|
|
19
|
+
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
20
|
+
.create<IWorkflow>()
|
|
21
|
+
.name(name)
|
|
22
|
+
.workflowId(id)
|
|
23
|
+
.description('Подтверждение по email заявления о добровольном выходе пайщика из кооператива')
|
|
24
|
+
.payloadSchema(membershipExitConfirmationPayloadSchema)
|
|
25
|
+
.tags(['auth'])
|
|
26
|
+
.addSteps([
|
|
27
|
+
createEmailStep(
|
|
28
|
+
'membership-exit-confirmation-email',
|
|
29
|
+
'Подтверждение выхода из кооператива',
|
|
30
|
+
'Здравствуйте!<br><br>' +
|
|
31
|
+
'Вы подали заявление о добровольном выходе из кооператива. Это действие необратимо: ' +
|
|
32
|
+
'после подтверждения запускается процедура выхода и возврата паевого взноса, а ваш аккаунт блокируется.<br><br>' +
|
|
33
|
+
'Если вы действительно хотите выйти из кооператива, перейдите по ссылке для подтверждения: ' +
|
|
34
|
+
'<a href="{{payload.confirmationUrl}}">{{payload.confirmationUrl}}</a><br><br>' +
|
|
35
|
+
'Если вы не подавали такое заявление — просто проигнорируйте это письмо, ничего не произойдёт.'
|
|
36
|
+
),
|
|
37
|
+
])
|
|
38
|
+
.build();
|
|
@@ -40,7 +40,7 @@ export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
|
40
40
|
createInAppStep(
|
|
41
41
|
'new-agenda-item-notification',
|
|
42
42
|
'Новый вопрос на повестке совета',
|
|
43
|
-
'{{payload.itemTitle}}
|
|
43
|
+
'{{payload.itemTitle}}\nОт: {{payload.authorName}}'
|
|
44
44
|
),
|
|
45
45
|
createPushStep(
|
|
46
46
|
'new-agenda-item-push',
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
|
|
2
|
+
import { WorkflowDefinition } from '../../types';
|
|
3
|
+
import { WorkflowBuilder } from '../../base/workflow-builder';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { BaseWorkflowPayload } from '../../types';
|
|
6
|
+
import { createEmailStep, createInAppStep, createPushStep } from '../../base/defaults';
|
|
7
|
+
import { slugify } from '../../utils';
|
|
8
|
+
|
|
9
|
+
// Схема исходящего платежа пайщику. Это НЕ обязательно возврат взноса — тем же
|
|
10
|
+
// каналом идут оплата аванса под отчёт, доплата по перерасходу и пр., поэтому
|
|
11
|
+
// текст универсальный «Платёж выполнен», без привязки к типу платежа.
|
|
12
|
+
export const paymentRefundedPayloadSchema = z.object({
|
|
13
|
+
userName: z.string(),
|
|
14
|
+
paymentAmount: z.string(),
|
|
15
|
+
paymentCurrency: z.string(),
|
|
16
|
+
paymentDate: z.string(),
|
|
17
|
+
paymentUrl: z.string().optional(),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export type IPayload = z.infer<typeof paymentRefundedPayloadSchema>;
|
|
21
|
+
|
|
22
|
+
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
23
|
+
|
|
24
|
+
export const name = 'Платёж выполнен';
|
|
25
|
+
export const id = slugify(name);
|
|
26
|
+
|
|
27
|
+
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
28
|
+
.create<IWorkflow>()
|
|
29
|
+
.name(name)
|
|
30
|
+
.workflowId(id)
|
|
31
|
+
.description('Уведомление о выполненном исходящем платеже пайщику (аванс, возврат, доплата и пр.)')
|
|
32
|
+
.payloadSchema(paymentRefundedPayloadSchema)
|
|
33
|
+
.tags(['user']) // Для всех пользователей
|
|
34
|
+
.addSteps([
|
|
35
|
+
createEmailStep(
|
|
36
|
+
'payment-refunded-email',
|
|
37
|
+
'Платёж выполнен',
|
|
38
|
+
'Уважаемый {{payload.userName}}!<br><br>Вам выполнен платёж.<br><br>Сумма: <strong>{{payload.paymentAmount}} {{payload.paymentCurrency}}</strong><br><br>Дата: {{payload.paymentDate}}<br><br>Подробная информация доступна по ссылке: {{payload.paymentUrl}}'
|
|
39
|
+
),
|
|
40
|
+
createInAppStep(
|
|
41
|
+
'payment-refunded-notification',
|
|
42
|
+
'Платёж выполнен',
|
|
43
|
+
'Платёж на сумму {{payload.paymentAmount}} {{payload.paymentCurrency}} выполнен'
|
|
44
|
+
),
|
|
45
|
+
createPushStep(
|
|
46
|
+
'payment-refunded-push',
|
|
47
|
+
'Платёж выполнен',
|
|
48
|
+
'Платёж {{payload.paymentAmount}} {{payload.paymentCurrency}} выполнен'
|
|
49
|
+
),
|
|
50
|
+
])
|
|
51
|
+
.build();
|