@flowselections/pick-schermen-kwekers 1.0.22 → 1.0.23

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.
@@ -1 +1 @@
1
- {"version":3,"file":"PickScherm.d.ts","sourceRoot":"","sources":["../../../src/components/pick/PickScherm.tsx"],"names":[],"mappings":"AAqCA,OAAO,EAUL,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AA0B7B,UAAU,KAAK;IACb,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAeD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,+BAqsDpD"}
1
+ {"version":3,"file":"PickScherm.d.ts","sourceRoot":"","sources":["../../../src/components/pick/PickScherm.tsx"],"names":[],"mappings":"AAqCA,OAAO,EAUL,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AA2B7B,UAAU,KAAK;IACb,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAeD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,+BAotDpD"}
@@ -11,6 +11,7 @@ import { getSessionId, pickApi } from "../../lib/pickApi";
11
11
  import { sendLogisticsEvent } from "../../lib/logisticsApi";
12
12
  import { completeLogisticsTaskForItem } from "../../lib/pickPrint";
13
13
  import { isPdfOnlyFailure, pickReadiness, printedCartIdsOf, pdfSaveWarning, unitRefOf, unitTitleOf, } from "../../lib/pickTypes";
14
+ import { rowFingerprint, rowsToVerify } from "../../lib/pickVerify";
14
15
  import { getPickTranslator } from "../../lib/pickI18n";
15
16
  import { friendlyPickError, getPickUiTexts } from "../../lib/pickUiText";
16
17
  import { getPrintJobTexts, printJobStatusLabel } from "../../lib/pickPrintJobText";
@@ -260,37 +261,57 @@ export function PickScherm({ station, onBack }) {
260
261
  const visibleIdsKey = useMemo(() => (Array.isArray(items) ? items.map((item) => item.id).join(",") : ""), [items]);
261
262
  const itemsRef = useRef([]);
262
263
  itemsRef.current = Array.isArray(items) ? items : [];
264
+ const verifyMemo = useRef(new Map());
263
265
  useEffect(() => {
264
266
  let cancelled = false;
267
+ let running = false;
265
268
  const verifyVisibleRows = async () => {
269
+ if (running)
270
+ return;
266
271
  const visibleItems = itemsRef.current;
267
- setCheckProgress({ done: 0, total: visibleItems.length });
268
- if (visibleItems.length === 0)
272
+ const todo = rowsToVerify(visibleItems, verifyMemo.current, Date.now());
273
+ if (todo.length === 0)
269
274
  return;
270
- let done = 0;
271
- await Promise.all(visibleItems.map(async (item) => {
272
- let entry = {
273
- checking: false,
274
- ready: false,
275
- reason: "De bron kon de pakbon nog niet bevestigen.",
276
- };
277
- try {
278
- const [plan, status] = await Promise.all([
279
- pickApi.queueCartPlan(item.id),
280
- pickApi.cartPlanStatus(unitRefOf(item)),
281
- ]);
282
- const state = pickReadiness(plan, status, item);
283
- entry = { checking: false, ready: state.ready, reason: state.reason };
284
- }
285
- catch {
286
- // fail closed: de regel blijft "Pakbon ophalen"
275
+ // Laadbalk alleen voor regels die nog nooit gecontroleerd zijn.
276
+ const fresh = todo.filter((item) => !verifyMemo.current.has(item.id)).length;
277
+ if (fresh > 0)
278
+ setCheckProgress({ done: 0, total: fresh });
279
+ running = true;
280
+ const next = {};
281
+ try {
282
+ const results = await pickApi.verifyRows(todo.map((item) => ({ id: item.id, ref: unitRefOf(item) || null })));
283
+ const byId = new Map(results.map((r) => [r.id, r]));
284
+ const now = Date.now();
285
+ for (const item of todo) {
286
+ const r = byId.get(item.id);
287
+ let entry = {
288
+ checking: false,
289
+ ready: false,
290
+ reason: "De bron kon de pakbon nog niet bevestigen.",
291
+ };
292
+ if (r && !r.error) {
293
+ const state = pickReadiness(r.plan, r.status, item);
294
+ entry = { checking: false, ready: state.ready, reason: state.reason };
295
+ }
296
+ next[item.id] = entry;
297
+ verifyMemo.current.set(item.id, {
298
+ fingerprint: rowFingerprint(item),
299
+ ready: entry.ready,
300
+ checkedAt: now,
301
+ });
287
302
  }
288
- if (cancelled)
289
- return;
290
- done += 1;
291
- setReadinessById((prev) => ({ ...prev, [item.id]: entry }));
292
- setCheckProgress({ done, total: visibleItems.length });
293
- }));
303
+ }
304
+ catch {
305
+ // fail closed: bestaande uitkomst blijft staan; nooit bevestigde regels blijven "Pakbon ophalen"
306
+ }
307
+ finally {
308
+ running = false;
309
+ }
310
+ if (cancelled)
311
+ return;
312
+ if (Object.keys(next).length > 0)
313
+ setReadinessById((prev) => ({ ...prev, ...next }));
314
+ setCheckProgress({ done: 0, total: 0 });
294
315
  };
295
316
  void verifyVisibleRows();
296
317
  const timer = window.setInterval(() => void verifyVisibleRows(), 15000);
@@ -1 +1 @@
1
- {"version":3,"file":"usePickQueue.d.ts","sourceRoot":"","sources":["../../src/hooks/usePickQueue.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAY,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAG9E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,cAAc,EAAE,YAS5B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;;;;;;;;;;;IAuLG,gEAAgE;;IAEhE,6EAA6E;;;EAIhF;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM;;EAuBhG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,iFAOnF;AACD,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,OAAO,UAAO;;;YAQzC"}
1
+ {"version":3,"file":"usePickQueue.d.ts","sourceRoot":"","sources":["../../src/hooks/usePickQueue.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAY,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAG9E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,cAAc,EAAE,YAS5B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;;;;;;;;;;;IA0LG,gEAAgE;;IAEhE,6EAA6E;;;EAIhF;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM;;EAuBhG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,iFAOnF;AACD,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,OAAO,UAAO;;;YAQzC"}
@@ -1,5 +1,5 @@
1
1
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
- import { useQuery, useQueryClient } from "@tanstack/react-query";
2
+ import { keepPreviousData, useQuery, useQueryClient } from "@tanstack/react-query";
3
3
  import { pickApi, pickDb } from "../lib/pickApi";
4
4
  import { safeArray } from "../lib/pickTypes";
5
5
  export const defaultFilters = {
@@ -83,7 +83,8 @@ export function usePickQueue(args) {
83
83
  useEffect(() => {
84
84
  if (rebuildCount <= 0)
85
85
  return;
86
- queryClient.removeQueries({ queryKey: ["pick", "queue"] });
86
+ // Verouderd markeren en vers ophalen; de oude lijst blijft staan tot de nieuwe binnen is.
87
+ queryClient.invalidateQueries({ queryKey: ["pick", "queue"], refetchType: "all" });
87
88
  queryClient.invalidateQueries({ queryKey: ["pick", "pickDay"] });
88
89
  queryClient.invalidateQueries({ queryKey: ["pick", "pickDays"] });
89
90
  queryClient.invalidateQueries({ queryKey: ["pick", "dayCounts"] });
@@ -107,11 +108,13 @@ export function usePickQueue(args) {
107
108
  page: filters.page,
108
109
  pageSize: filters.pageSize,
109
110
  }),
111
+ placeholderData: keepPreviousData,
110
112
  });
111
113
  const countsQuery = useQuery({
112
114
  queryKey: ["pick", "dayCounts", stationId ?? "-", screenId ?? "-", pickDay ?? "-"],
113
115
  enabled: enabled && !pickDayQuery.isLoading,
114
116
  queryFn: () => pickApi.dayCounts({ stationId, screenId, pickDay }),
117
+ placeholderData: keepPreviousData,
115
118
  });
116
119
  // Locks komen primair via realtime binnen; deze poll is alleen terugval.
117
120
  const locksQuery = useQuery({
@@ -16250,6 +16250,54 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
16250
16250
  };
16251
16251
  Relationships: [];
16252
16252
  };
16253
+ planning_confirmation_log: {
16254
+ Row: {
16255
+ created_at: string;
16256
+ end_at: string;
16257
+ id: string;
16258
+ outbox_id: string | null;
16259
+ planning_item_id: string;
16260
+ reason: string | null;
16261
+ recipient: string | null;
16262
+ start_at: string;
16263
+ status: string;
16264
+ };
16265
+ Insert: {
16266
+ created_at?: string;
16267
+ end_at: string;
16268
+ id?: string;
16269
+ outbox_id?: string | null;
16270
+ planning_item_id: string;
16271
+ reason?: string | null;
16272
+ recipient?: string | null;
16273
+ start_at: string;
16274
+ status: string;
16275
+ };
16276
+ Update: {
16277
+ created_at?: string;
16278
+ end_at?: string;
16279
+ id?: string;
16280
+ outbox_id?: string | null;
16281
+ planning_item_id?: string;
16282
+ reason?: string | null;
16283
+ recipient?: string | null;
16284
+ start_at?: string;
16285
+ status?: string;
16286
+ };
16287
+ Relationships: [{
16288
+ foreignKeyName: "planning_confirmation_log_planning_item_id_fkey";
16289
+ columns: ["planning_item_id"];
16290
+ isOneToOne: false;
16291
+ referencedRelation: "planning_items";
16292
+ referencedColumns: ["id"];
16293
+ }, {
16294
+ foreignKeyName: "planning_confirmation_log_planning_item_id_fkey";
16295
+ columns: ["planning_item_id"];
16296
+ isOneToOne: false;
16297
+ referencedRelation: "planning_overview";
16298
+ referencedColumns: ["id"];
16299
+ }];
16300
+ };
16253
16301
  planning_item_assistants: {
16254
16302
  Row: {
16255
16303
  created_at: string;
@@ -16334,6 +16382,60 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
16334
16382
  referencedColumns: ["id"];
16335
16383
  }];
16336
16384
  };
16385
+ planning_mail_settings: {
16386
+ Row: {
16387
+ body_template: string;
16388
+ cc: string[];
16389
+ connection_id: string | null;
16390
+ created_at: string;
16391
+ enabled: boolean;
16392
+ id: boolean;
16393
+ reply_to: string | null;
16394
+ subject_template: string;
16395
+ timezone: string;
16396
+ updated_at: string;
16397
+ updated_by: string | null;
16398
+ };
16399
+ Insert: {
16400
+ body_template?: string;
16401
+ cc?: string[];
16402
+ connection_id?: string | null;
16403
+ created_at?: string;
16404
+ enabled?: boolean;
16405
+ id?: boolean;
16406
+ reply_to?: string | null;
16407
+ subject_template?: string;
16408
+ timezone?: string;
16409
+ updated_at?: string;
16410
+ updated_by?: string | null;
16411
+ };
16412
+ Update: {
16413
+ body_template?: string;
16414
+ cc?: string[];
16415
+ connection_id?: string | null;
16416
+ created_at?: string;
16417
+ enabled?: boolean;
16418
+ id?: boolean;
16419
+ reply_to?: string | null;
16420
+ subject_template?: string;
16421
+ timezone?: string;
16422
+ updated_at?: string;
16423
+ updated_by?: string | null;
16424
+ };
16425
+ Relationships: [{
16426
+ foreignKeyName: "planning_mail_settings_connection_id_fkey";
16427
+ columns: ["connection_id"];
16428
+ isOneToOne: false;
16429
+ referencedRelation: "email_auth_connections";
16430
+ referencedColumns: ["id"];
16431
+ }, {
16432
+ foreignKeyName: "planning_mail_settings_connection_id_fkey";
16433
+ columns: ["connection_id"];
16434
+ isOneToOne: false;
16435
+ referencedRelation: "email_auth_connections_safe";
16436
+ referencedColumns: ["id"];
16437
+ }];
16438
+ };
16337
16439
  planning_monteur_day_locations: {
16338
16440
  Row: {
16339
16441
  created_at: string;
@@ -23114,7 +23216,7 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
23114
23216
  created_at: string;
23115
23217
  default_quantity: number;
23116
23218
  description: string | null;
23117
- duration_minutes: number | null;
23219
+ duration_minutes: number;
23118
23220
  id: string;
23119
23221
  mandaat_type: string | null;
23120
23222
  name: string;
@@ -23131,7 +23233,7 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
23131
23233
  created_at?: string;
23132
23234
  default_quantity?: number;
23133
23235
  description?: string | null;
23134
- duration_minutes?: number | null;
23236
+ duration_minutes?: number;
23135
23237
  id?: string;
23136
23238
  mandaat_type?: string | null;
23137
23239
  name: string;
@@ -23148,7 +23250,7 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
23148
23250
  created_at?: string;
23149
23251
  default_quantity?: number;
23150
23252
  description?: string | null;
23151
- duration_minutes?: number | null;
23253
+ duration_minutes?: number;
23152
23254
  id?: string;
23153
23255
  mandaat_type?: string | null;
23154
23256
  name?: string;
@@ -26398,6 +26500,27 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
26398
26500
  };
26399
26501
  Returns: boolean;
26400
26502
  };
26503
+ layout_print_document: {
26504
+ Args: {
26505
+ _documentnaam: string;
26506
+ _documenttype: string;
26507
+ _herkomst?: string;
26508
+ _idempotentie_sleutel?: string;
26509
+ _is_herprint?: boolean;
26510
+ _kopieen?: number;
26511
+ _layout_id?: string;
26512
+ _payload?: import("./types").Json;
26513
+ _pdf_base64?: string;
26514
+ _pdf_url?: string;
26515
+ _print_plek_id?: string;
26516
+ _werkplek?: string;
26517
+ };
26518
+ Returns: {
26519
+ bestaand: boolean;
26520
+ job_id: string;
26521
+ printer_id: string;
26522
+ }[];
26523
+ };
26401
26524
  list_medewerkers: {
26402
26525
  Args: never;
26403
26526
  Returns: {
@@ -27100,6 +27223,13 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
27100
27223
  };
27101
27224
  Returns: import("./types").Json;
27102
27225
  };
27226
+ logistics_control_scan_print_own: {
27227
+ Args: {
27228
+ p_is_herprint?: boolean;
27229
+ p_scan_id: string;
27230
+ };
27231
+ Returns: import("./types").Json;
27232
+ };
27103
27233
  logistics_control_scan_retry: {
27104
27234
  Args: {
27105
27235
  _id: string;
@@ -28004,6 +28134,21 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
28004
28134
  };
28005
28135
  Returns: import("./types").Json;
28006
28136
  };
28137
+ logistics_print_via_layout: {
28138
+ Args: {
28139
+ _documentnaam: string;
28140
+ _documenttype: string;
28141
+ _herkomst: string;
28142
+ _idempotentie_sleutel: string;
28143
+ _is_herprint: boolean;
28144
+ _layout_id: string;
28145
+ _payload: import("./types").Json;
28146
+ _pdf_base64: string;
28147
+ _pdf_url: string;
28148
+ _print_plek_id: string;
28149
+ };
28150
+ Returns: import("./types").Json;
28151
+ };
28007
28152
  logistics_prune_buffer_member_queue: {
28008
28153
  Args: never;
28009
28154
  Returns: number;
@@ -28359,6 +28504,12 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
28359
28504
  };
28360
28505
  Returns: undefined;
28361
28506
  };
28507
+ logistics_slip_note_retry: {
28508
+ Args: {
28509
+ _id: string;
28510
+ };
28511
+ Returns: import("./types").Json;
28512
+ };
28362
28513
  logistics_sticker_follows_slip: {
28363
28514
  Args: never;
28364
28515
  Returns: boolean;
@@ -29530,6 +29681,12 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
29530
29681
  };
29531
29682
  Returns: import("./types").Json;
29532
29683
  };
29684
+ pick_verify_rows: {
29685
+ Args: {
29686
+ _rows: import("./types").Json;
29687
+ };
29688
+ Returns: import("./types").Json;
29689
+ };
29533
29690
  pickstation_get_orders_raw: {
29534
29691
  Args: never;
29535
29692
  Returns: import("./types").Json;
@@ -29710,6 +29867,12 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
29710
29867
  };
29711
29868
  Returns: import("./types").Json;
29712
29869
  };
29870
+ quote_create_from_scratch: {
29871
+ Args: {
29872
+ _payload: import("./types").Json;
29873
+ };
29874
+ Returns: import("./types").Json;
29875
+ };
29713
29876
  quote_create_from_source: {
29714
29877
  Args: {
29715
29878
  _payload?: import("./types").Json;
@@ -29760,6 +29923,13 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
29760
29923
  };
29761
29924
  Returns: string;
29762
29925
  };
29926
+ quote_sync_work_order: {
29927
+ Args: {
29928
+ _monteur_instructies?: string;
29929
+ _offerte_id: string;
29930
+ };
29931
+ Returns: boolean;
29932
+ };
29763
29933
  recompute_all_reserved_stock: {
29764
29934
  Args: never;
29765
29935
  Returns: undefined;