@flowselections/floriday-voorraad 1.0.127 → 1.0.131
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.
- package/dist-lib/components/voorraad/ArtikelWizard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ArtikelWizard.js +102 -19
- package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts.map +1 -1
- package/dist-lib/components/voorraad/NieuwArtikelPage.js +2 -0
- package/dist-lib/components/voorraad/PriceStatusBadge.d.ts.map +1 -1
- package/dist-lib/components/voorraad/PriceStatusBadge.js +21 -45
- package/dist-lib/components/voorraad/ProductStructureCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ProductStructureCard.js +6 -2
- package/dist-lib/hooks/useLocalTradeItems.d.ts.map +1 -1
- package/dist-lib/hooks/useLocalTradeItems.js +4 -0
- package/dist-lib/integrations/supabase/types.d.ts +801 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/__tests__/article-code.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/article-code.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/article-code.test.js +11 -0
- package/dist-lib/lib/__tests__/release-130.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/release-130.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/release-130.test.js +103 -0
- package/dist-lib/lib/article-code.d.ts +12 -0
- package/dist-lib/lib/article-code.d.ts.map +1 -0
- package/dist-lib/lib/article-code.js +29 -0
- package/dist-lib/lib/floriday-2026v1.server.d.ts +1 -8
- package/dist-lib/lib/floriday-2026v1.server.d.ts.map +1 -1
- package/dist-lib/lib/floriday-2026v1.server.js +0 -10
- package/dist-lib/lib/floriday-gateway.functions.d.ts +6 -0
- package/dist-lib/lib/floriday-gateway.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-gateway.functions.js +7 -0
- package/dist-lib/lib/floriday-gateway.server.d.ts +17 -4
- package/dist-lib/lib/floriday-gateway.server.d.ts.map +1 -1
- package/dist-lib/lib/floriday-gateway.server.js +80 -2
- package/dist-lib/lib/floriday-payload.d.ts.map +1 -1
- package/dist-lib/lib/floriday-payload.js +11 -3
- package/dist-lib/lib/floriday-read-contract.d.ts +49 -0
- package/dist-lib/lib/floriday-read-contract.d.ts.map +1 -0
- package/dist-lib/lib/floriday-read-contract.js +92 -0
- package/dist-lib/lib/price-status.d.ts +14 -0
- package/dist-lib/lib/price-status.d.ts.map +1 -0
- package/dist-lib/lib/price-status.js +16 -0
- package/dist-lib/lib/publish-pipeline.d.ts.map +1 -1
- package/dist-lib/lib/publish-pipeline.js +2 -7
- package/dist-lib/lib/publish-status.d.ts +26 -0
- package/dist-lib/lib/publish-status.d.ts.map +1 -0
- package/dist-lib/lib/publish-status.js +30 -0
- package/dist-lib/server-hooks/floriday-continuous-stock-pull.d.ts.map +1 -1
- package/dist-lib/server-hooks/floriday-continuous-stock-pull.js +37 -50
- package/package.json +1 -1
- package/sql/floriday-voorraad-schema.sql +88 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"article-code.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/article-code.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { articleCodeProblem } from "../article-code.js";
|
|
3
|
+
describe("artikelcode-controle", () => {
|
|
4
|
+
it("weigert Artikelcode", () => expect(articleCodeProblem("Artikelcode", "Strelitzia")).not.toBeNull());
|
|
5
|
+
it("weigert Naam", () => expect(articleCodeProblem(" naam ", "X")).not.toBeNull());
|
|
6
|
+
it("weigert test", () => expect(articleCodeProblem("TEST", "X")).not.toBeNull());
|
|
7
|
+
it("weigert leeg", () => expect(articleCodeProblem(" ", "X")).not.toBeNull());
|
|
8
|
+
it("staat TQA2710G toe", () => expect(articleCodeProblem("TQA2710G", "Gaultheria")).toBeNull());
|
|
9
|
+
it("weigert code gelijk aan naam bij handmatig", () => expect(articleCodeProblem("Strelitzia", "strelitzia", "manual")).not.toBeNull());
|
|
10
|
+
it("staat code gelijk aan naam toe bij import", () => expect(articleCodeProblem("Strelitzia", "strelitzia", "import")).toBeNull());
|
|
11
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-130.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/release-130.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { READ_ROUTE_MISSING, chunk, interpretContinuousStock, parseReadResponse, toReadRequest, } from "../floriday-read-contract.js";
|
|
3
|
+
import { editTargetText, isPublishedToFloriday, publishOutcome } from "../publish-status.js";
|
|
4
|
+
import { priceStatus } from "../price-status.js";
|
|
5
|
+
import { validateStep } from "../floriday-payload.js";
|
|
6
|
+
vi.mock("../supabase-admin.server", () => ({
|
|
7
|
+
getAdminClient: () => ({
|
|
8
|
+
from: () => ({
|
|
9
|
+
select: () => ({ eq: () => ({ maybeSingle: async () => ({ data: null }) }) }),
|
|
10
|
+
upsert: async () => ({ error: null }),
|
|
11
|
+
}),
|
|
12
|
+
}),
|
|
13
|
+
}));
|
|
14
|
+
describe("leesroute floriday-get", () => {
|
|
15
|
+
it("haalt het voorvoegsel /suppliers-api-2026v1 weg en zet de query apart", () => {
|
|
16
|
+
expect(toReadRequest("/suppliers-api-2026v1/trade-items/abc/continuous-stock")).toEqual({
|
|
17
|
+
method: "GET",
|
|
18
|
+
path: "/trade-items/abc/continuous-stock",
|
|
19
|
+
});
|
|
20
|
+
expect(toReadRequest("/suppliers-api-2026v1/trade-items/base-supply?year=2026&week=44")).toEqual({
|
|
21
|
+
method: "GET",
|
|
22
|
+
path: "/trade-items/base-supply",
|
|
23
|
+
query: { year: "2026", week: "44" },
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
it("bundelt per 10", () => {
|
|
27
|
+
expect(chunk(Array.from({ length: 23 }, (_, i) => i)).map((c) => c.length)).toEqual([10, 10, 3]);
|
|
28
|
+
});
|
|
29
|
+
it("HTML of 404 van de route = leesroute ontbreekt, nooit ruwe HTML", () => {
|
|
30
|
+
expect(() => parseReadResponse(404, "text/html", "<html>Not found</html>", 1)).toThrow(READ_ROUTE_MISSING);
|
|
31
|
+
});
|
|
32
|
+
it("404 per artikel = geen beschikbaarheid; 429 = wachten volgens retryAfterMs", () => {
|
|
33
|
+
const [a, b, c] = parseReadResponse(200, "application/json", JSON.stringify({
|
|
34
|
+
ok: true,
|
|
35
|
+
results: [
|
|
36
|
+
{ ok: false, status: 404, path: "/trade-items/a/continuous-stock", error: "not found" },
|
|
37
|
+
{ ok: false, status: 429, path: "/trade-items/b/continuous-stock", error: "rate", retryAfterMs: 2500 },
|
|
38
|
+
{ ok: true, status: 200, path: "/trade-items/c/continuous-stock", data: { numberOfPieces: 7 } },
|
|
39
|
+
],
|
|
40
|
+
}), 3);
|
|
41
|
+
expect(interpretContinuousStock(a)).toEqual({ kind: "pieces", pieces: 0 });
|
|
42
|
+
expect(interpretContinuousStock(b)).toEqual({ kind: "retry", waitMs: 2500 });
|
|
43
|
+
expect(interpretContinuousStock(c)).toEqual({ kind: "pieces", pieces: 7 });
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe("gatewayRead via floriday-get (gemockt, niets naar Floriday)", () => {
|
|
47
|
+
const realFetch = globalThis.fetch;
|
|
48
|
+
beforeEach(() => {
|
|
49
|
+
process.env.FLORIDAY_GATEWAY_URL = "https://shell.test";
|
|
50
|
+
process.env.FLORIDAY_GATEWAY_SECRET = "test-secret";
|
|
51
|
+
});
|
|
52
|
+
afterEach(() => {
|
|
53
|
+
globalThis.fetch = realFetch;
|
|
54
|
+
});
|
|
55
|
+
it("stuurt één GET-verzoek zonder voorvoegsel naar /api/public/gateway/floriday-get", async () => {
|
|
56
|
+
const calls = [];
|
|
57
|
+
globalThis.fetch = vi.fn(async (url, init) => {
|
|
58
|
+
calls.push({ url: String(url), body: JSON.parse(init.body) });
|
|
59
|
+
return new Response(JSON.stringify({ ok: true, environment: "staging", results: [{ ok: true, status: 200, path: "/trade-items/x", data: { id: "x" } }] }), { status: 200, headers: { "content-type": "application/json" } });
|
|
60
|
+
});
|
|
61
|
+
const { gatewayRead } = await import("../floriday-gateway.server.js");
|
|
62
|
+
const res = await gatewayRead({ environment: "staging", path: "/suppliers-api-2026v1/trade-items/x" });
|
|
63
|
+
expect(calls[0].url).toBe("https://shell.test/api/public/gateway/floriday-get");
|
|
64
|
+
expect(calls[0].body.requests).toEqual([{ method: "GET", path: "/trade-items/x" }]);
|
|
65
|
+
expect(res).toMatchObject({ ok: true, status: 200, data: { id: "x" } });
|
|
66
|
+
});
|
|
67
|
+
it("ontbrekende route geeft 'leesroute ontbreekt in de shell'", async () => {
|
|
68
|
+
globalThis.fetch = vi.fn(async () => new Response("<html>404</html>", { status: 404, headers: { "content-type": "text/html" } }));
|
|
69
|
+
const { gatewayRead } = await import("../floriday-gateway.server.js");
|
|
70
|
+
await expect(gatewayRead({ environment: "staging", path: "/trade-items/x" })).rejects.toThrow(/Leesroute ontbreekt in de shell/);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe("publicatiestatus", () => {
|
|
74
|
+
it("een artikel met een Floriday-id telt als gepubliceerd", () => {
|
|
75
|
+
expect(isPublishedToFloriday(null, "ea7776dd-cdee-46e3-ab2a-ffd970bd8d7b")).toBe(true);
|
|
76
|
+
expect(isPublishedToFloriday(null, "")).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
it("artikel gelukt + controle mislukt = waarschuwing, niet mislukt", () => {
|
|
79
|
+
expect(publishOutcome([{ step_key: "trade-item", status: "succeeded" }, { step_key: "verify", status: "failed" }])).toBe("succeeded_with_warnings");
|
|
80
|
+
expect(publishOutcome([{ step_key: "trade-item", status: "failed" }])).toBe("failed");
|
|
81
|
+
});
|
|
82
|
+
it("met Floriday-id gaan wijzigingen naar Floriday, tenzij alleen-lezen (met reden)", () => {
|
|
83
|
+
expect(editTargetText({ floridayId: "x", writeReadOnly: false }).sendsToFloriday).toBe(true);
|
|
84
|
+
const blocked = editTargetText({ floridayId: "x", writeReadOnly: true, writeReason: "verpakkingsverschil" });
|
|
85
|
+
expect(blocked.sendsToFloriday).toBe(false);
|
|
86
|
+
expect(blocked.text).toContain("verpakkingsverschil");
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe("prijsstatus", () => {
|
|
90
|
+
const now = Date.parse("2026-10-28T12:00:00Z");
|
|
91
|
+
it("één label per prijsregel", () => {
|
|
92
|
+
expect(priceStatus(null, now)).toBe("none");
|
|
93
|
+
expect(priceStatus({ available_quantity: 500, period_end: "2026-11-30T00:00:00Z" }, now)).toBe("live");
|
|
94
|
+
expect(priceStatus({ available_quantity: 500, period_end: "2026-10-01T00:00:00Z" }, now)).toBe("expired");
|
|
95
|
+
expect(priceStatus({ available_quantity: 0, period_end: null }, now)).toBe("drained");
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe("artikelcode bij Volgende", () => {
|
|
99
|
+
it("weigert een invultekst al in de artikelstap", () => {
|
|
100
|
+
const r = validateStep("artikel", { articleCode: "artikelcode", name: "Gaultheria" });
|
|
101
|
+
expect(r.ok).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Controle op invulteksten als artikelcode. Spiegel van
|
|
3
|
+
* `voorraad_placeholder_codes` (database blijft leidend; de trigger weigert
|
|
4
|
+
* vanuit het scherm). "Gelijk aan naam" alleen bij handmatig opslaan
|
|
5
|
+
* (`mode: "manual"`); bij import/overname alleen melden.
|
|
6
|
+
*/
|
|
7
|
+
export declare const PLACEHOLDER_CODES: readonly ["artikelcode", "artikelnummer", "naam", "name", "code", "article code", "articlecode", "test", "-", "x", "nvt", "n.v.t.", "tbd", "todo"];
|
|
8
|
+
export type ArticleCodeMode = "manual" | "import";
|
|
9
|
+
export declare function articleCodeProblem(code: string | null | undefined, name: string | null | undefined, mode?: ArticleCodeMode): string | null;
|
|
10
|
+
/** Gooit een fout met Nederlandse tekst bij een ongeldige code. */
|
|
11
|
+
export declare function assertArticleCode(code: string | null | undefined, name: string | null | undefined, mode?: ArticleCodeMode): void;
|
|
12
|
+
//# sourceMappingURL=article-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"article-code.d.ts","sourceRoot":"","sources":["../../src/lib/article-code.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,oJAGpB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAElD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,IAAI,GAAE,eAA0B,GAC/B,MAAM,GAAG,IAAI,CAWf;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,IAAI,GAAE,eAA0B,GAC/B,IAAI,CAGN"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Controle op invulteksten als artikelcode. Spiegel van
|
|
3
|
+
* `voorraad_placeholder_codes` (database blijft leidend; de trigger weigert
|
|
4
|
+
* vanuit het scherm). "Gelijk aan naam" alleen bij handmatig opslaan
|
|
5
|
+
* (`mode: "manual"`); bij import/overname alleen melden.
|
|
6
|
+
*/
|
|
7
|
+
export const PLACEHOLDER_CODES = [
|
|
8
|
+
"artikelcode", "artikelnummer", "naam", "name", "code", "article code",
|
|
9
|
+
"articlecode", "test", "-", "x", "nvt", "n.v.t.", "tbd", "todo",
|
|
10
|
+
];
|
|
11
|
+
export function articleCodeProblem(code, name, mode = "manual") {
|
|
12
|
+
const raw = (code ?? "").trim();
|
|
13
|
+
const v = raw.toLowerCase();
|
|
14
|
+
if (!v)
|
|
15
|
+
return "De artikelcode is leeg.";
|
|
16
|
+
if (PLACEHOLDER_CODES.includes(v)) {
|
|
17
|
+
return `"${raw}" is een invultekst, geen artikelcode.`;
|
|
18
|
+
}
|
|
19
|
+
if (mode === "manual" && name && v === name.trim().toLowerCase()) {
|
|
20
|
+
return "De artikelcode is gelijk aan de artikelnaam.";
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
/** Gooit een fout met Nederlandse tekst bij een ongeldige code. */
|
|
25
|
+
export function assertArticleCode(code, name, mode = "manual") {
|
|
26
|
+
const p = articleCodeProblem(code, name, mode);
|
|
27
|
+
if (p)
|
|
28
|
+
throw new Error(`${p} Vul de echte artikelcode in.`);
|
|
29
|
+
}
|
|
@@ -22,7 +22,7 @@ export declare function isoWeekOf(input?: string | Date): {
|
|
|
22
22
|
};
|
|
23
23
|
/** Ligt (jaar, week) in het verleden ten opzichte van nu? */
|
|
24
24
|
export declare function isPastWeek(year: number, week: number): boolean;
|
|
25
|
-
export type RateBucket = "base-supply-write" | "base-supply-read" | "availability-write"
|
|
25
|
+
export type RateBucket = "base-supply-write" | "base-supply-read" | "availability-write";
|
|
26
26
|
export declare function consumeRateLimit(supabaseAdmin: any, connectionId: string, bucket: RateBucket, cost?: number): Promise<{
|
|
27
27
|
granted: boolean;
|
|
28
28
|
waitMs: number;
|
|
@@ -66,12 +66,5 @@ export declare class Floriday2026v1Client {
|
|
|
66
66
|
year: number;
|
|
67
67
|
week: number;
|
|
68
68
|
}): Promise<CallResult<any>>;
|
|
69
|
-
/** Verkooporders vanaf een sequencenummer. */
|
|
70
|
-
syncSalesOrders(params: {
|
|
71
|
-
sequenceNumber: number;
|
|
72
|
-
limit?: number;
|
|
73
|
-
}): Promise<CallResult<any>>;
|
|
74
|
-
/** Hoogste beschikbare sequencenummer voor verkooporders. */
|
|
75
|
-
getSalesOrderMaxSequence(): Promise<CallResult<any>>;
|
|
76
69
|
}
|
|
77
70
|
//# sourceMappingURL=floriday-2026v1.server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floriday-2026v1.server.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-2026v1.server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAY/E;AAED,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAG9D;AAOD,MAAM,MAAM,UAAU,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,oBAAoB,
|
|
1
|
+
{"version":3,"file":"floriday-2026v1.server.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-2026v1.server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAY/E;AAED,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAG9D;AAOD,MAAM,MAAM,UAAU,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,oBAAoB,CAAC;AAUzF,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,GAAG,EAClB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,UAAU,EAClB,IAAI,SAAI,GACP,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB/C;AAMD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEhG,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAuBzD;AAMD,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFZ,aAAa,EAAE,GAAG,EAClB,WAAW,EAAE,mBAAmB,EAChC,YAAY,EAAE,MAAM;YAGzB,KAAK;YA+BL,IAAI;IAclB,uEAAuE;IACvE,sBAAsB,CAAC,MAAM,EAAE;QAC7B,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,UAAU,CAAC;IAevB,oEAAoE;IACpE,6BAA6B,CAAC,MAAM,EAAE;QACpC,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,UAAU,CAAC;IAYvB,6EAA6E;IAC7E,kCAAkC,CAAC,MAAM,EAAE;QACzC,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,OAAO,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,UAAU,CAAC;IAqBvB,yEAAyE;IACzE,qBAAqB,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;CAQxF"}
|
|
@@ -31,7 +31,6 @@ const BUCKET_LIMITS = {
|
|
|
31
31
|
// Lezen van base-supply is hard begrensd op 1/s (burst 20).
|
|
32
32
|
"base-supply-read": { capacity: 20, refillPerSec: 1 },
|
|
33
33
|
"availability-write": { capacity: 100, refillPerSec: 5 },
|
|
34
|
-
"sales-orders-read": { capacity: 60, refillPerSec: 2 },
|
|
35
34
|
};
|
|
36
35
|
export async function consumeRateLimit(supabaseAdmin, connectionId, bucket, cost = 1) {
|
|
37
36
|
const limits = BUCKET_LIMITS[bucket];
|
|
@@ -176,13 +175,4 @@ export class Floriday2026v1Client {
|
|
|
176
175
|
getWeeklyBaseSupplies(params) {
|
|
177
176
|
return this.read(`${API}/trade-items/base-supply?year=${params.year}&week=${params.week}`, "base-supply-read");
|
|
178
177
|
}
|
|
179
|
-
/** Verkooporders vanaf een sequencenummer. */
|
|
180
|
-
syncSalesOrders(params) {
|
|
181
|
-
const limit = Math.min(Math.max(params.limit ?? 50, 1), 200);
|
|
182
|
-
return this.read(`${API}/sales-orders/sync/${params.sequenceNumber}?limit=${limit}`, "sales-orders-read");
|
|
183
|
-
}
|
|
184
|
-
/** Hoogste beschikbare sequencenummer voor verkooporders. */
|
|
185
|
-
getSalesOrderMaxSequence() {
|
|
186
|
-
return this.read(`${API}/sales-orders/current-max-sequence`, "sales-orders-read");
|
|
187
|
-
}
|
|
188
178
|
}
|
|
@@ -51,6 +51,12 @@ export declare const gatewayReadFn: import("@tanstack/start-client-core").Requir
|
|
|
51
51
|
userId: string;
|
|
52
52
|
claims: import("@supabase/auth-js").JwtPayload;
|
|
53
53
|
}, undefined, undefined, undefined>], (d: ReadArgs) => ReadArgs, Promise<Record<string, any>>>;
|
|
54
|
+
/** Controleert of elke gateway-route die Voorraad gebruikt in de shell bestaat. */
|
|
55
|
+
export declare const probeGatewayRoutesFn: 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, {
|
|
56
|
+
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
57
|
+
userId: string;
|
|
58
|
+
claims: import("@supabase/auth-js").JwtPayload;
|
|
59
|
+
}, undefined, undefined, undefined>], undefined, Promise<Record<string, any>>>;
|
|
54
60
|
type SupplyLineArgs = {
|
|
55
61
|
tradeItemId: string;
|
|
56
62
|
pricePerPiece: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floriday-gateway.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-gateway.functions.ts"],"names":[],"mappings":"AAQA,KAAK,UAAU,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAC/D,KAAK,YAAY,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,KAAK,cAAc,GAAG;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAChE,KAAK,SAAS,GAAG;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvD,CAAC;AAsBF,eAAO,MAAM,eAAe;;;;0CAEN,UAAU,8CAU7B,CAAC;AAEJ,eAAO,MAAM,iBAAiB;;;;0CAER,YAAY,gDAQ/B,CAAC;AAEJ,eAAO,MAAM,mBAAmB;;;;0CAEV,cAAc,kDAQjC,CAAC;AAEJ,eAAO,MAAM,cAAc;;;;0CAEL,SAAS,6CAQ5B,CAAC;AAIJ,KAAK,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,eAAO,MAAM,aAAa;;;;0CAEJ,QAAQ,4CAW3B,CAAC;AAMJ,KAAK,cAAc,GAAG;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,UAAU,CAAC,EAAE,eAAe,GAAG,aAAa,GAAG,oBAAoB,CAAC;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;CACpC,CAAC;AAoBF,eAAO,MAAM,mBAAmB;;;;0CAEV,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuJjC,CAAC"}
|
|
1
|
+
{"version":3,"file":"floriday-gateway.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-gateway.functions.ts"],"names":[],"mappings":"AAQA,KAAK,UAAU,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAC/D,KAAK,YAAY,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,KAAK,cAAc,GAAG;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAChE,KAAK,SAAS,GAAG;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvD,CAAC;AAsBF,eAAO,MAAM,eAAe;;;;0CAEN,UAAU,8CAU7B,CAAC;AAEJ,eAAO,MAAM,iBAAiB;;;;0CAER,YAAY,gDAQ/B,CAAC;AAEJ,eAAO,MAAM,mBAAmB;;;;0CAEV,cAAc,kDAQjC,CAAC;AAEJ,eAAO,MAAM,cAAc;;;;0CAEL,SAAS,6CAQ5B,CAAC;AAIJ,KAAK,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,eAAO,MAAM,aAAa;;;;0CAEJ,QAAQ,4CAW3B,CAAC;AAEJ,mFAAmF;AACnF,eAAO,MAAM,oBAAoB;;;;8EAO9B,CAAC;AAMJ,KAAK,cAAc,GAAG;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,UAAU,CAAC,EAAE,eAAe,GAAG,aAAa,GAAG,oBAAoB,CAAC;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;CACpC,CAAC;AAoBF,eAAO,MAAM,mBAAmB;;;;0CAEV,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuJjC,CAAC"}
|
|
@@ -73,6 +73,13 @@ export const gatewayReadFn = createServerFn({ method: "POST" })
|
|
|
73
73
|
const environment = await resolveFloridayEnvironment(context.supabase);
|
|
74
74
|
return (await gatewayRead({ path: data.path, environment }));
|
|
75
75
|
}));
|
|
76
|
+
/** Controleert of elke gateway-route die Voorraad gebruikt in de shell bestaat. */
|
|
77
|
+
export const probeGatewayRoutesFn = createServerFn({ method: "POST" })
|
|
78
|
+
.middleware([normalizeErrors, requireSupabaseAuth])
|
|
79
|
+
.handler(async () => safe("gateway.routes", async () => {
|
|
80
|
+
const { probeGatewayRoutes } = await import("./floriday-gateway.server.js");
|
|
81
|
+
return { routes: await probeGatewayRoutes() };
|
|
82
|
+
}));
|
|
76
83
|
function isoWeekParts(input) {
|
|
77
84
|
const parsed = input ? new Date(input) : new Date();
|
|
78
85
|
const source = Number.isNaN(parsed.getTime()) ? new Date() : parsed;
|
|
@@ -33,17 +33,18 @@ export interface GatewayResolutionInfo {
|
|
|
33
33
|
export declare function describeGatewayResolution(): Promise<GatewayResolutionInfo>;
|
|
34
34
|
export interface GatewayReadInput {
|
|
35
35
|
environment: "staging" | "live";
|
|
36
|
-
/**
|
|
37
|
-
* Volledig Floriday-pad, inclusief API-versie, bv.
|
|
38
|
-
* `/suppliers-api-2026v1/trade-items/{id}/continuous-stock`.
|
|
39
|
-
*/
|
|
36
|
+
/** Floriday-pad; een voorvoegsel /suppliers-api-2026v1 wordt weggehaald. */
|
|
40
37
|
path: string;
|
|
41
38
|
}
|
|
42
39
|
export interface GatewayReadResult<T = unknown> {
|
|
43
40
|
ok: boolean;
|
|
44
41
|
status: number;
|
|
45
42
|
data: T | null;
|
|
43
|
+
error?: string;
|
|
44
|
+
retryAfterMs?: number;
|
|
46
45
|
}
|
|
46
|
+
/** 1–10 leesverzoeken in één aanroep; resultaat per verzoek in dezelfde volgorde. */
|
|
47
|
+
export declare function gatewayReadMany(environment: "staging" | "live", paths: string[]): Promise<import("./floriday-read-contract.js").FloridayReadResult[]>;
|
|
47
48
|
export declare function gatewayRead<T = unknown>(input: GatewayReadInput): Promise<GatewayReadResult<T>>;
|
|
48
49
|
export interface GatewaySchemaInput {
|
|
49
50
|
environment: "staging" | "live";
|
|
@@ -196,4 +197,16 @@ export declare function gatewaySupplyLineWeek(input: SupplyLineWeekInput): Promi
|
|
|
196
197
|
httpStatus: number;
|
|
197
198
|
body: any;
|
|
198
199
|
}>;
|
|
200
|
+
export declare function recordGatewayRouteStatus(route: string, status: "aanwezig" | "ontbreekt", detail?: string): Promise<void>;
|
|
201
|
+
/**
|
|
202
|
+
* Controleert actief of elke gateway-route bestaat, zonder iets naar
|
|
203
|
+
* Floriday te sturen: een leeg verzoek moet een JSON-antwoord (meestal 400)
|
|
204
|
+
* geven; 404 of HTML = route ontbreekt.
|
|
205
|
+
*/
|
|
206
|
+
export declare function probeGatewayRoutes(): Promise<Array<{
|
|
207
|
+
route: string;
|
|
208
|
+
status: "aanwezig" | "ontbreekt";
|
|
209
|
+
http: number | null;
|
|
210
|
+
detail?: string;
|
|
211
|
+
}>>;
|
|
199
212
|
//# 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":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAqDH;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACnD,YAAY,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IAClD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CA6ChF;AA2HD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC
|
|
1
|
+
{"version":3,"file":"floriday-gateway.server.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-gateway.server.ts"],"names":[],"mappings":"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"}
|
|
@@ -190,8 +190,30 @@ async function gatewayPost(path, body) {
|
|
|
190
190
|
}
|
|
191
191
|
return parsed;
|
|
192
192
|
}
|
|
193
|
-
|
|
194
|
-
|
|
193
|
+
/** 1–10 leesverzoeken in één aanroep; resultaat per verzoek in dezelfde volgorde. */
|
|
194
|
+
export async function gatewayReadMany(environment, paths) {
|
|
195
|
+
const c = await import("./floriday-read-contract.js");
|
|
196
|
+
if (paths.length < 1 || paths.length > c.FLORIDAY_READ_MAX_BATCH) {
|
|
197
|
+
throw new Error(`floriday-get neemt 1–${c.FLORIDAY_READ_MAX_BATCH} verzoeken (kreeg ${paths.length}).`);
|
|
198
|
+
}
|
|
199
|
+
const raw = JSON.stringify({ environment, requests: paths.map(c.toReadRequest) });
|
|
200
|
+
const res = await doSignedFetch(c.FLORIDAY_READ_ROUTE, raw);
|
|
201
|
+
const text = await res.text();
|
|
202
|
+
try {
|
|
203
|
+
const results = c.parseReadResponse(res.status, res.headers.get("content-type") ?? "", text, paths.length);
|
|
204
|
+
void recordGatewayRouteStatus(c.FLORIDAY_READ_ROUTE, "aanwezig");
|
|
205
|
+
return results;
|
|
206
|
+
}
|
|
207
|
+
catch (e) {
|
|
208
|
+
if (e.message === c.READ_ROUTE_MISSING) {
|
|
209
|
+
void recordGatewayRouteStatus(c.FLORIDAY_READ_ROUTE, "ontbreekt", `HTTP ${res.status}`);
|
|
210
|
+
}
|
|
211
|
+
throw e;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
export async function gatewayRead(input) {
|
|
215
|
+
const [r] = await gatewayReadMany(input.environment, [input.path]);
|
|
216
|
+
return { ok: r.ok, status: r.status, data: r.data, error: r.error, retryAfterMs: r.retryAfterMs };
|
|
195
217
|
}
|
|
196
218
|
export function gatewaySchema(input) {
|
|
197
219
|
return gatewayPost("/api/public/gateway/schema", input);
|
|
@@ -388,3 +410,59 @@ export async function gatewaySupplyLineWeek(input) {
|
|
|
388
410
|
throw new Error(`supply-line: leeg antwoord (status=${res.status})`);
|
|
389
411
|
return { httpStatus: res.status, body };
|
|
390
412
|
}
|
|
413
|
+
// ---------- Route-status (voor voorraad_install_check) ----------------------
|
|
414
|
+
//
|
|
415
|
+
// Elke gateway-route die Voorraad aanroept moet in de shell bestaan. De
|
|
416
|
+
// database kan het serverRoutes-manifest van de shell niet lezen; daarom legt
|
|
417
|
+
// de server per route de laatst geziene stand vast in
|
|
418
|
+
// module_runtime_config.voorraad_gateway_routes, en leest
|
|
419
|
+
// voorraad_install_check() die rij. Hooguit één schrijfactie per route per 10 min.
|
|
420
|
+
const lastRecorded = new Map();
|
|
421
|
+
export async function recordGatewayRouteStatus(route, status, detail) {
|
|
422
|
+
const prev = lastRecorded.get(route);
|
|
423
|
+
if (prev && prev.status === status && Date.now() - prev.at < 600000)
|
|
424
|
+
return;
|
|
425
|
+
lastRecorded.set(route, { status, at: Date.now() });
|
|
426
|
+
try {
|
|
427
|
+
const { getAdminClient } = await import("./supabase-admin.server.js");
|
|
428
|
+
const admin = getAdminClient();
|
|
429
|
+
const { data } = await admin
|
|
430
|
+
.from("module_runtime_config").select("value").eq("key", "voorraad_gateway_routes").maybeSingle();
|
|
431
|
+
let current = {};
|
|
432
|
+
try {
|
|
433
|
+
current = data?.value ? JSON.parse(data.value) : {};
|
|
434
|
+
}
|
|
435
|
+
catch {
|
|
436
|
+
current = {};
|
|
437
|
+
}
|
|
438
|
+
current[route] = { status, detail: detail ?? null, checked_at: new Date().toISOString() };
|
|
439
|
+
await admin.from("module_runtime_config").upsert({ key: "voorraad_gateway_routes", value: JSON.stringify(current) }, { onConflict: "key" });
|
|
440
|
+
}
|
|
441
|
+
catch {
|
|
442
|
+
// Vastleggen mag nooit een Floriday-actie laten mislukken.
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Controleert actief of elke gateway-route bestaat, zonder iets naar
|
|
447
|
+
* Floriday te sturen: een leeg verzoek moet een JSON-antwoord (meestal 400)
|
|
448
|
+
* geven; 404 of HTML = route ontbreekt.
|
|
449
|
+
*/
|
|
450
|
+
export async function probeGatewayRoutes() {
|
|
451
|
+
const { VOORRAAD_GATEWAY_ROUTES } = await import("./floriday-read-contract.js");
|
|
452
|
+
const out = [];
|
|
453
|
+
for (const route of VOORRAAD_GATEWAY_ROUTES) {
|
|
454
|
+
try {
|
|
455
|
+
const res = await doSignedFetch(route, JSON.stringify({ probe: true }));
|
|
456
|
+
const ct = res.headers.get("content-type") ?? "";
|
|
457
|
+
await res.text();
|
|
458
|
+
const present = ct.toLowerCase().includes("application/json") && res.status !== 404;
|
|
459
|
+
const status = present ? "aanwezig" : "ontbreekt";
|
|
460
|
+
out.push({ route, status, http: res.status });
|
|
461
|
+
await recordGatewayRouteStatus(route, status, `HTTP ${res.status}`);
|
|
462
|
+
}
|
|
463
|
+
catch (e) {
|
|
464
|
+
out.push({ route, status: "ontbreekt", http: null, detail: e.message });
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return out;
|
|
468
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floriday-payload.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-payload.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"floriday-payload.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-payload.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// Belangrijk: dit is een PURE module - geen Supabase / fetch calls.
|
|
5
5
|
// De wizard bouwt het WizardData object en roept hier `buildAddTradeItemPayload`.
|
|
6
6
|
import { z } from "zod";
|
|
7
|
+
import { articleCodeProblem, assertArticleCode } from "./article-code.js";
|
|
7
8
|
/** Hardcoded lijst met aangesloten verpakkingsleveranciers zoals in Floriday. */
|
|
8
9
|
export const PACKAGING_SUPPLIERS = [
|
|
9
10
|
{ id: "anylabel", name: "Anylabel" },
|
|
@@ -144,9 +145,14 @@ export function validateStep(key, data) {
|
|
|
144
145
|
}
|
|
145
146
|
case "artikel": {
|
|
146
147
|
const r = stepSchemas.artikel.safeParse(data);
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
const errors = r.success ? [] : r.error.issues.map((i) => i.message);
|
|
149
|
+
// 1.0.130: invulteksten al bij "Volgende" weigeren, niet pas bij opslaan.
|
|
150
|
+
if ((data.articleCode ?? "").trim()) {
|
|
151
|
+
const problem = articleCodeProblem(data.articleCode, data.name, "manual");
|
|
152
|
+
if (problem)
|
|
153
|
+
errors.unshift(`${problem} Vul de echte artikelcode in.`);
|
|
154
|
+
}
|
|
155
|
+
return errors.length ? { ok: false, errors } : { ok: true };
|
|
150
156
|
}
|
|
151
157
|
case "paspoort": {
|
|
152
158
|
if (data.productGroup === "CUT_FLOWER")
|
|
@@ -431,6 +437,8 @@ export function buildAddTradeItemPayload(d) {
|
|
|
431
437
|
const tradeItemNameNl = normaliseWs(d.name).slice(0, 120);
|
|
432
438
|
if (!supplierArticleCode)
|
|
433
439
|
throw new Error("supplierArticleCode is verplicht");
|
|
440
|
+
// Vóór publicatie: invulteksten weigeren (naam-gelijk alleen melden, kan echt zijn bij kwekers).
|
|
441
|
+
assertArticleCode(supplierArticleCode, null, "import");
|
|
434
442
|
if (!tradeItemNameNl)
|
|
435
443
|
throw new Error("tradeItemName.nl is verplicht");
|
|
436
444
|
const warehouseId = (d.warehouseId ?? "").trim();
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract van de leesroute van Floriday-authenticatie (1.0.130):
|
|
3
|
+
* POST /api/public/gateway/floriday-get
|
|
4
|
+
* { requests: [{ method: "GET", path, query }] } (1–10 items)
|
|
5
|
+
* → { ok, environment, results: [{ ok, status, path, data } |
|
|
6
|
+
* { ok:false, status, path, error, retryAfterMs? }] }
|
|
7
|
+
* Paden ZONDER het voorvoegsel /suppliers-api-2026v1.
|
|
8
|
+
*
|
|
9
|
+
* Puur (geen netwerk), zodat het in tests zonder Floriday te controleren is.
|
|
10
|
+
*/
|
|
11
|
+
export declare const FLORIDAY_READ_ROUTE = "/api/public/gateway/floriday-get";
|
|
12
|
+
export declare const FLORIDAY_READ_MAX_BATCH = 10;
|
|
13
|
+
/** Alle gateway-routes die Voorraad aanroept (voor de install-check). */
|
|
14
|
+
export declare const VOORRAAD_GATEWAY_ROUTES: readonly ["/api/public/gateway/write", "/api/public/gateway/floriday-get"];
|
|
15
|
+
export declare const READ_ROUTE_MISSING: string;
|
|
16
|
+
export interface FloridayReadRequest {
|
|
17
|
+
method: "GET";
|
|
18
|
+
path: string;
|
|
19
|
+
query?: Record<string, string | number>;
|
|
20
|
+
}
|
|
21
|
+
export interface FloridayReadResult<T = unknown> {
|
|
22
|
+
ok: boolean;
|
|
23
|
+
status: number;
|
|
24
|
+
path: string;
|
|
25
|
+
data: T | null;
|
|
26
|
+
error?: string;
|
|
27
|
+
retryAfterMs?: number;
|
|
28
|
+
}
|
|
29
|
+
/** Haalt het API-voorvoegsel weg en verplaatst een querystring naar `query`. */
|
|
30
|
+
export declare function toReadRequest(fullPath: string): FloridayReadRequest;
|
|
31
|
+
export declare function chunk<T>(items: T[], size?: number): T[][];
|
|
32
|
+
/**
|
|
33
|
+
* Beoordeelt het HTTP-antwoord van de route zelf. Een HTML- of 404-antwoord
|
|
34
|
+
* betekent dat de route in de shell ontbreekt — nooit de ruwe HTML tonen.
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseReadResponse(httpStatus: number, contentType: string, text: string, expected: number): FloridayReadResult[];
|
|
37
|
+
/** Uitkomst voor één continuous-stock-resultaat. */
|
|
38
|
+
export type ContinuousStockOutcome = {
|
|
39
|
+
kind: "pieces";
|
|
40
|
+
pieces: number;
|
|
41
|
+
} | {
|
|
42
|
+
kind: "retry";
|
|
43
|
+
waitMs: number;
|
|
44
|
+
} | {
|
|
45
|
+
kind: "fail";
|
|
46
|
+
error: string;
|
|
47
|
+
};
|
|
48
|
+
export declare function interpretContinuousStock(r: FloridayReadResult<any>): ContinuousStockOutcome;
|
|
49
|
+
//# sourceMappingURL=floriday-read-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floriday-read-contract.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-read-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,mBAAmB,qCAAqC,CAAC;AACtE,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,yEAAyE;AACzE,eAAO,MAAM,uBAAuB,4EAG1B,CAAC;AAEX,eAAO,MAAM,kBAAkB,QAEwB,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,OAAO;IAC7C,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAWnE;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,SAA0B,GAAG,CAAC,EAAE,EAAE,CAI1E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,kBAAkB,EAAE,CAiCtB;AAED,oDAAoD;AACpD,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpC,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAW3F"}
|