@flowselections/logistiek-engine 1.0.1
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/README.md +24 -0
- package/dist-lib/_core-safelist.d.ts +2 -0
- package/dist-lib/_core-safelist.d.ts.map +1 -0
- package/dist-lib/_core-safelist.js +15 -0
- package/dist-lib/components/BeladingIndelingCard.d.ts +2 -0
- package/dist-lib/components/BeladingIndelingCard.d.ts.map +1 -0
- package/dist-lib/components/BeladingIndelingCard.js +77 -0
- package/dist-lib/components/BufferDebugCard.d.ts +19 -0
- package/dist-lib/components/BufferDebugCard.d.ts.map +1 -0
- package/dist-lib/components/BufferDebugCard.js +69 -0
- package/dist-lib/components/CapaciteitMeldingenCard.d.ts +2 -0
- package/dist-lib/components/CapaciteitMeldingenCard.d.ts.map +1 -0
- package/dist-lib/components/CapaciteitMeldingenCard.js +40 -0
- package/dist-lib/components/LadingdragersPage.d.ts +2 -0
- package/dist-lib/components/LadingdragersPage.d.ts.map +1 -0
- package/dist-lib/components/LadingdragersPage.js +102 -0
- package/dist-lib/components/LogistiekEngineLogo.d.ts +6 -0
- package/dist-lib/components/LogistiekEngineLogo.d.ts.map +1 -0
- package/dist-lib/components/LogistiekEngineLogo.js +4 -0
- package/dist-lib/components/LogistiekEnginePage.d.ts +2 -0
- package/dist-lib/components/LogistiekEnginePage.d.ts.map +1 -0
- package/dist-lib/components/LogistiekEnginePage.js +53 -0
- package/dist-lib/components/ModulePromptsPage.d.ts +2 -0
- package/dist-lib/components/ModulePromptsPage.d.ts.map +1 -0
- package/dist-lib/components/ModulePromptsPage.js +58 -0
- package/dist-lib/components/RegiePage.d.ts +2 -0
- package/dist-lib/components/RegiePage.d.ts.map +1 -0
- package/dist-lib/components/RegiePage.js +82 -0
- package/dist-lib/components/RuleEnginePage.d.ts +7 -0
- package/dist-lib/components/RuleEnginePage.d.ts.map +1 -0
- package/dist-lib/components/RuleEnginePage.js +114 -0
- package/dist-lib/components/StrategieDialog.d.ts +11 -0
- package/dist-lib/components/StrategieDialog.d.ts.map +1 -0
- package/dist-lib/components/StrategieDialog.js +38 -0
- package/dist-lib/components/VertragingMeldingenCard.d.ts +2 -0
- package/dist-lib/components/VertragingMeldingenCard.d.ts.map +1 -0
- package/dist-lib/components/VertragingMeldingenCard.js +32 -0
- package/dist-lib/components/VoorraadMeldingenCard.d.ts +2 -0
- package/dist-lib/components/VoorraadMeldingenCard.d.ts.map +1 -0
- package/dist-lib/components/VoorraadMeldingenCard.js +26 -0
- package/dist-lib/components/rule-engine/CollapsibleGroup.d.ts +12 -0
- package/dist-lib/components/rule-engine/CollapsibleGroup.d.ts.map +1 -0
- package/dist-lib/components/rule-engine/CollapsibleGroup.js +11 -0
- package/dist-lib/components/rule-engine/ConditionsEditor.d.ts +8 -0
- package/dist-lib/components/rule-engine/ConditionsEditor.d.ts.map +1 -0
- package/dist-lib/components/rule-engine/ConditionsEditor.js +31 -0
- package/dist-lib/components/rule-engine/FieldHelp.d.ts +14 -0
- package/dist-lib/components/rule-engine/FieldHelp.d.ts.map +1 -0
- package/dist-lib/components/rule-engine/FieldHelp.js +18 -0
- package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts +2 -0
- package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts.map +1 -0
- package/dist-lib/components/rule-engine/FloridayConnectionBanner.js +41 -0
- package/dist-lib/components/rule-engine/ImpactPanel.d.ts +5 -0
- package/dist-lib/components/rule-engine/ImpactPanel.d.ts.map +1 -0
- package/dist-lib/components/rule-engine/ImpactPanel.js +25 -0
- package/dist-lib/components/rule-engine/RuleFieldInput.d.ts +9 -0
- package/dist-lib/components/rule-engine/RuleFieldInput.d.ts.map +1 -0
- package/dist-lib/components/rule-engine/RuleFieldInput.js +80 -0
- package/dist-lib/components/rule-engine/VersionsPanel.d.ts +10 -0
- package/dist-lib/components/rule-engine/VersionsPanel.d.ts.map +1 -0
- package/dist-lib/components/rule-engine/VersionsPanel.js +16 -0
- package/dist-lib/components/settings/LogistiekEngineSettingsCard.d.ts +2 -0
- package/dist-lib/components/settings/LogistiekEngineSettingsCard.d.ts.map +1 -0
- package/dist-lib/components/settings/LogistiekEngineSettingsCard.js +22 -0
- package/dist-lib/hooks/useCapaciteitMeldingen.d.ts +20 -0
- package/dist-lib/hooks/useCapaciteitMeldingen.d.ts.map +1 -0
- package/dist-lib/hooks/useCapaciteitMeldingen.js +46 -0
- package/dist-lib/hooks/useDocumentLayouts.d.ts +13 -0
- package/dist-lib/hooks/useDocumentLayouts.d.ts.map +1 -0
- package/dist-lib/hooks/useDocumentLayouts.js +54 -0
- package/dist-lib/hooks/useLadingdragers.d.ts +16 -0
- package/dist-lib/hooks/useLadingdragers.d.ts.map +1 -0
- package/dist-lib/hooks/useLadingdragers.js +86 -0
- package/dist-lib/hooks/useLogistiekStrategieen.d.ts +29 -0
- package/dist-lib/hooks/useLogistiekStrategieen.d.ts.map +1 -0
- package/dist-lib/hooks/useLogistiekStrategieen.js +111 -0
- package/dist-lib/hooks/useLogistiekTaken.d.ts +89 -0
- package/dist-lib/hooks/useLogistiekTaken.d.ts.map +1 -0
- package/dist-lib/hooks/useLogistiekTaken.js +314 -0
- package/dist-lib/hooks/usePickstations.d.ts +10 -0
- package/dist-lib/hooks/usePickstations.d.ts.map +1 -0
- package/dist-lib/hooks/usePickstations.js +51 -0
- package/dist-lib/hooks/useRecalcJob.d.ts +24 -0
- package/dist-lib/hooks/useRecalcJob.d.ts.map +1 -0
- package/dist-lib/hooks/useRecalcJob.js +83 -0
- package/dist-lib/hooks/useRuleEngine.d.ts +48 -0
- package/dist-lib/hooks/useRuleEngine.d.ts.map +1 -0
- package/dist-lib/hooks/useRuleEngine.js +222 -0
- package/dist-lib/hooks/useVertragingMeldingen.d.ts +29 -0
- package/dist-lib/hooks/useVertragingMeldingen.d.ts.map +1 -0
- package/dist-lib/hooks/useVertragingMeldingen.js +68 -0
- package/dist-lib/hooks/useVoorraadMeldingen.d.ts +30 -0
- package/dist-lib/hooks/useVoorraadMeldingen.d.ts.map +1 -0
- package/dist-lib/hooks/useVoorraadMeldingen.js +70 -0
- package/dist-lib/index.d.ts +36 -0
- package/dist-lib/index.d.ts.map +1 -0
- package/dist-lib/index.js +52 -0
- package/dist-lib/integrations/supabase/auth-attacher.d.ts +2 -0
- package/dist-lib/integrations/supabase/auth-attacher.d.ts.map +1 -0
- package/dist-lib/integrations/supabase/auth-attacher.js +12 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +19781 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -0
- package/dist-lib/integrations/supabase/auth-middleware.js +52 -0
- package/dist-lib/integrations/supabase/client.d.ts +19777 -0
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -0
- package/dist-lib/integrations/supabase/client.js +13 -0
- package/dist-lib/integrations/supabase/client.server.d.ts +19777 -0
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -0
- package/dist-lib/integrations/supabase/client.server.js +30 -0
- package/dist-lib/integrations/supabase/types.d.ts +20355 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -0
- package/dist-lib/integrations/supabase/types.js +78 -0
- package/dist-lib/lib/bufferMatching.d.ts +26 -0
- package/dist-lib/lib/bufferMatching.d.ts.map +1 -0
- package/dist-lib/lib/bufferMatching.js +73 -0
- package/dist-lib/lib/bulkLoadCarrierPlanning.server.d.ts +23 -0
- package/dist-lib/lib/bulkLoadCarrierPlanning.server.d.ts.map +1 -0
- package/dist-lib/lib/bulkLoadCarrierPlanning.server.js +126 -0
- package/dist-lib/lib/floridayDocuments.functions.d.ts +59415 -0
- package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -0
- package/dist-lib/lib/floridayDocuments.functions.js +68 -0
- package/dist-lib/lib/floridayDocuments.server.d.ts +51 -0
- package/dist-lib/lib/floridayDocuments.server.d.ts.map +1 -0
- package/dist-lib/lib/floridayDocuments.server.js +109 -0
- package/dist-lib/lib/loadCarrierPlanner.d.ts +71 -0
- package/dist-lib/lib/loadCarrierPlanner.d.ts.map +1 -0
- package/dist-lib/lib/loadCarrierPlanner.js +374 -0
- package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +98984 -0
- package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -0
- package/dist-lib/lib/loadCarrierPlanning.functions.js +106 -0
- package/dist-lib/lib/loadCarrierPlanning.server.d.ts +46 -0
- package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -0
- package/dist-lib/lib/loadCarrierPlanning.server.js +515 -0
- package/dist-lib/lib/loadCarrierTaskSync.server.d.ts +3 -0
- package/dist-lib/lib/loadCarrierTaskSync.server.d.ts.map +1 -0
- package/dist-lib/lib/loadCarrierTaskSync.server.js +56 -0
- package/dist-lib/lib/loadCarrierTypes.d.ts +19 -0
- package/dist-lib/lib/loadCarrierTypes.d.ts.map +1 -0
- package/dist-lib/lib/loadCarrierTypes.js +41 -0
- package/dist-lib/lib/logisticsPlanner.d.ts +56 -0
- package/dist-lib/lib/logisticsPlanner.d.ts.map +1 -0
- package/dist-lib/lib/logisticsPlanner.js +273 -0
- package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +39575 -0
- package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -0
- package/dist-lib/lib/logisticsRecalcJob.functions.js +30 -0
- package/dist-lib/lib/logisticsRecalcJob.server.d.ts +32 -0
- package/dist-lib/lib/logisticsRecalcJob.server.d.ts.map +1 -0
- package/dist-lib/lib/logisticsRecalcJob.server.js +116 -0
- package/dist-lib/lib/logisticsRecalculate.functions.d.ts +19792 -0
- package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -0
- package/dist-lib/lib/logisticsRecalculate.functions.js +35 -0
- package/dist-lib/lib/logisticsTasks.d.ts +23 -0
- package/dist-lib/lib/logisticsTasks.d.ts.map +1 -0
- package/dist-lib/lib/logisticsTasks.js +92 -0
- package/dist-lib/lib/modulePrompts.d.ts +31 -0
- package/dist-lib/lib/modulePrompts.d.ts.map +1 -0
- package/dist-lib/lib/modulePrompts.js +1195 -0
- package/dist-lib/lib/ruleEngineImpact.d.ts +27 -0
- package/dist-lib/lib/ruleEngineImpact.d.ts.map +1 -0
- package/dist-lib/lib/ruleEngineImpact.js +257 -0
- package/dist-lib/lib/ruleEngineSchema.d.ts +69 -0
- package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -0
- package/dist-lib/lib/ruleEngineSchema.js +899 -0
- package/dist-lib/lib/ruleEngineWizard.d.ts +17 -0
- package/dist-lib/lib/ruleEngineWizard.d.ts.map +1 -0
- package/dist-lib/lib/ruleEngineWizard.js +204 -0
- package/dist-lib/lib/utils.d.ts +3 -0
- package/dist-lib/lib/utils.d.ts.map +1 -0
- package/dist-lib/lib/utils.js +5 -0
- package/dist-lib/lib/validationSchemas.d.ts +15 -0
- package/dist-lib/lib/validationSchemas.d.ts.map +1 -0
- package/dist-lib/lib/validationSchemas.js +25 -0
- package/dist-lib/styles.css +1 -0
- package/package.json +113 -0
- package/public/logo.png +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export const Constants = {
|
|
2
|
+
public: {
|
|
3
|
+
Enums: {
|
|
4
|
+
ai_import_status: [
|
|
5
|
+
"nieuw",
|
|
6
|
+
"verwerken",
|
|
7
|
+
"bevestigen",
|
|
8
|
+
"klaar",
|
|
9
|
+
"mislukt",
|
|
10
|
+
],
|
|
11
|
+
app_role: ["admin", "planner", "monteur", "administratie", "ai_admin"],
|
|
12
|
+
doc_layout_type: [
|
|
13
|
+
"pakbon",
|
|
14
|
+
"factuur",
|
|
15
|
+
"offerte",
|
|
16
|
+
"orderbevestiging",
|
|
17
|
+
"etiket",
|
|
18
|
+
"verzendlabel",
|
|
19
|
+
"productlabel",
|
|
20
|
+
"barcode_label",
|
|
21
|
+
"magazijnlijst",
|
|
22
|
+
"controlelijst",
|
|
23
|
+
"transportdocument",
|
|
24
|
+
"vrij",
|
|
25
|
+
"sticker",
|
|
26
|
+
"productiebon",
|
|
27
|
+
],
|
|
28
|
+
doc_orientation: ["portrait", "landscape"],
|
|
29
|
+
exact_env: ["staging", "live"],
|
|
30
|
+
exact_push_status: ["pending", "sent", "error"],
|
|
31
|
+
itk_customer_segment: ["Business", "Private"],
|
|
32
|
+
itk_dynamic_field_type: ["text", "select", "date", "checkbox"],
|
|
33
|
+
planning_item_status: [
|
|
34
|
+
"gepland",
|
|
35
|
+
"bezig",
|
|
36
|
+
"afgerond",
|
|
37
|
+
"geannuleerd",
|
|
38
|
+
"concept",
|
|
39
|
+
"vrijgegeven",
|
|
40
|
+
],
|
|
41
|
+
print_job_status: [
|
|
42
|
+
"wachtend",
|
|
43
|
+
"bezig",
|
|
44
|
+
"voltooid",
|
|
45
|
+
"mislukt",
|
|
46
|
+
"geannuleerd",
|
|
47
|
+
],
|
|
48
|
+
printer_connection: [
|
|
49
|
+
"ipp",
|
|
50
|
+
"raw9100",
|
|
51
|
+
"printnode",
|
|
52
|
+
"cups",
|
|
53
|
+
"usb",
|
|
54
|
+
"windows",
|
|
55
|
+
"airprint",
|
|
56
|
+
"cloud",
|
|
57
|
+
],
|
|
58
|
+
printer_kind: [
|
|
59
|
+
"labelprinter",
|
|
60
|
+
"laserprinter",
|
|
61
|
+
"inkjet",
|
|
62
|
+
"thermal",
|
|
63
|
+
"kantoorprinter",
|
|
64
|
+
"overig",
|
|
65
|
+
],
|
|
66
|
+
quote_status: [
|
|
67
|
+
"concept",
|
|
68
|
+
"verzonden",
|
|
69
|
+
"bekeken",
|
|
70
|
+
"in_behandeling",
|
|
71
|
+
"geaccepteerd",
|
|
72
|
+
"afgewezen",
|
|
73
|
+
"verlopen",
|
|
74
|
+
"gearchiveerd",
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const BUFFER_CRITERION_LABEL: Record<string, string>;
|
|
2
|
+
export declare function bufferCriterionLabel(key: string): string;
|
|
3
|
+
/** Zet elke opslagvorm om naar een lijst met ingeschakelde criteriumsleutels. */
|
|
4
|
+
export declare function normalizeBufferCriteria(raw: unknown): string[];
|
|
5
|
+
export interface BufferDecisionTraceItem {
|
|
6
|
+
rule: string;
|
|
7
|
+
value?: string | null;
|
|
8
|
+
result?: boolean;
|
|
9
|
+
message?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface BufferDecision {
|
|
12
|
+
buffer: boolean;
|
|
13
|
+
reason: string;
|
|
14
|
+
bufferRef: string | null;
|
|
15
|
+
bufferKey: string | null;
|
|
16
|
+
matchCriteria: string[];
|
|
17
|
+
closeBeforeMinutes: number | null;
|
|
18
|
+
bufferCloseAt: string | null;
|
|
19
|
+
release: string;
|
|
20
|
+
trace: BufferDecisionTraceItem[];
|
|
21
|
+
}
|
|
22
|
+
export declare const BUFFER_REASON_LABEL: Record<string, string>;
|
|
23
|
+
export declare function bufferReasonLabel(reason: string | null | undefined): string;
|
|
24
|
+
/** Veilig een besluit uit een RPC-antwoord of taak-payload lezen. */
|
|
25
|
+
export declare function toBufferDecision(raw: unknown): BufferDecision | null;
|
|
26
|
+
//# sourceMappingURL=bufferMatching.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bufferMatching.d.ts","sourceRoot":"","sources":["../../src/lib/bufferMatching.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAazD,CAAC;AAGF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,UAE/C;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAc9D;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,uBAAuB,EAAE,CAAC;CAClC;AAED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKtD,CAAC;AAGF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,UAGlE;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAepE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/bufferMatching.ts — gedeelde uitleg van de orderbuffer-criteria
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// De Rule Engine slaat de criteria op als [{ key, enabled }]. Oudere configuraties
|
|
5
|
+
// gebruikten platte strings. Deze helper maakt daar altijd één lijst van
|
|
6
|
+
// ingeschakelde criteriumsleutels van, zodat client en database hetzelfde lezen.
|
|
7
|
+
// ============================================================================
|
|
8
|
+
export const BUFFER_CRITERION_LABEL = {
|
|
9
|
+
customer_floriday: "Zelfde Floriday klant",
|
|
10
|
+
customer_bvo: "Zelfde BVO klant",
|
|
11
|
+
delivery_location: "Zelfde afleverlocatie",
|
|
12
|
+
delivery_date: "Zelfde leverdatum",
|
|
13
|
+
carrier: "Zelfde vervoerder",
|
|
14
|
+
load_carrier: "Zelfde ladingdrager",
|
|
15
|
+
order_type: "Zelfde ordertype",
|
|
16
|
+
day_bucket: "Zelfde dag (altijd)",
|
|
17
|
+
country: "Zelfde land",
|
|
18
|
+
no_criteria_selected: "Geen criteria gekozen",
|
|
19
|
+
buffer_enabled: "Orderbuffer aan/uit",
|
|
20
|
+
buffer_include_reservations: "Gereserveerde bestellingen in buffers",
|
|
21
|
+
};
|
|
22
|
+
export function bufferCriterionLabel(key) {
|
|
23
|
+
return BUFFER_CRITERION_LABEL[key] ?? key;
|
|
24
|
+
}
|
|
25
|
+
/** Zet elke opslagvorm om naar een lijst met ingeschakelde criteriumsleutels. */
|
|
26
|
+
export function normalizeBufferCriteria(raw) {
|
|
27
|
+
if (!Array.isArray(raw))
|
|
28
|
+
return [];
|
|
29
|
+
const keys = [];
|
|
30
|
+
for (const entry of raw) {
|
|
31
|
+
if (typeof entry === "string") {
|
|
32
|
+
keys.push(entry);
|
|
33
|
+
}
|
|
34
|
+
else if (entry && typeof entry === "object") {
|
|
35
|
+
const record = entry;
|
|
36
|
+
const enabled = record.enabled === undefined ? true : record.enabled === true;
|
|
37
|
+
const key = typeof record.key === "string" ? record.key : typeof record.value === "string" ? record.value : null;
|
|
38
|
+
if (enabled && key)
|
|
39
|
+
keys.push(key);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return keys.filter((k) => k.length > 0);
|
|
43
|
+
}
|
|
44
|
+
export const BUFFER_REASON_LABEL = {
|
|
45
|
+
buffering_disabled: "Bufferen staat uit",
|
|
46
|
+
buffering_enabled: "Gecombineerd volgens de regels",
|
|
47
|
+
buffering_enabled_missing_data: "Gecombineerd op de bekende gegevens",
|
|
48
|
+
reservation_excluded: "Reservering blijft buiten de buffer",
|
|
49
|
+
};
|
|
50
|
+
export function bufferReasonLabel(reason) {
|
|
51
|
+
if (!reason)
|
|
52
|
+
return "—";
|
|
53
|
+
return BUFFER_REASON_LABEL[reason] ?? reason;
|
|
54
|
+
}
|
|
55
|
+
/** Veilig een besluit uit een RPC-antwoord of taak-payload lezen. */
|
|
56
|
+
export function toBufferDecision(raw) {
|
|
57
|
+
if (!raw || typeof raw !== "object")
|
|
58
|
+
return null;
|
|
59
|
+
const d = raw;
|
|
60
|
+
if (d.buffer === undefined)
|
|
61
|
+
return null;
|
|
62
|
+
return {
|
|
63
|
+
buffer: !!d.buffer,
|
|
64
|
+
reason: String(d.reason ?? ""),
|
|
65
|
+
bufferRef: d.bufferRef ?? null,
|
|
66
|
+
bufferKey: d.bufferKey ?? null,
|
|
67
|
+
matchCriteria: normalizeBufferCriteria(d.matchCriteria),
|
|
68
|
+
closeBeforeMinutes: d.closeBeforeMinutes ?? null,
|
|
69
|
+
bufferCloseAt: d.bufferCloseAt ?? null,
|
|
70
|
+
release: String(d.release ?? "auto"),
|
|
71
|
+
trace: Array.isArray(d.trace) ? d.trace : [],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface BulkPlanBatchResult {
|
|
2
|
+
phase: "buffers" | "orders";
|
|
3
|
+
processed: number;
|
|
4
|
+
cartsCreated: number;
|
|
5
|
+
skippedLocked: number;
|
|
6
|
+
failed: number;
|
|
7
|
+
tasksUpdated: number;
|
|
8
|
+
nextCursor: string | null;
|
|
9
|
+
done: boolean;
|
|
10
|
+
errors: string[];
|
|
11
|
+
}
|
|
12
|
+
/** Deelt een batch orderbuffers in. */
|
|
13
|
+
export declare function planBuffersBatch(cursor: string | null, limit?: number): Promise<BulkPlanBatchResult>;
|
|
14
|
+
/** Deelt een batch orders in die (nog) niet aan een buffer hangen. */
|
|
15
|
+
export declare function planLooseOrdersBatch(cursor: string | null, limit?: number): Promise<BulkPlanBatchResult>;
|
|
16
|
+
export interface OrderWithoutTasks {
|
|
17
|
+
id: string;
|
|
18
|
+
orderRef: string;
|
|
19
|
+
pickupAt: string | null;
|
|
20
|
+
}
|
|
21
|
+
/** Orders die nog geen enkele taak in de Engine hebben. */
|
|
22
|
+
export declare function findOrdersWithoutTasks(limit?: number): Promise<OrderWithoutTasks[]>;
|
|
23
|
+
//# sourceMappingURL=bulkLoadCarrierPlanning.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulkLoadCarrierPlanning.server.d.ts","sourceRoot":"","sources":["../../src/lib/bulkLoadCarrierPlanning.server.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAaD,uCAAuC;AACvC,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,KAAK,SAAK,GACT,OAAO,CAAC,mBAAmB,CAAC,CA+B9B;AAED,sEAAsE;AACtE,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,KAAK,SAAK,GACT,OAAO,CAAC,mBAAmB,CAAC,CAsC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,2DAA2D;AAC3D,wBAAsB,sBAAsB,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA0BrF"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/bulkLoadCarrierPlanning.server.ts — massa-indeling van alle orders
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Loopt alle orderbuffers (en losse orders) langs, draait per buffer de
|
|
5
|
+
// bestaande indelingslogica en koppelt het resultaat aan de load.compose taak.
|
|
6
|
+
// Werkt in batches met een cursor zodat grote aantallen niet in een timeout
|
|
7
|
+
// lopen: de UI roept net zo lang opnieuw aan tot `done` waar is.
|
|
8
|
+
// ============================================================================
|
|
9
|
+
import { supabaseAdmin } from "../integrations/supabase/client.server";
|
|
10
|
+
import { replanBufferInternal, replanOrderInternal } from "./loadCarrierPlanning.server";
|
|
11
|
+
import { attachIndelingToTasks } from "./loadCarrierTaskSync.server";
|
|
12
|
+
const db = () => supabaseAdmin;
|
|
13
|
+
const EMPTY = {
|
|
14
|
+
processed: 0,
|
|
15
|
+
cartsCreated: 0,
|
|
16
|
+
skippedLocked: 0,
|
|
17
|
+
failed: 0,
|
|
18
|
+
tasksUpdated: 0,
|
|
19
|
+
nextCursor: null,
|
|
20
|
+
done: true,
|
|
21
|
+
errors: [],
|
|
22
|
+
};
|
|
23
|
+
/** Deelt een batch orderbuffers in. */
|
|
24
|
+
export async function planBuffersBatch(cursor, limit = 20) {
|
|
25
|
+
let query = db().from("order_buffers").select("id").order("id", { ascending: true }).limit(limit);
|
|
26
|
+
if (cursor)
|
|
27
|
+
query = query.gt("id", cursor);
|
|
28
|
+
const { data, error } = await query;
|
|
29
|
+
if (error) {
|
|
30
|
+
return { ...EMPTY, phase: "buffers", failed: 1, done: false, errors: [error.message] };
|
|
31
|
+
}
|
|
32
|
+
const buffers = Array.isArray(data) ? data : [];
|
|
33
|
+
const result = { ...EMPTY, phase: "buffers", errors: [] };
|
|
34
|
+
for (const buffer of buffers) {
|
|
35
|
+
const id = String(buffer.id);
|
|
36
|
+
result.nextCursor = id;
|
|
37
|
+
try {
|
|
38
|
+
const plan = await replanBufferInternal(id);
|
|
39
|
+
if (plan.skipped === "locked") {
|
|
40
|
+
result.skippedLocked++;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
result.processed++;
|
|
44
|
+
result.cartsCreated += Number(plan.cartsCreated ?? 0);
|
|
45
|
+
result.tasksUpdated += await attachIndelingToTasks(plan);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
result.failed++;
|
|
50
|
+
if (result.errors.length < 5)
|
|
51
|
+
result.errors.push(err instanceof Error ? err.message : String(err));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
result.done = buffers.length < limit;
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
/** Deelt een batch orders in die (nog) niet aan een buffer hangen. */
|
|
58
|
+
export async function planLooseOrdersBatch(cursor, limit = 20) {
|
|
59
|
+
let query = db()
|
|
60
|
+
.from("orders")
|
|
61
|
+
.select("id")
|
|
62
|
+
.is("buffer_id", null)
|
|
63
|
+
.is("deleted_at", null)
|
|
64
|
+
.order("id", { ascending: true })
|
|
65
|
+
.limit(limit);
|
|
66
|
+
if (cursor)
|
|
67
|
+
query = query.gt("id", cursor);
|
|
68
|
+
const { data, error } = await query;
|
|
69
|
+
if (error) {
|
|
70
|
+
return { ...EMPTY, phase: "orders", failed: 1, done: false, errors: [error.message] };
|
|
71
|
+
}
|
|
72
|
+
const orders = Array.isArray(data) ? data : [];
|
|
73
|
+
const result = { ...EMPTY, phase: "orders", errors: [] };
|
|
74
|
+
for (const order of orders) {
|
|
75
|
+
const id = String(order.id);
|
|
76
|
+
result.nextCursor = id;
|
|
77
|
+
try {
|
|
78
|
+
const plan = await replanOrderInternal(id);
|
|
79
|
+
if (!plan)
|
|
80
|
+
continue;
|
|
81
|
+
if (plan.skipped === "locked") {
|
|
82
|
+
result.skippedLocked++;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
result.processed++;
|
|
86
|
+
result.cartsCreated += Number(plan.cartsCreated ?? 0);
|
|
87
|
+
result.tasksUpdated += await attachIndelingToTasks(plan);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
result.failed++;
|
|
92
|
+
if (result.errors.length < 5)
|
|
93
|
+
result.errors.push(err instanceof Error ? err.message : String(err));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
result.done = orders.length < limit;
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
/** Orders die nog geen enkele taak in de Engine hebben. */
|
|
100
|
+
export async function findOrdersWithoutTasks(limit = 50) {
|
|
101
|
+
const { data: orders } = await db()
|
|
102
|
+
.from("orders")
|
|
103
|
+
.select("id, order_number, delivery_date, custom_fields")
|
|
104
|
+
.is("deleted_at", null)
|
|
105
|
+
.not("order_number", "is", null)
|
|
106
|
+
.order("created_at", { ascending: true })
|
|
107
|
+
.limit(500);
|
|
108
|
+
const list = Array.isArray(orders) ? orders : [];
|
|
109
|
+
if (list.length === 0)
|
|
110
|
+
return [];
|
|
111
|
+
const refs = list.map((o) => String(o.order_number));
|
|
112
|
+
const { data: tasks } = await db().from("logistics_tasks").select("order_ref").in("order_ref", refs);
|
|
113
|
+
const known = new Set((Array.isArray(tasks) ? tasks : []).map((t) => String(t.order_ref)));
|
|
114
|
+
const missing = [];
|
|
115
|
+
for (const o of list) {
|
|
116
|
+
const ref = String(o.order_number);
|
|
117
|
+
if (known.has(ref))
|
|
118
|
+
continue;
|
|
119
|
+
const cf = (o.custom_fields ?? {});
|
|
120
|
+
const pickup = cf.pickup_moment ?? cf.pickup_datetime ?? cf.pickup_date ?? o.delivery_date ?? null;
|
|
121
|
+
missing.push({ id: String(o.id), orderRef: ref, pickupAt: pickup ? String(pickup) : null });
|
|
122
|
+
if (missing.length >= limit)
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
return missing;
|
|
126
|
+
}
|