diff --git a/.gitignore b/.gitignore
index 83dfac0..c478eb0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,3 +37,4 @@ public/tts-cache/*.wav
# Generated TTS cache (key-generated audio — bundle ships it, git doesn't)
apps/tischler/public/tts-cache/
.vercel
+apps/tischler/public/werkstoff-bundle/modell.glb
diff --git a/apps/tischler/app/[locale]/werkstoff/page.tsx b/apps/tischler/app/[locale]/werkstoff/page.tsx
index 3881f2f..b431708 100644
--- a/apps/tischler/app/[locale]/werkstoff/page.tsx
+++ b/apps/tischler/app/[locale]/werkstoff/page.tsx
@@ -31,11 +31,14 @@ import {
type Komponentenzeile,
type Materialkarte,
} from "../../../lib/werkstoff/karte";
-
-const WERKSTUECKE = [
- { id: "seite-links-890x555", kurz: "Seite links", laenge: 890, breite: 555 },
- { id: "boden-562x555", kurz: "Boden", laenge: 562, breite: 555 },
-];
+import {
+ karteFuer,
+ ladeAuftrag,
+ luecke,
+ schluesselKurz,
+ type Auftrag,
+ type AuftragLuecke,
+} from "../../../lib/werkstoff/auftrag";
function Ampel({ freigabe }: { freigabe: Materialkarte["freigabe"] }) {
return (
@@ -120,7 +123,13 @@ function Zeile({ karte, z }: { karte: Materialkarte; z: Komponentenzeile }) {
}
export default function WerkstoffPage() {
+ // Der Auftrag bestimmt, welche Bretter es gibt — nicht eine Liste im Code. Fehlt er, gibt es
+ // kein Brett und den Satz dazu; ein Katalog-Beispiel an seiner Stelle wäre das falsche Material.
+ const [auftrag, setAuftrag] = useState(null);
+ const [auftragFehler, setAuftragFehler] = useState(null);
const [gewaehlt, setGewaehlt] = useState(null);
+ // Ein angetipptes Brett ohne Karte: kein Fehler, sondern der Grund — Material noch offen.
+ const [lueckeGewaehlt, setLueckeGewaehlt] = useState(null);
const [karte, setKarte] = useState(null);
const [stand, setStand] = useState(null);
const [grenze, setGrenze] = useState(null);
@@ -131,6 +140,9 @@ export default function WerkstoffPage() {
// Fehlt die Grenzaussage, bleibt es still — kein Fehler, aber auch kein Satz, den
// niemand belegen kann.
ladeDatengrenze().then(setGrenze);
+ ladeAuftrag()
+ .then(setAuftrag)
+ .catch((e) => setAuftragFehler(String(e.message ?? e)));
}, []);
useEffect(() => {
@@ -153,8 +165,32 @@ export default function WerkstoffPage() {
}, [gewaehlt]);
const gruppen = useMemo(() => (karte ? gruppiere(karte.komponenten) : []), [karte]);
+ // Ein Tap führt über den Schlüssel: zur Karte, wenn es eine gibt — sonst zur benannten Lücke.
+ const tippeTeil = (schluessel: string) => {
+ if (!auftrag) return;
+ const id = karteFuer(auftrag, schluessel);
+ if (id) {
+ setLueckeGewaehlt(null);
+ setGewaehlt(gewaehlt === id ? null : id);
+ return;
+ }
+ const l = auftrag.teile_ohne_karte.find((t) => t.schluessel === schluessel);
+ if (l) {
+ setGewaehlt(null);
+ setLueckeGewaehlt(lueckeGewaehlt?.schluessel === l.schluessel ? null : l);
+ }
+ };
+ const bretter = useMemo(
+ () =>
+ auftrag
+ ? [
+ ...auftrag.teile.map((t) => ({ ...t, luecke: undefined as AuftragLuecke | undefined })),
+ ...auftrag.teile_ohne_karte.map((t) => ({ ...t, luecke: t })),
+ ].sort((a, b) => a.schluessel.localeCompare(b.schluessel))
+ : [],
+ [auftrag],
+ );
const schritte = useMemo(() => (karte ? arbeitsfolge(karte) : []), [karte]);
- const massstab = 0.28;
return (
@@ -165,6 +201,13 @@ export default function WerkstoffPage() {
? `Katalogstand ${stand.stand} · ${stand.dateien} Datendateien · ${stand.sha256.slice(0, 12)}…`
: "Katalogstand wird gelesen …"}
+ {auftrag && (
+
+ Möbel {auftrag.moebel_id} · Revision {auftrag.revision} · Plan{" "}
+ {auftrag.buildplan_sha256.slice(0, 12)}…
+
+ )}
+ {auftragFehler && ⚠ Kein Auftrag im Bundle: {auftragFehler}
}
Offline-Bundle aus dem Auftrag — Datenblätter sind verlinkt, nicht kopiert.
@@ -179,23 +222,38 @@ export default function WerkstoffPage() {
- {WERKSTUECKE.map((w) => (
- setGewaehlt(gewaehlt === w.id ? null : w.id)}
- aria-pressed={gewaehlt === w.id}
- >
- {w.kurz}
-
- {w.laenge} × {w.breite}
-
-
- ))}
+ {bretter.map((w) => {
+ const aktiv = w.luecke
+ ? lueckeGewaehlt?.schluessel === w.schluessel
+ : gewaehlt === w.werkstueck_id;
+ return (
+ tippeTeil(w.schluessel)}
+ aria-pressed={aktiv}
+ >
+ {schluesselKurz(w.schluessel)}
+ {w.luecke ? "Material noch offen" : w.werkstueck_id}
+
+ );
+ })}
+ {auftrag && lueckeGewaehlt && (
+
+ {schluesselKurz(lueckeGewaehlt.schluessel)} — Material noch offen
+
+ Aufbau {lueckeGewaehlt.aufbau}: {luecke(auftrag, lueckeGewaehlt.schluessel)?.grund}
+
+
+ Der Plan verlangt dieses Brett, der Katalog kennt seinen Aufbau nicht. Welches Material
+ verbaut wird, entscheidet der Betrieb — nicht das Werkzeug.
+
+
+ )}
+
{fehler && ⚠ {fehler}
}
{karte && (
@@ -204,7 +262,8 @@ export default function WerkstoffPage() {
{karte.werkstueck.bezeichnung}
- Aufbau {karte.aufbau.bezeichnung} ({karte.aufbau.id}@{karte.aufbau.revision})
+ Teil {karte.werkstueck.id} · Aufbau {karte.aufbau.bezeichnung} ({karte.aufbau.id}@
+ {karte.aufbau.revision})
diff --git a/apps/tischler/app/[locale]/werkstoff/panel.test.tsx b/apps/tischler/app/[locale]/werkstoff/panel.test.tsx
index 42f7a4b..f4e3068 100644
--- a/apps/tischler/app/[locale]/werkstoff/panel.test.tsx
+++ b/apps/tischler/app/[locale]/werkstoff/panel.test.tsx
@@ -57,3 +57,57 @@ describe("Werkstoff-Panel: die Grenzaussage am Werkstück", () => {
expect(document.body.textContent ?? "").not.toMatch(/Feldname/i);
});
});
+
+describe("Werkstoff-Panel: der Auftrag bestimmt, welche Bretter es gibt", () => {
+ it("zeigt Möbel und Revision aus dem Auftrag — und die vier Teile des Plans als Schaltflächen", async () => {
+ vi.stubGlobal("fetch", stub());
+ render( );
+ await waitFor(() => {
+ expect(screen.getByRole("button", { name: /Se:links/ })).toBeTruthy();
+ });
+ const text = document.body.textContent ?? "";
+ expect(text).toMatch(/moebel_beispiel0001/);
+ expect(text).toMatch(/Revision 3/);
+ expect(screen.getAllByRole("button", { name: /^(Bo|Se):/ })).toHaveLength(4);
+ // Die Rückwand steht als fünftes Brett da — als benannte Lücke, nicht weggeschnitten.
+ expect(screen.getByRole("button", { name: /^Rw/ })).toBeTruthy();
+ });
+
+ it("tippt der Handwerker auf die Rückwand, kommt keine Karte, sondern der Grund — Material noch offen", async () => {
+ vi.stubGlobal("fetch", stub());
+ render( );
+ const rw = await waitFor(() => screen.getByRole("button", { name: /^Rw/ }));
+ rw.click();
+ await waitFor(() => {
+ expect(document.body.textContent).toMatch(/Material noch offen/);
+ });
+ expect(document.body.textContent).toMatch(/rw-8@1/);
+ expect(document.querySelector(".karte")).toBeNull();
+ });
+
+ it("tippt der Handwerker auf »Se:links«, kommt die Karte des Plan-Teils, nicht eines Katalog-Bretts", async () => {
+ vi.stubGlobal("fetch", stub());
+ render( );
+ const knopf = await waitFor(() => screen.getByRole("button", { name: /Se:links/ }));
+ knopf.click();
+ await waitFor(() => {
+ expect(document.body.textContent).toMatch(/Teil teil_beispielse0links/);
+ });
+ // Die Bezeichnung kommt aus der Karte des Plan-Teils — der Test liest sie dort, statt sie
+ // zu raten; ein Katalog-Brett hieße anders.
+ const karte = JSON.parse(
+ readFileSync(join(BUNDLE, "karten/teil_beispielse0links.json"), "utf8"),
+ ) as { werkstueck: { bezeichnung: string } };
+ expect(karte.werkstueck.bezeichnung.length).toBeGreaterThan(0);
+ expect(document.body.textContent).toContain(karte.werkstueck.bezeichnung);
+ });
+
+ it("ohne Auftrag im Bundle: kein Brett, sondern der Satz, dass der Auftrag fehlt", async () => {
+ vi.stubGlobal("fetch", stub((url, roh) => (url.endsWith("auftrag.json") ? null : roh)));
+ render( );
+ await waitFor(() => {
+ expect(document.body.textContent).toMatch(/Kein Auftrag/);
+ });
+ expect(screen.queryAllByRole("button", { name: /^(Bo|Se):/ })).toHaveLength(0);
+ });
+});
diff --git a/apps/tischler/app/globals.css b/apps/tischler/app/globals.css
index fdfe40d..e579f38 100644
--- a/apps/tischler/app/globals.css
+++ b/apps/tischler/app/globals.css
@@ -1002,3 +1002,9 @@ body.cc-kiosk .cc-workbench {
border-top: 1px dashed currentColor;
border-color: color-mix(in srgb, currentColor 25%, transparent);
}
+
+/* Werkstoff: ein Brett ohne Karte — die benannte Lücke */
+.werkstoff .teil.luecke { border-style: dashed; color: #64748b; background: #f8fafc; }
+.werkstoff .luecke-hinweis { border: 1px dashed #94a3b8; border-radius: 8px; padding: 1rem 1.25rem; margin: 1rem 0; background: #f8fafc; }
+.werkstoff .luecke-hinweis h2 { margin: 0 0 0.5rem; font-size: 1.1rem; }
+.werkstoff .luecke-hinweis p { margin: 0.25rem 0; }
diff --git a/apps/tischler/lib/werkstoff/auftrag.test.ts b/apps/tischler/lib/werkstoff/auftrag.test.ts
new file mode 100644
index 0000000..839722c
--- /dev/null
+++ b/apps/tischler/lib/werkstoff/auftrag.test.ts
@@ -0,0 +1,321 @@
+/**
+ * Der Auftrag im Bundle ist die Klammer zwischen Konstruktion und Karte: welches Möbel, welcher
+ * Plan, welche Revision — und welcher Knoten im 3D-Modell welche Karte trägt. Red-First: diese
+ * Datei stand, bevor `lib/werkstoff/auftrag.ts` existierte.
+ *
+ * Vertrag mit cody-cad (#66, Cody #2 04.09.): GLB-Knotennamen = `schluessel`, Wurzel = `moebel_id`.
+ * Der Loader prüft in BEIDE Richtungen — ein Knoten ohne Karte ist so falsch wie eine Karte
+ * ohne Knoten; das eine zeigt ein Brett ohne Material, das andere Material ohne Brett.
+ */
+import { describe, it, expect, vi, afterEach } from "vitest";
+import { readFileSync, existsSync } from "node:fs";
+import { join } from "node:path";
+import { glbKnoten, karteFuer, ladeAuftrag, luecke, pruefeSzene, type Auftrag } from "./auftrag";
+
+const BUNDLE = join(__dirname, "../../public/werkstoff-bundle");
+const MINI_GLB = join(__dirname, "fixtures/demo-mini.glb");
+const AUFTRAG = JSON.parse(readFileSync(join(BUNDLE, "auftrag.json"), "utf8")) as Auftrag;
+
+function stub(aenderung?: (url: string, roh: string) => string | null) {
+ return vi.fn(async (url: string) => {
+ const pfad = join(BUNDLE, String(url).replace("/werkstoff-bundle/", ""));
+ if (!existsSync(pfad)) return { ok: false, status: 404 } as Response;
+ const roh = readFileSync(pfad, "utf8");
+ const inhalt = aenderung ? aenderung(String(url), roh) : roh;
+ if (inhalt === null) return { ok: false, status: 404 } as Response;
+ return { ok: true, status: 200, json: async () => JSON.parse(inhalt) } as Response;
+ });
+}
+const verbiegen = (f: (a: Record) => void) =>
+ stub((url, roh) => {
+ if (!url.endsWith("auftrag.json")) return roh;
+ const o = JSON.parse(roh);
+ f(o);
+ return JSON.stringify(o);
+ });
+
+afterEach(() => vi.unstubAllGlobals());
+
+describe("ladeAuftrag — die Klammer aus dem Bundle", () => {
+ it("liest Möbel, Plan-Hash, Revision und die vier Teile des Demo-Plans", async () => {
+ vi.stubGlobal("fetch", stub());
+ const a = await ladeAuftrag();
+ expect(a.moebel_id).toBe("moebel_beispiel0001");
+ expect(a.buildplan_sha256).toMatch(/^[0-9a-f]{64}$/);
+ expect(a.revision).toBe(3);
+ expect(a.teile.map((t) => t.schluessel)).toEqual([
+ "teil:Bo:oben",
+ "teil:Bo:unten",
+ "teil:Se:links",
+ "teil:Se:rechts",
+ ]);
+ expect(a.teile.every((t) => /^teil_/.test(t.werkstueck_id))).toBe(true);
+ // Die Lücke wird getragen: die Rückwand hat keinen Katalog-Aufbau, und der Auftrag sagt es.
+ expect(a.teile_ohne_karte).toEqual([
+ {
+ schluessel: "teil:Rw",
+ werkstueck_id: "teil_beispielrw000001",
+ aufbau: "rw-8@1",
+ grund: "kein Aufbau rw-8@1 im Katalogstand 2026-09-03 — Material noch offen",
+ },
+ ]);
+ });
+
+ it("ein Bundle ohne das Feld teile_ohne_karte (älterer Stand) hat keine Lücke — kein Fehler", async () => {
+ vi.stubGlobal("fetch", verbiegen((a) => delete a.teile_ohne_karte));
+ expect((await ladeAuftrag()).teile_ohne_karte).toEqual([]);
+ });
+
+ it("die Lücke braucht Grund und Aufbau, und ein Schlüssel steht nie in beiden Listen", async () => {
+ type L = Array<{ schluessel: string; werkstueck_id: string; aufbau: string; grund: string }>;
+ const faelle: Array<[RegExp, (a: Record) => void]> = [
+ [/grund/, (a) => ((a.teile_ohne_karte as L)[0]!.grund = "")],
+ [/grund/, (a) => delete (a.teile_ohne_karte as Partial[])[0]!.grund],
+ [/aufbau/, (a) => ((a.teile_ohne_karte as L)[0]!.aufbau = "")],
+ [/beiden Listen/, (a) => ((a.teile_ohne_karte as L)[0]!.schluessel = "teil:Bo:oben")],
+ // null ist kein »fehlendes Feld«: ein älteres Bundle lässt es weg, ein kaputtes schreibt null.
+ [/keine Liste/, (a) => (a.teile_ohne_karte = null)],
+ [/keine Liste/, (a) => (a.teile_ohne_karte = "teil:Rw")],
+ [/doppelt/i, (a) => ((a.teile_ohne_karte as L)[0]!.werkstueck_id = "teil_beispielbo0oben")],
+ ];
+ for (const [grund, f] of faelle) {
+ vi.stubGlobal("fetch", verbiegen(f));
+ await expect(ladeAuftrag(), String(grund)).rejects.toThrow(grund);
+ }
+ });
+
+ it("fehlt der Auftrag, ist das ein Fehler — kein leeres Möbel", async () => {
+ vi.stubGlobal("fetch", stub((url, roh) => (url.endsWith("auftrag.json") ? null : roh)));
+ await expect(ladeAuftrag()).rejects.toThrow(/Kein Auftrag/);
+ });
+
+ it("lehnt jeden verbogenen Auftrag ab — mit dem Grund", async () => {
+ const faelle: Array<[RegExp, (a: Record) => void]> = [
+ [/teile/, (a) => (a.teile = [])],
+ [/doppelt/i, (a) => ((a.teile as Array<{ schluessel: string }>)[1]!.schluessel = "teil:Bo:oben")],
+ [/doppelt/i, (a) => ((a.teile as Array<{ werkstueck_id: string }>)[1]!.werkstueck_id = "teil_beispielbo0oben")],
+ [/revision/i, (a) => (a.revision = 0)],
+ [/revision/i, (a) => (a.revision = "3")],
+ [/moebel_id/, (a) => delete a.moebel_id],
+ [/buildplan_sha256/, (a) => (a.buildplan_sha256 = "abc")],
+ [/schluessel/, (a) => delete (a.teile as Array<{ schluessel?: string }>)[0]!.schluessel],
+ [/werkstueck_id/, (a) => ((a.teile as Array<{ werkstueck_id: string }>)[0]!.werkstueck_id = "")],
+ ];
+ for (const [grund, f] of faelle) {
+ vi.stubGlobal("fetch", verbiegen(f));
+ await expect(ladeAuftrag(), String(grund)).rejects.toThrow(grund);
+ }
+ });
+});
+
+describe("glbKnoten — was das 3D-Modell an Namen trägt", () => {
+ const glb = () => new Uint8Array(readFileSync(MINI_GLB)).buffer;
+ const umbauenAllg = (f: (j: Record) => void) => {
+ const b = new Uint8Array(glb());
+ const len = new DataView(b.buffer).getUint32(12, true);
+ const j = JSON.parse(new TextDecoder().decode(b.subarray(20, 20 + len)));
+ f(j);
+ const txt = new TextEncoder().encode(JSON.stringify(j));
+ const pad = (4 - (txt.length % 4)) % 4;
+ const out = new Uint8Array(20 + txt.length + pad);
+ const dv = new DataView(out.buffer);
+ out.set([0x67, 0x6c, 0x54, 0x46], 0);
+ dv.setUint32(4, 2, true);
+ dv.setUint32(8, out.length, true);
+ dv.setUint32(12, txt.length + pad, true);
+ dv.setUint32(16, 0x4e4f534a, true);
+ out.set(txt, 20);
+ for (let i = 0; i < pad; i++) out[20 + txt.length + i] = 0x20;
+ return out.buffer;
+ };
+
+ it("liest Wurzel und Teile aus dem Fixture — die Wurzel ist die der Szene, nicht nodes[0]", () => {
+ const k = glbKnoten(glb());
+ expect(k.wurzel).toBe("moebel_beispiel0001");
+ expect([...k.teile].sort()).toEqual([
+ "teil:Bo:oben",
+ "teil:Bo:unten",
+ "teil:Rw",
+ "teil:Se:links",
+ "teil:Se:rechts",
+ ]);
+ // Reihenfolge ≠ Identität: im Fixture steht das Möbel absichtlich nicht an Index 0.
+ const b = new Uint8Array(glb());
+ const len = new DataView(b.buffer).getUint32(12, true);
+ const j = JSON.parse(new TextDecoder().decode(b.subarray(20, 20 + len))) as { scenes: Array<{ nodes: number[] }> };
+ expect(j.scenes[0]!.nodes[0]).not.toBe(0);
+ });
+
+ it("lehnt ab, was kein glTF-Binary ist", () => {
+ const kaputt = new Uint8Array(glb());
+ kaputt[0] = 0x58;
+ expect(() => glbKnoten(kaputt.buffer)).toThrow(/glTF/);
+ });
+
+ it("verlangt genau eine benannte Wurzel und benannte Kinder", () => {
+ const umbauen = (f: (j: Record) => void) => {
+ const b = new Uint8Array(glb());
+ const len = new DataView(b.buffer).getUint32(12, true);
+ const j = JSON.parse(new TextDecoder().decode(b.subarray(20, 20 + len)));
+ f(j);
+ const txt = new TextEncoder().encode(JSON.stringify(j));
+ const pad = (4 - (txt.length % 4)) % 4;
+ const out = new Uint8Array(20 + txt.length + pad);
+ const dv = new DataView(out.buffer);
+ out.set([0x67, 0x6c, 0x54, 0x46], 0);
+ dv.setUint32(4, 2, true);
+ dv.setUint32(8, out.length, true);
+ dv.setUint32(12, txt.length + pad, true);
+ dv.setUint32(16, 0x4e4f534a, true);
+ out.set(txt, 20);
+ for (let i = 0; i < pad; i++) out[20 + txt.length + i] = 0x20;
+ return out.buffer;
+ };
+ type N = Array<{ name?: string; children?: number[] }>;
+ const wurzelIdx = (j: Record) => (j.scenes as Array<{ nodes: number[] }>)[0]!.nodes[0]!;
+ expect(() => glbKnoten(umbauen((j) => ((j.scenes as Array<{ nodes: number[] }>)[0]!.nodes = [0, 1])))).toThrow(/eine Wurzel/);
+ expect(() => glbKnoten(umbauen((j) => delete (j.nodes as N)[wurzelIdx(j)]!.name))).toThrow(/Wurzel.*Name/);
+ expect(() => glbKnoten(umbauen((j) => delete (j.nodes as N)[0]!.name))).toThrow(/ohne Namen/);
+ });
+
+ it("doppelte Knotennamen sind ein Fehler — zwei Bretter mit einem Namen sind kein Vertrag", () => {
+ type N = Array<{ name?: string; children?: number[] }>;
+ const dup = umbauenAllg((j) => ((j.nodes as N)[0]!.name = (j.nodes as N)[1]!.name));
+ expect(() => glbKnoten(dup)).toThrow(/doppelt/);
+ });
+
+ it("genau zwei Ebenen: ein Kind mit eigenen Kindern ist ein Vertragsbruch, keine Gruppe", () => {
+ type N = Array<{ name?: string; children?: number[] }>;
+ const enkel = umbauenAllg((j) => ((j.nodes as N)[0]!.children = [1]));
+ expect(() => glbKnoten(enkel)).toThrow(/zwei Ebenen/);
+ });
+
+ it.each([
+ ["Magic", 0, 0x58585858, /glTF/],
+ ["Version 1 statt 2", 4, 1, /Version/],
+ ["Gesamtlänge im Header ≠ Datei", 8, 12, /Gesamtl/],
+ ["JSON-Chunk länger als die Datei", 12, 10_000_000, /Datei hat nur/],
+ ["JSON-Chunk zu kurz (abgeschnittenes JSON)", 12, 8, /JSON-Chunk|unlesbar/],
+ ["Chunk-Typ nicht JSON", 16, 0x004e4942, /JSON-Chunk/],
+ ])("Header-Lüge »%s« ist ein Klartext-Fehler, kein RangeError/SyntaxError", (_name, offset, wert, muster) => {
+ const b = new Uint8Array(glb());
+ new DataView(b.buffer).setUint32(offset, wert, true);
+ let fehler: unknown;
+ try {
+ glbKnoten(b.buffer);
+ } catch (e) {
+ fehler = e;
+ }
+ expect(fehler).toBeInstanceOf(Error);
+ expect((fehler as Error).message).toMatch(muster);
+ expect((fehler as Error).name).not.toMatch(/RangeError|SyntaxError/);
+ });
+});
+
+describe("pruefeSzene — Modell und Auftrag müssen sich decken, in beide Richtungen", () => {
+ const knoten = () => glbKnoten(new Uint8Array(readFileSync(MINI_GLB)).buffer);
+
+ it("passt: Demo-Fixture gegen den Auftrag des Bundles", () => {
+ expect(pruefeSzene(AUFTRAG, knoten())).toEqual({ ok: true, fehler: [] });
+ });
+
+ it("die benannte Lücke ist erlaubt: teil:Rw hat keine Karte, aber einen Grund — kein Fehler", () => {
+ expect(pruefeSzene(AUFTRAG, knoten()).ok).toBe(true);
+ expect(luecke(AUFTRAG, "teil:Rw")).toEqual({
+ aufbau: "rw-8@1",
+ grund: "kein Aufbau rw-8@1 im Katalogstand 2026-09-03 — Material noch offen",
+ });
+ expect(luecke(AUFTRAG, "teil:Se:links")).toBeUndefined();
+ });
+
+ it("ein Knoten, der weder Karte noch benannte Lücke hat, wird genannt", () => {
+ const k = knoten();
+ const r = pruefeSzene(AUFTRAG, { ...k, teile: [...k.teile, "teil:Xy"] });
+ expect(r.ok).toBe(false);
+ expect(r.fehler.join("\n")).toMatch(/teil:Xy.*ohne Karte/);
+ });
+
+ it("fehlt die Lücke in der Szene, fehlt ein Brett — auch das wird genannt", () => {
+ const k = knoten();
+ const r = pruefeSzene(AUFTRAG, { ...k, teile: k.teile.filter((t) => t !== "teil:Rw") });
+ expect(r.ok).toBe(false);
+ expect(r.fehler.join("\n")).toMatch(/teil:Rw.*nicht in der Szene/);
+ });
+
+ it("doppelte Knoten in der Szene sind ein Fehler, kein Mengenvergleich (Review craft#47)", () => {
+ const k = knoten();
+ const r = pruefeSzene(AUFTRAG, { ...k, teile: [...k.teile, "teil:Se:links"] });
+ expect(r.ok).toBe(false);
+ expect(r.fehler.join("\n")).toMatch(/teil:Se:links.*doppelt/);
+ });
+
+ it("eine Karte ohne Knoten wird genannt — Material ohne Brett", () => {
+ const k = knoten();
+ const r = pruefeSzene(AUFTRAG, { ...k, teile: k.teile.filter((t) => t !== "teil:Se:rechts") });
+ expect(r.ok).toBe(false);
+ expect(r.fehler.join("\n")).toMatch(/teil:Se:rechts.*nicht in der Szene/);
+ });
+
+ it("die falsche Wurzel ist das falsche Möbel — beide Namen stehen im Fehler", () => {
+ const r = pruefeSzene(AUFTRAG, { ...knoten(), wurzel: "moebel_anderes0002" });
+ expect(r.ok).toBe(false);
+ expect(r.fehler.join("\n")).toMatch(/moebel_anderes0002/);
+ expect(r.fehler.join("\n")).toMatch(/moebel_beispiel0001/);
+ });
+
+ it("meldet ALLE Abweichungen, nicht nur die erste", () => {
+ const k = knoten();
+ const r = pruefeSzene(AUFTRAG, {
+ wurzel: "moebel_anderes0002",
+ teile: [...k.teile.filter((t) => t !== "teil:Se:rechts"), "teil:Xy"],
+ });
+ expect(r.fehler).toHaveLength(3);
+ });
+
+ it("karteFuer: Schlüssel → Karte, unbekannter Schlüssel → undefined (kein Raten)", () => {
+ expect(karteFuer(AUFTRAG, "teil:Se:links")).toBe("teil_beispielse0links");
+ expect(karteFuer(AUFTRAG, "teil:Rw")).toBeUndefined();
+ });
+});
+
+
+describe("die Naht gegen ein echtes OCCT-Modell — nicht nur gegen das Fixture, das aus dem Auftrag erzeugt wurde", () => {
+ // Zwei Quellen: das CI-Fixture referenz-korpus.glb (echter FreeCAD-Export, gröber tesselliert,
+ // im Repo — kommt von Cody #2 aus dem Referenzplan) und das lokale Erzeugnis modell.glb
+ // (nicht im Repo). Fehlt BEIDES, wird übersprungen — und zwar ausgeschrieben: auf CI ist das
+ // so lange der Fall, bis das Fixture-Modell im Repo liegt. Kein Test, der immer grün ist.
+ const QUELLEN = [
+ join(__dirname, "fixtures/referenz-korpus.glb"),
+ join(BUNDLE, "modell.glb"),
+ ].filter((p) => existsSync(p));
+ const grund = QUELLEN.length ? "" : "kein OCCT-Modell vorhanden (weder fixtures/referenz-korpus.glb noch modell.glb) — auf CI immer übersprungen, bis das Fixture im Repo liegt";
+ it.skipIf(!QUELLEN.length)(`ein echtes FreeCAD-GLB (5 Knoten) passt zu auftrag.json — Knoten, Wurzel, kein Zirkel${grund ? " [" + grund + "]" : ""}`, () => {
+ for (const q of QUELLEN) {
+ const buf = new Uint8Array(readFileSync(q)).buffer;
+ const k = glbKnoten(buf);
+ expect(k.wurzel, q).toBe(AUFTRAG.moebel_id);
+ expect(k.teile, q).toHaveLength(5);
+ expect(pruefeSzene(AUFTRAG, k), q).toEqual({ ok: true, fehler: [] });
+ }
+ });
+ // Ohne Pflicht wird dieser Fall sichtbar übersprungen — kein »expect(true)«, das immer grün ist.
+ it.skipIf(process.env.WERKSTOFF_MODELL_PFLICHT !== "1")(
+ "mit WERKSTOFF_MODELL_PFLICHT=1 ist das Fehlen eines OCCT-Modells rot, nicht übersprungen",
+ () => {
+ expect(QUELLEN.length, grund).toBeGreaterThan(0);
+ },
+ );
+ it("das CI-Fixture referenz-korpus.glb ist ein FreeCAD-Erzeugnis mit Nuten, kein Zirkel aus auftrag.json", () => {
+ // Kommt aus cody-cad (Cody #2, 04.09.): Referenzplan @ 03040cb ohne die 104 Drillings, mit
+ // den 4 Nuten; FreeCAD 1.1.3, korpus_bauen → tessellate(0.1) → Import.export; 23.388 B.
+ const buf = new Uint8Array(readFileSync(join(__dirname, "fixtures/referenz-korpus.glb"))).buffer;
+ const len = new DataView(buf).getUint32(12, true);
+ const j = JSON.parse(new TextDecoder().decode(new Uint8Array(buf, 20, len))) as {
+ asset: { generator?: string };
+ meshes: unknown[];
+ };
+ expect(j.asset.generator).toMatch(/Open CASCADE/); // echtes OCCT, nicht der Test-Erzeuger
+ expect(j.meshes.length).toBe(5);
+ expect(buf.byteLength).toBeLessThan(250_000);
+ });
+});
diff --git a/apps/tischler/lib/werkstoff/auftrag.ts b/apps/tischler/lib/werkstoff/auftrag.ts
new file mode 100644
index 0000000..fe2a136
--- /dev/null
+++ b/apps/tischler/lib/werkstoff/auftrag.ts
@@ -0,0 +1,254 @@
+/**
+ * Der Auftrag im Offline-Bundle — die Klammer zwischen Konstruktion und Karte.
+ *
+ * cody-cad schreibt ihn im BuildPlan-Modus (`bauen --buildplan --revision`, #66): welches Möbel
+ * (`moebel_id`), welcher Plan (`buildplan_sha256`), welche Revision — und für jedes Teil die
+ * Brücke `schluessel` (Knotenname im 3D-Modell) → `werkstueck_id` (Karte). Ohne diese Klammer
+ * zeigt die Szene Bretter derselben Sorte; mit ihr dasselbe Brett wie in der Zeichnung.
+ *
+ * Vertrag (Cody #2, 04.09.): GLB-Knotennamen = `schluessel`, Wurzel = `moebel_id`. Geprüft wird in
+ * BEIDE Richtungen — ein Knoten ohne Karte ist ein Brett ohne Material, eine Karte ohne Knoten ist
+ * Material ohne Brett. Beides ist ein Fehler, keiner davon still.
+ */
+
+export interface AuftragTeil {
+ schluessel: string;
+ werkstueck_id: string;
+}
+
+/**
+ * Ein Teil des Plans, für das der Katalog keinen Aufbau kennt — benannt, mit Grund. Die Lücke
+ * wird getragen, nicht weggeschnitten (cody-cad `--ohne-karte`): der Plan bleibt ein
+ * konsistentes Möbel, das Brett steht in der Szene, und die Brille sagt, warum es keine Karte hat.
+ */
+export interface AuftragLuecke extends AuftragTeil {
+ aufbau: string;
+ grund: string;
+}
+
+export interface Auftrag {
+ moebel_id: string;
+ /**
+ * Was der Loader hier prüft: die Form (64 Hex) — sonst nichts. Dass es der kanonische Hash
+ * des Plans ist, aus dem die Karten stammen, garantiert cody-cad beim Erzeugen; hier wird es
+ * nicht nachgerechnet (dafür müsste JS Pythons Zahlendarstellung treffen, s. `karte.ts`).
+ * Was es NICHT beweist: dass das Modell in der Szene aus demselben Plan kommt. Referenz- und
+ * Demo-Plan trugen dieselbe `moebel_id` (Review craft#47, Cody #2) — die Wurzel unterscheidet
+ * Pläne nicht. Die Bindung Plan → Modell schließt erst `auftrag.modell.glb_sha256`
+ * (`bauen --modell`, cody-cad#68; Loader-Seite in #48).
+ */
+ buildplan_sha256: string;
+ revision: number;
+ /** Nur Teile MIT Karte — die Brücke Knotenname → Karte. */
+ teile: AuftragTeil[];
+ /** Teile ohne Karte, jedes mit Grund. Disjunkt zu `teile`; zusammen = Knoten des Modells. */
+ teile_ohne_karte: AuftragLuecke[];
+}
+
+const HEX64 = /^[0-9a-f]{64}$/;
+
+/** Strikt: was nicht die Form des Vertrags hat, ist kein Auftrag — mit dem Grund. */
+function pruefeAuftrag(d: unknown): Auftrag {
+ if (!d || typeof d !== "object") throw new Error("Auftrag ist kein Objekt");
+ const o = d as Record;
+ if (typeof o.moebel_id !== "string" || !o.moebel_id) throw new Error("Auftrag ohne moebel_id");
+ if (typeof o.buildplan_sha256 !== "string" || !HEX64.test(o.buildplan_sha256)) {
+ throw new Error("Auftrag ohne gültigen buildplan_sha256 (64 Hex-Zeichen)");
+ }
+ if (typeof o.revision !== "number" || !Number.isInteger(o.revision) || o.revision < 1) {
+ throw new Error("Auftrag ohne gültige revision (ganze Zahl ≥ 1)");
+ }
+ if (!Array.isArray(o.teile) || o.teile.length === 0) throw new Error("Auftrag ohne teile");
+ const schluessel = new Set();
+ const karten = new Set();
+ const teile: AuftragTeil[] = [];
+ for (const t of o.teile as unknown[]) {
+ const x = (t ?? {}) as Record;
+ if (typeof x.schluessel !== "string" || !x.schluessel) throw new Error("Teil ohne schluessel");
+ if (typeof x.werkstueck_id !== "string" || !x.werkstueck_id) {
+ throw new Error(`Teil ${x.schluessel} ohne werkstueck_id`);
+ }
+ if (schluessel.has(x.schluessel)) throw new Error(`Schlüssel ${x.schluessel} doppelt im Auftrag`);
+ if (karten.has(x.werkstueck_id)) throw new Error(`Karte ${x.werkstueck_id} doppelt im Auftrag`);
+ schluessel.add(x.schluessel);
+ karten.add(x.werkstueck_id);
+ teile.push({ schluessel: x.schluessel, werkstueck_id: x.werkstueck_id });
+ }
+ // Ein älteres Bundle trägt das Feld nicht: keine Lücke. Trägt es das Feld, gilt der Vertrag
+ // hart — Grund und Aufbau Pflicht, kein Schlüssel in beiden Listen.
+ const teile_ohne_karte: AuftragLuecke[] = [];
+ if (o.teile_ohne_karte !== undefined) {
+ if (!Array.isArray(o.teile_ohne_karte)) throw new Error("teile_ohne_karte ist keine Liste");
+ for (const l of o.teile_ohne_karte as unknown[]) {
+ const x = (l ?? {}) as Record;
+ if (typeof x.schluessel !== "string" || !x.schluessel) throw new Error("Lücke ohne schluessel");
+ if (typeof x.werkstueck_id !== "string" || !x.werkstueck_id) {
+ throw new Error(`Lücke ${x.schluessel} ohne werkstueck_id`);
+ }
+ if (typeof x.aufbau !== "string" || !x.aufbau) throw new Error(`Lücke ${x.schluessel} ohne aufbau`);
+ if (typeof x.grund !== "string" || !x.grund) {
+ throw new Error(`Lücke ${x.schluessel} ohne grund — eine Lücke ohne Grund ist eine weggeschnittene`);
+ }
+ if (schluessel.has(x.schluessel)) {
+ throw new Error(`Schlüssel ${x.schluessel} steht in beiden Listen — Karte oder Lücke, nicht beides`);
+ }
+ if (karten.has(x.werkstueck_id)) throw new Error(`Werkstück ${x.werkstueck_id} doppelt im Auftrag`);
+ schluessel.add(x.schluessel);
+ karten.add(x.werkstueck_id);
+ teile_ohne_karte.push({
+ schluessel: x.schluessel,
+ werkstueck_id: x.werkstueck_id,
+ aufbau: x.aufbau,
+ grund: x.grund,
+ });
+ }
+ }
+ return {
+ moebel_id: o.moebel_id,
+ buildplan_sha256: o.buildplan_sha256,
+ revision: o.revision,
+ teile,
+ teile_ohne_karte,
+ };
+}
+
+export async function ladeAuftrag(basis = "/werkstoff-bundle"): Promise {
+ const r = await fetch(`${basis}/auftrag.json`);
+ if (!r.ok) {
+ throw new Error(
+ `Kein Auftrag im Bundle (${r.status}) — das Bundle kennt Bretter derselben Sorte, ` +
+ "aber nicht dieses Möbel",
+ );
+ }
+ return pruefeAuftrag(await r.json());
+}
+
+export interface SzenenKnoten {
+ wurzel: string;
+ teile: string[];
+}
+
+/**
+ * Liest aus einem glTF-Binary (GLB) nur die Namen: die eine Wurzel der Szene und ihre Kinder.
+ * Kein Mesh, keine Geometrie — genau das, was der Vertrag verlangt, und ohne WebGL prüfbar.
+ *
+ * Vertrag (cody-cad `exportiere_glb_verifiziert`, festgeschrieben 04.09. mit Cody #2): GENAU
+ * zwei Ebenen — Wurzel = Möbel, Kinder = Teile. Ein Kind mit eigenen Kindern ist kein Teil und
+ * keine Gruppe, sondern ein Vertragsbruch; Rekursion würde Gruppen als Teile lesen.
+ */
+export function glbKnoten(buf: ArrayBuffer): SzenenKnoten {
+ // Der ganze Header, nicht nur das Magic (Review craft#47 Runde 2): Version, Gesamtlänge,
+ // Chunk-Typ, Chunk-Länge in beide Richtungen — jede Lüge ist ein Klartext-Fehler, nie ein
+ // RangeError oder SyntaxError aus der Tiefe.
+ const dv = new DataView(buf);
+ if (buf.byteLength < 20 || dv.getUint32(0, true) !== 0x46546c67) {
+ throw new Error("Kein glTF-Binary (Magic »glTF« fehlt)");
+ }
+ const version = dv.getUint32(4, true);
+ if (version !== 2) throw new Error(`glTF-Version ${version} — der Vertrag gilt für Version 2`);
+ const gesamt = dv.getUint32(8, true);
+ if (gesamt !== buf.byteLength) {
+ throw new Error(`glTF-Header lügt: Gesamtlänge ${gesamt}, Datei hat ${buf.byteLength} Bytes`);
+ }
+ const jsonLen = dv.getUint32(12, true);
+ if (dv.getUint32(16, true) !== 0x4e4f534a) throw new Error("glTF-Binary ohne JSON-Chunk");
+ if (20 + jsonLen > buf.byteLength) {
+ throw new Error(
+ `glTF-Header lügt: JSON-Chunk mit ${jsonLen} Bytes, Datei hat nur ${buf.byteLength}`,
+ );
+ }
+ let j: {
+ scenes?: Array<{ nodes?: number[] }>;
+ nodes?: Array<{ name?: string; children?: number[] }>;
+ scene?: number;
+ };
+ try {
+ j = JSON.parse(new TextDecoder().decode(new Uint8Array(buf, 20, jsonLen)));
+ } catch {
+ throw new Error(`glTF-JSON-Chunk unlesbar (${jsonLen} Bytes laut Header) — abgeschnitten oder kein JSON`);
+ }
+ const nodes = j.nodes ?? [];
+ const szene = j.scenes?.[j.scene ?? 0];
+ const wurzeln = szene?.nodes ?? [];
+ if (wurzeln.length !== 1) {
+ throw new Error(
+ `Szene hat ${wurzeln.length} Wurzeln — der Vertrag verlangt genau eine Wurzel (das Möbel)`,
+ );
+ }
+ const wurzelIdx = wurzeln[0];
+ const wurzel = wurzelIdx === undefined ? undefined : nodes[wurzelIdx];
+ if (!wurzel || !wurzel.name) {
+ throw new Error("Wurzel ohne Name — das Möbel ist nicht identifizierbar");
+ }
+ const kinder: number[] = wurzel.children ?? [];
+ const gesehen = new Set();
+ const teile = kinder.map((i) => {
+ const k = nodes[i];
+ const n = k?.name;
+ if (!n) throw new Error(`Knoten ${i} ohne Namen — er kann keine Karte tragen`);
+ if ((k?.children ?? []).length > 0) {
+ throw new Error(
+ `Knoten ${n} hat eigene Kinder — der Vertrag verlangt genau zwei Ebenen (Möbel → Teile)`,
+ );
+ }
+ if (gesehen.has(n)) throw new Error(`Knotenname ${n} doppelt — zwei Bretter mit einem Namen`);
+ gesehen.add(n);
+ return n;
+ });
+ return { wurzel: wurzel.name, teile };
+}
+
+export interface SzenenPruefung {
+ ok: boolean;
+ fehler: string[];
+}
+
+/**
+ * Beide Richtungen, alle Abweichungen — nicht nur die erste. Erlaubt in der Szene sind genau
+ * `teile ∪ teile_ohne_karte`; jedes davon muss auch da sein. Duplikate sind ein Fehler, kein
+ * Mengenvergleich (Review craft#47: `['teil:A','teil:A']` gegen `{A}` war ok — Fail-Open).
+ */
+export function pruefeSzene(auftrag: Auftrag, knoten: SzenenKnoten): SzenenPruefung {
+ const fehler: string[] = [];
+ if (knoten.wurzel !== auftrag.moebel_id) {
+ fehler.push(
+ `Falsches Möbel: die Szene heißt ${knoten.wurzel}, der Auftrag gilt für ${auftrag.moebel_id}`,
+ );
+ }
+ const erlaubt = new Set([
+ ...auftrag.teile.map((t) => t.schluessel),
+ ...auftrag.teile_ohne_karte.map((t) => t.schluessel),
+ ]);
+ const inSzene = new Set();
+ for (const s of knoten.teile) {
+ if (inSzene.has(s)) fehler.push(`Knoten ${s} doppelt in der Szene — zwei Bretter mit einem Namen`);
+ inSzene.add(s);
+ if (!erlaubt.has(s)) fehler.push(`Knoten ${s} ohne Karte im Auftrag — Brett ohne Material`);
+ }
+ for (const t of auftrag.teile) {
+ if (!inSzene.has(t.schluessel)) {
+ fehler.push(`Karte ${t.schluessel} nicht in der Szene — Material ohne Brett`);
+ }
+ }
+ for (const t of auftrag.teile_ohne_karte) {
+ if (!inSzene.has(t.schluessel)) {
+ fehler.push(`Lücke ${t.schluessel} nicht in der Szene — das Brett fehlt, nicht nur die Karte`);
+ }
+ }
+ return { ok: fehler.length === 0, fehler };
+}
+
+export function karteFuer(auftrag: Auftrag, schluessel: string): string | undefined {
+ return auftrag.teile.find((t) => t.schluessel === schluessel)?.werkstueck_id;
+}
+
+/** Die benannte Lücke zu einem Schlüssel — Aufbau und Grund, oder nichts. */
+export function luecke(auftrag: Auftrag, schluessel: string): { aufbau: string; grund: string } | undefined {
+ const l = auftrag.teile_ohne_karte.find((t) => t.schluessel === schluessel);
+ return l ? { aufbau: l.aufbau, grund: l.grund } : undefined;
+}
+
+/** »teil:Se:links« → »Se:links« — die Schaltfläche trägt den Schlüssel, nicht ein Wunschwort. */
+export function schluesselKurz(schluessel: string): string {
+ return schluessel.replace(/^teil:/, "");
+}
diff --git a/apps/tischler/lib/werkstoff/fixtures/demo-mini.glb b/apps/tischler/lib/werkstoff/fixtures/demo-mini.glb
new file mode 100644
index 0000000..f96593b
Binary files /dev/null and b/apps/tischler/lib/werkstoff/fixtures/demo-mini.glb differ
diff --git a/apps/tischler/lib/werkstoff/fixtures/referenz-korpus.glb b/apps/tischler/lib/werkstoff/fixtures/referenz-korpus.glb
new file mode 100644
index 0000000..6644ca1
Binary files /dev/null and b/apps/tischler/lib/werkstoff/fixtures/referenz-korpus.glb differ
diff --git a/apps/tischler/lib/werkstoff/karte.test.ts b/apps/tischler/lib/werkstoff/karte.test.ts
index 0ea2a73..e02f403 100644
--- a/apps/tischler/lib/werkstoff/karte.test.ts
+++ b/apps/tischler/lib/werkstoff/karte.test.ts
@@ -19,7 +19,7 @@ import {
const KARTE = JSON.parse(
readFileSync(
- join(__dirname, "../../public/werkstoff-bundle/karten/seite-links-890x555.json"),
+ join(__dirname, "../../public/werkstoff-bundle/karten/teil_beispielse0links.json"),
"utf8",
),
) as Materialkarte;
@@ -105,8 +105,8 @@ describe("ladeKarte", () => {
it("liefert die Karte, wenn Karte und Manifest zusammengehören", async () => {
vi.stubGlobal("fetch", stub());
- const k = await ladeKarte("boden-562x555");
- expect(k.werkstueck.id).toBe("boden-562x555");
+ const k = await ladeKarte("teil_beispielbo0unten");
+ expect(k.werkstueck.id).toBe("teil_beispielbo0unten");
vi.unstubAllGlobals();
});
@@ -120,7 +120,7 @@ describe("ladeKarte", () => {
// Ohne Manifest hieße "bekanntes Werkstück" nur: es steht in der Datei, die ich
// gerade gelesen habe. Die Karte belegte sich selbst.
vi.stubGlobal("fetch", stub((url, roh) => (url.includes("/manifeste/") ? null : roh)));
- await expect(ladeKarte("boden-562x555")).rejects.toThrow(/ohne Resolve-Manifest/);
+ await expect(ladeKarte("teil_beispielbo0unten")).rejects.toThrow(/ohne Resolve-Manifest/);
vi.unstubAllGlobals();
});
@@ -138,7 +138,7 @@ describe("ladeKarte", () => {
return JSON.stringify(o);
}),
);
- await expect(ladeKarte("boden-562x555")).rejects.toThrow(
+ await expect(ladeKarte("teil_beispielbo0unten")).rejects.toThrow(
/ohne gültigen Manifest-Hash/,
);
vi.unstubAllGlobals();
@@ -156,7 +156,7 @@ describe("ladeKarte", () => {
: roh,
),
);
- await expect(ladeKarte("boden-562x555")).rejects.toThrow(/Manifest gehört zu ein-anderes/);
+ await expect(ladeKarte("teil_beispielbo0unten")).rejects.toThrow(/Manifest gehört zu ein-anderes/);
vi.unstubAllGlobals();
});
@@ -169,7 +169,7 @@ describe("ladeKarte", () => {
: roh,
),
);
- await expect(ladeKarte("boden-562x555")).rejects.toThrow(/gehören nicht zusammen/);
+ await expect(ladeKarte("teil_beispielbo0unten")).rejects.toThrow(/gehören nicht zusammen/);
vi.unstubAllGlobals();
});
});
diff --git a/apps/tischler/public/werkstoff-bundle/auftrag.json b/apps/tischler/public/werkstoff-bundle/auftrag.json
new file mode 100644
index 0000000..418840e
--- /dev/null
+++ b/apps/tischler/public/werkstoff-bundle/auftrag.json
@@ -0,0 +1,31 @@
+{
+ "buildplan_sha256": "49499816f78a60c40d35268e2fb68e92a67f3bbf480834f3189a063e18c17cf8",
+ "moebel_id": "moebel_beispiel0001",
+ "revision": 3,
+ "teile": [
+ {
+ "schluessel": "teil:Bo:oben",
+ "werkstueck_id": "teil_beispielbo0oben"
+ },
+ {
+ "schluessel": "teil:Bo:unten",
+ "werkstueck_id": "teil_beispielbo0unten"
+ },
+ {
+ "schluessel": "teil:Se:links",
+ "werkstueck_id": "teil_beispielse0links"
+ },
+ {
+ "schluessel": "teil:Se:rechts",
+ "werkstueck_id": "teil_beispielse0rechts"
+ }
+ ],
+ "teile_ohne_karte": [
+ {
+ "aufbau": "rw-8@1",
+ "grund": "kein Aufbau rw-8@1 im Katalogstand 2026-09-03 — Material noch offen",
+ "schluessel": "teil:Rw",
+ "werkstueck_id": "teil_beispielrw000001"
+ }
+ ]
+}
diff --git a/apps/tischler/public/werkstoff-bundle/karten/boden-562x555.json b/apps/tischler/public/werkstoff-bundle/karten/teil_beispielbo0oben.json
similarity index 98%
rename from apps/tischler/public/werkstoff-bundle/karten/boden-562x555.json
rename to apps/tischler/public/werkstoff-bundle/karten/teil_beispielbo0oben.json
index b1b2bec..e518384 100644
--- a/apps/tischler/public/werkstoff-bundle/karten/boden-562x555.json
+++ b/apps/tischler/public/werkstoff-bundle/karten/teil_beispielbo0oben.json
@@ -339,7 +339,7 @@
],
"wert": 14.352
},
- "karte_sha256": "7f863d472a15d7cf1a4676d6c1e934120aa115efa713e51b5ac03fd962b2cc2e",
+ "karte_sha256": "4fd87039da1d7b107f9db11dbbb29628574e0d7db8a5e10bb97a63d04374b664",
"karteversion": 1,
"komponenten": [
{
@@ -878,7 +878,7 @@
]
}
],
- "resolve_manifest_sha256": "2539300205de77f8ecec3f5a40d525829039f7309c53d9002b0ea34784fabc49",
+ "resolve_manifest_sha256": "129f81aa35dc2ea0802a44cbf7e8671235b24fc0fb620772dee94f5a44d1f37c",
"schema": "werkstoff/karte.schema.json",
"unterlagen_ohne_verweis": [
{
@@ -926,7 +926,7 @@
],
"verbrauch": {
"ausgeschlossen": [],
- "flaeche_m2": 0.6238,
+ "flaeche_m2": 0.3119,
"freigabe": "annahme",
"positionen": [
{
@@ -936,7 +936,7 @@
"komponente": "egger-spanplatte-p2-19",
"revision": 1,
"rolle": "traeger",
- "wert": 0.6238
+ "wert": 0.3119
},
{
"bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
@@ -945,7 +945,7 @@
"komponente": "furnier-eiche-0-9-gemessert",
"revision": 1,
"rolle": "belag/oben",
- "wert": 0.6238
+ "wert": 0.3119
},
{
"bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
@@ -954,7 +954,7 @@
"komponente": "ponal-flaechenleim-pvac",
"revision": 1,
"rolle": "leim/oben",
- "wert": 74.9
+ "wert": 37.4
},
{
"bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
@@ -963,7 +963,7 @@
"komponente": "furnier-eiche-0-9-gemessert",
"revision": 1,
"rolle": "belag/unten",
- "wert": 0.6238
+ "wert": 0.3119
},
{
"bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
@@ -972,7 +972,7 @@
"komponente": "ponal-flaechenleim-pvac",
"revision": 1,
"rolle": "leim/unten",
- "wert": 74.9
+ "wert": 37.4
},
{
"bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
@@ -981,7 +981,7 @@
"komponente": "adler-aduro-legnopur-g10",
"revision": 1,
"rolle": "oberflaeche/oben/1-klarlack/netto",
- "wert": 124.8
+ "wert": 62.4
},
{
"bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
@@ -990,7 +990,7 @@
"komponente": "adler-aduro-legnopur-g10",
"revision": 1,
"rolle": "oberflaeche/oben/1-klarlack/brutto",
- "wert": 191.9
+ "wert": 96.0
},
{
"bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
@@ -999,7 +999,7 @@
"komponente": "adler-aduro-legnopur-g10",
"revision": 1,
"rolle": "oberflaeche/unten/1-klarlack/netto",
- "wert": 124.8
+ "wert": 62.4
},
{
"bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
@@ -1008,7 +1008,7 @@
"komponente": "adler-aduro-legnopur-g10",
"revision": 1,
"rolle": "oberflaeche/unten/1-klarlack/brutto",
- "wert": 191.9
+ "wert": 96.0
},
{
"bezeichnung": "Ostermann Furnierkante Eiche europäisch, geschliffen K180, 1,0 × 24 mm (Art. 070.4200)",
@@ -1017,7 +1017,7 @@
"komponente": "ostermann-furnierkante-eiche-1-0",
"revision": 1,
"rolle": "kante/vorne",
- "wert": 1.132
+ "wert": 0.566
},
{
"bezeichnung": "Jowatherm 280.30 (EVA-Schmelzkleber, ungefüllt, Nullfuge) — Kantenanleimen stationär",
@@ -1026,18 +1026,18 @@
"komponente": "jowatherm-280-30-eva",
"revision": 1,
"rolle": "kleber/vorne",
- "wert": 6.8
+ "wert": 3.4
}
],
- "werkstueck": "boden-562x555"
+ "werkstueck": "teil_beispielbo0oben"
},
"videos": [],
"werkstueck": {
- "anzahl": 2,
- "bezeichnung": "Boden (Korpus 600 breit, Seiten 19)",
+ "anzahl": 1,
+ "bezeichnung": "Boden Oben",
"faserrichtung": "laengs",
- "flaeche_m2": 0.6238,
- "id": "boden-562x555",
+ "flaeche_m2": 0.3119,
+ "id": "teil_beispielbo0oben",
"kanten": {},
"kontur": {
"breite": 555.0,
diff --git a/apps/tischler/public/werkstoff-bundle/karten/teil_beispielbo0unten.json b/apps/tischler/public/werkstoff-bundle/karten/teil_beispielbo0unten.json
new file mode 100644
index 0000000..0af7fe6
--- /dev/null
+++ b/apps/tischler/public/werkstoff-bundle/karten/teil_beispielbo0unten.json
@@ -0,0 +1,1048 @@
+{
+ "arbeitsfolge": [
+ {
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "nr": 1,
+ "parameter": {
+ "auftrag_g_m2": 120.0,
+ "beanspruchungsgruppe": "D1/D2 (EN 204)",
+ "faserrichtung": {
+ "oben": "laengs",
+ "unten": "laengs"
+ },
+ "holzfeuchte_max_prozent": "12 %",
+ "holzfeuchte_min_prozent": "8 %",
+ "klebstoff": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
+ "klebstoff_quelle": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "leim": "Arbeitsannahme PVAc (Ponal Flächenleim, Kaltpresse) — Alternative UF/Pressal (Heißpresse): Bernhard entscheidet",
+ "offene_zeit_min": 15.0,
+ "pressdruck_n_cm2": 20.0,
+ "presstemperatur_c": 60.0,
+ "presszeit_min": 4.0
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN 'Furnier im Innenausbau' (Initiative Furnier + Natur) / ÜK-Unterlage Furnieren",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ },
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [],
+ "typ": "furnieren",
+ "werkzeuge": [
+ "Furnierpresse (Kalt- oder Heißpresse)",
+ "Leimauftragswalze — Eiche + blankes Metall = Blauverfärbung (Gerbsäure)",
+ "Leimauftragswalze (kein blankes Metall bei Eiche — Blauverfärbung)",
+ "Kaltpresse / Furnierpresse ≤ 60 °C"
+ ]
+ },
+ {
+ "komponente": "ostermann-furnierkante-eiche-1-0",
+ "nr": 2,
+ "parameter": {
+ "dicke_mm": 1.0,
+ "kantenart": "furnierkante",
+ "kleber": "Jowatherm 280.30 (EVA-Schmelzkleber, ungefüllt, Nullfuge) — Kantenanleimen stationär",
+ "temperatur_c": 190.0
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ostermann Technisches Merkblatt Furnierkanten (01/2020)",
+ "stand": "2020-01-01",
+ "url": "https://web.ostermann.eu/mamdata/PDF_Daten/Technische_Merkblaetter/Kanten/Echtholz/Furnierkante_DE_ipdf_dase.pdf"
+ },
+ "regel": "kante_vor_nach_belag",
+ "seiten": [
+ "vorne"
+ ],
+ "sicherheit": [],
+ "typ": "kante",
+ "werkzeuge": [
+ "Kantenanleimmaschine / BAZ (EVA 190–210 °C)",
+ "Kappsäge, Bündigfräser, Ziehklinge, Schwabbelscheibe"
+ ]
+ },
+ {
+ "nr": 3,
+ "parameter": {
+ "korn_max": 180.0,
+ "vor": "beschichtung"
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN 'Furnier im Innenausbau' (Initiative Furnier + Natur) / ÜK-Unterlage Furnieren",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ },
+ "regel": "schleifgrenze_belag",
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [],
+ "typ": "schleifen",
+ "werkzeuge": []
+ },
+ {
+ "komponente": "adler-aduro-legnopur-g10",
+ "nr": 4,
+ "parameter": {
+ "auftrag": 1,
+ "auftragsmenge_g_m2": 100.0,
+ "glanzgrad": "10 GU",
+ "mischung.haerter": "10:1 PUR-Hardener 8419",
+ "mischung.topfzeit_h": "8 h",
+ "mischung.verduennung_prozent": "10 %",
+ "von": 2
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "rolle": "klarlack",
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [
+ "Atemschutz A2/P2",
+ "nur gewerbliche Verarbeitung"
+ ],
+ "typ": "auftragen",
+ "verfahren": "spritzen",
+ "werkzeuge": [
+ "Becherpistole Düse 1,8 mm, 2–3 bar",
+ "Airless Düse 0,23–0,33 mm, 100–120 bar"
+ ]
+ },
+ {
+ "komponente": "adler-aduro-legnopur-g10",
+ "nr": 5,
+ "parameter": {
+ "endhaerte_min": "2880 min",
+ "schleifbar_min": "120 min",
+ "stapelbar_min": "720 min"
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [],
+ "typ": "trocknen",
+ "werkzeuge": []
+ },
+ {
+ "komponente": "adler-aduro-legnopur-g10",
+ "nr": 6,
+ "parameter": {
+ "korn": 320.0
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "regel": "zwischenschliff_pflicht",
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [],
+ "typ": "zwischenschliff",
+ "werkzeuge": []
+ },
+ {
+ "komponente": "adler-aduro-legnopur-g10",
+ "nr": 7,
+ "parameter": {
+ "auftrag": 2,
+ "auftragsmenge_g_m2": 100.0,
+ "glanzgrad": "10 GU",
+ "mischung.haerter": "10:1 PUR-Hardener 8419",
+ "mischung.topfzeit_h": "8 h",
+ "mischung.verduennung_prozent": "10 %",
+ "von": 2
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "rolle": "klarlack",
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [
+ "Atemschutz A2/P2",
+ "nur gewerbliche Verarbeitung"
+ ],
+ "typ": "auftragen",
+ "verfahren": "spritzen",
+ "werkzeuge": [
+ "Becherpistole Düse 1,8 mm, 2–3 bar",
+ "Airless Düse 0,23–0,33 mm, 100–120 bar"
+ ]
+ },
+ {
+ "komponente": "adler-aduro-legnopur-g10",
+ "nr": 8,
+ "parameter": {
+ "endhaerte_min": "2880 min",
+ "schleifbar_min": "120 min",
+ "stapelbar_min": "720 min"
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [],
+ "typ": "trocknen",
+ "werkzeuge": []
+ }
+ ],
+ "aufbau": {
+ "bezeichnung": "EGGER Spanplatte P2 19 + Furnier Eiche 0,9 beidseitig + 2× ADLER G10 beidseitig + Furnierkante Eiche vorne",
+ "id": "eiche-furniert-p2-19-g10",
+ "revision": 1
+ },
+ "brand": {
+ "fehlend": [
+ "Prüfzeugnis (EN 13501-1) für den Aufbau eiche-furniert-p2-19-g10: Träger + Belag + Oberflächensystem als geprüftes System"
+ ],
+ "hinweise": [
+ {
+ "dok_ref": "EGGER TD-181 / Brandverhalten-Merkblatt",
+ "freigabe": "belegt",
+ "klasse": "D-s2,d0",
+ "komponente": "egger-spanplatte-p2-19",
+ "nachweistyp": "einzelbaustoff"
+ },
+ {
+ "freigabe": "annahme",
+ "klasse": "E",
+ "komponente": "ostermann-furnierkante-eiche-1-0",
+ "nachweistyp": "einzelbaustoff"
+ }
+ ],
+ "status": "nicht_nachgewiesen"
+ },
+ "dicke_mm": {
+ "ausgeschlossen": [
+ {
+ "grund": "Trockenschichtdicke nicht hinterlegt — nicht addiert",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche/oben/1-klarlack"
+ },
+ {
+ "grund": "Trockenschichtdicke nicht hinterlegt — nicht addiert",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche/unten/1-klarlack"
+ }
+ ],
+ "einheit": "mm",
+ "freigabe": "annahme",
+ "maximum": 21.5,
+ "minimum": 20.1,
+ "nominal": 20.8,
+ "positionen": [
+ {
+ "bezeichnung": "EGGER Spanplatte roh E1E05 TSCA P2 CE (Eurospan), 19 mm",
+ "einheit": "mm",
+ "freigabe": "annahme",
+ "komponente": "egger-spanplatte-p2-19",
+ "revision": 1,
+ "rolle": "traeger",
+ "wert": 19.0
+ },
+ {
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "einheit": "mm",
+ "freigabe": "meister",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "revision": 1,
+ "rolle": "belag/oben",
+ "wert": 0.9
+ },
+ {
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "einheit": "mm",
+ "freigabe": "meister",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "revision": 1,
+ "rolle": "belag/unten",
+ "wert": 0.9
+ }
+ ]
+ },
+ "dokumente_hinweis": "Unterlagen sind Verweise (URL, Seite, Hash) auf die Dokumente des Herstellers — nie deren Inhalt. Speichern, Durchsuchen oder Offline-Kopien erst nach Zustimmung des Herstellers.",
+ "freigabe": "annahme",
+ "gewicht_kg_m2": {
+ "ausgeschlossen": [
+ {
+ "grund": "Trockenmasse der Beschichtung nicht hinterlegt — nicht addiert",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche"
+ },
+ {
+ "grund": "Kante ist je lfm — braucht das Werkstück (siehe verbrauch)",
+ "komponente": "ostermann-furnierkante-eiche-1-0",
+ "revision": 1,
+ "rolle": "kante/vorne"
+ }
+ ],
+ "einheit": "kg/m2",
+ "freigabe": "annahme",
+ "positionen": [
+ {
+ "bezeichnung": "EGGER Spanplatte roh E1E05 TSCA P2 CE (Eurospan), 19 mm",
+ "einheit": "kg/m2",
+ "freigabe": "annahme",
+ "komponente": "egger-spanplatte-p2-19",
+ "revision": 1,
+ "rolle": "traeger",
+ "wert": 13.11
+ },
+ {
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "einheit": "kg/m2",
+ "freigabe": "annahme",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "revision": 1,
+ "rolle": "belag/oben",
+ "wert": 0.621
+ },
+ {
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "einheit": "kg/m2",
+ "freigabe": "annahme",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "revision": 1,
+ "rolle": "belag/unten",
+ "wert": 0.621
+ }
+ ],
+ "wert": 14.352
+ },
+ "karte_sha256": "5935fc020b748d8222fb65aa6ef77edc58b3ceb05b4f6f17e102862b25d309d9",
+ "karteversion": 1,
+ "komponenten": [
+ {
+ "art": "traeger",
+ "bezeichnung": "EGGER Spanplatte roh E1E05 TSCA P2 CE (Eurospan), 19 mm",
+ "freigabe": "annahme",
+ "hersteller": "EGGER",
+ "id": "egger-spanplatte-p2-19",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER Technisches Datenblatt TD-181 (E1E05 TSCA P2 CE), Rev. 08.04.2026",
+ "seite": "S. 1",
+ "stand": "2026-04-08",
+ "url": "https://binary.egger.link/pis/978585f4-777c-45bf-96bb-3cfa40df2bae/Technical_datasheet_E1E05_TSCA_P2_CE_TD-181_Deutsch"
+ },
+ "revision": 1,
+ "rolle": "traeger",
+ "typ": "spanplatte",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER TD-181 Technisches Datenblatt E1E05 TSCA P2 CE",
+ "seiten": "S. 1–2",
+ "sha256": "1b0d66099daba0c8159b0100bb5a5cd5015cb5d0240ebc2bf266fb4ff12d82e0",
+ "stand": "2026-04-08",
+ "typ": "datenblatt",
+ "url": "https://binary.egger.link/pis/978585f4-777c-45bf-96bb-3cfa40df2bae/Technical_datasheet_E1E05_TSCA_P2_CE_TD-181_Deutsch"
+ },
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER Verarbeitungshinweise Dekorative Platten und Trägerplatten",
+ "seiten": "S. 1–20",
+ "sha256": "e9fdcbea5e943a199f94178d89ffa83d20224b1cf25758fd229b6c8fe195a574",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://binary.egger.link/pis/4a389dc5-b778-426f-ada5-03d2c6e7eee3/Verarbeitungshinweise_Dekorative_Platten_und_Traegerplatten_Deutsch"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "Platten wie Kantenmaterial im Raumklima konditionieren (EGGER Verarbeitungshinweise S. 10)"
+ ],
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER Verarbeitungshinweise Dekorative Platten und Trägerplatten",
+ "url": "https://binary.egger.link/pis/4a389dc5-b778-426f-ada5-03d2c6e7eee3/Verarbeitungshinweise_Dekorative_Platten_und_Traegerplatten_Deutsch"
+ },
+ "schritt": "lagern"
+ },
+ {
+ "hinweise": [
+ "EGGER-Werkzeugempfehlung ist ein separates PDF — noch nicht beschafft (Bernhards Kundenkonto)"
+ ],
+ "schritt": "saegen"
+ }
+ ]
+ },
+ {
+ "art": "belag",
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "freigabe": "annahme",
+ "id": "furnier-eiche-0-9-gemessert",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN 'Furnier im Innenausbau' (Initiative Furnier + Natur) / ÜK-Unterlage Furnieren",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ },
+ "revision": 1,
+ "rolle": "belag/oben",
+ "typ": "furnier",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN — Furnier im Innenausbau (Verarbeitung)",
+ "seiten": "S. 1–62",
+ "sha256": "3ab3f0fd735dae1a5a5b543e503f93b73f41effb273d08b65948f54b7be6578c",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "kühl, nicht in geheizten Räumen, möglichst wenig Tageslicht (ÜK4 S. 9)",
+ "Gegenzug: Rückseite gleiche Dicke (ÜK4 S. 9)"
+ ],
+ "parameter": {
+ "rf_max_prozent": {
+ "einheit": "%",
+ "freigabe": "belegt",
+ "wert": 70
+ },
+ "rf_min_prozent": {
+ "einheit": "%",
+ "freigabe": "belegt",
+ "wert": 60
+ }
+ },
+ "schritt": "lagern"
+ },
+ {
+ "hinweise": [
+ "Eiche: Probefurnierung mit PVAc (Ponal); sonst Pressal (UF)",
+ "max. 24 h zwischen Schliff und Lack"
+ ],
+ "schritt": "pressen",
+ "werkzeuge": [
+ "Furnierpresse (Kalt- oder Heißpresse)",
+ "Leimauftragswalze — Eiche + blankes Metall = Blauverfärbung (Gerbsäure)"
+ ]
+ }
+ ]
+ },
+ {
+ "art": "klebstoff",
+ "bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
+ "freigabe": "annahme",
+ "hersteller": "Henkel (Ponal)",
+ "id": "ponal-flaechenleim-pvac",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "seite": "S. 1–2"
+ },
+ "revision": 1,
+ "rolle": "klebstoff/belag/oben",
+ "sicherheit": {
+ "hinweise": [
+ "Sicherheitsdatenblatt Henkel — beschaffen (nicht recherchiert)"
+ ]
+ },
+ "typ": "pvac",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "typ": "datenblatt"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "einseitig auf die Trägerplatte auftragen",
+ "Einlege-/Schließzeit kurz halten"
+ ],
+ "schritt": "pressen",
+ "werkzeuge": [
+ "Leimauftragswalze (kein blankes Metall bei Eiche — Blauverfärbung)",
+ "Kaltpresse / Furnierpresse ≤ 60 °C"
+ ]
+ },
+ {
+ "hinweise": [
+ "frostfrei lagern (Dispersionsleim)"
+ ],
+ "schritt": "lagern"
+ }
+ ]
+ },
+ {
+ "art": "belag",
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "freigabe": "annahme",
+ "id": "furnier-eiche-0-9-gemessert",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN 'Furnier im Innenausbau' (Initiative Furnier + Natur) / ÜK-Unterlage Furnieren",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ },
+ "revision": 1,
+ "rolle": "belag/unten",
+ "typ": "furnier",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN — Furnier im Innenausbau (Verarbeitung)",
+ "seiten": "S. 1–62",
+ "sha256": "3ab3f0fd735dae1a5a5b543e503f93b73f41effb273d08b65948f54b7be6578c",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "kühl, nicht in geheizten Räumen, möglichst wenig Tageslicht (ÜK4 S. 9)",
+ "Gegenzug: Rückseite gleiche Dicke (ÜK4 S. 9)"
+ ],
+ "parameter": {
+ "rf_max_prozent": {
+ "einheit": "%",
+ "freigabe": "belegt",
+ "wert": 70
+ },
+ "rf_min_prozent": {
+ "einheit": "%",
+ "freigabe": "belegt",
+ "wert": 60
+ }
+ },
+ "schritt": "lagern"
+ },
+ {
+ "hinweise": [
+ "Eiche: Probefurnierung mit PVAc (Ponal); sonst Pressal (UF)",
+ "max. 24 h zwischen Schliff und Lack"
+ ],
+ "schritt": "pressen",
+ "werkzeuge": [
+ "Furnierpresse (Kalt- oder Heißpresse)",
+ "Leimauftragswalze — Eiche + blankes Metall = Blauverfärbung (Gerbsäure)"
+ ]
+ }
+ ]
+ },
+ {
+ "art": "klebstoff",
+ "bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
+ "freigabe": "annahme",
+ "hersteller": "Henkel (Ponal)",
+ "id": "ponal-flaechenleim-pvac",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "seite": "S. 1–2"
+ },
+ "revision": 1,
+ "rolle": "klebstoff/belag/unten",
+ "sicherheit": {
+ "hinweise": [
+ "Sicherheitsdatenblatt Henkel — beschaffen (nicht recherchiert)"
+ ]
+ },
+ "typ": "pvac",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "typ": "datenblatt"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "einseitig auf die Trägerplatte auftragen",
+ "Einlege-/Schließzeit kurz halten"
+ ],
+ "schritt": "pressen",
+ "werkzeuge": [
+ "Leimauftragswalze (kein blankes Metall bei Eiche — Blauverfärbung)",
+ "Kaltpresse / Furnierpresse ≤ 60 °C"
+ ]
+ },
+ {
+ "hinweise": [
+ "frostfrei lagern (Dispersionsleim)"
+ ],
+ "schritt": "lagern"
+ }
+ ]
+ },
+ {
+ "art": "system",
+ "bezeichnung": "2× ADLER G10 Klarlack (1× Grund + Zwischenschliff + 1× Deck, gleiches Produkt) — Produktwahl offen: Legnopur (Standard) / Antiscratch / Bluefin Unistar",
+ "freigabe": "annahme",
+ "id": "adler-g10-2x-klarlack",
+ "revision": 1,
+ "rolle": "system/oben",
+ "schichten": [
+ {
+ "anzahl": 2,
+ "komponente": {
+ "id": "adler-aduro-legnopur-g10",
+ "revision": 1
+ },
+ "rolle": "klarlack",
+ "verfahren": "spritzen"
+ }
+ ],
+ "unterlagen": []
+ },
+ {
+ "art": "system",
+ "bezeichnung": "2× ADLER G10 Klarlack (1× Grund + Zwischenschliff + 1× Deck, gleiches Produkt) — Produktwahl offen: Legnopur (Standard) / Antiscratch / Bluefin Unistar",
+ "freigabe": "annahme",
+ "id": "adler-g10-2x-klarlack",
+ "revision": 1,
+ "rolle": "system/unten",
+ "schichten": [
+ {
+ "anzahl": 2,
+ "komponente": {
+ "id": "adler-aduro-legnopur-g10",
+ "revision": 1
+ },
+ "rolle": "klarlack",
+ "verfahren": "spritzen"
+ }
+ ],
+ "unterlagen": []
+ },
+ {
+ "art": "beschichtung",
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "freigabe": "annahme",
+ "hersteller": "ADLER-Werk Lackfabrik, Schwaz",
+ "id": "adler-aduro-legnopur-g10",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "revision": 1,
+ "rolle": "oberflaeche/oben/1-klarlack",
+ "sicherheit": {
+ "hinweise": [
+ "Sicherheitsdatenblatt auf adler-lacke.com nur eingeloggt — beschaffen"
+ ],
+ "schutz": [
+ "Atemschutz A2/P2",
+ "nur gewerbliche Verarbeitung"
+ ]
+ },
+ "typ": "lack",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER TMB 2513 ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "seiten": "S. 1–4",
+ "sha256": "3802082c34744eb165c12d8df2a6d01afca051fc6930961a6b2401edf7152dcc",
+ "typ": "datenblatt",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ {
+ "dokument": "ADLER Sicherheitsdatenblatt 2513 (nur mit Kundenkonto)",
+ "fingerabdruck_offen": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "seiten": "gesamtes Dokument",
+ "typ": "sdb",
+ "url": "https://www.adler-lacke.com/at/produkte"
+ },
+ {
+ "dokument": "ADLER Arbeitsrichtlinie ARL 131 (PUR-Möbellacke) — auf Anfrage",
+ "fingerabdruck_offen": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "seiten": "gesamtes Dokument",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://www.adler-lacke.com/de/service-ratgeber/arbeitsrichtlinien"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "Verarbeitungstemperatur ≥ +10 °C (Aduro) bzw. ≥ +15 °C (Bluefin)",
+ "hohe Luftfeuchte verlängert die Trocknung"
+ ],
+ "schritt": "spritzen",
+ "werkzeuge": [
+ "Becherpistole Düse 1,8 mm, 2–3 bar",
+ "Airless Düse 0,23–0,33 mm, 100–120 bar"
+ ]
+ },
+ {
+ "hinweise": [
+ "≥ 1 Jahr, frostfrei, < 30 °C"
+ ],
+ "schritt": "lagern"
+ }
+ ]
+ },
+ {
+ "art": "beschichtung",
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "freigabe": "annahme",
+ "hersteller": "ADLER-Werk Lackfabrik, Schwaz",
+ "id": "adler-aduro-legnopur-g10",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "revision": 1,
+ "rolle": "oberflaeche/unten/1-klarlack",
+ "sicherheit": {
+ "hinweise": [
+ "Sicherheitsdatenblatt auf adler-lacke.com nur eingeloggt — beschaffen"
+ ],
+ "schutz": [
+ "Atemschutz A2/P2",
+ "nur gewerbliche Verarbeitung"
+ ]
+ },
+ "typ": "lack",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER TMB 2513 ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "seiten": "S. 1–4",
+ "sha256": "3802082c34744eb165c12d8df2a6d01afca051fc6930961a6b2401edf7152dcc",
+ "typ": "datenblatt",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ {
+ "dokument": "ADLER Sicherheitsdatenblatt 2513 (nur mit Kundenkonto)",
+ "fingerabdruck_offen": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "seiten": "gesamtes Dokument",
+ "typ": "sdb",
+ "url": "https://www.adler-lacke.com/at/produkte"
+ },
+ {
+ "dokument": "ADLER Arbeitsrichtlinie ARL 131 (PUR-Möbellacke) — auf Anfrage",
+ "fingerabdruck_offen": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "seiten": "gesamtes Dokument",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://www.adler-lacke.com/de/service-ratgeber/arbeitsrichtlinien"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "Verarbeitungstemperatur ≥ +10 °C (Aduro) bzw. ≥ +15 °C (Bluefin)",
+ "hohe Luftfeuchte verlängert die Trocknung"
+ ],
+ "schritt": "spritzen",
+ "werkzeuge": [
+ "Becherpistole Düse 1,8 mm, 2–3 bar",
+ "Airless Düse 0,23–0,33 mm, 100–120 bar"
+ ]
+ },
+ {
+ "hinweise": [
+ "≥ 1 Jahr, frostfrei, < 30 °C"
+ ],
+ "schritt": "lagern"
+ }
+ ]
+ },
+ {
+ "art": "kante",
+ "artikelnr": "070.4200",
+ "bezeichnung": "Ostermann Furnierkante Eiche europäisch, geschliffen K180, 1,0 × 24 mm (Art. 070.4200)",
+ "freigabe": "annahme",
+ "hersteller": "Ostermann",
+ "id": "ostermann-furnierkante-eiche-1-0",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ostermann Technisches Merkblatt Furnierkanten (01/2020)",
+ "stand": "2020-01-01",
+ "url": "https://web.ostermann.eu/mamdata/PDF_Daten/Technische_Merkblaetter/Kanten/Echtholz/Furnierkante_DE_ipdf_dase.pdf"
+ },
+ "revision": 1,
+ "rolle": "kante/vorne",
+ "typ": "furnierkante",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ostermann TM Furnierkanten",
+ "seiten": "S. 1–2",
+ "sha256": "50860b11af6ba61b68d593991c01b5a9ce148dda628a20acf292036eb4d2f250",
+ "typ": "datenblatt",
+ "url": "https://web.ostermann.eu/mamdata/PDF_Daten/Technische_Merkblaetter/Kanten/Echtholz/Furnierkante_DE_ipdf_dase.pdf"
+ },
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Kleiberit Infoblatt Kantenverklebung",
+ "seiten": "S. 1–4",
+ "sha256": "45597e449c7307a5c900d6399d0466bf6c983d24176c64ac7af51d79c42834fb",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://legacy.kleiberit.com/fileadmin/Content_new/Infoblaetter/deutsch/Kantenverklebung_D.pdf"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "Kante wie Trägerplatte im Raumklima konditionieren (EGGER)",
+ "Rückseite Primer — verbessert Verankerung, verhindert Austritt von Holzinhaltsstoffen"
+ ],
+ "schritt": "kanten",
+ "werkzeuge": [
+ "Kantenanleimmaschine / BAZ (EVA 190–210 °C)",
+ "Kappsäge, Bündigfräser, Ziehklinge, Schwabbelscheibe"
+ ]
+ },
+ {
+ "hinweise": [
+ "vollflächig waagerecht, 20 °C, 50–60 % rF, kein UV"
+ ],
+ "schritt": "lagern"
+ },
+ {
+ "hinweise": [
+ "lackierfähig geschliffen K180 — kann sofort lackiert werden"
+ ],
+ "schritt": "schleifen"
+ }
+ ]
+ },
+ {
+ "art": "klebstoff",
+ "bezeichnung": "Jowatherm 280.30 (EVA-Schmelzkleber, ungefüllt, Nullfuge) — Kantenanleimen stationär",
+ "freigabe": "annahme",
+ "hersteller": "Jowat",
+ "id": "jowatherm-280-30-eva",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Jowat Produktinformation Jowatherm 280.30"
+ },
+ "revision": 1,
+ "rolle": "klebstoff/kante/vorne",
+ "sicherheit": {
+ "hinweise": [
+ "heißer Schmelzkleber: Verbrennungsgefahr; SDB Jowat beschaffen"
+ ]
+ },
+ "typ": "eva_schmelz",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Jowat TDS Jowatherm 280.30/31 (Kante, Stand 12/25)",
+ "seiten": "S. 1–3",
+ "sha256": "68aafb838580eb574888ffa160f3d38e0b3d495b80241ae1d06b55a5399be45c",
+ "stand": "2025-12-01",
+ "typ": "datenblatt",
+ "url": "https://d3files.jowat-cloud.com/technical-data-sheets-v2/280.30/31/TD28030-28031-Kante_German.PDF"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "erste Andruckrolle regelmäßig prüfen",
+ "Kante und Platte im Raumklima konditionieren"
+ ],
+ "schritt": "kanten",
+ "werkzeuge": [
+ "Kantenanleimmaschine / BAZ (Durchlauf, Stationär, Softforming)"
+ ]
+ }
+ ]
+ }
+ ],
+ "resolve_manifest_sha256": "bc29b2392ef8e7e67c9c30da8de8f1fa380828b1036a45579db8fa3ffbd3d3fe",
+ "schema": "werkstoff/karte.schema.json",
+ "unterlagen_ohne_verweis": [
+ {
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "grund": "kein Link hinterlegt",
+ "id": "ponal-flaechenleim-pvac",
+ "rolle": "klebstoff/belag/oben",
+ "typ": "datenblatt"
+ },
+ {
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "grund": "kein Link hinterlegt",
+ "id": "ponal-flaechenleim-pvac",
+ "rolle": "klebstoff/belag/unten",
+ "typ": "datenblatt"
+ },
+ {
+ "dokument": "ADLER Sicherheitsdatenblatt 2513 (nur mit Kundenkonto)",
+ "grund": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "id": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/oben/1-klarlack",
+ "typ": "sdb"
+ },
+ {
+ "dokument": "ADLER Arbeitsrichtlinie ARL 131 (PUR-Möbellacke) — auf Anfrage",
+ "grund": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "id": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/oben/1-klarlack",
+ "typ": "verarbeitungsrichtlinie"
+ },
+ {
+ "dokument": "ADLER Sicherheitsdatenblatt 2513 (nur mit Kundenkonto)",
+ "grund": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "id": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/unten/1-klarlack",
+ "typ": "sdb"
+ },
+ {
+ "dokument": "ADLER Arbeitsrichtlinie ARL 131 (PUR-Möbellacke) — auf Anfrage",
+ "grund": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "id": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/unten/1-klarlack",
+ "typ": "verarbeitungsrichtlinie"
+ }
+ ],
+ "verbrauch": {
+ "ausgeschlossen": [],
+ "flaeche_m2": 0.3119,
+ "freigabe": "annahme",
+ "positionen": [
+ {
+ "bezeichnung": "EGGER Spanplatte roh E1E05 TSCA P2 CE (Eurospan), 19 mm",
+ "einheit": "m2",
+ "freigabe": "belegt",
+ "komponente": "egger-spanplatte-p2-19",
+ "revision": 1,
+ "rolle": "traeger",
+ "wert": 0.3119
+ },
+ {
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "einheit": "m2",
+ "freigabe": "belegt",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "revision": 1,
+ "rolle": "belag/oben",
+ "wert": 0.3119
+ },
+ {
+ "bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "ponal-flaechenleim-pvac",
+ "revision": 1,
+ "rolle": "leim/oben",
+ "wert": 37.4
+ },
+ {
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "einheit": "m2",
+ "freigabe": "belegt",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "revision": 1,
+ "rolle": "belag/unten",
+ "wert": 0.3119
+ },
+ {
+ "bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "ponal-flaechenleim-pvac",
+ "revision": 1,
+ "rolle": "leim/unten",
+ "wert": 37.4
+ },
+ {
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "einheit": "g",
+ "freigabe": "belegt",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche/oben/1-klarlack/netto",
+ "wert": 62.4
+ },
+ {
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche/oben/1-klarlack/brutto",
+ "wert": 96.0
+ },
+ {
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "einheit": "g",
+ "freigabe": "belegt",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche/unten/1-klarlack/netto",
+ "wert": 62.4
+ },
+ {
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche/unten/1-klarlack/brutto",
+ "wert": 96.0
+ },
+ {
+ "bezeichnung": "Ostermann Furnierkante Eiche europäisch, geschliffen K180, 1,0 × 24 mm (Art. 070.4200)",
+ "einheit": "lfm",
+ "freigabe": "annahme",
+ "komponente": "ostermann-furnierkante-eiche-1-0",
+ "revision": 1,
+ "rolle": "kante/vorne",
+ "wert": 0.566
+ },
+ {
+ "bezeichnung": "Jowatherm 280.30 (EVA-Schmelzkleber, ungefüllt, Nullfuge) — Kantenanleimen stationär",
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "jowatherm-280-30-eva",
+ "revision": 1,
+ "rolle": "kleber/vorne",
+ "wert": 3.4
+ }
+ ],
+ "werkstueck": "teil_beispielbo0unten"
+ },
+ "videos": [],
+ "werkstueck": {
+ "anzahl": 1,
+ "bezeichnung": "Boden Unten",
+ "faserrichtung": "laengs",
+ "flaeche_m2": 0.3119,
+ "id": "teil_beispielbo0unten",
+ "kanten": {},
+ "kontur": {
+ "breite": 555.0,
+ "laenge": 562.0,
+ "typ": "rechteck"
+ }
+ }
+}
diff --git a/apps/tischler/public/werkstoff-bundle/karten/seite-links-890x555.json b/apps/tischler/public/werkstoff-bundle/karten/teil_beispielse0links.json
similarity index 97%
rename from apps/tischler/public/werkstoff-bundle/karten/seite-links-890x555.json
rename to apps/tischler/public/werkstoff-bundle/karten/teil_beispielse0links.json
index aa95e50..c5bba10 100644
--- a/apps/tischler/public/werkstoff-bundle/karten/seite-links-890x555.json
+++ b/apps/tischler/public/werkstoff-bundle/karten/teil_beispielse0links.json
@@ -339,7 +339,7 @@
],
"wert": 14.352
},
- "karte_sha256": "6be589ab4182b84dc6e340848520ed52ef2d6f2240055290834174f04b745a34",
+ "karte_sha256": "81ec973b54fc8d99450aa4a286fc8833ca73a63fdd26d0e7478d42ef5c2352e4",
"karteversion": 1,
"komponenten": [
{
@@ -878,7 +878,7 @@
]
}
],
- "resolve_manifest_sha256": "803aa37c60bfdb9aed0f79ba309c42c59c5fea4a5a8f94edb3e7e02463d89dee",
+ "resolve_manifest_sha256": "e7ed33f6c8b864ead3d8d2406075ace94154298b08835872ab5da71705f5c7c8",
"schema": "werkstoff/karte.schema.json",
"unterlagen_ohne_verweis": [
{
@@ -926,7 +926,7 @@
],
"verbrauch": {
"ausgeschlossen": [],
- "flaeche_m2": 0.9879,
+ "flaeche_m2": 0.494,
"freigabe": "annahme",
"positionen": [
{
@@ -936,7 +936,7 @@
"komponente": "egger-spanplatte-p2-19",
"revision": 1,
"rolle": "traeger",
- "wert": 0.9879
+ "wert": 0.494
},
{
"bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
@@ -945,7 +945,7 @@
"komponente": "furnier-eiche-0-9-gemessert",
"revision": 1,
"rolle": "belag/oben",
- "wert": 0.9879
+ "wert": 0.494
},
{
"bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
@@ -954,7 +954,7 @@
"komponente": "ponal-flaechenleim-pvac",
"revision": 1,
"rolle": "leim/oben",
- "wert": 118.5
+ "wert": 59.3
},
{
"bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
@@ -963,7 +963,7 @@
"komponente": "furnier-eiche-0-9-gemessert",
"revision": 1,
"rolle": "belag/unten",
- "wert": 0.9879
+ "wert": 0.494
},
{
"bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
@@ -972,7 +972,7 @@
"komponente": "ponal-flaechenleim-pvac",
"revision": 1,
"rolle": "leim/unten",
- "wert": 118.5
+ "wert": 59.3
},
{
"bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
@@ -981,7 +981,7 @@
"komponente": "adler-aduro-legnopur-g10",
"revision": 1,
"rolle": "oberflaeche/oben/1-klarlack/netto",
- "wert": 197.6
+ "wert": 98.8
},
{
"bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
@@ -990,7 +990,7 @@
"komponente": "adler-aduro-legnopur-g10",
"revision": 1,
"rolle": "oberflaeche/oben/1-klarlack/brutto",
- "wert": 304.0
+ "wert": 152.0
},
{
"bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
@@ -999,7 +999,7 @@
"komponente": "adler-aduro-legnopur-g10",
"revision": 1,
"rolle": "oberflaeche/unten/1-klarlack/netto",
- "wert": 197.6
+ "wert": 98.8
},
{
"bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
@@ -1008,7 +1008,7 @@
"komponente": "adler-aduro-legnopur-g10",
"revision": 1,
"rolle": "oberflaeche/unten/1-klarlack/brutto",
- "wert": 304.0
+ "wert": 152.0
},
{
"bezeichnung": "Ostermann Furnierkante Eiche europäisch, geschliffen K180, 1,0 × 24 mm (Art. 070.4200)",
@@ -1017,7 +1017,7 @@
"komponente": "ostermann-furnierkante-eiche-1-0",
"revision": 1,
"rolle": "kante/vorne",
- "wert": 1.788
+ "wert": 0.894
},
{
"bezeichnung": "Jowatherm 280.30 (EVA-Schmelzkleber, ungefüllt, Nullfuge) — Kantenanleimen stationär",
@@ -1026,24 +1026,19 @@
"komponente": "jowatherm-280-30-eva",
"revision": 1,
"rolle": "kleber/vorne",
- "wert": 10.7
+ "wert": 5.4
}
],
- "werkstueck": "seite-links-890x555"
+ "werkstueck": "teil_beispielse0links"
},
"videos": [],
"werkstueck": {
- "anzahl": 2,
- "bezeichnung": "Seite links (Bernhards Korpus 890 × 555)",
+ "anzahl": 1,
+ "bezeichnung": "Seite Links",
"faserrichtung": "laengs",
- "flaeche_m2": 0.9879,
- "id": "seite-links-890x555",
- "kanten": {
- "vorne": {
- "id": "ostermann-furnierkante-eiche-1-0",
- "revision": 1
- }
- },
+ "flaeche_m2": 0.494,
+ "id": "teil_beispielse0links",
+ "kanten": {},
"kontur": {
"breite": 555.0,
"laenge": 890.0,
diff --git a/apps/tischler/public/werkstoff-bundle/karten/teil_beispielse0rechts.json b/apps/tischler/public/werkstoff-bundle/karten/teil_beispielse0rechts.json
new file mode 100644
index 0000000..9e19512
--- /dev/null
+++ b/apps/tischler/public/werkstoff-bundle/karten/teil_beispielse0rechts.json
@@ -0,0 +1,1048 @@
+{
+ "arbeitsfolge": [
+ {
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "nr": 1,
+ "parameter": {
+ "auftrag_g_m2": 120.0,
+ "beanspruchungsgruppe": "D1/D2 (EN 204)",
+ "faserrichtung": {
+ "oben": "laengs",
+ "unten": "laengs"
+ },
+ "holzfeuchte_max_prozent": "12 %",
+ "holzfeuchte_min_prozent": "8 %",
+ "klebstoff": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
+ "klebstoff_quelle": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "leim": "Arbeitsannahme PVAc (Ponal Flächenleim, Kaltpresse) — Alternative UF/Pressal (Heißpresse): Bernhard entscheidet",
+ "offene_zeit_min": 15.0,
+ "pressdruck_n_cm2": 20.0,
+ "presstemperatur_c": 60.0,
+ "presszeit_min": 4.0
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN 'Furnier im Innenausbau' (Initiative Furnier + Natur) / ÜK-Unterlage Furnieren",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ },
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [],
+ "typ": "furnieren",
+ "werkzeuge": [
+ "Furnierpresse (Kalt- oder Heißpresse)",
+ "Leimauftragswalze — Eiche + blankes Metall = Blauverfärbung (Gerbsäure)",
+ "Leimauftragswalze (kein blankes Metall bei Eiche — Blauverfärbung)",
+ "Kaltpresse / Furnierpresse ≤ 60 °C"
+ ]
+ },
+ {
+ "komponente": "ostermann-furnierkante-eiche-1-0",
+ "nr": 2,
+ "parameter": {
+ "dicke_mm": 1.0,
+ "kantenart": "furnierkante",
+ "kleber": "Jowatherm 280.30 (EVA-Schmelzkleber, ungefüllt, Nullfuge) — Kantenanleimen stationär",
+ "temperatur_c": 190.0
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ostermann Technisches Merkblatt Furnierkanten (01/2020)",
+ "stand": "2020-01-01",
+ "url": "https://web.ostermann.eu/mamdata/PDF_Daten/Technische_Merkblaetter/Kanten/Echtholz/Furnierkante_DE_ipdf_dase.pdf"
+ },
+ "regel": "kante_vor_nach_belag",
+ "seiten": [
+ "vorne"
+ ],
+ "sicherheit": [],
+ "typ": "kante",
+ "werkzeuge": [
+ "Kantenanleimmaschine / BAZ (EVA 190–210 °C)",
+ "Kappsäge, Bündigfräser, Ziehklinge, Schwabbelscheibe"
+ ]
+ },
+ {
+ "nr": 3,
+ "parameter": {
+ "korn_max": 180.0,
+ "vor": "beschichtung"
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN 'Furnier im Innenausbau' (Initiative Furnier + Natur) / ÜK-Unterlage Furnieren",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ },
+ "regel": "schleifgrenze_belag",
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [],
+ "typ": "schleifen",
+ "werkzeuge": []
+ },
+ {
+ "komponente": "adler-aduro-legnopur-g10",
+ "nr": 4,
+ "parameter": {
+ "auftrag": 1,
+ "auftragsmenge_g_m2": 100.0,
+ "glanzgrad": "10 GU",
+ "mischung.haerter": "10:1 PUR-Hardener 8419",
+ "mischung.topfzeit_h": "8 h",
+ "mischung.verduennung_prozent": "10 %",
+ "von": 2
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "rolle": "klarlack",
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [
+ "Atemschutz A2/P2",
+ "nur gewerbliche Verarbeitung"
+ ],
+ "typ": "auftragen",
+ "verfahren": "spritzen",
+ "werkzeuge": [
+ "Becherpistole Düse 1,8 mm, 2–3 bar",
+ "Airless Düse 0,23–0,33 mm, 100–120 bar"
+ ]
+ },
+ {
+ "komponente": "adler-aduro-legnopur-g10",
+ "nr": 5,
+ "parameter": {
+ "endhaerte_min": "2880 min",
+ "schleifbar_min": "120 min",
+ "stapelbar_min": "720 min"
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [],
+ "typ": "trocknen",
+ "werkzeuge": []
+ },
+ {
+ "komponente": "adler-aduro-legnopur-g10",
+ "nr": 6,
+ "parameter": {
+ "korn": 320.0
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "regel": "zwischenschliff_pflicht",
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [],
+ "typ": "zwischenschliff",
+ "werkzeuge": []
+ },
+ {
+ "komponente": "adler-aduro-legnopur-g10",
+ "nr": 7,
+ "parameter": {
+ "auftrag": 2,
+ "auftragsmenge_g_m2": 100.0,
+ "glanzgrad": "10 GU",
+ "mischung.haerter": "10:1 PUR-Hardener 8419",
+ "mischung.topfzeit_h": "8 h",
+ "mischung.verduennung_prozent": "10 %",
+ "von": 2
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "rolle": "klarlack",
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [
+ "Atemschutz A2/P2",
+ "nur gewerbliche Verarbeitung"
+ ],
+ "typ": "auftragen",
+ "verfahren": "spritzen",
+ "werkzeuge": [
+ "Becherpistole Düse 1,8 mm, 2–3 bar",
+ "Airless Düse 0,23–0,33 mm, 100–120 bar"
+ ]
+ },
+ {
+ "komponente": "adler-aduro-legnopur-g10",
+ "nr": 8,
+ "parameter": {
+ "endhaerte_min": "2880 min",
+ "schleifbar_min": "120 min",
+ "stapelbar_min": "720 min"
+ },
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "seiten": [
+ "oben",
+ "unten"
+ ],
+ "sicherheit": [],
+ "typ": "trocknen",
+ "werkzeuge": []
+ }
+ ],
+ "aufbau": {
+ "bezeichnung": "EGGER Spanplatte P2 19 + Furnier Eiche 0,9 beidseitig + 2× ADLER G10 beidseitig + Furnierkante Eiche vorne",
+ "id": "eiche-furniert-p2-19-g10",
+ "revision": 1
+ },
+ "brand": {
+ "fehlend": [
+ "Prüfzeugnis (EN 13501-1) für den Aufbau eiche-furniert-p2-19-g10: Träger + Belag + Oberflächensystem als geprüftes System"
+ ],
+ "hinweise": [
+ {
+ "dok_ref": "EGGER TD-181 / Brandverhalten-Merkblatt",
+ "freigabe": "belegt",
+ "klasse": "D-s2,d0",
+ "komponente": "egger-spanplatte-p2-19",
+ "nachweistyp": "einzelbaustoff"
+ },
+ {
+ "freigabe": "annahme",
+ "klasse": "E",
+ "komponente": "ostermann-furnierkante-eiche-1-0",
+ "nachweistyp": "einzelbaustoff"
+ }
+ ],
+ "status": "nicht_nachgewiesen"
+ },
+ "dicke_mm": {
+ "ausgeschlossen": [
+ {
+ "grund": "Trockenschichtdicke nicht hinterlegt — nicht addiert",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche/oben/1-klarlack"
+ },
+ {
+ "grund": "Trockenschichtdicke nicht hinterlegt — nicht addiert",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche/unten/1-klarlack"
+ }
+ ],
+ "einheit": "mm",
+ "freigabe": "annahme",
+ "maximum": 21.5,
+ "minimum": 20.1,
+ "nominal": 20.8,
+ "positionen": [
+ {
+ "bezeichnung": "EGGER Spanplatte roh E1E05 TSCA P2 CE (Eurospan), 19 mm",
+ "einheit": "mm",
+ "freigabe": "annahme",
+ "komponente": "egger-spanplatte-p2-19",
+ "revision": 1,
+ "rolle": "traeger",
+ "wert": 19.0
+ },
+ {
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "einheit": "mm",
+ "freigabe": "meister",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "revision": 1,
+ "rolle": "belag/oben",
+ "wert": 0.9
+ },
+ {
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "einheit": "mm",
+ "freigabe": "meister",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "revision": 1,
+ "rolle": "belag/unten",
+ "wert": 0.9
+ }
+ ]
+ },
+ "dokumente_hinweis": "Unterlagen sind Verweise (URL, Seite, Hash) auf die Dokumente des Herstellers — nie deren Inhalt. Speichern, Durchsuchen oder Offline-Kopien erst nach Zustimmung des Herstellers.",
+ "freigabe": "annahme",
+ "gewicht_kg_m2": {
+ "ausgeschlossen": [
+ {
+ "grund": "Trockenmasse der Beschichtung nicht hinterlegt — nicht addiert",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche"
+ },
+ {
+ "grund": "Kante ist je lfm — braucht das Werkstück (siehe verbrauch)",
+ "komponente": "ostermann-furnierkante-eiche-1-0",
+ "revision": 1,
+ "rolle": "kante/vorne"
+ }
+ ],
+ "einheit": "kg/m2",
+ "freigabe": "annahme",
+ "positionen": [
+ {
+ "bezeichnung": "EGGER Spanplatte roh E1E05 TSCA P2 CE (Eurospan), 19 mm",
+ "einheit": "kg/m2",
+ "freigabe": "annahme",
+ "komponente": "egger-spanplatte-p2-19",
+ "revision": 1,
+ "rolle": "traeger",
+ "wert": 13.11
+ },
+ {
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "einheit": "kg/m2",
+ "freigabe": "annahme",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "revision": 1,
+ "rolle": "belag/oben",
+ "wert": 0.621
+ },
+ {
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "einheit": "kg/m2",
+ "freigabe": "annahme",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "revision": 1,
+ "rolle": "belag/unten",
+ "wert": 0.621
+ }
+ ],
+ "wert": 14.352
+ },
+ "karte_sha256": "09d7fb7407987a229fce61d97146b8ff2dad2b316711b04029cd327ccaf61518",
+ "karteversion": 1,
+ "komponenten": [
+ {
+ "art": "traeger",
+ "bezeichnung": "EGGER Spanplatte roh E1E05 TSCA P2 CE (Eurospan), 19 mm",
+ "freigabe": "annahme",
+ "hersteller": "EGGER",
+ "id": "egger-spanplatte-p2-19",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER Technisches Datenblatt TD-181 (E1E05 TSCA P2 CE), Rev. 08.04.2026",
+ "seite": "S. 1",
+ "stand": "2026-04-08",
+ "url": "https://binary.egger.link/pis/978585f4-777c-45bf-96bb-3cfa40df2bae/Technical_datasheet_E1E05_TSCA_P2_CE_TD-181_Deutsch"
+ },
+ "revision": 1,
+ "rolle": "traeger",
+ "typ": "spanplatte",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER TD-181 Technisches Datenblatt E1E05 TSCA P2 CE",
+ "seiten": "S. 1–2",
+ "sha256": "1b0d66099daba0c8159b0100bb5a5cd5015cb5d0240ebc2bf266fb4ff12d82e0",
+ "stand": "2026-04-08",
+ "typ": "datenblatt",
+ "url": "https://binary.egger.link/pis/978585f4-777c-45bf-96bb-3cfa40df2bae/Technical_datasheet_E1E05_TSCA_P2_CE_TD-181_Deutsch"
+ },
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER Verarbeitungshinweise Dekorative Platten und Trägerplatten",
+ "seiten": "S. 1–20",
+ "sha256": "e9fdcbea5e943a199f94178d89ffa83d20224b1cf25758fd229b6c8fe195a574",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://binary.egger.link/pis/4a389dc5-b778-426f-ada5-03d2c6e7eee3/Verarbeitungshinweise_Dekorative_Platten_und_Traegerplatten_Deutsch"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "Platten wie Kantenmaterial im Raumklima konditionieren (EGGER Verarbeitungshinweise S. 10)"
+ ],
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER Verarbeitungshinweise Dekorative Platten und Trägerplatten",
+ "url": "https://binary.egger.link/pis/4a389dc5-b778-426f-ada5-03d2c6e7eee3/Verarbeitungshinweise_Dekorative_Platten_und_Traegerplatten_Deutsch"
+ },
+ "schritt": "lagern"
+ },
+ {
+ "hinweise": [
+ "EGGER-Werkzeugempfehlung ist ein separates PDF — noch nicht beschafft (Bernhards Kundenkonto)"
+ ],
+ "schritt": "saegen"
+ }
+ ]
+ },
+ {
+ "art": "belag",
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "freigabe": "annahme",
+ "id": "furnier-eiche-0-9-gemessert",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN 'Furnier im Innenausbau' (Initiative Furnier + Natur) / ÜK-Unterlage Furnieren",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ },
+ "revision": 1,
+ "rolle": "belag/oben",
+ "typ": "furnier",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN — Furnier im Innenausbau (Verarbeitung)",
+ "seiten": "S. 1–62",
+ "sha256": "3ab3f0fd735dae1a5a5b543e503f93b73f41effb273d08b65948f54b7be6578c",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "kühl, nicht in geheizten Räumen, möglichst wenig Tageslicht (ÜK4 S. 9)",
+ "Gegenzug: Rückseite gleiche Dicke (ÜK4 S. 9)"
+ ],
+ "parameter": {
+ "rf_max_prozent": {
+ "einheit": "%",
+ "freigabe": "belegt",
+ "wert": 70
+ },
+ "rf_min_prozent": {
+ "einheit": "%",
+ "freigabe": "belegt",
+ "wert": 60
+ }
+ },
+ "schritt": "lagern"
+ },
+ {
+ "hinweise": [
+ "Eiche: Probefurnierung mit PVAc (Ponal); sonst Pressal (UF)",
+ "max. 24 h zwischen Schliff und Lack"
+ ],
+ "schritt": "pressen",
+ "werkzeuge": [
+ "Furnierpresse (Kalt- oder Heißpresse)",
+ "Leimauftragswalze — Eiche + blankes Metall = Blauverfärbung (Gerbsäure)"
+ ]
+ }
+ ]
+ },
+ {
+ "art": "klebstoff",
+ "bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
+ "freigabe": "annahme",
+ "hersteller": "Henkel (Ponal)",
+ "id": "ponal-flaechenleim-pvac",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "seite": "S. 1–2"
+ },
+ "revision": 1,
+ "rolle": "klebstoff/belag/oben",
+ "sicherheit": {
+ "hinweise": [
+ "Sicherheitsdatenblatt Henkel — beschaffen (nicht recherchiert)"
+ ]
+ },
+ "typ": "pvac",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "typ": "datenblatt"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "einseitig auf die Trägerplatte auftragen",
+ "Einlege-/Schließzeit kurz halten"
+ ],
+ "schritt": "pressen",
+ "werkzeuge": [
+ "Leimauftragswalze (kein blankes Metall bei Eiche — Blauverfärbung)",
+ "Kaltpresse / Furnierpresse ≤ 60 °C"
+ ]
+ },
+ {
+ "hinweise": [
+ "frostfrei lagern (Dispersionsleim)"
+ ],
+ "schritt": "lagern"
+ }
+ ]
+ },
+ {
+ "art": "belag",
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "freigabe": "annahme",
+ "id": "furnier-eiche-0-9-gemessert",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN 'Furnier im Innenausbau' (Initiative Furnier + Natur) / ÜK-Unterlage Furnieren",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ },
+ "revision": 1,
+ "rolle": "belag/unten",
+ "typ": "furnier",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN — Furnier im Innenausbau (Verarbeitung)",
+ "seiten": "S. 1–62",
+ "sha256": "3ab3f0fd735dae1a5a5b543e503f93b73f41effb273d08b65948f54b7be6578c",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "kühl, nicht in geheizten Räumen, möglichst wenig Tageslicht (ÜK4 S. 9)",
+ "Gegenzug: Rückseite gleiche Dicke (ÜK4 S. 9)"
+ ],
+ "parameter": {
+ "rf_max_prozent": {
+ "einheit": "%",
+ "freigabe": "belegt",
+ "wert": 70
+ },
+ "rf_min_prozent": {
+ "einheit": "%",
+ "freigabe": "belegt",
+ "wert": 60
+ }
+ },
+ "schritt": "lagern"
+ },
+ {
+ "hinweise": [
+ "Eiche: Probefurnierung mit PVAc (Ponal); sonst Pressal (UF)",
+ "max. 24 h zwischen Schliff und Lack"
+ ],
+ "schritt": "pressen",
+ "werkzeuge": [
+ "Furnierpresse (Kalt- oder Heißpresse)",
+ "Leimauftragswalze — Eiche + blankes Metall = Blauverfärbung (Gerbsäure)"
+ ]
+ }
+ ]
+ },
+ {
+ "art": "klebstoff",
+ "bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
+ "freigabe": "annahme",
+ "hersteller": "Henkel (Ponal)",
+ "id": "ponal-flaechenleim-pvac",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "seite": "S. 1–2"
+ },
+ "revision": 1,
+ "rolle": "klebstoff/belag/unten",
+ "sicherheit": {
+ "hinweise": [
+ "Sicherheitsdatenblatt Henkel — beschaffen (nicht recherchiert)"
+ ]
+ },
+ "typ": "pvac",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "typ": "datenblatt"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "einseitig auf die Trägerplatte auftragen",
+ "Einlege-/Schließzeit kurz halten"
+ ],
+ "schritt": "pressen",
+ "werkzeuge": [
+ "Leimauftragswalze (kein blankes Metall bei Eiche — Blauverfärbung)",
+ "Kaltpresse / Furnierpresse ≤ 60 °C"
+ ]
+ },
+ {
+ "hinweise": [
+ "frostfrei lagern (Dispersionsleim)"
+ ],
+ "schritt": "lagern"
+ }
+ ]
+ },
+ {
+ "art": "system",
+ "bezeichnung": "2× ADLER G10 Klarlack (1× Grund + Zwischenschliff + 1× Deck, gleiches Produkt) — Produktwahl offen: Legnopur (Standard) / Antiscratch / Bluefin Unistar",
+ "freigabe": "annahme",
+ "id": "adler-g10-2x-klarlack",
+ "revision": 1,
+ "rolle": "system/oben",
+ "schichten": [
+ {
+ "anzahl": 2,
+ "komponente": {
+ "id": "adler-aduro-legnopur-g10",
+ "revision": 1
+ },
+ "rolle": "klarlack",
+ "verfahren": "spritzen"
+ }
+ ],
+ "unterlagen": []
+ },
+ {
+ "art": "system",
+ "bezeichnung": "2× ADLER G10 Klarlack (1× Grund + Zwischenschliff + 1× Deck, gleiches Produkt) — Produktwahl offen: Legnopur (Standard) / Antiscratch / Bluefin Unistar",
+ "freigabe": "annahme",
+ "id": "adler-g10-2x-klarlack",
+ "revision": 1,
+ "rolle": "system/unten",
+ "schichten": [
+ {
+ "anzahl": 2,
+ "komponente": {
+ "id": "adler-aduro-legnopur-g10",
+ "revision": 1
+ },
+ "rolle": "klarlack",
+ "verfahren": "spritzen"
+ }
+ ],
+ "unterlagen": []
+ },
+ {
+ "art": "beschichtung",
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "freigabe": "annahme",
+ "hersteller": "ADLER-Werk Lackfabrik, Schwaz",
+ "id": "adler-aduro-legnopur-g10",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "revision": 1,
+ "rolle": "oberflaeche/oben/1-klarlack",
+ "sicherheit": {
+ "hinweise": [
+ "Sicherheitsdatenblatt auf adler-lacke.com nur eingeloggt — beschaffen"
+ ],
+ "schutz": [
+ "Atemschutz A2/P2",
+ "nur gewerbliche Verarbeitung"
+ ]
+ },
+ "typ": "lack",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER TMB 2513 ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "seiten": "S. 1–4",
+ "sha256": "3802082c34744eb165c12d8df2a6d01afca051fc6930961a6b2401edf7152dcc",
+ "typ": "datenblatt",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ {
+ "dokument": "ADLER Sicherheitsdatenblatt 2513 (nur mit Kundenkonto)",
+ "fingerabdruck_offen": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "seiten": "gesamtes Dokument",
+ "typ": "sdb",
+ "url": "https://www.adler-lacke.com/at/produkte"
+ },
+ {
+ "dokument": "ADLER Arbeitsrichtlinie ARL 131 (PUR-Möbellacke) — auf Anfrage",
+ "fingerabdruck_offen": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "seiten": "gesamtes Dokument",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://www.adler-lacke.com/de/service-ratgeber/arbeitsrichtlinien"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "Verarbeitungstemperatur ≥ +10 °C (Aduro) bzw. ≥ +15 °C (Bluefin)",
+ "hohe Luftfeuchte verlängert die Trocknung"
+ ],
+ "schritt": "spritzen",
+ "werkzeuge": [
+ "Becherpistole Düse 1,8 mm, 2–3 bar",
+ "Airless Düse 0,23–0,33 mm, 100–120 bar"
+ ]
+ },
+ {
+ "hinweise": [
+ "≥ 1 Jahr, frostfrei, < 30 °C"
+ ],
+ "schritt": "lagern"
+ }
+ ]
+ },
+ {
+ "art": "beschichtung",
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "freigabe": "annahme",
+ "hersteller": "ADLER-Werk Lackfabrik, Schwaz",
+ "id": "adler-aduro-legnopur-g10",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "revision": 1,
+ "rolle": "oberflaeche/unten/1-klarlack",
+ "sicherheit": {
+ "hinweise": [
+ "Sicherheitsdatenblatt auf adler-lacke.com nur eingeloggt — beschaffen"
+ ],
+ "schutz": [
+ "Atemschutz A2/P2",
+ "nur gewerbliche Verarbeitung"
+ ]
+ },
+ "typ": "lack",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER TMB 2513 ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "seiten": "S. 1–4",
+ "sha256": "3802082c34744eb165c12d8df2a6d01afca051fc6930961a6b2401edf7152dcc",
+ "typ": "datenblatt",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ {
+ "dokument": "ADLER Sicherheitsdatenblatt 2513 (nur mit Kundenkonto)",
+ "fingerabdruck_offen": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "seiten": "gesamtes Dokument",
+ "typ": "sdb",
+ "url": "https://www.adler-lacke.com/at/produkte"
+ },
+ {
+ "dokument": "ADLER Arbeitsrichtlinie ARL 131 (PUR-Möbellacke) — auf Anfrage",
+ "fingerabdruck_offen": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "seiten": "gesamtes Dokument",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://www.adler-lacke.com/de/service-ratgeber/arbeitsrichtlinien"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "Verarbeitungstemperatur ≥ +10 °C (Aduro) bzw. ≥ +15 °C (Bluefin)",
+ "hohe Luftfeuchte verlängert die Trocknung"
+ ],
+ "schritt": "spritzen",
+ "werkzeuge": [
+ "Becherpistole Düse 1,8 mm, 2–3 bar",
+ "Airless Düse 0,23–0,33 mm, 100–120 bar"
+ ]
+ },
+ {
+ "hinweise": [
+ "≥ 1 Jahr, frostfrei, < 30 °C"
+ ],
+ "schritt": "lagern"
+ }
+ ]
+ },
+ {
+ "art": "kante",
+ "artikelnr": "070.4200",
+ "bezeichnung": "Ostermann Furnierkante Eiche europäisch, geschliffen K180, 1,0 × 24 mm (Art. 070.4200)",
+ "freigabe": "annahme",
+ "hersteller": "Ostermann",
+ "id": "ostermann-furnierkante-eiche-1-0",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ostermann Technisches Merkblatt Furnierkanten (01/2020)",
+ "stand": "2020-01-01",
+ "url": "https://web.ostermann.eu/mamdata/PDF_Daten/Technische_Merkblaetter/Kanten/Echtholz/Furnierkante_DE_ipdf_dase.pdf"
+ },
+ "revision": 1,
+ "rolle": "kante/vorne",
+ "typ": "furnierkante",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ostermann TM Furnierkanten",
+ "seiten": "S. 1–2",
+ "sha256": "50860b11af6ba61b68d593991c01b5a9ce148dda628a20acf292036eb4d2f250",
+ "typ": "datenblatt",
+ "url": "https://web.ostermann.eu/mamdata/PDF_Daten/Technische_Merkblaetter/Kanten/Echtholz/Furnierkante_DE_ipdf_dase.pdf"
+ },
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Kleiberit Infoblatt Kantenverklebung",
+ "seiten": "S. 1–4",
+ "sha256": "45597e449c7307a5c900d6399d0466bf6c983d24176c64ac7af51d79c42834fb",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://legacy.kleiberit.com/fileadmin/Content_new/Infoblaetter/deutsch/Kantenverklebung_D.pdf"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "Kante wie Trägerplatte im Raumklima konditionieren (EGGER)",
+ "Rückseite Primer — verbessert Verankerung, verhindert Austritt von Holzinhaltsstoffen"
+ ],
+ "schritt": "kanten",
+ "werkzeuge": [
+ "Kantenanleimmaschine / BAZ (EVA 190–210 °C)",
+ "Kappsäge, Bündigfräser, Ziehklinge, Schwabbelscheibe"
+ ]
+ },
+ {
+ "hinweise": [
+ "vollflächig waagerecht, 20 °C, 50–60 % rF, kein UV"
+ ],
+ "schritt": "lagern"
+ },
+ {
+ "hinweise": [
+ "lackierfähig geschliffen K180 — kann sofort lackiert werden"
+ ],
+ "schritt": "schleifen"
+ }
+ ]
+ },
+ {
+ "art": "klebstoff",
+ "bezeichnung": "Jowatherm 280.30 (EVA-Schmelzkleber, ungefüllt, Nullfuge) — Kantenanleimen stationär",
+ "freigabe": "annahme",
+ "hersteller": "Jowat",
+ "id": "jowatherm-280-30-eva",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Jowat Produktinformation Jowatherm 280.30"
+ },
+ "revision": 1,
+ "rolle": "klebstoff/kante/vorne",
+ "sicherheit": {
+ "hinweise": [
+ "heißer Schmelzkleber: Verbrennungsgefahr; SDB Jowat beschaffen"
+ ]
+ },
+ "typ": "eva_schmelz",
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Jowat TDS Jowatherm 280.30/31 (Kante, Stand 12/25)",
+ "seiten": "S. 1–3",
+ "sha256": "68aafb838580eb574888ffa160f3d38e0b3d495b80241ae1d06b55a5399be45c",
+ "stand": "2025-12-01",
+ "typ": "datenblatt",
+ "url": "https://d3files.jowat-cloud.com/technical-data-sheets-v2/280.30/31/TD28030-28031-Kante_German.PDF"
+ }
+ ],
+ "verarbeitung": [
+ {
+ "hinweise": [
+ "erste Andruckrolle regelmäßig prüfen",
+ "Kante und Platte im Raumklima konditionieren"
+ ],
+ "schritt": "kanten",
+ "werkzeuge": [
+ "Kantenanleimmaschine / BAZ (Durchlauf, Stationär, Softforming)"
+ ]
+ }
+ ]
+ }
+ ],
+ "resolve_manifest_sha256": "7113369780cade95bc8252b687e072666321ac133f22d528498055612728e9a6",
+ "schema": "werkstoff/karte.schema.json",
+ "unterlagen_ohne_verweis": [
+ {
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "grund": "kein Link hinterlegt",
+ "id": "ponal-flaechenleim-pvac",
+ "rolle": "klebstoff/belag/oben",
+ "typ": "datenblatt"
+ },
+ {
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "grund": "kein Link hinterlegt",
+ "id": "ponal-flaechenleim-pvac",
+ "rolle": "klebstoff/belag/unten",
+ "typ": "datenblatt"
+ },
+ {
+ "dokument": "ADLER Sicherheitsdatenblatt 2513 (nur mit Kundenkonto)",
+ "grund": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "id": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/oben/1-klarlack",
+ "typ": "sdb"
+ },
+ {
+ "dokument": "ADLER Arbeitsrichtlinie ARL 131 (PUR-Möbellacke) — auf Anfrage",
+ "grund": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "id": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/oben/1-klarlack",
+ "typ": "verarbeitungsrichtlinie"
+ },
+ {
+ "dokument": "ADLER Sicherheitsdatenblatt 2513 (nur mit Kundenkonto)",
+ "grund": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "id": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/unten/1-klarlack",
+ "typ": "sdb"
+ },
+ {
+ "dokument": "ADLER Arbeitsrichtlinie ARL 131 (PUR-Möbellacke) — auf Anfrage",
+ "grund": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "id": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/unten/1-klarlack",
+ "typ": "verarbeitungsrichtlinie"
+ }
+ ],
+ "verbrauch": {
+ "ausgeschlossen": [],
+ "flaeche_m2": 0.494,
+ "freigabe": "annahme",
+ "positionen": [
+ {
+ "bezeichnung": "EGGER Spanplatte roh E1E05 TSCA P2 CE (Eurospan), 19 mm",
+ "einheit": "m2",
+ "freigabe": "belegt",
+ "komponente": "egger-spanplatte-p2-19",
+ "revision": 1,
+ "rolle": "traeger",
+ "wert": 0.494
+ },
+ {
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "einheit": "m2",
+ "freigabe": "belegt",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "revision": 1,
+ "rolle": "belag/oben",
+ "wert": 0.494
+ },
+ {
+ "bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "ponal-flaechenleim-pvac",
+ "revision": 1,
+ "rolle": "leim/oben",
+ "wert": 59.3
+ },
+ {
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "einheit": "m2",
+ "freigabe": "belegt",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "revision": 1,
+ "rolle": "belag/unten",
+ "wert": 0.494
+ },
+ {
+ "bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "ponal-flaechenleim-pvac",
+ "revision": 1,
+ "rolle": "leim/unten",
+ "wert": 59.3
+ },
+ {
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "einheit": "g",
+ "freigabe": "belegt",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche/oben/1-klarlack/netto",
+ "wert": 98.8
+ },
+ {
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche/oben/1-klarlack/brutto",
+ "wert": 152.0
+ },
+ {
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "einheit": "g",
+ "freigabe": "belegt",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche/unten/1-klarlack/netto",
+ "wert": 98.8
+ },
+ {
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "adler-aduro-legnopur-g10",
+ "revision": 1,
+ "rolle": "oberflaeche/unten/1-klarlack/brutto",
+ "wert": 152.0
+ },
+ {
+ "bezeichnung": "Ostermann Furnierkante Eiche europäisch, geschliffen K180, 1,0 × 24 mm (Art. 070.4200)",
+ "einheit": "lfm",
+ "freigabe": "annahme",
+ "komponente": "ostermann-furnierkante-eiche-1-0",
+ "revision": 1,
+ "rolle": "kante/vorne",
+ "wert": 0.894
+ },
+ {
+ "bezeichnung": "Jowatherm 280.30 (EVA-Schmelzkleber, ungefüllt, Nullfuge) — Kantenanleimen stationär",
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "jowatherm-280-30-eva",
+ "revision": 1,
+ "rolle": "kleber/vorne",
+ "wert": 5.4
+ }
+ ],
+ "werkstueck": "teil_beispielse0rechts"
+ },
+ "videos": [],
+ "werkstueck": {
+ "anzahl": 1,
+ "bezeichnung": "Seite Rechts",
+ "faserrichtung": "laengs",
+ "flaeche_m2": 0.494,
+ "id": "teil_beispielse0rechts",
+ "kanten": {},
+ "kontur": {
+ "breite": 555.0,
+ "laenge": 890.0,
+ "typ": "rechteck"
+ }
+ }
+}
diff --git a/apps/tischler/public/werkstoff-bundle/manifeste/boden-562x555.json b/apps/tischler/public/werkstoff-bundle/manifeste/teil_beispielbo0oben.json
similarity index 96%
rename from apps/tischler/public/werkstoff-bundle/manifeste/boden-562x555.json
rename to apps/tischler/public/werkstoff-bundle/manifeste/teil_beispielbo0oben.json
index 176fc5c..e697c46 100644
--- a/apps/tischler/public/werkstoff-bundle/manifeste/boden-562x555.json
+++ b/apps/tischler/public/werkstoff-bundle/manifeste/teil_beispielbo0oben.json
@@ -33,7 +33,7 @@
"min": 20.1,
"nominal": 20.8
},
- "flaeche_m2": 0.6238,
+ "flaeche_m2": 0.3119,
"gewicht_kg_m2": {
"freigabe": "annahme",
"wert": 14.352
@@ -44,77 +44,77 @@
"freigabe": "belegt",
"komponente": "egger-spanplatte-p2-19",
"rolle": "traeger",
- "wert": 0.6238
+ "wert": 0.3119
},
{
"einheit": "m2",
"freigabe": "belegt",
"komponente": "furnier-eiche-0-9-gemessert",
"rolle": "belag/oben",
- "wert": 0.6238
+ "wert": 0.3119
},
{
"einheit": "g",
"freigabe": "annahme",
"komponente": "ponal-flaechenleim-pvac",
"rolle": "leim/oben",
- "wert": 74.9
+ "wert": 37.4
},
{
"einheit": "m2",
"freigabe": "belegt",
"komponente": "furnier-eiche-0-9-gemessert",
"rolle": "belag/unten",
- "wert": 0.6238
+ "wert": 0.3119
},
{
"einheit": "g",
"freigabe": "annahme",
"komponente": "ponal-flaechenleim-pvac",
"rolle": "leim/unten",
- "wert": 74.9
+ "wert": 37.4
},
{
"einheit": "g",
"freigabe": "belegt",
"komponente": "adler-aduro-legnopur-g10",
"rolle": "oberflaeche/oben/1-klarlack/netto",
- "wert": 124.8
+ "wert": 62.4
},
{
"einheit": "g",
"freigabe": "annahme",
"komponente": "adler-aduro-legnopur-g10",
"rolle": "oberflaeche/oben/1-klarlack/brutto",
- "wert": 191.9
+ "wert": 96.0
},
{
"einheit": "g",
"freigabe": "belegt",
"komponente": "adler-aduro-legnopur-g10",
"rolle": "oberflaeche/unten/1-klarlack/netto",
- "wert": 124.8
+ "wert": 62.4
},
{
"einheit": "g",
"freigabe": "annahme",
"komponente": "adler-aduro-legnopur-g10",
"rolle": "oberflaeche/unten/1-klarlack/brutto",
- "wert": 191.9
+ "wert": 96.0
},
{
"einheit": "lfm",
"freigabe": "annahme",
"komponente": "ostermann-furnierkante-eiche-1-0",
"rolle": "kante/vorne",
- "wert": 1.132
+ "wert": 0.566
},
{
"einheit": "g",
"freigabe": "annahme",
"komponente": "jowatherm-280-30-eva",
"rolle": "kleber/vorne",
- "wert": 6.8
+ "wert": 3.4
}
]
},
@@ -385,7 +385,7 @@
]
}
],
- "resolve_manifest_sha256": "2539300205de77f8ecec3f5a40d525829039f7309c53d9002b0ea34784fabc49",
+ "resolve_manifest_sha256": "129f81aa35dc2ea0802a44cbf7e8671235b24fc0fb620772dee94f5a44d1f37c",
"systeme": {
"oben": {
"id": "adler-g10-2x-klarlack",
@@ -397,14 +397,14 @@
}
},
"werkstueck": {
- "anzahl": 2,
+ "anzahl": 1,
"aufbau": {
"id": "eiche-furniert-p2-19-g10",
"revision": 1
},
- "bezeichnung": "Boden (Korpus 600 breit, Seiten 19)",
+ "bezeichnung": "Boden Oben",
"faserrichtung": "laengs",
- "id": "boden-562x555",
+ "id": "teil_beispielbo0oben",
"kontur": {
"breite": 555.0,
"laenge": 562.0,
diff --git a/apps/tischler/public/werkstoff-bundle/manifeste/teil_beispielbo0unten.json b/apps/tischler/public/werkstoff-bundle/manifeste/teil_beispielbo0unten.json
new file mode 100644
index 0000000..d33d5ea
--- /dev/null
+++ b/apps/tischler/public/werkstoff-bundle/manifeste/teil_beispielbo0unten.json
@@ -0,0 +1,414 @@
+{
+ "aufbau": {
+ "bezeichnung": "EGGER Spanplatte P2 19 + Furnier Eiche 0,9 beidseitig + 2× ADLER G10 beidseitig + Furnierkante Eiche vorne",
+ "id": "eiche-furniert-p2-19-g10",
+ "revision": 1
+ },
+ "ergebnisse": {
+ "ausgeschlossen": [
+ {
+ "grund": "Trockenschichtdicke nicht hinterlegt — nicht addiert",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/oben/1-klarlack"
+ },
+ {
+ "grund": "Trockenschichtdicke nicht hinterlegt — nicht addiert",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/unten/1-klarlack"
+ },
+ {
+ "grund": "Trockenmasse der Beschichtung nicht hinterlegt — nicht addiert",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche"
+ },
+ {
+ "grund": "Kante ist je lfm — braucht das Werkstück (siehe verbrauch)",
+ "komponente": "ostermann-furnierkante-eiche-1-0",
+ "rolle": "kante/vorne"
+ }
+ ],
+ "dicke_mm": {
+ "freigabe": "annahme",
+ "max": 21.5,
+ "min": 20.1,
+ "nominal": 20.8
+ },
+ "flaeche_m2": 0.3119,
+ "gewicht_kg_m2": {
+ "freigabe": "annahme",
+ "wert": 14.352
+ },
+ "verbrauch": [
+ {
+ "einheit": "m2",
+ "freigabe": "belegt",
+ "komponente": "egger-spanplatte-p2-19",
+ "rolle": "traeger",
+ "wert": 0.3119
+ },
+ {
+ "einheit": "m2",
+ "freigabe": "belegt",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "rolle": "belag/oben",
+ "wert": 0.3119
+ },
+ {
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "ponal-flaechenleim-pvac",
+ "rolle": "leim/oben",
+ "wert": 37.4
+ },
+ {
+ "einheit": "m2",
+ "freigabe": "belegt",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "rolle": "belag/unten",
+ "wert": 0.3119
+ },
+ {
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "ponal-flaechenleim-pvac",
+ "rolle": "leim/unten",
+ "wert": 37.4
+ },
+ {
+ "einheit": "g",
+ "freigabe": "belegt",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/oben/1-klarlack/netto",
+ "wert": 62.4
+ },
+ {
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/oben/1-klarlack/brutto",
+ "wert": 96.0
+ },
+ {
+ "einheit": "g",
+ "freigabe": "belegt",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/unten/1-klarlack/netto",
+ "wert": 62.4
+ },
+ {
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/unten/1-klarlack/brutto",
+ "wert": 96.0
+ },
+ {
+ "einheit": "lfm",
+ "freigabe": "annahme",
+ "komponente": "ostermann-furnierkante-eiche-1-0",
+ "rolle": "kante/vorne",
+ "wert": 0.566
+ },
+ {
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "jowatherm-280-30-eva",
+ "rolle": "kleber/vorne",
+ "wert": 3.4
+ }
+ ]
+ },
+ "formelversion": "werkstoff-ableitung/1",
+ "komponenten": [
+ {
+ "art": "traeger",
+ "bezeichnung": "EGGER Spanplatte roh E1E05 TSCA P2 CE (Eurospan), 19 mm",
+ "dicke": {
+ "begruendung": "Dicke im Auftrag nicht genannt; 19 mm = Handelsdicke (Frischeis) und übliche Korpusplatte im Betrieb — Bernhard bestätigen",
+ "einheit": "mm",
+ "freigabe": "annahme",
+ "wert": 19
+ },
+ "id": "egger-spanplatte-p2-19",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER Technisches Datenblatt TD-181 (E1E05 TSCA P2 CE), Rev. 08.04.2026",
+ "seite": "S. 1",
+ "stand": "2026-04-08",
+ "url": "https://binary.egger.link/pis/978585f4-777c-45bf-96bb-3cfa40df2bae/Technical_datasheet_E1E05_TSCA_P2_CE_TD-181_Deutsch"
+ },
+ "revision": 1,
+ "rohdichte": {
+ "begruendung": "TD-181 sagt 'werkspezifisch' (±10 %); 690 aus Frischeis-Plattengewicht 75,982 kg / (2,8 × 2,07 m² × 0,019 m) berechnet",
+ "einheit": "kg/m3",
+ "freigabe": "annahme",
+ "wert": 690
+ },
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER TD-181 Technisches Datenblatt E1E05 TSCA P2 CE",
+ "seiten": "S. 1–2",
+ "sha256": "1b0d66099daba0c8159b0100bb5a5cd5015cb5d0240ebc2bf266fb4ff12d82e0",
+ "stand": "2026-04-08",
+ "typ": "datenblatt",
+ "url": "https://binary.egger.link/pis/978585f4-777c-45bf-96bb-3cfa40df2bae/Technical_datasheet_E1E05_TSCA_P2_CE_TD-181_Deutsch"
+ },
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER Verarbeitungshinweise Dekorative Platten und Trägerplatten",
+ "seiten": "S. 1–20",
+ "sha256": "e9fdcbea5e943a199f94178d89ffa83d20224b1cf25758fd229b6c8fe195a574",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://binary.egger.link/pis/4a389dc5-b778-426f-ada5-03d2c6e7eee3/Verarbeitungshinweise_Dekorative_Platten_und_Traegerplatten_Deutsch"
+ }
+ ]
+ },
+ {
+ "art": "belag",
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "dicke": {
+ "autor": "Bernhard Reiter",
+ "bemerkung": "Auftrag 02.09. 07:55 (Spanplatte + Furnier Eiche 0,9 + 2x ADLER G10 + Kante)",
+ "datum": "2026-09-02",
+ "einheit": "mm",
+ "freigabe": "meister",
+ "wert": 0.9
+ },
+ "id": "furnier-eiche-0-9-gemessert",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN 'Furnier im Innenausbau' (Initiative Furnier + Natur) / ÜK-Unterlage Furnieren",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ },
+ "revision": 1,
+ "rohdichte": {
+ "begruendung": "Rohdichte Eiche nicht recherchiert; Literaturbereich 650–700 kg/m³",
+ "einheit": "kg/m3",
+ "freigabe": "annahme",
+ "wert": 690
+ },
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN — Furnier im Innenausbau (Verarbeitung)",
+ "seiten": "S. 1–62",
+ "sha256": "3ab3f0fd735dae1a5a5b543e503f93b73f41effb273d08b65948f54b7be6578c",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ }
+ ]
+ },
+ {
+ "art": "belag",
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "dicke": {
+ "autor": "Bernhard Reiter",
+ "bemerkung": "Auftrag 02.09. 07:55 (Spanplatte + Furnier Eiche 0,9 + 2x ADLER G10 + Kante)",
+ "datum": "2026-09-02",
+ "einheit": "mm",
+ "freigabe": "meister",
+ "wert": 0.9
+ },
+ "id": "furnier-eiche-0-9-gemessert",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN 'Furnier im Innenausbau' (Initiative Furnier + Natur) / ÜK-Unterlage Furnieren",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ },
+ "revision": 1,
+ "rohdichte": {
+ "begruendung": "Rohdichte Eiche nicht recherchiert; Literaturbereich 650–700 kg/m³",
+ "einheit": "kg/m3",
+ "freigabe": "annahme",
+ "wert": 690
+ },
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN — Furnier im Innenausbau (Verarbeitung)",
+ "seiten": "S. 1–62",
+ "sha256": "3ab3f0fd735dae1a5a5b543e503f93b73f41effb273d08b65948f54b7be6578c",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ }
+ ]
+ },
+ {
+ "art": "klebstoff",
+ "auftragsmenge": {
+ "begruendung": "Untergrenze aus »120–150 g/m² je nach Saugfähigkeit« (Ponal TM) — Betriebswert bis zur Messung",
+ "bemerkung": "120–150 g/m² je nach Saugfähigkeit; höherer Auftrag = längere Presszeit + Durchschlaggefahr",
+ "einheit": "g/m2",
+ "freigabe": "annahme",
+ "wert": 120
+ },
+ "bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
+ "id": "ponal-flaechenleim-pvac",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "seite": "S. 1–2"
+ },
+ "revision": 1,
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "typ": "datenblatt"
+ }
+ ]
+ },
+ {
+ "art": "klebstoff",
+ "auftragsmenge": {
+ "begruendung": "Mittelwert aus »Echtholzkanten 200–300 g/m²« (Ostermann-Verarbeitungshinweise); Jowat beziffert den Walzenauftrag nicht — Betriebswert bis zur Messung an der Maschine",
+ "bemerkung": "Echtholzkanten 200–300 g/m² (Ostermann: mehr Eigenspannung → mehr Leimauftrag); Jowat beziffert nicht",
+ "einheit": "g/m2",
+ "freigabe": "annahme",
+ "wert": 250
+ },
+ "bezeichnung": "Jowatherm 280.30 (EVA-Schmelzkleber, ungefüllt, Nullfuge) — Kantenanleimen stationär",
+ "id": "jowatherm-280-30-eva",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Jowat Produktinformation Jowatherm 280.30"
+ },
+ "revision": 1,
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Jowat TDS Jowatherm 280.30/31 (Kante, Stand 12/25)",
+ "seiten": "S. 1–3",
+ "sha256": "68aafb838580eb574888ffa160f3d38e0b3d495b80241ae1d06b55a5399be45c",
+ "stand": "2025-12-01",
+ "typ": "datenblatt",
+ "url": "https://d3files.jowat-cloud.com/technical-data-sheets-v2/280.30/31/TD28030-28031-Kante_German.PDF"
+ }
+ ]
+ },
+ {
+ "art": "beschichtung",
+ "auftragsmenge": {
+ "bemerkung": "TMB: 100–150 g/m² je Schicht, max. 450 g/m² gesamt",
+ "einheit": "g/m2",
+ "freigabe": "belegt",
+ "wert": 100
+ },
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "id": "adler-aduro-legnopur-g10",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "revision": 1,
+ "uebertragung": {
+ "spritzen": {
+ "begruendung": "Übertragungsgrad Becherpistole ~65 % (Erfahrungswert); Airless/Airmix höher — Betriebsmessung",
+ "einheit": "1",
+ "freigabe": "annahme",
+ "wert": 0.65
+ }
+ },
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER TMB 2513 ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "seiten": "S. 1–4",
+ "sha256": "3802082c34744eb165c12d8df2a6d01afca051fc6930961a6b2401edf7152dcc",
+ "typ": "datenblatt",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ {
+ "dokument": "ADLER Sicherheitsdatenblatt 2513 (nur mit Kundenkonto)",
+ "fingerabdruck_offen": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "seiten": "gesamtes Dokument",
+ "typ": "sdb",
+ "url": "https://www.adler-lacke.com/at/produkte"
+ },
+ {
+ "dokument": "ADLER Arbeitsrichtlinie ARL 131 (PUR-Möbellacke) — auf Anfrage",
+ "fingerabdruck_offen": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "seiten": "gesamtes Dokument",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://www.adler-lacke.com/de/service-ratgeber/arbeitsrichtlinien"
+ }
+ ],
+ "zwischenschliff_korn": {
+ "bemerkung": "TMB: Zwischenschliff K240–320",
+ "einheit": "korn",
+ "freigabe": "belegt",
+ "wert": 320
+ }
+ },
+ {
+ "art": "kante",
+ "bezeichnung": "Ostermann Furnierkante Eiche europäisch, geschliffen K180, 1,0 × 24 mm (Art. 070.4200)",
+ "dicke": {
+ "begruendung": "Kantenart und Dicke offen (Furnierkante 0,5/1/2/3 oder Massivholz-Anleimer) — Bernhard",
+ "einheit": "mm",
+ "freigabe": "annahme",
+ "wert": 1.0
+ },
+ "id": "ostermann-furnierkante-eiche-1-0",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ostermann Technisches Merkblatt Furnierkanten (01/2020)",
+ "stand": "2020-01-01",
+ "url": "https://web.ostermann.eu/mamdata/PDF_Daten/Technische_Merkblaetter/Kanten/Echtholz/Furnierkante_DE_ipdf_dase.pdf"
+ },
+ "revision": 1,
+ "ueberstand": {
+ "begruendung": "Zuschnittzugabe je Kantenende — Zahlenwert in keiner Quelle belegt",
+ "einheit": "mm",
+ "freigabe": "annahme",
+ "wert": 2
+ },
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ostermann TM Furnierkanten",
+ "seiten": "S. 1–2",
+ "sha256": "50860b11af6ba61b68d593991c01b5a9ce148dda628a20acf292036eb4d2f250",
+ "typ": "datenblatt",
+ "url": "https://web.ostermann.eu/mamdata/PDF_Daten/Technische_Merkblaetter/Kanten/Echtholz/Furnierkante_DE_ipdf_dase.pdf"
+ },
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Kleiberit Infoblatt Kantenverklebung",
+ "seiten": "S. 1–4",
+ "sha256": "45597e449c7307a5c900d6399d0466bf6c983d24176c64ac7af51d79c42834fb",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://legacy.kleiberit.com/fileadmin/Content_new/Infoblaetter/deutsch/Kantenverklebung_D.pdf"
+ }
+ ]
+ }
+ ],
+ "resolve_manifest_sha256": "bc29b2392ef8e7e67c9c30da8de8f1fa380828b1036a45579db8fa3ffbd3d3fe",
+ "systeme": {
+ "oben": {
+ "id": "adler-g10-2x-klarlack",
+ "revision": 1
+ },
+ "unten": {
+ "id": "adler-g10-2x-klarlack",
+ "revision": 1
+ }
+ },
+ "werkstueck": {
+ "anzahl": 1,
+ "aufbau": {
+ "id": "eiche-furniert-p2-19-g10",
+ "revision": 1
+ },
+ "bezeichnung": "Boden Unten",
+ "faserrichtung": "laengs",
+ "id": "teil_beispielbo0unten",
+ "kontur": {
+ "breite": 555.0,
+ "laenge": 562.0,
+ "typ": "rechteck"
+ }
+ }
+}
diff --git a/apps/tischler/public/werkstoff-bundle/manifeste/seite-links-890x555.json b/apps/tischler/public/werkstoff-bundle/manifeste/teil_beispielse0links.json
similarity index 96%
rename from apps/tischler/public/werkstoff-bundle/manifeste/seite-links-890x555.json
rename to apps/tischler/public/werkstoff-bundle/manifeste/teil_beispielse0links.json
index 3f4f4e2..9c54336 100644
--- a/apps/tischler/public/werkstoff-bundle/manifeste/seite-links-890x555.json
+++ b/apps/tischler/public/werkstoff-bundle/manifeste/teil_beispielse0links.json
@@ -33,7 +33,7 @@
"min": 20.1,
"nominal": 20.8
},
- "flaeche_m2": 0.9879,
+ "flaeche_m2": 0.494,
"gewicht_kg_m2": {
"freigabe": "annahme",
"wert": 14.352
@@ -44,77 +44,77 @@
"freigabe": "belegt",
"komponente": "egger-spanplatte-p2-19",
"rolle": "traeger",
- "wert": 0.9879
+ "wert": 0.494
},
{
"einheit": "m2",
"freigabe": "belegt",
"komponente": "furnier-eiche-0-9-gemessert",
"rolle": "belag/oben",
- "wert": 0.9879
+ "wert": 0.494
},
{
"einheit": "g",
"freigabe": "annahme",
"komponente": "ponal-flaechenleim-pvac",
"rolle": "leim/oben",
- "wert": 118.5
+ "wert": 59.3
},
{
"einheit": "m2",
"freigabe": "belegt",
"komponente": "furnier-eiche-0-9-gemessert",
"rolle": "belag/unten",
- "wert": 0.9879
+ "wert": 0.494
},
{
"einheit": "g",
"freigabe": "annahme",
"komponente": "ponal-flaechenleim-pvac",
"rolle": "leim/unten",
- "wert": 118.5
+ "wert": 59.3
},
{
"einheit": "g",
"freigabe": "belegt",
"komponente": "adler-aduro-legnopur-g10",
"rolle": "oberflaeche/oben/1-klarlack/netto",
- "wert": 197.6
+ "wert": 98.8
},
{
"einheit": "g",
"freigabe": "annahme",
"komponente": "adler-aduro-legnopur-g10",
"rolle": "oberflaeche/oben/1-klarlack/brutto",
- "wert": 304.0
+ "wert": 152.0
},
{
"einheit": "g",
"freigabe": "belegt",
"komponente": "adler-aduro-legnopur-g10",
"rolle": "oberflaeche/unten/1-klarlack/netto",
- "wert": 197.6
+ "wert": 98.8
},
{
"einheit": "g",
"freigabe": "annahme",
"komponente": "adler-aduro-legnopur-g10",
"rolle": "oberflaeche/unten/1-klarlack/brutto",
- "wert": 304.0
+ "wert": 152.0
},
{
"einheit": "lfm",
"freigabe": "annahme",
"komponente": "ostermann-furnierkante-eiche-1-0",
"rolle": "kante/vorne",
- "wert": 1.788
+ "wert": 0.894
},
{
"einheit": "g",
"freigabe": "annahme",
"komponente": "jowatherm-280-30-eva",
"rolle": "kleber/vorne",
- "wert": 10.7
+ "wert": 5.4
}
]
},
@@ -385,7 +385,7 @@
]
}
],
- "resolve_manifest_sha256": "803aa37c60bfdb9aed0f79ba309c42c59c5fea4a5a8f94edb3e7e02463d89dee",
+ "resolve_manifest_sha256": "e7ed33f6c8b864ead3d8d2406075ace94154298b08835872ab5da71705f5c7c8",
"systeme": {
"oben": {
"id": "adler-g10-2x-klarlack",
@@ -397,20 +397,14 @@
}
},
"werkstueck": {
- "anzahl": 2,
+ "anzahl": 1,
"aufbau": {
"id": "eiche-furniert-p2-19-g10",
"revision": 1
},
- "bezeichnung": "Seite links (Bernhards Korpus 890 × 555)",
+ "bezeichnung": "Seite Links",
"faserrichtung": "laengs",
- "id": "seite-links-890x555",
- "kanten": {
- "vorne": {
- "id": "ostermann-furnierkante-eiche-1-0",
- "revision": 1
- }
- },
+ "id": "teil_beispielse0links",
"kontur": {
"breite": 555.0,
"laenge": 890.0,
diff --git a/apps/tischler/public/werkstoff-bundle/manifeste/teil_beispielse0rechts.json b/apps/tischler/public/werkstoff-bundle/manifeste/teil_beispielse0rechts.json
new file mode 100644
index 0000000..0418921
--- /dev/null
+++ b/apps/tischler/public/werkstoff-bundle/manifeste/teil_beispielse0rechts.json
@@ -0,0 +1,414 @@
+{
+ "aufbau": {
+ "bezeichnung": "EGGER Spanplatte P2 19 + Furnier Eiche 0,9 beidseitig + 2× ADLER G10 beidseitig + Furnierkante Eiche vorne",
+ "id": "eiche-furniert-p2-19-g10",
+ "revision": 1
+ },
+ "ergebnisse": {
+ "ausgeschlossen": [
+ {
+ "grund": "Trockenschichtdicke nicht hinterlegt — nicht addiert",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/oben/1-klarlack"
+ },
+ {
+ "grund": "Trockenschichtdicke nicht hinterlegt — nicht addiert",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/unten/1-klarlack"
+ },
+ {
+ "grund": "Trockenmasse der Beschichtung nicht hinterlegt — nicht addiert",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche"
+ },
+ {
+ "grund": "Kante ist je lfm — braucht das Werkstück (siehe verbrauch)",
+ "komponente": "ostermann-furnierkante-eiche-1-0",
+ "rolle": "kante/vorne"
+ }
+ ],
+ "dicke_mm": {
+ "freigabe": "annahme",
+ "max": 21.5,
+ "min": 20.1,
+ "nominal": 20.8
+ },
+ "flaeche_m2": 0.494,
+ "gewicht_kg_m2": {
+ "freigabe": "annahme",
+ "wert": 14.352
+ },
+ "verbrauch": [
+ {
+ "einheit": "m2",
+ "freigabe": "belegt",
+ "komponente": "egger-spanplatte-p2-19",
+ "rolle": "traeger",
+ "wert": 0.494
+ },
+ {
+ "einheit": "m2",
+ "freigabe": "belegt",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "rolle": "belag/oben",
+ "wert": 0.494
+ },
+ {
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "ponal-flaechenleim-pvac",
+ "rolle": "leim/oben",
+ "wert": 59.3
+ },
+ {
+ "einheit": "m2",
+ "freigabe": "belegt",
+ "komponente": "furnier-eiche-0-9-gemessert",
+ "rolle": "belag/unten",
+ "wert": 0.494
+ },
+ {
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "ponal-flaechenleim-pvac",
+ "rolle": "leim/unten",
+ "wert": 59.3
+ },
+ {
+ "einheit": "g",
+ "freigabe": "belegt",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/oben/1-klarlack/netto",
+ "wert": 98.8
+ },
+ {
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/oben/1-klarlack/brutto",
+ "wert": 152.0
+ },
+ {
+ "einheit": "g",
+ "freigabe": "belegt",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/unten/1-klarlack/netto",
+ "wert": 98.8
+ },
+ {
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "adler-aduro-legnopur-g10",
+ "rolle": "oberflaeche/unten/1-klarlack/brutto",
+ "wert": 152.0
+ },
+ {
+ "einheit": "lfm",
+ "freigabe": "annahme",
+ "komponente": "ostermann-furnierkante-eiche-1-0",
+ "rolle": "kante/vorne",
+ "wert": 0.894
+ },
+ {
+ "einheit": "g",
+ "freigabe": "annahme",
+ "komponente": "jowatherm-280-30-eva",
+ "rolle": "kleber/vorne",
+ "wert": 5.4
+ }
+ ]
+ },
+ "formelversion": "werkstoff-ableitung/1",
+ "komponenten": [
+ {
+ "art": "traeger",
+ "bezeichnung": "EGGER Spanplatte roh E1E05 TSCA P2 CE (Eurospan), 19 mm",
+ "dicke": {
+ "begruendung": "Dicke im Auftrag nicht genannt; 19 mm = Handelsdicke (Frischeis) und übliche Korpusplatte im Betrieb — Bernhard bestätigen",
+ "einheit": "mm",
+ "freigabe": "annahme",
+ "wert": 19
+ },
+ "id": "egger-spanplatte-p2-19",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER Technisches Datenblatt TD-181 (E1E05 TSCA P2 CE), Rev. 08.04.2026",
+ "seite": "S. 1",
+ "stand": "2026-04-08",
+ "url": "https://binary.egger.link/pis/978585f4-777c-45bf-96bb-3cfa40df2bae/Technical_datasheet_E1E05_TSCA_P2_CE_TD-181_Deutsch"
+ },
+ "revision": 1,
+ "rohdichte": {
+ "begruendung": "TD-181 sagt 'werkspezifisch' (±10 %); 690 aus Frischeis-Plattengewicht 75,982 kg / (2,8 × 2,07 m² × 0,019 m) berechnet",
+ "einheit": "kg/m3",
+ "freigabe": "annahme",
+ "wert": 690
+ },
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER TD-181 Technisches Datenblatt E1E05 TSCA P2 CE",
+ "seiten": "S. 1–2",
+ "sha256": "1b0d66099daba0c8159b0100bb5a5cd5015cb5d0240ebc2bf266fb4ff12d82e0",
+ "stand": "2026-04-08",
+ "typ": "datenblatt",
+ "url": "https://binary.egger.link/pis/978585f4-777c-45bf-96bb-3cfa40df2bae/Technical_datasheet_E1E05_TSCA_P2_CE_TD-181_Deutsch"
+ },
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "EGGER Verarbeitungshinweise Dekorative Platten und Trägerplatten",
+ "seiten": "S. 1–20",
+ "sha256": "e9fdcbea5e943a199f94178d89ffa83d20224b1cf25758fd229b6c8fe195a574",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://binary.egger.link/pis/4a389dc5-b778-426f-ada5-03d2c6e7eee3/Verarbeitungshinweise_Dekorative_Platten_und_Traegerplatten_Deutsch"
+ }
+ ]
+ },
+ {
+ "art": "belag",
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "dicke": {
+ "autor": "Bernhard Reiter",
+ "bemerkung": "Auftrag 02.09. 07:55 (Spanplatte + Furnier Eiche 0,9 + 2x ADLER G10 + Kante)",
+ "datum": "2026-09-02",
+ "einheit": "mm",
+ "freigabe": "meister",
+ "wert": 0.9
+ },
+ "id": "furnier-eiche-0-9-gemessert",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN 'Furnier im Innenausbau' (Initiative Furnier + Natur) / ÜK-Unterlage Furnieren",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ },
+ "revision": 1,
+ "rohdichte": {
+ "begruendung": "Rohdichte Eiche nicht recherchiert; Literaturbereich 650–700 kg/m³",
+ "einheit": "kg/m3",
+ "freigabe": "annahme",
+ "wert": 690
+ },
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN — Furnier im Innenausbau (Verarbeitung)",
+ "seiten": "S. 1–62",
+ "sha256": "3ab3f0fd735dae1a5a5b543e503f93b73f41effb273d08b65948f54b7be6578c",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ }
+ ]
+ },
+ {
+ "art": "belag",
+ "bezeichnung": "Furnier Eiche europäisch, gemessert (Starkfurnier), 0,9 mm",
+ "dicke": {
+ "autor": "Bernhard Reiter",
+ "bemerkung": "Auftrag 02.09. 07:55 (Spanplatte + Furnier Eiche 0,9 + 2x ADLER G10 + Kante)",
+ "datum": "2026-09-02",
+ "einheit": "mm",
+ "freigabe": "meister",
+ "wert": 0.9
+ },
+ "id": "furnier-eiche-0-9-gemessert",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN 'Furnier im Innenausbau' (Initiative Furnier + Natur) / ÜK-Unterlage Furnieren",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ },
+ "revision": 1,
+ "rohdichte": {
+ "begruendung": "Rohdichte Eiche nicht recherchiert; Literaturbereich 650–700 kg/m³",
+ "einheit": "kg/m3",
+ "freigabe": "annahme",
+ "wert": 690
+ },
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "IFN — Furnier im Innenausbau (Verarbeitung)",
+ "seiten": "S. 1–62",
+ "sha256": "3ab3f0fd735dae1a5a5b543e503f93b73f41effb273d08b65948f54b7be6578c",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://tu-dresden.de/ing/maschinenwesen/int/ressourcen/dateien/holztechnik-und-faserwerkstofftechnik/download/wissenschaftliche-publikationen/Furnier.pdf"
+ }
+ ]
+ },
+ {
+ "art": "klebstoff",
+ "auftragsmenge": {
+ "begruendung": "Untergrenze aus »120–150 g/m² je nach Saugfähigkeit« (Ponal TM) — Betriebswert bis zur Messung",
+ "bemerkung": "120–150 g/m² je nach Saugfähigkeit; höherer Auftrag = längere Presszeit + Durchschlaggefahr",
+ "einheit": "g/m2",
+ "freigabe": "annahme",
+ "wert": 120
+ },
+ "bezeichnung": "Ponal Flächenleim (PVAc-Dispersionsleim, D1/D2) — Furnier-/Flächenverleimung, Kaltpresse",
+ "id": "ponal-flaechenleim-pvac",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "seite": "S. 1–2"
+ },
+ "revision": 1,
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ponal Flächenleim — Technisches Merkblatt (Henkel)",
+ "typ": "datenblatt"
+ }
+ ]
+ },
+ {
+ "art": "klebstoff",
+ "auftragsmenge": {
+ "begruendung": "Mittelwert aus »Echtholzkanten 200–300 g/m²« (Ostermann-Verarbeitungshinweise); Jowat beziffert den Walzenauftrag nicht — Betriebswert bis zur Messung an der Maschine",
+ "bemerkung": "Echtholzkanten 200–300 g/m² (Ostermann: mehr Eigenspannung → mehr Leimauftrag); Jowat beziffert nicht",
+ "einheit": "g/m2",
+ "freigabe": "annahme",
+ "wert": 250
+ },
+ "bezeichnung": "Jowatherm 280.30 (EVA-Schmelzkleber, ungefüllt, Nullfuge) — Kantenanleimen stationär",
+ "id": "jowatherm-280-30-eva",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Jowat Produktinformation Jowatherm 280.30"
+ },
+ "revision": 1,
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Jowat TDS Jowatherm 280.30/31 (Kante, Stand 12/25)",
+ "seiten": "S. 1–3",
+ "sha256": "68aafb838580eb574888ffa160f3d38e0b3d495b80241ae1d06b55a5399be45c",
+ "stand": "2025-12-01",
+ "typ": "datenblatt",
+ "url": "https://d3files.jowat-cloud.com/technical-data-sheets-v2/280.30/31/TD28030-28031-Kante_German.PDF"
+ }
+ ]
+ },
+ {
+ "art": "beschichtung",
+ "auftragsmenge": {
+ "bemerkung": "TMB: 100–150 g/m² je Schicht, max. 450 g/m² gesamt",
+ "einheit": "g/m2",
+ "freigabe": "belegt",
+ "wert": 100
+ },
+ "bezeichnung": "ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "id": "adler-aduro-legnopur-g10",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER Technisches Merkblatt 2513 (ADLER Aduro Legnopur G10, 2K-PUR-Klarlack)",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ "revision": 1,
+ "uebertragung": {
+ "spritzen": {
+ "begruendung": "Übertragungsgrad Becherpistole ~65 % (Erfahrungswert); Airless/Airmix höher — Betriebsmessung",
+ "einheit": "1",
+ "freigabe": "annahme",
+ "wert": 0.65
+ }
+ },
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "ADLER TMB 2513 ADLER Aduro Legnopur G10, 2K-PUR-Klarlack",
+ "seiten": "S. 1–4",
+ "sha256": "3802082c34744eb165c12d8df2a6d01afca051fc6930961a6b2401edf7152dcc",
+ "typ": "datenblatt",
+ "url": "https://www.adler-lacke.com/Canto/tmb/aduro-legnopur_tmb_2513_de.pdf"
+ },
+ {
+ "dokument": "ADLER Sicherheitsdatenblatt 2513 (nur mit Kundenkonto)",
+ "fingerabdruck_offen": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "seiten": "gesamtes Dokument",
+ "typ": "sdb",
+ "url": "https://www.adler-lacke.com/at/produkte"
+ },
+ {
+ "dokument": "ADLER Arbeitsrichtlinie ARL 131 (PUR-Möbellacke) — auf Anfrage",
+ "fingerabdruck_offen": "URL führt auf eine Übersichtsseite, nicht auf das Dokument — das Dokument selbst gibt es nur mit Kundenkonto (ADLER); Fingerabdruck erst mit dem echten Dokument",
+ "seiten": "gesamtes Dokument",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://www.adler-lacke.com/de/service-ratgeber/arbeitsrichtlinien"
+ }
+ ],
+ "zwischenschliff_korn": {
+ "bemerkung": "TMB: Zwischenschliff K240–320",
+ "einheit": "korn",
+ "freigabe": "belegt",
+ "wert": 320
+ }
+ },
+ {
+ "art": "kante",
+ "bezeichnung": "Ostermann Furnierkante Eiche europäisch, geschliffen K180, 1,0 × 24 mm (Art. 070.4200)",
+ "dicke": {
+ "begruendung": "Kantenart und Dicke offen (Furnierkante 0,5/1/2/3 oder Massivholz-Anleimer) — Bernhard",
+ "einheit": "mm",
+ "freigabe": "annahme",
+ "wert": 1.0
+ },
+ "id": "ostermann-furnierkante-eiche-1-0",
+ "quelle": {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ostermann Technisches Merkblatt Furnierkanten (01/2020)",
+ "stand": "2020-01-01",
+ "url": "https://web.ostermann.eu/mamdata/PDF_Daten/Technische_Merkblaetter/Kanten/Echtholz/Furnierkante_DE_ipdf_dase.pdf"
+ },
+ "revision": 1,
+ "ueberstand": {
+ "begruendung": "Zuschnittzugabe je Kantenende — Zahlenwert in keiner Quelle belegt",
+ "einheit": "mm",
+ "freigabe": "annahme",
+ "wert": 2
+ },
+ "unterlagen": [
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Ostermann TM Furnierkanten",
+ "seiten": "S. 1–2",
+ "sha256": "50860b11af6ba61b68d593991c01b5a9ce148dda628a20acf292036eb4d2f250",
+ "typ": "datenblatt",
+ "url": "https://web.ostermann.eu/mamdata/PDF_Daten/Technische_Merkblaetter/Kanten/Echtholz/Furnierkante_DE_ipdf_dase.pdf"
+ },
+ {
+ "abgerufen": "2026-09-02",
+ "dokument": "Kleiberit Infoblatt Kantenverklebung",
+ "seiten": "S. 1–4",
+ "sha256": "45597e449c7307a5c900d6399d0466bf6c983d24176c64ac7af51d79c42834fb",
+ "typ": "verarbeitungsrichtlinie",
+ "url": "https://legacy.kleiberit.com/fileadmin/Content_new/Infoblaetter/deutsch/Kantenverklebung_D.pdf"
+ }
+ ]
+ }
+ ],
+ "resolve_manifest_sha256": "7113369780cade95bc8252b687e072666321ac133f22d528498055612728e9a6",
+ "systeme": {
+ "oben": {
+ "id": "adler-g10-2x-klarlack",
+ "revision": 1
+ },
+ "unten": {
+ "id": "adler-g10-2x-klarlack",
+ "revision": 1
+ }
+ },
+ "werkstueck": {
+ "anzahl": 1,
+ "aufbau": {
+ "id": "eiche-furniert-p2-19-g10",
+ "revision": 1
+ },
+ "bezeichnung": "Seite Rechts",
+ "faserrichtung": "laengs",
+ "id": "teil_beispielse0rechts",
+ "kontur": {
+ "breite": 555.0,
+ "laenge": 890.0,
+ "typ": "rechteck"
+ }
+ }
+}