PageSourceSearch

https://hintermoos.at/assets/CostsHeatingOwners-eiPmd0wD.js

js hintermoos.at collected 2026-10-09 22:02:15 UTC 14,993 bytes, 2 lines download raw bytes

1import{u as oe,r as i,s as Ne,j as e,m as be,w as C,x as S,I as ve,B as R,$ as Ce,G as Se,H as _e,J as Pe,K as A,N as O,T as J,O as Ae}from"./index-MoAbC8_9.js";import{O as Oe}from"./OwnersLayout-Cd0M3dw8.js";import{u as Ee}from"./usePersistedYear-CMpOJqHk.js";import{T as W,a as Q,b as I,c as E,d as X,e as u}from"./table-BNHSYido.js";import{B as f}from"./badge-BHbYeRgi.js";import{S as Z,a as ee,b as te,c as se,d as L}from"./select-ChAxOmxm.js";import{T as re}from"./table-pagination-DgaWMZqT.js";import{S as Te}from"./search-_fcwEKN-.js";import{D as De}from"./download-DXQgHLv7.js";import{C as ke}from"./circle-help-BFmb_2uk.js";import{E as Me}from"./euro-Cc6O9qjZ.js";import{U as ze}from"./user-Cvsz7Lm_.js";import{C as ae}from"./calendar-CnsXUgOr.js";import{U as Ie}from"./users-xui-UtA1.js";import{A as Le,a as He}from"./arrow-up-D486G_0n.js";import{A as Ye}from"./arrow-up-down-D7o6PKMM.js";import"./Header-CnJGZ8vQ.js";import"./mountain-BHfTfCFy.js";import"./separator-CQ84aZ0V.js";import"./collapsible-BIxz44zB.js";import"./skeleton-ClxqB572.js";import"./breadcrumb-CmKLwRya.js";import"./switch-BHj3-8MN.js";import"./index-D9-GACGG.js";import"./house-DjS1WMqx.js";import"./receipt-DnGXta2k.js";import"./building-crte1H4H.js";import"./file-text-Bif0RP8Y.js";import"./chart-column-Bo5i9GGE.js";import"./upload-BH1HltYO.js";import"./piggy-bank-DP-A2O0m.js";import"./landmark-C0TkBs1l.js";import"./flame-wMx8KIS8.js";import"./trending-up-Cg9WFJWB.js";import"./eye-DKrvAixa.js";import"./dialog-DrI7Oddz.js";import"./tabs-5EVsfllK.js";import"./textarea-4z16PwID.js";import"./index-BdQq_4o_.js";import"./chevron-down-BDe4YKQW.js";import"./chevron-up-JyGCcpt9.js";import"./chevron-left-BrISfdwW.js";const ne=(l,d)=>{if(!l||!d)return null;const c=new Date(l),H=new Date(d).getTime()-c.getTime();return Math.ceil(H/(1e3*60*60*24))+1},Ue=()=>{const{language:l}=oe(),[d,c]=i.useState([]),[K,H]=i.useState(!0),[g,le]=i.useState(""),[j,ie]=i.useState("all"),[Y,_]=i.useState(1),[y,de]=i.useState(10),[U,N]=i.useState(1),[P,me]=i.useState(10),[T,ce]=i.useState("totalPaid"),[D,G]=i.useState("desc"),$=i.useMemo(()=>[...new Set(d.map(t=>t.year))].sort((t,r)=>r-t),[d]),{selectedYear:h,setSelectedYear:pe}=Ee($);i.useEffect(()=>{he()},[]);const he=async()=>{const{data:t}=await Ne.from("apartment_heating_costs").select("*").order("year",{ascending:!1});t&&c(t),H(!1)},xe=i.useMemo(()=>[...new Set(d.map(t=>t.apartment_code))].sort((t,r)=>{const o=parseInt(t.replace(/\D/g,""))||0,m=parseInt(r.replace(/\D/g,""))||0;return o-m}),[d]),k=i.useMemo(()=>{const t=[],r={};return d.forEach(o=>{r[o.apartment_code]||(r[o.apartment_code]=[]),r[o.apartment_code].push(o)}),Object.entries(r).forEach(([o,m])=>{const s=m.sort((a,b)=>(a.period_start||"").localeCompare(b.period_start||"")),n={};s.forEach(a=>{n[a.year]||(n[a.year]=[]),n[a.year].push(a)}),Object.entries(n).forEach(([,a])=>{if(a.length>=2){const b=a.sort((we,ye)=>(we.period_start||"").localeCompare(ye.period_start||"")),w=b[0],v=b[1];t.push({apartment_code:o,year:w.year,changeType:"intra-year",fromOwner:w.owner_name||"",toOwner:v.owner_name||"",fromPeriodStart:w.period_start,fromPeriodEnd:w.period_end,toPeriodStart:v.period_start,toPeriodEnd:v.period_end,fromTotal:Number(w.total_gross_eur),toTotal:Number(v.total_gross_eur),fromDays:ne(w.period_start,w.period_end),toDays:ne(v.period_start,v.period_end)})}})}),t.sort((o,m)=>{if(o.year!==m.year)return m.year-o.year;const s=n=>{var a;return parseInt(((a=n.match(/(\d+)/))==null?void 0:a[1])||"0",10)};return s(o.apartment_code)-s(m.apartment_code)})},[d]),q=i.useMemo(()=>{const t={};return k.forEach(r=>{t[r.apartment_code]||(t[r.apartment_code]=[]),t[r.apartment_code].push({from:r.fromOwner,to:r.toOwner,year:r.year})}),t},[k]),B=i.useMemo(()=>{let t=d;if(h!=="all"&&(t=t.filter(r=>r.year===parseInt(h))),j!=="all"&&(t=t.filter(r=>r.apartment_code===j)),g){const r=g.toLowerCase();t=t.filter(o=>{var m;return((m=o.owner_name)==null?void 0:m.toLowerCase().includes(r))||o.apartment_code.toLowerCase().includes(r)})}return t},[d,h,j,g]),x=i.useMemo(()=>{let t=k;if(h!=="all"&&(t=t.filter(r=>r.year===parseInt(h))),j!=="all"&&(t=t.filter(r=>r.apartment_code===j)),g){const r=g.toLowerCase();t=t.filter(o=>o.fromOwner.toLowerCase().includes(r)||o.toOwner.toLowerCase().includes(r)||o.apartment_code.toLowerCase().includes(r))}return t},[k,h,j,g]),ue=i.useMemo(()=>{const t=(Y-1)*y;return x.slice(t,t+y)},[x,Y,y]),p=i.useMemo(()=>{const t=new Map;[...d].sort((s,n)=>n.year-s.year).forEach(s=>
1{!t.has(s.apartment_code)&&s.area_sqm&&t.set(s.apartment_code,Number(s.area_sqm))});const o=B.reduce((s,n)=>{const a=n.owner_name||"Unknown";return s[a]||(s[a]={owner:a,totalPaid:0,totalArea:0,apartments:new Set,years:new Set,periodStart:n.period_start,periodEnd:n.period_end,hasOwnerChange:!1}),s[a].totalPaid+=Number(n.total_gross_eur),s[a].apartments.add(n.apartment_code),s[a].years.add(n.year),n.period_end&&(!s[a].periodEnd||n.period_end>s[a].periodEnd)&&(s[a].periodEnd=n.period_end),n.period_start&&(!s[a].periodStart||n.period_start<s[a].periodStart)&&(s[a].periodStart=n.period_start),Object.keys(q).some(b=>s[a].apartments.has(b))&&(s[a].hasOwnerChange=!0),s},{});return Object.values(o).forEach(s=>{s.totalArea=Array.from(s.apartments).reduce((n,a)=>n+(t.get(a)||0),0)}),Object.values(o).map(s=>({...s,apartments:Array.from(s.apartments),years:Array.from(s.years)})).sort((s,n)=>{let a=0;switch(T){case"owner":a=s.owner.localeCompare(n.owner);break;case"apartmentCount":a=s.apartments.length-n.apartments.length;break;case"totalArea":a=s.totalArea-n.totalArea;break;case"totalPaid":default:a=s.totalPaid-n.totalPaid;break}return D==="asc"?a:-a})},[B,q,d,T,D]),fe=i.useMemo(()=>{const t=(U-1)*P;return p.slice(t,t+P)},[p,U,P]),ge=t=>{T===t?G(D==="asc"?"desc":"asc"):(ce(t),G("desc")),N(1)},M=({label:t,sortKeyName:r,className:o=""})=>e.jsx(E,{className:o,children:e.jsxs(R,{variant:"ghost",size:"sm",className:"h-auto p-0 font-medium hover:bg-transparent",onClick:()=>ge(r),children:[t,T===r?D==="asc"?e.jsx(Le,{className:"h-3 w-3 ml-1"}):e.jsx(He,{className:"h-3 w-3 ml-1"}):e.jsx(Ye,{className:"h-3 w-3 ml-1 opacity-50"})]})}),V=t=>new Intl.NumberFormat(l==="de"?"de-DE":"en-GB",{style:"currency",currency:"EUR"}).format(t),z=t=>t?new Date(t).toLocaleDateString(l==="de"?"de-DE":"en-GB",{day:"2-digit",month:"2-digit",year:"numeric"}):"—",je=()=>{const t=["Owner","Total Paid","Apartments","Period Start","Period End","Years"],r=p.map(n=>[n.owner,n.totalPaid.toFixed(2),n.apartments.join("; "),n.periodStart||"",n.periodEnd||"",n.years.join(", ")]),o=[t.join(","),...r.map(n=>n.map(a=>`"${a}"`).join(","))].join(`
2`),m=new Blob([o],{type:"text/csv;charset=utf-8;"}),s=document.createElement("a");s.href=URL.createObjectURL(m),s.download=`owner-summary-${h}.csv`,s.click()};if(K)return e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(be,{className:"h-8 w-8 animate-spin text-primary"})});const F=B.reduce((t,r)=>t+r.total_gross_eur,0);return e.jsxs("div",{className:"space-y-6",children:[e.jsx(C,{children:e.jsx(S,{className:"pt-6",children:e.jsxs("div",{className:"flex flex-wrap gap-4 items-center",children:[e.jsxs(Z,{value:h,onValueChange:t=>{pe(t),_(1),N(1)},children:[e.jsx(ee,{className:"w-[150px]",children:e.jsx(te,{})}),e.jsxs(se,{children:[e.jsx(L,{value:"all",children:l==="de"?"Alle Jahre":"All Years"}),$.map(t=>e.jsx(L,{value:t.toString(),children:t},t))]})]}),e.jsxs(Z,{value:j,onValueChange:t=>{ie(t),_(1),N(1)},children:[e.jsx(ee,{className:"w-[150px]",children:e.jsx(te,{})}),e.jsxs(se,{children:[e.jsx(L,{value:"all",children:l==="de"?"Alle Apartments":"All Apartments"}),xe.map(t=>e.jsx(L,{value:t,children:t},t))]})]}),e.jsxs("div",{className:"relative flex-1 min-w-[200px]",children:[e.jsx(Te,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(ve,{placeholder:l==="de"?"Eigentümer suchen...":"Search owners...",value:g,onChange:t=>{le(t.target.value),_(1),N(1)},className:"pl-9"})]}),e.jsxs(R,{variant:"outline",size:"sm",onClick:je,children:[e.jsx(De,{className:"h-4 w-4 mr-2"}),"CSV"]}),e.jsx(Ce,{children:e.jsxs(Se,{children:[e.jsx(_e,{asChild:!0,children:e.jsx("div",{className:"w-8 h-8 rounded-full bg-muted flex items-center justify-center cursor-help hover:bg-muted/80",children:e.jsx(ke,{className:"h-4 w-4 text-muted-foreground"})})}),e.jsx(Pe,{className:"max-w-sm",children:e.jsxs("div",{className:"space-y-2 text-xs",children:[e.jsxs("p",{children:[e.jsx("strong",{children:"VAT"})," = ",l==="de"?"Mehrwertsteuer (MwSt.)":"Value Added Tax"]}),e.jsxs("p",{children:[e.jsx("strong",{children:"sqm/m²"})," = ",l==="de"?"Quadratmeter (Wohnfläche)":"Square meters (living area)"]})]})})]})})]})})}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-3",children:[e.jsxs(C,{className:"border-l-4 border-l-primary",children:[e.jsxs(A,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(O,{className:"text-sm font-medium",children:l==="de"?"Gesamtbetrag":"Total Amount"}),e.jsx(Me,{className:"h-4 w-4 text-primary"})]}),e.jsxs(S,{children:[e.jsx("div",{className:"text-2xl font-bold",children:V(F)}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[p.length," ",l==="de"?"Eigentümer":"owners"]})]})]}),e.jsxs(C,{className:"border-l-4 border-l-orange-500",children:[e.jsxs(A,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(O,{className:"text-sm font-medium",children:l==="de"?"Ø pro Eigentümer":"Avg per Owner"}),e.jsx(ze,{className:"h-4 w-4 text-orange-500"})]}),e.jsx(S,{children:e.jsx("div",{className:"text-2xl font-bold",children:V(p.length>0?F/p.length:0)})})]}),e.jsxs(C,{className:"border-l-4 border-l-amber-500",children:[e.jsxs(A,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(O,{className:"text-sm font-medium",children:l==="de"?"Eigentümerwechsel":"Owner Changes"}),e.jsx(J,{className:"h-4 w-4 text-amber-500"})]}),e.jsxs(S,{children:[e.jsx("div",{className:"text-2xl font-bold",children:x.length}),e.jsx("p",{className:"text-xs text-muted-foreground",children:l==="de"?"Wechsel gefunden":"changes found"})]})]})]}),x.length>0&&e.jsxs(C,{className:"border-amber-500/50",children:[e.jsx(A,{children:e.jsxs(O,{className:"font-serif flex items-center gap-2 text-amber-600",children:[e.jsx(J,{className:"h-5 w-5"}),l==="de"?"Eigentümerwechsel":"Owner Changes",e.jsx(f,{variant:"outline",className:"ml-2 text-amber-600 border-amber-500",children:x.length})]})}),e.jsxs(S,{children:[e.jsx("div",{className:"rounded-md border overflow-x-auto",children:e.jsxs(W,{children:[e.jsx(Q,{children:e.jsxs(I,{children:[e.jsx(E,{children:"Apartment"}),e.jsx(E,{children:l==="de"?"Jahr":"Year"}),e.jsx(E,{children:l==="de"?"Předchozí majitel":"Previous Owner"}),e.jsx(E,{children:l==="de"?"Nový majitel":"New Owner"})]})}),e.jsx(X,{children:ue.map((t,r)=>{const m=t.fromDays?Math.round(t.fromDays/365*100):0,s=t.toDays?Math.round(t.toDays/365*100):0;return e.jsxs(I,{children:[e.jsx(u,{children:e.jsx(f,{variant:"secondary",className:"font-mono",children:t.apartment_code})}),e.jsx(u,{className:"font-medium",children:t.year}),e.jsx(u,{children:e.jsxs("div",{className:"space-y-1",children:[e.jsx("span",{className:"font-medium",children:t.fromOwner||"—"}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(ae,{className:"h-3 w-3"}),z(t.fromPeriodStart)," – ",z(t.fromPeriodEnd),e.jsxs(f,{variant:"outline",className:"text-[10px]",children:[m,"%"]})]}),e.jsx("div",{className:"w-full h-1.5 bg-muted rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full bg-amber-400 rounded-full",style:{width:`${m}%`}})})]})}),e.jsx(u,{children:e.jsxs("div",{className:"space-y-1",children:[e.jsx("span",{className:"font-medium",children:t.toOwner||"—"}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(ae,{className:"h-3 w-3"}),z(t.toPeriodStart)," – ",z(t.toPeriodEnd),e.jsxs(f,{variant:"outline",className:"text-[10px]",children:[s,"%"]})]}),e.jsx("div",{className:"w-full h-1.5 bg-muted rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full bg-primary rounded-full",style:{width:`${s}%`}})})]})})]},r)})})]})}),x.length>y&&e.jsx(re,{currentPage:Y,totalPages:Math.ceil(x.length/y),pageSize:y,totalItems:x.length,onPageChange:_,onPageSizeChange:t=>{de(t),_(1)},language:l})]})]}),e.jsxs(C,{children:[e.jsxs(A,{children:[e.jsxs(O,{className:"font-serif flex items-center gap-2",children:[e.jsx(Ie,{className:"h-5 w-5 text-primary"}),l==="de"?"Alle Eigentümer":"All Owners",e.jsx(f,{variant:"secondary",className:"ml-2",children:p.length})]}),e.jsx(Ae,{children:l==="de"?"Klicken Sie auf Spaltenüberschriften zum Sortieren":"Click column headers to sort"})]}),e.jsxs(S,{children:[e.jsx("div",{className:"rounded-md border overflow-x-auto",children:e.jsxs(W,{children:[e.jsx(Q,{children:e.jsxs(I,{children:[e.jsx(M,{label:l==="de"?"Eigentümer":"Owner",sort
2KeyName:"owner"}),e.jsx(M,{label:"Apartments",sortKeyName:"apartmentCount"}),e.jsx(M,{label:l==="de"?"Fläche":"Area",sortKeyName:"totalArea",className:"text-right"}),e.jsx(M,{label:l==="de"?"Gesamt":"Total",sortKeyName:"totalPaid",className:"text-right"})]})}),e.jsx(X,{children:fe.map((t,r)=>e.jsxs(I,{children:[e.jsx(u,{className:"font-medium",children:e.jsxs("div",{className:"flex items-center gap-2",children:[t.owner,t.hasOwnerChange&&e.jsx(f,{variant:"outline",className:"text-amber-600 border-amber-500 text-xs",children:l==="de"?"Wechsel":"Change"})]})}),e.jsx(u,{children:e.jsxs("div",{className:"flex flex-wrap gap-1",children:[t.apartments.slice(0,4).map(o=>e.jsx(f,{variant:"secondary",className:"text-xs",children:o},o)),t.apartments.length>4&&e.jsxs(f,{variant:"outline",className:"text-xs",children:["+",t.apartments.length-4]})]})}),e.jsx(u,{className:"text-right",children:e.jsxs("span",{className:"font-medium",children:[t.totalArea.toFixed(1)," m²"]})}),e.jsx(u,{className:"text-right font-bold",children:V(t.totalPaid)})]},r))})]})}),e.jsx(re,{currentPage:U,totalPages:Math.ceil(p.length/P),pageSize:P,totalItems:p.length,onPageChange:N,onPageSizeChange:t=>{me(t),N(1)},language:l})]})]})]})},Ot=()=>{const{language:l}=oe(),d={de:{title:"Heizkosten nach Eigentümer",description:"Aggregierte Heizkosten gruppiert nach Eigentümern",costs:"Kosten",heating:"Heizkosten",owners:"Eigentümer"},en:{title:"Heating Costs by Owner",description:"Aggregated heating costs grouped by owners",costs:"Costs",heating:"Heating",owners:"Owners"},cs:{title:"Náklady na vytápění podle vlastníka",description:"Agregované náklady na vytápění seskupené podle vlastníků",costs:"Náklady",heating:"Vytápění",owners:"Vlastníci"}},c=d[l]||d.cs;return e.jsx(Oe,{title:c.title,description:c.description,breadcrumbs:[{label:c.costs,href:"/owners/costs"},{label:c.heating,href:"/owners/costs/heating"},{label:c.owners}],children:e.jsx(Ue,{})})};export{Ot as default};

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.