@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,83 @@
|
|
|
1
|
+
import { statedCustomerAgreed } from '../payments/customer-consent.js';
|
|
2
|
+
import { isUnknownFieldRejection } from '../payments/store-credit-fields.js';
|
|
3
|
+
/** A quote's fields up to its store-credit payout, which every engine with C6b reads. */
|
|
4
|
+
const QUOTE_BASE_FIELDS = 'orderId kind currencyCode receiptNumber lines { orderLineId name sku customItem restockable soldQuantity returnedQuantity returnableQuantity quantity refundAmount } total legs { paymentId kind method amount } cashPaidOut returnWindowEndsAt outsideWindow refundedOutsideReturns restockLocationName blockedBy blockedReason';
|
|
5
|
+
// Spliced as template constants, never built by a call: the repo's GraphQL cost scan
|
|
6
|
+
// (`graphql-cost-fits-repo.spec.ts`) resolves `${CONSTANT}` statically and nothing computed.
|
|
7
|
+
/** A quote's fields before the till's consent (owner ruling Q4): what every engine with C6b reads. */
|
|
8
|
+
const QUOTE_FIELDS_BEFORE_CONSENT = `${QUOTE_BASE_FIELDS} storedValuePayout { available reason }`;
|
|
9
|
+
const QUOTE_FIELDS = `${QUOTE_BASE_FIELDS} storedValuePayout { available reason asksConsent }`;
|
|
10
|
+
/** The sprint-20 result: what a void answers (it never pays out to store credit). */
|
|
11
|
+
const VOID_RESULT_FIELDS = 'orderId returnId returnCode kind total refunds { paymentId kind method amount refundId outcome } cashPaidOut complete';
|
|
12
|
+
/** A return's result: the void's, and the store credit a STORED_VALUE payout made (C6b). */
|
|
13
|
+
const RESULT_FIELDS = `${VOID_RESULT_FIELDS} storedValueCredit { accountId entryId amount }`;
|
|
14
|
+
export const POS_RETURN_QUOTE_QUERY = `query PosReturnQuote($input: PosReturnQuoteInput!) { posReturnQuote(input: $input) { ${QUOTE_FIELDS} } }`;
|
|
15
|
+
/** The quote for an engine before the till's consent (owner ruling Q4): no `asksConsent`. */
|
|
16
|
+
export const POS_RETURN_QUOTE_QUERY_BEFORE_CONSENT = `query PosReturnQuote($input: PosReturnQuoteInput!) { posReturnQuote(input: $input) { ${QUOTE_FIELDS_BEFORE_CONSENT} } }`;
|
|
17
|
+
export const POS_RETURN_MUTATION = `mutation PosReturn($input: PosReturnInput!) { posReturn(input: $input) { ${RESULT_FIELDS} } }`;
|
|
18
|
+
export const POS_VOID_SALE_MUTATION = `mutation PosVoidSale($input: PosVoidSaleInput!) { posVoidSale(input: $input) { ${VOID_RESULT_FIELDS} } }`;
|
|
19
|
+
// Engine C3/34: their own documents, so a call to an older engine fails alone.
|
|
20
|
+
const ONLINE_ORDER_FIELDS = 'orderId orderCode placedAt state currencyCode totalWithTax customerName refundMethodName returnableUnits blockedBy blockedReason';
|
|
21
|
+
export const POS_ONLINE_ORDER_QUERY = `query PosOnlineOrder($input: PosOnlineOrderRefInput!) { posOnlineOrder(input: $input) { ${ONLINE_ORDER_FIELDS} } }`;
|
|
22
|
+
// Never store credit (D22), so it never asks consent: the selection before Q4, `asksConsent` false.
|
|
23
|
+
export const POS_ONLINE_RETURN_QUOTE_QUERY = `query PosOnlineReturnQuote($input: PosOnlineReturnQuoteInput!) { posOnlineReturnQuote(input: $input) { ${QUOTE_FIELDS_BEFORE_CONSENT} shippingRefund source } }`;
|
|
24
|
+
// A webshop order's return never pays out to store credit (C3 D22): the void's result fields.
|
|
25
|
+
export const POS_ONLINE_RETURN_MUTATION = `mutation PosOnlineReturn($input: PosOnlineReturnInput!) { posOnlineReturn(input: $input) { ${VOID_RESULT_FIELDS} } }`;
|
|
26
|
+
/** Such a quote as this SDK answers it: `asksConsent` false (that engine takes no answer). */
|
|
27
|
+
function withoutConsent(quote) {
|
|
28
|
+
return {
|
|
29
|
+
...quote,
|
|
30
|
+
storedValuePayout: { ...quote.storedValuePayout, asksConsent: false },
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function keyOf(options, call) {
|
|
34
|
+
const key = options?.idempotencyKey;
|
|
35
|
+
if (typeof key !== 'string' || key.trim() === '') {
|
|
36
|
+
throw new TypeError(`pos.returns.${call} needs options.idempotencyKey (a fresh UUIDv7 per return; reuse it only to retry the same one).`);
|
|
37
|
+
}
|
|
38
|
+
return key;
|
|
39
|
+
}
|
|
40
|
+
export function createPosReturnsModule(transport) {
|
|
41
|
+
const gql = async (query, variables, options) => transport.graphql({ api: 'admin', query, variables }, options);
|
|
42
|
+
return {
|
|
43
|
+
async quote(input, options) {
|
|
44
|
+
try {
|
|
45
|
+
const data = await gql(POS_RETURN_QUOTE_QUERY, { input }, options);
|
|
46
|
+
return data.posReturnQuote;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
// An engine before the till's consent (Q4) refuses the whole document; the quote is still
|
|
50
|
+
// readable without it, and that engine takes no answer. Any other failure is the read's.
|
|
51
|
+
if (!isUnknownFieldRejection(error))
|
|
52
|
+
throw error;
|
|
53
|
+
const data = await gql(POS_RETURN_QUOTE_QUERY_BEFORE_CONSENT, { input }, options);
|
|
54
|
+
return withoutConsent(data.posReturnQuote);
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
async create(input, options) {
|
|
58
|
+
const idempotencyKey = keyOf(options, 'create');
|
|
59
|
+
// The answer only when stated: left out or null, the request is what it always was.
|
|
60
|
+
const { customerAgreed, ...rest } = input;
|
|
61
|
+
const data = await gql(POS_RETURN_MUTATION, { input: { ...rest, ...statedCustomerAgreed(customerAgreed), idempotencyKey } }, options);
|
|
62
|
+
return data.posReturn;
|
|
63
|
+
},
|
|
64
|
+
async void(input, options) {
|
|
65
|
+
const idempotencyKey = keyOf(options, 'void');
|
|
66
|
+
const data = await gql(POS_VOID_SALE_MUTATION, { input: { ...input, idempotencyKey } }, options);
|
|
67
|
+
return data.posVoidSale;
|
|
68
|
+
},
|
|
69
|
+
async findOnlineOrder(ref, options) {
|
|
70
|
+
const data = await gql(POS_ONLINE_ORDER_QUERY, { input: ref }, options);
|
|
71
|
+
return data.posOnlineOrder;
|
|
72
|
+
},
|
|
73
|
+
async onlineQuote(input, options) {
|
|
74
|
+
const data = await gql(POS_ONLINE_RETURN_QUOTE_QUERY, { input }, options);
|
|
75
|
+
return withoutConsent(data.posOnlineReturnQuote);
|
|
76
|
+
},
|
|
77
|
+
async onlineReturn(input, options) {
|
|
78
|
+
const idempotencyKey = keyOf(options, 'onlineReturn');
|
|
79
|
+
const data = await gql(POS_ONLINE_RETURN_MUTATION, { input: { ...input, idempotencyKey } }, options);
|
|
80
|
+
return data.posOnlineReturn;
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { type Page, type Transport } from '@sixtyninecommerce/core';
|
|
2
|
+
import type { Call, ListOptions } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* `admin.pricing.coupons.bulk`: unique codes generated in bulk for a promotion of the store
|
|
5
|
+
* (`vendure-plugin-bulk-coupons`). A code stands in for its promotion's own coupon code, so a
|
|
6
|
+
* promotion WITHOUT a coupon code takes none: its codes would never be accepted. Each code keeps
|
|
7
|
+
* its group's usage limits on top of the promotion's.
|
|
8
|
+
*
|
|
9
|
+
* Every id names a record of THIS store: another store's promotion, group or code is
|
|
10
|
+
* `ENTITY_NOT_FOUND` (`NotFoundError`, 404), the same answer as one that does not exist.
|
|
11
|
+
*/
|
|
12
|
+
export interface PricingBulkCouponsModule {
|
|
13
|
+
/**
|
|
14
|
+
* The promotion's code groups, newest first, each with how many of its codes are active and
|
|
15
|
+
* how many uses its codes have had (orders holding a code that are not cancelled). A voucher
|
|
16
|
+
* template (`kind: 'voucher'`, `pricing.vouchers`) is a group too.
|
|
17
|
+
*
|
|
18
|
+
* @effect read
|
|
19
|
+
* @permission ReadPromotion
|
|
20
|
+
*/
|
|
21
|
+
groups(promotionId: string, options?: Call): Promise<BulkCouponGroup[]>;
|
|
22
|
+
/**
|
|
23
|
+
* One page of a group's codes, oldest first and then by id, an order every page agrees on, so
|
|
24
|
+
* a walk with `for await` sees each code once (`limit` 1 to 1,000, default 25), each with its
|
|
25
|
+
* own use count. Refused before sending: `INVALID_PAGE_SIZE` (`ValidationError`, 400).
|
|
26
|
+
*
|
|
27
|
+
* @effect read
|
|
28
|
+
* @permission ReadPromotion
|
|
29
|
+
*/
|
|
30
|
+
codes(groupId: string, options?: ListOptions): Promise<Page<BulkCouponCode>>;
|
|
31
|
+
/**
|
|
32
|
+
* Generate a group of `quantity` new codes, `PREFIX-RANDOM`, for the promotion, and answer
|
|
33
|
+
* the group. The prefix is trimmed; the random part is `codeLength` characters (8 when
|
|
34
|
+
* omitted).
|
|
35
|
+
*
|
|
36
|
+
* Refusals (`ValidationError`, 400): `BULK_COUPON_PREFIX_INVALID` (1 to 50 capital letters,
|
|
37
|
+
* digits or "-", starting with a letter or digit), `BULK_COUPON_CODE_LENGTH_INVALID` (8 to
|
|
38
|
+
* 32), `BULK_COUPON_QUANTITY_INVALID` (1 to 100,000);
|
|
39
|
+
* `BULK_COUPON_CODE_SPACE_EXHAUSTED` (`BusinessRuleError`, 422) when the prefix and length
|
|
40
|
+
* have too few free codes left (choose a longer length or another prefix). Nothing is saved
|
|
41
|
+
* on a refusal. A repeat generates another group: no `idempotencyKey` is read.
|
|
42
|
+
*
|
|
43
|
+
* @effect write
|
|
44
|
+
* @permission CreatePromotion
|
|
45
|
+
*/
|
|
46
|
+
generate(input: GenerateBulkCouponsInput, options?: Call): Promise<BulkCouponGroup>;
|
|
47
|
+
/**
|
|
48
|
+
* Accept a switched-off code again, and answer it.
|
|
49
|
+
*
|
|
50
|
+
* @effect write
|
|
51
|
+
* @permission UpdatePromotion
|
|
52
|
+
*/
|
|
53
|
+
activate(codeId: string, options?: Call): Promise<BulkCouponCode>;
|
|
54
|
+
/**
|
|
55
|
+
* Stop accepting one code from now on, and answer it.
|
|
56
|
+
*
|
|
57
|
+
* @effect write
|
|
58
|
+
* @permission UpdatePromotion
|
|
59
|
+
*/
|
|
60
|
+
deactivate(codeId: string, options?: Call): Promise<BulkCouponCode>;
|
|
61
|
+
/**
|
|
62
|
+
* Stop accepting every code of a group (each can be switched on again with
|
|
63
|
+
* {@link activate}).
|
|
64
|
+
*
|
|
65
|
+
* @effect write
|
|
66
|
+
* @permission UpdatePromotion
|
|
67
|
+
*/
|
|
68
|
+
deactivateGroup(groupId: string, options?: Call): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Delete a group and every code in it: none is accepted again, and none can be switched back
|
|
71
|
+
* on.
|
|
72
|
+
*
|
|
73
|
+
* @effect destructive
|
|
74
|
+
* @permission DeletePromotion
|
|
75
|
+
*/
|
|
76
|
+
deleteGroup(groupId: string, options?: Call): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Every code of a group as CSV text, in the order of {@link codes}: a `code,active,created_at`
|
|
79
|
+
* header, then one line per code (`active` is `true`/`false`, `created_at` an ISO-8601 instant).
|
|
80
|
+
*
|
|
81
|
+
* @effect read
|
|
82
|
+
* @permission ReadPromotion
|
|
83
|
+
*/
|
|
84
|
+
export(groupId: string, options?: Call): Promise<string>;
|
|
85
|
+
}
|
|
86
|
+
export interface BulkCouponGroup {
|
|
87
|
+
id: string;
|
|
88
|
+
promotionId: string;
|
|
89
|
+
prefix: string;
|
|
90
|
+
codeLength: number;
|
|
91
|
+
/** Codes generated up front; 0 for a voucher template, whose codes are issued one by one. */
|
|
92
|
+
quantity: number;
|
|
93
|
+
/** Uses each code allows; null for no limit of its own. */
|
|
94
|
+
perCodeUsageLimit: number | null;
|
|
95
|
+
/** Uses each code allows one customer; null for no limit of its own. */
|
|
96
|
+
perCodeCustomerUsageLimit: number | null;
|
|
97
|
+
/** `batch` (generated up front) or `voucher` (personal codes issued one by one). */
|
|
98
|
+
kind: 'batch' | 'voucher' | (string & {});
|
|
99
|
+
/** A voucher template's validity in days when an issue names none. */
|
|
100
|
+
defaultValidityDays: number | null;
|
|
101
|
+
activeCount: number;
|
|
102
|
+
usedCount: number;
|
|
103
|
+
createdAt: string;
|
|
104
|
+
}
|
|
105
|
+
export interface BulkCouponCode {
|
|
106
|
+
id: string;
|
|
107
|
+
code: string;
|
|
108
|
+
isActive: boolean;
|
|
109
|
+
usageCount: number;
|
|
110
|
+
createdAt: string;
|
|
111
|
+
/** A voucher's customer; null for a batch code (or a voucher whose customer was erased). */
|
|
112
|
+
customerId: string | null;
|
|
113
|
+
/** A voucher's own expiry; its promotion's end still applies. */
|
|
114
|
+
expiresAt: string | null;
|
|
115
|
+
/** The system that issued a voucher, as it named itself. */
|
|
116
|
+
sourceSystem: string | null;
|
|
117
|
+
/** The issuing journey's own reference, opaque. */
|
|
118
|
+
sourceRef: string | null;
|
|
119
|
+
}
|
|
120
|
+
export interface GenerateBulkCouponsInput {
|
|
121
|
+
promotionId: string;
|
|
122
|
+
prefix: string;
|
|
123
|
+
/** The random part's length, 8 to 32; 8 when omitted. */
|
|
124
|
+
codeLength?: number;
|
|
125
|
+
/** 1 to 100,000. */
|
|
126
|
+
quantity: number;
|
|
127
|
+
perCodeUsageLimit?: number | null;
|
|
128
|
+
perCodeCustomerUsageLimit?: number | null;
|
|
129
|
+
}
|
|
130
|
+
export declare const BULK_COUPON_GROUPS_QUERY = "\n query BulkCouponGroups($promotionId: ID!) {\n bulkCouponGroups(promotionId: $promotionId) { \n id\n promotionId\n prefix\n codeLength\n quantity\n perCodeUsageLimit\n perCodeCustomerUsageLimit\n kind\n defaultValidityDays\n activeCount\n usedCount\n createdAt\n }\n }\n";
|
|
131
|
+
export declare const BULK_COUPON_CODES_QUERY = "\n query BulkCouponCodes($groupId: ID!, $options: BulkCouponCodeListOptions) {\n bulkCouponCodes(groupId: $groupId, options: $options) {\n items { \n id\n code\n isActive\n usageCount\n createdAt\n customerId\n expiresAt\n sourceSystem\n sourceRef\n }\n totalItems\n }\n }\n";
|
|
132
|
+
export declare const GENERATE_BULK_COUPONS_MUTATION = "\n mutation GenerateBulkCoupons($input: GenerateBulkCouponsInput!) {\n generateBulkCoupons(input: $input) { \n id\n promotionId\n prefix\n codeLength\n quantity\n perCodeUsageLimit\n perCodeCustomerUsageLimit\n kind\n defaultValidityDays\n activeCount\n usedCount\n createdAt\n }\n }\n";
|
|
133
|
+
export declare const ACTIVATE_BULK_COUPON_CODE_MUTATION = "\n mutation ActivateBulkCouponCode($id: ID!) {\n activateBulkCouponCode(id: $id) { \n id\n code\n isActive\n usageCount\n createdAt\n customerId\n expiresAt\n sourceSystem\n sourceRef\n }\n }\n";
|
|
134
|
+
export declare const DEACTIVATE_BULK_COUPON_CODE_MUTATION = "\n mutation DeactivateBulkCouponCode($id: ID!) {\n deactivateBulkCouponCode(id: $id) { \n id\n code\n isActive\n usageCount\n createdAt\n customerId\n expiresAt\n sourceSystem\n sourceRef\n }\n }\n";
|
|
135
|
+
export declare const DEACTIVATE_BULK_COUPON_GROUP_MUTATION = "\n mutation DeactivateBulkCouponGroup($groupId: ID!) {\n deactivateBulkCouponGroup(groupId: $groupId)\n }\n";
|
|
136
|
+
export declare const DELETE_BULK_COUPON_GROUP_MUTATION = "\n mutation DeleteBulkCouponGroup($groupId: ID!) {\n deleteBulkCouponGroup(groupId: $groupId)\n }\n";
|
|
137
|
+
/** A mutation, though it writes nothing: the plugin declares it so (`ReadPromotion`). */
|
|
138
|
+
export declare const EXPORT_BULK_COUPON_CODES_MUTATION = "\n mutation ExportBulkCouponCodes($groupId: ID!) {\n exportBulkCouponCodes(groupId: $groupId)\n }\n";
|
|
139
|
+
export declare function createPricingBulkCouponsModule(transport: Transport): PricingBulkCouponsModule;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { UpstreamError } from '@sixtyninecommerce/core';
|
|
2
|
+
import { fieldOf, vendureListPage } from '../catalog/types.js';
|
|
3
|
+
const GROUP_FIELDS = /* GraphQL */ `
|
|
4
|
+
id
|
|
5
|
+
promotionId
|
|
6
|
+
prefix
|
|
7
|
+
codeLength
|
|
8
|
+
quantity
|
|
9
|
+
perCodeUsageLimit
|
|
10
|
+
perCodeCustomerUsageLimit
|
|
11
|
+
kind
|
|
12
|
+
defaultValidityDays
|
|
13
|
+
activeCount
|
|
14
|
+
usedCount
|
|
15
|
+
createdAt
|
|
16
|
+
`;
|
|
17
|
+
const CODE_FIELDS = /* GraphQL */ `
|
|
18
|
+
id
|
|
19
|
+
code
|
|
20
|
+
isActive
|
|
21
|
+
usageCount
|
|
22
|
+
createdAt
|
|
23
|
+
customerId
|
|
24
|
+
expiresAt
|
|
25
|
+
sourceSystem
|
|
26
|
+
sourceRef
|
|
27
|
+
`;
|
|
28
|
+
export const BULK_COUPON_GROUPS_QUERY = /* GraphQL */ `
|
|
29
|
+
query BulkCouponGroups($promotionId: ID!) {
|
|
30
|
+
bulkCouponGroups(promotionId: $promotionId) { ${GROUP_FIELDS} }
|
|
31
|
+
}
|
|
32
|
+
`;
|
|
33
|
+
export const BULK_COUPON_CODES_QUERY = /* GraphQL */ `
|
|
34
|
+
query BulkCouponCodes($groupId: ID!, $options: BulkCouponCodeListOptions) {
|
|
35
|
+
bulkCouponCodes(groupId: $groupId, options: $options) {
|
|
36
|
+
items { ${CODE_FIELDS} }
|
|
37
|
+
totalItems
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
`;
|
|
41
|
+
export const GENERATE_BULK_COUPONS_MUTATION = /* GraphQL */ `
|
|
42
|
+
mutation GenerateBulkCoupons($input: GenerateBulkCouponsInput!) {
|
|
43
|
+
generateBulkCoupons(input: $input) { ${GROUP_FIELDS} }
|
|
44
|
+
}
|
|
45
|
+
`;
|
|
46
|
+
export const ACTIVATE_BULK_COUPON_CODE_MUTATION = /* GraphQL */ `
|
|
47
|
+
mutation ActivateBulkCouponCode($id: ID!) {
|
|
48
|
+
activateBulkCouponCode(id: $id) { ${CODE_FIELDS} }
|
|
49
|
+
}
|
|
50
|
+
`;
|
|
51
|
+
export const DEACTIVATE_BULK_COUPON_CODE_MUTATION = /* GraphQL */ `
|
|
52
|
+
mutation DeactivateBulkCouponCode($id: ID!) {
|
|
53
|
+
deactivateBulkCouponCode(id: $id) { ${CODE_FIELDS} }
|
|
54
|
+
}
|
|
55
|
+
`;
|
|
56
|
+
export const DEACTIVATE_BULK_COUPON_GROUP_MUTATION = /* GraphQL */ `
|
|
57
|
+
mutation DeactivateBulkCouponGroup($groupId: ID!) {
|
|
58
|
+
deactivateBulkCouponGroup(groupId: $groupId)
|
|
59
|
+
}
|
|
60
|
+
`;
|
|
61
|
+
export const DELETE_BULK_COUPON_GROUP_MUTATION = /* GraphQL */ `
|
|
62
|
+
mutation DeleteBulkCouponGroup($groupId: ID!) {
|
|
63
|
+
deleteBulkCouponGroup(groupId: $groupId)
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
66
|
+
/** A mutation, though it writes nothing: the plugin declares it so (`ReadPromotion`). */
|
|
67
|
+
export const EXPORT_BULK_COUPON_CODES_MUTATION = /* GraphQL */ `
|
|
68
|
+
mutation ExportBulkCouponCodes($groupId: ID!) {
|
|
69
|
+
exportBulkCouponCodes(groupId: $groupId)
|
|
70
|
+
}
|
|
71
|
+
`;
|
|
72
|
+
/** A `Boolean!` door's answer: anything but `true` is refused, never taken as done. */
|
|
73
|
+
function assertDone(field, answer) {
|
|
74
|
+
if (answer === true)
|
|
75
|
+
return;
|
|
76
|
+
throw new UpstreamError({
|
|
77
|
+
code: 'UNEXPECTED_RESPONSE',
|
|
78
|
+
message: `The engine answered "${field}" with ${JSON.stringify(answer)}, not true.`,
|
|
79
|
+
status: 502,
|
|
80
|
+
service: 'vendure',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
export function createPricingBulkCouponsModule(transport) {
|
|
84
|
+
return {
|
|
85
|
+
groups(promotionId, options) {
|
|
86
|
+
return fieldOf(transport, BULK_COUPON_GROUPS_QUERY, 'bulkCouponGroups', { promotionId }, options);
|
|
87
|
+
},
|
|
88
|
+
codes(groupId, options) {
|
|
89
|
+
return vendureListPage(transport, BULK_COUPON_CODES_QUERY, 'bulkCouponCodes', (skip, take) => ({ groupId, options: { skip, take } }), options);
|
|
90
|
+
},
|
|
91
|
+
generate(input, options) {
|
|
92
|
+
return fieldOf(transport, GENERATE_BULK_COUPONS_MUTATION, 'generateBulkCoupons', { input }, options);
|
|
93
|
+
},
|
|
94
|
+
activate(codeId, options) {
|
|
95
|
+
return fieldOf(transport, ACTIVATE_BULK_COUPON_CODE_MUTATION, 'activateBulkCouponCode', { id: codeId }, options);
|
|
96
|
+
},
|
|
97
|
+
deactivate(codeId, options) {
|
|
98
|
+
return fieldOf(transport, DEACTIVATE_BULK_COUPON_CODE_MUTATION, 'deactivateBulkCouponCode', { id: codeId }, options);
|
|
99
|
+
},
|
|
100
|
+
async deactivateGroup(groupId, options) {
|
|
101
|
+
const field = 'deactivateBulkCouponGroup';
|
|
102
|
+
assertDone(field, await fieldOf(transport, DEACTIVATE_BULK_COUPON_GROUP_MUTATION, field, { groupId }, options));
|
|
103
|
+
},
|
|
104
|
+
async deleteGroup(groupId, options) {
|
|
105
|
+
const field = 'deleteBulkCouponGroup';
|
|
106
|
+
assertDone(field, await fieldOf(transport, DELETE_BULK_COUPON_GROUP_MUTATION, field, { groupId }, options));
|
|
107
|
+
},
|
|
108
|
+
export(groupId, options) {
|
|
109
|
+
return fieldOf(transport, EXPORT_BULK_COUPON_CODES_MUTATION, 'exportBulkCouponCodes', { groupId }, options);
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
package/dist/pricing/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type Page, type Transport } from '@sixtyninecommerce/core';
|
|
2
|
-
import type
|
|
3
|
-
import type { Call } from '../types.js';
|
|
2
|
+
import { type ConfigurableOperation, type ConfigurableOperationInput, type LanguageCode } from '../catalog/types.js';
|
|
3
|
+
import type { Call, ConfigurableOperationDefinition, ListOptions } from '../types.js';
|
|
4
|
+
import { type PricingBulkCouponsModule } from './bulk-coupons.js';
|
|
5
|
+
import { type PricingPriceListsModule } from './price-lists.js';
|
|
4
6
|
import { type PricingVouchersModule } from './vouchers.js';
|
|
5
7
|
/**
|
|
6
8
|
* Promotions at the register (headless spec §9.2 `pricing`; incentives spec §5,
|
|
@@ -36,6 +38,11 @@ export interface PricingModule {
|
|
|
36
38
|
coupons: PricingCouponsModule;
|
|
37
39
|
/** Personal vouchers: templates, issuing, a customer's vouchers (`./vouchers.ts`). */
|
|
38
40
|
vouchers: PricingVouchersModule;
|
|
41
|
+
/**
|
|
42
|
+
* The store's B2B price lists: the lists, their entries, assignments and order rules, and
|
|
43
|
+
* bulk enable/disable/delete (`./price-lists.ts`).
|
|
44
|
+
*/
|
|
45
|
+
priceLists: PricingPriceListsModule;
|
|
39
46
|
/**
|
|
40
47
|
* The order's discounts as they stand: its coupon codes, the order-level
|
|
41
48
|
* discounts, and each line's discounts, every one naming the promotion it came
|
|
@@ -45,6 +52,80 @@ export interface PricingModule {
|
|
|
45
52
|
discounts(orderId: string, options?: Call): Promise<OrderDiscounts>;
|
|
46
53
|
}
|
|
47
54
|
export interface PricingPromotionsModule {
|
|
55
|
+
/**
|
|
56
|
+
* One page of the store's promotions (`limit` 1 to 1,000, default 25), every state and date
|
|
57
|
+
* window: what a back office lists, unlike {@link active}. Walk them all with `for await`:
|
|
58
|
+
* every following page re-sends the same filters, sort and store.
|
|
59
|
+
*
|
|
60
|
+
* - `term` (trimmed; a blank one is ignored) matches a case-insensitive part of the name, in
|
|
61
|
+
* ANY of its languages, or of the coupon code. A row found through another language's name
|
|
62
|
+
* answers that language's `name`. EXCEPT while sorted by `name`: the engine then reads the
|
|
63
|
+
* name in the request's language only (the store's default language where a promotion has
|
|
64
|
+
* none in it), so a term matches no other language; sort by another key to search them all.
|
|
65
|
+
* - `enabled` keeps only the enabled (or disabled) ones; their date window is not judged.
|
|
66
|
+
* - `sort`: one key; the engine's own order when omitted.
|
|
67
|
+
*
|
|
68
|
+
* The store's auto-managed order-rule promotion is never listed (see {@link active}).
|
|
69
|
+
*
|
|
70
|
+
* Refused before sending: `INVALID_PAGE_SIZE` (`ValidationError`, 400) for a `limit` outside
|
|
71
|
+
* 1 to 1,000; `INVALID_PROMOTION_SORT` (`ValidationError`, 400) for a sort field or direction
|
|
72
|
+
* this method does not name; `INVALID_PROMOTION_FILTER` (`ValidationError`, 400) for a `term`
|
|
73
|
+
* that is not a string or an `enabled` that is not a boolean.
|
|
74
|
+
*
|
|
75
|
+
* @effect read
|
|
76
|
+
* @permission ReadPromotion
|
|
77
|
+
*/
|
|
78
|
+
list(options?: PromotionListOptions): Promise<Page<PromotionListItem>>;
|
|
79
|
+
/**
|
|
80
|
+
* One promotion of this store with its translations, conditions and actions as stored (the
|
|
81
|
+
* stacking guard included), or `null` when the store has none by that id (another store's
|
|
82
|
+
* answers the same).
|
|
83
|
+
*
|
|
84
|
+
* The store's auto-managed order-rule promotion (the id an "Order discount" on an order names)
|
|
85
|
+
* is answered with `customFields.managedBy` set: it is read-only, every change and the delete
|
|
86
|
+
* are refused `MANAGED_PROMOTION_NOT_ALLOWED`; its rules are set on the price lists
|
|
87
|
+
* (`priceLists.orderRules`). A merchant's promotion answers `managedBy: null`.
|
|
88
|
+
*
|
|
89
|
+
* @effect read
|
|
90
|
+
* @permission ReadPromotion
|
|
91
|
+
*/
|
|
92
|
+
get(id: string, options?: Call): Promise<PromotionDetail | null>;
|
|
93
|
+
/**
|
|
94
|
+
* Delete a promotion of this store. It stops applying: an order priced after the delete no
|
|
95
|
+
* longer gets its discount, and its coupon code (and every bulk code generated for it) is no
|
|
96
|
+
* longer accepted.
|
|
97
|
+
*
|
|
98
|
+
* Refusals: `ENTITY_NOT_FOUND` (`NotFoundError`, 404) for an id this store does not hold (one
|
|
99
|
+
* answer for another store's and an unknown one), `SHARED_PROMOTION_NOT_ALLOWED` (403) for a
|
|
100
|
+
* promotion other stores hold too, `MANAGED_PROMOTION_NOT_ALLOWED` (`PermissionDeniedError`,
|
|
101
|
+
* 403) for the store's auto-managed order-rule promotion, and `PROMOTION_NOT_DELETED`
|
|
102
|
+
* (`ConflictError`, 409) should the engine answer that it kept it.
|
|
103
|
+
*
|
|
104
|
+
* @effect destructive
|
|
105
|
+
* @permission DeletePromotion
|
|
106
|
+
*/
|
|
107
|
+
delete(id: string, options?: Call): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* The conditions a promotion of this store can carry, each with its arguments, in the
|
|
110
|
+
* language of the request. Two the engine registers are left out because a caller never sets
|
|
111
|
+
* them: the stacking guard (`promotion_stacking_guard`, which {@link create} and
|
|
112
|
+
* {@link update} add themselves) and the price-list order-rule condition
|
|
113
|
+
* (`price_list_order_rules`, refused on every promotion but the store's auto-managed one).
|
|
114
|
+
*
|
|
115
|
+
* `args[].required` is NOT the enforced rule (see `ConfigArgDefinition.required`).
|
|
116
|
+
*
|
|
117
|
+
* @effect read
|
|
118
|
+
* @permission ReadPromotion
|
|
119
|
+
*/
|
|
120
|
+
conditionDefinitions(options?: Call): Promise<ConfigurableOperationDefinition[]>;
|
|
121
|
+
/**
|
|
122
|
+
* The actions a promotion of this store can carry, as {@link conditionDefinitions} answers the
|
|
123
|
+
* conditions: the price-list order-rule action (`price_list_order_rules`) is left out.
|
|
124
|
+
*
|
|
125
|
+
* @effect read
|
|
126
|
+
* @permission ReadPromotion
|
|
127
|
+
*/
|
|
128
|
+
actionDefinitions(options?: Call): Promise<ConfigurableOperationDefinition[]>;
|
|
48
129
|
/**
|
|
49
130
|
* The store's promotions that can apply right now: enabled, inside their date
|
|
50
131
|
* window, not used up, and — with `customerId` — open to that customer (a
|
|
@@ -61,9 +142,17 @@ export interface PricingPromotionsModule {
|
|
|
61
142
|
* location of this store that the credential may act at
|
|
62
143
|
* (`LOCATION_NOT_IN_CHANNEL` / `LOCATION_NOT_ALLOWED`).
|
|
63
144
|
*
|
|
145
|
+
* The store's auto-managed order-rule promotion is never listed: it applies
|
|
146
|
+
* the order rules of the store's price lists (`priceLists.orderRules`), is no
|
|
147
|
+
* offer, and is managed by the platform. Its discount still shows on an order
|
|
148
|
+
* ("Order discount", {@link PricingOrdersModule.discounts}), naming that
|
|
149
|
+
* promotion's id.
|
|
150
|
+
*
|
|
64
151
|
* Needs `ReadPromotion`, `CreateOrder` or `OperatePos`. A `Page` because every
|
|
65
152
|
* list in this SDK is one; the engine answers the whole list, so it is always
|
|
66
153
|
* the last page.
|
|
154
|
+
*
|
|
155
|
+
* @effect read
|
|
67
156
|
*/
|
|
68
157
|
active(filter?: ActivePromotionsFilter, options?: Call): Promise<Page<ActivePromotion>>;
|
|
69
158
|
/**
|
|
@@ -85,12 +174,18 @@ export interface PricingPromotionsModule {
|
|
|
85
174
|
* targeting or set argument the engine cannot read, a second set condition or
|
|
86
175
|
* a set action without its condition (`argument: "conditions"`), or a set
|
|
87
176
|
* condition without its action or a second copy of a set action
|
|
88
|
-
* (`argument: "actions"`), judged on `update` for the pair the update leaves
|
|
177
|
+
* (`argument: "actions"`), judged on `update` for the pair the update leaves,
|
|
178
|
+
* or the price-list order-rule pair `price_list_order_rules`, which only the
|
|
179
|
+
* store's own auto-managed promotion carries (`argument: "conditions"` or
|
|
180
|
+
* `"actions"`: order rules are set on a price list); `extensions.details` names the condition and
|
|
89
181
|
* argument), `LOCATION_NOT_IN_CHANNEL` (a location of another store, or not
|
|
90
182
|
* an id), `LOCATION_NOT_ALLOWED` (outside the credential's location
|
|
91
183
|
* restriction), `FACET_VALUE_NOT_FOUND` / `COLLECTION_NOT_FOUND`
|
|
92
184
|
* (`NotFoundError`, 404: a set component names a facet value or collection
|
|
93
185
|
* this store does not have; another store's answers the same).
|
|
186
|
+
*
|
|
187
|
+
* @effect write
|
|
188
|
+
* @permission CreatePromotion
|
|
94
189
|
*/
|
|
95
190
|
create(input: CreatePromotionInput, options?: Call): Promise<PricingPromotion>;
|
|
96
191
|
/**
|
|
@@ -98,7 +193,10 @@ export interface PricingPromotionsModule {
|
|
|
98
193
|
* replace the whole list (the guard is kept as on create). Needs
|
|
99
194
|
* `UpdatePromotion`.
|
|
100
195
|
*
|
|
101
|
-
* Refusals: those of {@link PricingPromotionsModule.create},
|
|
196
|
+
* Refusals: those of {@link PricingPromotionsModule.create},
|
|
197
|
+
* `MANAGED_PROMOTION_NOT_ALLOWED` (`PermissionDeniedError`, 403) for the
|
|
198
|
+
* store's auto-managed order-rule promotion (the id an "Order discount" on an
|
|
199
|
+
* order names; change the price list's order rules instead), and
|
|
102
200
|
* `MISSING_CONDITIONS_ERROR` (`BusinessRuleError`, 422) for one case: the input
|
|
103
201
|
* does not name `conditions`, the STORED promotion has none (an imported
|
|
104
202
|
* coupon, a seed: no guard was ever added), and the result would have no coupon
|
|
@@ -106,6 +204,9 @@ export interface PricingPromotionsModule {
|
|
|
106
204
|
* conditions from the stored ones, and the guard is added only to conditions
|
|
107
205
|
* the input sends: send `conditions` (even `[]`) to keep such a promotion
|
|
108
206
|
* without a code.
|
|
207
|
+
*
|
|
208
|
+
* @effect write
|
|
209
|
+
* @permission UpdatePromotion
|
|
109
210
|
*/
|
|
110
211
|
update(input: UpdatePromotionInput, options?: Call): Promise<PricingPromotion>;
|
|
111
212
|
}
|
|
@@ -255,7 +356,71 @@ export interface PricingPromotion {
|
|
|
255
356
|
priority: number | null;
|
|
256
357
|
};
|
|
257
358
|
}
|
|
359
|
+
/** What {@link PricingPromotionsModule.list} can sort by. */
|
|
360
|
+
export type PromotionSortField = 'name' | 'couponCode' | 'startsAt' | 'endsAt' | 'createdAt' | 'updatedAt';
|
|
361
|
+
export declare const PROMOTION_SORT_FIELDS: readonly PromotionSortField[];
|
|
362
|
+
export interface PromotionListOptions extends ListOptions {
|
|
363
|
+
/**
|
|
364
|
+
* A part of the name (any language, unless sorted by `name`: see `list`) or of the coupon code,
|
|
365
|
+
* capitals ignored; trimmed.
|
|
366
|
+
*/
|
|
367
|
+
term?: string;
|
|
368
|
+
/** Only the enabled (`true`) or the disabled (`false`) ones. */
|
|
369
|
+
enabled?: boolean;
|
|
370
|
+
/** ONE sort key; the engine's own order when omitted. */
|
|
371
|
+
sort?: {
|
|
372
|
+
field: PromotionSortField;
|
|
373
|
+
direction: 'ASC' | 'DESC';
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
/** A promotion as {@link PricingPromotionsModule.list} answers it. */
|
|
377
|
+
export interface PromotionListItem {
|
|
378
|
+
id: string;
|
|
379
|
+
/** In the request's language, or the language whose name a `term` matched. */
|
|
380
|
+
name: string;
|
|
381
|
+
description: string;
|
|
382
|
+
couponCode: string | null;
|
|
383
|
+
enabled: boolean;
|
|
384
|
+
/** ISO-8601 instants; null for an open start or end. */
|
|
385
|
+
startsAt: string | null;
|
|
386
|
+
endsAt: string | null;
|
|
387
|
+
usageLimit: number | null;
|
|
388
|
+
perCustomerUsageLimit: number | null;
|
|
389
|
+
createdAt: string;
|
|
390
|
+
updatedAt: string;
|
|
391
|
+
customFields: {
|
|
392
|
+
combineWithB2b: boolean | null;
|
|
393
|
+
combineWithOtherPromotions: boolean | null;
|
|
394
|
+
priority: number | null;
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
/** A promotion as {@link PricingPromotionsModule.get} answers it. */
|
|
398
|
+
export interface PromotionDetail extends Omit<PromotionListItem, 'customFields'> {
|
|
399
|
+
translations: Array<{
|
|
400
|
+
id: string;
|
|
401
|
+
languageCode: LanguageCode;
|
|
402
|
+
name: string;
|
|
403
|
+
description: string;
|
|
404
|
+
}>;
|
|
405
|
+
/** As stored, the stacking guard (`promotion_stacking_guard`) included. */
|
|
406
|
+
conditions: ConfigurableOperation[];
|
|
407
|
+
actions: ConfigurableOperation[];
|
|
408
|
+
customFields: PromotionListItem['customFields'] & {
|
|
409
|
+
/**
|
|
410
|
+
* Set only on the store's auto-managed order-rule promotion (`price-list-order-rules`): a
|
|
411
|
+
* platform service owns it, and every change and the delete are refused. `null` for a
|
|
412
|
+
* merchant's promotion.
|
|
413
|
+
*/
|
|
414
|
+
managedBy: string | null;
|
|
415
|
+
};
|
|
416
|
+
}
|
|
258
417
|
export interface PricingCouponsModule {
|
|
418
|
+
/**
|
|
419
|
+
* Unique codes generated in bulk for a promotion with a coupon code (`./bulk-coupons.ts`):
|
|
420
|
+
* the groups, their codes, generating, switching a code or a group off, deleting a group, and
|
|
421
|
+
* a group's codes as CSV.
|
|
422
|
+
*/
|
|
423
|
+
bulk: PricingBulkCouponsModule;
|
|
259
424
|
/**
|
|
260
425
|
* Apply a coupon code — a promotion's own code or a unique code generated for
|
|
261
426
|
* it — to a DRAFT order of this store: a back-office draft, or an order
|
|
@@ -400,6 +565,11 @@ export declare const ORDER_DISCOUNTS_FIELDS = "\n id\n code\n state\n curren
|
|
|
400
565
|
export declare const ACTIVE_PROMOTIONS_QUERY = "\n query ActivePromotions($locationId: ID, $customerId: ID) {\n activePromotions(locationId: $locationId, customerId: $customerId) {\n id\n name\n description\n startsAt\n endsAt\n requiresCouponCode\n usageLimit\n perCustomerUsageLimit\n conditions { code args { name value } summary }\n actions { code args { name value } summary }\n summary\n }\n }\n";
|
|
401
566
|
export declare const CREATE_PROMOTION_MUTATION = "\n mutation CreatePromotion($input: CreatePromotionInput!) {\n createPromotion(input: $input) {\n ... on Promotion { \n id\n name\n description\n enabled\n couponCode\n startsAt\n endsAt\n usageLimit\n perCustomerUsageLimit\n conditions { code args { name value } }\n actions { code args { name value } }\n customFields { combineWithB2b combineWithOtherPromotions priority }\n }\n ... on ErrorResult { errorCode message }\n }\n }\n";
|
|
402
567
|
export declare const UPDATE_PROMOTION_MUTATION = "\n mutation UpdatePromotion($input: UpdatePromotionInput!) {\n updatePromotion(input: $input) {\n ... on Promotion { \n id\n name\n description\n enabled\n couponCode\n startsAt\n endsAt\n usageLimit\n perCustomerUsageLimit\n conditions { code args { name value } }\n actions { code args { name value } }\n customFields { combineWithB2b combineWithOtherPromotions priority }\n }\n ... on ErrorResult { errorCode message }\n }\n }\n";
|
|
568
|
+
export declare const PROMOTIONS_QUERY = "\n query StorePromotions($options: PromotionListOptions) {\n promotions(options: $options) {\n items {\n \n id\n name\n description\n couponCode\n enabled\n startsAt\n endsAt\n usageLimit\n perCustomerUsageLimit\n createdAt\n updatedAt\n\n customFields { combineWithB2b combineWithOtherPromotions priority }\n }\n totalItems\n }\n }\n";
|
|
569
|
+
export declare const PROMOTION_QUERY = "\n query StorePromotion($id: ID!) {\n promotion(id: $id) {\n \n id\n name\n description\n couponCode\n enabled\n startsAt\n endsAt\n usageLimit\n perCustomerUsageLimit\n createdAt\n updatedAt\n\n translations { id languageCode name description }\n conditions { code args { name value } }\n actions { code args { name value } }\n customFields { combineWithB2b combineWithOtherPromotions priority managedBy }\n }\n }\n";
|
|
570
|
+
export declare const DELETE_PROMOTION_MUTATION = "\n mutation DeleteStorePromotion($id: ID!) {\n deletePromotion(id: $id) {\n result\n message\n }\n }\n";
|
|
571
|
+
export declare const PROMOTION_CONDITION_DEFINITIONS_QUERY = "\n query PromotionConditionDefinitions {\n promotionConditions { \n code\n description\n args {\n name\n type\n list\n required\n defaultValue\n label\n description\n ui\n }\n }\n }\n";
|
|
572
|
+
export declare const PROMOTION_ACTION_DEFINITIONS_QUERY = "\n query PromotionActionDefinitions {\n promotionActions { \n code\n description\n args {\n name\n type\n list\n required\n defaultValue\n label\n description\n ui\n }\n }\n }\n";
|
|
403
573
|
/** The condition the dashboard and the admin app put on every promotion they save. */
|
|
404
574
|
export declare const STACKING_GUARD_CONDITION = "promotion_stacking_guard";
|
|
405
575
|
export declare const APPLY_COUPON_CODE_TO_ORDER_MUTATION = "\n mutation ApplyCouponCodeToOrder($orderId: ID!, $couponCode: String!, $idempotencyKey: String) {\n applyCouponCodeToOrder(\n orderId: $orderId\n couponCode: $couponCode\n idempotencyKey: $idempotencyKey\n ) {\n \n id\n code\n state\n currencyCode\n couponCodes\n subTotal\n subTotalWithTax\n shipping\n shippingWithTax\n total\n totalWithTax\n discounts { promotionId adjustmentSource type description amount amountWithTax }\n promotions { id name }\n lines {\n id\n quantity\n productVariant { id sku name }\n unitPrice\n unitPriceWithTax\n linePrice\n linePriceWithTax\n discountedLinePrice\n discountedLinePriceWithTax\n proratedLinePrice\n proratedLinePriceWithTax\n discounts { promotionId adjustmentSource type description amount amountWithTax }\n }\n surcharges { id description sku price priceWithTax }\n packages { promotionId label price priceWithTax lineIds quantity }\n\n }\n }\n";
|