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.

Produkty
Komponenty
Vložky, příslušenství a služby
Obchodní vrstva
1 : N
N : M (přes spojovací tabulku)
PK
FK
1:N 1:N N:M 1:N door_sizes N:M 1:N N:M 1:N N:M N:M N:M N:M self N:M N:M
Produkty
Komponenty
Vložky a doplňky
Příslušenství & Služby
Obchodní vrstva
Obchodní vrstva
door_models
id serial PK
slug text UNIQUE
name text
description text
security_body text
security_class integer
fire_rating text
opening_direction enum
is_double_wing boolean
image_url text
image_source text
cutaway_image_url text
cross_section_image_url text
sort_order integer
is_active boolean
created_at timestamp
updated_at timestamp
door_sizes
id serial PK
width integer
height integer
label text
is_standard boolean
sort_order integer
door_prices
id serial PK
door_model_id FK → door_models
door_size_id FK → door_sizes
price numeric(10,2)
UNIQUE (door_model_id, door_size_id)
frame_compatibility
id serial PK
door_model_id FK
frame_type_id FK
UNIQUE (frame_type_id, door_model_id)
frame_types
id serial PK
slug text UNIQUE
name text
description text
image_url text
image_source text
sort_order integer
is_active boolean
frame_prices
id serial PK
frame_type_id FK → frame_types
door_size_id FK → door_sizes
price numeric(10,2)
UNIQUE (frame_type_id, door_size_id)
surface_compatibility
id serial PK
surface_finish_id FK
door_model_id FK
UNIQUE (surface_finish_id, door_model_id)
surface_finishes
id serial PK
slug text UNIQUE
name text
category enum (8 hodnot)
description text
image_url text
image_source text
sort_order integer
is_active boolean
surface_prices
id serial PK
surface_finish_id FK → surface_finishes
door_model_group text
side enum (inner/outer/both)
price numeric(10,2)
max_width integer
max_height integer
oversize_surcharge_percent integer
UNIQUE (surface_finish_id, door_model_group, side)
hardware_compatibility
id serial PK
hardware_id FK
door_model_id FK
UNIQUE (hardware_id, door_model_id)
hardware
id serial PK
slug text UNIQUE
name text
description text
security_class integer
price numeric(10,2)
image_url text
image_source text
sort_order integer
is_active boolean
🔒 cylinder_types
id serial PK
slug text UNIQUE
name text
brand text
security_class integer
keys_included integer
image_url text
image_source text
sort_order integer
is_active boolean
🔒 cylinder_prices
id serial PK
cylinder_type_id FK → cylinder_types
length integer (mm)
pin_counts text
price numeric(10,2)
UNIQUE (cylinder_type_id, length)
cylinder_extra_compatibility
id serial PK
cylinder_extra_id FK
cylinder_type_id FK
UNIQUE (cylinder_extra_id, cylinder_type_id)
🔒 cylinder_extras
id serial PK
name text
description text
price numeric(10,2)
is_per_unit boolean
sort_order integer
accessory_compatibility
id serial PK
accessory_id FK
door_model_id FK
UNIQUE (accessory_id, door_model_id)
accessories
id serial PK
slug text UNIQUE
name text
category text
description text
price numeric(10,2)
image_url text
image_source text
sort_order integer
is_active boolean
is_expert_only boolean
accessory_categories
slug text PK
label text
is_exclusive boolean
sort_order integer
installation_compatibility
id serial PK
installation_id FK
door_model_id FK
UNIQUE (installation_id, door_model_id)
installations
id serial PK
slug text UNIQUE
name text
category text
description text
price numeric(10,2)
sort_order integer
is_active boolean
is_expert_only boolean
accessory_installation_link
id serial PK
accessory_id FK → accessories
installation_id FK → installations
UNIQUE (accessory_id, installation_id)
accessory_addon_link
id serial PK
parent_accessory_id FK → accessories
child_accessory_id FK → accessories
UNIQUE (parent_accessory_id, child_accessory_id)
surcharge_compatibility
id serial PK
surcharge_id FK
door_model_id FK
UNIQUE (surcharge_id, door_model_id)
% surcharges
id serial PK
slug text UNIQUE
name text
category text
description text
surcharge_type enum %/fixed
value numeric(10,2)
sort_order integer
is_active boolean
quotes
id serial PK
quote_number text UNIQUE
status enum (6 stavů)
customer_name text
customer_email text
customer_phone text
customer_address text
customer_note text
admin_note text
configuration jsonb
base_price numeric(10,2)
frame_price numeric(10,2)
surface_price numeric(10,2)
hardware_price numeric(10,2)
cylinder_price numeric(10,2)
accessories_price numeric(10,2)
installation_price numeric(10,2)
surcharges_price numeric(10,2)
total_price numeric(10,2)
created_at timestamp
updated_at timestamp
delivery_times
id serial PK
component text
match_key text
standard_days integer
standard_label text
accelerated_label text
express_label text
non_standard_label text
UNIQUE (component, match_key)
admin_users
id serial PK
email text UNIQUE
password_hash text
name text
is_active boolean
created_at timestamp

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).

SloupecTypPopis
idserial PKPrimární klíč
slugtext UQURL-friendly identifikátor (sd-101, sd-102-df)
nametextZobrazovaný název (SD 101, SD 102 DF)
descriptiontextPopis modelu
security_bodytextTyp bezpečnostního tělesa
security_classintegerBezpečnostní třída (1-5), default 3
fire_ratingtextPožární odolnost: EI 20, EI 30, EI 45 nebo null
opening_directionenum ENUMinward / outward / both
is_double_wingbooleanDvoukřídlé dveře (SD 102 D, SD 102 DF)
image_urltextHlavní foto produktu
image_sourcetextZdroj obrázku (next.cz)
cutaway_image_urltextŘez dveřmi
cross_section_image_urltextPrůřez dveřmi
sort_orderintegerPořadí zobrazení
is_activebooleanViditelný v konfigurátoru
created_attimestampDatum vytvoření
updated_attimestampDatum 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%.

SloupecTypPopis
idserial PKPrimární klíč
widthintegerŠířka v cm
heightintegerVýška v cm
labeltextLidsky čitelný popisek ("197 x 80")
is_standardbooleanStandardní rozměr (bez přirážky)
sort_orderintegerPořadí zobrazení

door_prices

cenová matice

Cenová matice: každá kombinace model + velikost má svou cenu. UNIQUE constraint na (door_model_id, door_size_id).

SloupecTypPopis
idserial PKPrimární klíč
door_model_idinteger FKOdkaz na door_models
door_size_idinteger FKOdkaz na door_sizes
pricenumeric(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.

SloupecTypPopis
idserial PKPrimární klíč
slugtext UQIdentifikátor (sf1-100, sf2a-laminate)
nametextZobrazovaný název
descriptiontextPopis zárubně
image_urltextFoto zárubně
image_sourcetextZdroj obrázku
sort_orderintegerPořadí
is_activebooleanViditelný

frame_prices

cenová matice

Cena zárubně závisí na typu zárubně i velikosti dveří. UNIQUE (frame_type_id, door_size_id).

SloupecTypPopis
idserial PKPrimární klíč
frame_type_idinteger FKOdkaz na frame_types
door_size_idinteger FKOdkaz na door_sizes
pricenumeric(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.

SloupecTypPopis
idserial PKPrimární klíč
slugtext UQIdentifikátor
nametextZobrazovaný název
categoryenum ENUMlaminate, veneer, hdex, cassette_solid, cassette_mdf, glass, cpl, stainless
descriptiontextPopis povrchu
image_urltextVzorek povrchu
image_sourcetextZdroj obrázku
sort_orderintegerPořadí
is_activebooleanViditelný

surface_prices

cenová matice

Cena povrchu závisí na skupině modelů (sd101_111 vs sd102_121_104), straně dveří a rozměru. Podporuje přirážku za nadrozměr.

SloupecTypPopis
idserial PKPrimární klíč
surface_finish_idinteger FKOdkaz na surface_finishes
door_model_grouptextSkupina modelů (sd101_111, sd102_121_104)
sideenum ENUMinner / outer / both
pricenumeric(10,2)Cena v Kč bez DPH
max_widthintegerMax. šířka bez přirážky (null = bez limitu)
max_heightintegerMax. výška bez přirážky
oversize_surcharge_percentintegerPř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.

SloupecTypPopis
idserial PKPrimární klíč
slugtext UQIdentifikátor
nametextNázev kování
descriptiontextPopis
security_classintegerBezpečnostní třída kování
pricenumeric(10,2)Cena v Kč bez DPH
image_urltextFoto kování
image_sourcetextZdroj obrázku
sort_orderintegerPořadí
is_activebooleanViditelný

*_compatibility (spojovací)

3 tabulky

frame_compatibility, surface_compatibility, hardware_compatibility — N:M spojovací tabulky mezi door_models a příslušnou komponentou. Wizard zobrazí pouze kompatibilní položky.

SloupecTypPopis
idserial PKPrimární klíč
door_model_idinteger FKOdkaz na door_models
[component]_idinteger FKOdkaz 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.

SloupecTypPopis
idserial PKPrimární klíč
slugtext UQIdentifikátor (evva-fps, evva-fps-az)
nametextZobrazovaný název
brandtextVýrobce (default EVVA)
security_classintegerBezpečnostní třída
keys_includedintegerPočet klíčů v sadě (default 3)
image_urltextFoto vložky
image_sourcetextZdroj obrázku
sort_orderintegerPořadí
is_activebooleanViditelný
🔒

cylinder_prices

cenová matice

Cena vložky závisí na typu a délce (v mm). Některé typy mají varianty počtu stavítek.

SloupecTypPopis
idserial PKPrimární klíč
cylinder_type_idinteger FKOdkaz na cylinder_types
lengthintegerDélka vložky v mm
pin_countstextPočty stavítek ("5" nebo "8,11,12")
pricenumeric(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.

SloupecTypPopis
idserial PKPrimární klíč
nametextNázev doplňku
descriptiontextPopis
pricenumeric(10,2)Cena v Kč bez DPH
is_per_unitbooleanCena za kus (náhradní klíč)
sort_orderintegerPoř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.

SloupecTypPopis
idserial PKPrimární klíč
cylinder_extra_idinteger FKOdkaz na cylinder_extras
cylinder_type_idinteger FKOdkaz 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.

SloupecTypPopis
idserial PKPrimární klíč
slugtext UQIdentifikátor
nametextNázev příslušenství
categorytextKategorie (peephole, chain, closer, electric_opener, other)
descriptiontextPopis
pricenumeric(10,2)Cena v Kč bez DPH
image_urltextFoto příslušenství
image_sourcetextZdroj obrázku
sort_orderintegerPořadí
is_activebooleanViditelný
is_expert_onlybooleanPouze 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).

SloupecTypPopis
slugtext PKPrimární klíč (peephole, chain, closer...)
labeltextZobrazovaný název kategorie
is_exclusivebooleanExkluzivní výběr (radio chování)
sort_orderintegerPořadí

installations

28 záznamů

Montážní služby: montáž dveří, demontáž, bourání, zednické práce, elektro apod. Kategorizováno dle skupiny modelů.

SloupecTypPopis
idserial PKPrimární klíč
slugtext UQIdentifikátor
nametextNázev služby
categorytextKategorie (sd3, sd101_111_102, other)
descriptiontextPopis služby
pricenumeric(10,2)Cena v Kč bez DPH
sort_orderintegerPořadí
is_activebooleanViditelný
is_expert_onlybooleanPouze 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í)

TabulkaFK 1FK 2
accessory_compatibilityaccessory_iddoor_model_id
installation_compatibilityinstallation_iddoor_model_id
accessory_installation_linkaccessory_idinstallation_id
accessory_addon_linkparent_accessory_idchild_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.

SloupecTypPopis
idserial PKPrimární klíč
slugtext UQIdentifikátor
nametextNázev přirážky
categorytextspecial_modification, environment, delivery aj.
descriptiontextPopis
surcharge_typeenum ENUMpercentage (%) nebo fixed (Kč)
valuenumeric(10,2)Hodnota přirážky (procento nebo částka)
sort_orderintegerPořadí
is_activebooleanViditelný

quotes

cenové nabídky

Cenové nabídky z konfigurátoru. 6 stavů: draft, submitted, reviewed, quoted, accepted, cancelled. Kompletní cenový rozklad (8 kategorií + total).

SloupecTypPopis
idserial PKPrimární klíč
quote_numbertext UQČíslo nabídky
statusenum ENUMdraft / submitted / reviewed / quoted / accepted / cancelled
customer_*text (5 sloupců)name, email, phone, address, note
admin_notetextInterní poznámka administrátora
configurationjsonbKompletní konfigurace (imutabilní snapshot)
base_pricenumeric(10,2)Základní cena dveří
frame_pricenumeric(10,2)Cena zárubně
surface_pricenumeric(10,2)Cena povrchů
hardware_pricenumeric(10,2)Cena kování
cylinder_pricenumeric(10,2)Cena vložky
accessories_pricenumeric(10,2)Cena příslušenství
installation_pricenumeric(10,2)Cena montáže
surcharges_pricenumeric(10,2)Přirážky celkem
total_pricenumeric(10,2)Celková cena
created_attimestampDatum vytvoření
updated_attimestampDatum poslední změny

delivery_times

dodací lhůty

Dodací lhůty pro jednotlivé komponenty (dveře + povrch, vložka, zárubeň). Podporuje standardní, zrychlenou, expresní a nestandardní variantu.

SloupecTypPopis
idserial PKPrimární klíč
componenttextTyp komponenty (door_surface, cylinder, frame)
match_keytextKlíč pro lookup (sd101_group:laminate)
standard_daysintegerStandardní lhůta v pracovních dnech
standard_labeltextLidsky čitelný popisek ("2 týdny")
accelerated_labeltextZrychlená varianta ("7 dní")
express_labeltextExpresní varianta ("3 dny")
non_standard_labeltextNestandardní rozměr ("5 týdnů")

admin_users

administrace

Administrátorské účty. Autentizace přes NextAuth v5 + CredentialsProvider, hesla hashovaná Node.js crypto.scrypt (formát salt:hash).

SloupecTypPopis
idserial PKPrimární klíč
emailtext UQE-mailová adresa
password_hashtextHash hesla (scrypt, formát salt:hash)
nametextJméno administrátora
is_activebooleanAktivní účet
created_attimestampDatum 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ěrydoor_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. Povrchsurface_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žkacylinder_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.