@flowselections/logistiek-engine 1.0.1

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 (175) hide show
  1. package/README.md +24 -0
  2. package/dist-lib/_core-safelist.d.ts +2 -0
  3. package/dist-lib/_core-safelist.d.ts.map +1 -0
  4. package/dist-lib/_core-safelist.js +15 -0
  5. package/dist-lib/components/BeladingIndelingCard.d.ts +2 -0
  6. package/dist-lib/components/BeladingIndelingCard.d.ts.map +1 -0
  7. package/dist-lib/components/BeladingIndelingCard.js +77 -0
  8. package/dist-lib/components/BufferDebugCard.d.ts +19 -0
  9. package/dist-lib/components/BufferDebugCard.d.ts.map +1 -0
  10. package/dist-lib/components/BufferDebugCard.js +69 -0
  11. package/dist-lib/components/CapaciteitMeldingenCard.d.ts +2 -0
  12. package/dist-lib/components/CapaciteitMeldingenCard.d.ts.map +1 -0
  13. package/dist-lib/components/CapaciteitMeldingenCard.js +40 -0
  14. package/dist-lib/components/LadingdragersPage.d.ts +2 -0
  15. package/dist-lib/components/LadingdragersPage.d.ts.map +1 -0
  16. package/dist-lib/components/LadingdragersPage.js +102 -0
  17. package/dist-lib/components/LogistiekEngineLogo.d.ts +6 -0
  18. package/dist-lib/components/LogistiekEngineLogo.d.ts.map +1 -0
  19. package/dist-lib/components/LogistiekEngineLogo.js +4 -0
  20. package/dist-lib/components/LogistiekEnginePage.d.ts +2 -0
  21. package/dist-lib/components/LogistiekEnginePage.d.ts.map +1 -0
  22. package/dist-lib/components/LogistiekEnginePage.js +53 -0
  23. package/dist-lib/components/ModulePromptsPage.d.ts +2 -0
  24. package/dist-lib/components/ModulePromptsPage.d.ts.map +1 -0
  25. package/dist-lib/components/ModulePromptsPage.js +58 -0
  26. package/dist-lib/components/RegiePage.d.ts +2 -0
  27. package/dist-lib/components/RegiePage.d.ts.map +1 -0
  28. package/dist-lib/components/RegiePage.js +82 -0
  29. package/dist-lib/components/RuleEnginePage.d.ts +7 -0
  30. package/dist-lib/components/RuleEnginePage.d.ts.map +1 -0
  31. package/dist-lib/components/RuleEnginePage.js +114 -0
  32. package/dist-lib/components/StrategieDialog.d.ts +11 -0
  33. package/dist-lib/components/StrategieDialog.d.ts.map +1 -0
  34. package/dist-lib/components/StrategieDialog.js +38 -0
  35. package/dist-lib/components/VertragingMeldingenCard.d.ts +2 -0
  36. package/dist-lib/components/VertragingMeldingenCard.d.ts.map +1 -0
  37. package/dist-lib/components/VertragingMeldingenCard.js +32 -0
  38. package/dist-lib/components/VoorraadMeldingenCard.d.ts +2 -0
  39. package/dist-lib/components/VoorraadMeldingenCard.d.ts.map +1 -0
  40. package/dist-lib/components/VoorraadMeldingenCard.js +26 -0
  41. package/dist-lib/components/rule-engine/CollapsibleGroup.d.ts +12 -0
  42. package/dist-lib/components/rule-engine/CollapsibleGroup.d.ts.map +1 -0
  43. package/dist-lib/components/rule-engine/CollapsibleGroup.js +11 -0
  44. package/dist-lib/components/rule-engine/ConditionsEditor.d.ts +8 -0
  45. package/dist-lib/components/rule-engine/ConditionsEditor.d.ts.map +1 -0
  46. package/dist-lib/components/rule-engine/ConditionsEditor.js +31 -0
  47. package/dist-lib/components/rule-engine/FieldHelp.d.ts +14 -0
  48. package/dist-lib/components/rule-engine/FieldHelp.d.ts.map +1 -0
  49. package/dist-lib/components/rule-engine/FieldHelp.js +18 -0
  50. package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts +2 -0
  51. package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts.map +1 -0
  52. package/dist-lib/components/rule-engine/FloridayConnectionBanner.js +41 -0
  53. package/dist-lib/components/rule-engine/ImpactPanel.d.ts +5 -0
  54. package/dist-lib/components/rule-engine/ImpactPanel.d.ts.map +1 -0
  55. package/dist-lib/components/rule-engine/ImpactPanel.js +25 -0
  56. package/dist-lib/components/rule-engine/RuleFieldInput.d.ts +9 -0
  57. package/dist-lib/components/rule-engine/RuleFieldInput.d.ts.map +1 -0
  58. package/dist-lib/components/rule-engine/RuleFieldInput.js +80 -0
  59. package/dist-lib/components/rule-engine/VersionsPanel.d.ts +10 -0
  60. package/dist-lib/components/rule-engine/VersionsPanel.d.ts.map +1 -0
  61. package/dist-lib/components/rule-engine/VersionsPanel.js +16 -0
  62. package/dist-lib/components/settings/LogistiekEngineSettingsCard.d.ts +2 -0
  63. package/dist-lib/components/settings/LogistiekEngineSettingsCard.d.ts.map +1 -0
  64. package/dist-lib/components/settings/LogistiekEngineSettingsCard.js +22 -0
  65. package/dist-lib/hooks/useCapaciteitMeldingen.d.ts +20 -0
  66. package/dist-lib/hooks/useCapaciteitMeldingen.d.ts.map +1 -0
  67. package/dist-lib/hooks/useCapaciteitMeldingen.js +46 -0
  68. package/dist-lib/hooks/useDocumentLayouts.d.ts +13 -0
  69. package/dist-lib/hooks/useDocumentLayouts.d.ts.map +1 -0
  70. package/dist-lib/hooks/useDocumentLayouts.js +54 -0
  71. package/dist-lib/hooks/useLadingdragers.d.ts +16 -0
  72. package/dist-lib/hooks/useLadingdragers.d.ts.map +1 -0
  73. package/dist-lib/hooks/useLadingdragers.js +86 -0
  74. package/dist-lib/hooks/useLogistiekStrategieen.d.ts +29 -0
  75. package/dist-lib/hooks/useLogistiekStrategieen.d.ts.map +1 -0
  76. package/dist-lib/hooks/useLogistiekStrategieen.js +111 -0
  77. package/dist-lib/hooks/useLogistiekTaken.d.ts +89 -0
  78. package/dist-lib/hooks/useLogistiekTaken.d.ts.map +1 -0
  79. package/dist-lib/hooks/useLogistiekTaken.js +314 -0
  80. package/dist-lib/hooks/usePickstations.d.ts +10 -0
  81. package/dist-lib/hooks/usePickstations.d.ts.map +1 -0
  82. package/dist-lib/hooks/usePickstations.js +51 -0
  83. package/dist-lib/hooks/useRecalcJob.d.ts +24 -0
  84. package/dist-lib/hooks/useRecalcJob.d.ts.map +1 -0
  85. package/dist-lib/hooks/useRecalcJob.js +83 -0
  86. package/dist-lib/hooks/useRuleEngine.d.ts +48 -0
  87. package/dist-lib/hooks/useRuleEngine.d.ts.map +1 -0
  88. package/dist-lib/hooks/useRuleEngine.js +222 -0
  89. package/dist-lib/hooks/useVertragingMeldingen.d.ts +29 -0
  90. package/dist-lib/hooks/useVertragingMeldingen.d.ts.map +1 -0
  91. package/dist-lib/hooks/useVertragingMeldingen.js +68 -0
  92. package/dist-lib/hooks/useVoorraadMeldingen.d.ts +30 -0
  93. package/dist-lib/hooks/useVoorraadMeldingen.d.ts.map +1 -0
  94. package/dist-lib/hooks/useVoorraadMeldingen.js +70 -0
  95. package/dist-lib/index.d.ts +36 -0
  96. package/dist-lib/index.d.ts.map +1 -0
  97. package/dist-lib/index.js +52 -0
  98. package/dist-lib/integrations/supabase/auth-attacher.d.ts +2 -0
  99. package/dist-lib/integrations/supabase/auth-attacher.d.ts.map +1 -0
  100. package/dist-lib/integrations/supabase/auth-attacher.js +12 -0
  101. package/dist-lib/integrations/supabase/auth-middleware.d.ts +19781 -0
  102. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -0
  103. package/dist-lib/integrations/supabase/auth-middleware.js +52 -0
  104. package/dist-lib/integrations/supabase/client.d.ts +19777 -0
  105. package/dist-lib/integrations/supabase/client.d.ts.map +1 -0
  106. package/dist-lib/integrations/supabase/client.js +13 -0
  107. package/dist-lib/integrations/supabase/client.server.d.ts +19777 -0
  108. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -0
  109. package/dist-lib/integrations/supabase/client.server.js +30 -0
  110. package/dist-lib/integrations/supabase/types.d.ts +20355 -0
  111. package/dist-lib/integrations/supabase/types.d.ts.map +1 -0
  112. package/dist-lib/integrations/supabase/types.js +78 -0
  113. package/dist-lib/lib/bufferMatching.d.ts +26 -0
  114. package/dist-lib/lib/bufferMatching.d.ts.map +1 -0
  115. package/dist-lib/lib/bufferMatching.js +73 -0
  116. package/dist-lib/lib/bulkLoadCarrierPlanning.server.d.ts +23 -0
  117. package/dist-lib/lib/bulkLoadCarrierPlanning.server.d.ts.map +1 -0
  118. package/dist-lib/lib/bulkLoadCarrierPlanning.server.js +126 -0
  119. package/dist-lib/lib/floridayDocuments.functions.d.ts +59415 -0
  120. package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -0
  121. package/dist-lib/lib/floridayDocuments.functions.js +68 -0
  122. package/dist-lib/lib/floridayDocuments.server.d.ts +51 -0
  123. package/dist-lib/lib/floridayDocuments.server.d.ts.map +1 -0
  124. package/dist-lib/lib/floridayDocuments.server.js +109 -0
  125. package/dist-lib/lib/loadCarrierPlanner.d.ts +71 -0
  126. package/dist-lib/lib/loadCarrierPlanner.d.ts.map +1 -0
  127. package/dist-lib/lib/loadCarrierPlanner.js +374 -0
  128. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +98984 -0
  129. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -0
  130. package/dist-lib/lib/loadCarrierPlanning.functions.js +106 -0
  131. package/dist-lib/lib/loadCarrierPlanning.server.d.ts +46 -0
  132. package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -0
  133. package/dist-lib/lib/loadCarrierPlanning.server.js +515 -0
  134. package/dist-lib/lib/loadCarrierTaskSync.server.d.ts +3 -0
  135. package/dist-lib/lib/loadCarrierTaskSync.server.d.ts.map +1 -0
  136. package/dist-lib/lib/loadCarrierTaskSync.server.js +56 -0
  137. package/dist-lib/lib/loadCarrierTypes.d.ts +19 -0
  138. package/dist-lib/lib/loadCarrierTypes.d.ts.map +1 -0
  139. package/dist-lib/lib/loadCarrierTypes.js +41 -0
  140. package/dist-lib/lib/logisticsPlanner.d.ts +56 -0
  141. package/dist-lib/lib/logisticsPlanner.d.ts.map +1 -0
  142. package/dist-lib/lib/logisticsPlanner.js +273 -0
  143. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +39575 -0
  144. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -0
  145. package/dist-lib/lib/logisticsRecalcJob.functions.js +30 -0
  146. package/dist-lib/lib/logisticsRecalcJob.server.d.ts +32 -0
  147. package/dist-lib/lib/logisticsRecalcJob.server.d.ts.map +1 -0
  148. package/dist-lib/lib/logisticsRecalcJob.server.js +116 -0
  149. package/dist-lib/lib/logisticsRecalculate.functions.d.ts +19792 -0
  150. package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -0
  151. package/dist-lib/lib/logisticsRecalculate.functions.js +35 -0
  152. package/dist-lib/lib/logisticsTasks.d.ts +23 -0
  153. package/dist-lib/lib/logisticsTasks.d.ts.map +1 -0
  154. package/dist-lib/lib/logisticsTasks.js +92 -0
  155. package/dist-lib/lib/modulePrompts.d.ts +31 -0
  156. package/dist-lib/lib/modulePrompts.d.ts.map +1 -0
  157. package/dist-lib/lib/modulePrompts.js +1195 -0
  158. package/dist-lib/lib/ruleEngineImpact.d.ts +27 -0
  159. package/dist-lib/lib/ruleEngineImpact.d.ts.map +1 -0
  160. package/dist-lib/lib/ruleEngineImpact.js +257 -0
  161. package/dist-lib/lib/ruleEngineSchema.d.ts +69 -0
  162. package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -0
  163. package/dist-lib/lib/ruleEngineSchema.js +899 -0
  164. package/dist-lib/lib/ruleEngineWizard.d.ts +17 -0
  165. package/dist-lib/lib/ruleEngineWizard.d.ts.map +1 -0
  166. package/dist-lib/lib/ruleEngineWizard.js +204 -0
  167. package/dist-lib/lib/utils.d.ts +3 -0
  168. package/dist-lib/lib/utils.d.ts.map +1 -0
  169. package/dist-lib/lib/utils.js +5 -0
  170. package/dist-lib/lib/validationSchemas.d.ts +15 -0
  171. package/dist-lib/lib/validationSchemas.d.ts.map +1 -0
  172. package/dist-lib/lib/validationSchemas.js +25 -0
  173. package/dist-lib/styles.css +1 -0
  174. package/package.json +113 -0
  175. package/public/logo.png +0 -0
@@ -0,0 +1,222 @@
1
+ // ============================================================================
2
+ // src/hooks/useRuleEngine.ts — configuraties + versiebeheer
3
+ // ============================================================================
4
+ import { useState, useEffect, useCallback } from "react";
5
+ import { supabase, toast } from "@flowselections/core";
6
+ import { normalizeSettings, defaultSettings } from "../lib/ruleEngineSchema";
7
+ const db = () => supabase;
8
+ function toConfig(row) {
9
+ return {
10
+ id: row.id,
11
+ name: row.name,
12
+ description: row.description ?? null,
13
+ status: row.status ?? "concept",
14
+ is_active: !!row.is_active,
15
+ current_version: row.current_version ?? 1,
16
+ settings: normalizeSettings(row.settings),
17
+ updated_at: row.updated_at,
18
+ };
19
+ }
20
+ export function useRuleEngine(options) {
21
+ const strategyId = options?.strategyId ?? null;
22
+ const strategyName = options?.strategyName ?? null;
23
+ const [configs, setConfigs] = useState([]);
24
+ const [versions, setVersions] = useState([]);
25
+ const [activeId, setActiveId] = useState(null);
26
+ const [loading, setLoading] = useState(true);
27
+ const [saving, setSaving] = useState(false);
28
+ const [error, setError] = useState(null);
29
+ const loadConfigs = useCallback(async () => {
30
+ setLoading(true);
31
+ setError(null);
32
+ try {
33
+ let query = db()
34
+ .from("logistics_rule_configs")
35
+ .select("*")
36
+ .order("updated_at", { ascending: false });
37
+ if (strategyId)
38
+ query = query.eq("strategy_id", strategyId);
39
+ const { data, error } = await query;
40
+ if (error)
41
+ throw error;
42
+ let rows = Array.isArray(data) ? data.map(toConfig) : [];
43
+ // Eerste keer instellen voor een strategie: maak automatisch een configuratie
44
+ if (strategyId && rows.length === 0) {
45
+ const { data: created, error: createError } = await db()
46
+ .from("logistics_rule_configs")
47
+ .insert({
48
+ name: strategyName ? `Werkwijze ${strategyName}` : "Werkwijze",
49
+ strategy_id: strategyId,
50
+ user_id: (await supabase.auth.getUser()).data.user?.id,
51
+ settings: defaultSettings(),
52
+ })
53
+ .select()
54
+ .single();
55
+ if (createError)
56
+ throw createError;
57
+ rows = [toConfig(created)];
58
+ }
59
+ setConfigs(rows);
60
+ setActiveId((prev) => (prev && rows.some((r) => r.id === prev) ? prev : rows[0]?.id ?? null));
61
+ }
62
+ catch (e) {
63
+ setError(e?.message ?? "Fout bij het laden van configuraties");
64
+ }
65
+ finally {
66
+ setLoading(false);
67
+ }
68
+ }, [strategyId, strategyName]);
69
+ const loadVersions = useCallback(async (configId) => {
70
+ if (!configId) {
71
+ setVersions([]);
72
+ return;
73
+ }
74
+ const { data, error } = await db()
75
+ .from("logistics_rule_versions")
76
+ .select("*")
77
+ .eq("config_id", configId)
78
+ .order("version", { ascending: false });
79
+ if (error) {
80
+ toast.error("Versies konden niet worden geladen");
81
+ setVersions([]);
82
+ return;
83
+ }
84
+ setVersions((Array.isArray(data) ? data : []).map((row) => ({
85
+ ...row,
86
+ settings: normalizeSettings(row.settings),
87
+ })));
88
+ }, []);
89
+ useEffect(() => {
90
+ loadConfigs();
91
+ }, [loadConfigs]);
92
+ useEffect(() => {
93
+ loadVersions(activeId);
94
+ }, [activeId, loadVersions]);
95
+ const activeConfig = configs.find((c) => c.id === activeId) ?? null;
96
+ const createConfig = useCallback(async (name, description) => {
97
+ const { data, error } = await db()
98
+ .from("logistics_rule_configs")
99
+ .insert({
100
+ name,
101
+ description: description ?? null,
102
+ strategy_id: strategyId,
103
+ user_id: (await supabase.auth.getUser()).data.user?.id,
104
+ settings: defaultSettings(),
105
+ })
106
+ .select()
107
+ .single();
108
+ if (error) {
109
+ toast.error("Aanmaken mislukt");
110
+ return null;
111
+ }
112
+ const config = toConfig(data);
113
+ setConfigs((prev) => [config, ...prev]);
114
+ setActiveId(config.id);
115
+ toast.success("Configuratie aangemaakt");
116
+ return config;
117
+ }, [strategyId]);
118
+ /** Werkt de instellingen lokaal bij (niet opgeslagen) */
119
+ const patchSettings = useCallback((configId, settings) => {
120
+ setConfigs((prev) => prev.map((c) => (c.id === configId ? { ...c, settings } : c)));
121
+ }, []);
122
+ /**
123
+ * Opslaan. De database legt automatisch een nieuwe versie vast zodra de
124
+ * instellingen inhoudelijk wijzigen (trigger trg_logistics_rule_config_snapshot),
125
+ * dus hier schrijven we zelf geen versierijen meer weg.
126
+ */
127
+ const saveConfig = useCallback(async (config, options) => {
128
+ setSaving(true);
129
+ try {
130
+ const { data, error } = await db()
131
+ .from("logistics_rule_configs")
132
+ .update({
133
+ name: config.name,
134
+ description: config.description,
135
+ settings: config.settings,
136
+ status: options?.status ?? config.status,
137
+ })
138
+ .eq("id", config.id)
139
+ .select()
140
+ .single();
141
+ if (error)
142
+ throw error;
143
+ const saved = toConfig(data);
144
+ if (options?.note) {
145
+ await db()
146
+ .from("logistics_rule_versions")
147
+ .update({ note: options.note })
148
+ .eq("config_id", config.id)
149
+ .eq("version", saved.current_version);
150
+ }
151
+ setConfigs((prev) => prev.map((c) => c.id === config.id
152
+ ? { ...c, current_version: saved.current_version, status: saved.status }
153
+ : c));
154
+ await loadVersions(config.id);
155
+ toast.success("Wijzigingen opgeslagen");
156
+ }
157
+ catch (e) {
158
+ toast.error(e?.message ?? "Opslaan mislukt");
159
+ }
160
+ finally {
161
+ setSaving(false);
162
+ }
163
+ }, [loadVersions]);
164
+ const activateConfig = useCallback(async (configId) => {
165
+ // Binnen dezelfde strategie mag er maar één configuratie actief zijn.
166
+ let reset = db().from("logistics_rule_configs").update({ is_active: false }).neq("id", configId);
167
+ reset = strategyId ? reset.eq("strategy_id", strategyId) : reset.is("strategy_id", null);
168
+ const { error: resetError } = await reset;
169
+ if (resetError) {
170
+ toast.error("Activeren mislukt");
171
+ return;
172
+ }
173
+ const { error } = await db()
174
+ .from("logistics_rule_configs")
175
+ .update({ is_active: true, status: "actief" })
176
+ .eq("id", configId);
177
+ if (error) {
178
+ toast.error("Activeren mislukt");
179
+ return;
180
+ }
181
+ setConfigs((prev) => prev.map((c) => ({
182
+ ...c,
183
+ is_active: c.id === configId,
184
+ status: c.id === configId ? "actief" : c.status === "actief" ? "concept" : c.status,
185
+ })));
186
+ toast.success("Configuratie is nu actief");
187
+ }, [strategyId]);
188
+ const restoreVersion = useCallback(async (version) => {
189
+ const config = configs.find((c) => c.id === version.config_id);
190
+ if (!config)
191
+ return;
192
+ patchSettings(config.id, version.settings);
193
+ await saveConfig({ ...config, settings: version.settings }, { note: `Hersteld vanaf versie ${version.version}` });
194
+ }, [configs, patchSettings, saveConfig]);
195
+ const deleteConfig = useCallback(async (configId) => {
196
+ const { error } = await db().from("logistics_rule_configs").delete().eq("id", configId);
197
+ if (error) {
198
+ toast.error("Verwijderen mislukt");
199
+ return;
200
+ }
201
+ setConfigs((prev) => prev.filter((c) => c.id !== configId));
202
+ setActiveId((prev) => (prev === configId ? null : prev));
203
+ toast.success("Configuratie verwijderd");
204
+ }, []);
205
+ return {
206
+ configs,
207
+ versions,
208
+ activeConfig,
209
+ activeId,
210
+ setActiveId,
211
+ loading,
212
+ saving,
213
+ error,
214
+ createConfig,
215
+ patchSettings,
216
+ saveConfig,
217
+ activateConfig,
218
+ restoreVersion,
219
+ deleteConfig,
220
+ reload: loadConfigs,
221
+ };
222
+ }
@@ -0,0 +1,29 @@
1
+ export interface VertragingMelding {
2
+ id: string;
3
+ order_ref: string;
4
+ order_id: string | null;
5
+ customer_name: string | null;
6
+ current_status: string | null;
7
+ planned_delivery_date: string | null;
8
+ expected_delivery_date: string | null;
9
+ reason: string | null;
10
+ priority: number;
11
+ reschedule_mode: string;
12
+ reschedule_status: string;
13
+ email_enabled: boolean;
14
+ email_recipients: string[];
15
+ email_status: string;
16
+ customer_notified: boolean;
17
+ status: string;
18
+ created_at: string;
19
+ }
20
+ export declare const VERTRAGING_PRIORITEIT: Record<number, string>;
21
+ export declare function useVertragingMeldingen(): {
22
+ meldingen: VertragingMelding[];
23
+ loading: boolean;
24
+ reload: () => Promise<void>;
25
+ scan: () => Promise<void>;
26
+ goedkeuren: (id: string) => Promise<void>;
27
+ afhandelen: (id: string) => Promise<void>;
28
+ };
29
+ //# sourceMappingURL=useVertragingMeldingen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVertragingMeldingen.d.ts","sourceRoot":"","sources":["../../src/hooks/useVertragingMeldingen.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIxD,CAAC;AAEF,wBAAgB,sBAAsB;;;;;qBAyCvB,MAAM;qBAYuB,MAAM;EAajD"}
@@ -0,0 +1,68 @@
1
+ // ============================================================================
2
+ // src/hooks/useVertragingMeldingen.ts — open vertragingsmeldingen van de Engine
3
+ // ============================================================================
4
+ import { useCallback, useEffect, useState } from "react";
5
+ import { supabase, toast } from "@flowselections/core";
6
+ const db = () => supabase;
7
+ export const VERTRAGING_PRIORITEIT = {
8
+ 1: "Laag",
9
+ 2: "Normaal",
10
+ 3: "Hoog",
11
+ };
12
+ export function useVertragingMeldingen() {
13
+ const [meldingen, setMeldingen] = useState([]);
14
+ const [loading, setLoading] = useState(true);
15
+ const load = useCallback(async () => {
16
+ setLoading(true);
17
+ const { data, error } = await db()
18
+ .from("logistics_delay_alerts")
19
+ .select("*")
20
+ .eq("status", "open")
21
+ .order("created_at", { ascending: false })
22
+ .limit(50);
23
+ if (error) {
24
+ setMeldingen([]);
25
+ }
26
+ else {
27
+ const rows = Array.isArray(data) ? data : [];
28
+ setMeldingen(rows.map((row) => ({
29
+ ...row,
30
+ email_recipients: Array.isArray(row?.email_recipients) ? row.email_recipients : [],
31
+ })));
32
+ }
33
+ setLoading(false);
34
+ }, []);
35
+ useEffect(() => {
36
+ void load();
37
+ }, [load]);
38
+ const scan = useCallback(async () => {
39
+ const { error } = await db().rpc("logistics_scan_delays");
40
+ if (error) {
41
+ toast.error("Controle op vertragingen mislukt");
42
+ return;
43
+ }
44
+ toast.success("Vertragingen gecontroleerd");
45
+ await load();
46
+ }, [load]);
47
+ const goedkeuren = useCallback(async (id) => {
48
+ const { error } = await db().rpc("logistics_approve_delay_reschedule", { p_alert_id: id });
49
+ if (error) {
50
+ toast.error("Goedkeuren mislukt");
51
+ return;
52
+ }
53
+ toast.success("Herplanning goedgekeurd");
54
+ await load();
55
+ }, [load]);
56
+ const afhandelen = useCallback(async (id) => {
57
+ const { error } = await db()
58
+ .from("logistics_delay_alerts")
59
+ .update({ status: "resolved", resolved_at: new Date().toISOString() })
60
+ .eq("id", id);
61
+ if (error) {
62
+ toast.error("Afhandelen mislukt");
63
+ return;
64
+ }
65
+ setMeldingen((prev) => prev.filter((m) => m.id !== id));
66
+ }, []);
67
+ return { meldingen, loading, reload: load, scan, goedkeuren, afhandelen };
68
+ }
@@ -0,0 +1,30 @@
1
+ export interface VoorraadTekort {
2
+ product?: string | null;
3
+ articleNumber?: string | null;
4
+ wanted?: number | null;
5
+ available?: number | null;
6
+ missing?: number | null;
7
+ }
8
+ export interface VoorraadMelding {
9
+ id: string;
10
+ order_ref: string;
11
+ customer_name: string | null;
12
+ delivery_date: string | null;
13
+ priority: number;
14
+ shortages: VoorraadTekort[];
15
+ email_enabled: boolean;
16
+ email_recipients: string[];
17
+ email_status: string;
18
+ email_error?: string | null;
19
+ status: string;
20
+ created_at: string;
21
+ }
22
+ export declare const PRIORITEIT_LABELS: Record<number, string>;
23
+ export declare function useVoorraadMeldingen(): {
24
+ meldingen: VoorraadMelding[];
25
+ loading: boolean;
26
+ reload: () => Promise<void>;
27
+ afhandelen: (id: string) => Promise<void>;
28
+ mailOpnieuw: (id: string) => Promise<void>;
29
+ };
30
+ //# sourceMappingURL=useVoorraadMeldingen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVoorraadMeldingen.d.ts","sourceRoot":"","sources":["../../src/hooks/useVoorraadMeldingen.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIpD,CAAC;AAEF,wBAAgB,oBAAoB;;;;qBAgCQ,MAAM;sBAenC,MAAM;EAmBpB"}
@@ -0,0 +1,70 @@
1
+ // ============================================================================
2
+ // src/hooks/useVoorraadMeldingen.ts — open voorraadmeldingen van de Engine
3
+ // ============================================================================
4
+ import { useCallback, useEffect, useState } from "react";
5
+ import { supabase, toast } from "@flowselections/core";
6
+ const db = () => supabase;
7
+ export const PRIORITEIT_LABELS = {
8
+ 1: "Laag",
9
+ 2: "Normaal",
10
+ 3: "Hoog",
11
+ };
12
+ export function useVoorraadMeldingen() {
13
+ const [meldingen, setMeldingen] = useState([]);
14
+ const [loading, setLoading] = useState(true);
15
+ const load = useCallback(async () => {
16
+ setLoading(true);
17
+ const { data, error } = await db()
18
+ .from("logistics_stock_alerts")
19
+ .select("*")
20
+ .eq("status", "open")
21
+ .order("created_at", { ascending: false })
22
+ .limit(50);
23
+ if (error) {
24
+ toast.error("Voorraadmeldingen konden niet worden geladen");
25
+ setMeldingen([]);
26
+ }
27
+ else {
28
+ const rows = Array.isArray(data) ? data : [];
29
+ setMeldingen(rows.map((row) => ({
30
+ ...row,
31
+ shortages: Array.isArray(row?.shortages) ? row.shortages : [],
32
+ email_recipients: Array.isArray(row?.email_recipients) ? row.email_recipients : [],
33
+ })));
34
+ }
35
+ setLoading(false);
36
+ }, []);
37
+ useEffect(() => {
38
+ void load();
39
+ }, [load]);
40
+ const afhandelen = useCallback(async (id) => {
41
+ const { error } = await db()
42
+ .from("logistics_stock_alerts")
43
+ .update({ status: "resolved", resolved_at: new Date().toISOString() })
44
+ .eq("id", id);
45
+ if (error) {
46
+ toast.error("Afhandelen mislukt");
47
+ return;
48
+ }
49
+ setMeldingen((prev) => prev.filter((m) => m.id !== id));
50
+ toast.success("Melding afgehandeld");
51
+ }, []);
52
+ /** Zet de e-mail (opnieuw) klaar in de e-mailmodule (doel "intern"). */
53
+ const mailOpnieuw = useCallback(async (id) => {
54
+ const { data, error } = await db().rpc("logistics_queue_stock_email", { p_alert_id: id });
55
+ if (error) {
56
+ toast.error("E-mail klaarzetten mislukt", { description: error.message });
57
+ return;
58
+ }
59
+ if (!data) {
60
+ toast.error("E-mail niet klaargezet", {
61
+ description: "Controleer de ontvangers en de interne e-mailkoppeling.",
62
+ });
63
+ }
64
+ else {
65
+ toast.success("E-mail klaargezet in de e-mailmodule");
66
+ }
67
+ void load();
68
+ }, [load]);
69
+ return { meldingen, loading, reload: load, afhandelen, mailOpnieuw };
70
+ }
@@ -0,0 +1,36 @@
1
+ import type { FlowModule } from "@flowselections/core";
2
+ export * from './_core-safelist';
3
+ export * from './components/LogistiekEnginePage';
4
+ export * from './components/RuleEnginePage';
5
+ export * from './components/RegiePage';
6
+ export * from './components/ModulePromptsPage';
7
+ export * from './components/LadingdragersPage';
8
+ export * from './components/BeladingIndelingCard';
9
+ export * from './components/VoorraadMeldingenCard';
10
+ export * from './components/VertragingMeldingenCard';
11
+ export * from './components/CapaciteitMeldingenCard';
12
+ export * from './hooks/useCapaciteitMeldingen';
13
+ export * from './components/BufferDebugCard';
14
+ export * from './lib/modulePrompts';
15
+ export * from './lib/bufferMatching';
16
+ export { LogistiekEnginePage } from './components/LogistiekEnginePage';
17
+ export { RuleEnginePage } from './components/RuleEnginePage';
18
+ export { RegiePage } from './components/RegiePage';
19
+ export { ModulePromptsPage } from './components/ModulePromptsPage';
20
+ export { LadingdragersPage } from './components/LadingdragersPage';
21
+ export { LogistiekEngineLogo } from './components/LogistiekEngineLogo';
22
+ export { LogistiekEngineSettingsCard } from './components/settings/LogistiekEngineSettingsCard';
23
+ export * from './hooks/useLogistiekStrategieen';
24
+ export * from './hooks/useRuleEngine';
25
+ export * from './hooks/useLogistiekTaken';
26
+ export * from './hooks/useLadingdragers';
27
+ export * from './hooks/useVoorraadMeldingen';
28
+ export * from './lib/ruleEngineSchema';
29
+ export * from './lib/ruleEngineImpact';
30
+ export * from './lib/logisticsTasks';
31
+ export * from './lib/logisticsPlanner';
32
+ export * from './lib/loadCarrierPlanner';
33
+ export * from './lib/loadCarrierTypes';
34
+ export * from './lib/loadCarrierPlanning.functions';
35
+ export declare const logistiekEngineModule: FlowModule;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AACrD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AAGrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AAMpD,eAAO,MAAM,qBAAqB,EAAE,UAcnC,CAAC"}
@@ -0,0 +1,52 @@
1
+ // ============================================================================
2
+ // src/index.ts — MODULE CONTRACT
3
+ // ============================================================================
4
+ import { Truck } from "lucide-react";
5
+ export * from './_core-safelist';
6
+ export * from './components/LogistiekEnginePage';
7
+ export * from './components/RuleEnginePage';
8
+ export * from './components/RegiePage';
9
+ export * from './components/ModulePromptsPage';
10
+ export * from './components/LadingdragersPage';
11
+ export * from './components/BeladingIndelingCard';
12
+ export * from './components/VoorraadMeldingenCard';
13
+ export * from './components/VertragingMeldingenCard';
14
+ export * from './components/CapaciteitMeldingenCard';
15
+ export * from './hooks/useCapaciteitMeldingen';
16
+ export * from './components/BufferDebugCard';
17
+ export * from './lib/modulePrompts';
18
+ export * from './lib/bufferMatching';
19
+ // Expliciete pagina-exports — de shell-validatie zoekt deze namen letterlijk in dist-lib/index.d.ts
20
+ export { LogistiekEnginePage } from './components/LogistiekEnginePage';
21
+ export { RuleEnginePage } from './components/RuleEnginePage';
22
+ export { RegiePage } from './components/RegiePage';
23
+ export { ModulePromptsPage } from './components/ModulePromptsPage';
24
+ export { LadingdragersPage } from './components/LadingdragersPage';
25
+ export { LogistiekEngineLogo } from './components/LogistiekEngineLogo';
26
+ export { LogistiekEngineSettingsCard } from './components/settings/LogistiekEngineSettingsCard';
27
+ export * from './hooks/useLogistiekStrategieen';
28
+ export * from './hooks/useRuleEngine';
29
+ export * from './hooks/useLogistiekTaken';
30
+ export * from './hooks/useLadingdragers';
31
+ export * from './hooks/useVoorraadMeldingen';
32
+ export * from './lib/ruleEngineSchema';
33
+ export * from './lib/ruleEngineImpact';
34
+ export * from './lib/logisticsTasks';
35
+ export * from './lib/logisticsPlanner';
36
+ export * from './lib/loadCarrierPlanner';
37
+ export * from './lib/loadCarrierTypes';
38
+ export * from './lib/loadCarrierPlanning.functions';
39
+ import { LogistiekEngineSettingsCard } from "./components/settings/LogistiekEngineSettingsCard";
40
+ export const logistiekEngineModule = {
41
+ id: "logistiek-engine",
42
+ name: "Logistiek Engine",
43
+ version: "1.0.0",
44
+ nav: {
45
+ label: "Logistiek Engine",
46
+ href: "/logistiek-engine",
47
+ icon: Truck,
48
+ },
49
+ settingsCards: [
50
+ { component: LogistiekEngineSettingsCard, order: 10 },
51
+ ],
52
+ };
@@ -0,0 +1,2 @@
1
+ export declare const attachSupabaseAuth: import("@tanstack/start-client-core").FunctionMiddlewareAfterClient<{}, unknown, undefined, undefined, undefined>;
2
+ //# sourceMappingURL=auth-attacher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-attacher.d.ts","sourceRoot":"","sources":["../../../src/integrations/supabase/auth-attacher.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,mHAQ9B,CAAA"}
@@ -0,0 +1,12 @@
1
+ // This file is automatically generated. Do not edit it directly.
2
+ import { createMiddleware } from '@tanstack/react-start';
3
+ import { supabase } from './client';
4
+ // Must be registered as a global `functionMiddleware` in `src/start.ts`; otherwise
5
+ // the browser never attaches the bearer token to serverFn RPCs.
6
+ export const attachSupabaseAuth = createMiddleware({ type: 'function' }).client(async ({ next }) => {
7
+ const { data } = await supabase.auth.getSession();
8
+ const token = data.session?.access_token;
9
+ return next({
10
+ headers: token ? { Authorization: `Bearer ${token}` } : {},
11
+ });
12
+ });