@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,103 @@
1
+ import type { Transport } from '@sixtyninecommerce/core';
2
+ import type { Call } from '../types.js';
3
+ /**
4
+ * Personal vouchers (incentives sprint 9): a voucher TEMPLATE under a promotion, codes issued one
5
+ * by one to a customer of the store, single use, with an optional expiry and the issuing journey
6
+ * recorded as an opaque `source`. Applied like any coupon (`pricing.coupons.apply`, the till's
7
+ * `pos.sale.applyCouponCode`), which refuse `VOUCHER_NOT_FOR_CUSTOMER`, `VOUCHER_EXPIRED` and
8
+ * `VOUCHER_ALREADY_REDEEMED`. Issuing needs `CreatePromotion`.
9
+ */
10
+ /** A customer of this store: exactly one of its id or a master system's key (PR #1176). */
11
+ export type VoucherCustomer = {
12
+ id: string;
13
+ } | {
14
+ externalRef: {
15
+ system: string;
16
+ ref: string;
17
+ };
18
+ };
19
+ export interface IssueVoucherInput {
20
+ templateId: string;
21
+ customer: VoucherCustomer;
22
+ /** Usable through the end of the store's local day this many days after today (1 to 3650). */
23
+ validityDays?: number;
24
+ /** Or an explicit instant, ISO-8601. Neither: the template's default, else the promotion's window. */
25
+ expiresAt?: string;
26
+ /** The issuing journey; with a `ref`, an issue is exactly-once per template, customer and source. */
27
+ source: {
28
+ system: string;
29
+ ref?: string;
30
+ };
31
+ }
32
+ export interface IssueVouchersInput {
33
+ templateId: string;
34
+ sourceSystem: string;
35
+ /** At most 1,000. */
36
+ items: Array<{
37
+ customer: VoucherCustomer;
38
+ validityDays?: number;
39
+ expiresAt?: string;
40
+ sourceRef?: string;
41
+ }>;
42
+ }
43
+ export interface IssuedVoucher {
44
+ id: string;
45
+ code: string;
46
+ customerId: string;
47
+ /** The earlier of its own expiry and its promotion's end; null when neither ends. */
48
+ expiresAt: string | null;
49
+ /** False when this template, customer and source had issued it already: the same code. */
50
+ created: boolean;
51
+ }
52
+ export interface IssueVouchersItem {
53
+ index: number;
54
+ voucher: IssuedVoucher | null;
55
+ /** A `VOUCHER_*` code or `ENTITY_NOT_FOUND` for a refused item; the others were issued. */
56
+ errorCode: string | null;
57
+ message: string | null;
58
+ }
59
+ export type VoucherStatus = 'OPEN' | 'REDEEMED' | 'EXPIRED' | 'REVOKED';
60
+ export interface Voucher {
61
+ id: string;
62
+ code: string;
63
+ templateId: string;
64
+ promotionId: string;
65
+ customerId: string | null;
66
+ status: VoucherStatus;
67
+ issuedAt: string;
68
+ expiresAt: string | null;
69
+ sourceSystem: string | null;
70
+ sourceRef: string | null;
71
+ /** The order that redeemed it. */
72
+ orderId: string | null;
73
+ }
74
+ export interface VoucherTemplate {
75
+ id: string;
76
+ promotionId: string;
77
+ prefix: string;
78
+ codeLength: number;
79
+ defaultValidityDays: number | null;
80
+ }
81
+ export interface PricingVouchersModule {
82
+ /** A voucher template under a promotion of this store (codes of 12 to 32 random characters). */
83
+ createTemplate(input: {
84
+ promotionId: string;
85
+ prefix: string;
86
+ codeLength?: number;
87
+ defaultValidityDays?: number;
88
+ }, options?: Call): Promise<VoucherTemplate>;
89
+ /**
90
+ * Issue one voucher. `options.idempotencyKey` replays the first answer; the same template,
91
+ * customer and `source.ref` answers the voucher already issued (`created: false`) under any key.
92
+ */
93
+ issue(input: IssueVoucherInput, options?: Call): Promise<IssuedVoucher>;
94
+ /** Issue up to 1,000 vouchers of one template; a refused item answers in its place. */
95
+ issueMany(input: IssueVouchersInput, options?: Call): Promise<IssueVouchersItem[]>;
96
+ /** A customer's vouchers in this store, newest first; every status when `status` is omitted. */
97
+ forCustomer(customer: VoucherCustomer, status?: VoucherStatus, options?: Call): Promise<Voucher[]>;
98
+ }
99
+ export declare const CREATE_VOUCHER_TEMPLATE_MUTATION = "\n mutation CreateVoucherTemplate($input: CreateVoucherTemplateInput!) {\n createVoucherTemplate(input: $input) {\n id\n promotionId\n prefix\n codeLength\n defaultValidityDays\n }\n }\n";
100
+ export declare const ISSUE_VOUCHER_MUTATION = "\n mutation IssueVoucher($input: IssueVoucherInput!, $idempotencyKey: String) {\n issueVoucher(input: $input, idempotencyKey: $idempotencyKey) { id code customerId expiresAt created }\n }\n";
101
+ export declare const ISSUE_VOUCHERS_MUTATION = "\n mutation IssueVouchers($input: IssueVouchersInput!, $idempotencyKey: String) {\n issueVouchers(input: $input, idempotencyKey: $idempotencyKey) {\n items { index errorCode message voucher { id code customerId expiresAt created } }\n }\n }\n";
102
+ export declare const VOUCHERS_FOR_CUSTOMER_QUERY = "\n query VouchersForCustomer($customer: VoucherCustomerInput!, $status: VoucherStatus) {\n vouchersForCustomer(customer: $customer, status: $status) {\n id\n code\n templateId\n promotionId\n customerId\n status\n issuedAt\n expiresAt\n sourceSystem\n sourceRef\n orderId\n }\n }\n";
103
+ export declare function createPricingVouchersModule(transport: Transport): PricingVouchersModule;
@@ -0,0 +1,69 @@
1
+ const ISSUED_VOUCHER_FIELDS = `id code customerId expiresAt created`;
2
+ export const CREATE_VOUCHER_TEMPLATE_MUTATION = /* GraphQL */ `
3
+ mutation CreateVoucherTemplate($input: CreateVoucherTemplateInput!) {
4
+ createVoucherTemplate(input: $input) {
5
+ id
6
+ promotionId
7
+ prefix
8
+ codeLength
9
+ defaultValidityDays
10
+ }
11
+ }
12
+ `;
13
+ export const ISSUE_VOUCHER_MUTATION = /* GraphQL */ `
14
+ mutation IssueVoucher($input: IssueVoucherInput!, $idempotencyKey: String) {
15
+ issueVoucher(input: $input, idempotencyKey: $idempotencyKey) { ${ISSUED_VOUCHER_FIELDS} }
16
+ }
17
+ `;
18
+ export const ISSUE_VOUCHERS_MUTATION = /* GraphQL */ `
19
+ mutation IssueVouchers($input: IssueVouchersInput!, $idempotencyKey: String) {
20
+ issueVouchers(input: $input, idempotencyKey: $idempotencyKey) {
21
+ items { index errorCode message voucher { ${ISSUED_VOUCHER_FIELDS} } }
22
+ }
23
+ }
24
+ `;
25
+ export const VOUCHERS_FOR_CUSTOMER_QUERY = /* GraphQL */ `
26
+ query VouchersForCustomer($customer: VoucherCustomerInput!, $status: VoucherStatus) {
27
+ vouchersForCustomer(customer: $customer, status: $status) {
28
+ id
29
+ code
30
+ templateId
31
+ promotionId
32
+ customerId
33
+ status
34
+ issuedAt
35
+ expiresAt
36
+ sourceSystem
37
+ sourceRef
38
+ orderId
39
+ }
40
+ }
41
+ `;
42
+ export function createPricingVouchersModule(transport) {
43
+ return {
44
+ async createTemplate(input, options) {
45
+ const data = await transport.graphql({ api: 'admin', query: CREATE_VOUCHER_TEMPLATE_MUTATION, variables: { input } }, options);
46
+ return data.createVoucherTemplate;
47
+ },
48
+ async issue(input, options) {
49
+ const data = await transport.graphql({
50
+ api: 'admin',
51
+ query: ISSUE_VOUCHER_MUTATION,
52
+ variables: { input, idempotencyKey: options?.idempotencyKey },
53
+ }, options);
54
+ return data.issueVoucher;
55
+ },
56
+ async issueMany(input, options) {
57
+ const data = await transport.graphql({
58
+ api: 'admin',
59
+ query: ISSUE_VOUCHERS_MUTATION,
60
+ variables: { input, idempotencyKey: options?.idempotencyKey },
61
+ }, options);
62
+ return data.issueVouchers.items;
63
+ },
64
+ async forCustomer(customer, status, options) {
65
+ const data = await transport.graphql({ api: 'admin', query: VOUCHERS_FOR_CUSTOMER_QUERY, variables: { customer, status } }, options);
66
+ return data.vouchersForCustomer;
67
+ },
68
+ };
69
+ }
@@ -0,0 +1,89 @@
1
+ import type { Transport } from '@sixtyninecommerce/core';
2
+ import type { Call } from '../types.js';
3
+ /**
4
+ * A purchasing staff alert (purchase-orders spec §8.14), named as its email under Management →
5
+ * Notifications. A string on the wire: more alerts may come (a provider push failing, phase 6).
6
+ */
7
+ export type PurchasingAlert = 'purchase_order_approval_requested' | 'purchase_order_lines_overdue' | 'reorder_suggestions_digest' | (string & {});
8
+ /**
9
+ * What needs attention in the active store's purchasing, counted over its legal entity: the
10
+ * dashboard's nav badges and Overview cards.
11
+ */
12
+ export interface PurchasingAlertSummary {
13
+ /** `YYYY-MM-DD` in the legal entity's time zone: the day overdue lines are judged against. */
14
+ localDay: string;
15
+ /**
16
+ * Purchase orders waiting for an approver: submitted above the approval threshold, or sent with
17
+ * a revision above it.
18
+ */
19
+ awaitingApproval: number;
20
+ /**
21
+ * Lines of sent purchase orders with something still to come whose expected day (the supplier's
22
+ * confirmed day, else the requested one) is before `localDay`.
23
+ */
24
+ overdueLines: number;
25
+ /** Sent purchase orders with at least one overdue line. */
26
+ overdueOrders: number;
27
+ /** Purchase orders awaiting approval or with an overdue line, each counted once. */
28
+ attentionOrders: number;
29
+ /** Reorder suggestions of the last compute that are listed (not dismissed). */
30
+ reorderSuggestions: number;
31
+ /** Of those, the ones the last compute found new (not suggested before, or grown). */
32
+ newReorderSuggestions: number;
33
+ }
34
+ /** Who one purchasing alert email goes to. */
35
+ export interface PurchasingAlertRecipients {
36
+ alert: PurchasingAlert;
37
+ /**
38
+ * The permission whose holders get the alert when no addresses are set:
39
+ * `ApprovePurchaseOrder`, `UpdatePurchaseOrder` or `CreatePurchaseOrder`.
40
+ */
41
+ permission: string;
42
+ /** The addresses set for this alert; empty when it goes to the permission's holders. */
43
+ emails: string[];
44
+ /**
45
+ * Who the alert goes to now: the addresses set, else the administrators of the legal entity's
46
+ * stores holding the permission (never a platform administrator or an API credential).
47
+ */
48
+ recipients: string[];
49
+ }
50
+ /** One alert's addresses: up to 20; an empty list sends it to the permission's holders again. */
51
+ export interface PurchasingAlertRecipientsInput {
52
+ alert: PurchasingAlert;
53
+ emails: string[];
54
+ }
55
+ export declare const PURCHASING_ALERT_SUMMARY_FIELDS = "\n localDay\n awaitingApproval\n overdueLines\n overdueOrders\n attentionOrders\n reorderSuggestions\n newReorderSuggestions\n";
56
+ export declare const PURCHASING_ALERT_RECIPIENTS_FIELDS = "\n alert\n permission\n emails\n recipients\n";
57
+ export declare const PURCHASING_ALERTS_QUERY = "\n query PurchasingAlerts {\n purchasingAlerts { \n localDay\n awaitingApproval\n overdueLines\n overdueOrders\n attentionOrders\n reorderSuggestions\n newReorderSuggestions\n }\n }\n";
58
+ export declare const PURCHASING_ALERT_RECIPIENTS_QUERY = "\n query PurchasingAlertRecipients {\n purchasingAlertRecipients { \n alert\n permission\n emails\n recipients\n }\n }\n";
59
+ export declare const UPDATE_PURCHASING_ALERT_RECIPIENTS_MUTATION = "\n mutation UpdatePurchasingAlertRecipients(\n $input: [PurchasingAlertRecipientsInput!]!\n $idempotencyKey: String\n ) {\n updatePurchasingAlertRecipients(input: $input, idempotencyKey: $idempotencyKey) {\n \n alert\n permission\n emails\n recipients\n\n }\n }\n";
60
+ export interface PurchasingAlertRecipientsModule {
61
+ /**
62
+ * Who each alert goes to, in a fixed order (approval requests, overdue lines, reorder digest).
63
+ * Needs `ManagePurchasingSettings`.
64
+ */
65
+ list(call?: Call): Promise<PurchasingAlertRecipients[]>;
66
+ /**
67
+ * Sets who the named alerts go to; an alert not named keeps its own, and an empty `emails`
68
+ * sends it to the permission's holders again. Answers every alert, as `list` does. Needs
69
+ * `ManagePurchasingSettings` on EVERY store of the legal entity (`SHARED_SELLER_NOT_ALLOWED`,
70
+ * 403). Refusals: `PURCHASING_SETTINGS_INVALID` (400: an unknown alert, an alert named twice, an
71
+ * address that is not one, more than 20 addresses).
72
+ */
73
+ update(input: PurchasingAlertRecipientsInput[], call?: Call): Promise<PurchasingAlertRecipients[]>;
74
+ }
75
+ /**
76
+ * `admin.purchasing.alerts` (purchase-orders spec §8.14): what needs attention in the legal
77
+ * entity's purchasing, and who its alert emails go to. Every method needs the Purchasing plugin
78
+ * (`PURCHASING_NOT_ENABLED`, 422) and a store that purchases (`HUB_HAS_NO_PURCHASING`,
79
+ * `LEGAL_ENTITY_REQUIRED`, 422).
80
+ */
81
+ export interface PurchasingAlertsModule {
82
+ /**
83
+ * The counts behind the nav badges and the Overview cards. Needs `ReadPurchaseOrder`. `null`
84
+ * while purchasing is not switched on for the store's legal entity.
85
+ */
86
+ summary(call?: Call): Promise<PurchasingAlertSummary | null>;
87
+ recipients: PurchasingAlertRecipientsModule;
88
+ }
89
+ export declare function createPurchasingAlertsModule(transport: Transport): PurchasingAlertsModule;
@@ -0,0 +1,62 @@
1
+ export const PURCHASING_ALERT_SUMMARY_FIELDS = /* GraphQL */ `
2
+ localDay
3
+ awaitingApproval
4
+ overdueLines
5
+ overdueOrders
6
+ attentionOrders
7
+ reorderSuggestions
8
+ newReorderSuggestions
9
+ `;
10
+ export const PURCHASING_ALERT_RECIPIENTS_FIELDS = /* GraphQL */ `
11
+ alert
12
+ permission
13
+ emails
14
+ recipients
15
+ `;
16
+ export const PURCHASING_ALERTS_QUERY = /* GraphQL */ `
17
+ query PurchasingAlerts {
18
+ purchasingAlerts { ${PURCHASING_ALERT_SUMMARY_FIELDS} }
19
+ }
20
+ `;
21
+ export const PURCHASING_ALERT_RECIPIENTS_QUERY = /* GraphQL */ `
22
+ query PurchasingAlertRecipients {
23
+ purchasingAlertRecipients { ${PURCHASING_ALERT_RECIPIENTS_FIELDS} }
24
+ }
25
+ `;
26
+ export const UPDATE_PURCHASING_ALERT_RECIPIENTS_MUTATION = /* GraphQL */ `
27
+ mutation UpdatePurchasingAlertRecipients(
28
+ $input: [PurchasingAlertRecipientsInput!]!
29
+ $idempotencyKey: String
30
+ ) {
31
+ updatePurchasingAlertRecipients(input: $input, idempotencyKey: $idempotencyKey) {
32
+ ${PURCHASING_ALERT_RECIPIENTS_FIELDS}
33
+ }
34
+ }
35
+ `;
36
+ export function createPurchasingAlertsModule(transport) {
37
+ return {
38
+ async summary(call) {
39
+ const data = await transport.graphql({ api: 'admin', query: PURCHASING_ALERTS_QUERY }, call);
40
+ return data.purchasingAlerts ?? null;
41
+ },
42
+ recipients: {
43
+ async list(call) {
44
+ const data = await transport.graphql({ api: 'admin', query: PURCHASING_ALERT_RECIPIENTS_QUERY }, call);
45
+ return data.purchasingAlertRecipients;
46
+ },
47
+ async update(input, call) {
48
+ const data = await transport.graphql({
49
+ api: 'admin',
50
+ query: UPDATE_PURCHASING_ALERT_RECIPIENTS_MUTATION,
51
+ variables: {
52
+ // Only the input's own fields: a caller spreading what `list` answered sends no
53
+ // `permission` or `recipients`, which the engine's input does not declare.
54
+ input: input.map(({ alert, emails }) => ({ alert, emails: [...emails] })),
55
+ idempotencyKey: call?.idempotencyKey,
56
+ },
57
+ }, call);
58
+ return data.updatePurchasingAlertRecipients;
59
+ },
60
+ },
61
+ };
62
+ }
@@ -0,0 +1,110 @@
1
+ import type { Transport } from '@sixtyninecommerce/core';
2
+ import type { Call } from '../types.js';
3
+ /**
4
+ * A variant's unit cost in the active store's PURCHASING SCOPE (purchase-orders spec §8.10,
5
+ * §10.1 `cost`): its legal entity, shared by every store of that entity, or a sandbox store's own
6
+ * scope. The weighted average of what the scope received, in minor units of the scope's
7
+ * purchasing currency.
8
+ */
9
+ export interface VariantCost {
10
+ productVariantId: string;
11
+ /** The legal entity's id, or `sandbox:<channelId>` for a sandbox store. */
12
+ scopeId: string;
13
+ /** The legal entity (Seller) id; null for a sandbox store's own scope. */
14
+ legalEntityId: string | null;
15
+ /** ISO 4217: the scope's purchasing currency the cost is in. */
16
+ currencyCode: string;
17
+ /**
18
+ * The average as stored: a decimal string of minor units with six decimals (`"1249.500000"`),
19
+ * never rounded. Parse it with a decimal library, not `Number`, when the decimals matter.
20
+ */
21
+ averageUnitCost: string;
22
+ /** The average rounded half up to whole minor units (what the variant's cost field mirrors). */
23
+ unitCost: number;
24
+ /** `average` (receipts, seeding), `manual` (an override), `provider` (an ERP's cost). */
25
+ method: 'average' | 'manual' | 'provider' | (string & {});
26
+ /** The scope's on-hand quantity the last change averaged over. */
27
+ onHandAtLastEntry: number;
28
+ /** ISO-8601 UTC. */
29
+ updatedAt: string;
30
+ }
31
+ /** What changed a variant's cost. A string on the wire: more values may come. */
32
+ export type VariantCostCause = 'receipt' | 'reversal' | 'landed_charge' | 'supplier_return' | 'manual' | 'provider_sync' | 'seed' | (string & {});
33
+ /** One change in a variant's cost ledger. Amounts are decimal strings of minor units. */
34
+ export interface VariantCostEntry {
35
+ id: string;
36
+ productVariantId: string;
37
+ scopeId: string;
38
+ cause: VariantCostCause;
39
+ currencyCode: string;
40
+ /** Base units the change moved: positive for a receipt, negative for a reversal or return. */
41
+ deltaQuantity: number;
42
+ /** The scope's on-hand quantity the change averaged over. */
43
+ onHandBefore: number;
44
+ /** The per-unit cost the change brought in or took out; null for a landed charge. */
45
+ unitCost: string | null;
46
+ /** A landed charge's amount for this variant; null otherwise. */
47
+ chargeAmount: string | null;
48
+ /** The part of a landed charge that went to units already sold, outside the average. */
49
+ unabsorbedAmount: string | null;
50
+ /** The average before the change; null when the scope had no cost yet. */
51
+ averageBefore: string | null;
52
+ resultingAverage: string;
53
+ /** Whether the variant's cost field was set to the rounded result. */
54
+ mirrorWritten: boolean;
55
+ /** The document the change belongs to, such as a goods receipt number. */
56
+ referenceDocumentRef: string | null;
57
+ /** Why a manual override changed the cost. */
58
+ reason: string | null;
59
+ actorRef: string | null;
60
+ /** ISO-8601 UTC. */
61
+ createdAt: string;
62
+ }
63
+ export interface VariantCostEntryList {
64
+ items: VariantCostEntry[];
65
+ totalItems: number;
66
+ }
67
+ /** A page of the ledger, newest first. */
68
+ export interface VariantCostHistoryOptions {
69
+ /** 0 or more. Default 0. */
70
+ skip?: number;
71
+ /** 1 to 100. Default 25. */
72
+ take?: number;
73
+ }
74
+ export interface OverrideVariantCostInput {
75
+ variantId: string;
76
+ /**
77
+ * The new unit cost in minor units of the scope's purchasing currency: a non-negative decimal
78
+ * string of at most 6 decimals, no more than 2147483647 (`"1250"`, `"1249.5"`), or a whole
79
+ * number of minor units.
80
+ */
81
+ unitCost: string | number;
82
+ /** Why the cost changes: 1 to 255 characters, kept in the ledger. */
83
+ reason: string;
84
+ }
85
+ export declare const VARIANT_COST_FIELDS = "\n productVariantId\n scopeId\n legalEntityId\n currencyCode\n averageUnitCost\n unitCost\n method\n onHandAtLastEntry\n updatedAt\n";
86
+ export declare const VARIANT_COST_ENTRY_FIELDS = "\n id\n productVariantId\n scopeId\n cause\n currencyCode\n deltaQuantity\n onHandBefore\n unitCost\n chargeAmount\n unabsorbedAmount\n averageBefore\n resultingAverage\n mirrorWritten\n referenceDocumentRef\n reason\n actorRef\n createdAt\n";
87
+ export declare const VARIANT_COST_QUERY = "\n query VariantCost($variantId: ID!) {\n variantCost(variantId: $variantId) { \n productVariantId\n scopeId\n legalEntityId\n currencyCode\n averageUnitCost\n unitCost\n method\n onHandAtLastEntry\n updatedAt\n }\n }\n";
88
+ export declare const VARIANT_COST_HISTORY_QUERY = "\n query VariantCostHistory($variantId: ID!, $options: VariantCostHistoryOptions) {\n variantCostHistory(variantId: $variantId, options: $options) {\n items { \n id\n productVariantId\n scopeId\n cause\n currencyCode\n deltaQuantity\n onHandBefore\n unitCost\n chargeAmount\n unabsorbedAmount\n averageBefore\n resultingAverage\n mirrorWritten\n referenceDocumentRef\n reason\n actorRef\n createdAt\n }\n totalItems\n }\n }\n";
89
+ export declare const OVERRIDE_VARIANT_COST_MUTATION = "\n mutation OverrideVariantCost($input: OverrideVariantCostInput!, $idempotencyKey: String) {\n overrideVariantCost(input: $input, idempotencyKey: $idempotencyKey) {\n \n productVariantId\n scopeId\n legalEntityId\n currencyCode\n averageUnitCost\n unitCost\n method\n onHandAtLastEntry\n updatedAt\n\n }\n }\n";
90
+ /**
91
+ * `admin.purchasing.cost` (spec §10.1). Every method needs the Purchasing plugin on the store and
92
+ * purchasing switched on for its legal entity (`PURCHASING_NOT_ENABLED`, 422; `PLUGIN_ACCESS_DENIED`,
93
+ * 403, for an ordinary caller), and a store that purchases (`HUB_HAS_NO_PURCHASING`,
94
+ * `LEGAL_ENTITY_REQUIRED`). A variant not in the store is `PURCHASING_VARIANT_NOT_FOUND` (404).
95
+ * Reads need `ReadCatalog`, `ReadProduct` or `ManageInventoryCost`.
96
+ */
97
+ export interface PurchasingCostModule {
98
+ /** The variant's cost in the scope; null while the scope has none (its cost field answers). */
99
+ get(variantId: string, call?: Call): Promise<VariantCost | null>;
100
+ /** The variant's cost ledger, newest first. Refusals: `VARIANT_COST_INVALID` (400) for a page. */
101
+ history(variantId: string, options?: VariantCostHistoryOptions, call?: Call): Promise<VariantCostEntryList>;
102
+ /**
103
+ * Sets the variant's cost in the scope, with a reason (cause `manual`); averaging continues
104
+ * from it, and the variant's cost field follows when one legal entity alone holds it. Needs
105
+ * `ManageInventoryCost` on EVERY store of the legal entity (`SHARED_SELLER_NOT_ALLOWED`, 403).
106
+ * Refusals: `VARIANT_COST_INVALID` (400) for the amount or the reason.
107
+ */
108
+ override(input: OverrideVariantCostInput, call?: Call): Promise<VariantCost>;
109
+ }
110
+ export declare function createPurchasingCostModule(transport: Transport): PurchasingCostModule;
@@ -0,0 +1,86 @@
1
+ export const VARIANT_COST_FIELDS = /* GraphQL */ `
2
+ productVariantId
3
+ scopeId
4
+ legalEntityId
5
+ currencyCode
6
+ averageUnitCost
7
+ unitCost
8
+ method
9
+ onHandAtLastEntry
10
+ updatedAt
11
+ `;
12
+ export const VARIANT_COST_ENTRY_FIELDS = /* GraphQL */ `
13
+ id
14
+ productVariantId
15
+ scopeId
16
+ cause
17
+ currencyCode
18
+ deltaQuantity
19
+ onHandBefore
20
+ unitCost
21
+ chargeAmount
22
+ unabsorbedAmount
23
+ averageBefore
24
+ resultingAverage
25
+ mirrorWritten
26
+ referenceDocumentRef
27
+ reason
28
+ actorRef
29
+ createdAt
30
+ `;
31
+ export const VARIANT_COST_QUERY = /* GraphQL */ `
32
+ query VariantCost($variantId: ID!) {
33
+ variantCost(variantId: $variantId) { ${VARIANT_COST_FIELDS} }
34
+ }
35
+ `;
36
+ export const VARIANT_COST_HISTORY_QUERY = /* GraphQL */ `
37
+ query VariantCostHistory($variantId: ID!, $options: VariantCostHistoryOptions) {
38
+ variantCostHistory(variantId: $variantId, options: $options) {
39
+ items { ${VARIANT_COST_ENTRY_FIELDS} }
40
+ totalItems
41
+ }
42
+ }
43
+ `;
44
+ export const OVERRIDE_VARIANT_COST_MUTATION = /* GraphQL */ `
45
+ mutation OverrideVariantCost($input: OverrideVariantCostInput!, $idempotencyKey: String) {
46
+ overrideVariantCost(input: $input, idempotencyKey: $idempotencyKey) {
47
+ ${VARIANT_COST_FIELDS}
48
+ }
49
+ }
50
+ `;
51
+ export function createPurchasingCostModule(transport) {
52
+ return {
53
+ async get(variantId, call) {
54
+ const data = await transport.graphql({ api: 'admin', query: VARIANT_COST_QUERY, variables: { variantId } }, call);
55
+ return data.variantCost;
56
+ },
57
+ async history(variantId, options, call) {
58
+ const page = {};
59
+ if (options?.skip !== undefined)
60
+ page.skip = options.skip;
61
+ if (options?.take !== undefined)
62
+ page.take = options.take;
63
+ const data = await transport.graphql({
64
+ api: 'admin',
65
+ query: VARIANT_COST_HISTORY_QUERY,
66
+ variables: { variantId, ...(Object.keys(page).length > 0 ? { options: page } : {}) },
67
+ }, call);
68
+ return data.variantCostHistory;
69
+ },
70
+ async override(input, call) {
71
+ const data = await transport.graphql({
72
+ api: 'admin',
73
+ query: OVERRIDE_VARIANT_COST_MUTATION,
74
+ variables: {
75
+ input: {
76
+ variantId: input.variantId,
77
+ unitCost: String(input.unitCost),
78
+ reason: input.reason,
79
+ },
80
+ idempotencyKey: call?.idempotencyKey,
81
+ },
82
+ }, call);
83
+ return data.overrideVariantCost;
84
+ },
85
+ };
86
+ }
@@ -0,0 +1,36 @@
1
+ import type { Transport } from '@sixtyninecommerce/core';
2
+ import { type PurchasingAlertsModule } from './alerts.js';
3
+ import { type PurchasingCostModule } from './cost.js';
4
+ import { type PurchasingPurchaseOrdersModule } from './purchase-orders.js';
5
+ import { type PurchasingReplenishmentModule } from './replenishment.js';
6
+ import { type PurchasingSettingsModule } from './settings.js';
7
+ import { type PurchasingSuppliersModule } from './suppliers.js';
8
+ export type { PurchasingAlert, PurchasingAlertRecipients, PurchasingAlertRecipientsInput, PurchasingAlertRecipientsModule, PurchasingAlertSummary, PurchasingAlertsModule, } from './alerts.js';
9
+ export type { OverrideVariantCostInput, PurchasingCostModule, VariantCost, VariantCostCause, VariantCostEntry, VariantCostEntryList, VariantCostHistoryOptions, } from './cost.js';
10
+ export type { CreatePurchaseOrderInput, PurchaseOrder, PurchaseOrderCancelOptions, PurchaseOrderConfirmation, PurchaseOrderConfirmationInput, PurchaseOrderDocumentOptions, PurchaseOrderDocumentUrl, PurchaseOrderHeaderFields, PurchaseOrderKeyedCall, PurchaseOrderLine, PurchaseOrderLineConfirmationInput, PurchaseOrderLineImportOptions, PurchaseOrderLineImportResult, PurchaseOrderLineImportRow, PurchaseOrderLineInput, PurchaseOrderLinesModule, PurchaseOrderListOptions, PurchaseOrderLocation, PurchaseOrderReasonOptions, PurchaseOrderRevision, PurchaseOrderRevisionInput, PurchaseOrderRevisionsModule, PurchaseOrderSendVia, PurchaseOrderStatus, PurchaseOrderStatusEntry, PurchaseOrderSupplier, PurchasingPurchaseOrdersModule, UpdatePurchaseOrderInput, UpdatePurchaseOrderLineInput, } from './purchase-orders.js';
11
+ export type { PurchasingReplenishmentModule, ReplenishmentComputeResult, ReplenishmentDraftLine, ReplenishmentDrafts, ReplenishmentLocation, ReplenishmentRule, ReplenishmentRuleFields, ReplenishmentRuleImportInput, ReplenishmentRuleImportResult, ReplenishmentRuleImportRow, ReplenishmentRuleListOptions, ReplenishmentRulesModule, ReplenishmentSuggestion, ReplenishmentSuggestionListOptions, ReplenishmentSuggestionsModule, ReplenishmentSupplier, ReplenishmentVariant, } from './replenishment.js';
12
+ export type { PurchasingNumbering, PurchasingNumberingKind, PurchasingNumberingModule, PurchasingSettings, PurchasingSettingsModule, UpdatePurchasingNumberingInput, UpdatePurchasingSettingsInput, } from './settings.js';
13
+ export type { CreateSupplierContactInput, CreateSupplierInput, PurchasingSuppliersModule, Supplier, SupplierAddress, SupplierAddressInput, SupplierContact, SupplierContactFields, SupplierContactsModule, SupplierFields, SupplierItem, SupplierItemFields, SupplierItemImportResult, SupplierItemImportRowResult, SupplierItemListOptions, SupplierItemPrice, SupplierItemPriceInput, SupplierItemPricesModule, SupplierItemPricesOptions, SupplierItemRow, SupplierItemSupplier, SupplierItemsBulkUpsertInput, SupplierItemsModule, SupplierItemVariant, SupplierListOptions, SupplierPriceListImportInput, SupplierStatusOptions, UpdateSupplierContactInput, UpdateSupplierInput, } from './suppliers.js';
14
+ /**
15
+ * `admin.purchasing` (purchase-orders spec §10.1): buying stock from suppliers, per legal entity.
16
+ * `settings` (with its document `numbering`), `suppliers` (with their `contacts`),
17
+ * `purchaseOrders` (with their `lines`; the spec's `orders` submodule), `replenishment` (reorder
18
+ * `rules` and `suggestions`), `cost` (a variant's cost ledger) and `alerts` (what needs attention,
19
+ * and who the alert emails go to) so far; `receipts` and `returns` join them as their engine
20
+ * surfaces ship.
21
+ */
22
+ export interface PurchasingModule {
23
+ /** The legal entity's purchasing settings and document numbering. */
24
+ settings: PurchasingSettingsModule;
25
+ /** The legal entity's suppliers, their contacts and their catalog (`items`). */
26
+ suppliers: PurchasingSuppliersModule;
27
+ /** The legal entity's purchase orders, their lines and lifecycle. */
28
+ purchaseOrders: PurchasingPurchaseOrdersModule;
29
+ /** The legal entity's reorder rules and its reorder suggestions. */
30
+ replenishment: PurchasingReplenishmentModule;
31
+ /** What needs attention in the legal entity's purchasing, and who its alert emails go to. */
32
+ alerts: PurchasingAlertsModule;
33
+ /** A variant's cost in the legal entity's ledger: read it, its history, and override it. */
34
+ cost: PurchasingCostModule;
35
+ }
36
+ export declare function createPurchasingModule(transport: Transport): PurchasingModule;
@@ -0,0 +1,16 @@
1
+ import { createPurchasingAlertsModule } from './alerts.js';
2
+ import { createPurchasingCostModule } from './cost.js';
3
+ import { createPurchasingPurchaseOrdersModule, } from './purchase-orders.js';
4
+ import { createPurchasingReplenishmentModule, } from './replenishment.js';
5
+ import { createPurchasingSettingsModule } from './settings.js';
6
+ import { createPurchasingSuppliersModule } from './suppliers.js';
7
+ export function createPurchasingModule(transport) {
8
+ return {
9
+ settings: createPurchasingSettingsModule(transport),
10
+ suppliers: createPurchasingSuppliersModule(transport),
11
+ purchaseOrders: createPurchasingPurchaseOrdersModule(transport),
12
+ replenishment: createPurchasingReplenishmentModule(transport),
13
+ alerts: createPurchasingAlertsModule(transport),
14
+ cost: createPurchasingCostModule(transport),
15
+ };
16
+ }