biz-a-cli 2.3.72 → 2.3.74

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.
@@ -0,0 +1,235 @@
1
+ import { save as dbSave, queryData, deleteMD } from "../../db/db.js";
2
+
3
+ export async function save(payload) {
4
+ const { id, rawJsonString, apiConfig, userId } = payload;
5
+ const workflowJson =
6
+ typeof rawJsonString === "string"
7
+ ? JSON.parse(rawJsonString)
8
+ : rawJsonString;
9
+
10
+ if (
11
+ !workflowJson.workflowKey ||
12
+ !workflowJson.name ||
13
+ !workflowJson.entityType ||
14
+ !workflowJson.initialStateCode
15
+ ) {
16
+ throw new Error(
17
+ "Mandatory value must exist: 'workflowKey', 'name', 'entityType', 'initialStateCode'.",
18
+ );
19
+ }
20
+
21
+ if (
22
+ !workflowJson.status ||
23
+ String(workflowJson.status).toUpperCase() !== "DRAFT"
24
+ ) {
25
+ throw new Error(
26
+ "Workflow status must be 'DRAFT' to save. Published or Retired workflows cannot be edited here.",
27
+ );
28
+ }
29
+
30
+ const minifiedJsonString = JSON.stringify(workflowJson);
31
+
32
+ const dbModel = {
33
+ id: id || null,
34
+ workflow_key: workflowJson.workflowKey,
35
+ version: workflowJson.version || 0,
36
+ name: workflowJson.name,
37
+ entity_type: workflowJson.entityType,
38
+ description: workflowJson.description || "",
39
+ initial_state_code: workflowJson.initialStateCode || "",
40
+ status: "DRAFT",
41
+ definition_json: minifiedJsonString,
42
+ };
43
+
44
+ if (!id && userId) {
45
+ dbModel.created_by = parseInt(userId, 10) || null;
46
+ }
47
+
48
+ const result = await dbSave(
49
+ {
50
+ SYS$BPM_WORKFLOW_DEF: dbModel,
51
+ },
52
+ apiConfig,
53
+ );
54
+ return result.data;
55
+ }
56
+
57
+ export async function publish(payload) {
58
+ const { id, rawJsonString, apiConfig, userId } = payload;
59
+ const workflowJson =
60
+ typeof rawJsonString === "string"
61
+ ? JSON.parse(rawJsonString)
62
+ : rawJsonString;
63
+
64
+ if (
65
+ !workflowJson.workflowKey ||
66
+ !workflowJson.name ||
67
+ !workflowJson.entityType ||
68
+ !workflowJson.initialStateCode
69
+ ) {
70
+ throw new Error(
71
+ "Mandatory fields missing: 'workflowKey', 'name', 'entityType', 'initialStateCode'.",
72
+ );
73
+ }
74
+
75
+ if (
76
+ !workflowJson.status ||
77
+ String(workflowJson.status).toUpperCase() !== "DRAFT"
78
+ ) {
79
+ throw new Error(
80
+ "Action Denied: Only 'DRAFT' workflows can be published.",
81
+ );
82
+ }
83
+
84
+ const versionQueryParam = {
85
+ length: 1,
86
+ columns: [{ data: "SYS$BPM_WORKFLOW_DEF.VERSION", key: "version" }],
87
+ filter: [
88
+ {
89
+ junction: "",
90
+ column: "SYS$BPM_WORKFLOW_DEF.WORKFLOW_KEY",
91
+ operator: "=",
92
+ value1: `'${workflowJson.workflowKey}'`,
93
+ },
94
+ {
95
+ junction: "AND",
96
+ column: "SYS$BPM_WORKFLOW_DEF.STATUS",
97
+ operator: "=",
98
+ value1: `'PUBLISHED'`,
99
+ },
100
+ ],
101
+ order: [{ column: "SYS$BPM_WORKFLOW_DEF.VERSION", dir: "desc" }],
102
+ };
103
+
104
+ const versionRes = await queryData(versionQueryParam, apiConfig);
105
+
106
+ let nextVersion = 1;
107
+ if (versionRes && versionRes.length > 0 && versionRes[0].version) {
108
+ nextVersion = parseInt(versionRes[0].version, 10) + 1;
109
+ }
110
+
111
+ workflowJson.version = nextVersion;
112
+ workflowJson.status = "PUBLISHED";
113
+
114
+ const workflowModel = {
115
+ id: id || null,
116
+ workflow_key: workflowJson.workflowKey,
117
+ version: nextVersion,
118
+ name: workflowJson.name,
119
+ entity_type: workflowJson.entityType,
120
+ description: workflowJson.description || "",
121
+ initial_state_code: workflowJson.initialStateCode,
122
+ status: "PUBLISHED",
123
+ published_by: parseInt(userId, 10) || null,
124
+ definition_json: JSON.stringify(workflowJson),
125
+ };
126
+
127
+ workflowModel["SYS$BPM_STATE_DEF"] = (workflowJson.states || []).map(
128
+ (state, index) => ({
129
+ state_code: state.stateCode,
130
+ label: state.label || state.stateCode,
131
+ task_enabled: state.taskEnabled ? 1 : 0,
132
+ task_name: state.taskName || null,
133
+ assignment_type: state.assignmentType || null,
134
+ assignment_value: state.assignmentValue || null,
135
+ sla_duration_minutes: state.slaDurationMinutes || null,
136
+ timeout_action_type: state.timeoutActionType || null,
137
+ timeout_event_name: state.timeoutEventName || null,
138
+ sort_no: index,
139
+ }),
140
+ );
141
+
142
+ workflowModel["SYS$BPM_TRANS_DEF"] = (workflowJson.transitions || []).map(
143
+ (trans, index) => {
144
+ const transObj = {
145
+ transition_code:
146
+ trans.transitionCode ||
147
+ `${trans.fromStateCode}_TO_${trans.toStateCode}_${index}`,
148
+ from_state_code: trans.fromStateCode,
149
+ to_state_code: trans.toStateCode,
150
+ trigger_type: trans.triggerType || "MANUAL",
151
+ label: trans.label,
152
+ guard_type: trans.guardType || null,
153
+ guard_rule_key: trans.guardRuleKey || null,
154
+ sort_no: index,
155
+ };
156
+
157
+ if (trans.roles && trans.roles.length > 0) {
158
+ transObj["SYS$BPM_TRANS_ROLE"] = trans.roles.map((role) => ({
159
+ role_code: role.roleCode,
160
+ }));
161
+ }
162
+
163
+ if (trans.effects && trans.effects.length > 0) {
164
+ transObj["SYS$BPM_TRANS_EFFECT_DEF"] = trans.effects.map(
165
+ (effect, effIndex) => ({
166
+ effect_type: effect.effectType,
167
+ event_name: effect.eventName,
168
+ payload_template: effect.payloadTemplate || null,
169
+ sort_no: effIndex,
170
+ }),
171
+ );
172
+ }
173
+ return transObj;
174
+ },
175
+ );
176
+
177
+ const result = await dbSave(
178
+ { SYS$BPM_WORKFLOW_DEF: workflowModel },
179
+ apiConfig,
180
+ );
181
+ return result.data;
182
+ }
183
+
184
+ export async function remove(payload) {
185
+ const { id, apiConfig } = payload;
186
+
187
+ if (!id) {
188
+ throw new Error("Action Denied: Workflow ID is required for deletion.");
189
+ }
190
+
191
+ const records = await queryData(
192
+ {
193
+ length: 1,
194
+ columns: [{ data: "SYS$BPM_WORKFLOW_DEF.STATUS", key: "status" }],
195
+ filter: [
196
+ {
197
+ junction: "",
198
+ column: "SYS$BPM_WORKFLOW_DEF.ID",
199
+ operator: "=",
200
+ value1: id,
201
+ },
202
+ ],
203
+ },
204
+ apiConfig,
205
+ );
206
+
207
+ if (!records || records.length === 0) {
208
+ throw new Error("Action Denied: Workflow definition not found.");
209
+ }
210
+
211
+ if (String(records[0].status).toUpperCase() !== "DRAFT") {
212
+ throw new Error(
213
+ "Action Denied: Only 'DRAFT' workflows can be deleted.",
214
+ );
215
+ }
216
+
217
+ const detailTables = [
218
+ "SYS$BPM_STATE_DEF",
219
+ {
220
+ SYS$BPM_TRANS_DEF: [
221
+ "SYS$BPM_TRANS_ROLE",
222
+ "SYS$BPM_TRANS_EFFECT_DEF",
223
+ ],
224
+ },
225
+ ];
226
+
227
+ const result = await deleteMD(
228
+ Number(id),
229
+ "SYS$BPM_WORKFLOW_DEF",
230
+ detailTables,
231
+ apiConfig,
232
+ );
233
+
234
+ return result.data;
235
+ }
@@ -0,0 +1,16 @@
1
+ -- @RunOnlyIfMissing: SYS$APPS
2
+
3
+ EXECUTE BLOCK AS BEGIN
4
+ execute statement 'CREATE SEQUENCE SYS$APPS_GEN;';
5
+ execute statement 'CREATE TABLE SYS$APPS(
6
+ ID integer NOT NULL,
7
+ APPNAME VARCHAR(256) NOT NULL,
8
+ TEMPLATES BLOB SUB_TYPE 0,
9
+ METADATA BLOB SUB_TYPE 0,
10
+ UPDATEAT TIMESTAMP NOT NULL,
11
+ CONSTRAINT PK_SYS$APPS PRIMARY KEY (ID),
12
+ CONSTRAINT UNQ_SYS$APPS UNIQUE (APPNAME)
13
+ );';
14
+ execute statement 'CREATE TRIGGER SYS$APPS_BI FOR SYS$APPS ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.id IS NULL) THEN NEW.id = GEN_ID(SYS$APPS_GEN, 1); NEW.UPDATEAT = CURRENT_TIMESTAMP; END';
15
+ execute statement 'CREATE TRIGGER SYS$APPS_BU FOR SYS$APPS ACTIVE BEFORE UPDATE POSITION 0 AS BEGIN NEW.UPDATEAT = CURRENT_TIMESTAMP; END';
16
+ END
@@ -0,0 +1,274 @@
1
+ -- @RunOnlyIfMissing: SYS$BPM_WORKFLOW_DEF
2
+
3
+ EXECUTE BLOCK AS
4
+ BEGIN
5
+
6
+ -- =====================================================================
7
+ -- PART 2: CREATE GENERATORS AND EXCEPTIONS
8
+ -- =====================================================================
9
+ execute statement 'CREATE GENERATOR SYS$BPM_WORKFLOW_DEF_GEN;';
10
+ execute statement 'CREATE GENERATOR SYS$BPM_STATE_DEF_GEN;';
11
+ execute statement 'CREATE GENERATOR SYS$BPM_TRANS_DEF_GEN;';
12
+ execute statement 'CREATE GENERATOR SYS$BPM_TRANS_ROLE_GEN;';
13
+ execute statement 'CREATE GENERATOR SYS$BPM_TRANS_EFFECT_DEF_GEN;';
14
+ execute statement 'CREATE GENERATOR SYS$BPM_WF_INSTANCE_GEN;';
15
+ execute statement 'CREATE GENERATOR SYS$BPM_STATE_HISTORY_GEN;';
16
+ execute statement 'CREATE GENERATOR SYS$BPM_TASK_GEN;';
17
+ execute statement 'CREATE GENERATOR SYS$BPM_TIMER_JOB_GEN;';
18
+ execute statement 'CREATE GENERATOR SYS$BPM_EFFECT_LOG_GEN;';
19
+
20
+ -- Notice the doubled single quotes for the exception message
21
+ execute statement 'CREATE EXCEPTION EXC_ACTIVE_INSTANCE_EXISTS ''Active workflow instance already exists for this entity.'';';
22
+
23
+ -- =====================================================================
24
+ -- PART 3: CREATE TABLES & FOREIGN KEYS
25
+ -- =====================================================================
26
+ execute statement 'CREATE TABLE SYS$BPM_WORKFLOW_DEF (
27
+ ID INTEGER NOT NULL PRIMARY KEY,
28
+ WORKFLOW_KEY VARCHAR(100) NOT NULL,
29
+ NAME VARCHAR(200) NOT NULL,
30
+ ENTITY_TYPE VARCHAR(100) NOT NULL,
31
+ VERSION INTEGER DEFAULT 1 NOT NULL,
32
+ STATUS VARCHAR(20) DEFAULT ''DRAFT'' NOT NULL,
33
+ INITIAL_STATE_CODE VARCHAR(100) NOT NULL,
34
+ DEFINITION_JSON BLOB SUB_TYPE TEXT,
35
+ CREATED_AT TIMESTAMP NOT NULL,
36
+ CREATED_BY INTEGER NOT NULL,
37
+ PUBLISHED_AT TIMESTAMP,
38
+ PUBLISHED_BY INTEGER,
39
+ DESCRIPTION VARCHAR(500)
40
+ );';
41
+
42
+ execute statement 'CREATE TABLE SYS$BPM_STATE_DEF (
43
+ ID INTEGER NOT NULL PRIMARY KEY,
44
+ SYS$BPM_WORKFLOW_DEF_ID INTEGER NOT NULL REFERENCES SYS$BPM_WORKFLOW_DEF(ID) ON DELETE CASCADE,
45
+ STATE_CODE VARCHAR(100) NOT NULL,
46
+ LABEL VARCHAR(200) NOT NULL,
47
+ IS_TERMINAL SMALLINT DEFAULT 0 NOT NULL,
48
+ TASK_ENABLED SMALLINT DEFAULT 0 NOT NULL,
49
+ TASK_NAME VARCHAR(200),
50
+ ASSIGNMENT_TYPE VARCHAR(20),
51
+ ASSIGNMENT_VALUE VARCHAR(200),
52
+ SLA_DURATION_MINUTES INTEGER,
53
+ TIMEOUT_ACTION_TYPE VARCHAR(30),
54
+ TIMEOUT_EVENT_NAME VARCHAR(100),
55
+ SORT_NO INTEGER DEFAULT 0 NOT NULL
56
+ );';
57
+
58
+ execute statement 'CREATE TABLE SYS$BPM_TRANS_DEF (
59
+ ID INTEGER NOT NULL PRIMARY KEY,
60
+ SYS$BPM_WORKFLOW_DEF_ID INTEGER NOT NULL REFERENCES SYS$BPM_WORKFLOW_DEF(ID) ON DELETE CASCADE,
61
+ TRANSITION_CODE VARCHAR(100) NOT NULL,
62
+ FROM_STATE_CODE VARCHAR(100) NOT NULL,
63
+ TO_STATE_CODE VARCHAR(100) NOT NULL,
64
+ TRIGGER_TYPE VARCHAR(30) DEFAULT ''MANUAL'' NOT NULL,
65
+ LABEL VARCHAR(100),
66
+ GUARD_TYPE VARCHAR(30),
67
+ GUARD_RULE_KEY VARCHAR(100),
68
+ SORT_NO INTEGER DEFAULT 0 NOT NULL
69
+ );';
70
+
71
+ execute statement 'CREATE TABLE SYS$BPM_TRANS_ROLE (
72
+ ID INTEGER NOT NULL PRIMARY KEY,
73
+ SYS$BPM_TRANS_DEF_ID INTEGER NOT NULL REFERENCES SYS$BPM_TRANS_DEF(ID) ON DELETE CASCADE,
74
+ ROLE_CODE VARCHAR(100) NOT NULL
75
+ );';
76
+
77
+ execute statement 'CREATE TABLE SYS$BPM_TRANS_EFFECT_DEF (
78
+ ID INTEGER NOT NULL PRIMARY KEY,
79
+ SYS$BPM_TRANS_DEF_ID INTEGER NOT NULL REFERENCES SYS$BPM_TRANS_DEF(ID) ON DELETE CASCADE,
80
+ EFFECT_TYPE VARCHAR(30) NOT NULL,
81
+ EVENT_NAME VARCHAR(100) NOT NULL,
82
+ PAYLOAD_TEMPLATE BLOB SUB_TYPE TEXT,
83
+ SORT_NO INTEGER DEFAULT 0 NOT NULL
84
+ );';
85
+
86
+ execute statement 'CREATE TABLE SYS$BPM_WF_INSTANCE (
87
+ ID INTEGER NOT NULL PRIMARY KEY,
88
+ SYS$BPM_WORKFLOW_DEF_ID INTEGER NOT NULL REFERENCES SYS$BPM_WORKFLOW_DEF(ID),
89
+ ENTITY_TYPE VARCHAR(100) NOT NULL,
90
+ ENTITY_ID VARCHAR(100) NOT NULL,
91
+ CURRENT_STATE_CODE VARCHAR(100) NOT NULL,
92
+ STATUS VARCHAR(20) DEFAULT ''ACTIVE'' NOT NULL,
93
+ VERSION_NO INTEGER NOT NULL,
94
+ STARTED_AT TIMESTAMP,
95
+ ENDED_AT TIMESTAMP,
96
+ CREATED_BY INTEGER,
97
+ UPDATED_AT TIMESTAMP
98
+ );';
99
+
100
+ execute statement 'CREATE TABLE SYS$BPM_STATE_HISTORY (
101
+ ID INTEGER NOT NULL PRIMARY KEY,
102
+ SYS$BPM_WF_INSTANCE_ID INTEGER NOT NULL REFERENCES SYS$BPM_WF_INSTANCE(ID) ON DELETE CASCADE,
103
+ SYS$BPM_TRANS_DEF_ID INTEGER REFERENCES SYS$BPM_TRANS_DEF(ID),
104
+ FROM_STATE_CODE VARCHAR(100),
105
+ TO_STATE_CODE VARCHAR(100) NOT NULL,
106
+ TRIGGER_TYPE VARCHAR(30) NOT NULL,
107
+ ACTOR_TYPE VARCHAR(20) NOT NULL,
108
+ ACTOR_ID INTEGER,
109
+ REQUEST_ID VARCHAR(100),
110
+ CREATED_AT TIMESTAMP
111
+ );';
112
+
113
+ execute statement 'CREATE TABLE SYS$BPM_TASK (
114
+ ID INTEGER NOT NULL PRIMARY KEY,
115
+ SYS$BPM_WF_INSTANCE_ID INTEGER NOT NULL REFERENCES SYS$BPM_WF_INSTANCE(ID) ON DELETE CASCADE,
116
+ STATE_CODE VARCHAR(100) NOT NULL,
117
+ NAME VARCHAR(200) NOT NULL,
118
+ STATUS VARCHAR(20) DEFAULT ''OPEN'' NOT NULL,
119
+ ASSIGNMENT_TYPE VARCHAR(20),
120
+ ASSIGNMENT_VALUE VARCHAR(200),
121
+ ASSIGNED_USER_ID INTEGER,
122
+ CREATED_AT TIMESTAMP,
123
+ DUE_AT TIMESTAMP,
124
+ SLA_MINUTES INTEGER,
125
+ COMPLETED_AT TIMESTAMP,
126
+ COMPLETED_BY INTEGER,
127
+ CLOSED_REASON VARCHAR(30)
128
+ );';
129
+
130
+ execute statement 'CREATE TABLE SYS$BPM_TIMER_JOB (
131
+ ID INTEGER NOT NULL PRIMARY KEY,
132
+ SYS$BPM_WF_INSTANCE_ID INTEGER NOT NULL REFERENCES SYS$BPM_WF_INSTANCE(ID) ON DELETE CASCADE,
133
+ SYS$BPM_TASK_ID INTEGER REFERENCES SYS$BPM_TASK(ID) ON DELETE CASCADE,
134
+ STATE_CODE VARCHAR(100) NOT NULL,
135
+ TIMER_TYPE VARCHAR(30) NOT NULL,
136
+ DUE_AT TIMESTAMP,
137
+ SLA_MINUTES INTEGER,
138
+ STATUS VARCHAR(20) DEFAULT ''OPEN'' NOT NULL,
139
+ FIRED_AT TIMESTAMP
140
+ );';
141
+
142
+ execute statement 'CREATE TABLE SYS$BPM_EFFECT_LOG (
143
+ ID INTEGER NOT NULL PRIMARY KEY,
144
+ SYS$BPM_WF_INSTANCE_ID INTEGER NOT NULL REFERENCES SYS$BPM_WF_INSTANCE(ID) ON DELETE CASCADE,
145
+ SYS$BPM_TRANS_DEF_ID INTEGER REFERENCES SYS$BPM_TRANS_DEF(ID),
146
+ EFFECT_TYPE VARCHAR(30) NOT NULL,
147
+ EVENT_NAME VARCHAR(100) NOT NULL,
148
+ PAYLOAD_EVALUATED BLOB SUB_TYPE TEXT,
149
+ STATUS VARCHAR(20) DEFAULT ''PENDING'' NOT NULL,
150
+ RETRY_COUNT INTEGER DEFAULT 0 NOT NULL,
151
+ CREATED_AT TIMESTAMP,
152
+ EXECUTED_AT TIMESTAMP,
153
+ ERROR_MESSAGE BLOB SUB_TYPE TEXT
154
+ );';
155
+
156
+ -- =====================================================================
157
+ -- PART 4: TRIGGERS
158
+ -- =====================================================================
159
+ -- ALL single quotes inside the trigger body MUST be doubled
160
+
161
+ execute statement 'CREATE TRIGGER TRG_SYS$BPM_WF_DEF_BIU FOR SYS$BPM_WORKFLOW_DEF
162
+ ACTIVE BEFORE INSERT OR UPDATE POSITION 0
163
+ AS BEGIN
164
+ IF (INSERTING) THEN BEGIN
165
+ IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_WORKFLOW_DEF_GEN, 1);
166
+ IF (NEW.CREATED_AT IS NULL) THEN NEW.CREATED_AT = CURRENT_TIMESTAMP;
167
+ END
168
+ IF (UPDATING) THEN BEGIN
169
+ IF (NEW.STATUS = ''PUBLISHED'' AND OLD.STATUS <> ''PUBLISHED'') THEN BEGIN
170
+ NEW.PUBLISHED_AT = CURRENT_TIMESTAMP;
171
+ END
172
+ END
173
+ END';
174
+
175
+ execute statement 'CREATE TRIGGER TRG_SYS$BPM_STATE_DEF_BI FOR SYS$BPM_STATE_DEF
176
+ ACTIVE BEFORE INSERT POSITION 0
177
+ AS BEGIN
178
+ IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_STATE_DEF_GEN, 1);
179
+ END';
180
+
181
+ execute statement 'CREATE TRIGGER TRG_SYS$BPM_TRANS_DEF_BI FOR SYS$BPM_TRANS_DEF
182
+ ACTIVE BEFORE INSERT POSITION 0
183
+ AS BEGIN
184
+ IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_TRANS_DEF_GEN, 1);
185
+ END';
186
+
187
+ execute statement 'CREATE TRIGGER TRG_SYS$BPM_TRANS_ROLE_BI FOR SYS$BPM_TRANS_ROLE
188
+ ACTIVE BEFORE INSERT POSITION 0
189
+ AS BEGIN
190
+ IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_TRANS_ROLE_GEN, 1);
191
+ END';
192
+
193
+ execute statement 'CREATE TRIGGER TRG_SYS$BPM_TRANS_EFF_BI FOR SYS$BPM_TRANS_EFFECT_DEF
194
+ ACTIVE BEFORE INSERT POSITION 0
195
+ AS BEGIN
196
+ IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_TRANS_EFFECT_DEF_GEN, 1);
197
+ END';
198
+
199
+ execute statement 'CREATE TRIGGER TRG_SYS$BPM_WF_INST_BIU FOR SYS$BPM_WF_INSTANCE
200
+ ACTIVE BEFORE INSERT OR UPDATE POSITION 0
201
+ AS
202
+ DECLARE VARIABLE active_count INTEGER;
203
+ BEGIN
204
+ IF (INSERTING AND NEW.ID IS NULL) THEN
205
+ NEW.ID = GEN_ID(SYS$BPM_WF_INSTANCE_GEN, 1);
206
+ IF (INSERTING AND NEW.STARTED_AT IS NULL) THEN
207
+ NEW.STARTED_AT = CURRENT_TIMESTAMP;
208
+ NEW.UPDATED_AT = CURRENT_TIMESTAMP;
209
+
210
+ IF (NEW.STATUS = ''ACTIVE'') THEN BEGIN
211
+ SELECT COUNT(*) FROM SYS$BPM_WF_INSTANCE
212
+ WHERE ENTITY_TYPE = NEW.ENTITY_TYPE
213
+ AND ENTITY_ID = NEW.ENTITY_ID
214
+ AND STATUS = ''ACTIVE''
215
+ AND ID <> COALESCE(NEW.ID, 0)
216
+ INTO :active_count;
217
+ IF (active_count > 0) THEN EXCEPTION EXC_ACTIVE_INSTANCE_EXISTS;
218
+ END
219
+
220
+ IF (UPDATING AND NEW.STATUS IN (''COMPLETED'', ''TERMINATED'') AND OLD.STATUS NOT IN (''COMPLETED'', ''TERMINATED'')) THEN BEGIN
221
+ NEW.ENDED_AT = CURRENT_TIMESTAMP;
222
+ END
223
+ END';
224
+
225
+ execute statement 'CREATE TRIGGER TRG_SYS$BPM_ST_HIST_BI FOR SYS$BPM_STATE_HISTORY
226
+ ACTIVE BEFORE INSERT POSITION 0
227
+ AS BEGIN
228
+ IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_STATE_HISTORY_GEN, 1);
229
+ IF (NEW.CREATED_AT IS NULL) THEN NEW.CREATED_AT = CURRENT_TIMESTAMP;
230
+ END';
231
+
232
+ execute statement 'CREATE TRIGGER TRG_SYS$BPM_TASK_BIU FOR SYS$BPM_TASK
233
+ ACTIVE BEFORE INSERT OR UPDATE POSITION 0
234
+ AS BEGIN
235
+ IF (INSERTING) THEN BEGIN
236
+ IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_TASK_GEN, 1);
237
+ IF (NEW.CREATED_AT IS NULL) THEN NEW.CREATED_AT = CURRENT_TIMESTAMP;
238
+
239
+ IF (NEW.DUE_AT IS NULL AND NEW.SLA_MINUTES IS NOT NULL AND NEW.SLA_MINUTES > 0) THEN
240
+ BEGIN
241
+ NEW.DUE_AT = DATEADD(minute, NEW.SLA_MINUTES, CURRENT_TIMESTAMP);
242
+ END
243
+ END
244
+ IF (UPDATING) THEN BEGIN
245
+ IF (NEW.STATUS = ''DONE'' AND OLD.STATUS <> ''DONE'') THEN BEGIN
246
+ NEW.COMPLETED_AT = CURRENT_TIMESTAMP;
247
+ END
248
+ END
249
+ END';
250
+
251
+ execute statement 'CREATE TRIGGER TRG_SYS$BPM_TIMER_JOB_BI FOR SYS$BPM_TIMER_JOB
252
+ ACTIVE BEFORE INSERT POSITION 0
253
+ AS BEGIN
254
+ IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_TIMER_JOB_GEN, 1);
255
+
256
+ IF (NEW.SYS$BPM_WF_INSTANCE_ID IS NULL AND NEW.SYS$BPM_TASK_ID IS NOT NULL) THEN
257
+ BEGIN
258
+ NEW.SYS$BPM_WF_INSTANCE_ID = (SELECT SYS$BPM_WF_INSTANCE_ID FROM SYS$BPM_TASK WHERE ID = NEW.SYS$BPM_TASK_ID);
259
+ END
260
+
261
+ IF (NEW.DUE_AT IS NULL AND NEW.SLA_MINUTES IS NOT NULL AND NEW.SLA_MINUTES > 0) THEN
262
+ BEGIN
263
+ NEW.DUE_AT = DATEADD(minute, NEW.SLA_MINUTES, CURRENT_TIMESTAMP);
264
+ END
265
+ END';
266
+
267
+ execute statement 'CREATE TRIGGER TRG_SYS$BPM_EFF_LOG_BI FOR SYS$BPM_EFFECT_LOG
268
+ ACTIVE BEFORE INSERT POSITION 0
269
+ AS BEGIN
270
+ IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(SYS$BPM_EFFECT_LOG_GEN, 1);
271
+ IF (NEW.CREATED_AT IS NULL) THEN NEW.CREATED_AT = CURRENT_TIMESTAMP;
272
+ END';
273
+
274
+ END
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "biz-a-cli",
3
- "version": "2.3.72",
3
+ "version": "2.3.74",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "type": "module",
@@ -8,6 +8,20 @@
8
8
  "node": ">=20.16.0",
9
9
  "npm": ">=10.8.1"
10
10
  },
11
+ "files": [
12
+ "bin/**/*",
13
+ "db/**/*",
14
+ "engine/**/*",
15
+ "envs/**/*",
16
+ "key/**/*",
17
+ "migrations/**/*",
18
+ "scheduler/**/*",
19
+ "worker/**/*",
20
+ "callbackController.js",
21
+ "mailController.js",
22
+ "proxyController.js",
23
+ "readme.md"
24
+ ],
11
25
  "scripts": {
12
26
  "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch a",
13
27
  "testOnce": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
@@ -42,11 +56,13 @@
42
56
  "uglify-js": "^3.19.3",
43
57
  "web-push": "^3.6.7",
44
58
  "winston": "^3.13.0",
59
+ "workerpool": "^9.3.2",
45
60
  "yargs": "^17.7.2"
46
61
  },
47
62
  "devDependencies": {
48
63
  "jest": "^29.7.0",
49
- "prettier": "^3.0.0"
64
+ "prettier": "^3.0.0",
65
+ "supertest": "^7.2.2"
50
66
  },
51
67
  "jest": {
52
68
  "transform": {},