@nimee/api-clients 1.1.115 → 1.1.119

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/dist/src/crm.d.ts CHANGED
@@ -45,10 +45,62 @@ export declare class CrmClient {
45
45
  endUserPhone?: string;
46
46
  customer?: Record<string, unknown>;
47
47
  }): Promise<IDiningCommitCreateResult>;
48
+ /**
49
+ * Settles exactly the given commits against a charge the caller already created (e.g. via
50
+ * `chargeEndUser`). Forwards the caller's `jwt` header — CRM derives `settledBy`/`settledByName`
51
+ * from that JWT itself, same as `settle-selected`'s other callers.
52
+ */
53
+ settleSelectedDining(params: {
54
+ jwt: string;
55
+ marketplaceId: string;
56
+ sellerId: string;
57
+ endUserId: string;
58
+ commitIds: string[];
59
+ chargeId: string;
60
+ }): Promise<{
61
+ settledCount: number;
62
+ total: number;
63
+ balance: number;
64
+ }>;
65
+ /**
66
+ * INTERNAL. Stamps the refund state of a charge onto the meals that charge collected, so the
67
+ * guest's own dining page can show the money came back. `jwt` must be JWT_ADMIN — the CRM route
68
+ * compares it literally before verifying anything, because a seller token proves identity, not
69
+ * the right to rewrite a member's meal history. No marketplaceId in the path: that route has no
70
+ * `checkRole` to key on one, and a manual charge never carries a marketplace to supply it.
71
+ *
72
+ * "full" is per-meal truthful (each meal's own effectiveAmount is what came back); "partial" is
73
+ * charge-level and deliberately carries no per-meal figure — one charge covers several meals, and
74
+ * splitting a partial refund across them would invent numbers nobody agreed to.
75
+ */
76
+ markDiningChargeRefunded(params: {
77
+ jwt: string;
78
+ sellerId: string;
79
+ endUserId: string;
80
+ chargeId: string;
81
+ refundState: "partial" | "full";
82
+ /** Everything returned against this charge so far, in SHEKELS — CRM apportions it across the meals. */
83
+ refundedTotal?: number;
84
+ }): Promise<{
85
+ updatedCommits: number;
86
+ }>;
48
87
  getDiningBalance(params: {
49
88
  jwt: string;
50
89
  marketplaceId: string;
51
90
  sellerId: string;
52
91
  endUserId: string;
53
92
  }): Promise<IDiningBalanceResponse>;
93
+ /**
94
+ * The bootstrap's variant: resolves to `null` when the end user is not an active dining member,
95
+ * instead of rejecting with a 403. The public seller page asks for every guest on every seller,
96
+ * so non-membership is the common answer — and a 403 there is logged and metered as an error by
97
+ * every service it passes through. Use `getDiningBalance` where non-membership really is a
98
+ * rejected request (the POS, the admin dashboard).
99
+ */
100
+ getDiningBalanceOrNull(params: {
101
+ jwt: string;
102
+ marketplaceId: string;
103
+ sellerId: string;
104
+ endUserId: string;
105
+ }): Promise<IDiningBalanceResponse | null>;
54
106
  }
package/dist/src/crm.js CHANGED
@@ -55,7 +55,14 @@ class CrmClient {
55
55
  createAutoExitVisit(params) {
56
56
  return __awaiter(this, void 0, void 0, function* () {
57
57
  const { jwt, marketplaceId, sellerId, endUserId, guests, endUserSeasonTicketId, seasonTicketId, scannerSessionId } = params;
58
- if (!jwt || !marketplaceId || !sellerId || !endUserId || !endUserSeasonTicketId || !seasonTicketId || !scannerSessionId || guests === undefined) {
58
+ if (!jwt ||
59
+ !marketplaceId ||
60
+ !sellerId ||
61
+ !endUserId ||
62
+ !endUserSeasonTicketId ||
63
+ !seasonTicketId ||
64
+ !scannerSessionId ||
65
+ guests === undefined) {
59
66
  throw new error_handler_1.CustomError("param_are_missing_in_createAutoExitVisit", 400, `params are: ${JSON.stringify(params)}`);
60
67
  }
61
68
  const response = yield axios_1.default.post(`${crmUrl}/visit/${marketplaceId}/${sellerId}/${endUserId}`, { guests, autoExit: true, endUserSeasonTicketId, seasonTicketId, scannerSessionId }, { headers: { jwt } });
@@ -72,6 +79,42 @@ class CrmClient {
72
79
  return response === null || response === void 0 ? void 0 : response.data;
73
80
  });
74
81
  }
82
+ /**
83
+ * Settles exactly the given commits against a charge the caller already created (e.g. via
84
+ * `chargeEndUser`). Forwards the caller's `jwt` header — CRM derives `settledBy`/`settledByName`
85
+ * from that JWT itself, same as `settle-selected`'s other callers.
86
+ */
87
+ settleSelectedDining(params) {
88
+ return __awaiter(this, void 0, void 0, function* () {
89
+ const { jwt, marketplaceId, sellerId, endUserId, commitIds, chargeId } = params;
90
+ if (!jwt || !marketplaceId || !sellerId || !endUserId || !(commitIds === null || commitIds === void 0 ? void 0 : commitIds.length) || !chargeId) {
91
+ throw new error_handler_1.CustomError("param_are_missing_in_settleSelectedDining", 400, `params are: ${JSON.stringify({ marketplaceId, sellerId, endUserId, commitIds, chargeId })}`);
92
+ }
93
+ const response = yield axios_1.default.post(`${crmUrl}/dining/commits/settle-selected/${marketplaceId}/${sellerId}/${endUserId}`, { commitIds, chargeId }, { headers: { jwt } });
94
+ return response === null || response === void 0 ? void 0 : response.data;
95
+ });
96
+ }
97
+ /**
98
+ * INTERNAL. Stamps the refund state of a charge onto the meals that charge collected, so the
99
+ * guest's own dining page can show the money came back. `jwt` must be JWT_ADMIN — the CRM route
100
+ * compares it literally before verifying anything, because a seller token proves identity, not
101
+ * the right to rewrite a member's meal history. No marketplaceId in the path: that route has no
102
+ * `checkRole` to key on one, and a manual charge never carries a marketplace to supply it.
103
+ *
104
+ * "full" is per-meal truthful (each meal's own effectiveAmount is what came back); "partial" is
105
+ * charge-level and deliberately carries no per-meal figure — one charge covers several meals, and
106
+ * splitting a partial refund across them would invent numbers nobody agreed to.
107
+ */
108
+ markDiningChargeRefunded(params) {
109
+ return __awaiter(this, void 0, void 0, function* () {
110
+ const { jwt, sellerId, endUserId, chargeId, refundState, refundedTotal } = params;
111
+ if (!jwt || !sellerId || !endUserId || !chargeId || !refundState) {
112
+ throw new error_handler_1.CustomError("param_are_missing_in_markDiningChargeRefunded", 400, `params are: ${JSON.stringify({ sellerId, endUserId, chargeId, refundState })}`);
113
+ }
114
+ const response = yield axios_1.default.post(`${crmUrl}/dining/charges/refunded/${sellerId}/${endUserId}`, Object.assign({ chargeId, refundState }, (refundedTotal === undefined ? {} : { refundedTotal })), { headers: { jwt } });
115
+ return response === null || response === void 0 ? void 0 : response.data;
116
+ });
117
+ }
75
118
  getDiningBalance(params) {
76
119
  return __awaiter(this, void 0, void 0, function* () {
77
120
  const { jwt, marketplaceId, sellerId, endUserId } = params;
@@ -84,6 +127,27 @@ class CrmClient {
84
127
  return response === null || response === void 0 ? void 0 : response.data;
85
128
  });
86
129
  }
130
+ /**
131
+ * The bootstrap's variant: resolves to `null` when the end user is not an active dining member,
132
+ * instead of rejecting with a 403. The public seller page asks for every guest on every seller,
133
+ * so non-membership is the common answer — and a 403 there is logged and metered as an error by
134
+ * every service it passes through. Use `getDiningBalance` where non-membership really is a
135
+ * rejected request (the POS, the admin dashboard).
136
+ */
137
+ getDiningBalanceOrNull(params) {
138
+ var _a;
139
+ return __awaiter(this, void 0, void 0, function* () {
140
+ const { jwt, marketplaceId, sellerId, endUserId } = params;
141
+ if (!jwt || !marketplaceId || !sellerId || !endUserId) {
142
+ throw new error_handler_1.CustomError("param_are_missing_in_getDiningBalanceOrNull", 400, `params are: ${JSON.stringify({ marketplaceId, sellerId, endUserId })}`);
143
+ }
144
+ const response = yield axios_1.default.get(`${crmUrl}/dining/balance-or-null/${marketplaceId}/${sellerId}/${endUserId}`, {
145
+ headers: { jwt },
146
+ });
147
+ // eslint-disable-next-line no-null/no-null
148
+ return (_a = response === null || response === void 0 ? void 0 : response.data) !== null && _a !== void 0 ? _a : null;
149
+ });
150
+ }
87
151
  }
88
152
  exports.CrmClient = CrmClient;
89
153
  //# sourceMappingURL=crm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"crm.js","sourceRoot":"","sources":["../../src/crm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crm.js","sourceRoot":"","sources":["../../src/crm.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nimee/api-clients",
3
- "version": "1.1.115",
3
+ "version": "1.1.119",
4
4
  "description": "communication http for each ms",
5
5
  "main": "dist/src/index.js",
6
6
  "author": "dan goldberg",
@@ -38,7 +38,7 @@
38
38
  "dependencies": {
39
39
  "@nimee/error-handler": "0.0.14",
40
40
  "@nimee/logger": "^1.0.27",
41
- "@nimee/shared-types": "^1.0.332",
41
+ "@nimee/shared-types": "^1.0.336",
42
42
  "axios": "1.2.1"
43
43
  }
44
44
  }
package/src/crm.ts CHANGED
@@ -51,7 +51,16 @@ export class CrmClient {
51
51
  scannerSessionId: string;
52
52
  }): Promise<{ visit: any; todayVisits: any[] }> {
53
53
  const { jwt, marketplaceId, sellerId, endUserId, guests, endUserSeasonTicketId, seasonTicketId, scannerSessionId } = params;
54
- if (!jwt || !marketplaceId || !sellerId || !endUserId || !endUserSeasonTicketId || !seasonTicketId || !scannerSessionId || guests === undefined) {
54
+ if (
55
+ !jwt ||
56
+ !marketplaceId ||
57
+ !sellerId ||
58
+ !endUserId ||
59
+ !endUserSeasonTicketId ||
60
+ !seasonTicketId ||
61
+ !scannerSessionId ||
62
+ guests === undefined
63
+ ) {
55
64
  throw new CustomError("param_are_missing_in_createAutoExitVisit", 400, `params are: ${JSON.stringify(params)}`);
56
65
  }
57
66
  const response = await axios.post(
@@ -94,6 +103,71 @@ export class CrmClient {
94
103
  return response?.data;
95
104
  }
96
105
 
106
+ /**
107
+ * Settles exactly the given commits against a charge the caller already created (e.g. via
108
+ * `chargeEndUser`). Forwards the caller's `jwt` header — CRM derives `settledBy`/`settledByName`
109
+ * from that JWT itself, same as `settle-selected`'s other callers.
110
+ */
111
+ async settleSelectedDining(params: {
112
+ jwt: string;
113
+ marketplaceId: string;
114
+ sellerId: string;
115
+ endUserId: string;
116
+ commitIds: string[];
117
+ chargeId: string;
118
+ }): Promise<{ settledCount: number; total: number; balance: number }> {
119
+ const { jwt, marketplaceId, sellerId, endUserId, commitIds, chargeId } = params;
120
+ if (!jwt || !marketplaceId || !sellerId || !endUserId || !commitIds?.length || !chargeId) {
121
+ throw new CustomError(
122
+ "param_are_missing_in_settleSelectedDining",
123
+ 400,
124
+ `params are: ${JSON.stringify({ marketplaceId, sellerId, endUserId, commitIds, chargeId })}`
125
+ );
126
+ }
127
+ const response = await axios.post(
128
+ `${crmUrl}/dining/commits/settle-selected/${marketplaceId}/${sellerId}/${endUserId}`,
129
+ { commitIds, chargeId },
130
+ { headers: { jwt } }
131
+ );
132
+ return response?.data;
133
+ }
134
+
135
+ /**
136
+ * INTERNAL. Stamps the refund state of a charge onto the meals that charge collected, so the
137
+ * guest's own dining page can show the money came back. `jwt` must be JWT_ADMIN — the CRM route
138
+ * compares it literally before verifying anything, because a seller token proves identity, not
139
+ * the right to rewrite a member's meal history. No marketplaceId in the path: that route has no
140
+ * `checkRole` to key on one, and a manual charge never carries a marketplace to supply it.
141
+ *
142
+ * "full" is per-meal truthful (each meal's own effectiveAmount is what came back); "partial" is
143
+ * charge-level and deliberately carries no per-meal figure — one charge covers several meals, and
144
+ * splitting a partial refund across them would invent numbers nobody agreed to.
145
+ */
146
+ async markDiningChargeRefunded(params: {
147
+ jwt: string;
148
+ sellerId: string;
149
+ endUserId: string;
150
+ chargeId: string;
151
+ refundState: "partial" | "full";
152
+ /** Everything returned against this charge so far, in SHEKELS — CRM apportions it across the meals. */
153
+ refundedTotal?: number;
154
+ }): Promise<{ updatedCommits: number }> {
155
+ const { jwt, sellerId, endUserId, chargeId, refundState, refundedTotal } = params;
156
+ if (!jwt || !sellerId || !endUserId || !chargeId || !refundState) {
157
+ throw new CustomError(
158
+ "param_are_missing_in_markDiningChargeRefunded",
159
+ 400,
160
+ `params are: ${JSON.stringify({ sellerId, endUserId, chargeId, refundState })}`
161
+ );
162
+ }
163
+ const response = await axios.post(
164
+ `${crmUrl}/dining/charges/refunded/${sellerId}/${endUserId}`,
165
+ { chargeId, refundState, ...(refundedTotal === undefined ? {} : { refundedTotal }) },
166
+ { headers: { jwt } }
167
+ );
168
+ return response?.data;
169
+ }
170
+
97
171
  async getDiningBalance(params: {
98
172
  jwt: string;
99
173
  marketplaceId: string;
@@ -113,4 +187,32 @@ export class CrmClient {
113
187
  });
114
188
  return response?.data;
115
189
  }
190
+
191
+ /**
192
+ * The bootstrap's variant: resolves to `null` when the end user is not an active dining member,
193
+ * instead of rejecting with a 403. The public seller page asks for every guest on every seller,
194
+ * so non-membership is the common answer — and a 403 there is logged and metered as an error by
195
+ * every service it passes through. Use `getDiningBalance` where non-membership really is a
196
+ * rejected request (the POS, the admin dashboard).
197
+ */
198
+ async getDiningBalanceOrNull(params: {
199
+ jwt: string;
200
+ marketplaceId: string;
201
+ sellerId: string;
202
+ endUserId: string;
203
+ }): Promise<IDiningBalanceResponse | null> {
204
+ const { jwt, marketplaceId, sellerId, endUserId } = params;
205
+ if (!jwt || !marketplaceId || !sellerId || !endUserId) {
206
+ throw new CustomError(
207
+ "param_are_missing_in_getDiningBalanceOrNull",
208
+ 400,
209
+ `params are: ${JSON.stringify({ marketplaceId, sellerId, endUserId })}`
210
+ );
211
+ }
212
+ const response = await axios.get(`${crmUrl}/dining/balance-or-null/${marketplaceId}/${sellerId}/${endUserId}`, {
213
+ headers: { jwt },
214
+ });
215
+ // eslint-disable-next-line no-null/no-null
216
+ return response?.data ?? null;
217
+ }
116
218
  }