@flowselections/layout-maker
v1.32.0
Published
blank project start
Readme
Layout maker (pakbonnen, verzendbrieven, ectra)
blank project start
This project was built with Lovable.
Build with Lovable
Continue developing this project in the Lovable editor.
- Ship faster: describe what you want to build and Lovable handles the code.
- Stay in sync: every change made in Lovable is committed straight to this repository.
- Full ownership: this code is yours. Push to
mainon GitHub and your changes sync back into Lovable, ready for your next prompt.
Development
Prefer working locally? You need Node.js and npm — install with nvm.
git clone <this-repository-url>
cd <repository-name>
npm i
npm run devInstalleren in een andere shell
Draai
sql/print-schema.sqléén keer in de Supabase-database van die shell (SQL editor). Het script is idempotent en zet tabellen, rechten, RLS, functies, de geplande taken én de opslagmaplayout-logosvoor de Logo Bibliotheek klaar. Zorg dat de extensiespg_cronenpg_netaan staan.Zet in de omgeving van de shell:
SUPABASE_URLenSERVICE_ROLE_KEY— nodig voor achtergrondprintenCENTRAL_AUTH_URLenCENTRAL_AUTH_SECRET— nodig voor de printdienst
Zorg dat de shell het tick-eindpunt host. De setup-CLI doet dit automatisch op basis van
flowselections.serverRoutesinpackage.json. Handmatig opgezette shells maken zelf dit bestand aan:// src/routes/api/public/print/queue-tick.ts import { createFileRoute } from "@tanstack/react-router"; import { behandelQueueTick } from "@flowselections/layout-maker/print"; export const Route = createFileRoute("/api/public/print/queue-tick")({ server: { handlers: { POST: async ({ request }) => { // De shell levert de databaseverbinding; de module maakt er nooit zelf een. const { supabaseAdmin } = await import( "../../../../integrations/supabase/client.server" ); return behandelQueueTick(request, supabaseAdmin); }, }, }, });Het eindpunt accepteert drie toegangsbewijzen: een runner-sleutel uit
print_queue_runners.tick_sleutel,SUPABASE_PUBLISHABLE_KEY(de cron) of het sessietoken van een ingelogde gebruiker (de knop in de Printwachtrij).Klaar. Zodra de module in de shell draait meldt hij zichzelf aan als verwerker van de printwachtrij. Een nieuwe printopdracht wordt meteen opgepakt; daarnaast verwerkt de geplande taak
print-queue-tickelke minuut de wachtende opdrachten. Reageert een shell een uur lang niet, dan wordt hij automatisch op inactief gezet. De taakprint-queue-cleanupruimt dagelijks oude opdrachten en bestanden op.
Printen vanuit een andere module
Andere modules in dezelfde shell gebruiken uitsluitend de print-API van deze module; zij hoeven de printtabellen niet te kennen en mogen er ook niet zelf in schrijven (dan blijft de opdracht wachten tot de volgende cronronde).
import {
printDocument, printPdf, printHtml,
printerVoorWerkplek, printerVoorDocumenttype, volgJobStatus,
} from "@flowselections/layout-maker";
// 1. Document dat via een ontwerp uit deze module wordt opgemaakt
const { jobId } = await printDocument({
documenttype: "pakbon", // moet een bestaande documentsoort zijn
documentnaam: "PB-2601284",
payload: { order, order_id: order.id }, // order_id: verplicht kenmerk
});
// 2. Kant-en-klare PDF (Floriday-document, klantsticker, externe factuur)
// Zonder printerId wordt de printer bepaald via de gekoppelde layout van
// de documentsoort (of de koppeling op papierformaat).
await printPdf({
documenttype: "factuur",
documentnaam: "F-2026-00123",
pdfBase64, // met of zonder data:-voorvoegsel
payload: { order_id: factuur.id },
});
// Geef in payload altijd een order-kenmerk mee: queue_item_id, order_id of
// ordernummer. De wachtrij gebruikt dat om dubbele aanvragen te herkennen;
// zonder kenmerk kunnen twee orders met dezelfde documentnaam binnen tien
// minuten als dubbel worden gezien.
// Of expliciet per werkplek:
const printerId = await printerVoorWerkplek("PICKSTATION-1", "A4");
await printPdf({
documenttype: "afleverbrief",
documentnaam: "AFL-12345",
pdfBase64,
printerId: printerId!,
});
// 3. Eigen opmaak afdrukken (geen layout, anders wint de layout)
await printHtml({
documenttype: "controlelijst",
documentnaam: "Controlelijst kar 12",
html,
printerId: printerId!,
});
// Status live volgen (realtime staat aan op print_jobs)
const stop = volgJobStatus(jobId, (s) => console.log(s.status, s.foutmelding));Belangrijk:
- Documentsoorten liggen vast in de database: pakbon, factuur, offerte, orderbevestiging, etiket, verzendlabel, productlabel, barcode_label, magazijnlijst, controlelijst, transportdocument, sticker, productiebon, veilingbon, afleverbrief, veilingbrief en vrij.
- Beslisvolgorde bij het afdrukken: kant-en-klare PDF > gekoppelde layout > meegestuurde opmaak > actieve layout van de documentsoort.
- Dubbelbeveiliging: een identieke aanvraag binnen 10 minuten wordt
genegeerd; de aanroep werpt dan
DubbeleAanvraagFout. Geef bij bulkprints per document een eigendocumentnaamzodat elke opdracht uniek is.
