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.
- package/dist/account.d.ts +6 -0
- package/dist/accountAllocation.d.ts +125 -0
- package/dist/accountAllocation.js +193 -0
- package/dist/cjs/accountAllocation.js +198 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/notification.js +19 -0
- package/dist/cjs/payment.js +44 -0
- package/dist/cjs/serviceOrder.js +5 -0
- package/dist/cjs/serviceTracking.js +56 -3
- package/dist/cjs/storefrontWebLiteralKeys.js +64 -9
- package/dist/customer.d.ts +8 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/notification.d.ts +24 -1
- package/dist/notification.js +19 -0
- package/dist/payment.d.ts +73 -1
- package/dist/payment.js +43 -1
- package/dist/print.d.ts +6 -0
- package/dist/product.d.ts +7 -0
- package/dist/serviceOrder.d.ts +33 -12
- package/dist/serviceOrder.js +5 -0
- package/dist/serviceTracking.d.ts +111 -4
- package/dist/serviceTracking.js +55 -2
- package/dist/storefrontWebLiteralKeys.js +64 -9
- package/dist/userActivity.d.ts +16 -1
- package/package.json +1 -1
package/dist/serviceOrder.d.ts
CHANGED
|
@@ -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
|
|
365
|
-
*
|
|
366
|
-
*
|
|
367
|
-
*
|
|
368
|
-
* an event that did not happen
|
|
369
|
-
* `POST /services` quote-resolve
|
|
370
|
-
*
|
|
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
|
-
*
|
|
408
|
-
*
|
|
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
|
-
/**
|
|
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 {};
|
package/dist/serviceOrder.js
CHANGED
|
@@ -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=`)
|
|
9
|
-
* (`GET /services/tracking?handle=&mode=quote-pdf`)
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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;
|
package/dist/serviceTracking.js
CHANGED
|
@@ -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=`)
|
|
9
|
-
* (`GET /services/tracking?handle=&mode=quote-pdf`)
|
|
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',
|
package/dist/userActivity.d.ts
CHANGED
|
@@ -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
|