@orchesty/connector-raynet-crm 1.0.0

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 (118) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +190 -0
  3. package/coverage/clover.xml +283 -0
  4. package/coverage/coverage-final.json +13 -0
  5. package/coverage/lcov-report/base.css +224 -0
  6. package/coverage/lcov-report/block-navigation.js +87 -0
  7. package/coverage/lcov-report/favicon.png +0 -0
  8. package/coverage/lcov-report/index.html +161 -0
  9. package/coverage/lcov-report/prettify.css +1 -0
  10. package/coverage/lcov-report/prettify.js +2 -0
  11. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  12. package/coverage/lcov-report/sorter.js +210 -0
  13. package/coverage/lcov-report/src/Batch/RaynetCRMGetActivities.ts.html +385 -0
  14. package/coverage/lcov-report/src/Batch/RaynetCRMGetClients.ts.html +679 -0
  15. package/coverage/lcov-report/src/Batch/RaynetCRMGetContactPersons.ts.html +553 -0
  16. package/coverage/lcov-report/src/Batch/RaynetCRMSubscribeWebhook.ts.html +355 -0
  17. package/coverage/lcov-report/src/Batch/RaynetCRMUnregisterWebhook.ts.html +241 -0
  18. package/coverage/lcov-report/src/Batch/index.html +176 -0
  19. package/coverage/lcov-report/src/Connector/RaynetCRMGetVoipByTel.ts.html +856 -0
  20. package/coverage/lcov-report/src/Connector/RaynetCRMUniversalActivityDetail.ts.html +448 -0
  21. package/coverage/lcov-report/src/Connector/RaynetCRMUniversalCreateActivity.ts.html +223 -0
  22. package/coverage/lcov-report/src/Connector/RaynetCRMUniversalDeleteActivity.ts.html +184 -0
  23. package/coverage/lcov-report/src/Connector/RaynetCRMUniversalUpdateActivity.ts.html +205 -0
  24. package/coverage/lcov-report/src/Connector/index.html +176 -0
  25. package/coverage/lcov-report/src/RaynetCRMApplication.ts.html +331 -0
  26. package/coverage/lcov-report/src/index.html +116 -0
  27. package/coverage/lcov-report/test/dataProvider.ts.html +205 -0
  28. package/coverage/lcov-report/test/index.html +116 -0
  29. package/coverage/lcov.info +465 -0
  30. package/dist/Batch/RaynetCRMGetActivities.d.ts +58 -0
  31. package/dist/Batch/RaynetCRMGetActivities.js +38 -0
  32. package/dist/Batch/RaynetCRMGetClients.d.ts +161 -0
  33. package/dist/Batch/RaynetCRMGetClients.js +33 -0
  34. package/dist/Batch/RaynetCRMGetContactPersons.d.ts +119 -0
  35. package/dist/Batch/RaynetCRMGetContactPersons.js +33 -0
  36. package/dist/Batch/RaynetCRMSubscribeWebhook.d.ts +15 -0
  37. package/dist/Batch/RaynetCRMSubscribeWebhook.js +64 -0
  38. package/dist/Batch/RaynetCRMUnregisterWebhook.d.ts +7 -0
  39. package/dist/Batch/RaynetCRMUnregisterWebhook.js +39 -0
  40. package/dist/Connector/RaynetCRMGetVoipByTel.d.ts +225 -0
  41. package/dist/Connector/RaynetCRMGetVoipByTel.js +27 -0
  42. package/dist/Connector/RaynetCRMUniversalActivityDetail.d.ts +86 -0
  43. package/dist/Connector/RaynetCRMUniversalActivityDetail.js +31 -0
  44. package/dist/Connector/RaynetCRMUniversalCreateActivity.d.ts +18 -0
  45. package/dist/Connector/RaynetCRMUniversalCreateActivity.js +25 -0
  46. package/dist/Connector/RaynetCRMUniversalDeleteActivity.d.ts +12 -0
  47. package/dist/Connector/RaynetCRMUniversalDeleteActivity.js +22 -0
  48. package/dist/Connector/RaynetCRMUniversalUpdateActivity.d.ts +11 -0
  49. package/dist/Connector/RaynetCRMUniversalUpdateActivity.js +27 -0
  50. package/dist/RaynetCRMApplication.d.ts +19 -0
  51. package/dist/RaynetCRMApplication.js +92 -0
  52. package/dist/package.json +23 -0
  53. package/jest.config.js +13 -0
  54. package/package.json +23 -0
  55. package/src/Batch/RaynetCRMGetActivities.ts +100 -0
  56. package/src/Batch/RaynetCRMGetClients.ts +198 -0
  57. package/src/Batch/RaynetCRMGetContactPersons.ts +156 -0
  58. package/src/Batch/RaynetCRMSubscribeWebhook.ts +90 -0
  59. package/src/Batch/RaynetCRMUnregisterWebhook.ts +52 -0
  60. package/src/Batch/__tests__/Data/RaynetCRMGetActivities/from-input.json +8 -0
  61. package/src/Batch/__tests__/Data/RaynetCRMGetActivities/from-mock.json +64 -0
  62. package/src/Batch/__tests__/Data/RaynetCRMGetActivities/from-output.json +11 -0
  63. package/src/Batch/__tests__/Data/RaynetCRMGetActivities/input.json +6 -0
  64. package/src/Batch/__tests__/Data/RaynetCRMGetActivities/mock.json +64 -0
  65. package/src/Batch/__tests__/Data/RaynetCRMGetActivities/output.json +11 -0
  66. package/src/Batch/__tests__/Data/RaynetCRMGetClients/email-input.json +8 -0
  67. package/src/Batch/__tests__/Data/RaynetCRMGetClients/email-mock.json +157 -0
  68. package/src/Batch/__tests__/Data/RaynetCRMGetClients/email-output.json +11 -0
  69. package/src/Batch/__tests__/Data/RaynetCRMGetClients/input.json +6 -0
  70. package/src/Batch/__tests__/Data/RaynetCRMGetClients/mock.json +157 -0
  71. package/src/Batch/__tests__/Data/RaynetCRMGetClients/output.json +11 -0
  72. package/src/Batch/__tests__/Data/RaynetCRMGetContactPersons/email-input.json +8 -0
  73. package/src/Batch/__tests__/Data/RaynetCRMGetContactPersons/email-mock.json +157 -0
  74. package/src/Batch/__tests__/Data/RaynetCRMGetContactPersons/email-output.json +11 -0
  75. package/src/Batch/__tests__/Data/RaynetCRMGetContactPersons/input.json +6 -0
  76. package/src/Batch/__tests__/Data/RaynetCRMGetContactPersons/mock.json +112 -0
  77. package/src/Batch/__tests__/Data/RaynetCRMGetContactPersons/output.json +11 -0
  78. package/src/Batch/__tests__/Data/RaynetCRMSubscribeWebhook/input.json +6 -0
  79. package/src/Batch/__tests__/Data/RaynetCRMSubscribeWebhook/mock.json +10 -0
  80. package/src/Batch/__tests__/Data/RaynetCRMSubscribeWebhook/output.json +6 -0
  81. package/src/Batch/__tests__/Data/RaynetCRMUnregisterWebhook/input.json +6 -0
  82. package/src/Batch/__tests__/Data/RaynetCRMUnregisterWebhook/mock.json +7 -0
  83. package/src/Batch/__tests__/Data/RaynetCRMUnregisterWebhook/output.json +6 -0
  84. package/src/Batch/__tests__/RaynetCRMGetActivities.ts +23 -0
  85. package/src/Batch/__tests__/RaynetCRMGetClients.ts +23 -0
  86. package/src/Batch/__tests__/RaynetCRMGetContactPersons.ts +23 -0
  87. package/src/Batch/__tests__/RaynetCRMSubscribeWebhook.ts +18 -0
  88. package/src/Batch/__tests__/RaynetCRMUnregisterWebhook.ts +42 -0
  89. package/src/Connector/RaynetCRMGetVoipByTel.ts +257 -0
  90. package/src/Connector/RaynetCRMUniversalActivityDetail.ts +121 -0
  91. package/src/Connector/RaynetCRMUniversalCreateActivity.ts +46 -0
  92. package/src/Connector/RaynetCRMUniversalDeleteActivity.ts +33 -0
  93. package/src/Connector/RaynetCRMUniversalUpdateActivity.ts +40 -0
  94. package/src/Connector/__tests__/Data/RaynetCRMGetVoipByTel/input.json +8 -0
  95. package/src/Connector/__tests__/Data/RaynetCRMGetVoipByTel/mock.json +216 -0
  96. package/src/Connector/__tests__/Data/RaynetCRMGetVoipByTel/output.json +217 -0
  97. package/src/Connector/__tests__/Data/RaynetCRMUniversalActivityDetail/input.json +22 -0
  98. package/src/Connector/__tests__/Data/RaynetCRMUniversalActivityDetail/mock.json +84 -0
  99. package/src/Connector/__tests__/Data/RaynetCRMUniversalActivityDetail/output.json +83 -0
  100. package/src/Connector/__tests__/Data/RaynetCRMUniversalCreateActivity/input.json +83 -0
  101. package/src/Connector/__tests__/Data/RaynetCRMUniversalCreateActivity/mock.json +10 -0
  102. package/src/Connector/__tests__/Data/RaynetCRMUniversalCreateActivity/output.json +11 -0
  103. package/src/Connector/__tests__/Data/RaynetCRMUniversalDeleteActivity/input.json +9 -0
  104. package/src/Connector/__tests__/Data/RaynetCRMUniversalDeleteActivity/mock.json +7 -0
  105. package/src/Connector/__tests__/Data/RaynetCRMUniversalDeleteActivity/output.json +8 -0
  106. package/src/Connector/__tests__/Data/RaynetCRMUniversalUpdateActivity/input.json +83 -0
  107. package/src/Connector/__tests__/Data/RaynetCRMUniversalUpdateActivity/mock.json +7 -0
  108. package/src/Connector/__tests__/Data/RaynetCRMUniversalUpdateActivity/output.json +8 -0
  109. package/src/Connector/__tests__/RaynetCRMGetVoipByTel.ts +18 -0
  110. package/src/Connector/__tests__/RaynetCRMUniversalActivityDetail.ts +18 -0
  111. package/src/Connector/__tests__/RaynetCRMUniversalCreateActivity.ts +18 -0
  112. package/src/Connector/__tests__/RaynetCRMUniversalDeleteActivity.ts +18 -0
  113. package/src/Connector/__tests__/RaynetCRMUniversalUpdateActivity.ts +18 -0
  114. package/src/RaynetCRMApplication.ts +82 -0
  115. package/test/dataProvider.ts +40 -0
  116. package/tsconfig.json +8 -0
  117. package/tsconfig.prod.json +13 -0
  118. package/tsconfig.prod.tsbuildinfo +1 -0
@@ -0,0 +1,18 @@
1
+ import AConnector from '@orchesty/nodejs-sdk/dist/lib/Connector/AConnector';
2
+ import ProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/ProcessDto';
3
+ import { IActivityData } from './RaynetCRMUniversalActivityDetail';
4
+ export declare const NAME = "raynet-crm-universal-create-activity";
5
+ export default class RaynetCRMUniversalCreateActivity extends AConnector {
6
+ getName(): string;
7
+ processAction(dto: ProcessDto<IInput>): Promise<ProcessDto<IResponse>>;
8
+ }
9
+ export type IActivityOptionalData = Partial<IActivityData>;
10
+ export interface IInput extends IActivityOptionalData {
11
+ entityName: string;
12
+ }
13
+ export interface IResponse {
14
+ success: boolean;
15
+ data: {
16
+ id: number;
17
+ };
18
+ }
@@ -0,0 +1,25 @@
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.NAME = void 0;
7
+ const AConnector_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Connector/AConnector"));
8
+ const HttpMethods_1 = require("@orchesty/nodejs-sdk/dist/lib/Transport/HttpMethods");
9
+ const RaynetCRMUniversalActivityDetail_1 = require("./RaynetCRMUniversalActivityDetail");
10
+ exports.NAME = 'raynet-crm-universal-create-activity';
11
+ class RaynetCRMUniversalCreateActivity extends AConnector_1.default {
12
+ getName() {
13
+ return exports.NAME;
14
+ }
15
+ async processAction(dto) {
16
+ const { entityName, ...data } = dto.getJsonData();
17
+ if (entityName.toLowerCase() === 'task' && data.participants?.length) {
18
+ data.resolver = data.participants[0].id;
19
+ }
20
+ const req = await this.getApplication().getRequestDto(dto, await this.getApplicationInstallFromProcess(dto), HttpMethods_1.HttpMethods.PUT, (0, RaynetCRMUniversalActivityDetail_1.getEntityType)(entityName), data);
21
+ const resp = await this.getSender().send(req, [201]);
22
+ return dto.setNewJsonData(resp.getJsonBody());
23
+ }
24
+ }
25
+ exports.default = RaynetCRMUniversalCreateActivity;
@@ -0,0 +1,12 @@
1
+ import AConnector from '@orchesty/nodejs-sdk/dist/lib/Connector/AConnector';
2
+ import ProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/ProcessDto';
3
+ import { IResponse } from './RaynetCRMUniversalUpdateActivity';
4
+ export declare const NAME = "raynet-crm-universal-delete-activity";
5
+ export default class RaynetCRMUniversalDeleteActivity extends AConnector {
6
+ getName(): string;
7
+ processAction(dto: ProcessDto<IInput>): Promise<ProcessDto<IResponse>>;
8
+ }
9
+ export interface IInput {
10
+ entityName: string;
11
+ id: number;
12
+ }
@@ -0,0 +1,22 @@
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.NAME = void 0;
7
+ const AConnector_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Connector/AConnector"));
8
+ const HttpMethods_1 = require("@orchesty/nodejs-sdk/dist/lib/Transport/HttpMethods");
9
+ const RaynetCRMUniversalActivityDetail_1 = require("./RaynetCRMUniversalActivityDetail");
10
+ exports.NAME = 'raynet-crm-universal-delete-activity';
11
+ class RaynetCRMUniversalDeleteActivity extends AConnector_1.default {
12
+ getName() {
13
+ return exports.NAME;
14
+ }
15
+ async processAction(dto) {
16
+ const { entityName, id } = dto.getJsonData();
17
+ const req = await this.getApplication().getRequestDto(dto, await this.getApplicationInstallFromProcess(dto), HttpMethods_1.HttpMethods.DELETE, `${(0, RaynetCRMUniversalActivityDetail_1.getEntityType)(entityName)}/${id}`);
18
+ const resp = await this.getSender().send(req, [200]);
19
+ return dto.setNewJsonData(resp.getJsonBody());
20
+ }
21
+ }
22
+ exports.default = RaynetCRMUniversalDeleteActivity;
@@ -0,0 +1,11 @@
1
+ import AConnector from '@orchesty/nodejs-sdk/dist/lib/Connector/AConnector';
2
+ import ProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/ProcessDto';
3
+ import { IInput } from './RaynetCRMUniversalCreateActivity';
4
+ export declare const NAME = "raynet-crm-universal-update-activity";
5
+ export default class RaynetCRMUniversalUpdateActivity extends AConnector {
6
+ getName(): string;
7
+ processAction(dto: ProcessDto<IInput>): Promise<ProcessDto<IResponse>>;
8
+ }
9
+ export interface IResponse {
10
+ success: boolean;
11
+ }
@@ -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.NAME = void 0;
7
+ const AConnector_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Connector/AConnector"));
8
+ const HttpMethods_1 = require("@orchesty/nodejs-sdk/dist/lib/Transport/HttpMethods");
9
+ const RaynetCRMUniversalActivityDetail_1 = require("./RaynetCRMUniversalActivityDetail");
10
+ exports.NAME = 'raynet-crm-universal-update-activity';
11
+ class RaynetCRMUniversalUpdateActivity extends AConnector_1.default {
12
+ getName() {
13
+ return exports.NAME;
14
+ }
15
+ async processAction(dto) {
16
+ const { entityName, ...data } = dto.getJsonData();
17
+ delete data.owner;
18
+ delete data['rowInfo.updatedAt'];
19
+ if (entityName.toLowerCase() === 'task' && data.participants?.length) {
20
+ data.resolver = data.participants[0].id;
21
+ }
22
+ const req = await this.getApplication().getRequestDto(dto, await this.getApplicationInstallFromProcess(dto), HttpMethods_1.HttpMethods.POST, `${(0, RaynetCRMUniversalActivityDetail_1.getEntityType)(entityName)}/${data.id}`, data);
23
+ const resp = await this.getSender().send(req, [200]);
24
+ return dto.setNewJsonData(resp.getJsonBody());
25
+ }
26
+ }
27
+ exports.default = RaynetCRMUniversalUpdateActivity;
@@ -0,0 +1,19 @@
1
+ import { ApplicationInstall } from '@orchesty/nodejs-sdk/dist/lib/Application/Database/ApplicationInstall';
2
+ import FormStack from '@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/FormStack';
3
+ import WebhookSubscription from '@orchesty/nodejs-sdk/dist/lib/Application/Model/Webhook/WebhookSubscription';
4
+ import { ABasicApplication } from '@orchesty/nodejs-sdk/dist/lib/Authorization/Type/Basic/ABasicApplication';
5
+ import RequestDto from '@orchesty/nodejs-sdk/dist/lib/Transport/Curl/RequestDto';
6
+ import { HttpMethods } from '@orchesty/nodejs-sdk/dist/lib/Transport/HttpMethods';
7
+ import AProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/AProcessDto';
8
+ export declare const INSTANCE_NAME = "instanceName";
9
+ export declare const NAME = "raynet-crm";
10
+ export default class RaynetCRMApplication extends ABasicApplication {
11
+ protected readonly baseUrl: string;
12
+ getName(): string;
13
+ getPublicName(): string;
14
+ getDescription(): string;
15
+ getFormStack(): FormStack;
16
+ getLogo(): string;
17
+ getRequestDto(dto: AProcessDto, applicationInstall: ApplicationInstall, method: HttpMethods, url?: string, data?: unknown): RequestDto;
18
+ getWebhookSubscriptions(): WebhookSubscription[];
19
+ }
@@ -0,0 +1,92 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.NAME = exports.INSTANCE_NAME = void 0;
40
+ const CoreFormsEnum_1 = __importStar(require("@orchesty/nodejs-sdk/dist/lib/Application/Base/CoreFormsEnum"));
41
+ const Field_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/Field"));
42
+ const FieldType_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/FieldType"));
43
+ const Form_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/Form"));
44
+ const FormStack_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/FormStack"));
45
+ const ABasicApplication_1 = require("@orchesty/nodejs-sdk/dist/lib/Authorization/Type/Basic/ABasicApplication");
46
+ const RequestDto_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Transport/Curl/RequestDto"));
47
+ const Base64_1 = require("@orchesty/nodejs-sdk/dist/lib/Utils/Base64");
48
+ const Headers_1 = require("@orchesty/nodejs-sdk/dist/lib/Utils/Headers");
49
+ exports.INSTANCE_NAME = 'instanceName';
50
+ exports.NAME = 'raynet-crm';
51
+ class RaynetCRMApplication extends ABasicApplication_1.ABasicApplication {
52
+ baseUrl = 'https://app.raynet.cz/api/v2/';
53
+ getName() {
54
+ return exports.NAME;
55
+ }
56
+ getPublicName() {
57
+ return 'Raynet CRM';
58
+ }
59
+ getDescription() {
60
+ return 'RAYNET CRM is online software that helps salespeople and managers to keep track of business easily.';
61
+ }
62
+ getFormStack() {
63
+ const form = new Form_1.default(CoreFormsEnum_1.default.AUTHORIZATION_FORM, (0, CoreFormsEnum_1.getFormName)(CoreFormsEnum_1.default.AUTHORIZATION_FORM))
64
+ .addField(new Field_1.default(FieldType_1.default.TEXT, ABasicApplication_1.USER, 'User', undefined, true))
65
+ .addField(new Field_1.default(FieldType_1.default.TEXT, ABasicApplication_1.PASSWORD, 'ApiKey', undefined, true))
66
+ .addField(new Field_1.default(FieldType_1.default.TEXT, exports.INSTANCE_NAME, 'Instance name', undefined, true));
67
+ return new FormStack_1.default().addForm(form);
68
+ }
69
+ getLogo() {
70
+ return 'data:image/png;base64,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';
71
+ }
72
+ getRequestDto(dto, applicationInstall, method, url, data) {
73
+ const request = new RequestDto_1.default(`${this.baseUrl}${url}`, method, dto);
74
+ const settings = applicationInstall.getSettings();
75
+ const user = settings[CoreFormsEnum_1.default.AUTHORIZATION_FORM][ABasicApplication_1.USER];
76
+ const password = settings[CoreFormsEnum_1.default.AUTHORIZATION_FORM][ABasicApplication_1.PASSWORD];
77
+ const instanceName = settings[CoreFormsEnum_1.default.AUTHORIZATION_FORM][exports.INSTANCE_NAME];
78
+ request.setHeaders({
79
+ [Headers_1.CommonHeaders.CONTENT_TYPE]: Headers_1.JSON_TYPE,
80
+ [Headers_1.CommonHeaders.AUTHORIZATION]: `Basic ${(0, Base64_1.encode)(`${user}:${password}`)}`,
81
+ 'X-Instance-Name': instanceName,
82
+ });
83
+ if (data) {
84
+ request.setJsonBody(data);
85
+ }
86
+ return request;
87
+ }
88
+ getWebhookSubscriptions() {
89
+ return [];
90
+ }
91
+ }
92
+ exports.default = RaynetCRMApplication;
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@orchesty/connector-raynet-crm",
3
+ "description": "",
4
+ "version": "0.0.0",
5
+ "license": "Apache-2.0",
6
+ "url": "https://github.com/Orchesty/orchesty-nodejs-connectors",
7
+ "repository": "https://github.com/Orchesty/orchesty-nodejs-connectors",
8
+ "scripts": {
9
+ "build": "rm -rf dist && rm -rf tsconfig.prod.tsbuildinfo && tsc -d -p tsconfig.prod.json && cp package.json ./dist/package.json",
10
+ "test": "jest --coverage --forceExit --passWithNoTests",
11
+ "lint": "eslint src test --fix",
12
+ "lint-ci": "eslint src test"
13
+ },
14
+ "keywords": [],
15
+ "author": "info@hanaboso.com",
16
+ "dependencies": {
17
+ "@orchesty/nodejs-sdk": "^4.3.6",
18
+ "http-status-codes": "^2.3.0"
19
+ },
20
+ "engines": {
21
+ "node": ">=24"
22
+ }
23
+ }
package/jest.config.js ADDED
@@ -0,0 +1,13 @@
1
+ const baseConfig = require('../../jest.config.js');
2
+
3
+ module.exports = {
4
+ ...baseConfig,
5
+ roots: ["<rootDir>/src"],
6
+ setupFiles: ["<rootDir>/../../.jest/testEnvs.ts"],
7
+ setupFilesAfterEnv: ["<rootDir>/../../.jest/testLifecycle.ts"],
8
+ globalSetup: "<rootDir>/../../.jest/globalSetup.ts",
9
+ moduleNameMapper: {
10
+ "^@orchesty/nodejs-connectors/test/(.*)$": "<rootDir>/../../test/$1",
11
+ "^@orchesty/nodejs-connectors/lib/(.*)$": "<rootDir>/../../lib/$1",
12
+ },
13
+ }
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@orchesty/connector-raynet-crm",
3
+ "description": "",
4
+ "version": "1.0.0",
5
+ "license": "Apache-2.0",
6
+ "url": "https://github.com/Orchesty/orchesty-nodejs-connectors",
7
+ "repository": "https://github.com/Orchesty/orchesty-nodejs-connectors",
8
+ "keywords": [],
9
+ "author": "info@hanaboso.com",
10
+ "dependencies": {
11
+ "@orchesty/nodejs-sdk": "^4.3.6",
12
+ "http-status-codes": "^2.3.0"
13
+ },
14
+ "engines": {
15
+ "node": ">=24"
16
+ },
17
+ "scripts": {
18
+ "build": "rm -rf dist && rm -rf tsconfig.prod.tsbuildinfo && tsc -d -p tsconfig.prod.json && cp package.json ./dist/package.json",
19
+ "test": "jest --coverage --forceExit --passWithNoTests",
20
+ "lint": "eslint src test --fix",
21
+ "lint-ci": "eslint src test"
22
+ }
23
+ }
@@ -0,0 +1,100 @@
1
+ import ABatchNode from '@orchesty/nodejs-sdk/dist/lib/Batch/ABatchNode';
2
+ import { HttpMethods } from '@orchesty/nodejs-sdk/dist/lib/Transport/HttpMethods';
3
+ import BatchProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/BatchProcessDto';
4
+
5
+ export const NAME = 'raynet-crm-get-activities';
6
+ export const LAST_RUN_KEY = 'lastRunListActivities';
7
+ export const LIMIT = 1000;
8
+
9
+ export default class RaynetCRMGetActivities extends ABatchNode {
10
+
11
+ public getName(): string {
12
+ return NAME;
13
+ }
14
+
15
+ public async processAction(dto: BatchProcessDto<IInput>): Promise<BatchProcessDto> {
16
+ const { from } = dto.getJsonData();
17
+ const appInstall = await this.getApplicationInstallFromProcess(dto);
18
+ const lastRun = await appInstall.getNonEncryptedSettings()[LAST_RUN_KEY];
19
+ const lastRunDate = lastRun ? new Date(lastRun) : new Date(0);
20
+ const formattedDate = `${lastRunDate.getFullYear()}-${lastRunDate.getMonth() + 1}-${lastRunDate.getDate()}%20${lastRunDate.getHours()}:${lastRunDate.getMinutes()}`;
21
+
22
+ const page = Number(dto.getBatchCursor('0'));
23
+
24
+ const req = await this.getApplication().getRequestDto(
25
+ dto,
26
+ await this.getApplicationInstallFromProcess(dto),
27
+ HttpMethods.GET,
28
+ `activity?offset=${page}&limit=${LIMIT}&rowInfo.lastModifiedAt[GE]=${formattedDate}&dateFormat=ISO8601${from ? `&scheduledFrom=${from}` : ''}`,
29
+ );
30
+ const resp = await this.getSender().send<IResponse>(req, [200]);
31
+ const { totalCount } = resp.getJsonBody();
32
+
33
+ if (totalCount && totalCount > LIMIT * (page + 1)) {
34
+ dto.setBatchCursor(String(page + 1));
35
+ } else {
36
+ appInstall.addNonEncryptedSettings({
37
+ [LAST_RUN_KEY]: new Date().toISOString(),
38
+ });
39
+ await this.getDbClient().getApplicationRepository().update(appInstall);
40
+ }
41
+
42
+ return dto.setItemList(resp.getJsonBody().data);
43
+ }
44
+
45
+ }
46
+
47
+ export interface IInput {
48
+ from?: string;
49
+ }
50
+
51
+ /* eslint-disable @typescript-eslint/naming-convention */
52
+ export interface IResponse {
53
+ success: boolean;
54
+ totalCount: number;
55
+ data: IOutput[];
56
+ }
57
+
58
+ export interface IOutput {
59
+ _entityName: string;
60
+ id: number;
61
+ title: string;
62
+ personal: boolean;
63
+ status: string;
64
+ priority: string;
65
+ scheduledFrom: string;
66
+ scheduledTill: string;
67
+ description: string;
68
+ tags: unknown[];
69
+ 'rowInfo.createdAt': string;
70
+ 'rowInfo.createdBy': string;
71
+ 'rowInfo.updatedAt': string;
72
+ securityLevel: {
73
+ id: number;
74
+ name: string;
75
+ };
76
+ _version: number;
77
+ customFields: unknown;
78
+ participants: {
79
+ owner: boolean;
80
+ role: string;
81
+ name: string;
82
+ person: number;
83
+ }[];
84
+ owner: {
85
+ id: number;
86
+ fullName: string;
87
+ };
88
+ meetingPlace: string;
89
+ companyAddress: unknown;
90
+ recurrence: {
91
+ id: number,
92
+ count: number,
93
+ endDate: string,
94
+ interval: string,
95
+ recurrenceDay: number,
96
+ startDate: string
97
+ };
98
+ }
99
+
100
+ /* eslint-enable @typescript-eslint/naming-convention */
@@ -0,0 +1,198 @@
1
+ import ABatchNode from '@orchesty/nodejs-sdk/dist/lib/Batch/ABatchNode';
2
+ import ResponseDto from '@orchesty/nodejs-sdk/dist/lib/Transport/Curl/ResponseDto';
3
+ import { HttpMethods } from '@orchesty/nodejs-sdk/dist/lib/Transport/HttpMethods';
4
+ import BatchProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/BatchProcessDto';
5
+
6
+ export const NAME = 'raynet-crm-get-clients';
7
+ export const LIMIT = 1000;
8
+
9
+ export default class RaynetCRMGetClients extends ABatchNode {
10
+
11
+ protected limit = LIMIT;
12
+
13
+ public getName(): string {
14
+ return NAME;
15
+ }
16
+
17
+ public async processAction(dto: BatchProcessDto<IInput>): Promise<BatchProcessDto> {
18
+ const email = this.getData(dto);
19
+ const page = Number(dto.getBatchCursor('0'));
20
+
21
+ const req = await this.getApplication().getRequestDto(
22
+ dto,
23
+ await this.getApplicationInstallFromProcess(dto),
24
+ HttpMethods.GET,
25
+ `company?offset=${page}&limit=${this.limit}${email ? `&primaryAddress-contactInfo.email=${email}` : ''}`,
26
+ );
27
+
28
+ return this.processResponse(dto, await this.getSender().send<IResponse>(req, [200]), page);
29
+ }
30
+
31
+ protected getData(dto: BatchProcessDto<IInput>): string {
32
+ return dto.getJsonData().email ?? '';
33
+ }
34
+
35
+ protected processResponse(dto: BatchProcessDto, resp: ResponseDto<IResponse>, page: number): BatchProcessDto {
36
+ const { totalCount } = resp.getJsonBody();
37
+
38
+ if (totalCount && totalCount > this.limit * (page + 1)) {
39
+ dto.setBatchCursor(String(page + 1));
40
+ }
41
+
42
+ return dto.setItemList(resp.getJsonBody().data);
43
+ }
44
+
45
+ }
46
+
47
+ export interface IInput {
48
+ email?: string;
49
+ }
50
+
51
+ /* eslint-disable @typescript-eslint/naming-convention */
52
+ export interface IResponse {
53
+ success: string;
54
+ totalCount: number;
55
+ data: {
56
+ id: number;
57
+ name: string;
58
+ titleBefore?: unknown;
59
+ firstName?: unknown;
60
+ lastName?: unknown;
61
+ titleAfter?: unknown;
62
+ person: boolean;
63
+ role: string;
64
+ state: string;
65
+ rating: string;
66
+ owner: {
67
+ id: number;
68
+ fullName: string;
69
+ };
70
+ regNumber: string;
71
+ taxNumber: string;
72
+ taxNumber2?: unknown;
73
+ taxPayer: string;
74
+ bankAccount?: unknown;
75
+ databox?: unknown;
76
+ court?: unknown;
77
+ primaryAddress: {
78
+ id: number;
79
+ primary: boolean;
80
+ contactAddress: boolean;
81
+ address: {
82
+ id: number;
83
+ city: string;
84
+ country: string;
85
+ name: string;
86
+ province: string;
87
+ street: string;
88
+ zipCode: string;
89
+ lat: number;
90
+ lng: number;
91
+ };
92
+ territory: {
93
+ id: number;
94
+ value: string;
95
+ };
96
+ contactInfo: {
97
+ email: string;
98
+ email2: string;
99
+ primary: boolean;
100
+ tel1: string;
101
+ tel1Type: string;
102
+ tel2: string;
103
+ tel2Type: string;
104
+ www: string;
105
+ otherContact?: unknown;
106
+ };
107
+ extIds?: unknown;
108
+ };
109
+ contactAddress: {
110
+ id: number;
111
+ primary: boolean;
112
+ contactAddress: boolean;
113
+ address: {
114
+ id: number;
115
+ city: string;
116
+ country: string;
117
+ name: string;
118
+ province: string;
119
+ street: string;
120
+ zipCode: string;
121
+ lat?: unknown;
122
+ lng?: unknown;
123
+ };
124
+ territory: {
125
+ id: number;
126
+ value: string;
127
+ };
128
+ contactInfo: {
129
+ email: string;
130
+ email2?: unknown;
131
+ primary: boolean;
132
+ tel1: string;
133
+ tel1Type: string;
134
+ tel2: string;
135
+ tel2Type: string;
136
+ www?: unknown;
137
+ otherContact?: unknown;
138
+ };
139
+ extIds?: unknown;
140
+ };
141
+ category: {
142
+ id: number;
143
+ value: string;
144
+ };
145
+ turnover: {
146
+ id: number;
147
+ value: string;
148
+ };
149
+ economyActivity: {
150
+ id: number;
151
+ value: string;
152
+ };
153
+ companyClassification1: {
154
+ id: number;
155
+ value: string;
156
+ };
157
+ companyClassification2: {
158
+ id: number;
159
+ value: string;
160
+ };
161
+ companyClassification3: {
162
+ id: number;
163
+ value: string;
164
+ };
165
+ paymentTerm: {
166
+ id: number;
167
+ value: string;
168
+ };
169
+ contactSource: {
170
+ id: number;
171
+ value: string;
172
+ };
173
+ birthday?: unknown;
174
+ notice: string;
175
+ tags: string[];
176
+ customFields?: unknown;
177
+ 'rowInfo.createdAt': string;
178
+ 'rowInfo.createdBy': string;
179
+ 'rowInfo.updatedAt': string;
180
+ 'rowInfo.updatedBy': string;
181
+ 'rowInfo.rowAccess'?: unknown;
182
+ 'rowInfo.rowState'?: unknown;
183
+ securityLevel: {
184
+ id: number;
185
+ name: string;
186
+ };
187
+ inlineGdpr: {
188
+ id: number;
189
+ validFrom: string;
190
+ validTill: string;
191
+ legalTitle: string;
192
+ templateName: string;
193
+ gdprTemplate: number;
194
+ }[];
195
+ _version: number;
196
+ }[];
197
+ }
198
+ /* eslint-enable @typescript-eslint/naming-convention */