@flowselections/logistiek-engine 1.0.170 → 1.0.174

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 (31) hide show
  1. package/db/schema/logistiek-engine.sql +28263 -0
  2. package/dist-lib/components/BeheerPage.d.ts.map +1 -1
  3. package/dist-lib/components/BeheerPage.js +3 -1
  4. package/dist-lib/components/BeladingVerstuurderCard.d.ts +2 -0
  5. package/dist-lib/components/BeladingVerstuurderCard.d.ts.map +1 -0
  6. package/dist-lib/components/BeladingVerstuurderCard.js +23 -0
  7. package/dist-lib/components/MinuutrondeStartMelding.d.ts +2 -0
  8. package/dist-lib/components/MinuutrondeStartMelding.d.ts.map +1 -0
  9. package/dist-lib/components/MinuutrondeStartMelding.js +11 -0
  10. package/dist-lib/hooks/useMinuutrondeStart.d.ts +6 -0
  11. package/dist-lib/hooks/useMinuutrondeStart.d.ts.map +1 -0
  12. package/dist-lib/hooks/useMinuutrondeStart.js +26 -0
  13. package/dist-lib/index.d.ts +2 -0
  14. package/dist-lib/index.d.ts.map +1 -1
  15. package/dist-lib/index.js +2 -0
  16. package/dist-lib/integrations/supabase/types.d.ts +284 -0
  17. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  18. package/dist-lib/lib/handlers/logistics-tick.server.d.ts.map +1 -1
  19. package/dist-lib/lib/handlers/logistics-tick.server.js +7 -0
  20. package/dist-lib/lib/moduleVersion.d.ts +1 -1
  21. package/dist-lib/lib/moduleVersion.js +1 -1
  22. package/dist-lib/lib/shellAdres.d.ts +9 -0
  23. package/dist-lib/lib/shellAdres.d.ts.map +1 -1
  24. package/dist-lib/lib/shellAdres.functions.d.ts +14 -0
  25. package/dist-lib/lib/shellAdres.functions.d.ts.map +1 -1
  26. package/dist-lib/lib/shellAdres.functions.js +40 -0
  27. package/dist-lib/lib/shellAdres.js +23 -0
  28. package/dist-lib/lib/stickerQueue.server.d.ts +2 -0
  29. package/dist-lib/lib/stickerQueue.server.d.ts.map +1 -1
  30. package/dist-lib/lib/stickerQueue.server.js +31 -0
  31. package/package.json +8 -3
@@ -1 +1 @@
1
- {"version":3,"file":"logistics-tick.server.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/logistics-tick.server.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE;;;;EAE7D;AAQD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,EACxB,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,OAAO,CAAC,QAAQ,CAAC,CA6EnB;AAED,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,eAAe,CAAC"}
1
+ {"version":3,"file":"logistics-tick.server.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/logistics-tick.server.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE;;;;EAE7D;AAQD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,EACxB,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,OAAO,CAAC,QAAQ,CAAC,CAoFnB;AAED,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,eAAe,CAAC"}
@@ -46,6 +46,13 @@ export async function handleLogisticsTick(request, supabase, opts) {
46
46
  catch {
47
47
  // Een ontbrekende hartslag mag de verwerking nooit tegenhouden.
48
48
  }
49
+ // 1.0.172: ontbrekende standaardinstellingen aanvullen (bestaande waarden blijven).
50
+ try {
51
+ await supabase.rpc("logistics_ensure_runtime_defaults");
52
+ }
53
+ catch {
54
+ // Niet aanvullen = fail closed (verzendbrieven wachten); ronde loopt door.
55
+ }
49
56
  // Rondeslot: nooit twee tick-rondes tegelijk (minuut-cron én wek-aanroep
50
57
  // komen hier allebei binnen). Hergebruikt het bestaande planslot met
51
58
  // vervaltijd. Fail-closed: bij twijfel wordt de ronde overgeslagen; de
@@ -1,2 +1,2 @@
1
- export declare const MODULE_VERSION = "1.0.170";
1
+ export declare const MODULE_VERSION = "1.0.174";
2
2
  //# sourceMappingURL=moduleVersion.d.ts.map
@@ -1,2 +1,2 @@
1
1
  // Automatisch gegenereerd door prebuild:lib; niet handmatig aanpassen.
2
- export const MODULE_VERSION = "1.0.170";
2
+ export const MODULE_VERSION = "1.0.174";
@@ -12,4 +12,13 @@ export declare function isShellAdresStatus(v: unknown): v is ShellAdresStatus;
12
12
  * JSON-antwoord telt niet.
13
13
  */
14
14
  export declare function isEngineAntwoord(status: number | null | undefined, body: string | null | undefined): boolean;
15
+ export interface MinuutrondeStartInvoer {
16
+ shellBaseUrl: string | null;
17
+ tickBaseUrl: string | null;
18
+ tickApikey: string | null;
19
+ /** Antwoord van de registratie; "geen_sleutel_op_server" als de Shell-server zelf geen sleutel heeft. */
20
+ registratie: string | null;
21
+ }
22
+ /** Geeft null als de minuutronde kan starten, anders de melding voor Beheer. */
23
+ export declare function minuutrondeStartProbleem(s: MinuutrondeStartInvoer): string | null;
15
24
  //# sourceMappingURL=shellAdres.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shellAdres.d.ts","sourceRoot":"","sources":["../../src/lib/shellAdres.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,qBAAqB,wIAQxB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AACnD,eAAO,MAAM,mBAAmB,qCAAqC,CAAC;AAEtE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAQ9D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,gBAAgB,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAS5G"}
1
+ {"version":3,"file":"shellAdres.d.ts","sourceRoot":"","sources":["../../src/lib/shellAdres.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,qBAAqB,wIAQxB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AACnD,eAAO,MAAM,mBAAmB,qCAAqC,CAAC;AAEtE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAQ9D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,gBAAgB,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAS5G;AASD,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yGAAyG;IACzG,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAMD,gFAAgF;AAChF,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI,CAkBjF"}
@@ -12,4 +12,18 @@ export declare const startShellAdresControle: import("@tanstack/start-client-cor
12
12
  }, undefined, undefined, undefined>], undefined, Promise<{
13
13
  status: string;
14
14
  }>>;
15
+ /**
16
+ * Legt de sleutel van de minuutronde automatisch vast (1.0.173) en geeft terug
17
+ * of de minuutronde kan starten. De sleutel is de openbare databasesleutel van
18
+ * deze Shell-server: precies de waarde waarmee de minuutronde-route controleert.
19
+ * Fail closed: ontbreekt hij op de server, dan wordt niets vastgelegd.
20
+ */
21
+ export declare const registreerMinuutrondeSleutel: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, undefined, undefined, undefined>, import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
22
+ supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
23
+ userId: string;
24
+ claims: import("@supabase/auth-js").User;
25
+ }, undefined, undefined, undefined>], undefined, Promise<{
26
+ registratie: string | null;
27
+ probleem: string | null;
28
+ }>>;
15
29
  //# sourceMappingURL=shellAdres.functions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shellAdres.functions.d.ts","sourceRoot":"","sources":["../../src/lib/shellAdres.functions.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,kBAAkB;;;;;UAEM,MAAM;GAKvC,CAAC;AAEL,eAAO,MAAM,uBAAuB;;;;;YAEc,MAAM;GAUpD,CAAC"}
1
+ {"version":3,"file":"shellAdres.functions.d.ts","sourceRoot":"","sources":["../../src/lib/shellAdres.functions.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,kBAAkB;;;;;UAEM,MAAM;GAKvC,CAAC;AAEL,eAAO,MAAM,uBAAuB;;;;;YAEc,MAAM;GAUpD,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B;;;;;iBAEG,MAAM,GAAG,IAAI;cAAY,MAAM,GAAG,IAAI;GA6B9E,CAAC"}
@@ -39,3 +39,43 @@ export const startShellAdresControle = createServerFn({ method: "POST" })
39
39
  const status = data?.status;
40
40
  return { status: typeof status === "string" ? status : "onbekend" };
41
41
  });
42
+ /**
43
+ * Legt de sleutel van de minuutronde automatisch vast (1.0.173) en geeft terug
44
+ * of de minuutronde kan starten. De sleutel is de openbare databasesleutel van
45
+ * deze Shell-server: precies de waarde waarmee de minuutronde-route controleert.
46
+ * Fail closed: ontbreekt hij op de server, dan wordt niets vastgelegd.
47
+ */
48
+ export const registreerMinuutrondeSleutel = createServerFn({ method: "POST" })
49
+ .middleware([readableServerErrors, requireSupabaseAuth])
50
+ .handler(async () => {
51
+ const { minuutrondeStartProbleem } = await import("./shellAdres.js");
52
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server.js");
53
+ const sleutel = (process.env["SUPABASE_PUBLISHABLE_KEY"] ?? process.env["SUPABASE_ANON_KEY"] ?? "")
54
+ .replace(/^["']|["']$/g, "")
55
+ .trim();
56
+ let registratie = null;
57
+ const { data: reg, error: regErr } = await supabaseAdmin.rpc("logistics_register_tick_apikey", {
58
+ p_key: sleutel,
59
+ });
60
+ if (regErr)
61
+ registratie = "fout: " + regErr.message;
62
+ else
63
+ registratie = typeof reg?.status === "string" ? reg.status : null;
64
+ const { data: rijen, error } = await supabaseAdmin
65
+ .from("module_runtime_config")
66
+ .select("key, value")
67
+ .in("key", ["shell_base_url", "logistics_tick_base_url", "logistics_tick_apikey"]);
68
+ if (error)
69
+ throw new Error(error.message);
70
+ const safe = Array.isArray(rijen) ? rijen : [];
71
+ const waarde = (k) => safe.find((r) => r.key === k)?.value ?? null;
72
+ return {
73
+ registratie,
74
+ probleem: minuutrondeStartProbleem({
75
+ shellBaseUrl: waarde("shell_base_url"),
76
+ tickBaseUrl: waarde("logistics_tick_base_url"),
77
+ tickApikey: waarde("logistics_tick_apikey"),
78
+ registratie,
79
+ }),
80
+ };
81
+ });
@@ -48,3 +48,26 @@ export function isEngineAntwoord(status, body) {
48
48
  return false;
49
49
  }
50
50
  }
51
+ function leeg(v) {
52
+ return v == null || v.trim() === "";
53
+ }
54
+ /** Geeft null als de minuutronde kan starten, anders de melding voor Beheer. */
55
+ export function minuutrondeStartProbleem(s) {
56
+ const pre = "Minuutronde kan niet starten: ";
57
+ if (leeg(s.tickApikey)) {
58
+ if (s.registratie === "geen_sleutel_op_server") {
59
+ return pre + "de Shell heeft geen openbare databasesleutel in zijn serverinstellingen, dus de sleutel kon niet automatisch worden vastgelegd.";
60
+ }
61
+ if (s.registratie === "ongeldige_sleutel") {
62
+ return pre + "de openbare databasesleutel van de Shell heeft een onverwachte vorm en is niet vastgelegd.";
63
+ }
64
+ return pre + "de sleutel voor de minuutronde is nog niet vastgelegd. Open deze pagina in de Shell zelf om hem automatisch vast te leggen.";
65
+ }
66
+ if (leeg(s.tickBaseUrl)) {
67
+ if (leeg(s.shellBaseUrl)) {
68
+ return pre + "het Shell-adres is onbekend. Dat vult de Floriday-authenticatiemodule automatisch.";
69
+ }
70
+ return pre + "het adres van de minuutronde is nog niet ingesteld. Gebruik \"Shell-adres controleren\" op de Regiepagina.";
71
+ }
72
+ return null;
73
+ }
@@ -12,4 +12,6 @@ export interface StickerRun {
12
12
  export declare function runStickerQueue(sb: SupabaseClient, opts?: {
13
13
  limit?: number;
14
14
  }): Promise<StickerRun>;
15
+ /** Reden die de layoutkeuze geeft als er geen (eenduidige) Floriday-layout is. */
16
+ export declare function isGeenLayoutReden(reden: unknown): boolean;
15
17
  //# sourceMappingURL=stickerQueue.server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stickerQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/stickerQueue.server.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAiB5D,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAoCD,wBAAsB,eAAe,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CA2T5G"}
1
+ {"version":3,"file":"stickerQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/stickerQueue.server.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAiB5D,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAoCD,wBAAsB,eAAe,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CA8T5G;AAoGD,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGzD"}
@@ -64,6 +64,8 @@ export async function runStickerQueue(sb, opts = {}) {
64
64
  }
65
65
  }
66
66
  }
67
+ // 2b. Tray-stickers die alleen op "geen layout" vastzaten: vrijgeven zodra er een is.
68
+ run.released += await traystickerLayoutVrijgeven(sb);
67
69
  // Geladen etiketten per printplek (één keer per ronde).
68
70
  const etiketCache = new Map();
69
71
  const etiketten = async (plek) => {
@@ -437,3 +439,32 @@ async function afmelden(sb, run) {
437
439
  return 0;
438
440
  }
439
441
  }
442
+ /** Reden die de layoutkeuze geeft als er geen (eenduidige) Floriday-layout is. */
443
+ export function isGeenLayoutReden(reden) {
444
+ if (typeof reden !== "string")
445
+ return false;
446
+ return /^Geen actieve layout voor /i.test(reden) || /actieve Floriday-layouts voor .* standaard/i.test(reden) || /^Geen actieve Floriday-layout/i.test(reden);
447
+ }
448
+ /** Zet geblokkeerde tray-stickers met een layout-reden terug op "klaar" zodra de traysticker-layout bestaat. */
449
+ async function traystickerLayoutVrijgeven(sb) {
450
+ const { data } = await sb
451
+ .from("logistics_sticker_prints")
452
+ .select("id, reden")
453
+ .eq("soort", "traysticker")
454
+ .eq("status", "geblokkeerd")
455
+ .limit(200);
456
+ const ids = (Array.isArray(data) ? data : [])
457
+ .filter((r) => isGeenLayoutReden(r.reden))
458
+ .map((r) => r.id);
459
+ if (ids.length === 0)
460
+ return 0;
461
+ const layout = await floridayLayout(sb, "traysticker");
462
+ if (!layout.layoutId)
463
+ return 0;
464
+ await sb
465
+ .from("logistics_sticker_prints")
466
+ .update({ status: "klaar", reden: null, next_attempt_at: null })
467
+ .in("id", ids)
468
+ .eq("status", "geblokkeerd");
469
+ return ids.length;
470
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/logistiek-engine",
3
- "version": "1.0.170",
3
+ "version": "1.0.174",
4
4
  "flowselections": {
5
5
  "moduleId": "logistiek-engine",
6
6
  "pages": [
@@ -83,7 +83,11 @@
83
83
  "OPTIONS"
84
84
  ]
85
85
  }
86
- ]
86
+ ],
87
+ "schema": {
88
+ "file": "db/schema/logistiek-engine.sql",
89
+ "order": 60
90
+ }
87
91
  },
88
92
  "private": false,
89
93
  "sideEffects": false,
@@ -103,7 +107,8 @@
103
107
  },
104
108
  "files": [
105
109
  "dist-lib",
106
- "public"
110
+ "public",
111
+ "db/schema"
107
112
  ],
108
113
  "publishConfig": {
109
114
  "access": "public"