@flowselections/floriday-verkoop-module 1.0.94 → 1.0.100

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 (185) hide show
  1. package/dist-lib/components/verkoop/AnalyticsCards.d.ts +1 -1
  2. package/dist-lib/components/verkoop/AnalyticsCards.d.ts.map +1 -1
  3. package/dist-lib/components/verkoop/CartAssignmentWizard.d.ts +1 -1
  4. package/dist-lib/components/verkoop/CartAssignmentWizard.d.ts.map +1 -1
  5. package/dist-lib/components/verkoop/CartLayersDialog.d.ts +1 -1
  6. package/dist-lib/components/verkoop/CartLayersDialog.d.ts.map +1 -1
  7. package/dist-lib/components/verkoop/ConfirmDialog.d.ts +11 -0
  8. package/dist-lib/components/verkoop/ConfirmDialog.d.ts.map +1 -0
  9. package/dist-lib/components/verkoop/ConfirmDialog.js +10 -0
  10. package/dist-lib/components/verkoop/CreateOrderPage.d.ts +1 -1
  11. package/dist-lib/components/verkoop/CreateOrderPage.d.ts.map +1 -1
  12. package/dist-lib/components/verkoop/CreateOrderPage.js +111 -48
  13. package/dist-lib/components/verkoop/DiagnoseConnectionDialog.d.ts +1 -1
  14. package/dist-lib/components/verkoop/DiagnoseConnectionDialog.d.ts.map +1 -1
  15. package/dist-lib/components/verkoop/EditLocalOrderDialog.d.ts +1 -1
  16. package/dist-lib/components/verkoop/EditLocalOrderDialog.d.ts.map +1 -1
  17. package/dist-lib/components/verkoop/EngineBufferCard.d.ts +1 -1
  18. package/dist-lib/components/verkoop/EngineBufferCard.d.ts.map +1 -1
  19. package/dist-lib/components/verkoop/FloridayStageLine.d.ts +2 -2
  20. package/dist-lib/components/verkoop/FloridayStageLine.d.ts.map +1 -1
  21. package/dist-lib/components/verkoop/InvoiceTimingSettings.d.ts +1 -1
  22. package/dist-lib/components/verkoop/InvoiceTimingSettings.d.ts.map +1 -1
  23. package/dist-lib/components/verkoop/OrderAfleverbrievenCard.d.ts +1 -1
  24. package/dist-lib/components/verkoop/OrderAfleverbrievenCard.d.ts.map +1 -1
  25. package/dist-lib/components/verkoop/OrderCarrierPicker.d.ts +1 -1
  26. package/dist-lib/components/verkoop/OrderCarrierPicker.d.ts.map +1 -1
  27. package/dist-lib/components/verkoop/OrderControlStatusCard.d.ts +1 -1
  28. package/dist-lib/components/verkoop/OrderControlStatusCard.d.ts.map +1 -1
  29. package/dist-lib/components/verkoop/OrderKarindelingCard.d.ts +1 -1
  30. package/dist-lib/components/verkoop/OrderKarindelingCard.d.ts.map +1 -1
  31. package/dist-lib/components/verkoop/OrderKarindelingCard.js +28 -2
  32. package/dist-lib/components/verkoop/OrderLinePackingCard.d.ts +1 -1
  33. package/dist-lib/components/verkoop/OrderLinePackingCard.d.ts.map +1 -1
  34. package/dist-lib/components/verkoop/OrderPickupMomentPicker.d.ts +1 -1
  35. package/dist-lib/components/verkoop/OrderPickupMomentPicker.d.ts.map +1 -1
  36. package/dist-lib/components/verkoop/OrderPickupMomentPicker.js +2 -1
  37. package/dist-lib/components/verkoop/OrderShipmentsCard.d.ts +1 -1
  38. package/dist-lib/components/verkoop/OrderShipmentsCard.d.ts.map +1 -1
  39. package/dist-lib/components/verkoop/OrderShipmentsCard.js +16 -13
  40. package/dist-lib/components/verkoop/PlanCoverageBadge.d.ts +1 -1
  41. package/dist-lib/components/verkoop/PlanCoverageBadge.d.ts.map +1 -1
  42. package/dist-lib/components/verkoop/PlanCoverageBadge.js +7 -5
  43. package/dist-lib/components/verkoop/ProductDimensionsSettings.d.ts +1 -1
  44. package/dist-lib/components/verkoop/ProductDimensionsSettings.d.ts.map +1 -1
  45. package/dist-lib/components/verkoop/SalesOrderDetailPage.d.ts +1 -1
  46. package/dist-lib/components/verkoop/SalesOrderDetailPage.d.ts.map +1 -1
  47. package/dist-lib/components/verkoop/SalesOrderDetailPage.js +6 -6
  48. package/dist-lib/components/verkoop/SalesOrderDetailView.d.ts +1 -1
  49. package/dist-lib/components/verkoop/SalesOrderDetailView.d.ts.map +1 -1
  50. package/dist-lib/components/verkoop/SalesOrderDetailView.js +2 -1
  51. package/dist-lib/components/verkoop/SalesOrdersFilterPanel.d.ts +1 -1
  52. package/dist-lib/components/verkoop/SalesOrdersFilterPanel.d.ts.map +1 -1
  53. package/dist-lib/components/verkoop/SalesOrdersFilters.d.ts +1 -1
  54. package/dist-lib/components/verkoop/SalesOrdersFilters.d.ts.map +1 -1
  55. package/dist-lib/components/verkoop/SalesOrdersTable.d.ts +2 -1
  56. package/dist-lib/components/verkoop/SalesOrdersTable.d.ts.map +1 -1
  57. package/dist-lib/components/verkoop/SalesOrdersTable.js +1 -1
  58. package/dist-lib/components/verkoop/SearchableSelect.d.ts +1 -1
  59. package/dist-lib/components/verkoop/SearchableSelect.d.ts.map +1 -1
  60. package/dist-lib/components/verkoop/StockConsumptionAlertsBanner.d.ts +1 -1
  61. package/dist-lib/components/verkoop/StockConsumptionAlertsBanner.d.ts.map +1 -1
  62. package/dist-lib/components/verkoop/VerkoopOrdersPage.d.ts +1 -1
  63. package/dist-lib/components/verkoop/VerkoopOrdersPage.d.ts.map +1 -1
  64. package/dist-lib/components/verkoop/WeekCalendar.d.ts +1 -1
  65. package/dist-lib/components/verkoop/WeekCalendar.d.ts.map +1 -1
  66. package/dist-lib/integrations/supabase/client.js +1 -1
  67. package/dist-lib/integrations/supabase/client.server.js +1 -1
  68. package/dist-lib/integrations/supabase/types.d.ts +352 -0
  69. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  70. package/dist-lib/lib/carrier-availability.d.ts +0 -28
  71. package/dist-lib/lib/carrier-availability.d.ts.map +1 -1
  72. package/dist-lib/lib/carrier-availability.js +3 -141
  73. package/dist-lib/lib/cart-replan.functions.d.ts +5 -0
  74. package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
  75. package/dist-lib/lib/cart-replan.functions.js +25 -1
  76. package/dist-lib/lib/create-order.functions.d.ts +8 -0
  77. package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
  78. package/dist-lib/lib/create-order.functions.js +110 -54
  79. package/dist-lib/lib/departure-preview.check.d.ts +2 -0
  80. package/dist-lib/lib/departure-preview.check.d.ts.map +1 -0
  81. package/dist-lib/lib/departure-preview.check.js +60 -0
  82. package/dist-lib/lib/departure-preview.d.ts +71 -0
  83. package/dist-lib/lib/departure-preview.d.ts.map +1 -0
  84. package/dist-lib/lib/departure-preview.functions.d.ts +14 -0
  85. package/dist-lib/lib/departure-preview.functions.d.ts.map +1 -0
  86. package/dist-lib/lib/departure-preview.functions.js +18 -0
  87. package/dist-lib/lib/departure-preview.js +133 -0
  88. package/dist-lib/lib/departure-preview.server.d.ts +11 -0
  89. package/dist-lib/lib/departure-preview.server.d.ts.map +1 -0
  90. package/dist-lib/lib/departure-preview.server.js +32 -0
  91. package/dist-lib/lib/floriday-external-fulfillment.check.d.ts +2 -0
  92. package/dist-lib/lib/floriday-external-fulfillment.check.d.ts.map +1 -0
  93. package/dist-lib/lib/floriday-external-fulfillment.check.js +21 -0
  94. package/dist-lib/lib/floriday-external-fulfillment.d.ts +19 -0
  95. package/dist-lib/lib/floriday-external-fulfillment.d.ts.map +1 -0
  96. package/dist-lib/lib/floriday-external-fulfillment.js +24 -0
  97. package/dist-lib/lib/floriday-external-fulfillment.server.d.ts +5 -0
  98. package/dist-lib/lib/floriday-external-fulfillment.server.d.ts.map +1 -0
  99. package/dist-lib/lib/floriday-external-fulfillment.server.js +110 -0
  100. package/dist-lib/lib/floriday-fulfillment-status.server.d.ts +2 -0
  101. package/dist-lib/lib/floriday-fulfillment-status.server.d.ts.map +1 -1
  102. package/dist-lib/lib/floriday-fulfillment-status.server.js +3 -0
  103. package/dist-lib/lib/floriday-line-key.check.d.ts +2 -0
  104. package/dist-lib/lib/floriday-line-key.check.d.ts.map +1 -0
  105. package/dist-lib/lib/floriday-line-key.check.js +31 -0
  106. package/dist-lib/lib/floriday-line-key.d.ts +12 -0
  107. package/dist-lib/lib/floriday-line-key.d.ts.map +1 -0
  108. package/dist-lib/lib/floriday-line-key.js +20 -0
  109. package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -1
  110. package/dist-lib/lib/floriday-mirror.functions.js +38 -2
  111. package/dist-lib/lib/invoice-timing.server.d.ts +3 -1
  112. package/dist-lib/lib/invoice-timing.server.d.ts.map +1 -1
  113. package/dist-lib/lib/invoice-timing.server.js +3 -2
  114. package/dist-lib/lib/logistics-engine.functions.d.ts +1 -1
  115. package/dist-lib/lib/module-version.d.ts +2 -0
  116. package/dist-lib/lib/module-version.d.ts.map +1 -0
  117. package/dist-lib/lib/module-version.js +3 -0
  118. package/dist-lib/lib/order-cart-count.server.d.ts +8 -0
  119. package/dist-lib/lib/order-cart-count.server.d.ts.map +1 -0
  120. package/dist-lib/lib/order-cart-count.server.js +69 -0
  121. package/dist-lib/lib/order-departure.server.d.ts +1 -0
  122. package/dist-lib/lib/order-departure.server.d.ts.map +1 -1
  123. package/dist-lib/lib/order-departure.server.js +16 -4
  124. package/dist-lib/lib/order-pickup.functions.d.ts +4 -0
  125. package/dist-lib/lib/order-pickup.functions.d.ts.map +1 -1
  126. package/dist-lib/lib/order-pickup.functions.js +7 -0
  127. package/dist-lib/lib/plan-coverage.d.ts +13 -1
  128. package/dist-lib/lib/plan-coverage.d.ts.map +1 -1
  129. package/dist-lib/lib/plan-coverage.js +20 -1
  130. package/dist-lib/lib/salesorders-list.server.d.ts.map +1 -1
  131. package/dist-lib/lib/salesorders-list.server.js +8 -7
  132. package/dist-lib/lib/salesorders-mapping.d.ts +7 -0
  133. package/dist-lib/lib/salesorders-mapping.d.ts.map +1 -1
  134. package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
  135. package/dist-lib/lib/salesorders.functions.js +10 -0
  136. package/dist-lib/lib/tradeitems.functions.d.ts +1117 -12
  137. package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
  138. package/dist-lib/lib/useBufferEvents.d.ts +2 -2
  139. package/dist-lib/lib/useBufferEvents.d.ts.map +1 -1
  140. package/dist-lib/lib/useLocalSalesOrderDetailQuery.d.ts +2 -2
  141. package/dist-lib/lib/useLocalSalesOrderDetailQuery.d.ts.map +1 -1
  142. package/dist-lib/lib/useSalesOrderDetailQuery.d.ts +1 -1
  143. package/dist-lib/lib/useSalesOrderDetailQuery.d.ts.map +1 -1
  144. package/dist-lib/lib/useSalesOrdersQuery.d.ts +1 -1
  145. package/dist-lib/lib/useSalesOrdersQuery.d.ts.map +1 -1
  146. package/package.json +1 -1
  147. package/dist-lib/components/floriday/FlorydaySyncHealthBanner.d.ts +0 -9
  148. package/dist-lib/components/floriday/FlorydaySyncHealthBanner.d.ts.map +0 -1
  149. package/dist-lib/components/floriday/FlorydaySyncHealthBanner.js +0 -26
  150. package/dist-lib/components/karindeling/AfmetingenTab.d.ts +0 -6
  151. package/dist-lib/components/karindeling/AfmetingenTab.d.ts.map +0 -1
  152. package/dist-lib/components/karindeling/AfmetingenTab.js +0 -128
  153. package/dist-lib/components/karindeling/KarindelingPage.d.ts +0 -2
  154. package/dist-lib/components/karindeling/KarindelingPage.d.ts.map +0 -1
  155. package/dist-lib/components/karindeling/KarindelingPage.js +0 -102
  156. package/dist-lib/components/ui/dropdown-menu.d.ts +0 -9
  157. package/dist-lib/components/ui/dropdown-menu.d.ts.map +0 -1
  158. package/dist-lib/components/ui/dropdown-menu.js +0 -14
  159. package/dist-lib/components/verkoop/AutoFulfillmentStatusCard.d.ts +0 -4
  160. package/dist-lib/components/verkoop/AutoFulfillmentStatusCard.d.ts.map +0 -1
  161. package/dist-lib/components/verkoop/AutoFulfillmentStatusCard.js +0 -95
  162. package/dist-lib/components/verkoop/CreateOrderDialog.d.ts +0 -5
  163. package/dist-lib/components/verkoop/CreateOrderDialog.d.ts.map +0 -1
  164. package/dist-lib/components/verkoop/CreateOrderDialog.js +0 -33
  165. package/dist-lib/lib/cron/mirror-floriday-orders.d.ts +0 -4
  166. package/dist-lib/lib/cron/mirror-floriday-orders.d.ts.map +0 -1
  167. package/dist-lib/lib/cron/mirror-floriday-orders.js +0 -23
  168. package/dist-lib/lib/cron/push-order-statuses.d.ts +0 -4
  169. package/dist-lib/lib/cron/push-order-statuses.d.ts.map +0 -1
  170. package/dist-lib/lib/cron/push-order-statuses.js +0 -23
  171. package/dist-lib/lib/floriday/floriday.server.d.ts +0 -14
  172. package/dist-lib/lib/floriday/floriday.server.d.ts.map +0 -1
  173. package/dist-lib/lib/floriday/floriday.server.js +0 -92
  174. package/dist-lib/lib/floriday/sales-orders.functions.d.ts +0 -4736
  175. package/dist-lib/lib/floriday/sales-orders.functions.d.ts.map +0 -1
  176. package/dist-lib/lib/floriday/sales-orders.functions.js +0 -193
  177. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +0 -77581
  178. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +0 -1
  179. package/dist-lib/lib/floriday-auto-fulfillment.functions.js +0 -65
  180. package/dist-lib/lib/floriday-auto-fulfillment.server.d.ts +0 -21
  181. package/dist-lib/lib/floriday-auto-fulfillment.server.d.ts.map +0 -1
  182. package/dist-lib/lib/floriday-auto-fulfillment.server.js +0 -352
  183. package/dist-lib/lib/floriday-status-sync.server.d.ts +0 -14
  184. package/dist-lib/lib/floriday-status-sync.server.d.ts.map +0 -1
  185. package/dist-lib/lib/floriday-status-sync.server.js +0 -130
@@ -5,5 +5,5 @@ export declare function AnalyticsCards({ totals, loading, }: {
5
5
  orderCount: number;
6
6
  };
7
7
  loading?: boolean;
8
- }): import("react/jsx-runtime").JSX.Element;
8
+ }): import("react").JSX.Element;
9
9
  //# sourceMappingURL=AnalyticsCards.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsCards.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/AnalyticsCards.tsx"],"names":[],"mappings":"AAKA,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,OAAO,GACR,EAAE;IACD,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,2CAwBA"}
1
+ {"version":3,"file":"AnalyticsCards.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/AnalyticsCards.tsx"],"names":[],"mappings":"AAKA,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,OAAO,GACR,EAAE;IACD,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,+BAwBA"}
@@ -2,5 +2,5 @@ export declare function CartAssignmentWizard({ orderId, open, onClose, }: {
2
2
  orderId: string | null;
3
3
  open: boolean;
4
4
  onClose: () => void;
5
- }): import("react/jsx-runtime").JSX.Element;
5
+ }): import("react").JSX.Element;
6
6
  //# sourceMappingURL=CartAssignmentWizard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CartAssignmentWizard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/CartAssignmentWizard.tsx"],"names":[],"mappings":"AA8CA,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EAAE,IAAI,EAAE,OAAO,GACvB,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,2CA4ThE"}
1
+ {"version":3,"file":"CartAssignmentWizard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/CartAssignmentWizard.tsx"],"names":[],"mappings":"AA8CA,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EAAE,IAAI,EAAE,OAAO,GACvB,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,+BA4ThE"}
@@ -4,6 +4,6 @@ interface Props {
4
4
  open: boolean;
5
5
  onOpenChange: (open: boolean) => void;
6
6
  }
7
- export declare function CartLayersDialog({ cartId, cartNumber, open, onOpenChange }: Props): import("react/jsx-runtime").JSX.Element;
7
+ export declare function CartLayersDialog({ cartId, cartNumber, open, onOpenChange }: Props): import("react").JSX.Element;
8
8
  export {};
9
9
  //# sourceMappingURL=CartLayersDialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CartLayersDialog.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/CartLayersDialog.tsx"],"names":[],"mappings":"AA4BA,UAAU,KAAK;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AA2ID,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,KAAK,2CAyMjF"}
1
+ {"version":3,"file":"CartLayersDialog.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/CartLayersDialog.tsx"],"names":[],"mappings":"AA4BA,UAAU,KAAK;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AA2ID,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,KAAK,+BAyMjF"}
@@ -0,0 +1,11 @@
1
+ export declare function ConfirmDialog({ open, onOpenChange, title, description, confirmLabel, cancelLabel, destructive, onConfirm, }: {
2
+ open: boolean;
3
+ onOpenChange: (open: boolean) => void;
4
+ title: string;
5
+ description?: string;
6
+ confirmLabel: string;
7
+ cancelLabel?: string;
8
+ destructive?: boolean;
9
+ onConfirm: () => void;
10
+ }): import("react").JSX.Element;
11
+ //# sourceMappingURL=ConfirmDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/ConfirmDialog.tsx"],"names":[],"mappings":"AAaA,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,YAAY,EACZ,KAAK,EACL,WAAW,EACX,YAAY,EACZ,WAAyB,EACzB,WAAmB,EACnB,SAAS,GACV,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB,+BAuBA"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Eigen bevestigingsvenster in plaats van het browservenster (window.confirm),
3
+ // dat sommige browsers en ingesloten vensters stil blokkeren.
4
+ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@flowselections/core";
5
+ export function ConfirmDialog({ open, onOpenChange, title, description, confirmLabel, cancelLabel = "Annuleren", destructive = false, onConfirm, }) {
6
+ return (_jsx(AlertDialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: title }), description && _jsx(AlertDialogDescription, { children: description })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: cancelLabel }), _jsx(AlertDialogAction, { className: destructive ? "bg-destructive text-destructive-foreground hover:bg-destructive/90" : undefined, onClick: () => {
7
+ onOpenChange(false);
8
+ onConfirm();
9
+ }, children: confirmLabel })] })] }) }));
10
+ }
@@ -1,2 +1,2 @@
1
- export declare function CreateOrderPage(): import("react/jsx-runtime").JSX.Element;
1
+ export declare function CreateOrderPage(): import("react").JSX.Element;
2
2
  //# sourceMappingURL=CreateOrderPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreateOrderPage.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/CreateOrderPage.tsx"],"names":[],"mappings":"AAqFA,wBAAgB,eAAe,4CAyzB9B"}
1
+ {"version":3,"file":"CreateOrderPage.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/CreateOrderPage.tsx"],"names":[],"mappings":"AAwFA,wBAAgB,eAAe,gCA+7B9B"}
@@ -2,8 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // Handmatig aanmaken van een bestelling — gebruikt exact dezelfde workflow,
3
3
  // server-fns en validaties als de Mailbox-module. Beide modules leunen op
4
4
  // gedeelde queries (klanten, producten met voorraad, afleverlocaties,
5
- // afhaallocaties, vervoerders, orderpicktijd) en dezelfde eerstmogelijke-
6
- // leverdatum-berekening. Zie src/lib/create-order.functions.ts.
5
+ // afhaallocaties, vervoerders). Ophaalmoment en haalbare leverdatum komen
6
+ // van de Logistiek Engine (logistics_departure_preview).
7
7
  import { useEffect, useMemo, useRef, useState } from "react";
8
8
  import { Button, Card, CardContent, CardHeader, CardTitle, Input, Label, Textarea, toast, } from "@flowselections/core";
9
9
  import { Link, useNavigate } from "@tanstack/react-router";
@@ -11,7 +11,10 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
11
11
  import { ArrowLeft, Plus, Trash2 } from "lucide-react";
12
12
  import { useServerFn } from "@tanstack/react-start";
13
13
  import { SearchableSelect } from "./SearchableSelect.js";
14
- import { computeEarliestDelivery } from "../../lib/carrier-availability.js";
14
+ import { toISODate } from "../../lib/carrier-availability.js";
15
+ import { getDeparturePreview } from "../../lib/departure-preview.functions.js";
16
+ import { decidePreview, momentLabel, firstDateText, LATE_CONFIRM } from "../../lib/departure-preview.js";
17
+ import { ConfirmDialog } from "./ConfirmDialog.js";
15
18
  import { listCustomersForCreateOrder, ensureCustomerFromTwinfield, listProductsForCreateOrder, listDeliveryLocationsForCustomerCO, listPickupLocationsCO, listCarriersForCreateOrder, getOrderPickDaysCO, listBeladingOptionsForProducts, createManualOrder, getEffectivePrices, } from "../../lib/create-order.functions.js";
16
19
  import { checkOrderStockAllowed } from "../../lib/logistics-stock.functions.js";
17
20
  import { useAllowedLoadCarriers } from "../../lib/useAllowedLoadCarriers.js";
@@ -74,7 +77,6 @@ export function CreateOrderPage() {
74
77
  const products = productsQ.data?.items ?? [];
75
78
  const pickupLocations = pickupQ.data?.items ?? [];
76
79
  const carriers = carriersQ.data?.items ?? [];
77
- const pickDays = Math.max(0, Number(pickDaysQ.data?.pickDays ?? 0));
78
80
  const [customerId, setCustomerId] = useState(null);
79
81
  // Twinfield-only klanten (id `twinfield:<code>`) worden bij selectie eerst
80
82
  // geïmporteerd naar een lokale customers-rij; daarna gaat de flow normaal door.
@@ -105,6 +107,10 @@ export function CreateOrderPage() {
105
107
  // Ladingdrager — lijst en voorselectie komen uitsluitend van de Engine.
106
108
  const [loadCarrierType, setLoadCarrierType] = useState(null);
107
109
  const [notes, setNotes] = useState("");
110
+ const [customerReference, setCustomerReference] = useState("");
111
+ // Eigen vervoer / zelf afleveren: bewuste keuze, geen vervoerder.
112
+ const [ownTransport, setOwnTransport] = useState(false);
113
+ const [lateConfirmOpen, setLateConfirmOpen] = useState(false);
108
114
  const [lines, setLines] = useState([
109
115
  { product_id: null, product_name: "", quantity: null, unit: "stuks", unit_price: null, belading: null },
110
116
  ]);
@@ -174,11 +180,19 @@ export function CreateOrderPage() {
174
180
  });
175
181
  const deliveryLocations = deliveryLocQ.data?.items ?? [];
176
182
  const selectedLocation = deliveryLocations.find((l) => l.id === deliveryLocationId) ?? null;
177
- // Reset delivery_location bij klantwissel
183
+ // Reset delivery_location bij klantwissel; daarna de vaste locatie (★,
184
+ // hooguit één per klant) standaard kiezen. Geen vaste locatie: niets kiezen.
185
+ const primaryPickedFor = useRef(null);
178
186
  useEffect(() => {
179
187
  if (deliveryLocationId && !deliveryLocations.some((l) => l.id === deliveryLocationId)) {
180
188
  setDeliveryLocationId(null);
181
189
  }
190
+ if (customerId && deliveryLocQ.data && primaryPickedFor.current !== customerId) {
191
+ primaryPickedFor.current = customerId;
192
+ const primaries = deliveryLocations.filter((l) => l.is_primary === true && (!l.customer_id || l.customer_id === customerId));
193
+ if (!deliveryLocationId && primaries.length === 1)
194
+ setDeliveryLocationId(primaries[0].id);
195
+ }
182
196
  // eslint-disable-next-line react-hooks/exhaustive-deps
183
197
  }, [customerId, deliveryLocQ.data]);
184
198
  // Auto-fill vervoerder op basis van gekozen afleverlocatie (één keer per wissel)
@@ -187,10 +201,8 @@ export function CreateOrderPage() {
187
201
  if (deliveryLocationId !== lastLocRef.current) {
188
202
  lastLocRef.current = deliveryLocationId;
189
203
  const loc = deliveryLocations.find((l) => l.id === deliveryLocationId);
190
- if (loc?.carrier_id)
191
- setCarrierId(loc.carrier_id);
192
- else if (deliveryLocationId === null)
193
- setCarrierId(null);
204
+ // Zonder standaardvervoerder kiest de Engine er een (voorbeeldversie).
205
+ setCarrierId(loc?.carrier_id ? loc.carrier_id : null);
194
206
  }
195
207
  // eslint-disable-next-line react-hooks/exhaustive-deps
196
208
  }, [deliveryLocationId, deliveryLocations.length]);
@@ -203,31 +215,65 @@ export function CreateOrderPage() {
203
215
  setLoadCarrierType(loadCarriersEngine.default ?? allowed[0]);
204
216
  }
205
217
  }, [loadCarriersEngine.allowed.join(","), loadCarriersEngine.default]);
206
- const selectedCarrier = carriers.find((c) => c.id === carrierId) ?? null;
207
- const carrierDeliveryDays = Math.max(0, Number(selectedCarrier?.delivery_days ?? 0));
208
- const canPickDate = !!customerId && !!deliveryLocationId && !!pickupLocationId && !!carrierId;
209
- const earliest = useMemo(() => computeEarliestDelivery(selectedCarrier, pickDays, new Date()), [selectedCarrier, pickDays]);
210
- const earliestISO = earliest.deliveryISO;
211
- const earliestDate = useMemo(() => {
212
- const [y, m, d] = earliestISO.split("-").map(Number);
213
- return new Date(y, (m ?? 1) - 1, d ?? 1);
214
- }, [earliestISO]);
215
- const earliestLabel = earliestDate.toLocaleDateString("nl-NL", {
216
- weekday: "long", day: "numeric", month: "long", year: "numeric",
218
+ const canPickDate = !!customerId && !!deliveryLocationId && !!pickupLocationId;
219
+ const [momentKey, setMomentKey] = useState(null);
220
+ // ---- Ophaalmoment (Logistiek Engine) ----------------------------------
221
+ // Bij elke wijziging van vervoerder, afleverlocatie, leverdatum of moment
222
+ // vraagt het scherm de Engine om een voorbeeld. Kort wachten zodat niet
223
+ // elke toetsaanslag een vraag wordt.
224
+ const fetchPreview = useServerFn(getDeparturePreview);
225
+ const previewInput = useMemo(() => canPickDate && !isReservation
226
+ ? {
227
+ carrierId: carrierId ?? null,
228
+ deliveryLocation: deliveryLocationId,
229
+ deliveryDate: deliveryDate || toISODate(new Date()),
230
+ momentKey: ownTransport ? null : momentKey,
231
+ ownTransport,
232
+ }
233
+ : null, [canPickDate, isReservation, carrierId, deliveryLocationId, deliveryDate, momentKey, ownTransport]);
234
+ const [debouncedInput, setDebouncedInput] = useState(previewInput);
235
+ useEffect(() => {
236
+ const t = setTimeout(() => setDebouncedInput(previewInput), 300);
237
+ return () => clearTimeout(t);
238
+ }, [previewInput]);
239
+ const previewQ = useQuery({
240
+ queryKey: ["co-departure-preview", debouncedInput],
241
+ enabled: !!debouncedInput,
242
+ staleTime: 15000,
243
+ queryFn: async () => {
244
+ try {
245
+ return (await fetchPreview({ data: debouncedInput })).preview;
246
+ }
247
+ catch {
248
+ return null;
249
+ }
250
+ },
217
251
  });
218
- const signupLabel = earliest.signupDeadlineISO
219
- ? new Date(earliest.signupDeadlineISO).toLocaleString("nl-NL", {
220
- weekday: "long", day: "numeric", month: "long", hour: "2-digit", minute: "2-digit",
221
- })
222
- : null;
252
+ const preview = previewQ.data ?? null;
253
+ const decision = previewQ.isSuccess ? decidePreview(preview) : null;
254
+ // Nog geen leverdatum: neem de eerste haalbare datum van de Engine over.
223
255
  useEffect(() => {
224
- if (!canPickDate)
225
- return;
226
- if (!deliveryDate || deliveryDate < earliestISO) {
227
- setDeliveryDate(earliestISO);
256
+ if (!deliveryDate && preview?.firstFeasibleDeliveryDate)
257
+ setDeliveryDate(preview.firstFeasibleDeliveryDate);
258
+ // eslint-disable-next-line react-hooks/exhaustive-deps
259
+ }, [preview?.firstFeasibleDeliveryDate]);
260
+ // Geen vervoerder gekozen: de Engine kiest er een op de afleverlocatie.
261
+ useEffect(() => {
262
+ if (!carrierId && preview?.carrierId)
263
+ setCarrierId(preview.carrierId);
264
+ // eslint-disable-next-line react-hooks/exhaustive-deps
265
+ }, [preview?.carrierId]);
266
+ // Andere vervoerder/locatie/datum: eigen momentkeuze vervalt als hij er niet meer is.
267
+ useEffect(() => {
268
+ if (momentKey && preview && !preview.moments.some((m) => m.momentKey === momentKey && m.feasible)) {
269
+ setMomentKey(null);
228
270
  }
229
271
  // eslint-disable-next-line react-hooks/exhaustive-deps
230
- }, [canPickDate, earliestISO]);
272
+ }, [preview]);
273
+ const fmtDate = (iso) => {
274
+ const [y, m, d] = iso.split("-").map(Number);
275
+ return new Date(y, (m ?? 1) - 1, d ?? 1).toLocaleDateString("nl-NL", { weekday: "long", day: "numeric", month: "long" });
276
+ };
231
277
  // ---- Voorraadcontrole (Logistics Engine) -------------------------------
232
278
  // De Engine beslist of een order met producten zonder voorraad aangemaakt
233
279
  // mag worden. Antwoord nooit cachen: de instelling kan elk moment wijzigen.
@@ -256,17 +302,31 @@ export function CreateOrderPage() {
256
302
  e.preventDefault();
257
303
  };
258
304
  const createMut = useMutation({
259
- mutationFn: async () => {
305
+ mutationFn: async (opts) => {
260
306
  if (!customerId)
261
307
  throw new Error("Selecteer een klant");
262
308
  if (!deliveryLocationId)
263
309
  throw new Error("Selecteer een afleverlocatie");
264
310
  if (!pickupLocationId)
265
311
  throw new Error("Selecteer een afhaallocatie (tuin)");
266
- if (!isReservation && !carrierId)
267
- throw new Error("Selecteer een vervoerder");
268
312
  if (!isReservation && !deliveryDate)
269
313
  throw new Error("Selecteer een leverdatum");
314
+ let acceptLateSignup = false;
315
+ if (!isReservation) {
316
+ if (!decision)
317
+ throw new Error("Het ophaalmoment wordt nog opgehaald. Probeer het zo opnieuw.");
318
+ if (decision.kind === "blocked")
319
+ throw new Error(decision.reason);
320
+ if (decision.kind === "departed")
321
+ throw new Error(decision.reason);
322
+ if (decision.kind === "late") {
323
+ if (!opts?.lateConfirmed) {
324
+ setLateConfirmOpen(true);
325
+ throw new Error("__cancelled__");
326
+ }
327
+ acceptLateSignup = true;
328
+ }
329
+ }
270
330
  const validLines = lines.filter((l) => l.product_id && (l.quantity ?? 0) > 0);
271
331
  if (validLines.length === 0)
272
332
  throw new Error("Voeg minimaal één product toe");
@@ -302,7 +362,11 @@ export function CreateOrderPage() {
302
362
  customerName: customer?.company_name ?? "Onbekende klant",
303
363
  deliveryLocationId,
304
364
  pickupLocationId,
305
- carrierId: isReservation ? null : carrierId,
365
+ carrierId: isReservation || ownTransport ? null : (carrierId ?? preview?.carrierId ?? null),
366
+ momentKey: isReservation || ownTransport ? null : momentKey,
367
+ ownTransport: !isReservation && ownTransport,
368
+ customerReference: customerReference.trim() ? customerReference.trim() : null,
369
+ acceptLateSignup,
306
370
  deliveryDate: isReservation ? null : deliveryDate,
307
371
  isReservation,
308
372
  loadCarrierType,
@@ -329,6 +393,10 @@ export function CreateOrderPage() {
329
393
  toast.success("Bestelling aangemaakt — karindeling is automatisch berekend");
330
394
  qc.invalidateQueries({ queryKey: ["floriday", "salesorders-cache"] });
331
395
  if (res?.orderId) {
396
+ try {
397
+ window.sessionStorage.setItem(`verkoop:just-created:${res.orderId}`, String(Date.now()));
398
+ }
399
+ catch { /* geen opslag */ }
332
400
  navigate({
333
401
  to: "/floriday-verkoop/verkooporders/$salesOrderId",
334
402
  params: { salesOrderId: `local:${res.orderId}` },
@@ -339,8 +407,11 @@ export function CreateOrderPage() {
339
407
  }
340
408
  },
341
409
  onError: (e) => {
410
+ if (e?.message === "__cancelled__")
411
+ return;
342
412
  console.error(e);
343
- toast.error("De order is niet aangemaakt. Controleer de regels en probeer opnieuw.");
413
+ const msg = typeof e?.message === "string" && e.message.length < 400 ? e.message : null;
414
+ toast.error(msg ?? "De order is niet aangemaakt. Controleer de regels en probeer opnieuw.");
344
415
  },
345
416
  });
346
417
  return (_jsxs("main", { className: "space-y-5 p-6", children: [_jsx("div", { children: _jsx(Button, { asChild: true, variant: "ghost", size: "sm", children: _jsxs(Link, { to: "/floriday-verkoop/verkooporders", children: [_jsx(ArrowLeft, { className: "mr-2 h-4 w-4" }), "Terug naar verkooporders"] }) }) }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Nieuwe Bestelling" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Doorloop de stappen: klant \u2192 afleverlocatie \u2192 afhaallocatie \u2192 vervoerder \u2192 leverdatum \u2192 producten." })] }), _jsxs(CardContent, { className: "space-y-5", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs(Label, { className: "flex items-center gap-2", children: ["Klant ", _jsx("span", { className: "text-destructive", children: "*" })] }), _jsx(SearchableSelect, { value: customerId, placeholder: customersQ.isLoading ? "Laden..." : "Kies klant...", options: customers.map((c) => ({
@@ -363,18 +434,10 @@ export function CreateOrderPage() {
363
434
  };
364
435
  }), onChange: setDeliveryLocationId })] }), selectedLocation && (_jsxs("div", { className: "rounded-md border bg-muted/30 p-3 space-y-2", children: [_jsx("div", { className: "text-xs font-medium text-muted-foreground", children: "Adresgegevens" }), _jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx(ReadOnlyField, { label: "Straat", value: selectedLocation.street }), _jsx(ReadOnlyField, { label: "Huisnummer", value: selectedLocation.house_number }), _jsx(ReadOnlyField, { label: "Postcode", value: selectedLocation.postal_code }), _jsx(ReadOnlyField, { label: "Plaats", value: selectedLocation.city }), _jsx(ReadOnlyField, { label: "Provincie", value: selectedLocation.province }), _jsx(ReadOnlyField, { label: "Land", value: selectedLocation.country })] })] })), _jsxs("div", { className: "space-y-1", children: [_jsxs(Label, { className: "flex items-center gap-2", children: ["Afhaallocatie / Tuin ", _jsx("span", { className: "text-destructive", children: "*" })] }), _jsx(SearchableSelect, { value: pickupLocationId, placeholder: pickupLocations.length ? "Kies eigen locatie..." : "Geen eigen locaties bekend", disabled: pickupLocations.length === 0, allowClear: false, options: pickupLocations.map((l) => ({ value: l.id, label: l.name })), onChange: setPickupLocationId }), _jsx("div", { className: "text-xs text-muted-foreground", children: "Eigen locatie (tuin) van waaruit de bestelling wordt geleverd of opgehaald." })] }), isReservation ? (_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: "Vervoerder" }), _jsx("div", { className: "rounded-md border border-border bg-muted/40 px-3 py-2 text-sm text-muted-foreground", children: "Nog niet van toepassing \u2014 de vervoerder wordt pas gekozen bij het aanmaken van de verzending." })] })) : (_jsxs("div", { className: "space-y-1", children: [_jsxs(Label, { children: ["Vervoerder ", _jsx("span", { className: "text-destructive", children: "*" })] }), _jsx(SearchableSelect, { value: carrierId, placeholder: !customerId ? "Selecteer eerst een klant"
365
436
  : !deliveryLocationId ? "Selecteer eerst een afleverlocatie"
366
- : "Kies vervoerder...", disabled: !deliveryLocationId, allowClear: false, options: carriers.map((c) => ({
437
+ : "Wordt gekozen bij de afleverlocatie", disabled: !deliveryLocationId, allowClear: false, options: carriers.map((c) => ({
367
438
  value: c.id,
368
439
  label: c.name + (c.is_default ? " (standaard)" : ""),
369
- })), onChange: setCarrierId }), selectedLocation?.carrier_id && carrierId && carrierId !== selectedLocation.carrier_id && (_jsx("div", { className: "text-xs text-muted-foreground", children: "Wijkt af van standaard vervoerder van deze locatie \u2014 geldt alleen voor deze bestelling." }))] })), _jsxs("div", { className: "space-y-1", children: [_jsxs(Label, { className: "flex items-center gap-2", children: ["Leverdatum ", !isReservation && _jsx("span", { className: "text-destructive", children: "*" })] }), _jsx(Input, { type: "date", value: !isReservation && canPickDate ? deliveryDate : "", min: canPickDate ? earliestISO : undefined, disabled: isReservation || !canPickDate, onChange: (e) => {
370
- const v = e.target.value || "";
371
- if (v && v < earliestISO) {
372
- toast.error(`Eerst mogelijke leverdatum is ${earliestLabel}.`);
373
- setDeliveryDate(earliestISO);
374
- return;
375
- }
376
- setDeliveryDate(v);
377
- } }), _jsxs("label", { className: "mt-1 flex items-center gap-2 text-sm text-foreground", children: [_jsx("input", { type: "checkbox", checked: isReservation, onChange: (e) => setIsReservation(e.target.checked), className: "h-4 w-4 rounded border-input" }), "Reservering (nog geen vaste leverdatum)"] }), isReservation ? (_jsx("div", { className: "text-xs text-muted-foreground", children: "De bestelling wordt als reservering aangemaakt zonder leverdatumvalidatie." })) : !canPickDate ? (_jsx("div", { className: "text-xs text-muted-foreground", children: "Selecteer eerst klant, afleverlocatie, afhaallocatie en vervoerder." })) : (_jsxs("div", { className: "text-xs text-muted-foreground", children: ["Eerst beschikbare leverdatum is ", earliestLabel, signupLabel ? `, o.b.v. het eerstvolgende aanmeldmoment (${signupLabel})` : "", " ", "en orderpicktijd (", pickDays, "d).", _jsx("div", { className: "mt-0.5", children: "Het definitieve ophaalmoment wordt bepaald zodra de order is aangemaakt." })] }))] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Bestelregels" }), _jsxs("div", { className: "grid grid-cols-12 gap-2 text-xs text-muted-foreground px-1", children: [_jsx("div", { className: "col-span-4", children: "Product" }), _jsx("div", { className: "col-span-3", children: "Belading" }), _jsx("div", { className: "col-span-2", children: "Fusten" }), _jsx("div", { className: "col-span-2", children: "Prijs" }), _jsx("div", { className: "col-span-1" })] }), lines.map((line, idx) => {
440
+ })), onChange: (v) => { setCarrierId(v); setMomentKey(null); } }), selectedLocation?.carrier_id && carrierId && carrierId !== selectedLocation.carrier_id && (_jsx("div", { className: "text-xs text-muted-foreground", children: "Wijkt af van standaard vervoerder van deze locatie \u2014 geldt alleen voor deze bestelling." }))] })), _jsxs("div", { className: "space-y-1", children: [_jsxs(Label, { className: "flex items-center gap-2", children: ["Leverdatum ", !isReservation && _jsx("span", { className: "text-destructive", children: "*" })] }), _jsx(Input, { type: "date", value: !isReservation && canPickDate ? deliveryDate : "", disabled: isReservation || !canPickDate, onChange: (e) => { setDeliveryDate(e.target.value || ""); setMomentKey(null); } }), _jsxs("label", { className: "mt-1 flex items-center gap-2 text-sm text-foreground", children: [_jsx("input", { type: "checkbox", checked: isReservation, onChange: (e) => setIsReservation(e.target.checked), className: "h-4 w-4 rounded border-input" }), "Reservering (nog geen vaste leverdatum)"] }), !isReservation && (_jsxs("label", { className: "flex items-center gap-2 text-sm text-foreground", children: [_jsx("input", { type: "checkbox", checked: ownTransport, onChange: (e) => { setOwnTransport(e.target.checked); setMomentKey(null); }, className: "h-4 w-4 rounded border-input" }), "Eigen vervoer / zelf afleveren (geen vervoerder)"] })), isReservation ? (_jsx("div", { className: "text-xs text-muted-foreground", children: "De bestelling wordt als reservering aangemaakt zonder leverdatumvalidatie." })) : !canPickDate ? (_jsx("div", { className: "text-xs text-muted-foreground", children: "Selecteer eerst klant, afleverlocatie en afhaallocatie." })) : !decision ? (_jsx("div", { className: "text-xs text-muted-foreground", children: "Ophaalmoment ophalen\u2026" })) : decision.kind === "blocked" ? (_jsx("div", { className: "text-xs text-destructive", children: decision.reason })) : decision.kind === "departed" ? (_jsxs("div", { className: "space-y-2 rounded-md border border-destructive/40 p-2 text-xs", children: [_jsx("div", { className: "text-destructive", children: decision.reason }), firstDateText(decision.firstDate, decision.next?.signupDeadline ?? null) && (_jsx("div", { className: "text-muted-foreground", children: firstDateText(decision.firstDate, decision.next?.signupDeadline ?? null) })), _jsxs("div", { className: "flex flex-wrap gap-2", children: [decision.firstDate && (_jsxs(Button, { type: "button", size: "sm", variant: "outline", onClick: () => { setDeliveryDate(decision.firstDate); setMomentKey(null); }, children: ["Gebruik ", fmtDate(decision.firstDate)] })), _jsx(Button, { type: "button", size: "sm", variant: "outline", onClick: () => { setOwnTransport(true); setMomentKey(null); }, children: "Eigen vervoer / zelf afleveren" })] })] })) : (_jsxs("div", { className: "space-y-2 text-xs", children: [!ownTransport && preview && preview.moments.length > 0 && (_jsx("select", { className: "h-9 w-full rounded-md border border-border bg-background px-2 text-sm text-foreground", value: momentKey ?? decision.momentKey ?? "", onChange: (e) => setMomentKey(e.target.value || null), "aria-label": "Ophaalmoment kiezen", children: preview.moments.map((m) => (_jsxs("option", { value: m.momentKey, disabled: !m.feasible, className: m.feasible ? "" : "text-muted-foreground", children: [momentLabel(m), m.feasible ? "" : " (niet haalbaar)"] }, m.momentKey))) })), decision.text && _jsx("div", { className: "text-foreground", children: decision.text }), decision.kind === "late" && (_jsxs("div", { className: "space-y-2 rounded-md border border-destructive/40 p-2", children: [_jsx("div", { className: "text-destructive", children: decision.reason }), (firstDateText(decision.firstDate, preview?.nextFeasibleMoment?.signupDeadline ?? null) ?? decision.firstReason) && (_jsx("div", { className: "text-muted-foreground", children: firstDateText(decision.firstDate, preview?.nextFeasibleMoment?.signupDeadline ?? null) ?? decision.firstReason })), _jsxs("div", { className: "flex flex-wrap gap-2", children: [decision.firstDate && (_jsxs(Button, { type: "button", size: "sm", variant: "outline", onClick: () => { setDeliveryDate(decision.firstDate); setMomentKey(null); }, children: ["Gebruik ", fmtDate(decision.firstDate)] })), _jsxs(Button, { type: "button", size: "sm", variant: "outline", disabled: createMut.isPending, onClick: () => setLateConfirmOpen(true), children: ["Toch aanmaken voor ", deliveryDate ? fmtDate(deliveryDate) : "de gekozen datum"] })] })] }))] }))] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Bestelregels" }), _jsxs("div", { className: "grid grid-cols-12 gap-2 text-xs text-muted-foreground px-1", children: [_jsx("div", { className: "col-span-4", children: "Product" }), _jsx("div", { className: "col-span-3", children: "Belading" }), _jsx("div", { className: "col-span-2", children: "Fusten" }), _jsx("div", { className: "col-span-2", children: "Prijs" }), _jsx("div", { className: "col-span-1" })] }), lines.map((line, idx) => {
378
441
  const product = line.product_id ? products.find((p) => p.id === line.product_id) : null;
379
442
  const defaultBelading = completeBelading(product);
380
443
  const effBelading = completeBelading(line.belading) ?? defaultBelading;
@@ -513,13 +576,13 @@ export function CreateOrderPage() {
513
576
  next[idx] = { ...next[idx], unit_price: v };
514
577
  setLines(next);
515
578
  }, placeholder: "\u20AC prijs", "aria-invalid": !!line.product_id && !(Number(line.unit_price) > 0), title: !!line.product_id && !(Number(line.unit_price) > 0) ? "Geen prijs" : undefined }), _jsx(Button, { variant: "ghost", size: "icon", className: "col-span-1", onClick: () => setLines(lines.filter((_, i) => i !== idx)), "aria-label": "Regel verwijderen", children: _jsx(Trash2, { className: "h-4 w-4" }) })] }, idx));
516
- }), lines.some((l) => l.product_id && !(Number(l.unit_price) > 0)) && (_jsxs("div", { className: "rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive", children: ["Geen prijs: ", lines.filter((l) => l.product_id && !(Number(l.unit_price) > 0)).length, " regel(s) zonder prijs. Er is geen prijs gevonden in prijsgroep of artikel; vul de prijs in."] })), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => setLines([...lines, { product_id: null, product_name: "", quantity: null, unit: "stuks", unit_price: null, belading: null }]), children: [_jsx(Plus, { className: "h-3 w-3 mr-1" }), " Regel toevoegen"] })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: "Opmerkingen" }), _jsx(Textarea, { value: notes, onChange: (e) => setNotes(e.target.value), placeholder: "Optionele notities bij deze bestelling", rows: 3 })] }), stockCheck && stockCheck.shortages.length > 0 && (_jsxs("div", { className: `rounded-md border p-3 text-sm ${stockBlocked
579
+ }), lines.some((l) => l.product_id && !(Number(l.unit_price) > 0)) && (_jsxs("div", { className: "rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive", children: ["Geen prijs: ", lines.filter((l) => l.product_id && !(Number(l.unit_price) > 0)).length, " regel(s) zonder prijs. Er is geen prijs gevonden in prijsgroep of artikel; vul de prijs in."] })), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => setLines([...lines, { product_id: null, product_name: "", quantity: null, unit: "stuks", unit_price: null, belading: null }]), children: [_jsx(Plus, { className: "h-3 w-3 mr-1" }), " Regel toevoegen"] })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: "Referentie klant" }), _jsx(Input, { value: customerReference, maxLength: 100, onChange: (e) => setCustomerReference(e.target.value), placeholder: "Optioneel, bijvoorbeeld het bestelnummer van je klant" })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { children: "Opmerkingen" }), _jsx(Textarea, { value: notes, onChange: (e) => setNotes(e.target.value), placeholder: "Optionele notities bij deze bestelling", rows: 3 })] }), stockCheck && stockCheck.shortages.length > 0 && (_jsxs("div", { className: `rounded-md border p-3 text-sm ${stockBlocked
517
580
  ? "border-destructive/40 bg-destructive/5 text-destructive"
518
581
  : "border-amber-500/40 bg-amber-500/5 text-amber-700"}`, children: [_jsx("div", { className: "font-medium", children: stockBlocked
519
582
  ? "Bestelling geblokkeerd — onvoldoende voorraad"
520
- : "Let op: tekorten (uitleveren zonder voorraad staat aan)" }), _jsx("ul", { className: "mt-1 space-y-0.5", children: stockCheck.shortages.map((s) => (_jsxs("li", { children: [s.product, ": besteld ", s.wanted, ", beschikbaar ", s.available, ", tekort ", s.missing] }, s.productId))) })] })), _jsxs("div", { className: "flex items-center justify-end gap-2 pt-2", children: [_jsx(Button, { variant: "outline", onClick: () => navigate({ to: "/floriday-verkoop/verkooporders" }), disabled: createMut.isPending, children: "Annuleren" }), _jsx(Button, { onClick: () => createMut.mutate(), disabled: createMut.isPending || stockBlocked || stockQ.isFetching, title: stockBlocked ? "Onvoldoende voorraad; deze order kan zo niet worden aangemaakt. Pas de aantallen aan." : undefined, children: createMut.isPending
583
+ : "Let op: tekorten (uitleveren zonder voorraad staat aan)" }), _jsx("ul", { className: "mt-1 space-y-0.5", children: stockCheck.shortages.map((s) => (_jsxs("li", { children: [s.product, ": besteld ", s.wanted, ", beschikbaar ", s.available, ", tekort ", s.missing] }, s.productId))) })] })), _jsxs("div", { className: "flex items-center justify-end gap-2 pt-2", children: [_jsx(Button, { variant: "outline", onClick: () => navigate({ to: "/floriday-verkoop/verkooporders" }), disabled: createMut.isPending, children: "Annuleren" }), _jsx(Button, { onClick: () => createMut.mutate(undefined), disabled: createMut.isPending || stockBlocked || stockQ.isFetching, title: stockBlocked ? "Onvoldoende voorraad; deze order kan zo niet worden aangemaakt. Pas de aantallen aan." : undefined, children: createMut.isPending
521
584
  ? "Bezig..."
522
585
  : stockQ.isFetching
523
586
  ? "Voorraad controleren..."
524
- : "Bestelling Aanmaken" })] })] })] })] }));
587
+ : "Bestelling Aanmaken" })] })] })] }), _jsx(ConfirmDialog, { open: lateConfirmOpen, onOpenChange: setLateConfirmOpen, title: "Toch aanmaken na de aanmeldtijd?", description: LATE_CONFIRM, confirmLabel: "Toch aanmaken", onConfirm: () => createMut.mutate({ lateConfirmed: true }) })] }));
525
588
  }
@@ -1,5 +1,5 @@
1
1
  export declare function DiagnoseConnectionDialog({ open, onOpenChange, }: {
2
2
  open: boolean;
3
3
  onOpenChange: (v: boolean) => void;
4
- }): import("react/jsx-runtime").JSX.Element;
4
+ }): import("react").JSX.Element;
5
5
  //# sourceMappingURL=DiagnoseConnectionDialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DiagnoseConnectionDialog.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/DiagnoseConnectionDialog.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,wBAAwB,CAAC,EACvC,IAAI,EACJ,YAAY,GACb,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC,2CAoMA"}
1
+ {"version":3,"file":"DiagnoseConnectionDialog.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/DiagnoseConnectionDialog.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,wBAAwB,CAAC,EACvC,IAAI,EACJ,YAAY,GACb,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC,+BAoMA"}
@@ -2,5 +2,5 @@ export declare function EditLocalOrderDialog({ orderId, open, onOpenChange, }: {
2
2
  orderId: string;
3
3
  open: boolean;
4
4
  onOpenChange: (o: boolean) => void;
5
- }): import("react/jsx-runtime").JSX.Element | null;
5
+ }): import("react").JSX.Element | null;
6
6
  //# sourceMappingURL=EditLocalOrderDialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditLocalOrderDialog.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/EditLocalOrderDialog.tsx"],"names":[],"mappings":"AA6CA,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EACP,IAAI,EACJ,YAAY,GACb,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC,kDAuiBA"}
1
+ {"version":3,"file":"EditLocalOrderDialog.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/EditLocalOrderDialog.tsx"],"names":[],"mappings":"AA6CA,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EACP,IAAI,EACJ,YAAY,GACb,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC,sCAuiBA"}
@@ -4,5 +4,5 @@
4
4
  */
5
5
  export declare function EngineBufferCard({ orderId }: {
6
6
  orderId: string | null;
7
- }): import("react/jsx-runtime").JSX.Element | null;
7
+ }): import("react").JSX.Element | null;
8
8
  //# sourceMappingURL=EngineBufferCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EngineBufferCard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/EngineBufferCard.tsx"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,kDAkJvE"}
1
+ {"version":3,"file":"EngineBufferCard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/EngineBufferCard.tsx"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,sCAkJvE"}
@@ -8,8 +8,8 @@ export declare function FloridayStageLine({ status, stage, floridayFulfilled, is
8
8
  isFloriday?: boolean;
9
9
  notReportedCount?: number;
10
10
  bufferSize?: number;
11
- }): import("react/jsx-runtime").JSX.Element | null;
11
+ }): import("react").JSX.Element | null;
12
12
  export declare function MissingPriceBadge({ show }: {
13
13
  show: boolean | undefined;
14
- }): import("react/jsx-runtime").JSX.Element | null;
14
+ }): import("react").JSX.Element | null;
15
15
  //# sourceMappingURL=FloridayStageLine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloridayStageLine.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/FloridayStageLine.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA8D,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC/H,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,KAAK,EACL,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,UAAU,GACX,EAAE;IACD,MAAM,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,CAAC;IACjD,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,kDAwCA;AAED,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,kDAOxE"}
1
+ {"version":3,"file":"FloridayStageLine.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/FloridayStageLine.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA8D,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC/H,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,KAAK,EACL,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,UAAU,GACX,EAAE;IACD,MAAM,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,CAAC;IACjD,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,sCAwCA;AAED,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,sCAOxE"}
@@ -1,3 +1,3 @@
1
- export declare function InvoiceTimingSettingsCard(): import("react/jsx-runtime").JSX.Element;
1
+ export declare function InvoiceTimingSettingsCard(): import("react").JSX.Element;
2
2
  export default InvoiceTimingSettingsCard;
3
3
  //# sourceMappingURL=InvoiceTimingSettings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InvoiceTimingSettings.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/InvoiceTimingSettings.tsx"],"names":[],"mappings":"AA+GA,wBAAgB,yBAAyB,4CA2GxC;AAED,eAAe,yBAAyB,CAAC"}
1
+ {"version":3,"file":"InvoiceTimingSettings.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/InvoiceTimingSettings.tsx"],"names":[],"mappings":"AA+GA,wBAAgB,yBAAyB,gCA2GxC;AAED,eAAe,yBAAyB,CAAC"}
@@ -2,5 +2,5 @@ export declare function OrderAfleverbrievenCard({ salesOrderId, orderNumber, wer
2
2
  salesOrderId: string;
3
3
  orderNumber?: string;
4
4
  werkplek?: string;
5
- }): import("react/jsx-runtime").JSX.Element;
5
+ }): import("react").JSX.Element;
6
6
  //# sourceMappingURL=OrderAfleverbrievenCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OrderAfleverbrievenCard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/OrderAfleverbrievenCard.tsx"],"names":[],"mappings":"AAuCA,wBAAgB,uBAAuB,CAAC,EACtC,YAAY,EACZ,WAAW,EACX,QAAQ,GACT,EAAE;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,2CAwMA"}
1
+ {"version":3,"file":"OrderAfleverbrievenCard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/OrderAfleverbrievenCard.tsx"],"names":[],"mappings":"AAuCA,wBAAgB,uBAAuB,CAAC,EACtC,YAAY,EACZ,WAAW,EACX,QAAQ,GACT,EAAE;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,+BAwMA"}
@@ -9,5 +9,5 @@ export declare function OrderCarrierPicker({ orderId, applyToBuffer, compact, lo
9
9
  applyToBuffer?: boolean;
10
10
  compact?: boolean;
11
11
  locked?: boolean;
12
- }): import("react/jsx-runtime").JSX.Element;
12
+ }): import("react").JSX.Element;
13
13
  //# sourceMappingURL=OrderCarrierPicker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OrderCarrierPicker.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/OrderCarrierPicker.tsx"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,aAAqB,EACrB,OAAe,EACf,MAAc,GACf,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,2CA4EA"}
1
+ {"version":3,"file":"OrderCarrierPicker.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/OrderCarrierPicker.tsx"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,aAAqB,EACrB,OAAe,EACf,MAAc,GACf,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,+BA4EA"}
@@ -2,5 +2,5 @@ export declare function OrderControlStatusCard({ floridayId, isControlled, contr
2
2
  floridayId: string;
3
3
  isControlled: boolean;
4
4
  controlledAt: string | null;
5
- }): import("react/jsx-runtime").JSX.Element;
5
+ }): import("react").JSX.Element;
6
6
  //# sourceMappingURL=OrderControlStatusCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OrderControlStatusCard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/OrderControlStatusCard.tsx"],"names":[],"mappings":"AAsBA,wBAAgB,sBAAsB,CAAC,EACrC,UAAU,EACV,YAAY,EACZ,YAAY,GACb,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,2CA6DA"}
1
+ {"version":3,"file":"OrderControlStatusCard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/OrderControlStatusCard.tsx"],"names":[],"mappings":"AAsBA,wBAAgB,sBAAsB,CAAC,EACrC,UAAU,EACV,YAAY,EACZ,YAAY,GACb,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,+BA6DA"}
@@ -1,5 +1,5 @@
1
1
  import type { SalesOrderDTO } from "../../lib/salesorders-mapping.js";
2
2
  export declare function OrderKarindelingCard({ order }: {
3
3
  order: SalesOrderDTO;
4
- }): import("react/jsx-runtime").JSX.Element;
4
+ }): import("react").JSX.Element;
5
5
  //# sourceMappingURL=OrderKarindelingCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OrderKarindelingCard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/OrderKarindelingCard.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAkB/D,wBAAgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,aAAa,CAAA;CAAE,2CAyJvE"}
1
+ {"version":3,"file":"OrderKarindelingCard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/OrderKarindelingCard.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAoB/D,wBAAgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,aAAa,CAAA;CAAE,+BAmMvE"}
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  // (logistics_order_plan_coverage). Deze kaart leest order_carts/
4
4
  // order_cart_items niet zelf en berekent niets: alleen de regels van DEZE
5
5
  // order, per kar, met of de kar gedeeld is met de buffer.
6
- import { useState } from "react";
6
+ import { useEffect, useState } from "react";
7
7
  import { useQuery, useQueryClient } from "@tanstack/react-query";
8
8
  import { useServerFn } from "@tanstack/react-start";
9
9
  import { Badge, Button, Card, CardContent, CardHeader, CardTitle, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@flowselections/core";
@@ -20,6 +20,7 @@ const PICK_LABEL = {
20
20
  bezig: "Bezig met picken",
21
21
  gepickt: "Gepickt",
22
22
  };
23
+ const JUST_CREATED_MS = 120000;
23
24
  const fmt = (v) => (v ? new Date(v).toLocaleString("nl-NL") : null);
24
25
  export function OrderKarindelingCard({ order }) {
25
26
  // Lokale orders hebben een prefix in hun DTO-id; Floriday-orders hun
@@ -30,9 +31,27 @@ export function OrderKarindelingCard({ order }) {
30
31
  const fetchCoverage = useServerFn(getOrderPlanCoverage);
31
32
  const queryClient = useQueryClient();
32
33
  const queryKey = ["order-plan-coverage", orderId];
34
+ // Net aangemaakt (in dit venster)? Dan maakt de planning de kar binnen enkele
35
+ // seconden: toon "Karindeling wordt gemaakt…" en lees elke 3 s opnieuw, max 2 min.
36
+ const [justCreatedAt, setJustCreatedAt] = useState(null);
37
+ const [now, setNow] = useState(() => Date.now());
38
+ useEffect(() => {
39
+ if (!orderId)
40
+ return;
41
+ try {
42
+ const v = Number(window.sessionStorage.getItem(`verkoop:just-created:${orderId}`));
43
+ if (Number.isFinite(v) && v > 0 && Date.now() - v < JUST_CREATED_MS)
44
+ setJustCreatedAt(v);
45
+ }
46
+ catch { /* geen opslag beschikbaar */ }
47
+ }, [orderId]);
33
48
  const { data, isLoading, error, isFetching } = useQuery({
34
49
  queryKey,
35
50
  enabled: !!orderId,
51
+ refetchInterval: (q) => {
52
+ const st = q.state.data?.coverage?.state;
53
+ return justCreatedAt && st === "geen_indeling" && Date.now() - justCreatedAt < JUST_CREATED_MS ? 3000 : false;
54
+ },
36
55
  staleTime: 30000,
37
56
  retry: (failureCount, queryError) => /authorization|token|sessie/i.test(queryError.message) && failureCount < 5,
38
57
  retryDelay: (attempt) => Math.min(500 * 2 ** attempt, 4000),
@@ -43,10 +62,17 @@ export function OrderKarindelingCard({ order }) {
43
62
  },
44
63
  });
45
64
  const cov = data?.coverage ?? null;
65
+ const creating = !!justCreatedAt && cov?.state === "geen_indeling" && now - justCreatedAt < JUST_CREATED_MS;
66
+ useEffect(() => {
67
+ if (!justCreatedAt)
68
+ return;
69
+ const t = setInterval(() => setNow(Date.now()), 3000);
70
+ return () => clearInterval(t);
71
+ }, [justCreatedAt]);
46
72
  const carts = Array.isArray(cov?.carts) ? cov.carts : [];
47
73
  const pickRows = Array.isArray(cov?.pickRows) ? cov.pickRows : [];
48
74
  const [layersFor, setLayersFor] = useState(null);
49
- return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "grid grid-cols-[minmax(0,1fr)_auto] items-center gap-2 sm:flex sm:flex-row sm:justify-between", children: [_jsx(CardTitle, { className: "truncate text-base", children: "Karindeling" }), _jsxs("div", { className: "flex items-center gap-2", children: [cov && cov.state !== "onbekend" && (_jsxs(Badge, { variant: "secondary", children: [carts.length, " kar(ren)"] })), _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Vernieuwen", title: "Vernieuwen", onClick: () => void queryClient.invalidateQueries({ queryKey }), children: _jsx(RefreshCw, { className: "h-4 w-4 " + (isFetching ? "animate-spin" : "") }) })] })] }), _jsx(CardContent, { className: "space-y-4", children: isLoading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Karindeling laden\u2026" })) : error ? (_jsxs("div", { className: "space-y-1", children: [_jsx("p", { className: "text-sm font-medium text-muted-foreground", children: "Indeling onbekend" }), _jsx("p", { className: "text-sm text-muted-foreground", children: error.message })] })) : cov ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-wrap items-start gap-x-6 gap-y-2 text-sm", children: [_jsxs("div", { children: [_jsx("div", { className: "text-xs text-muted-foreground", children: "Indeling" }), _jsx(PlanCoverageBadge, { coverage: summarize(cov) })] }), _jsxs("div", { children: [_jsx("div", { className: "text-xs text-muted-foreground", children: "Pickstatus" }), _jsxs("div", { className: "mt-1", children: [cov.pickStatus ? PICK_LABEL[cov.pickStatus] : "—", cov.pickStatus === "gepickt" && cov.pickedAt ? ` · ${fmt(cov.pickedAt)}` : ""] })] }), pickRows.length > 0 && (_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-xs text-muted-foreground", children: "Pickdocumenten" }), _jsx("div", { className: "mt-1 flex flex-wrap gap-1", children: pickRows.map((p, i) => (_jsxs(Badge, { variant: "outline", className: "text-[10px]", title: [
75
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "grid grid-cols-[minmax(0,1fr)_auto] items-center gap-2 sm:flex sm:flex-row sm:justify-between", children: [_jsx(CardTitle, { className: "truncate text-base", children: "Karindeling" }), _jsxs("div", { className: "flex items-center gap-2", children: [cov && cov.state !== "onbekend" && (_jsxs(Badge, { variant: "secondary", children: [carts.length, " kar(ren)"] })), _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Vernieuwen", title: "Vernieuwen", onClick: () => void queryClient.invalidateQueries({ queryKey }), children: _jsx(RefreshCw, { className: "h-4 w-4 " + (isFetching ? "animate-spin" : "") }) })] })] }), _jsx(CardContent, { className: "space-y-4", children: isLoading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Karindeling laden\u2026" })) : error ? (_jsxs("div", { className: "space-y-1", children: [_jsx("p", { className: "text-sm font-medium text-muted-foreground", children: "Indeling onbekend" }), _jsx("p", { className: "text-sm text-muted-foreground", children: error.message })] })) : cov ? (_jsxs(_Fragment, { children: [cov.externalFulfilled && !cov.externalFulfilled.full && (_jsxs("p", { className: "text-sm text-muted-foreground", children: [cov.externalFulfilled.salesOrderIds.length, " bestelling(en) afgehandeld in Floriday; de voortgang telt alleen de rest."] })), data?.externalEvent?.sendError ? (_jsxs("p", { className: "text-sm text-destructive", children: ["Het afronden in de planning lukte niet: de melding kon niet worden verstuurd (", data.externalEvent.sendError, ")."] })) : data?.externalEvent?.status === "failed" ? (_jsxs("p", { className: "text-sm text-destructive", children: ["Het afronden in de planning lukte niet: ", data.externalEvent.error ?? "geen reden opgegeven"] })) : data?.externalEvent && data.externalEvent.status && !["done", "processed", "completed", "applied", "skipped"].includes(data.externalEvent.status) ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "De planning verwerkt \"Afgehandeld in Floriday\" nog." })) : null, _jsxs("div", { className: "flex flex-wrap items-start gap-x-6 gap-y-2 text-sm", children: [_jsxs("div", { children: [_jsx("div", { className: "text-xs text-muted-foreground", children: "Indeling" }), creating ? (_jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: "Karindeling wordt gemaakt\u2026" })) : (_jsx(PlanCoverageBadge, { coverage: summarize(cov) }))] }), _jsxs("div", { children: [_jsx("div", { className: "text-xs text-muted-foreground", children: "Pickstatus" }), _jsxs("div", { className: "mt-1", children: [cov.pickStatus ? PICK_LABEL[cov.pickStatus] : "—", cov.pickStatus === "gepickt" && cov.pickedAt ? ` · ${fmt(cov.pickedAt)}` : ""] })] }), pickRows.length > 0 && (_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-xs text-muted-foreground", children: "Pickdocumenten" }), _jsx("div", { className: "mt-1 flex flex-wrap gap-1", children: pickRows.map((p, i) => (_jsxs(Badge, { variant: "outline", className: "text-[10px]", title: [
50
76
  p.printedAt ? `Geprint ${fmt(p.printedAt)}` : "Nog niet geprint",
51
77
  p.completedAt ? `Afgerond ${fmt(p.completedAt)}` : null,
52
78
  ]
@@ -1,4 +1,4 @@
1
1
  export declare function OrderLinePackingCard({ orderId }: {
2
2
  orderId: string;
3
- }): import("react/jsx-runtime").JSX.Element | null;
3
+ }): import("react").JSX.Element | null;
4
4
  //# sourceMappingURL=OrderLinePackingCard.d.ts.map