platform-types 1.10.717 → 1.10.719
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/basket.d.ts +23 -0
- package/dist/basket.js +22 -0
- package/dist/cart.d.ts +22 -9
- package/dist/cash.d.ts +16 -3
- package/dist/cash.js +17 -2
- package/dist/cjs/basket.js +23 -1
- package/dist/cjs/cash.js +17 -2
- package/dist/order.d.ts +34 -1
- package/package.json +1 -1
package/dist/basket.d.ts
CHANGED
|
@@ -76,4 +76,27 @@ declare global {
|
|
|
76
76
|
*/
|
|
77
77
|
export declare const BASKET_ERROR_CODES: readonly ["VALIDATION_FAILED", "FOREIGN_INDEX_KEY_ATTRIBUTE", "CART_TARGET_REQUIRED", "CART_NOT_FOUND", "CART_REVIEW_INCOMPLETE", "CART_REVIEW_UNAVAILABLE", "CART_NOT_PARKED", "CART_ALREADY_PARKED", "TERMINAL_INDEX_UNAVAILABLE", "PRODUCT_NOT_FOUND", "PRODUCT_COST_UNKNOWN", "UNIT_QUANTITY_NOT_WHOLE", "BASKET_VERSION_CONFLICT", "BASKET_LINE_LIMIT", "BASKET_SIZE_LIMIT", "UNKNOWN_LINE", "INVALID_PRICE", "LINE_DISCOUNT_NOT_ALLOWED", "LINE_DISCOUNT_EXCEEDS_MAX", "FX_CONVERSION_UNAVAILABLE", "COUPON_NOT_FOUND", "COUPON_NOT_ACTIVE", "COUPON_EXPIRED", "COUPON_EXHAUSTED", "COUPON_MIN_SUBTOTAL", "COUPON_REQUIRES_CUSTOMER", "COUPON_BUDGET_EXHAUSTED", "COUPON_RATE_LIMITED", "COUPON_CURRENCY_MISMATCH", "PROMOTION_NOT_FOUND", "PROMOTION_NOT_ACTIVE", "PROMOTION_NOT_STARTED", "PROMOTION_EXPIRED", "PROMOTION_NOT_CART_APPLICABLE"];
|
|
78
78
|
export type BasketErrorCode = (typeof BASKET_ERROR_CODES)[number];
|
|
79
|
+
/**
|
|
80
|
+
* The refusals the storefront's POST /basket { mode: 'resume', token } handler
|
|
81
|
+
* itself answers (an abandoned-cart recovery link). Middleware refusals
|
|
82
|
+
* (GATING_ERROR_CODES, STOREFRONT_UNAVAILABLE, validation) are separate, and so
|
|
83
|
+
* are the cart resolver's BasketErrorCode refusals, which the fold or
|
|
84
|
+
* reinstatement write forwards unchanged once ownership is proven (for example
|
|
85
|
+
* 409 BASKET_VERSION_CONFLICT, or 404 CART_NOT_FOUND carrying data.cartId when
|
|
86
|
+
* the fold target was deleted mid-request).
|
|
87
|
+
*
|
|
88
|
+
* - CART_RESUME_UNAVAILABLE (404): every reason the link cannot be honoured —
|
|
89
|
+
* invalid or expired token, another store, a cart that is gone, converted,
|
|
90
|
+
* owned by someone else, held by a till, or already folded into a cart that
|
|
91
|
+
* has since gone — with one identical body, so a
|
|
92
|
+
* forwarded email is never an existence oracle. Render one neutral message.
|
|
93
|
+
* - CART_RESUME_INCOMPLETE (503): the caller owns the cart, but whether a live
|
|
94
|
+
* cart should receive the recovered lines could not be proven — the read of
|
|
95
|
+
* the caller's carts stopped at its row ceiling (200 or more carts) or its
|
|
96
|
+
* time budget, or the strong re-read contradicted the index's pick. Nothing
|
|
97
|
+
* was written. A ceiling stop repeats until carts are reaped; the others
|
|
98
|
+
* clear on retry.
|
|
99
|
+
*/
|
|
100
|
+
export declare const BASKET_RESUME_ERROR_CODES: readonly ["CART_RESUME_UNAVAILABLE", "CART_RESUME_INCOMPLETE"];
|
|
101
|
+
export type BasketResumeErrorCode = (typeof BASKET_RESUME_ERROR_CODES)[number];
|
|
79
102
|
export {};
|
package/dist/basket.js
CHANGED
|
@@ -46,3 +46,25 @@ export const BASKET_ERROR_CODES = [
|
|
|
46
46
|
'PROMOTION_EXPIRED',
|
|
47
47
|
'PROMOTION_NOT_CART_APPLICABLE',
|
|
48
48
|
];
|
|
49
|
+
/**
|
|
50
|
+
* The refusals the storefront's POST /basket { mode: 'resume', token } handler
|
|
51
|
+
* itself answers (an abandoned-cart recovery link). Middleware refusals
|
|
52
|
+
* (GATING_ERROR_CODES, STOREFRONT_UNAVAILABLE, validation) are separate, and so
|
|
53
|
+
* are the cart resolver's BasketErrorCode refusals, which the fold or
|
|
54
|
+
* reinstatement write forwards unchanged once ownership is proven (for example
|
|
55
|
+
* 409 BASKET_VERSION_CONFLICT, or 404 CART_NOT_FOUND carrying data.cartId when
|
|
56
|
+
* the fold target was deleted mid-request).
|
|
57
|
+
*
|
|
58
|
+
* - CART_RESUME_UNAVAILABLE (404): every reason the link cannot be honoured —
|
|
59
|
+
* invalid or expired token, another store, a cart that is gone, converted,
|
|
60
|
+
* owned by someone else, held by a till, or already folded into a cart that
|
|
61
|
+
* has since gone — with one identical body, so a
|
|
62
|
+
* forwarded email is never an existence oracle. Render one neutral message.
|
|
63
|
+
* - CART_RESUME_INCOMPLETE (503): the caller owns the cart, but whether a live
|
|
64
|
+
* cart should receive the recovered lines could not be proven — the read of
|
|
65
|
+
* the caller's carts stopped at its row ceiling (200 or more carts) or its
|
|
66
|
+
* time budget, or the strong re-read contradicted the index's pick. Nothing
|
|
67
|
+
* was written. A ceiling stop repeats until carts are reaped; the others
|
|
68
|
+
* clear on retry.
|
|
69
|
+
*/
|
|
70
|
+
export const BASKET_RESUME_ERROR_CODES = ['CART_RESUME_UNAVAILABLE', 'CART_RESUME_INCOMPLETE'];
|
package/dist/cart.d.ts
CHANGED
|
@@ -56,15 +56,17 @@ declare global {
|
|
|
56
56
|
parkedBy?: string;
|
|
57
57
|
/**
|
|
58
58
|
* Epoch ms this ABANDONED cart's lines were folded into another cart by
|
|
59
|
-
* `POST /basket` `{ mode: 'resume' }`. Set once
|
|
59
|
+
* `POST /basket` `{ mode: 'resume' }`. Set once; cleared again only when the
|
|
60
|
+
* fold it was claimed for was REFUSED before writing anything (so the link
|
|
61
|
+
* can fold the lines on retry).
|
|
60
62
|
*
|
|
61
63
|
* ⚠️ **It is a CONSUMPTION marker, not a timestamp anyone should render.**
|
|
62
64
|
* The fold uses `merge`, which SUMS, and the abandoned row survives with
|
|
63
65
|
* its lines for as long as the recovery link does — so without a marker a
|
|
64
66
|
* refresh, a back-navigation or a component that mounts twice would re-add
|
|
65
67
|
* every quantity, for days. The resume write sets this under
|
|
66
|
-
* `attribute_not_exists(resumedAt)`, so exactly one caller
|
|
67
|
-
* every replay answers the cart the shopper already has.
|
|
68
|
+
* `attribute_not_exists(resumedAt)`, so exactly one caller wins each claim
|
|
69
|
+
* and every replay answers the cart the shopper already has.
|
|
68
70
|
*
|
|
69
71
|
* ⚠️ Absent on the OTHER resume path — a shopper with no second cart has
|
|
70
72
|
* their own cart reinstated in place, which adds nothing and needs no
|
|
@@ -806,12 +808,23 @@ declare global {
|
|
|
806
808
|
* an email, is HMAC-signed, expires, and carries `{ storeId, cartId }` and
|
|
807
809
|
* nothing about a person.
|
|
808
810
|
*
|
|
809
|
-
* ⚠️ **Every refusal is the SAME
|
|
810
|
-
*
|
|
811
|
-
*
|
|
812
|
-
*
|
|
813
|
-
*
|
|
814
|
-
*
|
|
811
|
+
* ⚠️ **Every refusal about the LINK is the SAME 404 and the same bare code**
|
|
812
|
+
* (`CART_RESUME_UNAVAILABLE`) — an invalid or expired token, a cart that no
|
|
813
|
+
* longer exists, a cart already converted to an order or already folded into
|
|
814
|
+
* a cart since gone, and a cart belonging to a DIFFERENT customer are
|
|
815
|
+
* indistinguishable on the wire, deliberately. A recovery email gets
|
|
816
|
+
* forwarded; the response must never tell the reader whether the cart is
|
|
817
|
+
* real. A consumer must therefore render exactly one neutral message for it
|
|
818
|
+
* and must not try to explain the failure.
|
|
819
|
+
*
|
|
820
|
+
* Only AFTER ownership is proven can two other kinds of refusal appear, and a
|
|
821
|
+
* consumer may treat them as retryable: `503 CART_RESUME_INCOMPLETE` (the
|
|
822
|
+
* caller's other carts could not all be read, so no fold-or-reinstate choice
|
|
823
|
+
* was made and nothing was written) and the cart resolver's own
|
|
824
|
+
* {@link BasketErrorCode} refusals, forwarded unchanged from the fold or
|
|
825
|
+
* reinstatement write (e.g. `409 BASKET_VERSION_CONFLICT`, `404
|
|
826
|
+
* CART_NOT_FOUND` for a target deleted mid-request). See
|
|
827
|
+
* `BASKET_RESUME_ERROR_CODES`.
|
|
815
828
|
*
|
|
816
829
|
* ⚠️ On success it answers the ordinary {@link CartActionResponse}. If the
|
|
817
830
|
* caller already holds another cart with lines, the recovered lines are FOLDED
|
package/dist/cash.d.ts
CHANGED
|
@@ -468,7 +468,11 @@ declare global {
|
|
|
468
468
|
}
|
|
469
469
|
/**
|
|
470
470
|
* Refusals from the cash-shift surface — `stacks/lambdas/shifts/*.ts`
|
|
471
|
-
* (`_get`, `_post`, `_patchClose`, `_postMovement`, `_patchReconcile`)
|
|
471
|
+
* (`_get`, `_post`, `_patchClose`, `_postMovement`, `_patchReconcile`) — plus
|
|
472
|
+
* the shared drawer write's own `CASH_DRAWER_BUSY`, which `POST /cash`,
|
|
473
|
+
* `POST`/`DELETE /account` and a cash return answer. A tender or seña does
|
|
474
|
+
* not: a tender's drawer collision is `SHIFT_NOT_OPEN` or `422 CURRENCY_MISMATCH`,
|
|
475
|
+
* a seña's `SHIFT_NOT_OPEN` or `409 DEPOSIT_CURRENCY_MISMATCH`.
|
|
472
476
|
*
|
|
473
477
|
* - `INVALID_SHIFT_ID` · 400 · `SHIFT_NOT_FOUND` · 404
|
|
474
478
|
* - `SHIFT_ALREADY_OPEN` · 409 — one open shift per cashier.
|
|
@@ -489,15 +493,24 @@ declare global {
|
|
|
489
493
|
* - `SHIFT_EVENTS_TRUNCATED` · 503 — the event log could not be read in full, so
|
|
490
494
|
* the totals behind a close or a reconcile would be computed from a partial
|
|
491
495
|
* ledger.
|
|
496
|
+
* - `CASH_DRAWER_BUSY` · 409 — emitted by the shared drawer write
|
|
497
|
+
* (`drawerWriteRefusal`, `stacks/services/shifts.ts`), not by a `/shifts`
|
|
498
|
+
* route: `POST /account` and `POST /cash` answer it when their transaction is
|
|
499
|
+
* cancelled by a pure conflict on any item it writes (most often the drawer
|
|
500
|
+
* row), as do `DELETE /account` and `POST /orders { mode: 'return' }` on a
|
|
501
|
+
* cash leg. Nothing was written; retry the same request.
|
|
492
502
|
* - `SELF_APPROVAL_FORBIDDEN` · 403 — segregation of duties: the cashier who
|
|
493
503
|
* closed a shift cannot reconcile it.
|
|
494
504
|
* - `INVALID_DENOMINATION` · 400 · `INVALID_CURSOR` · 400
|
|
505
|
+
* - `WAREHOUSE_NOT_FOUND` · 404 — `GET /shifts?warehouseId=` naming a depósito
|
|
506
|
+
* the store does not have (`resolveReportWarehouseFilter`).
|
|
495
507
|
* - `ROLE_FORBIDDEN` · 403 · `VALIDATION_FAILED` · 400
|
|
496
508
|
*
|
|
497
509
|
* ⚠️ Cross-cutting refusals are NOT repeated here — check `GATING_ERROR_CODES`
|
|
498
|
-
* as well
|
|
510
|
+
* as well, and `TERMINAL_ELEVATION_ERROR_CODES` for a money-out movement's PIN
|
|
511
|
+
* elevation.
|
|
499
512
|
*/
|
|
500
|
-
export declare const SHIFT_ERROR_CODES: readonly ["INVALID_SHIFT_ID", "SHIFT_NOT_FOUND", "SHIFT_ALREADY_OPEN", "SHIFT_NOT_OPEN", "SHIFT_NOT_CLOSED", "SHIFT_OWNER_MISMATCH", "CURRENCY_MISMATCH", "BUCKET_COUNTS_INVALID", "BUCKET_REVIEW_INVALID", "BUCKET_COUNT_MISSING", "SHIFT_CHANGED", "SHIFT_EVENTS_TRUNCATED", "SELF_APPROVAL_FORBIDDEN", "INVALID_DENOMINATION", "INVALID_CURSOR", "ROLE_FORBIDDEN", "VALIDATION_FAILED"];
|
|
513
|
+
export declare const SHIFT_ERROR_CODES: readonly ["INVALID_SHIFT_ID", "SHIFT_NOT_FOUND", "SHIFT_ALREADY_OPEN", "SHIFT_NOT_OPEN", "SHIFT_NOT_CLOSED", "SHIFT_OWNER_MISMATCH", "CURRENCY_MISMATCH", "BUCKET_COUNTS_INVALID", "BUCKET_REVIEW_INVALID", "BUCKET_COUNT_MISSING", "SHIFT_CHANGED", "SHIFT_EVENTS_TRUNCATED", "CASH_DRAWER_BUSY", "SELF_APPROVAL_FORBIDDEN", "INVALID_DENOMINATION", "INVALID_CURSOR", "WAREHOUSE_NOT_FOUND", "ROLE_FORBIDDEN", "VALIDATION_FAILED"];
|
|
501
514
|
export type ShiftErrorCode = (typeof SHIFT_ERROR_CODES)[number];
|
|
502
515
|
/**
|
|
503
516
|
* Where a {@link ShiftMethodTotal}'s `label` came from.
|
package/dist/cash.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Refusals from the cash-shift surface — `stacks/lambdas/shifts/*.ts`
|
|
3
|
-
* (`_get`, `_post`, `_patchClose`, `_postMovement`, `_patchReconcile`)
|
|
3
|
+
* (`_get`, `_post`, `_patchClose`, `_postMovement`, `_patchReconcile`) — plus
|
|
4
|
+
* the shared drawer write's own `CASH_DRAWER_BUSY`, which `POST /cash`,
|
|
5
|
+
* `POST`/`DELETE /account` and a cash return answer. A tender or seña does
|
|
6
|
+
* not: a tender's drawer collision is `SHIFT_NOT_OPEN` or `422 CURRENCY_MISMATCH`,
|
|
7
|
+
* a seña's `SHIFT_NOT_OPEN` or `409 DEPOSIT_CURRENCY_MISMATCH`.
|
|
4
8
|
*
|
|
5
9
|
* - `INVALID_SHIFT_ID` · 400 · `SHIFT_NOT_FOUND` · 404
|
|
6
10
|
* - `SHIFT_ALREADY_OPEN` · 409 — one open shift per cashier.
|
|
@@ -21,13 +25,22 @@
|
|
|
21
25
|
* - `SHIFT_EVENTS_TRUNCATED` · 503 — the event log could not be read in full, so
|
|
22
26
|
* the totals behind a close or a reconcile would be computed from a partial
|
|
23
27
|
* ledger.
|
|
28
|
+
* - `CASH_DRAWER_BUSY` · 409 — emitted by the shared drawer write
|
|
29
|
+
* (`drawerWriteRefusal`, `stacks/services/shifts.ts`), not by a `/shifts`
|
|
30
|
+
* route: `POST /account` and `POST /cash` answer it when their transaction is
|
|
31
|
+
* cancelled by a pure conflict on any item it writes (most often the drawer
|
|
32
|
+
* row), as do `DELETE /account` and `POST /orders { mode: 'return' }` on a
|
|
33
|
+
* cash leg. Nothing was written; retry the same request.
|
|
24
34
|
* - `SELF_APPROVAL_FORBIDDEN` · 403 — segregation of duties: the cashier who
|
|
25
35
|
* closed a shift cannot reconcile it.
|
|
26
36
|
* - `INVALID_DENOMINATION` · 400 · `INVALID_CURSOR` · 400
|
|
37
|
+
* - `WAREHOUSE_NOT_FOUND` · 404 — `GET /shifts?warehouseId=` naming a depósito
|
|
38
|
+
* the store does not have (`resolveReportWarehouseFilter`).
|
|
27
39
|
* - `ROLE_FORBIDDEN` · 403 · `VALIDATION_FAILED` · 400
|
|
28
40
|
*
|
|
29
41
|
* ⚠️ Cross-cutting refusals are NOT repeated here — check `GATING_ERROR_CODES`
|
|
30
|
-
* as well
|
|
42
|
+
* as well, and `TERMINAL_ELEVATION_ERROR_CODES` for a money-out movement's PIN
|
|
43
|
+
* elevation.
|
|
31
44
|
*/
|
|
32
45
|
export const SHIFT_ERROR_CODES = [
|
|
33
46
|
'INVALID_SHIFT_ID',
|
|
@@ -42,9 +55,11 @@ export const SHIFT_ERROR_CODES = [
|
|
|
42
55
|
'BUCKET_COUNT_MISSING',
|
|
43
56
|
'SHIFT_CHANGED',
|
|
44
57
|
'SHIFT_EVENTS_TRUNCATED',
|
|
58
|
+
'CASH_DRAWER_BUSY',
|
|
45
59
|
'SELF_APPROVAL_FORBIDDEN',
|
|
46
60
|
'INVALID_DENOMINATION',
|
|
47
61
|
'INVALID_CURSOR',
|
|
62
|
+
'WAREHOUSE_NOT_FOUND',
|
|
48
63
|
'ROLE_FORBIDDEN',
|
|
49
64
|
'VALIDATION_FAILED',
|
|
50
65
|
];
|
package/dist/cjs/basket.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BASKET_ERROR_CODES = void 0;
|
|
3
|
+
exports.BASKET_RESUME_ERROR_CODES = exports.BASKET_ERROR_CODES = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Domain refusals from POST /baskets (replacement, named actions and park/resume)
|
|
6
6
|
* and GET /baskets?mode=review. Check GATING_ERROR_CODES separately for middleware
|
|
@@ -49,3 +49,25 @@ exports.BASKET_ERROR_CODES = [
|
|
|
49
49
|
'PROMOTION_EXPIRED',
|
|
50
50
|
'PROMOTION_NOT_CART_APPLICABLE',
|
|
51
51
|
];
|
|
52
|
+
/**
|
|
53
|
+
* The refusals the storefront's POST /basket { mode: 'resume', token } handler
|
|
54
|
+
* itself answers (an abandoned-cart recovery link). Middleware refusals
|
|
55
|
+
* (GATING_ERROR_CODES, STOREFRONT_UNAVAILABLE, validation) are separate, and so
|
|
56
|
+
* are the cart resolver's BasketErrorCode refusals, which the fold or
|
|
57
|
+
* reinstatement write forwards unchanged once ownership is proven (for example
|
|
58
|
+
* 409 BASKET_VERSION_CONFLICT, or 404 CART_NOT_FOUND carrying data.cartId when
|
|
59
|
+
* the fold target was deleted mid-request).
|
|
60
|
+
*
|
|
61
|
+
* - CART_RESUME_UNAVAILABLE (404): every reason the link cannot be honoured —
|
|
62
|
+
* invalid or expired token, another store, a cart that is gone, converted,
|
|
63
|
+
* owned by someone else, held by a till, or already folded into a cart that
|
|
64
|
+
* has since gone — with one identical body, so a
|
|
65
|
+
* forwarded email is never an existence oracle. Render one neutral message.
|
|
66
|
+
* - CART_RESUME_INCOMPLETE (503): the caller owns the cart, but whether a live
|
|
67
|
+
* cart should receive the recovered lines could not be proven — the read of
|
|
68
|
+
* the caller's carts stopped at its row ceiling (200 or more carts) or its
|
|
69
|
+
* time budget, or the strong re-read contradicted the index's pick. Nothing
|
|
70
|
+
* was written. A ceiling stop repeats until carts are reaped; the others
|
|
71
|
+
* clear on retry.
|
|
72
|
+
*/
|
|
73
|
+
exports.BASKET_RESUME_ERROR_CODES = ['CART_RESUME_UNAVAILABLE', 'CART_RESUME_INCOMPLETE'];
|
package/dist/cjs/cash.js
CHANGED
|
@@ -3,7 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.METHOD_LABEL_SOURCES = exports.SHIFT_ERROR_CODES = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Refusals from the cash-shift surface — `stacks/lambdas/shifts/*.ts`
|
|
6
|
-
* (`_get`, `_post`, `_patchClose`, `_postMovement`, `_patchReconcile`)
|
|
6
|
+
* (`_get`, `_post`, `_patchClose`, `_postMovement`, `_patchReconcile`) — plus
|
|
7
|
+
* the shared drawer write's own `CASH_DRAWER_BUSY`, which `POST /cash`,
|
|
8
|
+
* `POST`/`DELETE /account` and a cash return answer. A tender or seña does
|
|
9
|
+
* not: a tender's drawer collision is `SHIFT_NOT_OPEN` or `422 CURRENCY_MISMATCH`,
|
|
10
|
+
* a seña's `SHIFT_NOT_OPEN` or `409 DEPOSIT_CURRENCY_MISMATCH`.
|
|
7
11
|
*
|
|
8
12
|
* - `INVALID_SHIFT_ID` · 400 · `SHIFT_NOT_FOUND` · 404
|
|
9
13
|
* - `SHIFT_ALREADY_OPEN` · 409 — one open shift per cashier.
|
|
@@ -24,13 +28,22 @@ exports.METHOD_LABEL_SOURCES = exports.SHIFT_ERROR_CODES = void 0;
|
|
|
24
28
|
* - `SHIFT_EVENTS_TRUNCATED` · 503 — the event log could not be read in full, so
|
|
25
29
|
* the totals behind a close or a reconcile would be computed from a partial
|
|
26
30
|
* ledger.
|
|
31
|
+
* - `CASH_DRAWER_BUSY` · 409 — emitted by the shared drawer write
|
|
32
|
+
* (`drawerWriteRefusal`, `stacks/services/shifts.ts`), not by a `/shifts`
|
|
33
|
+
* route: `POST /account` and `POST /cash` answer it when their transaction is
|
|
34
|
+
* cancelled by a pure conflict on any item it writes (most often the drawer
|
|
35
|
+
* row), as do `DELETE /account` and `POST /orders { mode: 'return' }` on a
|
|
36
|
+
* cash leg. Nothing was written; retry the same request.
|
|
27
37
|
* - `SELF_APPROVAL_FORBIDDEN` · 403 — segregation of duties: the cashier who
|
|
28
38
|
* closed a shift cannot reconcile it.
|
|
29
39
|
* - `INVALID_DENOMINATION` · 400 · `INVALID_CURSOR` · 400
|
|
40
|
+
* - `WAREHOUSE_NOT_FOUND` · 404 — `GET /shifts?warehouseId=` naming a depósito
|
|
41
|
+
* the store does not have (`resolveReportWarehouseFilter`).
|
|
30
42
|
* - `ROLE_FORBIDDEN` · 403 · `VALIDATION_FAILED` · 400
|
|
31
43
|
*
|
|
32
44
|
* ⚠️ Cross-cutting refusals are NOT repeated here — check `GATING_ERROR_CODES`
|
|
33
|
-
* as well
|
|
45
|
+
* as well, and `TERMINAL_ELEVATION_ERROR_CODES` for a money-out movement's PIN
|
|
46
|
+
* elevation.
|
|
34
47
|
*/
|
|
35
48
|
exports.SHIFT_ERROR_CODES = [
|
|
36
49
|
'INVALID_SHIFT_ID',
|
|
@@ -45,9 +58,11 @@ exports.SHIFT_ERROR_CODES = [
|
|
|
45
58
|
'BUCKET_COUNT_MISSING',
|
|
46
59
|
'SHIFT_CHANGED',
|
|
47
60
|
'SHIFT_EVENTS_TRUNCATED',
|
|
61
|
+
'CASH_DRAWER_BUSY',
|
|
48
62
|
'SELF_APPROVAL_FORBIDDEN',
|
|
49
63
|
'INVALID_DENOMINATION',
|
|
50
64
|
'INVALID_CURSOR',
|
|
65
|
+
'WAREHOUSE_NOT_FOUND',
|
|
51
66
|
'ROLE_FORBIDDEN',
|
|
52
67
|
'VALIDATION_FAILED',
|
|
53
68
|
];
|
package/dist/order.d.ts
CHANGED
|
@@ -1867,6 +1867,39 @@ declare global {
|
|
|
1867
1867
|
*/
|
|
1868
1868
|
cancellation?: OrderCancellability;
|
|
1869
1869
|
}
|
|
1870
|
+
/**
|
|
1871
|
+
* `POST /orders { mode: 'tender' }` — ring one or more tender legs against an
|
|
1872
|
+
* EXISTING order (the append counterpart of the create leg's
|
|
1873
|
+
* {@link CreateOrderRequest.tenders}). Any operator but PRINTER or ACCOUNTANT
|
|
1874
|
+
* (`403 ROLE_FORBIDDEN`).
|
|
1875
|
+
*
|
|
1876
|
+
* `shiftId` attributes the legs to a drawer. An EXPLICIT value must be the
|
|
1877
|
+
* caller's own OPEN shift — anything else is `409 SHIFT_NOT_AVAILABLE`, never
|
|
1878
|
+
* a silent drop. OMITTED resolves the caller's own open drawer; with none, a
|
|
1879
|
+
* cash leg lands on the store's default drawer. At commit the drawer is
|
|
1880
|
+
* re-asserted: one that closed mid-request is `409 SHIFT_NOT_OPEN`, one that
|
|
1881
|
+
* did not declare the order's currency `422 CURRENCY_MISMATCH`.
|
|
1882
|
+
*
|
|
1883
|
+
* The opt-in `Idempotency-Key` and the lost-reply recovery through
|
|
1884
|
+
* `mode: 'collection-attempt'` follow the money-write rule documented on
|
|
1885
|
+
* {@link ORDER_ERROR_CODES} (and {@link OrderCollectionAttemptLookupRequest});
|
|
1886
|
+
* it is not restated here. Every refusal specific to this mode is in that
|
|
1887
|
+
* tuple; a body the schema rejects is `400 VALIDATION_FAILED`, and the
|
|
1888
|
+
* cross-cutting refusals (`ROLE_FORBIDDEN`, `IMPERSONATION_READONLY`, …) are
|
|
1889
|
+
* in `GATING_ERROR_CODES`.
|
|
1890
|
+
*
|
|
1891
|
+
* Tied to its validator (`tenderModeSchema`, `stacks/lambdas/orders/_tender.ts`)
|
|
1892
|
+
* by `AssertOrderTenderRequestMatchesSchema` — `mode` is the router's key.
|
|
1893
|
+
*/
|
|
1894
|
+
interface OrderTenderRequest {
|
|
1895
|
+
mode: 'tender';
|
|
1896
|
+
/** `ORD` followed by 6–10 digits. */
|
|
1897
|
+
orderId: string;
|
|
1898
|
+
/** RAW legs — see {@link TenderLegInput}. */
|
|
1899
|
+
tenders: TenderLegInput[];
|
|
1900
|
+
/** 1–100 chars; the caller's own OPEN shift. Omit to use the caller's open drawer. */
|
|
1901
|
+
shiftId?: string;
|
|
1902
|
+
}
|
|
1870
1903
|
/**
|
|
1871
1904
|
* `POST /orders { mode: 'deposit' }` — record a SEÑA (a sales deposit) on an
|
|
1872
1905
|
* existing, undelivered order, as one {@link OrderTender} leg carrying
|
|
@@ -1925,7 +1958,7 @@ declare global {
|
|
|
1925
1958
|
change?: number;
|
|
1926
1959
|
/** Required, never defaulted. `true` needs an authorized factura on the order first. */
|
|
1927
1960
|
freezesPrice: boolean;
|
|
1928
|
-
/** Same semantics as
|
|
1961
|
+
/** Same semantics as {@link OrderTenderRequest.shiftId}. */
|
|
1929
1962
|
shiftId?: string;
|
|
1930
1963
|
}
|
|
1931
1964
|
/**
|