@flowselections/floriday-afhandeling-module 1.0.9 → 1.0.10

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 (72) hide show
  1. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts +9 -0
  2. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -0
  3. package/dist-lib/components/afhandeling/DagDetailDialog.js +145 -0
  4. package/dist-lib/components/afhandeling/LeveringenPage.d.ts.map +1 -1
  5. package/dist-lib/components/afhandeling/LeveringenPage.js +11 -5
  6. package/dist-lib/components/afhandeling/PickAgendaView.d.ts.map +1 -1
  7. package/dist-lib/components/afhandeling/PickAgendaView.js +13 -4
  8. package/dist-lib/components/afhandeling/PlanningAgendaPage.d.ts.map +1 -1
  9. package/dist-lib/components/afhandeling/PlanningAgendaPage.js +2 -2
  10. package/dist-lib/components/afhandeling/ServiceAreaSelect.d.ts +12 -0
  11. package/dist-lib/components/afhandeling/ServiceAreaSelect.d.ts.map +1 -0
  12. package/dist-lib/components/afhandeling/ServiceAreaSelect.js +79 -0
  13. package/dist-lib/components/afhandeling/VervoerderForm.d.ts.map +1 -1
  14. package/dist-lib/components/afhandeling/VervoerderForm.js +53 -6
  15. package/dist-lib/components/afhandeling/VervoerdersPage.d.ts.map +1 -1
  16. package/dist-lib/components/afhandeling/VervoerdersPage.js +23 -5
  17. package/dist-lib/components/afhandeling/WeekAgendaView.d.ts +2 -1
  18. package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -1
  19. package/dist-lib/components/afhandeling/WeekAgendaView.js +53 -18
  20. package/dist-lib/components/pickstation/PakbonTemplate.d.ts +5 -2
  21. package/dist-lib/components/pickstation/PakbonTemplate.d.ts.map +1 -1
  22. package/dist-lib/components/pickstation/PakbonTemplate.js +12 -10
  23. package/dist-lib/components/settings/AfhandelingSettingsCard.d.ts.map +1 -1
  24. package/dist-lib/components/settings/AfhandelingSettingsCard.js +18 -6
  25. package/dist-lib/hooks/useOrderPlanning.d.ts +3 -0
  26. package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
  27. package/dist-lib/hooks/useOrderPlanning.js +47 -6
  28. package/dist-lib/integrations/supabase/auth-middleware.d.ts +2261 -136
  29. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  30. package/dist-lib/integrations/supabase/client.d.ts +2261 -136
  31. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  32. package/dist-lib/integrations/supabase/client.server.d.ts +2261 -136
  33. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  34. package/dist-lib/integrations/supabase/types.d.ts +2329 -134
  35. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  36. package/dist-lib/integrations/supabase/types.js +1 -0
  37. package/dist-lib/lib/afhandelingSettings.functions.d.ts +9431 -5172
  38. package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -1
  39. package/dist-lib/lib/afhandelingSettings.functions.js +27 -2
  40. package/dist-lib/lib/carrierSignupMail.server.d.ts +56 -0
  41. package/dist-lib/lib/carrierSignupMail.server.d.ts.map +1 -0
  42. package/dist-lib/lib/carrierSignupMail.server.js +229 -0
  43. package/dist-lib/lib/carriers.functions.d.ts +33377 -15579
  44. package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
  45. package/dist-lib/lib/carriers.functions.js +28 -2
  46. package/dist-lib/lib/cartAssignments.functions.d.ts +46479 -0
  47. package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -0
  48. package/dist-lib/lib/cartAssignments.functions.js +130 -0
  49. package/dist-lib/lib/cartMoveImpact.d.ts +8 -0
  50. package/dist-lib/lib/cartMoveImpact.d.ts.map +1 -0
  51. package/dist-lib/lib/cartMoveImpact.js +26 -0
  52. package/dist-lib/lib/floriday.functions.d.ts +2265 -136
  53. package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
  54. package/dist-lib/lib/floriday.functions.js +178 -98
  55. package/dist-lib/lib/geo/euServiceAreas.d.ts +30 -0
  56. package/dist-lib/lib/geo/euServiceAreas.d.ts.map +1 -0
  57. package/dist-lib/lib/geo/euServiceAreas.js +277 -0
  58. package/dist-lib/lib/invalidatePlanning.d.ts +11 -0
  59. package/dist-lib/lib/invalidatePlanning.d.ts.map +1 -0
  60. package/dist-lib/lib/invalidatePlanning.js +25 -0
  61. package/dist-lib/lib/pickstationI18n.d.ts +4 -0
  62. package/dist-lib/lib/pickstationI18n.d.ts.map +1 -1
  63. package/dist-lib/lib/pickstationI18n.js +24 -0
  64. package/dist-lib/lib/pickstationOrders.server.d.ts +1 -1
  65. package/dist-lib/lib/pickstationOrders.server.d.ts.map +1 -1
  66. package/dist-lib/lib/pickstationOrders.server.js +305 -177
  67. package/dist-lib/lib/pickstationTypes.d.ts +11 -2
  68. package/dist-lib/lib/pickstationTypes.d.ts.map +1 -1
  69. package/dist-lib/lib/planning.d.ts +18 -2
  70. package/dist-lib/lib/planning.d.ts.map +1 -1
  71. package/dist-lib/lib/planning.js +96 -33
  72. package/package.json +2 -2
@@ -0,0 +1,130 @@
1
+ import { createServerFn } from "@tanstack/react-start";
2
+ import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware";
3
+ function toISODate(d) {
4
+ const dt = typeof d === "string" ? new Date(d) : d;
5
+ const y = dt.getFullYear();
6
+ const m = String(dt.getMonth() + 1).padStart(2, "0");
7
+ const day = String(dt.getDate()).padStart(2, "0");
8
+ return `${y}-${m}-${day}`;
9
+ }
10
+ export const listCartOverrides = createServerFn({ method: "GET" })
11
+ .middleware([requireSupabaseAuth])
12
+ .handler(async ({ context }) => {
13
+ const supabase = context.supabase;
14
+ const { data, error } = await supabase
15
+ .from("cart_pick_overrides")
16
+ .select("id, order_id, order_source, cart_index, pick_date, moved_from_date, status, notes")
17
+ .limit(5000);
18
+ if (error)
19
+ throw new Error(error.message);
20
+ return { overrides: (data ?? []) };
21
+ });
22
+ export const moveCart = createServerFn({ method: "POST" })
23
+ .middleware([requireSupabaseAuth])
24
+ .inputValidator((d) => d)
25
+ .handler(async ({ data, context }) => {
26
+ const supabase = context.supabase;
27
+ const pickDate = toISODate(data.newDate);
28
+ const fromDate = data.fromDate ? toISODate(data.fromDate) : null;
29
+ const { data: row, error } = await supabase
30
+ .from("cart_pick_overrides")
31
+ .upsert({
32
+ order_id: data.orderId,
33
+ order_source: data.orderSource,
34
+ cart_index: data.cartIndex,
35
+ pick_date: pickDate,
36
+ moved_from_date: fromDate,
37
+ }, { onConflict: "order_id,order_source,cart_index" })
38
+ .select()
39
+ .single();
40
+ if (error)
41
+ throw new Error(error.message);
42
+ return { ok: true, override: row };
43
+ });
44
+ export const resetCartOverride = createServerFn({ method: "POST" })
45
+ .middleware([requireSupabaseAuth])
46
+ .inputValidator((d) => d)
47
+ .handler(async ({ data, context }) => {
48
+ const supabase = context.supabase;
49
+ const { error } = await supabase
50
+ .from("cart_pick_overrides")
51
+ .delete()
52
+ .eq("order_id", data.orderId)
53
+ .eq("order_source", data.orderSource)
54
+ .eq("cart_index", data.cartIndex);
55
+ if (error)
56
+ throw new Error(error.message);
57
+ return { ok: true };
58
+ });
59
+ export const resetAllCartOverrides = createServerFn({ method: "POST" })
60
+ .middleware([requireSupabaseAuth])
61
+ .handler(async ({ context }) => {
62
+ const supabase = context.supabase;
63
+ const { error, count } = await supabase
64
+ .from("cart_pick_overrides")
65
+ .delete({ count: "exact" })
66
+ .not("id", "is", null);
67
+ if (error)
68
+ throw new Error(error.message);
69
+ return { ok: true, deleted: count ?? 0 };
70
+ });
71
+ export const getOrderLines = createServerFn({ method: "GET" })
72
+ .middleware([requireSupabaseAuth])
73
+ .inputValidator((d) => d)
74
+ .handler(async ({ data, context }) => {
75
+ const supabase = context.supabase;
76
+ if (data.orderSource === "manual") {
77
+ const { data: items, error } = await supabase
78
+ .from("order_items")
79
+ .select("id, quantity, products(product, plants_per_crate, crates_per_layer, layers_per_cart)")
80
+ .eq("order_id", data.orderId);
81
+ if (error)
82
+ throw new Error(error.message);
83
+ const lines = (items ?? []).map((it) => {
84
+ const raw = it.products;
85
+ const p = Array.isArray(raw) ? raw[0] : raw;
86
+ const qty = Number(it.quantity ?? 0);
87
+ const perCrate = p?.plants_per_crate ? Number(p.plants_per_crate) : 0;
88
+ return {
89
+ id: it.id,
90
+ article: p?.product ?? "—",
91
+ plants: qty,
92
+ crates: perCrate > 0 ? Math.ceil(qty / perCrate) : null,
93
+ otherUnits: null,
94
+ };
95
+ });
96
+ return { lines };
97
+ }
98
+ // Floriday: salesorders_cache row contains one order; lines komen uit data JSON
99
+ const { data: row, error } = await supabase
100
+ .from("floriday_salesorders_cache")
101
+ .select("data")
102
+ .eq("floriday_id", data.orderId)
103
+ .maybeSingle();
104
+ if (error)
105
+ throw new Error(error.message);
106
+ const raw = (row?.data ?? {});
107
+ const items = raw.salesOrderLines ?? [];
108
+ const lines = items.map((l, idx) => ({
109
+ id: l.salesOrderLineId ?? `${data.orderId}-${idx}`,
110
+ article: l.tradeItemName ??
111
+ l.productName ??
112
+ "—",
113
+ plants: Number(l.numberOfPieces ?? l.quantity ?? 0),
114
+ crates: l.numberOfTradeUnits != null ? Number(l.numberOfTradeUnits) : null,
115
+ otherUnits: null,
116
+ }));
117
+ if (lines.length === 0) {
118
+ const pieces = Number(raw.numberOfPieces ?? 0);
119
+ if (pieces > 0) {
120
+ lines.push({
121
+ id: `${data.orderId}-0`,
122
+ article: raw.tradeItemName ?? "Bestelling",
123
+ plants: pieces,
124
+ crates: null,
125
+ otherUnits: null,
126
+ });
127
+ }
128
+ }
129
+ return { lines };
130
+ });
@@ -0,0 +1,8 @@
1
+ import { type OrderPlanning } from "./planning";
2
+ export interface CartMoveImpact {
3
+ ok: boolean;
4
+ blockers: string[];
5
+ warnings: string[];
6
+ }
7
+ export declare function evaluateCartMove(newDate: Date, currentDate: Date, planning: OrderPlanning | null): CartMoveImpact;
8
+ //# sourceMappingURL=cartMoveImpact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cartMoveImpact.d.ts","sourceRoot":"","sources":["../../src/lib/cartMoveImpact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,IAAI,EACb,WAAW,EAAE,IAAI,EACjB,QAAQ,EAAE,aAAa,GAAG,IAAI,GAC7B,cAAc,CAyBhB"}
@@ -0,0 +1,26 @@
1
+ import { isWorkday } from "./planning";
2
+ export function evaluateCartMove(newDate, currentDate, planning) {
3
+ const blockers = [];
4
+ const warnings = [];
5
+ const d = new Date(newDate);
6
+ d.setHours(0, 0, 0, 0);
7
+ if (!isWorkday(d))
8
+ blockers.push("Gekozen datum is geen werkdag.");
9
+ if (planning) {
10
+ if (d.getTime() > planning.pickupDate.getTime()) {
11
+ blockers.push("Datum ligt na de ophaaldatum van deze order.");
12
+ }
13
+ if (d.getTime() < planning.pickStartDate.getTime()) {
14
+ warnings.push("Datum ligt vóór de berekende pick-startdatum — pickplanning wordt aangepast.");
15
+ }
16
+ if (d.getTime() > planning.pickStartDate.getTime()) {
17
+ warnings.push("Datum ligt later dan de oorspronkelijke pickplanning — controleer transportaanmelding.");
18
+ }
19
+ }
20
+ const sameDay = d.getFullYear() === currentDate.getFullYear() &&
21
+ d.getMonth() === currentDate.getMonth() &&
22
+ d.getDate() === currentDate.getDate();
23
+ if (sameDay)
24
+ blockers.push("Datum is gelijk aan de huidige pickdag.");
25
+ return { ok: blockers.length === 0, blockers, warnings };
26
+ }