@mj-biz-apps/orders-entities 0.0.1 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +183 -0
- package/README.md +50 -2
- package/dist/CustomerPaymentMethodEntity.d.ts +4 -0
- package/dist/CustomerPaymentMethodEntity.d.ts.map +1 -0
- package/dist/CustomerPaymentMethodEntity.js +26 -0
- package/dist/CustomerPaymentMethodEntity.js.map +1 -0
- package/dist/InitialPaymentIntentCompanion.d.ts +29 -0
- package/dist/InitialPaymentIntentCompanion.d.ts.map +1 -0
- package/dist/InitialPaymentIntentCompanion.js +40 -0
- package/dist/InitialPaymentIntentCompanion.js.map +1 -0
- package/dist/OrderHeaderEntity.d.ts +224 -0
- package/dist/OrderHeaderEntity.d.ts.map +1 -0
- package/dist/OrderHeaderEntity.js +509 -0
- package/dist/OrderHeaderEntity.js.map +1 -0
- package/dist/OrderLineEntity.d.ts +25 -0
- package/dist/OrderLineEntity.d.ts.map +1 -0
- package/dist/OrderLineEntity.js +54 -0
- package/dist/OrderLineEntity.js.map +1 -0
- package/dist/OrderLineExtensionCompanion.d.ts +54 -0
- package/dist/OrderLineExtensionCompanion.d.ts.map +1 -0
- package/dist/OrderLineExtensionCompanion.js +167 -0
- package/dist/OrderLineExtensionCompanion.js.map +1 -0
- package/dist/OrderStatusBehavior.d.ts +86 -0
- package/dist/OrderStatusBehavior.d.ts.map +1 -0
- package/dist/OrderStatusBehavior.js +160 -0
- package/dist/OrderStatusBehavior.js.map +1 -0
- package/dist/PartyAffiliationBehavior.d.ts +20 -0
- package/dist/PartyAffiliationBehavior.d.ts.map +1 -0
- package/dist/PartyAffiliationBehavior.js +52 -0
- package/dist/PartyAffiliationBehavior.js.map +1 -0
- package/dist/PaymentHeaderEntity.d.ts +18 -0
- package/dist/PaymentHeaderEntity.d.ts.map +1 -0
- package/dist/PaymentHeaderEntity.js +80 -0
- package/dist/PaymentHeaderEntity.js.map +1 -0
- package/dist/PricingDriverResolver.d.ts +70 -0
- package/dist/PricingDriverResolver.d.ts.map +1 -0
- package/dist/PricingDriverResolver.js +145 -0
- package/dist/PricingDriverResolver.js.map +1 -0
- package/dist/PromotionCodesCompanion.d.ts +77 -0
- package/dist/PromotionCodesCompanion.d.ts.map +1 -0
- package/dist/PromotionCodesCompanion.js +111 -0
- package/dist/PromotionCodesCompanion.js.map +1 -0
- package/dist/booked-money.d.ts +27 -0
- package/dist/booked-money.d.ts.map +1 -0
- package/dist/booked-money.js +67 -0
- package/dist/booked-money.js.map +1 -0
- package/dist/configuration-types.d.ts +157 -0
- package/dist/configuration-types.d.ts.map +1 -0
- package/dist/configuration-types.js +10 -0
- package/dist/configuration-types.js.map +1 -0
- package/dist/date-cell.d.ts +109 -0
- package/dist/date-cell.d.ts.map +1 -0
- package/dist/date-cell.js +131 -0
- package/dist/date-cell.js.map +1 -0
- package/dist/generated/entity_subclasses.d.ts +12055 -0
- package/dist/generated/entity_subclasses.d.ts.map +1 -0
- package/dist/generated/entity_subclasses.js +17800 -0
- package/dist/generated/entity_subclasses.js.map +1 -0
- package/dist/generated/remote_operations.d.ts +2365 -0
- package/dist/generated/remote_operations.d.ts.map +1 -0
- package/dist/generated/remote_operations.js +768 -0
- package/dist/generated/remote_operations.js.map +1 -0
- package/dist/index.d.ts +102 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/line-quantity.d.ts +6 -0
- package/dist/line-quantity.d.ts.map +1 -0
- package/dist/line-quantity.js +11 -0
- package/dist/line-quantity.js.map +1 -0
- package/dist/overdue.d.ts +77 -0
- package/dist/overdue.d.ts.map +1 -0
- package/dist/overdue.js +90 -0
- package/dist/overdue.js.map +1 -0
- package/dist/pricing/ChargeBehavior.d.ts +64 -0
- package/dist/pricing/ChargeBehavior.d.ts.map +1 -0
- package/dist/pricing/ChargeBehavior.js +124 -0
- package/dist/pricing/ChargeBehavior.js.map +1 -0
- package/dist/pricing/ChargeEngine.d.ts +54 -0
- package/dist/pricing/ChargeEngine.d.ts.map +1 -0
- package/dist/pricing/ChargeEngine.js +154 -0
- package/dist/pricing/ChargeEngine.js.map +1 -0
- package/dist/pricing/OrderPricingService.d.ts +244 -0
- package/dist/pricing/OrderPricingService.d.ts.map +1 -0
- package/dist/pricing/OrderPricingService.js +516 -0
- package/dist/pricing/OrderPricingService.js.map +1 -0
- package/dist/pricing/OrdersEngine.d.ts +100 -0
- package/dist/pricing/OrdersEngine.d.ts.map +1 -0
- package/dist/pricing/OrdersEngine.js +156 -0
- package/dist/pricing/OrdersEngine.js.map +1 -0
- package/dist/pricing/PriceResolver.d.ts +127 -0
- package/dist/pricing/PriceResolver.d.ts.map +1 -0
- package/dist/pricing/PriceResolver.js +345 -0
- package/dist/pricing/PriceResolver.js.map +1 -0
- package/dist/pricing/PricingBehavior.d.ts +161 -0
- package/dist/pricing/PricingBehavior.d.ts.map +1 -0
- package/dist/pricing/PricingBehavior.js +351 -0
- package/dist/pricing/PricingBehavior.js.map +1 -0
- package/dist/pricing/PromotionBehavior.d.ts +73 -0
- package/dist/pricing/PromotionBehavior.d.ts.map +1 -0
- package/dist/pricing/PromotionBehavior.js +166 -0
- package/dist/pricing/PromotionBehavior.js.map +1 -0
- package/dist/pricing/PromotionEngine.d.ts +131 -0
- package/dist/pricing/PromotionEngine.d.ts.map +1 -0
- package/dist/pricing/PromotionEngine.js +505 -0
- package/dist/pricing/PromotionEngine.js.map +1 -0
- package/dist/pricing/TaxResolver.d.ts +162 -0
- package/dist/pricing/TaxResolver.d.ts.map +1 -0
- package/dist/pricing/TaxResolver.js +361 -0
- package/dist/pricing/TaxResolver.js.map +1 -0
- package/dist/save-populated-fields.d.ts +17 -0
- package/dist/save-populated-fields.d.ts.map +1 -0
- package/dist/save-populated-fields.js +25 -0
- package/dist/save-populated-fields.js.map +1 -0
- package/package.json +34 -5
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `OrderLineExtensionCompanion` — weaves an extension entity (e.g. `EventOrderLine`)
|
|
3
|
+
* into an `OrderLine`, participating in validation, serialization, and server-side atomic persistence.
|
|
4
|
+
*
|
|
5
|
+
* @module @mj-biz-apps/orders-entities
|
|
6
|
+
*/
|
|
7
|
+
import { BaseEntity, EntityCompanion, ValidationResult, type EntityCompanionDeserializeMode } from '@memberjunction/core';
|
|
8
|
+
/**
|
|
9
|
+
* The wire shape for an order line extension.
|
|
10
|
+
*/
|
|
11
|
+
export type OrderLineExtensionWire = {
|
|
12
|
+
/** The extension entity name in MJ metadata (e.g. `'MJ_BizApps_Orders: Event Order Lines'`). */
|
|
13
|
+
EntityName: string;
|
|
14
|
+
/** The extension entity's field values. */
|
|
15
|
+
Fields: Record<string, unknown>;
|
|
16
|
+
/** Whether this extension record is a pending insert rather than an existing row. */
|
|
17
|
+
IsNew: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare class OrderLineExtensionCompanion extends EntityCompanion<OrderLineExtensionWire> {
|
|
20
|
+
/**
|
|
21
|
+
* Stable companion identifier.
|
|
22
|
+
*/
|
|
23
|
+
readonly Name = "OrderLineExtension";
|
|
24
|
+
private _entityName;
|
|
25
|
+
private _entity;
|
|
26
|
+
private _wireData;
|
|
27
|
+
/** The extension entity name in metadata, if configured. */
|
|
28
|
+
get EntityName(): string | null;
|
|
29
|
+
/** The live extension entity instance, if provisioned. */
|
|
30
|
+
get Entity(): BaseEntity | null;
|
|
31
|
+
/** True when this companion has an extension entity attached or specified. */
|
|
32
|
+
get IsConfigured(): boolean;
|
|
33
|
+
/** True when the extension entity is persisted in the database. */
|
|
34
|
+
get IsSaved(): boolean;
|
|
35
|
+
/** True when the extension entity has uncommitted changes. */
|
|
36
|
+
get Dirty(): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Attaches an extension entity instance directly.
|
|
39
|
+
*/
|
|
40
|
+
SetEntity(entity: BaseEntity | null): void;
|
|
41
|
+
/**
|
|
42
|
+
* Ensures an extension entity object exists, creating or hydrating one if necessary.
|
|
43
|
+
*/
|
|
44
|
+
EnsureEntity(entityName?: string): Promise<BaseEntity | null>;
|
|
45
|
+
/** @inheritdoc */
|
|
46
|
+
Serialize(mode?: EntityCompanionDeserializeMode): Promise<OrderLineExtensionWire | null>;
|
|
47
|
+
/** @inheritdoc */
|
|
48
|
+
Deserialize(data: OrderLineExtensionWire, mode?: EntityCompanionDeserializeMode): Promise<void>;
|
|
49
|
+
/** @inheritdoc */
|
|
50
|
+
Validate(result: ValidationResult): void;
|
|
51
|
+
/** @inheritdoc */
|
|
52
|
+
AcceptChanges(): void;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=OrderLineExtensionCompanion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrderLineExtensionCompanion.d.ts","sourceRoot":"","sources":["../src/OrderLineExtensionCompanion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACH,UAAU,EAEV,eAAe,EAEf,gBAAgB,EAChB,KAAK,8BAA8B,EAEtC,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,gGAAgG;IAChG,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,qFAAqF;IACrF,KAAK,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,qBAAa,2BAA4B,SAAQ,eAAe,CAAC,sBAAsB,CAAC;IACpF;;OAEG;IACH,SAAgB,IAAI,wBAAwB;IAE5C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,SAAS,CAAuC;IAExD,4DAA4D;IAC5D,IAAW,UAAU,IAAI,MAAM,GAAG,IAAI,CAErC;IAED,0DAA0D;IAC1D,IAAW,MAAM,IAAI,UAAU,GAAG,IAAI,CAErC;IAED,8EAA8E;IAC9E,IAAW,YAAY,IAAI,OAAO,CAEjC;IAED,mEAAmE;IACnE,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED,8DAA8D;IAC9D,IAAoB,KAAK,IAAI,OAAO,CAKnC;IAED;;OAEG;IACI,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI;IAMjD;;OAEG;IACU,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA2D1E,kBAAkB;IACI,SAAS,CAC3B,IAAI,GAAE,8BAA0C,GACjD,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAyBzC,kBAAkB;IACI,WAAW,CAC7B,IAAI,EAAE,sBAAsB,EAC5B,IAAI,GAAE,8BAA0C,GACjD,OAAO,CAAC,IAAI,CAAC;IAoBhB,kBAAkB;IACF,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAgBxD,kBAAkB;IACF,aAAa,IAAI,IAAI;CAKxC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `OrderLineExtensionCompanion` — weaves an extension entity (e.g. `EventOrderLine`)
|
|
3
|
+
* into an `OrderLine`, participating in validation, serialization, and server-side atomic persistence.
|
|
4
|
+
*
|
|
5
|
+
* @module @mj-biz-apps/orders-entities
|
|
6
|
+
*/
|
|
7
|
+
import { CompositeKey, EntityCompanion, KeyValuePair, } from '@memberjunction/core';
|
|
8
|
+
export class OrderLineExtensionCompanion extends EntityCompanion {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
/**
|
|
12
|
+
* Stable companion identifier.
|
|
13
|
+
*/
|
|
14
|
+
this.Name = 'OrderLineExtension';
|
|
15
|
+
this._entityName = null;
|
|
16
|
+
this._entity = null;
|
|
17
|
+
this._wireData = null;
|
|
18
|
+
}
|
|
19
|
+
/** The extension entity name in metadata, if configured. */
|
|
20
|
+
get EntityName() {
|
|
21
|
+
return this._entity?.EntityInfo?.Name ?? this._entityName;
|
|
22
|
+
}
|
|
23
|
+
/** The live extension entity instance, if provisioned. */
|
|
24
|
+
get Entity() {
|
|
25
|
+
return this._entity;
|
|
26
|
+
}
|
|
27
|
+
/** True when this companion has an extension entity attached or specified. */
|
|
28
|
+
get IsConfigured() {
|
|
29
|
+
return !!this._entity || !!this._entityName || !!this._wireData;
|
|
30
|
+
}
|
|
31
|
+
/** True when the extension entity is persisted in the database. */
|
|
32
|
+
get IsSaved() {
|
|
33
|
+
return this._entity?.IsSaved ?? (!this._wireData?.IsNew && !!this._wireData);
|
|
34
|
+
}
|
|
35
|
+
/** True when the extension entity has uncommitted changes. */
|
|
36
|
+
get Dirty() {
|
|
37
|
+
if (this._entity) {
|
|
38
|
+
return !this._entity.IsSaved || this._entity.Dirty;
|
|
39
|
+
}
|
|
40
|
+
return !!this._wireData?.IsNew;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Attaches an extension entity instance directly.
|
|
44
|
+
*/
|
|
45
|
+
SetEntity(entity) {
|
|
46
|
+
this._entity = entity;
|
|
47
|
+
this._entityName = entity?.EntityInfo?.Name ?? null;
|
|
48
|
+
this._wireData = null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Ensures an extension entity object exists, creating or hydrating one if necessary.
|
|
52
|
+
*/
|
|
53
|
+
async EnsureEntity(entityName) {
|
|
54
|
+
const targetName = entityName ?? this.EntityName;
|
|
55
|
+
if (!targetName) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
if (this._entity && (!entityName || this._entity.EntityInfo?.Name === entityName)) {
|
|
59
|
+
return this._entity;
|
|
60
|
+
}
|
|
61
|
+
const provider = this.Owner.ProviderToUse;
|
|
62
|
+
if (!provider) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const ext = await provider.GetEntityObject(targetName, this.Owner.ContextCurrentUser);
|
|
66
|
+
if (!ext) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
const lineId = this.Owner.FirstPrimaryKey?.Value;
|
|
70
|
+
if (this._wireData) {
|
|
71
|
+
if (this._wireData.IsNew) {
|
|
72
|
+
ext.NewRecord();
|
|
73
|
+
if (lineId) {
|
|
74
|
+
ext.Set('ID', lineId);
|
|
75
|
+
}
|
|
76
|
+
ext.SetMany(this._wireData.Fields, true);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const key = new CompositeKey(ext.EntityInfo.PrimaryKeys.map(pk => new KeyValuePair(pk.Name, this._wireData.Fields[pk.Name] ?? lineId)));
|
|
80
|
+
const loaded = await ext.InnerLoad(key);
|
|
81
|
+
if (!loaded) {
|
|
82
|
+
ext.NewRecord();
|
|
83
|
+
}
|
|
84
|
+
ext.SetMany(this._wireData.Fields, true);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else if (lineId && this.Owner.IsSaved) {
|
|
88
|
+
const key = new CompositeKey(ext.EntityInfo.PrimaryKeys.map(pk => new KeyValuePair(pk.Name, lineId)));
|
|
89
|
+
const loaded = await ext.InnerLoad(key);
|
|
90
|
+
if (!loaded) {
|
|
91
|
+
ext.NewRecord();
|
|
92
|
+
ext.Set('ID', lineId);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
ext.NewRecord();
|
|
97
|
+
if (lineId) {
|
|
98
|
+
ext.Set('ID', lineId);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
this._entity = ext;
|
|
102
|
+
this._entityName = targetName;
|
|
103
|
+
return ext;
|
|
104
|
+
}
|
|
105
|
+
/** @inheritdoc */
|
|
106
|
+
async Serialize(mode = 'request') {
|
|
107
|
+
if (!this.IsConfigured) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
// In request mode, skip clean saved extensions to save bandwidth
|
|
111
|
+
if (mode !== 'result' && this._entity && this._entity.IsSaved && !this._entity.Dirty) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
if (this._entity) {
|
|
115
|
+
return {
|
|
116
|
+
EntityName: this._entity.EntityInfo?.Name ?? this._entityName ?? '',
|
|
117
|
+
Fields: this._entity.GetAll(),
|
|
118
|
+
IsNew: !this._entity.IsSaved,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (this._wireData) {
|
|
122
|
+
return this._wireData;
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
/** @inheritdoc */
|
|
127
|
+
async Deserialize(data, mode = 'request') {
|
|
128
|
+
if (!data || !data.EntityName) {
|
|
129
|
+
this._entity = null;
|
|
130
|
+
this._entityName = null;
|
|
131
|
+
this._wireData = null;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
this._entityName = data.EntityName;
|
|
135
|
+
this._wireData = data;
|
|
136
|
+
const provider = this.Owner.ProviderToUse;
|
|
137
|
+
if (provider) {
|
|
138
|
+
await this.EnsureEntity(data.EntityName);
|
|
139
|
+
if (this._entity && mode === 'result') {
|
|
140
|
+
await this._entity.LoadFromData(data.Fields, true);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/** @inheritdoc */
|
|
145
|
+
Validate(result) {
|
|
146
|
+
if (this._entity) {
|
|
147
|
+
const extResult = this._entity.Validate();
|
|
148
|
+
if (!extResult.Success && extResult.Errors.length > 0) {
|
|
149
|
+
// If extension is an IS-A child, only include its own field errors, not parent chain duplicates
|
|
150
|
+
const ownErrors = this._entity.ISAParent
|
|
151
|
+
? extResult.Errors.filter(err => !this._entity.EntityInfo.ParentEntityFieldNames?.has(err.Source))
|
|
152
|
+
: extResult.Errors;
|
|
153
|
+
if (ownErrors.length > 0) {
|
|
154
|
+
result.Success = false;
|
|
155
|
+
result.Errors.push(...ownErrors);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/** @inheritdoc */
|
|
161
|
+
AcceptChanges() {
|
|
162
|
+
if (this._wireData) {
|
|
163
|
+
this._wireData.IsNew = false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=OrderLineExtensionCompanion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrderLineExtensionCompanion.js","sourceRoot":"","sources":["../src/OrderLineExtensionCompanion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview What an order's status MEANS, and which statuses it may move to — stated once.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. The database enforces the legal SET (`CK_OrderHeader_Status`) and nothing enforced
|
|
5
|
+
* the legal MOVES. `Voided → Confirmed` saved. A voided order could come back to life, keep its journal
|
|
6
|
+
* entries, and be shipped — every row individually valid, the CHECK constraint satisfied, and no test looking.
|
|
7
|
+
*
|
|
8
|
+
* The second half of the problem was quieter. Six modules each held their own opinion about what a
|
|
9
|
+
* status permits, written as ad-hoc string sets that had drifted apart:
|
|
10
|
+
*
|
|
11
|
+
* `GetOverdueWorklist` excludes Draft, Quoted, Voided
|
|
12
|
+
* `DeliveryBehavior` excludes Draft, Voided, Cancelled, Canceled
|
|
13
|
+
* `InvoiceBehavior` refuses Voided
|
|
14
|
+
* `FulfillmentBehavior` nothing before Confirmed
|
|
15
|
+
* `ReversalResolver` skips Draft, Voided
|
|
16
|
+
*
|
|
17
|
+
* So the statuses, the transitions and the predicates live here, pure and testable, and the entity
|
|
18
|
+
* server enforces them on the one path every write goes through.
|
|
19
|
+
*
|
|
20
|
+
* 3-WAY ORTHOGONAL LIFECYCLE MODEL:
|
|
21
|
+
* 1. `Status`: Pure commercial contract state (Draft <-> Quoted -> Confirmed; Voided <-> Draft/Quoted).
|
|
22
|
+
* 2. `FulfillmentStatus`: Operational delivery state (Pending | PartiallyFulfilled | Fulfilled | NotApplicable | Returned).
|
|
23
|
+
* 3. Financial/Payment Progress: Pure numeric facts (TotalGross, AmountPaid, Balance, IsOverdue).
|
|
24
|
+
*
|
|
25
|
+
* @module @mj-biz-apps/orders-entities
|
|
26
|
+
*/
|
|
27
|
+
import type { mjBizAppsOrdersOrderHeaderEntity } from './generated/entity_subclasses.js';
|
|
28
|
+
/** The four values `CK_OrderHeader_Status` permits. */
|
|
29
|
+
export declare const ORDER_STATUSES: readonly ["Draft", "Quoted", "Confirmed", "Voided"];
|
|
30
|
+
export type OrderStatus = mjBizAppsOrdersOrderHeaderEntity['Status'];
|
|
31
|
+
export declare const ORDER_FULFILLMENT_STATUSES: readonly ["Pending", "PartiallyFulfilled", "Fulfilled", "NotApplicable", "Returned"];
|
|
32
|
+
export type OrderFulfillmentStatus = mjBizAppsOrdersOrderHeaderEntity['FulfillmentStatus'];
|
|
33
|
+
export declare function IsOrderStatus(value: string | null | undefined): value is OrderStatus;
|
|
34
|
+
export declare function IsOrderFulfillmentStatus(value: string | null | undefined): value is OrderFulfillmentStatus;
|
|
35
|
+
export interface TransitionVerdict {
|
|
36
|
+
Allowed: boolean;
|
|
37
|
+
/** Present when refused — says what was attempted and why it is not a move. */
|
|
38
|
+
Reason?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* May this order move from `from` to `to`?
|
|
42
|
+
*
|
|
43
|
+
* AN UNKNOWN STATUS IS REFUSED, not ignored. The CHECK constraint would catch it a moment later with
|
|
44
|
+
* a message naming a constraint rather than a status.
|
|
45
|
+
*/
|
|
46
|
+
export declare function CanTransition(from: string | null | undefined, to: string | null | undefined): TransitionVerdict;
|
|
47
|
+
/** Every status reachable from this one, excluding staying put. Empty for a terminal status. */
|
|
48
|
+
export declare function NextStatuses(from: OrderStatus): readonly OrderStatus[];
|
|
49
|
+
/** Editable: lines may be added, repriced and removed. Booking has not happened. */
|
|
50
|
+
export declare function IsEditable(status: string): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* May the Confirm *verb* be offered from this status?
|
|
53
|
+
*
|
|
54
|
+
* Separate from `CanTransition(from, 'Confirmed')` because a brand-new row may be
|
|
55
|
+
* *created* as Confirmed (back-office entry) but the on-screen verb is only for
|
|
56
|
+
* Draft and Quoted — the two states a person is still composing.
|
|
57
|
+
*/
|
|
58
|
+
export declare function CanOfferConfirm(status: string | null | undefined): TransitionVerdict;
|
|
59
|
+
/**
|
|
60
|
+
* The order has booked — journal entries exist and the receivable is real.
|
|
61
|
+
*/
|
|
62
|
+
export declare function IsBooked(status: string): boolean;
|
|
63
|
+
/** Nothing further will happen to this order of its own accord. */
|
|
64
|
+
export declare function IsTerminal(status: string): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* May a document for this order be SENT to a customer as a bill?
|
|
67
|
+
*/
|
|
68
|
+
export declare function IsDeliverable(status: string): boolean;
|
|
69
|
+
/** Does this order count toward what a customer owes? */
|
|
70
|
+
export declare function CountsTowardReceivable(status: string): boolean;
|
|
71
|
+
export interface FulfillableLineLike {
|
|
72
|
+
RequiresFulfillment?: boolean | null;
|
|
73
|
+
ReversesOrderLineID?: string | null;
|
|
74
|
+
IsRollupParent?: boolean | null;
|
|
75
|
+
FulfillmentStatus?: string | null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Computes the header FulfillmentStatus rolled up across its order lines.
|
|
79
|
+
*/
|
|
80
|
+
export declare function DeriveHeaderFulfillmentStatus(lines: readonly FulfillableLineLike[]): OrderFulfillmentStatus;
|
|
81
|
+
export type DerivedPaymentStatus = 'Unpaid' | 'PartiallyPaid' | 'Paid';
|
|
82
|
+
/**
|
|
83
|
+
* Derives payment status purely from numeric financial totals.
|
|
84
|
+
*/
|
|
85
|
+
export declare function DerivePaymentStatus(totalGross: number | null | undefined, amountPaid: number | null | undefined, balance: number | null | undefined): DerivedPaymentStatus;
|
|
86
|
+
//# sourceMappingURL=OrderStatusBehavior.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrderStatusBehavior.d.ts","sourceRoot":"","sources":["../src/OrderStatusBehavior.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AAEtF,uDAAuD;AACvD,eAAO,MAAM,cAAc,qDAAsD,CAAC;AAElF,MAAM,MAAM,WAAW,GAAG,gCAAgC,CAAC,QAAQ,CAAC,CAAC;AAErE,eAAO,MAAM,0BAA0B,sFAM7B,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAAG,gCAAgC,CAAC,mBAAmB,CAAC,CAAC;AAE3F,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,IAAI,WAAW,CAEpF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,IAAI,sBAAsB,CAE1G;AAwBD,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,iBAAiB,CA0C/G;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,WAAW,EAAE,CAEtE;AAID,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,iBAAiB,CAWpF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,yDAAyD;AACzD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,MAAM,WAAW,mBAAmB;IAChC,mBAAmB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,cAAc,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,SAAS,mBAAmB,EAAE,GAAG,sBAAsB,CAe3G;AAED,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,eAAe,GAAG,MAAM,CAAC;AAEvE;;GAEG;AACH,wBAAgB,mBAAmB,CAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACnC,oBAAoB,CAQtB"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/** The four values `CK_OrderHeader_Status` permits. */
|
|
2
|
+
export const ORDER_STATUSES = ['Draft', 'Quoted', 'Confirmed', 'Voided'];
|
|
3
|
+
export const ORDER_FULFILLMENT_STATUSES = [
|
|
4
|
+
'Pending',
|
|
5
|
+
'PartiallyFulfilled',
|
|
6
|
+
'Fulfilled',
|
|
7
|
+
'NotApplicable',
|
|
8
|
+
'Returned',
|
|
9
|
+
];
|
|
10
|
+
export function IsOrderStatus(value) {
|
|
11
|
+
return !!value && ORDER_STATUSES.includes(value);
|
|
12
|
+
}
|
|
13
|
+
export function IsOrderFulfillmentStatus(value) {
|
|
14
|
+
return !!value && ORDER_FULFILLMENT_STATUSES.includes(value);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Where each commercial status may go.
|
|
18
|
+
*
|
|
19
|
+
* THE SHAPE OF THE LIFECYCLE.
|
|
20
|
+
* - `Draft` and `Quoted` are the two pre-booking editable states. They may move to each other
|
|
21
|
+
* freely, or be moved to `Voided` (pre-booking void), or advance to `Confirmed` (booking gate).
|
|
22
|
+
* - `Voided` (unconfirmed): An unconfirmed order in `Voided` may be reopened back to `Draft` or
|
|
23
|
+
* `Quoted`. Direct transition from `Voided` to `Confirmed` is blocked (must reopen as Draft/Quote first).
|
|
24
|
+
* - `Confirmed` is the irreversible booking gate: it books journal entries (D8), which is why
|
|
25
|
+
* nothing returns to an editable state or moves to `Voided` from there.
|
|
26
|
+
* - Post-booking cancellations/corrections go through **Reversal Orders** (D16/D53) rather than in-place
|
|
27
|
+
* status changes to `Voided`, ensuring correcting journal entries are properly recorded.
|
|
28
|
+
*
|
|
29
|
+
* A status may always be re-saved as itself — an ordinary row update that touches other columns.
|
|
30
|
+
*/
|
|
31
|
+
const TRANSITIONS = {
|
|
32
|
+
Draft: ['Quoted', 'Confirmed', 'Voided'],
|
|
33
|
+
Quoted: ['Draft', 'Confirmed', 'Voided'],
|
|
34
|
+
Confirmed: [],
|
|
35
|
+
Voided: ['Draft', 'Quoted'],
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* May this order move from `from` to `to`?
|
|
39
|
+
*
|
|
40
|
+
* AN UNKNOWN STATUS IS REFUSED, not ignored. The CHECK constraint would catch it a moment later with
|
|
41
|
+
* a message naming a constraint rather than a status.
|
|
42
|
+
*/
|
|
43
|
+
export function CanTransition(from, to) {
|
|
44
|
+
// A new order has no previous status; it may be created in any legal state. Creating one directly
|
|
45
|
+
// as Confirmed is exactly what back-office entry does: save at Confirmed (D17).
|
|
46
|
+
if (from == null || from === '') {
|
|
47
|
+
return IsOrderStatus(to)
|
|
48
|
+
? { Allowed: true }
|
|
49
|
+
: { Allowed: false, Reason: `'${to}' is not an order status. Use one of: ${ORDER_STATUSES.join(', ')}.` };
|
|
50
|
+
}
|
|
51
|
+
if (!IsOrderStatus(from)) {
|
|
52
|
+
return { Allowed: false, Reason: `'${from}' is not an order status, so nothing can move from it.` };
|
|
53
|
+
}
|
|
54
|
+
if (!IsOrderStatus(to)) {
|
|
55
|
+
return { Allowed: false, Reason: `'${to}' is not an order status. Use one of: ${ORDER_STATUSES.join(', ')}.` };
|
|
56
|
+
}
|
|
57
|
+
// Re-saving a row without changing its status is not a transition.
|
|
58
|
+
if (from === to)
|
|
59
|
+
return { Allowed: true };
|
|
60
|
+
if (TRANSITIONS[from].includes(to))
|
|
61
|
+
return { Allowed: true };
|
|
62
|
+
if (IsBooked(from) && to === 'Voided') {
|
|
63
|
+
return {
|
|
64
|
+
Allowed: false,
|
|
65
|
+
Reason: `A booked order (${from}) cannot be voided in-place. Create a reversal order to cancel or refund lines (D53).`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (from === 'Voided' && to === 'Confirmed') {
|
|
69
|
+
return {
|
|
70
|
+
Allowed: false,
|
|
71
|
+
Reason: `A voided order cannot be confirmed directly. Reopen it as Draft or Quoted first.`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const onward = TRANSITIONS[from];
|
|
75
|
+
return {
|
|
76
|
+
Allowed: false,
|
|
77
|
+
Reason: onward.length
|
|
78
|
+
? `An order cannot go from ${from} to ${to}. From ${from} it may only become: ${onward.join(', ')}.`
|
|
79
|
+
: `${from} is final. An order cannot leave it, so it cannot become ${to}.`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Every status reachable from this one, excluding staying put. Empty for a terminal status. */
|
|
83
|
+
export function NextStatuses(from) {
|
|
84
|
+
return TRANSITIONS[from];
|
|
85
|
+
}
|
|
86
|
+
// ── What a status PERMITS ────────────────────────────────────────────────────────────────────────
|
|
87
|
+
/** Editable: lines may be added, repriced and removed. Booking has not happened. */
|
|
88
|
+
export function IsEditable(status) {
|
|
89
|
+
return status === 'Draft' || status === 'Quoted';
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* May the Confirm *verb* be offered from this status?
|
|
93
|
+
*
|
|
94
|
+
* Separate from `CanTransition(from, 'Confirmed')` because a brand-new row may be
|
|
95
|
+
* *created* as Confirmed (back-office entry) but the on-screen verb is only for
|
|
96
|
+
* Draft and Quoted — the two states a person is still composing.
|
|
97
|
+
*/
|
|
98
|
+
export function CanOfferConfirm(status) {
|
|
99
|
+
if (status == null || status === '') {
|
|
100
|
+
return { Allowed: true };
|
|
101
|
+
}
|
|
102
|
+
if (IsBooked(status)) {
|
|
103
|
+
return { Allowed: false, Reason: 'This order is already booked.' };
|
|
104
|
+
}
|
|
105
|
+
if (status === 'Voided') {
|
|
106
|
+
return { Allowed: false, Reason: 'Reopen this voided order as a Draft or Quote before confirming.' };
|
|
107
|
+
}
|
|
108
|
+
return CanTransition(status, 'Confirmed');
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The order has booked — journal entries exist and the receivable is real.
|
|
112
|
+
*/
|
|
113
|
+
export function IsBooked(status) {
|
|
114
|
+
return status === 'Confirmed';
|
|
115
|
+
}
|
|
116
|
+
/** Nothing further will happen to this order of its own accord. */
|
|
117
|
+
export function IsTerminal(status) {
|
|
118
|
+
return IsOrderStatus(status) && TRANSITIONS[status].length === 0;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* May a document for this order be SENT to a customer as a bill?
|
|
122
|
+
*/
|
|
123
|
+
export function IsDeliverable(status) {
|
|
124
|
+
return status !== 'Draft' && status !== 'Voided';
|
|
125
|
+
}
|
|
126
|
+
/** Does this order count toward what a customer owes? */
|
|
127
|
+
export function CountsTowardReceivable(status) {
|
|
128
|
+
return IsBooked(status);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Computes the header FulfillmentStatus rolled up across its order lines.
|
|
132
|
+
*/
|
|
133
|
+
export function DeriveHeaderFulfillmentStatus(lines) {
|
|
134
|
+
const fulfillable = lines.filter((l) => !!l.RequiresFulfillment && !l.ReversesOrderLineID && !l.IsRollupParent);
|
|
135
|
+
if (fulfillable.length === 0) {
|
|
136
|
+
return 'NotApplicable';
|
|
137
|
+
}
|
|
138
|
+
const fulfilledCount = fulfillable.filter((l) => l.FulfillmentStatus === 'Fulfilled').length;
|
|
139
|
+
if (fulfilledCount === fulfillable.length) {
|
|
140
|
+
return 'Fulfilled';
|
|
141
|
+
}
|
|
142
|
+
if (fulfilledCount > 0) {
|
|
143
|
+
return 'PartiallyFulfilled';
|
|
144
|
+
}
|
|
145
|
+
return 'Pending';
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Derives payment status purely from numeric financial totals.
|
|
149
|
+
*/
|
|
150
|
+
export function DerivePaymentStatus(totalGross, amountPaid, balance) {
|
|
151
|
+
const gross = Number(totalGross ?? 0);
|
|
152
|
+
const paid = Number(amountPaid ?? 0);
|
|
153
|
+
const bal = balance != null ? Number(balance) : gross - paid;
|
|
154
|
+
if (bal <= 0 && gross > 0)
|
|
155
|
+
return 'Paid';
|
|
156
|
+
if (paid > 0)
|
|
157
|
+
return 'PartiallyPaid';
|
|
158
|
+
return 'Unpaid';
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=OrderStatusBehavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrderStatusBehavior.js","sourceRoot":"","sources":["../src/OrderStatusBehavior.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `PartyAffiliationBehavior` — party and employer resolution helpers.
|
|
3
|
+
*
|
|
4
|
+
* @module @mj-biz-apps/orders-entities
|
|
5
|
+
*/
|
|
6
|
+
import { type IRunViewProvider, type UserInfo } from '@memberjunction/core';
|
|
7
|
+
export type ActiveEmployerRow = {
|
|
8
|
+
ToOrganizationID: string;
|
|
9
|
+
StartDate?: Date | string | null;
|
|
10
|
+
EndDate?: Date | string | null;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Active Employee relationship to an organization as of `asOf`.
|
|
14
|
+
* Zero matches → null. One match → that org. Several → the longest-lasting
|
|
15
|
+
* (earliest StartDate / longest span; a null StartDate counts as longest).
|
|
16
|
+
*/
|
|
17
|
+
export declare function ResolveActiveEmployerOrganization(provider: IRunViewProvider, personID: string, asOf?: Date, user?: UserInfo): Promise<string | null>;
|
|
18
|
+
/** @deprecated Use {@link ResolveActiveEmployerOrganization} — multiple employers now pick the longest-lasting. */
|
|
19
|
+
export declare function ResolveSingularActiveEmployerOrganization(provider: IRunViewProvider, personID: string, asOf?: Date, user?: UserInfo): Promise<string | null>;
|
|
20
|
+
//# sourceMappingURL=PartyAffiliationBehavior.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PartyAffiliationBehavior.d.ts","sourceRoot":"","sources":["../src/PartyAffiliationBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAW,KAAK,gBAAgB,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAUF;;;;GAIG;AACH,wBAAsB,iCAAiC,CACnD,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,IAAiB,EACvB,IAAI,CAAC,EAAE,QAAQ,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BxB;AAED,mHAAmH;AACnH,wBAAsB,yCAAyC,CAC3D,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,IAAiB,EACvB,IAAI,CAAC,EAAE,QAAQ,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAExB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `PartyAffiliationBehavior` — party and employer resolution helpers.
|
|
3
|
+
*
|
|
4
|
+
* @module @mj-biz-apps/orders-entities
|
|
5
|
+
*/
|
|
6
|
+
import { RunView } from '@memberjunction/core';
|
|
7
|
+
function durationMs(row, asOf) {
|
|
8
|
+
const start = row.StartDate ? new Date(row.StartDate).getTime() : 0;
|
|
9
|
+
const endRaw = row.EndDate ? new Date(row.EndDate).getTime() : asOf.getTime();
|
|
10
|
+
const end = Number.isFinite(endRaw) ? endRaw : asOf.getTime();
|
|
11
|
+
const begin = Number.isFinite(start) ? start : 0;
|
|
12
|
+
return Math.max(0, end - begin);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Active Employee relationship to an organization as of `asOf`.
|
|
16
|
+
* Zero matches → null. One match → that org. Several → the longest-lasting
|
|
17
|
+
* (earliest StartDate / longest span; a null StartDate counts as longest).
|
|
18
|
+
*/
|
|
19
|
+
export async function ResolveActiveEmployerOrganization(provider, personID, asOf = new Date(), user) {
|
|
20
|
+
if (!personID || !provider)
|
|
21
|
+
return null;
|
|
22
|
+
const rv = new RunView(provider);
|
|
23
|
+
const date = asOf.toISOString().slice(0, 10);
|
|
24
|
+
try {
|
|
25
|
+
const res = await rv.RunView({
|
|
26
|
+
EntityName: 'MJ_BizApps_Common: Relationships',
|
|
27
|
+
ExtraFilter: `FromPersonID='${personID.replace(/'/g, "''")}' AND ToOrganizationID IS NOT NULL ` +
|
|
28
|
+
`AND Status='Active' ` +
|
|
29
|
+
`AND (StartDate IS NULL OR StartDate <= '${date}') ` +
|
|
30
|
+
`AND (EndDate IS NULL OR EndDate >= '${date}') ` +
|
|
31
|
+
`AND RelationshipType IN ('Employer', 'Employee', 'Employment')`,
|
|
32
|
+
Fields: ['ToOrganizationID', 'StartDate', 'EndDate'],
|
|
33
|
+
ResultType: 'simple',
|
|
34
|
+
BypassCache: true,
|
|
35
|
+
}, user);
|
|
36
|
+
const rows = (res?.Success ? res.Results : null) ?? [];
|
|
37
|
+
if (rows.length === 0)
|
|
38
|
+
return null;
|
|
39
|
+
if (rows.length === 1)
|
|
40
|
+
return rows[0].ToOrganizationID ?? null;
|
|
41
|
+
const best = [...rows].sort((a, b) => durationMs(b, asOf) - durationMs(a, asOf))[0];
|
|
42
|
+
return best?.ToOrganizationID ?? null;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** @deprecated Use {@link ResolveActiveEmployerOrganization} — multiple employers now pick the longest-lasting. */
|
|
49
|
+
export async function ResolveSingularActiveEmployerOrganization(provider, personID, asOf = new Date(), user) {
|
|
50
|
+
return ResolveActiveEmployerOrganization(provider, personID, asOf, user);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=PartyAffiliationBehavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PartyAffiliationBehavior.js","sourceRoot":"","sources":["../src/PartyAffiliationBehavior.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared (client + server) subclass for Payment Headers.
|
|
3
|
+
*
|
|
4
|
+
* Declares the optional `PaymentDetailID` embed — the receipt's own frozen
|
|
5
|
+
* instrument snapshot (D39 copy-on-use). `PaymentHeaderEntityServer` extends
|
|
6
|
+
* this class. Remove the declaration when CodeGen emits it from metadata.
|
|
7
|
+
*/
|
|
8
|
+
import { ValidationResult } from '@memberjunction/core';
|
|
9
|
+
import { mjBizAppsOrdersPaymentHeaderEntity, mjBizAppsOrdersPaymentDetailEntity } from './generated/entity_subclasses.js';
|
|
10
|
+
export declare class PaymentHeaderEntity extends mjBizAppsOrdersPaymentHeaderEntity {
|
|
11
|
+
ClearPaymentDetail(): void;
|
|
12
|
+
get ReferenceNumber(): string | null;
|
|
13
|
+
set ReferenceNumber(value: string | null);
|
|
14
|
+
isPaymentDetailEmpty(detail: mjBizAppsOrdersPaymentDetailEntity): boolean;
|
|
15
|
+
Validate(): ValidationResult;
|
|
16
|
+
private dropSavePopulatedFieldErrors;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=PaymentHeaderEntity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaymentHeaderEntity.d.ts","sourceRoot":"","sources":["../src/PaymentHeaderEntity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAwE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE9H,OAAO,EACH,kCAAkC,EAClC,kCAAkC,EACrC,MAAM,+BAA+B,CAAC;AAMvC,qBACa,mBAAoB,SAAQ,kCAAkC;IAChE,kBAAkB,IAAI,IAAI;IAIjC,IAAW,eAAe,IAAI,MAAM,GAAG,IAAI,CAE1C;IAED,IAAW,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAkB9C;IAEM,oBAAoB,CAAC,MAAM,EAAE,kCAAkC,GAAG,OAAO;IAmBhE,QAAQ,IAAI,gBAAgB;IAM5C,OAAO,CAAC,4BAA4B;CAavC"}
|