// Receptionist — POS recepcije: hitri check-in/out, prihodi, dodelitve sob, blagajna FURS, walk-in function RCDashboard({ dark, onNav }) { const muted = dark?'#9A9A9A':'#707070'; const arr = RESERVATIONS.filter(r=>r.checkin==='28.04.'); const dep = ROOMS.filter(r=>r.status==='departing'); return <> Predaja smene onNav('walkin')}>Walk-in onNav('checkin')}>Hitri check-in }/>
r.status==='arriving').length}/${arr.length}`}/>
Prihodi danes · {arr.length}
{['Vsi','Prijavljeni','Čakajo','Pozno'].map((t,i)=> )}
{(['14:00','14:30','15:00','15:30','16:00','16:30','17:00','18:00'])[r.id.charCodeAt(5)%8]}
}, {key:'guest', label:'Gost', render:r=>
{r.guest.split(' ').map(w=>w[0]).join('')}
{r.guest} {r.vip && VIP}
{r.id} · {r.nights} noči · {r.pax} oseb
}, {key:'room', label:'Soba', render:r=>
{r.room==='—' ? dodeli : r.room}
}, {key:'pay', label:'Plačilo', render:r=>{ if (r.paid===0) return Neplačano; if (r.paid€{r.total-r.paid} ostane; return Plačano; }}, {key:'note', label:'Opombe', render:r=>r.note ? ⚑ {r.note} : }, {key:'act', label:'', align:'right', render:r=>{r.status==='arriving'?'Check-in':'Pripravi'}}, ]} rows={arr}/>
Hitre akcije
{[ ['key','Check-in po rezervaciji','#2196F3'], ['logout','Check-out gosta','#00BCD4'], ['plus','Walk-in rezervacija','#FF9800'], ['printer','Tiskaj račun','#9C27B0'], ['headset','Klic gosta','#2DD164'], ['door','Programiraj ključ','#37474F'], ].map(([ic,l,c])=> )}
FURS davčna blagajna
Online
Poslovni prostor T-001 · Naprava 1
Računi danes
34
Promet
€ 4.280
Odhodi danes
{dep.length} sob
{r.num}}, {key:'guest', label:'Gost', render:r=>{r.guest}}, {key:'time', label:'Do', render:r=>{(['10:00','10:30','11:00','11:30','12:00'])[r.num.charCodeAt(2)%5]}}, {key:'act', label:'', align:'right', render:r=>Check-out}, ]} rows={dep}/>
Prošnje gostov
{GUEST_REQUESTS.filter(g=>g.status!=='approved').length} aktivnih
{GUEST_REQUESTS.map((g,i)=>{ const stt = {open:['orange','Odprto'], in_progress:['blue','V obdelavi'], approved:['success','Odobreno']}[g.status]; return
0?`1px solid ${dark?'#2B2B2B':'#F5F5F5'}`:'none', display:'flex', gap:12, alignItems:'center'}}>
{g.room}
{g.request}
{g.guest} · {g.time}
{stt[1]}
; })}
; } function RCCheckin({ dark }) { const muted = dark?'#9A9A9A':'#707070'; const [step, setStep] = React.useState(2); const r = RESERVATIONS[2]; // James Schmidt — VIP const steps = ['Najdi rezervacijo','Preveri podatke','Skeniraj dokument','Plačilo','Programiraj ključ']; return <> {/* Stepper */}
{steps.map((s,i)=>{ const done = i
{done ? '✓' : i+1}
{s}
{i} ; })}
Skeniraj osebni dokument
Skeniraj dokument
Postavi ID, potni list ali vozniško dovoljenje na čitalec
OCR rezultat
{[['Ime','James'],['Priimek','Schmidt'],['Datum rojstva','12.06.1978'],['Državljanstvo','Nemčija'],['Št. dokumenta','C7V9MK283'],['Veljavnost','08.2031']].map(([l,v])=>
{l} {v}
)}
Avtomatsko poslano v AJPES
Soba in nastanitev
Soba
305
Tip
Junior Suite
Prihod
28.04. 14:00
Odhod
04.05. 11:00
setStep(Math.max(0,step-1))} icon="chevleft">Nazaj setStep(step+1)}>Naprej · Plačilo →
Povzetek rezervacije
{[['Bivanje','€1.380'],['Turistična taksa','€30 (6×2,50)'],['Wellness paket','€80'],['Skupaj','€1.490']].map(([l,v],i)=>
0?`1px solid ${dark?'#2B2B2B':'#F5F5F5'}`:'none', fontSize: l==='Skupaj'?14:13, fontWeight: l==='Skupaj'?700:500}}> {l} {v}
)}
✓ Plačano vnaprej preko Booking.com
VIP gost
VIP · 4 bivanja
Repeat guest. Pri zadnjih obiskih: vegetarijanski meni, dvostranska blazina, zgodnji check-in. Prosil za cvetje v sobi.
; } function RCWalkin({ dark }) { const muted = dark?'#9A9A9A':'#707070'; return <>
{[['Ime','Vnesi…'],['Priimek','Vnesi…'],['Telefon','+386…'],['E-pošta','npr. ime@…'],['Države/držav.','Slovenija ▾'],['Št. dokumenta','Skeniraj…']].map(([l,p])=> )}
Bivanje
{[['Prihod','28.04.2026'],['Odhod','30.04.2026'],['Noči','2'],['Oseb','2']].map(([l,v])=>
{l}
)}
Razpoložljive sobe
{[ {num:'108', type:'Standard', rate:120, sel:false}, {num:'213', type:'Deluxe', rate:160, sel:true }, {num:'304', type:'Junior Suite', rate:230, sel:false}, ].map(r=>
{r.num}
{r.sel && }
{r.type}
€{r.rate}/noč
)}
Povzetek
{[['Soba 213 (Deluxe)','€320'],['2 noči × €160',''],['Turistična taksa','€10 (2×2,50×2)'],['DDV 9,5%','€31'],['Skupaj','€361']].map(([l,v],i)=> v ?
0?`1px solid ${dark?'#2B2B2B':'#F5F5F5'}`:'none', fontSize: l==='Skupaj'?14:13, fontWeight: l==='Skupaj'?700:500}}> {l} {v}
:
{l}
)}
Plačilo
{['Kartica','Gotovina','TRR'].map((p,i)=> )}
Naredi rezervacijo · €361
Račun bo poslan v FURS davčno blagajno
; } function RCArrivals({ dark }) { const muted = dark?'#9A9A9A':'#707070'; const stMap = {arriving:['orange','Prihaja'], confirmed:['blue','Potrjeno'], departed:['neutral','Odšel']}; const all = RESERVATIONS; return <> Tiskaj seznamHitri check-in}/>
{['Prihodi','V hiši','Odhodi','Vse'].map((t,i)=> )}
{(['14:00','14:30','15:00','15:30','16:00'])[r.id.charCodeAt(5)%5]}
}, {key:'guest', label:'Gost', render:r=>
{r.guest} {r.vip && VIP}
}, {key:'id', label:'Rezervacija', render:r=>{r.id}}, {key:'room', label:'Soba', render:r=>{r.room}}, {key:'nights', label:'Noči', align:'center'}, {key:'pax', label:'Os.', align:'center'}, {key:'channel', label:'Kanal'}, {key:'pay', label:'Plačilo', render:r=> r.paid===r.total?Plačano:r.paid===0?Neplačano:Delno}, {key:'status', label:'Status', render:r=>{stMap[r.status]?.[1]||r.status}}, {key:'act', label:'', align:'right', render:r=>Check-in}, ]} rows={all}/>
; } function RCKeys({ dark }) { const muted = dark?'#9A9A9A':'#707070'; return <>
Programiraj nov ključ
Soba
Veljavnost
Dostop
{['Soba','Wellness','Garaža'].map((a,i)=> )}
Postavi kartico na čitalec
Salto Pro Encoder · pripravljen
Programiraj ključ
Zadnje aktivnosti
{[ ['305','James Schmidt','Programiran','pred 1 min','#2DD164'], ['213','Marija K. (osebje)','Master ključ', 'pred 12 min','#9C27B0'], ['418','Tomaž V. (vzdrž.)','Master ključ', 'pred 25 min','#9C27B0'], ['108','Marko Hribar','Programiran','pred 1 ur','#2DD164'], ['117','Marco Rossi','Programiran','pred 2 ur','#2DD164'], ['412','Sara Lah','Deaktiviran (ključ izgubljen)','pred 3 ur','#E53935'], ].map(([r,g,a,t,c],i)=>
0?`1px solid ${dark?'#2B2B2B':'#F5F5F5'}`:'none', display:'flex', alignItems:'center', gap:12}}>
Soba {r} · {g}
{a} · {t}
)}
; } Object.assign(window, { RCDashboard, RCCheckin, RCWalkin, RCArrivals, RCKeys });