// 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])=>
)}
;
}
function StepHeader({ title, sub }){
return ;
}
const Field = ({label, hint, children}) => ;
const Input = (p) => ;
function StepHotel({ data, set }){
return
{[['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)=>
)}
💡 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 && }
;
})}
;
}
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]}
{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()}
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])=>
)}
NK
Nina Kovač · Vaš onboarding manager
Pomaga vam s postavitvijo prvih rezervacij in povezovanjem kanalov.
;
}
Object.assign(window, { OnboardingWizard });