Fahrplan v3.0 — 12-Sheet-Analyse

Excel→HERO Gateway
Vollständige 12-Sheet-Architektur · OFFERT als Primärformat

Format A (OFFERT): 12 Sheets komplett analysiert — 6 Kalkulations-Sheets (intern) + 6 Output-Sheets (Parsing-Quelle). OFFERT 1 liefert fertige Descriptions, OFFERT 2 liefert gerundete Endmengen. Format B (Merged+Additional) weiterhin unterstützt.

Stand: 2025-08-12
Sky-Frame TOOL v2023-03-19
2 Exportformate
12 Sheets analysiert — PWS2002710
Primärformat: OFFERT (12 Sheets)
~20–24h Total
0 · Kernerkenntnis — Zwei Excel-Formate, ein Gateway

Der Mitarbeiter exportiert entweder das OFFERT-Format oder das Merged+Additional-Format — nie beide zusammen

Der Mitarbeiter hat nicht ein Excel — er hat zwei verschiedene Export-Varianten
Das Sky-Frame TOOL kann zwei grundlegend verschiedene Excel-Exporte erzeugen:
OFFERT-Variante (Format A) — 12 Sheets: 6 Kalkulations-Sheets (intern) + 6 Output-Sheets (OFFERT 1–5 + Uw). Das ist das primäre Gateway-Format. OFFERT 1 liefert fertige Position-Descriptions, OFFERT 2 liefert gerundete Endmengen + finale Preise, OFFERT 4/5 liefern per-Position UK-Mapping.
Merged+Additional-Variante (Format B) (2 Sheets) — das Format das import-bridge.js heute bereits liest. Weiterhin unterstützt als Fallback.

Konsequenz für das Gateway: Beim Upload wird das Format automatisch erkannt. Empfehlung: OFFERT-Sheets 8 (OFFERT 1) + 9 (OFFERT 2) als primäre Parse-Quelle nutzen — sie liefern produktionsbereite, aufbereitete Daten direkt aus der Excel-Kalkulation.
Format A · Primär OFFERT-Variante 12 Sheets
── Kalkulations-Sheets (intern) ──
1 ELEMENTEPositionen: Pos-Nr, B×H, Gleise, Glasaufbau-Code, Öffnungsart, Preis/StkBackup
2 MONTAGEPer-Pos UK-Mengen (Rohdaten): b-code + Menge, ∑-Totale (ungerundet)Backup
3 OPTIONUK-Katalog: Titel, Langtext, Einheit, Preis EURUK-Preise
4 SPRACHEVorbeschriebe DE/FR/IT pro System (SF1, SF3…)optional
5 KALKSCHEMAInterne Kalkulation — nicht benötigtignorieren
6 GLASLookup: Glasaufbau-Code → Volltext, Ug, Lt/g (nur falls Sheet 8 nicht reicht)Lookup
── Output-Sheets (Primär-Parsing) ──
7 UwUw-Berechnung Nachweis Wärmedämmung (EN 10077) — nicht benötigtignorieren
8 OFFERT 1⭐ Fertige Position-Descriptions + Vorbeschrieb-Text → direkt → HERO description⭐ KEY
9 OFFERT 2⭐ UK/Ausrüstung mit gerundeten Endmengen + EUR-Preise → create_supply_service⭐ KEY
10 OFFERT 3Gesamtangebot kombiniert: Elemente + UK + ZZZ-Position + AGB-TextAGB/ZZZ
11 OFFERT 4Per-Position UK-Mapping kompakt (15 Optionen): Pos → Option → MengePer-Pos
12 OFFERT 5Per-Position UK-Mapping erweitert (inkl. Transport) — Superset von OFFERT 4Per-Pos+
Format B Merged+Additional-Variante 2 Sheets
Merged SheetID-kodierte Rohdaten: base-price / surcharge Zeilen, B×H, Menge, VK-Preis✅ impl.
Additional DataKey/Value: Projekt-Nr, Währung, Stunden, Partner-PLZ✅ impl.
⚠ UK-Mengen fehlen · Glasdetails fehlen · UK-Texte fehlen → muss aus HERO-Templates ergänzt werden
Parsing-Strategie Format A: Sheet 8 (OFFERT 1) liefert fertige Positions-Beschreibungstexte — kein Zusammenbauen aus ELEMENTE + GLAS nötig. Sheet 9 (OFFERT 2) liefert UK-Mengen bereits gerundet (11,2 lm statt 11,172) + EUR-Preise. Sheet 11/12 (OFFERT 4/5) bieten per-Position UK-Aufschlüsselung als Backup. Format B (Merged) weiter unterstützen für Rückwärtskompatibilität.
1 · Automatische Format-Erkennung beim Upload

Das Gateway erkennt selbst welches Format hochgeladen wurde — der Mitarbeiter muss nichts auswählen

Erkennungs-Logik in detectFormat(wb)
A
OFFERT-Format erkannt wenn: Workbook enthält Sheet mit Name der ELEMENTE oder ELEMENT enthält (case-insensitive) UND Sheet mit MONTAGE enthält → 12-Sheet-OFFERT-Export.
Zusatzprüfung: Anzahl Sheets ≥ 6. Wenn auch Sheets OFFERT 1 / OFFERT1 vorhanden → bestätigt 12-Sheet-Vollexport (OFFERT-Sheets als Primärquelle nutzen).
B
Merged-Format erkannt wenn: Workbook enthält Sheet mit Name merged oder erste Datenspalte einer Zeile enthält das Muster base-price|PWS oder surcharge|PWS.
Alternativ: Sheet-Name enthält additional oder additional data.
Fallback: Wenn weder A noch B eindeutig erkannt wird → Fehlermeldung «Unbekanntes Excel-Format» mit Hinweis auf die erwarteten Sheet-Namen. Kein stiller Fehler.
1b · OFFERT Output-Sheets 8–12 — Die primäre Parsing-Quelle

Die Output-Sheets 8–12 enthalten bereits aufbereitete, produktionsbereite Daten — direkt nutzbar für HERO ohne komplexe Assemblierung

8 OFFERT 1 ⭐ Positions-Descriptions — fertig formatiert für HERO
Kernerkenntnis: OFFERT 1 enthält pro Position einen vollständigen, mehrzeiligen Beschreibungstext — Systemname, Rahmenaussenmass, Gleisigkeit, Glasaufbau, Ug-Wert, Lt/g-Wert, Oberfläche, Anmerkungen. Direkt als add_product_position.description verwendbar. Keine Assemblierung aus ELEMENTE + GLAS nötig.
Inhalt (Zeile/Zelle)Beispielwert→ HERO-FeldStatus
Vorbeschrieb (Zeile 6, Zelle C)«Sky-Frame 3, das rahmenlose Schiebefenster, 2- oder 3-gleisig…»add_text vor Positionen (System-Vorbeschrieb)KEY
Pos. (Spalte B, ab Zeile 8)1.1, 1.2add_product_position · Join-Keyneu
Description-Block (Spalte C, Zeile unter Pos.)«OG 01 / Sky-Frame 3 Classic / Rahmenaussenmass: 1301 x 3911mm / 2-gleisig, 3-fach Isolierglas / Glas: ESG-H 6 / ESG-H 6 / ESG-H 6 / Ug-Wert: 0.5 W/m2K Lt / g-Wert: 73 / 54 / Oberfläche: Colinal E6 20/25my»add_product_position.description (vollständig, als HTML formatieren)⭐ KEY
EUR/Einheit (Spalte D)- (leer = ohne Preis in Ausgabe)Preis kommt aus ELEMENTE Sheet 1aus ELEMENTE
ZZZ-Position (Spalte B = «ZZZ»)«Preisanpassung Pauschal für Oberflächenvariante: RAL/NCS Qualicoat 1»; Total: -600,00add_product_position (Pauschal-Anpassung, negativer Preis)ZZZ
Parse-Strategie OFFERT 1: Zeilen mit Pos.-Nr lesen (Spalte B nicht leer, nicht «0», nicht «ZZZ»). Nächste Zeile darunter = Description-Text (Spalte C). ZZZ separat behandeln. Vorbeschrieb-Block am Anfang (vor erster Pos.) = Systemtext für add_text.
9 OFFERT 2 ⭐ UK/Ausrüstung — gerundete Endmengen + Preise
Kernerkenntnis: OFFERT 2 enthält die UK-Positionen mit gerundeten Endmengen (11,2 lm statt 11,172 lm aus MONTAGE) und vollständigen Langtexten + EUR-Preisen. Diese Daten sind direkt für create_supply_service verwendbar — keine Kombination aus MONTAGE + OPTION nötig.
SpalteBeispielwert→ HERO-FeldStatus
Pos. (Spalte B)100, 101, 102 … 114UK-Position ID (Join-Key)neu
Titel (Spalte C, Titelzeile)«Unterkonstruktion Sockel», «Elektrischer Antrieb»create_supply_service.nameKEY
Langtext (Spalte C, Beschreibungszeile)«Örtliche Befestigung mittels höhenverstellbaren Chromstahl-Konsolen…»create_supply_service.description (HTML)KEY
Einheit (Spalte D)lm, Stk., m2, Pa., -create_supply_service.unit_type (→ m, Stk, m², pauschal)neu
Menge (Spalte E)11,2 / 7,8 / 11,2 / 2,0 / 1,0create_supply_service.quantity ← gerundeter Endwert⭐ KEY
EUR/Einheit (Spalte F)147,00 / 74,00 / 85,00 / 282,00 / 4.910,00create_supply_service.net_price_per_unitKEY
Total EUR (Spalte G)1.646,40 / 577,20 / 3.158,40Plausibilitätsprüfung (Menge × Preis)Prüfung
«per» in Menge-SpaltePos. 101, 107, 108, 109, 113: Menge = «per»→ Position vorhanden aber nicht einkalkuliert → quantity = 0, in Preview warnenEdge Case
Total-Zeile (letzte Zeile)«Total Sky-Frame Optionen»; 20.615,00Validierungs-SummeValidierung
Parse-Strategie OFFERT 2: Titelzeile (Pos 100+) enthält Pos.Nr in Spalte B, Name in Spalte C. Nächste Zeile = Langtext (C), Einheit (D), Menge (E), Preis (F). Zeilen mit Pos.Nr = «0» oder Menge = «0,00» überspringen. «per» in Menge → Option nicht einkalkuliert (als Warnung markieren).
10 OFFERT 3 Gesamtangebot kombiniert — ZZZ + AGB
InhaltBeispielwert→ HERO-FeldStatus
Positions-Block (identisch mit OFFERT 1)Pos. 1.1, 1.2 mit DescriptionsIdentisch mit OFFERT 1 — bevorzuge Sheet 8via OFFERT 1
UK-Block (identisch mit OFFERT 2)Pos. 100–114 mit Mengen + PreisenIdentisch mit OFFERT 2 — bevorzuge Sheet 9via OFFERT 2
ZZZ-Position«Preisanpassung Pauschal…»; Total: -600,00add_product_position (Pauschal, negativer Preis) — auch in OFFERT 1ZZZ
OFFERT 3 für Parsing nicht nötig — enthält die kombinierten Daten aus OFFERT 1 + OFFERT 2. Für das Gateway: OFFERT 1 (Sheet 8) und OFFERT 2 (Sheet 9) direkt lesen. OFFERT 3 nur als Fallback wenn Sheet 8 oder 9 fehlen.
11 OFFERT 4 & 12 OFFERT 5 Per-Position UK-Mapping
SpalteBeispielwert (Pos 1.1 / 1.2)→ HERO-FeldStatus
Pos. (Spalte B)1.1, 1.2Join-Key zur PositionJoin
Text (Spalte C)«OG 01 1301 x 3911mm»Positions-Label (Referenz)info
Stk. (Spalte D)1, 1Stückzahl der Positioninfo
m2 Total (Spalte E)5,1 / 38,6Glasfläche pro Position (Summe)info
UK-Option-Spalten (E+)Sockel: 1,3 / 9,9 · Wand: 3,9 / 3,9 · Sturz: 1,3 / 9,9 · Rinne: 1,3 / 9,9 · Antrieb: - / 2,0 · TOUCH: - / 1,0Per-Positions-Mengen pro UK-OptionBackup
OFFERT 5 zusätzlich: Transport- / 1,0 (nur Pos 1.2)Transport-Menge pro Positionneu
Summen-Zeile (letzte Zeile)Sockel: 11,2 · Wand: 7,8 · Sturz: 11,2 · Rinne: 11,2 · Antrieb: 2,0 · TOUCH: 1,0∑-Summen = identisch mit OFFERT 2 Mengen — KreuzvalidierungValidierung
OFFERT 4/5 Nutzung: Für Phase 1 nicht primär nötig — die Summen-Zeile aus OFFERT 4/5 bestätigt die Mengen aus OFFERT 2. In Phase 3 optional: Per-Position UK-Aufschlüsselung aus OFFERT 4/5 lesen um pro Position anzeigen zu können «Pos 1.1 braucht 1,3 lm Sockel, 3,9 lm Wand…». OFFERT 5 ist Superset von OFFERT 4 (mehr Optionsspalten, inkl. Transport) — OFFERT 5 bevorzugen.
7 Uw Uw-Berechnung — wird nicht geparst
Sheet 7 (Uw) enthält den Nachweis der Wärmedämmung nach EN 10077-1+2 mit Swisspacer-U-Werten, Randverbund-PSI-Werten und Labyrinth-Dimensionen. Für den HERO-Angebots-Payload nicht benötigt. Die Ug-Werte (0,5 W/m²K) stehen bereits in OFFERT 1 innerhalb der Positions-Description. Sheet 7 ignorieren.
2 · Sheet-Mapping Format A — Kalkulations-Sheets 1–6 (Backup-Quellen)

Sheets 1–6 als Backup/Ergänzung — Primärquellen sind OFFERT 1 (Sheet 8) und OFFERT 2 (Sheet 9)

1 ELEMENTE Sheet — Positionen & Glasdaten
Spalte (Header Zeile 4)Format / Beispiel→ HERO-FeldStatus
Pos. Nr.1.1, 1.2add_product_position · Positionsbezeichnung + Join-Keyneu
Positionsbez. Kunde«OG 01»add_product_position.name (Präfix)neu
Stk.1add_product_position.quantityneu
Breite mm1.301, 9.871add_product_position.description (B×H)neu
Höhe mm3.911add_product_position.description (B×H)neu
Preis Stk. EUR1.260, 2.615add_product_position.net_priceKEY
2=2-Gleis / 3=3Gleis2, 3add_product_position.descriptionneu
Öffnungsartf, flrf, L, Radd_product_position.descriptionneu
Glasaufbau (3-IV)6 / 6 / 6→ Lookup-Key in 6 GLASLookup
GlasbeschichtungW→ Lookup-Key in 6 GLASLookup
Text (Anmerkung)«Optional Ug 0,5…»add_product_position.description (Anmerkung)neu
Mehrpreis (EUR)170Optional: in description erwähnenoptional
2 MONTAGE Sheet — UK-Mengen pro Position
Spalte / ZeileFormat / Beispiel→ HERO-FeldStatus
Pos. Nr. (Zeile 6 Kol 2)1.1, 1.2Join-Key → gruppiert per Positionneu
b-Code + Menge (Spalte ~22ff)b; 1,3 → Sockel 1.3 lmMengen-Quelle pro Position pro Optionneu
∑-Totale (Zeile 3, Spalte ~72ff)11,172 (Sockel), 7,822 (Wand)create_supply_service.quantityKEY
Elektrischer Antrieb 2=2,02; 2,0create_supply_service.quantity = 2 Stkneu
TOUCH 1=1,01; 1,0create_supply_service.quantity = 1 Stkneu
h Montagezeit (Kol 10)9 h, 70.29 hMontage-Info (Referenz, nicht direkt an HERO)info
3 OPTION Sheet — UK-Katalog mit Preisen & Texten
SpalteBeispielwert→ HERO-FeldStatus
Pos. (Zeile 2)100, 102, 104, 105…Katalog-Key (Join von MONTAGE b-code)neu
Titel«Unterkonstruktion Sockel»create_supply_service.nameKEY
Text (Langtext)«Örtliche Befestigung mittels…»create_supply_service.description (HTML)KEY
Einheitlm, Stk., m2, Pa.create_supply_service.unit_type (→ m, Stk, m², pauschal)neu
Preis EUR147,00 / 74,00 / 4.910,00create_supply_service.net_price_per_unitKEY
∑ (Zeile 2)11,172 / 7,822 / 2create_supply_service.quantity (Backup wenn MONTAGE unklar)neu
Einkauf EUR113,08Intern — nicht an HEROignorieren
Vollständige Daten direkt lesbar: Pos. 100 Sockel 147 EUR/lm · Pos. 102 Wand 74 EUR/lm · Pos. 103 Sturz 85 EUR/lm · Pos. 104 Rinne 282 EUR/lm · Pos. 105 Antrieb 4.910 EUR/Stk · Pos. 106 TOUCH 611 EUR/Stk · Pos. 114 Transport 3.850 EUR/Pa.
6 GLAS Sheet — Lookup-Tabelle Glasspezifikationen
SpalteBeispielwert→ HERO-FeldStatus
Glasaufbau-Code6 / 6 / 6Lookup-Key (kommt aus ELEMENTE)Key
GlasbeschichtungWLookup-Key (kommt aus ELEMENTE)Key
Glasaufbau-VolltextESG-H 6 / ESG-H 6 / ESG-H 6add_product_position.description (Glas-Block)neu
Ug-Wert0,5 W/m²Kadd_product_position.descriptionneu
Lt / g-Wert73 / 54add_product_position.descriptionneu
SG-Nr.SG-31add_product_position.descriptionneu
4 SPRACHE Sheet: Vorbeschreib-Texte pro System (SF1 Classic, SF3 Classic…) in DE/FR/IT. Für Phase 1 nicht nötig — der Vorbeschrieb steht bereits fertig in OFFERT 1 (Sheet 8). SPRACHE als Backup für Mehrsprachen-Support (Phase 4 optional).
5 KALKSCHEMA Sheet: Interne Kalkulationsstruktur (Einkauf, Stunden, Risiko/Gewinn). Nicht benötigt — alle Ausgabewerte stehen bereits in den Output-Sheets (OFFERT 1–2).
Empfohlene Parsing-Strategie: Für Phase 1 primär Sheet 8 (OFFERT 1) für Positions-Descriptions + Sheet 9 (OFFERT 2) für UK-Mengen und Preise lesen. Sheets 1–6 nur als Backup/Validierung. Sheet 6 (GLAS) nur wenn Sheet 8 keinen vollständigen Glastext enthält.
3 · Datenpipeline — Dual-Format, ein Ziel

Beide Formate laufen durch unterschiedliche Parser, erzeugen aber dasselbe interne Datenobjekt

📁
Excel Upload
SheetJS liest .xlsx
beliebiges Format
🔍
Format-Detect
detectFormat(wb)
→ «offert» oder
«merged»
📊
Parser A
OFFERT
⭐ OFFERT 1 (desc)
⭐ OFFERT 2 (mengen)
+ OPTION · GLAS
parseOffertFormat()
|
📋
Parser B
MERGED
Merged Sheet
Additional Data
parseMergedFormat()
🧩
Norm. Objekt
GatewayData {
positionen[]
optionen[]
meta }
Validierung
+ Preview
Fehlende Felder
HERO Projekt
Auswahl
🚀
HERO Payload
→ Angebot
create_document
Entwurf in HERO
Normalisiertes Datenobjekt: Beide Parser erzeugen dasselbe GatewayData-Objekt. Payload-Builder, Validierung und Preview-UI arbeiten nur damit — sie müssen das ursprüngliche Format nicht kennen. Format B (Merged) hat weniger Daten → fehlende Felder (UK-Texte, Glasdetails) werden mit Templates gefüllt.
4 · Umsetzungsfahrplan — 4 Phasen

Jede Phase liefert einen lauffähigen Stand · Gesamtaufwand 20–24h

1
Gateway-Skeleton + Format-Erkennung + Parser A (OFFERT)
Fundament: gateway.html anlegen · detectFormat() · alle 4 OFFERT-Parser · normalisiertes Datenobjekt
7–8h
Aufwand
1.1 · kalkulator/gateway.html anlegen — eigenständige Seite
Eigenständige Seite (kein Kalkulator-Tab). Upload-Zone (Drag & Drop + Klick), SheetJS einbinden, Stepper-UI (5 Schritte: Upload → Parse-Preview → HERO-Projekt suchen + Empfängerdaten prüfen → Angebot bestätigen → Entwurf-Link). Design-Tokens aus Kalkulator übernehmen.
1.5h
1.2 · detectFormat(wb) implementieren
Sheet-Namen prüfen: enthält «ELEMENTE» + «MONTAGE» → Format A. Enthält «merged» oder Zelle mit base-price| → Format B. Unbekannt → Fehlermeldung mit Sheet-Namen-Hinweis.
0.5h
1.3 · parseOffert1Sheet(rows) ⭐ Primärquelle Descriptions
Vorbeschrieb-Block (Zeile 6, Spalte C) als Systemtext extrahieren. Pro Positions-Block: Pos.Nr (Spalte B), Description-Text (Spalte C, nächste Zeile). ZZZ-Position separat. Gibt Map<posNr, {description, vorbeschrieb}>. Falls Sheet 8 nicht vorhanden → Fallback auf parseElementeSheet(rows) für Assemblierung aus ELEMENTE + GLAS.
1.5h
1.4 · parseOffert2Sheet(rows) ⭐ Primärquelle UK-Mengen
Pro UK-Pos-Block: Titel (Titelzeile Spalte C), Langtext (Beschreibungszeile Spalte C), Einheit (D), Menge (E) — gerundeter Endwert, Preis EUR (F). «per» = Option ohne Menge → als 0 + Warnung. Gibt Map<posNr, {name, description, einheit, menge, preis}>. Falls Sheet 9 nicht vorhanden → Fallback auf parseMontageSheet() + parseOptionSheet() Kombination.
1.5h
1.5 · parseOptionSheet(rows) — Preise-Backup
Backup falls OFFERT 2 nicht vorhanden. Header in Zeile 2. Pro Pos-Zeile (100–114): Pos-Nr, Titel, Langtext, Einheit, Preis EUR. Einheit normalisieren: lm→m, Stk.→Stk, Pa.→pauschal, m2→m². Gibt Map<posNr, optionData>.
1h
1.6 · parseGlasSheet(rows) — Glas-Lookup Backup
Lookup-Map: aufbauCode+beschichtung → { volltext, ug, lt, g, sgNr }. Primär nicht nötig — OFFERT 1 enthält bereits «Glas: ESG-H 6 / ESG-H 6 / ESG-H 6\nUg-Wert: 0.5 W/m2K». Nur als Fallback wenn Sheet 8 fehlt und Glasaufbau-Codes aufgelöst werden müssen.
0.5h
1.7 · Normalisiertes GatewayData-Objekt zusammenbauen
Alle Parser zusammenführen: { positionen: [{posNr, description, stk, netPreis}], optionen: [{posNr, name, description, einheit, menge, preis}], glasLookup: {...}, meta: { projektNr, system, waehrung }, zzz: {text, betrag} }. Primärpfad: OFFERT 1 + OFFERT 2. Console-Log nach Upload zeigt vollständiges Objekt — Milestone.
0.5h
2
Validierung + Preview-UI + HERO Projekt-Suche
Nutzer sieht was erkannt wurde · kann editieren · verknüpft HERO-Projekt · bevor gesendet wird
5–6h
Aufwand
2.1 · Positions-Preview-Tabelle
Zeigt alle erkannten Positionen: Pos-Nr, Kundenbezeichnung, System, B×H mm, Gleise, Öffnungsart, Glasaufbau (aufgelöst aus Lookup), VK-Preis/Stk, Menge. Felder direkt editierbar (Preis, Menge). Fehler rot markiert.
1.5h
2.2 · UK/Optionen-Preview mit Checkboxen
Liste aller erkannten UK-Positionen: Name, Einheit, Menge (aus MONTAGE ∑), Preis/Einheit (aus OPTION). Checkboxen zum Ein-/Ausblenden einzelner Positionen. Total-Summe wird live berechnet.
1h
2.3 · HERO Projekt-Suche + Empfängerdaten-Anzeige (read-only)
Suchfeld → HERO GraphQL project_matches(search:) Query via Proxy → Treffer-Liste (Projektname, Kunde, Adresse) → Auswahl speichert project_match_id. Empfänger-Daten (first_name, street, company etc.) werden mitgeladen und zur Kontrolle angezeigt. Kein Überschreiben — HubSpot hat die Daten angelegt, Gateway zeigt sie nur. Mitarbeiter bestätigt «Daten stimmen».
2h
2.4 · Validierungs-Engine
Prüft: mind. 1 Position vorhanden, alle Preise > 0, Glasaufbau auflösbar (oder Warnung), HERO-Projekt ausgewählt, Empfängerdaten bestätigt (Mitarbeiter-Checkbox). Zeigt Fehler-Summary. Sende-Button gesperrt bis alle Fehler + Bestätigungen.
0.5h
3
HERO Payload-Builder + API-Senden + Format B (Merged)
Vollständiger create_document Payload · Angebot in HERO · Merged-Format nachziehen
6–7h
Aufwand
3.1 · buildHeroPayload(gatewayData)
Baut Actions-Array: kein set_recipient mit neuen Daten — Empfänger bereits via HubSpot in HERO gepflegt. Nur: add_text (editierbares Anschreiben-Template) → add_title «Sky-Frame Elemente» → pro Position ein add_product_position mit fertigem Glas-Block (aus OFFERT 1). publish: falseimmer Entwurf, niemals direkt publiziert.
2h
3.2 · UK-Positionen in Payload einbauen
add_title «Unterkonstruktion und Ausrüstung» → pro aktiver (Checkbox ✓) Option: create_supply_service mit name (aus OPTION Titel), description (Langtext als HTML), unit_type, quantity (aus MONTAGE ∑), net_price_per_unit (aus OPTION Preis EUR), vat_percent.
1.5h
3.3 · API-Call + Ergebnis-Handling
GraphQL Mutation create_document via Proxy. Bei Erfolg: HERO-Dokument-Link anzeigen, Toast «Angebot erstellt». Bei Fehler: GraphQL-Error-Message anzeigen, Payload-JSON zum Debuggen einblendbar. publish: false = Entwurf.
1h
3.4 · Format B (Merged) nachziehen
parseMergedFormat(wb): bestehende importFromWorkbook()-Logik in GatewayData überführen. UK-Texte und Glasdetails mit Fix-Templates füllen (da nicht im Merged Sheet). Fehlende Felder in Validierung als Warnung markieren (nicht als Fehler).
1.5h
4
Polish, i18n, Fehlertoleranz & optionale Erweiterungen
Produktionsreif: DE/FR Texte · robuste Edge Cases · Sende-History
3–4h
Aufwand
4.1 · i18n — gw.* Keys in i18n.js
Alle Gateway-Labels DE/EN. Anschreiben-Template in DE/FR je nach project-output-language (aus Additional Data in Format B, oder aus SPRACHE-Sheet in Format A wenn eingebaut).
1h
4.2 · Fehlertoleranz & Edge Cases
Unbekannte Glasaufbau-Codes → Warnung + Platzhalter statt Absturz. Leere MONTAGE-Zeilen ignorieren. OPTION-Zeilen ohne Preis überspringen. Payload-Grössenlimit (400er HERO-Error) abfangen mit verständlicher Meldung.
1h
4.3 · Sende-Protokoll (localStorage)
Liste der letzten Sendungen: Projektname, Datum, HERO-Dokument-ID, Format (A/B), Status. Direkter Link zur HERO-Ansicht. Ermöglicht Nachverfolgung ohne HERO zu öffnen.
0.5h
4.4 · SPRACHE-Sheet für Vorbeschriebe (optional)
Format A enthält im SPRACHE-Sheet fertige Vorbeschreib-Texte pro System (SF1 Classic, SF3 Classic etc.) in DE/FR/IT. Statt Fix-Template → dynamisch aus SPRACHE lesen. Nur wenn Mehrsprachen-Support gewünscht wird.
opt. 1h
5 · Gesamtaufwand

+1–2h gegenüber Single-Format wegen Dual-Format-Erkennung und Format-B-Nachziehen

PhaseKerninhaltAufwandNeues vs. Wiederverwendung
1 gateway.html · detectFormat() · 4 OFFERT-Parser · GatewayData-Objekt 7–8h ~80% neu
2 Preview-Tabellen (Positionen + UK) · HERO Projekt-Suche · Validierung 5–6h ~60% neu
3 Payload-Builder · API-Senden · AGB-Text · Format B (Merged) nachziehen 6–7h ~50% Wiederverwendung
4 i18n · Fehlertoleranz · Sende-History · optionale SPRACHE-Sheet 3–4h ~70% Wiederverwendung
Total MVP (Phase 1–3) 18–21h Beide Formate · vollständiger HERO-Export
Total inkl. Phase 4 21–25h Produktionsreif
Wiederverwendete Module
ModulDateiNutzung
SheetJS-Lader + Workbook-Parsingimport-bridge.js100% — Gateway bindet selbes SheetJS ein
parseColNum / parseColStr / _normimport-bridge.js100% — direkt nutzbar für OFFERT-Parser
parseMergedSheet / parseAdditionalDataimport-bridge.js100% — in parseMergedFormat() einbinden
HERO GraphQL Proxy-Clienthero-test.html100% — extrahieren nach gateway.js
i18n System (I18N.t, applyTranslations)i18n.js100% — neue gw.* Keys ergänzen
Toast + Design CSS-Tokensindex.html~90% — kopieren, leicht anpassen
SYSTEM_TO_GEWERK Mappingimport-bridge.js100% — für Gewerk-Zuweisung
Lessons Learned / API-Referenzdocs/hero-api-referenz.md100% — document_type_id, unit_types etc.
6 · Architektur-Entscheidungen — vollständig geklärt

Alle offenen Fragen beantwortet — keine Blockierungs-Punkte für Phase 1

CRM / HubSpot-Integration: Kontaktdaten und HERO-Projekt werden über die bestehende HubSpot-Schnittstelle angelegt. Das Gateway überträgt / überschreibt keine Kontakt- oder Adressdaten. Stattdessen: HERO-Projekt suchen → vorhandene Empfänger-Daten anzeigen und prüfen → Mitarbeiter bestätigt «stimmt so» → dann erst senden. Kein set_recipient mit neuen Daten — nur Anzeige zur Kontrolle.
Alle Entscheidungen getroffen
✅ MwSt-Satz: Aus Excel-Daten bestimmen — Feld partnerZip / Projektland aus Additional Data oder OPTION-Sheet. AT → 20%, CH → 8.1%. Falls nicht erkennbar → Warnung + manuell wählbar.
✅ Anschreiben-Text: Fix-Template mit editierbarem Textfeld im Gateway. Vorschlag vorausgefüllt — Mitarbeiter kann anpassen bevor gesendet wird.
✅ Entwurf vs. Publizieren: Immer publish: falseniemals direkt publiziert. Entwurf in HERO, Mitarbeiter prüft und publiziert dort manuell.
✅ Gateway-Ort: Eigenständige Seite kalkulator/gateway.html — separates Tool, keine Einbindung in Kalkulator-Navigation.
✅ Kein Tabellenimport: In-Memory-Parsing — alle Daten direkt aus dem Excel
✅ Dual-Format: Beide Exporte unterstützt — automatische Erkennung, kein manueller Switch
✅ Format A primär (12 Sheets): OFFERT 1 (Sheet 8) für Descriptions, OFFERT 2 (Sheet 9) für gerundete UK-Mengen
✅ KALKSCHEMA + Uw: Ignoriert — Ausgabewerte stehen in OFFERT 1 + OFFERT 2
CRM-integrierter Gateway-Workflow
Schritt 1 — HubSpot legt Projekt an
Kontaktdaten, Projektadresse, Empfänger bereits via HubSpot → HERO synchronisiert. Gateway greift auf bestehende Daten zu, erstellt nichts neu.
Schritt 2 — Excel hochladen
Mitarbeiter lädt Sky-Frame TOOL Excel (OFFERT-Format, 12 Sheets) in gateway.html hoch. Format wird automatisch erkannt.
Schritt 3 — HERO-Projekt suchen & Daten prüfen
Suche im HERO via GraphQL → Treffer anzeigen → Auswahl → Empfängerdaten (Name, Firma, Adresse) zur Kontrolle anzeigen. Mitarbeiter bestätigt «stimmt so». Kein Schreiben.
Schritt 4 — Preview & senden
Positionen + UK-Optionen in Preview prüfen → Anschreiben anpassen → Senden. HERO-Angebot als Entwurf angelegt (publish: false). Link zum Entwurf anzeigen.
Schritt 5 — Manuell in HERO publizieren
Mitarbeiter öffnet den Entwurf in HERO, prüft nochmals, und publiziert dort manuell. Gateway publiziert niemals selbst.