@sixtyninecommerce/admin 0.9.0 → 0.11.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 +4598 -128
- 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/index.d.ts +9 -2
- package/dist/catalog/index.js +4 -0
- package/dist/catalog/products.d.ts +318 -17
- package/dist/catalog/products.js +182 -14
- package/dist/catalog/properties.d.ts +102 -14
- package/dist/catalog/properties.js +13 -0
- package/dist/catalog/recommendations.d.ts +261 -0
- package/dist/catalog/recommendations.js +145 -0
- package/dist/catalog/reviews.d.ts +368 -0
- package/dist/catalog/reviews.js +318 -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 +282 -25
- package/dist/catalog/variants.js +173 -25
- package/dist/catalog/visibility.d.ts +20 -5
- package/dist/catalog/visibility.js +19 -1
- package/dist/client.d.ts +116 -9
- package/dist/client.js +41 -7
- package/dist/content/assets.d.ts +286 -0
- package/dist/content/assets.js +181 -0
- package/dist/content/items.d.ts +269 -0
- package/dist/content/items.js +170 -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/groups.d.ts +207 -0
- package/dist/customers/groups.js +438 -0
- package/dist/customers/index.d.ts +447 -37
- package/dist/customers/index.js +313 -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/index.d.ts +731 -21
- package/dist/documents/index.js +436 -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 +121 -10
- package/dist/fulfillments/index.js +120 -2
- 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 +129 -30
- package/dist/index.js +47 -9
- 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 +423 -0
- package/dist/integrations/exact-online-types.js +6 -0
- package/dist/integrations/exact-online.d.ts +248 -0
- package/dist/integrations/exact-online.js +376 -0
- package/dist/integrations/index.d.ts +40 -0
- package/dist/integrations/index.js +24 -0
- package/dist/integrations/pipeline-keys.d.ts +13 -0
- package/dist/integrations/pipeline-keys.js +22 -0
- package/dist/integrations/pipelines.d.ts +114 -0
- package/dist/integrations/pipelines.js +46 -0
- package/dist/integrations/types.d.ts +322 -0
- package/dist/integrations/types.js +8 -0
- package/dist/jobs/bulk-action-run.d.ts +11 -2
- package/dist/jobs/bulk-action-run.js +4 -5
- package/dist/locations/index.d.ts +66 -0
- package/dist/locations/index.js +31 -0
- package/dist/meta/index.d.ts +162 -0
- package/dist/orders/bulk.d.ts +75 -0
- package/dist/orders/bulk.js +150 -0
- package/dist/orders/cancel-with-money.d.ts +227 -0
- package/dist/orders/cancel-with-money.js +153 -0
- package/dist/orders/commit-edit.d.ts +7 -1
- package/dist/orders/commit-edit.js +5 -1
- package/dist/orders/deposit-policy.d.ts +103 -0
- package/dist/orders/deposit-policy.js +202 -0
- 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 +125 -5
- package/dist/orders/index.js +35 -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 +222 -0
- package/dist/orders/list.js +377 -0
- package/dist/orders/manual-discounts.d.ts +11 -2
- package/dist/orders/manual-discounts.js +2 -0
- package/dist/orders/manual-pricing.d.ts +5 -0
- package/dist/orders/order-entry.d.ts +20 -7
- package/dist/orders/plan-edit.d.ts +1 -1
- package/dist/orders/plan-edit.js +4 -1
- 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 +8 -1
- package/dist/orders/surcharges.js +3 -2
- package/dist/payments/account-credit.d.ts +30 -0
- package/dist/payments/account-credit.js +19 -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 +12 -0
- package/dist/payments/credit-noted-fields.js +37 -0
- package/dist/payments/index.d.ts +263 -10
- package/dist/payments/index.js +133 -1
- package/dist/payments/methods.d.ts +332 -0
- package/dist/payments/methods.js +363 -0
- 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 +144 -0
- package/dist/payments/requests.js +92 -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 +104 -0
- package/dist/pickups/index.js +105 -0
- package/dist/platform/channels.d.ts +132 -0
- package/dist/platform/channels.js +128 -0
- package/dist/platform/geo.d.ts +123 -0
- package/dist/platform/geo.js +144 -0
- package/dist/platform/tax.d.ts +154 -0
- package/dist/platform/tax.js +139 -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 +103 -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 +2125 -32
- package/dist/pos/index.js +742 -4
- package/dist/pos/no-receipt.d.ts +94 -0
- package/dist/pos/no-receipt.js +25 -0
- package/dist/pos/offline-sales.d.ts +187 -0
- package/dist/pos/offline-sales.js +116 -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 +217 -0
- package/dist/pos/returns.js +53 -0
- package/dist/pricing/bulk-coupons.d.ts +139 -0
- package/dist/pricing/bulk-coupons.js +112 -0
- package/dist/pricing/index.d.ts +177 -4
- package/dist/pricing/index.js +176 -1
- package/dist/pricing/price-lists.d.ts +604 -0
- package/dist/pricing/price-lists.js +600 -0
- package/dist/pricing/vouchers.d.ts +103 -0
- package/dist/pricing/vouchers.js +69 -0
- package/dist/purchasing/alerts.d.ts +89 -0
- package/dist/purchasing/alerts.js +62 -0
- package/dist/purchasing/cost.d.ts +110 -0
- package/dist/purchasing/cost.js +86 -0
- package/dist/purchasing/index.d.ts +36 -0
- package/dist/purchasing/index.js +16 -0
- package/dist/purchasing/purchase-orders.d.ts +548 -0
- package/dist/purchasing/purchase-orders.js +491 -0
- package/dist/purchasing/replenishment.d.ts +281 -0
- package/dist/purchasing/replenishment.js +240 -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 +501 -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 +818 -0
- package/dist/returns/index.js +844 -0
- package/dist/search/index.d.ts +174 -0
- package/dist/search/index.js +125 -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 +48 -0
- package/dist/shipping/index.js +25 -0
- package/dist/shipping/methods.d.ts +198 -0
- package/dist/shipping/methods.js +240 -0
- package/dist/shipping/myparcel.d.ts +254 -0
- package/dist/shipping/myparcel.js +178 -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 +179 -0
- package/dist/shipping/rate-tables.js +184 -0
- package/dist/stock/index.d.ts +10 -3
- package/dist/stock/index.js +3 -0
- package/dist/stock/locations.d.ts +144 -0
- package/dist/stock/locations.js +168 -0
- package/dist/stock/transfers.d.ts +216 -43
- package/dist/stock/transfers.js +140 -13
- package/dist/stored-value/index.d.ts +214 -4
- package/dist/stored-value/index.js +152 -0
- package/dist/subscriptions/index.d.ts +682 -0
- package/dist/subscriptions/index.js +815 -0
- package/dist/tax/index.d.ts +76 -1
- package/dist/tax/index.js +50 -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 +66 -0
- package/dist/tenant/email-templates.js +54 -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 +51 -4
- 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,281 @@
|
|
|
1
|
+
import { type Page, type Transport } from '@sixtyninecommerce/core';
|
|
2
|
+
import type { Call, ListOptions } from '../types.js';
|
|
3
|
+
import { type PurchaseOrder } from './purchase-orders.js';
|
|
4
|
+
/** The variant a rule or suggestion names, as the active store sees it. */
|
|
5
|
+
export interface ReplenishmentVariant {
|
|
6
|
+
id: string;
|
|
7
|
+
sku: string;
|
|
8
|
+
name: string;
|
|
9
|
+
}
|
|
10
|
+
/** The stock location a rule or suggestion names. */
|
|
11
|
+
export interface ReplenishmentLocation {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A reorder rule for one variant at one stock location of the legal entity (purchase-orders spec
|
|
17
|
+
* §8.13): a reorder point and an order-up-to level, or only the days of demand a sales-velocity
|
|
18
|
+
* suggestion covers. Quantities in base units (the variant's stock units).
|
|
19
|
+
*/
|
|
20
|
+
export interface ReplenishmentRule {
|
|
21
|
+
id: string;
|
|
22
|
+
/** The legal entity's id, or `sandbox:<channelId>` for a sandbox store, which purchases alone. */
|
|
23
|
+
scopeId: string;
|
|
24
|
+
legalEntityId: string | null;
|
|
25
|
+
productVariantId: string;
|
|
26
|
+
/** Null when the active store does not hold the variant (another store of the entity set it). */
|
|
27
|
+
productVariant: ReplenishmentVariant | null;
|
|
28
|
+
stockLocationId: string;
|
|
29
|
+
/** Null when the location has been removed since. */
|
|
30
|
+
stockLocation: ReplenishmentLocation | null;
|
|
31
|
+
/** At or below it the pair is reordered up to `maxQuantity`. */
|
|
32
|
+
minQuantity: number | null;
|
|
33
|
+
maxQuantity: number | null;
|
|
34
|
+
/** Days of demand a velocity suggestion covers; ignored when the min/max pair is set. */
|
|
35
|
+
coverDays: number | null;
|
|
36
|
+
/** A switched-off rule is computed as if there were none (the sales-velocity fallback). */
|
|
37
|
+
enabled: boolean;
|
|
38
|
+
/** ISO-8601 UTC. */
|
|
39
|
+
createdAt: string;
|
|
40
|
+
updatedAt: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A rule's terms (a PUT): the quantities given replace the rule's, one left out or null is unset,
|
|
44
|
+
* `enabled` is true unless given. `minQuantity` and `maxQuantity` go together.
|
|
45
|
+
*/
|
|
46
|
+
export interface ReplenishmentRuleFields {
|
|
47
|
+
minQuantity?: number | null;
|
|
48
|
+
maxQuantity?: number | null;
|
|
49
|
+
coverDays?: number | null;
|
|
50
|
+
enabled?: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface ReplenishmentRuleListOptions extends ListOptions {
|
|
53
|
+
productVariantId?: string;
|
|
54
|
+
stockLocationId?: string;
|
|
55
|
+
enabled?: boolean;
|
|
56
|
+
}
|
|
57
|
+
/** The preferred supplier of a suggestion. */
|
|
58
|
+
export interface ReplenishmentSupplier {
|
|
59
|
+
id: string;
|
|
60
|
+
code: string;
|
|
61
|
+
name: string;
|
|
62
|
+
status: string;
|
|
63
|
+
currencyCode: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* A reorder suggestion: what the last compute found short at one stock location for one variant,
|
|
67
|
+
* grouped by the preferred supplier (`supplierId` null: choose one) and the location.
|
|
68
|
+
*/
|
|
69
|
+
export interface ReplenishmentSuggestion {
|
|
70
|
+
id: string;
|
|
71
|
+
scopeId: string;
|
|
72
|
+
legalEntityId: string | null;
|
|
73
|
+
stockLocationId: string;
|
|
74
|
+
/** Null when the location has been removed since. */
|
|
75
|
+
stockLocation: ReplenishmentLocation | null;
|
|
76
|
+
productVariantId: string;
|
|
77
|
+
productVariant: ReplenishmentVariant | null;
|
|
78
|
+
supplierId: string | null;
|
|
79
|
+
supplier: ReplenishmentSupplier | null;
|
|
80
|
+
supplierItemId: string | null;
|
|
81
|
+
/** `min_max` or `velocity`. A string on the wire: more methods may come. */
|
|
82
|
+
method: 'min_max' | 'velocity' | (string & {});
|
|
83
|
+
/** On hand minus allocated at the location. */
|
|
84
|
+
available: number;
|
|
85
|
+
/**
|
|
86
|
+
* On order at the location: every sent purchase order's remainder, confirmed or not, and the
|
|
87
|
+
* open lines an ERP mirrors (`stock.position`'s `onOrder`).
|
|
88
|
+
*/
|
|
89
|
+
onOrder: number;
|
|
90
|
+
/** Open backorders attributed to the location. */
|
|
91
|
+
backordered: number;
|
|
92
|
+
/**
|
|
93
|
+
* Base units already on this legal entity's purchase orders for the pair that are not with the
|
|
94
|
+
* supplier yet (draft, awaiting approval, approved): shown, never subtracted. Read when the
|
|
95
|
+
* suggestion is answered.
|
|
96
|
+
*/
|
|
97
|
+
inDraft: number;
|
|
98
|
+
target: number;
|
|
99
|
+
/** What the suggested order brings in: the purchase quantity times the purchase unit. */
|
|
100
|
+
suggestedBaseQuantity: number;
|
|
101
|
+
/** In the preferred supplier item's purchase units, rounded up to its minimum and multiple. */
|
|
102
|
+
suggestedPurchaseQuantity: number;
|
|
103
|
+
/**
|
|
104
|
+
* Every input of the maths (`version` 1): `stock`, `demand`, `rule`, `velocity`, `leadTime`,
|
|
105
|
+
* `reorderPoint`, `target`, `need`, `supplier`, `purchaseUnit`, `rounding`.
|
|
106
|
+
*/
|
|
107
|
+
explanation: Record<string, unknown>;
|
|
108
|
+
/** Not suggested by the previous compute, or its quantity rose since. */
|
|
109
|
+
isNew: boolean;
|
|
110
|
+
/** ISO-8601 UTC. */
|
|
111
|
+
computedAt: string;
|
|
112
|
+
/** `YYYY-MM-DD` in the legal entity's zone: dismissed through that day; null when not. */
|
|
113
|
+
dismissedUntil: string | null;
|
|
114
|
+
}
|
|
115
|
+
export interface ReplenishmentSuggestionListOptions extends ListOptions {
|
|
116
|
+
stockLocationId?: string;
|
|
117
|
+
supplierId?: string;
|
|
118
|
+
/** Only the suggestions without a supplier (the "Choose supplier" group). */
|
|
119
|
+
withoutSupplier?: boolean;
|
|
120
|
+
productVariantId?: string;
|
|
121
|
+
/** Dismissed suggestions too; they are left out by default. */
|
|
122
|
+
includeDismissed?: boolean;
|
|
123
|
+
}
|
|
124
|
+
/** What a compute found. */
|
|
125
|
+
export interface ReplenishmentComputeResult {
|
|
126
|
+
/** ISO-8601 UTC. */
|
|
127
|
+
computedAt: string;
|
|
128
|
+
/** `YYYY-MM-DD` in the legal entity's zone. */
|
|
129
|
+
localDay: string;
|
|
130
|
+
timeZone: string;
|
|
131
|
+
locations: number;
|
|
132
|
+
suggestions: number;
|
|
133
|
+
newSuggestions: number;
|
|
134
|
+
dismissed: number;
|
|
135
|
+
/** Locations the compute could not plan for (`LOCATION_OWNER_AMBIGUOUS`). */
|
|
136
|
+
skippedLocations: Array<{
|
|
137
|
+
stockLocationId: string;
|
|
138
|
+
reason: string;
|
|
139
|
+
}>;
|
|
140
|
+
}
|
|
141
|
+
/** One suggestion to order, with the quantity that replaces the suggested one. */
|
|
142
|
+
export interface ReplenishmentDraftLine {
|
|
143
|
+
suggestionId: string;
|
|
144
|
+
/** Purchase units of the suggestion's supplier item; the suggested quantity when left out. */
|
|
145
|
+
purchaseQuantity?: number;
|
|
146
|
+
}
|
|
147
|
+
/** What `suggestions.createDrafts` raised. */
|
|
148
|
+
export interface ReplenishmentDrafts {
|
|
149
|
+
/**
|
|
150
|
+
* The draft purchase orders, one per supplier and stock location, in the supplier's currency,
|
|
151
|
+
* each line priced from its supplier item's break for the quantity (unpriced when none
|
|
152
|
+
* applies). They stay drafts.
|
|
153
|
+
*/
|
|
154
|
+
purchaseOrders: PurchaseOrder[];
|
|
155
|
+
/** How many suggestions they order (one line each). */
|
|
156
|
+
lines: number;
|
|
157
|
+
}
|
|
158
|
+
/** `rules.import`: reorder rules as CSV text (purchase-orders D100). */
|
|
159
|
+
export interface ReplenishmentRuleImportInput {
|
|
160
|
+
/**
|
|
161
|
+
* The file's text: a header row naming the columns `sku`, `location`, `minQuantity`,
|
|
162
|
+
* `maxQuantity`, `coverDays`, `enabled` (any case; `min_quantity` and `Min Quantity` read as
|
|
163
|
+
* `minQuantity`), then one rule per row, the whole rule of a variant at a stock location.
|
|
164
|
+
* `location` is a stock location's id or name. Comma, semicolon or tab separated. At most 5000
|
|
165
|
+
* rows.
|
|
166
|
+
*/
|
|
167
|
+
content: string;
|
|
168
|
+
/** Check every row as the import would, write nothing. */
|
|
169
|
+
dryRun?: boolean;
|
|
170
|
+
}
|
|
171
|
+
/** One row of a reorder-rule import. */
|
|
172
|
+
export interface ReplenishmentRuleImportRow {
|
|
173
|
+
/** The row's line in the file; the header is line 1. */
|
|
174
|
+
row: number;
|
|
175
|
+
sku: string | null;
|
|
176
|
+
location: string | null;
|
|
177
|
+
/** A string on the wire: more outcomes may come. */
|
|
178
|
+
outcome: 'created' | 'updated' | 'unchanged' | 'failed' | (string & {});
|
|
179
|
+
/** The rule the row set; null when it failed before one existed. */
|
|
180
|
+
ruleId: string | null;
|
|
181
|
+
/** Why the row failed: a refusal code (`REPLENISHMENT_INVALID`, `REPLENISHMENT_VARIANT_NOT_FOUND`, …). */
|
|
182
|
+
errorCode: string | null;
|
|
183
|
+
message: string | null;
|
|
184
|
+
}
|
|
185
|
+
/** What a reorder-rule import did, row by row. */
|
|
186
|
+
export interface ReplenishmentRuleImportResult {
|
|
187
|
+
dryRun: boolean;
|
|
188
|
+
/** `sha256` (hex) of the file as read, so a caller can recognise one it already sent. */
|
|
189
|
+
contentHash: string;
|
|
190
|
+
/** Header columns the import does not know and did not read (a typo shows up here). */
|
|
191
|
+
ignoredColumns: string[];
|
|
192
|
+
totalRows: number;
|
|
193
|
+
created: number;
|
|
194
|
+
updated: number;
|
|
195
|
+
unchanged: number;
|
|
196
|
+
failed: number;
|
|
197
|
+
/** Every row, in file order. */
|
|
198
|
+
rows: ReplenishmentRuleImportRow[];
|
|
199
|
+
}
|
|
200
|
+
export declare const REPLENISHMENT_RULE_FIELDS = "\n id\n scopeId\n legalEntityId\n productVariantId\n productVariant { id sku name }\n stockLocationId\n stockLocation { id name }\n minQuantity\n maxQuantity\n coverDays\n enabled\n createdAt\n updatedAt\n";
|
|
201
|
+
export declare const REPLENISHMENT_SUGGESTION_FIELDS = "\n id\n scopeId\n legalEntityId\n stockLocationId\n stockLocation { id name }\n productVariantId\n productVariant { id sku name }\n supplierId\n supplier { id code name status currencyCode }\n supplierItemId\n method\n available\n onOrder\n backordered\n inDraft\n target\n suggestedBaseQuantity\n suggestedPurchaseQuantity\n explanation\n isNew\n computedAt\n dismissedUntil\n";
|
|
202
|
+
export declare const REPLENISHMENT_RULES_QUERY = "\n query ReplenishmentRules($options: ReplenishmentRuleListOptions) {\n replenishmentRules(options: $options) {\n totalItems\n items { \n id\n scopeId\n legalEntityId\n productVariantId\n productVariant { id sku name }\n stockLocationId\n stockLocation { id name }\n minQuantity\n maxQuantity\n coverDays\n enabled\n createdAt\n updatedAt\n }\n }\n }\n";
|
|
203
|
+
export declare const UPSERT_REPLENISHMENT_RULE_MUTATION = "\n mutation UpsertReplenishmentRule($input: UpsertReplenishmentRuleInput!, $idempotencyKey: String) {\n upsertReplenishmentRule(input: $input, idempotencyKey: $idempotencyKey) { \n id\n scopeId\n legalEntityId\n productVariantId\n productVariant { id sku name }\n stockLocationId\n stockLocation { id name }\n minQuantity\n maxQuantity\n coverDays\n enabled\n createdAt\n updatedAt\n }\n }\n";
|
|
204
|
+
export declare const DELETE_REPLENISHMENT_RULE_MUTATION = "\n mutation DeleteReplenishmentRule($id: ID!, $idempotencyKey: String) {\n deleteReplenishmentRule(id: $id, idempotencyKey: $idempotencyKey)\n }\n";
|
|
205
|
+
export declare const REPLENISHMENT_SUGGESTIONS_QUERY = "\n query ReplenishmentSuggestions($options: ReplenishmentSuggestionListOptions) {\n replenishmentSuggestions(options: $options) {\n totalItems\n items { \n id\n scopeId\n legalEntityId\n stockLocationId\n stockLocation { id name }\n productVariantId\n productVariant { id sku name }\n supplierId\n supplier { id code name status currencyCode }\n supplierItemId\n method\n available\n onOrder\n backordered\n inDraft\n target\n suggestedBaseQuantity\n suggestedPurchaseQuantity\n explanation\n isNew\n computedAt\n dismissedUntil\n }\n }\n }\n";
|
|
206
|
+
export declare const COMPUTE_REPLENISHMENT_SUGGESTIONS_MUTATION = "\n mutation ComputeReplenishmentSuggestions($idempotencyKey: String) {\n computeReplenishmentSuggestions(idempotencyKey: $idempotencyKey) {\n computedAt\n localDay\n timeZone\n locations\n suggestions\n newSuggestions\n dismissed\n skippedLocations { stockLocationId reason }\n }\n }\n";
|
|
207
|
+
export declare const DISMISS_REPLENISHMENT_SUGGESTION_MUTATION = "\n mutation DismissReplenishmentSuggestion($id: ID!, $until: String, $idempotencyKey: String) {\n dismissReplenishmentSuggestion(id: $id, until: $until, idempotencyKey: $idempotencyKey) {\n \n id\n scopeId\n legalEntityId\n stockLocationId\n stockLocation { id name }\n productVariantId\n productVariant { id sku name }\n supplierId\n supplier { id code name status currencyCode }\n supplierItemId\n method\n available\n onOrder\n backordered\n inDraft\n target\n suggestedBaseQuantity\n suggestedPurchaseQuantity\n explanation\n isNew\n computedAt\n dismissedUntil\n\n }\n }\n";
|
|
208
|
+
export declare const CREATE_REPLENISHMENT_DRAFTS_MUTATION = "\n mutation CreateReplenishmentDrafts(\n $input: CreateReplenishmentDraftsInput!\n $idempotencyKey: String\n ) {\n createReplenishmentDrafts(input: $input, idempotencyKey: $idempotencyKey) {\n lines\n purchaseOrders { \n \n id\n scopeId\n legalEntityId\n originChannelId\n code\n kind\n status\n supplierId\n supplier { id code name status }\n destinationStockLocationId\n destinationStockLocation { id name }\n currencyCode\n revision\n approvedRevision\n approvedAmount\n requestedDeliveryOn\n supplierReference\n notesToSupplier\n internalNotes\n managedBy\n externalId\n externalNumber\n externalApprovalStatus\n sentAt\n closedAt\n closeReason\n createdByRef\n total\n lineCount\n confirmation\n lines { \n id\n purchaseOrderId\n position\n productVariantId\n supplierItemId\n sku\n name\n supplierSku\n purchaseUnitLabel\n purchaseUnitFactor\n orderedQuantity\n orderedBaseQuantity\n cancelledBaseQuantity\n receivedBaseQuantity\n returnedForReplacementBaseQuantity\n unitPrice\n discountBps\n priceSource\n vatRateBps\n lineTotal\n requestedOn\n confirmedBaseQuantity\n confirmedOn\n confirmedAt\n externalLineId\n createdAt\n updatedAt\n }\n createdAt\n updatedAt\n\n statusHistory { id fromStatus status actorRef reason metadata createdAt }\n revisions {\n id\n revision\n state\n diff\n totalAfter\n createdByRef\n createdAt\n appliedAt\n sentAt\n sentVia\n }\n }\n }\n }\n";
|
|
209
|
+
export declare const IMPORT_REPLENISHMENT_RULES_MUTATION = "\n mutation ImportReplenishmentRules(\n $input: ImportReplenishmentRulesInput!\n $idempotencyKey: String\n ) {\n importReplenishmentRules(input: $input, idempotencyKey: $idempotencyKey) {\n dryRun\n contentHash\n ignoredColumns\n totalRows\n created\n updated\n unchanged\n failed\n rows { row sku location outcome ruleId errorCode message }\n }\n }\n";
|
|
210
|
+
export interface ReplenishmentRulesModule {
|
|
211
|
+
/**
|
|
212
|
+
* The legal entity's reorder rules, by location then variant SKU. Pages default to 50; walking
|
|
213
|
+
* on with `.next()` or `for await` reaches every one. A credential restricted to locations sees
|
|
214
|
+
* only theirs.
|
|
215
|
+
*/
|
|
216
|
+
list(options?: ReplenishmentRuleListOptions): Promise<Page<ReplenishmentRule>>;
|
|
217
|
+
/**
|
|
218
|
+
* Sets the rule of one variant at one stock location (a PUT). Refusals:
|
|
219
|
+
* `REPLENISHMENT_VARIANT_NOT_FOUND` and `REPLENISHMENT_LOCATION_NOT_FOUND` (404),
|
|
220
|
+
* `REPLENISHMENT_INVALID` (400), `LOCATION_OWNER_AMBIGUOUS` (422), `LOCATION_NOT_ALLOWED` and
|
|
221
|
+
* `SHARED_SELLER_NOT_ALLOWED` (403).
|
|
222
|
+
*/
|
|
223
|
+
upsert(productVariantId: string, stockLocationId: string, fields: ReplenishmentRuleFields, call?: Call): Promise<ReplenishmentRule>;
|
|
224
|
+
/** True once removed. Refusals: `REPLENISHMENT_RULE_NOT_FOUND` (404). */
|
|
225
|
+
delete(id: string, call?: Call): Promise<boolean>;
|
|
226
|
+
/**
|
|
227
|
+
* Sets reorder rules from a CSV file (purchase-orders D100), each row the whole rule of a
|
|
228
|
+
* variant at a stock location, through the same rules as `upsert`. Every row is answered
|
|
229
|
+
* `created`, `updated`, `unchanged` or `failed` with its code (`REPLENISHMENT_VARIANT_NOT_FOUND`,
|
|
230
|
+
* `REPLENISHMENT_LOCATION_NOT_FOUND`, `REPLENISHMENT_INVALID`, `LOCATION_OWNER_AMBIGUOUS`,
|
|
231
|
+
* `LOCATION_NOT_ALLOWED`); a failed row fails alone. Importing the same file again answers every
|
|
232
|
+
* row `unchanged` and writes nothing. Refusals of the whole file: `REPLENISHMENT_INVALID` (400:
|
|
233
|
+
* not CSV, no `sku` or `location` column, a column twice, no rows, more than 5000 rows).
|
|
234
|
+
*/
|
|
235
|
+
import(input: ReplenishmentRuleImportInput, call?: Call): Promise<ReplenishmentRuleImportResult>;
|
|
236
|
+
}
|
|
237
|
+
export interface ReplenishmentSuggestionsModule {
|
|
238
|
+
/**
|
|
239
|
+
* The legal entity's reorder suggestions from its last compute, grouped by supplier (the
|
|
240
|
+
* "Choose supplier" group last) then location. Dismissed ones are left out unless
|
|
241
|
+
* `includeDismissed`. Pages default to 50.
|
|
242
|
+
*/
|
|
243
|
+
list(options?: ReplenishmentSuggestionListOptions): Promise<Page<ReplenishmentSuggestion>>;
|
|
244
|
+
/** Computes the suggestions now, replacing the last compute's (the nightly run does the same). */
|
|
245
|
+
compute(call?: Call): Promise<ReplenishmentComputeResult>;
|
|
246
|
+
/**
|
|
247
|
+
* Dismisses a suggestion through a day (`YYYY-MM-DD` in the legal entity's zone, today to a year
|
|
248
|
+
* ahead); later computes keep it. `null` undoes it. Refusals: `REPLENISHMENT_SUGGESTION_NOT_FOUND`
|
|
249
|
+
* (404), `REPLENISHMENT_INVALID` (400).
|
|
250
|
+
*/
|
|
251
|
+
dismiss(id: string, until: string | null, call?: Call): Promise<ReplenishmentSuggestion>;
|
|
252
|
+
/**
|
|
253
|
+
* Raises draft purchase orders from suggestions (purchase-orders D101): one per supplier and
|
|
254
|
+
* stock location of the active store, each line the suggestion's purchase quantity (or the one
|
|
255
|
+
* given) in its supplier item's unit, priced from the item's price break for that quantity in
|
|
256
|
+
* the supplier's currency (unpriced when no break applies). The drafts stay drafts; the
|
|
257
|
+
* suggestions now show the quantities as `inDraft`. Needs `CreatePurchaseOrder`.
|
|
258
|
+
*
|
|
259
|
+
* Without `idempotencyKey` the selection itself is the key: sending the same suggestions with
|
|
260
|
+
* the same quantities again (in any order) answers the same drafts instead of raising more, for
|
|
261
|
+
* 24 hours or until the next compute, even when those drafts were cancelled since; a refused
|
|
262
|
+
* selection is not kept (fix the cause and send it again). To raise a selection again on
|
|
263
|
+
* purpose, send a key of your own per attempt.
|
|
264
|
+
*
|
|
265
|
+
* Refusals: `REPLENISHMENT_SUGGESTION_NOT_FOUND` (404: a compute replaced it; list again),
|
|
266
|
+
* `REPLENISHMENT_INVALID` (400: a suggestion in the Choose supplier group, no lines, more than
|
|
267
|
+
* 500, a quantity out of range), `LOCATION_NOT_IN_CHANNEL` (400: a location the active store
|
|
268
|
+
* does not hold; draft it from a store that does), `LOCATION_NOT_ALLOWED` and
|
|
269
|
+
* `SHARED_SELLER_NOT_ALLOWED` (403), `SUPPLIER_ARCHIVED` (422).
|
|
270
|
+
*/
|
|
271
|
+
createDrafts(lines: ReplenishmentDraftLine[], call?: Call): Promise<ReplenishmentDrafts>;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* `admin.purchasing.replenishment`: the legal entity's reorder rules (with the CSV import) and
|
|
275
|
+
* its reorder suggestions (with the draft purchase orders they raise).
|
|
276
|
+
*/
|
|
277
|
+
export interface PurchasingReplenishmentModule {
|
|
278
|
+
rules: ReplenishmentRulesModule;
|
|
279
|
+
suggestions: ReplenishmentSuggestionsModule;
|
|
280
|
+
}
|
|
281
|
+
export declare function createPurchasingReplenishmentModule(transport: Transport): PurchasingReplenishmentModule;
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { pageFromVendureList, readOffsetCursor, } from '@sixtyninecommerce/core';
|
|
2
|
+
import { PURCHASE_ORDER_FIELDS } from './purchase-orders.js';
|
|
3
|
+
export const REPLENISHMENT_RULE_FIELDS = /* GraphQL */ `
|
|
4
|
+
id
|
|
5
|
+
scopeId
|
|
6
|
+
legalEntityId
|
|
7
|
+
productVariantId
|
|
8
|
+
productVariant { id sku name }
|
|
9
|
+
stockLocationId
|
|
10
|
+
stockLocation { id name }
|
|
11
|
+
minQuantity
|
|
12
|
+
maxQuantity
|
|
13
|
+
coverDays
|
|
14
|
+
enabled
|
|
15
|
+
createdAt
|
|
16
|
+
updatedAt
|
|
17
|
+
`;
|
|
18
|
+
export const REPLENISHMENT_SUGGESTION_FIELDS = /* GraphQL */ `
|
|
19
|
+
id
|
|
20
|
+
scopeId
|
|
21
|
+
legalEntityId
|
|
22
|
+
stockLocationId
|
|
23
|
+
stockLocation { id name }
|
|
24
|
+
productVariantId
|
|
25
|
+
productVariant { id sku name }
|
|
26
|
+
supplierId
|
|
27
|
+
supplier { id code name status currencyCode }
|
|
28
|
+
supplierItemId
|
|
29
|
+
method
|
|
30
|
+
available
|
|
31
|
+
onOrder
|
|
32
|
+
backordered
|
|
33
|
+
inDraft
|
|
34
|
+
target
|
|
35
|
+
suggestedBaseQuantity
|
|
36
|
+
suggestedPurchaseQuantity
|
|
37
|
+
explanation
|
|
38
|
+
isNew
|
|
39
|
+
computedAt
|
|
40
|
+
dismissedUntil
|
|
41
|
+
`;
|
|
42
|
+
export const REPLENISHMENT_RULES_QUERY = /* GraphQL */ `
|
|
43
|
+
query ReplenishmentRules($options: ReplenishmentRuleListOptions) {
|
|
44
|
+
replenishmentRules(options: $options) {
|
|
45
|
+
totalItems
|
|
46
|
+
items { ${REPLENISHMENT_RULE_FIELDS} }
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
export const UPSERT_REPLENISHMENT_RULE_MUTATION = /* GraphQL */ `
|
|
51
|
+
mutation UpsertReplenishmentRule($input: UpsertReplenishmentRuleInput!, $idempotencyKey: String) {
|
|
52
|
+
upsertReplenishmentRule(input: $input, idempotencyKey: $idempotencyKey) { ${REPLENISHMENT_RULE_FIELDS} }
|
|
53
|
+
}
|
|
54
|
+
`;
|
|
55
|
+
export const DELETE_REPLENISHMENT_RULE_MUTATION = /* GraphQL */ `
|
|
56
|
+
mutation DeleteReplenishmentRule($id: ID!, $idempotencyKey: String) {
|
|
57
|
+
deleteReplenishmentRule(id: $id, idempotencyKey: $idempotencyKey)
|
|
58
|
+
}
|
|
59
|
+
`;
|
|
60
|
+
export const REPLENISHMENT_SUGGESTIONS_QUERY = /* GraphQL */ `
|
|
61
|
+
query ReplenishmentSuggestions($options: ReplenishmentSuggestionListOptions) {
|
|
62
|
+
replenishmentSuggestions(options: $options) {
|
|
63
|
+
totalItems
|
|
64
|
+
items { ${REPLENISHMENT_SUGGESTION_FIELDS} }
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
`;
|
|
68
|
+
export const COMPUTE_REPLENISHMENT_SUGGESTIONS_MUTATION = /* GraphQL */ `
|
|
69
|
+
mutation ComputeReplenishmentSuggestions($idempotencyKey: String) {
|
|
70
|
+
computeReplenishmentSuggestions(idempotencyKey: $idempotencyKey) {
|
|
71
|
+
computedAt
|
|
72
|
+
localDay
|
|
73
|
+
timeZone
|
|
74
|
+
locations
|
|
75
|
+
suggestions
|
|
76
|
+
newSuggestions
|
|
77
|
+
dismissed
|
|
78
|
+
skippedLocations { stockLocationId reason }
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
`;
|
|
82
|
+
export const DISMISS_REPLENISHMENT_SUGGESTION_MUTATION = /* GraphQL */ `
|
|
83
|
+
mutation DismissReplenishmentSuggestion($id: ID!, $until: String, $idempotencyKey: String) {
|
|
84
|
+
dismissReplenishmentSuggestion(id: $id, until: $until, idempotencyKey: $idempotencyKey) {
|
|
85
|
+
${REPLENISHMENT_SUGGESTION_FIELDS}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
`;
|
|
89
|
+
export const CREATE_REPLENISHMENT_DRAFTS_MUTATION = /* GraphQL */ `
|
|
90
|
+
mutation CreateReplenishmentDrafts(
|
|
91
|
+
$input: CreateReplenishmentDraftsInput!
|
|
92
|
+
$idempotencyKey: String
|
|
93
|
+
) {
|
|
94
|
+
createReplenishmentDrafts(input: $input, idempotencyKey: $idempotencyKey) {
|
|
95
|
+
lines
|
|
96
|
+
purchaseOrders { ${PURCHASE_ORDER_FIELDS} }
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
`;
|
|
100
|
+
export const IMPORT_REPLENISHMENT_RULES_MUTATION = /* GraphQL */ `
|
|
101
|
+
mutation ImportReplenishmentRules(
|
|
102
|
+
$input: ImportReplenishmentRulesInput!
|
|
103
|
+
$idempotencyKey: String
|
|
104
|
+
) {
|
|
105
|
+
importReplenishmentRules(input: $input, idempotencyKey: $idempotencyKey) {
|
|
106
|
+
dryRun
|
|
107
|
+
contentHash
|
|
108
|
+
ignoredColumns
|
|
109
|
+
totalRows
|
|
110
|
+
created
|
|
111
|
+
updated
|
|
112
|
+
unchanged
|
|
113
|
+
failed
|
|
114
|
+
rows { row sku location outcome ruleId errorCode message }
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
`;
|
|
118
|
+
const DEFAULT_PAGE_SIZE = 50;
|
|
119
|
+
const RULE_FIELDS = ['minQuantity', 'maxQuantity', 'coverDays', 'enabled'];
|
|
120
|
+
const RULE_FILTERS = ['productVariantId', 'stockLocationId', 'enabled'];
|
|
121
|
+
const SUGGESTION_FILTERS = [
|
|
122
|
+
'stockLocationId',
|
|
123
|
+
'supplierId',
|
|
124
|
+
'withoutSupplier',
|
|
125
|
+
'productVariantId',
|
|
126
|
+
'includeDismissed',
|
|
127
|
+
];
|
|
128
|
+
/** Only the named fields, a field left out staying out (`null` is sent as `null`). */
|
|
129
|
+
function picked(input, fields) {
|
|
130
|
+
const out = {};
|
|
131
|
+
for (const field of fields) {
|
|
132
|
+
const value = input[field];
|
|
133
|
+
if (value !== undefined)
|
|
134
|
+
out[field] = value;
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
export function createPurchasingReplenishmentModule(transport) {
|
|
139
|
+
const rulesPage = async (skip, take, options) => {
|
|
140
|
+
const filters = options ? picked(options, RULE_FILTERS) : {};
|
|
141
|
+
const data = await transport.graphql({
|
|
142
|
+
api: 'admin',
|
|
143
|
+
query: REPLENISHMENT_RULES_QUERY,
|
|
144
|
+
variables: { options: { skip, take, ...filters } },
|
|
145
|
+
}, options);
|
|
146
|
+
return pageFromVendureList(data.replenishmentRules, skip, take, (cursor) => rulesPage(readOffsetCursor(cursor), take, options));
|
|
147
|
+
};
|
|
148
|
+
const suggestionsPage = async (skip, take, options) => {
|
|
149
|
+
const filters = options ? picked(options, SUGGESTION_FILTERS) : {};
|
|
150
|
+
const data = await transport.graphql({
|
|
151
|
+
api: 'admin',
|
|
152
|
+
query: REPLENISHMENT_SUGGESTIONS_QUERY,
|
|
153
|
+
variables: { options: { skip, take, ...filters } },
|
|
154
|
+
}, options);
|
|
155
|
+
return pageFromVendureList(data.replenishmentSuggestions, skip, take, (cursor) => suggestionsPage(readOffsetCursor(cursor), take, options));
|
|
156
|
+
};
|
|
157
|
+
return {
|
|
158
|
+
rules: {
|
|
159
|
+
async list(options) {
|
|
160
|
+
const take = options?.limit ?? DEFAULT_PAGE_SIZE;
|
|
161
|
+
const skip = options?.after === undefined ? 0 : readOffsetCursor(options.after);
|
|
162
|
+
return rulesPage(skip, take, options);
|
|
163
|
+
},
|
|
164
|
+
async upsert(productVariantId, stockLocationId, fields, call) {
|
|
165
|
+
const data = await transport.graphql({
|
|
166
|
+
api: 'admin',
|
|
167
|
+
query: UPSERT_REPLENISHMENT_RULE_MUTATION,
|
|
168
|
+
variables: {
|
|
169
|
+
input: { ...picked(fields, RULE_FIELDS), productVariantId, stockLocationId },
|
|
170
|
+
idempotencyKey: call?.idempotencyKey,
|
|
171
|
+
},
|
|
172
|
+
}, call);
|
|
173
|
+
return data.upsertReplenishmentRule;
|
|
174
|
+
},
|
|
175
|
+
async delete(id, call) {
|
|
176
|
+
const data = await transport.graphql({
|
|
177
|
+
api: 'admin',
|
|
178
|
+
query: DELETE_REPLENISHMENT_RULE_MUTATION,
|
|
179
|
+
variables: { id, idempotencyKey: call?.idempotencyKey },
|
|
180
|
+
}, call);
|
|
181
|
+
return data.deleteReplenishmentRule;
|
|
182
|
+
},
|
|
183
|
+
async import(input, call) {
|
|
184
|
+
const data = await transport.graphql({
|
|
185
|
+
api: 'admin',
|
|
186
|
+
query: IMPORT_REPLENISHMENT_RULES_MUTATION,
|
|
187
|
+
variables: {
|
|
188
|
+
input: {
|
|
189
|
+
content: input.content,
|
|
190
|
+
...(input.dryRun === undefined ? {} : { dryRun: input.dryRun }),
|
|
191
|
+
},
|
|
192
|
+
idempotencyKey: call?.idempotencyKey,
|
|
193
|
+
},
|
|
194
|
+
}, call);
|
|
195
|
+
return data.importReplenishmentRules;
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
suggestions: {
|
|
199
|
+
async list(options) {
|
|
200
|
+
const take = options?.limit ?? DEFAULT_PAGE_SIZE;
|
|
201
|
+
const skip = options?.after === undefined ? 0 : readOffsetCursor(options.after);
|
|
202
|
+
return suggestionsPage(skip, take, options);
|
|
203
|
+
},
|
|
204
|
+
async compute(call) {
|
|
205
|
+
const data = await transport.graphql({
|
|
206
|
+
api: 'admin',
|
|
207
|
+
query: COMPUTE_REPLENISHMENT_SUGGESTIONS_MUTATION,
|
|
208
|
+
variables: { idempotencyKey: call?.idempotencyKey },
|
|
209
|
+
}, call);
|
|
210
|
+
return data.computeReplenishmentSuggestions;
|
|
211
|
+
},
|
|
212
|
+
async dismiss(id, until, call) {
|
|
213
|
+
const data = await transport.graphql({
|
|
214
|
+
api: 'admin',
|
|
215
|
+
query: DISMISS_REPLENISHMENT_SUGGESTION_MUTATION,
|
|
216
|
+
variables: { id, until, idempotencyKey: call?.idempotencyKey },
|
|
217
|
+
}, call);
|
|
218
|
+
return data.dismissReplenishmentSuggestion;
|
|
219
|
+
},
|
|
220
|
+
async createDrafts(lines, call) {
|
|
221
|
+
const data = await transport.graphql({
|
|
222
|
+
api: 'admin',
|
|
223
|
+
query: CREATE_REPLENISHMENT_DRAFTS_MUTATION,
|
|
224
|
+
variables: {
|
|
225
|
+
input: {
|
|
226
|
+
lines: lines.map((line) => ({
|
|
227
|
+
suggestionId: line.suggestionId,
|
|
228
|
+
...(line.purchaseQuantity === undefined
|
|
229
|
+
? {}
|
|
230
|
+
: { purchaseQuantity: line.purchaseQuantity }),
|
|
231
|
+
})),
|
|
232
|
+
},
|
|
233
|
+
idempotencyKey: call?.idempotencyKey,
|
|
234
|
+
},
|
|
235
|
+
}, call);
|
|
236
|
+
return data.createReplenishmentDrafts;
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|