@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.
Files changed (258) hide show
  1. package/README.md +4598 -128
  2. package/dist/catalog/assets.d.ts +120 -8
  3. package/dist/catalog/assets.js +98 -12
  4. package/dist/catalog/collections.d.ts +279 -14
  5. package/dist/catalog/collections.js +246 -15
  6. package/dist/catalog/index.d.ts +9 -2
  7. package/dist/catalog/index.js +4 -0
  8. package/dist/catalog/products.d.ts +318 -17
  9. package/dist/catalog/products.js +182 -14
  10. package/dist/catalog/properties.d.ts +102 -14
  11. package/dist/catalog/properties.js +13 -0
  12. package/dist/catalog/recommendations.d.ts +261 -0
  13. package/dist/catalog/recommendations.js +145 -0
  14. package/dist/catalog/reviews.d.ts +368 -0
  15. package/dist/catalog/reviews.js +318 -0
  16. package/dist/catalog/types.d.ts +17 -1
  17. package/dist/catalog/types.js +10 -0
  18. package/dist/catalog/variant-find.d.ts +136 -0
  19. package/dist/catalog/variant-find.js +239 -0
  20. package/dist/catalog/variants.d.ts +282 -25
  21. package/dist/catalog/variants.js +173 -25
  22. package/dist/catalog/visibility.d.ts +20 -5
  23. package/dist/catalog/visibility.js +19 -1
  24. package/dist/client.d.ts +116 -9
  25. package/dist/client.js +41 -7
  26. package/dist/content/assets.d.ts +286 -0
  27. package/dist/content/assets.js +181 -0
  28. package/dist/content/items.d.ts +269 -0
  29. package/dist/content/items.js +170 -0
  30. package/dist/content/types.d.ts +282 -0
  31. package/dist/content/types.js +100 -0
  32. package/dist/customers/age-verification.d.ts +66 -0
  33. package/dist/customers/age-verification.js +79 -0
  34. package/dist/customers/credit.d.ts +263 -0
  35. package/dist/customers/credit.js +244 -0
  36. package/dist/customers/delivery-preferences.d.ts +120 -0
  37. package/dist/customers/delivery-preferences.js +97 -0
  38. package/dist/customers/groups.d.ts +207 -0
  39. package/dist/customers/groups.js +438 -0
  40. package/dist/customers/index.d.ts +447 -37
  41. package/dist/customers/index.js +313 -40
  42. package/dist/customers/invitation-status.d.ts +57 -0
  43. package/dist/customers/invitation-status.js +21 -0
  44. package/dist/customers/notes.d.ts +67 -0
  45. package/dist/customers/notes.js +51 -0
  46. package/dist/customers/notification-recipients.d.ts +97 -0
  47. package/dist/customers/notification-recipients.js +84 -0
  48. package/dist/customers/saved-lists.d.ts +42 -0
  49. package/dist/customers/saved-lists.js +61 -0
  50. package/dist/customers/vat.d.ts +83 -0
  51. package/dist/customers/vat.js +46 -0
  52. package/dist/customers/wire.d.ts +20 -0
  53. package/dist/customers/wire.js +35 -0
  54. package/dist/documents/ar.d.ts +307 -0
  55. package/dist/documents/ar.js +254 -0
  56. package/dist/documents/index.d.ts +731 -21
  57. package/dist/documents/index.js +436 -24
  58. package/dist/documents/pdf.d.ts +2 -0
  59. package/dist/documents/pdf.js +11 -0
  60. package/dist/fulfillments/create.d.ts +167 -0
  61. package/dist/fulfillments/create.js +216 -0
  62. package/dist/fulfillments/index.d.ts +121 -10
  63. package/dist/fulfillments/index.js +120 -2
  64. package/dist/fulfillments/payment-policy.d.ts +64 -0
  65. package/dist/fulfillments/payment-policy.js +140 -0
  66. package/dist/fulfillments/warehouse.d.ts +724 -0
  67. package/dist/fulfillments/warehouse.js +914 -0
  68. package/dist/geo/index.d.ts +119 -0
  69. package/dist/geo/index.js +107 -0
  70. package/dist/index.d.ts +129 -30
  71. package/dist/index.js +47 -9
  72. package/dist/integrations/afas-actions.d.ts +234 -0
  73. package/dist/integrations/afas-actions.js +310 -0
  74. package/dist/integrations/afas-types.d.ts +483 -0
  75. package/dist/integrations/afas-types.js +5 -0
  76. package/dist/integrations/afas.d.ts +234 -0
  77. package/dist/integrations/afas.js +290 -0
  78. package/dist/integrations/connections.d.ts +103 -0
  79. package/dist/integrations/connections.js +55 -0
  80. package/dist/integrations/esp.d.ts +313 -0
  81. package/dist/integrations/esp.js +169 -0
  82. package/dist/integrations/exact-online-types.d.ts +423 -0
  83. package/dist/integrations/exact-online-types.js +6 -0
  84. package/dist/integrations/exact-online.d.ts +248 -0
  85. package/dist/integrations/exact-online.js +376 -0
  86. package/dist/integrations/index.d.ts +40 -0
  87. package/dist/integrations/index.js +24 -0
  88. package/dist/integrations/pipeline-keys.d.ts +13 -0
  89. package/dist/integrations/pipeline-keys.js +22 -0
  90. package/dist/integrations/pipelines.d.ts +114 -0
  91. package/dist/integrations/pipelines.js +46 -0
  92. package/dist/integrations/types.d.ts +322 -0
  93. package/dist/integrations/types.js +8 -0
  94. package/dist/jobs/bulk-action-run.d.ts +11 -2
  95. package/dist/jobs/bulk-action-run.js +4 -5
  96. package/dist/locations/index.d.ts +66 -0
  97. package/dist/locations/index.js +31 -0
  98. package/dist/meta/index.d.ts +162 -0
  99. package/dist/orders/bulk.d.ts +75 -0
  100. package/dist/orders/bulk.js +150 -0
  101. package/dist/orders/cancel-with-money.d.ts +227 -0
  102. package/dist/orders/cancel-with-money.js +153 -0
  103. package/dist/orders/commit-edit.d.ts +7 -1
  104. package/dist/orders/commit-edit.js +5 -1
  105. package/dist/orders/deposit-policy.d.ts +103 -0
  106. package/dist/orders/deposit-policy.js +202 -0
  107. package/dist/orders/drafts.d.ts +800 -0
  108. package/dist/orders/drafts.js +771 -0
  109. package/dist/orders/fields.d.ts +245 -0
  110. package/dist/orders/fields.js +188 -0
  111. package/dist/orders/get.d.ts +29 -19
  112. package/dist/orders/get.js +17 -8
  113. package/dist/orders/index.d.ts +125 -5
  114. package/dist/orders/index.js +35 -2
  115. package/dist/orders/lifecycle.d.ts +128 -0
  116. package/dist/orders/lifecycle.js +158 -0
  117. package/dist/orders/line-price-preview.d.ts +7 -2
  118. package/dist/orders/list.d.ts +222 -0
  119. package/dist/orders/list.js +377 -0
  120. package/dist/orders/manual-discounts.d.ts +11 -2
  121. package/dist/orders/manual-discounts.js +2 -0
  122. package/dist/orders/manual-pricing.d.ts +5 -0
  123. package/dist/orders/order-entry.d.ts +20 -7
  124. package/dist/orders/plan-edit.d.ts +1 -1
  125. package/dist/orders/plan-edit.js +4 -1
  126. package/dist/orders/settings.d.ts +201 -0
  127. package/dist/orders/settings.js +325 -0
  128. package/dist/orders/status.d.ts +159 -13
  129. package/dist/orders/status.js +21 -0
  130. package/dist/orders/surcharges.d.ts +8 -1
  131. package/dist/orders/surcharges.js +3 -2
  132. package/dist/payments/account-credit.d.ts +30 -0
  133. package/dist/payments/account-credit.js +19 -0
  134. package/dist/payments/ar.d.ts +292 -0
  135. package/dist/payments/ar.js +223 -0
  136. package/dist/payments/connected-account.d.ts +47 -0
  137. package/dist/payments/connected-account.js +61 -0
  138. package/dist/payments/credit-noted-fields.d.ts +12 -0
  139. package/dist/payments/credit-noted-fields.js +37 -0
  140. package/dist/payments/index.d.ts +263 -10
  141. package/dist/payments/index.js +133 -1
  142. package/dist/payments/methods.d.ts +332 -0
  143. package/dist/payments/methods.js +363 -0
  144. package/dist/payments/mollie-methods.d.ts +159 -0
  145. package/dist/payments/mollie-methods.js +141 -0
  146. package/dist/payments/payment-links.d.ts +180 -0
  147. package/dist/payments/payment-links.js +97 -0
  148. package/dist/payments/provider-keys.d.ts +150 -0
  149. package/dist/payments/provider-keys.js +118 -0
  150. package/dist/payments/providers.d.ts +86 -11
  151. package/dist/payments/providers.js +29 -0
  152. package/dist/payments/requests.d.ts +144 -0
  153. package/dist/payments/requests.js +92 -0
  154. package/dist/payments/store-credit-fields.d.ts +15 -0
  155. package/dist/payments/store-credit-fields.js +51 -0
  156. package/dist/pickups/index.d.ts +104 -0
  157. package/dist/pickups/index.js +105 -0
  158. package/dist/platform/channels.d.ts +132 -0
  159. package/dist/platform/channels.js +128 -0
  160. package/dist/platform/geo.d.ts +123 -0
  161. package/dist/platform/geo.js +144 -0
  162. package/dist/platform/tax.d.ts +154 -0
  163. package/dist/platform/tax.js +139 -0
  164. package/dist/pos/anomalies.d.ts +158 -0
  165. package/dist/pos/anomalies.js +64 -0
  166. package/dist/pos/assisted-selling.d.ts +79 -0
  167. package/dist/pos/assisted-selling.js +38 -0
  168. package/dist/pos/exchanges.d.ts +103 -0
  169. package/dist/pos/exchanges.js +22 -0
  170. package/dist/pos/gift-cards.d.ts +135 -0
  171. package/dist/pos/gift-cards.js +47 -0
  172. package/dist/pos/index.d.ts +2125 -32
  173. package/dist/pos/index.js +742 -4
  174. package/dist/pos/no-receipt.d.ts +94 -0
  175. package/dist/pos/no-receipt.js +25 -0
  176. package/dist/pos/offline-sales.d.ts +187 -0
  177. package/dist/pos/offline-sales.js +116 -0
  178. package/dist/pos/pay-by-link.d.ts +143 -0
  179. package/dist/pos/pay-by-link.js +57 -0
  180. package/dist/pos/quick-keys.d.ts +103 -0
  181. package/dist/pos/quick-keys.js +45 -0
  182. package/dist/pos/reports.d.ts +360 -0
  183. package/dist/pos/reports.js +62 -0
  184. package/dist/pos/returns.d.ts +217 -0
  185. package/dist/pos/returns.js +53 -0
  186. package/dist/pricing/bulk-coupons.d.ts +139 -0
  187. package/dist/pricing/bulk-coupons.js +112 -0
  188. package/dist/pricing/index.d.ts +177 -4
  189. package/dist/pricing/index.js +176 -1
  190. package/dist/pricing/price-lists.d.ts +604 -0
  191. package/dist/pricing/price-lists.js +600 -0
  192. package/dist/pricing/vouchers.d.ts +103 -0
  193. package/dist/pricing/vouchers.js +69 -0
  194. package/dist/purchasing/alerts.d.ts +89 -0
  195. package/dist/purchasing/alerts.js +62 -0
  196. package/dist/purchasing/cost.d.ts +110 -0
  197. package/dist/purchasing/cost.js +86 -0
  198. package/dist/purchasing/index.d.ts +36 -0
  199. package/dist/purchasing/index.js +16 -0
  200. package/dist/purchasing/purchase-orders.d.ts +548 -0
  201. package/dist/purchasing/purchase-orders.js +491 -0
  202. package/dist/purchasing/replenishment.d.ts +281 -0
  203. package/dist/purchasing/replenishment.js +240 -0
  204. package/dist/purchasing/settings.d.ts +152 -0
  205. package/dist/purchasing/settings.js +181 -0
  206. package/dist/purchasing/suppliers.d.ts +476 -0
  207. package/dist/purchasing/suppliers.js +438 -0
  208. package/dist/quotes/index.d.ts +501 -0
  209. package/dist/quotes/index.js +439 -0
  210. package/dist/reports/index.d.ts +71 -8
  211. package/dist/reports/index.js +74 -11
  212. package/dist/returns/index.d.ts +818 -0
  213. package/dist/returns/index.js +844 -0
  214. package/dist/search/index.d.ts +174 -0
  215. package/dist/search/index.js +125 -0
  216. package/dist/shipping/definitions.d.ts +29 -0
  217. package/dist/shipping/definitions.js +47 -0
  218. package/dist/shipping/fulfillment-profiles.d.ts +174 -0
  219. package/dist/shipping/fulfillment-profiles.js +104 -0
  220. package/dist/shipping/hendriks.d.ts +97 -0
  221. package/dist/shipping/hendriks.js +50 -0
  222. package/dist/shipping/index.d.ts +48 -0
  223. package/dist/shipping/index.js +25 -0
  224. package/dist/shipping/methods.d.ts +198 -0
  225. package/dist/shipping/methods.js +240 -0
  226. package/dist/shipping/myparcel.d.ts +254 -0
  227. package/dist/shipping/myparcel.js +178 -0
  228. package/dist/shipping/parcel-count-suggestion.d.ts +2 -0
  229. package/dist/shipping/parcel-rule.d.ts +6 -5
  230. package/dist/shipping/parcel-rule.js +21 -23
  231. package/dist/shipping/rate-tables.d.ts +179 -0
  232. package/dist/shipping/rate-tables.js +184 -0
  233. package/dist/stock/index.d.ts +10 -3
  234. package/dist/stock/index.js +3 -0
  235. package/dist/stock/locations.d.ts +144 -0
  236. package/dist/stock/locations.js +168 -0
  237. package/dist/stock/transfers.d.ts +216 -43
  238. package/dist/stock/transfers.js +140 -13
  239. package/dist/stored-value/index.d.ts +214 -4
  240. package/dist/stored-value/index.js +152 -0
  241. package/dist/subscriptions/index.d.ts +682 -0
  242. package/dist/subscriptions/index.js +815 -0
  243. package/dist/tax/index.d.ts +76 -1
  244. package/dist/tax/index.js +50 -0
  245. package/dist/tenant/email-style.d.ts +102 -0
  246. package/dist/tenant/email-style.js +72 -0
  247. package/dist/tenant/email-templates.d.ts +66 -0
  248. package/dist/tenant/email-templates.js +54 -0
  249. package/dist/tenant/notifications.d.ts +23 -17
  250. package/dist/tenant/settings-sources.d.ts +1 -1
  251. package/dist/tenant/time-zone.d.ts +17 -0
  252. package/dist/tenant/time-zone.js +11 -0
  253. package/dist/types.d.ts +51 -4
  254. package/dist/users/index.d.ts +3 -0
  255. package/dist/users/index.js +2 -0
  256. package/dist/users/warehouses.d.ts +50 -0
  257. package/dist/users/warehouses.js +51 -0
  258. 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
+ }