PageSourceSearch

https://8004.ch/assets/AdminFinanzen-DETY2U32.js

js 8004.ch collected 2026-09-25 07:32:05 UTC 80,021 bytes, 2 lines download raw bytes

1import{r as s,s as T,j as e,f as Ne}from"./index-CLTM18rh.js";import{a as Q}from"./authFetch-u5HjDcUX.js";import{A as ve,a as Se}from"./AuditLogViewer-CgrB1xOp.js";import{A as Be}from"./Aktivitaet-Blgc-LAk.js";import{u as Ce}from"./AdminContext-B2hLlcqc.js";import{F as ye,a as he,s as re,R as $e}from"./Filterleiste-Dovi1-bW.js";import{m as Ae}from"./massenversand-8NVIJTcX.js";import{AdminAbrechnungen as Me}from"./AdminAbrechnungen-B4gK5hdX.js";import{N as Fe}from"./NurLesen-BKsmfvXD.js";import{b as Ee}from"./bestaetige-CpNFuPQa.js";import{a as pe}from"./Beteiligte-D6s97lAJ.js";const ce="px-3 py-2 rounded-lg border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-800 text-zinc-900 dark:text-white text-sm focus:outline-none focus:ring-2 focus:ring-red-500",Ke={offen:"offen",vorschlag:"zu prüfen",zugeordnet:"zugeordnet",ignoriert:"abgelegt"},De={offen:"bg-zinc-100 text-zinc-600 dark:bg-zinc-800 dark:text-zinc-400",vorschlag:"bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-300",zugeordnet:"bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-400",ignoriert:"bg-zinc-100 text-zinc-500 dark:bg-zinc-800 dark:text-zinc-500 line-through"},fe={ungeklaert:"noch offen",spende:"Als Spende behalten",rueckzahlung:"Zurückzahlen",gutschrift:"Nächstes Jahr anrechnen"};function G(t){return t.toLocaleString("de-CH",{minimumFractionDigits:2,maximumFractionDigits:2})}function ie(t){if(!t)return"";const[i,l,f]=t.split("-");return`${f}.${l}.${i.slice(2)}`}function we(t){return t?t.split("|").map(i=>i.trim()).filter(i=>i&&!/^(REFERENZEN|MITTEILUNGEN|ABSENDER|AUFTRAGGEBER|NOTPROVIDED|GUTSCHRIFT|LASTSCHRIFT)[:.]?$/i.test(i)).filter(i=>!/^CH\d{2}[0-9\s]{10,}$/i.test(i)).join(" · "):""}function Pe({canEdit:t}){const[i,l]=s.useState([]),[f,B]=s.useState([]),[z,N]=s.useState([]),[h,j]=s.useState([]),[k,u]=s.useState("zuPruefen"),[o,d]=s.useState(""),[g,a]=s.useState(new Map),[m,c]=s.useState(!0),[$,n]=s.useState(null),[y,v]=s.useState(null),[_,F]=s.useState([]),[x,S]=s.useState([]),[I,O]=s.useState(new Map),[H,b]=s.useState(null),A=s.useCallback(async()=>{c(!0);const[r,D,C,p,P,W,U,q,se]=await Promise.all([T.from("bank_transactions").select("*").order("booking_date",{ascending:!1}),T.from("bank_imports").select("*").order("from_date",{ascending:!1}),T.from("membership_dues").select("id, membership_id, amount, status, year, paid_on, payment_method, paid_amount, surplus_status").eq("year",new Date().getFullYear()),T.from("memberships").select("id, member_no, type, org_name, address, zip, city").eq("status","aktiv"),T.from("persons").select("membership_id, first_name, last_name, is_primary"),T.from("membership_events").select("membership_id, created_at, meta").eq("kind","twint_gestartet").gte("created_at",new Date(Date.now()-60*864e5).toISOString()).order("created_at",{ascending:!1}),T.from("ledger_accounts").select("id, number, name").eq("active",!0).order("number"),T.from("cost_centers").select("id, name").order("sort_order"),T.from("journal_entries").select("id, source_id, description, reverses_id, journal_lines(account_id, amount)").eq("source_type","bank")]),de=[r,D,C,p,P].find(L=>L.error);F(U.data??[]),S(q.data??[]);{const L=se.data??[],V=new Set(L.map(ne=>ne.reverses_id).filter(Boolean)),ee=new Map;for(const ne of L)ne.source_id&&!ne.reverses_id&&ee.set(ne.source_id,{...ne,storniert:V.has(ne.id)});O(ee)}de?.error&&n(de.error.message);const ae=new Map;for(const L of P.data??[]){const V=`${L.first_name??""} ${L.last_name??""}`.trim();if(!V)continue;const ee=ae.get(L.membership_id)??[];ee.push(V),ae.set(L.membership_id,ee)}const X=new Map;for(const L of W.data??[])X.set(L.membership_id,[...X.get(L.membership_id)??[],{zeit:L.created_at,betrag:Number(L.meta?.betrag??0),weg:L.meta?.weg??"twint"}]);a(X),l(r.data??[]),B(D.data??[]),N(C.data??[]),j((p.data??[]).map(L=>({...L,namen:(ae.get(L.id)??[]).join(" / ")}))),c(!1)},[]);s.useEffect(()=>{A()},[A]);const E=s.useMemo(()=>new Map(z.map(r=>[r.membership_id,r])),[z]),J=s.useMemo(()=>new Map(h.map(r=>[r.id,r])),[h]),M=s.useMemo(()=>{const r=new Map;for(const D of i){if(!D.matched_dues_id||D.match_status!=="zugeordnet")continue;const C=r.get(D.matched_dues_id)??[];C.push(D),r.set(D.matched_dues_id,C)}return r},[i]),K=s.useMemo(()=>{let r=i;k==="zuPruefen"?r=r.filter(C=>C.match_status==="vorschlag"||C.match_status==="offen"&&C.amount>0):k==="zugeordnet"?r=r.filter(C=>C.match_status==="zugeordnet"):k==="ignoriert"?r=r.filter(C=>C.match_status==="ignoriert"):k==="unverbucht"&&(r=r.filter(C=>!C.journal_entry_id));const D=o.trim().toLowerCase();return D&&(r=r.filter(C=>(C.remittance??"").toLowerCase().includes(D))),r},[i,k,o]),R=s.useMemo(()=>({gesamt:i.length,zuPruefen:i.filter(r=>r.match_status==="vorschlag"||r.match_status==="offen"&&r.amount>0).length,zugeordnet:i.filter(r=>r.match_status==="zugeordnet").length,unverbucht:i.filter(r=>!r.journal_entry_id).length,beitraegeOhneJournal:i.filter(r=>r.match_status==="zugeordnet"&&!r.journal_entry_id).length,offenerBetrag:z.filter(r=>r.status==="offen").reduce((r,D)=>r+Number(D.amount),0),offeneBeitraege:z.filter(r=>r.status==="offen").length}),[i,z]);async function te(r,D){v(r),n(null);try{const C=await Q("/api/admin/bank-abgleich",{method:"POST",body:JSON.stringify({buchung:r,...D})}),p=await C.json().catch(()=>({}));if(!C.ok)throw new Error(p.error??"Aktion fehlgeschlagen.");await A()}catch(C){n(C instanceof Error?C.message:"Aktion fehlgeschlagen.")}finally{v(null)}}async function w(r,D){v(String(r.transaction_id??"journal")),n(null),b(null);try{const C=await Q("/api/admin/journal",{method:"POST",body:JSON.stringify(r)}),p=await C.json().catch(()=>({}));if(!C.ok)throw new Error(p.error??"Aktion fehlgeschlagen.");return D&&b(D),await A(),p}catch(C){return n(C instanceof Error?C.message:"Aktion fehlgeschlagen."),null}finally{v(null)}}return m?e.jsx("p",{className:"text-sm text-zinc-500",children:"Lade Bankbuchungen…"}):f.length?e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3 mb-2",children:[e.jsx("h3",{className:"text-sm font-semibold text-zinc-900 dark:text-white",children:"Eingelesene Auszüge"}),t&&e.jsx(Te,{fertig:A})]}),e.jsx("div",{className:"space-y-1.5",children:f.map(r=>e.jsxs("div",{className:"text-[13px] text-zinc-600 dark:text-zinc-400 flex flex-wrap gap-x-3",children:[e.jsx("span",{className:`px-1.5 py-0.5 rounded text-[11px] font-bold ${r.konto==="raisenow"?"bg-purple-100 text-purple-700 dark:bg-purple-900/40 dark:text-purple-300":"bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300"}`,children:r.konto==="raisenow"?"Twint":"Postkonto"}),e.jsxs("span",{className:"font-medium text-zinc-800 dark:text-zinc-200",children:[ie(r.from_date)," bis ",ie(r.to_date)]}),e.jsxs("span",{children:[r.entry_count," Buchungen"]}),r.opening_balance!=null&&r.closing_balance!=null&&e.jsxs("span",{children:["Bestand ",G(Number(r.opening_balance))," auf ",G(Number(r.closing_balance))]})]},r.id))})]}
1),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-5 gap-3",children:[["Buchungen",String(R.gesamt)],["zu prüfen",String(R.zuPruefen)],["zugeordnet",String(R.zugeordnet)],["Beiträge noch offen",`${R.offeneBeitraege} · ${G(R.offenerBetrag)}`],["nicht im Journal",String(R.unverbucht)]].map(([r,D])=>e.jsxs("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 p-3",children:[e.jsx("div",{className:"text-[11px] uppercase tracking-wide text-zinc-400",children:r}),e.jsx("div",{className:"text-lg font-bold text-zinc-900 dark:text-white",children:D})]},r))}),$&&e.jsx("p",{className:"text-sm text-red-600",children:$}),H&&e.jsx("p",{className:"text-sm text-green-700 dark:text-green-400",children:H}),t&&R.beitraegeOhneJournal>0&&e.jsxs("div",{className:"rounded-lg border border-amber-200 dark:border-amber-900 bg-amber-50 dark:bg-amber-950/20 p-3 flex flex-wrap items-center gap-3",children:[e.jsxs("p",{className:"text-sm text-amber-900 dark:text-amber-200 flex-1 min-w-[240px]",children:[R.beitraegeOhneJournal," zugeordnete Beitragszahlungen stehen noch nicht im Journal."]}),e.jsx("button",{disabled:y!==null,onClick:()=>w({aktion:"beitraege-nachbuchen"},"Beitragszahlungen ins Journal gebucht."),className:"px-3 py-1.5 rounded-lg bg-amber-600 hover:bg-amber-700 text-white text-sm font-medium disabled:opacity-50",children:"Ins Journal nachbuchen"})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[[["zuPruefen","Zu prüfen"],["unverbucht","Nicht im Journal"],["zugeordnet","Zugeordnet"],["ignoriert","Abgelegt"],["alle","Alle"]].map(([r,D])=>e.jsx("button",{onClick:()=>u(r),className:`px-3 py-1.5 rounded-lg text-sm font-medium transition-colors ${k===r?"bg-red-600 text-white":"bg-zinc-100 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-300 hover:bg-zinc-200 dark:hover:bg-zinc-700"}`,children:D},r)),e.jsx("input",{className:`${ce} ml-auto w-56`,placeholder:"Text durchsuchen",value:o,onChange:r=>d(r.target.value)})]}),!K.length&&e.jsx("p",{className:"text-sm text-zinc-500 dark:text-zinc-400 py-6 text-center",children:k==="zuPruefen"?"Nichts offen. Alle Zahlungen sind entschieden.":"Keine Buchungen in dieser Ansicht."}),e.jsx("div",{className:"space-y-3",children:K.map(r=>e.jsx(Ze,{buchung:r,canEdit:t,arbeitet:y===r.id,mitglieder:h,mitgliedNach:J,beitragNach:E,zahlungenJeBeitrag:M,twintSignale:g,handeln:te,konten:_,kostenstellen:x,journal:I.get(r.id)??null,journalAktion:w},r.id))})]}):e.jsxs("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 p-6",children:[e.jsx("h3",{className:"text-sm font-semibold text-zinc-900 dark:text-white",children:"Noch kein Kontoauszug eingelesen"}),e.jsx("p",{className:"mt-2 text-sm text-zinc-500 dark:text-zinc-400",children:"Sobald ein Auszug importiert ist, stehen hier alle Zahlungen und du entscheidest, welche zu welchem Mitgliederbeitrag gehören. Was eindeutig ist, ordnet das System selbst zu; hier landet nur, was einen Menschen braucht."})]})}function Te({fertig:t}){const[i,l]=s.useState(!1),[f,B]=s.useState(null),[z,N]=s.useState(null),h=s.useRef(null);async function j(k){const u=k.target.files?.[0];if(u){l(!0),N(null),B(null);try{const o=await u.text(),d=await Q("/api/admin/raisenow-import",{method:"POST",body:JSON.stringify({csv:o,dateiname:u.name})}),g=await d.json().catch(()=>({}));if(!d.ok)throw new Error(g.error??"Der Export liess sich nicht einlesen.");B(`${g.gesamt} Zahlungen gelesen, ${g.zugeordnet} automatisch zugeordnet`+(g.vorschlag?`, ${g.vorschlag} zu prüfen`:"")+(g.offen?`, ${g.offen} ohne Mitgliedernummer`:"")+(g.auszahlungErklaert?". Die Sammelauszahlung auf dem Postkonto ist damit erklärt":"")+"."),await t()}catch(o){N(o instanceof Error?o.message:"Der Export liess sich nicht einlesen.")}finally{l(!1),h.current&&(h.current.value="")}}}return e.jsxs("div",{className:"text-right",children:[e.jsx("button",{disabled:i,onClick:()=>h.current?.click(),className:"px-3 py-1.5 rounded-lg bg-zinc-100 dark:bg-zinc-800 hover:bg-zinc-200 dark:hover:bg-zinc-700 text-sm font-medium text-zinc-700 dark:text-zinc-200 disabled:opacity-50",children:i?"Lese ein…":"RaiseNow-Export einlesen"}),e.jsx("input",{ref:h,type:"file",accept:".csv,text/csv",className:"hidden",onChange:j}),e.jsx("p",{className:"mt-1 text-[11px] text-zinc-400 max-w-[300px]",children:"Die CSV aus dem Auszahlungsbericht, nicht das PDF. Sie enthält je Zahlung eine Zeile mit der Mitgliedernummer."}),f&&e.jsx("p",{className:"mt-1 text-[12px] text-green-600 dark:text-green-400 max-w-[300px]",children:f}),z&&e.jsx("p",{className:"mt-1 text-[12px] text-red-600 max-w-[300px]",children:z})]})}
1function Le({buchung:t,wahl:i,arbeitet:l,schonBezahlt:f,twint:B,zurueck:z,zuordnen:N}){const{m:h,d:j}=i,k=Number(t.amount)-Number(j.amount),u=f.filter(d=>d.id!==t.id),o=u.length>0||j.status==="bezahlt"||j.status==="teilweise";return e.jsxs("div",{className:"mt-3",children:[e.jsxs("div",{className:"flex flex-wrap items-baseline gap-x-2",children:[e.jsxs("span",{className:"text-xs font-mono text-zinc-400",children:["Nr. ",h.member_no]}),e.jsx("span",{className:"text-sm font-semibold text-zinc-900 dark:text-white",children:h.org_name||h.namen}),e.jsxs("span",{className:"text-[12px] text-zinc-400",children:[h.address,", ",h.zip," ",h.city]})]}),e.jsxs("div",{className:"mt-2 text-sm text-zinc-600 dark:text-zinc-300",children:["Beitrag ",G(Number(j.amount)),", Zahlung ",G(Number(t.amount)),Math.abs(k)>.005&&e.jsxs("span",{className:"text-amber-600 dark:text-amber-400 font-medium",children:[" ","· Differenz ",k>0?"+":"",G(k)]})]}),B.length>0&&e.jsxs("div",{className:"mt-2 rounded-lg bg-sky-50 dark:bg-sky-900/20 border border-sky-200 dark:border-sky-900/50 p-3",children:[e.jsx("p",{className:"text-sm font-medium text-sky-900 dark:text-sky-200",children:"Passt: dieses Mitglied hat im Portal eine Zahlung angestossen"}),B.slice(0,3).map((d,g)=>e.jsxs("p",{className:"mt-1 text-[13px] text-sky-800 dark:text-sky-300",children:[ie(d.zeit.slice(0,10))," · ",d.weg==="qr"?"QR-Code fürs E-Banking":d.weg==="einzahlungsschein"?"Einzahlungsschein":"Twint"," · über ",G(d.betrag),Math.abs(d.betrag-Number(t.amount))<.005?" · Betrag stimmt":""]},g))]}),o&&e.jsxs("div",{className:"mt-2 rounded-lg bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-900/50 p-3",children:[e.jsx("p",{className:"text-sm font-medium text-amber-900 dark:text-amber-200",children:u.length>0?"Achtung, an diesem Beitrag hängt bereits eine Zahlung":"Achtung, dieser Beitrag steht bereits auf bezahlt"}),u.map(d=>e.jsxs("p",{className:"mt-1 text-[13px] text-amber-800 dark:text-amber-300",children:[ie(d.booking_date)," · ",G(Number(d.amount))," · ",we(d.remittance).slice(0,70)]},d.id)),u.length===0&&j.paid_on&&e.jsxs("p",{className:"mt-1 text-[13px] text-amber-800 dark:text-amber-300",children:["als bezahlt vermerkt am ",ie(j.paid_on),j.payment_method?` (${j.payment_method})`:""]}),e.jsx("p",{className:"mt-2 text-[13px] text-amber-800 dark:text-amber-300",children:"Wenn du trotzdem zuordnest, ist das eine Doppelzahlung. Sinnvoller ist meist, diese Zahlung als Spende abzulegen oder dem Mitglied zurückzuerstatten."})]}),e.jsxs("div",{className:"mt-3 flex flex-wrap gap-2",children:[e.jsx("button",{disabled:l,onClick:N,className:`px-3 py-1.5 rounded-lg text-white text-sm font-medium disabled:opacity-40 ${o?"bg-amber-600 hover:bg-amber-700":"bg-green-600 hover:bg-green-700"}`,children:o?"Trotzdem zuordnen":"Zuordnen"}),e.jsx("button",{onClick:z,className:"px-3 py-1.5 rounded-lg text-sm text-zinc-500 hover:text-zinc-800 dark:hover:text-zinc-200",children:"Andere wählen"})]})]})}function Ze({buchung:t,canEdit:i,arbeitet:l,mitglieder:f,mitgliedNach:B,beitragNach:z,zahlungenJeBeitrag:N,twintSignale:h,handeln:j,konten:k,kostenstellen:u,journal:o,journalAktion:d}){const[g,a]=s.useState(!1),[m,c]=s.useState(!1),[$,n]=s.useState(""),[y,v]=s.useState(""),[_,F]=s.useState(""),[x,S]=s.useState(null),I=s.useMemo(()=>new Map(k.map(w=>[w.id,w])),[k]),O=o?o.journal_lines.map(w=>I.get(w.account_id)).filter(Boolean).find(w=>!["1010","1090"].includes(w.number))??null:null;async function H(){if(c(D=>!D),m||x)return;const r=(await d({aktion:"vorschlag",transaction_id:t.id,amount:t.amount,remittance:t.remittance,counterparty:t.counterparty}))?.vorschlag??null;S(r),r&&!$&&n(r.konto)}const[b,A]=s.useState(""),[E,J]=s.useState(null),M=t.matched_membership_id?B.get(t.matched_membership_id):void 0,K=M?z.get(M.id):void 0,R=K?Number(t.amount)-Number(K.amount):0,te=s.useMemo(()=>{const w=b.trim().toLowerCase().replace(/^nr\.?\s*/,"");return w?f.map(C=>({m:C,d:z.get(C.id)})).filter(C=>!!C.d).filter(({m:C})=>{if(String(C.member_no??"")===w)return!0;const p=`${C.member_no??""} ${C.namen} ${C.org_name??""} ${C.address??""}`.toLowerCase();return w.split(/\s+/).every(P=>p.includes(P))}).sort((C,p)=>{const P=String(C.m.member_no??"")===w?0:1,W=String(p.m.member_no??"")===w?0:1;return P!==W?P-W:(C.m.namen||C.m.org_name||"").localeCompare(p.m.namen||p.m.org_name||"")}).slice(0,8):[]},[b,f,z]);return e.jsxs("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-start gap-x-4 gap-y-2",children:[e.jsx("div",{className:"text-sm font-mono text-zinc-500 w-[68px] shrink-0",children:ie(t.booking_date)}),e.jsx("div",{className:`text-sm font-bold w-[92px] shrink-0 text-right ${t.amount<0?"text-zinc-500":"text-zinc-900 dark:text-white"}`,children:G(Number(t.amount))}),e.jsxs("div",{className:"flex-1 min-w-[220px]",children:[e.jsx("div",{className:"text-sm text-zinc-800 dark:text-zinc-200",children:we(t.remittance)}),t.match_reason&&e.jsx("div",{className:"text-[12px] text-zinc-400 mt-0.5",children:t.match_reason})]}),e.jsx("span",{className:`px-2 py-0.5 rounded-full text-[11px] font-bold shrink-0 ${De[t.match_status]}`,children:Ke[t.match_status]}),t.journal_entry_id?e.jsxs("span",{className:"px-2 py-0.5 rounded-full text-[11px] font-bold shrink-0 bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-300",title:o?.description??"im Journal",children:["Journal",O?`: ${O.number} ${O.name}`:""]}):e.jsx("span",{className:"px-2 py-0.5 rounded-full text-[11px] font-bold shrink-0 bg-zinc-100 text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400",children:"nicht im Journal"})]}),M&&e.jsxs("div",{className:"mt-3 ml-[180px] text-sm",children:[e.jsx("span",{className:"text-zinc-500",children:"Vorschlag: "}),e.jsxs("span",{className:"font-medium text-zinc-800 dark:text-zinc-200",children:["Nr. ",M.member_no," ",M.org_name||M.namen]}),K&&e.jsxs("span",{className:"text-zinc-500",children:[" ","· Beitrag ",G(Number(K.amount)),Math.abs(R)>
1.005&&e.jsxs("span",{className:"text-amber-600 dark:text-amber-400 font-medium",children:[" ","(",R>0?"+":"",G(R)," Differenz)"]})]})]}),i&&e.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[t.match_status!=="zugeordnet"&&t.amount>0&&M&&K&&e.jsx("button",{disabled:l,onClick:()=>j(t.id,{aktion:"zuordnen",dues:K.id}),className:"px-3 py-1.5 rounded-lg bg-green-600 hover:bg-green-700 disabled:opacity-50 text-white text-sm font-medium",children:"Vorschlag übernehmen"}),t.match_status!=="zugeordnet"&&t.amount>0&&e.jsx("button",{disabled:l,onClick:()=>a(w=>!w),className:"px-3 py-1.5 rounded-lg bg-zinc-100 dark:bg-zinc-800 hover:bg-zinc-200 dark:hover:bg-zinc-700 text-sm font-medium text-zinc-700 dark:text-zinc-200",children:"Anderes Mitglied wählen"}),t.match_status!=="ignoriert"&&e.jsx("button",{disabled:l,onClick:()=>j(t.id,{aktion:"ignorieren"}),className:"px-3 py-1.5 rounded-lg bg-zinc-100 dark:bg-zinc-800 hover:bg-zinc-200 dark:hover:bg-zinc-700 text-sm font-medium text-zinc-700 dark:text-zinc-200",children:"Kein Mitgliederbeitrag"}),t.match_status!=="offen"&&e.jsx("button",{disabled:l,onClick:()=>j(t.id,{aktion:"oeffnen"}),className:"px-3 py-1.5 rounded-lg text-sm text-zinc-500 hover:text-zinc-800 dark:hover:text-zinc-200",children:"Zurücksetzen"}),!t.journal_entry_id&&t.match_status!=="zugeordnet"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{disabled:l,onClick:()=>{H()},className:"px-3 py-1.5 rounded-lg bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 text-sm font-medium hover:opacity-90 disabled:opacity-50",children:"Verbuchen"}),e.jsx("button",{disabled:l,onClick:()=>{const w=prompt("Was ist unklar? (Die Pendenz geht an die Finanzen.)")??"";d({aktion:"unklar",transaction_id:t.id,notiz:w},"Pendenz für die Finanzen angelegt.")},className:"px-3 py-1.5 rounded-lg text-sm text-zinc-500 hover:text-amber-700",children:"Unklar, Pendenz"})]}),l&&e.jsx("span",{className:"text-sm text-zinc-400",children:"Moment…"})]}),m&&i&&!t.journal_entry_id&&e.jsxs("div",{className:"mt-3 rounded-lg border border-zinc-200 dark:border-zinc-800 p-3 space-y-2",children:[x&&e.jsxs("p",{className:`text-[12.5px] ${x.sicher?"text-zinc-500":"text-amber-700 dark:text-amber-400"}`,children:["Vorschlag: ",x.konto," (",x.grund,")",x.sicher?"":" · bitte prüfen"]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("select",{className:ce,value:$,onChange:w=>n(w.target.value),children:[e.jsx("option",{value:"",children:"Konto wählen…"}),k.filter(w=>!["1010","1090"].includes(w.number)).map(w=>e.jsxs("option",{value:w.number,children:[w.number," ",w.name]},w.id))]}),e.jsxs("select",{className:ce,value:y,onChange:w=>v(w.target.value),children:[e.jsx("option",{value:"",children:"ohne Kostenstelle"}),u.map(w=>e.jsx("option",{value:w.id,children:w.name},w.id))]}),e.jsx("input",{className:`${ce} flex-1 min-w-[200px]`,placeholder:"Buchungstext (sonst aus dem Auszug)",value:_,onChange:w=>F(w.target.value)}),e.jsx("button",{disabled:l||!$,onClick:async()=>{await d({aktion:"buchen",transaction_id:t.id,konto:$,cost_center_id:y||null,text:_||void 0},"Gebucht.")&&c(!1)},className:"px-3 py-1.5 rounded-lg bg-green-600 hover:bg-green-700 text-white text-sm font-medium disabled:opacity-50",children:"Buchen"})]})]}),i&&t.match_status==="zugeordnet"&&K&&Number(K.paid_amount??0)-Number(K.amount)>=.005&&e.jsxs("div",{className:"mt-3 rounded-lg bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-900/50 p-3",children:[e.jsxs("p",{className:"text-sm text-amber-900 dark:text-amber-200",children:["Eingegangen ",G(Number(K.paid_amount)),", Beitrag ",G(Number(K.amount)),", also ",G(Number(K.paid_amount)-Number(K.amount))," zu viel.",K.surplus_status&&K.surplus_status!=="ungeklaert"?` Erledigt als ${fe[K.surplus_status]??K.surplus_status}
1.`:" Noch nicht geklärt."]}),(!K.surplus_status||K.surplus_status==="ungeklaert")&&e.jsx("div",{className:"mt-2 flex flex-wrap gap-2",children:["spende","rueckzahlung","gutschrift"].map(w=>e.jsx("button",{disabled:l,onClick:()=>j(t.id,{aktion:"ueberschuss",wert:w}),className:"px-3 py-1.5 rounded-lg bg-white dark:bg-zinc-800 border border-amber-300 dark:border-amber-800 text-sm font-medium text-amber-900 dark:text-amber-200 hover:bg-amber-100 dark:hover:bg-zinc-700 disabled:opacity-50",children:fe[w]},w))})]}),g&&i&&e.jsxs("div",{className:"mt-3 rounded-lg border border-zinc-200 dark:border-zinc-800 p-3",children:[e.jsx("input",{autoFocus:!0,className:`${ce} w-full`,placeholder:"Name, Organisation oder Mitgliedernummer",value:b,onChange:w=>{A(w.target.value),J(null)}}),!E&&b.trim()&&!te.length&&e.jsx("p",{className:"mt-2 text-sm text-zinc-500",children:"Kein Mitglied gefunden."}),!E&&te.length>0&&e.jsx("ul",{className:"mt-2 divide-y divide-zinc-100 dark:divide-zinc-800",children:te.map(({m:w,d:r})=>e.jsx("li",{children:e.jsxs("button",{onClick:()=>J({m:w,d:r}),className:"w-full text-left py-2 px-2 rounded hover:bg-zinc-50 dark:hover:bg-zinc-800 flex flex-wrap items-baseline gap-x-2",children:[e.jsxs("span",{className:"text-xs font-mono text-zinc-400 w-12 shrink-0",children:["Nr. ",w.member_no]}),e.jsx("span",{className:"text-sm font-medium text-zinc-900 dark:text-white",children:w.org_name||w.namen}),e.jsx("span",{className:"text-[12px] text-zinc-400",children:w.address}),e.jsx("span",{className:"ml-auto text-sm text-zinc-600 dark:text-zinc-300",children:G(Number(r.amount))}),r.status==="bezahlt"&&e.jsx("span",{className:"px-2 py-0.5 rounded-full text-[11px] font-bold bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-400",children:"bezahlt"}),r.status==="teilweise"&&e.jsx("span",{className:"px-2 py-0.5 rounded-full text-[11px] font-bold bg-orange-100 text-orange-700 dark:bg-orange-900/40 dark:text-orange-400",children:"teilweise"})]})},w.id))}),E&&e.jsx(Le,{buchung:t,wahl:E,arbeitet:l,schonBezahlt:N.get(E.d.id)??[],twint:h.get(E.m.id)??[],zurueck:()=>J(null),zuordnen:()=>{j(t.id,{aktion:"zuordnen",dues:E.d.id}),a(!1),A(""),J(null)}})]})]})}const Oe={einzel:"Einzel",paar:"Paar",organisation:"Organisation",gast_einzel:"Kontakt",gast_paar:"Kontakt (Paar)",gast_organisation:"Kontakt (Org.)"},je=t=>`Fr. ${t.toFixed(2)}`,xe=t=>t?new Date(`${t.slice(0,10)}T12:00:00`).toLocaleDateString("de-CH"):"",ke=t=>new Date(`${t.slice(0,10)}T12:00:00`).toLocaleDateString("de-CH",{day:"numeric",month:"long",year:"numeric"});function Ie({canEdit:t,jahr:i}){const[l,f]=s.useState(null),[B,z]=s.useState(null),[N,h]=s.useState(null),[j,k]=s.useState(!1),[u,o]=s.useState(""),[d,g]=s.useState("alle"),[a,m]=s.useState("alle"),[c,$]=s.useState(new Set),[n,y]=s.useState(null),v=s.useCallback(async()=>{z(null);const b=await Q(`/api/admin/offene-beitraege?jahr=${i}`),A=await b.json().catch(()=>({}));if(!b.ok){z(A.error??`Fehler ${b.status}`);return}f(A),$(new Set)},[i]);s.useEffect(()=>{v()},[v]);const _=s.useMemo(()=>{if(!l)return[];const b=u.trim().toLowerCase();return l.zeilen.filter(A=>(d==="alle"||(d==="0"?A.mahnstufe===0:d==="1"?A.mahnstufe===1:A.mahnstufe>=2))&&(a==="alle"||A.type===a)&&(!b||A.name.toLowerCase().includes(b)||String(A.member_no??"").includes(b)||(A.email??"").includes(b)))},[l,u,d,a]),F=b=>b.reduce((A,E)=>A+E.offen,0),x=_.length>0&&_.every(b=>c.has(b.dues_id)),S=_.filter(b=>c.has(b.dues_id));function I(b){$(A=>{const E=new Set(A);return E.has(b)?E.delete(b):E.add(b),E})}async function O(b){k(!0),z(null),h(null);const A=await Q("/api/admin/offene-beitraege",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jahr:i,dues_ids:[...c],...b})}),E=await A.json().catch(()=>({}));return k(!1),A.ok?E:(z(E.error??`Fehler ${A.status}`),null)}if(B&&!l)return e.jsx("p",{className:"text-sm text-red-600",children:B});if(!l)return e.jsx("p",{className:"text-sm text-zinc-400",children:"Lade offene Beiträge…"});const H=l.zahlungsstand;return e.jsxs("div",{children:[e.jsx("div",{className:"mb-4 rounded-lg border border-zinc-200 dark:border-zinc-700 bg-zinc-50 dark:bg-zinc-800/40 px-4 py-3 text-[13px] text-zinc-600 dark:text-zinc-300",children:H.bank||H.twint?e.jsxs(e.Fragment,{children:["Berücksichtigt sind Zahlungen bis ",[H.bank?`${ke(H.bank)} (Postkonto)`:null,H.twint?`${ke(H.twint)}
1 (TWINT via RaiseNow)`:null].filter(Boolean).join(" und bis "),". Was danach kam, steht hier noch als offen: zuerst den Kontoauszug einlesen, dann mahnen."]}):"Noch kein Kontoauszug eingelesen."}),e.jsxs(ye,{suche:u,onSuche:o,platzhalter:"Name, Nummer, Mail…",rechts:e.jsxs("span",{className:"text-[13px] text-zinc-500 tabular-nums",children:[_.length," von ",l.zeilen.length," · offen ",je(F(_))]}),children:[e.jsx(he,{wert:d,onWert:g,titel:"Erinnerungsstufe",optionen:[["alle","Alle Stufen"],["0","Noch nie erinnert"],["1","Einmal erinnert"],["2","Zweimal oder mehr"]]}),e.jsx(he,{wert:a,onWert:m,titel:"Mitgliedsart",optionen:[["alle","Alle Arten"],["einzel","Einzel"],["paar","Paar"],["organisation","Organisation"]]})]}),B&&e.jsx("p",{className:"mb-3 text-sm text-red-600",children:B}),N&&e.jsx("p",{className:"mb-3 text-sm text-green-700 dark:text-green-400",children:N}),t&&e.jsxs("div",{className:"mb-3 flex flex-wrap items-center gap-2",children:[e.jsxs("button",{disabled:j||S.length===0,onClick:()=>y("erinnern"),className:"px-3.5 py-2 rounded-lg bg-red-600 text-white text-sm font-semibold hover:bg-red-700 disabled:opacity-40",children:["Erinnerung senden",S.length?` (${S.length})`:""]}),e.jsx("button",{disabled:j||S.length===0,onClick:()=>y("vermerken"),className:"px-3.5 py-2 rounded-lg border border-zinc-300 dark:border-zinc-600 text-sm hover:border-zinc-500 disabled:opacity-40",children:"Als erinnert vermerken (ohne Mail)"}),S.length>0&&e.jsxs("span",{className:"text-[13px] text-zinc-500 tabular-nums",children:["Auswahl: ",je(F(S)),S.some(b=>!b.email)&&` · ${S.filter(b=>!b.email).length} ohne Mailadresse`]})]}),_.length===0?e.jsx("p",{className:"text-sm text-zinc-400",children:"Nichts offen. Schön."}):e.jsx("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 overflow-x-auto",children:e.jsxs("table",{className:"w-full text-[13px]",children:[e.jsx("thead",{className:"bg-zinc-50 dark:bg-zinc-800/60 text-left text-[11px] uppercase tracking-wide text-zinc-400",children:e.jsxs("tr",{children:[t&&e.jsx("th",{className:"px-3 py-2 w-8",children:e.jsx("input",{type:"checkbox",checked:x,onChange:b=>$(b.target.checked?new Set(_.map(A=>A.dues_id)):new Set)})}),e.jsx("th",{className:"px-3 py-2",children:"Nr."}),e.jsx("th",{className:"px-3 py-2",children:"Name"}),e.jsx("th",{className:"px-3 py-2",children:"Art"}),e.jsx("th",{className:"px-3 py-2 text-right",children:"Soll"}),e.jsx("th",{className:"px-3 py-2 text-right",children:"Bezahlt"}),e.jsx("th",{className:"px-3 py-2 text-right",children:"Offen"}),e.jsx("th",{className:"px-3 py-2",children:"Erinnert"}),e.jsx("th",{className:"px-3 py-2",children:"Signale"}),e.jsx("th",{className:"px-3 py-2"})]})}),e.jsx("tbody",{className:"divide-y divide-zinc-100 dark:divide-zinc-800",children:_.map(b=>e.jsxs("tr",{className:c.has(b.dues_id)?"bg-red-50/60 dark:bg-red-950/20":"",children:[t&&e.jsx("td",{className:"px-3 py-2",children:e.jsx("input",{type:"checkbox",checked:c.has(b.dues_id),onChange:()=>I(b.dues_id)})}),e.jsx("td",{className:"px-3 py-2 tabular-nums text-zinc-500",children:b.member_no??"–"}),e.jsxs("td",{className:"px-3 py-2",children:[e.jsx("span",{className:"font-medium text-zinc-900 dark:text-zinc-100",children:b.name}),b.membership_status==="angemeldet"&&e.jsx("span",{className:"ml-1.5 text-[11px] text-amber-700",children:"Antrag"}),e.jsx("span",{className:"block text-[12px] text-zinc-400 break-all",children:b.email??"keine Mailadresse"})]}),e.jsx("td",{className:"px-3 py-2 text-zinc-500",children:Oe[b.type]??b.type}),e.jsx("td",{className:"px-3 py-2 text-right tabular-nums",children:b.soll.toFixed(2)}),e.jsx("td",{className:"px-3 py-2 text-right tabular-nums text-zinc-500",children:b.bezahlt>0?b.bezahlt.toFixed(2):"–"}),e.jsx("td",{className:"px-3 py-2 text-right tabular-nums font-semibold",children:b.offen.toFixed(2)}),e.jsx("td",{className:"px-3 py-2 text-zinc-500 whitespace-nowrap",children:b.mahnstufe===0?e.jsx("span",{className:"text-zinc-400",children:"noch nie"}):e.jsxs(e.Fragment,{children:[b.mahnstufe,"× ",e.jsxs("span",{className:"text-zinc-400",children:["zuletzt ",xe(b.mahnung_am)]})]})}),e.jsx("td",{className:"px-3 py-2",children:e.jsxs("div",{className:"flex flex-wrap gap-1",children:[b.twint_gestartet_am&&e.jsx(oe,{ton:"sky",text:`Twint angestossen ${xe(b.twint_gestartet_am)}`}),b.bezahlt_gemeldet_am&&e.jsx(oe,{ton:"amber",text:`«habe bezahlt» ${xe(b.bezahlt_gemeldet_am)}`}),b.pendenz_offen&&e.jsx(oe,{ton:"orange",text:"Differenz-Pendenz offen"}),b.portal_genutzt&&e.jsx(oe,{ton:"zinc",text:"Portal genutzt"})]})}),e.jsx("td",{className:"px-3 py-2 text-right whitespace-nowrap",children:e.jsx("a",{href:`/admin/mitglieder?open=${b.membership_id}`,target:"_blank",rel:"noopener",className:"text-red-600 dark:text-red-400 hover:underline",children:"Mitglied öffnen"})})]},b.dues_id))})]})}),n==="erinnern"&&e.jsx(Re,{auswahl:S,vorlagen:l.vorlagen,busy:j,onClose:()=>y(null),onSend:async(b,A)=>{if(!Ae(S.filter(R=>R.email).length,b))return;const E=await O({aktion:"erinnern",betreff:b,text:A});if(!E)return;y(null);const J=[`${E.gesendet} Mail${E.gesendet===1?"":"s"} verschickt`],M=E.ohneMail,K=E.fehlgeschlagen;M?.length&&J.push(`ohne Mailadresse: ${M.join(", ")}`),K?.length&&J.push(`fehlgeschlagen: ${K.join(", ")}`),h(J.join(" · ")),await v()}}),n==="vermerken"&&e.jsx(Je,{anzahl:S.length,busy:j,onClose:()=>y(null),onSave:async b=>{const A=await O({aktion:"vermerken",notiz:b});A&&(y(null),h(`${A.vermerkt} als erinnert vermerkt.`),await v())}})]})}function oe({ton:t,text:i}){const l={sky:"bg-sky-100 text-sky-800 dark:bg-sky-950/40 dark:text-sky-300",amber:"bg-amber-100 text-amber-800 dark:bg-amber-950/40 dark:text-amber-300",orange:"bg-orange-100 text-orange-800 dark:bg-orange-950/40 dark:text-orange-300",zinc:"bg-zinc-100 text-zinc-600 dark:bg-zinc-800 dark:text-zinc-300"}[t];return e.jsx("span",{className:`px-1.5 py-0.5 rounded-md text-[11px] font-medium whitespace-nowrap ${l}`,children:i})}const ge="w-full rounded-lg border border-zinc-300 dark:border-zinc-600 bg-white dark:bg-zinc-800 px-3 py-1.5 text-sm text-zinc-900 dark:text-zinc-100 focus:border-red-400 focus:outline-none";function Re({auswahl:t,vorlagen:i,busy:l,onClose:f,onSend:B}){const z=t.every(g=>g.mahnstufe===0)?1:2,[N,h]=s.useState(i[String(z)]?.betreff??""),[j,k]=s.useState(i[String(z)]?.text??""),u=t.filter(g=>g.email),o=t.some(g=>g.mahnstufe===0)&&t.some(g=>g.mahnstufe>0),d=u[0];return Ne.createPortal(e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4",onClick:f,children:e.jsxs("div",{className:"w-full max-w-2xl max-h-[90vh] overflow-y-auto rounded-2xl bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-700 shadow-2xl",onClick:g=>g.stopPropagation(),children:[e.jsxs("div",{className:"px-5 py-4 border-b border-zinc-200 dark:border-zinc-800",children:[e.jsxs("h3",{className:"text-base font-bold text-zinc-900 dark:text-white",children:[z===1?"Erinnerung":"Mahnung"," an ",u.length," Mitglied",u.length===1?"":"er"]}),e.jsxs("p",{className:"text-[13px] text-zinc-500 dark:text-zinc-400 mt-0.5",children:["In der Vereinsvorlage, mit Knopf zum Mitgliederportal und Betragskasten je Mitglied. Antworten landen bei dir.",t.length!==u.length&&` ${t.length-u.length} ohne Mailadresse werden übersprungen.`]}),o&&e.jsx("p",{className:"text-[12.5px] text-amber-700 dark:text-amber-400 mt-1",children:"Die Auswahl mischt «noch nie erinnert» und «schon erinnert». Der Text unten gilt für alle; passe ihn an oder wähle nach Stufe."})]}),e.jsxs("div",{className:"px-5 py-4 flex flex-col gap-3",children:[e.jsxs("label",{className:"block",children:[e.jsx("span",{className:"block text-[11px] font-semibold uppercase tracking-wide text-zinc-400 mb-1",children:"Betreff"}),e.jsx("input",{value:N,onChange:g=>h(g.target.value),className:ge,name:"erinnerung-betreff",autoComplete:"off"})]}),e.jsxs("label",{className:"block",children:[e.jsx("span",{className:"block text-[11px] font-semibold uppercase tracking-wide text-zinc-400 mb-1",children:"Text"}),e.jsx("textarea",{value:j,onChange:g=>k(g.target.value),rows:12,className:`${ge} py-2.5 leading-relaxed resize-y`})]}),e.jsxs("p",{className:"text-xs text-zinc-400",children:["Platzhalter: ","{vorname}",", ","{name}",", ","{betrag}"," (Soll), ","{offen}"," (Restbetrag), ","{jahr}",". Leerzeile = neuer Absatz.",d&&e.jsxs(e.Fragment,{children:[" Be
1ispiel für ",d.name,": «",j.split(`
2`)[0].replace(/\{vorname\}/g,d.vorname||d.name),"»."]})]})]}),e.jsxs("div",{className:"px-5 py-4 border-t border-zinc-200 dark:border-zinc-800 flex flex-wrap items-center gap-2",children:[e.jsx("button",{disabled:l||u.length===0||!N.trim()||!j.trim(),onClick:()=>B(N,j),className:"px-4 py-2 rounded-lg bg-red-600 text-white text-sm font-semibold hover:bg-red-700 disabled:opacity-50",children:l?"Sende…":`${u.length} Mail${u.length===1?"":"s"} senden`}),e.jsx("button",{disabled:l,onClick:f,className:"ml-auto px-3.5 py-2 rounded-lg text-sm text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200 disabled:opacity-50",children:"Abbrechen"})]})]})}),document.body)}function Je({anzahl:t,busy:i,onClose:l,onSave:f}){const[B,z]=s.useState("");return Ne.createPortal(e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4",onClick:l,children:e.jsxs("div",{className:"w-full max-w-md rounded-2xl bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-700 shadow-2xl",onClick:N=>N.stopPropagation(),children:[e.jsxs("div",{className:"px-5 py-4 border-b border-zinc-200 dark:border-zinc-800",children:[e.jsx("h3",{className:"text-base font-bold text-zinc-900 dark:text-white",children:"Als erinnert vermerken"}),e.jsxs("p",{className:"text-[13px] text-zinc-500 dark:text-zinc-400 mt-0.5",children:["Für ",t," Beitr",t===1?"ag":"äge",": Stufe zählt hoch, kein Mailversand. Für Brief, Telefon oder Gespräch."]})]}),e.jsx("div",{className:"px-5 py-4",children:e.jsx("input",{value:B,onChange:N=>z(N.target.value),placeholder:"Notiz, z. B. «Brief verschickt» oder «am Fest angesprochen»",className:ge})}),e.jsxs("div",{className:"px-5 py-4 border-t border-zinc-200 dark:border-zinc-800 flex flex-wrap items-center gap-2",children:[e.jsx("button",{disabled:i,onClick:()=>f(B),className:"px-4 py-2 rounded-lg bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 text-sm font-semibold hover:opacity-90 disabled:opacity-50",children:i?"Speichere…":"Vermerken"}),e.jsx("button",{disabled:i,onClick:l,className:"ml-auto px-3.5 py-2 rounded-lg text-sm text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200 disabled:opacity-50",children:"Abbrechen"})]})]})}),document.body)}const Ve={bank:"Bank",abrechnung:"Abrechnung",manuell:"manuell"},be=t=>t.toLocaleString("de-CH",{minimumFractionDigits:2,maximumFractionDigits:2}),We=t=>new Date(`${t.slice(0,10)}T12:00:00`).toLocaleDateString("de-CH");function qe({jahr:t,canEdit:i,accounts:l,centers:f}){const[B,z]=s.useState(null),[N,h]=s.useState(null),[j,k]=s.useState(null),[u,o]=s.useState(!1),[d,g]=s.useState(""),[a,m]=s.useState("alle"),[c,$]=s.useState(!1),n=s.useMemo(()=>new Map(l.map(x=>[x.id,x])),[l]),y=s.useMemo(()=>new Map(f.map(x=>[x.id,x])),[f]),v=s.useCallback(async()=>{h(null);const x=await Q(`/api/admin/journal?jahr=${t}`),S=await x.json().catch(()=>({}));if(!x.ok){h(S.error??`Fehler ${x.status}`);return}z(S.eintraege??[])},[t]);s.useEffect(()=>{v()},[v]);async function _(x,S){o(!0),h(null),k(null);const I=await Q("/api/admin/journal",{method:"POST",body:JSON.stringify(x)}),O=await I.json().catch(()=>({}));return o(!1),I.ok?(k(S),await v(),!0):(h(O.error??`Fehler ${I.status}`),!1)}const F=s.useMemo(()=>{if(!B)return[];const x=d.trim().toLowerCase();return B.filter(S=>(a==="alle"||S.source_type===a)&&(!x||S.description.toLowerCase().includes(x)||S.journal_lines.some(I=>{const O=n.get(I.account_id);return O&&`${O.number} ${O.name}`.toLowerCase().includes(x)})))},[B,d,a,n]);return N&&!B?e.jsx("p",{className:"text-sm text-red-600",children:N}):B?e.jsxs("div",{children:[e.jsx(ye,{suche:d,onSuche:g,platzhalter:"Text oder Konto…",rechts:e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"text-[13px] text-zinc-500 tabular-nums",children:[F.length," Buchungen"]}),i&&e.jsx("button",{onClick:()=>$(x=>!x),className:"px-3.5 py-2 rounded-lg bg-red-600 text-white text-sm font-semibold hover:bg-red-700",children:"+ Buchung"})]}),children:e.jsx(he,{wert:a,onWert:m,optionen:[["alle","Alle Quellen"],["bank","Bank"],["abrechnung","Abrechnung"],["manuell","Manuell"]]})}),N&&e.jsx("p",{className:"mb-3 text-sm text-red-600",children:N}),j&&e.jsx("p",{className:"mb-3 text-sm text-green-700 dark:text-green-400",children:j}),c&&i&&e.jsx(Ge,{accounts:l,centers:f,busy:u,onClose:()=>$(!1),onSave:async x=>{await _({aktion:"manuell",...x},"Buchung angelegt.")&&$(!1)}}),F.length===0?e.jsx("p",{className:"text-sm text-zinc-400",children:"Noch keine Buchungen. Sie entstehen im Bankabgleich (Verbuchen, Beiträge) und aus geprüften Abrechnungen."}):e.jsx("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 overflow-x-auto",children:e.jsxs("table",{className:"w-full text-[13px]",children:[e.jsx("thead",{className:"bg-zinc-50 dark:bg-zinc-800/60 text-left text-[11px] uppercase tracking-wide text-zinc-400",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-3 py-2 w-24",children:"Datum"}),e.jsx("th",{className:"px-3 py-2",children:"Text"}),e.jsx("th",{className:"px-3 py-2",children:"Konto"}),e.jsx("th",{className:"px-3 py-2 text-right w-28",children:"Soll"}),e.jsx("th",{className:"px-3 py-2 text-right w-28",children:"Haben"}),e.jsx("th",{className:"px-3 py-2 w-24",children:"Quelle"}),e.jsx("th",{className:"px-3 py-2 w-20"})]})}),e.jsx("tbody",{className:"divide-y divide-zinc-100 dark:divide-zinc-800",children:F.map(x=>e.jsxs("tr",{className:`align-top ${x.storniert?"opacity-50":""} ${x.reverses_id?"bg-zinc-50/60 dark:bg-zinc-800/30":""}`,children:[e.jsx("td",{className:"px-3 py-2 tabular-nums text-zinc-500 whitespace-nowrap",children:We(x.entry_date)}),e.jsxs("td",{className:"px-3 py-2",children:[e.jsx("span",{className:`text-zinc-900 dark:text-zinc-100 ${x.storniert?"line-through":""}`,children:x.description}),x.storniert&&e.jsx("span",{className:"ml-1.5 text-[11px] text-zinc-400",children:"storniert"}),x.reference&&e.jsx("span",{className:"block text-[12px] text-zinc-400",children:x.reference}),x.created_by_name&&e.jsx("span",{className:"block text-[11px] text-zinc-400",children:x.created_by_name})]}),e.jsx("td",{className:"px-3 py-2",children:x.journal_lines.map(S=>{const I=n.get(S.account_id),O=S.cost_center_id?y.get(S.cost_center_id):null;return e.jsxs("div",{className:"whitespace-nowrap",children:[e.jsx("span",{className:"text-zinc-400 tabular-nums",children:I?.number})," ",I?.name??"?",O?e.jsxs("span",{className:"text-zinc-400",children:[" · ",O.n
2ame]}):null]},S.id)})}),e.jsx("td",{className:"px-3 py-2 text-right tabular-nums",children:x.journal_lines.map(S=>e.jsx("div",{children:Number(S.amount)>0?be(Number(S.amount)):""},S.id))}),e.jsx("td",{className:"px-3 py-2 text-right tabular-nums",children:x.journal_lines.map(S=>e.jsx("div",{children:Number(S.amount)<0?be(-Number(S.amount)):""},S.id))}),e.jsx("td",{className:"px-3 py-2 text-zinc-500",children:Ve[x.source_type]??x.source_type}),e.jsx("td",{className:"px-3 py-2 text-right",children:i&&!x.storniert&&!x.reverses_id&&e.jsx("button",{disabled:u,onClick:()=>{const S=prompt("Storno: Grund (optional)");S!==null&&_({aktion:"storno",entry_id:x.id,grund:S},"Storniert.")},className:"text-[12px] text-zinc-400 hover:text-red-600 disabled:opacity-50",children:"Storno"})})]},x.id))})]})})]}):e.jsx("p",{className:"text-sm text-zinc-400",children:"Lade Journal…"})}function Ge({accounts:t,centers:i,busy:l,onClose:f,onSave:B}){const[z,N]=s.useState(new Date().toISOString().slice(0,10)),[h,j]=s.useState(""),[k,u]=s.useState([{account_id:"",soll:"",haben:"",cost_center_id:""},{account_id:"",soll:"",haben:"",cost_center_id:""}]),o=k.reduce((a,m)=>a+(Number(m.soll)||0)-(Number(m.haben)||0),0),d=h.trim()&&k.every(a=>a.account_id&&(Number(a.soll)||0)>0!=(Number(a.haben)||0)>0)&&Math.abs(o)<.005,g=(a,m)=>u(c=>c.map(($,n)=>n===a?{...$,...m}:$));return e.jsxs("div",{className:"mb-4 rounded-xl border border-zinc-200 dark:border-zinc-800 p-4 space-y-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("input",{type:"date",className:re,value:z,onChange:a=>N(a.target.value)}),e.jsx("input",{className:`${re} flex-1 min-w-[240px]`,placeholder:"Buchungstext",value:h,onChange:a=>j(a.target.value)})]}),e.jsxs("div",{className:"space-y-1.5",children:[k.map((a,m)=>e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("select",{className:`${re} min-w-[260px]`,value:a.account_id,onChange:c=>g(m,{account_id:c.target.value}),children:[e.jsx("option",{value:"",children:"Konto…"}),t.map(c=>e.jsxs("option",{value:c.id,children:[c.number," ",c.name]},c.id))]}),e.jsx("input",{className:`${re} w-28 text-right`,placeholder:"Soll",inputMode:"decimal",value:a.soll,onChange:c=>g(m,{soll:c.target.value,haben:c.target.value?"":a.haben})}),e.jsx("input",{className:`${re} w-28 text-right`,placeholder:"Haben",inputMode:"decimal",value:a.haben,onChange:c=>g(m,{haben:c.target.value,soll:c.target.value?"":a.soll})}),e.jsxs("select",{className:re,value:a.cost_center_id,onChange:c=>g(m,{cost_center_id:c.target.value}),children:[e.jsx("option",{value:"",children:"ohne Kostenstelle"}),i.map(c=>e.jsx("option",{value:c.id,children:c.name},c.id))]}),k.length>2&&e.jsx("button",{onClick:()=>u(c=>c.filter(($,n)=>n!==m)),className:"text-[12px] text-zinc-400 hover:text-red-600",children:"entfernen"})]},m)),e.jsx("button",{onClick:()=>u(a=>[...a,{account_id:"",soll:"",haben:"",cost_center_id:""}]),className:"text-[12.5px] text-red-600 hover:underline",children:"+ Zeile"})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:`text-[12.5px] tabular-nums ${Math.abs(o)<.005?"text-green-700":"text-amber-700"}`,children:Math.abs(o)<.005?"Buchung geht auf.":`Differenz ${be(o)}`}),e.jsx("button",{disabled:l||!d,onClick:()=>B({datum:z,text:h.trim(),zeilen:k.map(a=>({account_id:a.account_id,amount:(Number(a.soll)||0)-(Number(a.haben)||0),cost_center_id:a.cost_center_id||null}))}),className:"ml-auto px-3.5 py-2 rounded-lg bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 text-sm font-semibold hover:opacity-90 disabled:opacity-40",children:l?"Speichere…":"Buchen"}),e.jsx("button",{onClick:f,className:"px-3 py-2 text-sm text-zinc-400 hover:text-zinc-700",children:"Abbrechen"})]})]})}const ue={laufend:[{key:"bankabgleich",label:"Bankabgleich"},{key:"journal",label:"Journal"},{key:"offen",label:"Offene Beiträge"},{key:"abrechnungen",label:"Abrechnungen"}],auswertung:[{key:"abschluss",label:"Abschluss"},{key:"budget",label:"Budget"},{key:"budgetist",label:"Budget/Ist"}],einrichtung:[{key:"kontenplan",label:"Kontenplan"},{key:"kostenstellen",label:"Kostenstellen"}]},He=t=>Object.keys(ue).find(i=>ue[i].some(l=>l.key===t))??"laufend",le={aktiv:"Aktiven",passiv:"Passiven",aufwand:"Aufwand",ertrag:"Ertrag"},Ue={vorbereitung:"In Vorbereitung",offen:"Offen",abgeschlossen:"Abgeschlossen"},Y="px-2.5 py-1.5 rounded-lg border border-zinc-300 dark:border-zinc-600 bg-white dark:bg-zinc-900 text-sm text-zinc-900 dark:text-zinc-100 focus:outline-none focus:ring-2 focus:ring-red-500/40",Z=t=>
2t.toLocaleString("de-CH",{minimumFractionDigits:2,maximumFractionDigits:2}).replace(/’/g,"'");async function Ye(t){const i=await Q(`/api/admin/budget-review?year=${t}`);return i.ok?i.json():null}async function _e(t,i){const l=await Q("/api/admin/budget-review",{method:"POST",body:JSON.stringify({action:t,...i})}),f=await l.json().catch(()=>({}));if(!l.ok)throw new Error(f.error??"Serverfehler");return f}function me({doc:t,year:i,label:l}){const[f,B]=s.useState(!1),[z,N]=s.useState(null);async function h(){B(!0),N(null);const j=window.open("","_blank");j&&(j.opener=null);try{const k=await Q(`/api/admin/finanzen-pdf?doc=${t}&year=${i}`);if(!k.ok){j?.close();const o=await k.json().catch(()=>({}));N(o.error??"PDF-Fehler");return}const u=URL.createObjectURL(await k.blob());j&&(j.location.href=u)}catch(k){j?.close(),N(k instanceof Error?k.message:"PDF-Fehler")}finally{B(!1)}}return e.jsx("button",{onClick:h,disabled:f,title:z??void 0,className:`px-3 py-1.5 rounded-lg border text-[13px] font-medium disabled:opacity-40 ${z?"border-red-400 text-red-600":"border-zinc-300 dark:border-zinc-600 text-zinc-700 dark:text-zinc-200 hover:bg-zinc-50 dark:hover:bg-zinc-800"}`,children:f?"…":z?"Fehler":l})}function jt(){const{permissions:t,userId:i}=Ce(),l=!!t.perm_finanzen,[f,B]=s.useState(()=>{const p=new URLSearchParams(window.location.search).get("tab");return["abschluss","bankabgleich","journal","offen","abrechnungen","kontenplan","kostenstellen","budget","budgetist"].includes(p)?p:"abschluss"}),[z,N]=s.useState([]),[h,j]=s.useState([]),[k,u]=s.useState([]),[o,d]=s.useState([]),[g,a]=s.useState([]),[m,c]=s.useState([]),[$,n]=s.useState(""),y=He(f),[v,_]=s.useState({bank:0,abrechnungen:0,beitraege:0}),[F,x]=s.useState([]),[S,I]=s.useState(!0),[O,H]=s.useState(!1),[b,A]=s.useState(null),E=s.useCallback(async p=>{const[P,W,U]=await Promise.all([T.from("bank_transactions").select("id",{count:"exact",head:!0}).in("match_status",["vorschlag","offen"]).gt("amount",0),T.from("expense_reports").select("id",{count:"exact",head:!0}).eq("status","zu_pruefen"),T.from("membership_dues").select("id",{count:"exact",head:!0}).eq("year",p).in("status",["offen","teilweise"])]);_({bank:P.count??0,abrechnungen:W.count??0,beitraege:U.count??0})},[]),J=s.useCallback(async()=>{I(!0),A(null);const[p,P,W,U,q,se,de]=await Promise.all([T.from("ledger_account_groups").select("*").order("sort_order"),T.from("ledger_accounts").select("*").order("sort_order"),T.from("cost_centers").select("*").order("sort_order"),T.from("fiscal_years").select("*").order("year",{ascending:!1}),T.from("account_balances").select("*"),T.from("budget_lines").select("*"),T.from("journal_lines").select("account_id, amount, cost_center_id, journal_entries!inner(fiscal_year_id)")]),ae=[p,P,W,U,q,se].find(V=>V.error);if(ae?.error){A(ae.error.message),I(!1);return}N(p.data??[]),j(P.data??[]),u(W.data??[]);const X=U.data??[];d(X),a(q.data??[]),c(se.data??[]),x((de.data??[]).map(V=>({account_id:V.account_id,amount:Number(V.amount),cost_center_id:V.cost_center_id,fiscal_year_id:(Array.isArray(V.journal_entries)?V.journal_entries[0]:V.journal_entries)?.fiscal_year_id})));const L=new Date().getFullYear();n(V=>V||X.find(ee=>ee.year===L)?.id||X.find(ee=>ee.status==="offen")?.id||X[0]?.id||""),E(X.find(V=>V.year===L)?.year??L),I(!1)},[E]);s.useEffect(()=>{J()},[J]);const M=o.find(p=>p.id===$)??null,K=M?.year;s.useEffect(()=>{K&&E(K)},[K,E]);const R=f==="abschluss"||f==="budget"||f==="budgetist"||f==="offen"||f==="journal"||f==="abrechnungen";function te(p){const P=g.filter(q=>q.fiscal_year_id===p.id);if(p.status==="abgeschlossen")return P;const W=P.filter(q=>q.kind==="eroeffnung"),U=W.map(q=>({...q,kind:"schluss",id:`${q.id}-s`,source:"journal"}));for(const q of F.filter(se=>se.fiscal_year_id===p.id))U.push({id:`j-${U.length}`,fiscal_year_id:p.id,account_id:q.account_id,kind:"schluss",cost_center_id:q.cost_center_id,amount:q.amount,source:"journal"});return[...W,...U]}const w=s.useMemo(()=>Object.fromEntries(z.map(p=>[p.id,p])),[z]),r=s.useMemo(()=>Object.fromEntries(h.map(p=>[p.id,p])),[h]),D=s.useCallback(p=>w[r[p]?.group_id??""]?.section,[w,r]);async function C(p,P,W){H(!0);const{error:U}=await T.from(p).update({...W,updated_at:new Date().toISOString()}).eq("id",P);return H(!1),U?(A(U.message),!1):(await J(),!0)}return S?e.jsx("p",{className:"text-sm text-zinc-400",children:"Lade…"}):e.jsxs("div",{className:"max-w-5xl",children:[e.jsx(Fe,{recht:"perm_finanzen"}),e.jsxs("div",{className:"mb-6 flex items-start justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-zinc-900 dark:text-white",children:"Buchhaltung"}),e.jsxs("p",{className:"text-sm text-zinc-500 dark:text-zinc-400 mt-0.5",children:[h.length," Konten · ",k.length," Kostenstellen · ",o.length," Geschäftsjahre"]})]}),e.jsx(Be,{titel:"Buchhaltung",hinweis:"Konten, Budget, Abschluss, Bankabgleich und Importe.",children:e.jsx(lt,{})})]}),e.jsx($e,{aktiv:y,onWechsel:p=>{B(ue[p][0].key)},ohneRahmen:!0,reiter:[{key:"laufend",label:"Laufend",anzahl:v.bank+v.abrechnungen||void 0,wartet:v.bank+v.abrechnungen>0},{key:"auswertung",label:"Auswertung"},{key:"einrichtung",label:"Einrichtung"}],rechts:R?e.jsxs(e.Fragment,{children:[e.jsx("select",{className:Y,value:$,onChange:p=>n(p.target.value),children:o.map(p=>e.jsx("option",{value:p.id,children:p.year},p.id))}),M&&e.jsx("span",{className:`px-2 py-0.5 rounded-full text-[11px] font-bold ${M.status==="abgeschlossen"?"bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-400":M.status==="offen"?"bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-400":"bg-zinc-100 text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400"}`,children:Ue[M.status]??M.status})]}):void 0}),e.jsx("div",{className:"mt-2 mb-4 flex flex-wrap gap-1.5 border-b border-zinc-200 dark:border-zinc-800 pb-3",children:ue[
2y].map(p=>{const P=p.key==="bankabgleich"?v.bank:p.key==="abrechnungen"?v.abrechnungen:p.key==="offen"?v.beitraege:0,W=p.key==="bankabgleich"||p.key==="abrechnungen";return e.jsxs("button",{onClick:()=>B(p.key),className:`px-3 py-1.5 rounded-lg text-sm font-medium transition-colors ${f===p.key?"bg-red-600 text-white":"bg-zinc-100 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-300 hover:bg-zinc-200 dark:hover:bg-zinc-700"}`,children:[p.label,P>0&&e.jsx("span",{className:`ml-1.5 tabular-nums text-[11px] font-bold ${f===p.key?"text-white/80":W?"text-amber-700 dark:text-amber-400":"text-zinc-400"}`,children:P})]},p.key)})}),R&&M?.notes&&e.jsx("p",{className:"text-[12px] text-zinc-400 mb-4 mt-2",children:M.notes}),(!R||!M?.notes)&&e.jsx("div",{className:"mb-4"}),b&&e.jsx("p",{className:"mb-4 text-sm text-red-600",children:b}),f==="abschluss"&&M&&e.jsx(Qe,{jahr:M,balances:te(M),accounts:h,groups:z,centers:k,sektionVon:D,ausJournal:M.status!=="abgeschlossen"}),f==="abrechnungen"&&M&&e.jsx(Me,{jahr:M.year}),f==="journal"&&M&&e.jsx(qe,{jahr:M.year,canEdit:l,accounts:h,centers:k}
2),f==="kontenplan"&&e.jsx(Xe,{groups:z,accounts:h,canEdit:l,busy:O,onPatch:(p,P)=>C("ledger_accounts",p,P),onReload:J,setErr:A}),f==="kostenstellen"&&e.jsx(et,{centers:k,canEdit:l,busy:O,onPatch:(p,P)=>C("cost_centers",p,P),onReload:J,setErr:A}),f==="budget"&&M&&e.jsx(tt,{jahr:M,accounts:h,groups:z,budget:m.filter(p=>p.fiscal_year_id===M.id),balances:g,canEdit:l,userId:i,onReload:J,setErr:A}),f==="budgetist"&&M&&e.jsx(st,{jahr:M,accounts:h,groups:z,budget:m.filter(p=>p.fiscal_year_id===M.id),balances:g.filter(p=>p.fiscal_year_id===M.id)}),f==="bankabgleich"&&e.jsx(Pe,{canEdit:l}),f==="offen"&&M&&e.jsx(Ie,{canEdit:l,jahr:M.year})]})}function Qe({jahr:t,balances:i,accounts:l,groups:f,centers:B,sektionVon:z,ausJournal:N=!1}){const[h,j]=s.useState("schluss"),k=i.filter(n=>n.kind===h),u=new Map;for(const n of k)u.set(n.account_id,(u.get(n.account_id)??0)+Number(n.amount));const o=n=>[...u.entries()].filter(([y])=>z(y)===n).reduce((y,[,v])=>y+v,0),d=o("aufwand"),g=-o("ertrag"),a=g-d,m=u.size>0&&(d!==0||g!==0);function c({sec:n}){const y=f.filter(v=>v.section===n).filter(v=>l.some(_=>_.group_id===v.id&&u.has(_.id)));return y.length===0?null:e.jsxs("div",{children:[e.jsx("h3",{className:"text-[13px] font-bold uppercase tracking-wider text-zinc-500 mb-2",children:le[n]}),y.map(v=>{const _=l.filter(x=>x.group_id===v.id&&u.has(x.id)),F=_.reduce((x,S)=>x+(u.get(S.id)??0),0);return e.jsxs("div",{className:"mb-3",children:[e.jsx("p",{className:"text-[12px] font-semibold text-zinc-600 dark:text-zinc-300 mb-1",children:v.name}),e.jsx("table",{className:"w-full text-sm",children:e.jsxs("tbody",{children:[_.map(x=>e.jsxs("tr",{children:[e.jsx("td",{className:"py-1 pl-3 text-zinc-400 tabular-nums w-16",children:x.number}),e.jsx("td",{className:"py-1 text-zinc-700 dark:text-zinc-200",children:x.name}),e.jsx("td",{className:"py-1 text-right tabular-nums text-zinc-900 dark:text-white",children:Z(Math.abs(u.get(x.id)??0))})]},x.id)),e.jsxs("tr",{className:"border-t border-zinc-200 dark:border-zinc-700",children:[e.jsx("td",{}),e.jsx("td",{className:"py-1 text-[12px] text-zinc-400",children:"Zwischentotal"}),e.jsx("td",{className:"py-1 text-right tabular-nums text-[12px] font-semibold text-zinc-500",children:Z(Math.abs(F))})]})]})})]},v.id)})]})}const $=new Map;for(const n of k){if(!n.cost_center_id)continue;const y=z(n.account_id);if(y!=="aufwand"&&y!=="ertrag")continue;const v=$.get(n.cost_center_id)??{aufwand:0,ertrag:0};y==="aufwand"?v.aufwand+=Number(n.amount):v.ertrag+=-Number(n.amount),$.set(n.cost_center_id,v)}return k.length===0?e.jsxs("p",{className:"text-sm text-zinc-400",children:["Für ",t.year," sind noch keine Zahlen erfasst."]}):e.jsxs("div",{children:[N&&h==="schluss"&&e.jsx("p",{className:"text-[12px] text-zinc-400 mb-3",children:"Stand heute = Eröffnungsbilanz plus alle Buchungen im Journal. Was noch nicht gebucht ist (Bankabgleich «nicht im Journal», Abrechnungen «zu prüfen»), fehlt hier."}),e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2 mb-4",children:[e.jsx("div",{className:"flex gap-1.5",children:[["schluss",t.status==="abgeschlossen"?"Abschluss":"Stand heute"],["eroeffnung","Eröffnungsbilanz"]].map(([n,y])=>e.jsx("button",{onClick:()=>j(n),className:`px-3 py-1.5 text-xs font-medium rounded-lg ${h===n?"bg-red-600 text-white":"bg-zinc-100 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 hover:bg-zinc-200"}`,children:y},n))}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(me,{doc:"bilanz",year:t.year,label:"Bilanz als PDF"}),e.jsx(me,{doc:"erfolg",year:t.year,label:"Erfolgsrechnung als PDF"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 p-4",children:[e.jsxs("h2",{className:"font-bold text-zinc-900 dark:text-white mb-3",children:["Bilanz ",h==="eroeffnung"?`per 01.01.${t.year}`:`per 31.12.${t.year}`]}),e.jsx(c,{sec:"aktiv"}),e.jsx(c,{sec:"passiv"}),e.jsxs("div",{className:"mt-3 pt-3 border-t-2 border-zinc-300 dark:border-zinc-600 flex justify-between text-sm",children:[e.jsx("span",{className:"font-semibold text-zinc-700 dark:text-zinc-200",children:"Aktiven"}),e.jsx("span",{className:"tabular-nums font-bold",children:Z(o("aktiv"))})]}),e.jsxs("div",{className:"flex justify-between text-sm",children:[e.jsx("span",{className:"font-semibold text-zinc-700 dark:text-zinc-200",children:"Passiven"}),e.jsx("span",{className:"tabular-nums font-bold",children:Z(Math.abs(o("passiv")))})]}),e.jsx("p",{className:`mt-1 text-[12px] ${Math.abs(o("aktiv")+o("passiv"))<.005?"text-green-700 dark:text-green-400":"text-red-600"}`,children:Math.abs(o("aktiv")+o("passiv"))<.005?"Bilanz geht auf.":`Differenz ${Z(o("aktiv")+o("passiv"))} — bitte prüfen.`})]}),m&&e.jsxs("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 p-4",children:[e.jsxs("h2",{className:"font-bold text-zinc-900 dark:text-white mb-3",children:["Erfolgsrechnung ",t.year]}),e.jsx(c,{sec:"aufwand"}),e.jsx(c,{sec:"ertrag"}),e.jsxs("div",{className:"mt-3 pt-3 border-t-2 border-zinc-300 dark:border-zinc-600 space-y-1 text-sm",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-zinc-500",children:"Total Aufwand"}),e.jsx("span",{className:"tabular-nums",children:Z(d)})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-zinc-500",children:"Total Ertrag"}),e.jsx("span",{className:"tabular-nums",children:Z(g)})]}),e.jsxs("div",{className:`flex justify-between font-bold ${a<0?"text-red-600":"text-green-700 dark:text-green-400"}`,children:[e.jsx("span",{children:a<0?"Verlust":"Gewinn"}
2),e.jsx("span",{className:"tabular-nums",children:Z(Math.abs(a))})]})]})]})]}),$.size>0&&e.jsxs("div",{className:"mt-6 rounded-xl border border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 p-4",children:[e.jsx("h2",{className:"font-bold text-zinc-900 dark:text-white mb-1",children:"Anlässe und Kommissionen"}),e.jsx("p",{className:"text-[12px] text-zinc-400 mb-3",children:"Was ein Anlass netto kostet, also nach Abzug der zugehörigen Erträge."}),e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"text-[11px] uppercase tracking-wider text-zinc-400 border-b border-zinc-200 dark:border-zinc-700",children:[e.jsx("th",{className:"text-left font-medium py-1.5",children:"Kostenstelle"}),e.jsx("th",{className:"text-right font-medium py-1.5",children:"Aufwand"}),e.jsx("th",{className:"text-right font-medium py-1.5",children:"Ertrag"}),e.jsx("th",{className:"text-right font-medium py-1.5",children:"Netto"})]})}),e.jsx("tbody",{children:[...$.entries()].sort((n,y)=>y[1].aufwand-y[1].ertrag-(n[1].aufwand-n[1].ertrag)).map(([n,y])=>e.jsxs("tr",{className:"border-b border-zinc-100 dark:border-zinc-800",children:[e.jsx("td",{className:"py-1.5 text-zinc-700 dark:text-zinc-200",children:B.find(v=>v.id===n)?.name??"—"}),e.jsx("td",{className:"py-1.5 text-right tabular-nums",children:y.aufwand?Z(y.aufwand):"—"}),e.jsx("td",{className:"py-1.5 text-right tabular-nums text-green-700 dark:text-green-400",children:y.ertrag?Z(y.ertrag):"—"}),e.jsx("td",{className:"py-1.5 text-right tabular-nums font-semibold",children:Z(y.aufwand-y.ertrag)})]},n))})]})]})]})}function Xe({groups:t,accounts:i,canEdit:l,busy:f,onPatch:B,onReload:z,setErr:N}){const[h,j]=s.useState(!1),[k,u]=s.useState(null),[o,d]=s.useState({number:"",name:""});async function g(m){if(!o.number.trim()||!o.name.trim()){N("Nummer und Bezeichnung sind nötig.");return}const c=Math.max(0,...i.filter(n=>n.group_id===m).map(n=>n.sort_order)),{error:$}=await T.from("ledger_accounts").insert({number:o.number.trim(),name:o.name.trim(),group_id:m,sort_order:c+10});if($){N($.message);return}d({number:"",name:""}),u(null),await z()}async function a(m){if(m.is_system){N("Systemkonten lassen sich nicht löschen. Sie können stillgelegt werden.");return}if(!await Ee(`Konto ${m.number} ${m.name} löschen? Wenn darauf schon Zahlen liegen, geht das nicht — dann besser stilllegen.`))return;const{error:c}=await T.from("ledger_accounts").delete().eq("id",m.id);if(c){N(`${c.message} — vermutlich liegen Zahlen auf diesem Konto. Statt löschen: stilllegen.`);return}await z()}return e.jsxs("div",{children:[e.jsxs("label",{className:"flex items-center gap-2 mb-4 text-[13px] text-zinc-500",children:[e.jsx("input",{type:"checkbox",checked:h,onChange:m=>j(m.target.checked),className:"w-4 h-4 rounded border-zinc-300 text-red-600 focus:ring-red-500"}),"Stillgelegte Konten anzeigen"]}),["aktiv","passiv","aufwand","ertrag"].map(m=>e.jsxs("div",{className:"mb-6",children:[e.jsx("h2",{className:"text-sm font-bold uppercase tracking-wider text-zinc-500 mb-2",children:le[m]}),t.filter(c=>c.section===m).map(c=>{const $=i.filter(n=>n.group_id===c.id&&(h||n.active));return e.jsxs("div",{className:"mb-3 rounded-lg border border-zinc-200 dark:border-zinc-700 p-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 mb-1.5",children:[e.jsx("p",{className:"text-[13px] font-semibold text-zinc-700 dark:text-zinc-300",children:c.name}),l&&e.jsx("button",{onClick:()=>{u(k===c.id?null:c.id),d({number:"",name:""})},className:"text-[12px] font-medium text-zinc-400 hover:text-red-600",children:"+ Konto"})]}),$.length===0&&e.jsx("p",{className:"text-[12px] text-zinc-400",children:"Keine Konten."}),$.map(n=>e.jsxs("div",{className:`flex flex-wrap items-center gap-2 py-1 ${n.active?"":"opacity-50"}`,children:[e.jsx("input",{className:`${Y} w-20 tabular-nums`,defaultValue:n.number,disabled:!l,onBlur:y=>y.target.value!==n.number&&B(n.id,{number:y.target.value.trim()})}),e.jsx("input",{className:`${Y} flex-1 min-w-[180px]`,defaultValue:n.name,disabled:!l,onBlur:y=>y.target.value!==n.name&&B(n.id,{name:y.target.value.trim()})}),n.webling_number&&e.jsxs("span",{className:"text-[11px] text-zinc-400 tabular-nums",title:"Nummer in Webling",children:["alt ",n.webling_number]}),n.is_system&&e.jsx("span",{className:"px-1.5 py-0.5 rounded-full text-[10.5px] font-semibold bg-zinc-100 dark:bg-zinc-800 text-zinc-500",title:"Automatiken buchen auf dieses Konto",children:"System"}),l&&e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:()=>B(n.id,{active:!n.active}),disabled:f,className:"text-[12px] text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200",children:n.active?"stilllegen":"aktivieren"}),!n.is_system&&e.jsx("button",{onClick:()=>a(n),disabled:f,className:"text-[12px] text-zinc-400 hover:text-red-600",children:"löschen"})]}),n.notes&&e.jsx("p",{className:"w-full pl-1 text-[11.5px] text-zinc-400",children:n.notes})]},n.id)),k===c.id&&l&&e.jsxs("div",{className:"mt-2 flex flex-wrap items-center gap-2",children:[e.jsx("input",{className:`${Y} w-20`,placeholder:"Nr.",value:o.number,onChange:n=>d(y=>({...y,number:n.target.value}))}),e.jsx("input",{className:`${Y} flex-1 min-w-[180px]`,placeholder:"Bezeichnung",value:o.name,onChange:n=>d(y=>({...y,name:n.target.value}))}),e.jsx("button",{onClick:()=>g(c.id),className:"px-3 py-1.5 rounded-lg bg-red-600 text-white text-[13px] font-semibold hover:bg-red-700",children:"Anlegen"})]})]},c.id)})]},m))]})}function et({centers:t,canEdit:i,busy:l,onPatch:f,onReload:B,setErr:z}){const[N,h]=s.useState({name:"",kind:"anlass"}),j={anlass:"Anlass",kommission:"Kommission",allgemein:"Allgemein"};async function k(){const u=N.name.trim();if(!u)return;const o=u.toLowerCase().normalize("NFD").replace(/[̀-ͯ]/g,"").replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""),d=Math.max(0,...t.map(a=>a.sort_order)),{error:g}=await T.from("cost_centers").insert({key:o,name:u,kind:N.kind,sort_order:d+10});if(g){z(g.message);return}h({name:"",kind:"anlass"}),await B()}return e.jsxs("div",{children:[e.jsx("p",{className:"text-[13px] text-zinc-500 mb-4 max-w-2xl",children:"Kostenstellen sind die zweite Sicht neben dem Konto: das Konto sagt, was für eine Art von Aufwand oder Ertrag es ist, die Kostenstelle sagt, wozu er gehört. Damit lässt sich zeigen, was ein Anlass 
2netto kostet, ohne für jeden Anlass eigene Konten zu führen."}),["anlass","kommission","allgemein"].map(u=>{const o=t.filter(d=>d.kind===u);return o.length===0?null:e.jsxs("div",{className:"mb-5",children:[e.jsx("h2",{className:"text-sm font-bold uppercase tracking-wider text-zinc-500 mb-2",children:j[u]}),e.jsx("div",{className:"rounded-lg border border-zinc-200 dark:border-zinc-700 divide-y divide-zinc-100 dark:divide-zinc-800",children:o.map(d=>e.jsxs("div",{className:`flex flex-wrap items-center gap-2 px-3 py-2 ${d.active?"":"opacity-50"}`,children:[e.jsx("input",{className:`${Y} flex-1 min-w-[200px]`,defaultValue:d.name,disabled:!i,onBlur:g=>g.target.value!==d.name&&f(d.id,{name:g.target.value.trim()})}),d.webling_number&&e.jsxs("span",{className:"text-[11px] text-zinc-400 tabular-nums",title:"War in Webling ein eigenes Konto",children:["früher Konto ",d.webling_number]}),i&&e.jsx("button",{onClick:()=>f(d.id,{active:!d.active}),disabled:l,className:"text-[12px] text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200",children:d.active?"stilllegen":"aktivieren"})]},d.id))})]},u)}),i&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2 mt-4",children:[e.jsx("input",{className:`${Y} flex-1 min-w-[200px]`,placeholder:"Neue Kostenstelle",value:N.name,onChange:u=>h(o=>({...o,name:u.target.value}))}),e.jsxs("select",{className:Y,value:N.kind,onChange:u=>h(o=>({...o,kind:u.target.value})),children:[e.jsx("option",{value:"anlass",children:"Anlass"}),e.jsx("option",{value:"kommission",children:"Kommission"}),e.jsx("option",{value:"allgemein",children:"Allgemein"})]}),e.jsx("button",{onClick:k,disabled:l||!N.name.trim(),className:"px-3 py-2 rounded-lg bg-red-600 text-white text-[13px] font-semibold hover:bg-red-700 disabled:opacity-40",children:"Anlegen"})]})]})}function tt({jahr:t,accounts:i,groups:l,budget:f,balances:B,canEdit:z,userId:N,onReload:h,setErr:j}){const k=Object.fromEntries(l.map(_=>[_.id,_])),u=B.filter(_=>_.kind==="schluss"),o=new Map;for(const _ of u){const F=k[i.find(x=>x.id===_.account_id)?.group_id??""];!F||F.section!=="aufwand"&&F.section!=="ertrag"||o.set(_.account_id,(o.get(_.account_id)??0)+Math.abs(Number(_.amount)))}const d=new Map(f.filter(_=>!_.cost_center_id).map(_=>[_.account_id,_])),[g,a]=s.useState(null),m=s.useCallback(async()=>{a(await Ye(t.year))},[t.year]);s.useEffect(()=>{m()},[m]);const c=!!(g&&g.status!=="entwurf"&&(N===g.reviewer_1?.id||N===g.reviewer_2?.id)),$=(z||c)&&g?.status!=="gueltig";async function n(_,F){const x=Number(F.replace(/'/g,"").replace(",","."));if(Number.isNaN(x)){j("Bitte eine Zahl eingeben.");return}j(null);try{await _e("budget-speichern",{year:t.year,account_id:_,amount:x}),await h(),await m()}catch(S){j(S instanceof Error?S.message:"Speichern fehlgeschlagen.")}}const y=i.filter(_=>{const F=k[_.group_id]?.section;return _.active&&(F==="aufwand"||F==="ertrag")}),v=_=>y.filter(F=>k[F.group_id]?.section===_).reduce((F,x)=>F+Number(d.get(x.id)?.amount??0),0);return e.jsxs("div",{children:[g&&e.jsx(nt,{review:g,jahr:t,canEdit:z,userId:N,onChange:a,setErr:j}),e.jsxs("div",{className:"flex items-start justify-between gap-3 mb-4",children:[e.jsxs("p",{className:"text-[13px] text-zinc-500 max-w-xl",children:["Budget je Konto für ",t.year,". Zum Vergleich steht daneben, was im letzten abgeschlossenen Jahr tatsächlich angefallen ist. Leer bedeutet: nicht budgetiert."]}),e.jsx(me,{doc:"budget",year:t.year,label:"Budget als PDF"})]}),["aufwand","ertrag"].map(_=>e.jsxs("div",{className:"mb-6",children:[e.jsx("h2",{className:"text-sm font-bold uppercase tracking-wider text-zinc-500 mb-2",children:le[_]}),e.jsx("div",{className:"rounded-lg border border-zinc-200 dark:border-zinc-700 overflow-hidden",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"bg-zinc-50 dark:bg-zinc-900 text-[11px] uppercase tracking-wider text-zinc-400",children:[e.jsx("th",{className:"text-left font-medium px-3 py-2 w-16",children:"Nr."}),e.jsx("th",{className:"text-left font-medium px-3 py-2",children:"Konto"}),e.jsxs("th",{className:"text-right font-medium px-3 py-2 w-32",children:["Budget ",t.year]}),e.jsx("th",{className:"text-right font-medium px-3 py-2 w-28",children:"Ist zuletzt"})]})}),e.jsx("tbody",{className:"divide-y divide-zinc-100 dark:divide-zinc-800",children:y.filter(F=>k[F.group_id]?.section===_).map(F=>e.jsxs("tr",{children:[e.jsx("td",{className:"px-3 py-1.5 text-zinc-400 tabular-nums",children:F.number}),e.jsx("td",{className:"px-3 py-1.5 text-zinc-700 dark:text-zinc-200",children:F.name}),e.jsx("td",{className:"px-3 py-1.5 text-right",children:e.jsx("input",{className:`${Y} w-28 text-right tabular-nums disabled:opacity-50 disabled:cursor-not-allowed`,disabled:!$,defaultValue:d.get(F.id)?.amount??"",placeholder:"—",onBlur:x=>{const S=String(d.get(F.id)?.amount??"");x.target.value.trim()!==S.trim()&&x.target.value.trim()!==""&&n(F.id,x.target.value)}})}),e.jsx("td",{className:"px-3 py-1.5 text-right tabular-nums text-zinc-400",children:o.has(F.id)?Z(o.get(F.id)??0):"—"})]},F.id))}),e.jsx("tfoot",{children:e.jsxs("tr",{className:"bg-zinc-50 dark:bg-zinc-900 font-semibold",children:[e.jsx("td",{}),e.jsxs("td",{className:"px-3 py-2 text-[12px] text-zinc-500",children:["Total ",le[_]]}),e.jsx("td",{className:"px-3 py-2 text-right tabular-nums",children:Z(v(_))}),e.jsx("td",{})]})})]})})]},_)),e.jsxs("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 p-4 flex justify-between items-center",children:[e.jsxs("span",{className:"font-semibold text-zinc-700 dark:text-zinc-200",children:["Budgetiertes Ergebnis ",t.year]}),e.jsx("span",{className:`text-lg font-bold tabular-nums ${v("ertrag")-v("aufwand")<0?"text-red-600":"text-green-700 dark:text-green-400"}`,children:Z(v("ertrag")-v("aufwand"))})]})]})}function nt({review:t,jahr:i,canEdit:l,userId:f,onChange:B,setErr:z}){const[N,h]=s.useState(!1),[j,k]=s.useState(t.vorschlag_reviewer_1??""),[u,o]=s.useState(t.vorschlag_reviewer_2??"");async function d(n,y={}){h(!0),z(null);try{B(await _e(n,{year:i.year,...y}
2))}catch(v){z(v instanceof Error?v.message:"Fehler")}finally{h(!1)}}const g=t.am_zug==="reviewer_1"?t.reviewer_1?.id:t.am_zug==="reviewer_2"?t.reviewer_2?.id:null,a=g!=null&&g===f,m=f===t.reviewer_1?.id||f===t.reviewer_2?.id,c=(l||m)&&e.jsx("button",{disabled:N,onClick:()=>d("ueberarbeiten"),className:"px-3 py-1.5 rounded-lg border border-amber-300 dark:border-amber-800 text-amber-700 dark:text-amber-300 text-[12.5px] font-medium hover:bg-amber-50 dark:hover:bg-amber-950/40 disabled:opacity-40",children:"Nochmals überarbeiten"}),$=n=>[{id:"r1",name:t.reviewer_1?.name??"—",zusatz:t.reviewer_1_confirmed_by,geantwortetAm:t.reviewer_1_confirmed_at,urteil:t.reviewer_1_confirmed_at?"ja":null,amZug:n==="reviewer_1"},{id:"r2",name:t.reviewer_2?.name??"—",zusatz:t.reviewer_2_confirmed_by,geantwortetAm:t.reviewer_2_confirmed_at,urteil:t.reviewer_2_confirmed_at?"ja":null,amZug:n==="reviewer_2"}];return t.status==="entwurf"?e.jsxs("div",{className:"mb-5 rounded-xl border border-zinc-200 dark:border-zinc-700 bg-zinc-50 dark:bg-zinc-900/50 p-4",children:[e.jsx("div",{className:"text-sm font-semibold text-zinc-800 dark:text-zinc-100 mb-1",children:"Freigabe"}),e.jsxs("p",{className:"text-[13px] text-zinc-500 mb-3",children:["Das Budget ",i.year," ist noch im Entwurf. Zum Freigeben geht es zuerst an eine erste, dann an eine zweite Person. Beide dürfen anpassen und müssen bestätigen."]}),l?e.jsxs("div",{className:"flex flex-wrap items-end gap-2",children:[e.jsxs("label",{className:"text-[12px] text-zinc-500",children:["Zuerst",e.jsxs("select",{className:`${Y} block mt-0.5`,value:j,onChange:n=>k(n.target.value),children:[e.jsx("option",{value:"",children:"…"}),t.kandidaten.map(n=>e.jsx("option",{value:n.id,children:n.display_name},n.id))]})]}),e.jsxs("label",{className:"text-[12px] text-zinc-500",children:["Danach",e.jsxs("select",{className:`${Y} block mt-0.5`,value:u,onChange:n=>o(n.target.value),children:[e.jsx("option",{value:"",children:"…"}),t.kandidaten.map(n=>e.jsx("option",{value:n.id,children:n.display_name},n.id))]})]}),e.jsx("button",{disabled:N||!j||!u||j===u,onClick:()=>d("freigeben",{reviewer_1_id:j,reviewer_2_id:u}),className:"px-4 py-2 rounded-lg bg-red-600 text-white text-sm font-medium hover:bg-red-700 disabled:opacity-40",children:"Zur Prüfung geben"})]}):e.jsx("p",{className:"text-[12px] text-zinc-400",children:"Nur die Buchhaltung kann das Budget zur Prüfung geben."})]}):t.status==="gueltig"?e.jsxs("div",{className:"mb-5 rounded-xl border border-green-200 dark:border-green-900 bg-green-50 dark:bg-green-900/20 p-4",children:[e.jsxs("div",{className:"text-sm font-semibold text-green-800 dark:text-green-300 mb-2",children:["Budget ",i.year," ist freigegeben"]}),e.jsx(pe,{leute:$(null)}),e.jsx("p",{className:"text-[12px] text-zinc-500 mt-2 mb-3",children:"Die Beträge sind gesperrt. «Nochmals überarbeiten» öffnet die Prüfung erneut, danach geht die Freigabe wieder an die erste Person."}),c]}):e.jsxs("div",{className:"mb-5 rounded-xl border border-amber-200 dark:border-amber-900 bg-amber-50 dark:bg-amber-900/20 p-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("div",{className:"text-sm font-semibold text-amber-800 dark:text-amber-300",children:["Budget ",i.year," in Prüfung"]}),l&&e.jsx("button",{disabled:N,onClick:()=>d("zuruecksetzen"),className:"text-[12px] text-zinc-500 hover:text-zinc-800 dark:hover:text-zinc-200 underline",children:"zurück in den Entwurf"})]}),e.jsx("div",{className:"mb-3",children:e.jsx(pe,{leute:$(t.am_zug??null)})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[a&&e.jsx("button",{disabled:N,onClick:()=>d("bestaetigen"),className:"px-4 py-2 rounded-lg bg-green-600 text-white text-sm font-medium hover:bg-green-700 disabled:opacity-40",children:"Budget bestätigen"}),!a&&c]}),e.jsx("p",{className:"text-[12px] text-zinc-500 mt-2",children:"Jede Änderung am Budget setzt die Bestätigungen zurück auf Anfang."})]})}function st({jahr:t,accounts:i,groups:l,budget:f,balances:B}){const z=Object.fromEntries(l.map(a=>[a.id,a])),N=new Map(f.filter(a=>!a.cost_center_id).map(a=>[a.account_id,Number(a.amount)])),h=new Map;for(const a of B.filter(m=>m.kind==="schluss")){const m=z[i.find(c=>c.id===a.account_id)?.group_id??""]?.section;m!=="aufwand"&&m!=="ertrag"||h.set(a.account_id,(h.get(a.account_id)??0)+Math.abs(Number(a.amount)))}const j=h.size>0,k=i.filter(a=>{const m=z[a.group_id]?.section;return(m==="aufwand"||m==="ertrag")&&(a.active||N.has(a.id)||h.has(a.id))}),u=a=>k.filter(m=>z[m.group_id]?.section===a).reduce((m,c)=>m+(N.get(c.id)??0),0),o=a=>k.filter(m=>z[m.group_id]?.section===a).reduce((m,c)=>m+(h.get(c.id)??0),0),d=(a,m)=>m===0?"text-zinc-400":(a==="aufwand"?m>0:m<0)?"text-red-600":"text-green-700 dark:text-green-400",g=a=>(a>0?"+":"")+Z(a);return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-start justify-between gap-3 mb-4",children:[e.jsxs("p",{className:"text-[13px] text-zinc-500 max-w-xl",children:["Budget ",t.year," gegen das tatsächlich Angefallene. «Ist» sind die Schlussbestände des Jahres.",!j&&" Für dieses Jahr liegen noch keine Ist-Zahlen vor — die Spalte füllt sich beim Jahresabschluss bzw. sobald Buchungen erfasst sind."]}),e.jsx(me,{doc:"budgetist",year:t.year,label:"Budget/Ist als PDF"})]}),["aufwand","ertrag"].map(a=>e.jsxs("div",{className:"mb-6",children:[e.jsx("h2",{className:"text-sm font-bold uppercase tracking-wider text-zinc-500 mb-2",children:le[a]}),e.jsx("div",{className:"rounded-lg border border-zinc-200 dark:border-zinc-700 overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"bg-zinc-50 dark:bg-zinc-900 text-[11px] uppercase tracking-wider text-zinc-400",children:[e.jsx("th",{className:"text-left font-medium px-3 py-2 w-16",children:"Nr."}),e.jsx("th",{className:"text-left font-medium px-3 py-2",children:"Konto"}),e.jsx("th",{className:"text-right font-medium px-3 py-2 w-28",children:"Budget"}),e.jsx("th",{className:"text-right font-medium px-3 py-2 w-28",children:"Ist"}),e.jsx("th",{className:"text-right font-medium px-3 py-2 w-28",children:"Abweichung"}),e.jsx("th",{className:"text-right font-medium px-3 py-2 w-16",children:"%"})]})}),e.jsx("tbody",{className:"divide-y divide-zinc-100 dark:divide-zinc-800",children:k.filter(m=>z[m.group_id]?.section===a).map(m=>{const c=N.get(m.id),$=h.get(m.id),n=($??0)-(c??0),y=c&&c!==0?Math.round(($??0)/c*100):null,v=c!=null&&$!=null;return e.jsxs("tr",{children:[e.jsx("td",{className:"px-3 py-1.5 text-zinc-400 tabular-nums",children:m.number}),e.jsx("td",{className:"px-3 py-1.5 text-zinc-700 dark:text-zinc-200",children:m.name}),e.jsx("td",{className:"px-3 py-1.5 text-right tabular-nums",children:c!=null?Z(c):"—"}),e.jsx("td",{className:"px-3 py-1.5 text-right tabular-nums",children:$!=null?Z($):"—"}),e.jsx("td",{className:`px-3 py-1.5 text-right tabular-nums ${v?d(a,n):"text-zinc-300"}`,children:v?g(n):"—"}),e.jsx("td",{className:"px-3 py-1.5 text-right tabular-nums text-zinc-400",children:y!=null&&$!=null?`${y}%`:"—"})]},m.id)})}),e.jsx("tfoot",{children:e.jsxs("tr",{className:"bg-zinc-50 dark:bg-zinc-900 font-semibold",children:[e.jsx("td",{}),e.jsxs("td",{className:"px-3 py-2 text-[12px] text-zinc-500",children:["Total ",le[a]]}),e.jsx("td",{className:"px-3 py-2 text-right tabular-nums",children:Z(u(a))}),e.jsx("td",{className:"px-3 py-2 text-right tabular-nums",children:j?Z(o(a)):"—"}),e.jsx("td",{className:`px-3 py-2 text-right tabular-nums ${j?d(a,o(a)-u(a)):"text-zinc-300"}`,children:j?g(o(a)-u(a)):"—"}),e.jsx("td",{})]})})]})})]},a)),e.jsxs("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 p-4",children:[e.jsxs("div",{className:"flex justify-between items-center text-sm",children:[e.jsx("span",{className:"text-zinc-500",children:"Budgetiertes Ergebnis"}),e.jsx("span",{className:"tabular-nums font-medium",children:Z(u("ertrag")-u("aufwand"))})]}),j&&e.jsxs("div",{className:"flex justify-between items-center text-sm mt-1",children:[e.jsx("span",{className:"text-zinc-500",children:"Ist-Ergebnis"}),e.jsx("span",{className:"tabular-nums font-medium",children:Z(o("ertrag")-o("aufwand"))})]})]})]})}const ze={fiscal_year:"Geschäftsjahr",ledger_account:"Konto",kontogruppe:"Kontogruppe",cost_center:"Kostenstelle",account_balance:"Kontostand",budget_line:"Budgetposition",budget_review:"Budget-Freigabe",journal_entry:"Buchung",expense_report:"Abrechnung",bank_import:"Bank-Import",bank_transaction:"Bankbuchung"},at={created:"erstellt",updated:"bearbeitet",deleted:"gelöscht"};function rt(t){if(t==="finanzen_pdf")return"PDF erzeugt";if(t==="mail_sent")return"E-Mail verschickt";if(t==="mail_failed")return"E-Mail fehlgeschlagen";const i=t.match(/^(.+)_(created|updated|deleted)$/);return i&&ze[i[1]]?`${ze[i[1]]} ${at[i[2]]}`:t}const it="target_type.in.(fiscal_year,ledger_account,kontogruppe,cost_center,account_balance,budget_line,budget_review,journal_entry,expense_report,bank_import,bank_transaction),action.eq.finanzen_pdf,action.eq.mail_sent,action.eq.mail_failed";function lt(){return e.jsx(ve,{filter:{or:it},labelFor:rt,colorFor:t=>Se(t,{finanzen_pdf:"bg-sky-100 text-sky-700 dark:bg-sky-950/40 dark:text-sky-400"})})}
2export{jt as AdminFinanzen};

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.