@haiiro/docuflow 0.0.1 → 0.0.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/{.twenty/output/manifest.json → manifest.json} +9 -9
- package/package.json +15 -3
- package/{.twenty/output/src → src}/front-components/docflow-documents.front-component.mjs +24 -24
- package/src/front-components/docflow-documents.front-component.tsx +21 -6
- package/{.twenty/output/src → src}/front-components/docflow-processes.front-component.mjs +18 -18
- package/{.twenty/output/src → src}/front-components/docflow-tasks.front-component.mjs +18 -18
- package/{.twenty/output/src → src}/front-components/process-steps.front-component.mjs +19 -19
- package/src/front-components/process-steps.front-component.tsx +6 -1
- package/{.twenty/output/src → src}/front-components/task-form.front-component.mjs +24 -24
- package/{.twenty/output/src → src}/logic-functions/launch-process.logic-function.mjs +14 -0
- package/src/logic-functions/launch-process.logic-function.ts +5 -0
- package/{.twenty/output/src → src}/logic-functions/save-launch-fields.logic-function.mjs +14 -0
- package/src/logic-functions/save-launch-fields.logic-function.ts +5 -0
- package/.gitignore +0 -43
- package/.nvmrc +0 -1
- package/.oxlintrc.json +0 -37
- package/.twenty/output/README.md +0 -128
- package/.twenty/output/package.json +0 -49
- package/.twenty/output/public/cover.svg +0 -15
- package/.twenty/output/public/logo.svg +0 -9
- package/.twenty/output/src/front-components/docflow-documents.front-component.tsx +0 -516
- package/.twenty/output/src/front-components/docflow-processes.front-component.tsx +0 -266
- package/.twenty/output/src/front-components/docflow-tasks.front-component.tsx +0 -303
- package/.twenty/output/src/front-components/process-steps.front-component.tsx +0 -286
- package/.twenty/output/src/front-components/task-form.front-component.tsx +0 -29
- package/.twenty/output/src/logic-functions/bitrix-app.logic-function.ts +0 -143
- package/.twenty/output/src/logic-functions/bitrix-event.logic-function.ts +0 -54
- package/.twenty/output/src/logic-functions/bitrix-install.logic-function.ts +0 -81
- package/.twenty/output/src/logic-functions/capture-file.logic-function.ts +0 -32
- package/.twenty/output/src/logic-functions/complete-task.logic-function.ts +0 -46
- package/.twenty/output/src/logic-functions/hand-out-form-step.logic-function.ts +0 -30
- package/.twenty/output/src/logic-functions/health-check.ts +0 -31
- package/.twenty/output/src/logic-functions/launch-parameters-step.logic-function.ts +0 -33
- package/.twenty/output/src/logic-functions/launch-process.logic-function.ts +0 -96
- package/.twenty/output/src/logic-functions/notify-bitrix-assignee.logic-function.ts +0 -85
- package/.twenty/output/src/logic-functions/on-attachment-created.logic-function.ts +0 -67
- package/.twenty/output/src/logic-functions/on-task-updated.logic-function.ts +0 -71
- package/.twenty/output/src/logic-functions/on-workflow-run-updated.logic-function.ts +0 -70
- package/.twenty/output/src/logic-functions/save-launch-fields.logic-function.ts +0 -73
- package/.twenty/output/src/logic-functions/save-step-settings.logic-function.ts +0 -90
- package/.twenty/output/src/logic-functions/save-task-form.logic-function.ts +0 -62
- package/.twenty/output/yarn.lock +0 -3292
- package/.yarn/install-state.gz +0 -0
- package/.yarnrc.yml +0 -1
- package/dist/tsconfig.spec.tsbuildinfo +0 -1
- package/src/__tests__/api-and-bitrix.test.ts +0 -89
- package/src/__tests__/form-fields.test.ts +0 -73
- package/src/__tests__/launch-parameters.test.ts +0 -75
- package/src/__tests__/step-settings.test.ts +0 -39
- package/src/__tests__/workflow-run.test.ts +0 -113
- package/src/application-config.ts +0 -58
- package/src/fields/company-documents.field.ts +0 -29
- package/src/fields/document-author.field.ts +0 -32
- package/src/fields/document-counterparty.field.ts +0 -32
- package/src/fields/document-folder-child-folders.field.ts +0 -23
- package/src/fields/document-folder-documents.field.ts +0 -24
- package/src/fields/document-folder-parent-folder.field.ts +0 -31
- package/src/fields/document-folder.field.ts +0 -32
- package/src/fields/document-responsible.field.ts +0 -32
- package/src/fields/member-authored-documents.field.ts +0 -29
- package/src/fields/member-responsible-documents.field.ts +0 -29
- package/src/fields/task-form-schema.field.ts +0 -21
- package/src/fields/task-form-values.field.ts +0 -21
- package/src/fields/task-instruction.field.ts +0 -21
- package/src/fields/task-section.field.ts +0 -36
- package/src/fields/task-workflow-run-id.field.ts +0 -21
- package/src/fields/task-workflow-step-id.field.ts +0 -21
- package/src/fields/task-workflow-thread-id.field.ts +0 -21
- package/src/fields/workflow-launch-fields.field.ts +0 -21
- package/src/fields/workflow-section.field.ts +0 -36
- package/src/front/api.ts +0 -56
- package/src/front/format.ts +0 -60
- package/src/front/hooks/use-async.ts +0 -54
- package/src/front/hooks/use-workspace-members.ts +0 -22
- package/src/front/types.ts +0 -48
- package/src/front/ui/components.tsx +0 -436
- package/src/front/ui/form-field-inputs.tsx +0 -187
- package/src/front/ui/form-fields-builder.tsx +0 -183
- package/src/front/ui/task-work-panel.tsx +0 -218
- package/src/navigation-menu-items/docflow.navigation-menu-item.ts +0 -15
- package/src/objects/document-folder.object.ts +0 -80
- package/src/objects/document.object.ts +0 -312
- package/src/page-layouts/docflow.page-layout.ts +0 -86
- package/src/page-layouts/task-docflow.page-layout-tab.ts +0 -36
- package/src/page-layouts/workflow-steps.page-layout-tab.ts +0 -37
- package/src/roles/default-role.ts +0 -21
- package/src/roles/docflow-member.role.ts +0 -23
- package/src/server/bitrix-page.ts +0 -52
- package/src/server/bitrix-portal.ts +0 -67
- package/src/server/document-capture.ts +0 -102
- package/src/server/http-response.ts +0 -18
- package/src/server/launch-step.ts +0 -166
- package/src/server/process-tasks.ts +0 -116
- package/src/server/records.ts +0 -132
- package/src/server/task-completion.ts +0 -100
- package/src/server/workflow-engine.ts +0 -105
- package/src/shared/api/core-graphql.util.ts +0 -98
- package/src/shared/api/object-summaries.ts +0 -79
- package/src/shared/api/rest-filter.util.ts +0 -37
- package/src/shared/api/rest-response.util.ts +0 -43
- package/src/shared/bitrix/bitrix-client.ts +0 -114
- package/src/shared/bitrix/bitrix.type.ts +0 -25
- package/src/shared/bitrix/bitrix.util.ts +0 -139
- package/src/shared/docflow.constants.ts +0 -31
- package/src/shared/documents/attachment-target.util.ts +0 -64
- package/src/shared/engine.ts +0 -11
- package/src/shared/form/form-field-builder.util.ts +0 -122
- package/src/shared/form/form-field.type.ts +0 -23
- package/src/shared/form/form-fields.util.ts +0 -138
- package/src/shared/form/step-settings.util.ts +0 -104
- package/src/shared/workflow/launch-step.util.ts +0 -56
- package/src/shared/workflow/run-target-record.util.ts +0 -70
- package/src/shared/workflow/workflow-run.type.ts +0 -35
- package/src/shared/workflow/workflow-run.util.ts +0 -174
- package/src/universal-identifiers.ts +0 -199
- package/src/views/all-document-folders.view.ts +0 -50
- package/src/views/all-documents.view.ts +0 -91
- package/src/views/documents-by-status.view.ts +0 -76
- package/tsconfig.json +0 -37
- package/tsconfig.spec.json +0 -9
- package/vitest.unit.config.ts +0 -14
- /package/{.twenty/output/front-component-shared-dependencies.mjs → front-component-shared-dependencies.mjs} +0 -0
- /package/{.twenty/output/src → src}/logic-functions/bitrix-app.logic-function.mjs +0 -0
- /package/{.twenty/output/src → src}/logic-functions/bitrix-event.logic-function.mjs +0 -0
- /package/{.twenty/output/src → src}/logic-functions/bitrix-install.logic-function.mjs +0 -0
- /package/{.twenty/output/src → src}/logic-functions/capture-file.logic-function.mjs +0 -0
- /package/{.twenty/output/src → src}/logic-functions/complete-task.logic-function.mjs +0 -0
- /package/{.twenty/output/src → src}/logic-functions/hand-out-form-step.logic-function.mjs +0 -0
- /package/{.twenty/output/src → src}/logic-functions/health-check.mjs +0 -0
- /package/{.twenty/output/src → src}/logic-functions/launch-parameters-step.logic-function.mjs +0 -0
- /package/{.twenty/output/src → src}/logic-functions/notify-bitrix-assignee.logic-function.mjs +0 -0
- /package/{.twenty/output/src → src}/logic-functions/on-attachment-created.logic-function.mjs +0 -0
- /package/{.twenty/output/src → src}/logic-functions/on-task-updated.logic-function.mjs +0 -0
- /package/{.twenty/output/src → src}/logic-functions/on-workflow-run-updated.logic-function.mjs +0 -0
- /package/{.twenty/output/src → src}/logic-functions/save-step-settings.logic-function.mjs +0 -0
- /package/{.twenty/output/src → src}/logic-functions/save-task-form.logic-function.mjs +0 -0
|
@@ -119468,6 +119468,18 @@ var runWorkflowVersion = async ({
|
|
|
119468
119468
|
return data.runWorkflowVersion.workflowRunId;
|
|
119469
119469
|
};
|
|
119470
119470
|
|
|
119471
|
+
// src/shared/log.util.ts
|
|
119472
|
+
var PREFIX = "[docflow]";
|
|
119473
|
+
var describeError = (error) => {
|
|
119474
|
+
if (error instanceof Error) {
|
|
119475
|
+
const { status, body } = error;
|
|
119476
|
+
return { name: error.name, message: error.message, status, body };
|
|
119477
|
+
}
|
|
119478
|
+
return error;
|
|
119479
|
+
};
|
|
119480
|
+
var logDocflow = (event, details) => console.info(PREFIX, event, details ?? "");
|
|
119481
|
+
var logDocflowError = (event, error, details) => console.error(PREFIX, event, describeError(error), details ?? "");
|
|
119482
|
+
|
|
119471
119483
|
// src/universal-identifiers.ts
|
|
119472
119484
|
var LAUNCH_PROCESS_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER = "de04e9c8-7ebe-4ac2-b4b3-4ca256eb94db";
|
|
119473
119485
|
|
|
@@ -119507,10 +119519,12 @@ var handler = async (event, context) => {
|
|
|
119507
119519
|
payload: fields.length > 0 ? buildLaunchPayload(parameters) : {}
|
|
119508
119520
|
});
|
|
119509
119521
|
} catch (error) {
|
|
119522
|
+
logDocflowError("launch: run failed", error, { workflowVersionId });
|
|
119510
119523
|
return jsonResponse(403, {
|
|
119511
119524
|
message: error instanceof CoreGraphqlError && error.userMessage !== void 0 ? error.userMessage : "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u043F\u0440\u043E\u0446\u0435\u0441\u0441"
|
|
119512
119525
|
});
|
|
119513
119526
|
}
|
|
119527
|
+
logDocflow("launch: started", { workflowVersionId, workflowRunId, parameters });
|
|
119514
119528
|
return { workflowRunId };
|
|
119515
119529
|
};
|
|
119516
119530
|
var launch_process_logic_function_default = defineLogicFunction({
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
import { readJsonBody, jsonResponse } from 'src/server/http-response';
|
|
16
16
|
import { getWorkflow, getWorkflowVersion } from 'src/server/records';
|
|
17
17
|
import { runWorkflowVersion } from 'src/server/workflow-engine';
|
|
18
|
+
import { logDocflow, logDocflowError } from 'src/shared/log.util';
|
|
18
19
|
import { LAUNCH_PROCESS_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER } from 'src/universal-identifiers';
|
|
19
20
|
|
|
20
21
|
// Launch with parameters: they are checked here and ride in the run payload,
|
|
@@ -71,6 +72,8 @@ const handler = async (
|
|
|
71
72
|
payload: fields.length > 0 ? buildLaunchPayload(parameters) : {},
|
|
72
73
|
});
|
|
73
74
|
} catch (error) {
|
|
75
|
+
logDocflowError('launch: run failed', error, { workflowVersionId });
|
|
76
|
+
|
|
74
77
|
return jsonResponse(403, {
|
|
75
78
|
message:
|
|
76
79
|
error instanceof CoreGraphqlError && error.userMessage !== undefined
|
|
@@ -79,6 +82,8 @@ const handler = async (
|
|
|
79
82
|
});
|
|
80
83
|
}
|
|
81
84
|
|
|
85
|
+
logDocflow('launch: started', { workflowVersionId, workflowRunId, parameters });
|
|
86
|
+
|
|
82
87
|
return { workflowRunId };
|
|
83
88
|
};
|
|
84
89
|
|
|
@@ -119607,6 +119607,18 @@ var jsonResponse = (status, body) => new AL(JSON.stringify(body), {
|
|
|
119607
119607
|
});
|
|
119608
119608
|
var readJsonBody = (body) => typeof body === "object" && body !== null && !Array.isArray(body) ? body : {};
|
|
119609
119609
|
|
|
119610
|
+
// src/shared/log.util.ts
|
|
119611
|
+
var PREFIX = "[docflow]";
|
|
119612
|
+
var describeError = (error) => {
|
|
119613
|
+
if (error instanceof Error) {
|
|
119614
|
+
const { status, body } = error;
|
|
119615
|
+
return { name: error.name, message: error.message, status, body };
|
|
119616
|
+
}
|
|
119617
|
+
return error;
|
|
119618
|
+
};
|
|
119619
|
+
var logDocflow = (event, details) => console.info(PREFIX, event, details ?? "");
|
|
119620
|
+
var logDocflowError = (event, error, details) => console.error(PREFIX, event, describeError(error), details ?? "");
|
|
119621
|
+
|
|
119610
119622
|
// src/logic-functions/save-launch-fields.logic-function.ts
|
|
119611
119623
|
var handler = async (event) => {
|
|
119612
119624
|
const body = readJsonBody(event.body);
|
|
@@ -119629,6 +119641,7 @@ var handler = async (event) => {
|
|
|
119629
119641
|
}
|
|
119630
119642
|
try {
|
|
119631
119643
|
const result = await syncLaunchStep({ workflowId, fields });
|
|
119644
|
+
logDocflow("launch fields: draft synced", { workflowId, result });
|
|
119632
119645
|
if (result?.status === "NOT_MANUAL") {
|
|
119633
119646
|
return jsonResponse(409, {
|
|
119634
119647
|
message: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u044B, \u043D\u043E \u0448\u0430\u0433 \u043D\u0435 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D: \u0443 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0430 \u043D\u0435 \u0440\u0443\u0447\u043D\u043E\u0439 \u0437\u0430\u043F\u0443\u0441\u043A"
|
|
@@ -119636,6 +119649,7 @@ var handler = async (event) => {
|
|
|
119636
119649
|
}
|
|
119637
119650
|
return { status: "SAVED", stepId: result?.status === "SAVED" ? result.stepId : null };
|
|
119638
119651
|
} catch (error) {
|
|
119652
|
+
logDocflowError("launch fields: draft not synced", error, { workflowId });
|
|
119639
119653
|
return jsonResponse(502, {
|
|
119640
119654
|
message: error instanceof CoreGraphqlError && error.userMessage !== void 0 ? `\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u044B, \u0448\u0430\u0433 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0430 \u043D\u0435 \u043E\u0431\u043D\u043E\u0432\u043B\u0451\u043D: ${error.userMessage}` : `\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u044B, \u0448\u0430\u0433 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0430 \u043D\u0435 \u043E\u0431\u043D\u043E\u0432\u043B\u0451\u043D: ${error instanceof Error ? error.message : "\u043E\u0448\u0438\u0431\u043A\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u043E\u0432"}`
|
|
119641
119655
|
});
|
|
@@ -8,6 +8,7 @@ import { parseLaunchFields } from 'src/shared/workflow/launch-step.util';
|
|
|
8
8
|
import { syncLaunchStep } from 'src/server/launch-step';
|
|
9
9
|
import { jsonResponse, readJsonBody } from 'src/server/http-response';
|
|
10
10
|
import { restClient } from 'src/server/records';
|
|
11
|
+
import { logDocflow, logDocflowError } from 'src/shared/log.util';
|
|
11
12
|
import { SAVE_LAUNCH_FIELDS_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER } from 'src/universal-identifiers';
|
|
12
13
|
|
|
13
14
|
// Saves the parameters of a process and keeps its draft in step: the
|
|
@@ -42,6 +43,8 @@ const handler = async (event: RoutePayload) => {
|
|
|
42
43
|
try {
|
|
43
44
|
const result = await syncLaunchStep({ workflowId, fields });
|
|
44
45
|
|
|
46
|
+
logDocflow('launch fields: draft synced', { workflowId, result });
|
|
47
|
+
|
|
45
48
|
if (result?.status === 'NOT_MANUAL') {
|
|
46
49
|
return jsonResponse(409, {
|
|
47
50
|
message: 'Параметры сохранены, но шаг не добавлен: у процесса не ручной запуск',
|
|
@@ -50,6 +53,8 @@ const handler = async (event: RoutePayload) => {
|
|
|
50
53
|
|
|
51
54
|
return { status: 'SAVED', stepId: result?.status === 'SAVED' ? result.stepId : null };
|
|
52
55
|
} catch (error) {
|
|
56
|
+
logDocflowError('launch fields: draft not synced', error, { workflowId });
|
|
57
|
+
|
|
53
58
|
return jsonResponse(502, {
|
|
54
59
|
message:
|
|
55
60
|
error instanceof CoreGraphqlError && error.userMessage !== undefined
|
package/.gitignore
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
|
2
|
-
|
|
3
|
-
# dependencies
|
|
4
|
-
/node_modules
|
|
5
|
-
/.pnp
|
|
6
|
-
.pnp.*
|
|
7
|
-
.yarn/*
|
|
8
|
-
!.yarn/patches
|
|
9
|
-
!.yarn/plugins
|
|
10
|
-
!.yarn/releases
|
|
11
|
-
!.yarn/sdks
|
|
12
|
-
!.yarn/versions
|
|
13
|
-
|
|
14
|
-
# codegen
|
|
15
|
-
generated
|
|
16
|
-
|
|
17
|
-
# testing
|
|
18
|
-
/coverage
|
|
19
|
-
|
|
20
|
-
# dev
|
|
21
|
-
/dist/
|
|
22
|
-
|
|
23
|
-
.twenty
|
|
24
|
-
|
|
25
|
-
# production
|
|
26
|
-
/build
|
|
27
|
-
|
|
28
|
-
# misc
|
|
29
|
-
.DS_Store
|
|
30
|
-
*.pem
|
|
31
|
-
|
|
32
|
-
# debug
|
|
33
|
-
npm-debug.log*
|
|
34
|
-
yarn-debug.log*
|
|
35
|
-
yarn-error.log*
|
|
36
|
-
.pnpm-debug.log*
|
|
37
|
-
|
|
38
|
-
# env files (can opt-in for committing if needed)
|
|
39
|
-
.env*
|
|
40
|
-
|
|
41
|
-
# typescript
|
|
42
|
-
*.tsbuildinfo
|
|
43
|
-
*.d.ts
|
package/.nvmrc
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
24.5.0
|
package/.oxlintrc.json
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
|
3
|
-
"plugins": ["typescript"],
|
|
4
|
-
"categories": {
|
|
5
|
-
"correctness": "off"
|
|
6
|
-
},
|
|
7
|
-
"ignorePatterns": ["node_modules", "dist"],
|
|
8
|
-
"rules": {
|
|
9
|
-
"no-unused-vars": "off",
|
|
10
|
-
|
|
11
|
-
"typescript/no-unused-vars": [
|
|
12
|
-
"warn",
|
|
13
|
-
{
|
|
14
|
-
"argsIgnorePattern": "^_"
|
|
15
|
-
}
|
|
16
|
-
],
|
|
17
|
-
"typescript/no-explicit-any": "off"
|
|
18
|
-
},
|
|
19
|
-
"overrides": [
|
|
20
|
-
{
|
|
21
|
-
"files": ["**/*.logic-function.ts", "**/logic-functions/**/*.ts"],
|
|
22
|
-
"rules": {
|
|
23
|
-
"no-restricted-imports": [
|
|
24
|
-
"error",
|
|
25
|
-
{
|
|
26
|
-
"patterns": [
|
|
27
|
-
{
|
|
28
|
-
"group": ["twenty-shared", "twenty-shared/*"],
|
|
29
|
-
"message": "Logic functions must not import from twenty-shared directly. Import runtime types and helpers from `twenty-sdk/logic-function` instead so the logic-function bundle stays minimal."
|
|
30
|
-
}
|
|
31
|
-
]
|
|
32
|
-
}
|
|
33
|
-
]
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
]
|
|
37
|
-
}
|
package/.twenty/output/README.md
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
# Документооборот (`@crm-nordiv/docuflow`)
|
|
2
|
-
|
|
3
|
-
Задания, процессы и документы компании в одном разделе. Ставится в CRM как приложение, без правок
|
|
4
|
-
сервера.
|
|
5
|
-
|
|
6
|
-
- universalIdentifier: `0b7d5d2e-8c4f-4a59-9a43-2f6f1c3e9d21`
|
|
7
|
-
|
|
8
|
-
## Что получается после установки
|
|
9
|
-
|
|
10
|
-
| Где | Что |
|
|
11
|
-
|---|---|
|
|
12
|
-
| Сайдбар | пункт «Документооборот» с вкладками «Задания», «Процессы», «Документы» |
|
|
13
|
-
| «Задания» | задачи раздела «Документооборот»; фильтры «Открытые / Мои / Просроченные / Выполненные», поиск, создание задания с инструкцией и полями для заполнения |
|
|
14
|
-
| Карточка задачи | вкладка «Задание»: инструкция, поля задания (собрать конструктором, заполнить), «Выполнить» |
|
|
15
|
-
| Карточка процесса | вкладка «Запуск и задания»: параметры запуска (конструктор полей) и, для шагов «Человеческий ввод» черновика, кто выполняет, срок в днях, обязательные поля; у каждого поля видна переменная, которой его читают следующие шаги |
|
|
16
|
-
| Редактор процесса | шаг «Запуск с параметрами» (из приложения): отдаёт следующим шагам параметры, заполненные перед запуском |
|
|
17
|
-
| «Процессы» | процессы с ручным запуском раздела «Документооборот»; форма параметров до запуска, «Запустить», «Создать», «Изменить процесс» |
|
|
18
|
-
| «Документы» | папки, фильтры, поиск по названию и номеру, документ с реквизитами (тип, номер, дата, срок действия, контрагент, описание), файл в поле «Файл» карточки, карточка с источником |
|
|
19
|
-
| Автоматически | шаг «Человеческий ввод» процесса становится задачей; её выполнение продолжает процесс; файл, приложенный к любой записи, копируется в документы с отметкой, кто, когда и куда его добавил |
|
|
20
|
-
| Битрикс24 | страница приложения в портале со списком открытых заданий сотрудника и ссылками в CRM; уведомление исполнителю нового задания |
|
|
21
|
-
|
|
22
|
-
## Данные
|
|
23
|
-
|
|
24
|
-
| Объект | Поля |
|
|
25
|
-
|---|---|
|
|
26
|
-
| `smbDocument` (новый) | название, файл, тип, номер, дата, действует до, контрагент (компания), описание, статус, автор, ответственный, папка; источник: `origin`, `sourceObjectName`, `sourceRecordId`, `sourceRecordName`, `sourceFileId`, `workflowRunId` |
|
|
27
|
-
| `smbDocumentFolder` (новый) | название, цвет, родительская папка |
|
|
28
|
-
| `workflow` | `smbSection` «Раздел»: CRM / Документооборот; `smbLaunchFields` «Параметры запуска» — поля, которые заполняют перед запуском |
|
|
29
|
-
| `task` | `smbSection`, `smbInstruction` «Инструкция»; `smbFormSchema`, `smbFormValues` — поля задания; `smbWorkflowRunId`, `smbWorkflowStepId`, `smbWorkflowThreadId` — связь с шагом процесса |
|
|
30
|
-
| `company` | `smbDocuments` — документы контрагента |
|
|
31
|
-
| роли | «Документооборот: функции приложения» (права функций), «Документооборот: участник процессов» (для людей, см. ниже) |
|
|
32
|
-
|
|
33
|
-
## Установка
|
|
34
|
-
|
|
35
|
-
Нужно: Node.js 24.5+, `corepack enable` (Yarn 4), доступ администратора к CRM.
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
yarn install
|
|
39
|
-
yarn app dev:build # сборка без сервера, проверяет манифест и типы
|
|
40
|
-
yarn app remote:add --url https://crm.example.ru --api-key <ключ API администратора> --as prod
|
|
41
|
-
yarn app remote:use prod
|
|
42
|
-
yarn app plan # что изменится, без применения
|
|
43
|
-
yarn app apply # установка; повторный запуск обновляет
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
Ключ API создаётся в «Настройки → API и вебхуки».
|
|
47
|
-
|
|
48
|
-
Затем в «Настройки → Приложения → Документооборот» заполнить переменные:
|
|
49
|
-
|
|
50
|
-
| Переменная | Что указать |
|
|
51
|
-
|---|---|
|
|
52
|
-
| `DOCFLOW_ENGINE` | `APP` |
|
|
53
|
-
| `CRM_PUBLIC_URL` | адрес CRM компании, например `https://acme.example.ru`; по нему строятся ссылки из Битрикс24 |
|
|
54
|
-
| `BITRIX_CLIENT_ID`, `BITRIX_CLIENT_SECRET` | из карточки локального приложения портала; без них Битрикс24 не подключается, остальное работает |
|
|
55
|
-
|
|
56
|
-
**Права людей.** Отвечать на шаг запущенного процесса может только тот, у кого есть право
|
|
57
|
-
«Рабочие процессы». Кто выполняет задания процессов или запускает процессы с параметрами,
|
|
58
|
-
получает роль «Документооборот: участник процессов» или это право в своей роли. Право также
|
|
59
|
-
позволяет менять процессы: давайте его тем, кому это допустимо. Обычные задания и документы
|
|
60
|
-
права «Рабочие процессы» не требуют.
|
|
61
|
-
|
|
62
|
-
## Как пользоваться
|
|
63
|
-
|
|
64
|
-
- **Процесс.** «Процессы → Создать» открывает карточку процесса с уже выставленным разделом.
|
|
65
|
-
Существующий процесс переносится в документооборот полем «Раздел» в его карточке.
|
|
66
|
-
- **Запуск с параметрами.** Вкладка процесса «Запуск и задания» → «Добавить поле»: название, тип
|
|
67
|
-
(текст, число, дата, сотрудник, компания, контакт, сделка), обязательность. «Сохранить параметры»
|
|
68
|
-
ставит процессу ручной запуск, если запуска ещё нет, и первым шагом черновика — шаг «Запуск с
|
|
69
|
-
параметрами». В следующих шагах параметры выбираются в списке переменных как поля этого шага:
|
|
70
|
-
`{{<шаг>.<поле>}}`, точное имя показано рядом с полем. Опубликуйте процесс. Параметры
|
|
71
|
-
заполняются в «Процессах» до запуска; обязательные проверяются и на странице, и на сервере, а
|
|
72
|
-
значения хранятся в запуске (`trigger.smbDocflowParameters`).
|
|
73
|
-
- **Задание шага.** Шаг «Человеческий ввод» становится задачей раздела процесса: у исполнителя
|
|
74
|
-
из вкладки «Запуск и задания», без него — у запустившего. Поля задания — поля шага из редактора.
|
|
75
|
-
«Выполнить» проверяет обязательные поля и продолжает процесс; значения дальше читаются
|
|
76
|
-
переменными шага `{{<шаг>.<поле>}}`.
|
|
77
|
-
- **Своё задание.** «Задания → Создать»: название, исполнитель, срок, инструкция и поля для
|
|
78
|
-
заполнения тем же конструктором. Поля меняются в панели задания («Изменить поля»).
|
|
79
|
-
- **Документы.** «Документы → Добавить документ»: реквизиты, затем «Создать и прикрепить файл» —
|
|
80
|
-
справа откроется карточка документа, файл кладётся в её поле «Файл». Так сделано потому, что
|
|
81
|
-
страница приложения в песочнице видит только имя и размер выбранного файла, не его содержимое.
|
|
82
|
-
Файл, приложенный к любой записи (компания, сделка, задача, свой объект), появляется в
|
|
83
|
-
документах сам: «Где загружен», автор, дата, для задачи процесса — ссылка на запуск. Документ
|
|
84
|
-
хранит копию файла.
|
|
85
|
-
|
|
86
|
-
## Ограничения
|
|
87
|
-
|
|
88
|
-
- Рамку вокруг страницы раздела рисует платформа (страница из виджетов), приложение её не меняет.
|
|
89
|
-
- Параметры запуска относятся к процессу, а не к версии: после правки полей опубликованная версия
|
|
90
|
-
до публикации нового черновика получает новые поля, а переменные убранных полей в ней пусты.
|
|
91
|
-
- Если после ручного запуска идут сразу несколько шагов, «Запуск с параметрами» встаёт перед
|
|
92
|
-
первым из них; остальным ветвям переменные шага недоступны.
|
|
93
|
-
- Документ без файла создаётся раньше файла: если закрыть карточку, не прикрепив файл, документ
|
|
94
|
-
останется с пустым полем «Файл».
|
|
95
|
-
|
|
96
|
-
## Битрикс24
|
|
97
|
-
|
|
98
|
-
Подключается локальным приложением портала (одна компания — один портал).
|
|
99
|
-
|
|
100
|
-
1. В портале: «Разработчикам → Другое → Локальное приложение», тип «Серверное».
|
|
101
|
-
2. Адреса — HTTP-маршруты приложения на адресе компании (точный адрес виден в «Настройки →
|
|
102
|
-
Приложения → Документооборот → функции»):
|
|
103
|
-
- путь обработчика: `https://<адрес компании>/s/bitrix/app`
|
|
104
|
-
- путь первоначальной установки: `https://<адрес компании>/s/bitrix/install`
|
|
105
|
-
3. Права приложения: `user`, `im`.
|
|
106
|
-
4. Сохранить, скопировать «Код приложения» и «Ключ приложения» в `BITRIX_CLIENT_ID` и
|
|
107
|
-
`BITRIX_CLIENT_SECRET`, затем открыть приложение в портале — установка завершится сама.
|
|
108
|
-
|
|
109
|
-
Каждый запрос портала проверяется обменом refresh-токена на `oauth.bitrix.info` с ключом
|
|
110
|
-
приложения; адрес портала берётся из ответа Битрикс24. Привязывается первый подтверждённый портал,
|
|
111
|
-
другой портал к той же компании не подключится. Токены портала хранятся в хранилище приложения, не
|
|
112
|
-
в записях. Сотрудник находится по почте профиля Битрикс24.
|
|
113
|
-
|
|
114
|
-
## Разработка
|
|
115
|
-
|
|
116
|
-
```bash
|
|
117
|
-
yarn app dev # следит за src/ и синхронизирует с сервером
|
|
118
|
-
yarn app dev:function:logs
|
|
119
|
-
yarn test && yarn typecheck && yarn lint
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
Устройство `src/`: `shared/` — общий код (формы, процессы, фильтры REST, Битрикс24); `server/` —
|
|
123
|
-
обращения к записям и движку процессов из функций; `logic-functions/`; `front/` и
|
|
124
|
-
`front-components/` — интерфейс; `objects/`, `fields/`, `views/`, `roles/`, `page-layouts/`,
|
|
125
|
-
`navigation-menu-items/` — данные и раскладка. Записи читаются и пишутся только через REST API
|
|
126
|
-
(`server/records.ts`, `front/api.ts`), движок процессов — через две мутации GraphQL
|
|
127
|
-
(`server/workflow-engine.ts`, `server/launch-step.ts`): при смене версии платформы сверять эти
|
|
128
|
-
файлы. Стили интерфейса только inline: теги `<style>` в странице приложения платформа отбрасывает.
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@crm-nordiv/docuflow",
|
|
3
|
-
"version": "1.1.0",
|
|
4
|
-
"description": "NorDiv Документооборот: задания с полями, процессы с запуском по параметрам, документы со всех записей, приложение Битрикс24",
|
|
5
|
-
"license": "AGPL-3.0-only",
|
|
6
|
-
"files": [
|
|
7
|
-
"**/*",
|
|
8
|
-
"!**/*.map"
|
|
9
|
-
],
|
|
10
|
-
"engines": {
|
|
11
|
-
"node": "^24.5.0",
|
|
12
|
-
"npm": "please-use-yarn",
|
|
13
|
-
"yarn": ">=4.0.2"
|
|
14
|
-
},
|
|
15
|
-
"keywords": [
|
|
16
|
-
"twenty-app"
|
|
17
|
-
],
|
|
18
|
-
"packageManager": "yarn@4.13.0",
|
|
19
|
-
"scripts": {
|
|
20
|
-
"twenty": "twenty",
|
|
21
|
-
"app": "twenty",
|
|
22
|
-
"build": "twenty dev:build",
|
|
23
|
-
"lint": "oxlint -c .oxlintrc.json .",
|
|
24
|
-
"lint:fix": "oxlint --fix -c .oxlintrc.json .",
|
|
25
|
-
"typecheck": "tsc --noEmit -p tsconfig.spec.json",
|
|
26
|
-
"test": "vitest run --config vitest.unit.config.ts"
|
|
27
|
-
},
|
|
28
|
-
"devDependencies": {
|
|
29
|
-
"@types/node": "^24.7.2",
|
|
30
|
-
"@types/react": "^19.0.0",
|
|
31
|
-
"oxlint": "^0.16.0",
|
|
32
|
-
"react": "^19.0.0",
|
|
33
|
-
"react-dom": "^19.0.0",
|
|
34
|
-
"twenty-client-sdk": "2.45.0",
|
|
35
|
-
"twenty-sdk": "2.45.0",
|
|
36
|
-
"twenty-ui": "2.45.0",
|
|
37
|
-
"typescript": "^5.9.3",
|
|
38
|
-
"vite-tsconfig-paths": "^4.2.1",
|
|
39
|
-
"vitest": "^4.0.0"
|
|
40
|
-
},
|
|
41
|
-
"frontComponentSharedDependencies": [
|
|
42
|
-
"react",
|
|
43
|
-
"react-dom/client",
|
|
44
|
-
"twenty-ui/primitives/input",
|
|
45
|
-
"twenty-ui/primitives/data-display",
|
|
46
|
-
"twenty-ui/theme",
|
|
47
|
-
"twenty-ui/icon"
|
|
48
|
-
]
|
|
49
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1400 860" width="1400" height="860">
|
|
2
|
-
<rect width="1400" height="860" fill="#F4F4F2"/>
|
|
3
|
-
<g transform="translate(620 250) scale(2)">
|
|
4
|
-
<rect width="80" height="80" rx="16" fill="#141414"/>
|
|
5
|
-
<g transform="translate(16 16) scale(0.5581)" fill="#FAFAFA">
|
|
6
|
-
<path d="M4 0 H36 A4 4 0 0 1 40 4 V16 A24 24 0 0 1 16 40 H4 A4 4 0 0 1 0 36 V4 A4 4 0 0 1 4 0 Z" fill-opacity="1"/>
|
|
7
|
-
<path d="M50 0 H50 A36 36 0 0 1 86 36 V36 A4 4 0 0 1 82 40 H70 A24 24 0 0 1 46 16 V4 A4 4 0 0 1 50 0 Z" fill-opacity="0.8"/>
|
|
8
|
-
<path d="M4 46 H16 A24 24 0 0 1 40 70 V82 A4 4 0 0 1 36 86 H4 A4 4 0 0 1 0 82 V50 A4 4 0 0 1 4 46 Z" fill-opacity="0.86"/>
|
|
9
|
-
<path d="M70 46 H82 A4 4 0 0 1 86 50 V50 A36 36 0 0 1 50 86 H50 A4 4 0 0 1 46 82 V70 A24 24 0 0 1 70 46 Z" fill-opacity="0.68"/>
|
|
10
|
-
</g>
|
|
11
|
-
</g>
|
|
12
|
-
<text x="700" y="520" text-anchor="middle" font-family="Inter, Arial, sans-serif" font-size="56" font-weight="600" fill="#141414">Документооборот</text>
|
|
13
|
-
<text x="700" y="580" text-anchor="middle" font-family="Inter, Arial, sans-serif" font-size="28" fill="#6B6B6B">Задания · Процессы · Документы</text>
|
|
14
|
-
<text x="700" y="800" text-anchor="middle" font-family="Inter, Arial, sans-serif" font-size="24" font-weight="600" letter-spacing="4" fill="#9A9A9A">NORDIV</text>
|
|
15
|
-
</svg>
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" fill="none">
|
|
2
|
-
<rect width="80" height="80" rx="16" fill="#141414"/>
|
|
3
|
-
<g transform="translate(16 16) scale(0.5581)" fill="#FAFAFA">
|
|
4
|
-
<path d="M4 0 H36 A4 4 0 0 1 40 4 V16 A24 24 0 0 1 16 40 H4 A4 4 0 0 1 0 36 V4 A4 4 0 0 1 4 0 Z" fill-opacity="1"/>
|
|
5
|
-
<path d="M50 0 H50 A36 36 0 0 1 86 36 V36 A4 4 0 0 1 82 40 H70 A24 24 0 0 1 46 16 V4 A4 4 0 0 1 50 0 Z" fill-opacity="0.8"/>
|
|
6
|
-
<path d="M4 46 H16 A24 24 0 0 1 40 70 V82 A4 4 0 0 1 36 86 H4 A4 4 0 0 1 0 82 V50 A4 4 0 0 1 4 46 Z" fill-opacity="0.86"/>
|
|
7
|
-
<path d="M70 46 H82 A4 4 0 0 1 86 50 V50 A36 36 0 0 1 50 86 H50 A4 4 0 0 1 46 82 V70 A24 24 0 0 1 70 46 Z" fill-opacity="0.68"/>
|
|
8
|
-
</g>
|
|
9
|
-
</svg>
|