@revenexx/cover 0.1.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 (408) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -0
  3. package/app/api/account.ts +8 -0
  4. package/app/api/categories.ts +3 -0
  5. package/app/api/checkout.ts +6 -0
  6. package/app/api/images.ts +4 -0
  7. package/app/api/markets.ts +3 -0
  8. package/app/api/product.ts +3 -0
  9. package/app/api/products.ts +4 -0
  10. package/app/api/search.ts +4 -0
  11. package/app/app.config.ts +29 -0
  12. package/app/assets/css/cover.css +25 -0
  13. package/app/components/account/AccountMenu.vue +30 -0
  14. package/app/components/account/AccountShell.vue +18 -0
  15. package/app/components/account/AccountSidebar.vue +90 -0
  16. package/app/components/account/address/AccountAddressCard.vue +287 -0
  17. package/app/components/account/carts/AccountCartsTable.vue +284 -0
  18. package/app/components/account/dashboard/AccountDashboard.vue +351 -0
  19. package/app/components/account/directorder/AccountDirectOrder.vue +512 -0
  20. package/app/components/account/governance/AccountApprovalLimitsTable.vue +221 -0
  21. package/app/components/account/governance/AccountCostCenterDetail.vue +276 -0
  22. package/app/components/account/governance/AccountCostCentersTable.vue +252 -0
  23. package/app/components/account/governance/AccountRequisitionDetail.vue +295 -0
  24. package/app/components/account/governance/AccountRequisitionsTable.vue +255 -0
  25. package/app/components/account/governance/AccountWorkflowDetail.vue +215 -0
  26. package/app/components/account/governance/AccountWorkflowsTable.vue +168 -0
  27. package/app/components/account/governance/GovernanceApprovalLimitModal.vue +183 -0
  28. package/app/components/account/governance/GovernanceCostCenterModal.vue +188 -0
  29. package/app/components/account/governance/GovernanceWorkflowModal.vue +191 -0
  30. package/app/components/account/orderlists/AccountOrderListDetail.vue +349 -0
  31. package/app/components/account/orderlists/AccountOrderListsTable.vue +352 -0
  32. package/app/components/account/orders/AccountOrderDetail.vue +376 -0
  33. package/app/components/account/orders/AccountOrdersTable.vue +281 -0
  34. package/app/components/account/preferences/AccountPreferences.vue +50 -0
  35. package/app/components/auth/AuthForgotPasswordPanel.vue +88 -0
  36. package/app/components/auth/AuthLoginPanel.vue +103 -0
  37. package/app/components/auth/AuthLoginTeaser.vue +24 -0
  38. package/app/components/auth/AuthPageHeader.vue +21 -0
  39. package/app/components/auth/AuthRegisterPanel.vue +431 -0
  40. package/app/components/auth/AuthRegisterTeaser.vue +24 -0
  41. package/app/components/auth/AuthResetPasswordPanel.vue +115 -0
  42. package/app/components/cart/CartButton.vue +42 -0
  43. package/app/components/cart/actions/CartCostCenterModal.vue +110 -0
  44. package/app/components/cart/actions/CartExportModal.vue +82 -0
  45. package/app/components/cart/actions/CartPositionTextsModal.vue +92 -0
  46. package/app/components/cart/actions/CartSaveToListModal.vue +177 -0
  47. package/app/components/cart/actions/CartWorkflowPickerModal.vue +64 -0
  48. package/app/components/cart/drawer/CartDrawer.vue +49 -0
  49. package/app/components/cart/item/CartItem.vue +318 -0
  50. package/app/components/cart/manage/CartNameModal.vue +68 -0
  51. package/app/components/cart/position/CartPosition.vue +369 -0
  52. package/app/components/cart/quickadd/CartQuickAdd.vue +145 -0
  53. package/app/components/cart/recommend/CartCrossSell.vue +102 -0
  54. package/app/components/cart/recommend/CartRecommendCard.vue +59 -0
  55. package/app/components/cart/recommend/CartReorderStrip.vue +108 -0
  56. package/app/components/cart/requisition/CartRequisitionGroup.vue +74 -0
  57. package/app/components/cart/skeleton/CartSkeleton.vue +18 -0
  58. package/app/components/cart/summary/CartSummary.vue +25 -0
  59. package/app/components/cart/summary/CartSummaryBreakdown.vue +35 -0
  60. package/app/components/cart/switcher/CartSwitcher.vue +147 -0
  61. package/app/components/cart/target/CartTargetModal.vue +129 -0
  62. package/app/components/cart/view/CartApprovalsPanel.vue +89 -0
  63. package/app/components/cart/view/CartListHeader.vue +86 -0
  64. package/app/components/cart/view/CartPositionList.vue +94 -0
  65. package/app/components/cart/view/CartSummaryPanel.vue +254 -0
  66. package/app/components/cart/view/CartView.vue +310 -0
  67. package/app/components/category/info/CategoryPrice.vue +47 -0
  68. package/app/components/category/info/CategorySku.vue +15 -0
  69. package/app/components/category/info/CategoryStock.vue +25 -0
  70. package/app/components/category/list/CategoryItemCount.vue +27 -0
  71. package/app/components/category/list/CategoryListPagination.vue +81 -0
  72. package/app/components/category/skeleton/CategoryDetailSkeleton.vue +12 -0
  73. package/app/components/category/skeleton/CategoryListSkeleton.vue +65 -0
  74. package/app/components/category/view/CategoryViewToggle.vue +33 -0
  75. package/app/components/category/view/GridView.vue +78 -0
  76. package/app/components/category/view/ListView.vue +80 -0
  77. package/app/components/checkout/confirmation/CheckoutConfirmationView.vue +289 -0
  78. package/app/components/checkout/form/CheckoutSchemaForm.vue +72 -0
  79. package/app/components/checkout/onepage/CheckoutAddressPickerModal.vue +260 -0
  80. package/app/components/checkout/onepage/CheckoutAddressSection.vue +186 -0
  81. package/app/components/checkout/onepage/CheckoutDeliverySection.vue +158 -0
  82. package/app/components/checkout/onepage/CheckoutGate.vue +67 -0
  83. package/app/components/checkout/onepage/CheckoutGuestDetailsSection.vue +154 -0
  84. package/app/components/checkout/onepage/CheckoutNotesSection.vue +62 -0
  85. package/app/components/checkout/onepage/CheckoutOnePageView.vue +77 -0
  86. package/app/components/checkout/onepage/CheckoutPaymentSection.vue +181 -0
  87. package/app/components/checkout/onepage/CheckoutSectionTitle.vue +18 -0
  88. package/app/components/checkout/onepage/CheckoutSummarySection.vue +211 -0
  89. package/app/components/checkout/onepage/CheckoutWorkflowPanel.vue +38 -0
  90. package/app/components/layout/AppLogo.vue +21 -0
  91. package/app/components/layout/footer/Footer.vue +148 -0
  92. package/app/components/layout/header/AppBar.vue +75 -0
  93. package/app/components/layout/header/CategoryNav.vue +93 -0
  94. package/app/components/layout/header/HeaderActionItem.vue +81 -0
  95. package/app/components/layout/header/LocaleSwitcher.vue +123 -0
  96. package/app/components/layout/header/MainNav.vue +61 -0
  97. package/app/components/layout/header/MobileMenu.vue +81 -0
  98. package/app/components/layout/header/TopBar.vue +63 -0
  99. package/app/components/listing/ListingView.vue +227 -0
  100. package/app/components/product/detail/ProductDetailAddToCart.vue +188 -0
  101. package/app/components/product/detail/ProductDetailDescription.vue +20 -0
  102. package/app/components/product/detail/ProductDetailImageGallery.vue +58 -0
  103. package/app/components/product/detail/ProductDetailPricing.vue +108 -0
  104. package/app/components/product/detail/ProductDetailSaveToList.vue +291 -0
  105. package/app/components/product/detail/ProductDetailSpecifications.vue +33 -0
  106. package/app/components/product/detail/ProductDetailStock.vue +36 -0
  107. package/app/components/search/filter/SearchFacets.vue +256 -0
  108. package/app/components/search/filter/SearchFacetsDrawer.vue +58 -0
  109. package/app/components/ui/AppShell.vue +7 -0
  110. package/app/components/ui/debug/PiniaStateCard.vue +106 -0
  111. package/app/components/ui/feedback/EmptyState.vue +30 -0
  112. package/app/components/ui/feedback/ErrorBoundary.vue +44 -0
  113. package/app/components/ui/feedback/NotFound.vue +34 -0
  114. package/app/components/ui/forms/CountrySelection.vue +14 -0
  115. package/app/components/ui/forms/FormKitDatePicker.vue +124 -0
  116. package/app/components/ui/forms/PasswordInput.vue +136 -0
  117. package/app/components/ui/forms/SearchInput.vue +213 -0
  118. package/app/components/ui/table/TableSortButton.vue +51 -0
  119. package/app/components/ui/table/TableToolbar.vue +66 -0
  120. package/app/composables/useAccount.ts +27 -0
  121. package/app/composables/useAccountAddresses.ts +116 -0
  122. package/app/composables/useAccountOrders.ts +18 -0
  123. package/app/composables/useAppUrl.ts +38 -0
  124. package/app/composables/useAuthStore.ts +202 -0
  125. package/app/composables/useB2BContext.ts +23 -0
  126. package/app/composables/useCartActions.ts +25 -0
  127. package/app/composables/useCartCalculation.ts +90 -0
  128. package/app/composables/useCartSelection.ts +46 -0
  129. package/app/composables/useCartStore.ts +837 -0
  130. package/app/composables/useCartSummaryFormatting.ts +28 -0
  131. package/app/composables/useCategories.ts +29 -0
  132. package/app/composables/useCheckoutOnePage.ts +438 -0
  133. package/app/composables/useCheckoutProfileSource.ts +8 -0
  134. package/app/composables/useCheckoutSchema.ts +28 -0
  135. package/app/composables/useDataTable.ts +14 -0
  136. package/app/composables/useFormValidation.ts +29 -0
  137. package/app/composables/useIcons.ts +17 -0
  138. package/app/composables/useLocalePreferences.ts +45 -0
  139. package/app/composables/useMarkets.ts +15 -0
  140. package/app/composables/useProduct.ts +89 -0
  141. package/app/composables/useProductCard.ts +8 -0
  142. package/app/composables/useProductCardActions.ts +106 -0
  143. package/app/composables/useProductImage.ts +12 -0
  144. package/app/composables/useProductListing.ts +210 -0
  145. package/app/composables/useProductUrl.ts +17 -0
  146. package/app/composables/useProducts.ts +130 -0
  147. package/app/composables/useSearch.ts +12 -0
  148. package/app/composables/useThemeStore.ts +81 -0
  149. package/app/composables/useViewMode.ts +18 -0
  150. package/app/config/countries.ts +74 -0
  151. package/app/config/icons.ts +283 -0
  152. package/app/config/navigation.ts +191 -0
  153. package/app/config/palette.ts +13 -0
  154. package/app/config/themes.ts +20 -0
  155. package/app/formkit.config.ts +50 -0
  156. package/app/interfaces/account/address-list.ts +34 -0
  157. package/app/interfaces/account/order-list.ts +47 -0
  158. package/app/interfaces/account/order-lists.ts +35 -0
  159. package/app/interfaces/account/profile.ts +17 -0
  160. package/app/interfaces/account.ts +3 -0
  161. package/app/interfaces/address.ts +9 -0
  162. package/app/interfaces/auth.ts +104 -0
  163. package/app/interfaces/b2b.ts +234 -0
  164. package/app/interfaces/cart-calculation.ts +131 -0
  165. package/app/interfaces/cart-item.ts +45 -0
  166. package/app/interfaces/checkout-draft.ts +4 -0
  167. package/app/interfaces/checkout.ts +43 -0
  168. package/app/interfaces/delivery.ts +13 -0
  169. package/app/interfaces/market.ts +24 -0
  170. package/app/interfaces/payment.ts +19 -0
  171. package/app/interfaces/persisted-cart.ts +10 -0
  172. package/app/interfaces/product-detail.ts +54 -0
  173. package/app/interfaces/product-list.ts +33 -0
  174. package/app/interfaces/search-facets.ts +14 -0
  175. package/app/interfaces/validation.ts +14 -0
  176. package/app/layouts/default.vue +78 -0
  177. package/app/layouts/focus.vue +80 -0
  178. package/app/plugins/formkit-locale.client.ts +23 -0
  179. package/app/shared/constants.ts +1 -0
  180. package/app/validations/companyName.ts +18 -0
  181. package/app/validations/emailFormat.ts +10 -0
  182. package/app/validations/formValidationConfig.ts +50 -0
  183. package/app/validations/maxLength.ts +12 -0
  184. package/app/validations/minLength.ts +9 -0
  185. package/app/validations/optionalCompanyName.ts +23 -0
  186. package/app/validations/passwordsMatch.ts +5 -0
  187. package/app/validations/phoneNumber.ts +19 -0
  188. package/app/validations/required.ts +11 -0
  189. package/app/validations/termsRequired.ts +4 -0
  190. package/app/validations/types.ts +10 -0
  191. package/app/validations/zipCode.ts +15 -0
  192. package/i18n/locales/de/account.json +458 -0
  193. package/i18n/locales/de/auth.json +155 -0
  194. package/i18n/locales/de/cart.json +263 -0
  195. package/i18n/locales/de/checkout.json +217 -0
  196. package/i18n/locales/de/common.json +80 -0
  197. package/i18n/locales/de/cover.json +33 -0
  198. package/i18n/locales/de/order.json +1 -0
  199. package/i18n/locales/de/product.json +71 -0
  200. package/i18n/locales/de/search.json +54 -0
  201. package/i18n/locales/de/validation.json +12 -0
  202. package/i18n/locales/en/account.json +458 -0
  203. package/i18n/locales/en/auth.json +155 -0
  204. package/i18n/locales/en/cart.json +263 -0
  205. package/i18n/locales/en/checkout.json +217 -0
  206. package/i18n/locales/en/common.json +80 -0
  207. package/i18n/locales/en/cover.json +33 -0
  208. package/i18n/locales/en/order.json +1 -0
  209. package/i18n/locales/en/product.json +71 -0
  210. package/i18n/locales/en/search.json +54 -0
  211. package/i18n/locales/en/validation.json +12 -0
  212. package/nuxt.config.ts +109 -0
  213. package/package.json +65 -0
  214. package/public/img/product-placeholder.svg +8 -0
  215. package/public/templates/direct-order-template.csv +3 -0
  216. package/public/templates/direct-order-template.xlsx +0 -0
  217. package/server/api/account/address/[id].delete.ts +51 -0
  218. package/server/api/account/address/[id].put.ts +83 -0
  219. package/server/api/account/address/index.post.ts +60 -0
  220. package/server/api/account/addresses.get.ts +25 -0
  221. package/server/api/account/context.get.ts +16 -0
  222. package/server/api/account/governance/[domain]/[id].put.ts +57 -0
  223. package/server/api/account/governance/[domain].post.ts +111 -0
  224. package/server/api/account/order-lists/[id].delete.ts +22 -0
  225. package/server/api/account/order-lists/[id].get.ts +17 -0
  226. package/server/api/account/order-lists/[id].put.ts +46 -0
  227. package/server/api/account/order-lists/index.get.ts +14 -0
  228. package/server/api/account/order-lists/index.post.ts +38 -0
  229. package/server/api/account/orders/[id].get.ts +35 -0
  230. package/server/api/account/orders.get.ts +35 -0
  231. package/server/api/account/profile.get.ts +56 -0
  232. package/server/api/account/profile.put.ts +128 -0
  233. package/server/api/account/requisitions/[id].get.ts +15 -0
  234. package/server/api/account/requisitions.get.ts +23 -0
  235. package/server/api/auth/login.post.ts +37 -0
  236. package/server/api/auth/logout.post.ts +4 -0
  237. package/server/api/auth/me.get.ts +3 -0
  238. package/server/api/auth/personas.get.ts +7 -0
  239. package/server/api/auth/recovery.post.ts +32 -0
  240. package/server/api/auth/recovery.put.ts +37 -0
  241. package/server/api/auth/register.post.ts +126 -0
  242. package/server/api/cart/calculate.post.ts +25 -0
  243. package/server/api/cart/export.post.ts +81 -0
  244. package/server/api/cart/index.delete.ts +10 -0
  245. package/server/api/cart/index.get.ts +10 -0
  246. package/server/api/cart/sync.post.ts +14 -0
  247. package/server/api/carts/[id]/activate.post.ts +18 -0
  248. package/server/api/carts/[id]/index.delete.ts +18 -0
  249. package/server/api/carts/[id]/index.put.ts +19 -0
  250. package/server/api/carts/[id]/items.post.ts +21 -0
  251. package/server/api/carts/index.get.ts +14 -0
  252. package/server/api/carts/index.post.ts +14 -0
  253. package/server/api/categories/[slug].get.ts +22 -0
  254. package/server/api/categories/index.get.ts +11 -0
  255. package/server/api/checkout/profile.get.ts +21 -0
  256. package/server/api/checkout/schema/[key].get.ts +19 -0
  257. package/server/api/checkout/session.post.ts +8 -0
  258. package/server/api/images/detail/[filename].get.ts +18 -0
  259. package/server/api/images/list/[filename].get.ts +17 -0
  260. package/server/api/markets.get.ts +9 -0
  261. package/server/api/orders/index.post.ts +376 -0
  262. package/server/api/payment/methods.post.ts +65 -0
  263. package/server/api/product/[id].get.ts +29 -0
  264. package/server/api/products/[id].get.ts +30 -0
  265. package/server/api/products/index.get.ts +21 -0
  266. package/server/api/requisitions/index.post.ts +67 -0
  267. package/server/api/shipping/rates.post.ts +70 -0
  268. package/server/api/themes/index.get.ts +9 -0
  269. package/server/api/typesense/drop.get.ts +22 -0
  270. package/server/api/typesense/health.get.ts +9 -0
  271. package/server/api/typesense/search.post.ts +199 -0
  272. package/server/api/typesense/seed.get.ts +112 -0
  273. package/server/api/typesense/suggest.post.ts +69 -0
  274. package/server/config/account/organization.json +146 -0
  275. package/server/config/account/personas.json +169 -0
  276. package/server/config/account/user.json +8 -0
  277. package/server/config/account/workflows.json +19 -0
  278. package/server/data/account/address-list.json +103 -0
  279. package/server/data/account/order-list.json +491 -0
  280. package/server/data/account/order-lists.json +149 -0
  281. package/server/data/account/profile.json +9 -0
  282. package/server/data/account/registration-requests.json +3 -0
  283. package/server/data/account/requisitions.json +686 -0
  284. package/server/data/categories.json +186 -0
  285. package/server/data/forms/checkout/add-address.json +24 -0
  286. package/server/data/list/5137-1.png +0 -0
  287. package/server/data/list/5498-1.png +0 -0
  288. package/server/data/list/5498-2.png +0 -0
  289. package/server/data/list/5498-3.png +0 -0
  290. package/server/data/list/5498-4.png +0 -0
  291. package/server/data/list/5498-5.png +0 -0
  292. package/server/data/list/5498-6.png +0 -0
  293. package/server/data/list/5519-1.png +0 -0
  294. package/server/data/list/5713-1.png +0 -0
  295. package/server/data/list/5789-1.png +0 -0
  296. package/server/data/list/5930-1.png +0 -0
  297. package/server/data/list/6127-1.png +0 -0
  298. package/server/data/list/6234-1.png +0 -0
  299. package/server/data/list/6238-1.png +0 -0
  300. package/server/data/list/6246-1.png +0 -0
  301. package/server/data/list/6270-1.png +0 -0
  302. package/server/data/list/6330-1.png +0 -0
  303. package/server/data/list/6336-1.png +0 -0
  304. package/server/data/list/6360-1.png +0 -0
  305. package/server/data/list/6363-1.png +0 -0
  306. package/server/data/list/6375-1.png +0 -0
  307. package/server/data/list/6385-1.png +0 -0
  308. package/server/data/list/6413-1.png +0 -0
  309. package/server/data/list/6418-1.png +0 -0
  310. package/server/data/list/6465-1.png +0 -0
  311. package/server/data/list/6477-1.png +0 -0
  312. package/server/data/list/6509-1.png +0 -0
  313. package/server/data/list/6545-1.png +0 -0
  314. package/server/data/list/6548-1.png +0 -0
  315. package/server/data/list/6566-1.png +0 -0
  316. package/server/data/list/6581-1.png +0 -0
  317. package/server/data/list/6609-1.png +0 -0
  318. package/server/data/list/6611-1.png +0 -0
  319. package/server/data/list/6641-1.png +0 -0
  320. package/server/data/list/6659-1.png +0 -0
  321. package/server/data/list/6662-1.png +0 -0
  322. package/server/data/list/6689-1.png +0 -0
  323. package/server/data/list/6698-1.png +0 -0
  324. package/server/data/list/6701-1.png +0 -0
  325. package/server/data/list/6752-1.png +0 -0
  326. package/server/data/list/6755-1.png +0 -0
  327. package/server/data/list/6837-1.png +0 -0
  328. package/server/data/list/6841-1.png +0 -0
  329. package/server/data/list/6844-1.png +0 -0
  330. package/server/data/list/6846-1.png +0 -0
  331. package/server/data/list/6886-1.png +0 -0
  332. package/server/data/list/6895-1.png +0 -0
  333. package/server/data/list/6897-1.png +0 -0
  334. package/server/data/list/6919-1.png +0 -0
  335. package/server/data/list/6977-1.png +0 -0
  336. package/server/data/list/6983-1.png +0 -0
  337. package/server/data/list/6984-1.png +0 -0
  338. package/server/data/list/6985-1.png +0 -0
  339. package/server/data/list/6986-1.png +0 -0
  340. package/server/data/list/6989-1.png +0 -0
  341. package/server/data/list/6995-1.png +0 -0
  342. package/server/data/list/6998-1.png +0 -0
  343. package/server/data/markets.json +24 -0
  344. package/server/data/product-detail.json +2450 -0
  345. package/server/data/product-list.json +2450 -0
  346. package/server/data/themes.json +8 -0
  347. package/server/interfaces/account.ts +20 -0
  348. package/server/interfaces/auth.ts +32 -0
  349. package/server/interfaces/b2bContext.ts +23 -0
  350. package/server/interfaces/cart.ts +46 -0
  351. package/server/interfaces/cartCalculation.ts +17 -0
  352. package/server/interfaces/category.ts +12 -0
  353. package/server/interfaces/checkoutProfile.ts +5 -0
  354. package/server/interfaces/log.ts +3 -0
  355. package/server/interfaces/market.ts +10 -0
  356. package/server/interfaces/product.ts +21 -0
  357. package/server/interfaces/schema.ts +20 -0
  358. package/server/interfaces/theme.ts +10 -0
  359. package/server/services/ApiAuthService.ts +138 -0
  360. package/server/services/ApiCartService.ts +254 -0
  361. package/server/services/ApiCategoryService.ts +25 -0
  362. package/server/services/ApiMarketService.ts +71 -0
  363. package/server/services/ApiProductService.ts +53 -0
  364. package/server/services/LocalFileCategoryService.ts +23 -0
  365. package/server/services/LocalFileCheckoutProfileService.ts +117 -0
  366. package/server/services/LocalFileProductService.ts +128 -0
  367. package/server/services/LocalFileSchemaService.ts +70 -0
  368. package/server/services/LocalFileThemeService.ts +18 -0
  369. package/server/services/LogService.ts +28 -0
  370. package/server/services/MockAccountService.ts +58 -0
  371. package/server/services/MockAuthService.ts +105 -0
  372. package/server/services/MockB2BContextService.ts +149 -0
  373. package/server/services/MockCartCalculationService.ts +395 -0
  374. package/server/services/MockMarketService.ts +18 -0
  375. package/server/services/SdkAccountService.ts +56 -0
  376. package/server/services/SdkAuthService.ts +83 -0
  377. package/server/services/SessionCartService.ts +31 -0
  378. package/server/utils/accountService.ts +30 -0
  379. package/server/utils/authCookie.ts +13 -0
  380. package/server/utils/authService.ts +43 -0
  381. package/server/utils/b2bService.ts +49 -0
  382. package/server/utils/cartService.ts +59 -0
  383. package/server/utils/categoryService.ts +19 -0
  384. package/server/utils/checkoutProfileService.ts +9 -0
  385. package/server/utils/checkoutSession.ts +38 -0
  386. package/server/utils/coverData.ts +84 -0
  387. package/server/utils/governanceStore.ts +38 -0
  388. package/server/utils/i18n.ts +76 -0
  389. package/server/utils/inventoryService.ts +14 -0
  390. package/server/utils/liveCatalog.ts +234 -0
  391. package/server/utils/liveInventories.ts +76 -0
  392. package/server/utils/liveOrders.ts +139 -0
  393. package/server/utils/livePrices.ts +93 -0
  394. package/server/utils/locale.ts +39 -0
  395. package/server/utils/logService.ts +19 -0
  396. package/server/utils/marketService.ts +24 -0
  397. package/server/utils/orderService.ts +14 -0
  398. package/server/utils/paymentService.ts +14 -0
  399. package/server/utils/priceService.ts +14 -0
  400. package/server/utils/productService.ts +28 -0
  401. package/server/utils/productsSchema.ts +30 -0
  402. package/server/utils/revenexxApi.ts +136 -0
  403. package/server/utils/schemaService.ts +25 -0
  404. package/server/utils/serviceMode.ts +70 -0
  405. package/server/utils/shippingService.ts +14 -0
  406. package/server/utils/shopSdk.ts +88 -0
  407. package/server/utils/themeService.ts +16 -0
  408. package/server/utils/typesense.ts +27 -0
@@ -0,0 +1,47 @@
1
+ export type AccountOrderStatus =
2
+ | "processing"
3
+ | "approval-pending"
4
+ | "shipped"
5
+ | "delivered"
6
+ | "cancelled";
7
+
8
+ export type AccountOrderPaymentStatus = "open" | "paid" | "refunded";
9
+
10
+ export interface AccountOrderPosition {
11
+ readonly id: string;
12
+ readonly sku: string;
13
+ readonly name: string;
14
+ readonly image?: string;
15
+ readonly quantity: number;
16
+ readonly unitPrice: number;
17
+ readonly lineTotal: number;
18
+ readonly categorySlug?: string;
19
+ readonly subcategorySlug?: string;
20
+ }
21
+
22
+ export interface AccountOrder {
23
+ readonly id: string;
24
+ readonly date: string;
25
+ readonly status: AccountOrderStatus;
26
+ readonly paymentStatus: AccountOrderPaymentStatus;
27
+ /** Net order total. */
28
+ readonly total: number;
29
+ readonly currency: string;
30
+ /** Customer's own order/PO number from the checkout. */
31
+ readonly orderNumber?: string;
32
+ readonly positions: AccountOrderPosition[];
33
+ readonly deliveryAddress?: string;
34
+ readonly billingAddress?: string;
35
+ /** Payment method key (invoice, po_number, cost_center). */
36
+ readonly paymentMethod?: string;
37
+ /** Carrier tracking once the order shipped. */
38
+ readonly tracking?: { carrier: string; trackingNumber: string };
39
+ /** Fulfillment milestones for the order progress display. */
40
+ readonly progress?: { step: "ordered" | "processing" | "shipped" | "delivered"; date?: string }[];
41
+ /** Approvers when the order awaits approval. */
42
+ readonly approvers?: string[];
43
+ }
44
+
45
+ export interface AccountOrderListResponse {
46
+ readonly orders: AccountOrder[];
47
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Order lists (shopping lists / label lists): saved position collections
3
+ * that flow back into the cart. Whole positions are stored — article,
4
+ * quantity, position texts and cost center (BRW-derived, generic).
5
+ */
6
+
7
+ export type OrderListKind = "shopping" | "label";
8
+
9
+ export interface OrderListPosition {
10
+ id: string;
11
+ sku: string;
12
+ name: string;
13
+ image?: string;
14
+ quantity: number;
15
+ unit?: string;
16
+ price: number;
17
+ taxRate?: number;
18
+ costCenterId?: string;
19
+ positionTexts?: string[];
20
+ customSku?: string;
21
+ categorySlug?: string;
22
+ subcategorySlug?: string;
23
+ }
24
+
25
+ export interface OrderList {
26
+ id: string;
27
+ name: string;
28
+ kind: OrderListKind;
29
+ /** Shared with the whole organization (read access). */
30
+ public: boolean;
31
+ owner: { id: string; name: string };
32
+ positions: OrderListPosition[];
33
+ createdAt: string;
34
+ updatedAt: string;
35
+ }
@@ -0,0 +1,17 @@
1
+ export interface AccountProfile {
2
+ readonly name: string;
3
+ readonly email: string;
4
+ readonly initials: string;
5
+ readonly phone: string;
6
+ readonly company: string;
7
+ }
8
+
9
+ export interface AccountProfileUpdateInput {
10
+ readonly phone: string;
11
+ readonly company: string;
12
+ }
13
+
14
+ export interface AccountProfileFormState {
15
+ phone: string;
16
+ company: string;
17
+ }
@@ -0,0 +1,3 @@
1
+ import type { AccountProfile } from "../interfaces/account/profile";
2
+
3
+ export type User = AccountProfile;
@@ -0,0 +1,9 @@
1
+ export interface Address {
2
+ id: string;
3
+ companyName: string;
4
+ contactName: string;
5
+ street: string;
6
+ city: string;
7
+ postalCode: string;
8
+ country: string;
9
+ }
@@ -0,0 +1,104 @@
1
+ /**
2
+ * B2B roles a user can act in. Personas in the mock auth service cover one
3
+ * role each so flows can be simulated per role; the platform will provide
4
+ * real role claims later.
5
+ */
6
+ export type AuthRole = "buyer" | "approver" | "admin" | "requester";
7
+
8
+ export interface AuthUser {
9
+ $id: string;
10
+ name: string;
11
+ email: string;
12
+ role?: AuthRole;
13
+ }
14
+
15
+ /**
16
+ * B2B registration paths (IS8/BRW pattern): new customers register with
17
+ * full company + address data, existing customers link their account via
18
+ * customer number.
19
+ */
20
+ export type RegistrationMode = "new" | "existing";
21
+
22
+ /** Company profile collected at registration — stored as a registration request. */
23
+ export interface RegistrationProfile {
24
+ mode: RegistrationMode;
25
+ company: string;
26
+ vatId?: string;
27
+ customerNumber?: string;
28
+ address?: {
29
+ street: string;
30
+ streetNumber: string;
31
+ zip: string;
32
+ city: string;
33
+ country: string;
34
+ };
35
+ salutation?: string;
36
+ jobTitle?: string;
37
+ phone?: string;
38
+ }
39
+
40
+ export interface RegisterInput {
41
+ email: string;
42
+ password: string;
43
+ name?: string;
44
+ profile?: RegistrationProfile;
45
+ }
46
+
47
+ export interface LoginInput {
48
+ email: string;
49
+ password: string;
50
+ }
51
+
52
+ export interface StoredSession {
53
+ id: string;
54
+ expire: string;
55
+ /** Set for SDK sessions — carries the platform session for server calls. */
56
+ fallbackCookie?: string;
57
+ /** Set for mock sessions — references the signed-in demo persona. */
58
+ personaId?: string;
59
+ /** Set for public-API sessions — the platform user behind the session. */
60
+ userId?: string;
61
+ /** Set for public-API sessions — the customers-app contact (cart owner). */
62
+ contactId?: string;
63
+ /** Set for public-API sessions — the contact's organization (price scope). */
64
+ organizationId?: string;
65
+ }
66
+
67
+ export interface LoginFormState {
68
+ email: string;
69
+ password: string;
70
+ }
71
+
72
+ export interface RegisterFormState {
73
+ mode: RegistrationMode;
74
+ /* company */
75
+ company: string;
76
+ vatId: string;
77
+ customerNumber: string;
78
+ /* billing address (new customers) */
79
+ street: string;
80
+ streetNumber: string;
81
+ zip: string;
82
+ city: string;
83
+ country: string;
84
+ /* contact */
85
+ salutation: string;
86
+ firstName: string;
87
+ lastName: string;
88
+ jobTitle: string;
89
+ phone: string;
90
+ email: string;
91
+ /* account */
92
+ password: string;
93
+ passwordConfirm: string;
94
+ acceptTerms: boolean;
95
+ }
96
+
97
+ export interface ForgotPasswordFormState {
98
+ email: string;
99
+ }
100
+
101
+ export interface ResetPasswordFormState {
102
+ password: string;
103
+ passwordConfirm: string;
104
+ }
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Generic B2B commerce model — organization configuration, cost centers,
3
+ * approval limits and approval workflows.
4
+ *
5
+ * Derived from real-world B2B procurement requirements (BANF processes,
6
+ * approval rules, booking accounts) but deliberately project-neutral:
7
+ * ERP-specific fields are mapped into this contract by live service
8
+ * implementations, never exposed to the UI. Every feature is individually
9
+ * switchable per organization (see OrganizationSettings) to cover the full
10
+ * configuration range from a simple webshop to a fully governed
11
+ * procurement setup.
12
+ */
13
+
14
+ /* ------------------------------------------------------------------ */
15
+ /* Organization configuration */
16
+ /* ------------------------------------------------------------------ */
17
+
18
+ export interface OrganizationSettings {
19
+ /** Cost center accounting on positions and order head. */
20
+ costCenters: {
21
+ enabled: boolean;
22
+ /** Every position must carry a cost center before ordering. */
23
+ required: boolean;
24
+ };
25
+ /** Approval limits / approval rules (see ApprovalLimit). */
26
+ approvals: { enabled: boolean };
27
+ /** Requisition workflows (see ApprovalWorkflow). */
28
+ workflows: { enabled: boolean };
29
+ cart: {
30
+ /** Cart export (CSV/XLSX) and print offered to users. */
31
+ exportEnabled: boolean;
32
+ /** Users may keep multiple named carts and switch between them. */
33
+ multipleCarts: boolean;
34
+ /** Net (B2B) or gross (B2C) price display. */
35
+ priceDisplay: "net" | "gross";
36
+ /** Minimum order value in shop currency; 0 disables the check. */
37
+ minOrderValue: number;
38
+ };
39
+ checkout: {
40
+ /** Guest ordering without an account, per customer type. */
41
+ guestOrdering: {
42
+ /** Business customers (company data required). */
43
+ b2b: boolean;
44
+ /** Private customers (no company data, gross prices). */
45
+ b2c: boolean;
46
+ };
47
+ /** The order/PO number is a mandatory field. */
48
+ orderNumberRequired: boolean;
49
+ };
50
+ }
51
+
52
+ /* ------------------------------------------------------------------ */
53
+ /* Cost centers */
54
+ /* ------------------------------------------------------------------ */
55
+
56
+ export interface CostCenter {
57
+ id: string;
58
+ code: string;
59
+ label: string;
60
+ /** Optional budget approval limit attached to this cost center. */
61
+ limit?: ApprovalLimit;
62
+ }
63
+
64
+ /* ------------------------------------------------------------------ */
65
+ /* Approval limits & rules */
66
+ /* ------------------------------------------------------------------ */
67
+
68
+ /**
69
+ * What an approval limit measures:
70
+ * - `budget` — accumulated spend against an available budget
71
+ * - `order-value` — value of a single order/cart
72
+ * - `unit-price` — highest unit price in the cart
73
+ * - `non-catalog` — cart contains items outside the negotiated catalog
74
+ */
75
+ export type ApprovalLimitType = "budget" | "order-value" | "unit-price" | "non-catalog";
76
+
77
+ /** Whom the approval limit is attached to. */
78
+ export type ApprovalLimitSubject =
79
+ | { type: "user"; userId: string }
80
+ | { type: "cost-center"; costCenterId: string };
81
+
82
+ /**
83
+ * Who has to approve when the limit is exceeded, and within which time
84
+ * frame before the request escalates to the deputy.
85
+ */
86
+ export interface ApprovalRule {
87
+ /** true → exceeding requires approval; false → informational only. */
88
+ required: boolean;
89
+ approverId?: string;
90
+ approverName?: string;
91
+ deputyId?: string;
92
+ deputyName?: string;
93
+ /** Hours the approver has before the request escalates to the deputy. */
94
+ timeLimitHours?: number;
95
+ deputyTimeLimitHours?: number;
96
+ }
97
+
98
+ export interface ApprovalLimit {
99
+ id: string;
100
+ type: ApprovalLimitType;
101
+ subject: ApprovalLimitSubject;
102
+ label: string;
103
+ /** Maximum amount the subject may spend independently; unused for `non-catalog`. */
104
+ maxAmount?: number;
105
+ /** Total budget; only for `budget` limits. */
106
+ totalBudget?: number;
107
+ /** Budget still available; only for `budget` limits. */
108
+ availableBudget?: number;
109
+ currency?: string;
110
+ /** Only `non-catalog` limits can be switched off; others are always on. */
111
+ active: boolean;
112
+ approval: ApprovalRule;
113
+ }
114
+
115
+ /**
116
+ * An approval limit evaluated against a concrete cart — returned by the
117
+ * cart calculation so the UI can render the approvals block above the CTA.
118
+ */
119
+ export interface ApprovalLimitEvaluation {
120
+ limitId: string;
121
+ type: ApprovalLimitType;
122
+ label: string;
123
+ status: "within" | "exceeded";
124
+ /** Effective threshold (max amount or available budget). */
125
+ threshold?: number;
126
+ /** The cart value the limit was compared against. */
127
+ actual?: number;
128
+ exceededBy?: number;
129
+ approval: ApprovalRule;
130
+ }
131
+
132
+ /* ------------------------------------------------------------------ */
133
+ /* Approval workflows & requisitions */
134
+ /* ------------------------------------------------------------------ */
135
+
136
+ export type WorkflowStepType = "request" | "order";
137
+
138
+ export interface ApprovalWorkflowStep {
139
+ type: WorkflowStepType;
140
+ /** Users allowed to act in this step. */
141
+ users: { id: string; name: string }[];
142
+ }
143
+
144
+ /**
145
+ * A requisition workflow: one or more `request` steps (requesters hand the
146
+ * requisition on) ending in an `order` step (orderers turn it into an
147
+ * actual order or reject it).
148
+ */
149
+ export interface ApprovalWorkflow {
150
+ id: string;
151
+ name: string;
152
+ steps: ApprovalWorkflowStep[];
153
+ }
154
+
155
+ export type RequisitionStatus = "open" | "ordered" | "cancelled";
156
+
157
+ export type WorkflowHistoryAction =
158
+ | "submitted"
159
+ | "forwarded"
160
+ | "approved"
161
+ | "escalated"
162
+ | "rejected"
163
+ | "ordered"
164
+ | "cancelled";
165
+
166
+ /** One audit-trail entry of a requisition's workflow (compliance log). */
167
+ export interface WorkflowHistoryEntry {
168
+ id: string;
169
+ stepSequence: number;
170
+ action: WorkflowHistoryAction;
171
+ actorName: string;
172
+ actionDate: string;
173
+ comment?: string;
174
+ }
175
+
176
+ export interface RequisitionItemSnapshot {
177
+ id: string;
178
+ sku: string;
179
+ name: string;
180
+ name2?: string;
181
+ image?: string;
182
+ quantity: number;
183
+ unit?: string;
184
+ price: number;
185
+ taxRate: number;
186
+ costCenterId?: string;
187
+ positionTexts?: string[];
188
+ customSku?: string;
189
+ }
190
+
191
+ /**
192
+ * A requisition (order request): a cart snapshot created by a requester,
193
+ * traveling through a workflow until an orderer places or rejects it.
194
+ */
195
+ export interface Requisition {
196
+ id: string;
197
+ workflowId: string;
198
+ workflowName: string;
199
+ requestedBy: { id: string; name: string };
200
+ requestedAt: string;
201
+ status: RequisitionStatus;
202
+ totalValue: number;
203
+ items: RequisitionItemSnapshot[];
204
+ /** Workflow audit trail, newest entry last. */
205
+ history?: WorkflowHistoryEntry[];
206
+ /** Compared when merging requisitions into one cart. */
207
+ deliveryAddress?: {
208
+ company: string;
209
+ street: string;
210
+ postalCode: string;
211
+ city: string;
212
+ country: string;
213
+ };
214
+ }
215
+
216
+ /* ------------------------------------------------------------------ */
217
+ /* Per-user B2B context (BFF: /api/account/context) */
218
+ /* ------------------------------------------------------------------ */
219
+
220
+ export type B2BRole = "buyer" | "approver" | "admin" | "requester";
221
+
222
+ /**
223
+ * Everything the storefront needs to know about the current user's B2B
224
+ * setup in one request: organization settings, assigned cost centers,
225
+ * applicable limits and workflow memberships.
226
+ */
227
+ export interface B2BContext {
228
+ role: B2BRole | null;
229
+ settings: OrganizationSettings;
230
+ costCenters: CostCenter[];
231
+ defaultCostCenterId: string | null;
232
+ approvalLimits: ApprovalLimit[];
233
+ workflows: ApprovalWorkflow[];
234
+ }
@@ -0,0 +1,131 @@
1
+ import type { ApprovalLimitEvaluation } from "./b2b";
2
+ import type { CartItem } from "./cart-item";
3
+
4
+ /**
5
+ * Cart calculation contract — the BFF computes everything the cart and the
6
+ * checkout summary display: per-line pricing, the ordered totals block,
7
+ * line hints, orderability and triggered spending limits.
8
+ *
9
+ * ERP-backed implementations map their document fields into this generic
10
+ * shape; the bundled mock implementation computes a sensible subset.
11
+ */
12
+
13
+ /** Pricing override labels — when set, no prices are shown for the line. */
14
+ export type PriceLabelCode = "free" | "on-request" | "by-result";
15
+
16
+ export type CartLineHintType =
17
+ | "missing-cost-center"
18
+ | "quantity-adjusted"
19
+ | "replaced"
20
+ | "duplicate";
21
+
22
+ export interface CartLineHint {
23
+ type: CartLineHintType;
24
+ /** i18n key into the cart namespace; params interpolated client-side. */
25
+ messageKey: string;
26
+ params?: Record<string, string | number>;
27
+ }
28
+
29
+ export interface CartLineSurcharge {
30
+ name: string;
31
+ /** Per-unit surcharge amount (net). */
32
+ amountPerUnit: number;
33
+ }
34
+
35
+ export type AvailabilityState = "in-stock" | "partial" | "out-of-stock";
36
+
37
+ export interface CartLineAvailability {
38
+ state: AvailabilityState;
39
+ /** Exactly available quantity (spec: export shows the available part). */
40
+ availableQuantity: number;
41
+ deliveryDays?: number;
42
+ }
43
+
44
+ export interface CalculatedCartLine {
45
+ /** References CartItem.id. */
46
+ id: string;
47
+ quantity: number;
48
+ /** Quantity after server-side rules (min quantity / steps) applied. */
49
+ adjustedQuantity?: number;
50
+ unitPrice: number;
51
+ lineTotal: number;
52
+ priceLabel?: { code: PriceLabelCode; label: string };
53
+ surcharges: CartLineSurcharge[];
54
+ availability: CartLineAvailability;
55
+ hints: CartLineHint[];
56
+ }
57
+
58
+ /**
59
+ * One row of the summary block. Rows arrive pre-ordered; rows flagged
60
+ * `alwaysVisible` render even with amount 0 (spec: Warenwert, Versand,
61
+ * Total). `key` drives styling (e.g. total emphasis), `label` is
62
+ * display-ready (translated server-side or a dynamic ERP name).
63
+ */
64
+ export interface CartTotalRow {
65
+ key:
66
+ | "subtotal"
67
+ | "surcharge"
68
+ | "min-order-value"
69
+ | "discount"
70
+ | "shipping"
71
+ | "tax"
72
+ | "rounding"
73
+ | "total";
74
+ label: string;
75
+ amount: number;
76
+ alwaysVisible?: boolean;
77
+ meta?: {
78
+ /** Tax rate for `tax` rows (e.g. 19). */
79
+ rate?: number;
80
+ /** Threshold for `min-order-value` rows. */
81
+ threshold?: number;
82
+ /** Amount missing to reach the minimum order value. */
83
+ missing?: number;
84
+ };
85
+ }
86
+
87
+ export type CartMessageSeverity = "error" | "warning" | "info";
88
+
89
+ export interface CartMessage {
90
+ severity: CartMessageSeverity;
91
+ /**
92
+ * Stable machine code, e.g. "no-shipping-method", "no-payment-method",
93
+ * "cost-center-required", "cost-centers-unassigned".
94
+ */
95
+ code: string;
96
+ /** i18n key into the cart namespace. */
97
+ messageKey: string;
98
+ params?: Record<string, string | number>;
99
+ }
100
+
101
+ export interface CartCalculationRequest {
102
+ items: CartItem[];
103
+ deliveryMethod?: string;
104
+ }
105
+
106
+ /**
107
+ * A spend incentive near its threshold (free shipping, volume discount) —
108
+ * rendered as a progress nudge in the cart summary.
109
+ */
110
+ export interface CartIncentive {
111
+ key: "free-shipping" | "volume-discount";
112
+ label: string;
113
+ /** Threshold amount in shop currency. */
114
+ threshold: number;
115
+ /** Amount still missing; 0 when reached. */
116
+ missing: number;
117
+ reached: boolean;
118
+ }
119
+
120
+ export interface CartCalculation {
121
+ currency: string;
122
+ lines: CalculatedCartLine[];
123
+ totals: CartTotalRow[];
124
+ /** False disables the checkout CTA; `messages` carry the reasons. */
125
+ orderable: boolean;
126
+ messages: CartMessage[];
127
+ /** Approval limits evaluated against this cart (block above the CTA). */
128
+ approvalLimits: ApprovalLimitEvaluation[];
129
+ /** Spend incentives for the summary panel (revenue nudges). */
130
+ incentives?: CartIncentive[];
131
+ }
@@ -0,0 +1,45 @@
1
+ export interface CartItemPriceTier {
2
+ minQuantity: number;
3
+ unitPrice: number;
4
+ }
5
+
6
+ /** Maximum quantity per position (spec: ERP accepts 6 digits). */
7
+ export const CART_MAX_QUANTITY = 999999;
8
+
9
+ /** Up to four free-text lines per position. */
10
+ export const CART_POSITION_TEXT_COUNT = 4;
11
+
12
+ export interface CartItem {
13
+ /** Product id (ProductList.id) — string, UUID in live mode. */
14
+ id: string;
15
+ /**
16
+ * Unique line identity — the same article may appear on multiple
17
+ * positions (e.g. loaded requisitions), so `id` alone is not a key.
18
+ * Assigned by the cart store on insertion.
19
+ */
20
+ lineKey?: string;
21
+ name: string;
22
+ /** Secondary name (type / dimension). */
23
+ name2?: string;
24
+ image: string;
25
+ sku: string;
26
+ /** Customer-own article number, editable on the position. */
27
+ customSku?: string;
28
+ price: number;
29
+ quantity: number;
30
+ /** Quantity unit (e.g. "Stück", "Pack"). */
31
+ unit?: string;
32
+ taxRate?: number;
33
+ priceTiers?: CartItemPriceTier[];
34
+ maxOrderQuantity?: number;
35
+ /** Cost center assigned to this position. */
36
+ costCenterId?: string;
37
+ /** Up to CART_POSITION_TEXT_COUNT free-text lines. */
38
+ positionTexts?: string[];
39
+ /** Item outside the negotiated catalog (non-catalog limits). */
40
+ nonCatalog?: boolean;
41
+ /** Set when the position belongs to a loaded requisition. */
42
+ requisitionId?: string;
43
+ categorySlug?: string;
44
+ subcategorySlug?: string;
45
+ }
@@ -0,0 +1,4 @@
1
+ export interface CheckoutDraft {
2
+ formValues: Record<string, Record<string, unknown>>;
3
+ savedAt: string;
4
+ }
@@ -0,0 +1,43 @@
1
+ import type { Address } from "../interfaces/address";
2
+ import type { DeliveryMethod, DeliveryOption } from "../interfaces/delivery";
3
+ import type { PaymentMethod, PaymentOption } from "../interfaces/payment";
4
+
5
+ export interface CostCenter {
6
+ id: string;
7
+ code: string;
8
+ label: string;
9
+ }
10
+
11
+ export interface CheckoutProfile {
12
+ addresses: Address[];
13
+ defaultShippingAddressId: string;
14
+ defaultBillingAddressId: string;
15
+ availablePaymentMethods: PaymentOption[];
16
+ defaultPaymentMethod: PaymentMethod;
17
+ costCenters: CostCenter[];
18
+ availableDeliveryMethods: DeliveryOption[];
19
+ defaultDeliveryMethod: DeliveryMethod;
20
+ }
21
+
22
+ export interface CheckoutOnePageForm {
23
+ shippingAddressId: string;
24
+ billingSameAsShipping: boolean;
25
+ billingAddressId: string;
26
+ deliveryMethod: DeliveryMethod;
27
+ requestedDate: string;
28
+ deliveryNote: string;
29
+ /** Ship available items immediately, the rest follows. */
30
+ partialDelivery: boolean;
31
+ paymentMethod: PaymentMethod;
32
+ poNumber: string;
33
+ costCenterId: string;
34
+ /** Customer order/PO number on the order head (mandatory per org flag). */
35
+ orderNumber: string;
36
+ /** Reference to a previously received quote. */
37
+ quoteNumber: string;
38
+ /** Skip the order confirmation e-mail for this order. */
39
+ noOrderConfirmation: boolean;
40
+ orderNote: string;
41
+ promoCode: string;
42
+ acceptedTerms: boolean;
43
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Delivery method codes come from the shipping app (live) or the demo
3
+ * profile (mock) — generic strings, e.g. "standard", "express", "pickup".
4
+ */
5
+ export type DeliveryMethod = string;
6
+
7
+ export interface DeliveryOption {
8
+ method: DeliveryMethod;
9
+ label: string;
10
+ price: number;
11
+ /** Delivery estimate in business days, e.g. "1–2". */
12
+ eta: string;
13
+ }