1import{c as B,j as e,r as h,B as M,s as S,t as R}from"./index-Ch2YoLWu.js";import{A as y}from"./AppLayout-CgENYHrH.js";import{R as C}from"./RequireRole-Dz5ojPPx.js";import{I as f}from"./input-DK_m2ngw.js";import{C as c,a as o,b as m,c as d}from"./card-BN6QeaMX.js";import{h as Z,f as v}from"./datum-CcDpj18J.js";import{D as K}from"./download-hGJ9YaKi.js";import"./useLocation-oK4Cfs_I.js";import"./wolfs-hotel-logo-AR_Gx9na.js";const O=[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]],A=B("chart-column",O),N=["So","Mo","Di","Mi","Do","Fr","Sa"];function H(){const u=Z(),[r,x]=h.useState(()=>{const s=new Date;return s.setMonth(s.getMonth()-3),s.toISOString().slice(0,10)}),[n,$]=h.useState(u),[a,w]=h.useState(null),[z,j]=h.useState(!1);async function E(){j(!0);const{data:s,error:i}=await S.rpc("statistik_uebersicht",{_von:r,_bis:n});j(!1),i?R.error(i.message):w(s)}h.useEffect(()=>{E()},[r,n]);function k(){if(!a)return;const s=[];
1s.push("Wolfs Hotel â Digitale Rezeption · Anonymisierte Statistik"),s.push(`Zeitraum;${v(r)};${v(n)};${a.zeitraum.tage} Tage`),s.push(""),s.push("KENNZAHL;WERT"),s.push(`Buchungen;${a.basis.buchungen_anzahl}`),s.push(`Ãbernachtungen;${a.basis.uebernachtungen}`),s.push(`Erwachsene gesamt;${a.basis.erwachsene_total}`),s.push(`Kinder gesamt;${a.basis.kinder_total}`),s.push(`Hunde gesamt;${a.basis.hunde_total}`),s.push(`à Aufenthaltsdauer (Nächte);${a.basis.avg_aufenthalt}`),s.push(""),s.push(`Belegungsrate Zimmer (%);${a.belegung.rate_zimmer_pct}`),s.push(`Belegungsrate Personen (%);${a.belegung.rate_personen_pct}`),s.push(""),s.push("PRO ZIMMER"),s.push("Zimmer;Kategorie;Buchungen;Ãbernachtungen;Gäste gesamt"),a.pro_zimmer.forEach(t=>s.push(`${t.zimmer_nr};${t.kategorie??""};${t.buchungen};${t.uebernachtungen};${t.gaeste_total}`)),s.push(""),s.push("PRO KATEGORIE"),s.push("Kategorie;Zimmer;Belegte Zi.-Nächte;Kapazität Zi.-Nächte;Belegung %"),a.pro_kategorie.forEach(t=>s.push(`${t.kategorie};${t.zimmer_anzahl};${t.belegte_zimmernaechte};${t.kapazitaet_zimmernaechte};${t.belegung_zimmer}`)),s.push(""),s.push("PRO WOCHENTAG (Ãbernachtungen)"),N.forEach((t,b)=>s.push(`${t};${a.pro_wochentag[String(b)]??0}`)),s.push(""),s.push("PRO MONAT (Ãbernachtungen)"),Object.entries(a.pro_monat).sort().forEach(([t,b])=>s.push(`${t};${b}`)),s.push(""),s.push("GÃSTE-MIX"),s.push(`Nur Erwachsene;${a.gaeste_mix.nur_erwachsene}`),s.push(`Mit Kindern;${a.gaeste_mix.mit_kindern}`),s.push(`Mit Hunden;${a.gaeste_mix.mit_hunden}`),s.push(`Familie mit Hund;${a.gaeste_mix.familie_mit_hund}`);const i=new Blob(["\uFEFF"+s.join(` 2`)],{type:"text/csv;charset=utf-8"}),_=URL.createObjectURL(i),p=document.createElement("a");p.href=_,p.download=`statistik_${r}_bis_${n}.csv`,p.click(),URL.revokeObjectURL(_)}return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(A,{className:"h-6 w-6 text-accent-foreground"}),e.jsx("h1",{className:"text-2xl font-semibold",children:"Statistik (anonymisiert)"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Aggregierte Kennzahlen ohne Namen, Notizen oder personenbezogene Daten â geeignet für Reports & Aufbewahrung."}),e.jsx(c,{children:e.jsxs(o,{className:"pt-4 flex flex-wrap items-end gap-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-muted-foreground block mb-1",children:"Von"}),e.jsx(f,{type:"date",value:r,onChange:s=>x(s.target.value),className:"w-44"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-muted-foreground block mb-1",children:"Bis"}),e.jsx(f,{type:"date",value:n,onChange:s=>$(s.target.value),className:"w-44"})]}),e.jsxs(M,{variant:"outline",onClick:k,disabled:!a,children:[e.jsx(K,{className:"h-4 w-4 mr-1"}),"CSV exportieren"]})]})}),z&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"Wird geladenâ¦"}),a&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-3",children:[e.jsx(l,{label:"Belegung Zimmer",value:`${a.belegung.rate_zimmer_pct}%`}),e.jsx(l,{label:"Belegung Gäste",value:`${a.belegung.rate_personen_pct}%`}),e.jsx(l,{label:"Buchungen",value:a.basis.buchungen_anzahl}),e.jsx(l,{label:"Ãbernachtungen",value:a.basis.uebernachtungen}),e.jsx(l,{label:"à Aufenthalt (Nächte)",value:a.basis.avg_aufenthalt}),e.jsx(l,{label:"Erwachsene",value:a.basis.erwachsene_total}),e.jsx(l,{label:"Kinder",value:a.basis.kinder_total}),e.jsx(l,{label:"Hunde",value:a.basis.hunde_total})]}),(a.belegung.unzugewiesene_buchungen??0)>0&&e.jsxs("div",{className:"rounded-md border border-amber-300 bg-amber-50 dark:bg-amber-950/30 px-4 py-3 text-sm",children:[e.jsx("strong",{children:a.belegung.unzugewiesene_buchungen})," Buchung(en) ohne zugewiesenes Zimmer (",a.belegung.unzugewiesene_naechte," Nächte) â in Belegungsrate, Auswertung pro Zimmer und pro Kategorie nicht enthalten, bis ein Zimmer zugewiesen wird."]}),e.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[e.jsxs(c,{children:[e.jsx(m,{children:e.jsx(d,{className:"text-base",children:"Belegung pro K
2ategorie"})}),e.jsx(o,{children:e.jsx(g,{items:a.pro_kategorie.map(s=>({label:s.kategorie,value:s.belegung_zimmer,sub:`${s.zimmer_anzahl} Zi · ${s.belegte_zimmernaechte}/${s.kapazitaet_zimmernaechte} Nächte`})),suffix:"%"})})]}),e.jsxs(c,{children:[e.jsx(m,{children:e.jsx(d,{className:"text-base",children:"Pro Zimmer"})}),e.jsx(o,{children:e.jsx(g,{items:a.pro_zimmer.map(s=>({label:`Zi. ${s.zimmer_nr}${s.kategorie?` (${s.kategorie})`:""}`,value:s.uebernachtungen,sub:`${s.buchungen} Buchungen · ${s.gaeste_total} Gäste`}))})})]}),e.jsxs(c,{children:[e.jsx(m,{children:e.jsx(d,{className:"text-base",children:"Pro Wochentag"})}),e.jsx(o,{children:e.jsx(g,{items:N.map((s,i)=>({label:s,value:a.pro_wochentag[String(i)]??0}))})})]}),e.jsxs(c,{children:[e.jsx(m,{children:e.jsx(d,{className:"text-base",children:"Pro Monat"})}),e.jsx(o,{children:e.jsx(g,{items:Object.entries(a.pro_monat).sort().map(([s,i])=>({label:s,value:i}))})})]}),e.jsxs(c,{children:[e.jsx(m,{children:e.jsx(d,{className:"text-base",children:"Gäste-Mix"})}),e.jsx(o,{children:e.jsx(g,{items:[{label:"Nur Erwachsene",value:a.gaeste_mix.nur_erwachsene},{label:"Mit Kindern",value:a.gaeste_mix.mit_kindern},{label:"Mit Hunden",value:a.gaeste_mix.mit_hunden},{label:"Familie + Hund",value:a.gaeste_mix.familie_mit_hund}]})})]})]})]})]})}function l({label:u,value:r}){return e.jsx(c,{children:e.jsxs(o,{className:"pt-4",children:[e.jsx("div",{className:"text-xs text-muted-foreground",children:u}),e.jsx("div",{className:"mt-1 text-2xl font-semibold",children:r})]})})}function g({items:u,suffix:r=""}){const x=Math.max(1,...u.map(n=>n.value));return u.length===0?e.jsx("p",{className:"text-sm text-muted-foreground",children:"Keine Daten"}):e.jsx("div",{className:"space-y-2",children:u.map(n=>e.jsxs("div",{children:[e.jsxs("div",{className:"flex justify-between text-sm",children:[e.jsxs("span",{children:[n.label,n.sub&&e.jsxs("span",{className:"text-muted-foreground",children:[" · ",n.sub]})]}),e.jsxs("span",{className:"font-medium",children:[n.value,r]})]}),e.jsx("div",{className:"h-2 bg-muted rounded",children:e.jsx("div",{className:"h-2 bg-accent rounded",style:{width:`${n.value/x*100}%`}})})]},n.label))})}const U=()=>e.jsx(C,{roles:["management"],children:e.jsx(y,{children:e.jsx(H,{})})});export{U as component};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.