@coopenomics/notifications 2025.11.8
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/.cursor/rules/notifications.mdc +20 -0
- package/.env-example +2 -0
- package/README.md +218 -0
- package/build.config.ts +13 -0
- package/dist/index.cjs +3027 -0
- package/dist/index.d.cts +792 -0
- package/dist/index.d.mts +792 -0
- package/dist/index.d.ts +792 -0
- package/dist/index.mjs +3016 -0
- package/dist/sync/novu-sync.service.d.ts +30 -0
- package/dist/sync/novu-sync.service.js +128 -0
- package/dist/sync/sync-runner.d.ts +4 -0
- package/dist/sync/sync-runner.js +130 -0
- package/dist/utils/role-utils.d.ts +8 -0
- package/dist/utils/role-utils.js +18 -0
- package/dist/workflows/incoming-transfer/incoming-transfer-workflow.d.ts +3 -0
- package/dist/workflows/incoming-transfer/incoming-transfer-workflow.js +16 -0
- package/dist/workflows/incoming-transfer/index.d.ts +3 -0
- package/dist/workflows/incoming-transfer/index.js +2 -0
- package/dist/workflows/incoming-transfer/types.d.ts +12 -0
- package/dist/workflows/incoming-transfer/types.js +5 -0
- package/dist/workflows/new-agenda-item/index.d.ts +3 -0
- package/dist/workflows/new-agenda-item/index.js +2 -0
- package/dist/workflows/new-agenda-item/new-agenda-item-workflow.d.ts +3 -0
- package/dist/workflows/new-agenda-item/new-agenda-item-workflow.js +16 -0
- package/dist/workflows/new-agenda-item/types.d.ts +27 -0
- package/dist/workflows/new-agenda-item/types.js +10 -0
- package/dist/workflows/role-based-workflows.d.ts +21 -0
- package/dist/workflows/role-based-workflows.js +65 -0
- package/package.json +51 -0
- package/src/base/defaults.ts +66 -0
- package/src/base/workflow-builder.ts +128 -0
- package/src/index.ts +9 -0
- package/src/sync/README.md +54 -0
- package/src/sync/novu-sync.service.ts +246 -0
- package/src/sync/sync-runner.ts +154 -0
- package/src/types/index.ts +99 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/slugify/builtinReplacements.ts +2065 -0
- package/src/utils/slugify/slugify.ts +284 -0
- package/src/utils/slugify/transliterate.ts +48 -0
- package/src/workflows/approval-request/index.ts +52 -0
- package/src/workflows/approval-response/index.ts +54 -0
- package/src/workflows/decision-approved/index.ts +50 -0
- package/src/workflows/email-verification/index.ts +35 -0
- package/src/workflows/incoming-transfer/index.ts +43 -0
- package/src/workflows/index.ts +74 -0
- package/src/workflows/invite/index.ts +34 -0
- package/src/workflows/meet-ended/index.ts +51 -0
- package/src/workflows/meet-initial/index.ts +53 -0
- package/src/workflows/meet-reminder-end/index.ts +52 -0
- package/src/workflows/meet-reminder-start/index.ts +51 -0
- package/src/workflows/meet-restart/index.ts +53 -0
- package/src/workflows/meet-started/index.ts +51 -0
- package/src/workflows/new-agenda-item/index.ts +51 -0
- package/src/workflows/new-deposit-payment-request/index.ts +50 -0
- package/src/workflows/new-initial-payment-request/index.ts +50 -0
- package/src/workflows/payment-cancelled/index.ts +51 -0
- package/src/workflows/payment-paid/index.ts +50 -0
- package/src/workflows/reset-key/index.ts +36 -0
- package/src/workflows/server-provisioned/index.ts +45 -0
- package/src/workflows/welcome/index.ts +43 -0
- package/tsconfig.json +18 -0
|
@@ -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
|
+
// Схема для meet-ended воркфлоу
|
|
10
|
+
export const meetEndedPayloadSchema = z.object({
|
|
11
|
+
coopShortName: z.string(),
|
|
12
|
+
meetId: z.number(),
|
|
13
|
+
meetUrl: z.string(),
|
|
14
|
+
endType: z.enum(['EXPIRED_NO_QUORUM', 'VOTING_COMPLETED', 'CLOSED']),
|
|
15
|
+
endTitle: z.string(),
|
|
16
|
+
endMessage: z.string(),
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export type IPayload = z.infer<typeof meetEndedPayloadSchema>;
|
|
20
|
+
|
|
21
|
+
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
22
|
+
|
|
23
|
+
export const name = 'Собрание завершено';
|
|
24
|
+
export const id = slugify(name);
|
|
25
|
+
|
|
26
|
+
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
27
|
+
.create<IWorkflow>()
|
|
28
|
+
.name(name)
|
|
29
|
+
.workflowId(id)
|
|
30
|
+
.description('Уведомление о завершении общего собрания пайщиков')
|
|
31
|
+
.payloadSchema(meetEndedPayloadSchema)
|
|
32
|
+
.tags(['user']) // Для всех пользователей
|
|
33
|
+
.addSteps([
|
|
34
|
+
createEmailStep(
|
|
35
|
+
'meet-ended-email',
|
|
36
|
+
'{{payload.endTitle}}',
|
|
37
|
+
'Уважаемый пайщик!<br><br>{{payload.endMessage}}<br><br>Для просмотра результатов перейдите по ссылке: {{payload.meetUrl}}<br><br>С уважением, Совет {{payload.coopShortName}}.'
|
|
38
|
+
),
|
|
39
|
+
createInAppStep(
|
|
40
|
+
'meet-ended-notification',
|
|
41
|
+
'{{payload.endTitle}}',
|
|
42
|
+
'{{payload.endMessage}}'
|
|
43
|
+
),
|
|
44
|
+
createPushStep(
|
|
45
|
+
'meet-ended-push',
|
|
46
|
+
'Собрание №{{payload.meetId}}',
|
|
47
|
+
'{{payload.endTitle}}'
|
|
48
|
+
),
|
|
49
|
+
])
|
|
50
|
+
.build();
|
|
51
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
// Схема для meet-initial воркфлоу
|
|
10
|
+
export const meetInitialPayloadSchema = z.object({
|
|
11
|
+
coopShortName: z.string(),
|
|
12
|
+
meetId: z.number(),
|
|
13
|
+
meetDate: z.string(),
|
|
14
|
+
meetTime: z.string(),
|
|
15
|
+
meetEndDate: z.string(),
|
|
16
|
+
meetEndTime: z.string(),
|
|
17
|
+
timezone: z.string(),
|
|
18
|
+
meetUrl: z.string(),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export type IPayload = z.infer<typeof meetInitialPayloadSchema>;
|
|
22
|
+
|
|
23
|
+
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
24
|
+
|
|
25
|
+
export const name = 'Уведомление о новом общем собрании';
|
|
26
|
+
export const id = slugify(name);
|
|
27
|
+
|
|
28
|
+
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
29
|
+
.create<IWorkflow>()
|
|
30
|
+
.name(name)
|
|
31
|
+
.workflowId(id)
|
|
32
|
+
.description('Начальное уведомление о назначении нового общего собрания пайщиков')
|
|
33
|
+
.payloadSchema(meetInitialPayloadSchema)
|
|
34
|
+
.tags(['user']) // Для всех пользователей
|
|
35
|
+
.addSteps([
|
|
36
|
+
createEmailStep(
|
|
37
|
+
'meet-initial-email',
|
|
38
|
+
'Уведомление о общем собрании пайщиков №{{payload.meetId}} в {{payload.coopShortName}}',
|
|
39
|
+
'Уважаемый пайщик!<br><br>В кооперативе объявлено новое общее собрание №{{payload.meetId}}.<br><br>Дата и время начала: {{payload.meetDate}} в {{payload.meetTime}} ({{payload.timezone}})<br>Дата и время завершения: {{payload.meetEndDate}} в {{payload.meetEndTime}} ({{payload.timezone}})<br><br>Для ознакомления с повесткой, пожалуйста, перейдите по ссылке:<br><a href="{{payload.meetUrl}}">{{payload.meetUrl}}</a><br><br>С уважением, Совет {{payload.coopShortName}}.'
|
|
40
|
+
),
|
|
41
|
+
createInAppStep(
|
|
42
|
+
'meet-initial-notification',
|
|
43
|
+
'Новое общее собрание №{{payload.meetId}}',
|
|
44
|
+
'Назначено собрание на {{payload.meetDate}} в {{payload.meetTime}}'
|
|
45
|
+
),
|
|
46
|
+
createPushStep(
|
|
47
|
+
'meet-initial-push',
|
|
48
|
+
'Новое общее собрание №{{payload.meetId}}',
|
|
49
|
+
'Собрание {{payload.meetDate}} в {{payload.meetTime}}'
|
|
50
|
+
),
|
|
51
|
+
])
|
|
52
|
+
.build();
|
|
53
|
+
|
|
@@ -0,0 +1,52 @@
|
|
|
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
|
+
// Схема для meet-reminder-end воркфлоу
|
|
10
|
+
export const meetReminderEndPayloadSchema = z.object({
|
|
11
|
+
coopShortName: z.string(),
|
|
12
|
+
meetId: z.number(),
|
|
13
|
+
meetEndDate: z.string(),
|
|
14
|
+
meetEndTime: z.string(),
|
|
15
|
+
timeDescription: z.string(),
|
|
16
|
+
timezone: z.string(),
|
|
17
|
+
meetUrl: z.string(),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export type IPayload = z.infer<typeof meetReminderEndPayloadSchema>;
|
|
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(meetReminderEndPayloadSchema)
|
|
33
|
+
.tags(['user']) // Для всех пользователей
|
|
34
|
+
.addSteps([
|
|
35
|
+
createEmailStep(
|
|
36
|
+
'meet-reminder-end-email',
|
|
37
|
+
'Напоминание о завершении собрания пайщиков №{{payload.meetId}} в {{payload.coopShortName}}',
|
|
38
|
+
'Уважаемый пайщик!<br><br>Общее собрание №{{payload.meetId}} завершится {{payload.timeDescription}} ({{payload.meetEndDate}} в {{payload.meetEndTime}} {{payload.timezone}}).<br><br>Если вы еще не проголосовали, пожалуйста, примите участие в голосовании по вопросам повестки дня.<br>Для голосования перейдите по ссылке:<br><a href="{{payload.meetUrl}}">{{payload.meetUrl}}</a><br><br>С уважением, Совет {{payload.coopShortName}}.'
|
|
39
|
+
),
|
|
40
|
+
createInAppStep(
|
|
41
|
+
'meet-reminder-end-notification',
|
|
42
|
+
'Собрание №{{payload.meetId}} скоро завершится',
|
|
43
|
+
'Завершится {{payload.timeDescription}}'
|
|
44
|
+
),
|
|
45
|
+
createPushStep(
|
|
46
|
+
'meet-reminder-end-push',
|
|
47
|
+
'Собрание №{{payload.meetId}} скоро завершится',
|
|
48
|
+
'Успейте проголосовать'
|
|
49
|
+
),
|
|
50
|
+
])
|
|
51
|
+
.build();
|
|
52
|
+
|
|
@@ -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
|
+
// Схема для meet-reminder-start воркфлоу
|
|
10
|
+
export const meetReminderStartPayloadSchema = z.object({
|
|
11
|
+
coopShortName: z.string(),
|
|
12
|
+
meetId: z.number(),
|
|
13
|
+
meetDate: z.string(),
|
|
14
|
+
meetTime: z.string(),
|
|
15
|
+
timeDescription: z.string(),
|
|
16
|
+
meetUrl: z.string(),
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export type IPayload = z.infer<typeof meetReminderStartPayloadSchema>;
|
|
20
|
+
|
|
21
|
+
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
22
|
+
|
|
23
|
+
export const name = 'Напоминание о предстоящем собрании';
|
|
24
|
+
export const id = slugify(name);
|
|
25
|
+
|
|
26
|
+
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
27
|
+
.create<IWorkflow>()
|
|
28
|
+
.name(name)
|
|
29
|
+
.workflowId(id)
|
|
30
|
+
.description('Напоминание пайщикам о скором начале общего собрания')
|
|
31
|
+
.payloadSchema(meetReminderStartPayloadSchema)
|
|
32
|
+
.tags(['user']) // Для всех пользователей
|
|
33
|
+
.addSteps([
|
|
34
|
+
createEmailStep(
|
|
35
|
+
'meet-reminder-start-email',
|
|
36
|
+
'Напоминание о предстоящем общем собрании №{{payload.meetId}} в {{payload.coopShortName}}',
|
|
37
|
+
'Уважаемый пайщик!<br><br>Напоминаем, что {{payload.timeDescription}} состоится общее собрание пайщиков №{{payload.meetId}} ({{payload.meetDate}} в {{payload.meetTime}}).<br><br>Для ознакомления с повесткой и подписи уведомления, пожалуйста, перейдите по ссылке:<br><a href="{{payload.meetUrl}}">{{payload.meetUrl}}</a><br><br>С уважением, Совет {{payload.coopShortName}}.'
|
|
38
|
+
),
|
|
39
|
+
createInAppStep(
|
|
40
|
+
'meet-reminder-start-notification',
|
|
41
|
+
'Напоминание о собрании №{{payload.meetId}}',
|
|
42
|
+
'Собрание начнется {{payload.timeDescription}}'
|
|
43
|
+
),
|
|
44
|
+
createPushStep(
|
|
45
|
+
'meet-reminder-start-push',
|
|
46
|
+
'Напоминание о собрании №{{payload.meetId}}',
|
|
47
|
+
'Собрание начнется {{payload.timeDescription}}'
|
|
48
|
+
),
|
|
49
|
+
])
|
|
50
|
+
.build();
|
|
51
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
// Схема для meet-restart воркфлоу
|
|
10
|
+
export const meetRestartPayloadSchema = z.object({
|
|
11
|
+
coopShortName: z.string(),
|
|
12
|
+
meetId: z.number(),
|
|
13
|
+
meetDate: z.string(),
|
|
14
|
+
meetTime: z.string(),
|
|
15
|
+
meetEndDate: z.string(),
|
|
16
|
+
meetEndTime: z.string(),
|
|
17
|
+
timezone: z.string(),
|
|
18
|
+
meetUrl: z.string(),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export type IPayload = z.infer<typeof meetRestartPayloadSchema>;
|
|
22
|
+
|
|
23
|
+
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
24
|
+
|
|
25
|
+
export const name = 'Назначена новая дата повторного собрания';
|
|
26
|
+
export const id = slugify(name);
|
|
27
|
+
|
|
28
|
+
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
29
|
+
.create<IWorkflow>()
|
|
30
|
+
.name(name)
|
|
31
|
+
.workflowId(id)
|
|
32
|
+
.description('Уведомление о новой дате проведения повторного собрания')
|
|
33
|
+
.payloadSchema(meetRestartPayloadSchema)
|
|
34
|
+
.tags(['user']) // Для всех пользователей
|
|
35
|
+
.addSteps([
|
|
36
|
+
createEmailStep(
|
|
37
|
+
'meet-restart-email',
|
|
38
|
+
'Назначена новая дата повторного собрания №{{payload.meetId}} в {{payload.coopShortName}}',
|
|
39
|
+
'Уважаемый пайщик!<br><br>Назначена новая дата проведения повторного собрания №{{payload.meetId}}.<br><br>Дата и время начала: {{payload.meetDate}} в {{payload.meetTime}} ({{payload.timezone}})<br>Дата и время завершения: {{payload.meetEndDate}} в {{payload.meetEndTime}} ({{payload.timezone}})<br><br>Повестка собрания остается прежней.<br>Для ознакомления с повесткой и подписи уведомления, пожалуйста, перейдите по ссылке:<br><a href="{{payload.meetUrl}}">{{payload.meetUrl}}</a><br><br>С уважением, Совет {{payload.coopShortName}}.'
|
|
40
|
+
),
|
|
41
|
+
createInAppStep(
|
|
42
|
+
'meet-restart-notification',
|
|
43
|
+
'Новая дата собрания №{{payload.meetId}}',
|
|
44
|
+
'Повторное собрание: {{payload.meetDate}} в {{payload.meetTime}}'
|
|
45
|
+
),
|
|
46
|
+
createPushStep(
|
|
47
|
+
'meet-restart-push',
|
|
48
|
+
'Новая дата собрания №{{payload.meetId}}',
|
|
49
|
+
'Повторное собрание {{payload.meetDate}} в {{payload.meetTime}}'
|
|
50
|
+
),
|
|
51
|
+
])
|
|
52
|
+
.build();
|
|
53
|
+
|
|
@@ -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
|
+
// Схема для meet-started воркфлоу
|
|
10
|
+
export const meetStartedPayloadSchema = z.object({
|
|
11
|
+
coopShortName: z.string(),
|
|
12
|
+
meetId: z.number(),
|
|
13
|
+
meetEndDate: z.string(),
|
|
14
|
+
meetEndTime: z.string(),
|
|
15
|
+
timezone: z.string(),
|
|
16
|
+
meetUrl: z.string(),
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export type IPayload = z.infer<typeof meetStartedPayloadSchema>;
|
|
20
|
+
|
|
21
|
+
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
22
|
+
|
|
23
|
+
export const name = 'Собрание началось';
|
|
24
|
+
export const id = slugify(name);
|
|
25
|
+
|
|
26
|
+
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
27
|
+
.create<IWorkflow>()
|
|
28
|
+
.name(name)
|
|
29
|
+
.workflowId(id)
|
|
30
|
+
.description('Уведомление о начале общего собрания пайщиков')
|
|
31
|
+
.payloadSchema(meetStartedPayloadSchema)
|
|
32
|
+
.tags(['user']) // Для всех пользователей
|
|
33
|
+
.addSteps([
|
|
34
|
+
createEmailStep(
|
|
35
|
+
'meet-started-email',
|
|
36
|
+
'Собрание пайщиков №{{payload.meetId}} в {{payload.coopShortName}} началось',
|
|
37
|
+
'Уважаемый пайщик!<br><br>Сегодня началось общее собрание пайщиков №{{payload.meetId}}.<br>Собрание будет проходить до {{payload.meetEndDate}} {{payload.meetEndTime}} ({{payload.timezone}}).<br><br>Просим принять участие в голосовании по вопросам повестки дня.<br>Для голосования перейдите по ссылке:<br><a href="{{payload.meetUrl}}">{{payload.meetUrl}}</a><br><br>С уважением, Совет {{payload.coopShortName}}.'
|
|
38
|
+
),
|
|
39
|
+
createInAppStep(
|
|
40
|
+
'meet-started-notification',
|
|
41
|
+
'Собрание №{{payload.meetId}} началось',
|
|
42
|
+
'Примите участие в голосовании'
|
|
43
|
+
),
|
|
44
|
+
createPushStep(
|
|
45
|
+
'meet-started-push',
|
|
46
|
+
'Собрание №{{payload.meetId}} началось',
|
|
47
|
+
'Голосование открыто до {{payload.meetEndDate}} {{payload.meetEndTime}}'
|
|
48
|
+
),
|
|
49
|
+
])
|
|
50
|
+
.build();
|
|
51
|
+
|
|
@@ -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
|
+
// Схема для new-agenda-item воркфлоу
|
|
10
|
+
export const newAgendaItemPayloadSchema = z.object({
|
|
11
|
+
coopname: z.string(),
|
|
12
|
+
coopShortName: z.string(),
|
|
13
|
+
itemTitle: z.string(),
|
|
14
|
+
itemDescription: z.string(),
|
|
15
|
+
authorName: z.string(),
|
|
16
|
+
decision_id: z.string(),
|
|
17
|
+
agendaUrl: z.string().optional(),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export type IPayload = z.infer<typeof newAgendaItemPayloadSchema>;
|
|
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(newAgendaItemPayloadSchema)
|
|
33
|
+
.tags(['member']) // Доступно только для членов совета
|
|
34
|
+
.addSteps([
|
|
35
|
+
createEmailStep(
|
|
36
|
+
'new-agenda-item-email',
|
|
37
|
+
'Новый вопрос на повестке совета {{payload.coopShortName}}',
|
|
38
|
+
'Уважаемый член совета!<br><br>Добавлен новый вопрос на повестку заседания совета:<br><br><strong>{{payload.itemTitle}}</strong><br><br>{{payload.itemDescription}}<br><br>Заявитель: {{payload.authorName}}<br><br>Ссылка для рассмотрения: {{payload.agendaUrl}}<br><br>'
|
|
39
|
+
),
|
|
40
|
+
createInAppStep(
|
|
41
|
+
'new-agenda-item-notification',
|
|
42
|
+
'Новый вопрос на повестке совета',
|
|
43
|
+
'{{payload.itemTitle}}<br>От: {{payload.authorName}}'
|
|
44
|
+
),
|
|
45
|
+
createPushStep(
|
|
46
|
+
'new-agenda-item-push',
|
|
47
|
+
'Новый вопрос на повестке',
|
|
48
|
+
'{{payload.itemTitle}} от {{payload.authorName}}'
|
|
49
|
+
),
|
|
50
|
+
])
|
|
51
|
+
.build();
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { WorkflowDefinition } from '../../types';
|
|
2
|
+
import { WorkflowBuilder } from '../../base/workflow-builder';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { BaseWorkflowPayload } from '../../types';
|
|
5
|
+
import { createEmailStep, createInAppStep, createPushStep } from '../../base/defaults';
|
|
6
|
+
import { slugify } from '../../utils';
|
|
7
|
+
|
|
8
|
+
// Схема для new-deposit-payment-request воркфлоу
|
|
9
|
+
export const newDepositPaymentRequestPayloadSchema = z.object({
|
|
10
|
+
chairmanName: z.string(),
|
|
11
|
+
participantName: z.string(),
|
|
12
|
+
paymentAmount: z.string(),
|
|
13
|
+
paymentCurrency: z.string(),
|
|
14
|
+
paymentType: z.string(),
|
|
15
|
+
coopname: z.string(),
|
|
16
|
+
paymentUrl: z.string().optional(),
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export type IPayload = z.infer<typeof newDepositPaymentRequestPayloadSchema>;
|
|
20
|
+
|
|
21
|
+
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
22
|
+
|
|
23
|
+
export const name = 'Новая новая заявка на паевой взнос';
|
|
24
|
+
export const id = slugify(name);
|
|
25
|
+
|
|
26
|
+
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
27
|
+
.create<IWorkflow>()
|
|
28
|
+
.name(name)
|
|
29
|
+
.workflowId(id)
|
|
30
|
+
.description('Уведомление председателю о создании новой заявки на паевой взнос')
|
|
31
|
+
.payloadSchema(newDepositPaymentRequestPayloadSchema)
|
|
32
|
+
.tags(['chairman']) // Только для председателя
|
|
33
|
+
.addSteps([
|
|
34
|
+
createEmailStep(
|
|
35
|
+
'new-deposit-payment-request-email',
|
|
36
|
+
'Новая заявка на паевой взнос: {{payload.participantName}}',
|
|
37
|
+
'Уважаемый {{payload.chairmanName}}!<br><br>Сформирована новая заявка на оплату. Проверяйте поступления.<br><br>Пайщик: <strong>{{payload.participantName}}</strong><br><br>Сумма: <strong>{{payload.paymentAmount}} {{payload.paymentCurrency}}</strong><br><br>Тип платежа: {{payload.paymentType}}<br><br>Подробности: {{payload.paymentUrl}}'
|
|
38
|
+
),
|
|
39
|
+
createInAppStep(
|
|
40
|
+
'new-deposit-payment-request-notification',
|
|
41
|
+
'Новая заявка на паевой взнос',
|
|
42
|
+
'Пайщик {{payload.participantName}} создал заявку на {{payload.paymentAmount}} {{payload.paymentCurrency}}. Проверяйте поступления.'
|
|
43
|
+
),
|
|
44
|
+
createPushStep(
|
|
45
|
+
'new-deposit-payment-request-push',
|
|
46
|
+
'Новая заявка на паевой взнос',
|
|
47
|
+
'Заявка от пайщика {{payload.participantName}} на {{payload.paymentAmount}} {{payload.paymentCurrency}}'
|
|
48
|
+
),
|
|
49
|
+
])
|
|
50
|
+
.build();
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { WorkflowDefinition } from '../../types';
|
|
2
|
+
import { WorkflowBuilder } from '../../base/workflow-builder';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { BaseWorkflowPayload } from '../../types';
|
|
5
|
+
import { createEmailStep, createInAppStep, createPushStep } from '../../base/defaults';
|
|
6
|
+
import { slugify } from '../../utils';
|
|
7
|
+
|
|
8
|
+
// Схема для new-initial-payment-request воркфлоу
|
|
9
|
+
export const newInitialPaymentRequestPayloadSchema = z.object({
|
|
10
|
+
chairmanName: z.string(),
|
|
11
|
+
participantName: z.string(),
|
|
12
|
+
paymentAmount: z.string(),
|
|
13
|
+
paymentCurrency: z.string(),
|
|
14
|
+
paymentType: z.string(),
|
|
15
|
+
coopname: z.string(),
|
|
16
|
+
paymentUrl: z.string().optional(),
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export type IPayload = z.infer<typeof newInitialPaymentRequestPayloadSchema>;
|
|
20
|
+
|
|
21
|
+
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
22
|
+
|
|
23
|
+
export const name = 'Новая заявка на вступительный взнос';
|
|
24
|
+
export const id = slugify(name);
|
|
25
|
+
|
|
26
|
+
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
27
|
+
.create<IWorkflow>()
|
|
28
|
+
.name(name)
|
|
29
|
+
.workflowId(id)
|
|
30
|
+
.description('Уведомление председателю о создании новой заявки на вступительный/минимальный паевой взнос')
|
|
31
|
+
.payloadSchema(newInitialPaymentRequestPayloadSchema)
|
|
32
|
+
.tags(['chairman']) // Только для председателя
|
|
33
|
+
.addSteps([
|
|
34
|
+
createEmailStep(
|
|
35
|
+
'new-initial-payment-request-email',
|
|
36
|
+
'Новая заявка на вступительный/мин.паевой взнос: {{payload.participantName}}',
|
|
37
|
+
'Уважаемый {{payload.chairmanName}}!<br><br>Сформирована новая заявка на оплату. Проверяйте поступления.<br><br>Пайщик: <strong>{{payload.participantName}}</strong><br><br>Сумма: <strong>{{payload.paymentAmount}} {{payload.paymentCurrency}}</strong><br><br>Тип платежа: {{payload.paymentType}}<br><br>Подробности: {{payload.paymentUrl}}'
|
|
38
|
+
),
|
|
39
|
+
createInAppStep(
|
|
40
|
+
'new-initial-payment-request-notification',
|
|
41
|
+
'Новая заявка на вступительный/мин.паевой взнос',
|
|
42
|
+
'Пайщик {{payload.participantName}} создал заявку на {{payload.paymentAmount}} {{payload.paymentCurrency}}. Проверяйте поступления.'
|
|
43
|
+
),
|
|
44
|
+
createPushStep(
|
|
45
|
+
'new-initial-payment-request-push',
|
|
46
|
+
'Новая заявка на вступительный/мин.паевой взнос',
|
|
47
|
+
'Заявка от пайщика {{payload.participantName}} на {{payload.paymentAmount}} {{payload.paymentCurrency}}'
|
|
48
|
+
),
|
|
49
|
+
])
|
|
50
|
+
.build();
|
|
@@ -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
|
+
// Схема для payment-cancelled воркфлоу
|
|
10
|
+
export const paymentCancelledPayloadSchema = z.object({
|
|
11
|
+
userName: z.string(),
|
|
12
|
+
paymentAmount: z.string(),
|
|
13
|
+
paymentCurrency: z.string(),
|
|
14
|
+
paymentId: z.string(),
|
|
15
|
+
paymentDate: z.string(),
|
|
16
|
+
paymentUrl: z.string().optional(),
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export type IPayload = z.infer<typeof paymentCancelledPayloadSchema>;
|
|
20
|
+
|
|
21
|
+
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
22
|
+
|
|
23
|
+
export const name = 'Платеж отменен';
|
|
24
|
+
export const id = slugify(name);
|
|
25
|
+
|
|
26
|
+
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
27
|
+
.create<IWorkflow>()
|
|
28
|
+
.name(name)
|
|
29
|
+
.workflowId(id)
|
|
30
|
+
.description('Уведомление об отмене платежа')
|
|
31
|
+
.payloadSchema(paymentCancelledPayloadSchema)
|
|
32
|
+
.tags(['user']) // Для всех пользователей
|
|
33
|
+
.addSteps([
|
|
34
|
+
createEmailStep(
|
|
35
|
+
'payment-cancelled-email',
|
|
36
|
+
'Платеж отменен',
|
|
37
|
+
'Уважаемый {{payload.userName}}!<br><br>Ваш платеж был отменен.<br><br>Сумма: <strong>{{payload.paymentAmount}} {{payload.paymentCurrency}}</strong><br>Номер платежа: {{payload.paymentId}}<br>Дата: {{payload.paymentDate}}<br><br>Подробная информация доступна по ссылке: {{payload.paymentUrl}}'
|
|
38
|
+
),
|
|
39
|
+
createInAppStep(
|
|
40
|
+
'payment-cancelled-notification',
|
|
41
|
+
'Платеж отменен',
|
|
42
|
+
'Платеж на сумму {{payload.paymentAmount}} {{payload.paymentCurrency}} отменен'
|
|
43
|
+
),
|
|
44
|
+
createPushStep(
|
|
45
|
+
'payment-cancelled-push',
|
|
46
|
+
'Платеж отменен',
|
|
47
|
+
'Платеж {{payload.paymentAmount}} {{payload.paymentCurrency}} отменен'
|
|
48
|
+
),
|
|
49
|
+
])
|
|
50
|
+
.build();
|
|
51
|
+
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
// Схема для payment-completed воркфлоу
|
|
10
|
+
export const paymentCompletedPayloadSchema = z.object({
|
|
11
|
+
userName: z.string(),
|
|
12
|
+
paymentAmount: z.string(),
|
|
13
|
+
paymentCurrency: z.string(),
|
|
14
|
+
paymentDate: z.string(),
|
|
15
|
+
paymentUrl: z.string().optional(),
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export type IPayload = z.infer<typeof paymentCompletedPayloadSchema>;
|
|
19
|
+
|
|
20
|
+
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
21
|
+
|
|
22
|
+
export const name = 'Платеж принят';
|
|
23
|
+
export const id = slugify(name);
|
|
24
|
+
|
|
25
|
+
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
26
|
+
.create<IWorkflow>()
|
|
27
|
+
.name(name)
|
|
28
|
+
.workflowId(id)
|
|
29
|
+
.description('Уведомление о успешном приёме платежа')
|
|
30
|
+
.payloadSchema(paymentCompletedPayloadSchema)
|
|
31
|
+
.tags(['user']) // Для всех пользователей
|
|
32
|
+
.addSteps([
|
|
33
|
+
createEmailStep(
|
|
34
|
+
'payment-completed-email',
|
|
35
|
+
'Платеж успешно принят',
|
|
36
|
+
'Уважаемый {{payload.userName}}!<br><br>Ваш платеж успешно принят и отправлен в обработку.<br><br>Сумма: <strong>{{payload.paymentAmount}} {{payload.paymentCurrency}}</strong><br><br>Дата: {{payload.paymentDate}}<br><br>Подробная информация доступна по ссылке: {{payload.paymentUrl}}'
|
|
37
|
+
),
|
|
38
|
+
createInAppStep(
|
|
39
|
+
'payment-completed-notification',
|
|
40
|
+
'Платеж принят',
|
|
41
|
+
'Платеж на сумму {{payload.paymentAmount}} {{payload.paymentCurrency}} успешно завершен'
|
|
42
|
+
),
|
|
43
|
+
createPushStep(
|
|
44
|
+
'payment-completed-push',
|
|
45
|
+
'Платеж принят',
|
|
46
|
+
'Платеж {{payload.paymentAmount}} {{payload.paymentCurrency}} завершен'
|
|
47
|
+
),
|
|
48
|
+
])
|
|
49
|
+
.build();
|
|
50
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
// Схема для reset-key воркфлоу
|
|
8
|
+
export const resetKeyPayloadSchema = z.object({
|
|
9
|
+
resetUrl: z.string(),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export type IPayload = z.infer<typeof resetKeyPayloadSchema>;
|
|
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('Уведомление о восстановлении доступа к аккаунту')
|
|
24
|
+
.payloadSchema(resetKeyPayloadSchema)
|
|
25
|
+
.tags(['auth'])
|
|
26
|
+
.addSteps([
|
|
27
|
+
createEmailStep(
|
|
28
|
+
'reset-key-email',
|
|
29
|
+
'Восстановление доступа',
|
|
30
|
+
'Мы получили запрос на перевыпуск приватного ключа,<br><br>' +
|
|
31
|
+
'Для перевыпуска нажмите на ссылку: <a href="{{payload.resetUrl}}">{{payload.resetUrl}}</a><br><br>' +
|
|
32
|
+
'Время действия ссылки - 10 минут.<br><br>' +
|
|
33
|
+
'Если вы не запрашивали перевыпуск ключа - проигнорируйте это сообщение.'
|
|
34
|
+
),
|
|
35
|
+
])
|
|
36
|
+
.build();
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { WorkflowDefinition } from '../../types';
|
|
3
|
+
import { WorkflowBuilder } from '../../base/workflow-builder';
|
|
4
|
+
import { createEmailStep, createInAppStep, createPushStep } from '../../base/defaults';
|
|
5
|
+
import { BaseWorkflowPayload } from '../../types';
|
|
6
|
+
import { slugify } from '../../utils';
|
|
7
|
+
|
|
8
|
+
// Схема для server-provisioned воркфлоу
|
|
9
|
+
export const serverProvisionedPayloadSchema = z.object({
|
|
10
|
+
cooperativeName: z.string(),
|
|
11
|
+
domain: z.string(),
|
|
12
|
+
serverIp: z.string().optional(),
|
|
13
|
+
provisionedAt: z.string(),
|
|
14
|
+
});
|
|
15
|
+
export type IPayload = z.infer<typeof serverProvisionedPayloadSchema>;
|
|
16
|
+
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
17
|
+
|
|
18
|
+
export const name = 'Сервер предоставлен';
|
|
19
|
+
export const id = slugify(name);
|
|
20
|
+
|
|
21
|
+
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
22
|
+
.create<IWorkflow>()
|
|
23
|
+
.name(name)
|
|
24
|
+
.workflowId(id)
|
|
25
|
+
.description('Уведомления о успешной поставке сервера для кооператива')
|
|
26
|
+
.payloadSchema(serverProvisionedPayloadSchema)
|
|
27
|
+
.tags(['server', 'hosting', 'provisioning', 'provider'])
|
|
28
|
+
.addSteps([
|
|
29
|
+
createEmailStep(
|
|
30
|
+
'server-provisioned-email',
|
|
31
|
+
'Сервер успешно предоставлен - {{payload.cooperativeName}}',
|
|
32
|
+
'Здравствуйте!<br><br>Уведомляем вас о том, что сервер для кооператива <strong>{{payload.cooperativeName}}</strong> был успешно предоставлен и готов к работе.<br><br><strong>Детали сервера:</strong><br>- Домен: {{payload.domain}}<br>{{#if payload.serverIp}}- IP адрес: {{payload.serverIp}}<br>{{/if}}- Дата предоставления: {{payload.provisionedAt}}<br><br>Сервер теперь доступен по адресу: <a href="https://{{payload.domain}}">https://{{payload.domain}}</a><br><br>В ближайшее время будет выполнена установка программного обеспечения кооператива.<br><br>С уважением,<br>Команда технической поддержки'
|
|
33
|
+
),
|
|
34
|
+
createInAppStep(
|
|
35
|
+
'server-provisioned-notification',
|
|
36
|
+
'Сервер предоставлен',
|
|
37
|
+
'Сервер для кооператива {{payload.cooperativeName}} успешно предоставлен и готов к установке ПО.'
|
|
38
|
+
),
|
|
39
|
+
createPushStep(
|
|
40
|
+
'server-provisioned-push',
|
|
41
|
+
'Сервер предоставлен - {{payload.cooperativeName}}',
|
|
42
|
+
'Сервер активирован и готов к установке программного обеспечения!'
|
|
43
|
+
),
|
|
44
|
+
])
|
|
45
|
+
.build();
|