@flowselections/floriday-voorraad 1.0.63 → 1.0.64

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/dist-lib/components/voorraad/ArtikelWizard.js +1 -1
  2. package/dist-lib/components/voorraad/FloridaySentCard.d.ts +24 -0
  3. package/dist-lib/components/voorraad/FloridaySentCard.d.ts.map +1 -0
  4. package/dist-lib/components/voorraad/FloridaySentCard.js +85 -0
  5. package/dist-lib/components/voorraad/FustenPage.d.ts.map +1 -1
  6. package/dist-lib/components/voorraad/FustenPage.js +18 -4
  7. package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts.map +1 -1
  8. package/dist-lib/components/voorraad/NieuwArtikelPage.js +72 -2
  9. package/dist-lib/components/voorraad/PublicatiesPage.d.ts.map +1 -1
  10. package/dist-lib/components/voorraad/PublicatiesPage.js +11 -3
  11. package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts.map +1 -1
  12. package/dist-lib/components/voorraad/ValidationOverviewTable.js +1 -1
  13. package/dist-lib/components/voorraad/VoorraadPage.d.ts.map +1 -1
  14. package/dist-lib/components/voorraad/VoorraadPage.js +28 -2
  15. package/dist-lib/components/voorraad/VoorraadStockCard.d.ts.map +1 -1
  16. package/dist-lib/components/voorraad/VoorraadStockCard.js +6 -33
  17. package/dist-lib/components/voorraad/VoorraadTable.d.ts.map +1 -1
  18. package/dist-lib/components/voorraad/VoorraadTable.js +1 -1
  19. package/dist-lib/integrations/supabase/types.d.ts +328 -3
  20. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  21. package/dist-lib/lib/__tests__/floriday-base-supply.test.d.ts +2 -0
  22. package/dist-lib/lib/__tests__/floriday-base-supply.test.d.ts.map +1 -0
  23. package/dist-lib/lib/__tests__/floriday-base-supply.test.js +58 -0
  24. package/dist-lib/lib/floriday-base-supply.d.ts +53 -0
  25. package/dist-lib/lib/floriday-base-supply.d.ts.map +1 -0
  26. package/dist-lib/lib/floriday-base-supply.js +85 -0
  27. package/dist-lib/lib/floriday-gateway.server.d.ts +21 -0
  28. package/dist-lib/lib/floriday-gateway.server.d.ts.map +1 -1
  29. package/dist-lib/lib/floriday-gateway.server.js +30 -0
  30. package/dist-lib/lib/fusten.js +1 -1
  31. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=floriday-base-supply.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floriday-base-supply.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/floriday-base-supply.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildRequest, decide, isoWeekAmsterdam, priceForRow } from "../floriday-base-supply";
3
+ const row = {
4
+ id: "r1",
5
+ trade_item_id: "11111111-1111-1111-1111-111111111111",
6
+ number_of_pieces: 12,
7
+ target_year: 2026,
8
+ target_week: 42,
9
+ stock_mode: "FOLLOW_ERP",
10
+ sale_price: 1.1,
11
+ unit: "stuks",
12
+ uses_catalog_availability: true,
13
+ };
14
+ describe("weekaanbod aanmaken (nagespeelde antwoorden 1.0.61)", () => {
15
+ it.each(["created", "price_updated", "quantity_updated", "already_exists"])("%s → terug naar pending", (o) => {
16
+ expect(decide(200, { ok: true, outcome: o, priceStatus: "sent" }, 42).kind).toBe("done");
17
+ });
18
+ it("prijs vergrendeld in lopende week → geen fout, wel melding", () => {
19
+ const d = decide(200, { ok: true, outcome: "quantity_updated", priceStatus: "price_locked_current_week" }, 42);
20
+ expect(d.kind).toBe("done");
21
+ expect(d.label).toBe("Prijs kan niet meer wijzigen in de lopende week");
22
+ });
23
+ it("week_in_past (409) → eindstatus", () => {
24
+ const d = decide(409, { ok: false, outcome: "week_in_past", reason: "week_in_past", retryable: false }, 41);
25
+ expect(d).toMatchObject({ kind: "week_past", label: "Week 41 is voorbij" });
26
+ });
27
+ it("invalid_week (400) → stoppen", () => {
28
+ expect(decide(400, { ok: false, outcome: "error", reason: "invalid_week", retryable: false }, 54).kind).toBe("stop");
29
+ });
30
+ it("error retryable → backoff", () => {
31
+ expect(decide(502, { ok: false, outcome: "error", reason: "http_502", retryable: true }, 42).kind).toBe("retry");
32
+ });
33
+ it("error niet retryable → stoppen met Floriday-tekst", () => {
34
+ const d = decide(422, { ok: false, outcome: "error", retryable: false, floriday: { title: "Ongeldige prijs", detail: "Prijs te laag" } }, 42);
35
+ expect(d.kind).toBe("stop");
36
+ expect(d.label).toContain("Ongeldige prijs: Prijs te laag");
37
+ });
38
+ it("prijs alleen bij stuks en > 0", () => {
39
+ expect(priceForRow({ sale_price: 0, unit: "stuks" })).toEqual({ ok: false, label: "Prijs ontbreekt" });
40
+ expect(priceForRow({ sale_price: null, unit: "stuks" })).toEqual({ ok: false, label: "Prijs ontbreekt" });
41
+ expect(priceForRow({ sale_price: 3, unit: "fust" })).toEqual({ ok: false, label: "Eenheid onduidelijk" });
42
+ expect(priceForRow({ sale_price: 1.1, unit: "stuks" })).toEqual({ ok: true, price: 1.1 });
43
+ });
44
+ it("aanvraag volgens contract, week van de regel, geen packingConfigurationId", () => {
45
+ const r = buildRequest(row, 1.1, "staging");
46
+ expect(r).toEqual({
47
+ tradeItemId: row.trade_item_id, pricePerPiece: 1.1, availableQuantity: 12, currency: "EUR",
48
+ year: 2026, week: 42, supplyType: "CATALOG_PRICE", usesCatalogAvailability: true, environment: "staging",
49
+ });
50
+ expect("packingConfigurationId" in r).toBe(false);
51
+ });
52
+ it("ISO-week in Nederlandse tijd", () => {
53
+ expect(isoWeekAmsterdam(new Date("2027-01-01T12:00:00Z"))).toEqual({ year: 2026, week: 53 });
54
+ expect(isoWeekAmsterdam(new Date("2026-12-28T12:00:00Z"))).toEqual({ year: 2026, week: 53 });
55
+ // maandag 00:30 in Amsterdam = zondag 22:30 UTC: al de nieuwe week
56
+ expect(isoWeekAmsterdam(new Date("2026-10-11T22:30:00Z"))).toEqual({ year: 2026, week: 42 });
57
+ });
58
+ });
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Pure regels voor "weekaanbod aanmaken" (M15b). Geen netwerk, geen database:
3
+ * wordt gebruikt door de server-route en door de tests met nagespeelde
4
+ * antwoorden van Floriday-authenticatie 1.0.61.
5
+ */
6
+ export type BaseSupplyRow = {
7
+ id: string;
8
+ trade_item_id: string;
9
+ number_of_pieces: number | null;
10
+ target_year: number | null;
11
+ target_week: number | null;
12
+ stock_mode: string | null;
13
+ sale_price: number | null;
14
+ unit: string | null;
15
+ uses_catalog_availability: boolean;
16
+ };
17
+ export type PriceCheck = {
18
+ ok: true;
19
+ price: number;
20
+ } | {
21
+ ok: false;
22
+ label: "Prijs ontbreekt" | "Eenheid onduidelijk";
23
+ };
24
+ /** Prijs per stuk excl. btw: alleen bij eenheid "stuks" en prijs > 0. */
25
+ export declare function priceForRow(row: Pick<BaseSupplyRow, "sale_price" | "unit">): PriceCheck;
26
+ /** ISO-weekjaar en ISO-week van een moment in Nederlandse tijd. */
27
+ export declare function isoWeekAmsterdam(at?: Date): {
28
+ year: number;
29
+ week: number;
30
+ };
31
+ export type Decision = {
32
+ kind: "done" | "week_past" | "stop" | "retry" | "no_price";
33
+ label: string;
34
+ outcome?: string | null;
35
+ priceStatus?: string | null;
36
+ error?: string | null;
37
+ attemptId?: string | null;
38
+ };
39
+ /** Vertaalt het antwoord van supply-line naar wat er met de regel gebeurt. */
40
+ export declare function decide(httpStatus: number, body: any, week: number | null): Decision;
41
+ /** Aanvraag precies volgens het contract (geen packingConfigurationId). */
42
+ export declare function buildRequest(row: BaseSupplyRow, price: number, environment?: "staging" | "live"): {
43
+ environment?: "staging" | "live" | undefined;
44
+ tradeItemId: string;
45
+ pricePerPiece: number;
46
+ availableQuantity: number;
47
+ currency: string;
48
+ year: number;
49
+ week: number;
50
+ supplyType: "CATALOG_PRICE";
51
+ usesCatalogAvailability: boolean;
52
+ };
53
+ //# sourceMappingURL=floriday-base-supply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floriday-base-supply.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-base-supply.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,yBAAyB,EAAE,OAAO,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,iBAAiB,GAAG,qBAAqB,CAAA;CAAE,CAAC;AAEpE,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,GAAG,MAAM,CAAC,GAAG,UAAU,CAMvF;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,EAAE,GAAE,IAAiB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAetF;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,8EAA8E;AAC9E,wBAAgB,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAoCnF;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAC1B,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM;;;;;;;;;;EAiBjC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Pure regels voor "weekaanbod aanmaken" (M15b). Geen netwerk, geen database:
3
+ * wordt gebruikt door de server-route en door de tests met nagespeelde
4
+ * antwoorden van Floriday-authenticatie 1.0.61.
5
+ */
6
+ /** Prijs per stuk excl. btw: alleen bij eenheid "stuks" en prijs > 0. */
7
+ export function priceForRow(row) {
8
+ const unit = String(row.unit ?? "").trim().toLowerCase();
9
+ if (unit && unit !== "stuks" && unit !== "stuk")
10
+ return { ok: false, label: "Eenheid onduidelijk" };
11
+ const p = Number(row.sale_price);
12
+ if (!Number.isFinite(p) || p <= 0)
13
+ return { ok: false, label: "Prijs ontbreekt" };
14
+ return { ok: true, price: Math.round(p * 1000) / 1000 };
15
+ }
16
+ /** ISO-weekjaar en ISO-week van een moment in Nederlandse tijd. */
17
+ export function isoWeekAmsterdam(at = new Date()) {
18
+ const parts = new Intl.DateTimeFormat("en-CA", {
19
+ timeZone: "Europe/Amsterdam",
20
+ year: "numeric",
21
+ month: "2-digit",
22
+ day: "2-digit",
23
+ }).formatToParts(at);
24
+ const get = (t) => Number(parts.find((p) => p.type === t)?.value);
25
+ const d = new Date(Date.UTC(get("year"), get("month") - 1, get("day")));
26
+ const day = (d.getUTCDay() + 6) % 7;
27
+ d.setUTCDate(d.getUTCDate() - day + 3);
28
+ const year = d.getUTCFullYear();
29
+ const firstThu = new Date(Date.UTC(year, 0, 4));
30
+ const week = 1 + Math.round(((d.getTime() - firstThu.getTime()) / 86400000 - 3 + ((firstThu.getUTCDay() + 6) % 7)) / 7);
31
+ return { year, week };
32
+ }
33
+ /** Vertaalt het antwoord van supply-line naar wat er met de regel gebeurt. */
34
+ export function decide(httpStatus, body, week) {
35
+ const outcome = body?.outcome ?? null;
36
+ const reason = body?.reason ?? null;
37
+ const priceStatus = body?.priceStatus ?? null;
38
+ const attemptId = body?.attemptId ? String(body.attemptId) : null;
39
+ const fl = body?.floriday;
40
+ const flText = [fl?.title, fl?.detail].filter(Boolean).join(": ");
41
+ const base = { outcome, priceStatus, attemptId };
42
+ if (outcome === "week_in_past" || reason === "week_in_past") {
43
+ return { ...base, kind: "week_past", label: `Week ${week ?? "?"} is voorbij` };
44
+ }
45
+ if (reason === "invalid_week") {
46
+ return { ...base, kind: "stop", label: `Week ${week ?? "?"} bestaat niet, controleer de invoer`, error: body?.message ?? null };
47
+ }
48
+ if (["created", "price_updated", "quantity_updated", "already_exists"].includes(String(outcome))) {
49
+ const label = priceStatus === "price_locked_current_week"
50
+ ? "Prijs kan niet meer wijzigen in de lopende week"
51
+ : outcome === "created"
52
+ ? "Aanbod aangemaakt"
53
+ : outcome === "already_exists"
54
+ ? "Aanbod bestond al, aantal bijgewerkt"
55
+ : "Aanbod bijgewerkt";
56
+ return { ...base, kind: "done", label };
57
+ }
58
+ // error
59
+ if (body?.retryable === true || httpStatus >= 500 || httpStatus === 429) {
60
+ return { ...base, kind: "retry", label: "Floriday tijdelijk niet bereikbaar", error: flText || body?.message || `HTTP ${httpStatus}` };
61
+ }
62
+ return {
63
+ ...base,
64
+ kind: "stop",
65
+ label: flText ? `Floriday weigert: ${flText}` : body?.message || "Aanmaken mislukt",
66
+ error: flText || body?.message || reason || `HTTP ${httpStatus}`,
67
+ };
68
+ }
69
+ /** Aanvraag precies volgens het contract (geen packingConfigurationId). */
70
+ export function buildRequest(row, price, environment) {
71
+ const wk = row.target_year && row.target_week
72
+ ? { year: row.target_year, week: row.target_week }
73
+ : isoWeekAmsterdam();
74
+ return {
75
+ tradeItemId: row.trade_item_id,
76
+ pricePerPiece: price,
77
+ availableQuantity: Math.max(0, Math.trunc(Number(row.number_of_pieces ?? 0))),
78
+ currency: "EUR",
79
+ year: wk.year,
80
+ week: wk.week,
81
+ supplyType: "CATALOG_PRICE",
82
+ usesCatalogAvailability: row.uses_catalog_availability,
83
+ ...(environment ? { environment } : {}),
84
+ };
85
+ }
@@ -175,4 +175,25 @@ export interface GatewayDiagnosticsReport {
175
175
  * worden geslikt zodat de oorspronkelijke caller niet cascadeert.
176
176
  */
177
177
  export declare function reportGatewayFailure(report: GatewayDiagnosticsReport): Promise<void>;
178
+ export interface SupplyLineWeekInput {
179
+ tradeItemId: string;
180
+ pricePerPiece: number;
181
+ availableQuantity: number;
182
+ currency: string;
183
+ year: number;
184
+ week: number;
185
+ supplyType: "CATALOG_PRICE";
186
+ usesCatalogAvailability: boolean;
187
+ environment?: "staging" | "live";
188
+ }
189
+ /**
190
+ * POST /api/public/gateway/supply-line met de gedeelde handtekening. Geeft
191
+ * de HTTP-status en het JSON-antwoord terug, ook bij 4xx (409 week_in_past,
192
+ * 400 invalid_week): de uitkomst staat in de body. Gooit alleen bij een
193
+ * niet-JSON-antwoord (route niet bereikbaar).
194
+ */
195
+ export declare function gatewaySupplyLineWeek(input: SupplyLineWeekInput): Promise<{
196
+ httpStatus: number;
197
+ body: any;
198
+ }>;
178
199
  //# sourceMappingURL=floriday-gateway.server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"floriday-gateway.server.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-gateway.server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"floriday-gateway.server.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-gateway.server.ts"],"names":[],"mappings":"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"}
@@ -358,3 +358,33 @@ export async function reportGatewayFailure(report) {
358
358
  console.warn("[reportGatewayFailure] kon diagnose niet versturen:", e);
359
359
  }
360
360
  }
361
+ /**
362
+ * POST /api/public/gateway/supply-line met de gedeelde handtekening. Geeft
363
+ * de HTTP-status en het JSON-antwoord terug, ook bij 4xx (409 week_in_past,
364
+ * 400 invalid_week): de uitkomst staat in de body. Gooit alleen bij een
365
+ * niet-JSON-antwoord (route niet bereikbaar).
366
+ */
367
+ export async function gatewaySupplyLineWeek(input) {
368
+ const { ensureFloridayWriteAllowed } = await import("./floriday-write-gate.server");
369
+ await ensureFloridayWriteAllowed({
370
+ action: "publish-supply-line",
371
+ path: "/supply-lines",
372
+ referenceId: input.tradeItemId,
373
+ });
374
+ const res = await doSignedFetch("/api/public/gateway/supply-line", JSON.stringify(input));
375
+ const ct = res.headers.get("content-type") ?? "";
376
+ const text = await res.text();
377
+ if (!ct.toLowerCase().includes("application/json")) {
378
+ throw new Error(`supply-line: niet-JSON antwoord (status=${res.status})`);
379
+ }
380
+ let body = null;
381
+ try {
382
+ body = text ? JSON.parse(text) : null;
383
+ }
384
+ catch {
385
+ throw new Error(`supply-line: JSON parse-fout (status=${res.status})`);
386
+ }
387
+ if (body == null)
388
+ throw new Error(`supply-line: leeg antwoord (status=${res.status})`);
389
+ return { httpStatus: res.status, body };
390
+ }
@@ -266,7 +266,7 @@ export async function syncFustTypes(connectionId) {
266
266
  if (toInsert.length > 0) {
267
267
  const { error } = await supabase.from("fust_types").insert(toInsert);
268
268
  // Dubbele sleutel = fusttype bestaat al; dat is geen fout.
269
- if (error && !/duplicate key/i.test(error.message))
269
+ if (error && !/duplicate key|bestaat al/i.test(error.message))
270
270
  throw new Error(error.message);
271
271
  }
272
272
  await Promise.all(updates);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/floriday-voorraad",
3
- "version": "1.0.63",
3
+ "version": "1.0.64",
4
4
  "sideEffects": false,
5
5
  "type": "module",
6
6
  "main": "./dist-lib/index.js",