platform-types 1.10.853 → 1.10.855

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.
@@ -361,14 +361,13 @@ declare global {
361
361
  /**
362
362
  * How the customer's decision on a quote reached the shop.
363
363
  *
364
- * ⚠️ `'portal'` is RESERVED and must not be offered to an operator. The other
365
- * four are things an operator records second-hand; `'portal'` means the
366
- * customer approved it themselves, and no customer-facing service endpoint
367
- * exists on any gateway yet — so an operator selecting it would be recording
368
- * an event that did not happen. The api rejects it: it is excluded from the
369
- * `POST /services` quote-resolve enum and returns 400. It stays in the union
370
- * so rows already carrying it still read back, and so the value is ready the
371
- * day a customer portal ships. Filter it out of any channel picker.
364
+ * ⚠️ `'portal'` is stamped ONLY by the customer's own decision — the tracking
365
+ * link (`POST /services/tracking/quote`) or the signed-in account
366
+ * (`POST /user { mode: 'service-quote-decision' }`). The other four are
367
+ * things an operator records second-hand; an operator selecting `'portal'`
368
+ * would be recording an event that did not happen, so staff
369
+ * `POST /services` quote-resolve still refuses it with
370
+ * `400 SERVICE_QUOTE_CHANNEL_RESERVED`. Filter it out of any channel picker.
372
371
  */
373
372
  type ServiceQuoteChannel = 'in_person' | 'phone' | 'whatsapp' | 'email' | 'portal';
374
373
  /**
@@ -404,11 +403,14 @@ declare global {
404
403
  * while an approval recorded all three, so a quote history could show who
405
404
  * approved a version and nothing at all for a rejected one.
406
405
  *
407
- * No `channel`: a channel describes how an APPROVAL reached the shop, and
408
- * there is no approval here.
406
+ * `channel` is set ONLY to `'portal'`, when the customer refused the version
407
+ * themselves; absent means an operator recorded it.
409
408
  */
410
409
  interface ServiceQuoteRejection {
411
- /** userId of the operator who recorded it. Server-stamped, never from the body. */
410
+ /**
411
+ * userId of the operator who recorded it, or the customerId who refused it
412
+ * online (`channel: 'portal'`). Server-stamped, never from the body.
413
+ */
412
414
  by: string;
413
415
  /** Unix ms. Server-stamped. */
414
416
  at: number;
@@ -419,7 +421,19 @@ declare global {
419
421
  * constancia — those are statutory documents that go to a customer.
420
422
  */
421
423
  note?: string;
424
+ /** `'portal'`: the customer refused it online. Absent: an operator recorded it. */
425
+ channel?: 'portal';
426
+ /**
427
+ * The customer's display name when they decided online — a snapshot for the
428
+ * evidence. Cleared by the customer's erasure.
429
+ */
430
+ byName?: string;
422
431
  }
432
+ /**
433
+ * How a customer who decided online proved they were the contact on file:
434
+ * the 6-digit code sent by SMS or by email, or their signed-in session.
435
+ */
436
+ type ServiceQuoteVerifiedBy = 'sms_code' | 'email_code' | 'session';
423
437
  /**
424
438
  * A customer decision on a quote version, recorded as an event rather than a
425
439
  * boolean so that who/when/how survives a re-quote.
@@ -430,6 +444,13 @@ declare global {
430
444
  /** Unix ms. */
431
445
  at: number;
432
446
  channel: ServiceQuoteChannel;
447
+ /** `channel: 'portal'` only: how the customer proved they were the contact on file. */
448
+ verifiedBy?: ServiceQuoteVerifiedBy;
449
+ /**
450
+ * `channel: 'portal'` only: the customer's display name at decision time — a
451
+ * snapshot for the evidence. Cleared by the customer's erasure.
452
+ */
453
+ byName?: string;
433
454
  }
434
455
  /**
435
456
  * One version of the presupuesto. `ServiceOrder.quote` is the full ordered
@@ -1531,6 +1552,6 @@ export declare const MAX_SERVICE_PICTURES = 20;
1531
1552
  * check `GATING_ERROR_CODES` in addition. The deposit's opt-in idempotency
1532
1553
  * refusals are included here.
1533
1554
  */
1534
- export declare const SERVICE_ORDER_ERROR_CODES: readonly ["UNIT_QUANTITY_NOT_WHOLE", "UNIT_REVISION_STALE", "ROLE_FORBIDDEN", "PARENT_FILTER_CONFLICT", "VALIDATION_FAILED", "INVALID_CURSOR", "INVALID_FROM_DATE", "INVALID_TO_DATE", "INVALID_DATE_RANGE", "REWORK_INDEX_UNAVAILABLE", "STORE_NOT_FOUND", "SERVICE_ORDER_NOT_FOUND", "PRINT_JOB_DOCUMENT_NOT_FOUND", "CUSTOMER_NOT_FOUND", "PARENT_SERVICE_ORDER_NOT_FOUND", "SERVICE_TEMPLATE_NOT_FOUND", "SERVICE_TYPE_REQUIRED", "INVALID_IMAGE_REFERENCE", "MISSING_STORE_CONTEXT", "WARRANTY_BELOW_LEGAL_MINIMUM", "TECHNICIAN_NOT_FOUND", "TECHNICIAN_NOT_ELIGIBLE", "SERVICE_TRACKING_DISABLED", "SERVICE_TRACKING_NO_ADDRESS", "SERVICE_TRACKING_LINK_LAPSED", "ADMIN_REQUIRED", "CUSTODY_ILLEGAL_TRANSITION", "SERVICE_ORDER_BILLABLE_FROZEN", "SERVICE_ORDER_EDIT_CHANGED", "SERVICE_ORDER_DISABLED_STATE_UNCHANGED", "APPOINTMENT_NOT_FOUND", "APPOINTMENT_NOT_LINKABLE", "APPOINTMENT_NOT_OPEN", "APPOINTMENT_CUSTOMER_MISMATCH", "APPOINTMENT_VERSION_CONFLICT", "SERVICE_ORDER_TERMINAL", "SERVICE_ORDER_DISABLED", "SERVICE_ORDER_ILLEGAL_TRANSITION", "SERVICE_ORDER_STATUS_CHANGED", "SERVICE_ORDER_OUTCOME_REQUIRED", "SERVICE_ORDER_OUTCOME_NOT_ALLOWED", "SERVICE_ORDER_CUSTODY_NOT_RECEIVED", "SERVICE_ORDER_BILLABLE_NOT_AT_THIS_TRANSITION", "PAYMENT_METHODS_NOT_CONFIGURED", "PAYMENT_METHOD_NOT_FOUND", "SERVICE_ORDER_DEPOSIT_CHANGED", "INVALID_IDEMPOTENCY_KEY", "IDEMPOTENCY_KEY_REUSE", "IDEMPOTENCY_IN_PROGRESS", "IDEMPOTENCY_KEY_FAILED", "IDEMPOTENCY_LOCK_CONTENTION", "SERVICE_DEPOSIT_CURRENCY_MISMATCH", "SERVICE_DEPOSIT_INVALID", "INVALID_AMOUNT", "DEFAULT_DRAWER_UNAVAILABLE", "CURRENCY_MISMATCH", "SHIFT_NOT_OPEN", "SERVICE_BILLING_PRODUCTS_UNAVAILABLE", "CATEGORY_NOT_FOUND", "CATEGORY_DISABLED", "CATEGORY_DISABLE_IN_PROGRESS", "SERVICE_BILLING_PRODUCT_IN_BASKET", "SERVICE_DELIVERY_BASKET_DECISION_REQUIRED", "SERVICE_DELIVERY_BASKET_CURRENCY_MISMATCH", "PRODUCT_NOT_AVAILABLE", "PRODUCT_SALE_LIMIT_EXCEEDED", "PRODUCT_SALE_LIMIT_INVALID", "FX_CONVERSION_UNAVAILABLE", "TRANSACT_ITEMS_LIMIT_EXCEEDED", "SERVICE_LINE_PRICE_TOO_LARGE", "SERVICE_PARTS_RESTORE_EXCEEDS_CONSUMED", "SERVICE_PARTS_RESTORE_EXCEEDS_AMOUNT", "SERVICE_PARTS_STOCK_INSUFFICIENT", "SERVICE_PARTS_PRODUCT_NOT_FOUND", "SERVICE_PARTS_LEDGER_FULL", "SERVICE_PARTS_TOO_MANY", "SERVICE_ORDER_PARTS_CHANGED", "SERVICE_QUOTE_NOT_FOUND", "SERVICE_QUOTE_NOT_OFFERABLE", "SERVICE_QUOTE_HOLDS_TOO_MANY", "SERVICE_QUOTE_SUPERSEDED", "SERVICE_QUOTE_ALREADY_RESOLVED", "SERVICE_QUOTE_LAPSED", "SERVICE_QUOTE_CHANNEL_RESERVED", "SERVICE_QUOTE_CHANNEL_NOT_APPLICABLE", "SERVICE_QUOTE_REASON_NOT_APPLICABLE", "SERVICE_ORDER_QUOTE_CHANGED", "SERVICE_ORDER_NOT_READY", "SERVICE_RENOTIFY_IMPERSONATED", "SERVICE_RENOTIFY_TOO_SOON", "SERVICE_RENOTIFY_CONFLICT", "SERVICE_RENOTIFY_NOT_RECORDED", "SERVICE_RENOTIFY_LEDGER_UNREADABLE", "SERVICE_RENOTIFY_NOT_DISPATCHED", "SERVICE_TIMER_ALREADY_RUNNING", "SERVICE_TIMER_NOT_RUNNING", "SERVICE_TIMER_STOP_CONFLICT", "TECHNICIAN_NOT_CLOCKED_IN", "SERVICE_ORDER_GONE", "SERVICE_WORKLOG_NOT_FOUND", "SERVICE_WORKLOG_NOT_REVERSIBLE", "SERVICE_WORKLOG_ALREADY_REVERSED", "SERVICE_ORDER_WORKLOG_CHANGED", "CART_PROMOTION_UNAVAILABLE", "COUPON_NOT_FOUND", "COUPON_NOT_ACTIVE", "COUPON_EXPIRED", "COUPON_EXHAUSTED", "COUPON_EXHAUSTED_AT_CHECKOUT", "COUPON_MIN_SUBTOTAL", "COUPON_REQUIRES_CUSTOMER", "COUPON_BUDGET_EXHAUSTED", "COUPON_CURRENCY_MISMATCH"];
1555
+ export declare const SERVICE_ORDER_ERROR_CODES: readonly ["UNIT_QUANTITY_NOT_WHOLE", "UNIT_REVISION_STALE", "ROLE_FORBIDDEN", "PARENT_FILTER_CONFLICT", "VALIDATION_FAILED", "INVALID_CURSOR", "INVALID_FROM_DATE", "INVALID_TO_DATE", "INVALID_DATE_RANGE", "REWORK_INDEX_UNAVAILABLE", "STORE_NOT_FOUND", "SERVICE_ORDER_NOT_FOUND", "PRINT_JOB_DOCUMENT_NOT_FOUND", "CUSTOMER_NOT_FOUND", "PARENT_SERVICE_ORDER_NOT_FOUND", "SERVICE_TEMPLATE_NOT_FOUND", "SERVICE_TYPE_REQUIRED", "INVALID_IMAGE_REFERENCE", "MISSING_STORE_CONTEXT", "WARRANTY_BELOW_LEGAL_MINIMUM", "TECHNICIAN_NOT_FOUND", "TECHNICIAN_NOT_ELIGIBLE", "SERVICE_TRACKING_DISABLED", "SERVICE_TRACKING_NO_ADDRESS", "SERVICE_TRACKING_LINK_LAPSED", "SERVICE_TRACKING_VERIFICATION_FAILED", "SERVICE_TRACKING_TOKEN_INVALID", "ADMIN_REQUIRED", "CUSTODY_ILLEGAL_TRANSITION", "SERVICE_ORDER_BILLABLE_FROZEN", "SERVICE_ORDER_EDIT_CHANGED", "SERVICE_ORDER_DISABLED_STATE_UNCHANGED", "APPOINTMENT_NOT_FOUND", "APPOINTMENT_NOT_LINKABLE", "APPOINTMENT_NOT_OPEN", "APPOINTMENT_CUSTOMER_MISMATCH", "APPOINTMENT_VERSION_CONFLICT", "SERVICE_ORDER_TERMINAL", "SERVICE_ORDER_DISABLED", "SERVICE_ORDER_ILLEGAL_TRANSITION", "SERVICE_ORDER_STATUS_CHANGED", "SERVICE_ORDER_OUTCOME_REQUIRED", "SERVICE_ORDER_OUTCOME_NOT_ALLOWED", "SERVICE_ORDER_CUSTODY_NOT_RECEIVED", "SERVICE_ORDER_BILLABLE_NOT_AT_THIS_TRANSITION", "PAYMENT_METHODS_NOT_CONFIGURED", "PAYMENT_METHOD_NOT_FOUND", "SERVICE_ORDER_DEPOSIT_CHANGED", "INVALID_IDEMPOTENCY_KEY", "IDEMPOTENCY_KEY_REUSE", "IDEMPOTENCY_IN_PROGRESS", "IDEMPOTENCY_KEY_FAILED", "IDEMPOTENCY_LOCK_CONTENTION", "SERVICE_DEPOSIT_CURRENCY_MISMATCH", "SERVICE_DEPOSIT_INVALID", "INVALID_AMOUNT", "DEFAULT_DRAWER_UNAVAILABLE", "CURRENCY_MISMATCH", "SHIFT_NOT_OPEN", "SERVICE_BILLING_PRODUCTS_UNAVAILABLE", "CATEGORY_NOT_FOUND", "CATEGORY_DISABLED", "CATEGORY_DISABLE_IN_PROGRESS", "SERVICE_BILLING_PRODUCT_IN_BASKET", "SERVICE_DELIVERY_BASKET_DECISION_REQUIRED", "SERVICE_DELIVERY_BASKET_CURRENCY_MISMATCH", "PRODUCT_NOT_AVAILABLE", "PRODUCT_SALE_LIMIT_EXCEEDED", "PRODUCT_SALE_LIMIT_INVALID", "FX_CONVERSION_UNAVAILABLE", "TRANSACT_ITEMS_LIMIT_EXCEEDED", "SERVICE_LINE_PRICE_TOO_LARGE", "SERVICE_PARTS_RESTORE_EXCEEDS_CONSUMED", "SERVICE_PARTS_RESTORE_EXCEEDS_AMOUNT", "SERVICE_PARTS_STOCK_INSUFFICIENT", "SERVICE_PARTS_PRODUCT_NOT_FOUND", "SERVICE_PARTS_LEDGER_FULL", "SERVICE_PARTS_TOO_MANY", "SERVICE_ORDER_PARTS_CHANGED", "SERVICE_QUOTE_NOT_FOUND", "SERVICE_QUOTE_NOT_OFFERABLE", "SERVICE_QUOTE_HOLDS_TOO_MANY", "SERVICE_QUOTE_SUPERSEDED", "SERVICE_QUOTE_ALREADY_RESOLVED", "SERVICE_QUOTE_LAPSED", "SERVICE_QUOTE_CHANNEL_RESERVED", "SERVICE_QUOTE_CHANNEL_NOT_APPLICABLE", "SERVICE_QUOTE_REASON_NOT_APPLICABLE", "SERVICE_ORDER_QUOTE_CHANGED", "SERVICE_ORDER_NOT_READY", "SERVICE_RENOTIFY_IMPERSONATED", "SERVICE_RENOTIFY_TOO_SOON", "SERVICE_RENOTIFY_CONFLICT", "SERVICE_RENOTIFY_NOT_RECORDED", "SERVICE_RENOTIFY_LEDGER_UNREADABLE", "SERVICE_RENOTIFY_NOT_DISPATCHED", "SERVICE_TIMER_ALREADY_RUNNING", "SERVICE_TIMER_NOT_RUNNING", "SERVICE_TIMER_STOP_CONFLICT", "TECHNICIAN_NOT_CLOCKED_IN", "SERVICE_ORDER_GONE", "SERVICE_WORKLOG_NOT_FOUND", "SERVICE_WORKLOG_NOT_REVERSIBLE", "SERVICE_WORKLOG_ALREADY_REVERSED", "SERVICE_ORDER_WORKLOG_CHANGED", "CART_PROMOTION_UNAVAILABLE", "COUPON_NOT_FOUND", "COUPON_NOT_ACTIVE", "COUPON_EXPIRED", "COUPON_EXHAUSTED", "COUPON_EXHAUSTED_AT_CHECKOUT", "COUPON_MIN_SUBTOTAL", "COUPON_REQUIRES_CUSTOMER", "COUPON_BUDGET_EXHAUSTED", "COUPON_CURRENCY_MISMATCH"];
1535
1556
  export type ServiceOrderErrorCode = (typeof SERVICE_ORDER_ERROR_CODES)[number];
1536
1557
  export {};
@@ -302,6 +302,11 @@ export const SERVICE_ORDER_ERROR_CODES = [
302
302
  'SERVICE_TRACKING_DISABLED',
303
303
  'SERVICE_TRACKING_NO_ADDRESS',
304
304
  'SERVICE_TRACKING_LINK_LAPSED',
305
+ // The customer's online quote decision (`_customerDecision.ts`, shared by the
306
+ // web routes) — see `SERVICE_TRACKING_DECISION_ERROR_CODES`
307
+ 'SERVICE_TRACKING_VERIFICATION_FAILED',
308
+ // A tracking link revoked between the handle check and the decision's commit.
309
+ 'SERVICE_TRACKING_TOKEN_INVALID',
305
310
  'ADMIN_REQUIRED',
306
311
  'CUSTODY_ILLEGAL_TRANSITION',
307
312
  'SERVICE_ORDER_BILLABLE_FROZEN',
@@ -5,12 +5,18 @@
5
5
  *
6
6
  * The HANDLE is 16 base62 characters (~95 bits), stored server-side and a
7
7
  * bearer credential over exactly ONE service order of one store. It authorises
8
- * the read (`GET /services/tracking?handle=`) and the current presupuesto PDF
9
- * (`GET /services/tracking?handle=&mode=quote-pdf`), and nothing else. Every
8
+ * the read (`GET /services/tracking?handle=`), the current presupuesto PDF
9
+ * (`GET /services/tracking?handle=&mode=quote-pdf`) and the online decision on
10
+ * that presupuesto, and nothing else. Every
10
11
  * earlier link of an order dies when staff revoke it. A link stops reading
11
12
  * `serviceTrackingLinkDaysAfterClose` days (platform global, default 90) after
12
13
  * the order reached a terminal status.
13
14
  *
15
+ * With the gate on, the customer may also approve (with a 6-digit code sent to
16
+ * the contact on file) or reject the current presupuesto
17
+ * (`POST /services/tracking/quote`, or signed in
18
+ * `POST /user { mode: 'service-quote-decision' }`).
19
+ *
14
20
  * The gate is `ecommerce.config.serviceTracking` AND the `workshop` module on.
15
21
  * With the gate off, staff cannot mint and the signed-in reads refuse, but a
16
22
  * link minted earlier keeps reading (STORE_MODULES rule 4).
@@ -51,6 +57,41 @@ export type ServiceTrackingAccountErrorCode = (typeof SERVICE_TRACKING_ACCOUNT_E
51
57
  */
52
58
  export declare const SERVICE_TRACKING_OPERATOR_ERROR_CODES: readonly ["SERVICE_TRACKING_DISABLED", "SERVICE_TRACKING_NO_ADDRESS", "SERVICE_TRACKING_LINK_LAPSED", "ADMIN_REQUIRED"];
53
59
  export type ServiceTrackingOperatorErrorCode = (typeof SERVICE_TRACKING_OPERATOR_ERROR_CODES)[number];
60
+ /**
61
+ * The refusals of the customer's online quote decision — by link
62
+ * (`POST /services/tracking/code`, `POST /services/tracking/quote`) and signed in
63
+ * (`POST /user { mode: 'service-quote-decision' }`).
64
+ *
65
+ * - SERVICE_TRACKING_TOKEN_INVALID (401, link only): the handle cannot be
66
+ * honoured — the same one body as the read.
67
+ * - SERVICE_TRACKING_VERIFICATION_FAILED (401, link approve only): no code, a
68
+ * wrong, used, expired or burnt one, or a challenge minted for another order.
69
+ * One body for every reason.
70
+ * - SERVICE_TRACKING_DISABLED (403): the store's gate is off. The read keeps working.
71
+ * - SERVICE_ORDER_NOT_FOUND (404, signed in only): no such order, a disabled
72
+ * one, or another customer's — one body.
73
+ * - SERVICE_QUOTE_NOT_FOUND (404): no version with that `quoteId`.
74
+ * - SERVICE_QUOTE_SUPERSEDED (409): a newer version replaced it.
75
+ * - SERVICE_QUOTE_ALREADY_RESOLVED (409): it already carries the OTHER decision
76
+ * (the same decision again answers 200 with the current view and writes nothing).
77
+ * - SERVICE_QUOTE_LAPSED (409, approve only): past `expiresAt`. A rejection is
78
+ * still accepted.
79
+ * - SERVICE_ORDER_QUOTE_CHANGED (409): the order moved under the decision — retry.
80
+ * - SERVICE_ORDER_TERMINAL / SERVICE_ORDER_DISABLED (409): the ticket is closed
81
+ * or deleted.
82
+ * - SERVICE_QUOTE_HOLDS_TOO_MANY (400, approve only): the version's parts cannot
83
+ * be reserved in one write; the shop must re-quote.
84
+ */
85
+ export declare const SERVICE_TRACKING_DECISION_ERROR_CODES: readonly ["SERVICE_TRACKING_TOKEN_INVALID", "SERVICE_TRACKING_VERIFICATION_FAILED", "SERVICE_TRACKING_DISABLED", "SERVICE_ORDER_NOT_FOUND", "SERVICE_QUOTE_NOT_FOUND", "SERVICE_QUOTE_SUPERSEDED", "SERVICE_QUOTE_ALREADY_RESOLVED", "SERVICE_QUOTE_LAPSED", "SERVICE_ORDER_QUOTE_CHANGED", "SERVICE_ORDER_TERMINAL", "SERVICE_ORDER_DISABLED", "SERVICE_QUOTE_HOLDS_TOO_MANY"];
86
+ export type ServiceTrackingDecisionErrorCode = (typeof SERVICE_TRACKING_DECISION_ERROR_CODES)[number];
87
+ /** Where the 6-digit decision code is sent: the phone or the email on file. */
88
+ export declare const SERVICE_TRACKING_CODE_VIAS: readonly ["sms", "email"];
89
+ /** The customer's two online answers to a presupuesto. */
90
+ export declare const SERVICE_TRACKING_QUOTE_DECISIONS: readonly ["approve", "reject"];
91
+ /** A decision challenge handle: 16 random bytes, base64url (22 characters). */
92
+ export declare const SERVICE_TRACKING_CHALLENGE_HANDLE_RE: RegExp;
93
+ /** The decision code: 6 digits. */
94
+ export declare const SERVICE_TRACKING_CODE_RE: RegExp;
54
95
  /** `POST /services { mode: 'trackingLink' }` actions. */
55
96
  export declare const SERVICE_TRACKING_LINK_ACTIONS: readonly ["mint", "revoke"];
56
97
  /** The storefront path a tracking link opens: `/servicio/{handle}`. */
@@ -148,11 +189,73 @@ declare global {
148
189
  }
149
190
  /** Whether the customer may decide the presupuesto online. */
150
191
  interface ServiceTrackingDecision {
151
- /** `false` until the online decision ships. */
192
+ /**
193
+ * `true` when the store's gate is on, the order is open and not deleted,
194
+ * and the current presupuesto is `sent` (awaiting an answer). A lapsed one
195
+ * stays decidable: it can still be rejected (an approval answers
196
+ * `409 SERVICE_QUOTE_LAPSED`).
197
+ */
152
198
  canDecide: boolean;
153
- /** Whether an approval needs the 6-digit code sent to the contact on file. */
199
+ /**
200
+ * Whether an approval needs the 6-digit code sent to the contact on file:
201
+ * `true` on the link, `false` signed in (the session is the proof).
202
+ */
154
203
  approveNeedsCode: boolean;
155
204
  }
205
+ type ServiceTrackingCodeVia = (typeof SERVICE_TRACKING_CODE_VIAS)[number];
206
+ type ServiceTrackingQuoteDecision = (typeof SERVICE_TRACKING_QUOTE_DECISIONS)[number];
207
+ /**
208
+ * `POST /services/tracking/code` body (strict): send the 6-digit decision code
209
+ * to the phone (`sms`) or the email ON FILE for the order's customer — never
210
+ * to an address in the request. Always `202 { challengeHandle }` once the
211
+ * handle is honoured and the gate is on, whether or not a code could be sent
212
+ * (no contact for that channel, a spent daily budget): the page offers only
213
+ * the channels whose masked contact it shows. The code lives
214
+ * `CUSTOMER_OTP_LIMITS.ttlSeconds` and takes `maxAttempts` tries.
215
+ */
216
+ interface ServiceTrackingCodeRequest {
217
+ handle: string;
218
+ via: ServiceTrackingCodeVia;
219
+ }
220
+ /** `POST /services/tracking/code` `data`. */
221
+ interface ServiceTrackingCodeResult {
222
+ /** 22 characters; sent back with the code on the approval. */
223
+ challengeHandle: string;
224
+ }
225
+ /**
226
+ * `POST /services/tracking/quote` body (strict): the customer's answer to the
227
+ * current presupuesto, by link. `quoteId` plus the order's own state are the
228
+ * concurrency check — there is no `version`.
229
+ *
230
+ * - `approve` needs `challengeHandle` + `code` (from `POST /services/tracking/code`);
231
+ * `reason` is refused.
232
+ * - `reject` needs `reason` only, and is accepted past `expiresAt`.
233
+ *
234
+ * Answers `200` with the current `ServiceTrackingView`. The same decision again
235
+ * on the same `quoteId` answers `200` with the view and writes nothing. The
236
+ * decision does NOT move the order's stage; the shop does.
237
+ */
238
+ interface ServiceTrackingQuoteDecisionRequest {
239
+ handle: string;
240
+ quoteId: string;
241
+ decision: ServiceTrackingQuoteDecision;
242
+ reason?: ServiceQuoteRejectionReason;
243
+ challengeHandle?: string;
244
+ code?: string;
245
+ }
246
+ /**
247
+ * `POST /user { mode: 'service-quote-decision' }` body: the same answer by the
248
+ * signed-in owner of the order (`verifiedBy: 'session'`, no code). Another
249
+ * customer's `serviceOrderId` answers the same `404 SERVICE_ORDER_NOT_FOUND`
250
+ * as a missing one. Answers `200` with the current `ServiceTrackingView`.
251
+ */
252
+ interface ServiceQuoteDecisionAccountRequest {
253
+ mode: 'service-quote-decision';
254
+ serviceOrderId: string;
255
+ quoteId: string;
256
+ decision: ServiceTrackingQuoteDecision;
257
+ reason?: ServiceQuoteRejectionReason;
258
+ }
156
259
  /** The customer's contact as the shop holds it, masked. */
157
260
  interface ServiceTrackingContact {
158
261
  firstName: string;
@@ -196,6 +299,10 @@ declare global {
196
299
  contact: ServiceTrackingContact;
197
300
  store: ServiceTrackingStore;
198
301
  }
302
+ /** What a `SERVICE_QUOTE_DECIDED` operator bell points at. */
303
+ interface ServiceOrderRef {
304
+ serviceOrderId: string;
305
+ }
199
306
  /** One row of `GET /user?mode=service-orders`. */
200
307
  interface ServiceTrackingAccountListItem {
201
308
  serviceOrderId: string;
@@ -5,12 +5,18 @@
5
5
  *
6
6
  * The HANDLE is 16 base62 characters (~95 bits), stored server-side and a
7
7
  * bearer credential over exactly ONE service order of one store. It authorises
8
- * the read (`GET /services/tracking?handle=`) and the current presupuesto PDF
9
- * (`GET /services/tracking?handle=&mode=quote-pdf`), and nothing else. Every
8
+ * the read (`GET /services/tracking?handle=`), the current presupuesto PDF
9
+ * (`GET /services/tracking?handle=&mode=quote-pdf`) and the online decision on
10
+ * that presupuesto, and nothing else. Every
10
11
  * earlier link of an order dies when staff revoke it. A link stops reading
11
12
  * `serviceTrackingLinkDaysAfterClose` days (platform global, default 90) after
12
13
  * the order reached a terminal status.
13
14
  *
15
+ * With the gate on, the customer may also approve (with a 6-digit code sent to
16
+ * the contact on file) or reject the current presupuesto
17
+ * (`POST /services/tracking/quote`, or signed in
18
+ * `POST /user { mode: 'service-quote-decision' }`).
19
+ *
14
20
  * The gate is `ecommerce.config.serviceTracking` AND the `workshop` module on.
15
21
  * With the gate off, staff cannot mint and the signed-in reads refuse, but a
16
22
  * link minted earlier keeps reading (STORE_MODULES rule 4).
@@ -53,6 +59,53 @@ export const SERVICE_TRACKING_OPERATOR_ERROR_CODES = [
53
59
  'SERVICE_TRACKING_LINK_LAPSED',
54
60
  'ADMIN_REQUIRED',
55
61
  ];
62
+ /**
63
+ * The refusals of the customer's online quote decision — by link
64
+ * (`POST /services/tracking/code`, `POST /services/tracking/quote`) and signed in
65
+ * (`POST /user { mode: 'service-quote-decision' }`).
66
+ *
67
+ * - SERVICE_TRACKING_TOKEN_INVALID (401, link only): the handle cannot be
68
+ * honoured — the same one body as the read.
69
+ * - SERVICE_TRACKING_VERIFICATION_FAILED (401, link approve only): no code, a
70
+ * wrong, used, expired or burnt one, or a challenge minted for another order.
71
+ * One body for every reason.
72
+ * - SERVICE_TRACKING_DISABLED (403): the store's gate is off. The read keeps working.
73
+ * - SERVICE_ORDER_NOT_FOUND (404, signed in only): no such order, a disabled
74
+ * one, or another customer's — one body.
75
+ * - SERVICE_QUOTE_NOT_FOUND (404): no version with that `quoteId`.
76
+ * - SERVICE_QUOTE_SUPERSEDED (409): a newer version replaced it.
77
+ * - SERVICE_QUOTE_ALREADY_RESOLVED (409): it already carries the OTHER decision
78
+ * (the same decision again answers 200 with the current view and writes nothing).
79
+ * - SERVICE_QUOTE_LAPSED (409, approve only): past `expiresAt`. A rejection is
80
+ * still accepted.
81
+ * - SERVICE_ORDER_QUOTE_CHANGED (409): the order moved under the decision — retry.
82
+ * - SERVICE_ORDER_TERMINAL / SERVICE_ORDER_DISABLED (409): the ticket is closed
83
+ * or deleted.
84
+ * - SERVICE_QUOTE_HOLDS_TOO_MANY (400, approve only): the version's parts cannot
85
+ * be reserved in one write; the shop must re-quote.
86
+ */
87
+ export const SERVICE_TRACKING_DECISION_ERROR_CODES = [
88
+ 'SERVICE_TRACKING_TOKEN_INVALID',
89
+ 'SERVICE_TRACKING_VERIFICATION_FAILED',
90
+ 'SERVICE_TRACKING_DISABLED',
91
+ 'SERVICE_ORDER_NOT_FOUND',
92
+ 'SERVICE_QUOTE_NOT_FOUND',
93
+ 'SERVICE_QUOTE_SUPERSEDED',
94
+ 'SERVICE_QUOTE_ALREADY_RESOLVED',
95
+ 'SERVICE_QUOTE_LAPSED',
96
+ 'SERVICE_ORDER_QUOTE_CHANGED',
97
+ 'SERVICE_ORDER_TERMINAL',
98
+ 'SERVICE_ORDER_DISABLED',
99
+ 'SERVICE_QUOTE_HOLDS_TOO_MANY',
100
+ ];
101
+ /** Where the 6-digit decision code is sent: the phone or the email on file. */
102
+ export const SERVICE_TRACKING_CODE_VIAS = ['sms', 'email'];
103
+ /** The customer's two online answers to a presupuesto. */
104
+ export const SERVICE_TRACKING_QUOTE_DECISIONS = ['approve', 'reject'];
105
+ /** A decision challenge handle: 16 random bytes, base64url (22 characters). */
106
+ export const SERVICE_TRACKING_CHALLENGE_HANDLE_RE = /^[\w-]{22}$/;
107
+ /** The decision code: 6 digits. */
108
+ export const SERVICE_TRACKING_CODE_RE = /^\d{6}$/;
56
109
  /** `POST /services { mode: 'trackingLink' }` actions. */
57
110
  export const SERVICE_TRACKING_LINK_ACTIONS = ['mint', 'revoke'];
58
111
  /** The storefront path a tracking link opens: `/servicio/{handle}`. */
@@ -23,6 +23,10 @@ import { STOREFRONT_DESIGN_LITERAL_MAX_CODE_POINTS } from "./storefrontDesignReg
23
23
  * parameters.
24
24
  */
25
25
  export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
26
+ 'ADDRESSES_IS_DEFAULT',
27
+ 'ADDRESSES_LIMIT_REACHED',
28
+ 'ADDRESSES_NOT_FOUND',
29
+ 'ADDRESSES_WRITE_CONTENDED',
26
30
  'ALERT_INCLUDED_VAT',
27
31
  'APPOINTMENTS_BOOKED_DESC',
28
32
  'APPOINTMENTS_BOOKED_TITLE',
@@ -320,9 +324,11 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
320
324
  'BASKET_LINE_LIMIT_REACHED',
321
325
  'BASKET_LINE_NOT_LOADED',
322
326
  'BASKET_LINE_NOT_OFFERED',
327
+ 'BASKET_LINE_NO_PRICE',
323
328
  'BASKET_LINE_OUT_OF_STOCK',
324
329
  'BASKET_LINE_STOCK_SHORT_HIDDEN',
325
330
  'BASKET_LINE_UNAVAILABLE',
331
+ 'BASKET_LINE_WITHDRAWN',
326
332
  'BASKET_LOADING',
327
333
  'BASKET_MIN_BUY_MISSING',
328
334
  'BASKET_NEXT_BUTTON',
@@ -353,8 +359,28 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
353
359
  'BASKET_UNDO_ACTION',
354
360
  'BASKET_UPDATED_CONFIRMATION',
355
361
  'BASKET_VIEW_BASKET_ACTION',
362
+ 'BRANDS_DIRECTORY_EMPTY',
356
363
  'BRANDS_ERR_LOAD',
364
+ 'BRANDS_FILTER_ALL',
365
+ 'BRANDS_JUMP_LABEL',
366
+ 'BRANDS_LETTERS_LABEL',
367
+ 'BRANDS_LETTER_OTHER',
368
+ 'BRANDS_LETTER_OTHER_LABEL',
369
+ 'BRANDS_SEARCH_CLEAR',
370
+ 'BRANDS_SEARCH_LABEL',
371
+ 'BRANDS_SHOW_MORE',
357
372
  'BRANDS_TITLE',
373
+ 'BRAND_BREADCRUMB_LABEL',
374
+ 'BRAND_DESCRIPTION_MORE',
375
+ 'CATEGORY_DIRECTORY_EMPTY',
376
+ 'CATEGORY_DIRECTORY_EMPTY_ACTION',
377
+ 'CATEGORY_DIRECTORY_FAILED',
378
+ 'CATEGORY_DIRECTORY_JUMP_LABEL',
379
+ 'CATEGORY_MORE_ROOTS_TITLE',
380
+ 'CATEGORY_SHOW_LESS',
381
+ 'CATEGORY_SIBLINGS_LABEL',
382
+ 'CATEGORY_SUBCATEGORIES_LABEL',
383
+ 'CATEGORY_VIEW_ALL',
358
384
  'CHECKOUT_ACCESS_PENDING',
359
385
  'CHECKOUT_ACCESS_REJECTED',
360
386
  'CHECKOUT_ACCOUNT_DISABLED',
@@ -423,7 +449,6 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
423
449
  'CHECKOUT_DNI_REQUIRED_MESSAGE',
424
450
  'CHECKOUT_DNI_REQUIRED_MESSAGE_NO_THRESHOLD',
425
451
  'CHECKOUT_EDIT_BASKET',
426
- 'CHECKOUT_EMAIL_VERIFICATION_REQUIRED',
427
452
  'CHECKOUT_EMPTY_BASKET',
428
453
  'CHECKOUT_FX_NOTICE_PAYING',
429
454
  'CHECKOUT_FX_NOTICE_PREFERRED',
@@ -538,11 +563,13 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
538
563
  'DATA_RIGHTS_COLLECTION_CONTACTS',
539
564
  'DATA_RIGHTS_COLLECTION_FAVORITES',
540
565
  'DATA_RIGHTS_COLLECTION_INVOICES',
566
+ 'DATA_RIGHTS_COLLECTION_LOYALTY',
541
567
  'DATA_RIGHTS_COLLECTION_NOTES',
542
568
  'DATA_RIGHTS_COLLECTION_ORDERS',
543
569
  'DATA_RIGHTS_COLLECTION_PAYMENTS',
544
570
  'DATA_RIGHTS_COLLECTION_QUOTE_REQUESTS',
545
571
  'DATA_RIGHTS_COLLECTION_RECENT_PURCHASES',
572
+ 'DATA_RIGHTS_COLLECTION_SERVICE_ORDERS',
546
573
  'DATA_RIGHTS_COLLECTION_WHOLESALE_REQUESTS',
547
574
  'DATA_RIGHTS_DIALOG_ACK',
548
575
  'DATA_RIGHTS_DIALOG_CONFIRM',
@@ -623,6 +650,11 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
623
650
  'FAVORITES_TOGGLE_ARIA',
624
651
  'FAVORITES_TOGGLE_NAME',
625
652
  'FAVORITES_UNAVAILABLE',
653
+ 'FOOTER_DEFAULT_ACCOUNT_TITLE',
654
+ 'FOOTER_DEFAULT_CONTACT',
655
+ 'FOOTER_DEFAULT_HELP_TITLE',
656
+ 'FOOTER_DEFAULT_SHOP_TITLE',
657
+ 'FOOTER_LEGAL_NAV_ARIA',
626
658
  'FOOTER_PRIVACY_POLICY',
627
659
  'FORMS_FIELD_DNI_LABEL',
628
660
  'FORMS_FIELD_PHONE_LABEL',
@@ -669,7 +701,6 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
669
701
  'FORMS_ZOD_VALUE_OPTIONS',
670
702
  'FORM_FIX_ERRORS',
671
703
  'GLOBALS_APPOINTMENTS',
672
- 'GLOBALS_APP_VERSION',
673
704
  'GLOBALS_BASKET',
674
705
  'GLOBALS_BRANDS',
675
706
  'GLOBALS_CATEGORIES',
@@ -741,6 +772,9 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
741
772
  'HEADER_SEARCH_INPUT',
742
773
  'HEADER_SEARCH_LABEL',
743
774
  'HEADER_SEARCH_RECENT',
775
+ 'HEADER_SEARCH_RECENT_CLEAR',
776
+ 'HEADER_SEARCH_RECENT_CLEAR_ARIA',
777
+ 'HEADER_SEARCH_RECENT_REMOVE',
744
778
  'HEADER_SEARCH_SUGGESTIONS',
745
779
  'HEADER_SEARCH_SUGGESTION_BARCODE',
746
780
  'HEADER_SEARCH_SUGGESTION_SKU',
@@ -886,7 +920,9 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
886
920
  'MAINTENANCE_REDIRECT_TO_BASKET',
887
921
  'MAINTENANCE_SUPPORT_HINT_EMAIL',
888
922
  'MAINTENANCE_SURVEY_DISABLED',
923
+ 'MAINTENANCE_WHATSAPP_OPT_IN_DISABLED',
889
924
  'MAINTENANCE_WHOLESALE_REQUEST_DISABLED',
925
+ 'MAINTENANCE_WITHDRAWAL_DISABLED',
890
926
  'MARKETING_ACTIVATE_ALL',
891
927
  'MARKETING_ACTIVE_COUNT',
892
928
  'MARKETING_CHANNEL_ADS',
@@ -895,12 +931,6 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
895
931
  'MARKETING_CHANNEL_EMAIL',
896
932
  'MARKETING_CHANNEL_EMAIL_DESC',
897
933
  'MARKETING_CHANNEL_EMAIL_EXAMPLE',
898
- 'MARKETING_CHANNEL_SMS',
899
- 'MARKETING_CHANNEL_SMS_DESC',
900
- 'MARKETING_CHANNEL_SMS_EXAMPLE',
901
- 'MARKETING_CHANNEL_WHATSAPP',
902
- 'MARKETING_CHANNEL_WHATSAPP_DESC',
903
- 'MARKETING_CHANNEL_WHATSAPP_EXAMPLE',
904
934
  'MARKETING_DEACTIVATE_ALL',
905
935
  'MARKETING_ERROR_MESSAGE',
906
936
  'MARKETING_EXAMPLE_PREFIX',
@@ -920,6 +950,7 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
920
950
  'MOBILE_BUTTONS_BASKET',
921
951
  'MOBILE_BUTTONS_FAVORITES',
922
952
  'MOBILE_BUTTONS_INVOICES',
953
+ 'MOBILE_BUTTONS_NAV_ARIA',
923
954
  'MOBILE_BUTTONS_ORDERS',
924
955
  'NETWORK_OFFLINE',
925
956
  'NETWORK_REQUEST_FAILED',
@@ -948,6 +979,10 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
948
979
  'NOTIFICATION_PREFS_SUBTITLE',
949
980
  'NOTIFICATION_PREFS_TITLE',
950
981
  'NOTIFICATION_PREFS_UNAVAILABLE_RETRY',
982
+ 'NOTIFICATION_PREFS_WHATSAPP_ARIA',
983
+ 'NOTIFICATION_PREFS_WHATSAPP_DESCRIPTION',
984
+ 'NOTIFICATION_PREFS_WHATSAPP_LABEL',
985
+ 'NOTIFICATION_PREFS_WHATSAPP_NOT_SAVED',
951
986
  'NOT_FOUND_BACK_HOME',
952
987
  'NOT_FOUND_PAGE_BODY',
953
988
  'NOT_FOUND_PAGE_TITLE',
@@ -1176,6 +1211,7 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
1176
1211
  'PREVIEW_UNAVAILABLE_ACTION',
1177
1212
  'PREVIEW_VARIANTS',
1178
1213
  'PREVIEW_WAITING',
1214
+ 'PRICING_NET_PLUS_IVA',
1179
1215
  'PRICING_TIER_CHIP',
1180
1216
  'PRICING_TIER_FROM',
1181
1217
  'PRICING_TIER_UNITS',
@@ -1186,10 +1222,14 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
1186
1222
  'PRODUCTS_CLEAR_FILTERS',
1187
1223
  'PRODUCTS_FILTERS_LABEL',
1188
1224
  'PRODUCTS_FILTER_ALL_BRANDS',
1225
+ 'PRODUCTS_FILTER_ALL_CATEGORIES',
1189
1226
  'PRODUCTS_FILTER_ALL_PRODUCTS',
1190
1227
  'PRODUCTS_FILTER_ALL_TAGS',
1191
1228
  'PRODUCTS_FILTER_AVAILABILITY',
1192
1229
  'PRODUCTS_FILTER_BRAND',
1230
+ 'PRODUCTS_FILTER_BRAND_UNAVAILABLE',
1231
+ 'PRODUCTS_FILTER_CATEGORY',
1232
+ 'PRODUCTS_FILTER_CATEGORY_UNAVAILABLE',
1193
1233
  'PRODUCTS_FILTER_IN_OFFER',
1194
1234
  'PRODUCTS_FILTER_IN_STOCK',
1195
1235
  'PRODUCTS_FILTER_TAG',
@@ -1200,10 +1240,14 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
1200
1240
  'PRODUCTS_NO_INCOMES',
1201
1241
  'PRODUCTS_NO_MATCHES',
1202
1242
  'PRODUCTS_NO_RESULTS',
1243
+ 'PRODUCTS_PICK_SUBCATEGORY',
1203
1244
  'PRODUCTS_SEARCH_TITLE',
1204
- 'PRODUCTS_SELECT_CATEGORY',
1205
1245
  'PRODUCTS_SORT_LABEL',
1246
+ 'PRODUCTS_SORT_NAME_ASC',
1247
+ 'PRODUCTS_SORT_NAME_DESC',
1206
1248
  'PRODUCTS_SORT_NEWEST',
1249
+ 'PRODUCTS_SORT_PRICE_ASC',
1250
+ 'PRODUCTS_SORT_PRICE_DESC',
1207
1251
  'PRODUCTS_SORT_RELEVANCE',
1208
1252
  'PRODUCTS_TAG_NOT_FOUND',
1209
1253
  'PRODUCTS_TAG_TITLE',
@@ -1247,6 +1291,8 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
1247
1291
  'PRODUCT_INFO_TITLE',
1248
1292
  'PRODUCT_LOAD_FAILED',
1249
1293
  'PRODUCT_PAGE_TITLE',
1294
+ 'PRODUCT_PRICE_ON_REQUEST',
1295
+ 'PRODUCT_PRICE_ON_REQUEST_HINT',
1250
1296
  'PRODUCT_PRICE_PER_UNIT',
1251
1297
  'PRODUCT_PROMOTIONS_HINT',
1252
1298
  'PRODUCT_PROMOTIONS_TITLE',
@@ -1398,6 +1444,7 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
1398
1444
  'QUOTE_REQUEST_SIGNED_IN_HINT',
1399
1445
  'QUOTE_REQUEST_SUBMIT',
1400
1446
  'QUOTE_REQUEST_SUCCESS',
1447
+ 'REORDER_SHELF_TITLE',
1401
1448
  'SALE_BADGE_OFFER',
1402
1449
  'SALE_CHIP_ALL',
1403
1450
  'SALE_DISCOUNT_PERCENT',
@@ -1486,6 +1533,14 @@ export const STOREFRONT_WEB_LITERAL_KEYS = Object.freeze([
1486
1533
  'SURVEY_TITLE',
1487
1534
  'SYNC_ALERT_ERROR_MESSAGE',
1488
1535
  'SYNC_ALERT_OFFLINE_MESSAGE',
1536
+ 'WHATSAPP_OPT_IN_ERROR',
1537
+ 'WHATSAPP_OPT_IN_HELP_GUEST',
1538
+ 'WHATSAPP_OPT_IN_HELP_SIGNED_IN',
1539
+ 'WHATSAPP_OPT_IN_OFFER_ACTION',
1540
+ 'WHATSAPP_OPT_IN_OFFER_TEXT',
1541
+ 'WHATSAPP_OPT_IN_PROFILE_LINK',
1542
+ 'WHATSAPP_OPT_IN_SUCCESS',
1543
+ 'WHATSAPP_OPT_IN_UNAVAILABLE',
1489
1544
  'WHOLESALE_REQUEST_ACTIVITY_LABEL',
1490
1545
  'WHOLESALE_REQUEST_ALREADY_PENDING',
1491
1546
  'WHOLESALE_REQUEST_APPROVED',
@@ -939,6 +939,21 @@ declare global {
939
939
  payment_id: string;
940
940
  source: 'mp' | 'stripe' | 'mp_movement';
941
941
  }
942
+ /**
943
+ * ADMIN-tier staff reversed a linked payment's ledger credit (`POST /payments/{source}/{paymentId}/link`
944
+ * `{ mode: 'reverse-credit' }`). `user_id` is the acting operator; `customer_id` the customer whose
945
+ * balance rose by `amount` (in the ledger `currency`). Ids and figures only — never the operator's reason.
946
+ * BE-emitted, after the commit.
947
+ */
948
+ interface PaymentCreditReversedEvent extends UserActivityEventBase {
949
+ event: 'Payment Credit Reversed';
950
+ payment_id: string;
951
+ source: PaymentReceivedSource;
952
+ customer_id: string;
953
+ reversal_account_id: string;
954
+ amount: number;
955
+ currency: string;
956
+ }
942
957
  interface PaymentLinkageUpdatedEvent extends UserActivityEventBase {
943
958
  event: 'Payment Linkage Updated';
944
959
  payment_id: string;
@@ -1400,7 +1415,7 @@ declare global {
1400
1415
  event: 'Store Network Removed';
1401
1416
  network_id: string;
1402
1417
  }
1403
- type UserActivityEvent = CustomerConsentImportedEvent | CustomerConsentImportCompletedEvent | UserLoggedInEvent | UserLoggedOutEvent | UserPasswordChangedEvent | UserSuspendedEvent | TwoFactorEnrolledEvent | TwoFactorDisabledEvent | TwoFactorResetEvent | TwoFactorRecoveryCodesGeneratedEvent | PasskeyRegisteredEvent | PasskeyRevokedEvent | CustomerPasskeysRevokedEvent | StoreSettingsUpdatedEvent | PlanChangedEvent | InvoiceCreatedEvent | OrderCreatedEvent | OrderCancelledEvent | OrderEditedEvent | OrderReturnedEvent | ReturnLineRegradedEvent | ProductPriceChangedEvent | CustomerCreatedEvent | CustomerEditedEvent | CustomerRecordServedEvent | CustomerCreditCheckPerformedEvent | CustomersMergedEvent | CustomerMergeCancelledEvent | CashDrawerOpenedEvent | CashDrawerClosedEvent | TenantImpersonatedEvent | SecretRotatedEvent | UserCreatedEvent | UserUpdatedEvent | ProductCreatedEvent | ProductUpdatedEvent | StockIncomeCreatedEvent | StockAdjustedEvent | CategoryCreatedEvent | CategoryUpdatedEvent | BrandCreatedEvent | BrandUpdatedEvent | AttributeCreatedEvent | AttributeUpdatedEvent | SupplierCreatedEvent | SupplierUpdatedEvent | SupplierInvoiceCreatedEvent | SupplierInvoiceMatchOverriddenEvent | SupplierClaimRaisedEvent | SupplierClaimStatusChangedEvent | SupplierAccountCreatedEvent | SupplierAccountUpdatedEvent | AccountCreatedEvent | AccountDeletedEvent | CustomerBalanceReprojectedEvent | BasketUpdatedEvent | BasketDiscountGrantedEvent | BasketDeletedEvent | CashDrawerMovementEvent | CashDrawerReconciledEvent | PaymentCreatedEvent | PaymentLinkedEvent | PaymentUnlinkedEvent | PaymentLinkageUpdatedEvent | CreditLimitOverriddenEvent | AppointmentSelfBookingBlockOverriddenEvent | AppointmentSelfBookingBlockLiftedEvent | NotificationReadEvent | LogDeletedEvent | PlanCreatedEvent | StoreMaintenanceToggledEvent | PlatformMaintenanceToggledEvent | MaintenanceBroadcastSentEvent | TenantCreatedEvent | LiteralUpdatedEvent | SupportTicketCreatedEvent | SupportTicketUpdatedEvent | AuditTrailViewedEvent | ReportViewedEvent | CustomerPiiViewedEvent | CashDrawerUiOpenedEvent | CashDrawerUiClosedEvent | ExportInitiatedEvent | ImpersonationUiStartedEvent | ImpersonationUiEndedEvent | PaymentViewedEvent | InvoiceViewedEvent | CustomerDetailViewedEvent | SupplierAccountViewedEvent | SearchPerformedEvent | ActionDeniedEvent | TwoFactorChallengeShownEvent | TwoFactorCodeValidationFailedEvent | TwoFactorEnrollmentStartedEvent | TwoFactorRecoveryCodesRevealedEvent | TwoFactorResetInitiatedEvent | IntegrationTokenRefreshedEvent | WaitlistConvertedEvent | PlatformConfigUpdatedEvent | MlChannelStatusChangedEvent | IntegrationConnectionChangedEvent | PrintRuleCreatedEvent | PrintRuleEditedEvent | PrintRuleDeletedEvent | WebhookCreatedEvent | WebhookUpdatedEvent | WebhookDeletedEvent | PrinterActiveToggledEvent | PrinterRawFormatsUpdatedEvent | PrinterProfileUpdatedEvent | PlanTemplateUpdatedEvent | SupplierAccountDeletedEvent | CustomerPasswordResetInitiatedEvent | UserSessionsRevokedEvent | UserAnonymizedEvent | UserPasswordResetInitiatedByOperatorEvent | AgentCommandDispatchedEvent | PrintJobCancelledEvent | PrintAgentPairingCodeMintedEvent | PrintAgentPairedEvent | PrintAgentRevokedEvent | RmaRequestedEvent | RmaTransitionedEvent | RmaTrackingUpdatedEvent | ClockedInEvent | ClockedOutEvent | AttendanceCorrectedEvent | StoreNetworkRegisteredEvent | StoreNetworkRemovedEvent;
1418
+ type UserActivityEvent = CustomerConsentImportedEvent | CustomerConsentImportCompletedEvent | UserLoggedInEvent | UserLoggedOutEvent | UserPasswordChangedEvent | UserSuspendedEvent | TwoFactorEnrolledEvent | TwoFactorDisabledEvent | TwoFactorResetEvent | TwoFactorRecoveryCodesGeneratedEvent | PasskeyRegisteredEvent | PasskeyRevokedEvent | CustomerPasskeysRevokedEvent | StoreSettingsUpdatedEvent | PlanChangedEvent | InvoiceCreatedEvent | OrderCreatedEvent | OrderCancelledEvent | OrderEditedEvent | OrderReturnedEvent | ReturnLineRegradedEvent | ProductPriceChangedEvent | CustomerCreatedEvent | CustomerEditedEvent | CustomerRecordServedEvent | CustomerCreditCheckPerformedEvent | CustomersMergedEvent | CustomerMergeCancelledEvent | CashDrawerOpenedEvent | CashDrawerClosedEvent | TenantImpersonatedEvent | SecretRotatedEvent | UserCreatedEvent | UserUpdatedEvent | ProductCreatedEvent | ProductUpdatedEvent | StockIncomeCreatedEvent | StockAdjustedEvent | CategoryCreatedEvent | CategoryUpdatedEvent | BrandCreatedEvent | BrandUpdatedEvent | AttributeCreatedEvent | AttributeUpdatedEvent | SupplierCreatedEvent | SupplierUpdatedEvent | SupplierInvoiceCreatedEvent | SupplierInvoiceMatchOverriddenEvent | SupplierClaimRaisedEvent | SupplierClaimStatusChangedEvent | SupplierAccountCreatedEvent | SupplierAccountUpdatedEvent | AccountCreatedEvent | AccountDeletedEvent | CustomerBalanceReprojectedEvent | BasketUpdatedEvent | BasketDiscountGrantedEvent | BasketDeletedEvent | CashDrawerMovementEvent | CashDrawerReconciledEvent | PaymentCreatedEvent | PaymentLinkedEvent | PaymentUnlinkedEvent | PaymentCreditReversedEvent | PaymentLinkageUpdatedEvent | CreditLimitOverriddenEvent | AppointmentSelfBookingBlockOverriddenEvent | AppointmentSelfBookingBlockLiftedEvent | NotificationReadEvent | LogDeletedEvent | PlanCreatedEvent | StoreMaintenanceToggledEvent | PlatformMaintenanceToggledEvent | MaintenanceBroadcastSentEvent | TenantCreatedEvent | LiteralUpdatedEvent | SupportTicketCreatedEvent | SupportTicketUpdatedEvent | AuditTrailViewedEvent | ReportViewedEvent | CustomerPiiViewedEvent | CashDrawerUiOpenedEvent | CashDrawerUiClosedEvent | ExportInitiatedEvent | ImpersonationUiStartedEvent | ImpersonationUiEndedEvent | PaymentViewedEvent | InvoiceViewedEvent | CustomerDetailViewedEvent | SupplierAccountViewedEvent | SearchPerformedEvent | ActionDeniedEvent | TwoFactorChallengeShownEvent | TwoFactorCodeValidationFailedEvent | TwoFactorEnrollmentStartedEvent | TwoFactorRecoveryCodesRevealedEvent | TwoFactorResetInitiatedEvent | IntegrationTokenRefreshedEvent | WaitlistConvertedEvent | PlatformConfigUpdatedEvent | MlChannelStatusChangedEvent | IntegrationConnectionChangedEvent | PrintRuleCreatedEvent | PrintRuleEditedEvent | PrintRuleDeletedEvent | WebhookCreatedEvent | WebhookUpdatedEvent | WebhookDeletedEvent | PrinterActiveToggledEvent | PrinterRawFormatsUpdatedEvent | PrinterProfileUpdatedEvent | PlanTemplateUpdatedEvent | SupplierAccountDeletedEvent | CustomerPasswordResetInitiatedEvent | UserSessionsRevokedEvent | UserAnonymizedEvent | UserPasswordResetInitiatedByOperatorEvent | AgentCommandDispatchedEvent | PrintJobCancelledEvent | PrintAgentPairingCodeMintedEvent | PrintAgentPairedEvent | PrintAgentRevokedEvent | RmaRequestedEvent | RmaTransitionedEvent | RmaTrackingUpdatedEvent | ClockedInEvent | ClockedOutEvent | AttendanceCorrectedEvent | StoreNetworkRegisteredEvent | StoreNetworkRemovedEvent;
1404
1419
  }
1405
1420
  /**
1406
1421
  * Canonical whitelist of UI-only `UserActivityEvent` variant names. Imported by
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "platform-types",
3
- "version": "1.10.853",
3
+ "version": "1.10.855",
4
4
  "description": "Shared wire and entity contracts for the platform.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",