@coopenomics/notifications 2026.3.24-7 → 2026.4.26-4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coopenomics/notifications",
3
- "version": "2026.3.24-7",
3
+ "version": "2026.4.26-4",
4
4
  "description": "Библиотека типобезопасных workflow-уведомлений для Novu",
5
5
  "type": "module",
6
6
  "private": false,
@@ -53,5 +53,5 @@
53
53
  "require": "./dist/index.cjs"
54
54
  }
55
55
  },
56
- "gitHead": "b8030160775f33f3944644fa35b883c946f30e3d"
56
+ "gitHead": "9a983e67fefa1c70125a37ddbdc0ffe9d9ea60ba"
57
57
  }
@@ -0,0 +1,52 @@
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
+ export const chatcoopCalendarEventCreatedPayloadSchema = z.object({
9
+ coopShortName: z.string(),
10
+ title: z.string(),
11
+ description: z.string().optional(),
12
+ startDate: z.string(),
13
+ startTime: z.string(),
14
+ endDate: z.string(),
15
+ endTime: z.string(),
16
+ timezone: z.string(),
17
+ roomLabel: z.string(),
18
+ eventUrl: z.string(),
19
+ actorUsername: z.string(),
20
+ });
21
+
22
+ export type IPayload = z.infer<typeof chatcoopCalendarEventCreatedPayloadSchema>;
23
+
24
+ export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
25
+
26
+ export const name = 'Уведомление о новом событии календаря кооператива';
27
+ export const id = slugify(name);
28
+
29
+ export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder.create<IWorkflow>()
30
+ .name(name)
31
+ .workflowId(id)
32
+ .description('Создание события в календаре кооператива (стол связи): рассылка пайщикам')
33
+ .payloadSchema(chatcoopCalendarEventCreatedPayloadSchema)
34
+ .tags(['user'])
35
+ .addSteps([
36
+ createEmailStep(
37
+ 'chatcoop-cal-created-email',
38
+ 'Новое событие в календаре {{payload.coopShortName}}: {{payload.title}}',
39
+ 'Уважаемый пайщик!<br><br>В календаре кооператива создано новое событие.<br><br><strong>{{payload.title}}</strong><br><br>Начало: {{payload.startDate}} в {{payload.startTime}} ({{payload.timezone}})<br>Окончание: {{payload.endDate}} в {{payload.endTime}} ({{payload.timezone}})<br>Комната: {{payload.roomLabel}}<br>Автор: {{payload.actorUsername}}{% if payload.description %}<br><br>Описание:<div style="white-space:pre-wrap;">{{payload.description}}</div>{% endif %}<br><br>Открыть комнату на столе связи:<br><a href="{{payload.eventUrl}}">{{payload.eventUrl}}</a><br><br>С уважением, {{payload.coopShortName}}.'
40
+ ),
41
+ createInAppStep(
42
+ 'chatcoop-cal-created-inapp',
43
+ 'Новое событие: {{payload.title}}',
44
+ '{{payload.startDate}} {{payload.startTime}} ({{payload.timezone}}), {{payload.roomLabel}}{% if payload.description %}. {{payload.description}}{% endif %}'
45
+ ),
46
+ createPushStep(
47
+ 'chatcoop-cal-created-push',
48
+ 'Календарь: {{payload.title}}',
49
+ '{{payload.startDate}} {{payload.startTime}} ({{payload.timezone}})'
50
+ ),
51
+ ])
52
+ .build();
@@ -0,0 +1,52 @@
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
+ export const chatcoopCalendarEventUpdatedPayloadSchema = z.object({
9
+ coopShortName: z.string(),
10
+ title: z.string(),
11
+ description: z.string().optional(),
12
+ startDate: z.string(),
13
+ startTime: z.string(),
14
+ endDate: z.string(),
15
+ endTime: z.string(),
16
+ timezone: z.string(),
17
+ roomLabel: z.string(),
18
+ eventUrl: z.string(),
19
+ actorUsername: z.string(),
20
+ });
21
+
22
+ export type IPayload = z.infer<typeof chatcoopCalendarEventUpdatedPayloadSchema>;
23
+
24
+ export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
25
+
26
+ export const name = 'Уведомление об изменении события календаря кооператива';
27
+ export const id = slugify(name);
28
+
29
+ export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder.create<IWorkflow>()
30
+ .name(name)
31
+ .workflowId(id)
32
+ .description('Изменение события в календаре кооператива: рассылка пайщикам с актуальным расписанием')
33
+ .payloadSchema(chatcoopCalendarEventUpdatedPayloadSchema)
34
+ .tags(['user'])
35
+ .addSteps([
36
+ createEmailStep(
37
+ 'chatcoop-cal-updated-email',
38
+ 'Изменено событие календаря {{payload.coopShortName}}: {{payload.title}}',
39
+ 'Уважаемый пайщик!<br><br>Событие в календаре кооператива обновлено. Актуальные данные:<br><br><strong>{{payload.title}}</strong><br><br>Начало: {{payload.startDate}} в {{payload.startTime}} ({{payload.timezone}})<br>Окончание: {{payload.endDate}} в {{payload.endTime}} ({{payload.timezone}})<br>Комната: {{payload.roomLabel}}<br>Изменил(а): {{payload.actorUsername}}{% if payload.description %}<br><br>Описание:<div style="white-space:pre-wrap;">{{payload.description}}</div>{% endif %}<br><br>Открыть на столе связи:<br><a href="{{payload.eventUrl}}">{{payload.eventUrl}}</a><br><br>С уважением, {{payload.coopShortName}}.'
40
+ ),
41
+ createInAppStep(
42
+ 'chatcoop-cal-updated-inapp',
43
+ 'Событие обновлено: {{payload.title}}',
44
+ '{{payload.startDate}} {{payload.startTime}} ({{payload.timezone}}), {{payload.roomLabel}}{% if payload.description %}. {{payload.description}}{% endif %}'
45
+ ),
46
+ createPushStep(
47
+ 'chatcoop-cal-updated-push',
48
+ 'Календарь обновлён: {{payload.title}}',
49
+ '{{payload.startDate}} {{payload.startTime}} ({{payload.timezone}})'
50
+ ),
51
+ ])
52
+ .build();
@@ -21,6 +21,8 @@ import { workflow as inviteWorkflow } from './invite';
21
21
  import { workflow as emailVerificationWorkflow } from './email-verification';
22
22
  import { workflow as serverProvisionedWorkflow } from './server-provisioned';
23
23
  import { workflow as decisionExpiredWorkflow } from './decision-expired';
24
+ import { workflow as chatcoopCalendarEventCreatedWorkflow } from './chatcoop-calendar-event-created';
25
+ import { workflow as chatcoopCalendarEventUpdatedWorkflow } from './chatcoop-calendar-event-updated';
24
26
 
25
27
  // Импортируем все воркфлоу
26
28
  export * as Welcome from './welcome';
@@ -44,6 +46,8 @@ export * as Invite from './invite';
44
46
  export * as EmailVerification from './email-verification';
45
47
  export * as ServerProvisioned from './server-provisioned';
46
48
  export * as DecisionExpired from './decision-expired';
49
+ export * as ChatCoopCalendarEventCreated from './chatcoop-calendar-event-created';
50
+ export * as ChatCoopCalendarEventUpdated from './chatcoop-calendar-event-updated';
47
51
 
48
52
  // Массив всех воркфлоу для автоматической регистрации
49
53
  export const allWorkflows: WorkflowDefinition[] = [
@@ -68,6 +72,8 @@ export const allWorkflows: WorkflowDefinition[] = [
68
72
  emailVerificationWorkflow,
69
73
  serverProvisionedWorkflow,
70
74
  decisionExpiredWorkflow,
75
+ chatcoopCalendarEventCreatedWorkflow,
76
+ chatcoopCalendarEventUpdatedWorkflow,
71
77
  ];
72
78
 
73
79
  // Экспортируем воркфлоу по ID для удобного доступа
@@ -16,6 +16,7 @@ export const meetInitialPayloadSchema = z.object({
16
16
  meetEndTime: z.string(),
17
17
  timezone: z.string(),
18
18
  meetUrl: z.string(),
19
+ details: z.string().optional(),
19
20
  });
20
21
 
21
22
  export type IPayload = z.infer<typeof meetInitialPayloadSchema>;
@@ -36,12 +37,12 @@ export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
36
37
  createEmailStep(
37
38
  'meet-initial-email',
38
39
  'Уведомление о общем собрании пайщиков №{{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
+ 'Уважаемый пайщик!<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>{% if payload.details %}<br><br>Дополнительная информация:<div style="white-space:pre-wrap;">{{payload.details}}</div>{% endif %}<br><br>С уважением, Совет {{payload.coopShortName}}.'
40
41
  ),
41
42
  createInAppStep(
42
43
  'meet-initial-notification',
43
44
  'Новое общее собрание №{{payload.meetId}}',
44
- 'Назначено собрание на {{payload.meetDate}} в {{payload.meetTime}}'
45
+ 'Назначено собрание на {{payload.meetDate}} в {{payload.meetTime}}{% if payload.details %}. {{payload.details}}{% endif %}'
45
46
  ),
46
47
  createPushStep(
47
48
  'meet-initial-push',
@@ -14,6 +14,7 @@ export const meetReminderStartPayloadSchema = z.object({
14
14
  meetTime: z.string(),
15
15
  timeDescription: z.string(),
16
16
  meetUrl: z.string(),
17
+ details: z.string().optional(),
17
18
  });
18
19
 
19
20
  export type IPayload = z.infer<typeof meetReminderStartPayloadSchema>;
@@ -34,12 +35,12 @@ export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
34
35
  createEmailStep(
35
36
  'meet-reminder-start-email',
36
37
  'Напоминание о предстоящем общем собрании №{{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
+ 'Уважаемый пайщик!<br><br>Напоминаем, что {{payload.timeDescription}} состоится общее собрание пайщиков №{{payload.meetId}} ({{payload.meetDate}} в {{payload.meetTime}}).<br><br>Для ознакомления с повесткой и подписи уведомления, пожалуйста, перейдите по ссылке:<br><a href="{{payload.meetUrl}}">{{payload.meetUrl}}</a>{% if payload.details %}<br><br>Дополнительная информация:<div style="white-space:pre-wrap;">{{payload.details}}</div>{% endif %}<br><br>С уважением, Совет {{payload.coopShortName}}.'
38
39
  ),
39
40
  createInAppStep(
40
41
  'meet-reminder-start-notification',
41
42
  'Напоминание о собрании №{{payload.meetId}}',
42
- 'Собрание начнется {{payload.timeDescription}}'
43
+ 'Собрание начнется {{payload.timeDescription}}{% if payload.details %}. {{payload.details}}{% endif %}'
43
44
  ),
44
45
  createPushStep(
45
46
  'meet-reminder-start-push',
@@ -14,6 +14,7 @@ export const meetStartedPayloadSchema = z.object({
14
14
  meetEndTime: z.string(),
15
15
  timezone: z.string(),
16
16
  meetUrl: z.string(),
17
+ details: z.string().optional(),
17
18
  });
18
19
 
19
20
  export type IPayload = z.infer<typeof meetStartedPayloadSchema>;
@@ -34,12 +35,12 @@ export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
34
35
  createEmailStep(
35
36
  'meet-started-email',
36
37
  'Собрание пайщиков №{{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
+ 'Уважаемый пайщик!<br><br>Сегодня началось общее собрание пайщиков №{{payload.meetId}}.<br>Собрание будет проходить до {{payload.meetEndDate}} {{payload.meetEndTime}} ({{payload.timezone}}).<br><br>Просим принять участие в голосовании по вопросам повестки дня.<br>Для голосования перейдите по ссылке:<br><a href="{{payload.meetUrl}}">{{payload.meetUrl}}</a>{% if payload.details %}<br><br>Дополнительная информация:<div style="white-space:pre-wrap;">{{payload.details}}</div>{% endif %}<br><br>С уважением, Совет {{payload.coopShortName}}.'
38
39
  ),
39
40
  createInAppStep(
40
41
  'meet-started-notification',
41
42
  'Собрание №{{payload.meetId}} началось',
42
- 'Примите участие в голосовании'
43
+ 'Примите участие в голосовании{% if payload.details %}. {{payload.details}}{% endif %}'
43
44
  ),
44
45
  createPushStep(
45
46
  'meet-started-push',