@mj-biz-apps/accounting-actions 0.6.0 → 0.7.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.
- package/dist/BuildJournalEntryBatchesAction.d.ts +19 -2
- package/dist/BuildJournalEntryBatchesAction.d.ts.map +1 -1
- package/dist/BuildJournalEntryBatchesAction.js +189 -50
- package/dist/BuildJournalEntryBatchesAction.js.map +1 -1
- package/dist/__tests__/BuildJournalEntryBatchesAction.test.js +220 -40
- package/dist/__tests__/BuildJournalEntryBatchesAction.test.js.map +1 -1
- package/package.json +10 -10
|
@@ -5,10 +5,27 @@ import { BaseAction } from '@memberjunction/actions';
|
|
|
5
5
|
*
|
|
6
6
|
* Builds single-company GL posting batches from pending candidate journal entries.
|
|
7
7
|
* Netted per (Company, GLAccount, Dimensions) and transactionally locked.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
*
|
|
9
|
+
* Two modes:
|
|
10
|
+
* - DEFAULT (attended, A-US7): build only, behind the bizapps-tasks CFO approval gate. Batches
|
|
11
|
+
* land `Pending` and wait for a human decision. Nothing about this path changed.
|
|
12
|
+
* - AutoPost (unattended, A-US5/A-US6): build → approve → dispatch to the ERP per company, behind
|
|
13
|
+
* `AutoApproveGate` per the scheduled-posting approval waiver. Requires an explicit
|
|
14
|
+
* `EntryTypeCodes` include-list — see {@link assertAutoPostPolicy}.
|
|
15
|
+
*
|
|
16
|
+
* `CutoffMode` exists because scheduled-job action params are Static or SQL-Statement only, with no
|
|
17
|
+
* relative-date value type, and the driver's SQL path returns a row set and swallows errors as
|
|
18
|
+
* `null` — a null cutoff means NO date clause, which would post today's entries. So the relative
|
|
19
|
+
* cutoff is resolved here, in TypeScript, at run time.
|
|
10
20
|
*/
|
|
11
21
|
export declare class BuildJournalEntryBatchesAction extends BaseAction {
|
|
12
22
|
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
13
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* The cutoff handed to `pendingCandidateFilter`, which turns a midnight-UTC cutoff into
|
|
26
|
+
* `EffectiveDate < cutoff + 1 day` — the cutoff DAY is INCLUDED. So "strictly before the run date"
|
|
27
|
+
* is YESTERDAY, and "strictly before the 1st of this month" is the LAST DAY OF THE PRIOR MONTH.
|
|
28
|
+
* An explicit `Cutoff` always wins, so the manual/on-demand path is unaffected.
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveCutoff(explicitCutoff: string | undefined, mode: string | undefined, now: Date): Date | null;
|
|
14
31
|
//# sourceMappingURL=BuildJournalEntryBatchesAction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuildJournalEntryBatchesAction.d.ts","sourceRoot":"","sources":["../src/BuildJournalEntryBatchesAction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"BuildJournalEntryBatchesAction.d.ts","sourceRoot":"","sources":["../src/BuildJournalEntryBatchesAction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAkBrD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBACa,8BAA+B,SAAQ,UAAU;cAC5C,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAgBxF;AA6BD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAQlH"}
|
|
@@ -4,75 +4,214 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import { Metadata } from '@memberjunction/core';
|
|
7
|
+
import { LogError, Metadata } from '@memberjunction/core';
|
|
8
8
|
import { BaseAction } from '@memberjunction/actions';
|
|
9
9
|
import { RegisterClass } from '@memberjunction/global';
|
|
10
|
-
import { buildJournalEntryBatch, pendingCompanies, EmptyJournalEntryBatchError, TasksAppApprovalGate, } from '@mj-biz-apps/accounting-core-entities-server';
|
|
10
|
+
import { approveJournalEntryBatch, buildJournalEntryBatch, createAccountingERPPoster, pendingCompanies, recordDispatchFailure, sendJournalEntryBatch, AutoApproveGate, EmptyJournalEntryBatchError, TasksAppApprovalGate, } from '@mj-biz-apps/accounting-core-entities-server';
|
|
11
11
|
/**
|
|
12
12
|
* Action: Accounting.BuildJournalEntryBatches
|
|
13
13
|
*
|
|
14
14
|
* Builds single-company GL posting batches from pending candidate journal entries.
|
|
15
15
|
* Netted per (Company, GLAccount, Dimensions) and transactionally locked.
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
*
|
|
17
|
+
* Two modes:
|
|
18
|
+
* - DEFAULT (attended, A-US7): build only, behind the bizapps-tasks CFO approval gate. Batches
|
|
19
|
+
* land `Pending` and wait for a human decision. Nothing about this path changed.
|
|
20
|
+
* - AutoPost (unattended, A-US5/A-US6): build → approve → dispatch to the ERP per company, behind
|
|
21
|
+
* `AutoApproveGate` per the scheduled-posting approval waiver. Requires an explicit
|
|
22
|
+
* `EntryTypeCodes` include-list — see {@link assertAutoPostPolicy}.
|
|
23
|
+
*
|
|
24
|
+
* `CutoffMode` exists because scheduled-job action params are Static or SQL-Statement only, with no
|
|
25
|
+
* relative-date value type, and the driver's SQL path returns a row set and swallows errors as
|
|
26
|
+
* `null` — a null cutoff means NO date clause, which would post today's entries. So the relative
|
|
27
|
+
* cutoff is resolved here, in TypeScript, at run time.
|
|
18
28
|
*/
|
|
19
29
|
let BuildJournalEntryBatchesAction = class BuildJournalEntryBatchesAction extends BaseAction {
|
|
20
30
|
async InternalRunAction(params) {
|
|
21
|
-
const targetSystem = (params.Params.find(p => p.Name === 'TargetSystem')?.Value || 'BusinessCentral');
|
|
22
|
-
const cutoffRaw = params.Params.find(p => p.Name === 'Cutoff')?.Value;
|
|
23
|
-
const startDateRaw = params.Params.find(p => p.Name === 'StartDate')?.Value;
|
|
24
|
-
const excludeEntryTypeCodes = params.Params.find(p => p.Name === 'ExcludeEntryTypeCodes')?.Value;
|
|
25
|
-
const entryTypeCodes = params.Params.find(p => p.Name === 'EntryTypeCodes')?.Value;
|
|
26
|
-
const companyIds = params.Params.find(p => p.Name === 'CompanyIDs')?.Value;
|
|
27
|
-
const options = {
|
|
28
|
-
cutoff: cutoffRaw ? new Date(cutoffRaw) : null,
|
|
29
|
-
startDate: startDateRaw ? new Date(startDateRaw) : null,
|
|
30
|
-
companyIds: companyIds && companyIds.length > 0 ? companyIds : null,
|
|
31
|
-
entryTypeCodes: entryTypeCodes && entryTypeCodes.length > 0 ? entryTypeCodes : null,
|
|
32
|
-
excludeEntryTypeCodes: excludeEntryTypeCodes && excludeEntryTypeCodes.length > 0 ? excludeEntryTypeCodes : null,
|
|
33
|
-
};
|
|
34
31
|
const provider = Metadata.Provider;
|
|
35
32
|
if (!provider) {
|
|
36
33
|
throw new Error('Accounting.BuildJournalEntryBatches: Metadata.Provider is not initialized');
|
|
37
34
|
}
|
|
38
35
|
const user = params.ContextUser;
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
catch (e) {
|
|
48
|
-
if (e instanceof EmptyJournalEntryBatchError)
|
|
49
|
-
continue;
|
|
50
|
-
throw e;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
const totalDebits = builtBatches.reduce((sum, b) => sum + b.totalDebits, 0);
|
|
54
|
-
const totalCredits = builtBatches.reduce((sum, b) => sum + b.totalCredits, 0);
|
|
55
|
-
const totalEntries = builtBatches.reduce((sum, b) => sum + b.jeCount, 0);
|
|
56
|
-
const resultParam = params.Params.find(p => p.Name === 'Batches');
|
|
57
|
-
if (resultParam) {
|
|
58
|
-
resultParam.Value = JSON.stringify(builtBatches);
|
|
59
|
-
}
|
|
60
|
-
const countParam = params.Params.find(p => p.Name === 'BatchCount');
|
|
61
|
-
if (countParam) {
|
|
62
|
-
countParam.Value = builtBatches.length;
|
|
63
|
-
}
|
|
64
|
-
const message = builtBatches.length > 0
|
|
65
|
-
? `Successfully built ${builtBatches.length} batch(es) containing ${totalEntries} journal entries (Dr ${totalDebits.toFixed(2)}, Cr ${totalCredits.toFixed(2)}) across ${companies.length} candidate company(ies).`
|
|
66
|
-
: 'No candidate journal entries found to batch.';
|
|
67
|
-
return {
|
|
68
|
-
Success: true,
|
|
69
|
-
Message: message,
|
|
70
|
-
ResultCode: builtBatches.length > 0 ? 'SUCCESS' : 'NO_BATCHES',
|
|
71
|
-
};
|
|
36
|
+
const targetSystem = readParam(params, 'TargetSystem') ?? 'BusinessCentral';
|
|
37
|
+
const autoPost = isTrue(readParam(params, 'AutoPost'));
|
|
38
|
+
const options = readBatchOptions(params);
|
|
39
|
+
if (autoPost)
|
|
40
|
+
assertAutoPostPolicy(options);
|
|
41
|
+
const gate = autoPost ? AutoApproveGate : new TasksAppApprovalGate(provider);
|
|
42
|
+
const outcomes = await sweep({ user, provider, gate, targetSystem, options, autoPost });
|
|
43
|
+
return summarize(params, outcomes, autoPost);
|
|
72
44
|
}
|
|
73
45
|
};
|
|
74
46
|
BuildJournalEntryBatchesAction = __decorate([
|
|
75
47
|
RegisterClass(BaseAction, 'Accounting.BuildJournalEntryBatches')
|
|
76
48
|
], BuildJournalEntryBatchesAction);
|
|
77
49
|
export { BuildJournalEntryBatchesAction };
|
|
50
|
+
// ─── Inputs ──────────────────────────────────────────────────────────────────────────────
|
|
51
|
+
function readParam(params, name) {
|
|
52
|
+
const value = params.Params.find(p => p.Name === name)?.Value;
|
|
53
|
+
return (value ?? undefined);
|
|
54
|
+
}
|
|
55
|
+
/** A scheduled-job Static param arrives JSON-parsed when it can be, and as a raw string when it
|
|
56
|
+
* cannot — so an admin who typed `True` gets the same answer as the shipped `true`. */
|
|
57
|
+
const isTrue = (value) => value === true || (typeof value === 'string' && value.toLowerCase() === 'true');
|
|
58
|
+
function readBatchOptions(params) {
|
|
59
|
+
const startDate = readParam(params, 'StartDate');
|
|
60
|
+
const entryTypeCodes = readParam(params, 'EntryTypeCodes');
|
|
61
|
+
const excludeEntryTypeCodes = readParam(params, 'ExcludeEntryTypeCodes');
|
|
62
|
+
const companyIds = readParam(params, 'CompanyIDs');
|
|
63
|
+
return {
|
|
64
|
+
cutoff: resolveCutoff(readParam(params, 'Cutoff'), readParam(params, 'CutoffMode'), new Date()),
|
|
65
|
+
startDate: startDate ? new Date(startDate) : null,
|
|
66
|
+
companyIds: companyIds?.length ? companyIds : null,
|
|
67
|
+
entryTypeCodes: entryTypeCodes?.length ? entryTypeCodes : null,
|
|
68
|
+
excludeEntryTypeCodes: excludeEntryTypeCodes?.length ? excludeEntryTypeCodes : null,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The cutoff handed to `pendingCandidateFilter`, which turns a midnight-UTC cutoff into
|
|
73
|
+
* `EffectiveDate < cutoff + 1 day` — the cutoff DAY is INCLUDED. So "strictly before the run date"
|
|
74
|
+
* is YESTERDAY, and "strictly before the 1st of this month" is the LAST DAY OF THE PRIOR MONTH.
|
|
75
|
+
* An explicit `Cutoff` always wins, so the manual/on-demand path is unaffected.
|
|
76
|
+
*/
|
|
77
|
+
export function resolveCutoff(explicitCutoff, mode, now) {
|
|
78
|
+
if (explicitCutoff)
|
|
79
|
+
return new Date(explicitCutoff);
|
|
80
|
+
if (!mode)
|
|
81
|
+
return null;
|
|
82
|
+
const year = now.getUTCFullYear();
|
|
83
|
+
const month = now.getUTCMonth();
|
|
84
|
+
if (mode === 'PriorDay')
|
|
85
|
+
return new Date(Date.UTC(year, month, now.getUTCDate() - 1));
|
|
86
|
+
if (mode === 'PriorMonth')
|
|
87
|
+
return new Date(Date.UTC(year, month, 0)); // day 0 = last day of the prior month
|
|
88
|
+
throw new Error(`Accounting.BuildJournalEntryBatches: unknown CutoffMode '${mode}' — expected 'PriorDay' or 'PriorMonth'.`);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Auto-posting is INCLUDE-LIST ONLY, by policy (Craig, AIDP-1). A blacklist would silently
|
|
92
|
+
* auto-post any JournalEntryType added later; a financial control has to default the other way, so
|
|
93
|
+
* a new entry type requires approval until an admin names it here.
|
|
94
|
+
*/
|
|
95
|
+
function assertAutoPostPolicy(options) {
|
|
96
|
+
if (!options.entryTypeCodes?.length) {
|
|
97
|
+
throw new Error('Accounting.BuildJournalEntryBatches: AutoPost requires an explicit EntryTypeCodes include-list — auto-posting is include-list only, so an entry type never posts unattended unless it is named.');
|
|
98
|
+
}
|
|
99
|
+
if (options.excludeEntryTypeCodes?.length) {
|
|
100
|
+
throw new Error('Accounting.BuildJournalEntryBatches: AutoPost does not accept ExcludeEntryTypeCodes — the auto-post policy is an include-list, not a blacklist. Name the types that may post in EntryTypeCodes.');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const BUILD_FAILED = 'BuildFailed';
|
|
104
|
+
/**
|
|
105
|
+
* One batch per company (D7), each company independent under AutoPost.
|
|
106
|
+
*
|
|
107
|
+
* A build failure aborts the ATTENDED run, as it always has — those batches carry approval Tasks, so
|
|
108
|
+
* they are visible and a human can act on them. It must NOT abort an UNATTENDED run: `AutoApproveGate`
|
|
109
|
+
* raises no Task, so every batch already built in this sweep would be stranded `Pending` with no Task,
|
|
110
|
+
* where nothing can approve it, dispatch it (the manual op needs a Task), or re-sweep it (its entries
|
|
111
|
+
* are `Batched`, so the next night skips them). Dispatching each company as it is built keeps that
|
|
112
|
+
* window to the single company that failed.
|
|
113
|
+
*/
|
|
114
|
+
async function sweep(ctx) {
|
|
115
|
+
const companies = await pendingCompanies(ctx.user, ctx.provider, ctx.options);
|
|
116
|
+
const outcomes = [];
|
|
117
|
+
for (const companyId of companies) {
|
|
118
|
+
try {
|
|
119
|
+
const batch = await buildJournalEntryBatch(companyId, ctx.targetSystem, ctx.user.ID, ctx.user, ctx.provider, ctx.gate, ctx.options);
|
|
120
|
+
// dispatchOne resolves its own failures into an outcome, so nothing below throws from here.
|
|
121
|
+
outcomes.push(ctx.autoPost
|
|
122
|
+
? await dispatchOne(companyId, batch, ctx.user, ctx.provider)
|
|
123
|
+
: { companyId, batch, status: 'Pending', error: null, needsAttention: false });
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
if (e instanceof EmptyJournalEntryBatchError)
|
|
127
|
+
continue; // this company's candidates netted to zero
|
|
128
|
+
if (!ctx.autoPost)
|
|
129
|
+
throw e;
|
|
130
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
131
|
+
LogError(`Accounting.BuildJournalEntryBatches: build for company ${companyId} failed: ${message}`);
|
|
132
|
+
outcomes.push({ companyId, batch: null, status: BUILD_FAILED, error: message, needsAttention: true });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return outcomes;
|
|
136
|
+
}
|
|
137
|
+
// ─── Dispatch (AutoPost only) ────────────────────────────────────────────────────────────
|
|
138
|
+
/**
|
|
139
|
+
* Build → Approved → Sent → Posted for one batch. `ApprovedByUserID` is stamped with the context
|
|
140
|
+
* user, which in a scheduled run IS the MJ System user the scheduler resolves — the waiver removes
|
|
141
|
+
* the approval STEP, not the audit trail, so this is never null (Craig, AIDP-1).
|
|
142
|
+
*/
|
|
143
|
+
async function dispatchOne(companyId, batch, user, provider) {
|
|
144
|
+
try {
|
|
145
|
+
await approveJournalEntryBatch(batch.batchId, user.ID, user, provider);
|
|
146
|
+
const sent = await sendJournalEntryBatch(batch.batchId, user, {
|
|
147
|
+
gate: AutoApproveGate,
|
|
148
|
+
poster: createAccountingERPPoster(provider),
|
|
149
|
+
provider,
|
|
150
|
+
});
|
|
151
|
+
return { companyId, batch, status: sent.Status, error: sent.ErrorMessage ?? null, needsAttention: sent.Status !== 'Posted' };
|
|
152
|
+
}
|
|
153
|
+
catch (e) {
|
|
154
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
155
|
+
LogError(`Accounting.BuildJournalEntryBatches: dispatch of batch ${batch.batchId} failed: ${message}`);
|
|
156
|
+
// Every route through triage began with a throw, so every one of them needs a human — including
|
|
157
|
+
// the `Posted` one, where the ERP has the journal but the member JE flip did not finish.
|
|
158
|
+
return { companyId, batch, needsAttention: true, ...(await triage(batch.batchId, message, user, provider)) };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Report the batch's REAL state after a dispatch throw, never the one we hoped for. `Failed` is
|
|
163
|
+
* reachable only from `Sent`, so a throw that landed the batch elsewhere must be described, not
|
|
164
|
+
* overwritten — see `recordDispatchFailure`.
|
|
165
|
+
*/
|
|
166
|
+
async function triage(batchId, message, user, provider) {
|
|
167
|
+
try {
|
|
168
|
+
const { status, marked } = await recordDispatchFailure(batchId, message, user, provider);
|
|
169
|
+
if (marked)
|
|
170
|
+
return { status, error: message };
|
|
171
|
+
if (status === 'Posted') {
|
|
172
|
+
// The ERP took this journal. Only the member Batched→GLPosted flip is incomplete, and the
|
|
173
|
+
// repair is to finish that flip — NOT to post again.
|
|
174
|
+
const warning = `ALREADY POSTED TO THE ERP — DO NOT RE-POST. The batch reached the ERP and only the member Batched→GLPosted flip is incomplete: ${message}`;
|
|
175
|
+
LogError(`Accounting.BuildJournalEntryBatches: batch ${batchId} ${warning}`);
|
|
176
|
+
return { status, error: warning };
|
|
177
|
+
}
|
|
178
|
+
return { status, error: `Batch left ${status} and NOT marked Failed (only a Sent batch may be): ${message}` };
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
const failure = e instanceof Error ? e.message : String(e);
|
|
182
|
+
LogError(`Accounting.BuildJournalEntryBatches: could not record the dispatch failure for batch ${batchId}: ${failure}`);
|
|
183
|
+
return { status: 'Unknown', error: `${message} (and recording that failure also failed: ${failure})` };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// ─── Result ──────────────────────────────────────────────────────────────────────────────
|
|
187
|
+
function summarize(params, outcomes, autoPost) {
|
|
188
|
+
const built = outcomes.filter(o => o.batch !== null);
|
|
189
|
+
const batchesParam = params.Params.find(p => p.Name === 'Batches');
|
|
190
|
+
if (batchesParam)
|
|
191
|
+
batchesParam.Value = JSON.stringify(outcomes);
|
|
192
|
+
const countParam = params.Params.find(p => p.Name === 'BatchCount');
|
|
193
|
+
if (countParam)
|
|
194
|
+
countParam.Value = built.length;
|
|
195
|
+
// Nothing to do is a clean run. Nothing BUILT is not, if a company failed trying.
|
|
196
|
+
if (outcomes.length === 0) {
|
|
197
|
+
return { Success: true, Message: 'No candidate journal entries found to batch.', ResultCode: 'NO_BATCHES' };
|
|
198
|
+
}
|
|
199
|
+
const totals = `Dr ${sum(built, b => b.totalDebits).toFixed(2)}, Cr ${sum(built, b => b.totalCredits).toFixed(2)}`;
|
|
200
|
+
const summary = `Built ${built.length} batch(es) containing ${sum(built, b => b.jeCount)} journal entries (${totals}).`;
|
|
201
|
+
if (!autoPost)
|
|
202
|
+
return { Success: true, Message: `${summary} Awaiting approval.`, ResultCode: 'SUCCESS' };
|
|
203
|
+
const problems = outcomes.filter(o => o.needsAttention);
|
|
204
|
+
if (problems.length === 0) {
|
|
205
|
+
return { Success: true, Message: `${summary} All dispatched to the ERP.`, ResultCode: 'SUCCESS' };
|
|
206
|
+
}
|
|
207
|
+
const detail = problems
|
|
208
|
+
.map(o => `${o.batch?.batchId ?? `company ${o.companyId}`} (${o.status}: ${o.error ?? 'no detail'})`)
|
|
209
|
+
.join('; ');
|
|
210
|
+
return {
|
|
211
|
+
Success: false,
|
|
212
|
+
Message: `${summary} ${problems.length} of ${outcomes.length} company(ies) did not post: ${detail}`,
|
|
213
|
+
ResultCode: 'POST_INCOMPLETE',
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
const sum = (outcomes, pick) => outcomes.reduce((total, o) => total + (o.batch ? pick(o.batch) : 0), 0);
|
|
78
217
|
//# sourceMappingURL=BuildJournalEntryBatchesAction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuildJournalEntryBatchesAction.js","sourceRoot":"","sources":["../src/BuildJournalEntryBatchesAction.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"BuildJournalEntryBatchesAction.js","sourceRoot":"","sources":["../src/BuildJournalEntryBatchesAction.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,36 @@ import { MJGlobal } from '@memberjunction/global';
|
|
|
3
3
|
import { BaseAction } from '@memberjunction/actions';
|
|
4
4
|
import { RunActionParams } from '@memberjunction/actions-base';
|
|
5
5
|
import { Metadata } from '@memberjunction/core';
|
|
6
|
-
import { BuildJournalEntryBatchesAction } from '../BuildJournalEntryBatchesAction.js';
|
|
6
|
+
import { BuildJournalEntryBatchesAction, resolveCutoff } from '../BuildJournalEntryBatchesAction.js';
|
|
7
7
|
import * as serverEngine from '@mj-biz-apps/accounting-core-entities-server';
|
|
8
|
+
/** A built batch, shaped as buildJournalEntryBatch returns it. */
|
|
9
|
+
const buildResult = (companyId) => ({
|
|
10
|
+
batchId: `BATCH-${companyId}`,
|
|
11
|
+
summaryJournalEntryId: `SUMM-${companyId}`,
|
|
12
|
+
summaryLineCount: 4,
|
|
13
|
+
totalDebits: 1500,
|
|
14
|
+
totalCredits: 1500,
|
|
15
|
+
jeCount: 10,
|
|
16
|
+
approvalTaskId: null,
|
|
17
|
+
});
|
|
18
|
+
/** The params every run needs, plus whatever the case under test adds. */
|
|
19
|
+
const runParams = (inputs) => {
|
|
20
|
+
const params = new RunActionParams();
|
|
21
|
+
params.ContextUser = { ID: 'SYSTEM-USER' };
|
|
22
|
+
params.Params = [
|
|
23
|
+
{ Name: 'TargetSystem', Type: 'Input', Value: 'BusinessCentral' },
|
|
24
|
+
...inputs.map(i => ({ Name: i.Name, Type: 'Input', Value: i.Value })),
|
|
25
|
+
{ Name: 'BatchCount', Type: 'Output', Value: 0 },
|
|
26
|
+
{ Name: 'Batches', Type: 'Output', Value: '' },
|
|
27
|
+
];
|
|
28
|
+
return params;
|
|
29
|
+
};
|
|
30
|
+
/** The nightly job's shipped configuration. */
|
|
31
|
+
const AUTO_POST_INPUTS = [
|
|
32
|
+
{ Name: 'AutoPost', Value: true },
|
|
33
|
+
{ Name: 'CutoffMode', Value: 'PriorDay' },
|
|
34
|
+
{ Name: 'EntryTypeCodes', Value: ['OrderBooking', 'PaymentReceipt', 'Refund'] },
|
|
35
|
+
];
|
|
8
36
|
describe('BuildJournalEntryBatchesAction', () => {
|
|
9
37
|
beforeEach(() => {
|
|
10
38
|
vi.restoreAllMocks();
|
|
@@ -18,57 +46,209 @@ describe('BuildJournalEntryBatchesAction', () => {
|
|
|
18
46
|
expect(instance).toBeInstanceOf(BuildJournalEntryBatchesAction);
|
|
19
47
|
});
|
|
20
48
|
it('processes inputs, passes exclude options, and populates output parameters', async () => {
|
|
21
|
-
const action = new BuildJournalEntryBatchesAction();
|
|
22
49
|
const pendingCompaniesSpy = vi.spyOn(serverEngine, 'pendingCompanies').mockResolvedValue(['CO-1', 'CO-2']);
|
|
23
|
-
const buildBatchSpy = vi.spyOn(serverEngine, 'buildJournalEntryBatch')
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
jeCount: 10,
|
|
31
|
-
approvalTaskId: 'TASK-1',
|
|
32
|
-
};
|
|
33
|
-
});
|
|
34
|
-
const params = new RunActionParams();
|
|
35
|
-
params.ContextUser = { ID: 'USER-123' };
|
|
36
|
-
params.Params = [
|
|
37
|
-
{ Name: 'TargetSystem', Type: 'Input', Value: 'BusinessCentral' },
|
|
38
|
-
{ Name: 'Cutoff', Type: 'Input', Value: '2026-08-25' },
|
|
39
|
-
{ Name: 'ExcludeEntryTypeCodes', Type: 'Input', Value: ['RevenueRecognition'] },
|
|
40
|
-
{ Name: 'BatchCount', Type: 'Output', Value: 0 },
|
|
41
|
-
{ Name: 'Batches', Type: 'Output', Value: '' },
|
|
42
|
-
];
|
|
43
|
-
const result = await action.Run(params);
|
|
50
|
+
const buildBatchSpy = vi.spyOn(serverEngine, 'buildJournalEntryBatch')
|
|
51
|
+
.mockImplementation(async (companyId) => buildResult(companyId));
|
|
52
|
+
const params = runParams([
|
|
53
|
+
{ Name: 'Cutoff', Value: '2026-08-25' },
|
|
54
|
+
{ Name: 'ExcludeEntryTypeCodes', Value: ['RevenueRecognition'] },
|
|
55
|
+
]);
|
|
56
|
+
const result = await new BuildJournalEntryBatchesAction().Run(params);
|
|
44
57
|
expect(result.Success).toBe(true);
|
|
45
58
|
expect(result.ResultCode).toBe('SUCCESS');
|
|
46
|
-
expect(result.Message).toContain('
|
|
47
|
-
expect(
|
|
48
|
-
|
|
49
|
-
}));
|
|
59
|
+
expect(result.Message).toContain('Built 2 batch(es)');
|
|
60
|
+
expect(result.Message).toContain('Awaiting approval');
|
|
61
|
+
expect(pendingCompaniesSpy).toHaveBeenCalledWith(expect.anything(), expect.anything(), expect.objectContaining({ excludeEntryTypeCodes: ['RevenueRecognition'] }));
|
|
50
62
|
expect(buildBatchSpy).toHaveBeenCalledTimes(2);
|
|
51
|
-
|
|
52
|
-
expect(
|
|
53
|
-
const batchesParam = params.Params.find(p => p.Name === 'Batches');
|
|
54
|
-
expect(batchesParam?.Value).toContain('BATCH-CO-1');
|
|
55
|
-
expect(batchesParam?.Value).toContain('BATCH-CO-2');
|
|
63
|
+
expect(params.Params.find(p => p.Name === 'BatchCount')?.Value).toBe(2);
|
|
64
|
+
expect(params.Params.find(p => p.Name === 'Batches')?.Value).toContain('BATCH-CO-1');
|
|
56
65
|
});
|
|
57
66
|
it('returns NO_BATCHES when no candidate companies have pending entries', async () => {
|
|
58
|
-
const action = new BuildJournalEntryBatchesAction();
|
|
59
67
|
vi.spyOn(serverEngine, 'pendingCompanies').mockResolvedValue([]);
|
|
60
68
|
const buildBatchSpy = vi.spyOn(serverEngine, 'buildJournalEntryBatch');
|
|
61
|
-
const
|
|
62
|
-
params.ContextUser = { ID: 'USER-123' };
|
|
63
|
-
params.Params = [
|
|
64
|
-
{ Name: 'TargetSystem', Type: 'Input', Value: 'BusinessCentral' },
|
|
65
|
-
{ Name: 'BatchCount', Type: 'Output', Value: 0 },
|
|
66
|
-
];
|
|
67
|
-
const result = await action.Run(params);
|
|
69
|
+
const result = await new BuildJournalEntryBatchesAction().Run(runParams([]));
|
|
68
70
|
expect(result.Success).toBe(true);
|
|
69
71
|
expect(result.ResultCode).toBe('NO_BATCHES');
|
|
70
72
|
expect(result.Message).toContain('No candidate journal entries found to batch.');
|
|
71
73
|
expect(buildBatchSpy).not.toHaveBeenCalled();
|
|
72
74
|
});
|
|
75
|
+
// ─── Cutoff arithmetic (golive #161 / #162 acceptance criteria) ──────────────────────
|
|
76
|
+
describe('resolveCutoff', () => {
|
|
77
|
+
// pendingCandidateFilter turns a midnight-UTC cutoff into `EffectiveDate < cutoff + 1 day`,
|
|
78
|
+
// so the cutoff DAY is inclusive. These are the dates that make "strictly before" true.
|
|
79
|
+
it('PriorDay resolves to yesterday — so the filter becomes "before the run date"', () => {
|
|
80
|
+
const cutoff = resolveCutoff(undefined, 'PriorDay', new Date('2026-08-20T01:00:00Z'));
|
|
81
|
+
expect(cutoff?.toISOString()).toBe('2026-08-19T00:00:00.000Z');
|
|
82
|
+
});
|
|
83
|
+
it('PriorDay crosses a month boundary', () => {
|
|
84
|
+
const cutoff = resolveCutoff(undefined, 'PriorDay', new Date('2026-09-01T01:00:00Z'));
|
|
85
|
+
expect(cutoff?.toISOString()).toBe('2026-08-31T00:00:00.000Z');
|
|
86
|
+
});
|
|
87
|
+
it('PriorMonth resolves to the last day of the prior month — filter becomes "before the 1st"', () => {
|
|
88
|
+
const cutoff = resolveCutoff(undefined, 'PriorMonth', new Date('2026-04-01T03:00:00Z'));
|
|
89
|
+
expect(cutoff?.toISOString()).toBe('2026-03-31T00:00:00.000Z');
|
|
90
|
+
});
|
|
91
|
+
it('PriorMonth handles a short prior month and a year boundary', () => {
|
|
92
|
+
expect(resolveCutoff(undefined, 'PriorMonth', new Date('2026-03-01T03:00:00Z'))?.toISOString())
|
|
93
|
+
.toBe('2026-02-28T00:00:00.000Z');
|
|
94
|
+
expect(resolveCutoff(undefined, 'PriorMonth', new Date('2026-01-01T03:00:00Z'))?.toISOString())
|
|
95
|
+
.toBe('2025-12-31T00:00:00.000Z');
|
|
96
|
+
});
|
|
97
|
+
it('an explicit Cutoff overrides the relative mode, so the manual path is unaffected', () => {
|
|
98
|
+
const cutoff = resolveCutoff('2026-08-25', 'PriorDay', new Date('2026-09-01T01:00:00Z'));
|
|
99
|
+
expect(cutoff?.toISOString()).toBe('2026-08-25T00:00:00.000Z');
|
|
100
|
+
});
|
|
101
|
+
it('no cutoff and no mode means no date clause at all', () => {
|
|
102
|
+
expect(resolveCutoff(undefined, undefined, new Date())).toBeNull();
|
|
103
|
+
});
|
|
104
|
+
it('rejects an unknown mode rather than silently dropping the date clause', () => {
|
|
105
|
+
expect(() => resolveCutoff(undefined, 'LastWeek', new Date())).toThrow(/unknown CutoffMode/);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
// ─── Gate selection (the scheduled-posting approval waiver) ──────────────────────────
|
|
109
|
+
it('defaults to the bizapps-tasks CFO gate and does not dispatch', async () => {
|
|
110
|
+
vi.spyOn(serverEngine, 'pendingCompanies').mockResolvedValue(['CO-1']);
|
|
111
|
+
const buildBatchSpy = vi.spyOn(serverEngine, 'buildJournalEntryBatch')
|
|
112
|
+
.mockImplementation(async (companyId) => buildResult(companyId));
|
|
113
|
+
const approveSpy = vi.spyOn(serverEngine, 'approveJournalEntryBatch');
|
|
114
|
+
const sendSpy = vi.spyOn(serverEngine, 'sendJournalEntryBatch');
|
|
115
|
+
await new BuildJournalEntryBatchesAction().Run(runParams([]));
|
|
116
|
+
expect(buildBatchSpy.mock.calls[0][5]).toBeInstanceOf(serverEngine.TasksAppApprovalGate);
|
|
117
|
+
expect(approveSpy).not.toHaveBeenCalled();
|
|
118
|
+
expect(sendSpy).not.toHaveBeenCalled();
|
|
119
|
+
});
|
|
120
|
+
it('AutoPost selects AutoApproveGate and posts through to the ERP in one run', async () => {
|
|
121
|
+
vi.spyOn(serverEngine, 'pendingCompanies').mockResolvedValue(['CO-1', 'CO-2']);
|
|
122
|
+
const buildBatchSpy = vi.spyOn(serverEngine, 'buildJournalEntryBatch')
|
|
123
|
+
.mockImplementation(async (companyId) => buildResult(companyId));
|
|
124
|
+
const approveSpy = vi.spyOn(serverEngine, 'approveJournalEntryBatch').mockResolvedValue({});
|
|
125
|
+
const sendSpy = vi.spyOn(serverEngine, 'sendJournalEntryBatch')
|
|
126
|
+
.mockResolvedValue({ Status: 'Posted', ErrorMessage: null });
|
|
127
|
+
vi.spyOn(serverEngine, 'createAccountingERPPoster').mockReturnValue(vi.fn());
|
|
128
|
+
const result = await new BuildJournalEntryBatchesAction().Run(runParams(AUTO_POST_INPUTS));
|
|
129
|
+
expect(buildBatchSpy.mock.calls[0][5]).toBe(serverEngine.AutoApproveGate);
|
|
130
|
+
expect(sendSpy).toHaveBeenCalledTimes(2);
|
|
131
|
+
expect(result.Success).toBe(true);
|
|
132
|
+
expect(result.Message).toContain('All dispatched to the ERP');
|
|
133
|
+
// The waiver removes the approval step, not the audit trail: the context user is stamped.
|
|
134
|
+
expect(approveSpy).toHaveBeenCalledWith('BATCH-CO-1', 'SYSTEM-USER', expect.anything(), expect.anything());
|
|
135
|
+
});
|
|
136
|
+
it('marks a batch Failed when its dispatch throws, and carries on to the next company', async () => {
|
|
137
|
+
vi.spyOn(serverEngine, 'pendingCompanies').mockResolvedValue(['CO-1', 'CO-2']);
|
|
138
|
+
vi.spyOn(serverEngine, 'buildJournalEntryBatch').mockImplementation(async (companyId) => buildResult(companyId));
|
|
139
|
+
vi.spyOn(serverEngine, 'approveJournalEntryBatch').mockResolvedValue({});
|
|
140
|
+
vi.spyOn(serverEngine, 'createAccountingERPPoster').mockReturnValue(vi.fn());
|
|
141
|
+
const sendSpy = vi.spyOn(serverEngine, 'sendJournalEntryBatch').mockImplementation(async (batchId) => {
|
|
142
|
+
if (batchId === 'BATCH-CO-1')
|
|
143
|
+
throw new Error('ERP tenant unreachable');
|
|
144
|
+
return { Status: 'Posted', ErrorMessage: null };
|
|
145
|
+
});
|
|
146
|
+
const failSpy = vi.spyOn(serverEngine, 'recordDispatchFailure')
|
|
147
|
+
.mockResolvedValue({ status: 'Failed', marked: true });
|
|
148
|
+
const result = await new BuildJournalEntryBatchesAction().Run(runParams(AUTO_POST_INPUTS));
|
|
149
|
+
expect(sendSpy).toHaveBeenCalledTimes(2); // CO-2 still ran
|
|
150
|
+
expect(failSpy).toHaveBeenCalledWith('BATCH-CO-1', 'ERP tenant unreachable', expect.anything(), expect.anything());
|
|
151
|
+
expect(result.Success).toBe(false);
|
|
152
|
+
expect(result.ResultCode).toBe('POST_INCOMPLETE');
|
|
153
|
+
expect(result.Message).toContain('1 of 2 company(ies) did not post');
|
|
154
|
+
expect(result.Message).toContain('ERP tenant unreachable');
|
|
155
|
+
});
|
|
156
|
+
// A throw can leave the batch in a state that cannot legally become Failed. Reporting the real
|
|
157
|
+
// state matters most when the ERP already took the journal.
|
|
158
|
+
it('reports a batch the ERP already accepted as Posted with a do-not-re-post warning', async () => {
|
|
159
|
+
vi.spyOn(serverEngine, 'pendingCompanies').mockResolvedValue(['CO-1']);
|
|
160
|
+
vi.spyOn(serverEngine, 'buildJournalEntryBatch').mockImplementation(async (companyId) => buildResult(companyId));
|
|
161
|
+
vi.spyOn(serverEngine, 'approveJournalEntryBatch').mockResolvedValue({});
|
|
162
|
+
vi.spyOn(serverEngine, 'createAccountingERPPoster').mockReturnValue(vi.fn());
|
|
163
|
+
vi.spyOn(serverEngine, 'sendJournalEntryBatch').mockRejectedValue(new Error('JE Batched->GLPosted failed'));
|
|
164
|
+
vi.spyOn(serverEngine, 'recordDispatchFailure').mockResolvedValue({ status: 'Posted', marked: false });
|
|
165
|
+
const result = await new BuildJournalEntryBatchesAction().Run(runParams(AUTO_POST_INPUTS));
|
|
166
|
+
expect(result.Success).toBe(false);
|
|
167
|
+
expect(result.Message).toContain('DO NOT RE-POST');
|
|
168
|
+
expect(result.Message).toContain('(Posted:');
|
|
169
|
+
expect(result.Message).not.toContain('(Failed:');
|
|
170
|
+
});
|
|
171
|
+
it('reports a batch stuck in Approved as Approved rather than claiming it was marked Failed', async () => {
|
|
172
|
+
vi.spyOn(serverEngine, 'pendingCompanies').mockResolvedValue(['CO-1']);
|
|
173
|
+
vi.spyOn(serverEngine, 'buildJournalEntryBatch').mockImplementation(async (companyId) => buildResult(companyId));
|
|
174
|
+
vi.spyOn(serverEngine, 'approveJournalEntryBatch').mockResolvedValue({});
|
|
175
|
+
vi.spyOn(serverEngine, 'createAccountingERPPoster').mockReturnValue(vi.fn());
|
|
176
|
+
vi.spyOn(serverEngine, 'sendJournalEntryBatch').mockRejectedValue(new Error('Approved->Sent save failed'));
|
|
177
|
+
vi.spyOn(serverEngine, 'recordDispatchFailure').mockResolvedValue({ status: 'Approved', marked: false });
|
|
178
|
+
const result = await new BuildJournalEntryBatchesAction().Run(runParams(AUTO_POST_INPUTS));
|
|
179
|
+
expect(result.Success).toBe(false);
|
|
180
|
+
expect(result.Message).toContain('(Approved:');
|
|
181
|
+
expect(result.Message).toContain('NOT marked Failed');
|
|
182
|
+
});
|
|
183
|
+
// ─── A build failure must not strand the companies already dispatched ────────────────
|
|
184
|
+
it('AutoPost dispatches each company as it builds, so a later build failure strands nothing', async () => {
|
|
185
|
+
vi.spyOn(serverEngine, 'pendingCompanies').mockResolvedValue(['CO-1', 'CO-2', 'CO-3']);
|
|
186
|
+
vi.spyOn(serverEngine, 'buildJournalEntryBatch').mockImplementation(async (companyId) => {
|
|
187
|
+
if (companyId === 'CO-2')
|
|
188
|
+
throw new Error('summary JE did not balance');
|
|
189
|
+
return buildResult(companyId);
|
|
190
|
+
});
|
|
191
|
+
vi.spyOn(serverEngine, 'approveJournalEntryBatch').mockResolvedValue({});
|
|
192
|
+
vi.spyOn(serverEngine, 'createAccountingERPPoster').mockReturnValue(vi.fn());
|
|
193
|
+
const sendSpy = vi.spyOn(serverEngine, 'sendJournalEntryBatch')
|
|
194
|
+
.mockResolvedValue({ Status: 'Posted', ErrorMessage: null });
|
|
195
|
+
const result = await new BuildJournalEntryBatchesAction().Run(runParams(AUTO_POST_INPUTS));
|
|
196
|
+
// CO-1 posted BEFORE CO-2 threw, and CO-3 still ran after it.
|
|
197
|
+
expect(sendSpy.mock.calls.map(c => c[0])).toEqual(['BATCH-CO-1', 'BATCH-CO-3']);
|
|
198
|
+
// The build failure is counted, so NotifyOnFailure fires rather than the run reporting clean.
|
|
199
|
+
expect(result.Success).toBe(false);
|
|
200
|
+
expect(result.ResultCode).toBe('POST_INCOMPLETE');
|
|
201
|
+
expect(result.Message).toContain('1 of 3 company(ies) did not post');
|
|
202
|
+
expect(result.Message).toContain('company CO-2 (BuildFailed: summary JE did not balance)');
|
|
203
|
+
});
|
|
204
|
+
it('the attended path still aborts on a build failure, since those batches carry approval Tasks', async () => {
|
|
205
|
+
vi.spyOn(serverEngine, 'pendingCompanies').mockResolvedValue(['CO-1', 'CO-2']);
|
|
206
|
+
vi.spyOn(serverEngine, 'buildJournalEntryBatch').mockImplementation(async (companyId) => {
|
|
207
|
+
if (companyId === 'CO-2')
|
|
208
|
+
throw new Error('summary JE did not balance');
|
|
209
|
+
return buildResult(companyId);
|
|
210
|
+
});
|
|
211
|
+
await expect(new BuildJournalEntryBatchesAction().Run(runParams([])))
|
|
212
|
+
.rejects.toThrow(/summary JE did not balance/);
|
|
213
|
+
});
|
|
214
|
+
it('reports a poster that returns Failed without throwing', async () => {
|
|
215
|
+
vi.spyOn(serverEngine, 'pendingCompanies').mockResolvedValue(['CO-1']);
|
|
216
|
+
vi.spyOn(serverEngine, 'buildJournalEntryBatch').mockImplementation(async (companyId) => buildResult(companyId));
|
|
217
|
+
vi.spyOn(serverEngine, 'approveJournalEntryBatch').mockResolvedValue({});
|
|
218
|
+
vi.spyOn(serverEngine, 'createAccountingERPPoster').mockReturnValue(vi.fn());
|
|
219
|
+
vi.spyOn(serverEngine, 'sendJournalEntryBatch')
|
|
220
|
+
.mockResolvedValue({ Status: 'Failed', ErrorMessage: 'No active integration' });
|
|
221
|
+
const result = await new BuildJournalEntryBatchesAction().Run(runParams(AUTO_POST_INPUTS));
|
|
222
|
+
expect(result.ResultCode).toBe('POST_INCOMPLETE');
|
|
223
|
+
expect(result.Message).toContain('No active integration');
|
|
224
|
+
});
|
|
225
|
+
it('an AutoPost run with nothing eligible posts nothing and errors on nothing', async () => {
|
|
226
|
+
vi.spyOn(serverEngine, 'pendingCompanies').mockResolvedValue([]);
|
|
227
|
+
const sendSpy = vi.spyOn(serverEngine, 'sendJournalEntryBatch');
|
|
228
|
+
const result = await new BuildJournalEntryBatchesAction().Run(runParams(AUTO_POST_INPUTS));
|
|
229
|
+
expect(result.Success).toBe(true);
|
|
230
|
+
expect(result.ResultCode).toBe('NO_BATCHES');
|
|
231
|
+
expect(sendSpy).not.toHaveBeenCalled();
|
|
232
|
+
});
|
|
233
|
+
// ─── Auto-post policy is include-list only ───────────────────────────────────────────
|
|
234
|
+
it('refuses to auto-post without an explicit EntryTypeCodes include-list', async () => {
|
|
235
|
+
const pendingSpy = vi.spyOn(serverEngine, 'pendingCompanies');
|
|
236
|
+
const params = runParams([{ Name: 'AutoPost', Value: true }, { Name: 'CutoffMode', Value: 'PriorDay' }]);
|
|
237
|
+
await expect(new BuildJournalEntryBatchesAction().Run(params)).rejects.toThrow(/include-list/);
|
|
238
|
+
expect(pendingSpy).not.toHaveBeenCalled();
|
|
239
|
+
});
|
|
240
|
+
it('accepts a string "True" from an admin-typed Static param', async () => {
|
|
241
|
+
vi.spyOn(serverEngine, 'pendingCompanies').mockResolvedValue([]);
|
|
242
|
+
const params = runParams([
|
|
243
|
+
{ Name: 'AutoPost', Value: 'True' },
|
|
244
|
+
{ Name: 'CutoffMode', Value: 'PriorDay' },
|
|
245
|
+
]);
|
|
246
|
+
// AutoPost was honoured, so the include-list guard fires rather than a quiet attended build.
|
|
247
|
+
await expect(new BuildJournalEntryBatchesAction().Run(params)).rejects.toThrow(/include-list/);
|
|
248
|
+
});
|
|
249
|
+
it('refuses an ExcludeEntryTypeCodes blacklist on the auto-post path', async () => {
|
|
250
|
+
const params = runParams([...AUTO_POST_INPUTS, { Name: 'ExcludeEntryTypeCodes', Value: ['Manual'] }]);
|
|
251
|
+
await expect(new BuildJournalEntryBatchesAction().Run(params)).rejects.toThrow(/not a blacklist/);
|
|
252
|
+
});
|
|
73
253
|
});
|
|
74
254
|
//# sourceMappingURL=BuildJournalEntryBatchesAction.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuildJournalEntryBatchesAction.test.js","sourceRoot":"","sources":["../../src/__tests__/BuildJournalEntryBatchesAction.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AACnF,OAAO,KAAK,YAAY,MAAM,8CAA8C,CAAC;AAE7E,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC5C,UAAU,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,QAAQ,CAAC,QAAQ,GAAG;YAChB,MAAM,EAAE,EAAE,sBAAsB,EAAE,KAAK,EAAE;SACrC,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACrF,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAa,UAAU,EAAE,qCAAqC,CAAC,CAAC;QAC9H,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,8BAA8B,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,MAAM,GAAG,IAAI,8BAA8B,EAAE,CAAC;QAEpD,MAAM,mBAAmB,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3G,MAAM,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YAC1G,OAAO;gBACH,OAAO,EAAE,SAAS,SAAS,EAAE;gBAC7B,qBAAqB,EAAE,QAAQ,SAAS,EAAE;gBAC1C,gBAAgB,EAAE,CAAC;gBACnB,WAAW,EAAE,IAAI;gBACjB,YAAY,EAAE,IAAI;gBAClB,OAAO,EAAE,EAAE;gBACX,cAAc,EAAE,QAAQ;aAC3B,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,CAAC,WAAW,GAAG,EAAE,EAAE,EAAE,UAAU,EAAS,CAAC;QAC/C,MAAM,CAAC,MAAM,GAAG;YACZ,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE;YACjE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE;YACtD,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,oBAAoB,CAAC,EAAE;YAC/E,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE;YAChD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;SACjD,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAExC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACnE,MAAM,CAAC,mBAAmB,CAAC,CAAC,oBAAoB,CAC5C,MAAM,CAAC,QAAQ,EAAE,EACjB,MAAM,CAAC,QAAQ,EAAE,EACjB,MAAM,CAAC,gBAAgB,CAAC;YACpB,qBAAqB,EAAE,CAAC,oBAAoB,CAAC;SAChD,CAAC,CACL,CAAC;QACF,MAAM,CAAC,aAAa,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE/C,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QACzE,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEvC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QACnE,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,MAAM,GAAG,IAAI,8BAA8B,EAAE,CAAC;QAEpD,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACjE,MAAM,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,CAAC,WAAW,GAAG,EAAE,EAAE,EAAE,UAAU,EAAS,CAAC;QAC/C,MAAM,CAAC,MAAM,GAAG;YACZ,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE;YACjE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE;SACnD,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAExC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAC;QACjF,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"BuildJournalEntryBatchesAction.test.js","sourceRoot":"","sources":["../../src/__tests__/BuildJournalEntryBatchesAction.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mj-biz-apps/accounting-actions",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.7.0",
|
|
5
5
|
"description": "Generated action subclasses maintained by the CodeGen utility.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -19,18 +19,18 @@
|
|
|
19
19
|
"vitest": "^4.0.18"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@mj-biz-apps/accounting-core-entities-server": "0.
|
|
22
|
+
"@mj-biz-apps/accounting-core-entities-server": "0.7.0",
|
|
23
23
|
"zod": "^3.25.28"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
|
-
"@memberjunction/actions-base": "^6.1.0-edge.
|
|
27
|
-
"@memberjunction/actions": "^6.1.0-edge.
|
|
28
|
-
"@memberjunction/global": "^6.1.0-edge.
|
|
29
|
-
"@memberjunction/core": "^6.1.0-edge.
|
|
30
|
-
"@memberjunction/core-entities": "^6.1.0-edge.
|
|
31
|
-
"@memberjunction/core-entities-server": "^6.1.0-edge.
|
|
32
|
-
"@memberjunction/ai": "^6.1.0-edge.
|
|
33
|
-
"@memberjunction/aiengine": "^6.1.0-edge.
|
|
26
|
+
"@memberjunction/actions-base": "^6.1.0-edge.7",
|
|
27
|
+
"@memberjunction/actions": "^6.1.0-edge.7",
|
|
28
|
+
"@memberjunction/global": "^6.1.0-edge.7",
|
|
29
|
+
"@memberjunction/core": "^6.1.0-edge.7",
|
|
30
|
+
"@memberjunction/core-entities": "^6.1.0-edge.7",
|
|
31
|
+
"@memberjunction/core-entities-server": "^6.1.0-edge.7",
|
|
32
|
+
"@memberjunction/ai": "^6.1.0-edge.7",
|
|
33
|
+
"@memberjunction/aiengine": "^6.1.0-edge.7"
|
|
34
34
|
},
|
|
35
35
|
"repository": {
|
|
36
36
|
"type": "git",
|