@flowselections/floriday-voorraad 1.0.155 → 1.0.156

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 (249) hide show
  1. package/dist-lib/components/TemplatePage.d.ts +2 -0
  2. package/dist-lib/components/TemplatePage.d.ts.map +1 -0
  3. package/dist-lib/components/TemplatePage.js +4 -0
  4. package/dist-lib/components/fs-ui/DataTable.d.ts +1 -1
  5. package/dist-lib/components/fs-ui/DataTable.d.ts.map +1 -1
  6. package/dist-lib/components/fs-ui/EmptyState.d.ts +1 -1
  7. package/dist-lib/components/fs-ui/EmptyState.d.ts.map +1 -1
  8. package/dist-lib/components/fs-ui/FilterChips.d.ts +1 -1
  9. package/dist-lib/components/fs-ui/FilterChips.d.ts.map +1 -1
  10. package/dist-lib/components/fs-ui/FilterPanel.d.ts +2 -2
  11. package/dist-lib/components/fs-ui/FilterPanel.d.ts.map +1 -1
  12. package/dist-lib/components/fs-ui/FiltersButton.d.ts +1 -1
  13. package/dist-lib/components/fs-ui/FiltersButton.d.ts.map +1 -1
  14. package/dist-lib/components/fs-ui/HeaderButton.d.ts +2 -2
  15. package/dist-lib/components/fs-ui/HeaderButton.d.ts.map +1 -1
  16. package/dist-lib/components/fs-ui/HoverTip.d.ts +1 -1
  17. package/dist-lib/components/fs-ui/HoverTip.d.ts.map +1 -1
  18. package/dist-lib/components/fs-ui/InlineAlert.d.ts +1 -1
  19. package/dist-lib/components/fs-ui/InlineAlert.d.ts.map +1 -1
  20. package/dist-lib/components/fs-ui/KpiRow.d.ts +1 -1
  21. package/dist-lib/components/fs-ui/KpiRow.d.ts.map +1 -1
  22. package/dist-lib/components/fs-ui/KpiTile.d.ts +1 -1
  23. package/dist-lib/components/fs-ui/KpiTile.d.ts.map +1 -1
  24. package/dist-lib/components/fs-ui/MobilePrimaryAction.d.ts +1 -1
  25. package/dist-lib/components/fs-ui/MobilePrimaryAction.d.ts.map +1 -1
  26. package/dist-lib/components/fs-ui/NoticeBar.d.ts +1 -1
  27. package/dist-lib/components/fs-ui/NoticeBar.d.ts.map +1 -1
  28. package/dist-lib/components/fs-ui/PageHeader.d.ts +1 -1
  29. package/dist-lib/components/fs-ui/PageHeader.d.ts.map +1 -1
  30. package/dist-lib/components/fs-ui/Pagination.d.ts +1 -1
  31. package/dist-lib/components/fs-ui/Pagination.d.ts.map +1 -1
  32. package/dist-lib/components/fs-ui/PillTabs.d.ts +1 -1
  33. package/dist-lib/components/fs-ui/PillTabs.d.ts.map +1 -1
  34. package/dist-lib/components/fs-ui/RowMenu.d.ts +1 -1
  35. package/dist-lib/components/fs-ui/RowMenu.d.ts.map +1 -1
  36. package/dist-lib/components/fs-ui/SearchInput.d.ts +1 -1
  37. package/dist-lib/components/fs-ui/SearchInput.d.ts.map +1 -1
  38. package/dist-lib/components/fs-ui/ShortcutHelp.d.ts +1 -1
  39. package/dist-lib/components/fs-ui/ShortcutHelp.d.ts.map +1 -1
  40. package/dist-lib/components/fs-ui/StatusIcon.d.ts +1 -1
  41. package/dist-lib/components/fs-ui/StatusIcon.d.ts.map +1 -1
  42. package/dist-lib/components/fs-ui/TableSkeleton.d.ts +1 -1
  43. package/dist-lib/components/fs-ui/TableSkeleton.d.ts.map +1 -1
  44. package/dist-lib/components/fs-ui/Toolbar.d.ts +1 -1
  45. package/dist-lib/components/fs-ui/Toolbar.d.ts.map +1 -1
  46. package/dist-lib/components/fs-ui/UpdatedAt.d.ts +1 -1
  47. package/dist-lib/components/fs-ui/UpdatedAt.d.ts.map +1 -1
  48. package/dist-lib/components/settings/VoorraadSettingsCard.d.ts +2 -0
  49. package/dist-lib/components/settings/VoorraadSettingsCard.d.ts.map +1 -0
  50. package/dist-lib/components/settings/VoorraadSettingsCard.js +39 -0
  51. package/dist-lib/components/voorraad/AdditionalPackagingDialog.d.ts +1 -1
  52. package/dist-lib/components/voorraad/AdditionalPackagingDialog.d.ts.map +1 -1
  53. package/dist-lib/components/voorraad/ArtikelCompositionCard.d.ts +1 -1
  54. package/dist-lib/components/voorraad/ArtikelCompositionCard.d.ts.map +1 -1
  55. package/dist-lib/components/voorraad/ArtikelWizard.d.ts +1 -1
  56. package/dist-lib/components/voorraad/ArtikelWizard.d.ts.map +1 -1
  57. package/dist-lib/components/voorraad/CollapsibleText.d.ts +1 -1
  58. package/dist-lib/components/voorraad/CollapsibleText.d.ts.map +1 -1
  59. package/dist-lib/components/voorraad/ConnectionBadge.d.ts +6 -0
  60. package/dist-lib/components/voorraad/ConnectionBadge.d.ts.map +1 -0
  61. package/dist-lib/components/voorraad/ConnectionBadge.js +12 -0
  62. package/dist-lib/components/voorraad/ConnectionPicker.d.ts +8 -0
  63. package/dist-lib/components/voorraad/ConnectionPicker.d.ts.map +1 -0
  64. package/dist-lib/components/voorraad/ConnectionPicker.js +8 -0
  65. package/dist-lib/components/voorraad/EditArtikelPage.d.ts +1 -1
  66. package/dist-lib/components/voorraad/EditArtikelPage.d.ts.map +1 -1
  67. package/dist-lib/components/voorraad/ExcelExportButton.d.ts +1 -1
  68. package/dist-lib/components/voorraad/ExcelExportButton.d.ts.map +1 -1
  69. package/dist-lib/components/voorraad/FloridayConnectionNotice.d.ts +1 -1
  70. package/dist-lib/components/voorraad/FloridayConnectionNotice.d.ts.map +1 -1
  71. package/dist-lib/components/voorraad/FloridayInfoCard.d.ts +1 -1
  72. package/dist-lib/components/voorraad/FloridayInfoCard.d.ts.map +1 -1
  73. package/dist-lib/components/voorraad/FloridayLoadCarriers.d.ts +1 -1
  74. package/dist-lib/components/voorraad/FloridayLoadCarriers.d.ts.map +1 -1
  75. package/dist-lib/components/voorraad/FloridaySentCard.d.ts +1 -1
  76. package/dist-lib/components/voorraad/FloridaySentCard.d.ts.map +1 -1
  77. package/dist-lib/components/voorraad/FloridayStatusBadge.d.ts +4 -0
  78. package/dist-lib/components/voorraad/FloridayStatusBadge.d.ts.map +1 -0
  79. package/dist-lib/components/voorraad/FloridayStatusBadge.js +8 -0
  80. package/dist-lib/components/voorraad/FloridayTakeoverPanel.d.ts +2 -2
  81. package/dist-lib/components/voorraad/FloridayTakeoverPanel.d.ts.map +1 -1
  82. package/dist-lib/components/voorraad/FustAdministratie.d.ts +2 -2
  83. package/dist-lib/components/voorraad/FustAdministratie.d.ts.map +1 -1
  84. package/dist-lib/components/voorraad/FustenPage.d.ts +1 -1
  85. package/dist-lib/components/voorraad/FustenPage.d.ts.map +1 -1
  86. package/dist-lib/components/voorraad/InventorySettingsDrawer.d.ts +1 -1
  87. package/dist-lib/components/voorraad/InventorySettingsDrawer.d.ts.map +1 -1
  88. package/dist-lib/components/voorraad/InventoryStatusBadge.d.ts +1 -1
  89. package/dist-lib/components/voorraad/InventoryStatusBadge.d.ts.map +1 -1
  90. package/dist-lib/components/voorraad/KoppelingStatusPanel.d.ts +1 -1
  91. package/dist-lib/components/voorraad/KoppelingStatusPanel.d.ts.map +1 -1
  92. package/dist-lib/components/voorraad/ModuleHealthCard.d.ts +2 -0
  93. package/dist-lib/components/voorraad/ModuleHealthCard.d.ts.map +1 -0
  94. package/dist-lib/components/voorraad/ModuleHealthCard.js +40 -0
  95. package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts +1 -1
  96. package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts.map +1 -1
  97. package/dist-lib/components/voorraad/OrderHistoryCard.d.ts +1 -1
  98. package/dist-lib/components/voorraad/OrderHistoryCard.d.ts.map +1 -1
  99. package/dist-lib/components/voorraad/PriceStatusBadge.d.ts +1 -1
  100. package/dist-lib/components/voorraad/PriceStatusBadge.d.ts.map +1 -1
  101. package/dist-lib/components/voorraad/ProductCustomFieldsCard.d.ts +1 -1
  102. package/dist-lib/components/voorraad/ProductCustomFieldsCard.d.ts.map +1 -1
  103. package/dist-lib/components/voorraad/ProductLinkCard.d.ts +1 -1
  104. package/dist-lib/components/voorraad/ProductLinkCard.d.ts.map +1 -1
  105. package/dist-lib/components/voorraad/ProductSalePriceField.d.ts +2 -2
  106. package/dist-lib/components/voorraad/ProductSalePriceField.d.ts.map +1 -1
  107. package/dist-lib/components/voorraad/ProductStructureCard.d.ts +2 -2
  108. package/dist-lib/components/voorraad/ProductStructureCard.d.ts.map +1 -1
  109. package/dist-lib/components/voorraad/PublicatiesPage.d.ts +1 -1
  110. package/dist-lib/components/voorraad/PublicatiesPage.d.ts.map +1 -1
  111. package/dist-lib/components/voorraad/PublishProgressCard.d.ts +1 -1
  112. package/dist-lib/components/voorraad/PublishProgressCard.d.ts.map +1 -1
  113. package/dist-lib/components/voorraad/PublishReadinessCard.d.ts +1 -1
  114. package/dist-lib/components/voorraad/PublishReadinessCard.d.ts.map +1 -1
  115. package/dist-lib/components/voorraad/Sneltoetsen.d.ts +2 -2
  116. package/dist-lib/components/voorraad/Sneltoetsen.d.ts.map +1 -1
  117. package/dist-lib/components/voorraad/StepSamenstelling.d.ts +1 -1
  118. package/dist-lib/components/voorraad/StepSamenstelling.d.ts.map +1 -1
  119. package/dist-lib/components/voorraad/StockBulkButtons.d.ts +1 -1
  120. package/dist-lib/components/voorraad/StockBulkButtons.d.ts.map +1 -1
  121. package/dist-lib/components/voorraad/StockHistoryChart.d.ts +1 -1
  122. package/dist-lib/components/voorraad/StockHistoryChart.d.ts.map +1 -1
  123. package/dist-lib/components/voorraad/StockMutationHistoryCard.d.ts +1 -1
  124. package/dist-lib/components/voorraad/StockMutationHistoryCard.d.ts.map +1 -1
  125. package/dist-lib/components/voorraad/StockPushMonitor.d.ts +1 -1
  126. package/dist-lib/components/voorraad/StockPushMonitor.d.ts.map +1 -1
  127. package/dist-lib/components/voorraad/StockSyncStatus.d.ts +1 -1
  128. package/dist-lib/components/voorraad/StockSyncStatus.d.ts.map +1 -1
  129. package/dist-lib/components/voorraad/SupplyReadScopeAlert.d.ts +1 -1
  130. package/dist-lib/components/voorraad/SupplyReadScopeAlert.d.ts.map +1 -1
  131. package/dist-lib/components/voorraad/TelmomentButton.d.ts +1 -1
  132. package/dist-lib/components/voorraad/TelmomentButton.d.ts.map +1 -1
  133. package/dist-lib/components/voorraad/TrayStickerCard.d.ts +1 -1
  134. package/dist-lib/components/voorraad/TrayStickerCard.d.ts.map +1 -1
  135. package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts +1 -1
  136. package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts.map +1 -1
  137. package/dist-lib/components/voorraad/ValidationPage.d.ts +1 -1
  138. package/dist-lib/components/voorraad/ValidationPage.d.ts.map +1 -1
  139. package/dist-lib/components/voorraad/VoorraadBeheerCard.d.ts +1 -1
  140. package/dist-lib/components/voorraad/VoorraadBeheerCard.d.ts.map +1 -1
  141. package/dist-lib/components/voorraad/VoorraadDashboard.d.ts +10 -0
  142. package/dist-lib/components/voorraad/VoorraadDashboard.d.ts.map +1 -0
  143. package/dist-lib/components/voorraad/VoorraadDashboard.js +53 -0
  144. package/dist-lib/components/voorraad/VoorraadPage.d.ts +1 -1
  145. package/dist-lib/components/voorraad/VoorraadPage.d.ts.map +1 -1
  146. package/dist-lib/components/voorraad/VoorraadPagination.d.ts +1 -1
  147. package/dist-lib/components/voorraad/VoorraadPagination.d.ts.map +1 -1
  148. package/dist-lib/components/voorraad/VoorraadStockCard.d.ts +1 -1
  149. package/dist-lib/components/voorraad/VoorraadStockCard.d.ts.map +1 -1
  150. package/dist-lib/components/voorraad/VoorraadSturingCard.d.ts +1 -1
  151. package/dist-lib/components/voorraad/VoorraadSturingCard.d.ts.map +1 -1
  152. package/dist-lib/components/voorraad/VoorraadTable.d.ts +1 -1
  153. package/dist-lib/components/voorraad/VoorraadTable.d.ts.map +1 -1
  154. package/dist-lib/components/voorraad/VoorraadVeldenCard.d.ts +1 -1
  155. package/dist-lib/components/voorraad/VoorraadVeldenCard.d.ts.map +1 -1
  156. package/dist-lib/components/voorraad/artikel/ArtikelPagina.d.ts +1 -1
  157. package/dist-lib/components/voorraad/artikel/ArtikelPagina.d.ts.map +1 -1
  158. package/dist-lib/components/voorraad/artikel/TwijfelKiezen.d.ts +1 -1
  159. package/dist-lib/components/voorraad/artikel/TwijfelKiezen.d.ts.map +1 -1
  160. package/dist-lib/components/voorraad/lijst/ImporteerKnop.d.ts +1 -1
  161. package/dist-lib/components/voorraad/lijst/ImporteerKnop.d.ts.map +1 -1
  162. package/dist-lib/components/voorraad/lijst/LijstExportKnop.d.ts +1 -1
  163. package/dist-lib/components/voorraad/lijst/LijstExportKnop.d.ts.map +1 -1
  164. package/dist-lib/components/voorraad/lijst/SnelActieDialogen.d.ts +2 -2
  165. package/dist-lib/components/voorraad/lijst/SnelActieDialogen.d.ts.map +1 -1
  166. package/dist-lib/components/voorraad/lijst/VoorraadLijstTabel.d.ts +2 -2
  167. package/dist-lib/components/voorraad/lijst/VoorraadLijstTabel.d.ts.map +1 -1
  168. package/dist-lib/integrations/supabase/client.js +1 -1
  169. package/dist-lib/integrations/supabase/client.server.js +1 -1
  170. package/dist-lib/lib/__tests__/floricode-required-features.test.js +3 -7
  171. package/dist-lib/lib/floriday-field-sources.d.ts +18 -0
  172. package/dist-lib/lib/floriday-field-sources.d.ts.map +1 -0
  173. package/dist-lib/lib/floriday-field-sources.js +45 -0
  174. package/dist-lib/lib/floriday-schema-to-zod.d.ts +9 -0
  175. package/dist-lib/lib/floriday-schema-to-zod.d.ts.map +1 -0
  176. package/dist-lib/lib/floriday-schema-to-zod.js +53 -0
  177. package/dist-lib/lib/merge-products.d.ts +8 -0
  178. package/dist-lib/lib/merge-products.d.ts.map +1 -0
  179. package/dist-lib/lib/merge-products.js +17 -0
  180. package/dist-lib/lib/module-health.functions.d.ts +53497 -0
  181. package/dist-lib/lib/module-health.functions.d.ts.map +1 -0
  182. package/dist-lib/lib/module-health.functions.js +261 -0
  183. package/dist-lib/lib/validationSchemas.d.ts +15 -0
  184. package/dist-lib/lib/validationSchemas.d.ts.map +1 -0
  185. package/dist-lib/lib/validationSchemas.js +25 -0
  186. package/dist-lib/server-hooks/floriday-stock-reconcile.d.ts.map +1 -1
  187. package/dist-lib/server-hooks/floriday-stock-reconcile.js +14 -1
  188. package/package.json +1 -1
  189. package/sql/floriday-voorraad-schema.sql +13 -27
  190. package/dist-lib/components/voorraad/__tests__/count-stock-free.test.d.ts +0 -2
  191. package/dist-lib/components/voorraad/__tests__/count-stock-free.test.d.ts.map +0 -1
  192. package/dist-lib/components/voorraad/__tests__/count-stock-free.test.js +0 -12
  193. package/dist-lib/lib/__tests__/article-code.test.d.ts +0 -2
  194. package/dist-lib/lib/__tests__/article-code.test.d.ts.map +0 -1
  195. package/dist-lib/lib/__tests__/article-code.test.js +0 -11
  196. package/dist-lib/lib/__tests__/erp-test-123.test.d.ts +0 -2
  197. package/dist-lib/lib/__tests__/erp-test-123.test.d.ts.map +0 -1
  198. package/dist-lib/lib/__tests__/erp-test-123.test.js +0 -43
  199. package/dist-lib/lib/__tests__/floriday-customer-offers.test.d.ts +0 -2
  200. package/dist-lib/lib/__tests__/floriday-customer-offers.test.d.ts.map +0 -1
  201. package/dist-lib/lib/__tests__/floriday-customer-offers.test.js +0 -36
  202. package/dist-lib/lib/__tests__/floriday-fetch-status.test.d.ts +0 -2
  203. package/dist-lib/lib/__tests__/floriday-fetch-status.test.d.ts.map +0 -1
  204. package/dist-lib/lib/__tests__/floriday-fetch-status.test.js +0 -25
  205. package/dist-lib/lib/__tests__/floriday-write-mode.test.d.ts +0 -2
  206. package/dist-lib/lib/__tests__/floriday-write-mode.test.d.ts.map +0 -1
  207. package/dist-lib/lib/__tests__/floriday-write-mode.test.js +0 -40
  208. package/dist-lib/lib/__tests__/fust-dimensions.test.d.ts +0 -2
  209. package/dist-lib/lib/__tests__/fust-dimensions.test.d.ts.map +0 -1
  210. package/dist-lib/lib/__tests__/fust-dimensions.test.js +0 -27
  211. package/dist-lib/lib/__tests__/load-carriers.test.d.ts +0 -2
  212. package/dist-lib/lib/__tests__/load-carriers.test.d.ts.map +0 -1
  213. package/dist-lib/lib/__tests__/load-carriers.test.js +0 -15
  214. package/dist-lib/lib/__tests__/mirror-products.test.d.ts +0 -2
  215. package/dist-lib/lib/__tests__/mirror-products.test.d.ts.map +0 -1
  216. package/dist-lib/lib/__tests__/mirror-products.test.js +0 -13
  217. package/dist-lib/lib/__tests__/product-packings.test.d.ts +0 -2
  218. package/dist-lib/lib/__tests__/product-packings.test.d.ts.map +0 -1
  219. package/dist-lib/lib/__tests__/product-packings.test.js +0 -42
  220. package/dist-lib/lib/__tests__/publish-114.test.d.ts +0 -2
  221. package/dist-lib/lib/__tests__/publish-114.test.d.ts.map +0 -1
  222. package/dist-lib/lib/__tests__/publish-114.test.js +0 -31
  223. package/dist-lib/lib/__tests__/publish-packing-block.test.d.ts +0 -2
  224. package/dist-lib/lib/__tests__/publish-packing-block.test.d.ts.map +0 -1
  225. package/dist-lib/lib/__tests__/publish-packing-block.test.js +0 -14
  226. package/dist-lib/lib/__tests__/release-130.test.d.ts +0 -2
  227. package/dist-lib/lib/__tests__/release-130.test.d.ts.map +0 -1
  228. package/dist-lib/lib/__tests__/release-130.test.js +0 -103
  229. package/dist-lib/lib/__tests__/release-134.test.d.ts +0 -2
  230. package/dist-lib/lib/__tests__/release-134.test.d.ts.map +0 -1
  231. package/dist-lib/lib/__tests__/release-134.test.js +0 -50
  232. package/dist-lib/lib/__tests__/release-136.test.d.ts +0 -2
  233. package/dist-lib/lib/__tests__/release-136.test.d.ts.map +0 -1
  234. package/dist-lib/lib/__tests__/release-136.test.js +0 -36
  235. package/dist-lib/lib/__tests__/release-140.test.d.ts +0 -2
  236. package/dist-lib/lib/__tests__/release-140.test.d.ts.map +0 -1
  237. package/dist-lib/lib/__tests__/release-140.test.js +0 -42
  238. package/dist-lib/lib/__tests__/request-guard.test.d.ts +0 -2
  239. package/dist-lib/lib/__tests__/request-guard.test.d.ts.map +0 -1
  240. package/dist-lib/lib/__tests__/request-guard.test.js +0 -50
  241. package/dist-lib/lib/__tests__/stock-save.test.d.ts +0 -2
  242. package/dist-lib/lib/__tests__/stock-save.test.d.ts.map +0 -1
  243. package/dist-lib/lib/__tests__/stock-save.test.js +0 -35
  244. package/dist-lib/lib/__tests__/stock-scope.test.d.ts +0 -2
  245. package/dist-lib/lib/__tests__/stock-scope.test.d.ts.map +0 -1
  246. package/dist-lib/lib/__tests__/stock-scope.test.js +0 -44
  247. package/dist-lib/server-hooks/__tests__/trade-item-photo.test.d.ts +0 -2
  248. package/dist-lib/server-hooks/__tests__/trade-item-photo.test.d.ts.map +0 -1
  249. package/dist-lib/server-hooks/__tests__/trade-item-photo.test.js +0 -19
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Statusoverzicht van de module: klopt de configuratie, draaien de
3
+ * achtergrondtaken en loopt de voorraadsync?
4
+ *
5
+ * Bewust één server-functie die alles samenvat, zodat de instellingenpagina
6
+ * met één blik laat zien wat er in déze shell nog ontbreekt.
7
+ */
8
+ import { createServerFn } from "@tanstack/react-start";
9
+ import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
10
+ export const getModuleHealth = createServerFn({ method: "GET" })
11
+ .middleware([requireSupabaseAuth])
12
+ .handler(async () => {
13
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server.js");
14
+ const admin = supabaseAdmin;
15
+ const checks = [];
16
+ // --- Configuratie in de database -------------------------------------
17
+ const { data: cfgRows } = await admin
18
+ .from("module_runtime_config")
19
+ .select("key,value,updated_at");
20
+ const cfg = new Map((cfgRows ?? []).map((r) => [r.key, r]));
21
+ const baseUrl = cfg.get("voorraad_base_url")?.value ?? "";
22
+ checks.push({
23
+ id: "base_url",
24
+ label: "Adres van deze module",
25
+ status: baseUrl ? "ok" : "error",
26
+ detail: baseUrl || "Nog niet vastgelegd.",
27
+ hint: baseUrl
28
+ ? undefined
29
+ : "Open een pagina van de gepubliceerde module; het adres wordt dan automatisch vastgelegd.",
30
+ });
31
+ const hookKey = cfg.get("voorraad_hook_apikey")?.value ?? "";
32
+ checks.push({
33
+ id: "hook_apikey",
34
+ label: "Sleutel voor achtergrondtaken",
35
+ status: hookKey ? "ok" : "error",
36
+ detail: hookKey ? "Aanwezig" : "Ontbreekt",
37
+ hint: hookKey ? undefined : "Controleer of SUPABASE_PUBLISHABLE_KEY in deze omgeving is ingesteld.",
38
+ });
39
+ const processor = cfg.get("stock_queue_processor_base_url")?.value ?? "";
40
+ checks.push({
41
+ id: "processor",
42
+ label: "Verwerker van de voorraadwachtrij",
43
+ status: processor ? "ok" : "warn",
44
+ detail: processor || "Niet ingesteld; de module verwerkt de wachtrij dan zelf.",
45
+ });
46
+ // --- Koppeling met de Authenticatiemodule ------------------------------
47
+ let activeEnvironment = null;
48
+ try {
49
+ const { describeGatewayResolution } = await import("./floriday-gateway.server.js");
50
+ const info = await describeGatewayResolution();
51
+ const bron = info.addressSource === "override"
52
+ ? "handmatig ingesteld adres"
53
+ : info.addressSource === "central"
54
+ ? "automatisch via de centrale authenticatiemodule"
55
+ : "onbekend";
56
+ checks.push({
57
+ id: "gateway",
58
+ label: "Koppeling Authenticatiemodule",
59
+ status: info.addressSource === "onbekend" || info.secretSource === "onbekend"
60
+ ? "error"
61
+ : info.mismatch
62
+ ? "warn"
63
+ : "ok",
64
+ detail: info.addressSource === "onbekend"
65
+ ? "Geen adres gevonden; Floriday-acties zullen mislukken."
66
+ : `${info.address} (${bron})`,
67
+ hint: info.mismatch
68
+ ? "Let op: het handmatig ingestelde adres wijkt af van het adres dat de centrale " +
69
+ `module doorgeeft (${info.centralAddress}). Het handmatige adres krijgt voorrang. ` +
70
+ "Verwijder het handmatige adres zodra deze omgeving verhuist."
71
+ : (info.error ?? undefined),
72
+ });
73
+ }
74
+ catch (e) {
75
+ checks.push({
76
+ id: "gateway",
77
+ label: "Koppeling Authenticatiemodule",
78
+ status: "error",
79
+ detail: e?.message ?? "Kan de koppeling niet vaststellen.",
80
+ });
81
+ }
82
+ // --- Floriday-koppeling ----------------------------------------------
83
+ try {
84
+ const { data: conn } = await admin.rpc("get_active_floriday_connection_public");
85
+ const row = Array.isArray(conn) ? conn[0] : conn;
86
+ activeEnvironment = row?.environment ?? null;
87
+ checks.push({
88
+ id: "floriday",
89
+ label: "Floriday-koppeling",
90
+ status: row?.id ? "ok" : "error",
91
+ detail: row?.id
92
+ ? `Actief (${row.environment ?? "onbekende omgeving"})`
93
+ : "Geen actieve koppeling gevonden.",
94
+ hint: row?.id ? undefined : "Koppel Floriday in de authenticatiemodule.",
95
+ });
96
+ }
97
+ catch (e) {
98
+ checks.push({
99
+ id: "floriday",
100
+ label: "Floriday-koppeling",
101
+ status: "error",
102
+ detail: e?.message ?? "Kan de koppeling niet uitlezen.",
103
+ });
104
+ }
105
+ checks.push({
106
+ id: "environment",
107
+ label: "Actieve omgeving",
108
+ status: activeEnvironment ? "ok" : "warn",
109
+ detail: activeEnvironment
110
+ ? activeEnvironment === "live"
111
+ ? "Live — wijzigingen komen echt in Floriday."
112
+ : "Proefomgeving (staging)."
113
+ : "Nog geen omgeving gekozen.",
114
+ hint: activeEnvironment
115
+ ? "De authenticatiemodule moet voor deze omgeving inloggegevens hebben; anders " +
116
+ "melden voorraadwijzigingen dat er geen koppeling voor deze omgeving is."
117
+ : undefined,
118
+ });
119
+ // --- Voorraadwachtrij --------------------------------------------------
120
+ const { data: queueRows } = await admin
121
+ .from("floriday_continuous_stock_queue")
122
+ .select("status,created_at,last_error")
123
+ .in("status", ["pending", "processing", "failed"])
124
+ .order("created_at", { ascending: true })
125
+ .limit(1000);
126
+ const rows = (queueRows ?? []);
127
+ const failed = rows.filter((r) => r.status === "failed").length;
128
+ const pending = rows.filter((r) => r.status !== "failed").length;
129
+ const oldest = rows[0]?.created_at;
130
+ const stale = oldest && Date.now() - new Date(oldest).getTime() > 30 * 60000;
131
+ checks.push({
132
+ id: "queue",
133
+ label: "Voorraadwachtrij",
134
+ status: failed > 0 || stale ? "warn" : "ok",
135
+ detail: rows.length === 0
136
+ ? "Leeg — alles is verstuurd."
137
+ : `${pending} wachtend, ${failed} mislukt${oldest ? `; oudste van ${new Date(oldest).toLocaleString("nl-NL")}` : ""}.`,
138
+ hint: rows.find((r) => r.last_error)?.last_error ?? undefined,
139
+ });
140
+ // --- Geplande taken ----------------------------------------------------
141
+ try {
142
+ const { data: jobs } = await admin.rpc("get_floriday_cron_jobs");
143
+ const list = (jobs ?? []);
144
+ const active = list.filter((j) => j.active !== false).length;
145
+ checks.push({
146
+ id: "cron",
147
+ label: "Geplande achtergrondtaken",
148
+ status: active > 0 ? "ok" : "error",
149
+ detail: active > 0
150
+ ? `${active} taken actief.`
151
+ : "Geen actieve taken gevonden in de database.",
152
+ });
153
+ }
154
+ catch {
155
+ checks.push({
156
+ id: "cron",
157
+ label: "Geplande achtergrondtaken",
158
+ status: "warn",
159
+ detail: "Status van de geplande taken kon niet worden opgehaald.",
160
+ });
161
+ }
162
+ // --- Dubbele voorraadregels -------------------------------------------
163
+ try {
164
+ const { data: legacyRows } = await admin
165
+ .from("trade_item_stock")
166
+ .select("trade_item_key")
167
+ .like("trade_item_key", "product:%")
168
+ .limit(500);
169
+ const legacy = (legacyRows ?? []);
170
+ const ids = legacy
171
+ .map((r) => String(r.trade_item_key).slice(8))
172
+ .filter((v) => /^[0-9a-f-]{36}$/i.test(v));
173
+ let doubles = 0;
174
+ if (ids.length) {
175
+ const { data: prods } = await admin
176
+ .from("products")
177
+ .select("id")
178
+ .in("id", ids);
179
+ doubles = (prods ?? []).length;
180
+ }
181
+ checks.push({
182
+ id: "stock_keys",
183
+ label: "Voorraadregels per artikel",
184
+ status: doubles > 0 ? "warn" : "ok",
185
+ detail: doubles > 0
186
+ ? `${doubles} artikel(en) hebben nog een oude, tweede voorraadregel.`
187
+ : "Elk artikel heeft precies één voorraadregel.",
188
+ hint: doubles > 0
189
+ ? "Sla de voorraad van die artikelen één keer opnieuw op; de regels worden dan automatisch samengevoegd."
190
+ : undefined,
191
+ });
192
+ }
193
+ catch {
194
+ // Controle mag de statuskaart nooit blokkeren.
195
+ }
196
+ // --- Aantallen bij producten gelijk aan de voorraad? -------------------
197
+ try {
198
+ const { data: stockRows } = await admin
199
+ .from("trade_item_stock")
200
+ .select("trade_item_key,physical_stock,reserved_stock")
201
+ .limit(2000);
202
+ const rows = (stockRows ?? []);
203
+ const byKey = new Map(rows.map((r) => [String(r.trade_item_key), Number(r.physical_stock ?? 0)]));
204
+ const { data: prodRows } = await admin
205
+ .from("products")
206
+ .select("id,product,quantity,trade_item_key,floriday_trade_item_id")
207
+ .limit(2000);
208
+ let mismatch = 0;
209
+ for (const p of (prodRows ?? [])) {
210
+ const key = (p.floriday_trade_item_id && byKey.has(String(p.floriday_trade_item_id))
211
+ ? String(p.floriday_trade_item_id)
212
+ : null) ??
213
+ (p.trade_item_key && byKey.has(String(p.trade_item_key))
214
+ ? String(p.trade_item_key)
215
+ : null) ??
216
+ (byKey.has(`product:${p.id}`) ? `product:${p.id}` : null);
217
+ if (!key)
218
+ continue;
219
+ if (Number(p.quantity ?? 0) !== byKey.get(key))
220
+ mismatch += 1;
221
+ }
222
+ checks.push({
223
+ id: "quantity_sync",
224
+ label: "Aantallen bij producten",
225
+ status: mismatch > 0 ? "warn" : "ok",
226
+ detail: mismatch > 0
227
+ ? `${mismatch} product(en) tonen een ander aantal dan de voorraad.`
228
+ : "Elk product toont hetzelfde aantal als de voorraad.",
229
+ hint: mismatch > 0
230
+ ? "Sla de voorraad van die producten één keer opnieuw op; het aantal loopt daarna weer mee."
231
+ : undefined,
232
+ });
233
+ // --- Reserveringen hoger dan de liggende voorraad --------------------
234
+ const over = rows.filter((r) => Number(r.reserved_stock ?? 0) > Number(r.physical_stock ?? 0)).length;
235
+ checks.push({
236
+ id: "reservations",
237
+ label: "Reserveringen",
238
+ status: over > 0 ? "warn" : "ok",
239
+ detail: over > 0
240
+ ? `${over} artikel(en) hebben meer gereserveerd dan er liggend is.`
241
+ : "Geen artikelen met meer reserveringen dan voorraad.",
242
+ hint: over > 0
243
+ ? "Dit komt door openstaande orders. Controleer of die orders nog terecht openstaan; afgeronde of geannuleerde orders geven de reservering vrij."
244
+ : undefined,
245
+ });
246
+ }
247
+ catch {
248
+ // Controle mag de statuskaart nooit blokkeren.
249
+ }
250
+ return { checkedAt: new Date().toISOString(), checks };
251
+ });
252
+ /** Geeft vastgelopen wachtrijregels handmatig vrij. */
253
+ export const recoverStockQueue = createServerFn({ method: "POST" })
254
+ .middleware([requireSupabaseAuth])
255
+ .handler(async () => {
256
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server.js");
257
+ const { data, error } = await supabaseAdmin.rpc("reset_stalled_floriday_stock_queue", { p_include_failed: true });
258
+ if (error)
259
+ throw new Error(error.message);
260
+ return { restored: Number(data ?? 0) };
261
+ });
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+ export declare const loginSchema: z.ZodObject<{
3
+ email: z.ZodString;
4
+ password: z.ZodString;
5
+ }, z.core.$strip>;
6
+ export declare const bugReportSchema: z.ZodObject<{
7
+ title: z.ZodString;
8
+ description: z.ZodString;
9
+ }, z.core.$strip>;
10
+ export declare const ALLOWED_FILE_TYPES: string[];
11
+ export declare function validateFileUpload(file: File): {
12
+ valid: boolean;
13
+ error?: string;
14
+ };
15
+ //# sourceMappingURL=validationSchemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationSchemas.d.ts","sourceRoot":"","sources":["../../src/lib/validationSchemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,WAAW;;;iBAGtB,CAAC;AAEH,eAAO,MAAM,eAAe;;;iBAG1B,CAAC;AAEH,eAAO,MAAM,kBAAkB,UAK9B,CAAC;AAIF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAQjF"}
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ export const loginSchema = z.object({
3
+ email: z.string().email("Ongeldig e-mailadres"),
4
+ password: z.string().min(6, "Wachtwoord moet minimaal 6 tekens bevatten"),
5
+ });
6
+ export const bugReportSchema = z.object({
7
+ title: z.string().min(1, "Titel is verplicht").max(200),
8
+ description: z.string().min(1, "Beschrijving is verplicht").max(5000),
9
+ });
10
+ export const ALLOWED_FILE_TYPES = [
11
+ "image/png",
12
+ "image/jpeg",
13
+ "image/gif",
14
+ "application/pdf",
15
+ ];
16
+ const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
17
+ export function validateFileUpload(file) {
18
+ if (!ALLOWED_FILE_TYPES.includes(file.type)) {
19
+ return { valid: false, error: "Bestandstype niet toegestaan" };
20
+ }
21
+ if (file.size > MAX_FILE_SIZE) {
22
+ return { valid: false, error: "Bestand is te groot (max 10MB)" };
23
+ }
24
+ return { valid: true };
25
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"floriday-stock-reconcile.d.ts","sourceRoot":"","sources":["../../src/server-hooks/floriday-stock-reconcile.ts"],"names":[],"mappings":"AA2PA,wHAAwH;AACxH,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAOtF"}
1
+ {"version":3,"file":"floriday-stock-reconcile.d.ts","sourceRoot":"","sources":["../../src/server-hooks/floriday-stock-reconcile.ts"],"names":[],"mappings":"AA2PA,wHAAwH;AACxH,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkBtF"}
@@ -236,7 +236,20 @@ async function handle(request) {
236
236
  /** Shell-handler voor /api/public/hooks/floriday-stock-reconcile. Schakelaar: voorraad_hook_enabled.stock_reconcile. */
237
237
  export async function handleFloridayStockReconcile(request) {
238
238
  // Zelfde geregistreerde ingang, eigen taak: automatische controle van Floriday-versies (standaard aan, alleen lezen).
239
- if (new URL(request.url).searchParams.get("taak") === "versies") {
239
+ // 'taak' eerst uit de body (flowselections_cron_post), querystring als terugval.
240
+ let taak = null;
241
+ if (request.method === "POST") {
242
+ try {
243
+ const b = await request.clone().json();
244
+ taak = b && typeof b === "object" ? b.taak : null;
245
+ }
246
+ catch {
247
+ taak = null;
248
+ }
249
+ }
250
+ if (typeof taak !== "string" || !taak)
251
+ taak = new URL(request.url).searchParams.get("taak");
252
+ if (taak === "versies") {
240
253
  const { handleVersieronde } = await import("./floriday-versieronde.js");
241
254
  return runGuardedHook(request, "floriday_versies", handleVersieronde, "floriday-versieronde");
242
255
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/floriday-voorraad",
3
- "version": "1.0.155",
3
+ "version": "1.0.156",
4
4
  "sideEffects": false,
5
5
  "type": "module",
6
6
  "main": "./dist-lib/index.js",
@@ -1,5 +1,5 @@
1
- -- @flowselections/floriday-voorraad 1.0.151 – volledig schema (idempotent, geen gegevens).
2
- -- Laatste migratie: 20261104151458_f69413fa-b317-46e8-866e-041ed860baac.sql
1
+ -- @flowselections/floriday-voorraad 1.0.155 – volledig schema (idempotent, geen gegevens).
2
+ -- Laatste migratie: 20261105084822_83a0e67a-a170-423b-a118-b20bb20eaa4a.sql
3
3
  -- Gegenereerd uit de database met scripts/generate-voorraad-schema.py. Niet met de hand wijzigen.
4
4
  -- Volgorde 20. Ontbrekende tabellen van andere modules worden overgeslagen met een NOTICE; draai opnieuw na die module.
5
5
  -- De statuscontrole van floriday_continuous_stock_queue is van Voorraad en wordt hier opnieuw gemaakt.
@@ -5957,23 +5957,9 @@ CREATE OR REPLACE FUNCTION public.run_floriday_stock_queue_process()
5957
5957
  SECURITY DEFINER
5958
5958
  SET search_path TO 'public'
5959
5959
  AS $function$
5960
- DECLARE
5961
- v_base_url text;
5962
- v_apikey text;
5963
5960
  BEGIN
5964
5961
  PERFORM public.voorraad_vereis('server', 'run_floriday_stock_queue_process');
5965
- SELECT value INTO v_base_url FROM public.module_runtime_config WHERE key = 'stock_queue_processor_base_url';
5966
- SELECT value INTO v_apikey FROM public.module_runtime_config WHERE key = 'voorraad_hook_apikey';
5967
-
5968
- IF v_base_url IS NULL OR v_base_url = '' OR v_apikey IS NULL OR v_apikey = '' THEN
5969
- RETURN;
5970
- END IF;
5971
-
5972
- PERFORM net.http_post(
5973
- url := rtrim(v_base_url, '/') || '/api/public/cron/process-stock-queue',
5974
- headers := jsonb_build_object('Content-Type', 'application/json', 'apikey', v_apikey),
5975
- body := '{}'::jsonb
5976
- );
5962
+ PERFORM public.flowselections_cron_post('/api/public/cron/process-stock-queue', '{}'::jsonb, 30000);
5977
5963
  END;
5978
5964
  $function$
5979
5965
  ;
@@ -10771,18 +10757,18 @@ CREATE OR REPLACE FUNCTION public.voorraad_hook_post(p_path text, p_timeout inte
10771
10757
  SECURITY DEFINER
10772
10758
  SET search_path TO 'public'
10773
10759
  AS $function$
10774
- DECLARE v_base text; v_key text;
10760
+ DECLARE v_pad text; v_query text; v_body jsonb := '{}'::jsonb;
10775
10761
  BEGIN
10776
10762
  PERFORM public.voorraad_vereis('server', 'voorraad_hook_post');
10777
- v_base := public.voorraad_hook_base_url();
10778
- SELECT value INTO v_key FROM module_runtime_config WHERE key = 'voorraad_hook_apikey';
10779
- IF COALESCE(v_base,'') = '' OR COALESCE(v_key,'') = '' THEN
10780
- RAISE LOG '[voorraad] geen Shell-adres of sleutel bekend voor %', p_path;
10781
- RETURN;
10782
- END IF;
10783
- PERFORM net.http_post(url := v_base || p_path,
10784
- headers := jsonb_build_object('Content-Type','application/json','apikey',v_key),
10785
- body := '{}'::jsonb, timeout_milliseconds := p_timeout);
10763
+ v_pad := split_part(p_path, '?', 1);
10764
+ IF position('?' IN p_path) > 0 THEN
10765
+ v_query := substr(p_path, position('?' IN p_path) + 1);
10766
+ SELECT COALESCE(jsonb_object_agg(split_part(d, '=', 1), substr(d, length(split_part(d, '=', 1)) + 2)), '{}'::jsonb)
10767
+ INTO v_body
10768
+ FROM regexp_split_to_table(v_query, '&') AS d
10769
+ WHERE split_part(d, '=', 1) <> '';
10770
+ END IF;
10771
+ PERFORM public.flowselections_cron_post(v_pad, v_body, p_timeout);
10786
10772
  END $function$
10787
10773
  ;
10788
10774
  REVOKE ALL ON FUNCTION voorraad_hook_post(text,integer) FROM PUBLIC;
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=count-stock-free.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"count-stock-free.test.d.ts","sourceRoot":"","sources":["../../../../src/components/voorraad/__tests__/count-stock-free.test.ts"],"names":[],"mappings":""}
@@ -1,12 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { countStock } from "../VoorraadPage.js";
3
- describe("countStock vrij beschikbaar", () => {
4
- it("liggend 100 met 100 gereserveerd: op voorraad, niet vrij", () => {
5
- const c = countStock([{ quantity: 100, availableQuantity: 0, minQuantity: 0 }]);
6
- expect(c.inStock).toBe(1);
7
- expect(c.freeAvailable).toBe(0);
8
- });
9
- it("liggend 100 met 40 gereserveerd: vrij", () => {
10
- expect(countStock([{ quantity: 100, availableQuantity: 60, minQuantity: 0 }]).freeAvailable).toBe(1);
11
- });
12
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=article-code.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"article-code.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/article-code.test.ts"],"names":[],"mappings":""}
@@ -1,11 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { articleCodeProblem } from "../article-code.js";
3
- describe("artikelcode-controle", () => {
4
- it("weigert Artikelcode", () => expect(articleCodeProblem("Artikelcode", "Strelitzia")).not.toBeNull());
5
- it("weigert Naam", () => expect(articleCodeProblem(" naam ", "X")).not.toBeNull());
6
- it("weigert test", () => expect(articleCodeProblem("TEST", "X")).not.toBeNull());
7
- it("weigert leeg", () => expect(articleCodeProblem(" ", "X")).not.toBeNull());
8
- it("staat TQA2710G toe", () => expect(articleCodeProblem("TQA2710G", "Gaultheria")).toBeNull());
9
- it("weigert code gelijk aan naam bij handmatig", () => expect(articleCodeProblem("Strelitzia", "strelitzia", "manual")).not.toBeNull());
10
- it("staat code gelijk aan naam toe bij import", () => expect(articleCodeProblem("Strelitzia", "strelitzia", "import")).toBeNull());
11
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=erp-test-123.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"erp-test-123.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/erp-test-123.test.ts"],"names":[],"mappings":""}
@@ -1,43 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { resolveBuyerOrganizations, isMissingFunctionError } from "../buyer-organizations.js";
3
- import { missingPackingFields, simplePackingToRow, engineOordeelRegel, ENGINE_CARRIER_CODE } from "../simple-packing.js";
4
- const cache = async () => ["cache-1"];
5
- describe("kopers: vaste zoekvolgorde", () => {
6
- it("expliciete keuze gaat voor alles", async () => {
7
- const r = await resolveBuyerOrganizations({ explicit: ["a"], priceGroupCustomers: ["b"], authFunction: ["c"], connectionsCache: cache });
8
- expect(r).toMatchObject({ ids: ["a"], source: "keuze" });
9
- });
10
- it("zonder keuze: klanten van de prijsgroep", async () => {
11
- const r = await resolveBuyerOrganizations({ explicit: [], priceGroupCustomers: ["b", "b", "b2"], authFunction: ["c"], connectionsCache: cache });
12
- expect(r).toMatchObject({ ids: ["b", "b2"], source: "prijsgroep" });
13
- });
14
- it("daarna floriday_buyer_organizations, ook als die leeg is (geen terugval op de oude cache)", async () => {
15
- const r = await resolveBuyerOrganizations({ explicit: [], priceGroupCustomers: [], authFunction: [], connectionsCache: cache });
16
- expect(r.source).toBe("geen");
17
- expect(r.ids).toEqual([]);
18
- });
19
- it("alleen als de functie nog niet bestaat: de oude koppelingscache", async () => {
20
- const r = await resolveBuyerOrganizations({ explicit: [], priceGroupCustomers: [], authFunction: null, connectionsCache: cache });
21
- expect(r).toMatchObject({ ids: ["cache-1"], source: "floriday_connections_cache" });
22
- });
23
- it("herkent een ontbrekende functie", () => {
24
- expect(isMissingFunctionError({ code: "PGRST202" })).toBe(true);
25
- expect(isMissingFunctionError({ code: "42501", message: "geen toegang" })).toBe(false);
26
- });
27
- });
28
- describe("belading in de eenvoudige route", () => {
29
- const full = { vbnPackageCode: "412", piecesPerPackage: "12", packagesPerLayer: "5", layersPerLoadCarrier: "8", loadCarrier: "DANISH_TROLLEY" };
30
- it("alle vijf velden verplicht, ook lagen per kar en ladingdrager", () => {
31
- expect(missingPackingFields({ ...full, layersPerLoadCarrier: "" })).toEqual(["lagen per kar"]);
32
- expect(missingPackingFields({ ...full, loadCarrier: "" })).toEqual(["ladingdrager"]);
33
- expect(missingPackingFields(full)).toEqual([]);
34
- });
35
- it("geen standaardwaarden: onvolledig = fout", () => {
36
- expect(() => simplePackingToRow({ ...full, piecesPerPackage: "0" })).toThrow(/planten per fust/);
37
- });
38
- it("Deense container (DC) gaat als danish_container naar de Engine", () => {
39
- expect(ENGINE_CARRIER_CODE.DANISH_TROLLEY).toBe("danish_container");
40
- expect(engineOordeelRegel("p1", full)).toEqual({ product_id: "p1", carrier_code: "danish_container", plants_per_crate: 12, crates_per_layer: 5, layers_per_cart: 8 });
41
- expect(simplePackingToRow(full)).toMatchObject({ vbn_package_code: 412, pieces_per_package: 12, packages_per_layer: 5, layers_per_load_carrier: 8, is_primary: true });
42
- });
43
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=floriday-customer-offers.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"floriday-customer-offers.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/floriday-customer-offers.test.ts"],"names":[],"mappings":""}
@@ -1,36 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { customerOffersByTradeItem } from "../floriday-customer-offers.js";
3
- const NOW = new Date("2026-10-20T10:00:00Z");
4
- const TID = "AAAAAAAA-1111-2222-3333-444444444444";
5
- const line = (over = {}) => ({
6
- tradeItemId: TID,
7
- pricePerPiece: { value: 0.85, currency: "EUR" },
8
- numberOfPieces: 500,
9
- tradePeriod: { startDateTime: "2026-10-01T00:00:00Z", endDateTime: "2026-11-01T00:00:00Z" },
10
- isDeleted: false,
11
- ...over,
12
- });
13
- const offer = (over = {}, lines = [line()]) => ({
14
- floriday_id: "o1",
15
- data: { customerOfferId: "o1", customerOfferType: "SUPPLY_REQUEST", isDraft: false, isDeleted: false,
16
- customerOrganizationId: "CUST-1", customerOfferLines: lines, ...over },
17
- });
18
- describe("klantaanbiedingen koppelen op customerOfferLines[].tradeItemId", () => {
19
- it("koppelt een actuele regel op artikel-id, met klantnaam", () => {
20
- const m = customerOffersByTradeItem([offer()], new Map([["cust-1", "Plantor"]]), NOW);
21
- const v = m.get(TID.toLowerCase());
22
- expect(v).toHaveLength(1);
23
- expect(v[0].price).toBe(0.85);
24
- expect(v[0].pieces).toBe(500);
25
- expect(v[0].customer).toBe("Plantor");
26
- });
27
- it("slaat verlopen regels over", () => {
28
- const m = customerOffersByTradeItem([offer({}, [line({ tradePeriod: { endDateTime: "2024-12-28T00:00:00Z" } })])], new Map(), NOW);
29
- expect(m.size).toBe(0);
30
- });
31
- it("slaat concepten, verwijderde aanbiedingen en verwijderde regels over", () => {
32
- expect(customerOffersByTradeItem([offer({ isDraft: true })], new Map(), NOW).size).toBe(0);
33
- expect(customerOffersByTradeItem([offer({ isDeleted: true })], new Map(), NOW).size).toBe(0);
34
- expect(customerOffersByTradeItem([offer({}, [line({ isDeleted: true })])], new Map(), NOW).size).toBe(0);
35
- });
36
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=floriday-fetch-status.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"floriday-fetch-status.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/floriday-fetch-status.test.ts"],"names":[],"mappings":""}
@@ -1,25 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { fetchState, fetchStateBlocksTakeover } from "../floriday-fetch-status.js";
3
- const row = (t, done, ok) => ({
4
- backfill_target_sequence: t, backfill_done_at: done, last_success_at: ok,
5
- });
6
- describe("ophaalstatus artikelen", () => {
7
- it("lopend ophalen blokkeert overnemen", () => {
8
- expect(fetchState(row(500, null, "2026-10-20"), 120)).toBe("bezig");
9
- expect(fetchStateBlocksTakeover(fetchState(row(500, null, null), 0))).toBe(true);
10
- });
11
- it("nog nooit gestart blokkeert overnemen", () => {
12
- expect(fetchState(null, 0)).toBe("nooit_gestart");
13
- expect(fetchState(row(null, null, null), 0)).toBe("nooit_gestart");
14
- expect(fetchStateBlocksTakeover("nooit_gestart")).toBe(true);
15
- });
16
- it("na afloop met lege target komt de knop vrij", () => {
17
- expect(fetchState(row(null, "2026-10-20", "2026-10-20"), 50)).toBe("compleet");
18
- expect(fetchState(row(500, "2026-10-20", "2026-10-20"), 50)).toBe("compleet");
19
- expect(fetchStateBlocksTakeover(fetchState(row(null, null, "2026-10-20"), 0))).toBe(false);
20
- });
21
- it("koppeling van vóór 1.0.95 zonder backfill is compleet", () => {
22
- expect(fetchState(row(null, null, "2026-09-01"), 300)).toBe("compleet");
23
- expect(fetchState(null, 300)).toBe("compleet");
24
- });
25
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=floriday-write-mode.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"floriday-write-mode.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/floriday-write-mode.test.ts"],"names":[],"mappings":""}
@@ -1,40 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { gateBlockedText, waitCauseText, WRITE_MODE_UNREADABLE_TEXT } from "../floriday-write-mode.js";
3
- import { resolveFustDimensions } from "../fusten.js";
4
- import { loadCarriersFromCache } from "../../components/voorraad/FloridayLoadCarriers.js";
5
- describe("oorzaak bij wachtende regels", () => {
6
- it("toont reason als read_only aan staat", () => {
7
- expect(waitCauseText({ read_only: true, reason: "Alleen lezen staat aan" })).toBe("Alleen lezen staat aan");
8
- });
9
- it("toont niets als schrijven aan staat", () => {
10
- expect(waitCauseText({ read_only: false, reason: null })).toBeNull();
11
- });
12
- it("meldt onbekend als lezen mislukt", () => {
13
- expect(waitCauseText(null)).toBe(WRITE_MODE_UNREADABLE_TEXT);
14
- });
15
- it("verpakkingsverschil noemt artikel en verwijst naar Verpakking", () => {
16
- const t = gateBlockedText({ name: "Roos", code: "R1" });
17
- expect(t).toContain("Roos (R1)");
18
- expect(t).toContain("Floriday koppeling → Verpakking");
19
- });
20
- });
21
- describe("fustmaten zonder standaardwaarden", () => {
22
- const fc = new Map([["12", { name: "Deksel", lengthMm: 1000, widthMm: 300, heightMm: null }]]);
23
- it("Floricode gaat voor, lege maat blijft leeg", () => {
24
- expect(resolveFustDimensions({ vbn_code: 12, length_mm: null, width_mm: null, height_mm: null }, fc))
25
- .toEqual({ length_mm: 1000, width_mm: 300, height_mm: null, source: "floricode" });
26
- });
27
- it("onbekend fust krijgt geen maten", () => {
28
- expect(resolveFustDimensions({ vbn_code: 99, length_mm: null, width_mm: null, height_mm: null }, fc))
29
- .toEqual({ length_mm: null, width_mm: null, height_mm: null, source: "onbekend" });
30
- });
31
- it("handmatige maat blijft staan", () => {
32
- expect(resolveFustDimensions({ vbn_code: 99, length_mm: 500, width_mm: null, height_mm: null }, fc).source).toBe("handmatig");
33
- });
34
- });
35
- describe("ladingdrager uit de Floriday-gegevens", () => {
36
- it("leest loadCarrier per verpakking, leeg blijft leeg", () => {
37
- expect(loadCarriersFromCache({ packingConfigurations: [{ loadCarrier: "DANISH_TROLLEY", primary: true }, {}] }))
38
- .toEqual([{ loadCarrier: "DANISH_TROLLEY", primary: true }, { loadCarrier: null, primary: false }]);
39
- });
40
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=fust-dimensions.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fust-dimensions.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/fust-dimensions.test.ts"],"names":[],"mappings":""}