@flowselections/pick-schermen-kwekers 1.0.24 → 1.0.28
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/pick/CartItemRows.d.ts +14 -0
- package/dist-lib/components/pick/CartItemRows.d.ts.map +1 -0
- package/dist-lib/components/pick/CartItemRows.js +23 -0
- package/dist-lib/components/pick/PickScherm.d.ts.map +1 -1
- package/dist-lib/components/pick/PickScherm.js +196 -99
- package/dist-lib/integrations/supabase/types.d.ts +2742 -39
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/__tests__/pickAlreadyPrinted.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/pickAlreadyPrinted.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/pickAlreadyPrinted.test.js +31 -0
- package/dist-lib/lib/__tests__/pickCartResults.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/pickCartResults.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/pickCartResults.test.js +68 -0
- package/dist-lib/lib/__tests__/pickSetComponents.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/pickSetComponents.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/pickSetComponents.test.js +73 -0
- package/dist-lib/lib/pickApi.d.ts +13 -0
- package/dist-lib/lib/pickApi.d.ts.map +1 -1
- package/dist-lib/lib/pickApi.js +8 -7
- package/dist-lib/lib/pickCartResults.d.ts +59 -0
- package/dist-lib/lib/pickCartResults.d.ts.map +1 -0
- package/dist-lib/lib/pickCartResults.js +150 -0
- package/dist-lib/lib/pickTypes.d.ts +19 -0
- package/dist-lib/lib/pickTypes.d.ts.map +1 -1
- package/dist-lib/lib/pickTypes.js +30 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickAlreadyPrinted.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pickAlreadyPrinted.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { ALREADY_PRINTED_MESSAGE, resettableJobs, resultsFromBatch, trackableJobs } from "../pickCartResults";
|
|
3
|
+
const cart = (id, n) => ({
|
|
4
|
+
cartId: id, cartIndex: n, cartTotal: 2, cartLabel: `K${n}`, isFullCart: true,
|
|
5
|
+
slipVariant: "full_cart", barcode: `B${n}`, isShared: false, items: [],
|
|
6
|
+
});
|
|
7
|
+
describe("al geprinte kar via pick_complete_print_carts", () => {
|
|
8
|
+
it("already_printed → niet aangemaakt met letterlijke reden; niets volgen of terugzetten", () => {
|
|
9
|
+
const r = resultsFromBatch([cart("c1", 1)], [
|
|
10
|
+
{ cartId: "c1", cartLabel: "K1", jobId: null, status: "already_printed", message: "al geprint; kies Herprint" },
|
|
11
|
+
], ["c1"]);
|
|
12
|
+
expect(r[0].outcome).toBe("not_created");
|
|
13
|
+
expect(r[0].reason).toBe("al geprint; kies Herprint");
|
|
14
|
+
expect(ALREADY_PRINTED_MESSAGE).toBe("al geprint; kies Herprint");
|
|
15
|
+
expect(trackableJobs(r)).toEqual([]);
|
|
16
|
+
});
|
|
17
|
+
it("half geprinte rij: K1 al geprint, K2 aangemaakt", () => {
|
|
18
|
+
const r = resultsFromBatch([cart("c1", 1), cart("c2", 2)], [
|
|
19
|
+
{ cartId: "c1", cartLabel: "K1", jobId: null, status: "already_printed", message: null },
|
|
20
|
+
{ cartId: "c2", cartLabel: "K2", jobId: "j2", status: "created", message: null },
|
|
21
|
+
], ["c1"]);
|
|
22
|
+
expect(r.map((x) => x.outcome)).toEqual(["not_created", "created"]);
|
|
23
|
+
expect(r[0].reason).toBe(ALREADY_PRINTED_MESSAGE);
|
|
24
|
+
expect(trackableJobs(r).map((j) => j.jobId)).toEqual(["j2"]);
|
|
25
|
+
expect(resettableJobs(trackableJobs(r)).map((j) => j.cartId)).toEqual(["c2"]);
|
|
26
|
+
});
|
|
27
|
+
it("oudere database zonder status: huidig gedrag", () => {
|
|
28
|
+
const r = resultsFromBatch([cart("c1", 1)], [{ cartId: "c1", cartLabel: "K1", jobId: null }], []);
|
|
29
|
+
expect(r[0].reason).toBe("Er loopt al een opdracht voor deze kar; geen nieuwe aangemaakt.");
|
|
30
|
+
});
|
|
31
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickCartResults.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pickCartResults.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
vi.mock("@flowselections/core", () => ({ supabase: {} }));
|
|
3
|
+
import { CartMissingError, cartsForRow, reprintCartsIndividually, resettableJobs, resultsFromBatch, runExclusive, summarizeCartResults, trackableJobs, } from "../pickCartResults";
|
|
4
|
+
const cart = (id, n) => ({ cartId: id, cartIndex: n, cartTotal: 3, cartLabel: `K${n}`, isFullCart: true, slipVariant: "full_cart", barcode: "b", isShared: false, items: [] });
|
|
5
|
+
const plan = { orderId: "o", cartTotal: 3, carts: [cart("c1", 1), cart("c2", 2), cart("c3", 3)], warnings: [] };
|
|
6
|
+
describe("(a) dubbelklik", () => {
|
|
7
|
+
it("twee snelle klikken: één aanvraag", async () => {
|
|
8
|
+
const lock = { current: false };
|
|
9
|
+
const rpc = vi.fn(() => new Promise((r) => setTimeout(r, 20)));
|
|
10
|
+
const [a, b] = await Promise.all([runExclusive(lock, rpc), runExclusive(lock, rpc)]);
|
|
11
|
+
expect(rpc).toHaveBeenCalledTimes(1);
|
|
12
|
+
expect([a, b]).toEqual([true, false]);
|
|
13
|
+
// na afloop weer vrij
|
|
14
|
+
await runExclusive(lock, rpc);
|
|
15
|
+
expect(rpc).toHaveBeenCalledTimes(2);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
describe("(b)+(c) herprint per kar", () => {
|
|
19
|
+
it("K2 geweigerd: K1/K3 gelukt, K2 niet aangemaakt, geen terugzetting", async () => {
|
|
20
|
+
const printed = ["c1", "c2", "c3"];
|
|
21
|
+
const before = [...printed];
|
|
22
|
+
const reprint = vi.fn(async (id) => {
|
|
23
|
+
if (id === "c2")
|
|
24
|
+
throw new Error("Deze kar is net al naar de printer gestuurd. Wacht even voordat je opnieuw print.");
|
|
25
|
+
return `job-${id}`;
|
|
26
|
+
});
|
|
27
|
+
const results = await reprintCartsIndividually(plan.carts, reprint);
|
|
28
|
+
expect(reprint).toHaveBeenCalledTimes(3);
|
|
29
|
+
expect(results.map((r) => r.outcome)).toEqual(["created", "not_created", "created"]);
|
|
30
|
+
const jobs = trackableJobs(results);
|
|
31
|
+
expect(jobs.every((j) => j.reprint === true)).toBe(true);
|
|
32
|
+
// stel: alle herprintopdrachten mislukken later → niets terugzetten
|
|
33
|
+
expect(resettableJobs(jobs)).toHaveLength(0);
|
|
34
|
+
expect(printed).toEqual(before);
|
|
35
|
+
const s = summarizeCartResults(results);
|
|
36
|
+
expect(s.lines).toHaveLength(3);
|
|
37
|
+
expect(s.lines[1]).toMatch(/^K2 — niet aangemaakt/);
|
|
38
|
+
});
|
|
39
|
+
it("mislukte eerste print wordt wél teruggezet, herprint niet", () => {
|
|
40
|
+
const failed = [
|
|
41
|
+
{ cartId: "c1", reprint: false },
|
|
42
|
+
{ cartId: "c2", reprint: true },
|
|
43
|
+
{ cartId: "c3" }, // oude opdracht zonder vlag = eerste print
|
|
44
|
+
];
|
|
45
|
+
expect(resettableJobs(failed).map((f) => f.cartId)).toEqual(["c1", "c3"]);
|
|
46
|
+
});
|
|
47
|
+
it("eerste print zonder opdracht-id telt als niet aangemaakt", () => {
|
|
48
|
+
const r = resultsFromBatch(plan.carts, [
|
|
49
|
+
{ cartId: "c1", jobId: "j1", cartLabel: "K1" },
|
|
50
|
+
{ cartId: "c2", jobId: null, cartLabel: "K2" },
|
|
51
|
+
{ cartId: "c3", jobId: "j3", cartLabel: "K3" },
|
|
52
|
+
], []);
|
|
53
|
+
expect(r.map((x) => x.outcome)).toEqual(["created", "not_created", "created"]);
|
|
54
|
+
expect(trackableJobs(r).map((j) => j.cartId)).toEqual(["c1", "c3"]);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe("(d) alleen karren van deze rij", () => {
|
|
58
|
+
const row = (payload) => ({ id: "q", payload });
|
|
59
|
+
it("rij met eigen kar: precies die kar", () => {
|
|
60
|
+
expect(cartsForRow(row({ cartRowFor: "o", cartId: "c2" }), plan).map((c) => c.cartId)).toEqual(["c2"]);
|
|
61
|
+
});
|
|
62
|
+
it("eigen kar niet in karplan: verversfout, niets verstuurd", () => {
|
|
63
|
+
expect(() => cartsForRow(row({ cartRowFor: "o", cartId: "weg" }), plan)).toThrow(CartMissingError);
|
|
64
|
+
});
|
|
65
|
+
it("rij zonder eigen kar: alle karren uit het karplan", () => {
|
|
66
|
+
expect(cartsForRow(row({}), plan)).toHaveLength(3);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickSetComponents.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pickSetComponents.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { readFileSync, readdirSync, statSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { componentsUnknown, parsePickCartPlan } from "../pickTypes";
|
|
5
|
+
function plan(items, extra = {}) {
|
|
6
|
+
return parsePickCartPlan({
|
|
7
|
+
orderId: "o1",
|
|
8
|
+
cartTotal: 1,
|
|
9
|
+
carts: [{ cartId: "c1", cartNumber: 1, cartTotal: 1, items }],
|
|
10
|
+
...extra,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
describe("sets met onderdelen (koppelprompt 41)", () => {
|
|
14
|
+
it("leest onderdelen precies zoals geleverd, ook set binnen set (laagste niveau)", () => {
|
|
15
|
+
const p = plan([{
|
|
16
|
+
productName: "Set A", article_number: "S-1", quantity: 2, isSet: true,
|
|
17
|
+
components: [
|
|
18
|
+
{ trade_item_key: "k1", product_id: "p1", product_name: "Onderdeel 1", article_number: "A-1", qty: 4 },
|
|
19
|
+
{ trade_item_key: "k2", product_id: "p2", product_name: "Diep onderdeel", article_number: "A-2", qty: 6 },
|
|
20
|
+
],
|
|
21
|
+
}]);
|
|
22
|
+
const item = p.carts[0].items[0];
|
|
23
|
+
expect(item.articleNumber).toBe("S-1");
|
|
24
|
+
expect(item.quantity).toBe(2);
|
|
25
|
+
expect(item.components).toEqual([
|
|
26
|
+
{ tradeItemKey: "k1", productId: "p1", productName: "Onderdeel 1", articleNumber: "A-1", qty: 4 },
|
|
27
|
+
{ tradeItemKey: "k2", productId: "p2", productName: "Diep onderdeel", articleNumber: "A-2", qty: 6 },
|
|
28
|
+
]);
|
|
29
|
+
expect(componentsUnknown(item)).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
it("set zonder onderdelen of met geen-lijst: onderdelen onbekend; regel blijft bestaan", () => {
|
|
32
|
+
const p = plan([
|
|
33
|
+
{ productName: "Set leeg", isSet: true, components: [] },
|
|
34
|
+
{ productName: "Set kapot", is_set: true, components: "x" },
|
|
35
|
+
{ productName: "Set ontbreekt", isSet: true },
|
|
36
|
+
]);
|
|
37
|
+
const items = p.carts[0].items;
|
|
38
|
+
expect(items).toHaveLength(3);
|
|
39
|
+
expect(items.map(componentsUnknown)).toEqual([true, true, true]);
|
|
40
|
+
});
|
|
41
|
+
it("zonder isSet is een lege of ontbrekende lijst een gewone regel", () => {
|
|
42
|
+
const p = plan([{ productName: "Gewoon", components: [] }, { productName: "Oud" }]);
|
|
43
|
+
expect(p.carts[0].items.map(componentsUnknown)).toEqual([false, false]);
|
|
44
|
+
});
|
|
45
|
+
it("groepsleden blijven losse regels; geen groepskop", () => {
|
|
46
|
+
const p = plan([{ productName: "Lid 1" }, { productName: "Lid 2" }]);
|
|
47
|
+
expect(p.carts[0].items.map((i) => i.productName)).toEqual(["Lid 1", "Lid 2"]);
|
|
48
|
+
});
|
|
49
|
+
it("warnings letterlijk; leeg bij ontbreken, geen lijst of lege lijst", () => {
|
|
50
|
+
const tekort = "voorraadtekort op Lid 1 voor bevroren regel 123; verdeling niet aangepast";
|
|
51
|
+
const groep = "groepsregel en ledenregels tegelijk; groepsregel niet meegeteld";
|
|
52
|
+
expect(plan([], { warnings: [tekort, groep, 5] }).warnings).toEqual([tekort, groep]);
|
|
53
|
+
expect(plan([]).warnings).toEqual([]);
|
|
54
|
+
expect(plan([], { warnings: "x" }).warnings).toEqual([]);
|
|
55
|
+
expect(plan([], { warnings: [] }).warnings).toEqual([]);
|
|
56
|
+
});
|
|
57
|
+
it("geen .from() op Engine-tabellen in pickcode", () => {
|
|
58
|
+
const files = [];
|
|
59
|
+
const walk = (d) => readdirSync(d).forEach((f) => {
|
|
60
|
+
const p = join(d, f);
|
|
61
|
+
if (statSync(p).isDirectory()) {
|
|
62
|
+
if (f !== "__tests__")
|
|
63
|
+
walk(p);
|
|
64
|
+
}
|
|
65
|
+
else if (/\.tsx?$/.test(f))
|
|
66
|
+
files.push(p);
|
|
67
|
+
});
|
|
68
|
+
walk("src/components/pick");
|
|
69
|
+
walk("src/lib");
|
|
70
|
+
const banned = /\.from\(\s*["'](order_cart_items|logistics_reservation_allocations|order_items|orders)["']/;
|
|
71
|
+
expect(files.filter((f) => banned.test(readFileSync(f, "utf8")))).toEqual([]);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -33,10 +33,23 @@ export interface PickBatchPrintJob {
|
|
|
33
33
|
cartId: string;
|
|
34
34
|
cartLabel: string | null;
|
|
35
35
|
jobId: string;
|
|
36
|
+
/** Herprint van een al geprinte kar: bij mislukken nooit terugzetten. */
|
|
37
|
+
reprint?: boolean;
|
|
38
|
+
}
|
|
39
|
+
export interface PickBatchCartResult {
|
|
40
|
+
cartId: string;
|
|
41
|
+
cartLabel: string | null;
|
|
42
|
+
/** Leeg = de database heeft voor deze kar geen opdracht aangemaakt. */
|
|
43
|
+
jobId: string | null;
|
|
44
|
+
/** created | not_created | already_printed; null bij een oudere database. */
|
|
45
|
+
status?: string | null;
|
|
46
|
+
message?: string | null;
|
|
36
47
|
}
|
|
37
48
|
export interface PickBatchPrintResult {
|
|
38
49
|
item: PickQueueItem;
|
|
39
50
|
jobs: PickBatchPrintJob[];
|
|
51
|
+
/** Alle gevraagde karren, ook die zonder nieuwe opdracht. */
|
|
52
|
+
carts: PickBatchCartResult[];
|
|
40
53
|
}
|
|
41
54
|
export declare const pickApi: {
|
|
42
55
|
countries(): Promise<PickCountry[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickApi.d.ts","sourceRoot":"","sources":["../../src/lib/pickApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,QAAQ,EACR,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,uBAAuB,EACvB,WAAW,EAEX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,WAAW,EACX,eAAe,EACf,UAAU,EACV,QAAQ,EACT,MAAM,aAAa,CAAC;AAMrB,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,GAAG,CAAC;IACzB,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IACxF,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;IAC/B,aAAa,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;CAC5B,CAAC;AAGF,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAUjE;AACD,QAAA,MAAM,EAAE,cAAwB,CAAC;AAEjC,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,CAAC;AAExB,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAYD,sEAAsE;AACtE,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,EACjC,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,GACzC,OAAO,CAAC,WAAW,EAAE,CAAC,CAgBxB;AAOD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"pickApi.d.ts","sourceRoot":"","sources":["../../src/lib/pickApi.ts"],"names":[],"mappings":"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"}
|
package/dist-lib/lib/pickApi.js
CHANGED
|
@@ -59,20 +59,21 @@ function parseBatchPrintResult(value) {
|
|
|
59
59
|
const rawJobs = safeArray(record["jobs"]);
|
|
60
60
|
if (!item || typeof item !== "object")
|
|
61
61
|
throw new Error("De batchprint gaf geen wachtrijregel terug.");
|
|
62
|
-
const
|
|
62
|
+
const carts = rawJobs.flatMap((job) => {
|
|
63
63
|
const cartId = job["cartId"];
|
|
64
|
-
|
|
65
|
-
if (typeof cartId !== "string" || typeof jobId !== "string")
|
|
64
|
+
if (typeof cartId !== "string")
|
|
66
65
|
return [];
|
|
66
|
+
const jobId = job["jobId"];
|
|
67
67
|
return [{
|
|
68
68
|
cartId,
|
|
69
|
-
jobId,
|
|
69
|
+
jobId: typeof jobId === "string" && jobId ? jobId : null,
|
|
70
70
|
cartLabel: typeof job["cartLabel"] === "string" ? job["cartLabel"] : null,
|
|
71
|
+
status: typeof job["status"] === "string" ? job["status"] : null,
|
|
72
|
+
message: typeof job["message"] === "string" && job["message"] ? job["message"] : null,
|
|
71
73
|
}];
|
|
72
74
|
});
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
return { item: item, jobs };
|
|
75
|
+
const jobs = carts.flatMap((c) => (c.jobId ? [{ cartId: c.cartId, cartLabel: c.cartLabel, jobId: c.jobId }] : []));
|
|
76
|
+
return { item: item, jobs, carts };
|
|
76
77
|
}
|
|
77
78
|
export const pickApi = {
|
|
78
79
|
async countries() {
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { PickBatchPrintJob } from "./pickApi";
|
|
2
|
+
import type { PickCart, PickCartPlan, PickQueueItem } from "./pickTypes";
|
|
3
|
+
import { printedCartIdsOf } from "./pickTypes";
|
|
4
|
+
export type CartPrintOutcome = "created" | "not_created" | "error";
|
|
5
|
+
export interface CartPrintResult {
|
|
6
|
+
cartId: string;
|
|
7
|
+
cartLabel: string | null;
|
|
8
|
+
outcome: CartPrintOutcome;
|
|
9
|
+
jobId: string | null;
|
|
10
|
+
reprint: boolean;
|
|
11
|
+
reason: string | null;
|
|
12
|
+
}
|
|
13
|
+
export declare const CART_MISSING_MESSAGE = "De kar van deze rij bestaat niet meer in het karplan; ververs de pickwachtrij";
|
|
14
|
+
export declare class CartMissingError extends Error {
|
|
15
|
+
constructor();
|
|
16
|
+
}
|
|
17
|
+
export declare function isCartMissingError(e: unknown): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Karren die deze rij mag printen. Een rij met een eigen kar biedt alleen die
|
|
20
|
+
* kar aan; die moet in het karplan van de rij staan, anders CartMissingError.
|
|
21
|
+
* Een rij zonder eigen kar: alle karren uit het karplan van die rij.
|
|
22
|
+
*/
|
|
23
|
+
export declare function cartsForRow(item: PickQueueItem, plan: PickCartPlan | null): PickCart[];
|
|
24
|
+
/** Herprint elke kar apart; een fout bij één kar stopt de andere niet. */
|
|
25
|
+
export declare function reprintCartsIndividually(carts: PickCart[], reprint: (cartId: string) => Promise<string | null>): Promise<CartPrintResult[]>;
|
|
26
|
+
/** Uitkomsten van een eerste print (één aanvraag voor alle gevraagde karren). */
|
|
27
|
+
/** Letterlijke tekst van de database voor een kar die al geprint is. */
|
|
28
|
+
export declare const ALREADY_PRINTED_MESSAGE = "al geprint; kies Herprint";
|
|
29
|
+
export declare function resultsFromBatch(requested: PickCart[], jobs: Array<{
|
|
30
|
+
cartId: string;
|
|
31
|
+
jobId: string | null;
|
|
32
|
+
cartLabel: string | null;
|
|
33
|
+
status?: string | null;
|
|
34
|
+
message?: string | null;
|
|
35
|
+
}>, alreadyPrinted: string[]): CartPrintResult[];
|
|
36
|
+
/** Weigert de database de hele aanvraag, dan is elke gevraagde kar "fout". */
|
|
37
|
+
export declare function resultsFromBatchError(requested: PickCart[], e: unknown, alreadyPrinted: string[]): CartPrintResult[];
|
|
38
|
+
/** Alleen echt aangemaakte opdrachten gaan naar de statusvolging. */
|
|
39
|
+
export declare function trackableJobs(results: CartPrintResult[]): PickBatchPrintJob[];
|
|
40
|
+
/** Mislukte opdrachten die teruggezet mogen worden: alleen eerste prints. */
|
|
41
|
+
export declare function resettableJobs<T extends {
|
|
42
|
+
reprint?: boolean;
|
|
43
|
+
}>(failed: T[]): T[];
|
|
44
|
+
export declare function cartResultLine(r: CartPrintResult): string;
|
|
45
|
+
/** Eén kar: korte melding. Meerdere karren: per kar een regel. */
|
|
46
|
+
export declare function summarizeCartResults(results: CartPrintResult[]): {
|
|
47
|
+
kind: "success" | "warning" | "error";
|
|
48
|
+
title: string;
|
|
49
|
+
lines: string[];
|
|
50
|
+
};
|
|
51
|
+
export { printedCartIdsOf };
|
|
52
|
+
/**
|
|
53
|
+
* Voert fn alleen uit als er geen andere actie loopt. De vergrendeling is een
|
|
54
|
+
* gewone (ref-)waarde en gaat dus direct bij de klik in, niet pas na een render.
|
|
55
|
+
*/
|
|
56
|
+
export declare function runExclusive(lock: {
|
|
57
|
+
current: boolean;
|
|
58
|
+
}, fn: () => Promise<unknown>): Promise<boolean>;
|
|
59
|
+
//# sourceMappingURL=pickCartResults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickCartResults.d.ts","sourceRoot":"","sources":["../../src/lib/pickCartResults.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAa,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;AAEnE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,eAAO,MAAM,oBAAoB,kFACgD,CAAC;AAElF,qBAAa,gBAAiB,SAAQ,KAAK;;CAK1C;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAOtD;AAQD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,QAAQ,EAAE,CAStF;AAED,0EAA0E;AAC1E,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,QAAQ,EAAE,EACjB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAClD,OAAO,CAAC,eAAe,EAAE,CAAC,CA0B5B;AAED,iFAAiF;AACjF,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AAEnE,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,QAAQ,EAAE,EACrB,IAAI,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,EAChI,cAAc,EAAE,MAAM,EAAE,GACvB,eAAe,EAAE,CAmBnB;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAWpH;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,iBAAiB,EAAE,CAM7E;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAEhF;AAQD,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAGzD;AAED,kEAAkE;AAClE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG;IAChE,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAYA;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B;;;GAGG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAS3G"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { cartRowOf, printedCartIdsOf } from "./pickTypes";
|
|
2
|
+
export const CART_MISSING_MESSAGE = "De kar van deze rij bestaat niet meer in het karplan; ververs de pickwachtrij";
|
|
3
|
+
export class CartMissingError extends Error {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(CART_MISSING_MESSAGE);
|
|
6
|
+
this.name = "CartMissingError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function isCartMissingError(e) {
|
|
10
|
+
const msg = e instanceof Error ? e.message : String(e ?? "");
|
|
11
|
+
return (e instanceof CartMissingError ||
|
|
12
|
+
msg.includes("bestaat niet meer in het karplan") ||
|
|
13
|
+
msg.includes("bestaat niet meer in het actuele karplan"));
|
|
14
|
+
}
|
|
15
|
+
/** Weigeringen die betekenen "er is geen nieuwe opdracht", niet "kapot". */
|
|
16
|
+
function isNotCreatedReason(msg) {
|
|
17
|
+
const low = msg.toLowerCase();
|
|
18
|
+
return low.includes("net al naar de printer") || low.includes("al een lopende opdracht");
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Karren die deze rij mag printen. Een rij met een eigen kar biedt alleen die
|
|
22
|
+
* kar aan; die moet in het karplan van de rij staan, anders CartMissingError.
|
|
23
|
+
* Een rij zonder eigen kar: alle karren uit het karplan van die rij.
|
|
24
|
+
*/
|
|
25
|
+
export function cartsForRow(item, plan) {
|
|
26
|
+
const carts = Array.isArray(plan?.carts) ? plan.carts : [];
|
|
27
|
+
const row = cartRowOf(item);
|
|
28
|
+
if (row) {
|
|
29
|
+
const own = row.cartId ? carts.find((c) => c.cartId === row.cartId) : undefined;
|
|
30
|
+
if (!own)
|
|
31
|
+
throw new CartMissingError();
|
|
32
|
+
return [own];
|
|
33
|
+
}
|
|
34
|
+
return carts;
|
|
35
|
+
}
|
|
36
|
+
/** Herprint elke kar apart; een fout bij één kar stopt de andere niet. */
|
|
37
|
+
export async function reprintCartsIndividually(carts, reprint) {
|
|
38
|
+
const results = [];
|
|
39
|
+
for (const cart of carts) {
|
|
40
|
+
try {
|
|
41
|
+
const jobId = await reprint(cart.cartId);
|
|
42
|
+
results.push({
|
|
43
|
+
cartId: cart.cartId,
|
|
44
|
+
cartLabel: cart.cartLabel,
|
|
45
|
+
outcome: jobId ? "created" : "not_created",
|
|
46
|
+
jobId: jobId ?? null,
|
|
47
|
+
reprint: true,
|
|
48
|
+
reason: jobId ? null : "De database maakte geen nieuwe opdracht aan.",
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
53
|
+
results.push({
|
|
54
|
+
cartId: cart.cartId,
|
|
55
|
+
cartLabel: cart.cartLabel,
|
|
56
|
+
outcome: isNotCreatedReason(msg) ? "not_created" : "error",
|
|
57
|
+
jobId: null,
|
|
58
|
+
reprint: true,
|
|
59
|
+
reason: msg,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return results;
|
|
64
|
+
}
|
|
65
|
+
/** Uitkomsten van een eerste print (één aanvraag voor alle gevraagde karren). */
|
|
66
|
+
/** Letterlijke tekst van de database voor een kar die al geprint is. */
|
|
67
|
+
export const ALREADY_PRINTED_MESSAGE = "al geprint; kies Herprint";
|
|
68
|
+
export function resultsFromBatch(requested, jobs, alreadyPrinted) {
|
|
69
|
+
const byCart = new Map(jobs.map((j) => [j.cartId, j]));
|
|
70
|
+
const printed = new Set(alreadyPrinted);
|
|
71
|
+
return requested.map((cart) => {
|
|
72
|
+
const job = byCart.get(cart.cartId);
|
|
73
|
+
const jobId = job?.jobId ?? null;
|
|
74
|
+
return {
|
|
75
|
+
cartId: cart.cartId,
|
|
76
|
+
cartLabel: cart.cartLabel,
|
|
77
|
+
outcome: jobId ? "created" : "not_created",
|
|
78
|
+
jobId,
|
|
79
|
+
reprint: printed.has(cart.cartId),
|
|
80
|
+
reason: jobId
|
|
81
|
+
? null
|
|
82
|
+
: job?.status === "already_printed"
|
|
83
|
+
? job.message ?? ALREADY_PRINTED_MESSAGE
|
|
84
|
+
: job?.message ?? "Er loopt al een opdracht voor deze kar; geen nieuwe aangemaakt.",
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/** Weigert de database de hele aanvraag, dan is elke gevraagde kar "fout". */
|
|
89
|
+
export function resultsFromBatchError(requested, e, alreadyPrinted) {
|
|
90
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
91
|
+
const printed = new Set(alreadyPrinted);
|
|
92
|
+
return requested.map((cart) => ({
|
|
93
|
+
cartId: cart.cartId,
|
|
94
|
+
cartLabel: cart.cartLabel,
|
|
95
|
+
outcome: "error",
|
|
96
|
+
jobId: null,
|
|
97
|
+
reprint: printed.has(cart.cartId),
|
|
98
|
+
reason: msg,
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
/** Alleen echt aangemaakte opdrachten gaan naar de statusvolging. */
|
|
102
|
+
export function trackableJobs(results) {
|
|
103
|
+
return results.flatMap((r) => r.outcome === "created" && r.jobId
|
|
104
|
+
? [{ cartId: r.cartId, cartLabel: r.cartLabel, jobId: r.jobId, reprint: r.reprint }]
|
|
105
|
+
: []);
|
|
106
|
+
}
|
|
107
|
+
/** Mislukte opdrachten die teruggezet mogen worden: alleen eerste prints. */
|
|
108
|
+
export function resettableJobs(failed) {
|
|
109
|
+
return failed.filter((f) => f.reprint !== true);
|
|
110
|
+
}
|
|
111
|
+
const LABEL = {
|
|
112
|
+
created: "gelukt",
|
|
113
|
+
not_created: "niet aangemaakt",
|
|
114
|
+
error: "fout",
|
|
115
|
+
};
|
|
116
|
+
export function cartResultLine(r) {
|
|
117
|
+
const name = r.cartLabel ?? r.cartId;
|
|
118
|
+
return r.outcome === "created" ? `${name} — ${LABEL.created}` : `${name} — ${LABEL[r.outcome]}: ${r.reason ?? ""}`.trim();
|
|
119
|
+
}
|
|
120
|
+
/** Eén kar: korte melding. Meerdere karren: per kar een regel. */
|
|
121
|
+
export function summarizeCartResults(results) {
|
|
122
|
+
const ok = results.filter((r) => r.outcome === "created").length;
|
|
123
|
+
const kind = ok === results.length ? "success" : ok === 0 && results.some((r) => r.outcome === "error") ? "error" : "warning";
|
|
124
|
+
if (results.length === 1) {
|
|
125
|
+
const r = results[0];
|
|
126
|
+
return { kind, title: cartResultLine(r), lines: [] };
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
kind,
|
|
130
|
+
title: `${ok} van ${results.length} karren naar de printer gestuurd`,
|
|
131
|
+
lines: results.map(cartResultLine),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export { printedCartIdsOf };
|
|
135
|
+
/**
|
|
136
|
+
* Voert fn alleen uit als er geen andere actie loopt. De vergrendeling is een
|
|
137
|
+
* gewone (ref-)waarde en gaat dus direct bij de klik in, niet pas na een render.
|
|
138
|
+
*/
|
|
139
|
+
export async function runExclusive(lock, fn) {
|
|
140
|
+
if (lock.current)
|
|
141
|
+
return false;
|
|
142
|
+
lock.current = true;
|
|
143
|
+
try {
|
|
144
|
+
await fn();
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
lock.current = false;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
@@ -129,21 +129,40 @@ export interface PickQueueItem {
|
|
|
129
129
|
cancelled_at: string | null;
|
|
130
130
|
created_at: string;
|
|
131
131
|
}
|
|
132
|
+
export interface PickCartComponent {
|
|
133
|
+
tradeItemKey: string | null;
|
|
134
|
+
productId: string | null;
|
|
135
|
+
productName: string;
|
|
136
|
+
articleNumber: string | null;
|
|
137
|
+
qty: number | null;
|
|
138
|
+
}
|
|
132
139
|
export interface PickCartItem {
|
|
133
140
|
itemId: string | null;
|
|
134
141
|
orderItemId: string | null;
|
|
135
142
|
productId: string | null;
|
|
136
143
|
productName: string;
|
|
144
|
+
articleNumber: string | null;
|
|
137
145
|
crates: number | null;
|
|
138
146
|
plantsPerCrate: number | null;
|
|
139
147
|
quantity: number | null;
|
|
140
148
|
belongsToOrder: boolean | null;
|
|
149
|
+
/** Alleen true als de Engine de regel expliciet als set markeert. */
|
|
150
|
+
isSet: boolean;
|
|
151
|
+
/** null = geen lijst geleverd (onbekend); [] = lege lijst. */
|
|
152
|
+
components: PickCartComponent[] | null;
|
|
141
153
|
}
|
|
142
154
|
export interface PickCartPlan {
|
|
143
155
|
orderId: string;
|
|
144
156
|
cartTotal: number;
|
|
145
157
|
carts: PickCart[];
|
|
158
|
+
/** Letterlijke Engine-meldingen op orderniveau; leeg als het veld ontbreekt. */
|
|
159
|
+
warnings: string[];
|
|
146
160
|
}
|
|
161
|
+
/** Onderdelen precies zoals de Engine ze levert; niets herberekend. */
|
|
162
|
+
export declare function parseCartComponents(value: unknown): PickCartComponent[] | null;
|
|
163
|
+
/** "onderdelen onbekend" alleen bij een door de Engine gemarkeerde set zonder onderdelen. */
|
|
164
|
+
export declare function componentsUnknown(item: Pick<PickCartItem, "isSet" | "components">): boolean;
|
|
165
|
+
export declare function parsePlanWarnings(value: unknown): string[];
|
|
147
166
|
export interface PickCart {
|
|
148
167
|
cartId: string;
|
|
149
168
|
cartIndex: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickTypes.d.ts","sourceRoot":"","sources":["../../src/lib/pickTypes.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"pickTypes.d.ts","sourceRoot":"","sources":["../../src/lib/pickTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
// Types voor de Pickstations-module. Alles is database-gestuurd; deze types
|
|
2
2
|
// beschrijven alleen de vorm van de rijen, nooit vaste waardes.
|
|
3
|
+
/** Onderdelen precies zoals de Engine ze levert; niets herberekend. */
|
|
4
|
+
export function parseCartComponents(value) {
|
|
5
|
+
if (!Array.isArray(value))
|
|
6
|
+
return null;
|
|
7
|
+
return value.flatMap((raw) => {
|
|
8
|
+
const c = recordOf(raw);
|
|
9
|
+
if (!c)
|
|
10
|
+
return [];
|
|
11
|
+
return [{
|
|
12
|
+
tradeItemKey: textOf(c["trade_item_key"] ?? c["tradeItemKey"]),
|
|
13
|
+
productId: textOf(c["product_id"] ?? c["productId"]),
|
|
14
|
+
productName: textOf(c["product_name"] ?? c["productName"]) ?? "Onderdeel",
|
|
15
|
+
articleNumber: textOf(c["article_number"] ?? c["articleNumber"]),
|
|
16
|
+
qty: numberOf(c["qty"] ?? c["quantity"]),
|
|
17
|
+
}];
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/** "onderdelen onbekend" alleen bij een door de Engine gemarkeerde set zonder onderdelen. */
|
|
21
|
+
export function componentsUnknown(item) {
|
|
22
|
+
return item.isSet && (!Array.isArray(item.components) || item.components.length === 0);
|
|
23
|
+
}
|
|
24
|
+
export function parsePlanWarnings(value) {
|
|
25
|
+
if (!Array.isArray(value))
|
|
26
|
+
return [];
|
|
27
|
+
return value.filter((w) => typeof w === "string" && w.trim().length > 0);
|
|
28
|
+
}
|
|
3
29
|
function recordOf(value) {
|
|
4
30
|
return value && typeof value === "object" && !Array.isArray(value)
|
|
5
31
|
? value
|
|
@@ -54,10 +80,13 @@ export function parsePickCartPlan(value) {
|
|
|
54
80
|
orderItemId: textOf(item["orderItemId"] ?? item["order_item_id"]),
|
|
55
81
|
productId: textOf(item["productId"] ?? item["product_id"]),
|
|
56
82
|
productName: textOf(item["productName"] ?? item["product_name"]) ?? "Product",
|
|
83
|
+
articleNumber: textOf(item["articleNumber"] ?? item["article_number"]),
|
|
57
84
|
crates: numberOf(item["crates"]),
|
|
58
85
|
plantsPerCrate: numberOf(item["plantsPerCrate"] ?? item["plants_per_crate"]),
|
|
59
86
|
quantity: numberOf(item["quantity"]),
|
|
60
87
|
belongsToOrder: typeof item["belongsToOrder"] === "boolean" ? item["belongsToOrder"] : null,
|
|
88
|
+
isSet: (item["isSet"] ?? item["is_set"]) === true,
|
|
89
|
+
components: parseCartComponents(item["components"]),
|
|
61
90
|
}];
|
|
62
91
|
});
|
|
63
92
|
return [{
|
|
@@ -81,7 +110,7 @@ export function parsePickCartPlan(value) {
|
|
|
81
110
|
return null;
|
|
82
111
|
if (!isBuffer && new Set(ownCarts.map((cart) => cart.cartIndex)).size !== declaredTotal)
|
|
83
112
|
return null;
|
|
84
|
-
return { orderId, cartTotal: declaredTotal, carts };
|
|
113
|
+
return { orderId, cartTotal: declaredTotal, carts, warnings: parsePlanWarnings(root["warnings"]) };
|
|
85
114
|
}
|
|
86
115
|
export function printedCartIdsOf(item) {
|
|
87
116
|
return safeArray(item.printed_cart_ids).filter((value) => typeof value === "string");
|