PageSourceSearch

https://app.withvayu.com/assets/RecurringRevenueReportPage-b0ea321f.js

js withvayu.com collected 2026-09-25 14:19:44 UTC 34,250 bytes, 1 lines download raw bytes

1import{o as Be,p as $e,r as s,j as r,t as Mt,ay as Nt,aZ as _t}from"./vendor-react-0b52e17d.js";import{aQ as St,H as Tt}from"./vendor-misc-60f9a457.js";import{u as Ge}from"./use-ai-copilot-fa211c3a.js";import{R as It,a as Dt}from"./ReportPage-8057dafd.js";import{q as _e,e as Ye,p as He,aC as Ee,c8 as ze,aA as Ot,B as q,aE as Ft,bN as wt,aB as Q,az as jt,Q as Lt,av as Ut,g as Vt,L as Se,a1 as Pt,a5 as H,$ as Te,w as kt,k as Wt}from"./app-core-d11f9ebf.js";import{gK as Bt,gL as $t,aU as Gt,am as Yt,E as oe,b as V,e_ as Ht,aV as ie,ep as Ke,eq as Xe,aJ as he,cl as Ie,n as K,d1 as ne,bZ as zt}from"./vendor-vy-3b44047f.js";import{b as qe,R as Kt,c as Xt,f as Qe,e as le,r as ce,d as Je,g as Ze,p as et,h as tt,i as nt,j as rt,k as qt,t as Qt,l as ee,m as se,n as Jt,u as Zt,a as en}from"./resolve-report-monthly-currency-d2be74d4.js";import{u as tn}from"./use-filters-param-e915f878.js";import{u as nn}from"./use-search-with-search-params-c8e8c99a.js";import{u as rn,c as an,b as on,M as sn,d as ln,e as cn,h as un,t as dn,i as mn,s as gn,g as hn,f as fn,v as Rn}from"./filter-field-builders-a40bb915.js";import{u as Cn}from"./use-labels-4d4a7529.js";import{a as pn,c as re}from"./option-collectors-1da5e27e.js";import{R as B}from"./chart-theme-024a5f89.js";import{a as xn,b as En,C as vn}from"./CellEditTooltipContent-025c7a7c.js";import{C as bn}from"./chart-panel-consts-1510fc7c.js";import{c as O,b7 as yn,bN as Re,bm as Y,b8 as An,bP as Mn,b6 as Nn,af as _n,bI as Sn,l as j,V as J,h as Ce,$ as pe,aS as De,J as fe,o as Tn,n as In,d as z,aa as Dn,aL as On,b as Oe,aH as Fn}from"./vendor-vy-ds-885d80cb.js";import{T as at}from"./report-table-consts-5838d7f7.js";import{bn as wn,E as jn,u as Ln}from"./vendor-mui-238acd1e.js";import{C as Un}from"./ContractStatusPill-8add0ee2.js";import{A as Fe}from"./AmountField-2e519c57.js";import{V as Vn}from"./VyTextareaField-fc08cf8e.js";import"./use-country-options-b4d34c7b.js";import{u as Pn}from"./use-vy-form-bea0b2b5.js";import{R as kn}from"./RevenueReportToolbar-f189599e.js";import"./AiCopilotProvider-1e5fad19.js";import"./VyLayout-ff2cba0b.js";import"./use-account-7dbbc7a8.js";import"./reference-data-query-options-consts-5095626a.js";import"./use-subsidiaries-9438a3e5.js";import"./use-descope-sdk-b1412f07.js";import"./breadcrumbs-context-d114e5ee.js";import"./breadcrumb-routes-3b4ebb59.js";import"./app-router-a49381be.js";import"./use-jobs-5c611126.js";import"./VyPageLayoutTabs-1805ce94.js";import"./page-frame-cbbf18ba.js";import"./apply-report-filters-2e4b1165.js";import"./use-state-params-0f9cef64.js";import"./use-catalog-products-list-5f86cccb.js";import"./use-meters-44d1580c.js";import"./picker-value-utils-370a432f.js";import"./use-trigger-report-job-d4493d34.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{};e.SENTRY_RELEASE={id:"2cd2d3d210c4"};var t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="117ae23b-3aca-4fb8-9342-1dc025f13dff",e._sentryDebugIdIdentifier="sentry-dbid-117ae23b-3aca-4fb8-9342-1dc025f13dff")}catch{}})();function Wn(e,t){return t==="monthly"?e:t==="quarterly"?we(e,$n):we(e,Gn)}function we(e,t){const o=new Map,n=[];for(const a of e){const c=t(a.label);let i=o.get(c);i||(i=qe(c),i.beginningMrr=a.beginningMrr,o.set(c,i),n.push(i)),i.new+=a.new,i.expansion+=a.expansion,i.reactivation+=a.reactivation,i.contraction+=a.contraction,i.churn+=a.churn,i.netNewMrr+=a.netNewMrr,i.endingMrr=a.endingMrr}return n}const Bn={Jan:1,Feb:1,Mar:1,Apr:2,May:2,Jun:2,Jul:3,Aug:3,Sep:3,Oct:4,Nov:4,Dec:4};function $n(e){const[t,o]=e.split(" "),n=Bn[t];return n?`Q${n} ${o}`:e}function Gn(e){const t=e.split(" ")[1];return t?t.length===2?`20${t}`:t:e}function Yn(e,t,o){if(e.length===0)return 0;const n=e[0],a=o.indexOf(n)-1;if(a<0)return 0;const c=o[a];let i=0;for(const l of t.values())i+=l.get(c)??0;return i}function Hn(e,t,o){const n=e.reduce((c,i)=>({new:c.new+i.new,expansion:c.expansion+i.expansion,reactivation:c.reactivation+i.reactivation,contraction:c.contraction+i.contraction,churn:c.churn+i.churn}
1),{new:0,expansion:0,reactivation:0,contraction:0,churn:0}),a=t+n.new+n.expansion+n.reactivation+n.contraction+n.churn;return{label:o,beginning:t,...n,ending:a}}function zn(e){let t=-1,o=-1;for(let c=0;c<e.length;c++)Kn(e[c])&&(t===-1&&(t=c),o=c);if(t===-1)return[];const n=Math.max(t-1,0),a=Math.min(o+2,e.length);return e.slice(n,a)}function Kn(e){return e.new!==0||e.expansion!==0||e.reactivation!==0||e.contraction!==0||e.churn!==0}function Xn({productId:e,periodMonth:t,amount:o,notes:n,applyToFollowingMonths:a}){return{productId:e,periodMonth:t,upsertRecurringRevenueCellOverrideRequest:{amount:o,notes:n,applyToFollowingMonths:a}}}function ot(){return[_e.recurringRevenueReport(),_e.recurringRevenue()]}function qn(e){const t=Be();return $e(async o=>{const n=Ye(),a=Xn(o),c=await n.upsertRecurringRevenueCellOverride(a);return He(Bt,c)},{...e,onSuccess:async(o,n,a)=>{var c;await Promise.all(ot().map(i=>t.invalidateQueries(i))),await((c=e==null?void 0:e.onSuccess)==null?void 0:c.call(e,o,n,a))}})}function Qn(e){const t=Be();return $e(async o=>{const a=await Ye().deleteRecurringRevenueCellOverride(o);return He($t,a)},{...e,onSuccess:async(o,n,a)=>{var c;await Promise.all(ot().map(i=>t.invalidateQueries(i))),await((c=e==null?void 0:e.onSuccess)==null?void 0:c.call(e,o,n,a))}})}function Jn(e){const{data:t}=Cn(),o=rn(e);return s.useMemo(()=>{const n=pn(e.map(d=>({id:d.customerId,name:d.customerName}))),a=re(e.map(d=>d.subsidiaryName??null)),c=re(e.map(d=>d.country??null)),i=re(e.map(d=>d.state??null)),l=re(e.map(d=>d.contractName??null)),g=new Set(e.flatMap(d=>(d.labels??[]).map(p=>p.id))),m=an(t==null?void 0:t.labels,g),u=[on(n),{id:Kt.Subsidiary,label:"Subsidiary",inputType:"select",operators:sn,options:a},ln(c),cn(i),o,un(l),dn(),mn(),gn(Xt),hn(m)];return fn(u)},[e,t,o])}const b=Object.freeze({EXPAND:"expand",CUSTOMER_NAME:"customerName",PRODUCT_NAME:"productName",SUBSIDIARY_NAME:"subsidiaryName",PARENT_NAME:"parentName",LABELS:"labels",CONTRACT_NAME:"contractName",CONTRACT_START_DATE:"contractStartDate",CONTRACT_END_DATE:"contractEndDate",CONTRACT_STATUS:"contractStatus",ORIGINAL_CURRENCY:"originalCurrency",CURRENT_MRR_ORIGINAL_CURRENCY:"currentMrrInOriginalCurrency",EXCHANGE_RATE:"exchangeRate",CURRENT_MRR_USD:"currentMrrUsd",TOTAL_ARR_USD:"totalArrUsd",CONTRACT_ID:"contractId"}),ve=new Set(Object.values(b)),Zn=/^[A-Za-z]{3} \d{4}$/;function it(e){if(e.length===0)return{customerFieldKeys:[],contractFieldKeys:[]};const t=e[0],o=Array.isArray(t.customerCustomFieldOrder)?t.customerCustomFieldOrder:void 0,n=Array.isArray(t.contractCustomFieldOrder)?t.contractCustomFieldOrder:void 0;if(o&&n)return{customerFieldKeys:o.slice(),contractFieldKeys:n.slice()};const a=new Set,c=new Set;for(const i of e)for(const l of Object.keys(i))if(!l.startsWith("__")&&!ve.has(l)&&!Zn.test(l)){if(n!=null&&n.includes(l)){c.add(l);continue}a.add(l)}return{customerFieldKeys:Array.from(a).sort(),contractFieldKeys:Array.from(c).sort()}}function st(e,t,o){return Qe(e,t??null,o??null)}const te=12;function lt(e){return e==="arr"?te:1}const je='"$"#,##0.00;[Red]"-$"#,##0.00',er="#,##0.00;[Red]-#,##0.00",Le="mm/dd/yyyy";function tr(e){return`"${e}"#,##0.00;[Red]"-${e}"#,##0.00`}function nr(e,t){for(const i of e.worksheets)e.removeWorksheet(i.id);const o=le(t.filteredReport),n=st(o,t.fromDate,t.toDate),a=t.viewMode==="arr"?te:1,c=ce(t.filteredReport);rr(e,t.filteredReport,n,a,t.visibleFields,c,t.productLabels)}function rr(e,t,o,n,a,c,i){const l=e.addWorksheet("ARR MRR"),{customerFieldKeys:g,contractFieldKeys:m}=it(t),u=ar(g,m).filter(h=>h.alwaysOn||h.field!=null&&a.has(h.field)),d=tr(Gt(c)),p=o.map(h=>({header:h,numFmt:d,getValue:y=>Je(y,h)*n})),E=[...u,...p],M=E.map(h=>h.header);l.addRow(M),lr(l,1),l.views=[{state:"frozen",xSplit:u.length,ySplit:1}];for(const h of Ze(t,i)){const y=l.addRow(E.map(I=>I.getValue(h)));cr(y,E)}ur(l,M)}function ar(e,t){const o=a=>({field:a,header:a,getValue:c=>sr(c,a)}),n=b;return[{field:n.CUSTOMER_NAME,header:"Customer",alwaysOn:!0,getValue:a=>G(a.customerName)},{field:n.CONTRACT_NAME,header:"Contract",getValue:a=>a.contractName||G(a.customerName)}
1,{field:n.PRODUCT_NAME,header:"Product",getValue:a=>a.productName},{field:n.SUBSIDIARY_NAME,header:"Subsidiary",getValue:a=>G(a.subsidiaryName)},{field:n.PARENT_NAME,header:"Parent name",getValue:a=>G(a.parentName)},...e.map(o),{field:n.LABELS,header:"Labels",getValue:ir},{field:n.CONTRACT_ID,header:"Contract ID",getValue:a=>G(a.contractId)},{field:n.CONTRACT_START_DATE,header:"Contract start date",numFmt:Le,getValue:a=>Ue(a.contractStartDate)},{field:n.CONTRACT_END_DATE,header:"Contract end date",numFmt:Le,getValue:a=>Ue(a.contractEndDate)},{field:n.CONTRACT_STATUS,header:"Contract status",getValue:a=>G(a.contractStatus)},...t.map(o),{field:n.ORIGINAL_CURRENCY,header:"Original currency",getValue:a=>G(a.originalCurrency)},{field:n.CURRENT_MRR_ORIGINAL_CURRENCY,header:"Current MRR (original currency)",numFmt:er,getValue:a=>a.currentMrrInOriginalCurrency},{field:n.EXCHANGE_RATE,header:"Exchange rate to $",getValue:a=>or(a.exchangeRate)},{field:n.CURRENT_MRR_USD,header:"Current MRR $",numFmt:je,getValue:a=>a.currentMrrUsd},{field:n.TOTAL_ARR_USD,header:"Total ARR $",alwaysOn:!0,numFmt:je,getValue:a=>a.totalArrUsd}]}function G(e){return e===null||typeof e>"u"?"":String(e)}function or(e){return typeof e=="number"?e:null}function ir(e){const t=e.labels;return(t==null?void 0:t.map(o=>o.name).join(", "))??""}function Ue(e){if(!e)return null;const t=new Date(e);return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate()))}function sr(e,t){const o=e[t];return o===null||typeof o>"u"||o===""?null:String(o)}function lr(e,t){const o=e.getRow(t);o.font={bold:!0},o.alignment={vertical:"middle",horizontal:"center"},o.commit()}function cr(e,t){t.forEach((o,n)=>{o.numFmt&&(e.getCell(n+1).numFmt=o.numFmt)})}function ur(e,t){for(const[o,n]of t.entries()){const a=e.getColumn(o+1);a.width=Math.max(14,n.length+4)}}const L=Object.freeze({Beginning:"beginning",Mrr:"mrr",New:"new",Expansion:"expansion",Reactivation:"reactivation",Contraction:"contraction",Churn:"churn",Ending:"ending",NetNewMrr:"netNewMrr"}),x=Object.freeze({beginning:B.beginning,mrr:B.endingMrr,new:B.new,expansion:B.expansion,reactivation:B.reactivation,contraction:B.contraction,churn:B.churn,ending:B.ending,netNewMrr:B.netNew});function ct(e,t){return xn(e,t,({customerName:o,parentName:n,contractName:a})=>[o,n,a])}function dr({filteredReport:e,fromDate:t,toDate:o,periodMode:n,viewMode:a,valueMode:c,searchText:i}){const l=s.useMemo(()=>ct(e,i),[e,i]),g=s.useMemo(()=>le(l),[l]),m=s.useMemo(()=>et(l,g),[l,g]),u=s.useMemo(()=>tt(m),[m]),d=s.useMemo(()=>nt(m,g),[m,g]),p=s.useMemo(()=>rt(d,u,g),[d,u,g]),E=s.useMemo(()=>Qe(g,t??null,o??null),[g,t,o]),M=s.useMemo(()=>E.map(h=>p.get(h)??qe(qt(h))),[E,p]);return s.useMemo(()=>{const h=c==="arr"?te:1;if(a==="bridge"){const I=Yn(E,d,g),D=hr(M);return{mode:"waterfall",data:gr(Hn(M,I,D),h)}}const y=Wn(M,n);return{mode:"timeseries",data:zn(y).map(I=>mr(I,h))}},[a,c,M,E,n,d,g])}function mr(e,t){return{label:e.label,new:e.new*t,expansion:e.expansion*t,reactivation:e.reactivation*t,contraction:e.contraction*t,churn:e.churn*t,netNewMrr:e.netNewMrr*t,beginningMrr:e.beginningMrr*t,endingMrr:e.endingMrr*t}}function gr(e,t){return{label:e.label,beginning:e.beginning*t,new:e.new*t,expansion:e.expansion*t,reactivation:e.reactivation*t,contraction:e.contraction*t,churn:e.churn*t,ending:e.ending*t}}function hr(e){return e.length===0?"":e.length===1?e[0].label:`${e[0].label} – ${e[e.length-1].label}`}const be=257,Ve="rgba(0,0,0,0)",Pe=e=>-Math.abs(e),fr=({filteredReport:e,fromDate:t,toDate:o,periodMode:n,onPeriodModeChange:a,valueMode:c,searchText:i})=>{const[l,g]=s.useState("breakdown"),m=c.toUpperCase(),u=`Beginning ${m}`,d=s.useMemo(()=>ce(e),[e]),p=dr({filteredReport:e,fromDate:t,toDate:o,periodMode:n,viewMode:l,valueMode:c,searchText:i}),E=s.useCallback((I,D)=>{D&&a(D)},[a]),M=s.useCallback((I,D)=>{D&&g(D)},[]),h=p.mode==="timeseries"?p.data.length===0:!1,y=p.mode==="waterfall"?yr:[{label:u,color:x.mrr},...br];return r.jsx(O,{sx:bn,children:r.jsx(yn,{headerStart:r.jsxs(Re,{value:l,exclusive:!0,onChange:M,size:"medium",children:[r.jsx(Y,{value:"breakdown",children:"Breakdown"}),r.jsx(Y,{value:"bridge",children:"Bridge"})]}),headerEnd:l==="breakdown"?r.jsxs(Re,{value:n,exclusive:!0,onChange:E,size:"medium",children:[r.jsx(Y,{value:"monthly",children:"Monthly"}),r.jsx(Y,{value:"quarterly",children:"Quarterly"}),r.jsx(Y,{value:"annual",children:"Annual"})]}):void 0,legend:y,legendPlacement:"side",isEmpty:h,emptyMessage:`No ${m} movement data for the selected filters`,plotHeight:be,children:p.mode==="waterfall"?r.jsx(vr,{data:p.data,currency:d}):r.jsx(xr,{data:p.data,currency:d,beginningLabel:u})})})},Rr=[{id:"movements",width:Nn,valueFormatter:ze}],Cr={left:50,top:10,right:20,bottom:30},pr={"& .MuiBarElement-series-new, & .MuiBarElement-series-contraction":{clipPath:"inset(0 round 0 0 4px 4px)"}},xr=({data:e,currency:t,beginningLabel:o})=>{const n=s.useCallback(i=>Ee(t,i,0),[t]),a=s.useMemo(()=>e.map(i=>i.label),[e]),c=s.useMemo(()=>{const i=e.map(u=>u.beginningMrr),l=e.map(u=>Math.abs(u.contraction)),g=e.map(u=>Math.abs(u.churn)),m=e.map(u=>Math.max(0,u.beginningMrr-Math.abs(u.contraction)-Math.abs(u.churn)));return[{id:L.Mrr,type:"bar",stack:"mrr",yAxisId:"movements",data:i,label:o,color:x.mrr},{id:"positives-spacer",type:"bar",stack:"positives",yAxisId:"movements",data:i,label:"",color:Ve,excludeFromTooltip:!0},{id:L.New,type:"bar",stack:"positives",yAxisId:"movements",data:e.map(u=>u.new),label:"New",color:x.new},{id:L.Expansion,type:"bar",stack:"positives",yAxisId:"movements",data:e.map(u=>u.expansion),label:"Expansion",color:x.expansion},{id:L.Reactivation,type:"bar",stack:"positives",yAxisId:"movements",data:e.map(u=>u.reactivation),label:"Reactivation",color:x.reactivation},{id:"negatives-spacer",type:"bar",stack:"negatives",yAxisId:"movements",data:m,label:"",color:Ve,excludeFromTooltip:!0}
1,{id:L.Contraction,type:"bar",stack:"negatives",yAxisId:"movements",data:l,label:"Contraction",color:x.contraction,toDisplayValue:Pe},{id:L.Churn,type:"bar",stack:"negatives",yAxisId:"movements",data:g,label:"Churn",color:x.churn,toDisplayValue:Pe}]},[e,o]);return r.jsx(An,{xLabels:a,series:c,yAxes:Rr,height:be,margin:Cr,referenceLineY:0,formatTooltipValue:n,sx:pr})},Er={left:50,top:30,right:20,bottom:30},vr=({data:e,currency:t})=>{const o=s.useCallback(a=>Ee(t,a,0),[t]),n=s.useMemo(()=>[{id:L.Beginning,label:"Beginning",color:x.beginning,value:e.beginning,isTotal:!0},{id:L.New,label:"New",color:x.new,value:e.new},{id:L.Expansion,label:"Expansion",color:x.expansion,value:e.expansion},{id:L.Reactivation,label:"Reactivation",color:x.reactivation,value:e.reactivation},{id:L.Contraction,label:"Contraction",color:x.contraction,value:e.contraction},{id:L.Churn,label:"Churn",color:x.churn,value:e.churn},{id:L.Ending,label:"Ending",color:x.ending,value:e.ending,isTotal:!0}],[e]);return r.jsx(Mn,{items:n,formatValue:o,axisValueFormatter:ze,height:be,margin:Er})},br=[{label:"New",color:x.new},{label:"Expansion",color:x.expansion},{label:"Reactivation",color:x.reactivation},{label:"Contraction",color:x.contraction},{label:"Churn",color:x.churn}],yr=[{label:"Beginning",color:x.beginning},{label:"New",color:x.new},{label:"Expansion",color:x.expansion},{label:"Reactivation",color:x.reactivation},{label:"Contraction",color:x.contraction},{label:"Churn",color:x.churn},{label:"Ending",color:x.ending}],ke=8,Ar=200,Mr=({labels:e})=>r.jsx(O,{direction:"row",sx:{gap:.5,alignItems:"center",flexWrap:"nowrap",overflowX:"auto",scrollbarWidth:"none","&::-webkit-scrollbar":{display:"none"}},children:e.map(t=>r.jsx(_n,{size:"small",variant:"outlined",sx:{maxWidth:Ar},label:r.jsxs(O,{direction:"row",sx:{alignItems:"center",gap:1,minWidth:0},children:[r.jsx(O,{sx:{width:ke,height:ke,borderRadius:"50%",flexShrink:0,backgroundColor:t.color}}),r.jsx(Sn,{children:t.name})]})},t.id))});function Nr(e,t,o,n){var a;return{title:`${e.productName} · ${t}`,initialAmount:Qt(((a=e.__naturalMonthlyValues)==null?void 0:a[t])??0,o),newAmount:ee(e,t,o),attribution:En({editedAt:new Date(n.editedAt),editedBy:n.editedBy,notes:n.notes},void 0),notes:Yt(n.notes)}}const Z={Edited:"edited",Adjusted:"adjusted",None:"none"};function _r(e,t){const o=e.__cellEdits??{};if(oe(o[t]))return Z.Edited;const n=se(t);return Object.entries(o).some(([c,i])=>i.singleMonth!==!0&&se(c)<n)?Z.Adjusted:Z.None}function Sr(e,t){var o;return oe(e.__productId)&&oe((o=e.__naturalMonthlyValues)==null?void 0:o[t])}const xe="__totals_child_";function ut(e){return e.contractId===at}function ue(e){return e.contractId.startsWith(xe)}function w(e){return ut(e)||ue(e)}const dt="month-",ae="vy-recurring-revenue-month-column",mt="vy-recurring-revenue-edited-cell",gt="vy-recurring-revenue-adjusted-cell";function Tr(e,t){const o=_r(e,t);return o===Z.Edited?`${ae} ${mt}`:o===Z.Adjusted?`${ae} ${gt}`:ae}const ht=le,ft=new Set([b.EXPAND,b.CUSTOMER_NAME]),Ir=ft.size,Dr=new Set([b.PRODUCT_NAME,b.CONTRACT_NAME,b.CURRENT_MRR_USD,b.LABELS]),Or=Object.values(b).filter(e=>!ft.has(e)&&!Dr.has(e)),We="Jump to start date";function Fr(e,t,o){return{field:b.CUSTOMER_NAME,headerName:"Customer",flex:1.3,minWidth:220,headerAlign:"left",align:"left",valueGetter:(n,a)=>a.customerName,renderCell:({row:n})=>{if(ue(n))return r.jsx(O,{sx:{ml:"50%",minWidth:0,width:"100%"},children:r.jsx(j,{value:n.customerName,align:"left"})});if(ut(n)){const{__isExpanded:i,__toggleExpand:l}=n;return r.jsxs(O,{direction:"row",sx:{display:"flex",alignItems:"center",gap:.5,width:"100%"},children:[r.jsx(pe,{size:"small",onClick:l,children:i?r.jsx(wn,{fontSize:"small"}):r.jsx(jn,{fontSize:"small"})}),r.jsx(O,{sx:{flex:1,minWidth:0},children:r.jsx(j,{value:r.jsx("strong",{children:n.customerName}),align:"left"})})]})}const a=r.jsx(jt,{customerId:n.customerId,name:n.customerName});return V(o)||!e.some(i=>ee(n,i,t)>0)?a:r.jsxs(O,{direction:"row",sx:{alignItems:"center",gap:.5,width:"100%",minWidth:0},children:[r.jsx(O,{sx:{flex:1,minWidth:0},children:a}),r.jsx(Ce,{title:We,children:r.jsx(pe,{size:"small","aria-label":We,onClick:i=>{i.stopPropagation(),o(n)},sx:{flexShrink:0},"data-vy":"recurring-revenue-report-locate-first-revenue",children:r.jsx(J,{icon:"ArrowSmallRight",width:De,he
1ight:De})})})]})}}}const wr=[{field:b.CONTRACT_NAME,headerName:"Contract",flex:1,minWidth:200,headerAlign:"left",align:"left",valueGetter:(e,t)=>w(t)?null:t.contractName||"",renderCell:({row:e})=>w(e)?null:r.jsx(Ot,{contractId:e.contractId,name:e.contractName||"--"})},{field:b.PRODUCT_NAME,headerName:"Product",flex:1,minWidth:200,headerAlign:"left",align:"left",valueGetter:(e,t)=>w(t)?null:t.productName,renderCell:({row:e})=>w(e)?null:r.jsx(j,{value:e.productName||"--",align:"left"})},{field:b.SUBSIDIARY_NAME,headerName:"Subsidiary",flex:1,minWidth:180,headerAlign:"left",align:"left",renderCell:({row:e})=>w(e)?null:r.jsx(j,{value:V(e.subsidiaryName)?"--":e.subsidiaryName,align:"left"})},{field:b.PARENT_NAME,headerName:"Parent name",flex:1,minWidth:200,headerAlign:"left",align:"left",renderCell:({row:e})=>w(e)?null:r.jsx(j,{value:V(e.parentName)?"--":e.parentName,align:"left"})},{field:b.LABELS,headerName:"Labels",flex:1,minWidth:180,headerAlign:"left",align:"left",sortable:!1,renderCell:({row:e})=>{if(w(e))return null;const t=e.labels;return!t||t.length===0?r.jsx(j,{value:"--",align:"left"}):r.jsx(Mr,{labels:t})},valueGetter:(e,t)=>{const o=t.labels;return(o==null?void 0:o.map(n=>n.name).join(", "))??""}},{field:b.CONTRACT_ID,headerName:"Contract ID",flex:.8,minWidth:140,headerAlign:"left",align:"left",valueGetter:(e,t)=>w(t)?null:t.contractId,renderCell:({row:e})=>{if(w(e))return null;const t=V(e.contractId)?"--":Ht(e.contractId,5);return r.jsx(j,{value:t,align:"left"})}},{field:b.CONTRACT_START_DATE,headerName:"Contract start date",flex:1,minWidth:160,headerAlign:"left",align:"left",valueGetter:(e,t)=>w(t)?null:new Date(t.contractStartDate),renderCell:({row:e})=>w(e)?null:q(new Date(e.contractStartDate)),valueFormatter:e=>e?q(e):"",sortComparator:Ft},{field:b.CONTRACT_END_DATE,headerName:"Contract end date",flex:1,minWidth:160,headerAlign:"left",align:"left",valueGetter:(e,t)=>w(t)||V(t.contractEndDate)?null:new Date(t.contractEndDate),renderCell:({row:e})=>w(e)?null:V(e.contractEndDate)?"--":q(new Date(e.contractEndDate)),valueFormatter:e=>e?q(e):"",sortComparator:wt},{field:b.CONTRACT_STATUS,headerName:"Contract status",flex:1,minWidth:180,headerAlign:"left",align:"left",renderCell:({row:e})=>w(e)?null:r.jsx(Un,{status:e.contractStatus,endDate:V(e.contractEndDate)?void 0:new Date(e.contractEndDate)})},{field:b.ORIGINAL_CURRENCY,headerName:"Original currency",flex:.8,minWidth:140,headerAlign:"left",align:"left",renderCell:({row:e})=>w(e)?null:r.jsx(j,{value:e.originalCurrency})},{field:b.CURRENT_MRR_ORIGINAL_CURRENCY,headerName:"Current MRR (original currency)",flex:1.2,minWidth:220,headerAlign:"left",align:"left",renderCell:({row:e})=>w(e)?null:r.jsx(j,{value:Ee(e.originalCurrency,e.currentMrrInOriginalCurrency),align:"left"}),valueFormatter:e=>Q(Number(e??0),2)},{field:b.EXCHANGE_RATE,headerName:"Exchange rate to $",flex:1,minWidth:180,headerAlign:"left",align:"left",renderCell:({row:e})=>w(e)?null:r.jsx(j,{value:V(e.exchangeRate)?"--":Q(e.exchangeRate,4),align:"left"}),valueFormatter:e=>V(e)?"":Q(Number(e??0),4)},{field:b.CURRENT_MRR_USD,headerName:"Current MRR $",flex:1,minWidth:180,headerAlign:"left",align:"left",renderCell:({row:e})=>ue(e)?null:r.jsx(j,{value:ie(Ke(e.currentMrrUsd,Xe),"USD"),align:"left"}),valueFormatter:e=>Q(Number(e??0),2)}];function jr(e,t,o,n="arr",a,c,i){const l=lt(n),{customerFieldKeys:g,contractFieldKeys:m}=s.useMemo(()=>it(e),[e]),u=s.useMemo(()=>ht(e),[e]),d=s.useMemo(()=>st(u,t,o),[u,t,o]),p=s.useCallback(f=>({row:A})=>{const N=A[f],R=N===null||typeof N>"u"||N===""?"--":String(N);return r.jsx(j,{value:R,align:"left"})},[]),E=s.useCallback(f=>f.map(A=>({field:A,headerName:A,flex:1,minWidth:180,headerAlign:"left",align:"left",renderCell:p(A)})),[p]),M=s.useMemo(()=>E(g),[E,g]),h=s.useMemo(()=>E(m),[E,m]),y=s.useMemo(()=>ce(e),[e]),I=s.useCallback(f=>({row:A})=>{var _;const N=ee(A,f,l);if(ue(A))return N===0?r.jsx(j,{value:"--",align:"left"}):r.jsx(j,{value:ie(N,y),align:"left"});const R=ie(N,y),v=!V(a)&&Sr(A,f),U=(_=A.__cellEdits)==null?void 0:_[f],S=v?r.jsx(j,{value:R,align:"left",hoverAffordance:r.jsx(J,{icon:"Edit2"}),onClick:C=>{C.stopPropagation(),a==null||a(A,f)},"data-vy":"recurring-revenue-report-cell-edit-trigger"}):r.jsx(j,{value:R,align:"left"});return V(U)?S:r.jsxs(O,{sx:{flexDirection:"row",alignItems:"center",gap:.5,width:"100%"},children:[!V(c)&&r.jsx(Ce,{title:"Revert to the calculated amount",children:r.jsx(pe,{size:"small","aria-label":"Revert to the calculated amount",onClick:C=>{C.stopPropagation(),c(A,f)},"data-vy":"recurring-revenue-report-cell-revert",children:r.jsx(J,{icon:"Revert"})})}),r.jsx(Ce,{title:r.jsx(vn,{content:Nr(A,f,l,U),currency:y}),children:r.jsx(O,{component:"span",tabIndex:0,sx:{cursor:"help",display:"inline-flex",alignItems:"center"},"data-vy":"recurring-revenue-report-cell-edit-info",children:r.jsx(J,{icon:"InfoCircle",fontSize:"small"})})}),S]})},[l,y,a,c]),D=s.useMemo(()=>d.map(f=>({field:Lr(f),headerName:f,flex:1,minWidth:160,type:"number",headerAlign:"left",align:"left",valueGetter:(N,R)=>ee(R,f,l),valueFormatter:N=>
1Q(Number(N??0),2),headerClassName:ae,cellClassName:({row:N})=>Tr(N,f),renderCell:I(f)})),[d,I,l]);return s.useMemo(()=>{const f=[Fr(u,l,i),...wr],A=f.findIndex(S=>S.field===b.PARENT_NAME),N=f.findIndex(S=>S.field===b.CONTRACT_STATUS),R=A>=0?f.slice(0,A+1):f,v=A>=0&&N>=0?f.slice(A+1,N+1):[],U=N>=0?f.slice(N+1):[];return[...R,...M,...v,...h,...U,...D]},[M,h,D,u,l,i])}function Lr(e){return`${dt}${e.toLowerCase().replace(/\s+/g,"-")}`}const Ur=[25,50,100,500],Vr=100,Pr={[`& .${mt}`]:{backgroundColor:fe.orange[100],boxShadow:`inset 2px 0 0 ${fe.orange[500]}`},[`& .${gt}`]:{backgroundColor:fe.orange[50]}},kr=[{key:"new",label:"New"},{key:"expansion",label:"Expansion"},{key:"contraction",label:"Contraction"},{key:"churn",label:"Churn"},{key:"reactivation",label:"Reactivation"}],Wr=({filteredReport:e,expandedRows:t,columns:o,searchText:n,isLoading:a,apiRef:c,productLabels:i})=>{const l=s.useMemo(()=>ct(e,n),[e,n]),g=s.useMemo(()=>l===e?t:Ze(l,i),[l,e,t,i]),m=s.useMemo(()=>ht(l),[l]),u=s.useMemo(()=>{const R=he(l,S=>S.currentMrrUsd),v=he(l,S=>S.totalArrUsd),U=m.reduce((S,_)=>(S[_]=he(l,C=>Je(C,_)),S),{});return{contractId:at,customerName:"Total",subsidiaryName:null,parentName:null,contractName:"",contractStartDate:"1970-01-01",contractEndDate:null,contractStatus:"Active",originalCurrency:Ie,currentMrrInOriginalCurrency:0,exchangeRate:null,currentMrrUsd:R,totalArrUsd:v,...U}},[l,m]),[d,p]=s.useState(!1),E=s.useCallback(()=>p(R=>!R),[]),M=s.useMemo(()=>{const R=et(l,m),v=tt(R),U=nt(R,m);return rt(U,v,m)},[l,m]),h=s.useMemo(()=>kr.map(({key:R,label:v},U)=>{const S=m.reduce((_,C)=>{const P=M.get(C);if(!P)return _[C]=0,_;switch(R){case"new":_[C]=P.new;break;case"expansion":_[C]=P.expansion;break;case"reactivation":_[C]=P.reactivation;break;case"contraction":_[C]=P.contraction;break;case"churn":_[C]=P.churn;break;default:_[C]=0}return _},{});return{contractId:`${xe}${U}`,customerName:v,subsidiaryName:null,parentName:null,contractName:"",contractStartDate:"1970-01-01",contractEndDate:null,contractStatus:"Active",originalCurrency:Ie,currentMrrInOriginalCurrency:0,exchangeRate:null,currentMrrUsd:0,totalArrUsd:0,...S}}),[m,M]),y=s.useMemo(()=>({...u,__isExpanded:d,__toggleExpand:E}),[u,d,E]),I=s.useMemo(()=>({bottom:d?[y,...h]:[y]}),[y,d,h]),D=s.useCallback(R=>R.id??R.contractId,[]),f=s.useMemo(()=>({left:["customerName"]}),[]),A=s.useMemo(()=>{const R=o.map(v=>v.field).filter(v=>!ve.has(v)&&!v.startsWith(dt));return Object.fromEntries([...Or,...R].map(v=>[v,!1]))},[o]),N=s.useCallback(R=>R.row.contractId.startsWith(xe)?"vy-child-row":"",[]);return r.jsx(Tn,{apiRef:c,columns:o,rows:g,loading:a,getRowId:D,getRowClassName:N,pinnedRows:I,pinnedColumns:f,pagination:!0,paginationMode:"client",pageSizeOptions:Ur,initialState:{pagination:{paginationModel:{pageSize:Vr}},columns:{columnVisibilityModel:A}},slots:{loadingOverlay:Lt},sx:Pr})},Br=Mt({notes:Nt().max(500).optional()}),$r=({target:e,reportCurrency:t,onClose:o,onSubmit:n,isSubmitting:a=!1})=>{const c=Pn({schema:Br,defaultValues:{notes:void 0}}),i=(e==null?void 0:e.row.originalCurrency)??t,l=K(e)?0:Jt(e.row,e.monthKey,te),[g,m]=s.useState(l),[u,d]=s.useState(!0);s.useEffect(()=>{m(l),d(!0),c.reset()},[l,e==null?void 0:e.monthKey,e==null?void 0:e.row.id]);const p=()=>{c.reset(),o()},E=c.handleSubmit(async I=>{K(e)||await(n==null?void 0:n(e,g,I.notes,u))}),M=(e==null?void 0:e.row.productName)??"this product",h=(e==null?void 0:e.monthKey)??"",y=g===l;return r.jsx(In,{open:e!==null,onClose:p,title:"Override ARR",fullWidth:!0,children:r.jsx(St,{...c,children:r.jsxs("form",{onSubmit:E,children:[r.jsxs(O,{sx:{gap:2},children:[r.jsxs(O,{sx:{flexDirection:"row",alignItems:"center",gap:1},children:[r.jsx(J,{icon:"ProductCube"}),r.jsx(z,{variant:"labelL",children:`${M} - ${h}`})]}),r.jsxs(O,{sx:{flexDirection:"row",gap:2,alignItems:"flex-end"},children:[r.jsxs(O,{sx:{flex:1,gap:.5},children:[r.jsx(z,{variant:"caption",children:`Initial ARR (${i})`}),r.jsx(Fe,{amount:l,currency:i,disabled:!0,dataVy:"edit-recurring-revenue-cell-dialog-current",onAmountChange:()=>{}})]}),r.jsxs(O,{sx:{flex:1,gap:.5},children:[r.jsx(z,{variant:"caption",children:`New ARR (${i})`}),r.jsx(Fe,{amount:g,currency:i,dataVy:"edit-recurring-revenue-cell-dialog-amount",onAmountChange:m})]})]}),r.jsx(z,{variant:"caption","data-vy":"edit-recurring-revenue-cell-dialog-mrr",children:`Monthly (MRR): ${ie(Ke(g/te,Xe),i)}`}),i!==t&&r.jsx(z,{variant:"caption","data-vy":"edit-recurring-revenue-cell-dialog-currency-hint",children:`Entered in the contract currency (${i}). The report shows ${t}.`}),r.jsx(Vn,{name:"notes",label:"Notes",placeholder:"Enter notes about your override",minRows:3,"data-vy":"edit-recurring-revenue-cell-dialog-notes"}),r.jsx("label",{style:{cursor:"pointer",display:"inline-flex",alignItems:"center"},children:r.jsxs(O,{sx:{flexDirection:"row",alignItems:"center",gap:1},children:[r.jsx(Dn,{checked:u,onChange:I=>d(I.target.checked),"data-vy":"edit-recurring-revenue-cell-dialog-forward"}),r.jsx(z,{variant:"body1",children:"Apply the new ARR to all following months"})]})})]}),r.jsxs(On,{children:[r.jsx(Oe,{emphasis:"tertiary",onClick:p,"data-vy":"edit-recurring-revenue-cell-dialog-cancel",children:"Cancel"}),r.jsx(Oe,{type:"submit",emphasis:"primary",disabled:c.formState.isSubmitting||a||y,"data-vy":"edit-recurring-revenue-cell-dialog-confirm",children:"Save"})]})]})})})},Gr=({onSearchChange:e,searchValue:t,fromDate:o,onFromDateChange:n,toDate:a,onToDateChange:c,filterFields:i,filters:l,onFiltersChange:g,showChart:m,onShowChartChange:u,viewM
1ode:d,onViewModeChange:p,apiRef:E,columns:M,excludedColumnFields:h})=>{const y=r.jsxs(r.Fragment,{children:[r.jsxs(Re,{value:d,exclusive:!0,onChange:(I,D)=>{D&&p(D)},"data-vy":"recurring-revenue-report-arr-mrr-toggle",children:[r.jsx(Y,{value:"arr",children:"ARR"}),r.jsx(Y,{value:"mrr",children:"MRR"})]}),r.jsx(Ut,{apiRef:E,columns:M,excludedFields:h,mandatoryColumnsCount:Ir,buttonDataVy:"recurring-revenue-report-column-settings"})]});return r.jsx(kn,{search:{value:t??"",onChange:e},date:{from:o,onFromChange:n,to:a,onToChange:c},filters:{fields:i,lines:l,onChange:g},chartToggle:{show:m,onChange:u},trailingActions:y})},Yr="recurringRevenueFilters",Hr=[],zr=({reportId:e})=>{const{data:t,isLoading:o}=Zt(e),[n,a]=nn(),c=s.useDeferredValue(n),{report:i}=t,l=Ln(),g=Jn(i),m=Rn(),[u,d]=tn(Yr,g),p=u??Hr,E=s.useMemo(()=>ne().subtract(11,"month").startOf("month").toDate(),[]),M=s.useMemo(()=>ne().endOf("month").toDate(),[]),[h,y]=s.useState(E),[I,D]=s.useState(M),[f,A]=s.useState(!1),[N,R]=s.useState("monthly"),[v,U]=s.useState(()=>Vt(Se.ArrMrrReportViewMode)==="mrr"?"mrr":"arr");s.useEffect(()=>{Pt(Se.ArrMrrReportViewMode,v)},[v]);const S=h??E,_=I??M,{bundle:C,error:P,isAggregating:ye}=en({report:i,filters:p,productLabels:m});s.useEffect(()=>{P&&(console.error("[recurring-revenue] aggregation worker failed",P),H("error",`Failed to compute recurring revenue report: ${P}`))},[P]);const[Rt,de]=s.useState(null),me=qn(),Ae=Qn(),Ct=s.useMemo(()=>ce(i),[i]),pt=s.useCallback((T,F)=>{de({row:T,monthKey:F})},[]),xt=s.useCallback(()=>de(null),[]),Et=s.useCallback(async(T,F,W,k)=>{const $=T.row.__productId;K($)||await Te(me,{productId:$,periodMonth:se(T.monthKey),amount:F,notes:W,applyToFollowingMonths:k},{pending:"Updating ARR...",success:`${T.monthKey} ARR updated`,error:"Failed to update ARR"},{onSuccess:()=>de(null)})},[me]),vt=s.useCallback(async(T,F)=>{const W=T.__productId;K(W)||await Te(Ae,{productId:W,periodMonth:se(F)},{pending:"Reverting ARR...",success:`${F} ARR reverted`,error:"Failed to revert ARR"})},[Ae]),[ge,Me]=s.useState(null),bt=s.useCallback(T=>{const F=lt(v),W=le(i).find($=>ee(T,$,F)>0);if(K(W))return;const k=ne(W,{format:"MMM YYYY",keepLocalTime:!0});y(k.toDate()),k.startOf("month").isAfter(ne(_).startOf("month"))&&D(k.endOf("month").toDate()),Me(T.id)},[i,v,_]),Ne=e===void 0,X=jr(i,S,_,v,Ne?pt:void 0,Ne?vt:void 0,bt);s.useEffect(()=>{if(K(ge))return;const T=l.current;if(oe(T)){T.scroll({left:0});const F=T.getRowIndexRelativeToVisibleRows(ge);F>=0&&T.scrollToIndexes({rowIndex:F})}Me(null)},[ge,X,l]);const yt=s.useMemo(()=>X.filter(F=>!ve.has(F.field)).map(F=>F.field),[X]),At=()=>{var W;if(!C){H("error","Report is still loading — please try again in a moment");return}if(!((W=l.current)!=null&&W.exportDataAsExcel)){console.error("[recurring-revenue] exportDataAsExcel not available on apiRef"),H("error","Excel export unavailable");return}const T=`ARR / MRR report ${q(zt())}`,F=new Set(l.current.getVisibleColumns().map(k=>k.field));try{const k=l.current.exportDataAsExcel({fileName:T,exceljsPostProcess:async $=>{nr($.workbook,{filteredReport:C.filteredReport,fromDate:S,toDate:_,viewM
1ode:v,visibleFields:F,productLabels:m})}});Promise.resolve(k).then(()=>H("success","Download complete"),$=>{console.error("[recurring-revenue] exportDataAsExcel failed",$),H("error","Failed to download Excel")})}catch(k){console.error("[recurring-revenue] exportDataAsExcel threw",k),H("error","Failed to download Excel")}};return r.jsxs(r.Fragment,{children:[r.jsx(It,{title:"ARR / MRR report",export:{onExport:At},toolbar:r.jsx(Gr,{onSearchChange:T=>a(T),searchValue:n??"",fromDate:S,onFromDateChange:y,toDate:_,onToDateChange:D,filterFields:g,filters:p,onFiltersChange:d,showChart:f,onShowChartChange:A,viewMode:v,onViewModeChange:U,apiRef:l,columns:X,excludedColumnFields:yt}),chart:r.jsx(Fn,{in:f,timeout:350,unmountOnExit:!0,sx:{flexShrink:0},children:r.jsx(fr,{filteredReport:(C==null?void 0:C.filteredReport)??[],fromDate:S,toDate:_,periodMode:N,onPeriodModeChange:R,valueMode:v,searchText:n??void 0})}),children:(C||ye)&&r.jsx(Wr,{isLoading:o||ye,searchText:c??void 0,apiRef:l,filteredReport:(C==null?void 0:C.filteredReport)??[],expandedRows:(C==null?void 0:C.expandedRows)??[],columns:X,productLabels:m})}),r.jsx($r,{target:Rt,reportCurrency:Ct,onClose:xt,onSubmit:Et,isSubmitting:me.isLoading})]})},Kr=({reportId:e})=>{const{isOpen:t,drawerWidth:o}=Ge();return r.jsx(O,{sx:{transition:n=>n.transitions.create("margin-right",{easing:t?n.transitions.easing.easeOut:n.transitions.easing.sharp,duration:t?n.transitions.duration.enteringScreen:n.transitions.duration.leavingScreen}),marginRight:t?`${o}px`:0},children:r.jsx(Dt,{children:r.jsx(zr,{reportId:e})})})},Xr=["Show me the MRR waterfall this month","What's my current MRR and ARR?","Which customers churned recently?","Show MRR trend over the last 6 months","Break down MRR by product"],qr=()=>{const{reportId:e}=_t(),{setSuggestions:t}=Ge();return s.useEffect(()=>(t(Xr),()=>t(void 0)),[t]),r.jsxs(r.Fragment,{children:[r.jsx(Tt,{children:r.jsx("title",{children:"ARR / MRR report"})}),r.jsx(Kr,{reportId:e})]})},Pa=kt(Wt(qr));export{Pa as RecurringRevenueReportPage};

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.