// Folio gosta + Check-out flow + Računi/storno + Night audit // ───────────────────────────────────────────────────────────────────────────── // FOLIO — gostov račun pred plačilom // ───────────────────────────────────────────────────────────────────────────── function RCFolio({ dark }) { const muted = dark?'#9A9A9A':'#707070'; const f = FOLIOS[0]; // James Schmidt 305 const total = f.items.reduce((s,i)=>s+i.total,0); const balance = total - f.paid; const typeColor = {room:'#2196F3', tax:'#9A9A9A', pos:'#FF9800', wellness:'#2DD164'}; const typeLabel = {room:'Bivanje', tax:'Taksa', pos:'POS', wellness:'Wellness'}; return <> Tiskaj Pošlji po e-pošti Dodaj postavko Začni check-out }/>
Postavke ({f.items.length})
{['Vse','Bivanje','POS','Taksa'].map((t,i)=> )}
{r.date}}, {key:'desc', label:'Opis', render:r=>
{r.desc}
}, {key:'type', label:'Tip', render:r=>{typeLabel[r.type]}}, {key:'qty', label:'Kol.', align:'right', render:r=>{r.qty}}, {key:'unit', label:'€/kos', align:'right', render:r=>{r.unit.toFixed(2)}}, {key:'total',label:'Skupaj', align:'right', render:r=>€ {r.total.toFixed(2)}}, {key:'act', label:'', align:'right', render:_=>}, ]} rows={f.items}/>
Povzetek
{[ ['Bivanje (3 noči)', '€ 690,00'], ['Turistična taksa', '€ 5,00'], ['POS (F&B + wellness)', '€ 156,40'], ].map(([l,v],i)=>
0?`1px solid ${dark?'#2B2B2B':'#F5F5F5'}`:'none', fontSize:13}}> {l}{v}
)}
Skupaj porabljeno € {total.toFixed(2)}
Plačano vnaprej (Booking.com) − €{f.paid.toFixed(2)}
Depozit (kartica) € {f.deposit.toFixed(2)}
0?(dark?'rgba(255,152,0,.12)':'#FFF8E1'):(dark?'rgba(45,209,100,.12)':'#E6F9EC'), borderRadius:8, display:'flex', justifyContent:'space-between', alignItems:'center'}}> 0?'#FF9800':'#2DD164'}}>{balance>0?'Za plačilo':'V dobro'} 0?'#FF9800':'#2DD164'}}>€ {Math.abs(balance).toFixed(2)}
Hitre akcije
{[ ['plus','Dodaj POS postavko','#FF9800'], ['users','Dodaj plačnika (split)','#9C27B0'], ['box','Prenesi na drugo sobo','#2196F3'], ['x','Storno postavke','#E53935'], ].map(([ic,l,c])=> )}
; } // ───────────────────────────────────────────────────────────────────────────── // CHECK-OUT — folio review + plačilo + ankete // ───────────────────────────────────────────────────────────────────────────── function RCCheckout({ dark }) { const muted = dark?'#9A9A9A':'#707070'; const f = FOLIOS[0]; const total = f.items.reduce((s,i)=>s+i.total,0); const [splits, setSplits] = React.useState([ {payer:'James Schmidt (gost)', amount:351.40, method:'card', emailReceipt:true}, {payer:'Acme GmbH (firma)', amount:1100.00, method:'transfer', emailReceipt:true}, ]); const [stars, setStars] = React.useState(5); return <> Express check-out}/>
{/* Mini-bar check */}
Mini-bar pregled
Anita K. preverja
{POS_ITEMS.filter(i=>i.cat==='minibar').map(i=>{ const consumed = i.id==='i19'; return ; })}
{/* Damage / deposit */}
Stanje sobe / depozit
{[ ['Brez poškodb','#2DD164',true], ['Manjše ščnice','#FF9800',false], ['Poškodbe','#E53935',false], ].map(([l,c,a])=> )}
Depozit €{f.deposit.toFixed(2)} bo sproščen v 24 urah po check-outu.
{/* Bill split */}
Razdelitev računa · {splits.length} plačnika
Dodaj plačnika
{splits.map((s,i)=>
Znesek
Način
{[['card','Kartica'],['cash','Got.'],['transfer','TRR'],['voucher','Bon']].map(([k,l])=>{ const a = s.method===k; return ; })}
)}
Skupaj za plačilo
€ {total.toFixed(2)}
+ €4,50 mini-bar (Pringles)
Zaključi check-out Express (samo ključ)
Anketa zadovoljstva
Vprašajte gosta — odgovor zabeležimo
{[1,2,3,4,5].map(n=> )}