@voyantjs/legal 0.81.17 → 0.81.18

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.
@@ -329,8 +329,8 @@ export function createContractsAdminRoutes(options = {}) {
329
329
  const result = await contractsService.deleteContract(c.get("db"), c.req.param("id"));
330
330
  if (result.status === "not_found")
331
331
  return c.json({ error: "Contract not found" }, 404);
332
- if (result.status === "not_draft") {
333
- return c.json({ error: "Only draft contracts can be deleted" }, 409);
332
+ if (result.status === "not_deletable") {
333
+ return c.json({ error: "Only draft or void contracts can be deleted" }, 409);
334
334
  }
335
335
  return c.json({ success: true });
336
336
  })
@@ -126,7 +126,7 @@ export declare const contractRecordsService: {
126
126
  deleteContract(db: PostgresJsDatabase, id: string): Promise<{
127
127
  status: "not_found";
128
128
  } | {
129
- status: "not_draft";
129
+ status: "not_deletable";
130
130
  } | {
131
131
  status: "deleted";
132
132
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"service-contracts.d.ts","sourceRoot":"","sources":["../../src/contracts/service-contracts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service-contracts.d.ts","sourceRoot":"","sources":["../../src/contracts/service-contracts.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { people, personDirectoryView } from "@voyantjs/crm/schema";
2
2
  import { and, desc, eq, getTableColumns, ilike, or, sql } from "drizzle-orm";
3
3
  import { appendContractStageHistory, buildContractLifecycleEvent, checkContractLifecycleTransition, createContractStageHistoryEntry, emitContractLifecycleEvent, } from "./lifecycle.js";
4
4
  import { contractAttachments, contractSignatures, contracts, contractTemplateVersions, } from "./schema.js";
5
- import { allocateContractNumber, paginate, renderTemplate, toTimestamp, } from "./service-shared.js";
5
+ import { allocateContractNumber, mergeContractNumberIntoVariables, paginate, renderTemplate, toTimestamp, } from "./service-shared.js";
6
6
  export const contractRecordsService = {
7
7
  async listContracts(db, query) {
8
8
  const conditions = [];
@@ -85,8 +85,9 @@ export const contractRecordsService = {
85
85
  .limit(1);
86
86
  if (!existing)
87
87
  return { status: "not_found" };
88
- if (existing.status !== "draft")
89
- return { status: "not_draft" };
88
+ if (existing.status !== "draft" && existing.status !== "void") {
89
+ return { status: "not_deletable" };
90
+ }
90
91
  await db.delete(contracts).where(eq(contracts.id, id));
91
92
  return { status: "deleted" };
92
93
  },
@@ -103,6 +104,16 @@ export const contractRecordsService = {
103
104
  const transition = checkContractLifecycleTransition(contract.status, "issued");
104
105
  if (!transition.ok)
105
106
  return { status: transition.reason };
107
+ let contractNumber = contract.contractNumber;
108
+ if (!contractNumber && contract.seriesId) {
109
+ const allocated = await allocateContractNumber(tx, contract.seriesId);
110
+ if (allocated)
111
+ contractNumber = allocated.number;
112
+ }
113
+ const baseVariables = contract.variables ?? {};
114
+ const variables = contractNumber
115
+ ? mergeContractNumberIntoVariables(baseVariables, contractNumber)
116
+ : baseVariables;
106
117
  let renderedBody = contract.renderedBody;
107
118
  let renderedBodyFormat = contract.renderedBodyFormat;
108
119
  if (contract.templateVersionId) {
@@ -112,17 +123,10 @@ export const contractRecordsService = {
112
123
  .where(eq(contractTemplateVersions.id, contract.templateVersionId))
113
124
  .limit(1);
114
125
  if (version) {
115
- const vars = contract.variables ?? {};
116
- renderedBody = renderTemplate(version.body, "html", vars);
126
+ renderedBody = renderTemplate(version.body, "html", variables);
117
127
  renderedBodyFormat = "html";
118
128
  }
119
129
  }
120
- let contractNumber = contract.contractNumber;
121
- if (!contractNumber && contract.seriesId) {
122
- const allocated = await allocateContractNumber(tx, contract.seriesId);
123
- if (allocated)
124
- contractNumber = allocated.number;
125
- }
126
130
  const now = new Date();
127
131
  const stageHistory = appendContractStageHistory(contract.stageHistory, createContractStageHistoryEntry("issued", {
128
132
  previousStage: contract.status,
@@ -138,6 +142,7 @@ export const contractRecordsService = {
138
142
  renderedBody,
139
143
  renderedBodyFormat,
140
144
  contractNumber,
145
+ variables: variables !== baseVariables ? variables : contract.variables,
141
146
  updatedAt: now,
142
147
  })
143
148
  .where(eq(contracts.id, contractId))
@@ -66,6 +66,7 @@ export declare function createPdfContractDocumentGenerator(options: Omit<Storage
66
66
  export declare const contractDocumentsService: {
67
67
  generateContractDocument(db: PostgresJsDatabase, contractId: string, input: GenerateContractDocumentInput, runtime: ContractDocumentRuntimeOptions, options?: {
68
68
  regenerated?: boolean;
69
+ forceRerender?: boolean;
69
70
  }): Promise<{
70
71
  status: "not_found" | "not_draft" | "render_unavailable" | "generator_failed";
71
72
  } | ({
@@ -1 +1 @@
1
- {"version":3,"file":"service-documents.d.ts","sourceRoot":"","sources":["../../src/contracts/service-documents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service-documents.d.ts","sourceRoot":"","sources":["../../src/contracts/service-documents.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { renderPdfDocument } from "@voyantjs/utils/pdf-renderer";
2
2
  import { desc, eq } from "drizzle-orm";
3
3
  import { contractAttachments, contracts, contractTemplateVersions } from "./schema.js";
4
4
  import { contractRecordsService } from "./service-contracts.js";
5
- import { isContractTemplateSyntaxError, renderTemplate } from "./service-shared.js";
5
+ import { isContractTemplateSyntaxError, mergeContractNumberIntoVariables, renderTemplate, } from "./service-shared.js";
6
6
  const GENERATION_METADATA_KEYS = [
7
7
  "lastGenerationStatus",
8
8
  "lastGenerationError",
@@ -171,7 +171,7 @@ async function loadTemplateVersion(db, templateVersionId) {
171
171
  .limit(1);
172
172
  return version ?? null;
173
173
  }
174
- async function ensureRenderedContract(db, contractId, issueIfDraft, runtime) {
174
+ async function ensureRenderedContract(db, contractId, issueIfDraft, runtime, options = {}) {
175
175
  let contract = await contractRecordsService.getContractById(db, contractId);
176
176
  if (!contract) {
177
177
  return { status: "not_found" };
@@ -203,8 +203,22 @@ async function ensureRenderedContract(db, contractId, issueIfDraft, runtime) {
203
203
  const templateVersion = await loadTemplateVersion(db, contract.templateVersionId ?? null);
204
204
  let renderedBody = contract.renderedBody;
205
205
  let renderedBodyFormat = contract.renderedBodyFormat;
206
- if ((!renderedBody || !renderedBodyFormat) && templateVersion) {
207
- const variables = contract.variables ?? {};
206
+ // Regenerate flows pass `forceRerender: true` so we don't reuse a
207
+ // cached body that was rendered before the series number was
208
+ // allocated (issue #1335). Without this, contracts issued before the
209
+ // allocate-before-render fix would keep regenerating PDFs from the
210
+ // stale body that still has the missing-value placeholder for
211
+ // `{{ contract.number }}`.
212
+ const needsRender = options.forceRerender || !renderedBody || !renderedBodyFormat;
213
+ if (needsRender && templateVersion) {
214
+ const baseVariables = contract.variables ?? {};
215
+ // Issue #1335: when re-rendering an already-issued contract (e.g. a
216
+ // regenerate request), make sure the allocated contract number is
217
+ // visible to the template as `{{ contract.number }}` /
218
+ // `{{ contract.contractNumber }}`.
219
+ const variables = contract.contractNumber
220
+ ? mergeContractNumberIntoVariables(baseVariables, contract.contractNumber)
221
+ : baseVariables;
208
222
  try {
209
223
  renderedBody = renderTemplate(templateVersion.body, "html", variables);
210
224
  }
@@ -249,7 +263,9 @@ async function ensureRenderedContract(db, contractId, issueIfDraft, runtime) {
249
263
  }
250
264
  export const contractDocumentsService = {
251
265
  async generateContractDocument(db, contractId, input, runtime, options = {}) {
252
- const prepared = await ensureRenderedContract(db, contractId, input.issueIfDraft, runtime);
266
+ const prepared = await ensureRenderedContract(db, contractId, input.issueIfDraft, runtime, {
267
+ forceRerender: options.forceRerender,
268
+ });
253
269
  if (prepared.status === "not_found") {
254
270
  return { status: "not_found" };
255
271
  }
@@ -332,6 +348,11 @@ export const contractDocumentsService = {
332
348
  return this.generateContractDocument(db, contractId, {
333
349
  ...input,
334
350
  issueIfDraft: input.issueIfDraft,
335
- }, runtime, { regenerated: true });
351
+ }, runtime,
352
+ // Force a fresh render so older contracts whose cached body was
353
+ // produced before the series-number allocation (issue #1335)
354
+ // get re-rendered against the current `contract.variables` /
355
+ // `contract.contractNumber` instead of reusing the stale body.
356
+ { regenerated: true, forceRerender: true });
336
357
  },
337
358
  };
@@ -25,6 +25,7 @@ export declare class ContractTemplateSyntaxError extends Error {
25
25
  export declare function isContractTemplateSyntaxError(error: unknown): error is ContractTemplateSyntaxError;
26
26
  export declare function validateContractTemplateBody(body: string): void;
27
27
  export declare function renderTemplate(body: string, bodyFormat: "markdown" | "html" | "lexical_json", variables: Record<string, unknown>): string;
28
+ export declare function mergeContractNumberIntoVariables(variables: Record<string, unknown>, contractNumber: string): Record<string, unknown>;
28
29
  export declare function validateTemplateVariables(variableSchema: unknown, values: Record<string, unknown>): string[];
29
30
  export declare function allocateContractNumber(db: PostgresJsDatabase, seriesId: string): Promise<{
30
31
  number: string;
@@ -1 +1 @@
1
- {"version":3,"file":"service-shared.d.ts","sourceRoot":"","sources":["../../src/contracts/service-shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service-shared.d.ts","sourceRoot":"","sources":["../../src/contracts/service-shared.ts"],"names":[],"mappings":"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"}
@@ -75,6 +75,26 @@ export function renderTemplate(body, bodyFormat, variables) {
75
75
  missingValuePlaceholder: CONTRACT_MISSING_VALUE_PLACEHOLDER,
76
76
  });
77
77
  }
78
+ // When a contract is being issued or rendered, the allocated series
79
+ // number must be visible to the template via `{{ contract.number }}` /
80
+ // `{{ contract.contractNumber }}` (issue #1335). This helper merges the
81
+ // allocated value into both aliases without dropping caller-provided
82
+ // fields nested under `contract.*`.
83
+ export function mergeContractNumberIntoVariables(variables, contractNumber) {
84
+ const existingContract = variables.contract &&
85
+ typeof variables.contract === "object" &&
86
+ !Array.isArray(variables.contract)
87
+ ? variables.contract
88
+ : {};
89
+ return {
90
+ ...variables,
91
+ contract: {
92
+ ...existingContract,
93
+ contractNumber,
94
+ number: contractNumber,
95
+ },
96
+ };
97
+ }
78
98
  export function validateTemplateVariables(variableSchema, values) {
79
99
  const issues = [];
80
100
  if (!variableSchema || typeof variableSchema !== "object")
@@ -1,8 +1,9 @@
1
- import { allocateContractNumber, ContractTemplateSyntaxError, isContractTemplateSyntaxError, renderTemplate, validateContractTemplateBody, validateTemplateVariables } from "./service-shared.js";
2
- export { allocateContractNumber, ContractTemplateSyntaxError, isContractTemplateSyntaxError, renderTemplate, validateContractTemplateBody, validateTemplateVariables, };
1
+ import { allocateContractNumber, ContractTemplateSyntaxError, isContractTemplateSyntaxError, mergeContractNumberIntoVariables, renderTemplate, validateContractTemplateBody, validateTemplateVariables } from "./service-shared.js";
2
+ export { allocateContractNumber, ContractTemplateSyntaxError, isContractTemplateSyntaxError, mergeContractNumberIntoVariables, renderTemplate, validateContractTemplateBody, validateTemplateVariables, };
3
3
  export declare const contractsService: {
4
4
  generateContractDocument(db: import("drizzle-orm/postgres-js").PostgresJsDatabase, contractId: string, input: import("./validation.js").GenerateContractDocumentInput, runtime: import("./service-documents.js").ContractDocumentRuntimeOptions, options?: {
5
5
  regenerated?: boolean;
6
+ forceRerender?: boolean;
6
7
  }): Promise<{
7
8
  status: "not_found" | "not_draft" | "render_unavailable" | "generator_failed";
8
9
  } | ({
@@ -137,7 +138,7 @@ export declare const contractsService: {
137
138
  deleteContract(db: import("drizzle-orm/postgres-js").PostgresJsDatabase, id: string): Promise<{
138
139
  status: "not_found";
139
140
  } | {
140
- status: "not_draft";
141
+ status: "not_deletable";
141
142
  } | {
142
143
  status: "deleted";
143
144
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/contracts/service.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,6BAA6B,EAC7B,cAAc,EACd,4BAA4B,EAC5B,yBAAyB,EAC1B,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,6BAA6B,EAC7B,cAAc,EACd,4BAA4B,EAC5B,yBAAyB,GAC1B,CAAA;AAED,eAAO,MAAM,gBAAgB;;mBAM6tX,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAA/jL,CAAC;eAAwB,CAAC;eAAwB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAD9uM,CAAA"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/contracts/service.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,6BAA6B,EAC7B,gCAAgC,EAChC,cAAc,EACd,4BAA4B,EAC5B,yBAAyB,EAC1B,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,6BAA6B,EAC7B,gCAAgC,EAChC,cAAc,EACd,4BAA4B,EAC5B,yBAAyB,GAC1B,CAAA;AAED,eAAO,MAAM,gBAAgB;;mBAMoiZ,CAAC;qBAAwB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAAnqM,CAAC;eAAwB,CAAC;eAAwB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAD1+M,CAAA"}
@@ -1,9 +1,9 @@
1
1
  import { contractRecordsService } from "./service-contracts.js";
2
2
  import { contractDocumentsService } from "./service-documents.js";
3
3
  import { contractSeriesService } from "./service-series.js";
4
- import { allocateContractNumber, ContractTemplateSyntaxError, isContractTemplateSyntaxError, renderTemplate, validateContractTemplateBody, validateTemplateVariables, } from "./service-shared.js";
4
+ import { allocateContractNumber, ContractTemplateSyntaxError, isContractTemplateSyntaxError, mergeContractNumberIntoVariables, renderTemplate, validateContractTemplateBody, validateTemplateVariables, } from "./service-shared.js";
5
5
  import { contractTemplatesService } from "./service-templates.js";
6
- export { allocateContractNumber, ContractTemplateSyntaxError, isContractTemplateSyntaxError, renderTemplate, validateContractTemplateBody, validateTemplateVariables, };
6
+ export { allocateContractNumber, ContractTemplateSyntaxError, isContractTemplateSyntaxError, mergeContractNumberIntoVariables, renderTemplate, validateContractTemplateBody, validateTemplateVariables, };
7
7
  export const contractsService = {
8
8
  ...contractTemplatesService,
9
9
  ...contractSeriesService,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyantjs/legal",
3
- "version": "0.81.17",
3
+ "version": "0.81.18",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -59,14 +59,14 @@
59
59
  "drizzle-orm": "^0.45.2",
60
60
  "hono": "^4.12.10",
61
61
  "zod": "^4.3.6",
62
- "@voyantjs/bookings": "0.81.17",
63
- "@voyantjs/core": "0.81.17",
64
- "@voyantjs/crm": "0.81.17",
65
- "@voyantjs/db": "0.81.17",
66
- "@voyantjs/hono": "0.81.17",
67
- "@voyantjs/suppliers": "0.81.17",
68
- "@voyantjs/utils": "0.81.17",
69
- "@voyantjs/storage": "0.81.17"
62
+ "@voyantjs/bookings": "0.81.18",
63
+ "@voyantjs/core": "0.81.18",
64
+ "@voyantjs/crm": "0.81.18",
65
+ "@voyantjs/db": "0.81.18",
66
+ "@voyantjs/hono": "0.81.18",
67
+ "@voyantjs/suppliers": "0.81.18",
68
+ "@voyantjs/utils": "0.81.18",
69
+ "@voyantjs/storage": "0.81.18"
70
70
  },
71
71
  "devDependencies": {
72
72
  "typescript": "^6.0.2",