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) => ( - - ))} + {bretter.map((w) => { + const aktiv = w.luecke + ? lueckeGewaehlt?.schluessel === w.schluessel + : gewaehlt === w.werkstueck_id; + return ( + + ); + })}
+ {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" + } + } +}