1import{A as k}from"./AdminLayout-CDEPcI7g.js";import{H as S}from"./HelpPanel-BB6xcae1.js";import{t as $,a as A}from"./propI18nLabels-Drnc0SN8.js";import{_ as C}from"./media-6pd64PdO.js";import{aH as _,O as r,P as L,Q as M,aj as t,S as o,ai as a,a2 as n,F as c,a3 as b,W as y,T as h,as as f}from"./vendor-DGIfAMcx.js";import"./mitt-D52JP_s6.js";import"./nuxt-ui-D3Q7VuiZ.js";import"./icons-BKDXwKQn.js";import"./clickOutside-DT2P2o-I.js";const N={name:"Kpi",props:{label:String,value:[String,Number],tone:String},computed:{toneClass(){return{emerald:"text-emerald-600",blue:"text-blue-600",indigo:"text-indigo-600",red:"text-red-600",amber:"text-amber-600"}[this.tone]||"text-slate-800"}},template:` 2 <div class="bg-white rounded-xl border border-slate-200 p-4"> 3 <div class="text-xs uppercase text-slate-500">{{ label }}</div> 4 <div class="mt-2 text-2xl font-bold tabular-nums" :class="toneClass">{{ value }}</div> 5 </div> 6 `},T={name:"Money",props:{label:String,value:[String,Number],tone:String},computed:{formatted(){const e=this.value;return e==null||e===""?"0":Number(e).toLocaleString(void 0,{maximumFractionDigits:2})},toneClass(){return{emerald:"text-emerald-600",blue:"text-blue-600",amber:"text-amber-600",indigo:"text-indigo-600",red:"text-red-600"}[this.tone]||"text-slate-800"},currencyLabel(){return this.$t("admin.prop_reports.currency_usdt")}},template:` 7 <div class="bg-white rounded-xl border border-slate-200 p-5"> 8 <div class="text-xs uppercase tracking-wider text-slate-500">{{ label }}</div> 9 <div class="mt-2 text-2xl font-bold tabular-nums" :class="toneClass">{{ formatted }}<span class="text-sm text-slate-400 ms-1">{{ currencyLabel }}</span></div> 10 </div> 11 `},D={name:"DailyBars",props:{title:String,data:{type:Array,default:()=>[]},tone:{type:String,default:"blue"},valueKey:{type:String,default:"count"},isMoney:{type:Boolean,default:!1}},computed:{max(){return Math.max(1,...this.data.map(e=>Number(e[this.valueKey]||0)))},total(){return this.data.reduce((e,d)=>e+Number(d[this.valueKey]||0),0)},toneClass(){return{blue:"bg-blue-500",emerald:"bg-emerald-500",red:"bg-red-500",amber:"bg-amber-500"}[this.tone]||"bg-slate-500"},toneTextClass(){return{blue:"text-blue-600",emerald:"text-emerald-600",red:"text-red-600",amber:"text-amber-600"}[this.tone]||"text-slate-700"}},methods:{fmt(e){return this.isMoney?Number(e).toLocaleString(void 0,{maximumFractionDigits:2}):e}},template:` 12 <div class="bg-white rounded-xl border border-slate-200 p-5"> 13 <div class="flex items-center justify-between mb-3"> 14 <h3 class="text-sm font-semibold text-slate-800">{{ title }}</h3> 15 <span class="text-xs font-bold tabular-nums" :class="toneTextClass">{{ fmt(total) }}</span> 16 </div> 17 <div class="flex items-end gap-1 h-[100px]"> 18 <div v-for="(d, i) in data" :key="i" class="flex-1 flex flex-col items-center group relative"> 19 <div class="w-full rounded-t transition-all hover:opacity-80 cursor-pointer" 20 :class="toneClass" 21 :style="{ height: Math.max(2, (Number(d[valueKey]) / max) * 90) + 'px', opacity: 0.4 + (Number(d[valueKey]) / max) * 0.6 }"></div> 22 <div class="absolute -top-7 start-1/2 -translate-x-1/2 px-1.5 py-0.5 rounded bg-slate-800 text-white text-[10px] font-bold whitespace-nowrap opacity-0 group-hover:opacity-100 pointer-events-none z-10"> 23 {{ fmt(d[valueKey]) }}<br> 24 <span class="text-slate-300">{{ d.date }}</span> 25 </div> 26 </div> 27 </div> 28 <div v-if="!data.length" class="text-center text-xs text-slate-400 py-4">{{ $t('admin.prop_reports.no_data') }}</div> 29 </div> 30 `},j={name:"FunnelRow",props:{label:String,value:Number,max:Number,tone:String},computed:{pct(){return this.max>0?Math.round(this.value/this.max*100):0},toneClass(){return{blue:"bg-blue-500",indigo:"bg-indigo-500",amber:"bg-amber-500",emerald:"bg-emerald-500",red:"bg-red-500"}[this.tone]||"bg-slate-500"}},template:` 31 <div> 32 <div class="flex items-center justify-between text-xs mb-1">
33 <span class="font-medium text-slate-700">{{ label }}</span> 34 <span class="tabular-nums font-bold text-slate-800">{{ value }} · {{ pct }}%</span> 35 </div> 36 <div class="w-full h-3 bg-slate-100 rounded-full overflow-hidden"> 37 <div class="h-full transition-all" :class="toneClass" :style="{ width: pct + '%' }"></div> 38 </div> 39 </div> 40 `},K={components:{AppLayout:k,HelpPanel:S,Kpi:N,Money:T,DailyBars:D,FunnelRow:j},props:{kpis:Object,byPlan:Object,plans:Array,passRate:Array,latestPayouts:Array,latestViolations:Array,dailyAccounts:{type:Array,default:()=>[]},dailyPayouts:{type:Array,default:()=>[]},dailyViolations:{type:Array,default:()=>[]},funnel:{type:Object,default:()=>({enrolled:0,active:0,passed_phase_one:0,reached_funded:0,failed:0})},violationTypes:{type:Array,default:()=>[]},topTraders:{type:Array,default:()=>[]}},computed:{violationsMax(){return Math.max(1,...this.violationTypes.map(e=>e.count))},emDash(){return this.$t("admin.prop_reports.em_dash")}},methods:{formatAmount(e){return e==null||e===""?"0":Number(e).toLocaleString(void 0,{maximumFractionDigits:4})},formatDate(e){try{return new Date(e).toLocaleString()}catch{return e}},severityClass(e){return{warning:"bg-amber-100 text-amber-700",soft_block:"bg-orange-100 text-orange-700",hard_close:"bg-red-100 text-red-700"}[e]||"bg-slate-100 text-slate-700"},violationTypeLabel(e){return A(this,e)},violationSeverityLabel(e){return $(this,e)},payoutStatusLabel(e){const d={pending:"prop.payouts.s_pending",under_review:"prop.payouts.s_review",approved:"prop.payouts.s_approved",rejected:"prop.payouts.s_rejected",paid:"prop.payouts.s_paid"};return d[e]?this.$t(d[e]):e},pctOfMax(e,d){return d>0?Math.min(100,e/d*100):0}}},V={class:"space-y-6"},B={class:"text-2xl font-bold text-slate-800"},F={class:"text-sm text-slate-500 mt-1"},P={class:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4"},O={class:"grid grid-cols-1 md:grid-cols-3 gap-4"},R={class:"grid grid-cols-1 lg:grid-cols-3 gap-4"},z={class:"grid grid-cols-1 lg:grid-cols-2 gap-4"},H={class:"bg-white rounded-xl border border-slate-200 overflow-hidden"},E={class:"px-5 py-4 border-b border-slate-200"},I={class:"text-lg font-semibold text-slate-800"},Q={class:"text-xs text-slate-500 mt-0.5"},W={class:"p-5 space-y-2"},q={class:"bg-white rounded-xl border border-slate-200 overflow-hidden"},G={class:"px-5 py-4 border-b border-slate-200"},J={class:"text-lg font-semibold text-slate-800"},U={class:"text-xs text-slate-500 mt-0.5"},X={class:"divide-y divide-slate-100"},Y={class:"text-sm font-medium text-slate-800"},Z={class:"inline-flex items-center gap-2"},ee={class:"w-32 h-1.5 bg-slate-200 rounded-full overflow-hidden"},te={class:"text-sm font-bold tabular-nums text-slate-800 w-10 text-end"},ae={key:0,class:"px-5 py-6 text-center text-slate-400 text-sm"},se={class:"bg-white rounded-xl border border-slate-200 overflow-hidden"},le={class:"px-5 py-4 border-b border-slate-200"},oe={class:"text-lg font-semibold text-slate-800"},re={class:"text-xs text-slate-500 mt-0.5"},ne={class:"overflow-x-auto"},ie={class:"w-full"},de={class:"bg-slate-50 border-b border-slate-200"},pe={class:"px-4 py-3 text-start text-xs font-semibold uppercase tracking-wider text-slate-600"},ue={class:"px-4 py-3 text-start text-xs font-semibold uppercase tracking-wider text-slate-600"},_e={class:"px-4 py-3 text-start text-xs font-semibold uppercase tracking-wider text-slate-600"},me={class:"px-4 py-3 text-end text-xs font-semibold uppercase tracking-wider text-slate-600"},ce={class:"divide-y divide-slate-100"},be={class:"px-4 py-2 text-slate-700 font-bold"},he={class:"px-4 py-2 text-slate-700 tabular-nums"},ve={class:"px-4 py-2 text-slate-700 tabular-nums"},xe={key:0},ye={colspan:"4",class:"px-5 py-6 text-center text-slate-400 text-sm"},fe={class:"bg-white rounded-xl border border-slate-200 overflow-hidden"},ge={class:"px-5 py-4 border-b border-slate-200"},we={class:"text-lg font-semibold text-slate-800"},ke={class:"overflow-x-auto"},Se={class:"w-full"},$e={class:"bg-slate-50 border-b border-slate-200"},Ae={class:"px-4 py-3 text-start text-xs font-semibold uppercase tracking-wider text-slate-600"},Ce={class:"px-4 py-3 text-end text-xs font-semibold uppercase tracking-wider text-slate-600"},Le={class:"px-4 py-3 text-end text-xs font-semibold uppercase tracking-wider text-slate-600"},Me={class:"px-4 py-3 text-end text-xs font-semibold uppercase tracking-wider text-slate-600"},Ne={class:"divide-y divide-slate-100"},Te={class:"px-4 py-2 font-medium text-slate-800"},De={class:"px-4 py-2 text-end tabular-nums text-slate-700"},je={class:"px-4 py-2 text-end tabular-nums text-emerald-600"},Ke={class:"px-4 py-2 text-end"},Ve={class:"inline-flex items-center gap-2"},Be={class:"w-24 h-1.5 bg-slate-200 rounded-full overflow-hidden"},Fe={class:"text-sm font-semibold text-slate-800 tabular-nums w-12 text-end"},Pe={class:"grid grid-cols-1 lg:grid-cols-2 gap-6"},Oe={class:"bg-white rounded-xl border border-slate-200 overflow-hidden"},Re={class:"px-5 py-4 border-b border-slate-200"},ze={class:"text-lg font-semibold text-slate-800"},He={class:"divide-y divide-slate-100"},Ee={class:"text-sm font-medium text-slate-800"},Ie={class:"text-xs text-slate-500"},Qe={class:"text-end"},We={class:"text-sm font-semibold text-emerald-600 tabular-nums"},qe={class:"text-xs text-slate-500"},Ge={key:0,class:"px-5 py-6 text-center text-slate-400 text-sm"},Je={class:"bg-white rounded-xl border border-slate-200 overflow-hidden"},Ue={class:"px-5 py-4 border-b border-slate-200"},Xe={class:"text-lg font-semibold text-slate-800"},Ye={class:"divide-y divide-slate-100"},Ze={class:"text-sm font-medium text-slate-800"},et={class:"text-xs text-slate-500"},tt={key:0,class:"px-5 py-6 text-center text-slate-400 text-sm"};function at(e,d,s,st,lt,i){const g=_("help-panel"),u=_("Kpi"),p=_("Money"),v=_("DailyBars"),m=_("FunnelRow"),w=_("app-layout");return r(),L(w,null,{default:M(()=>[t("div",V,[o(g,{title:e.$t("admin.help.prop_reports.title"),steps:[e.$t("admin.help.prop_reports.step1"),e.$t("admin.help.prop_reports.step2"),e.$t("admin.help.prop_reports.step3"),e.$t("admin.help.prop_reports.step4")],cautions:[e.$t("admin.help.prop_reports.caution1"),e.$t("admin.help.prop_reports.caution2")],related:[{label:e.$t("admin.help.prop_reports.related_plans"),href:e.route("admin.prop.plans.index")},{label:e.$t("admin.help.prop_reports.related_accounts"),href:e.route("admin.prop.accounts.index")},{label:e.$t("admin.help.prop_reports.related_payouts"),href:e.route("admin.prop.payouts.index")},{label:e.$t("admin.help.prop_reports.related_settings"),href:e.route("admin.prop.settings.index")},{label:e.$t("admin.help.prop_reports.related_users"),href:e.route("admin.users")},{label:e.$t("admin.help.prop_reports.related_futures_markets"),href:e.route("admin.futures-markets")}]},null,8,["title","steps","cautions","related"]),t("div",null,[t("h1",B,a(e.$t("admin.prop_reports.title")),1),t("p",F,a(e.$t("admin.prop_reports.subtitle")),1)]),t("div",P,[o(u,{label:e.$t("admin.prop_reports.kpi_active_plans"),value:s.kpis.active_plans,tone:"emerald"},null,8,["label","value"]),o(u,{label:e.$t("admin.prop_reports.kpi_active_accounts"),value:s.kpis.active_accounts,tone:"blue"},null,8,["label","value"]),o(u,{label:e.$t("admin.prop_reports.kpi_funded_accounts"),value:s.kpis.funded_accounts,tone:"indigo"},null,8,["label","value"]),o(u,{label:e.$t("admin.prop_reports.kpi_failed_accounts"),value:s.kpis.failed_accounts,tone:"red"},null,8,["label","value"]),o(u,{label:e.$t("admin.prop_reports.kpi_pending_payouts"),value:s.kpis.pending_payouts,tone:"amber"},null,8,["label","value"]),o(u,{label:e.$t("admin.prop_reports.kpi_violations_24h"),value:s.kpis.violations_24h,tone:"red"},null,8,["label","value"])]),t("div",O,[o(p,{label:e.$t("admin.prop_reports.money_total_entry_fees"),value:s.kpis.total_entry_fees,tone:"emerald"},null,8,["label","value"]),o(p,{label:e.$t("admin.prop_reports.money_total_reset_fees"),value:s.kpis.total_reset_fees,tone:"emerald"},null,8,["label","value"]),o(p,{label:e.$t("admin.prop_reports.money_total_trader_payouts"),value:s.kpis.total_payouts_paid,tone:"blue"},null,8,["label","value"]),o(p,{label:e.$t("admin.prop_reports.money_total_platform_share"),value:s.kpis.total_platform_share,tone:"indigo"},null,8,["label","value"]),o(p,{label:e.$t("admin.prop_reports.money_net_platform_revenue"),value:s.kpis.net_platform_revenue,tone:"emerald"},null,8,["label","value"]),o(p,{label:e.$t("admin.prop_reports.money_pending_payouts_amount"),value:s.kpis.pending_payouts_amount,tone:"amber"},null,8,["label","value"]),o(p,{label:e.$t("admin.prop_reports.money_avg_payout"),value:s.kpis.avg_payout,tone
40:"blue"},null,8,["label","value"]),o(p,{label:e.$t("admin.prop_reports.money_largest_payout"),value:s.kpis.largest_payout,tone:"indigo"},null,8,["label","value"]),o(u,{label:e.$t("admin.prop_reports.kpi_total_violations_lifetime"),value:s.kpis.total_violations,tone:"red"},null,8,["label","value"])]),t("div",R,[o(v,{title:e.$t("admin.prop_reports.chart_new_accounts_30d"),data:s.dailyAccounts,tone:"blue","value-key":"count"},null,8,["title","data"]),o(v,{title:e.$t("admin.prop_reports.chart_payouts_paid_30d"),data:s.dailyPayouts,tone:"emerald","value-key":"amount","is-money":!0},null,8,["title","data"]),o(v,{title:e.$t("admin.prop_reports.chart_violations_30d"),data:s.dailyViolations,tone:"red","value-key":"count"},null,8,["title","data"])]),t("div",z,[t("div",H,[t("div",E,[t("h2",I,a(e.$t("admin.prop_reports.funnel_title")),1),t("p",Q,a(e.$t("admin.prop_reports.funnel_subtitle")),1)]),t("div",W,[o(m,{label:e.$t("admin.prop_reports.funnel_enrolled"),value:s.funnel.enrolled,max:s.funnel.enrolled,tone:"blue"},null,8,["label","value","max"]),o(m,{label:e.$t("admin.prop_reports.funnel_active"),value:s.funnel.active,max:s.funnel.enrolled,tone:"indigo"},null,8,["label","value","max"]),o(m,{label:e.$t("admin.prop_reports.funnel_passed_phase_one"),value:s.funnel.passed_phase_one,max:s.funnel.enrolled,tone:"amber"},null,8,["label","value","max"]),o(m,{label:e.$t("admin.prop_reports.funnel_reached_funded"),value:s.funnel.reached_funded,max:s.funnel.enrolled,tone:"emerald"},null,8,["label","value","max"]),o(m,{label:e.$t("admin.prop_reports.funnel_failed"),value:s.funnel.failed,max:s.funnel.enrolled,tone:"red"},null,8,["label","value","max"])])]),t("div",q,[t("div",G,[t("h2",J,a(e.$t("admin.prop_reports.violations_by_type_title")),1),t("p",U,a(e.$t("admin.prop_reports.violations_by_type_subtitle")),1)]),t("ul",X,[(r(!0),n(c,null,b(s.violationTypes,l=>(r(),n("li",{key:l.type,class:"px-5 py-3 flex items-center justify-between"},[t("span",Y,a(i.violationTypeLabel(l.type)),1),t("span",Z,[t("div",ee,[t("div",{class:"h-full bg-red-500",style:y({width:i.pctOfMax(l.count,i.violationsMax)+"%"})},null,4)]),t("span",te,a(l.count),1)])]))),128)),s.violationTypes.length?h("",!0):(r(),n("li",ae,a(e.$t("admin.prop_reports.empty_violations")),1))])])]),t("div",se,[t("div",le,[t("h2",oe,a(e.$t("admin.prop_reports.top_traders_title")),1),t("p",re,a(e.$t("admin.prop_reports.top_traders_subtitle")),1)]),t("div",ne,[t("table",ie,[t("thead",de,[t("tr",null,[t("th",pe,a(e.$t("admin.prop_reports.col_rank")),1),t("th",ue,a(e.$t("admin.prop_reports.col_user_id")),1),t("th",_e,a(e.$t("admin.prop_reports.col_prop_account")),1),t("th",me,a(e.$t("admin.prop_reports.col_realized_pnl")),1)])]),t("tbody",ce,[(r(!0),n(c,null,b(s.topTraders,(l,x)=>(r(),n("tr",{key:x},[t("td",be,"#"+a(x+1),1),t("td",he,a(l.user_id),1),t("td",ve,a(l.prop_account_id),1),t("td",{class:f(["px-4 py-2 text-end tabular-nums font-bold",Number(l.pnl)>=0?"text-emerald-600":"text-red-600"])}
40,a(i.formatAmount(l.pnl)),3)]))),128)),s.topTraders.length?h("",!0):(r(),n("tr",xe,[t("td",ye,a(e.$t("admin.prop_reports.empty_funded_trades")),1)]))])])])]),t("div",fe,[t("div",ge,[t("h2",we,a(e.$t("admin.prop_reports.pass_rate_title")),1)]),t("div",ke,[t("table",Se,[t("thead",$e,[t("tr",null,[t("th",Ae,a(e.$t("admin.prop_reports.col_plan")),1),t("th",Ce,a(e.$t("admin.prop_reports.col_total_phases")),1),t("th",Le,a(e.$t("admin.prop_reports.col_passed")),1),t("th",Me,a(e.$t("admin.prop_reports.col_pass_rate")),1)])]),t("tbody",Ne,[(r(!0),n(c,null,b(s.passRate,l=>(r(),n("tr",{key:l.plan_id},[t("td",Te,a(l.plan_name),1),t("td",De,a(l.total),1),t("td",je,a(l.passed),1),t("td",Ke,[t("div",Ve,[t("div",Be,[t("div",{class:"h-full bg-emerald-500",style:y({width:l.pass_rate_pct+"%"})},null,4)]),t("span",Fe,a(l.pass_rate_pct)+"%",1)])])]))),128))])])])]),t("div",Pe,[t("div",Oe,[t("div",Re,[t("h2",ze,a(e.$t("admin.prop_reports.latest_payouts_title")),1)]),t("ul",He,[(r(!0),n(c,null,b(s.latestPayouts,l=>(r(),n("li",{key:l.id,class:"px-5 py-3 flex items-center justify-between"},[t("div",null,[t("div",Ee,a(l.user?.email||i.emDash),1),t("div",Ie,a(l.account?.plan?.name)+" · "+a(l.profit_split_pct_snapshot)+"%",1)]),t("div",Qe,[t("div",We,a(i.formatAmou
40nt(l.trader_share)),1),t("div",qe,a(i.payoutStatusLabel(l.status)),1)])]))),128)),s.latestPayouts.length?h("",!0):(r(),n("li",Ge,a(e.$t("admin.prop_reports.empty_payouts")),1))])]),t("div",Je,[t("div",Ue,[t("h2",Xe,a(e.$t("admin.prop_reports.latest_violations_title")),1)]),t("ul",Ye,[(r(!0),n(c,null,b(s.latestViolations,l=>(r(),n("li",{key:l.id,class:"px-5 py-3 flex items-center justify-between"},[t("div",null,[t("div",Ze,a(i.violationTypeLabel(l.violation_type)),1),t("div",et,a(l.account?.plan?.name)+" · "+a(i.formatDate(l.detected_at)),1)]),t("span",{class:f(["text-xs font-medium px-2 py-1 rounded-full",i.severityClass(l.severity)])},a(i.violationSeverityLabel(l.severity)),3)]))),128)),s.latestViolations.length?h("",!0):(r(),n("li",tt,a(e.$t("admin.prop_reports.empty_violations")),1))])])])])]),_:1})}const ct=C(K,[["render",at]]);export{ct as default}; 41//# sourceMappingURL=Index-i74cHe6m.js.map
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.