// Hotel onboarding wizard — multi-step registration to onboard a new hotel onto clickinPMS function OnboardingWizard(){ const [step, setStep] = React.useState(0); const [data, setData] = React.useState({ hotelName:'Hotel Triglav', city:'Bled', country:'Slovenija', taxId:'SI12345678', plan:'Growth', rooms:48, currency:'EUR', vat:'9,5%', pms:'clickinPMS', channels:['booking','airbnb'], paymentMethods:['card','cash','transfer'], primaryColor:'#0097A7', inviteEmails:'', timezone:'Europe/Ljubljana', language:'sl', }); const set = (k,v)=>setData(d=>({...d,[k]:v})); const toggle = (k,v)=>setData(d=>({...d,[k]:d[k].includes(v)?d[k].filter(x=>x!==v):[...d[k],v]})); const steps = [ {id:'welcome', title:'Dobrodošli', sub:'Postavili bomo vaš hotel v 5 minutah.'}, {id:'hotel', title:'Osnovni podatki', sub:'Povejte nam nekaj o vašem hotelu.'}, {id:'plan', title:'Naročniški paket', sub:'Izberite paket, ki ustreza vaši velikosti.'}, {id:'rooms', title:'Sobe in tipi', sub:'Konfigurirajmo vaš inventar.'}, {id:'finance', title:'Finance in računi', sub:'Plačila, davki in valute.'}, {id:'channels',title:'Prodajni kanali', sub:'Povežite Booking, Airbnb in ostale.'}, {id:'team', title:'Ekipa', sub:'Povabite kolege.'}, {id:'brand', title:'Vizualna identiteta', sub:'Logo in barve za goste.'}, {id:'done', title:'Vse pripravljeno!', sub:'Vaš hotel je nared za prvo rezervacijo.'}, ]; const cur = steps[step]; const progress = (step / (steps.length-1)) * 100; return
{/* Top bar */}
Korak {step+1} / {steps.length}
{/* Progress bar */}
{/* Stepper */}
{steps.map((s,i)=>{ const a = i===step, d = i
{d ? : i+1}
{s.title}
{i}
; })}
{/* Content */}
{cur.id==='welcome' && setStep(1)}/>} {cur.id==='hotel' && } {cur.id==='plan' && } {cur.id==='rooms' && } {cur.id==='finance' && } {cur.id==='channels'&& } {cur.id==='team' && } {cur.id==='brand' && } {cur.id==='done' && }
{/* Footer */} {cur.id!=='welcome' &&
{cur.id!=='done' && }
}
; } // ───────────────────────────────────────────────────────────────────────── // Steps // ───────────────────────────────────────────────────────────────────────── function StepWelcome({ onNext }){ return
👋

Pozdravljeni v clickinPMS

Postavili bomo vaš hotel na platformo v 8 korakih — 5 do 7 minut. Vsa polja lahko kasneje uredite.

{[ ['settings','Konfiguriramo','sobe, cene, davke'], ['link','Povežemo','Booking, Airbnb, plačilne sisteme'], ['users','Povabimo','vašo recepcijo in housekeeping'], ].map(([ic,a,b])=>
{a}
{b}
)}
Potrebujete pomoč? Pišite nam na onboarding@clickinpms.com
; } function StepHeader({ title, sub }){ return
Onboarding

{title}

{sub}

; } const Field = ({label, hint, children}) => ; const Input = (p) => ; function StepHotel({ data, set }){ return
set('hotelName', e.target.value)}/>
set('city',e.target.value)}/> set('country',e.target.value)}/>
set('taxId',e.target.value)}/>
{[['hotel','Hotel'],['apt','Apartmaji'],['camp','Kamp'],['mix','Mix']].map(([k,l],i)=> )}
set('rooms', +e.target.value)}/> set('timezone',e.target.value)}/>
{['sl','en','de','it','hr'].map(l=> )}
; } function StepPlan({ data, set }){ const plans = [ {id:'Starter', price:79, rooms:'do 20 sob', features:['1 prodajni kanal','Email podpora','Osnovni dashboard']}, {id:'Growth', price:189, rooms:'do 80 sob', features:['Neomejeni kanali','Channel manager','Self check-in kiosk','Telefon + email','Mobile aplikacije'], best:true}, {id:'Scale', price:389, rooms:'neomejeno', features:['Vse iz Growth','Multi-property','API dostop','24/7 podpora','Dedicated account manager']}, ]; return
{plans.map(p=>{ const a = data.plan===p.id; return ; })}
Prvih 30 dni brezplačno · Preizkusite katerikoli paket — brez kartice, brez obveznosti.
; } function StepRooms({ data, set }){ const [types,setTypes] = React.useState([ {n:'Standard Double', count:24, price:120}, {n:'Junior Suite', count:14, price:185}, {n:'Executive Suite', count:6, price:280}, {n:'Družinska soba', count:4, price:220}, ]); return
Tip sobe
Število
Osnovna cena
Sezonska cena
{types.map((t,i)=>
{t.n}
)}
💡 Imate seznam sob v Excelu? Naložite ga — uvozimo namesto vas.
; } function StepFinance({ data, set }){ return
{['EUR','USD','HRK','CHF'].map(c=>)}
set('vat',e.target.value)}/>
{[ ['card','Kreditna kartica','Stripe / Adyen'], ['cash','Gotovina','Davčne blagajne integrirane'], ['transfer','Bančno nakazilo','SEPA'], ['gift','Darilni boni','Lasten sistem'], ['paypal','PayPal','Beta'], ].map(([k,l,d])=>{ const a = data.paymentMethods.includes(k); return
set('paymentMethods', a ? data.paymentMethods.filter(x=>x!==k) : [...data.paymentMethods,k])} style={{padding:'12px 14px', background:a?'#E0F7FA':'#fff', border:`2px solid ${a?'#0097A7':'#E5E5E5'}`, borderRadius:8, marginBottom:8, cursor:'pointer', display:'flex', alignItems:'center', gap:12}}>
{a && }
{l}
{d}
; })}
; } function StepChannels({ data, toggle }){ const channels = [ {id:'booking', n:'Booking.com', d:'Največji OTA za EU trg', fee:'15% provizija', col:'#003580'}, {id:'airbnb', n:'Airbnb', d:'Idealen za apartmaje in butike', fee:'3% + 14% gosta', col:'#FF5A5F'}, {id:'expedia', n:'Expedia', d:'Mednarodni gosti, ZDA in DACH', fee:'10–18% provizija', col:'#FFC72C'}, {id:'hrs', n:'HRS', d:'Poslovni gosti v DACH', fee:'10% provizija', col:'#003E7E'}, {id:'agoda', n:'Agoda', d:'Azijski trg', fee:'15% provizija', col:'#5B2D8C'}, {id:'tripadvisor', n:'TripAdvisor Plus', d:'Premium nišni gosti', fee:'12% provizija', col:'#34E0A1'}, ]; return
{channels.map(c=>{ const a = data.channels.includes(c.id); return
toggle('channels', c.id)} style={{padding:'18px', background:'#fff', border:`2px solid ${a?'#0097A7':'#E5E5E5'}`, borderRadius:12, cursor:'pointer', display:'flex', gap:14, alignItems:'center'}}>
{c.n[0]}
{c.n}
{a && Povezano}
{c.d}
{c.fee}
{a && }
; })}
; } function StepTeam({ data, set }){ const [team,setTeam] = React.useState([ {email:'recepcija@triglavbled.si', role:'Receptionist'}, {email:'sef@triglavbled.si', role:'Manager'}, ]); const [next,setNext] = React.useState({email:'', role:'Receptionist'}); const roles = ['Receptionist','Manager','Housekeeping','IT','Manager','Računovodstvo']; return
{team.map((m,i)=>
0?'1px solid #F0F0F0':'none'}}>
{m.email[0].toUpperCase()}
{m.email}
{m.role}
Pošljemo vabilo
)}
setNext({...next, email:e.target.value})} style={{flex:1}}/>
Skupna cena: 2 vabila · brez doplačila do {data.plan==='Scale'?'∞':data.plan==='Growth'?'15':'5'} uporabnikov v paketu {data.plan}.
; } function StepBrand({ data, set }){ const colors = ['#0097A7','#0D47A1','#9C27B0','#E53935','#FF9800','#2DD164','#1A1A1A']; return
Povleci sem ali izberi datoteko
SVG, PNG · do 2 MB · transparentno ozadje priporočeno
{colors.map(c=>
Predogled gostovega emaila
{data.hotelName}
Potrdilo rezervacije · #BK-2026-04-1024
Pozdravljeni James,
Veseli nas, da ste izbrali {data.hotelName}. Vaša rezervacija je potrjena. Veselimo se vašega obiska 28. aprila.
Soba305 · Junior Suite
Datum28.04 — 04.05
Skupaj€1.110,00
; } function StepDone({ data }){ return

Pripravljeno! 🎉

{data.hotelName} je nastavljen in pripravljen sprejemati rezervacije.
Naša onboarding ekipa vas bo poklicala v 24 urah.

{[ ['settings', `${data.rooms} sob`, 'konfigurirano'], ['link', `${data.channels.length} kanalov`, 'pripravljenih za sinhronizacijo'], ['users', '2 uporabnika', 'povabljena'], ].map(([ic,a,b])=>
{a}
{b}
)}
NK
Nina Kovač · Vaš onboarding manager
Pomaga vam s postavitvijo prvih rezervacij in povezovanjem kanalov.
; } Object.assign(window, { OnboardingWizard });