Architektura datového modelu
- Produkty — modely dveří, rozměry a cenová matice (model + velikost = cena)
- Komponenty — zárubně, povrchy, kování s vlastními cenami a kompatibilitou
- Vložky a doplňky — cylindrické vložky EVVA s cenami dle délek a počtu stavítek
- Příslušenství & Služby — doplňky, montáže, vzájemné vazby (addon, instalace)
- Obchodní vrstva — cenové nabídky, přirážky, dodací lhůty, administrace
Klíčový návrhový princip: Kompatibilitní tabulky
Osm spojovacích tabulek (frame_compatibility, surface_compatibility,
hardware_compatibility, accessory_compatibility,
installation_compatibility, surcharge_compatibility,
cylinder_extra_compatibility, accessory_addon_link)
umožňují dynamicky filtrovat nabídku v každém kroku konfigurátoru.
Wizard zobrazí pouze položky kompatibilní s vybraným modelem dveří —
bez nutnosti hardcodovat business logiku v aplikaci.
Cenové matice (door_prices, frame_prices, surface_prices,
cylinder_prices) pokrývají případ, kdy stejná komponenta stojí jinak
podle velikosti dveří, skupiny modelů nebo délky vložky.
Zóna 1: Produkty
Základní entita systému. 17 modelů bezpečnostních dveří (SD 101 až SD 23), 5 standardních velikostí a cenová matice model + velikost = cena.
door_models
17 záznamůHlavní tabulka modelů bezpečnostních dveří. Obsahuje technické parametry (bezpečnostní třída 1-5, požární odolnost EI 20/30/45, směr otevírání, dvoukřídlé) i prezentační data (obrázky, popis).
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| slug | text UQ | URL-friendly identifikátor (sd-101, sd-102-df) |
| name | text | Zobrazovaný název (SD 101, SD 102 DF) |
| description | text | Popis modelu |
| security_body | text | Typ bezpečnostního tělesa |
| security_class | integer | Bezpečnostní třída (1-5), default 3 |
| fire_rating | text | Požární odolnost: EI 20, EI 30, EI 45 nebo null |
| opening_direction | enum ENUM | inward / outward / both |
| is_double_wing | boolean | Dvoukřídlé dveře (SD 102 D, SD 102 DF) |
| image_url | text | Hlavní foto produktu |
| image_source | text | Zdroj obrázku (next.cz) |
| cutaway_image_url | text | Řez dveřmi |
| cross_section_image_url | text | Průřez dveřmi |
| sort_order | integer | Pořadí zobrazení |
| is_active | boolean | Viditelný v konfigurátoru |
| created_at | timestamp | Datum vytvoření |
| updated_at | timestamp | Datum poslední změny (auto-update) |
door_sizes
5 záznamůStandardní rozměry dveří. 5 velikostí: 197x80, 197x90, 210x90, 220x90, 240x90. Atypické rozměry se řeší přirážkou 30%.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| width | integer | Šířka v cm |
| height | integer | Výška v cm |
| label | text | Lidsky čitelný popisek ("197 x 80") |
| is_standard | boolean | Standardní rozměr (bez přirážky) |
| sort_order | integer | Pořadí zobrazení |
door_prices
cenová maticeCenová matice: každá kombinace model + velikost má svou cenu. UNIQUE constraint na (door_model_id, door_size_id).
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| door_model_id | integer FK | Odkaz na door_models |
| door_size_id | integer FK | Odkaz na door_sizes |
| price | numeric(10,2) | Cena v Kč bez DPH |
Zóna 2: Komponenty
Zárubně, povrchové úpravy a kování. Každá skupina má vlastní tabulku, kompatibilitní vazbu na modely dveří a cenovou logiku (dle velikosti, skupiny modelů nebo fixní cena).
frame_types
7 záznamůTypy zárubní: SF1-100, SF1-150, SF2A varianty, SF2E, SF4. Kompatibilita s modely dveří přes frame_compatibility.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| slug | text UQ | Identifikátor (sf1-100, sf2a-laminate) |
| name | text | Zobrazovaný název |
| description | text | Popis zárubně |
| image_url | text | Foto zárubně |
| image_source | text | Zdroj obrázku |
| sort_order | integer | Pořadí |
| is_active | boolean | Viditelný |
frame_prices
cenová maticeCena zárubně závisí na typu zárubně i velikosti dveří. UNIQUE (frame_type_id, door_size_id).
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| frame_type_id | integer FK | Odkaz na frame_types |
| door_size_id | integer FK | Odkaz na door_sizes |
| price | numeric(10,2) | Cena v Kč bez DPH |
surface_finishes
99+ záznamůPovrchové úpravy dveří. 8 kategorií: laminát, dýha, H-DEX, kazetové masiv, kazetové MDF, prosklené, CPL, nerez.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| slug | text UQ | Identifikátor |
| name | text | Zobrazovaný název |
| category | enum ENUM | laminate, veneer, hdex, cassette_solid, cassette_mdf, glass, cpl, stainless |
| description | text | Popis povrchu |
| image_url | text | Vzorek povrchu |
| image_source | text | Zdroj obrázku |
| sort_order | integer | Pořadí |
| is_active | boolean | Viditelný |
surface_prices
cenová maticeCena povrchu závisí na skupině modelů (sd101_111 vs sd102_121_104), straně dveří a rozměru. Podporuje přirážku za nadrozměr.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| surface_finish_id | integer FK | Odkaz na surface_finishes |
| door_model_group | text | Skupina modelů (sd101_111, sd102_121_104) |
| side | enum ENUM | inner / outer / both |
| price | numeric(10,2) | Cena v Kč bez DPH |
| max_width | integer | Max. šířka bez přirážky (null = bez limitu) |
| max_height | integer | Max. výška bez přirážky |
| oversize_surcharge_percent | integer | Přirážka za nadrozměr v % (30, 50) |
hardware
34 záznamůBezpečnostní kování. Fixní cena za sadu, kompatibilita s modely dveří přes hardware_compatibility.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| slug | text UQ | Identifikátor |
| name | text | Název kování |
| description | text | Popis |
| security_class | integer | Bezpečnostní třída kování |
| price | numeric(10,2) | Cena v Kč bez DPH |
| image_url | text | Foto kování |
| image_source | text | Zdroj obrázku |
| sort_order | integer | Pořadí |
| is_active | boolean | Viditelný |
*_compatibility (spojovací)
3 tabulkyframe_compatibility, surface_compatibility, hardware_compatibility — N:M spojovací tabulky mezi door_models a příslušnou komponentou. Wizard zobrazí pouze kompatibilní položky.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| door_model_id | integer FK | Odkaz na door_models |
| [component]_id | integer FK | Odkaz na příslušnou komponentu |
Zóna 3: Vložky a doplňky
Cylindrické vložky EVVA s cenami dle délky a počtu stavítek. 10 typů (5 standardních + 5 AZ pro horní zámek SD 3/23). Doplňky válců (náhradní klíče, bezpečnostní balení apod.) s kompatibilitní vazbou.
cylinder_types
10 záznamůTypy cylindrických vložek EVVA: FPS, EPS, MCS, 4KS, 3KS + jejich AZ varianty pro horní zámek modelů SD 3 a SD 23.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| slug | text UQ | Identifikátor (evva-fps, evva-fps-az) |
| name | text | Zobrazovaný název |
| brand | text | Výrobce (default EVVA) |
| security_class | integer | Bezpečnostní třída |
| keys_included | integer | Počet klíčů v sadě (default 3) |
| image_url | text | Foto vložky |
| image_source | text | Zdroj obrázku |
| sort_order | integer | Pořadí |
| is_active | boolean | Viditelný |
cylinder_prices
cenová maticeCena vložky závisí na typu a délce (v mm). Některé typy mají varianty počtu stavítek.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| cylinder_type_id | integer FK | Odkaz na cylinder_types |
| length | integer | Délka vložky v mm |
| pin_counts | text | Počty stavítek ("5" nebo "8,11,12") |
| price | numeric(10,2) | Cena v Kč bez DPH |
cylinder_extras
7 záznamůDoplňky k válcům: náhradní klíče, bezpečnostní balení, přívěsek, karta majitele apod.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| name | text | Název doplňku |
| description | text | Popis |
| price | numeric(10,2) | Cena v Kč bez DPH |
| is_per_unit | boolean | Cena za kus (náhradní klíč) |
| sort_order | integer | Pořadí |
cylinder_extra_compatibility
spojovacíN:M vazba mezi cylinder_types a cylinder_extras. Určuje, které doplňky jsou dostupné pro který typ vložky.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| cylinder_extra_id | integer FK | Odkaz na cylinder_extras |
| cylinder_type_id | integer FK | Odkaz na cylinder_types |
Zóna 4: Příslušenství & Služby
27 příslušenství (kukátka, řetízky, zavírače, elektrické otvírače) a 28 montážních služeb. Vzájemné vazby: příslušenství může mít přiřazenou montáž (accessory_installation_link) a doplňky (accessory_addon_link, vazba na sebe sama).
accessories
27 záznamůDoplňkové příslušenství k dveřím. Kategorie: peephole, chain, closer, electric_opener, other. Některé jsou jen pro expertní režim.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| slug | text UQ | Identifikátor |
| name | text | Název příslušenství |
| category | text | Kategorie (peephole, chain, closer, electric_opener, other) |
| description | text | Popis |
| price | numeric(10,2) | Cena v Kč bez DPH |
| image_url | text | Foto příslušenství |
| image_source | text | Zdroj obrázku |
| sort_order | integer | Pořadí |
| is_active | boolean | Viditelný |
| is_expert_only | boolean | Pouze v expertním režimu |
accessory_categories
číselníkČíselník kategorií příslušenství. Flag is_exclusive řídí radio-button chování (v rámci kategorie lze zvolit jen jedno).
| Sloupec | Typ | Popis |
|---|---|---|
| slug | text PK | Primární klíč (peephole, chain, closer...) |
| label | text | Zobrazovaný název kategorie |
| is_exclusive | boolean | Exkluzivní výběr (radio chování) |
| sort_order | integer | Pořadí |
installations
28 záznamůMontážní služby: montáž dveří, demontáž, bourání, zednické práce, elektro apod. Kategorizováno dle skupiny modelů.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| slug | text UQ | Identifikátor |
| name | text | Název služby |
| category | text | Kategorie (sd3, sd101_111_102, other) |
| description | text | Popis služby |
| price | numeric(10,2) | Cena v Kč bez DPH |
| sort_order | integer | Pořadí |
| is_active | boolean | Viditelný |
| is_expert_only | boolean | Pouze v expertním režimu |
Spojovací tabulky (3)
N:M vazby
accessory_compatibility — dveře N:M příslušenství
installation_compatibility — dveře N:M montáže
accessory_installation_link — příslušenství N:M montáž (automatická nabídka montáže při výběru příslušenství)
accessory_addon_link — příslušenství N:M příslušenství (vazba na sebe sama; např. kukátko + prodloužení)
| Tabulka | FK 1 | FK 2 |
|---|---|---|
| accessory_compatibility | accessory_id | door_model_id |
| installation_compatibility | installation_id | door_model_id |
| accessory_installation_link | accessory_id | installation_id |
| accessory_addon_link | parent_accessory_id | child_accessory_id |
Zóna 5: Obchodní vrstva
Přirážky, cenové nabídky, dodací lhůty a administrátorské účty. 50+ přirážek ve 4 kategoriích (speciální úpravy, zárubně, povrchy, dodávka).
surcharges
50+ záznamůPřirážky a speciální úpravy: Kit exteriér/dB, kouřotěsnost, RAL barvy zárubní, panty, nerez lišty, zateplení, světlíky, zrychlená/expresní dodávka aj. Kompatibilita přes surcharge_compatibility.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| slug | text UQ | Identifikátor |
| name | text | Název přirážky |
| category | text | special_modification, environment, delivery aj. |
| description | text | Popis |
| surcharge_type | enum ENUM | percentage (%) nebo fixed (Kč) |
| value | numeric(10,2) | Hodnota přirážky (procento nebo částka) |
| sort_order | integer | Pořadí |
| is_active | boolean | Viditelný |
quotes
cenové nabídkyCenové nabídky z konfigurátoru. 6 stavů: draft, submitted, reviewed, quoted, accepted, cancelled. Kompletní cenový rozklad (8 kategorií + total).
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| quote_number | text UQ | Číslo nabídky |
| status | enum ENUM | draft / submitted / reviewed / quoted / accepted / cancelled |
| customer_* | text (5 sloupců) | name, email, phone, address, note |
| admin_note | text | Interní poznámka administrátora |
| configuration | jsonb | Kompletní konfigurace (imutabilní snapshot) |
| base_price | numeric(10,2) | Základní cena dveří |
| frame_price | numeric(10,2) | Cena zárubně |
| surface_price | numeric(10,2) | Cena povrchů |
| hardware_price | numeric(10,2) | Cena kování |
| cylinder_price | numeric(10,2) | Cena vložky |
| accessories_price | numeric(10,2) | Cena příslušenství |
| installation_price | numeric(10,2) | Cena montáže |
| surcharges_price | numeric(10,2) | Přirážky celkem |
| total_price | numeric(10,2) | Celková cena |
| created_at | timestamp | Datum vytvoření |
| updated_at | timestamp | Datum poslední změny |
delivery_times
dodací lhůtyDodací lhůty pro jednotlivé komponenty (dveře + povrch, vložka, zárubeň). Podporuje standardní, zrychlenou, expresní a nestandardní variantu.
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| component | text | Typ komponenty (door_surface, cylinder, frame) |
| match_key | text | Klíč pro lookup (sd101_group:laminate) |
| standard_days | integer | Standardní lhůta v pracovních dnech |
| standard_label | text | Lidsky čitelný popisek ("2 týdny") |
| accelerated_label | text | Zrychlená varianta ("7 dní") |
| express_label | text | Expresní varianta ("3 dny") |
| non_standard_label | text | Nestandardní rozměr ("5 týdnů") |
admin_users
administraceAdministrátorské účty. Autentizace přes NextAuth v5 + CredentialsProvider, hesla hashovaná Node.js crypto.scrypt (formát salt:hash).
| Sloupec | Typ | Popis |
|---|---|---|
| id | serial PK | Primární klíč |
| text UQ | E-mailová adresa | |
| password_hash | text | Hash hesla (scrypt, formát salt:hash) |
| name | text | Jméno administrátora |
| is_active | boolean | Aktivní účet |
| created_at | timestamp | Datum vytvoření |
Tok dat v konfiguračním wizardu (8 kroků)
1. Výběr modelu → dotaz na door_models (filtr dle bezpečnostní třídy, požární odolnosti, směru)
2. Rozměry → door_sizes + door_prices WHERE door_model_id = X
3. Zárubeň → frame_types JOIN frame_compatibility WHERE door_model_id = X, ceny z frame_prices
4. Povrch → surface_finishes JOIN surface_compatibility, ceny z surface_prices dle door_model_group + side
5. Kování → hardware JOIN hardware_compatibility WHERE door_model_id = X
6. Vložka → cylinder_types + cylinder_prices + cylinder_extras (univerzální)
7. Příslušenství & Montáž → accessories + installations přes *_compatibility, vazby přes link tabulky
8. Shrnutí → celkový cenový rozklad + surcharges → uložení do quotes
Statistiky datového modelu
25+ tabulek celkem — 8 kompatibilitních/spojovacích tabulek — 5 cenových matic (door_prices, frame_prices, surface_prices, cylinder_prices, surcharges) — 5 PostgreSQL enumů (opening_direction, surface_category, surface_side, surcharge_type, order_status) — 17 modelů dveří, 5 velikostí, 7 zárubní, 99+ povrchů, 34 kování, 10 válců, 27 příslušenství, 28 montáží, 50+ přirážek.
Zdrojová data: Ceník bezpečnostních dveří NEXT s.r.o. (docs/cenik-SD-2024.pdf), duben 2024, 4 strany.
Veškerá seed data v src/db/seed.ts přesně odpovídají tomuto ceníku.