@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.
@@ -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
- * Can be scheduled daily with ExcludeEntryTypeCodes=['RevenueRecognition'] to batch
9
- * orders and payments while deferring subscription revenue recognition to month-end.
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;AAWrD;;;;;;;GAOG;AACH,qBACa,8BAA+B,SAAQ,UAAU;cAC5C,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA2DxF"}
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
- * Can be scheduled daily with ExcludeEntryTypeCodes=['RevenueRecognition'] to batch
17
- * orders and payments while deferring subscription revenue recognition to month-end.
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 gate = new TasksAppApprovalGate(provider);
40
- const companies = await pendingCompanies(user, provider, options);
41
- const builtBatches = [];
42
- for (const companyId of companies) {
43
- try {
44
- const batchRes = await buildJournalEntryBatch(companyId, targetSystem, user.ID, user, provider, gate, options);
45
- builtBatches.push(batchRes);
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":"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"}
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').mockImplementation(async (companyId) => {
24
- return {
25
- batchId: `BATCH-${companyId}`,
26
- summaryJournalEntryId: `SUMM-${companyId}`,
27
- summaryLineCount: 4,
28
- totalDebits: 1500,
29
- totalCredits: 1500,
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('Successfully built 2 batch(es)');
47
- expect(pendingCompaniesSpy).toHaveBeenCalledWith(expect.anything(), expect.anything(), expect.objectContaining({
48
- excludeEntryTypeCodes: ['RevenueRecognition'],
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
- const batchCountParam = params.Params.find(p => p.Name === 'BatchCount');
52
- expect(batchCountParam?.Value).toBe(2);
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 params = new RunActionParams();
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.6.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.6.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.5",
27
- "@memberjunction/actions": "^6.1.0-edge.5",
28
- "@memberjunction/global": "^6.1.0-edge.5",
29
- "@memberjunction/core": "^6.1.0-edge.5",
30
- "@memberjunction/core-entities": "^6.1.0-edge.5",
31
- "@memberjunction/core-entities-server": "^6.1.0-edge.5",
32
- "@memberjunction/ai": "^6.1.0-edge.5",
33
- "@memberjunction/aiengine": "^6.1.0-edge.5"
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",