PageSourceSearch

https://aiploya.lovable.app/assets/ForecastModule-BYXyTWYz.js

js aiploya.lovable.app collected 2026-10-03 03:19:50 UTC 68,623 bytes, 6 lines download raw bytes

1import{r as o,j as e}from"./vendor-react-CFJRxGiR.js";import{aL as ts,K as fe,r as I,i as B,m as $,P as ne,n as p,I as T,B as E,M as A,j as Y,k as Z,l as X,x as as}from"./index-20fxIyDQ.js";import{B as je}from"./badge-CZLq5SvB.js";import{S as ze}from"./switch-ho5mtS6v.js";import{S as ge}from"./slider-B3ZCA6xY.js";import{S as V,a as U,b as O,c as G,d as P,e as Fe,f as Ae}from"./select-DEe64QWV.js";import{D as ce,a as oe,b as de,c as me,d as he,e as be}from"./dialog-BDkUoucx.js";import{E as ns}from"./jspdf.es.min-BudEecY1.js";import{P as rs,a as ls,b as is}from"./popover-BVdKAL9C.js";import{I as Ee}from"./info-Wa5gHTsO.js";import{T as De}from"./textarea-9DhVmBm3.js";import{n as cs,J as Ke,j as ve}from"./jobCountries-DDqPlTIc.js";import{R as We}from"./refresh-cw-BqAgJjK_.js";import{P as Le}from"./plus-BlSFqhBq.js";import{C as Ve}from"./circle-alert-CC9UfjXh.js";import{P as Ue}from"./pencil-pZEbdlzm.js";import{T as os}from"./trash-2-BJCkfEpe.js";import{G as Oe}from"./gauge-D2MZnJFC.js";import{E as Ge}from"./euro-p4EP_ERg.js";import{T as Ie}from"./timer-Cg--C_Rx.js";import{S as He}from"./sparkles-kHdWrChF.js";import{S as ds}from"./shield-alert-COsaSG8r.js";import{C as ms}from"./circle-check-DJ2k2mdH.js";import{D as hs}from"./download-9mPT_ojv.js";import{E as Te}from"./earth-Dc0EhN0g.js";import{C as xs}from"./clock-CDqm8qTt.js";import{S as us}from"./settings-2-uNrLa32p.js";import{R as gs,T as ps,O as js,B as Pe}from"./generateCategoricalChart-pJqw5rjC.js";import{B as fs}from"./BarChart-whPB_RRD.js";import{C as bs,X as vs,Y as Ns}from"./YAxis-CmJA8KWB.js";import{L as ys}from"./lightbulb-D-8LBB-L.js";/**
2 * @license lucide-react v0.462.0 - ISC
3 *
4 * This source code is licensed under the ISC license.
5 * See the LICENSE file in the root directory of this source tree.
6 */const _s=ts("Percent",[["line",{x1:"19",x2:"5",y1:"5",y2:"19",key:"1x9vlm"}],["circle",{cx:"6.5",cy:"6.5",r:"2.5",key:"4mh3h7"}],["circle",{cx:"17.5",cy:"17.5",r:"2.5",key:"1mdrzq"}]]);function ws(){const{company:t}=fe(),[n,d]=o.useState([]);return o.useEffect(()=>{if(!t?.id){d([]);return}let r=!0;return I.from("career_jobs").select("id, title, status, department, location, country, work_model, employment_type, experience_level, seniority_level, occupation_family, occupation_code, target_fill_date, vacancy_cost_per_day, published_at, created_at").eq("company_id",t.id).neq("status","archived").order("created_at",{ascending:!1}).then(({data:m})=>{r&&d(m??[])}),()=>{r=!1}},[t?.id]),{companyId:t?.id??null,jobs:n}}function ks(t,n,d){const{company:r}=fe(),[m,u]=o.useState(null),[_,c]=o.useState(null),[i,f]=o.useState(null),[b,h]=o.use
6State(null),[g,v]=o.useState(null),[y,x]=o.useState(0),[z,l]=o.useState(!1),[S,H]=o.useState(!1),[N,K]=o.useState(null),[xe,a]=o.useState(!1),[D,j]=o.useState(null),te=o.useCallback(async(q=!1)=>{if(!r?.id||!t){u(null);return}a(!0),j(null);const{data:W,error:ye}=await I.functions.invoke("role-forecast",{body:{action:"forecast",company_id:r.id,job_id:t,scenario:n,persist:q,...d&&(d.country||d.region)?{market:d}:{}}});ye?(j("Prognose konnte nicht berechnet werden."),u(null)):(u(W?.forecast??null),c(W?.scenario??null),f(W?.internal??null),h(W?.settings??null),v(W?.market??null),x(W?.benchmarkCount??0),l(!!W?.benchmarkIsEstimate),H(!!W?.benchmarkIsOwn),K(W?.benchmarkEstimateError??null)),a(!1)},[r?.id,t,JSON.stringify(n),JSON.stringify(d??{})]);return o.useEffect(()=>{te(!1)},[te]),{forecast:m,scenarioResult:_,internal:i,settings:b,marketContext:g,benchmarkCount:y,benchmarkIsEstimate:z,benchmarkIsOwn:S,benchmarkEstimateError:N,loading:xe,error:D,reload:te}}function bt(){const{company:t}=fe(),[n,d]=o.useState([]),[r,m]=o.useState(!1),[u,_]=o.useState(null),c=o.useCallback(async()=>{if(!t?.id){d([]);return}m(!0),_(null);const{data:i,error:f}=await I.functions.invoke("role-forecast",{body:{action:"compare",company_id:t.id}});f?(_("Rollenvergleich konnte nicht geladen werden."),d([])):d(i?.rows??[]),m(!1)},[t?.id]);return o.useEffect(()=>{c()},[c]),{rows:n,loading:r,error:u,reload:c}}function Ss(){const{company:t}=fe(),[n,d]=o.useState([]),[r,m]=o.useState(!1),[u,_]=o.useState(null),c=o.useCallback(async()=>{if(!t?.id){d([]);return}m(!0);const{data:b,error:h}=await I.functions.invoke("role-forecast",{body:{action:"list_benchmarks",company_id:t.id}});_(h?"Eigene Marktwerte konnten nicht geladen werden.":b?.error??null),d(b?.benchmarks??[]),m(!1)},[t?.id]);o.useEffect(()=>{c()},[c]);const i=o.useCallback(async b=>{if(!t?.id)return{ok:!1,message:"Kein Unternehmen aktiv."};const{data:h,error:g}=await I.functions.invoke("role-forecast",{body:{action:"save_benchmark",company_id:t.id,benchmark:b}});return g||h?.error?{ok:!1,message:h?.error??"Speichern fehlgeschlagen."}:(await c(),{ok:!0,message:"Marktwert gespeichert."})},[t?.id,c]),f=o.useCallback(async b=>{if(!t?.id)return{ok:!1,message:"Kein Unternehmen aktiv."};const{data:h,error:g}=await I.functions.invoke("role-forecast",{body:{action:"delete_benchmark",company_id:t.id,id:b}});return g||h?.error?{ok:!1,message:h?.error??"Löschen fehlgeschlagen."}:(await c(),{ok:!0,message:"Marktwert gelöscht."})},[t?.id,c]);return{benchmarks:n,loading:r,error:u,reload:c,save:i,remove:f}}function Cs(t){const{company:n}=fe(),[d,r]=o.useState([]),[m,u]=o.useState(!1),[_,c]=o.useState(null),i=o.useCallback(async()=>{if(!n?.id){r([]);return}u(!0);const{data:b,error:h}=await I.functions.invoke("role-forecast",{body:{action:"list_outcomes",company_id:n.id,...t?{job_id:t}:{}}});c(h?"Ergebnisse konnten nicht geladen werden.":b?.error??null),r(b?.outcomes??[]),u(!1)},[n?.id,t]);o.useEffect(()=>{i()},[i]);const f=o.useCallback(async b=>{if(!n?.id)return{ok:!1,message:"Kein Unternehmen aktiv."};const{data:h,error:g}=await I.functions.invoke("role-forecast",{body:{action:"record_outcome",company_id:n.id,outcome:b}});return g||h?.error?{ok:!1,message:h?.error??"Speichern fehlgeschlagen."}:(await i(),{ok:!0,message:"Besetzung gespeichert."})},[n?.id,i]);return{outcomes:d,loading:m,error:_,reload:i,save:f}}const F="nicht erfasst",zs={company_data:"Unternehmensdaten",benchmark:"Marktbenchmark",assumption:"manuelle Annahme",campaign:"laufende Kampagne",missing:F},Es={company_data:"border-cyan-200 bg-cyan-50 text-cyan-800",benchmark:"border-indigo-200 bg-indigo-50 text-indigo-800",assumption:"border-amber-200 bg-amber-50 text-amber-800",campaign:"border-emerald-200 bg-emerald-50 text-emerald-800",missing:"border-slate-200 bg-slate-50 text-slate-500"},k=(t,n="EUR")=>t===null?F:`${Math.round(t).toLocaleString(ne())} ${n}`,se=t=>t===null?F:`${Math.round(t)} Tage`,ee=t=>t===null?F:`${Math.round(t)} %`,ie=({source:t})=>e.jsx(je,{variant:"outline",className:`text-[10px] font-normal ${Es[t]}`,children:zs[t]}),qe=({label:t,m:n,format:d})=>e.jsxs(rs,{children:[e.jsx(ls,{asChild:!0,children:e.jsx("button",{type:"button","aria-label":`Wie entsteht ${t}?`,className:"shrink-0 rounded-full p-1 text-cyan-700 transition hover:bg-cyan-100",children:e.jsx(Ee,{className:"h-4 w-4"})})}),e.jsxs(is,{align:"end",className:"w-80 space-y-2 text-xs",children:[e.jsxs("p",{className:"text-sm font-semibold",children:["Wie entsteht ",t,"?"]}),e.jsx("p",{className:"text-base font-bold",children:d(n.value)}),n.formula&&e.jsx("p",{className:"rounded-md bg-slate-100 p-2 font-mono text-[11px]",children:n.formula}),e.jsx("ol",{className:"space-y-1.5",children:(n.trace?.length?n.trace:[n.detail]).filter(
6Boolean).map((r,m)=>e.jsxs("li",{className:"flex gap-2",children:[e.jsxs("span",{className:"text-muted-foreground",children:[m+1,"."]}),e.jsx("span",{children:r})]},m))}),n.value!==null&&n.low!==null&&n.high!==null&&e.jsxs("p",{className:"text-muted-foreground",children:["Prognosebereich ",d(n.low)," – ",d(n.high)]}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx("span",{className:"text-muted-foreground",children:"Datenquelle:"}),e.jsx(ie,{source:n.source})]})]})]}),J=({label:t,m:n,format:d,hint:r,accent:m})=>e.jsx(B,{className:`border-0 shadow-sm ${m?"bg-gradient-to-br from-cyan-50 to-blue-50":"bg-white"}`,children:e.jsxs($,{className:"p-4 space-y-1.5",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:t}),e.jsx(qe,{label:t,m:n,format:d})]}),e.jsx("p",{className:`font-bold leading-none ${n.value===null?"text-base text-muted-foreground":"text-2xl"}`,children:d(n.value)}),n.value!==null&&n.low!==null&&n.high!==null&&e.jsxs("p",{className:"text-[11px] text-muted-foreground",children:["Prognosebereich ",d(n.low)," – ",d(n.high)]}),r&&e.jsx("p",{className:"text-[11px] text-muted-foreground",children:r}),e.jsx(ie,{source:n.source})]})}),Be=[{value:"job_ads",label:"Stellenanzeigen",category:"external"},{value:"multiposting",label:"Multiposting",category:"external"},{value:"sourcing",label:"Active Sourcing",category:"external"},{value:"linkedin",label:"LinkedIn",category:"external"},{value:"agency",label:"Agentur",category:"external"},{value:"recruiter_fee",label:"Personalvermittlung",category:"external"},{value:"referral",label:"Mitarbeiterempfehlung",category:"external"},{value:"assessment",label:"Assessment",category:"external"},{value:"background_check",label:"Background Check",category:"external"},{value:"travel",label:"Reisekosten",category:"external"},{value:"relocation",label:"Relocation",category:"external"},{value:"training",label:"Weiterbildungsinvestition",category:"internal"},{value:"software",label:"Softwareanteil",category:"internal"},{value:"other",label:"Sonstige",category:"external"}],$e=[{value:"recruiting",label:"Recruitingarbeit",role:"recruiting"},{value:"manager_time",label:"Arbeitszeit Führungskraft",role:"manager"},{value:"interview_time",label:"Interviewzeit weiterer Mitarbeitender",role:"interview"},{value:"admin",label:"Administration",role:"admin"},{value:"contract",label:"Vertragserstellung",role:"admin"}],Ms=({open:t,onOpenChange:n,companyId:d,jobs:r,defaultJobId:m,onSaved:u})=>{const[_,c]=o.useState(m??""),[i,f]=o.useState("job_ads"),[b,h]=o.use
6State(""),[g,v]=o.useState("EUR"),[y,x]=o.useState(""),[z,l]=o.useState(""),[S,H]=o.useState("false"),[N,K]=o.useState(""),[xe,a]=o.useState(!1);o.useEffect(()=>{t&&c(m??"")},[t,m]);const D=async()=>{const j=Number(b.replace(",","."));if(!d||!Number.isFinite(j)||j<=0){A.error("Bitte einen Betrag eingeben.");return}a(!0);const te=Be.find(W=>W.value===i)?.category??"external",{error:q}=await I.from("recruitment_costs").insert({company_id:d,job_id:_||null,cost_type:i,cost_category:te,amount:j,currency:g,channel:y||null,invoice_date:z||null,source:"manual",is_estimated:S==="true",notes:N||null});if(a(!1),q){A.error("Speichern nicht möglich: "+q.message);return}A.success("Kostenposition erfasst"),h(""),x(""),K(""),u(),n(!1)};return e.jsx(ce,{open:t,onOpenChange:n,children:e.jsxs(oe,{className:"max-w-lg",children:[e.jsxs(de,{children:[e.jsx(me,{children:"Recruitingkosten erfassen"}),e.jsx(he,{children:"Nur erfasste Kosten fließen in Cost per Hire und Prognose ein."})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:"Stelle"}),e.jsxs(V,{value:_,onValueChange:c,children:[e.jsx(U,{children:e.jsx(O,{placeholder:"Ohne Stellenbezug"})}),e.jsx(G,{children:r.map(j=>e.jsx(P,{value:j.id,children:j.title},j.id))})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:"Kostenart"}),e.jsxs(V,{value:i,onValueChange:f,children:[e.jsx(U,{children:e.jsx(O,{})}),e.jsx(G,{children:Be.map(j=>e.jsx(P,{value:j.value,children:j.label},j.value))})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:"Betrag"}),e.jsx(T,{value:b,onChange:j=>h(j.target.value),placeholder:"z. B. 899",inputMode:"decimal"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:"Währung"}),e.jsxs(V,{value:g,onValueChange:v,children:[e.jsx(U,{children:e.jsx(O,{})}),e.jsx(G,{children:["EUR","CHF","USD","GBP"].map(j=>e.jsx(P,{value:j,children:j},j))})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:"Rechnungsdatum"}),e.jsx(T,{type:"date",value:z,onChange:j=>l(j.target.value)})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:"Kanal (optional)"}),e.jsx(T,{value:y,onChange:j=>x(j.target.value),placeholder:"z. B. stepstone"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:"Art des Werts"}),e.jsxs(V,{value:S,onValueChange:H,children:[e.jsx(U,{children:e.jsx(O,{})}),e.jsxs(G,{children:[e.jsx(P,{value:"false",children:"Belegter Rechnungswert"}),e.jsx(P,{value:"true",children:"Geschätzt"})]})]})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:"Notiz"}),e.jsx(De,{value:N,onChange:j=>K(j.target.value),rows:2})]})]}),e.jsxs(be,{children:[e.jsx(E,{variant:"outline",onClick:()=>n(!1),children:"Abbrechen"}),e.jsx(E,{onClick:D,disabled:xe,children:"Speichern"})]})]})})},Ts=({open:t,onOpenChange:n,companyId:d,jobs:r,defaultJobId:m,settings:u,onSaved:_})=>{const[c,i]=o.useState(m??""),[f,b]=o.useState("recruiting"),[h,g]=o.useState(""),[v,y]=o.useState(""),[x,z]=o.useState(!1);o.useEffect(()=>{t&&i(m??"")},[t,m]);const l=$e.find(N=>N.value===f)?.role??"recruiting",S=u?{recruiting:u.recruiter_hourly_rate,manager:u.manager_hourly_rate,interview:u.interviewer_hourly_rate,admin:u.admin_hourly_rate}[l]:null,H=async()=>{const N=Number(h);if(!d||!Number.isFinite(N)||N<=0){A.error("Bitte Minuten eingeben.");return}z(!0);const{error:K}=await I.from("internal_recruiting_effort").insert({company_id:d,job_id:c||null,role_key:l,activity:f,minutes:Math.round(N),hourly_rate:v?Number(v.replace(",",".")):null,currency:u?.currency??"EUR",performed_on:new Date().toISOString().slice(0,10)});if(z(!1),K){A.error("Speichern nicht möglich: "+K.message);return}A.success("Aufwand erfasst"),g(""),y(""),_(),n(!1)};return e.jsx(ce,{open:t,onOpenChange:n,children:e.jsxs(oe,{className:"max-w-md",children:[e.jsxs(de,{children:[e.jsx(me,{children:"Interne Arbeitszeit erfassen"}),e.jsx(he,{children:"Interne Personalkosten = Stunden × Stundensatz. Ohne hinterlegten Satz bleibt der Betrag leer."})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:"Stelle"}),e.jsxs(V,{value:c,onValueChange:i,children:[e.jsx(U,{children:e.jsx(O,{placeholder:"Ohne Stellenbezug"})}),e.jsx(G,{children:r.map(N=>e.jsx(P,{value:N.id,children:N.title},N.id))})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:"Tätigkeit"}),e.jsxs(V,{value:f,onValueChange:b,children:[e.jsx(U,{children:e.jsx(O,{})}),e.jsx(G,{children:$e.map(N=>e.jsx(P,{value:N.value,children:N.label},N.value))})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:"Minuten"}),e.jsx(T,{value:h,onChange:N=>g(N.target.value),inputMode:"numeric",placeholder:"z. B. 240"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:"Stundensatz (optional)"}
6),e.jsx(T,{value:v,onChange:N=>y(N.target.value),inputMode:"decimal",placeholder:S?String(S):"nicht hinterlegt"})]})]})]}),e.jsxs(be,{children:[e.jsx(E,{variant:"outline",onClick:()=>n(!1),children:"Abbrechen"}),e.jsx(E,{onClick:H,disabled:x,children:"Speichern"})]})]})})},Ps=({open:t,onOpenChange:n,companyId:d,settings:r,jobId:m,jobVacancyCost:u,onSaved:_})=>{const[c,i]=o.useState({currency:"EUR",recruiter:"",manager:"",interviewer:"",admin:"",software:"",vacancy:"",jobVacancy:""}),[f,b]=o.useState(!1);o.useEffect(()=>{t&&i({currency:r?.currency??"EUR",recruiter:r?.recruiter_hourly_rate?.toString()??"",manager:r?.manager_hourly_rate?.toString()??"",interviewer:r?.interviewer_hourly_rate?.toString()??"",admin:r?.admin_hourly_rate?.toString()??"",software:r?.software_cost_per_hire?.toString()??"",vacancy:r?.default_vacancy_cost_per_day?.toString()??"",jobVacancy:u?.toString()??""})},[t,r,u]);const h=y=>y.trim()===""?null:Number(y.replace(",",".")),g=async()=>{if(!d)return;b(!0);const{error:y}=await I.from("career_forecast_settings").upsert({company_id:d,currency:c.currency,recruiter_hourly_rate:h(c.recruiter),manager_hourly_rate:h(c.manager),interviewer_hourly_rate:h(c.interviewer),admin_hourly_rate:h(c.admin),software_cost_per_hire:h(c.software),default_vacancy_cost_per_day:h(c.vacancy)},{onConflict:"company_id"});let x=null;if(!y&&m){const{error:z}=await I.from("career_jobs").update({vacancy_cost_per_day:h(c.jobVacancy)}).eq("id",m);x=z?.message??null}if(b(!1),y||x){A.error("Speichern nicht möglich: "+(y?.message??x));return}A.success("Annahmen gespeichert"),_(),n(!1)},v=(y,x,z)=>e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:x}),e.jsx(T,{value:c[y],onChange:l=>i({...c,[y]:l.target.value}),inputMode:"decimal",placeholder:"nicht erfasst"}),z&&e.jsx("p",{className:"text-[11px] text-muted-foreground",children:z})]});return e.jsx(ce,{open:t,onOpenChange:n,children:e.jsxs(oe,{className:"max-w-lg",children:[e.jsxs(de,{children:[e.jsx(me,{children:"Annahmen für die Prognose"}),e.jsx(he,{children:"Diese Werte macht die Prognose belastbar. Was hier leer bleibt, bleibt in der Auswertung „nicht erfasst“."})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(p,{className:"text-xs",children:"Währung"}),e.jsxs(V,{value:c.currency,onValueChange:y=>i({...c,currency:y}),children:[e.jsx(U,{children:e.jsx(O,{})}),e.jsx(G,{children:["EUR","CHF","USD","GBP"].map(y=>e.jsx(P,{value:y,children:y},y))})]})]}),v("recruiter","Stundensatz Recruiting"),v("manager","Stundensatz Führungskraft"),v("interviewer","Stundensatz Interviewende"),v("admin","Stundensatz Administration"),v("software","Softwarekosten je Einstellung"),v("vacancy","Vakanzkosten pro Tag (Standard)"),m&&v("jobVacancy","Vakanzkosten pro Tag (diese Stelle)","überschreibt den Standardwert")]}),e.jsxs(be,{children:[e.jsx(E,{variant:"outline",onClick:()=>n(!1),children:"Abbrechen"}),e.jsx(E,{onClick:g,disabled:f,children:"Speichern"})]})]})})},we={country:"",region:"",industry:"",occupation_code:"",occupation_name:"",seniority:"",work_model:"",average_time_to_fill:null,cost_per_hire_low:null,cost_per_hire_median:null,cost_per_hire_high:null,salary_median:null,currency:"EUR",talent_availability_score:null,source_name:"",source_url:"",published_at:"",valid_from:"",valid_until:"",is_active:!0},Bs=t=>{if(t.trim()==="")return null;const n=Number(t.replace(",","."));return Number.isFinite(n)?n:null},re=({label:t,value:n,onChange:d,hint:r})=>e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:t}),e.jsx(T,{className:"h-9 bg-white",inputMode:"decimal",value:n==null?"":String(n),onChange:m=>d(Bs(m.target.value))}),r&&e.jsx("p",{className:"text-[10px] text-muted-foreground",children:r})]}),L=({label:t,value:n,onChange:d,placeholder:r,type:m})=>e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:t}),e.jsx(T,{className:"h-9 bg-white",type:m,placeholder:r,value:n??"",onChange:u=>d(u.target.value)})]}),$s=()=>{const{benchmarks:t,loading:n,error:d,reload:r,save:m,remove:u}
6=Ss(),[_,c]=o.useState(!1),[i,f]=o.useState(we),[b,h]=o.useState(!1),g=(l,S)=>f(H=>({...H,[l]:S})),v=()=>{f(we),c(!0)},y=l=>{f({...we,...l}),c(!0)},x=async()=>{if(!i.country.trim()||!i.occupation_name.trim()||!i.source_name.trim()){A.error("Land, Berufsgruppe und Quelle sind Pflichtangaben.");return}h(!0);const l={...i,region:i.region||null,industry:i.industry||null,occupation_code:i.occupation_code||null,seniority:i.seniority||null,work_model:i.work_model||null,source_url:i.source_url||null,published_at:i.published_at||null,valid_from:i.valid_from||null,valid_until:i.valid_until||null,currency:i.currency||"EUR"},S=await m(l);h(!1),S.ok?(A.success(S.message),c(!1)):A.error(S.message)},z=async l=>{if(!l)return;const S=await u(l);S.ok?A.success(S.message):A.error(S.message)};return e.jsxs(B,{className:"border-0 shadow-sm bg-white",children:[e.jsxs(Y,{className:"pb-2 flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",children:[e.jsxs("div",{children:[e.jsx(Z,{className:"text-base",children:"Eigene Marktwerte"}),e.jsx(X,{className:"text-xs",children:"Werte für Rolle, Region und Senioritätsstufe. Sie gelten nur für euer Unternehmen und gehen jeder KI-Schätzung und jedem allgemeinen Marktwert vor."})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{variant:"outline",size:"sm",className:"bg-white",onClick:()=>void r(),disabled:n,children:e.jsx(We,{className:`h-4 w-4 ${n?"animate-spin":""}`})}),e.jsxs(E,{size:"sm",className:"gap-1.5",onClick:v,children:[e.jsx(Le,{className:"h-4 w-4"})," Marktwert hinterlegen"]})]})]}),e.jsxs($,{className:"overflow-x-auto",children:[d&&e.jsxs("p",{className:"text-sm text-red-700 flex items-center gap-2 py-2",children:[e.jsx(Ve,{className:"h-4 w-4"}),d]}),t.length?e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b text-xs text-muted-foreground",children:[e.jsx("th",{className:"text-left py-2 px-2 font-medium",children:"Rolle"}),e.jsx("th",{className:"text-left py-2 px-2 font-medium",children:"Region"}),e.jsx("th",{className:"text-left py-2 px-2 font-medium",children:"Senioritätsstufe"}),e.jsx("th",{className:"text-right py-2 px-2 font-medium",children:"Dauer"}),e.jsx("th",{className:"text-right py-2 px-2 font-medium",children:"Kosten (mittel)"}),e.jsx("th",{className:"text-right py-2 px-2 font-medium",children:"Gehaltsmedian"}),e.jsx("th",{className:"text-left py-2 px-2 font-medium",children:"Quelle"}),e.jsx("th",{className:"text-left py-2 px-2 font-medium",children:"Gültig bis"}),e.jsx("th",{className:"text-right py-2 px-2 font-medium",children:"Aktion"})]})}),e.jsx("tbody",{children:t.map(l=>e.jsxs("tr",{className:"border-b border-border/30",children:[e.jsxs("td",{className:"py-2.5 px-2 font-medium",children:[l.occupation_name,!l.is_active&&e.jsx(je,{variant:"outline",className:"ml-2 text-[10px]",children:"inaktiv"})]}),e.jsx("td",{className:"py-2.5 px-2 text-xs",children:[l.country,l.region].filter(Boolean).join(" · ")||"—"}),e.jsx("td",{className:"py-2.5 px-2 text-xs",children:l.seniority||"—"}),e.jsx("td",{className:"py-2.5 px-2 text-right",children:l.average_time_to_fill?`${l.average_time_to_fill} Tage`:"—"}),e.jsx("td",{className:"py-2.5 px-2 text-right",children:l.cost_per_hire_median?`${Math.round(l.cost_per_hire_median).toLocaleString(ne())} ${l.currency??"EUR"}`:"—"}),e.jsx("td",{className:"py-2.5 px-2 text-right",children:l.salary_median?`${Math.round(l.salary_median).toLocaleString(ne())} ${l.currency??"EUR"}`:"—"}),e.jsx("td",{className:"py-2.5 px-2 text-xs",children:l.source_name}),e.jsx("td",{className:"py-2.5 px-2 text-xs",children:l.valid_until||"ohne Ende"}),e.jsxs("td",{className:"py-2.5 px-2 text-right whitespace-nowrap",children:[e.jsx(E,{variant:"ghost",size:"icon",className:"h-8 w-8",onClick:()=>y(l),children:e.jsx(Ue,{className:"h-4 w-4"})}),e.jsx(E,{variant:"ghost",size:"icon",className:"h-8 w-8 text-red-600",onClick:()=>void z(l.id),children:e.jsx(os,{className:"h-4 w-4"})})]})]},l.id))})]}):e.jsx("p",{className:"text-sm text-muted-foreground py-6 text-center",children:n?"Marktwerte werden geladen …":"Noch keine eigenen Marktwerte hinterlegt – die Prognose nutzt bis dahin KI-Schätzung und eigene Fälle."})]}),e.jsx(ce,{open:_,onOpenChange:c,children:e.jsxs(oe,{className:"max-w-2xl max-h-[85vh] overflow-y-auto",children:[e.jsxs(de,{children:[e.jsx(me,{children:i.id?"Marktwert bearbeiten":"Marktwert hinterlegen"}),e.jsx(he,{className:"text-xs",children:"Nur belegte Werte eintragen. Was leer bleibt, gilt als nicht erfasst und wird in der Prognose so ausgewiesen."})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-3",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Land *"}),e.jsxs(V,{value:cs(i.country)??"",onValueChange:l=>g("country",l),children:[e.jsx(U,{className:"h-9 bg-white",children:e.jsx(O,{placeholder:"Land wählen"})}),e.jsx(G,{className:"max-h-72",children:Ke.map(l=>e.jsxs(Fe,{children:[e.jsx(Ae,{children:l.label}),l.items.map(S=>e.jsx(P,{value:S.code,children:S.name},S.code))]},l.label))})]})]}),e.jsx(L,{label:"Region",value:i.region,onChange:l=>g("region",l),placeholder:"Bayern"}),e.jsx(L,{label:"Branche",value:i.industry,onChange:l=>g("industry",l)}),e.jsx(L,{label:"Berufsgruppe *",value:i.occupation_name,onChange:l=>g("occupation_name",l),placeholder:"Softwareentwicklung"}),e.jsx(L,{label:"Berufscode",value:i.occupation_code,onChange:l=>g("occupation_code",l),placeholder:"ESCO / KldB"}),e.jsx(L,{label:"Senioritätsstufe",value:i.seniority,onChange:l=>g("seniority",l),placeholder:"senior"}),e.jsx(L,{label:"Arbeitsmodell",value:i.work_model,onChange:l=>g("work_model",l),placeholder:"hybrid"}),e.jsx(re,{label:"Besetzungsdauer in Tagen",value:i.average_time_to_fill,onChange:l=>g("average_time_to_fill",l)}),e.jsx(L,{label:"Währung",value:i.currency,onChange:l=>g("currency",l)}),e.jsx(re,{label:"Kosten pro Einstellung niedrig",value:i.cost_per_hire_low,onChange:l=>g("cost_per_hire_low",l)}),e.jsx(re,{label:"Kosten pro Einstellung mittel",value:i.cost_per_hire_median,onChange:l=>g("cost_per_hire_median",l)}),e.jsx(re,{label:"Kosten pro Einstellung hoch",value:i.cost_per_hire_high,onChange:l=>g("cost_per_hire_high",l)}),e.jsx(re,{label:"Gehaltsmedian",value:i.salary_median,onChange:l=>g("salary_median",l)}),e.jsx(re,{label:"Talentverfügbarkeit 0–100",value:i.talent_availability_score,onChange:l=>g("talent_availability_score",l)}),e.jsx(L,{label:"Quelle *",value:i.source_name,onChange:l=>g("source_name",l),placeholder:"Eigene Auswertung 2026"}),e.jsx(L,{label:"Quellenlink",value:i.source_url,onChange:l=>g("source_url",l)}),e.jsx(L,{label:"Veröffentlicht am",type:"date",value:i.published_at,onChange:l=>g("published_at",l)}
6),e.jsx(L,{label:"Gültig ab",type:"date",value:i.valid_from,onChange:l=>g("valid_from",l)}),e.jsx(L,{label:"Gültig bis",type:"date",value:i.valid_until,onChange:l=>g("valid_until",l)})]}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx(ze,{checked:i.is_active!==!1,onCheckedChange:l=>g("is_active",l)}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"Wert in der Prognose verwenden"})]}),e.jsxs(be,{children:[e.jsx(E,{variant:"outline",onClick:()=>c(!1),children:"Abbrechen"}),e.jsx(E,{onClick:()=>void x(),disabled:b,children:b?"Speichern …":"Speichern"})]})]})})]})},Re=2*Math.PI*70,Rs=t=>t>=75?{label:"belastbar",color:"#34d399"}:t>=50?{label:"brauchbar",color:"#22d3ee"}:t>=30?{label:"unsicher",color:"#fbbf24"}:{label:"sehr unsicher",color:"#f87171"},Ne=({icon:t,label:n,value:d,sub:r,metric:m,format:u})=>e.jsxs("div",{className:"rounded-xl border border-white/10 bg-white/5 p-3 backdrop-blur-sm",children:[e.jsxs("div",{className:"flex items-start justify-between gap-1.5 text-[11px] uppercase tracking-wide text-slate-400",children:[e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(t,{className:"h-3.5 w-3.5"})," ",n]}),m&&u&&e.jsx(qe,{label:n,m,format:u})]}),e.jsx("p",{className:"mt-1 text-xl font-bold text-white leading-none",children:d}),r&&e.jsx("p",{className:"mt-1 text-[11px] text-slate-400",children:r})]}),Fs=({forecast:t,currency:n,onExplainConfidence:d})=>{const r=Math.max(0,Math.min(100,Math.round(t.confidence.score))),m=Rs(r),u=t.probability60.value,_=typeof u=="number"?Math.max(0,Math.min(100,Math.round(u))):null,c=_===null?0:Re/2*(_/100);return e.jsx(B,{className:"border-0 overflow-hidden bg-gradient-to-br from-slate-900 via-slate-900 to-cyan-950 shadow-xl",children:e.jsx($,{className:"p-5 sm:p-6",children:e.jsxs("div",{className:"grid gap-6 lg:grid-cols-[260px_1fr] lg:items-center",children:[e.jsxs("div",{className:"mx-auto w-full max-w-[260px] flex flex-col items-center",children:[e.jsxs("svg",{viewBox:"0 0 200 112",className:"w-full max-w-[240px]",role:"presentation",children:[e.jsx("defs",{children:e.jsxs("linearGradient",{id:"barometer-arc",x1:"0",y1:"0",x2:"1",y2:"0",children:[e.jsx("stop",{offset:"0%",stopColor:"#22d3ee"}),e.jsx("stop",{offset:"100%",stopColor:"#6366f1"})]})}),e.jsx("path",{d:"M30 100 A70 70 0 0 1 170 100",fill:"none",stroke:"rgba(255,255,255,0.12)",strokeWidth:"14",strokeLinecap:"round"}),e.jsx("path",{d:"M30 100 A70 70 0 0 1 170 100",fill:"none",stroke:"url(#barometer-arc)",strokeWidth:"14",strokeLinecap:"round",strokeDasharray:`${c} ${Re}`,className:"transition-all duration-700"}),e.jsx("text",{x:"100",y:"86",textAnchor:"middle",className:"fill-white",style:{fontSize:"26px",fontWeight:700},children:_===null?F:`${_} %`})]}),e.jsx("p",{className:"-mt-1 text-center text-[11px] text-slate-400",children:"Besetzung in 60 Tagen"}),e.jsxs("button",{type:"button",onClick:d,className:"mt-2 inline-flex max-w-full items-center justify-center gap-1.5 rounded-full border px-3 py-1 text-[11px] font-medium leading-tight",style:{borderColor:`${m.color}55`,color:m.color},children:[e.jsx(Oe,{className:"h-3 w-3 shrink-0"}),e.jsxs("span",{className:"truncate",children:["Sicherheit ",r," % · ",m.label]})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[11px] uppercase tracking-wide text-cyan-300",children:"Kosten-Cockpit"}),e.jsx("h2",{className:"text-xl font-bold text-white",children:t.job.title}),e.jsx("p",{className:"text-xs text-slate-400",children:t.benchmark?`Marktquelle: ${t.benchmark.source_name}`:"Gerechnet ausschließlich mit euren erfassten Daten"})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[e.jsx(Ne,{icon:Ge,label:"Kosten / Einstellung",value:k(t.costPerHire.value,n),sub:t.costPerHire.source,metric:t.costPerHire,format:i=>k(i,n)}),e.jsx(Ne,{icon:Ie,label:"Time to Fill",value:se(t.timeToFill.value),sub:t.timeToFill.source,metric:t.timeToFill,format:se}),e.jsx(Ne,{icon:_s,label:"Vakanzkosten",value:k(t.vacancyCost.value,n),metric:t.vacancyCost,format:i=>k(i,n)}),e.jsx(Ne,{icon:He,label:"Gesamtbelastung",value:k(t.totalCost.value,n),metric:t.totalCost,format:i=>k(i,n)})]}),e.jsxs("div",{className:"rounded-xl border border-amber-400/20 bg-amber-400/10 p-3",children:[e.jsxs("p",{className:"flex items-center gap-1.5 text-xs font-semibold text-amber-200",children:[e.jsx(ds,{className:"h-3.5 w-3.5"})," Hauptrisiko"]}),e.jsx("p",{className:"mt-1 text-sm text-amber-50",children:t.mainRisk})]}),t.explanation.length>0&&e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("p",{className:"text-[11px] uppercase tracking-wide text-slate-400",children:"Empfehlungen aus euren Daten"}),t.explanation.slice(0,4).map((i,f)=>e.jsxs("p",{className:"flex items-start gap-2 text-sm text-slate-200",children:[e.jsx(Ee,{className:"mt-0.5 h-3.5 w-3.5 shrink-0 text-cyan-300"}),e.jsxs("span",{children:[i.text," ",e.jsxs("span",{className:"text-slate-500",children:["(",i.source,")"]})]})]},f))]}),e.jsxs("p",{className:"text-[11px] text-slate-500",children:["Wahrscheinlichkeiten: 30 Tage ",ee(t.probability30.value)," · 60 Tage ",ee(t.probability60.value)," · 90 Tage ",ee(t.probability90.value)]})]})]})})})},ke="__unset__",pe=t=>{if(t.trim()==="")return null;const n=Number(t.replace(",","."));return Number.isFinite(n)?n:null},Se=({label:t,value:n,onChange:d})=>e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:t}),e.jsxs(V,{value:n==null?ke:n?"yes":"no",onValueChange:r=>d(r===ke?null:r==="yes"),children:[e.jsx(U,{className:"h-9 bg-white text-xs",children:e.jsx(O,{})}),e.jsxs(G,{children:[e.jsx(P,{value:ke,children:"noch nicht erfasst"}),e.jsx(P,{value:"yes",children:"ja"}),e.jsx(P,{value:"no",children:"nein"})]})]})]}),As=({open:t,onOpenChange:n,jobId:d,jobTitle:r,currency:m,existing:u,onSave:_})=>{const[c,i]=o.useState({job_id:d}),[f,b]=o.useState(!1),[h,g]=o.useState("");o.useEffect(()=>{t&&(i(u?{...u,job_id:d}:{job_id:d,offer_accepted:!0,currency:m??"EUR"}),g((u?.channels??[]).join(", ")))},[t,u,d,m]);const v=(x,z)=>i(l=>({...l,[x]:z})),y=async()=>{b(!0);const x=h.split(",").map(l=>
6l.trim()).filter(Boolean),z=await _({...c,job_id:d,channels:x.length?x:null});b(!1),z.ok?(A.success(z.message),n(!1)):A.error(z.message)};return e.jsx(ce,{open:t,onOpenChange:n,children:e.jsxs(oe,{className:"max-w-2xl max-h-[85vh] overflow-y-auto",children:[e.jsxs(de,{children:[e.jsxs(me,{children:["Besetzung abschließen – ",r]}),e.jsx(he,{className:"text-xs",children:"Die zuletzt gespeicherte Prognose wird festgehalten und mit dem tatsächlichen Ergebnis verglichen. Tatsächliche Werte überschreiben keine Prognose. Was leer bleibt, gilt als noch nicht erfasst."})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-3",children:[e.jsxs("div",{className:"space-y-1 sm:col-span-3 flex items-center gap-2",children:[e.jsx(ze,{checked:c.offer_accepted!==!1,onCheckedChange:x=>v("offer_accepted",x)}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"Angebot wurde angenommen"})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Einstellungsdatum"}),e.jsx(T,{className:"h-9 bg-white",type:"date",value:c.hired_at??"",onChange:x=>v("hired_at",x.target.value)})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Startdatum"}),e.jsx(T,{className:"h-9 bg-white",type:"date",value:c.started_at??"",onChange:x=>v("started_at",x.target.value)})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Tatsächliche Besetzungsdauer in Tagen"}),e.jsx(T,{className:"h-9 bg-white",inputMode:"decimal",value:c.actual_time_to_fill??"",onChange:x=>v("actual_time_to_fill",pe(x.target.value))})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Tatsächliche Gesamtkosten"}),e.jsx(T,{className:"h-9 bg-white",inputMode:"decimal",value:c.actual_total_cost??"",onChange:x=>v("actual_total_cost",pe(x.target.value))})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Währung"}),e.jsx(T,{className:"h-9 bg-white",value:c.currency??"EUR",onChange:x=>v("currency",x.target.value)})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Kanäle (mit Komma trennen)"}),e.jsx(T,{className:"h-9 bg-white",value:h,onChange:x=>g(x.target.value),placeholder:"Karriereseite, Empfehlung"})]}),e.jsx(Se,{label:"Probezeit bestanden",value:c.probation_passed,onChange:x=>v("probation_passed",x)}),e.jsx(Se,{label:"Nach 6 Monaten noch im Unternehmen",value:c.retained_6_months,onChange:x=>v("retained_6_months",x)}),e.jsx(Se,{label:"Nach 12 Monaten noch im Unternehmen",value:c.retained_12_months,onChange:x=>v("retained_12_months",x)}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Qualität nach 3 Monaten (0–100)"}),e.jsx(T,{className:"h-9 bg-white",inputMode:"numeric",value:c.quality_score_3_months??"",onChange:x=>v("quality_score_3_months",pe(x.target.value))})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Qualität nach 6 Monaten (0–100)"}),e.jsx(T,{className:"h-9 bg-white",inputMode:"numeric",value:c.quality_score_6_months??"",onChange:x=>v("quality_score_6_months",pe(x.target.value))})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Qualität nach 12 Monaten (0–100)"}),e.jsx(T,{className:"h-9 bg-white",inputMode:"numeric",value:c.quality_score_12_months??"",onChange:x=>v("quality_score_12_months",pe(x.target.value))})]}),e.jsxs("div",{className:"space-y-1 sm:col-span-3",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Notizen"}),e.jsx(De,{className:"bg-white",rows:2,value:c.notes??"",onChange:x=>v("notes",x.target.value)})]})]}),e.jsxs(be,{children:[e.jsx(E,{variant:"outline",onClick:()=>n(!1),children:"Abbrechen"}),e.jsx(E,{onClick:()=>
6void y(),disabled:f,children:f?"Speichern …":"Speichern"})]})]})})},Ds=(t,n)=>t==null?F:`${Math.round(Number(t)).toLocaleString(ne())} ${n??"EUR"}`,Ks=t=>t==null?F:`${Math.round(Number(t))} Tage`,Ce=t=>t==null?"offen":t?"ja":"nein",Ws=({jobId:t,jobTitle:n,currency:d})=>{const{outcomes:r,loading:m,save:u}=Cs(t??null),[_,c]=o.useState(!1),[i,f]=o.useState(null),b=h=>{f(h),c(!0)};return e.jsxs(B,{className:"border-0 shadow-sm bg-white",children:[e.jsxs(Y,{className:"pb-2 flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",children:[e.jsxs("div",{children:[e.jsx(Z,{className:"text-base",children:"Abgeschlossene Besetzungen"}),e.jsx(X,{className:"text-xs",children:"Tatsächliche Kosten und Dauer, Probezeit, Qualität nach 3, 6 und 12 Monaten sowie Bindung. Jedes Ergebnis verbessert die nächsten Prognosen."})]}),t&&e.jsxs(E,{size:"sm",className:"gap-1.5",onClick:()=>b(null),children:[e.jsx(Le,{className:"h-4 w-4"})," Besetzung abschließen"]})]}),e.jsx($,{className:"space-y-2",children:r.length?r.map(h=>e.jsxs("div",{className:"rounded-lg border border-border/50 p-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(ms,{className:"h-4 w-4 text-emerald-600"}),e.jsx("span",{className:"font-medium text-sm",children:h.job_title||"Stelle"}),h.hired_at&&e.jsxs(je,{variant:"outline",className:"text-[10px]",children:["eingestellt am ",h.hired_at]}),h.forecast_id&&e.jsx(je,{variant:"outline",className:"text-[10px] border-indigo-200 bg-indigo-50 text-indigo-800",children:"Prognose festgehalten"})]}),e.jsxs(E,{variant:"ghost",size:"sm",className:"gap-1.5",onClick:()=>b(h),children:[e.jsx(Ue,{className:"h-3.5 w-3.5"})," Ergebnis ergänzen"]})]}),e.jsxs("div",{className:"mt-2 grid gap-2 text-xs sm:grid-cols-4",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Tatsächliche Kosten"}),e.jsx("p",{children:Ds(h.actual_total_cost,h.currency)})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Tatsächliche Dauer"}),e.jsx("p",{children:Ks(h.actual_time_to_fill)})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Probezeit"}),e.jsx("p",{children:Ce(h.probation_passed)})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Startdatum"}),e.jsx("p",{children:h.started_at||F})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Qualität 3 Monate"}),e.jsx("p",{children:h.quality_score_3_months??"offen"})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Qualität 6 Monate"}),e.jsx("p",{children:h.quality_score_6_months??"offen"})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Qualität 12 Monate"}),e.jsx("p",{children:h.quality_score_12_months??"offen"})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"Bindung 6 / 12 Monate"}),e.jsxs("p",{children:[Ce(h.retained_6_months)," / ",Ce(h.retained_12_months)]})]})]}),h.channels?.length?e.jsxs("p",{className:"text-[11px] text-muted-foreground mt-2",children:["Kanäle: ",h.channels.join(", ")]}):null]},h.id)):e.jsx("p",{className:"text-sm text-muted-foreground py-6 text-center",children:m?"Ergebnisse werden geladen …":"Noch keine abgeschlossene Besetzung erfasst."})}),t&&e.jsx(As,{open:_,onOpenChange:c,jobId:i?.job_id??t,jobTitle:i?.job_title||n||"Stelle",currency:d,existing:i,onSave:u})]})},M="__all__",le=t=>[...new Set(t.filter(n=>typeof n=="string"&&n.trim()!==""))].sort(),ae=({label:t,value:n,onChange:d,options:r,formatOption:m})=>e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:t}),e.jsxs(V,{value:n,onValueChange:d,children:[e.jsx(U,{className:"h-9 bg-white text-xs",children:e.jsx(O,{})}),e.jsxs(G,{className:"max-h-72",children:[e.jsx(P,{value:M,children:"Alle"}),r.map(u=>e.jsx(P,{value:u,children:m?m(u):u},u))]})]})]}),Ls=({initialJobId:t})=>{const{companyId:n,jobs:d}=ws(),[r,m]=o.useState({country:M,location:M,department:M,family:M,seniority:M,employment:M,workModel:M,scope:M,targetUntil:""}),[u,_]=o.useState(t??null),[c,i]=o.useState({}),[f,b]=o.useState({country:M,region:""}),[h,g]=o.useState(!1),[v,y]=o.useState(!1),[x,z]=o.useState(!1),[l,S]=o.useState(!1),H=o.useMemo(()=>d.filter(s=>{const C=String(s.seniority_level??s.experience_level??"");return(r.country===M||s.country===r.country)&&(r.location===M||s.location===r.location)&&(r.department===M||s.department===r.department)&&(r.fam
6ily===M||s.occupation_family===r.family)&&(r.seniority===M||C===r.seniority)&&(r.employment===M||s.employment_type===r.employment)&&(r.workModel===M||s.work_model===r.workModel)&&(r.scope===M||(r.scope==="open"?s.status==="published"||s.status==="open":s.status!=="published"))&&(!r.targetUntil||s.target_fill_date&&String(s.target_fill_date)<=r.targetUntil)}),[d,r]),N=u&&H.some(s=>s.id===u)?u:H[0]?.id??null,K=d.find(s=>s.id===N)??null,xe=o.useMemo(()=>({country:f.country===M?null:f.country,region:f.region.trim()||null}),[f]),{forecast:a,scenarioResult:D,internal:j,settings:te,marketContext:q,benchmarkCount:W,benchmarkIsEstimate:ye,benchmarkEstimateError:Je,loading:_e,error:Me,reload:ue}=ks(N,c,xe),w=a?.currency??"EUR",Qe=Object.keys(c).length>0,Ye=(a?.breakdown??[]).map(s=>({name:s.label,Prognose:s.predicted??0,Tatsächlich:s.actual??0})),Ze=()=>{if(!a)return;const s=new ns({unit:"pt",format:"a4"});let C=48;const R=(Q,Xe=10,es=16)=>{s.setFontSize(Xe),s.splitTextToSize(Q,515).forEach(ss=>{C>780&&(s.addPage(),C=48),s.text(ss,40,C),C+=es})};R(`Besetzungsprognose – ${a.job.title}`,15,22),R(`Erstellt am ${new Date().toLocaleDateString(ne())} · Prognosesicherheit ${a.confidence.score} % (${a.confidence.level})`,9),C+=6,R(`Cost per Hire: ${k(a.costPerHire.value,w)} (${a.costPerHire.detail})`),R(`Time to Fill: ${se(a.timeToFill.value)} (${a.timeToFill.detail})`),R(`Vakanzkosten: ${k(a.vacancyCost.value,w)} (${a.vacancyCost.detail})`),R(`Gesamte wirtschaftliche Belastung: ${k(a.totalCost.value,w)}`),R(`Besetzungswahrscheinlichkeit 30/60/90 Tage: ${ee(a.probability30.value)} / ${ee(a.probability60.value)} / ${ee(a.probability90.value)}`),C+=6,R("Warum erwarten wir diese Kosten und diese Dauer?",12,18),a.explanation.forEach(Q=>R(`• ${Q.text}`,9,14)),C+=6,R("Empfehlungen",12,18),a.recommendations.forEach(Q=>R(`• ${Q.text} (${Q.basis})`,9,14)),C+=6,R("Kostenaufschlüsselung",12,18),a.breakdown.forEach(Q=>R(`${Q.label}: Prognose ${k(Q.predicted,w)} · tatsächlich ${k(Q.actual,w)}`,9,14)),s.save(`aiploya-besetzungsprognose-${a.job.title.slice(0,30)}.pdf`)};return e.jsxs("div",{className:"space-y-4",children:[e.jsxs(B,{className:"border-0 shadow-sm bg-white",children:[e.jsxs(Y,{className:"pb-2",children:[e.jsx(Z,{className:"text-base",children:"Welche Position soll analysiert werden?"}),e.jsx(X,{className:"text-xs",children:"Offene und geplante Stellen eures Unternehmens. Jede Zahl unten zeigt, woher sie stammt."})]}),e.jsxs($,{className:"space-y-3",children:[e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-end",children:[e.jsxs("div",{className:"flex-1 space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Position"}),e.jsxs(V,{value:N??"",onValueChange:_,children:[e.jsx(U,{className:"h-10 bg-white",children:e.jsx(O,{placeholder:"Keine Stelle im Filter"})}),e.jsx(G,{children:H.map(s=>e.jsxs(P,{value:s.id,children:[s.title,s.location?` · ${s.location}`:""]},s.id))})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(E,{variant:"outline",size:"sm",className:"bg-white",onClick:()=>void ue(!1),disabled:_e,children:e.jsx(We,{className:`h-4 w-4 ${_e?"animate-spin":""}`})}),e.jsxs(E,{variant:"outline",size:"sm",className:"bg-white gap-1.5",onClick:()=>void ue(!0),disabled:!a,children:[e.jsx(He,{className:"h-4 w-4"})," Prognose sichern"]}),e.jsxs(E,{variant:"outline",size:"sm",className:"bg-white gap-1.5",onClick:Ze,disabled:!a,children:[e.jsx(hs,{className:"h-4 w-4"})," PDF"]})]})]}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:"Die folgenden Felder schränken nur die Liste eurer eigenen Stellen ein. Das Land wählt ihr einmal darunter unter „Marktdaten“ – dort wird auch festgelegt, für welchen Arbeitsmarkt gerechnet wird."}),e.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 xl:grid-cols-5 gap-2",children:[e.jsx(ae,{label:"Standort der Stelle",value:r.location,onChange:s=>m({...r,location:s}),options:le(d.map(s=>s.location))}),e.jsx(ae,{label:"Abteilung",value:r.department,onChange:s=>m({...r,department:s}),options:le(d.map(s=>s.department))}),e.jsx(ae,{label:"Berufsfamilie",value:r.family,onChange:s=>m({...r,family:s}),options:le(d.map(s=>s.occupation_family))}),e.jsx(ae,{label:"Senioritätsstufe",value:r.seniority,onChange:s=>m({...r,seniority:s}),options:le(d.map(s=>s.seniority_level??s.experience_level))}),e.jsx(ae,{label:"Beschäftigungsart",value:r.employment,onChange:s=>m({...r,employment:s}),options:le(d.map(s=>s.employment_type))}),e.jsx(ae,{label:"Arbeitsmodell",value:r.workModel,onChange:s=>m({...r,workModel:s}),options:le(d.map(s=>s.work_model))}
6),e.jsx(ae,{label:"Besetzung",value:r.scope,onChange:s=>m({...r,scope:s}),options:["open","planned"],formatOption:s=>s==="open"?"Offen":"Geplant"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Besetzung bis"}),e.jsx(T,{type:"date",className:"h-9 bg-white text-xs",value:r.targetUntil,onChange:s=>m({...r,targetUntil:s.target.value})})]})]}),e.jsxs("div",{className:"rounded-xl border border-cyan-100 bg-cyan-50/60 p-3 space-y-2",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(Te,{className:"h-4 w-4 mt-0.5 text-cyan-700"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-slate-800",children:"Marktdaten: für welchen Arbeitsmarkt rechnen wir?"}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:"Standard ist das Land und der Ort der ausgewählten Stelle. Wählt ein anderes Land, um dieselbe Rolle in einem anderen Markt zu bewerten – Gehälter, Dauer und Talentverfügbarkeit werden dann für dieses Land ermittelt."})]})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-2",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Land für die Marktanalyse"}),e.jsxs(V,{value:f.country,onValueChange:s=>b({...f,country:s}),children:[e.jsx(U,{className:"h-9 bg-white text-xs",children:e.jsx(O,{})}),e.jsxs(G,{className:"max-h-72",children:[e.jsxs(P,{value:M,children:["Wie in der Stelle",K?.country?` (${ve(K.country)})`:""]}),Ke.map(s=>e.jsxs(Fe,{children:[e.jsx(Ae,{className:"text-[11px]",children:s.label}),s.items.map(C=>e.jsx(P,{value:C.code,children:C.name},C.code))]},s.label))]})]})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(p,{className:"text-[11px] text-muted-foreground",children:"Region oder Stadt (optional)"}),e.jsx(T,{className:"h-9 bg-white text-xs",placeholder:K?.location||"z. B. München, Wien, Zürich",value:f.region,onChange:s=>b({...f,region:s.target.value})})]})]}),q&&e.jsxs("p",{className:"text-[11px] text-muted-foreground",children:["Gerechnet wird für ",ve(q.country),q.region?` · ${q.region}`:"",q.overridden?" (abweichend von der Stelle gewählt)":" (Angaben der Stelle)","."]})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 pt-1",children:[e.jsxs(E,{variant:"outline",size:"sm",className:"gap-1.5",onClick:()=>y(!0),children:[e.jsx(Ge,{className:"h-4 w-4"})," Recruitingkosten erfassen"]}),e.jsxs(E,{variant:"outline",size:"sm",className:"gap-1.5",onClick:()=>z(!0),children:[e.jsx(xs,{className:"h-4 w-4"})," Interne Arbeitszeit erfassen"]}),e.jsxs(E,{variant:"outline",size:"sm",className:"gap-1.5",onClick:()=>S(!0),children:[e.jsx(us,{className:"h-4 w-4"})," Annahmen & Stundensätze"]}),ye?e.jsx("span",{className:"text-[11px] text-muted-foreground",children:"Startwerte aus KI-Marktschätzung für diese Rolle, Region und Senioritätsstufe. Sie werden Schritt für Schritt durch eure eigenen erfassten Werte ersetzt."}):Je?e.jsx("span",{className:"text-[11px] text-muted-foreground",children:"Keine Marktschätzung möglich – gerechnet wird ausschließlich mit euren Daten."}):W===0?e.jsx("span",{className:"text-[11px] text-muted-foreground",children:"Kein belastbarer Marktwert vorhanden – gerechnet wird ausschließlich mit euren Daten."}):null]})]})]}),Me&&e.jsx(B,{className:"border-red-200 bg-red-50",children:e.jsxs($,{className:"p-3 text-sm text-red-700 flex items-center gap-2",children:[e.jsx(Ve,{className:"h-4 w-4"})," ",Me]})}),N?a?e.jsxs(e.Fragment,{children:[e.jsx(Fs,{forecast:a,currency:w,onExplainConfidence:()=>g(!0)}),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[e.jsxs("h2",{className:"text-sm font-semibold text-slate-700 uppercase tracking-wide",children:["Prognose für ",a.job.title]}),e.jsxs("button",{type:"button",onClick:()=>g(!0),className:"inline-flex items-center gap-1.5 text-xs text-cyan-700 hover:underline",children:[e.jsx(Oe,{className:"h-3.5 w-3.5"}),"Prognosesicherheit ",a.confidence.score," % – ",a.confidence.level]})]}),e.jsxs("div",{className:"grid grid-cols-2 lg:grid-cols-4 gap-3",children:[e.jsx(J,{label:"Cost per Hire",m:a.costPerHire,format:s=>k(s,w),accent:!0}),e.jsx(J,{label:"Time to Fill",m:a.timeToFill,format:se,accent:!0}),e.jsx(J,{label:"Vakanzkosten",m:a.vacancyCost,format:s=>k(s,w),accent:!0}),e.jsx(J,{label:"Gesamte wirtschaftliche Belastung",m:a.totalCost,format:s=>k(s,w),hint:"Recruitingkosten und Vakanzkosten werden getrennt gerechnet",accent:!0}),e.jsx(J,{label:"Besetzt innerhalb 30 Tagen",m:a.probability30,format:ee}),e.jsx(J,{label:"Besetzt innerhalb 60 Tagen",m:a.probability60,format:ee}),e.jsx(J,{label:"Besetzt innerhalb 90 Tagen",m:a.probability90,format:ee}),e.jsx(B,{className:"border-0 shadow-sm bg-white",children:e.jsxs($,{className:"p-4 space-y-1.5",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:"Datenvollständigkeit der Kosten"}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:"Anteil der Kostenarten, für die ihr bei die
6ser Stelle echte Beträge erfasst habt"}),e.jsxs("p",{className:"text-2xl font-bold leading-none",children:[Math.round(a.completeness.present/a.completeness.expected*100)," %"]}),e.jsxs("p",{className:"text-[11px] text-muted-foreground",children:[a.completeness.present," von ",a.completeness.expected," erwarteten Kostenarten erfasst"]}),a.completeness.missing.length>0&&e.jsxs("p",{className:"text-[11px] text-muted-foreground",children:["Fehlt: ",a.completeness.missing.join(", ")]})]})})]}),(a.actual.totalCost!==null||a.actual.timeToFill!==null)&&e.jsxs(B,{className:"border-0 shadow-sm bg-white",children:[e.jsxs(Y,{className:"pb-2",children:[e.jsx(Z,{className:"text-base",children:"Prognose gegen tatsächliches Ergebnis"}),e.jsxs(X,{className:"text-xs",children:[a.actual.hires," abgeschlossene Besetzung(en) mit erfassten Ergebnisdaten – tatsächliche Werte werden nie überschrieben"]})]}),e.jsxs($,{className:"grid grid-cols-1 md:grid-cols-2 gap-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:"Kosten"}),e.jsxs("p",{children:["Prognose ",k(a.costPerHire.value,w)," · tatsächlich ",k(a.actual.totalCost,w)]}),e.jsxs("p",{className:"text-[11px] text-muted-foreground",children:["Abweichung ",a.deviation.cost===null?F:`${a.deviation.cost>0?"+":""}${a.deviation.cost.toLocaleString(ne())} ${w}`]})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:"Dauer"}),e.jsxs("p",{children:["Prognose ",se(a.timeToFill.value)," · tatsächlich ",se(a.actual.timeToFill)]}),e.jsxs("p",{className:"text-[11px] text-muted-foreground",children:["Abweichung ",a.deviation.time===null?F:`${a.deviation.time>0?"+":""}${a.deviation.time} Tage`]})]})]})]})]}),e.jsxs(B,{className:"border-0 shadow-sm",children:[e.jsxs(Y,{className:"pb-2",children:[e.jsx(Z,{className:"text-base",children:"Wodurch entstehen die Kosten?"}),e.jsx(X,{className:"text-xs",children:"Externe Kosten und interne Personalkosten (Stunden × hinterlegter Stundensatz), Prognose gegen tatsächlich erfasst"})]}),e.jsxs($,{className:"space-y-4",children:[e.jsx("div",{className:"h-72",children:e.jsx(gs,{width:"100%",height:"100%",children:e.jsxs(fs,{data:Ye,layout:"vertical",margin:{top:5,right:20,left:40,bottom:0},children:[e.jsx(bs,{strokeDasharray:"3 3",stroke:"#f1f5f9"}),e.jsx(vs,{type:"number",tick:{fontSize:11}}),e.jsx(Ns,{type:"category",dataKey:"name",width:190,tick:{fontSize:11}}),e.jsx(ps,{contentStyle:{borderRadius:8,border:"none",boxShadow:"0 4px 12px rgba(0,0,0,0.1)",fontSize:12}}),e.jsx(js,{wrapperStyle:{fontSize:11}}),e.jsx(Pe,{dataKey:"Prognose",fill:"#06b6d4",radius:[0,4,4,0]}),e.jsx(Pe,{dataKey:"Tatsächlich",fill:"#6366f1",radius:[0,4,4,0]})]})})}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b text-xs text-muted-foreground",children:[e.jsx("th",{className:"text-left py-2 px-2 font-medium",children:"Kostenart"}),e.jsx("th",{className:"text-left py-2 px-2 font-medium",children:"Bereich"}),e.jsx("th",{className:"text-right py-2 px-2 font-medium",children:"Prognose"}),e.jsx("th",{className:"text-right py-2 px-2 font-medium",children:"Tatsächlich erfasst"}),e.jsx("th",{className:"text-left py-2 px-2 font-medium",children:"Quelle"})]})}),e.jsx("tbody",{children:a.breakdown.map(s=>e.jsxs("tr",{className:"border-b border-border/30",children:[e.jsx("td",{className:"py-2 px-2",children:s.label}),e.jsx("td",{className:"py-2 px-2 text-xs text-muted-foreground",children:s.category==="internal"?"intern":"extern"}),e.jsx("td",{className:"text-right py-2 px-2",children:k(s.predicted,w)}),e.jsx("td",{className:"text-right py-2 px-2",children:k(s.actual,w)}),e.jsx("td",{className:"py-2 px-2",children:e.jsx(ie,{source:s.source==="missing"?"missing":"company_data"})})]},s.key))})]})})]})]}),e.jsxs(B,{className:"border-0 shadow-sm",children:[e.jsxs(Y,{className:"pb-2",children:[e.jsxs(Z,{className:"text-base flex items-center gap-2",children:[e.jsx(Te,{className:"h-4 w-4 text-cyan-600"})," Woher kommen die Marktzahlen?"]}),e.jsx(X,{className:"text-xs",children:"Eigene abgeschlossene Besetzungen zählen immer zuerst. Fehlen sie, kommt der Marktwert zum Einsatz – jede Zahl oben zeigt über das Info-Zeichen ihren vollständigen Rechenweg."})]}),e.jsx($,{className:"space-y-2 text-sm",children:a.benchmark?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-2",children:[["Quelle",a.benchmark.source_name],["Passung zur Rolle",a.benchmark.match??"—"],["Markt",`${ve(a.benchmark.country)}${a.benchmark.region?` · ${a.benchmark.region}`:""}`],["Rolle im Marktwert",`${a.benchmark.occupation_name??"—"}${a.benchmark.seniority?` · ${a.benchmark.seniority}`:""}`],["Stand",a.benchmark.published_at??"—"],["Gültig bis",a.benchmark.valid_until??"—"],["Marktgehalt (Median)",a.benchmark.salary_median?k(a.benchmark.salary_median,w):F],["Marktdauer",se(a.benchmark.average_time_to_fill??null)],["Marktkosten je Einstellung",a.benchmark.cost_per_hire_median==null?F:`${k(a.benchmark.cost_per_hire_low??null,w)} – ${k(a.benchmark.cost_per_hire_high??null,w)} (Mitte ${k(a.benchmark.cost_per_hire_median,w)})`],["Talentverfügbarkeit",a.benchmark.talent_availability_score&&a.benchmark.talent_availability_score>0?`${a.benchmark.talent_availability_score} von 100`:F]].map(([s,C])=>e.jsxs("div",{className:"rounded-lg bg-slate-50 p-2.5",children:[e.jsx("p",{className:"text-[11px] text-muted-foreground",children:s}),e.jsx("p",{className:"text-sm",children:C})]},s))}),a.benchmark.notes&&e.jsxs("div",{className:"rounded-lg bg-indigo-50 p-2.5 text-[12px] text-indigo-900",children:[e.jsx("p",{className:"font-medium",children:"Begründung der Quelle"}),e.jsx("p",{children:a.benchmark.notes})]}),e.jsxs("p",{className:"text-[11px] text-muted-foreground",children:["Alle Beträge in ",w," – der Währung dieser Stelle, auch wenn der Markt in einem anderen Land liegt."]}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:a.benchmark.is_own?"Das ist ein von euch selbst hinterlegter Marktwert – er hat immer Vorrang.":a.benchmark.is_estimate?"Das ist eine KI-Schätzung aus Gehaltsberichten und Recruiting-Studien für genau diese Rolle, dieses Land und diese Senioritätsstufe. Sie gilt 90 Tage und wird durch jede eigene abgeschlossene Besetzung ersetzt.":"Das ist ein hinterlegter Marktwert aus einer Studie oder eurer Benchmark-Pflege."})]}):e.jsxs("p",{className:"text-muted-foreground",children:["Für diese Rolle in ",ve(q?.country)," liegt kein Marktwert vor. Gerechnet wird ausschließlich mit euren eigenen erfassten Daten."]})})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-4",children:[e.jsxs(B,{className:"border-0 shadow-sm",children:[e.jsxs(Y,{className:"pb-2",children:[e.jsxs(Z,{className:"text-base flex items-center gap-2",children:[e.jsx(Ee,{className:"h-4 w-4 text-cyan-600"})," Warum erwarten wir diese Kosten und diese Dauer?"]}),e.jsx(X,{className:"text-xs",children:"Jeder Satz stammt aus einem Wert dieser Rolle"})]}),e.jsx($,{className:"space-y-2",children:a.explanation.map((s,C)=>e.jsxs("div",{className:"flex items-start gap-2 rounded-lg bg-slate-50 p-2.5 text-sm",children:[e.jsx("span",{className:"flex-1",children:s.text}),e.jsx(ie,{source:s.source==="benchmark"?"benchmark":s.source==="missing"?"missing":"company_data"})]},C))})]}),e.jsxs(B,{className:"border-0 shadow-sm",children:[e.jsxs(Y,{className:"pb-2",children:[e.jsxs(Z,{className:"text-base flex items-center gap-2",children:[e.jsx(ys,{className:"h-4 w-4 text-amber-500"})," Was ihr konkret tun könnt"]}),e.jsx(X,{className:"text-xs",children:"Jede Empfehlung nennt den Wert, aus dem sie folgt"})]}),e.jsx($,{className:"space-y-2",children:a.recommendations.length===0?e.jsx("p",{className:"text-sm text-muted-foreground",children:"Aus den vorhandenen Werten ergibt sich derzeit keine Empfehlung."}):a.recommendations.map((s,C)=>e.jsxs("div",{className:"rounded-lg bg-amber-50 p-2.5 text-sm text-amber-900",children:[e.jsx("p",{children:s.text}),e.jsxs("p",{className:"text-[11px] opacity-80",children:["Grundlage: ",s.basis]})]},C))})]})]}),e.jsxs(B,{className:"border-0 shadow-sm",children:[e.jsxs(Y,{className:"pb-2",children:[e.jsxs(Z,{className:"text-base flex items-center gap-2",children:[e.jsx(as,{className:"h-4 w-4 text-cyan-600"})," Passt möglicherweise bereits jemand aus eurem Unternehmen?"]}),e.jsx(X,{className:"text-xs",children:"Abgleich der belegten Kompetenzen. Es wird keine Entscheidung getroffen – nur die Grundlage gezeigt."})]}),e.jsx($,{className:"space-y-3",children:j?.talents.length?e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-sm",children:[e.jsx("span",{className:"font-semibold",children:j.talents.length})," interne Profile erreichen mindestens 30 % Übereinstimmung mit den ",j.required," erfassten Anforderungen."]}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b text-xs text-muted-foreground",children:[e.jsx("th",{className:"text-left py-2 px-2 font-medium",children:"Person"}),e.jsx("th",{className:"text-right py-2 px-2 font-medium",children:"Matchwert"}),e.jsx("th",{className:"text-left py-2 px-2 font-medium",children:"Fehlende Fähigkeiten"}),e.jsx("th",{className:"text-right py-2 px-2 font-medium",children:"Entwicklungszeit"}),e.jsx("th",{className:"text-right py-2 px-2 font-medium",children:"Entwicklungskosten"})]})}),e.jsx("tbody",{children:j.talents.map(s=>e.jsxs("tr",{className:"border-b border-border/30",children:[e.jsx("td",{className:"py-2 px-2 font-medium",children:s.name}),e.jsxs("td",{className:"text-right py-2 px-2",children:[s.match," %"]}),e.jsx("td",{className:"py-2 px-2 text-xs",children:s.missing_skills.length?s.missing_skills.join(", "):"—"}),e.jsx("td",{className:"text-right py-2 px-2",children:s.development_days?`${s.development_days} Tage`:"—"}),e.jsxs("td",{className:"text-right py-2 px-2",children:[s.development_cost===null?F:k(s.development_cost,w),e.jsx("div",{className:"text-[10px] text-muted-foreground",children:s.development_cost_note})]})]},s.candidate_id))})]})}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3 pt-1",children:[e.jsxs("div",{className:"rounded-lg bg-slate-50 p-3 text-sm",children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:"Exter
6ne Neubesetzung"}),e.jsxs("p",{className:"font-semibold",children:[k(a.totalCost.value,w)," · ",se(a.timeToFill.value)]}),e.jsx(ie,{source:a.totalCost.source})]}),e.jsxs("div",{className:"rounded-lg bg-cyan-50 p-3 text-sm",children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:"Interne Entwicklung (bestes Profil)"}),e.jsxs("p",{className:"font-semibold",children:[j.talents[0].development_cost===null?F:k(j.talents[0].development_cost,w),j.talents[0].development_days?` · ${j.talents[0].development_days} Tage`:""]}),e.jsx(ie,{source:j.talents[0].development_cost===null?"missing":"assumption"})]})]})]}):e.jsx("p",{className:"text-sm text-muted-foreground",children:j?.note||"Es liegen keine internen Profile mit belegten Kompetenzen vor."})})]}),e.jsxs(B,{className:"border-0 shadow-sm",children:[e.jsxs(Y,{className:"pb-2 flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between",children:[e.jsxs("div",{children:[e.jsxs(Z,{className:"text-base flex items-center gap-2",children:[e.jsx(Ie,{className:"h-4 w-4 text-indigo-600"})," Was verändert die Besetzung?"]}),e.jsx(X,{className:"text-xs",children:"Alle Wirkungen sind benannte Annahmen und werden als solche gekennzeichnet – nie als gemessener Effekt."})]}),Qe&&e.jsx(E,{variant:"outline",size:"sm",onClick:()=>i({}),children:"Szenario zurücksetzen"})]}),e.jsxs($,{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs(p,{className:"text-xs",children:["Gehalt verändern: ",c.salary_change_percent??0," %"]}),e.jsx(ge,{min:-20,max:20,step:1,value:[c.salary_change_percent??0],onValueChange:([s])=>i({...c,salary_change_percent:s})})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs(p,{className:"text-xs",children:["Suchradius erweitern: ",c.radius_km??0," km"]}),e.jsx(ge,{min:0,max:500,step:25,value:[c.radius_km??0],onValueChange:([s])=>i({...c,radius_km:s})})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs(p,{className:"text-xs",children:["Zusätzliche Jobbörsen: ",c.extra_job_boards??0]}),e.jsx(ge,{min:0,max:6,step:1,value:[c.extra_job_boards??0],onValueChange:([s])=>i({...c,extra_job_boards:s})})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs(p,{className:"text-xs",children:["Muss-Kriterien reduzieren: ",c.reduce_must_haves??0]}),e.jsx(ge,{min:0,max:6,step:1,value:[c.reduce_must_haves??0],onValueChange:([s])=>i({...c,reduce_must_haves:s})})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs(p,{className:"text-xs",children:["Prozessschritte entfernen: ",c.removed_steps??0]}),e.jsx(ge,{min:0,max:4,step:1,value:[c.removed_steps??0],onValueChange:([s])=>i({...c,removed_steps:s})})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs(p,{className:"text-xs",children:["Werbebudget verändern (",w,")"]}),e.jsx(T,{inputMode:"numeric",className:"h-9",value:c.ad_budget_change??"",onChange:s=>i({...c,ad_budget_change:s.target.value?Number(s.target.value):void 0})})]})]}),e.jsx("div",{className:"space-y-3",children:[["allow_remote","Remote erlauben"],["use_agency","Personalvermittlung einsetzen"],["activate_referrals","Mitarbeiterempfehlungen aktivieren"],["develop_internal","Internen Kandidaten entwickeln"]].map(([s,C])=>e.jsxs("div",{className:"flex items-center justify-between rounded-lg border border-border/60 px-3 py-2",children:[e.jsx(p,{className:"text-sm",children:C}),e.jsx(ze,{checked:!!c[s],onCheckedChange:R=>i({...c,[s]:R||void 0})})]},s))})]}),D?e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"grid grid-cols-2 lg:grid-cols-4 gap-3",children:[e.jsx(J,{label:"Cost per Hire im Szenario",m:D.costPerHire,format:s=>k(s,w),hint:a.costPerHire.value!==null&&D.costPerHire.value!==null?`Veränderung ${Math.round(D.costPerHire.value-a.costPerHire.value).toLocaleString(ne())} ${w}`:void 0}),e.jsx(J,{label:"Time to Fill im Szenario",m:D.timeToFill,format:se,hint:a.timeToFill.value!==null&&D.timeToFill.value!==null?`Veränderung ${Math.round(D.timeToFill.value-a.timeToFill.value)} Tage`:void 0}),e.jsx(J,{label:"Vakanzkosten im Szenario",m:D.vacancyCost,format:s=>k(s,w)}),e.jsx(J,{label:"Besetzt innerhalb 60 Tagen",m:D.probability60,format:ee})]}),e.jsxs("div",{className:"rounded-lg bg-amber-50 p-3 space-y-1",children:[e.jsx("p",{className:"text-xs font-medium text-amber-900",children:"Verwendete Annahmen"}),D.notes.map((s,C)=>e.jsxs("p",{className:"text-[11px] text-amber-900",children:["• ",s.text]},C))]})]}):e.jsx("p",{className:"text-sm text-muted-foreground",children:"Wählt oben eine Veränderung, um die Wirkung auf Kosten, Dauer und Wahrscheinlichkeit zu sehen."})]})]})]}):e.jsx(B,{className:"border-0 shadow-sm",children:e.jsx($,{className:"p-8 text-center text-sm text-muted-foreground",children:_e?"Prognose wird berechnet …":"Für diese Stelle konnte keine Prognose berechnet werden."})}):e.jsx(B,{className:"border-0 shadow-sm",children:e.jsx($,{className:"p-8 text-center text-sm text-muted-foreground",children:"Für die aktuelle Filterauswahl gibt es keine Stelle."})}),e.jsx(ce,{open:h,onOpenChange:g,children:e.jsxs(oe,{className:"max-w-md",children:[e.jsxs(de,{children:[e.jsx(me,{children:"Wie sicher ist diese Prognose?"}),e.jsx(he,{children:a?`${a.confidence.score} von 100 – ${a.confidence.level}`:""})]}),a&&e.jsxs("div",{className:"space-y-2 text-sm",children:[e.jsxs("p",{children:["Eigene Vergleichsfälle: ",e.jsx("strong",{children:a.confidence.parts.ownCases})]}),e.jsxs("p",{children:["Gewicht der eigenen Daten: ",e.jsx("strong",{children:a.confidence.parts.ownWeight})]}),e.jsxs("p",{children:["Marktwert hinterlegt: ",e.jsx("strong",{children:a.confidence.parts.hasBenchmark?"ja":"nein"})]}),e.jsxs("p",{children:["Kostenvollständigkeit: ",e.jsxs("strong",{children:[a.confidence.parts.costCompleteness," %"]})]}),e.jsxs("p",{children:["Stabilität der eigenen Werte: ",e.jsxs("strong",{children:[a.confidence.parts.stability," %"]})]}),e.jsxs("p",{children:["Abgeschlossene Einstellungen: ",e.jsx("strong",{children:a.confidence.parts.hires})]}),a.completeness.missing.length>0&&e.jsxs("p",{className:"text-xs text-muted-foreground",children:["Für eine höhere Sicherheit fehlen: ",a.completeness.missing.join(", "),"."]}),e.jsx(je,{variant:"outline",className:"text-[10px]",children:"Bei dünner Datenlage zeigen wir bewusst eine Spanne statt einer scheinbar genauen Zahl."})]})]})}),e.jsx(Ms,{open:v,onOpenChange:y,companyId:n,jobs:d.map(s=>({id:s.id,title:s.title})),defaultJobId:N,onSaved:()=>void ue(!1)}),e.jsx(Ts,{open:x,onOpenChange:z,companyId:n,jobs:d.map(s=>({id:s.id,title:s.title})),defaultJobId:N,settings:te,onSaved:()=>void ue(!1)}),e.jsx(Ps,{open:l,onOpenChange:S,companyId:n,settings:te,jobId:N,jobVacancyCost:K?.vacancy_cost_per_day??null,onSaved:()=>void ue(!1)}),e.jsx($s,{}),e.jsx(Ws,{jobId:N,jobTitle:K?.title,currency:w})]})},vt=Object.freeze(Object.defineProperty({__proto__:null,default:Ls},Symbol.toStringTag,{value:"Module"}));
6export{Ls as F,F as N,ie as S,vt as a,se as d,k as m,ee as p,bt as u};

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.