@flowselections/floriday-voorraad 1.0.147 → 1.0.149
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/EditArtikelPage.d.ts.map +1 -1
- package/dist-lib/components/voorraad/EditArtikelPage.js +13 -20
- package/dist-lib/components/voorraad/OrderHistoryCard.d.ts +3 -1
- package/dist-lib/components/voorraad/OrderHistoryCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/OrderHistoryCard.js +7 -3
- package/dist-lib/components/voorraad/ProductCustomFieldsCard.d.ts +5 -1
- package/dist-lib/components/voorraad/ProductCustomFieldsCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ProductCustomFieldsCard.js +9 -6
- package/dist-lib/components/voorraad/ProductSalePriceField.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ProductSalePriceField.js +2 -0
- package/dist-lib/components/voorraad/StockMutationHistoryCard.d.ts +3 -1
- package/dist-lib/components/voorraad/StockMutationHistoryCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/StockMutationHistoryCard.js +16 -10
- package/dist-lib/components/voorraad/VoorraadBeheerCard.d.ts +3 -0
- package/dist-lib/components/voorraad/VoorraadBeheerCard.d.ts.map +1 -0
- package/dist-lib/components/voorraad/VoorraadBeheerCard.js +44 -0
- package/dist-lib/components/voorraad/artikel/ArtikelPagina.d.ts +2 -1
- package/dist-lib/components/voorraad/artikel/ArtikelPagina.d.ts.map +1 -1
- package/dist-lib/components/voorraad/artikel/ArtikelPagina.js +60 -10
- package/dist-lib/components/voorraad/lijst/VoorraadLijstTabel.d.ts.map +1 -1
- package/dist-lib/components/voorraad/lijst/VoorraadLijstTabel.js +5 -4
- package/dist-lib/hooks/useVoorraadCustomFields.d.ts +2 -1
- package/dist-lib/hooks/useVoorraadCustomFields.d.ts.map +1 -1
- package/dist-lib/hooks/useVoorraadCustomFields.js +8 -4
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +2 -0
- package/dist-lib/integrations/supabase/types.d.ts +283 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/artikel-gewijzigd.d.ts +4 -0
- package/dist-lib/lib/artikel-gewijzigd.d.ts.map +1 -0
- package/dist-lib/lib/artikel-gewijzigd.js +7 -0
- package/dist-lib/lib/artikel-pagina.d.ts +14 -3
- package/dist-lib/lib/artikel-pagina.d.ts.map +1 -1
- package/dist-lib/lib/artikel-pagina.js +5 -1
- package/dist-lib/lib/floriday-versie-ronde.d.ts +59 -0
- package/dist-lib/lib/floriday-versie-ronde.d.ts.map +1 -0
- package/dist-lib/lib/floriday-versie-ronde.functions.d.ts +10 -0
- package/dist-lib/lib/floriday-versie-ronde.functions.d.ts.map +1 -0
- package/dist-lib/lib/floriday-versie-ronde.functions.js +22 -0
- package/dist-lib/lib/floriday-versie-ronde.js +106 -0
- package/dist-lib/lib/voorraad-lijst.d.ts +3 -2
- package/dist-lib/lib/voorraad-lijst.d.ts.map +1 -1
- package/dist-lib/lib/voorraad-lijst.js +6 -2
- package/dist-lib/server-hooks/floriday-stock-reconcile.d.ts.map +1 -1
- package/dist-lib/server-hooks/floriday-stock-reconcile.js +5 -0
- package/dist-lib/server-hooks/floriday-versieronde.d.ts +2 -0
- package/dist-lib/server-hooks/floriday-versieronde.d.ts.map +1 -0
- package/dist-lib/server-hooks/floriday-versieronde.js +29 -0
- package/dist-lib/server-hooks/guard.js +1 -1
- package/package.json +1 -1
- package/sql/AGENTS.md +2 -0
- package/sql/floriday-voorraad-schema.sql +638 -18
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Gebeurtenis die tabbladen sturen na een opslag, zodat de kop van de artikelpagina direct bijwerkt. */
|
|
2
|
+
export declare const ARTIKEL_GEWIJZIGD = "voorraad:artikel-gewijzigd";
|
|
3
|
+
export declare function meldArtikelGewijzigd(id: string | null | undefined): void;
|
|
4
|
+
//# sourceMappingURL=artikel-gewijzigd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artikel-gewijzigd.d.ts","sourceRoot":"","sources":["../../src/lib/artikel-gewijzigd.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAE9D,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,QAGjE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Gebeurtenis die tabbladen sturen na een opslag, zodat de kop van de artikelpagina direct bijwerkt. */
|
|
2
|
+
export const ARTIKEL_GEWIJZIGD = "voorraad:artikel-gewijzigd";
|
|
3
|
+
export function meldArtikelGewijzigd(id) {
|
|
4
|
+
if (!id || typeof window === "undefined")
|
|
5
|
+
return;
|
|
6
|
+
window.dispatchEvent(new CustomEvent(ARTIKEL_GEWIJZIGD, { detail: { id } }));
|
|
7
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { LijstRij, LijstStatus } from "./voorraad-lijst.js";
|
|
2
|
+
import type { VoorraadCustomField } from "./voorraad-custom-fields.js";
|
|
2
3
|
/** Velden die "Opslaan" mag wijzigen. Voorraad hoort hier nooit bij (die gaat via directe boekingen). */
|
|
3
4
|
export declare const ARTIKEL_VELDEN: readonly ["product", "article_number", "sale_price", "unit", "barcode"];
|
|
4
5
|
export type ArtikelVeld = (typeof ARTIKEL_VELDEN)[number];
|
|
@@ -28,6 +29,16 @@ export interface ArtikelDetail {
|
|
|
28
29
|
verpakking_ok: boolean;
|
|
29
30
|
gearchiveerd_at: string | null;
|
|
30
31
|
orders_gearchiveerd?: number;
|
|
32
|
+
floriday_verwijderd_at?: string | null;
|
|
33
|
+
trade_item_key?: string | null;
|
|
34
|
+
controle?: {
|
|
35
|
+
mutatie_sleutels: string[] | null;
|
|
36
|
+
zelfde_sleutel_ids: string[];
|
|
37
|
+
};
|
|
38
|
+
eigen_velden?: {
|
|
39
|
+
definities: VoorraadCustomField[];
|
|
40
|
+
waarden: Record<string, unknown>;
|
|
41
|
+
};
|
|
31
42
|
}
|
|
32
43
|
export interface Conflict {
|
|
33
44
|
veld: ArtikelVeld | VoorraadVeld;
|
|
@@ -40,11 +51,11 @@ export declare function gewijzigdeVelden(oud: Velden, nieuw: Velden): Partial<Ve
|
|
|
40
51
|
/** Prijs uit invoer ("1,25" of "1.25"); leeg = null; ongeldig = NaN. */
|
|
41
52
|
export declare function prijsUitInvoer(s: string): number | null;
|
|
42
53
|
/** Eén status voor de kop, zelfde volgorde als de lijst. */
|
|
43
|
-
export declare function artikelStatus(d: Pick<ArtikelDetail, "gearchiveerd_at" | "verpakking_ok" | "heeft_koppeling" | "floriday_id" | "velden">): LijstStatus;
|
|
54
|
+
export declare function artikelStatus(d: Pick<ArtikelDetail, "gearchiveerd_at" | "verpakking_ok" | "heeft_koppeling" | "floriday_id" | "velden" | "floriday_verwijderd_at">): LijstStatus;
|
|
44
55
|
/** Welke Floriday-actie de kop toont. */
|
|
45
|
-
export declare function floridayActie(d: Pick<ArtikelDetail, "heeft_koppeling" | "floriday_id" | "gearchiveerd_at">): "sturen" | "op_floriday" | null;
|
|
56
|
+
export declare function floridayActie(d: Pick<ArtikelDetail, "heeft_koppeling" | "floriday_id" | "gearchiveerd_at" | "floriday_verwijderd_at">): "sturen" | "op_floriday" | null;
|
|
46
57
|
/** Tabbladen; Floriday alleen bij een gekoppeld artikel in een shell met koppeling. */
|
|
47
|
-
export declare function artikelTabs(d: Pick<ArtikelDetail, "heeft_koppeling" | "floriday_id">): string[];
|
|
58
|
+
export declare function artikelTabs(d: Pick<ArtikelDetail, "heeft_koppeling" | "floriday_id" | "floriday_verwijderd_at">): string[];
|
|
48
59
|
export declare function alsLijstRij(d: ArtikelDetail): LijstRij;
|
|
49
60
|
/** Voorraadinstellingen die ook onder "Opslaan" vallen. Liggend hoort hier nooit bij. */
|
|
50
61
|
export declare const VOORRAAD_VELDEN: readonly ["minimum_stock", "incoming_stock", "notes"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artikel-pagina.d.ts","sourceRoot":"","sources":["../../src/lib/artikel-pagina.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"artikel-pagina.d.ts","sourceRoot":"","sources":["../../src/lib/artikel-pagina.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,8 @@ export function prijsUitInvoer(s) {
|
|
|
36
36
|
export function artikelStatus(d) {
|
|
37
37
|
if (d.gearchiveerd_at)
|
|
38
38
|
return "gearchiveerd";
|
|
39
|
+
if (d.heeft_koppeling && d.floriday_verwijderd_at)
|
|
40
|
+
return "verwijderd_floriday";
|
|
39
41
|
if (!d.verpakking_ok)
|
|
40
42
|
return "verpakking";
|
|
41
43
|
if (d.heeft_koppeling && !d.floriday_id)
|
|
@@ -50,12 +52,14 @@ export function artikelStatus(d) {
|
|
|
50
52
|
export function floridayActie(d) {
|
|
51
53
|
if (!d.heeft_koppeling || d.gearchiveerd_at)
|
|
52
54
|
return null;
|
|
55
|
+
if (d.floriday_verwijderd_at)
|
|
56
|
+
return "op_floriday";
|
|
53
57
|
return d.floriday_id ? "sturen" : "op_floriday";
|
|
54
58
|
}
|
|
55
59
|
/** Tabbladen; Floriday alleen bij een gekoppeld artikel in een shell met koppeling. */
|
|
56
60
|
export function artikelTabs(d) {
|
|
57
61
|
const t = ["voorraad", "verpakking", "koppelingen"];
|
|
58
|
-
if (d.heeft_koppeling && d.floriday_id)
|
|
62
|
+
if (d.heeft_koppeling && d.floriday_id && !d.floriday_verwijderd_at)
|
|
59
63
|
t.push("floriday");
|
|
60
64
|
return t;
|
|
61
65
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Controleronde van Floriday-versies (1.0.148). Puur, zodat het zonder Floriday te testen is.
|
|
3
|
+
*
|
|
4
|
+
* Per trade item in de cache vragen we `GET /trade-items/{id}` op:
|
|
5
|
+
* - 200 met hetzelfde id → actueel;
|
|
6
|
+
* - 200 met een ander `tradeItemId` (Floriday stuurt de oude id door) → vervangen, met opvolger;
|
|
7
|
+
* - 200 met `isDeleted` → vervallen;
|
|
8
|
+
* - 404/410 → vervallen (komt niet voor in de actuele Floriday-lijst);
|
|
9
|
+
* - al het andere (429, 5xx, omleiding die niet gevolgd is, netwerkfout) → fout.
|
|
10
|
+
* Een ronde is alleen volledig als elk item een uitkomst zonder fout heeft;
|
|
11
|
+
* de database markeert pas iets na een volledige ronde zonder fouten.
|
|
12
|
+
*/
|
|
13
|
+
import type { FloridayReadResult } from "./floriday-read-contract.js";
|
|
14
|
+
export type VersieStatus = "actueel" | "vervangen" | "vervallen";
|
|
15
|
+
export interface VersieUitkomst {
|
|
16
|
+
floriday_id: string;
|
|
17
|
+
status: VersieStatus;
|
|
18
|
+
opvolger_id?: string | null;
|
|
19
|
+
bron: "floriday_doorverwijzing" | "floriday_niet_gevonden" | "floriday_is_deleted" | "floriday_actueel";
|
|
20
|
+
}
|
|
21
|
+
export type VersieOordeel = {
|
|
22
|
+
kind: "uitkomst";
|
|
23
|
+
uitkomst: VersieUitkomst;
|
|
24
|
+
} | {
|
|
25
|
+
kind: "fout";
|
|
26
|
+
reden: string;
|
|
27
|
+
};
|
|
28
|
+
export declare function beoordeelVersie(floridayId: string, r: FloridayReadResult | null | undefined): VersieOordeel;
|
|
29
|
+
export interface VersieRonde {
|
|
30
|
+
volledig: boolean;
|
|
31
|
+
fouten: number;
|
|
32
|
+
uitkomsten: VersieUitkomst[];
|
|
33
|
+
foutvoorbeelden: string[];
|
|
34
|
+
}
|
|
35
|
+
/** Bundelt de oordelen; `ids` is de volledige lijst die gecontroleerd moest worden. */
|
|
36
|
+
export declare function maakRonde(ids: string[], oordelen: Map<string, VersieOordeel>): VersieRonde;
|
|
37
|
+
export type PortieUitkomst = VersieUitkomst | {
|
|
38
|
+
floriday_id: string;
|
|
39
|
+
status: "fout";
|
|
40
|
+
reden: string;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Eén portie van de automatische ronde: 10 per verzoek, pauze ertussen.
|
|
44
|
+
* 429 → één keer opnieuw na de gevraagde wachttijd; nog steeds 429 = niet verwerkt (volgende run).
|
|
45
|
+
* Gooit het lezen zelf (geen verbinding), dan stopt de portie met `verbindingsfout`.
|
|
46
|
+
*/
|
|
47
|
+
export declare function verwerkVersiePortie(ids: string[], lees: (paden: string[]) => Promise<FloridayReadResult[]>, opties?: {
|
|
48
|
+
pauzeMs?: number;
|
|
49
|
+
slaap?: (ms: number) => Promise<void>;
|
|
50
|
+
}): Promise<{
|
|
51
|
+
uitkomsten: PortieUitkomst[];
|
|
52
|
+
verbindingsfout: string | null;
|
|
53
|
+
uitgesteld: number;
|
|
54
|
+
}>;
|
|
55
|
+
/** Blok "Beheer" en de knop alleen voor beheerders. */
|
|
56
|
+
export declare function toonVersieBeheer(status: {
|
|
57
|
+
beheerder?: boolean;
|
|
58
|
+
} | null | undefined): boolean;
|
|
59
|
+
//# sourceMappingURL=floriday-versie-ronde.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floriday-versie-ronde.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-versie-ronde.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,yBAAyB,GAAG,wBAAwB,GAAG,qBAAqB,GAAG,kBAAkB,CAAC;CACzG;AAED,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7G,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,GAAG,aAAa,CAqB3G;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,uFAAuF;AACvF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,WAAW,CAW1F;AAED,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAErG;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,kBAAkB,EAAE,CAAC,EACxD,MAAM,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAAO,GACvE,OAAO,CAAC;IAAE,UAAU,EAAE,cAAc,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAuC/F;AAED,uDAAuD;AACvD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE5F"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const floridayVersiesControleren: 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, {
|
|
2
|
+
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
3
|
+
userId: string;
|
|
4
|
+
claims: import("@supabase/auth-js").JwtPayload;
|
|
5
|
+
}, undefined, undefined, undefined>], undefined, Promise<{
|
|
6
|
+
ok: boolean;
|
|
7
|
+
gewekt?: boolean;
|
|
8
|
+
melding?: string;
|
|
9
|
+
}>>;
|
|
10
|
+
//# sourceMappingURL=floriday-versie-ronde.functions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floriday-versie-ronde.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-versie-ronde.functions.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,0BAA0B;;;;;QAUd,OAAO;aAAW,OAAO;cAAY,MAAM;GAChE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alleen voor beheerders (blok "Beheer"): de automatische versieronde nu starten.
|
|
3
|
+
* De ronde zelf loopt op de server in porties; hier wordt hij alleen gewekt.
|
|
4
|
+
*/
|
|
5
|
+
import { createServerFn } from "@tanstack/react-start";
|
|
6
|
+
import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
|
|
7
|
+
import { normalizeErrors } from "./normalize-errors-middleware.js";
|
|
8
|
+
export const floridayVersiesControleren = createServerFn({ method: "POST" })
|
|
9
|
+
.middleware([normalizeErrors, requireSupabaseAuth])
|
|
10
|
+
.handler(async ({ context }) => {
|
|
11
|
+
const { data: beheerder, error: rolFout } = await context.supabase.rpc("voorraad_is_beheerder");
|
|
12
|
+
if (rolFout)
|
|
13
|
+
throw new Error(rolFout.message);
|
|
14
|
+
if (!beheerder)
|
|
15
|
+
throw new Error("Alleen een beheerder kan de controle van Floriday-artikelen starten.");
|
|
16
|
+
const { getAdminClient } = await import("./supabase-admin.server.js");
|
|
17
|
+
const admin = getAdminClient();
|
|
18
|
+
const { data, error } = await admin.rpc("run_floriday_versieronde", { p_nieuw: true });
|
|
19
|
+
if (error)
|
|
20
|
+
throw new Error(error.message);
|
|
21
|
+
return data;
|
|
22
|
+
});
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
export function beoordeelVersie(floridayId, r) {
|
|
2
|
+
if (!r)
|
|
3
|
+
return { kind: "fout", reden: "geen antwoord" };
|
|
4
|
+
if (r.status === 404 || r.status === 410) {
|
|
5
|
+
return { kind: "uitkomst", uitkomst: { floriday_id: floridayId, status: "vervallen", bron: "floriday_niet_gevonden" } };
|
|
6
|
+
}
|
|
7
|
+
if (!r.ok || r.status < 200 || r.status >= 300) {
|
|
8
|
+
return { kind: "fout", reden: `status ${r.status}${r.error ? `: ${r.error}` : ""}` };
|
|
9
|
+
}
|
|
10
|
+
const data = (r.data ?? {});
|
|
11
|
+
const terug = typeof data.tradeItemId === "string" ? data.tradeItemId.trim() : "";
|
|
12
|
+
if (!terug)
|
|
13
|
+
return { kind: "fout", reden: "antwoord zonder tradeItemId" };
|
|
14
|
+
if (data.isDeleted === true) {
|
|
15
|
+
return { kind: "uitkomst", uitkomst: { floriday_id: floridayId, status: "vervallen", bron: "floriday_is_deleted" } };
|
|
16
|
+
}
|
|
17
|
+
if (terug.toLowerCase() !== floridayId.trim().toLowerCase()) {
|
|
18
|
+
return {
|
|
19
|
+
kind: "uitkomst",
|
|
20
|
+
uitkomst: { floriday_id: floridayId, status: "vervangen", opvolger_id: terug, bron: "floriday_doorverwijzing" },
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return { kind: "uitkomst", uitkomst: { floriday_id: floridayId, status: "actueel", bron: "floriday_actueel" } };
|
|
24
|
+
}
|
|
25
|
+
/** Bundelt de oordelen; `ids` is de volledige lijst die gecontroleerd moest worden. */
|
|
26
|
+
export function maakRonde(ids, oordelen) {
|
|
27
|
+
const uitkomsten = [];
|
|
28
|
+
const foutvoorbeelden = [];
|
|
29
|
+
let fouten = 0;
|
|
30
|
+
for (const id of ids) {
|
|
31
|
+
const o = oordelen.get(id);
|
|
32
|
+
if (!o) {
|
|
33
|
+
fouten++;
|
|
34
|
+
if (foutvoorbeelden.length < 5)
|
|
35
|
+
foutvoorbeelden.push(`${id}: niet gecontroleerd`);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (o.kind === "fout") {
|
|
39
|
+
fouten++;
|
|
40
|
+
if (foutvoorbeelden.length < 5)
|
|
41
|
+
foutvoorbeelden.push(`${id}: ${o.reden}`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
uitkomsten.push(o.uitkomst);
|
|
45
|
+
}
|
|
46
|
+
return { volledig: fouten === 0 && uitkomsten.length === ids.length, fouten, uitkomsten, foutvoorbeelden };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Eén portie van de automatische ronde: 10 per verzoek, pauze ertussen.
|
|
50
|
+
* 429 → één keer opnieuw na de gevraagde wachttijd; nog steeds 429 = niet verwerkt (volgende run).
|
|
51
|
+
* Gooit het lezen zelf (geen verbinding), dan stopt de portie met `verbindingsfout`.
|
|
52
|
+
*/
|
|
53
|
+
export async function verwerkVersiePortie(ids, lees, opties = {}) {
|
|
54
|
+
const slaap = opties.slaap ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
55
|
+
const pauze = opties.pauzeMs ?? 1000;
|
|
56
|
+
const uitkomsten = [];
|
|
57
|
+
let uitgesteld = 0;
|
|
58
|
+
for (let i = 0; i < ids.length; i += 10) {
|
|
59
|
+
const groep = ids.slice(i, i + 10);
|
|
60
|
+
if (i > 0)
|
|
61
|
+
await slaap(pauze);
|
|
62
|
+
let res;
|
|
63
|
+
try {
|
|
64
|
+
res = await lees(groep.map((id) => `/trade-items/${id}`));
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
return { uitkomsten, verbindingsfout: e?.message ?? String(e), uitgesteld };
|
|
68
|
+
}
|
|
69
|
+
const opnieuw = [];
|
|
70
|
+
let wacht = 0;
|
|
71
|
+
groep.forEach((id, k) => {
|
|
72
|
+
const r = res[k];
|
|
73
|
+
if (r && r.status === 429) {
|
|
74
|
+
opnieuw.push(id);
|
|
75
|
+
wacht = Math.max(wacht, r.retryAfterMs ?? 2000);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const o = beoordeelVersie(id, r);
|
|
79
|
+
uitkomsten.push(o.kind === "uitkomst" ? o.uitkomst : { floriday_id: id, status: "fout", reden: o.reden });
|
|
80
|
+
});
|
|
81
|
+
if (opnieuw.length) {
|
|
82
|
+
await slaap(Math.min(wacht, 10000));
|
|
83
|
+
let res2;
|
|
84
|
+
try {
|
|
85
|
+
res2 = await lees(opnieuw.map((id) => `/trade-items/${id}`));
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
return { uitkomsten, verbindingsfout: e?.message ?? String(e), uitgesteld };
|
|
89
|
+
}
|
|
90
|
+
opnieuw.forEach((id, k) => {
|
|
91
|
+
const r = res2[k];
|
|
92
|
+
if (r && r.status === 429) {
|
|
93
|
+
uitgesteld++;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const o = beoordeelVersie(id, r);
|
|
97
|
+
uitkomsten.push(o.kind === "uitkomst" ? o.uitkomst : { floriday_id: id, status: "fout", reden: o.reden });
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return { uitkomsten, verbindingsfout: null, uitgesteld };
|
|
102
|
+
}
|
|
103
|
+
/** Blok "Beheer" en de knop alleen voor beheerders. */
|
|
104
|
+
export function toonVersieBeheer(status) {
|
|
105
|
+
return status?.beheerder === true;
|
|
106
|
+
}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* pagineren gebeuren op de server in `voorraad_lijst`; dit bestand bevat alleen de
|
|
4
4
|
* vaste vocabulaire en pure hulpjes, zodat ze los te testen zijn.
|
|
5
5
|
*/
|
|
6
|
-
export type LijstFilter = "alles" | "onder_minimum" | "verpakking" | "niet_gekoppeld" | "prijs" | "twijfel" | "gearchiveerd";
|
|
6
|
+
export type LijstFilter = "alles" | "onder_minimum" | "verpakking" | "niet_gekoppeld" | "verwijderd_floriday" | "prijs" | "twijfel" | "gearchiveerd";
|
|
7
7
|
export type LijstSort = "naam" | "artikelnummer" | "liggend" | "gereserveerd" | "vrij" | "inkomend" | "prijs";
|
|
8
|
-
export type LijstStatus = "ok" | "verpakking" | "niet_gekoppeld" | "prijs" | "gearchiveerd";
|
|
8
|
+
export type LijstStatus = "ok" | "verpakking" | "verwijderd_floriday" | "niet_gekoppeld" | "prijs" | "gearchiveerd";
|
|
9
9
|
export interface LijstRij {
|
|
10
10
|
id: string;
|
|
11
11
|
naam: string;
|
|
@@ -43,6 +43,7 @@ export interface LijstAntwoord {
|
|
|
43
43
|
twijfel_rijen: TwijfelRij[];
|
|
44
44
|
meldingen: {
|
|
45
45
|
telmoment_ontbreekt: boolean;
|
|
46
|
+
versieronde_mislukt?: string | null;
|
|
46
47
|
onderdelen_zonder_prijs: number;
|
|
47
48
|
orders_gearchiveerd?: Array<{
|
|
48
49
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voorraad-lijst.d.ts","sourceRoot":"","sources":["../../src/lib/voorraad-lijst.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,eAAe,GACf,YAAY,GACZ,gBAAgB,GAChB,OAAO,GACP,SAAS,GACT,cAAc,CAAC;AAEnB,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,eAAe,GAAG,SAAS,GAAG,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAE9G,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,YAAY,GAAG,gBAAgB,GAAG,OAAO,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"voorraad-lijst.d.ts","sourceRoot":"","sources":["../../src/lib/voorraad-lijst.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,14 +5,15 @@
|
|
|
5
5
|
*/
|
|
6
6
|
/** Volgorde van de tellerregel. "Niet gekoppeld" alleen als de shell een Floriday-koppeling heeft. */
|
|
7
7
|
export function zichtbareFilters(heeftKoppeling) {
|
|
8
|
-
const all = ["alles", "onder_minimum", "verpakking", "niet_gekoppeld", "prijs", "twijfel", "gearchiveerd"];
|
|
9
|
-
return heeftKoppeling ? all : all.filter((f) => f !== "niet_gekoppeld");
|
|
8
|
+
const all = ["alles", "onder_minimum", "verpakking", "niet_gekoppeld", "verwijderd_floriday", "prijs", "twijfel", "gearchiveerd"];
|
|
9
|
+
return heeftKoppeling ? all : all.filter((f) => f !== "niet_gekoppeld" && f !== "verwijderd_floriday");
|
|
10
10
|
}
|
|
11
11
|
export const FILTER_LABEL = {
|
|
12
12
|
alles: "Alles",
|
|
13
13
|
onder_minimum: "Onder minimum",
|
|
14
14
|
verpakking: "Verpakking ontbreekt",
|
|
15
15
|
niet_gekoppeld: "Niet gekoppeld",
|
|
16
|
+
verwijderd_floriday: "Verwijderd in Floriday",
|
|
16
17
|
prijs: "Prijs ontbreekt",
|
|
17
18
|
twijfel: "Twijfelgevallen",
|
|
18
19
|
gearchiveerd: "Gearchiveerd",
|
|
@@ -21,6 +22,7 @@ export const FILTER_LABEL = {
|
|
|
21
22
|
export const STATUS_INFO = {
|
|
22
23
|
ok: { label: "In orde", actie: null, tab: null },
|
|
23
24
|
verpakking: { label: "Verpakking ontbreekt", actie: "Verpakking invullen", tab: "verpakking" },
|
|
25
|
+
verwijderd_floriday: { label: "Verwijderd in Floriday", actie: "Archiveren of opnieuw op Floriday zetten", tab: "koppelingen" },
|
|
24
26
|
niet_gekoppeld: { label: "Niet gekoppeld aan Floriday", actie: "Op Floriday zetten", tab: "koppelingen" },
|
|
25
27
|
prijs: { label: "Prijs ontbreekt", actie: "Verkoopprijs per stuk invullen", tab: "voorraad" },
|
|
26
28
|
gearchiveerd: { label: "Gearchiveerd", actie: null, tab: null },
|
|
@@ -46,6 +48,8 @@ export function volgendeSortering(huidig, kolom) {
|
|
|
46
48
|
/** Meldingenregel: samengevat, één regel; klik zet het bijbehorende filter. */
|
|
47
49
|
export function meldingen(a) {
|
|
48
50
|
const out = [];
|
|
51
|
+
if (a.meldingen.versieronde_mislukt)
|
|
52
|
+
out.push({ tekst: a.meldingen.versieronde_mislukt, filter: null });
|
|
49
53
|
if (a.meldingen.telmoment_ontbreekt)
|
|
50
54
|
out.push({ tekst: "Telmoment ontbreekt", filter: null });
|
|
51
55
|
const o = a.meldingen.onderdelen_zonder_prijs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floriday-stock-reconcile.d.ts","sourceRoot":"","sources":["../../src/server-hooks/floriday-stock-reconcile.ts"],"names":[],"mappings":"AA2PA,wHAAwH;AACxH,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"floriday-stock-reconcile.d.ts","sourceRoot":"","sources":["../../src/server-hooks/floriday-stock-reconcile.ts"],"names":[],"mappings":"AA2PA,wHAAwH;AACxH,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAOtF"}
|
|
@@ -235,5 +235,10 @@ async function handle(request) {
|
|
|
235
235
|
}
|
|
236
236
|
/** Shell-handler voor /api/public/hooks/floriday-stock-reconcile. Schakelaar: voorraad_hook_enabled.stock_reconcile. */
|
|
237
237
|
export async function handleFloridayStockReconcile(request) {
|
|
238
|
+
// Zelfde geregistreerde ingang, eigen taak: automatische controle van Floriday-versies (standaard aan, alleen lezen).
|
|
239
|
+
if (new URL(request.url).searchParams.get("taak") === "versies") {
|
|
240
|
+
const { handleVersieronde } = await import("./floriday-versieronde.js");
|
|
241
|
+
return runGuardedHook(request, "floriday_versies", handleVersieronde, "floriday-versieronde");
|
|
242
|
+
}
|
|
238
243
|
return runGuardedHook(request, "stock_reconcile", handle, "floriday-stock-reconcile");
|
|
239
244
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floriday-versieronde.d.ts","sourceRoot":"","sources":["../../src/server-hooks/floriday-versieronde.ts"],"names":[],"mappings":"AAQA,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqB5E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automatische controle van Floriday-versies (1.0.148). Gewekt door `run_floriday_versieronde`
|
|
3
|
+
* (cron: direct na installatie, elke 5 min tijdens een ronde of zolang er geen geslaagde is, dagelijks 04:30).
|
|
4
|
+
* Per aanroep één portie (max 200 artikelen, 10 per verzoek, pauze ertussen); de database rondt af.
|
|
5
|
+
* Alleen lezen bij Floriday. Server-only.
|
|
6
|
+
*/
|
|
7
|
+
const PORTIE = 200;
|
|
8
|
+
export async function handleVersieronde(_request) {
|
|
9
|
+
const { getAdminClient } = await import("../lib/supabase-admin.server.js");
|
|
10
|
+
const admin = getAdminClient();
|
|
11
|
+
const { resolveActiveFloridayConnection } = await import("../lib/floriday-env.server.js");
|
|
12
|
+
const { gatewayReadMany } = await import("../lib/floriday-gateway.server.js");
|
|
13
|
+
const { verwerkVersiePortie } = await import("../lib/floriday-versie-ronde.js");
|
|
14
|
+
const json = (b, status = 200) => new Response(JSON.stringify(b), { status, headers: { "Content-Type": "application/json" } });
|
|
15
|
+
const conn = await resolveActiveFloridayConnection(admin);
|
|
16
|
+
const { data: volgende, error: vErr } = await admin.rpc("voorraad_floriday_versieronde_volgende", {
|
|
17
|
+
p_connection_id: conn.id, p_aantal: PORTIE,
|
|
18
|
+
});
|
|
19
|
+
if (vErr)
|
|
20
|
+
throw new Error(vErr.message);
|
|
21
|
+
const ids = Array.isArray(volgende?.ids) ? volgende.ids : [];
|
|
22
|
+
const r = await verwerkVersiePortie(ids, (paden) => gatewayReadMany(conn.environment, paden));
|
|
23
|
+
const { data, error } = await admin.rpc("voorraad_floriday_versieronde_portie", {
|
|
24
|
+
p_connection_id: conn.id, p_ronde_id: volgende.ronde_id, p_uitkomsten: r.uitkomsten, p_verbindingsfout: r.verbindingsfout,
|
|
25
|
+
});
|
|
26
|
+
if (error)
|
|
27
|
+
throw new Error(error.message);
|
|
28
|
+
return json({ ok: true, gelezen: r.uitkomsten.length, uitgesteld: r.uitgesteld, ronde: data });
|
|
29
|
+
}
|
|
@@ -21,7 +21,7 @@ const CORS = {
|
|
|
21
21
|
*/
|
|
22
22
|
const DEFAULT_ON_IF_ERP_LEADING = new Set(["floriday_base_supply", "logistics_tasks"]);
|
|
23
23
|
/** Standaard aan zonder voorwaarde (alleen lezen uit Floriday, verstuurt niets). */
|
|
24
|
-
const DEFAULT_ON = new Set(["follow_floriday"]);
|
|
24
|
+
const DEFAULT_ON = new Set(["follow_floriday", "floriday_versies"]);
|
|
25
25
|
async function hasErpLeadingArticle(admin) {
|
|
26
26
|
const lead = await admin
|
|
27
27
|
.from("floriday_inventory_settings")
|
package/package.json
CHANGED
package/sql/AGENTS.md
CHANGED
|
@@ -16,3 +16,5 @@
|
|
|
16
16
|
- Order-line autolink only fills an empty `order_items.product_id`; a filled one (Engine or user choice) is never overwritten, a differing Floriday answer is only logged (`orderregel_afwijkend_behouden`), because the Engine owns linking and users pick articles deliberately.
|
|
17
17
|
- A price change re-queues Floriday stock rows only when `voorraad_floriday_volgt(product)` (ERP leading and mode not DISABLED), because local-steered articles must never gain queue rows.
|
|
18
18
|
- Custom fields and tray sticker save only via `voorraad_eigen_velden_opslaan` / `voorraad_traysticker_opslaan` (compare against the state at opening), because direct table writes overwrote concurrent edits.
|
|
19
|
+
- Replaced/expired Floriday trade item versions are recorded only by `voorraad_floriday_versies_vastleggen` (server-only, from a complete error-free per-id read round, blocked above the max share with a message, source recorded); they never become visible articles (alias to the successor or an archived article with stock mode off), and historic shipped lines of such versions never get recalculated fust (`voorraad_fust_historisch_vervallen`), because old versions doubled the catalogue and re-linking history must not book anything.
|
|
20
|
+
- New visible articles from Floriday are created only after a successful version round for that connection (`voorraad_floriday_versieronde_geslaagd`); rounds run only automatically (cron → reconcile hook `?taak=versies`, portions via `_volgende`/`_portie`), an item failing 3 consecutive rounds is set aside as unknown (never marked, never created), and only a whole failed round produces a user notice, because users must never need a manual step and one bad item must not block forever.
|