@happyvertical/smrt-sales 0.57.22 → 0.57.24
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/AGENTS.md +8 -0
- package/README.md +34 -0
- package/agents/agreements.md +32 -0
- package/agents/commissions.md +2 -1
- package/agents/crm.md +150 -0
- package/agents/svelte.md +7 -0
- package/dist/agreements/collections/AgreementCollection.d.ts +3 -2
- package/dist/agreements/collections/AgreementCollection.d.ts.map +1 -1
- package/dist/agreements/models/Agreement.d.ts.map +1 -1
- package/dist/agreements/services/AgreementExecutionService.d.ts +9 -0
- package/dist/agreements/services/AgreementExecutionService.d.ts.map +1 -1
- package/dist/agreements/types.d.ts +2 -0
- package/dist/agreements/types.d.ts.map +1 -1
- package/dist/agreements.js +2 -2
- package/dist/chunks/__smrt-register__-Yzz7_2xD.js +6 -0
- package/dist/chunks/__smrt-register__-Yzz7_2xD.js.map +1 -0
- package/dist/chunks/{agreements-jBiVmttD.js → agreements-RsyRLeDn.js} +35 -16
- package/dist/chunks/agreements-RsyRLeDn.js.map +1 -0
- package/dist/chunks/{commissions-D5x24d4o.js → commissions-nMBMa0DT.js} +410 -344
- package/dist/chunks/commissions-nMBMa0DT.js.map +1 -0
- package/dist/chunks/{crm-BRICSwf2.js → crm-BENK-hHd.js} +793 -123
- package/dist/chunks/crm-BENK-hHd.js.map +1 -0
- package/dist/chunks/{referrals-BRdTkEFt.js → referrals-BPEaXqCz.js} +2 -2
- package/dist/chunks/{referrals-BRdTkEFt.js.map → referrals-BPEaXqCz.js.map} +1 -1
- package/dist/commissions/collections/CommissionPayoutCollection.d.ts +3 -1
- package/dist/commissions/collections/CommissionPayoutCollection.d.ts.map +1 -1
- package/dist/commissions/models/CommissionPayout.d.ts +15 -1
- package/dist/commissions/models/CommissionPayout.d.ts.map +1 -1
- package/dist/commissions/services/CommissionPayoutService.d.ts.map +1 -1
- package/dist/commissions/types.d.ts +2 -0
- package/dist/commissions/types.d.ts.map +1 -1
- package/dist/commissions.js +2 -2
- package/dist/crm/collections/SalesGovernanceEventCollection.d.ts +7 -0
- package/dist/crm/collections/SalesGovernanceEventCollection.d.ts.map +1 -0
- package/dist/crm/collections/SalesGovernanceStateCollection.d.ts +13 -0
- package/dist/crm/collections/SalesGovernanceStateCollection.d.ts.map +1 -0
- package/dist/crm/index.d.ts +6 -0
- package/dist/crm/index.d.ts.map +1 -1
- package/dist/crm/models/SalesGovernanceEvent.d.ts +19 -0
- package/dist/crm/models/SalesGovernanceEvent.d.ts.map +1 -0
- package/dist/crm/models/SalesGovernanceState.d.ts +17 -0
- package/dist/crm/models/SalesGovernanceState.d.ts.map +1 -0
- package/dist/crm/services/SalesGovernanceService.d.ts +68 -0
- package/dist/crm/services/SalesGovernanceService.d.ts.map +1 -0
- package/dist/crm/services/governance-write.d.ts +4 -0
- package/dist/crm/services/governance-write.d.ts.map +1 -0
- package/dist/crm/services/sales-governance-types.d.ts +108 -0
- package/dist/crm/services/sales-governance-types.d.ts.map +1 -0
- package/dist/crm.js +3 -3
- package/dist/index.js +6 -6
- package/dist/manifest.json +592 -5
- package/dist/referrals.js +2 -2
- package/dist/smrt-knowledge.json +320 -14
- package/dist/svelte/components/SellerGovernancePanel.svelte +65 -0
- package/dist/svelte/components/SellerGovernancePanel.svelte.d.ts +13 -0
- package/dist/svelte/components/SellerGovernancePanel.svelte.d.ts.map +1 -0
- package/dist/svelte/index.d.ts +2 -1
- package/dist/svelte/index.d.ts.map +1 -1
- package/dist/svelte/index.js +1 -0
- package/dist/svelte/types.d.ts +22 -1
- package/dist/svelte/types.d.ts.map +1 -1
- package/package.json +6 -6
- package/dist/chunks/__smrt-register__-bn1C2AUF.js +0 -6
- package/dist/chunks/__smrt-register__-bn1C2AUF.js.map +0 -1
- package/dist/chunks/agreements-jBiVmttD.js.map +0 -1
- package/dist/chunks/commissions-D5x24d4o.js.map +0 -1
- package/dist/chunks/crm-BRICSwf2.js.map +0 -1
|
@@ -219,7 +219,7 @@ var Agreement = class extends SmrtObject {
|
|
|
219
219
|
/** @internal Complete observation of a collection-owned guarded transition. */
|
|
220
220
|
async refreshAfterLifecycleTransition() {
|
|
221
221
|
if (!this.isPersisted || !this.id) throw new Error("Agreement is not persisted");
|
|
222
|
-
const durableRow = await this.
|
|
222
|
+
const durableRow = await this.getCanonicalPersistedRow({ id: this.id });
|
|
223
223
|
if (!durableRow) throw new Error("Agreement disappeared during transition");
|
|
224
224
|
await this.completePersistedUpdate(durableRow);
|
|
225
225
|
loadedStatus.set(this, this.status);
|
|
@@ -227,7 +227,7 @@ var Agreement = class extends SmrtObject {
|
|
|
227
227
|
frozenEnd.set(this, this.effectiveTo?.getTime() ?? null);
|
|
228
228
|
}
|
|
229
229
|
async assertActivationProvenanceUnchanged() {
|
|
230
|
-
const persisted = this.isPersisted && this.id ? await this.
|
|
230
|
+
const persisted = this.isPersisted && this.id ? await this.getCanonicalPersistedRow({ id: this.id }) : null;
|
|
231
231
|
const priorId = persisted?.amendment_predecessor_id ?? null;
|
|
232
232
|
const priorEnd = coerceAgreementDate(persisted?.amendment_predecessor_end)?.getTime() ?? null;
|
|
233
233
|
if (this.amendmentPredecessorId !== priorId || (this.amendmentPredecessorEnd?.getTime() ?? null) !== priorEnd) throw new Error("Agreement activation provenance is owned by activateAmendment");
|
|
@@ -249,15 +249,23 @@ var Agreement = class extends SmrtObject {
|
|
|
249
249
|
async assertNaturalKeyNotTaken() {
|
|
250
250
|
if (!this.kind || !this.partyA || !this.partyB) return;
|
|
251
251
|
try {
|
|
252
|
-
const
|
|
253
|
-
if ((Array.isArray(
|
|
252
|
+
const result = await this.db.query(`SELECT id, tenant_id FROM ${this.tableName} WHERE kind = $1 AND party_a = $2 AND party_b = $3 AND version = $4`, this.kind, this.partyA, this.partyB, this.version);
|
|
253
|
+
if ((Array.isArray(result) ? result : result.rows).length === 0) return;
|
|
254
|
+
if (await this.getCanonicalPersistedRow({
|
|
255
|
+
kind: this.kind,
|
|
256
|
+
party_a: this.partyA,
|
|
257
|
+
party_b: this.partyB,
|
|
258
|
+
version: this.version,
|
|
259
|
+
tenant_id: this.tenantId,
|
|
260
|
+
...this.id ? { "id !=": this.id } : {}
|
|
261
|
+
})) throw new Error(`Agreement ${this.kind}@${this.version}: this immutable version already exists; create an amendment instead`);
|
|
254
262
|
} catch (error) {
|
|
255
263
|
if (error instanceof Error && error.message.includes("immutable version")) throw error;
|
|
256
264
|
}
|
|
257
265
|
}
|
|
258
266
|
async resolvePriorStatus() {
|
|
259
267
|
if (this.id) try {
|
|
260
|
-
const row = await this.
|
|
268
|
+
const row = await this.getCanonicalPersistedRow({ id: this.id });
|
|
261
269
|
if (row?.status != null) return row.status;
|
|
262
270
|
} catch {}
|
|
263
271
|
return loadedStatus.get(this);
|
|
@@ -420,8 +428,9 @@ var AgreementCollection = class AgreementCollection extends SmrtCollection {
|
|
|
420
428
|
if (!activated) throw new Error(`Agreement '${activatedId}' disappeared`);
|
|
421
429
|
return activated;
|
|
422
430
|
}
|
|
423
|
-
/** Withdraw a scheduled
|
|
424
|
-
* Restores
|
|
431
|
+
/** Withdraw a scheduled active version before it has ever governed.
|
|
432
|
+
* Restores its persisted predecessor boundary when activation closed one.
|
|
433
|
+
* Initial versions and amendments following a gap restore nothing.
|
|
425
434
|
* Repeated/concurrent withdrawal refuses rather than applying recovery twice.
|
|
426
435
|
*/
|
|
427
436
|
async withdrawAmendment(id) {
|
|
@@ -431,18 +440,21 @@ var AgreementCollection = class AgreementCollection extends SmrtCollection {
|
|
|
431
440
|
const agreements = await AgreementCollection.create({ db: tx });
|
|
432
441
|
const successor = await agreements.get({ id });
|
|
433
442
|
const now = /* @__PURE__ */ new Date();
|
|
434
|
-
if (!successor || successor.status !== "active" || !successor.effectiveFrom || successor.effectiveFrom <= now
|
|
435
|
-
const predecessor = await agreements.get({ id: successor.amendmentPredecessorId });
|
|
436
|
-
if (!predecessor || predecessor.tenantId !== successor.tenantId || predecessor.kind !== successor.kind || predecessor.partyA !== successor.partyA || predecessor.partyB !== successor.partyB || predecessor.version >= successor.version || predecessor.status !== "superseded" || predecessor.effectiveTo?.getTime() !== successor.effectiveFrom.getTime()) throw new Error("Agreement withdrawal predecessor no longer matches activation provenance");
|
|
443
|
+
if (!successor || successor.status !== "active" || !successor.effectiveFrom || successor.effectiveFrom <= now) throw new Error("Only a scheduled active agreement can be withdrawn");
|
|
444
|
+
const predecessor = successor.amendmentPredecessorId ? await agreements.get({ id: successor.amendmentPredecessorId }) : null;
|
|
445
|
+
if (successor.amendmentPredecessorId && (!predecessor || predecessor.tenantId !== successor.tenantId || predecessor.kind !== successor.kind || predecessor.partyA !== successor.partyA || predecessor.partyB !== successor.partyB || predecessor.version >= successor.version || predecessor.status !== "superseded" || predecessor.effectiveTo?.getTime() !== successor.effectiveFrom.getTime())) throw new Error("Agreement withdrawal predecessor no longer matches activation provenance");
|
|
437
446
|
const restoredEnd = successor.amendmentPredecessorEnd;
|
|
438
|
-
if (restoredEnd && restoredEnd <= successor.effectiveFrom) throw new Error("Agreement withdrawal has invalid predecessor boundary provenance");
|
|
439
|
-
|
|
447
|
+
if (restoredEnd && (!predecessor || restoredEnd <= successor.effectiveFrom)) throw new Error("Agreement withdrawal has invalid predecessor boundary provenance");
|
|
448
|
+
const checkedEnd = predecessor ? restoredEnd : successor.effectiveTo;
|
|
449
|
+
if ((await agreements.findGoverningCandidates(successor.kind, successor.partyA, successor.partyB, successor.tenantId, false)).some((row) => row.id !== successor.id && row.id !== predecessor?.id && row.status !== "draft" && row.status !== "cancelled" && (!checkedEnd || !row.effectiveFrom || row.effectiveFrom < checkedEnd) && (!row.effectiveTo || row.effectiveTo > successor.effectiveFrom))) throw new Error("Agreement withdrawal would overlap governing history");
|
|
440
450
|
await claimLifecycleRevision(successor);
|
|
441
451
|
if (returnedRows(await tx.query(`UPDATE ${agreements.tableName} SET status = 'cancelled' WHERE id = $1 AND status = 'active' AND effective_from > $2 RETURNING id`, id, (/* @__PURE__ */ new Date()).toISOString())).length !== 1) throw new Error("Agreement withdrawal lost its scheduled active transition");
|
|
442
|
-
|
|
443
|
-
|
|
452
|
+
if (predecessor) {
|
|
453
|
+
await claimLifecycleRevision(predecessor);
|
|
454
|
+
if (returnedRows(await tx.query(`UPDATE ${agreements.tableName} SET status = 'active', effective_to = $1 WHERE id = $2 AND status = 'superseded' AND effective_to = $3 RETURNING id`, restoredEnd?.toISOString() ?? null, predecessor.id, successor.effectiveFrom.toISOString())).length !== 1) throw new Error("Agreement withdrawal predecessor changed concurrently");
|
|
455
|
+
}
|
|
444
456
|
await successor.refreshAfterLifecycleTransition();
|
|
445
|
-
await predecessor.refreshAfterLifecycleTransition();
|
|
457
|
+
if (predecessor) await predecessor.refreshAfterLifecycleTransition();
|
|
446
458
|
});
|
|
447
459
|
invalidateCollectionCache(resolveDbCacheKey(this.db), this.tableName);
|
|
448
460
|
const withdrawn = await this.get({ id });
|
|
@@ -1336,6 +1348,7 @@ var AgreementExecutionService = class {
|
|
|
1336
1348
|
this.assertTenant(input.tenantId);
|
|
1337
1349
|
this.assertProviderCapabilities();
|
|
1338
1350
|
this.assertCreateInput(input);
|
|
1351
|
+
await this.authorizeSigning(input);
|
|
1339
1352
|
const sourceBytes = await readByteSource(input.document.data);
|
|
1340
1353
|
if (sourceBytes.byteLength === 0) throw new Error("Agreement execution document must not be empty");
|
|
1341
1354
|
const sourceSha256 = sha256(sourceBytes);
|
|
@@ -1417,6 +1430,7 @@ var AgreementExecutionService = class {
|
|
|
1417
1430
|
let request;
|
|
1418
1431
|
let providerResponded = false;
|
|
1419
1432
|
try {
|
|
1433
|
+
await this.authorizeSigning(input);
|
|
1420
1434
|
request = await this.deps.provider.createRequest({
|
|
1421
1435
|
tenantId: input.tenantId,
|
|
1422
1436
|
idempotencyKey: input.idempotencyKey,
|
|
@@ -1999,6 +2013,10 @@ var AgreementExecutionService = class {
|
|
|
1999
2013
|
replayed
|
|
2000
2014
|
};
|
|
2001
2015
|
}
|
|
2016
|
+
async authorizeSigning(input) {
|
|
2017
|
+
if (input.sourceKind === "sales-quote" && (!input.signingActorProfileId?.trim() || !this.deps.authorizeSigning)) throw new Error("Governed sales quote signing requires an actor and authorization guard");
|
|
2018
|
+
await this.deps.authorizeSigning?.(input);
|
|
2019
|
+
}
|
|
2002
2020
|
assertTenant(expected) {
|
|
2003
2021
|
this.assertTenantValue(requireTenantId(), expected, "tenant context");
|
|
2004
2022
|
}
|
|
@@ -2018,6 +2036,7 @@ function hashRequestIntent(input, provider, sourceSha256, effectiveFrom, effecti
|
|
|
2018
2036
|
sourceKind: input.sourceKind,
|
|
2019
2037
|
sourceId: input.sourceId,
|
|
2020
2038
|
sourceVersion: input.sourceVersion,
|
|
2039
|
+
...input.signingActorProfileId ? { signingActorProfileId: input.signingActorProfileId } : {},
|
|
2021
2040
|
sourceSha256,
|
|
2022
2041
|
documentName: input.document.name,
|
|
2023
2042
|
documentMediaType: input.document.mediaType,
|
|
@@ -2107,4 +2126,4 @@ function canAdvanceStatus(current, next) {
|
|
|
2107
2126
|
//#endregion
|
|
2108
2127
|
export { AgreementExecutionEvent as a, AgreementCollection as c, serializeAgreementParty as d, AGREEMENT_EXECUTION_STATUSES as f, sanitizeSignerIntent as g, sanitizeSignerEvidence as h, AgreementExecutionEventCollection as i, Agreement as l, coerceAgreementDate as m, ExecutedAgreementCollection as n, AgreementExecutionCollection as o, AGREEMENT_STATUSES as p, ExecutedAgreement as r, AgreementExecution as s, AgreementExecutionService as t, parseAgreementParty as u };
|
|
2109
2128
|
|
|
2110
|
-
//# sourceMappingURL=agreements-
|
|
2129
|
+
//# sourceMappingURL=agreements-RsyRLeDn.js.map
|