@flowselections/logistiek-engine 1.0.140 → 1.0.151

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.
Files changed (70) hide show
  1. package/dist-lib/components/AutomatischVersturenCard.d.ts +2 -0
  2. package/dist-lib/components/AutomatischVersturenCard.d.ts.map +1 -0
  3. package/dist-lib/components/AutomatischVersturenCard.js +22 -0
  4. package/dist-lib/components/BeheerPage.d.ts.map +1 -1
  5. package/dist-lib/components/BeheerPage.js +3 -1
  6. package/dist-lib/components/GearchiveerdeOrdersCard.d.ts +2 -0
  7. package/dist-lib/components/GearchiveerdeOrdersCard.d.ts.map +1 -0
  8. package/dist-lib/components/GearchiveerdeOrdersCard.js +32 -0
  9. package/dist-lib/components/GeblokkeerdeOrdersCard.d.ts.map +1 -1
  10. package/dist-lib/components/GeblokkeerdeOrdersCard.js +1 -1
  11. package/dist-lib/components/OudeOrderregelsCard.d.ts +2 -0
  12. package/dist-lib/components/OudeOrderregelsCard.d.ts.map +1 -0
  13. package/dist-lib/components/OudeOrderregelsCard.js +28 -0
  14. package/dist-lib/components/PlanWachtrijPage.d.ts.map +1 -1
  15. package/dist-lib/components/PlanWachtrijPage.js +20 -13
  16. package/dist-lib/components/RuleEnginePage.d.ts.map +1 -1
  17. package/dist-lib/components/RuleEnginePage.js +24 -3
  18. package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts +20 -0
  19. package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts.map +1 -1
  20. package/dist-lib/hooks/useGeblokkeerdeOrders.js +57 -0
  21. package/dist-lib/index.d.ts +1 -0
  22. package/dist-lib/index.d.ts.map +1 -1
  23. package/dist-lib/index.js +1 -0
  24. package/dist-lib/integrations/supabase/previewAuthStorage.d.ts.map +1 -1
  25. package/dist-lib/integrations/supabase/previewAuthStorage.js +22 -4
  26. package/dist-lib/integrations/supabase/types.d.ts +914 -2
  27. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  28. package/dist-lib/integrations/supabase/types.js +1 -0
  29. package/dist-lib/lib/autoSend.d.ts +21 -0
  30. package/dist-lib/lib/autoSend.d.ts.map +1 -0
  31. package/dist-lib/lib/autoSend.functions.d.ts +10 -0
  32. package/dist-lib/lib/autoSend.functions.d.ts.map +1 -0
  33. package/dist-lib/lib/autoSend.functions.js +18 -0
  34. package/dist-lib/lib/autoSend.js +69 -0
  35. package/dist-lib/lib/autoSend.server.d.ts +13 -0
  36. package/dist-lib/lib/autoSend.server.d.ts.map +1 -0
  37. package/dist-lib/lib/autoSend.server.js +75 -0
  38. package/dist-lib/lib/briefTransport.server.d.ts +17 -0
  39. package/dist-lib/lib/briefTransport.server.d.ts.map +1 -0
  40. package/dist-lib/lib/briefTransport.server.js +41 -0
  41. package/dist-lib/lib/centralSecrets.server.d.ts +13 -0
  42. package/dist-lib/lib/centralSecrets.server.d.ts.map +1 -0
  43. package/dist-lib/lib/centralSecrets.server.js +82 -0
  44. package/dist-lib/lib/controlScan.server.d.ts.map +1 -1
  45. package/dist-lib/lib/controlScan.server.js +8 -0
  46. package/dist-lib/lib/handlers/logistics-tick.server.js +31 -0
  47. package/dist-lib/lib/layoutPrint.server.d.ts +2 -0
  48. package/dist-lib/lib/layoutPrint.server.d.ts.map +1 -1
  49. package/dist-lib/lib/layoutPrint.server.js +1 -1
  50. package/dist-lib/lib/logisticsTasks.d.ts +1 -0
  51. package/dist-lib/lib/logisticsTasks.d.ts.map +1 -1
  52. package/dist-lib/lib/logisticsTasks.js +2 -1
  53. package/dist-lib/lib/modulePrompts.d.ts +1 -0
  54. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  55. package/dist-lib/lib/modulePrompts.js +420 -1
  56. package/dist-lib/lib/moduleVersion.d.ts +1 -1
  57. package/dist-lib/lib/moduleVersion.js +1 -1
  58. package/dist-lib/lib/planQueue.server.d.ts.map +1 -1
  59. package/dist-lib/lib/planQueue.server.js +13 -0
  60. package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
  61. package/dist-lib/lib/ruleEngineSchema.js +25 -0
  62. package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -1
  63. package/dist-lib/lib/shippingNoteQueue.server.js +3 -0
  64. package/dist-lib/lib/stickerQueue.server.d.ts +15 -0
  65. package/dist-lib/lib/stickerQueue.server.d.ts.map +1 -0
  66. package/dist-lib/lib/stickerQueue.server.js +349 -0
  67. package/dist-lib/lib/stickerRules.d.ts +38 -0
  68. package/dist-lib/lib/stickerRules.d.ts.map +1 -0
  69. package/dist-lib/lib/stickerRules.js +111 -0
  70. package/package.json +5 -5
@@ -13,9 +13,10 @@ import { LOGISTICS_MODULES } from "./logisticsTasks";
13
13
  * documentlayouts waarmee de Engine print.
14
14
  */
15
15
  export const PROMPT_MODULE_LABELS = {
16
- ...LOGISTICS_MODULES,
16
+ ...(({ logistiek: _l, ...rest }) => rest)(LOGISTICS_MODULES),
17
17
  layoutmaker: "Layout maker (pakbonnen, verzendbrieven, extra)",
18
18
  floridaykoppeling: "Floriday koppeling (authenticatie en gateway)",
19
+ dashboards: "Dashboards (dashboard-erp-kwekers)",
19
20
  };
20
21
  function sharedBlock(moduleKey) {
21
22
  const key = moduleKey === "<modulesleutel>" ? "<modulesleutel>" : moduleKey;
@@ -978,6 +979,45 @@ CONTROLELIJST
978
979
  [ ] Geen indeling in rood met de reden.
979
980
  `,
980
981
  },
982
+ {
983
+ number: 22,
984
+ title: "Geen eigen ladingdragercontrole meer; blokkade-alarm alleen bij definitieve blokkade",
985
+ date: "2026-10-15",
986
+ summary: "De Engine beslist alleen over belading; mail pas bij een definitieve blokkade, sluiten na geslaagde indeling, koper als klant.",
987
+ body: `WAAROM
988
+ Zeven orders (FO-2601401, 406, 411, 414, 416, 420, 423) kregen een mail
989
+ "kan niet worden ingedeeld, ladingdrager uitgeschakeld", terwijl de Engine ze
990
+ binnen een minuut wel indeelde. De tekst "Deze belading gebruikt een
991
+ ladingdrager die is uitgeschakeld" komt uit de opslagcontrole van deze module,
992
+ niet uit de Engine. In de mail stond de afleverlocatie als klant.
993
+
994
+ WAT JE DOET
995
+ (1) Zoek eerst uit welke ladingdrager jouw controle als uitgeschakeld zag
996
+ (id, naam) en waarom dat afwijkt van de werkwijze van de Engine. Meld dat
997
+ terug vóór je verder bouwt.
998
+ (2) Verwijder je eigen controle op ladingdragers. Alleen de Engine beslist of
999
+ een belading kan. Stuur je eigen controletekst niet meer als reden mee bij
1000
+ het aanmelden.
1001
+ (3) Blokkade-mail alleen als de Engine zegt dat de order definitief
1002
+ geblokkeerd is:
1003
+ supabase.rpc("logistics_order_definitively_blocked", { p_order_id })
1004
+ -> { orderId, definitief, status, pogingen, redenCode, reden }
1005
+ Mail alleen bij definitief = true. Gebruik "reden" als tekst.
1006
+ (4) Sluit het alarm automatisch zodra de order is ingedeeld
1007
+ (definitief = false en status "done"), op order-id.
1008
+ (5) Bij "Klant" staat de koper, via het klant-id van de order. De
1009
+ afleverlocatie komt op een eigen regel "Afleverlocatie".
1010
+
1011
+ REGELS
1012
+ - Match op id, nooit op naam. Niets hardcoded.
1013
+
1014
+ CONTROLELIJST
1015
+ [ ] Terugmelding: welke ladingdrager en waarom de afwijking.
1016
+ [ ] Geen eigen ladingdragercontrole meer.
1017
+ [ ] Nieuwe Floriday-order die wel wordt ingedeeld: geen mail.
1018
+ [ ] Mail noemt de koper als klant.
1019
+ [ ] Meld terug met je pakketversie.`,
1020
+ },
981
1021
  ],
982
1022
  },
983
1023
  afhandeling: {
@@ -1945,6 +1985,119 @@ CONTROLELIJST
1945
1985
  [ ] Na bulkcontrole staat in logistics_control_scan bron = 'bulk' voor elke kar.
1946
1986
  [ ] Een kar die al met de scanner is afgemeld, krijgt geen tweede scan.`,
1947
1987
  },
1988
+ {
1989
+ number: 22,
1990
+ title: "Stickermeldingen in Dagdetails en stickeraanvragen",
1991
+ date: "2026-10-14",
1992
+ summary: "Vooraf-melding sticker/etiket tonen in Dagdetails; stickeraanvragen van kopers tonen en accepteren/weigeren vóór expiresOn.",
1993
+ body: `WAT JE BOUWT
1994
+ (a) Afhandeling › Dagdetails: toon per order logistics_order_sticker_meldingen
1995
+ (order_id), letterlijk, zolang opgelost_op leeg is.
1996
+ (b) Stickeraanvragen (/customer-sticker-upload-requests, via de
1997
+ Floriday-koppeling): toon open aanvragen met pdf-preview en expiresOn, en
1998
+ laat accepteren of weigeren vóór het verlopen. Afhandeling is eigenaar van
1999
+ dit scherm; de Floriday-koppeling levert sync/preview/accept/decline.
2000
+ Verlopen aanvragen grijs, niet meer te beantwoorden.
2001
+
2002
+ REGELS
2003
+ - Match op id. Niets hardcoded. Geen eigen stickerprint.
2004
+
2005
+ CONTROLELIJST
2006
+ [ ] Melding staat bij de order in Dagdetails.
2007
+ [ ] Aanvraag accepteren/weigeren werkt vóór expiresOn.
2008
+ [ ] Meld terug met je pakketversie.`,
2009
+ },
2010
+ {
2011
+ number: 23,
2012
+ title: "Automatisch versturen: aanroep door de Engine",
2013
+ date: "2026-10-15",
2014
+ summary: "Engine roept /api/public/hooks/afhandeling-auto-send aan met { orderId }, HMAC-SHA256 over timestamp.rawBody; status leesbaar via logistics_auto_send_status.",
2015
+ body: `Vereist Logistiek Engine 1.0.149. Match op id, niets hardcoded, fail closed.
2016
+
2017
+ WANNEER
2018
+ Alleen voor Floriday-orders (met een Floriday-id) en alleen als in de werkwijze
2019
+ "Automatisch versturen na de laatste goedgekeurde kar" (order_picken.
2020
+ auto_send_loading, standaard uit) aan staat. Zodra alle karren van de order
2021
+ (ook gedeelde en bufferkarren) een goedgekeurde controlescan hebben, zet de
2022
+ Engine één taak klaar per order (idempotentiesleutel auto-send:<orderId>).
2023
+
2024
+ AANROEP
2025
+ POST <shell_base_url>/api/public/hooks/afhandeling-auto-send
2026
+ Headers:
2027
+ content-type: application/json
2028
+ x-timestamp: <epoch-milliseconden>
2029
+ x-signature: <hex HMAC-SHA256 over "<timestamp>.<rawBody>">
2030
+ idempotency-key: auto-send:<orderId>
2031
+ Body (rawBody, exact zo ondertekend): {"orderId":"<uuid>"}
2032
+ Geheim: eerst CENTRAL_AUTH_SECRET, anders AUTH_GATEWAY_HMAC_SECRET (dezelfde
2033
+ zoekvolgorde als Afhandeling). Gebruiken jullie andere headernamen, meld die
2034
+ dan terug; dan past de Engine zich aan.
2035
+
2036
+ ANTWOORD
2037
+ 2xx = verstuurd (ook als de order al eerder verstuurd was: antwoord dan 2xx,
2038
+ niet opnieuw versturen). Elke andere status of geen antwoord = mislukt; de
2039
+ Engine probeert opnieuw na 1, 5, 15 en 60 minuten, maximaal 5 pogingen.
2040
+ Ontbreekt het geheim of het Shell-adres, dan verstuurt de Engine niets.
2041
+
2042
+ UITKOMST TONEN
2043
+ logistics_auto_send_status(p_order_id) (ingelogde gebruikers) geeft:
2044
+ { status: geen|wachtend|bezig|verstuurd|mislukt, verstuurdOm, reden, poging,
2045
+ maxPogingen, volgendePoging, tekst }
2046
+ tekst is bijvoorbeeld "Automatisch verstuurd om 14:32" of "Automatisch
2047
+ versturen mislukt: <reden> — poging 2 van 5". Toon tekst letterlijk.
2048
+
2049
+ CONTROLELIJST
2050
+ [ ] Route controleert de handtekening en de leeftijd van de timestamp.
2051
+ [ ] Tweede aanroep voor dezelfde order verstuurt niets opnieuw en geeft 2xx.
2052
+ [ ] Tekst uit logistics_auto_send_status staat bij de order.
2053
+ [ ] Meld terug met je pakketversie en de headernamen.`,
2054
+ },
2055
+ {
2056
+ number: 24,
2057
+ title: "Automatisch versturen: zelfde sleutel en antwoordafhandeling",
2058
+ date: "2026-10-15",
2059
+ summary: "Engine tekent met getFloridayGatewaySecret-volgorde; 400/422 definitief, rest opnieuw; reden uit error in logistics_auto_send_status.",
2060
+ body: `TER BEVESTIGING; bouwt voort op koppelprompt 23. Vereist Logistiek Engine 1.0.149.
2061
+ Afhandeling 1.0.60 hoeft niets te wijzigen als het onderstaande klopt.
2062
+
2063
+ SLEUTEL (gelijk aan getFloridayGatewaySecret)
2064
+ 1. AUTH_GATEWAY_HMAC_SECRET uit de omgeving van de Shell, als die gezet is.
2065
+ 2. Anders POST {CENTRAL_AUTH_URL}/api/secret/floriday_gateway_secret met
2066
+ Authorization: Bearer {CENTRAL_AUTH_SECRET}, zonder body; sleutel = veld value.
2067
+ CENTRAL_AUTH_SECRET is alleen toegang, nooit de sleutel.
2068
+ 3. Maximaal 60 seconden in het geheugen van de server; nooit opgeslagen, gelogd
2069
+ of naar de browser gestuurd. Lukt ophalen niet: niets versturen.
2070
+
2071
+ AANROEP (ongewijzigd)
2072
+ POST <shell_base_url>/api/public/hooks/afhandeling-auto-send
2073
+ (terugval alleen als shell_base_url ontbreekt: PUBLIC_BASE_URL, anders
2074
+ GET {CENTRAL_AUTH_URL}/api/shell-host → shell_host)
2075
+ Headers: content-type: application/json; x-timestamp: <epoch-ms als tekst>;
2076
+ x-signature: hex HMAC-SHA256 over "<timestamp>.<rawBody>";
2077
+ idempotency-key: auto-send:<orderId>
2078
+ Body exact zoals ondertekend: {"orderId":"<uuid>"}
2079
+
2080
+ ANTWOORDEN
2081
+ - 200 sent / 200 already_sent: verstuurd, niets opnieuw.
2082
+ - 400 invalid_body / invalid_idempotency_key en 422 not_floriday: definitief
2083
+ mislukt, geen nieuwe poging.
2084
+ - 401, 409 not_ready, 502 floriday_rejected, andere fouten of geen antwoord:
2085
+ opnieuw na 1, 5, 15 en 60 minuten, maximaal 5 pogingen.
2086
+ - Reden = "<code>: <error>" uit het antwoord (error mag tekst of lijst zijn);
2087
+ zonder JSON "Afhandeling antwoordde <status>".
2088
+
2089
+ TONEN
2090
+ logistics_auto_send_status(p_order_id).tekst, letterlijk, bijv. "Automatisch
2091
+ versturen mislukt: not_ready: controlescan ontbreekt — poging 2 van 5". Kan de
2092
+ Engine de sleutel niet ophalen, dan staat er bijv. "Automatisch versturen
2093
+ mislukt: Automatisch versturen niet mogelijk: sleutel niet op te halen:
2094
+ CENTRAL_AUTH_URL ontbreekt — poging 0 van 5".
2095
+
2096
+ CONTROLELIJST
2097
+ [ ] Antwoord bevat code (of status) en error zoals hierboven.
2098
+ [ ] Handtekening van de Engine wordt geaccepteerd met dezelfde sleutel.
2099
+ [ ] Meld terug met je pakketversie.`,
2100
+ },
1948
2101
  ],
1949
2102
  },
1950
2103
  pickschermen: {
@@ -3647,6 +3800,104 @@ CONTROLELIJST
3647
3800
  [ ] Verdwenen rij: wachtrij ververst, duidelijke tekst, geen 500 in beeld.
3648
3801
  [ ] Meld terug met je pakketversie.`,
3649
3802
  },
3803
+ {
3804
+ number: 43,
3805
+ title: "Stickers: alleen de stand tonen",
3806
+ date: "2026-10-14",
3807
+ summary: "Pickschermen voert geen print.sticker meer uit; toont stand en vooraf-melding van de Engine.",
3808
+ body: `WAAROM
3809
+ De Logistiek Engine is eigenaar van print.sticker en print.traysticker. Twee
3810
+ printers van dezelfde sticker geven dubbele etiketten.
3811
+
3812
+ WAT JE BOUWT
3813
+ (a) Voer geen stickertaken uit en roep geen customer-sticker-pdf op.
3814
+ (b) Toon per kar logistics_cart_sticker_state(cart_id): per sticker de status
3815
+ (wacht_op_moment, klaar, in_printwachtrij, geblokkeerd, afgemeld,
3816
+ niet_printen) en reden.
3817
+ (c) Toon per order logistics_order_sticker_meldingen(order_id) bovenaan het
3818
+ pickstation, letterlijk, bijv. "Voor deze order is een sticker 100×62 mm
3819
+ nodig; op Pickstation 1 zit 28×89 mm."
3820
+
3821
+ REGELS
3822
+ - Alleen lezen, op id. Niets hardcoded.
3823
+
3824
+ CONTROLELIJST
3825
+ [ ] Geen eigen stickerprint meer.
3826
+ [ ] Stand per kar en melding per order zichtbaar.
3827
+ [ ] Meld terug met je pakketversie.`,
3828
+ },
3829
+ {
3830
+ number: 44,
3831
+ title: "Stickerstand op het openbare pickstation",
3832
+ date: "2026-10-15",
3833
+ summary: "Anon-leesfuncties met slugcontrole; omhulsel toegang/stand/meldingen; nooit '0 stickers' bij geen toegang.",
3834
+ body: `AANVULLING; bouwt voort op koppelprompt 43. Vereist Logistiek Engine 1.0.146.
3835
+
3836
+ VOLGORDE
3837
+ Eerst Pickschermen bijwerken voor het omhulsel, daarna pas Engine 1.0.146
3838
+ installeren.
3839
+
3840
+ EERST CONTROLEREN
3841
+ Controleer eerst wat 1.0.37 doet met het omhulsel. Het pickstation mag nooit
3842
+ '0 stickers' of 'klaar' tonen als het omhulsel niet herkend wordt; dan altijd
3843
+ 'Stickerstand onbekend'.
3844
+
3845
+ WAT DE ENGINE LEVERT (anon en authenticated)
3846
+ pickstation_cart_sticker_state(p_slug text, p_cart_id uuid) -> jsonb
3847
+ pickstation_order_sticker_meldingen(p_slug text, p_order_id uuid) -> jsonb
3848
+
3849
+ Toegang alleen als p_slug een actief pick_station is en de kar
3850
+ (payload.cartId) of order (payload.orderId) in een niet-geannuleerde
3851
+ pick_queue-rij van dat station staat. Match op id en slug, nooit op naam.
3852
+
3853
+ UITKOMSTEN
3854
+ - Kar met toegang: { "toegang": true, "stand": { cartId, totaal, inPrintwachtrij, wachtend, geblokkeerd, regels[] } }
3855
+ - Order met toegang: { "toegang": true, "meldingen": [ { soort, stickerId, melding, plek, benodigd, geladen, sinds } ] }
3856
+ - Geen toegang: { "toegang": false, "reden": "onbekend_of_inactief_station" | "niet_in_wachtrij_station" }
3857
+
3858
+ REGELS VOOR HET SCHERM
3859
+ - toegang = false, toegang ontbreekt, onbekende vorm of fout bij de aanroep
3860
+ -> "Stickerstand onbekend". Nooit "0 stickers" of "klaar".
3861
+ - toegang = true en stand.totaal = 0 -> "Geen stickers nodig voor deze kar".
3862
+ Niet leeg, niet "klaar" en niet "onbekend".
3863
+ - toegang = true en stand.totaal > 0 -> aantallen tonen; "klaar" alleen als
3864
+ wachtend = 0 en geblokkeerd = 0.
3865
+ - Lege meldingen-array bij toegang = true: geen formaatmeldingen.
3866
+ - Roep logistics_cart_sticker_state en logistics_order_sticker_meldingen niet
3867
+ meer aan vanuit het openbare pickstation.
3868
+ - Wijzig geen rechten of RLS.
3869
+
3870
+ CONTROLELIJST
3871
+ [ ] Omhulsel herkend; onbekende vorm geeft "Stickerstand onbekend".
3872
+ [ ] Kar van ander station of onbekende slug: "Stickerstand onbekend".
3873
+ [ ] totaal = 0: "Geen stickers nodig voor deze kar".
3874
+ [ ] Meld terug met je pakketversie.`,
3875
+ },
3876
+ {
3877
+ number: 45,
3878
+ title: "Verzendbriefstatus: juiste tekst vanaf het begin (ter info)",
3879
+ date: "2026-10-15",
3880
+ summary: "logistics_shipping_note_status geeft 'Floriday tijdelijk niet bereikbaar' alleen nog bij een echte Floriday-fout na een poging.",
3881
+ body: `TER INFO; geen wijziging nodig. Vereist Logistiek Engine 1.0.149.
3882
+
3883
+ WAT VERANDERT
3884
+ logistics_shipping_note_status(p_slip_job_id, p_cart_id) houdt dezelfde vorm
3885
+ (status, message, attempts, nextAttemptAt, wachtOpVrijgave). Alleen de teksten
3886
+ kloppen nu vanaf het begin:
3887
+ - Nieuwe verzendbrief zonder goedgekeurde controlescan, of wachten op vrijgave
3888
+ of kenmerk: status "wacht_op_floriday", wachtOpVrijgave = true, message
3889
+ "Pakbon geprint — verzendbrief wacht op vrijgave (na de controlescan)."
3890
+ - "Floriday is tijdelijk niet bereikbaar. De verzendbrief wordt automatisch
3891
+ opnieuw geprobeerd." alleen bij een echte Floriday-fout na minstens één poging.
3892
+ - Maximaal aantal pogingen bereikt: status "mislukt" met een eigen tekst.
3893
+ - Anders neutraal: "Verzendbrief wordt klaargezet."
3894
+
3895
+ REGELS
3896
+ - Toon message letterlijk, zoals nu. Niets hardcoded.
3897
+
3898
+ CONTROLELIJST
3899
+ [ ] Bij een net geprinte pakbon verschijnt geen "tijdelijk niet bereikbaar" meer.`,
3900
+ },
3650
3901
  ],
3651
3902
  },
3652
3903
  scanners: {
@@ -4618,6 +4869,94 @@ CONTROLELIJST
4618
4869
  [ ] Printerkeuze gelijk aan printPdf voor dezelfde printplek/werkplek.
4619
4870
  [ ] Geen URL's, sleutels, project-refs, klantnamen of vaste database-id's.`,
4620
4871
  },
4872
+ {
4873
+ number: 6,
4874
+ title: "Stickers en tray-stickers 1-op-1 printen",
4875
+ date: "2026-10-14",
4876
+ summary: "Documentsoorten sticker en traysticker als kant-en-klare Floriday-pdf printen; geladen etiket blijft leidend.",
4877
+ body: `WAAROM
4878
+ De Logistiek Engine zet Floriday-klantstickers (documentsoort "sticker") en
4879
+ tray-stickers (documentsoort "traysticker") via layout_print_document in de
4880
+ Printwachtrij, met layout_id (Floriday-layout op id), cart_id, print_plek_id,
4881
+ _kopieen en payload.pdf_opslag = { bucket, pad } naast pdf_url.
4882
+
4883
+ WAT JE BOUWT
4884
+ (a) Voeg "traysticker" toe aan de documentsoorten (doc_layout_type) en maak een
4885
+ actieve Floriday-layout voor tray-stickers mogelijk. Zonder layout wacht de
4886
+ Engine met de melding "Geen actieve Floriday-layout voor traysticker".
4887
+ (b) Druk beide soorten 1-op-1 af als kant-en-klare pdf, met het opgegeven aantal
4888
+ kopieën, op de labelprinter van de printplek.
4889
+ (c) De Engine gebruikt jullie bestaande geladen_etiketten(_werkplek_id,
4890
+ _print_plek_id) uit 1.56.0, op id, voor de formaatcontrole. Geen
4891
+ PrintNode-driverformaten. Laat die functie aanroepbaar voor service_role en
4892
+ geef per labelprinter printer_id, naam en breedte_mm/hoogte_mm van het
4893
+ geladen etiket terug.
4894
+ (d) Idempotency-sleutel: sticker:<sticker_id>:<cart_id>:<layout_id> en
4895
+ traysticker:<delivery_order_id>:<cart_id>:<layout_id>; dubbel = bestaand
4896
+ opdracht-id teruggeven.
4897
+
4898
+ REGELS
4899
+ - Match op id. Niets hardcoded.
4900
+
4901
+ CONTROLELIJST
4902
+ [ ] traysticker bestaat als documentsoort.
4903
+ [ ] Sticker-pdf komt 1-op-1 en met juiste kopieën uit de labelprinter.
4904
+ [ ] geladen_etiketten geeft breedte_mm/hoogte_mm per printer.
4905
+ [ ] Meld terug met je pakketversie.`,
4906
+ },
4907
+ {
4908
+ number: 7,
4909
+ title: "Vervoerder en ophaalmoment op de eigen afleverbrief",
4910
+ date: "2026-10-14",
4911
+ summary: "Lees vervoerder, ophaalmoment en ophaaladres uit de payload van verzend- en afleverbrieven; ontbrekend veld = regel niet tonen.",
4912
+ body: `WAT DE ENGINE MEESTUURT
4913
+ Bij elke verzendbrief en afleverbrief na controlescan, uit eigen gegevens op id:
4914
+ - payload.vervoerder.naam (alleen als bekend)
4915
+ - payload.vervoerder.code (optioneel)
4916
+ - payload.ophaalmoment (ISO-tijd in UTC, bijv. 2026-10-15T07:30:00Z)
4917
+ - payload.ophaaladres (optioneel; wordt nu nog niet gevuld, er is geen eigen bron)
4918
+
4919
+ WAT JE BOUWT
4920
+ (a) Toon deze velden op de eigen afleverbrief. Ophaalmoment in Amsterdamse tijd.
4921
+ (b) Ontbreekt een veld, laat die regel weg. Vul nooit een standaardvervoerder of
4922
+ -tijd in.
4923
+ (c) De testprint-uitzondering (payload.is_testprint = true) in
4924
+ logistics_require_cart_on_packing_slip staat nu in de Engine-migratie.
4925
+ Verander die functie niet meer zelf; vraag wijzigingen aan bij de Engine.
4926
+
4927
+ CONTROLELIJST
4928
+ [ ] Vervoerder en ophaalmoment zichtbaar op de afleverbrief als ze zijn meegestuurd.
4929
+ [ ] Ontbrekend veld = geen lege regel.
4930
+ [ ] Meld terug met je pakketversie.`,
4931
+ },
4932
+ {
4933
+ number: 8,
4934
+ title: "Testpakbon zonder kar en zonder barcode",
4935
+ date: "2026-10-15",
4936
+ summary: "Een pakbon met payload.is_testprint = true komt ook door de barcodecontrole; hij krijgt geen kar en geen barcode.",
4937
+ body: `WAT DE ENGINE DOET (vanaf 1.0.143)
4938
+ De uitzondering voor testafdrukken staat nu ook in
4939
+ public.logistics_require_pakbon_barcode() (Engine-migratie). Alleen de
4940
+ letterlijke waarde true van payload.is_testprint telt; elke andere waarde
4941
+ ("ja", "1", false, ontbrekend) valt onder de gewone regel en wordt geweigerd
4942
+ als er geen kar is.
4943
+
4944
+ Een testpakbon krijgt geen barcode en geen cart_id: de payload blijft precies
4945
+ zoals jij hem aanlevert.
4946
+
4947
+ WAT JE BOUWT
4948
+ (a) Stuur bij een testpakbon is_testprint als JSON-boolean true mee.
4949
+ (b) Laat het barcode-element op een testpakbon leeg (of toon "TESTAFDRUK");
4950
+ verzin geen barcode.
4951
+ (c) Pas logistics_require_pakbon_barcode en logistics_require_cart_on_packing_slip
4952
+ niet zelf aan; vraag wijzigingen aan bij de Engine.
4953
+
4954
+ CONTROLELIJST
4955
+ [ ] Testpakbon zonder kar wordt aangenomen in de Printwachtrij.
4956
+ [ ] Testpakbon toont geen barcode.
4957
+ [ ] Gewone pakbon zonder kar wordt nog steeds geweigerd.
4958
+ [ ] Meld terug met je pakketversie.`,
4959
+ },
4621
4960
  ],
4622
4961
  },
4623
4962
  floridaykoppeling: {
@@ -4808,6 +5147,86 @@ CONTROLELIJST
4808
5147
  [ ] De cacherij wijst naar het nieuwste pad.
4809
5148
  [ ] Er is geen automatische opruiming van deze map.`,
4810
5149
  },
5150
+ {
5151
+ number: 5,
5152
+ title: "Klantstickers: afmelden, tray-stickers op id, versies bewaren",
5153
+ date: "2026-10-14",
5154
+ summary: "Afmeldfunctie voor klantstickers, tray-stickers op fulfillment order, stickerpdf's niet stil overschrijven, cronlink uit de omgeving.",
5155
+ body: `WAAROM
5156
+ De Logistiek Engine is nu eigenaar van het printen van Floriday-stickers
5157
+ (klantstickers en tray-stickers). Hij haalt pdf's alleen via deze koppeling op
5158
+ en roept Floriday nooit rechtstreeks aan.
5159
+
5160
+ WAT JE BOUWT
5161
+ (a) Gateway-export runCustomerStickersHandled(supabase, { stickerIds: string[] })
5162
+ -> { ok: boolean, error?: string }. Roept PATCH /customer-stickers/handled
5163
+ aan (scope sticker:write) met de stickerIds op id. De Engine roept dit pas
5164
+ aan na de goedgekeurde controlescan van alle karren met die sticker.
5165
+ Bevestig in je terugmelding de exacte body volgens de Suppliers API 2026v1.
5166
+ (b) Sync van customer-stickers: bewaar het volledige object (o.a.
5167
+ stickerFileInformation.numberOfCopies/numberOfPages/shouldBePrinted/
5168
+ deliverSeparately/stickerProvidedBy, stickerSize, compositions[],
5169
+ isHandled, isDeleted, salesOrderId, salesOrderCorrectionRequestId) in
5170
+ floriday_customer_stickers_cache.data. Het veld quantity bestaat niet in
5171
+ Floriday; vul het niet met een verzonnen waarde.
5172
+ (c) Tray-stickers: runPdf kind "tray-stickers" moet ook werken met
5173
+ fulfillmentOrderId (GET /fulfillment-orders/{fulfillmentOrderId}/stickers).
5174
+ De Engine stuurt nu deliveryOrderId; accepteer beide, op id. Geef in het
5175
+ antwoord storagePath mee.
5176
+ (d) Sticker- en tray-pdf's: geen upsert op hetzelfde pad. Nieuwe versie = eigen
5177
+ pad, cache op id naar de nieuwste, oude bewaren; geen opruiming binnen 90
5178
+ dagen na leverdatum.
5179
+ (e) De sticker-cron bevat een vaste projectlink. Lees die uit de omgeving
5180
+ (instelling of secret) en fail closed als hij ontbreekt.
5181
+
5182
+ REGELS
5183
+ - Match op id. Geen URL's, sleutels, project-refs of vaste id's in code of
5184
+ migraties.
5185
+
5186
+ CONTROLELIJST
5187
+ [ ] runCustomerStickersHandled bestaat en meldt een sticker af op id.
5188
+ [ ] Cache bevat stickerFileInformation en stickerSize uit Floriday.
5189
+ [ ] Tray-stickers op fulfillmentOrderId geven een pdf met storagePath.
5190
+ [ ] Geen vaste projectlink meer in de cron.
5191
+ [ ] Meld terug met je pakketversie.`,
5192
+ },
5193
+ ],
5194
+ },
5195
+ dashboards: {
5196
+ order: 11,
5197
+ summary: "Meldingencentrum: toont meldingen uit de modules en volgt hun status.",
5198
+ revisions: [
5199
+ {
5200
+ number: 1,
5201
+ title: "Meldingencentrum: bron uitzoeken, automatisch sluiten, geen verzonden orders",
5202
+ date: "2026-10-15",
5203
+ summary: "Zoek de bron van de 2057 open meldingen uit, sluit meldingen als de bronmodule ze sluit en verberg verzonden/geannuleerde orders.",
5204
+ body: `WAAROM
5205
+ Het Meldingencentrum toont 2057 open meldingen. In de Logistiek Engine staan na
5206
+ opruiming nog maar ongeveer 31 open voorraadmeldingen (alleen orders die nog
5207
+ gepickt moeten worden). De rest komt dus uit een andere bron of blijft in het
5208
+ Meldingencentrum open terwijl de bron al gesloten is.
5209
+
5210
+ WAT JE DOET
5211
+ (1) Zoek uit uit welke bron(nen) de 2057 komen: tabel/functie per bron, met
5212
+ een telling per bron en per status. Meld dat terug vóór je iets sluit.
5213
+ (2) Sluit een melding automatisch zodra de bronmodule hem sluit, op het id
5214
+ van de bronrij. Voor de Engine: logistics_stock_alerts.status <> 'open'
5215
+ (reden staat in resolution_reason), logistics_plan_queue.status in
5216
+ ('done','opgelost','gearchiveerd') voor blokkades.
5217
+ (3) Toon geen meldingen van orders die verzonden, klaar voor facturatie of
5218
+ geannuleerd zijn (op order-id), en geen meldingen van verwijderde orders.
5219
+
5220
+ REGELS
5221
+ - Match op id, nooit op naam. Niets verwijderen: sluiten is een status.
5222
+ - Geen omgevingswaarden in code of migraties.
5223
+
5224
+ CONTROLELIJST
5225
+ [ ] Terugmelding met de telling per bron.
5226
+ [ ] Melding sluit vanzelf als de bron sluit.
5227
+ [ ] Teller daalt; geen meldingen van verzonden of geannuleerde orders.
5228
+ [ ] Meld terug met je pakketversie.`,
5229
+ },
4811
5230
  ],
4812
5231
  },
4813
5232
  };
@@ -1,2 +1,2 @@
1
- export declare const MODULE_VERSION = "1.0.140";
1
+ export declare const MODULE_VERSION = "1.0.151";
2
2
  //# sourceMappingURL=moduleVersion.d.ts.map
@@ -1,2 +1,2 @@
1
1
  // Automatisch gegenereerd door prebuild:lib; niet handmatig aanpassen.
2
- export const MODULE_VERSION = "1.0.140";
2
+ export const MODULE_VERSION = "1.0.151";
@@ -1 +1 @@
1
- {"version":3,"file":"planQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/planQueue.server.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAQ5D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAwBD,wFAAwF;AACxF,wBAAsB,YAAY,CAChC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAC3D,OAAO,CAAC,eAAe,CAAC,CAwQ1B;AAmDD,4EAA4E;AAE5E,wBAAsB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE"}
1
+ {"version":3,"file":"planQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/planQueue.server.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAQ5D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAwBD,wFAAwF;AACxF,wBAAsB,YAAY,CAChC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAC3D,OAAO,CAAC,eAAe,CAAC,CAwR1B;AAmDD,4EAA4E;AAE5E,wBAAsB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE"}
@@ -102,6 +102,7 @@ export async function runPlanQueue(sb, options = {}) {
102
102
  }
103
103
  const bufferId = group.find((g) => g.buffer_id)?.buffer_id ?? null;
104
104
  let blocked = false;
105
+ let blockedReasonFor = null;
105
106
  await trace(sb, {
106
107
  ...basis,
107
108
  nodeId: FLOW_NODE.ontvangst,
@@ -138,6 +139,7 @@ export async function runPlanQueue(sb, options = {}) {
138
139
  }
139
140
  else if (plan.skipped === "blocked") {
140
141
  blocked = true;
142
+ blockedReasonFor = plan.blockedReason ?? null;
141
143
  result.blocked++;
142
144
  if (result.errors.length < 5 && plan.blockedReason)
143
145
  result.errors.push(plan.blockedReason);
@@ -190,6 +192,7 @@ export async function runPlanQueue(sb, options = {}) {
190
192
  }
191
193
  else if (plan?.skipped === "blocked") {
192
194
  blocked = true;
195
+ blockedReasonFor = plan.blockedReason ?? null;
193
196
  result.blocked++;
194
197
  if (result.errors.length < 5 && plan.blockedReason)
195
198
  result.errors.push(plan.blockedReason);
@@ -228,6 +231,16 @@ export async function runPlanQueue(sb, options = {}) {
228
231
  // alsnog als afgerond worden weggeschreven. Een wachtende vergelijking
229
232
  // krijgt geen "na"-stand en wordt daarom als overgeslagen afgesloten.
230
233
  if (blocked) {
234
+ // De blokkade raakt soms alleen de buffer-leden zonder kar, niet de
235
+ // order die deze ronde oppakte (FO-2601389). Sluit die claim dan hier
236
+ // af, anders blijft hij op 'running' staan en herhaalt het vangnet hem.
237
+ await sb
238
+ .rpc("logistics_plan_close_claim", {
239
+ p_id: row.id,
240
+ p_reason: blockedReasonFor ?? "Indeling geblokkeerd",
241
+ p_reason_code: null,
242
+ })
243
+ .then(() => undefined, () => undefined);
231
244
  const skipWarnings = await skipPlannerDiffRuns(sb, [row.order_id, ...group.map((g) => g.order_id)].filter(Boolean), "Indeling geblokkeerd; geen nieuwe karindeling om mee te vergelijken.").catch((e) => [String(e)]);
232
245
  for (const w of skipWarnings)
233
246
  if (result.errors.length < 10)
@@ -1 +1 @@
1
- {"version":3,"file":"ruleEngineSchema.d.ts","sourceRoot":"","sources":["../../src/lib/ruleEngineSchema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ruleEngineSchema.d.ts","sourceRoot":"","sources":["../../src/lib/ruleEngineSchema.ts"],"names":[],"mappings":"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"}
@@ -334,6 +334,13 @@ export const RULE_STEPS = [
334
334
  { value: "buffer", label: "Picken per orderbuffer" },
335
335
  ],
336
336
  },
337
+ {
338
+ key: "auto_send_loading",
339
+ label: "Automatisch versturen na de laatste goedgekeurde kar",
340
+ type: "toggle",
341
+ default: false,
342
+ description: "Alleen voor Floriday-orders. Staat dit aan, dan vraagt de Engine Afhandeling om de belading te versturen zodra alle karren van de order goedgekeurd zijn gescand. Eén keer per order; bij een fout tot 5 pogingen met oplopende wachttijd.",
343
+ },
337
344
  {
338
345
  key: "scanner",
339
346
  label: "Scannergebruik",
@@ -786,6 +793,24 @@ export const RULE_STEPS = [
786
793
  dependsOn: { key: "sticker_release", in: ["with_pick_release", "hours_before_pick"] },
787
794
  description: "Bij \u201cgelijk met de bijbehorende pakbon\u201d volgt de sticker automatisch het pickstation waar de pakbon geprint wordt; dat geldt dan voor alle pickstations gelijk.",
788
795
  },
796
+ {
797
+ key: "traysticker_release",
798
+ label: "Tray-stickers (fustlabels van Floriday) printen?",
799
+ type: "radio",
800
+ default: "uit",
801
+ options: [
802
+ {
803
+ value: "uit",
804
+ label: "Niet printen",
805
+ description: "De Engine haalt geen tray-stickers op.",
806
+ },
807
+ {
808
+ value: "na_geaccepteerde_belading",
809
+ label: "Na geaccepteerde belading",
810
+ description: "Zodra Floriday de belading van de kar heeft geaccepteerd, komen de tray-stickers als PDF op de labelprinter van dezelfde plek als de pakbon.",
811
+ },
812
+ ],
813
+ },
789
814
  {
790
815
  key: "sticker_layout",
791
816
  label: "Welke layout voor dit soort orders?",
@@ -1 +1 @@
1
- {"version":3,"file":"shippingNoteQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/shippingNoteQueue.server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAO5D,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAoCD,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,eAAe,CAAC,CA0d1B;AAMD,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,aAAa,GAAG,IAAI,CAAC;AAElE,qGAAqG;AACrG,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAQ9F;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAG5E;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,mBAAmB,GAAG,MAAM,CAI3E"}
1
+ {"version":3,"file":"shippingNoteQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/shippingNoteQueue.server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAQ5D,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAoCD,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,eAAe,CAAC,CA4d1B;AAMD,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,aAAa,GAAG,IAAI,CAAC;AAElE,qGAAqG;AACrG,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAQ9F;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAG5E;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,mBAAmB,GAAG,MAAM,CAI3E"}
@@ -14,6 +14,7 @@
14
14
  import { trace, newTraceId, classifyError } from "./trace.server.js";
15
15
  import { FLOW_NODE } from "./flowNodes.js";
16
16
  import { printViaLayoutGecontroleerd, floridayLayout, floridayPdfOpslag } from "./layoutPrint.server.js";
17
+ import { briefTransport } from "./briefTransport.server.js";
17
18
  import { SHIPPING_NOTE_DEFINITIEVE_FOUTEN, definitieveFout, parseMaxAttempts } from "./shippingNoteStates.js";
18
19
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
19
20
  function pickPdf(result) {
@@ -371,6 +372,7 @@ export async function runShippingNoteQueue(sb, options = {}) {
371
372
  reason: "Alleen de tijdelijke link wordt meegestuurd; printen gaat door.",
372
373
  });
373
374
  }
375
+ const transport = await briefTransport(sb, row.order_id ?? null, cartId ?? null, basis);
374
376
  const printed = await printViaLayoutGecontroleerd(sb, {
375
377
  documenttype: "afleverbrief",
376
378
  layoutId: layout.layoutId,
@@ -400,6 +402,7 @@ export async function runShippingNoteQueue(sb, options = {}) {
400
402
  barcode: slipPayload["barcode"] ?? null,
401
403
  fulfillment_order_id: fulfillmentOrderId,
402
404
  ...(pdfOpslag ? { pdf_opslag: pdfOpslag } : {}),
405
+ ...transport,
403
406
  },
404
407
  });
405
408
  if (!printed.ok) {
@@ -0,0 +1,15 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ export interface StickerRun {
3
+ synced: unknown;
4
+ released: number;
5
+ printed: number;
6
+ blocked: number;
7
+ retrying: number;
8
+ handled: number;
9
+ warnings: number;
10
+ errors: string[];
11
+ }
12
+ export declare function runStickerQueue(sb: SupabaseClient, opts?: {
13
+ limit?: number;
14
+ }): Promise<StickerRun>;
15
+ //# sourceMappingURL=stickerQueue.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stickerQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/stickerQueue.server.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAc5D,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAgCD,wBAAsB,eAAe,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CA+P5G"}