1 Struktura exportu konfigurace

Každá dokončená konfigurace se uloží do tabulky quotes jako JSONB snímek. Tento záznam obsahuje kompletní popis dveří včetně cenového rozpadu a zákaznických údajů. Slouží jako kanonický zdroj dat pro export do libovolného ERP systému.

{
  "id": 42,
  "status": "submitted",

  // Zákaznické údaje
  "customerName": "Jan Novák",
  "customerEmail": "jan@example.com",
  "customerPhone": "+420 777 123 456",
  "customerNote": "Prosím montáž v pondělí",

  // Kompletní konfigurace dveří (JSONB snímek)
  "configuration": {
    "doorModel": {
      "id": 5, "slug": "sd-102-f", "name": "SD 102 F",
      "securityClass": 3, "fireRating": "EI 30"
    },
    "doorSize": {
      "id": 2, "label": "197 × 90",
      "widthCm": 90, "heightCm": 197, "price": 24900
    },
    "isAtypicalSize": false,
    "frame": {
      "id": 3, "slug": "sf2a-ocel",
      "name": "SF2A ocelová", "price": 4200
    },
    "innerSurface": {
      "id": 15, "slug": "laminate-dub",
      "name": "Laminát dub", "category": "laminate", "price": 1200
    },
    "outerSurface": {
      "id": 15, "slug": "laminate-dub",
      "name": "Laminát dub", "category": "laminate", "price": 0
    },
    "hardware": {
      "id": 8, "slug": "rn1-nerez",
      "name": "RN1 nerez", "price": 2900
    },
    "cylinder": {
      "id": 1, "slug": "evva-eps", "name": "EVVA EPS",
      "length": "31/36", "pinCount": 5, "price": 1850
    },
    "cylinderExtras": [
      { "id": 2, "name": "Náhradní klíč EVVA EPS", "price": 350 }
    ],
    "accessories": [
      { "id": 12, "slug": "electronic-peephole-veiu-s31",
        "name": "Elektronické kukátko VEIU S31", "price": 7100 }
    ],
    "installations": [
      { "id": 5, "slug": "peephole-setup",
        "name": "Zapojení a oživení elektronického kukátka Veiu", "price": 1190 },
      { "id": 1, "slug": "professional-install",
        "name": "Odborná montáž", "price": 6500 }
    ],
    "surcharges": []
  },

  // Cenový rozpad (snímek v okamžiku odeslání)
  "priceBreakdown": {
    "basePrice": 24900,
    "framePrice": 4200,
    "innerSurfacePrice": 1200,
    "outerSurfacePrice": 0,
    "hardwarePrice": 2900,
    "cylinderPrice": 1850,
    "cylinderExtrasPrice": 350,
    "accessoriesPrice": 7100,
    "installationsPrice": 7690,
    "surchargesPrice": 0,
    "totalPrice": 50190
  },

  "totalPrice": 50190,
  "createdAt": "2026-03-03T10:30:00Z"
}

Proč JSONB snímek?

Celá konfigurace je uložena jako JSONB v PostgreSQL. Ceny jsou zafixovány v momentě objednávky — i když se ceník později změní, historická poptávka zůstává neměnná. Z JSONB snímku lze kdykoli rekonstruovat kompletní kusovník (BOM) pro výrobu.

Košík pro více dveří

Zákazník může nakonfigurovat více dveří najednou. Každá položka košíku je nezávislá konfigurace s vlastním cenovým rozpadem. Při odeslání objednávky se vytvoří pole konfigurací — každá konfigurace odpovídá jedné pozici (řádku) v objednávce ERP.

2 Mapování na ERP entity

JSONB konfigurace se mapuje na standardní ERP entity. Následující tabulka ukazuje, jak jednotlivé části záznamu odpovídají konceptům v typickém ERP systému (SAP, Helios, Pohoda, Money S5 apod.).

JSONB pole ERP entita Popis
quotes.id Sales Order (hlavička) Jedna poptávka = jedna objednávka; zákaznické údaje v hlavičce
configuration[] Pozice objednávky Každé dveře v košíku = jeden řádek objednávky s vlastním BOM
doorModel + doorSize Hlavní výrobek Bezpečnostní dveře jako hotový výrobek; atypický rozměr = přirážka 30 %
frame BOM řádek: zárubeň Typ zárubně vázaný na model a rozměr dveří
innerSurface / outerSurface BOM řádky: povrchy Vnitřní a vnější strana; při shodném povrchu se druhá strana účtuje za 0 Kč
hardware BOM řádek: kování Bezpečnostní kování s vazbou na kompatibilitu modelu
cylinder + cylinderExtras BOM řádky: vložka + přísl. Cylindrická vložka EVVA + náhradní klíče, karta apod.
accessories[] Doplňkové položky BOM Kukátko, řetízek, těsnicí lišta — baleno samostatně nebo předmontováno
installations[] Servisní položky Nehmotné položky (montáž, zapojení) — plánovány jako servisní zakázky
surcharges[] Příplatkové řádky Speciální úpravy, exteriér, kouřotěsnost, zrychlená dodávka aj.
priceBreakdown Cenová kalkulace Snímek pro porovnání s ERP ceníkem; slouží jako revizní stopa

3 Generování kusovníku (BOM)

Z každé konfigurace dveří lze automaticky sestavit kusovník pro výrobu. Každá položka JSONB snímku odpovídá jednomu řádku BOM s vlastním SKU:

// BOM pro jedny dveře (z konfigurace výše)
BOM #Q-2026-042
├── NEXT-SD102F-197x90       // Hlavní výrobek: SD 102 F, 197×90
│   ├── NEXT-SF2A-197x90    // Zárubeň: SF2A ocelová
│   ├── NEXT-LAM-DUB-INNER  // Povrch vnitřní: Laminát dub
│   ├── NEXT-LAM-DUB-OUTER  // Povrch vnější: Laminát dub (0 Kč = stejný)
│   ├── NEXT-RN1-NEREZ      // Kování: RN1 nerez
│   ├── NEXT-EVVA-EPS-31-36 // Vložka: EVVA EPS 31/36
│   └── NEXT-KEY-EPS        // Přísl. vložky: náhradní klíč
├── Příslušenství
│   └── NEXT-VEIU-S31       // Elektronické kukátko VEIU S31
└── Služby
    ├── NEXT-SVC-VEIU       // Zapojení kukátka
    └── NEXT-SVC-MONTAZ     // Odborná montáž

Návrh struktury SKU

Pole slug u každé komponenty slouží jako základ pro SKU kód. Navrhovaná konvence pro propojení s ERP katalogem:

NEXT-SD102F-197x90 Model dveří + rozměr
NEXT-SF2A-197x90 Zárubeň + rozměr
NEXT-LAM-DUB-INNER Povrch + strana (inner/outer)
NEXT-RN1-NEREZ Kování
NEXT-EVVA-EPS-31-36 Cylindrická vložka + délka
NEXT-KEY-EPS Příslušenství vložky
NEXT-VEIU-S31 Příslušenství (z accessory slug)
NEXT-SVC-MONTAZ Servisní položka (z installation slug)

Kompletace dveří dle BOM

BOM slouží jako kompletační list pro výrobu. Každá položka = jeden díl k montáži. Povrchy specifikují obě strany (vnitřní/vnější) — klíčové pro výrobu. Atypické rozměry obsahují přesné rozměry pro řez. Příslušenství je baleno samostatně nebo předmontováno. Montáže jsou plánovány jako servisní zakázky.

4 Postup: od konfigurace po expedici

Celkový tok dat od konfigurace zákazníkem po expedici hotových dveří (7 kroků):

1
Zákazník konfiguruje dveře ve wizardu WEB
8-krokový průvodce: Model → Rozměr → Zárubeň → Povrch → Kování → Vložka → Doplňky → Shrnutí. Stav v Zustand store.
2
Odeslání poptávky WEB DB
POST /api/quotes — zápis do tabulky quotes se status submitted. Celá konfigurace jako JSONB.
3
Obchodník přezkoumá v admin panelu ADMIN
Ověření konfigurace v /admin/quotes. Změna stavu na reviewed.
4
Cenová nabídka zákazníkovi ADMIN
Odeslání nabídky zákazníkovi. Změna stavu na quoted.
5
Zákazník akceptuje nabídku WEB → ERP
Změna stavu na accepted. Spuštění exportu do ERP systému.
6
Export do ERP: Sales Order + BOM generace ERP
Vytvoření objednávky v ERP. Z JSONB snímku se automaticky sestaví kusovník → zahájení výroby.
7
Výroba dle BOM, kompletace, expedice ERP
Výroba dle specifikace: rozměr, povrch obou stran, kování, vložka. Webhook zpět do konfigurátoru se stavem expedice.

Směr komunikace

WEB = akce v konfigurátoru   ADMIN = akce v admin panelu   DB = zápis do PostgreSQL   ERP = akce v ERP systému   WEB → ERP = přenos dat mezi systémy.

Konfigurace + Košík + Poptávka + Schválení + Export + Výroba + Expedice

5 Životní cyklus poptávky

Každá poptávka v tabulce quotes prochází definovanými stavy. Stavové přechody řídí admin panel a webhook notifikace z ERP:

submitted  ──── Zákazník odeslal poptávku
    │
    ▼
reviewed   ──── Obchodník přezkoumal konfiguraci
    │
    ▼
quoted     ──── Cenová nabídka odeslána zákazníkovi
    │
    ├──▶ rejected  ── Zákazník odmítl / obchodník zamítl
    │
    ▼
accepted   ──── Zákazník akceptoval → export do ERP
    │
    ▼
in_production ─ ERP: výroba zahájena (webhook)
    │
    ▼
shipped    ──── ERP: expedováno (webhook)

6 Poznámka k přenosu dat

Konfigurátor neřeší konkrétní přenosový mechanismus do ERP (REST API, CSV export, přímé DB propojení). Důležitý je formát dat a logická struktura zápisu. Všechna data jsou uložena v PostgreSQL jako JSONB, odkud je lze transformovat do libovolného ERP formátu:

Konfigurace je self-contained — celý kusovník lze rekonstruovat z jediného JSONB záznamu bez nutnosti dotazovat další tabulky.

7 Klíčové principy

Snímek konfigurace (JSONB)
Ceny, názvy a kódy jsou uloženy v okamžiku objednávky. I když se ceník později změní, historická objednávka zůstává neměnná. Kompletní BOM rekonstruovatelný z jednoho JSONB pole.
SKU-based propojení
Pole slug u každé komponenty slouží jako jednoznačný identifikátor (SKU) mezi konfigurátorem a ERP. Jeden kód, dva systémy — žádné mapování navíc.
Idempotentní API volání
Každé volání obsahuje unikátní id poptávky. Opakované odeslání nevytvoří duplikát — ERP rozpozná existující objednávku a vrátí její stav.
Podpora více dveří v košíku
Košík může obsahovat více dveří (Zustand + localStorage). Do ERP se pošle jedna objednávka s více řádky — každý řádek = jeden kusovník.
Webhook synchronizace
ERP odesílá stavové změny (vyrobeno, expedováno) zpět do konfigurátoru. Zákazník vidí aktuální stav bez manuálních aktualizací.
Revizní stopa
Každá změna stavu je logována s časovým razítkem. Kompletní historie objednávky od poptávky po doručení. Cenový snímek umožňuje zpětnou kontrolu.