@voyantjs/legal 0.49.0 → 0.50.1
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/README.md +15 -0
- package/dist/contracts/index.d.ts +5 -3
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +3 -2
- package/dist/contracts/lifecycle.d.ts +49 -0
- package/dist/contracts/lifecycle.d.ts.map +1 -0
- package/dist/contracts/lifecycle.js +87 -0
- package/dist/contracts/route-runtime.d.ts +2 -0
- package/dist/contracts/route-runtime.d.ts.map +1 -1
- package/dist/contracts/route-runtime.js +1 -0
- package/dist/contracts/routes.d.ts +284 -75
- package/dist/contracts/routes.d.ts.map +1 -1
- package/dist/contracts/routes.js +25 -9
- package/dist/contracts/schema.d.ts +29 -1
- package/dist/contracts/schema.d.ts.map +1 -1
- package/dist/contracts/schema.js +7 -2
- package/dist/contracts/service-auto-generate.d.ts +2 -0
- package/dist/contracts/service-auto-generate.d.ts.map +1 -1
- package/dist/contracts/service-auto-generate.js +1 -0
- package/dist/contracts/service-contracts.d.ts +83 -27
- package/dist/contracts/service-contracts.d.ts.map +1 -1
- package/dist/contracts/service-contracts.js +162 -63
- package/dist/contracts/service-documents.d.ts +2 -0
- package/dist/contracts/service-documents.d.ts.map +1 -1
- package/dist/contracts/service-documents.js +3 -3
- package/dist/contracts/service-templates.d.ts +5 -5
- package/dist/contracts/service.d.ts +87 -32
- package/dist/contracts/service.d.ts.map +1 -1
- package/dist/contracts/validation.d.ts +45 -24
- package/dist/contracts/validation.d.ts.map +1 -1
- package/dist/contracts/validation.js +13 -1
- package/dist/index.js +9 -6
- package/dist/policies/routes.d.ts +3 -3
- package/dist/policies/service-core.d.ts +3 -3
- package/dist/policies/service.d.ts +3 -3
- package/package.json +9 -9
package/README.md
CHANGED
|
@@ -68,6 +68,21 @@ configured `documentStorage`, and persists a contract attachment. `regenerate-pd
|
|
|
68
68
|
uses the configured contract document generator and replaces the canonical
|
|
69
69
|
generated document artifact.
|
|
70
70
|
|
|
71
|
+
## Contract Lifecycle
|
|
72
|
+
|
|
73
|
+
Contract lifecycle transitions are enforced by the contract service:
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
draft -> issued -> sent -> signed -> executed
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Contracts may be voided from any non-void stage. Each service transition appends
|
|
80
|
+
to `stageHistory` and emits a domain event when an event bus is configured:
|
|
81
|
+
`contract.issued`, `contract.sent`, `contract.signed`, `contract.executed`, or
|
|
82
|
+
`contract.voided`. Event payloads are intentionally minimal: contract IDs,
|
|
83
|
+
relationship IDs, stage names, and timestamps only; rendered bodies, variables,
|
|
84
|
+
metadata, and signature details stay out of the event payload.
|
|
85
|
+
|
|
71
86
|
### Policies
|
|
72
87
|
|
|
73
88
|
- **Policies** (`pol`) — policy definitions by kind (cancellation, payment, T&C, etc.)
|
|
@@ -7,8 +7,10 @@ export declare const contractsLinkable: {
|
|
|
7
7
|
contract: LinkableDefinition;
|
|
8
8
|
contractTemplate: LinkableDefinition;
|
|
9
9
|
};
|
|
10
|
-
export type {
|
|
11
|
-
export {
|
|
10
|
+
export type { ContractLifecycleEvent, ContractLifecycleHook, ContractLifecycleRuntimeOptions, ContractLifecycleStage, ContractLifecycleTransition, } from "./lifecycle.js";
|
|
11
|
+
export { appendContractStageHistory, buildContractLifecycleEvent, CONTRACT_LIFECYCLE_EVENT_NAMES, CONTRACT_LIFECYCLE_STAGES, checkContractLifecycleTransition, createContractStageHistoryEntry, emitContractLifecycleEvent, } from "./lifecycle.js";
|
|
12
|
+
export type { Contract, ContractAttachment, ContractNumberSeries, ContractSignature, ContractStageHistoryEntry, ContractStatus, ContractTemplate, ContractTemplateVersion, NewContract, NewContractAttachment, NewContractNumberSeries, NewContractSignature, NewContractTemplate, NewContractTemplateVersion, } from "./schema.js";
|
|
13
|
+
export { contractAttachments, contractNumberSeries, contractSignatures, contractStatusValues, contracts, contractTemplates, contractTemplateVersions, } from "./schema.js";
|
|
12
14
|
export { allocateContractNumber, ContractTemplateSyntaxError, contractsService, isContractTemplateSyntaxError, renderTemplate, validateContractTemplateBody, validateTemplateVariables, } from "./service.js";
|
|
13
15
|
export type { ContractDocumentGeneratedEvent, ContractDocumentGeneratorContext, ContractDocumentRuntimeOptions, GeneratedContractDocumentArtifact, GeneratedContractDocumentRecord, StorageBackedContractDocumentGeneratorOptions, StorageBackedContractDocumentSerializer, StorageBackedContractDocumentUpload, } from "./service-documents.js";
|
|
14
16
|
export { createPdfContractDocumentGenerator, createStorageBackedContractDocumentGenerator, defaultPdfContractDocumentSerializer, defaultStorageBackedContractDocumentSerializer, } from "./service-documents.js";
|
|
@@ -16,5 +18,5 @@ export type { CloudBrowserGoToOptions, CloudBrowserPdfInput, CloudBrowserPdfOpti
|
|
|
16
18
|
export { createBrowserRenderedPdfContractDocumentSerializer, defaultContractHtmlWrapper, } from "./service-documents-browser.js";
|
|
17
19
|
export type { ContractTemplateLiquidSnippet, ContractTemplateVariableCategory, ContractTemplateVariableDefinition, ContractTemplateVariableType, } from "./template-authoring.js";
|
|
18
20
|
export { contractTemplateLiquidSnippets, contractTemplateVariableCatalog, } from "./template-authoring.js";
|
|
19
|
-
export { contractBodyFormatSchema, contractListQuerySchema, contractNumberResetStrategySchema, contractScopeSchema, contractSignatureMethodSchema, contractStatusSchema, contractTemplateDefaultQuerySchema, contractTemplateListQuerySchema, generateContractDocumentInputSchema, generatedContractDocumentAttachmentSchema, generatedContractDocumentResultSchema, insertContractAttachmentSchema, insertContractNumberSeriesSchema, insertContractSchema, insertContractSignatureSchema, insertContractTemplateSchema, insertContractTemplateVersionSchema, renderTemplateInputSchema, updateContractAttachmentSchema, updateContractNumberSeriesSchema, updateContractSchema, updateContractTemplateSchema, } from "./validation.js";
|
|
21
|
+
export { contractBodyFormatSchema, contractListQuerySchema, contractNumberResetStrategySchema, contractScopeSchema, contractSignatureMethodSchema, contractStageHistoryEntrySchema, contractStatusSchema, contractTemplateDefaultQuerySchema, contractTemplateListQuerySchema, generateContractDocumentInputSchema, generatedContractDocumentAttachmentSchema, generatedContractDocumentResultSchema, insertContractAttachmentSchema, insertContractNumberSeriesSchema, insertContractSchema, insertContractSignatureSchema, insertContractTemplateSchema, insertContractTemplateVersionSchema, renderTemplateInputSchema, updateContractAttachmentSchema, updateContractNumberSeriesSchema, updateContractSchema, updateContractTemplateSchema, } from "./validation.js";
|
|
20
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAExD,YAAY,EACV,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAErF,eAAO,MAAM,gBAAgB,EAAE,kBAK9B,CAAA;AAED,eAAO,MAAM,wBAAwB,EAAE,kBAKtC,CAAA;AAED,eAAO,MAAM,iBAAiB;;;CAG7B,CAAA;AAED,YAAY,EACV,QAAQ,EACR,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,SAAS,EACT,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,gBAAgB,EAChB,6BAA6B,EAC7B,cAAc,EACd,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,cAAc,CAAA;AACrB,YAAY,EACV,8BAA8B,EAC9B,gCAAgC,EAChC,8BAA8B,EAC9B,iCAAiC,EACjC,+BAA+B,EAC/B,6CAA6C,EAC7C,uCAAuC,EACvC,mCAAmC,GACpC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,kCAAkC,EAClC,4CAA4C,EAC5C,oCAAoC,EACpC,8CAA8C,GAC/C,MAAM,wBAAwB,CAAA;AAC/B,YAAY,EACV,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,yDAAyD,GAC1D,MAAM,gCAAgC,CAAA;AACvC,OAAO,EACL,kDAAkD,EAClD,0BAA0B,GAC3B,MAAM,gCAAgC,CAAA;AACvC,YAAY,EACV,6BAA6B,EAC7B,gCAAgC,EAChC,kCAAkC,EAClC,4BAA4B,GAC7B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,GAChC,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,iCAAiC,EACjC,mBAAmB,EACnB,6BAA6B,EAC7B,oBAAoB,EACpB,kCAAkC,EAClC,+BAA+B,EAC/B,mCAAmC,EACnC,yCAAyC,EACzC,qCAAqC,EACrC,8BAA8B,EAC9B,gCAAgC,EAChC,oBAAoB,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,mCAAmC,EACnC,yBAAyB,EACzB,8BAA8B,EAC9B,gCAAgC,EAChC,oBAAoB,EACpB,4BAA4B,GAC7B,MAAM,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAExD,YAAY,EACV,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAErF,eAAO,MAAM,gBAAgB,EAAE,kBAK9B,CAAA;AAED,eAAO,MAAM,wBAAwB,EAAE,kBAKtC,CAAA;AAED,eAAO,MAAM,iBAAiB;;;CAG7B,CAAA;AAED,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,+BAA+B,EAC/B,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,8BAA8B,EAC9B,yBAAyB,EACzB,gCAAgC,EAChC,+BAA+B,EAC/B,0BAA0B,GAC3B,MAAM,gBAAgB,CAAA;AACvB,YAAY,EACV,QAAQ,EACR,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,gBAAgB,EAChB,6BAA6B,EAC7B,cAAc,EACd,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,cAAc,CAAA;AACrB,YAAY,EACV,8BAA8B,EAC9B,gCAAgC,EAChC,8BAA8B,EAC9B,iCAAiC,EACjC,+BAA+B,EAC/B,6CAA6C,EAC7C,uCAAuC,EACvC,mCAAmC,GACpC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,kCAAkC,EAClC,4CAA4C,EAC5C,oCAAoC,EACpC,8CAA8C,GAC/C,MAAM,wBAAwB,CAAA;AAC/B,YAAY,EACV,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,yDAAyD,GAC1D,MAAM,gCAAgC,CAAA;AACvC,OAAO,EACL,kDAAkD,EAClD,0BAA0B,GAC3B,MAAM,gCAAgC,CAAA;AACvC,YAAY,EACV,6BAA6B,EAC7B,gCAAgC,EAChC,kCAAkC,EAClC,4BAA4B,GAC7B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,GAChC,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,iCAAiC,EACjC,mBAAmB,EACnB,6BAA6B,EAC7B,+BAA+B,EAC/B,oBAAoB,EACpB,kCAAkC,EAClC,+BAA+B,EAC/B,mCAAmC,EACnC,yCAAyC,EACzC,qCAAqC,EACrC,8BAA8B,EAC9B,gCAAgC,EAChC,oBAAoB,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,mCAAmC,EACnC,yBAAyB,EACzB,8BAA8B,EAC9B,gCAAgC,EAChC,oBAAoB,EACpB,4BAA4B,GAC7B,MAAM,iBAAiB,CAAA"}
|
package/dist/contracts/index.js
CHANGED
|
@@ -15,9 +15,10 @@ export const contractsLinkable = {
|
|
|
15
15
|
contract: contractLinkable,
|
|
16
16
|
contractTemplate: contractTemplateLinkable,
|
|
17
17
|
};
|
|
18
|
-
export {
|
|
18
|
+
export { appendContractStageHistory, buildContractLifecycleEvent, CONTRACT_LIFECYCLE_EVENT_NAMES, CONTRACT_LIFECYCLE_STAGES, checkContractLifecycleTransition, createContractStageHistoryEntry, emitContractLifecycleEvent, } from "./lifecycle.js";
|
|
19
|
+
export { contractAttachments, contractNumberSeries, contractSignatures, contractStatusValues, contracts, contractTemplates, contractTemplateVersions, } from "./schema.js";
|
|
19
20
|
export { allocateContractNumber, ContractTemplateSyntaxError, contractsService, isContractTemplateSyntaxError, renderTemplate, validateContractTemplateBody, validateTemplateVariables, } from "./service.js";
|
|
20
21
|
export { createPdfContractDocumentGenerator, createStorageBackedContractDocumentGenerator, defaultPdfContractDocumentSerializer, defaultStorageBackedContractDocumentSerializer, } from "./service-documents.js";
|
|
21
22
|
export { createBrowserRenderedPdfContractDocumentSerializer, defaultContractHtmlWrapper, } from "./service-documents-browser.js";
|
|
22
23
|
export { contractTemplateLiquidSnippets, contractTemplateVariableCatalog, } from "./template-authoring.js";
|
|
23
|
-
export { contractBodyFormatSchema, contractListQuerySchema, contractNumberResetStrategySchema, contractScopeSchema, contractSignatureMethodSchema, contractStatusSchema, contractTemplateDefaultQuerySchema, contractTemplateListQuerySchema, generateContractDocumentInputSchema, generatedContractDocumentAttachmentSchema, generatedContractDocumentResultSchema, insertContractAttachmentSchema, insertContractNumberSeriesSchema, insertContractSchema, insertContractSignatureSchema, insertContractTemplateSchema, insertContractTemplateVersionSchema, renderTemplateInputSchema, updateContractAttachmentSchema, updateContractNumberSeriesSchema, updateContractSchema, updateContractTemplateSchema, } from "./validation.js";
|
|
24
|
+
export { contractBodyFormatSchema, contractListQuerySchema, contractNumberResetStrategySchema, contractScopeSchema, contractSignatureMethodSchema, contractStageHistoryEntrySchema, contractStatusSchema, contractTemplateDefaultQuerySchema, contractTemplateListQuerySchema, generateContractDocumentInputSchema, generatedContractDocumentAttachmentSchema, generatedContractDocumentResultSchema, insertContractAttachmentSchema, insertContractNumberSeriesSchema, insertContractSchema, insertContractSignatureSchema, insertContractTemplateSchema, insertContractTemplateVersionSchema, renderTemplateInputSchema, updateContractAttachmentSchema, updateContractNumberSeriesSchema, updateContractSchema, updateContractTemplateSchema, } from "./validation.js";
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { EventBus } from "@voyantjs/core";
|
|
2
|
+
import type { Contract, ContractStageHistoryEntry } from "./schema.js";
|
|
3
|
+
export declare const CONTRACT_LIFECYCLE_STAGES: readonly ["draft", "issued", "sent", "signed", "executed", "expired", "void"];
|
|
4
|
+
export type ContractLifecycleStage = (typeof CONTRACT_LIFECYCLE_STAGES)[number];
|
|
5
|
+
export type ContractLifecycleTransition = "created" | "issued" | "sent" | "signed" | "executed" | "voided";
|
|
6
|
+
export declare const CONTRACT_LIFECYCLE_EVENT_NAMES: {
|
|
7
|
+
readonly issued: "contract.issued";
|
|
8
|
+
readonly sent: "contract.sent";
|
|
9
|
+
readonly signed: "contract.signed";
|
|
10
|
+
readonly executed: "contract.executed";
|
|
11
|
+
readonly voided: "contract.voided";
|
|
12
|
+
};
|
|
13
|
+
export interface ContractLifecycleEvent {
|
|
14
|
+
contractId: string;
|
|
15
|
+
contractNumber: string | null;
|
|
16
|
+
scope: Contract["scope"];
|
|
17
|
+
previousStage: ContractLifecycleStage;
|
|
18
|
+
stage: ContractLifecycleStage;
|
|
19
|
+
transition: Exclude<ContractLifecycleTransition, "created">;
|
|
20
|
+
occurredAt: string;
|
|
21
|
+
personId: string | null;
|
|
22
|
+
organizationId: string | null;
|
|
23
|
+
supplierId: string | null;
|
|
24
|
+
channelId: string | null;
|
|
25
|
+
bookingId: string | null;
|
|
26
|
+
orderId: string | null;
|
|
27
|
+
}
|
|
28
|
+
export type ContractLifecycleHook = (event: ContractLifecycleEvent) => Promise<void> | void;
|
|
29
|
+
export interface ContractLifecycleRuntimeOptions {
|
|
30
|
+
eventBus?: EventBus;
|
|
31
|
+
lifecycleHooks?: readonly ContractLifecycleHook[];
|
|
32
|
+
}
|
|
33
|
+
export type ContractLifecycleTransitionCheck = {
|
|
34
|
+
ok: true;
|
|
35
|
+
} | {
|
|
36
|
+
ok: false;
|
|
37
|
+
reason: "not_draft" | "not_issued" | "not_sent" | "not_signed" | "already_void";
|
|
38
|
+
};
|
|
39
|
+
export declare function createContractStageHistoryEntry(stage: ContractLifecycleStage, options?: {
|
|
40
|
+
previousStage?: ContractLifecycleStage | null;
|
|
41
|
+
transition?: ContractLifecycleTransition;
|
|
42
|
+
enteredAt?: Date;
|
|
43
|
+
actorId?: string | null;
|
|
44
|
+
}): ContractStageHistoryEntry;
|
|
45
|
+
export declare function appendContractStageHistory(current: readonly ContractStageHistoryEntry[] | null | undefined, entry: ContractStageHistoryEntry): ContractStageHistoryEntry[];
|
|
46
|
+
export declare function checkContractLifecycleTransition(from: ContractLifecycleStage, transition: Exclude<ContractLifecycleTransition, "created">): ContractLifecycleTransitionCheck;
|
|
47
|
+
export declare function buildContractLifecycleEvent(contract: Contract, previousStage: ContractLifecycleStage, stage: ContractLifecycleStage, transition: Exclude<ContractLifecycleTransition, "created">, occurredAt: Date): ContractLifecycleEvent;
|
|
48
|
+
export declare function emitContractLifecycleEvent(runtime: ContractLifecycleRuntimeOptions | undefined, event: ContractLifecycleEvent): Promise<void>;
|
|
49
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/contracts/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,OAAO,KAAK,EAAE,QAAQ,EAAE,yBAAyB,EAAkB,MAAM,aAAa,CAAA;AAEtF,eAAO,MAAM,yBAAyB,+EAQQ,CAAA;AAE9C,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE/E,MAAM,MAAM,2BAA2B,GACnC,SAAS,GACT,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,UAAU,GACV,QAAQ,CAAA;AAEZ,eAAO,MAAM,8BAA8B;;;;;;CAMyC,CAAA;AAEpF,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IACxB,aAAa,EAAE,sBAAsB,CAAA;IACrC,KAAK,EAAE,sBAAsB,CAAA;IAC7B,UAAU,EAAE,OAAO,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAA;IAC3D,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAE3F,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,cAAc,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAA;CAClD;AAED,MAAM,MAAM,gCAAgC,GACxC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,cAAc,CAAA;CAAE,CAAA;AAQlG,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,sBAAsB,EAC7B,OAAO,GAAE;IACP,aAAa,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAA;IAC7C,UAAU,CAAC,EAAE,2BAA2B,CAAA;IACxC,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACnB,GACL,yBAAyB,CAQ3B;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,SAAS,yBAAyB,EAAE,GAAG,IAAI,GAAG,SAAS,EAChE,KAAK,EAAE,yBAAyB,GAC/B,yBAAyB,EAAE,CAa7B;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,sBAAsB,EAC5B,UAAU,EAAE,OAAO,CAAC,2BAA2B,EAAE,SAAS,CAAC,GAC1D,gCAAgC,CAelC;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,sBAAsB,EACrC,KAAK,EAAE,sBAAsB,EAC7B,UAAU,EAAE,OAAO,CAAC,2BAA2B,EAAE,SAAS,CAAC,EAC3D,UAAU,EAAE,IAAI,GACf,sBAAsB,CAgBxB;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,+BAA+B,GAAG,SAAS,EACpD,KAAK,EAAE,sBAAsB,iBAe9B"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export const CONTRACT_LIFECYCLE_STAGES = [
|
|
2
|
+
"draft",
|
|
3
|
+
"issued",
|
|
4
|
+
"sent",
|
|
5
|
+
"signed",
|
|
6
|
+
"executed",
|
|
7
|
+
"expired",
|
|
8
|
+
"void",
|
|
9
|
+
];
|
|
10
|
+
export const CONTRACT_LIFECYCLE_EVENT_NAMES = {
|
|
11
|
+
issued: "contract.issued",
|
|
12
|
+
sent: "contract.sent",
|
|
13
|
+
signed: "contract.signed",
|
|
14
|
+
executed: "contract.executed",
|
|
15
|
+
voided: "contract.voided",
|
|
16
|
+
};
|
|
17
|
+
function isContractLifecycleStage(value) {
|
|
18
|
+
return (typeof value === "string" && CONTRACT_LIFECYCLE_STAGES.includes(value));
|
|
19
|
+
}
|
|
20
|
+
export function createContractStageHistoryEntry(stage, options = {}) {
|
|
21
|
+
return {
|
|
22
|
+
stage,
|
|
23
|
+
previousStage: options.previousStage ?? null,
|
|
24
|
+
transition: options.transition ?? "created",
|
|
25
|
+
enteredAt: (options.enteredAt ?? new Date()).toISOString(),
|
|
26
|
+
...(options.actorId === undefined ? {} : { actorId: options.actorId }),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function appendContractStageHistory(current, entry) {
|
|
30
|
+
const existing = Array.isArray(current)
|
|
31
|
+
? current.filter((item) => isContractLifecycleStage(item.stage) &&
|
|
32
|
+
(item.previousStage === null ||
|
|
33
|
+
item.previousStage === undefined ||
|
|
34
|
+
isContractLifecycleStage(item.previousStage)) &&
|
|
35
|
+
typeof item.transition === "string" &&
|
|
36
|
+
typeof item.enteredAt === "string")
|
|
37
|
+
: [];
|
|
38
|
+
return [...existing, entry];
|
|
39
|
+
}
|
|
40
|
+
export function checkContractLifecycleTransition(from, transition) {
|
|
41
|
+
switch (transition) {
|
|
42
|
+
case "issued":
|
|
43
|
+
return from === "draft" ? { ok: true } : { ok: false, reason: "not_draft" };
|
|
44
|
+
case "sent":
|
|
45
|
+
return from === "issued" || from === "sent"
|
|
46
|
+
? { ok: true }
|
|
47
|
+
: { ok: false, reason: "not_issued" };
|
|
48
|
+
case "signed":
|
|
49
|
+
return from === "sent" ? { ok: true } : { ok: false, reason: "not_sent" };
|
|
50
|
+
case "executed":
|
|
51
|
+
return from === "signed" ? { ok: true } : { ok: false, reason: "not_signed" };
|
|
52
|
+
case "voided":
|
|
53
|
+
return from === "void" ? { ok: false, reason: "already_void" } : { ok: true };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function buildContractLifecycleEvent(contract, previousStage, stage, transition, occurredAt) {
|
|
57
|
+
return {
|
|
58
|
+
contractId: contract.id,
|
|
59
|
+
contractNumber: contract.contractNumber ?? null,
|
|
60
|
+
scope: contract.scope,
|
|
61
|
+
previousStage,
|
|
62
|
+
stage,
|
|
63
|
+
transition,
|
|
64
|
+
occurredAt: occurredAt.toISOString(),
|
|
65
|
+
personId: contract.personId ?? null,
|
|
66
|
+
organizationId: contract.organizationId ?? null,
|
|
67
|
+
supplierId: contract.supplierId ?? null,
|
|
68
|
+
channelId: contract.channelId ?? null,
|
|
69
|
+
bookingId: contract.bookingId ?? null,
|
|
70
|
+
orderId: contract.orderId ?? null,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export async function emitContractLifecycleEvent(runtime, event) {
|
|
74
|
+
const eventName = CONTRACT_LIFECYCLE_EVENT_NAMES[event.transition];
|
|
75
|
+
await runtime?.eventBus?.emit(eventName, event, {
|
|
76
|
+
category: "domain",
|
|
77
|
+
source: "service",
|
|
78
|
+
});
|
|
79
|
+
for (const hook of runtime?.lifecycleHooks ?? []) {
|
|
80
|
+
try {
|
|
81
|
+
await hook(event);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error(`[legal] lifecycle hook failed for ${eventName}:`, error);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { EventBus } from "@voyantjs/core";
|
|
2
2
|
import type { StorageProvider } from "@voyantjs/storage";
|
|
3
|
+
import type { ContractLifecycleHook } from "./lifecycle.js";
|
|
3
4
|
import type { ContractDocumentGenerator, ContractsRouteOptions } from "./routes.js";
|
|
4
5
|
export type ContractsRouteRuntime = {
|
|
5
6
|
documentGenerator?: ContractDocumentGenerator;
|
|
6
7
|
documentStorage?: StorageProvider | null;
|
|
7
8
|
eventBus?: EventBus;
|
|
9
|
+
lifecycleHooks?: readonly ContractLifecycleHook[];
|
|
8
10
|
};
|
|
9
11
|
export declare const CONTRACTS_ROUTE_RUNTIME_CONTAINER_KEY = "providers.legal.contracts.runtime";
|
|
10
12
|
export declare function buildContractsRouteRuntime(bindings: Record<string, unknown>, options?: ContractsRouteOptions): ContractsRouteRuntime;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-runtime.d.ts","sourceRoot":"","sources":["../../src/contracts/route-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,KAAK,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnF,MAAM,MAAM,qBAAqB,GAAG;IAClC,iBAAiB,CAAC,EAAE,yBAAyB,CAAA;IAC7C,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACxC,QAAQ,CAAC,EAAE,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"route-runtime.d.ts","sourceRoot":"","sources":["../../src/contracts/route-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAC3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnF,MAAM,MAAM,qBAAqB,GAAG;IAClC,iBAAiB,CAAC,EAAE,yBAAyB,CAAA;IAC7C,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACxC,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,cAAc,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,qCAAqC,sCAAsC,CAAA;AAExF,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,GAAE,qBAA0B,GAClC,qBAAqB,CAOvB"}
|
|
@@ -4,5 +4,6 @@ export function buildContractsRouteRuntime(bindings, options = {}) {
|
|
|
4
4
|
documentGenerator: options.resolveDocumentGenerator?.(bindings) ?? options.documentGenerator,
|
|
5
5
|
documentStorage: options.resolveDocumentStorage?.(bindings) ?? options.documentStorage,
|
|
6
6
|
eventBus: options.resolveEventBus?.(bindings) ?? options.eventBus,
|
|
7
|
+
lifecycleHooks: options.resolveLifecycleHooks?.(bindings) ?? options.lifecycleHooks,
|
|
7
8
|
};
|
|
8
9
|
}
|