@sixtyninecommerce/admin 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5772 -118
- package/dist/auth/index.d.ts +7 -1
- package/dist/auth/index.js +8 -1
- package/dist/catalog/assets.d.ts +120 -8
- package/dist/catalog/assets.js +98 -12
- package/dist/catalog/collections.d.ts +279 -14
- package/dist/catalog/collections.js +246 -15
- package/dist/catalog/documents.d.ts +142 -0
- package/dist/catalog/documents.js +114 -0
- package/dist/catalog/index.d.ts +54 -6
- package/dist/catalog/index.js +10 -1
- package/dist/catalog/metadata.d.ts +244 -0
- package/dist/catalog/metadata.js +220 -0
- package/dist/catalog/products.d.ts +159 -19
- package/dist/catalog/products.js +88 -13
- package/dist/catalog/properties.d.ts +140 -14
- package/dist/catalog/properties.js +65 -1
- package/dist/catalog/recommendations.d.ts +288 -0
- package/dist/catalog/recommendations.js +237 -0
- package/dist/catalog/reviews.d.ts +381 -0
- package/dist/catalog/reviews.js +325 -0
- package/dist/catalog/types.d.ts +17 -1
- package/dist/catalog/types.js +10 -0
- package/dist/catalog/variant-find.d.ts +136 -0
- package/dist/catalog/variant-find.js +239 -0
- package/dist/catalog/variants.d.ts +293 -26
- package/dist/catalog/variants.js +164 -7
- package/dist/catalog/visibility.d.ts +38 -7
- package/dist/catalog/visibility.js +19 -1
- package/dist/client.d.ts +121 -9
- package/dist/client.js +53 -14
- package/dist/content/assets.d.ts +285 -0
- package/dist/content/assets.js +181 -0
- package/dist/content/forms.d.ts +332 -1
- package/dist/content/forms.js +140 -4
- package/dist/content/items.d.ts +292 -0
- package/dist/content/items.js +170 -0
- package/dist/content/menus.d.ts +254 -0
- package/dist/content/menus.js +70 -0
- package/dist/content/strings.d.ts +137 -0
- package/dist/content/strings.js +82 -0
- package/dist/content/types.d.ts +282 -0
- package/dist/content/types.js +100 -0
- package/dist/customers/age-verification.d.ts +66 -0
- package/dist/customers/age-verification.js +79 -0
- package/dist/customers/credit.d.ts +263 -0
- package/dist/customers/credit.js +244 -0
- package/dist/customers/delivery-preferences.d.ts +120 -0
- package/dist/customers/delivery-preferences.js +97 -0
- package/dist/customers/delivery-terms.d.ts +44 -0
- package/dist/customers/delivery-terms.js +32 -0
- package/dist/customers/groups.d.ts +207 -0
- package/dist/customers/groups.js +438 -0
- package/dist/customers/index.d.ts +462 -37
- package/dist/customers/index.js +317 -40
- package/dist/customers/invitation-status.d.ts +57 -0
- package/dist/customers/invitation-status.js +21 -0
- package/dist/customers/notes.d.ts +67 -0
- package/dist/customers/notes.js +51 -0
- package/dist/customers/notification-recipients.d.ts +97 -0
- package/dist/customers/notification-recipients.js +84 -0
- package/dist/customers/saved-lists.d.ts +42 -0
- package/dist/customers/saved-lists.js +61 -0
- package/dist/customers/vat.d.ts +83 -0
- package/dist/customers/vat.js +46 -0
- package/dist/customers/wire.d.ts +20 -0
- package/dist/customers/wire.js +35 -0
- package/dist/documents/ar.d.ts +307 -0
- package/dist/documents/ar.js +254 -0
- package/dist/documents/emails.d.ts +150 -0
- package/dist/documents/emails.js +220 -0
- package/dist/documents/index.d.ts +744 -21
- package/dist/documents/index.js +438 -24
- package/dist/documents/pdf.d.ts +2 -0
- package/dist/documents/pdf.js +11 -0
- package/dist/fulfillments/create.d.ts +167 -0
- package/dist/fulfillments/create.js +216 -0
- package/dist/fulfillments/index.d.ts +163 -11
- package/dist/fulfillments/index.js +135 -6
- package/dist/fulfillments/payment-policy.d.ts +64 -0
- package/dist/fulfillments/payment-policy.js +140 -0
- package/dist/fulfillments/warehouse.d.ts +724 -0
- package/dist/fulfillments/warehouse.js +914 -0
- package/dist/geo/index.d.ts +119 -0
- package/dist/geo/index.js +107 -0
- package/dist/index.d.ts +147 -39
- package/dist/index.js +51 -12
- package/dist/integrations/afas-actions.d.ts +234 -0
- package/dist/integrations/afas-actions.js +310 -0
- package/dist/integrations/afas-types.d.ts +483 -0
- package/dist/integrations/afas-types.js +5 -0
- package/dist/integrations/afas.d.ts +234 -0
- package/dist/integrations/afas.js +290 -0
- package/dist/integrations/connections.d.ts +103 -0
- package/dist/integrations/connections.js +55 -0
- package/dist/integrations/esp.d.ts +313 -0
- package/dist/integrations/esp.js +169 -0
- package/dist/integrations/exact-online-types.d.ts +965 -0
- package/dist/integrations/exact-online-types.js +6 -0
- package/dist/integrations/exact-online.d.ts +784 -0
- package/dist/integrations/exact-online.js +1089 -0
- package/dist/integrations/index.d.ts +44 -3
- package/dist/integrations/index.js +23 -3
- package/dist/integrations/pipeline-discoveries.d.ts +65 -0
- package/dist/integrations/pipeline-discoveries.js +65 -0
- package/dist/integrations/pipeline-keys.d.ts +13 -0
- package/dist/integrations/pipeline-keys.js +22 -0
- package/dist/integrations/pipeline-runs.d.ts +119 -0
- package/dist/integrations/pipeline-runs.js +87 -0
- package/dist/integrations/pipelines.d.ts +87 -15
- package/dist/integrations/pipelines.js +41 -22
- package/dist/integrations/price-import.d.ts +223 -0
- package/dist/integrations/price-import.js +124 -0
- package/dist/integrations/types.d.ts +367 -3
- package/dist/integrations/types.js +4 -3
- package/dist/locations/index.d.ts +66 -0
- package/dist/locations/index.js +31 -0
- package/dist/meta/index.d.ts +172 -0
- package/dist/metafields/index.d.ts +8 -1
- package/dist/metafields/index.js +10 -0
- package/dist/orders/cancel-with-money.d.ts +237 -0
- package/dist/orders/cancel-with-money.js +155 -0
- package/dist/orders/commit-edit.d.ts +23 -1
- package/dist/orders/commit-edit.js +19 -2
- package/dist/orders/deposit-policy.d.ts +3 -1
- package/dist/orders/drafts.d.ts +800 -0
- package/dist/orders/drafts.js +771 -0
- package/dist/orders/fields.d.ts +245 -0
- package/dist/orders/fields.js +188 -0
- package/dist/orders/get.d.ts +29 -19
- package/dist/orders/get.js +17 -8
- package/dist/orders/index.d.ts +66 -15
- package/dist/orders/index.js +25 -2
- package/dist/orders/lifecycle.d.ts +128 -0
- package/dist/orders/lifecycle.js +158 -0
- package/dist/orders/line-price-preview.d.ts +7 -2
- package/dist/orders/list.d.ts +243 -0
- package/dist/orders/list.js +487 -0
- package/dist/orders/manual-discounts.d.ts +13 -5
- package/dist/orders/manual-pricing.d.ts +5 -0
- package/dist/orders/money-view.d.ts +149 -0
- package/dist/orders/money-view.js +99 -0
- package/dist/orders/order-entry.d.ts +20 -7
- package/dist/orders/plan-edit.d.ts +34 -2
- package/dist/orders/plan-edit.js +112 -11
- package/dist/orders/settings.d.ts +201 -0
- package/dist/orders/settings.js +325 -0
- package/dist/orders/status.d.ts +159 -13
- package/dist/orders/status.js +21 -0
- package/dist/orders/surcharges.d.ts +20 -1
- package/dist/orders/surcharges.js +37 -11
- package/dist/payments/account-credit.d.ts +46 -0
- package/dist/payments/account-credit.js +42 -0
- package/dist/payments/ar.d.ts +292 -0
- package/dist/payments/ar.js +223 -0
- package/dist/payments/connected-account.d.ts +47 -0
- package/dist/payments/connected-account.js +61 -0
- package/dist/payments/credit-noted-fields.d.ts +19 -0
- package/dist/payments/credit-noted-fields.js +69 -0
- package/dist/payments/customer-consent.d.ts +30 -0
- package/dist/payments/customer-consent.js +49 -0
- package/dist/payments/index.d.ts +340 -19
- package/dist/payments/index.js +151 -1
- package/dist/payments/methods.d.ts +303 -8
- package/dist/payments/methods.js +337 -7
- package/dist/payments/mollie-methods.d.ts +159 -0
- package/dist/payments/mollie-methods.js +141 -0
- package/dist/payments/payment-links.d.ts +180 -0
- package/dist/payments/payment-links.js +97 -0
- package/dist/payments/provider-keys.d.ts +150 -0
- package/dist/payments/provider-keys.js +118 -0
- package/dist/payments/providers.d.ts +86 -11
- package/dist/payments/providers.js +29 -0
- package/dist/payments/requests.d.ts +147 -0
- package/dist/payments/requests.js +93 -0
- package/dist/payments/store-credit-fields.d.ts +15 -0
- package/dist/payments/store-credit-fields.js +51 -0
- package/dist/pickups/index.d.ts +106 -0
- package/dist/pickups/index.js +108 -0
- package/dist/platform/channels.d.ts +132 -0
- package/dist/platform/channels.js +128 -0
- package/dist/platform/email-gateways.d.ts +165 -0
- package/dist/platform/email-gateways.js +78 -0
- package/dist/platform/geo.d.ts +123 -0
- package/dist/platform/geo.js +144 -0
- package/dist/platform/tax.d.ts +162 -0
- package/dist/platform/tax.js +169 -0
- package/dist/pos/anomalies.d.ts +158 -0
- package/dist/pos/anomalies.js +64 -0
- package/dist/pos/assisted-selling.d.ts +79 -0
- package/dist/pos/assisted-selling.js +38 -0
- package/dist/pos/exchanges.d.ts +108 -0
- package/dist/pos/exchanges.js +22 -0
- package/dist/pos/gift-cards.d.ts +135 -0
- package/dist/pos/gift-cards.js +47 -0
- package/dist/pos/index.d.ts +2370 -58
- package/dist/pos/index.js +854 -7
- package/dist/pos/no-receipt.d.ts +94 -0
- package/dist/pos/no-receipt.js +25 -0
- package/dist/pos/offline-sales.d.ts +228 -0
- package/dist/pos/offline-sales.js +170 -0
- package/dist/pos/pay-by-link.d.ts +143 -0
- package/dist/pos/pay-by-link.js +57 -0
- package/dist/pos/quick-keys.d.ts +103 -0
- package/dist/pos/quick-keys.js +45 -0
- package/dist/pos/reports.d.ts +360 -0
- package/dist/pos/reports.js +62 -0
- package/dist/pos/returns.d.ts +244 -0
- package/dist/pos/returns.js +83 -0
- package/dist/pricing/bulk-coupons.d.ts +139 -0
- package/dist/pricing/bulk-coupons.js +112 -0
- package/dist/pricing/index.d.ts +174 -4
- package/dist/pricing/index.js +174 -1
- package/dist/pricing/price-lists.d.ts +606 -0
- package/dist/pricing/price-lists.js +600 -0
- package/dist/purchasing/alerts.d.ts +104 -0
- package/dist/purchasing/alerts.js +88 -0
- package/dist/purchasing/backorders.d.ts +61 -0
- package/dist/purchasing/backorders.js +92 -0
- package/dist/purchasing/cost.d.ts +110 -0
- package/dist/purchasing/cost.js +86 -0
- package/dist/purchasing/index.d.ts +54 -0
- package/dist/purchasing/index.js +24 -0
- package/dist/purchasing/links.d.ts +263 -0
- package/dist/purchasing/links.js +192 -0
- package/dist/purchasing/purchase-orders.d.ts +551 -0
- package/dist/purchasing/purchase-orders.js +491 -0
- package/dist/purchasing/receipts.d.ts +396 -0
- package/dist/purchasing/receipts.js +287 -0
- package/dist/purchasing/replenishment.d.ts +281 -0
- package/dist/purchasing/replenishment.js +240 -0
- package/dist/purchasing/returns.d.ts +273 -0
- package/dist/purchasing/returns.js +229 -0
- package/dist/purchasing/settings.d.ts +152 -0
- package/dist/purchasing/settings.js +181 -0
- package/dist/purchasing/suppliers.d.ts +476 -0
- package/dist/purchasing/suppliers.js +438 -0
- package/dist/quotes/index.d.ts +518 -0
- package/dist/quotes/index.js +439 -0
- package/dist/reports/index.d.ts +71 -8
- package/dist/reports/index.js +74 -11
- package/dist/returns/index.d.ts +675 -21
- package/dist/returns/index.js +756 -11
- package/dist/search/index.d.ts +76 -1
- package/dist/search/index.js +63 -0
- package/dist/seo/config.d.ts +128 -0
- package/dist/seo/config.js +95 -0
- package/dist/seo/redirects.d.ts +125 -0
- package/dist/seo/redirects.js +60 -1
- package/dist/seo/settings.d.ts +147 -0
- package/dist/seo/settings.js +209 -0
- package/dist/shipping/definitions.d.ts +29 -0
- package/dist/shipping/definitions.js +47 -0
- package/dist/shipping/fulfillment-profiles.d.ts +174 -0
- package/dist/shipping/fulfillment-profiles.js +104 -0
- package/dist/shipping/hendriks.d.ts +97 -0
- package/dist/shipping/hendriks.js +50 -0
- package/dist/shipping/index.d.ts +54 -0
- package/dist/shipping/index.js +27 -0
- package/dist/shipping/methods.d.ts +205 -0
- package/dist/shipping/methods.js +240 -0
- package/dist/shipping/myparcel.d.ts +668 -0
- package/dist/shipping/myparcel.js +466 -0
- package/dist/shipping/parcel-count-suggestion.d.ts +2 -0
- package/dist/shipping/parcel-rule.d.ts +6 -5
- package/dist/shipping/parcel-rule.js +21 -23
- package/dist/shipping/rate-tables.d.ts +324 -0
- package/dist/shipping/rate-tables.js +390 -0
- package/dist/shipping/ship-to-countries.d.ts +75 -0
- package/dist/shipping/ship-to-countries.js +47 -0
- package/dist/stock/by-location.d.ts +86 -0
- package/dist/stock/by-location.js +94 -0
- package/dist/stock/index.d.ts +18 -4
- package/dist/stock/index.js +7 -0
- package/dist/stock/locations.d.ts +144 -0
- package/dist/stock/locations.js +168 -0
- package/dist/stock/settings.d.ts +106 -0
- package/dist/stock/settings.js +103 -0
- package/dist/stock/transfers.d.ts +386 -52
- package/dist/stock/transfers.js +222 -17
- package/dist/stored-value/index.d.ts +312 -11
- package/dist/stored-value/index.js +223 -4
- package/dist/subscriptions/index.d.ts +682 -0
- package/dist/subscriptions/index.js +815 -0
- package/dist/tax/display-policy.d.ts +105 -0
- package/dist/tax/display-policy.js +84 -0
- package/dist/tax/index.d.ts +79 -1
- package/dist/tax/index.js +52 -0
- package/dist/tenant/email-style.d.ts +102 -0
- package/dist/tenant/email-style.js +72 -0
- package/dist/tenant/email-templates.d.ts +287 -0
- package/dist/tenant/email-templates.js +271 -0
- package/dist/tenant/notifications.d.ts +23 -17
- package/dist/tenant/settings-sources.d.ts +1 -1
- package/dist/tenant/time-zone.d.ts +17 -0
- package/dist/tenant/time-zone.js +11 -0
- package/dist/types.d.ts +50 -3
- package/dist/users/index.d.ts +3 -0
- package/dist/users/index.js +2 -0
- package/dist/users/warehouses.d.ts +50 -0
- package/dist/users/warehouses.js +51 -0
- package/package.json +2 -2
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `admin.orders.moneyView(orderId, { basis })`: an order's money as rows that add up exactly to
|
|
3
|
+
* its own totals, in one basis (pricing-display-consistency, USER O12). Every surface that shows
|
|
4
|
+
* an order's money prints these rows, so an order page, an email and an invoice cannot disagree
|
|
5
|
+
* by a cent. The engine builds them (`Order.moneyView`); this module only reads them.
|
|
6
|
+
*/
|
|
7
|
+
import { NotFoundError, ValidationError, } from '@sixtyninecommerce/core';
|
|
8
|
+
import { isUnknownFieldRejection } from '../payments/store-credit-fields.js';
|
|
9
|
+
/**
|
|
10
|
+
* Which prices a view shows. `GROSS` = incl. VAT, `NET` = excl. VAT. `STORE` follows how the
|
|
11
|
+
* store sets its prices; `CUSTOMER` how the shop shows prices to the order's customer. The view
|
|
12
|
+
* answers the one it used, `GROSS` or `NET`.
|
|
13
|
+
*/
|
|
14
|
+
export const ORDER_MONEY_BASES = ['STORE', 'CUSTOMER', 'GROSS', 'NET'];
|
|
15
|
+
const ROW_FIELDS = 'key description amount taxRate';
|
|
16
|
+
/** Every field of an `OrderMoneyView`, at every depth: the selection each document reads it with. */
|
|
17
|
+
export const ORDER_MONEY_VIEW_FIELDS = /* GraphQL */ `
|
|
18
|
+
basis
|
|
19
|
+
currencyCode
|
|
20
|
+
lines { orderLineId quantity taxRate unitAmount amount }
|
|
21
|
+
goodsAdjustments { ${ROW_FIELDS} }
|
|
22
|
+
surcharges { ${ROW_FIELDS} }
|
|
23
|
+
subtotal
|
|
24
|
+
shipping { ${ROW_FIELDS} }
|
|
25
|
+
shippingAdjustments { ${ROW_FIELDS} }
|
|
26
|
+
shippingTotal
|
|
27
|
+
totalExcludingTax
|
|
28
|
+
taxes { taxRate base amount }
|
|
29
|
+
taxIncluded
|
|
30
|
+
taxTotal
|
|
31
|
+
rounding
|
|
32
|
+
total
|
|
33
|
+
totalBeforeRounding
|
|
34
|
+
balance { paid giftCard storeCredit credited stillToPay stillToPayNote }
|
|
35
|
+
reconciles
|
|
36
|
+
`;
|
|
37
|
+
export const ORDER_MONEY_VIEW_QUERY = /* GraphQL */ `
|
|
38
|
+
query OrderMoneyView($id: ID!, $basis: OrderMoneyBasis!) {
|
|
39
|
+
order(id: $id) {
|
|
40
|
+
id
|
|
41
|
+
moneyView(basis: $basis) {${ORDER_MONEY_VIEW_FIELDS} }
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
`;
|
|
45
|
+
/** `INVALID_ORDER_MONEY_BASIS` for a basis not in `ORDER_MONEY_BASES`, before anything is sent. */
|
|
46
|
+
export function assertOrderMoneyBasis(basis) {
|
|
47
|
+
if (!ORDER_MONEY_BASES.includes(basis)) {
|
|
48
|
+
throw new ValidationError({
|
|
49
|
+
code: 'INVALID_ORDER_MONEY_BASIS',
|
|
50
|
+
message: `The basis must be one of ${ORDER_MONEY_BASES.join(', ')}.`,
|
|
51
|
+
status: 400,
|
|
52
|
+
service: 'vendure',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const STILL_TO_PAY_NOTE_FIELD = /\bstillToPayNote\b/g;
|
|
57
|
+
/** `document` without `stillToPayNote`: what an engine before it accepts. */
|
|
58
|
+
export function withoutStillToPayNote(document) {
|
|
59
|
+
return document.replace(STILL_TO_PAY_NOTE_FIELD, '');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The transport, sending a document that names `balance.stillToPayNote` (pricing-display-consistency
|
|
63
|
+
* B1c) once more without it when the engine refused it as unknown. Safe for a mutation too: a
|
|
64
|
+
* refused document never ran. The newest money-view field, so it falls away first: wrap it inside
|
|
65
|
+
* any other `*Aware` transport.
|
|
66
|
+
*/
|
|
67
|
+
export function stillToPayNoteAware(transport) {
|
|
68
|
+
return {
|
|
69
|
+
async graphql(call, options) {
|
|
70
|
+
try {
|
|
71
|
+
return await transport.graphql(call, options);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const legacy = withoutStillToPayNote(call.query);
|
|
75
|
+
if (legacy === call.query || !isUnknownFieldRejection(error))
|
|
76
|
+
throw error;
|
|
77
|
+
return transport.graphql({ ...call, query: legacy }, options);
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export function createOrderMoneyViewModule(transport) {
|
|
83
|
+
return {
|
|
84
|
+
async moneyView(orderId, options) {
|
|
85
|
+
const basis = options?.basis ?? 'STORE';
|
|
86
|
+
assertOrderMoneyBasis(basis);
|
|
87
|
+
const data = await stillToPayNoteAware(transport).graphql({ api: 'admin', query: ORDER_MONEY_VIEW_QUERY, variables: { id: orderId, basis } }, options);
|
|
88
|
+
if (!data.order) {
|
|
89
|
+
throw new NotFoundError({
|
|
90
|
+
code: 'ORDER_NOT_FOUND',
|
|
91
|
+
message: `This store has no order ${orderId}.`,
|
|
92
|
+
status: 404,
|
|
93
|
+
service: 'vendure',
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return data.order.moneyView;
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
@@ -13,19 +13,27 @@ export type ExternalLinePriceBasis = 'net' | 'gross';
|
|
|
13
13
|
/**
|
|
14
14
|
* What is going to happen to the goods.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* a
|
|
19
|
-
*
|
|
20
|
-
*
|
|
16
|
+
* Commerce ACTS on it. Nothing here creates a fulfilment or picks a shipping
|
|
17
|
+
* method, but the value decides whether the order needs a shipping method to be
|
|
18
|
+
* placed and whether a fulfilment of it owes a delivery charge. It is recorded
|
|
19
|
+
* as the order's `platform.fulfilment` metafield (only the platform writes it),
|
|
20
|
+
* so a document, a WMS push or a merchant can also read back what you asked for.
|
|
21
21
|
*
|
|
22
22
|
* - `pickup` — collected at a location. Needs no shipping method and no
|
|
23
|
-
* address.
|
|
23
|
+
* address. Handed over through an ordinary fulfilment, which adds no delivery
|
|
24
|
+
* charge and is not held to a fulfilment profile's minimum.
|
|
24
25
|
* - `ship` — shipped. The order still needs a shipping method before it can
|
|
25
26
|
* leave `Draft`, and `transitionTo: 'ArrangingPayment'` on an order that has
|
|
26
27
|
* none is refused by the platform's own placement gate, not by this call.
|
|
28
|
+
* Delivery charges and profile minimums apply as for any delivered order.
|
|
27
29
|
* - `none` — neither shipped nor collected: a service, a subscription set-up,
|
|
28
|
-
* a fee.
|
|
30
|
+
* a fee. Needs no shipping method, owes no delivery charge and takes no
|
|
31
|
+
* profile minimum. The order is marked as having nothing to ship, so it
|
|
32
|
+
* completes on its own once it is paid (after the store's completion grace
|
|
33
|
+
* period). It may not hold goods that are stock-tracked: such a catalog line
|
|
34
|
+
* is refused `LINE_NEEDS_FULFILMENT` here, and so is placing (or modifying)
|
|
35
|
+
* the order to carry one later. Send goods as a `pickup` order, a service as
|
|
36
|
+
* an external line.
|
|
29
37
|
*/
|
|
30
38
|
export type ExternalOrderFulfilment = 'pickup' | 'ship' | 'none';
|
|
31
39
|
/**
|
|
@@ -478,6 +486,11 @@ export interface OrderEntryModule {
|
|
|
478
486
|
* - `LINE_DUPLICATE_VARIANT` — two catalog lines name the same variant.
|
|
479
487
|
* `details` carries the second one's `position` and the first one's
|
|
480
488
|
* `firstPosition`. Send one line with the quantity you want.
|
|
489
|
+
* - `LINE_NEEDS_FULFILMENT` — a catalog line whose variant is stock-tracked on
|
|
490
|
+
* an order with `fulfilment: 'none'`. Nothing ships or is handed over on
|
|
491
|
+
* such an order, so nothing would ever sell or release that stock.
|
|
492
|
+
* `details` carries its `position` and `variantId`. Send the order as
|
|
493
|
+
* `pickup` (or `ship`), or the service as an external line.
|
|
481
494
|
* - `EXTERNAL_LINE_PROMOTION_UNSUPPORTED` — a promotion discounted one of your
|
|
482
495
|
* externally priced lines. An order-level promotion is shared across every
|
|
483
496
|
* line of an order by the engine, so the platform refuses rather than
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Transport } from '@sixtyninecommerce/core';
|
|
2
2
|
import type { Call } from '../types.js';
|
|
3
|
+
import { type OrderMoneyBasis, type OrderMoneyView } from './money-view.js';
|
|
3
4
|
import type { OverpaymentOption } from './surcharges.js';
|
|
4
5
|
/**
|
|
5
6
|
* How a one-time discount is stated. A whole-order discount is `PERCENTAGE` or
|
|
@@ -376,6 +377,22 @@ export interface OrderEditPreview {
|
|
|
376
377
|
taxSummary: OrderEditTaxSummaryLine[];
|
|
377
378
|
/** The order's total with tax before the edit. */
|
|
378
379
|
totalWithTaxBefore: number;
|
|
380
|
+
/**
|
|
381
|
+
* The order's money after the edit as the order page prints it once the edit is saved
|
|
382
|
+
* (`orders.moneyView`'s rows, in `planEdit`'s `moneyBasis`), read inside the preview's run.
|
|
383
|
+
* Its `balance` is the order's payments before the plan's `refund`. Print these rows, never
|
|
384
|
+
* the figures above: they are the engine's, before a staff rounding. `null` from an engine
|
|
385
|
+
* before it; absent from `commitEdit`'s plan (read the saved order's `moneyView`).
|
|
386
|
+
*/
|
|
387
|
+
moneyView?: OrderMoneyView | null;
|
|
388
|
+
/** The order's money before the edit, read in the same run, in the same basis. */
|
|
389
|
+
moneyViewBefore?: OrderMoneyView | null;
|
|
390
|
+
/**
|
|
391
|
+
* What the edit changes the billable total by (a staff rounding included):
|
|
392
|
+
* `moneyView.total - moneyViewBefore.total`, computed by the engine. Print it as the
|
|
393
|
+
* difference; `totalWithTax - totalWithTaxBefore` ignores the rounding.
|
|
394
|
+
*/
|
|
395
|
+
totalDifference?: number | null;
|
|
379
396
|
}
|
|
380
397
|
export interface OrderEditPlan {
|
|
381
398
|
orderId: string;
|
|
@@ -422,7 +439,12 @@ export interface OrderEditPlan {
|
|
|
422
439
|
* the order-edit plan, so on an older one this call alone fails validation and
|
|
423
440
|
* no other order call does.
|
|
424
441
|
*/
|
|
425
|
-
export declare const PLAN_ORDER_EDIT_QUERY = "\n query PlanOrderEdit($orderId: ID!, $diff: OrderEditDiffInput!) {\n planOrderEdit(orderId: $orderId, diff: $diff) {\n orderId\n planHash\n orderVersion\n steps {\n kind\n input\n moneyEffect\n }\n refund {\n paymentId\n amount\n }\n overpayment {\n amount\n currencyCode\n surchargeIds\n refund {\n available\n code\n message\n }\n accountCredit {\n available\n code\n message\n }\n refundWhenChosen {\n paymentId\n amount\n }\n }\n returnState\n blockers {\n code\n message\n details\n }\n notices {\n code\n message\n details\n }\n payment {\n collected\n reason\n method\n }\n preview {\n currencyCode\n subTotal\n subTotalWithTax\n shipping\n shippingWithTax\n surcharges\n surchargesWithTax\n total\n totalWithTax\n taxSummary {\n description\n taxRate\n taxBase\n taxTotal\n }\n totalWithTaxBefore\n }\n }\n }\n";
|
|
442
|
+
export declare const PLAN_ORDER_EDIT_QUERY = "\n query PlanOrderEdit($orderId: ID!, $diff: OrderEditDiffInput!, $moneyBasis: OrderMoneyBasis!) {\n planOrderEdit(orderId: $orderId, diff: $diff) {\n orderId\n planHash\n orderVersion\n steps {\n kind\n input\n moneyEffect\n }\n refund {\n paymentId\n amount\n }\n overpayment {\n amount\n currencyCode\n surchargeIds\n refund {\n available\n code\n message\n book\n }\n accountCredit {\n available\n code\n message\n book\n }\n refundWhenChosen {\n paymentId\n amount\n }\n }\n returnState\n blockers {\n code\n message\n details\n }\n notices {\n code\n message\n details\n }\n payment {\n collected\n reason\n method\n }\n preview {\n currencyCode\n subTotal\n subTotalWithTax\n shipping\n shippingWithTax\n surcharges\n surchargesWithTax\n total\n totalWithTax\n taxSummary {\n description\n taxRate\n taxBase\n taxTotal\n }\n totalWithTaxBefore\n moneyView(basis: $moneyBasis) {\n basis\n currencyCode\n lines { orderLineId quantity taxRate unitAmount amount }\n goodsAdjustments { key description amount taxRate }\n surcharges { key description amount taxRate }\n subtotal\n shipping { key description amount taxRate }\n shippingAdjustments { key description amount taxRate }\n shippingTotal\n totalExcludingTax\n taxes { taxRate base amount }\n taxIncluded\n taxTotal\n rounding\n total\n totalBeforeRounding\n balance { paid giftCard storeCredit credited stillToPay stillToPayNote }\n reconciles\n }\n moneyViewBefore(basis: $moneyBasis) {\n basis\n currencyCode\n lines { orderLineId quantity taxRate unitAmount amount }\n goodsAdjustments { key description amount taxRate }\n surcharges { key description amount taxRate }\n subtotal\n shipping { key description amount taxRate }\n shippingAdjustments { key description amount taxRate }\n shippingTotal\n totalExcludingTax\n taxes { taxRate base amount }\n taxIncluded\n taxTotal\n rounding\n total\n totalBeforeRounding\n balance { paid giftCard storeCredit credited stillToPay stillToPayNote }\n reconciles\n }\n totalDifference\n }\n }\n }\n";
|
|
443
|
+
/**
|
|
444
|
+
* The document for an engine before the preview's money view (pricing-display-consistency B3):
|
|
445
|
+
* the same plan without `moneyView`, `moneyViewBefore`, `totalDifference` and their basis.
|
|
446
|
+
*/
|
|
447
|
+
export declare const PLAN_ORDER_EDIT_QUERY_BEFORE_MONEY_VIEW = "\n query PlanOrderEdit($orderId: ID!, $diff: OrderEditDiffInput!) {\n planOrderEdit(orderId: $orderId, diff: $diff) {\n orderId\n planHash\n orderVersion\n steps {\n kind\n input\n moneyEffect\n }\n refund {\n paymentId\n amount\n }\n overpayment {\n amount\n currencyCode\n surchargeIds\n refund {\n available\n code\n message\n book\n }\n accountCredit {\n available\n code\n message\n book\n }\n refundWhenChosen {\n paymentId\n amount\n }\n }\n returnState\n blockers {\n code\n message\n details\n }\n notices {\n code\n message\n details\n }\n payment {\n collected\n reason\n method\n }\n preview {\n currencyCode\n subTotal\n subTotalWithTax\n shipping\n shippingWithTax\n surcharges\n surchargesWithTax\n total\n totalWithTax\n taxSummary {\n description\n taxRate\n taxBase\n taxTotal\n }\n totalWithTaxBefore\n }\n }\n }\n";
|
|
426
448
|
export interface OrderPlanEditModule {
|
|
427
449
|
/**
|
|
428
450
|
* How an edit of a placed order would be carried out, and what the order
|
|
@@ -466,6 +488,12 @@ export interface OrderPlanEditModule {
|
|
|
466
488
|
* Keep `planHash` with what you show: `commitEdit` carries the edit out and
|
|
467
489
|
* names it, so what is saved is what the merchant saw.
|
|
468
490
|
*
|
|
491
|
+
* Show the edit's money from `preview.moneyView` (after) and `moneyViewBefore`, in
|
|
492
|
+
* `options.moneyBasis` (default `STORE`; `INVALID_ORDER_MONEY_BASIS` before sending for any
|
|
493
|
+
* other value than `ORDER_MONEY_BASES`): the same rows the order page prints once the edit is
|
|
494
|
+
* saved, each promotion, fee, VAT rate and staff rounding its own row. The difference is
|
|
495
|
+
* `preview.totalDifference`. An engine before them answers the plan without them (`null`).
|
|
496
|
+
*
|
|
469
497
|
* Refusals of the call:
|
|
470
498
|
* - `ORDER_EDIT_ORDER_NOT_FOUND`, `ORDER_EDIT_LINE_NOT_FOUND`,
|
|
471
499
|
* `ORDER_EDIT_SURCHARGE_NOT_FOUND` and `ORDER_EDIT_VARIANT_NOT_FOUND`
|
|
@@ -483,7 +511,11 @@ export interface OrderPlanEditModule {
|
|
|
483
511
|
* was made from the default channel instead of the order's own.
|
|
484
512
|
* - `ORDER_BUSY` (`ConflictError`, 409): another change of the order was
|
|
485
513
|
* still being applied. Ask again.
|
|
514
|
+
*
|
|
515
|
+
* @effect read
|
|
486
516
|
*/
|
|
487
|
-
planEdit(orderId: string, diff: OrderEditDiff, options?: Call
|
|
517
|
+
planEdit(orderId: string, diff: OrderEditDiff, options?: Call & {
|
|
518
|
+
moneyBasis?: OrderMoneyBasis;
|
|
519
|
+
}): Promise<OrderEditPlan>;
|
|
488
520
|
}
|
|
489
521
|
export declare function createOrderPlanEditModule(transport: Transport): OrderPlanEditModule;
|
package/dist/orders/plan-edit.js
CHANGED
|
@@ -1,9 +1,91 @@
|
|
|
1
|
+
import { isUnknownFieldRejection, storeCreditAware } from '../payments/store-credit-fields.js';
|
|
2
|
+
import { assertOrderMoneyBasis, ORDER_MONEY_VIEW_FIELDS, stillToPayNoteAware, } from './money-view.js';
|
|
1
3
|
/**
|
|
2
4
|
* Its own document on purpose: `planOrderEdit` exists only on an engine with
|
|
3
5
|
* the order-edit plan, so on an older one this call alone fails validation and
|
|
4
6
|
* no other order call does.
|
|
5
7
|
*/
|
|
6
8
|
export const PLAN_ORDER_EDIT_QUERY = /* GraphQL */ `
|
|
9
|
+
query PlanOrderEdit($orderId: ID!, $diff: OrderEditDiffInput!, $moneyBasis: OrderMoneyBasis!) {
|
|
10
|
+
planOrderEdit(orderId: $orderId, diff: $diff) {
|
|
11
|
+
orderId
|
|
12
|
+
planHash
|
|
13
|
+
orderVersion
|
|
14
|
+
steps {
|
|
15
|
+
kind
|
|
16
|
+
input
|
|
17
|
+
moneyEffect
|
|
18
|
+
}
|
|
19
|
+
refund {
|
|
20
|
+
paymentId
|
|
21
|
+
amount
|
|
22
|
+
}
|
|
23
|
+
overpayment {
|
|
24
|
+
amount
|
|
25
|
+
currencyCode
|
|
26
|
+
surchargeIds
|
|
27
|
+
refund {
|
|
28
|
+
available
|
|
29
|
+
code
|
|
30
|
+
message
|
|
31
|
+
book
|
|
32
|
+
}
|
|
33
|
+
accountCredit {
|
|
34
|
+
available
|
|
35
|
+
code
|
|
36
|
+
message
|
|
37
|
+
book
|
|
38
|
+
}
|
|
39
|
+
refundWhenChosen {
|
|
40
|
+
paymentId
|
|
41
|
+
amount
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
returnState
|
|
45
|
+
blockers {
|
|
46
|
+
code
|
|
47
|
+
message
|
|
48
|
+
details
|
|
49
|
+
}
|
|
50
|
+
notices {
|
|
51
|
+
code
|
|
52
|
+
message
|
|
53
|
+
details
|
|
54
|
+
}
|
|
55
|
+
payment {
|
|
56
|
+
collected
|
|
57
|
+
reason
|
|
58
|
+
method
|
|
59
|
+
}
|
|
60
|
+
preview {
|
|
61
|
+
currencyCode
|
|
62
|
+
subTotal
|
|
63
|
+
subTotalWithTax
|
|
64
|
+
shipping
|
|
65
|
+
shippingWithTax
|
|
66
|
+
surcharges
|
|
67
|
+
surchargesWithTax
|
|
68
|
+
total
|
|
69
|
+
totalWithTax
|
|
70
|
+
taxSummary {
|
|
71
|
+
description
|
|
72
|
+
taxRate
|
|
73
|
+
taxBase
|
|
74
|
+
taxTotal
|
|
75
|
+
}
|
|
76
|
+
totalWithTaxBefore
|
|
77
|
+
moneyView(basis: $moneyBasis) {${ORDER_MONEY_VIEW_FIELDS} }
|
|
78
|
+
moneyViewBefore(basis: $moneyBasis) {${ORDER_MONEY_VIEW_FIELDS} }
|
|
79
|
+
totalDifference
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
`;
|
|
84
|
+
/**
|
|
85
|
+
* The document for an engine before the preview's money view (pricing-display-consistency B3):
|
|
86
|
+
* the same plan without `moneyView`, `moneyViewBefore`, `totalDifference` and their basis.
|
|
87
|
+
*/
|
|
88
|
+
export const PLAN_ORDER_EDIT_QUERY_BEFORE_MONEY_VIEW = /* GraphQL */ `
|
|
7
89
|
query PlanOrderEdit($orderId: ID!, $diff: OrderEditDiffInput!) {
|
|
8
90
|
planOrderEdit(orderId: $orderId, diff: $diff) {
|
|
9
91
|
orderId
|
|
@@ -26,11 +108,13 @@ export const PLAN_ORDER_EDIT_QUERY = /* GraphQL */ `
|
|
|
26
108
|
available
|
|
27
109
|
code
|
|
28
110
|
message
|
|
111
|
+
book
|
|
29
112
|
}
|
|
30
113
|
accountCredit {
|
|
31
114
|
available
|
|
32
115
|
code
|
|
33
116
|
message
|
|
117
|
+
book
|
|
34
118
|
}
|
|
35
119
|
refundWhenChosen {
|
|
36
120
|
paymentId
|
|
@@ -77,17 +161,34 @@ export const PLAN_ORDER_EDIT_QUERY = /* GraphQL */ `
|
|
|
77
161
|
export function createOrderPlanEditModule(transport) {
|
|
78
162
|
return {
|
|
79
163
|
async planEdit(orderId, diff, options) {
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
164
|
+
const moneyBasis = options?.moneyBasis ?? 'STORE';
|
|
165
|
+
assertOrderMoneyBasis(moneyBasis);
|
|
166
|
+
const send = (query, variables) => storeCreditAware(stillToPayNoteAware(transport)).graphql(
|
|
167
|
+
// The diff goes out as given, never normalised: `orderDiscount` left
|
|
168
|
+
// out, `null` and a value are three different requests to the engine
|
|
169
|
+
// (keep, remove, set). `JSON.stringify` drops a key that is
|
|
170
|
+
// `undefined` and keeps a `null`, so a default here would turn
|
|
171
|
+
// "keep" into "remove".
|
|
172
|
+
{ api: 'admin', query, variables: { orderId, diff, ...variables } }, options);
|
|
173
|
+
try {
|
|
174
|
+
return (await send(PLAN_ORDER_EDIT_QUERY, { moneyBasis })).planOrderEdit;
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
// An engine before the preview's money refuses the document before it runs, so
|
|
178
|
+
// nothing was planned: ask again without it.
|
|
179
|
+
if (!isUnknownFieldRejection(error))
|
|
180
|
+
throw error;
|
|
181
|
+
const { planOrderEdit } = await send(PLAN_ORDER_EDIT_QUERY_BEFORE_MONEY_VIEW, {});
|
|
182
|
+
return {
|
|
183
|
+
...planOrderEdit,
|
|
184
|
+
preview: planOrderEdit.preview && {
|
|
185
|
+
...planOrderEdit.preview,
|
|
186
|
+
moneyView: null,
|
|
187
|
+
moneyViewBefore: null,
|
|
188
|
+
totalDifference: null,
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
91
192
|
},
|
|
92
193
|
};
|
|
93
194
|
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { type Transport } from '@sixtyninecommerce/core';
|
|
2
|
+
import type { SettingsSourceKind } from '../tenant/settings-sources.js';
|
|
3
|
+
import type { Call } from '../types.js';
|
|
4
|
+
/** The states an order status rule may move a placed order to. */
|
|
5
|
+
export declare const ORDER_STATUS_RULE_TARGET_STATES: readonly ["AwaitingApproval", "PaymentAuthorized", "PaymentSettled"];
|
|
6
|
+
/** What an order status rule matches on. */
|
|
7
|
+
export declare const ORDER_STATUS_RULE_CONDITION_TYPES: readonly ["product", "coupon", "collection", "facet_value"];
|
|
8
|
+
/** The fewest zero-padded digits of a sequential order number. */
|
|
9
|
+
export declare const ORDER_CODE_DIGITS_MIN = 4;
|
|
10
|
+
/** The most zero-padded digits of a sequential order number. */
|
|
11
|
+
export declare const ORDER_CODE_DIGITS_MAX = 8;
|
|
12
|
+
/**
|
|
13
|
+
* The longest order-number prefix. The engine stores more, but every order code is
|
|
14
|
+
* `NAMESPACE-PREFIX00001` in a 255-character column: a long prefix fails EVERY order placement.
|
|
15
|
+
*/
|
|
16
|
+
export declare const ORDER_CODE_PREFIX_MAX_LENGTH = 20;
|
|
17
|
+
/** The youngest minimum purchase age (the engine checks no age below 1: `minimumAge > 0`). */
|
|
18
|
+
export declare const MINIMUM_AGE_MIN = 1;
|
|
19
|
+
/** The oldest minimum purchase age the platform accepts. */
|
|
20
|
+
export declare const MINIMUM_AGE_MAX = 99;
|
|
21
|
+
/**
|
|
22
|
+
* The largest amount (minor units) the minimum and the thresholds hold: the columns are Vendure
|
|
23
|
+
* `int` custom fields, GraphQL `Int` (32 bits). ₩30,000,000 is 3,000,000,000 hundredths, past it.
|
|
24
|
+
*/
|
|
25
|
+
export declare const ORDER_SETTINGS_AMOUNT_MAX = 2147483647;
|
|
26
|
+
export type OrderStatusRuleTargetState = (typeof ORDER_STATUS_RULE_TARGET_STATES)[number];
|
|
27
|
+
export type OrderStatusRuleConditionType = (typeof ORDER_STATUS_RULE_CONDITION_TYPES)[number];
|
|
28
|
+
/**
|
|
29
|
+
* A rule that moves an order into `targetState` on its FIRST placement when it matches. Rules run
|
|
30
|
+
* in array order and the first enabled match wins; a rule whose list for its `conditionType` is
|
|
31
|
+
* empty never fires.
|
|
32
|
+
*/
|
|
33
|
+
export interface OrderStatusRule {
|
|
34
|
+
id: string;
|
|
35
|
+
/** For people only. `''` for a stored rule that has none: the engine fires it all the same. */
|
|
36
|
+
name: string;
|
|
37
|
+
targetState: OrderStatusRuleTargetState;
|
|
38
|
+
conditionType: OrderStatusRuleConditionType;
|
|
39
|
+
/** Read for `product`. */
|
|
40
|
+
productVariantIds?: string[];
|
|
41
|
+
/** Read for `coupon`, compared without case. */
|
|
42
|
+
couponCodes?: string[];
|
|
43
|
+
/** Read for `collection`. */
|
|
44
|
+
collectionIds?: string[];
|
|
45
|
+
/** Read for `facet_value`. */
|
|
46
|
+
facetValueIds?: string[];
|
|
47
|
+
enabled: boolean;
|
|
48
|
+
}
|
|
49
|
+
/** Where the minimum purchase age the engine applies comes from (`settings.age_verification`). */
|
|
50
|
+
export interface MinimumAgeSource {
|
|
51
|
+
/** `channel`: the store's own `minimumAge`; `organization`: its organization's. */
|
|
52
|
+
source: SettingsSourceKind | (string & {});
|
|
53
|
+
/**
|
|
54
|
+
* The organization locked the group: {@link OrderSettingsModule.set} refuses a changed
|
|
55
|
+
* `minimumAge` with `MANAGED_BY_ORGANIZATION`, SuperAdmins included.
|
|
56
|
+
*/
|
|
57
|
+
locked: boolean;
|
|
58
|
+
/** The organization shares the group without locking it. */
|
|
59
|
+
inheritable: boolean;
|
|
60
|
+
/** The store keeps its own value although the organization shares the group. */
|
|
61
|
+
overridden: boolean;
|
|
62
|
+
/** The age the engine applies to this store's checkout; null when none. */
|
|
63
|
+
effective: number | null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The ACTIVE store's order settings, as its channel stores them. Every amount is in minor units
|
|
67
|
+
* (hundredths, for every currency: ¥5,000 is 500000, as the platform stores all money) of
|
|
68
|
+
* {@link OrderSettings.currencyCode}, the store's default currency.
|
|
69
|
+
*/
|
|
70
|
+
export interface OrderSettings {
|
|
71
|
+
/** The store these are the settings of (its channel id). */
|
|
72
|
+
channelId: string;
|
|
73
|
+
/** The store's default currency (ISO 4217): the minimum and both thresholds are in it. */
|
|
74
|
+
currencyCode: string;
|
|
75
|
+
/**
|
|
76
|
+
* The least an order may cost (with tax) before it can be placed; null when there is no
|
|
77
|
+
* minimum. An order in another currency is held to it converted at the checkout's rate.
|
|
78
|
+
*/
|
|
79
|
+
minOrderAmount: number | null;
|
|
80
|
+
/** Customer groups whose members are not held to the minimum. */
|
|
81
|
+
exemptCustomerGroupIds: string[];
|
|
82
|
+
/** Collections whose items do not count toward the minimum. */
|
|
83
|
+
exemptCollectionIds: string[];
|
|
84
|
+
/** Placed orders get sequential numbers (`NAMESPACE-PREFIX00001`); off: random codes. */
|
|
85
|
+
orderCodeEnabled: boolean;
|
|
86
|
+
/**
|
|
87
|
+
* The store's part of every sequential order number, set by the platform (from the store's
|
|
88
|
+
* code) and never by a caller; read-only here. Null until sequential numbers were first on.
|
|
89
|
+
*/
|
|
90
|
+
orderCodeNamespace: string | null;
|
|
91
|
+
/** The merchant's part after the namespace, e.g. `VIN-`; null for none. */
|
|
92
|
+
orderCodePrefix: string | null;
|
|
93
|
+
/** How many zero-padded digits the number has, 4 to 8; null is the platform's 5. */
|
|
94
|
+
orderCodeDigits: number | null;
|
|
95
|
+
/**
|
|
96
|
+
* The store's OWN minimum purchase age, what {@link OrderSettingsModule.set} writes; null for
|
|
97
|
+
* none. While the store takes `settings.age_verification` from its organization the engine
|
|
98
|
+
* applies the organization's instead: see {@link OrderSettings.minimumAgeSource}.
|
|
99
|
+
*/
|
|
100
|
+
minimumAge: number | null;
|
|
101
|
+
minimumAgeSource: MinimumAgeSource;
|
|
102
|
+
/**
|
|
103
|
+
* The rules the engine applies, read as the engine reads them: an entry without a string `id`,
|
|
104
|
+
* a known `targetState` and a known `conditionType` is left out (the engine never fires it);
|
|
105
|
+
* a rule without a name reads `name: ''`, its `enabled` as the engine takes it, and its lists
|
|
106
|
+
* as their non-empty strings.
|
|
107
|
+
*/
|
|
108
|
+
orderStatusRules: OrderStatusRule[];
|
|
109
|
+
/** A customer's balance above this shows as a warning; null for no warning tier. */
|
|
110
|
+
outstandingBalanceWarningThreshold: number | null;
|
|
111
|
+
/** A customer's balance above this shows as critical; null for no critical tier. */
|
|
112
|
+
outstandingBalanceCriticalThreshold: number | null;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* A PATCH of {@link OrderSettings}: a key left out is unchanged, `null` clears it. At least one
|
|
116
|
+
* key. There is no `orderCodeNamespace`: the platform sets it (ruling G125).
|
|
117
|
+
*/
|
|
118
|
+
export interface UpdateOrderSettingsInput {
|
|
119
|
+
/** Whole minor units, 0 to {@link ORDER_SETTINGS_AMOUNT_MAX}; null for no minimum. */
|
|
120
|
+
minOrderAmount?: number | null;
|
|
121
|
+
/** The whole list (it replaces the stored one); empty for none. */
|
|
122
|
+
exemptCustomerGroupIds?: string[];
|
|
123
|
+
/** The whole list (it replaces the stored one); empty for none. */
|
|
124
|
+
exemptCollectionIds?: string[];
|
|
125
|
+
/**
|
|
126
|
+
* Switching it on for a store that never had sequential numbers also sets its namespace to the
|
|
127
|
+
* store's code in capitals, as provisioning does for a new store.
|
|
128
|
+
*/
|
|
129
|
+
orderCodeEnabled?: boolean;
|
|
130
|
+
/** At most 20 characters; null for none. */
|
|
131
|
+
orderCodePrefix?: string | null;
|
|
132
|
+
/** A whole number from 4 to 8; null for the platform's 5. */
|
|
133
|
+
orderCodeDigits?: number | null;
|
|
134
|
+
/** A whole number of years from 1 to 99; null for no age check. */
|
|
135
|
+
minimumAge?: number | null;
|
|
136
|
+
/** The whole list, in priority order (it replaces the stored one); empty for none. */
|
|
137
|
+
orderStatusRules?: OrderStatusRule[];
|
|
138
|
+
/** Whole minor units, 0 to {@link ORDER_SETTINGS_AMOUNT_MAX}; null for no warning tier. */
|
|
139
|
+
outstandingBalanceWarningThreshold?: number | null;
|
|
140
|
+
/** Whole minor units, 0 to {@link ORDER_SETTINGS_AMOUNT_MAX}; null for no critical tier. */
|
|
141
|
+
outstandingBalanceCriticalThreshold?: number | null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* `admin.orders.settings`: the ACTIVE store's order settings (Settings → Orders): its order
|
|
145
|
+
* minimum and who is exempt from it, how its orders are numbered, the minimum purchase age, the
|
|
146
|
+
* rules that route a placed order into a state, and the outstanding-balance warning tiers. Stored
|
|
147
|
+
* as Channel custom fields; written through core `updateChannel` (typed per domain, ruling G80).
|
|
148
|
+
*
|
|
149
|
+
* The deposit policy (`orders.depositPolicy`) and the fulfilment payment policy
|
|
150
|
+
* (`fulfillments.paymentPolicy`) have doors of their own.
|
|
151
|
+
*/
|
|
152
|
+
export interface OrderSettingsModule {
|
|
153
|
+
/**
|
|
154
|
+
* The settings as the engine applies them, with where the minimum age comes from. Reading
|
|
155
|
+
* needs an administrator of the store with any permission beyond `Authenticated`.
|
|
156
|
+
*
|
|
157
|
+
* @effect read
|
|
158
|
+
*/
|
|
159
|
+
get(options?: Call): Promise<OrderSettings>;
|
|
160
|
+
/**
|
|
161
|
+
* Change the settings `patch` names, and answer them all as the engine now stores them.
|
|
162
|
+
*
|
|
163
|
+
* Changing the minimum or its exemptions changes which orders the store accepts from the next
|
|
164
|
+
* checkout on; orders already placed keep the rule they were placed under.
|
|
165
|
+
*
|
|
166
|
+
* **Coded refusals:**
|
|
167
|
+
* - `ORDER_SETTINGS_INVALID` → {@link ValidationError} (400), before any request: an empty
|
|
168
|
+
* patch; a key that is not an order setting (`orderCodeNamespace` included: the platform
|
|
169
|
+
* sets it); an amount that is not a whole number of minor units from 0 to
|
|
170
|
+
* {@link ORDER_SETTINGS_AMOUNT_MAX} (the column is a 32-bit `Int`); digits outside
|
|
171
|
+
* 4–8; a prefix longer than 20 characters; an age outside 1–99; a list that is not an array.
|
|
172
|
+
* One `details[]` entry per failing key, `field` naming it.
|
|
173
|
+
* - `CHANNEL_SETTINGS_INVALID` → {@link ValidationError} (400), from the engine: an exemption
|
|
174
|
+
* list that is not distinct non-empty ids (at most 255 characters encoded, about six ids),
|
|
175
|
+
* a malformed status rule, or a critical threshold not above the warning threshold
|
|
176
|
+
* (`code: 'MUST_EXCEED_WARNING'`). `details[].field` is the input path, such as
|
|
177
|
+
* `customFields.outstandingBalanceCriticalThreshold`; `details[].message` is the engine's
|
|
178
|
+
* sentence, with the amounts in the store's currency.
|
|
179
|
+
* - `MANAGED_BY_ORGANIZATION` → `BusinessRuleError` (422): a changed `minimumAge` while the
|
|
180
|
+
* organization locks `settings.age_verification`.
|
|
181
|
+
* - `ORGANIZATION_SETTINGS_INHERITED` → `BusinessRuleError` (422): a changed `minimumAge`
|
|
182
|
+
* while the store inherits the group; `tenant.settingsSources.override` it first. Sending
|
|
183
|
+
* the stored value back unchanged is accepted and changes nothing.
|
|
184
|
+
* - `FORBIDDEN` → `PermissionDeniedError` (403): the credential lacks `UpdateChannel`.
|
|
185
|
+
*
|
|
186
|
+
* @effect write
|
|
187
|
+
* @permission UpdateChannel
|
|
188
|
+
*/
|
|
189
|
+
set(patch: UpdateOrderSettingsInput, options?: Call): Promise<OrderSettings>;
|
|
190
|
+
}
|
|
191
|
+
export declare const ORDER_SETTINGS_QUERY = "\n query OrderSettings {\n activeChannel { \n id\n code\n defaultCurrencyCode\n customFields {\n minOrderAmount\n exemptCustomerGroupIds\n exemptCollectionIds\n orderCodeNamespace\n orderCodePrefix\n orderCodeDigits\n orderCodeEnabled\n minimumAge\n orderStatusRules\n outstandingBalanceWarningThreshold\n outstandingBalanceCriticalThreshold\n }\n }\n channelSettingsSources { group source locked overridden inheritable values }\n }\n";
|
|
192
|
+
export declare const UPDATE_ORDER_SETTINGS_MUTATION = "\n mutation UpdateOrderSettings($input: UpdateChannelInput!) {\n updateChannel(input: $input) {\n ... on Channel { \n id\n code\n defaultCurrencyCode\n customFields {\n minOrderAmount\n exemptCustomerGroupIds\n exemptCollectionIds\n orderCodeNamespace\n orderCodePrefix\n orderCodeDigits\n orderCodeEnabled\n minimumAge\n orderStatusRules\n outstandingBalanceWarningThreshold\n outstandingBalanceCriticalThreshold\n }\n }\n ... on ErrorResult { errorCode message }\n }\n }\n";
|
|
193
|
+
/**
|
|
194
|
+
* The column as the engine's `parseRules` keeps it: an entry with a string `id`, a known
|
|
195
|
+
* `targetState` and a known `conditionType`. A rule the engine keeps is never dropped here (a
|
|
196
|
+
* stricter reader would erase it on the next save, turning off the transition it performs), so
|
|
197
|
+
* a missing `name` reads `''` and `enabled` reads as the engine takes it (truthy fires). Only the
|
|
198
|
+
* rule's own keys come back, so the list can be sent back as the engine's schema wants it.
|
|
199
|
+
*/
|
|
200
|
+
export declare function readOrderStatusRules(raw: unknown): OrderStatusRule[];
|
|
201
|
+
export declare function createOrderSettingsModule(transport: Transport): OrderSettingsModule;
|