@campfire-interactive/master-data-client 5.29.0 → 5.30.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.
@@ -1 +1 @@
1
- {"version":3,"file":"quoteAsks.js","sourceRoot":"","sources":["../src/quoteAsks.ts"],"names":[],"mappings":";;;AAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAa,gBAAgB;IACE;IAA7B,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD,gEAAgE;IAChE,KAAK,CAAC,IAAI,CAAC,OAA8B;QACvC,MAAM,KAAK,GAAuC,EAAE,CAAC;QACrD,IAAI,OAAO,EAAE,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QACnD,IAAI,OAAO,EAAE,iBAAiB;YAAE,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACpF,IAAI,OAAO,EAAE,aAAa;YAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QACxE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAoC;YAC1D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,gBAAgB;YACtB,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAiC;YACvD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE;SACjD,CAAC,CAAC;IACL,CAAC;IAED;6CACyC;IACzC,KAAK,CAAC,MAAM,CACV,KAA0B,EAC1B,cAAuB;QAEvB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAA2B;YACjD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,KAAK;YACX,cAAc;SACf,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,KAA0B;QACjD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAA2B;YACjD,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE;YAChD,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAoD;YAC1E,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE;SACjD,CAAC,CAAC;IACL,CAAC;CACF;AAtED,4CAsEC"}
1
+ {"version":3,"file":"quoteAsks.js","sourceRoot":"","sources":["../src/quoteAsks.ts"],"names":[],"mappings":";;;AAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,2CAA2C;AAC3C,MAAa,gBAAgB;IACE;IAA7B,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD;gDAC4C;IAC5C,KAAK,CAAC,IAAI,CAAC,OAA8B;QACvC,MAAM,KAAK,GAAuC,EAAE,CAAC;QACrD,IAAI,OAAO,EAAE,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QACnD,IAAI,OAAO,EAAE,iBAAiB;YAAE,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACpF,IAAI,OAAO,EAAE,aAAa;YAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QACxE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAoC;YAC1D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,gBAAgB;YACtB,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,uCAAuC;IACvC,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAiC;YACvD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE;SACjD,CAAC,CAAC;IACL,CAAC;IAED;;+EAE2E;IAC3E,wEAAwE;IACxE,gEAAgE;IAChE,KAAK,CAAC,MAAM,CACV,KAA0B,EAC1B,cAAuB;QAEvB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAA2B;YACjD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,KAAK;YACX,cAAc;SACf,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,0CAA0C;IAC1C,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,KAA0B;QACjD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAA2B;YACjD,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE;YAChD,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,0CAA0C;IAC1C,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAoD;YAC1E,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE;SACjD,CAAC,CAAC;IACL,CAAC;CACF;AA7ED,4CA6EC"}
package/dist/rfqs.d.ts ADDED
@@ -0,0 +1,103 @@
1
+ import { HttpTransport } from './http';
2
+ import type { Rfq, RfqDetail, RfqSummary, CreateRfqInput, UpdateRfqInput, ListRfqsOptions, SingleResponse } from './types';
3
+ /**
4
+ * RFQs — ONE customer request; the competing quotes are its options.
5
+ *
6
+ * The level ABOVE the quote. An OEM asks for several COMPETING groupings of the
7
+ * same parts and picks one ("give me four prices on A3 bumpers: base + S line,
8
+ * RS alone, wagon alone, all four"); each grouping is a `Quote`, and the RFQ is
9
+ * what makes that set nameable. Without it "the losers" is not a set the system
10
+ * can name, and a shared nullable `opportunityId` is not a grouping — it is
11
+ * nullable, it drifts, and an opportunity spans rounds. See the nextgen ADR
12
+ * `2026-08-05-multi-part-quotes.md`.
13
+ *
14
+ * **A finer grain than an opportunity.** Audi asking for four prices in March
15
+ * and re-quoting in September is two RFQs on one opportunity. `opportunityId`
16
+ * is carried for reporting and is never used to decide competition.
17
+ *
18
+ * **A quote joins an RFQ via `rfqId` on the quote** (`quotes.create` /
19
+ * `quotes.update`), not through a method here. The join is validated to match
20
+ * the RFQ's customer — an RFQ is one OEM's request, and a foreign quote inside
21
+ * it would make "these compete with each other" false.
22
+ *
23
+ * **⚠ NEVER SUM AN RFQ'S QUOTES.** They are alternatives; three of four lose on
24
+ * every multi-scenario RFQ by construction. `range` (min/max) is the only honest
25
+ * summary and is deliberately provided instead of a total. For the same reason
26
+ * the RFQ carries no value column and no count column — both are computed at
27
+ * read.
28
+ *
29
+ * **⚠ Recording a win does not close the siblings.** Setting `status: 'won'`
30
+ * records WHICH quote won. Award-closes-losers (overlap + RFQ resolution, kept
31
+ * together) is behavior over quote lifecycles and ships in a later phase behind
32
+ * its own gate.
33
+ *
34
+ * **Replaces `quoteAsks` (5.30.0).** Same rows, same ids — `quote_ask` became
35
+ * the `rfq` table on 2026-10-24 and migrated rows kept their UUIDs, so an
36
+ * `askId` held from before resolves here unchanged. `quoteAsks` still works and
37
+ * still returns the old shape; it is deprecated and will be removed once every
38
+ * consumer is on this resource.
39
+ */
40
+ export declare class RfqResource {
41
+ private readonly http;
42
+ constructor(http: HttpTransport);
43
+ /** RFQs with a `quoteCount` each — never an aggregate value. */
44
+ list(options?: ListRfqsOptions): Promise<SingleResponse<RfqSummary[]>>;
45
+ /**
46
+ * One RFQ with its competing quotes — each carrying its own lines and roll-up
47
+ * — plus the RFQ-level `range`.
48
+ */
49
+ get(id: string): Promise<SingleResponse<RfqDetail>>;
50
+ /**
51
+ * Open a request. `rfqNumber` (`RFQ-YYYY-NNN`) is minted server-side from an
52
+ * atomic per-(tenant, year) counter.
53
+ *
54
+ * Send `receivedAt` when you know it: it is when the REQUEST arrived, which
55
+ * is not when the record was created. A caller minting an RFQ from an email
56
+ * that sat unread for two days should send the email's timestamp, or every
57
+ * response-time report measures the job rather than the response.
58
+ *
59
+ * `source` says what made this RFQ and defaults to `manual`. It is never
60
+ * nullable, deliberately — "was this minted by a machine?" has to stay
61
+ * answerable.
62
+ */
63
+ create(input: CreateRfqInput, idempotencyKey?: string): Promise<SingleResponse<Rfq>>;
64
+ /**
65
+ * Update the editable fields and the status.
66
+ *
67
+ * `status: 'won'` requires `wonByQuoteId`, and the winner must be one of this
68
+ * RFQ's own quotes (422 otherwise) — the record of which one won must point
69
+ * inside the set that was competing. `status: 'merged'` requires
70
+ * `mergedIntoRfqId`; prefer {@link merge}, which takes it as its argument.
71
+ *
72
+ * `closedAt` is managed server-side, not supplied: stamped on the way out of
73
+ * `open`, cleared on the way back in.
74
+ */
75
+ update(id: string, input: UpdateRfqInput): Promise<SingleResponse<Rfq>>;
76
+ /**
77
+ * Absorb this RFQ into another — the duplicate case, where two requests turn
78
+ * out to be one.
79
+ *
80
+ * The absorbed RFQ closes as `merged` and records WHAT absorbed it. Cancelling
81
+ * a duplicate instead loses that, which is what every consumer did before this
82
+ * existed: the row said "cancelled" and nothing said why or where the request
83
+ * went.
84
+ *
85
+ * Does not move quotes. One-directional and non-recursive.
86
+ */
87
+ merge(id: string, mergedIntoRfqId: string): Promise<SingleResponse<Rfq>>;
88
+ /**
89
+ * Withdraw the request. Its quotes SURVIVE and compete with nothing again
90
+ * (`rfqId` is `ON DELETE SET NULL`) — deleting the request must never delete
91
+ * the offers made against it.
92
+ *
93
+ * Refused (422) once `won`, `lost` or `merged`: those rows are the record of
94
+ * how the request ended, and without them a closed sibling has no
95
+ * explanation. Cancel it instead. Also refused while other RFQs are merged
96
+ * into it.
97
+ */
98
+ remove(id: string): Promise<SingleResponse<{
99
+ id: string;
100
+ rfqNumber: string;
101
+ }>>;
102
+ }
103
+ //# sourceMappingURL=rfqs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rfqs.d.ts","sourceRoot":"","sources":["../src/rfqs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EACV,GAAG,EACH,SAAS,EACT,UAAU,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,aAAa;IAEhD,gEAAgE;IAC1D,IAAI,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC;IAa5E;;;OAGG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAOzD;;;;;;;;;;;;OAYG;IACG,MAAM,CACV,KAAK,EAAE,cAAc,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAS/B;;;;;;;;;;OAUG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAQ7E;;;;;;;;;;OAUG;IACG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAQ9E;;;;;;;;;OASG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAMrF"}
package/dist/rfqs.js ADDED
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RfqResource = void 0;
4
+ /**
5
+ * RFQs — ONE customer request; the competing quotes are its options.
6
+ *
7
+ * The level ABOVE the quote. An OEM asks for several COMPETING groupings of the
8
+ * same parts and picks one ("give me four prices on A3 bumpers: base + S line,
9
+ * RS alone, wagon alone, all four"); each grouping is a `Quote`, and the RFQ is
10
+ * what makes that set nameable. Without it "the losers" is not a set the system
11
+ * can name, and a shared nullable `opportunityId` is not a grouping — it is
12
+ * nullable, it drifts, and an opportunity spans rounds. See the nextgen ADR
13
+ * `2026-08-05-multi-part-quotes.md`.
14
+ *
15
+ * **A finer grain than an opportunity.** Audi asking for four prices in March
16
+ * and re-quoting in September is two RFQs on one opportunity. `opportunityId`
17
+ * is carried for reporting and is never used to decide competition.
18
+ *
19
+ * **A quote joins an RFQ via `rfqId` on the quote** (`quotes.create` /
20
+ * `quotes.update`), not through a method here. The join is validated to match
21
+ * the RFQ's customer — an RFQ is one OEM's request, and a foreign quote inside
22
+ * it would make "these compete with each other" false.
23
+ *
24
+ * **⚠ NEVER SUM AN RFQ'S QUOTES.** They are alternatives; three of four lose on
25
+ * every multi-scenario RFQ by construction. `range` (min/max) is the only honest
26
+ * summary and is deliberately provided instead of a total. For the same reason
27
+ * the RFQ carries no value column and no count column — both are computed at
28
+ * read.
29
+ *
30
+ * **⚠ Recording a win does not close the siblings.** Setting `status: 'won'`
31
+ * records WHICH quote won. Award-closes-losers (overlap + RFQ resolution, kept
32
+ * together) is behavior over quote lifecycles and ships in a later phase behind
33
+ * its own gate.
34
+ *
35
+ * **Replaces `quoteAsks` (5.30.0).** Same rows, same ids — `quote_ask` became
36
+ * the `rfq` table on 2026-10-24 and migrated rows kept their UUIDs, so an
37
+ * `askId` held from before resolves here unchanged. `quoteAsks` still works and
38
+ * still returns the old shape; it is deprecated and will be removed once every
39
+ * consumer is on this resource.
40
+ */
41
+ class RfqResource {
42
+ http;
43
+ constructor(http) {
44
+ this.http = http;
45
+ }
46
+ /** RFQs with a `quoteCount` each — never an aggregate value. */
47
+ async list(options) {
48
+ const query = {};
49
+ if (options?.status)
50
+ query.status = options.status;
51
+ if (options?.source)
52
+ query.source = options.source;
53
+ if (options?.customerCompanyId)
54
+ query.customerCompanyId = options.customerCompanyId;
55
+ if (options?.opportunityId)
56
+ query.opportunityId = options.opportunityId;
57
+ return this.http.request({
58
+ method: 'GET',
59
+ path: '/v1/rfqs',
60
+ query,
61
+ });
62
+ }
63
+ /**
64
+ * One RFQ with its competing quotes — each carrying its own lines and roll-up
65
+ * — plus the RFQ-level `range`.
66
+ */
67
+ async get(id) {
68
+ return this.http.request({
69
+ method: 'GET',
70
+ path: `/v1/rfqs/${encodeURIComponent(id)}`,
71
+ });
72
+ }
73
+ /**
74
+ * Open a request. `rfqNumber` (`RFQ-YYYY-NNN`) is minted server-side from an
75
+ * atomic per-(tenant, year) counter.
76
+ *
77
+ * Send `receivedAt` when you know it: it is when the REQUEST arrived, which
78
+ * is not when the record was created. A caller minting an RFQ from an email
79
+ * that sat unread for two days should send the email's timestamp, or every
80
+ * response-time report measures the job rather than the response.
81
+ *
82
+ * `source` says what made this RFQ and defaults to `manual`. It is never
83
+ * nullable, deliberately — "was this minted by a machine?" has to stay
84
+ * answerable.
85
+ */
86
+ async create(input, idempotencyKey) {
87
+ return this.http.request({
88
+ method: 'POST',
89
+ path: '/v1/rfqs',
90
+ body: input,
91
+ idempotencyKey,
92
+ });
93
+ }
94
+ /**
95
+ * Update the editable fields and the status.
96
+ *
97
+ * `status: 'won'` requires `wonByQuoteId`, and the winner must be one of this
98
+ * RFQ's own quotes (422 otherwise) — the record of which one won must point
99
+ * inside the set that was competing. `status: 'merged'` requires
100
+ * `mergedIntoRfqId`; prefer {@link merge}, which takes it as its argument.
101
+ *
102
+ * `closedAt` is managed server-side, not supplied: stamped on the way out of
103
+ * `open`, cleared on the way back in.
104
+ */
105
+ async update(id, input) {
106
+ return this.http.request({
107
+ method: 'PATCH',
108
+ path: `/v1/rfqs/${encodeURIComponent(id)}`,
109
+ body: input,
110
+ });
111
+ }
112
+ /**
113
+ * Absorb this RFQ into another — the duplicate case, where two requests turn
114
+ * out to be one.
115
+ *
116
+ * The absorbed RFQ closes as `merged` and records WHAT absorbed it. Cancelling
117
+ * a duplicate instead loses that, which is what every consumer did before this
118
+ * existed: the row said "cancelled" and nothing said why or where the request
119
+ * went.
120
+ *
121
+ * Does not move quotes. One-directional and non-recursive.
122
+ */
123
+ async merge(id, mergedIntoRfqId) {
124
+ return this.http.request({
125
+ method: 'POST',
126
+ path: `/v1/rfqs/${encodeURIComponent(id)}/merge`,
127
+ body: { mergedIntoRfqId },
128
+ });
129
+ }
130
+ /**
131
+ * Withdraw the request. Its quotes SURVIVE and compete with nothing again
132
+ * (`rfqId` is `ON DELETE SET NULL`) — deleting the request must never delete
133
+ * the offers made against it.
134
+ *
135
+ * Refused (422) once `won`, `lost` or `merged`: those rows are the record of
136
+ * how the request ended, and without them a closed sibling has no
137
+ * explanation. Cancel it instead. Also refused while other RFQs are merged
138
+ * into it.
139
+ */
140
+ async remove(id) {
141
+ return this.http.request({
142
+ method: 'DELETE',
143
+ path: `/v1/rfqs/${encodeURIComponent(id)}`,
144
+ });
145
+ }
146
+ }
147
+ exports.RfqResource = RfqResource;
148
+ //# sourceMappingURL=rfqs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rfqs.js","sourceRoot":"","sources":["../src/rfqs.ts"],"names":[],"mappings":";;;AAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAa,WAAW;IACO;IAA7B,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD,gEAAgE;IAChE,KAAK,CAAC,IAAI,CAAC,OAAyB;QAClC,MAAM,KAAK,GAAuC,EAAE,CAAC;QACrD,IAAI,OAAO,EAAE,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QACnD,IAAI,OAAO,EAAE,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QACnD,IAAI,OAAO,EAAE,iBAAiB;YAAE,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACpF,IAAI,OAAO,EAAE,aAAa;YAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QACxE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAA+B;YACrD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,UAAU;YAChB,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAA4B;YAClD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,YAAY,kBAAkB,CAAC,EAAE,CAAC,EAAE;SAC3C,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,MAAM,CACV,KAAqB,EACrB,cAAuB;QAEvB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAsB;YAC5C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,KAAK;YACX,cAAc;SACf,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,KAAqB;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAsB;YAC5C,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,YAAY,kBAAkB,CAAC,EAAE,CAAC,EAAE;YAC1C,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,KAAK,CAAC,EAAU,EAAE,eAAuB;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAsB;YAC5C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,YAAY,kBAAkB,CAAC,EAAE,CAAC,QAAQ;YAChD,IAAI,EAAE,EAAE,eAAe,EAAE;SAC1B,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAoD;YAC1E,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,YAAY,kBAAkB,CAAC,EAAE,CAAC,EAAE;SAC3C,CAAC,CAAC;IACL,CAAC;CACF;AA3GD,kCA2GC"}
@@ -0,0 +1,75 @@
1
+ import { HttpTransport } from './http';
2
+ import type { StandardAttribute, CreateStandardAttributeInput, CreateStandardAttributeDefaultInput, UpdateStandardAttributeInput, StandardAttributeValue, SetStandardAttributeValueInput, SetStandardAttributeValueResult, StandardAttributeHistoryEntry, StandardAttributeDefault, UpdateStandardAttributeDefaultInput, SingleResponse, ListResponse } from './types';
3
+ export declare class StandardAttributeResource {
4
+ private readonly http;
5
+ constructor(http: HttpTransport);
6
+ /** Add an attribute to THIS TENANT. Filled by a person — the enrichment
7
+ * pass only knows the platform catalog. */
8
+ create(input: CreateStandardAttributeInput, idempotencyKey?: string): Promise<SingleResponse<StandardAttribute>>;
9
+ /** ARCHIVE one. It stops being offered and every value already recorded
10
+ * against it stays readable — so this never conflicts with what is stored,
11
+ * and it is reversible. */
12
+ archive(id: string): Promise<SingleResponse<StandardAttribute>>;
13
+ /** This tenant's attribute catalog, in display order. */
14
+ list(options?: {
15
+ enabledOnly?: boolean;
16
+ }): Promise<ListResponse<StandardAttribute>>;
17
+ /** Rename, reorder, enable or disable one attribute. `key` is immutable. */
18
+ update(id: string, input: UpdateStandardAttributeInput, idempotencyKey?: string): Promise<SingleResponse<StandardAttribute>>;
19
+ /**
20
+ * Quote ids whose attribute VALUES match free text.
21
+ *
22
+ * Prefer `quotes.list({ q })` — it matches these too, and it filters the page,
23
+ * so the count and the cursor agree with what you get. Reach for this only
24
+ * when you are narrowing an already-fetched list in a browser and need to know
25
+ * which rows matched on an attribute rather than on a visible column.
26
+ *
27
+ * Enabled, active attributes only: one switched off or archived is not offered
28
+ * on a quote, so a row returned because it matched one would be returned for a
29
+ * reason the user cannot see anywhere on screen.
30
+ */
31
+ searchQuoteIds(q: string): Promise<SingleResponse<{
32
+ ids: string[];
33
+ }>>;
34
+ /** Every stored value on one quote, in catalog order. */
35
+ listValues(quoteId: string): Promise<ListResponse<StandardAttributeValue>>;
36
+ /**
37
+ * Write values on a quote.
38
+ *
39
+ * Send the whole set in one call rather than looping: the server writes them
40
+ * in a single transaction, and `onlyIfBlank` on each input is what makes the
41
+ * enrichment pass fill blanks without ever overwriting a rep's correction.
42
+ */
43
+ setValues(quoteId: string, values: SetStandardAttributeValueInput[], idempotencyKey?: string): Promise<ListResponse<SetStandardAttributeValueResult>>;
44
+ /** Every stored value on one opportunity, in catalog order. */
45
+ listOpportunityValues(opportunityId: string): Promise<ListResponse<StandardAttributeValue>>;
46
+ /** Write values on an opportunity. Send the whole set in one call. */
47
+ setOpportunityValues(opportunityId: string, values: SetStandardAttributeValueInput[], idempotencyKey?: string): Promise<ListResponse<SetStandardAttributeValueResult>>;
48
+ /** One attribute's timeline on an opportunity, or the whole one's when no key. */
49
+ listOpportunityHistory(opportunityId: string, key?: string): Promise<ListResponse<StandardAttributeHistoryEntry>>;
50
+ /** One attribute's timeline on a quote, or the whole quote's when no key. */
51
+ listHistory(quoteId: string, key?: string): Promise<ListResponse<StandardAttributeHistoryEntry>>;
52
+ /** Add an attribute to the PLATFORM catalog. Seeds NEW tenants only —
53
+ * tenants already provisioned keep the copy they have. */
54
+ createDefault(input: CreateStandardAttributeDefaultInput, idempotencyKey?: string): Promise<SingleResponse<StandardAttributeDefault>>;
55
+ /** Stop seeding one into new tenants. Existing tenant copies and every value
56
+ * ever recorded against the key are untouched. */
57
+ removeDefault(id: string): Promise<SingleResponse<{
58
+ id: string;
59
+ }>>;
60
+ /**
61
+ * The PLATFORM-wide defaults, in display order — what a new tenant's copy is
62
+ * seeded from. Readable by any tenant; only the platform tenant can write.
63
+ */
64
+ listDefaults(): Promise<ListResponse<StandardAttributeDefault>>;
65
+ /**
66
+ * Rename or reorder one platform default.
67
+ *
68
+ * Changes what the NEXT tenant is seeded with. It does not reach tenants
69
+ * already provisioned — their copy is theirs to name.
70
+ *
71
+ * `key` is immutable — it is what every stored value references.
72
+ */
73
+ updateDefault(id: string, input: UpdateStandardAttributeDefaultInput, idempotencyKey?: string): Promise<SingleResponse<StandardAttributeDefault>>;
74
+ }
75
+ //# sourceMappingURL=standardAttributes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standardAttributes.d.ts","sourceRoot":"","sources":["../src/standardAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EACV,iBAAiB,EACjB,4BAA4B,EAC5B,mCAAmC,EACnC,4BAA4B,EAC5B,sBAAsB,EACtB,8BAA8B,EAC9B,+BAA+B,EAC/B,6BAA6B,EAC7B,wBAAwB,EACxB,mCAAmC,EACnC,cAAc,EACd,YAAY,EACb,MAAM,SAAS,CAAC;AAUjB,qBAAa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,aAAa;IAEhD;gDAC4C;IACtC,MAAM,CACV,KAAK,EAAE,4BAA4B,EACnC,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAS7C;;gCAE4B;IACtB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAOrE,yDAAyD;IACnD,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAQzF,4EAA4E;IACtE,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,4BAA4B,EACnC,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAS7C;;;;;;;;;;;OAWG;IACG,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;QAAE,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAO3E,yDAAyD;IACnD,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC;IAOhF;;;;;;OAMG;IACG,SAAS,CACb,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,8BAA8B,EAAE,EACxC,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC;IAqBzD,+DAA+D;IACzD,qBAAqB,CACzB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC;IAOhD,sEAAsE;IAChE,oBAAoB,CACxB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,8BAA8B,EAAE,EACxC,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC;IASzD,kFAAkF;IAC5E,sBAAsB,CAC1B,aAAa,EAAE,MAAM,EACrB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAC;IAQvD,6EAA6E;IACvE,WAAW,CACf,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAC;IAUvD;+DAC2D;IACrD,aAAa,CACjB,KAAK,EAAE,mCAAmC,EAC1C,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC;IASpD;uDACmD;IAC7C,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAOxE;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;IAOrE;;;;;;;OAOG;IACG,aAAa,CACjB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,mCAAmC,EAC1C,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC;CAQrD"}
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StandardAttributeResource = void 0;
4
+ // Standard Attributes: the platform-owned set of vehicle and program facts a
5
+ // quote carries, each with the source it came from and a full change history.
6
+ // See nextgen docs/decisions/2026-09-18-standard-attributes.md.
7
+ //
8
+ // The catalog is landlord-owned and provisioned per tenant, and a tenant can
9
+ // add its own beside the seeded ones. Nothing is ever destroyed: a tenant
10
+ // ARCHIVES an attribute, which stops it being offered and leaves every recorded
11
+ // value readable. `key` is immutable throughout.
12
+ class StandardAttributeResource {
13
+ http;
14
+ constructor(http) {
15
+ this.http = http;
16
+ }
17
+ /** Add an attribute to THIS TENANT. Filled by a person — the enrichment
18
+ * pass only knows the platform catalog. */
19
+ async create(input, idempotencyKey) {
20
+ return this.http.request({
21
+ method: 'POST',
22
+ path: '/v1/standard-attributes',
23
+ body: input,
24
+ idempotencyKey,
25
+ });
26
+ }
27
+ /** ARCHIVE one. It stops being offered and every value already recorded
28
+ * against it stays readable — so this never conflicts with what is stored,
29
+ * and it is reversible. */
30
+ async archive(id) {
31
+ return this.http.request({
32
+ method: 'DELETE',
33
+ path: `/v1/standard-attributes/${encodeURIComponent(id)}`,
34
+ });
35
+ }
36
+ /** This tenant's attribute catalog, in display order. */
37
+ async list(options) {
38
+ const query = options?.enabledOnly ? '?enabledOnly=true' : '';
39
+ return this.http.request({
40
+ method: 'GET',
41
+ path: `/v1/standard-attributes${query}`,
42
+ });
43
+ }
44
+ /** Rename, reorder, enable or disable one attribute. `key` is immutable. */
45
+ async update(id, input, idempotencyKey) {
46
+ return this.http.request({
47
+ method: 'PATCH',
48
+ path: `/v1/standard-attributes/${encodeURIComponent(id)}`,
49
+ body: input,
50
+ idempotencyKey,
51
+ });
52
+ }
53
+ /**
54
+ * Quote ids whose attribute VALUES match free text.
55
+ *
56
+ * Prefer `quotes.list({ q })` — it matches these too, and it filters the page,
57
+ * so the count and the cursor agree with what you get. Reach for this only
58
+ * when you are narrowing an already-fetched list in a browser and need to know
59
+ * which rows matched on an attribute rather than on a visible column.
60
+ *
61
+ * Enabled, active attributes only: one switched off or archived is not offered
62
+ * on a quote, so a row returned because it matched one would be returned for a
63
+ * reason the user cannot see anywhere on screen.
64
+ */
65
+ async searchQuoteIds(q) {
66
+ return this.http.request({
67
+ method: 'GET',
68
+ path: `/v1/standard-attributes/search?q=${encodeURIComponent(q)}`,
69
+ });
70
+ }
71
+ /** Every stored value on one quote, in catalog order. */
72
+ async listValues(quoteId) {
73
+ return this.http.request({
74
+ method: 'GET',
75
+ path: `/v1/quotes/${encodeURIComponent(quoteId)}/standard-attributes`,
76
+ });
77
+ }
78
+ /**
79
+ * Write values on a quote.
80
+ *
81
+ * Send the whole set in one call rather than looping: the server writes them
82
+ * in a single transaction, and `onlyIfBlank` on each input is what makes the
83
+ * enrichment pass fill blanks without ever overwriting a rep's correction.
84
+ */
85
+ async setValues(quoteId, values, idempotencyKey) {
86
+ return this.http.request({
87
+ method: 'PUT',
88
+ path: `/v1/quotes/${encodeURIComponent(quoteId)}/standard-attributes`,
89
+ body: { values },
90
+ idempotencyKey,
91
+ });
92
+ }
93
+ // ── The same three, against an opportunity ────────────────────────────────
94
+ //
95
+ // An opportunity's Program & Vehicle values used to be resolved live and
96
+ // stored nowhere, so there was no home for a value somebody typed or for a
97
+ // migration to land. These give it the same store a quote has.
98
+ //
99
+ // The opportunity is an OMSF record; master-data holds the values against a
100
+ // loose id and does not check that it names anything. Values on an
101
+ // opportunity are independent of its quotes' — a quote copies at create via
102
+ // the enrichment pass and then diverges, so that an approver's figures cannot
103
+ // move because somebody edited the opportunity.
104
+ /** Every stored value on one opportunity, in catalog order. */
105
+ async listOpportunityValues(opportunityId) {
106
+ return this.http.request({
107
+ method: 'GET',
108
+ path: `/v1/opportunities/${encodeURIComponent(opportunityId)}/standard-attributes`,
109
+ });
110
+ }
111
+ /** Write values on an opportunity. Send the whole set in one call. */
112
+ async setOpportunityValues(opportunityId, values, idempotencyKey) {
113
+ return this.http.request({
114
+ method: 'PUT',
115
+ path: `/v1/opportunities/${encodeURIComponent(opportunityId)}/standard-attributes`,
116
+ body: { values },
117
+ idempotencyKey,
118
+ });
119
+ }
120
+ /** One attribute's timeline on an opportunity, or the whole one's when no key. */
121
+ async listOpportunityHistory(opportunityId, key) {
122
+ const query = key ? `?key=${encodeURIComponent(key)}` : '';
123
+ return this.http.request({
124
+ method: 'GET',
125
+ path: `/v1/opportunities/${encodeURIComponent(opportunityId)}/standard-attributes/history${query}`,
126
+ });
127
+ }
128
+ /** One attribute's timeline on a quote, or the whole quote's when no key. */
129
+ async listHistory(quoteId, key) {
130
+ const query = key ? `?key=${encodeURIComponent(key)}` : '';
131
+ return this.http.request({
132
+ method: 'GET',
133
+ path: `/v1/quotes/${encodeURIComponent(quoteId)}/standard-attributes/history${query}`,
134
+ });
135
+ }
136
+ // ── The landlord catalog ───────────────────────────────────────────────────
137
+ /** Add an attribute to the PLATFORM catalog. Seeds NEW tenants only —
138
+ * tenants already provisioned keep the copy they have. */
139
+ async createDefault(input, idempotencyKey) {
140
+ return this.http.request({
141
+ method: 'POST',
142
+ path: '/v1/standard-attribute-defaults',
143
+ body: input,
144
+ idempotencyKey,
145
+ });
146
+ }
147
+ /** Stop seeding one into new tenants. Existing tenant copies and every value
148
+ * ever recorded against the key are untouched. */
149
+ async removeDefault(id) {
150
+ return this.http.request({
151
+ method: 'DELETE',
152
+ path: `/v1/standard-attribute-defaults/${encodeURIComponent(id)}`,
153
+ });
154
+ }
155
+ /**
156
+ * The PLATFORM-wide defaults, in display order — what a new tenant's copy is
157
+ * seeded from. Readable by any tenant; only the platform tenant can write.
158
+ */
159
+ async listDefaults() {
160
+ return this.http.request({
161
+ method: 'GET',
162
+ path: '/v1/standard-attribute-defaults',
163
+ });
164
+ }
165
+ /**
166
+ * Rename or reorder one platform default.
167
+ *
168
+ * Changes what the NEXT tenant is seeded with. It does not reach tenants
169
+ * already provisioned — their copy is theirs to name.
170
+ *
171
+ * `key` is immutable — it is what every stored value references.
172
+ */
173
+ async updateDefault(id, input, idempotencyKey) {
174
+ return this.http.request({
175
+ method: 'PATCH',
176
+ path: `/v1/standard-attribute-defaults/${encodeURIComponent(id)}`,
177
+ body: input,
178
+ idempotencyKey,
179
+ });
180
+ }
181
+ }
182
+ exports.StandardAttributeResource = StandardAttributeResource;
183
+ //# sourceMappingURL=standardAttributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standardAttributes.js","sourceRoot":"","sources":["../src/standardAttributes.ts"],"names":[],"mappings":"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"}