UNPKG

@accounter/client

Version:

2 lines (1 loc) • 10.8 kB
import{r as m,bI as V,j as e,bC as _,B as I,bB as k,E as Q,bD as G,dr as K,b4 as q,ds as X,bE as y,bH as A,bF as F,bG as D,w as S,u as R,gD as z,K as P,c as U,N as $,Q as J,a5 as W,X as Y,F as Z,aC as ee,b8 as se,V as ae,dX as te,gE as re,ay as ne}from"./index-DRqooPz9.js";import{u as O}from"./use-url-query-A8PE3FMA.js";import{P as oe}from"./page-layout-Dp9Tr43G.js";import{k as ie,B as N,X as H,Y as le,l as ce,q as de,m as ue,n as me,o as pe,p as xe,r as ge,s as he}from"./download-csv-BmamqJJW.js";import{P as fe}from"./modal-CPrQ9jQu.js";import{F as be}from"./funnel-B1ZA9LM9.js";import{M as E}from"./MultiSelect-DhEZHYxn.js";import{T as je}from"./index-ciP7vurq.js";import{s as ye}from"./sub-764RJPt0.js";import"./sequential-CjOfRLtc.js";import"./download-csv-button-BFfxSTjQ.js";import"./similar-transactions-modal-DilkLkpx.js";import"./building-2-CWrl-iq9.js";import"./addDays-DpkzPtfc.js";import"./subMonths-CZ2djAnO.js";var ve=ie({chartName:"BarChart",GraphicalChild:N,defaultTooltipEventType:"axis",validateTooltipEventTypes:["axis","item"],axisComponents:[{axisType:"xAxis",AxisComp:H},{axisType:"yAxis",AxisComp:le}],formatAxisMap:ce});function Ce(a){return!a||k(a)?null:encodeURIComponent(JSON.stringify(a))}const L="balanceReportFilters",g={MONTHLY:"Monthly",BI_MONTHLY:"Bi-monthly",QUARTERLY:"Quarterly",SEMI_ANNUALLY:"Semi-Annually",ANNUALLY:"Annually"};function Te({filter:a,setFilter:i,closeModal:c}){const{control:t,handleSubmit:r,watch:p}=Q({defaultValues:{...a}}),{selectableBusinesses:b,fetching:h}=G(),{selectableFinancialEntities:f,fetching:v}=K(),{selectableTags:x,fetching:j}=q(),M=s=>{i(s),c()},C=p("excludedTags"),o=m.useMemo(()=>x.filter(s=>!C.includes(s.value)),[C,x]),d=p("includedTags"),n=m.useMemo(()=>x.filter(s=>!d.includes(s.value)),[d,x]);return e.jsxs("form",{onSubmit:r(M),children:[e.jsxs(X,{cols:2,children:[e.jsx(y,{name:"ownerId",control:t,defaultValue:a?.ownerId,render:({field:s,fieldState:l})=>e.jsx(A,{...s,data:b,value:s.value,disabled:h,label:"Owners",placeholder:"Scroll to see all options",maxDropdownHeight:160,searchable:!0,error:l.error?.message,withinPortal:!0})}),e.jsx(y,{name:"fromDate",control:t,defaultValue:a?.fromDate,rules:{pattern:{value:F,message:"Date must be im format yyyy-mm-dd"}},render:({field:s,fieldState:l})=>e.jsx(D,{...s,onChange:u=>{const T=u?typeof u=="string"?u:S(u,"yyyy-MM-dd"):void 0;T!==s.value&&s.onChange(T)},value:s.value?new Date(s.value):void 0,error:l.error?.message,label:"From Date",popoverProps:{withinPortal:!0}})}),e.jsx(y,{name:"toDate",control:t,defaultValue:a?.toDate,rules:{pattern:{value:F,message:"Date must be im format yyyy-mm-dd"}},render:({field:s,fieldState:l})=>e.jsx(D,{...s,onChange:u=>{const T=u?typeof u=="string"?u:S(u,"yyyy-MM-dd"):void 0;T!==s.value&&s.onChange(T)},value:s.value?new Date(s.value):void 0,error:l.error?.message,label:"To Date",popoverProps:{withinPortal:!0}})}),e.jsx(y,{name:"period",control:t,defaultValue:g.MONTHLY,render:({field:s,fieldState:l})=>e.jsx(A,{...s,data:Object.values(g).map(u=>({value:u,label:u})),value:s.value,label:"Period",maxDropdownHeight:160,error:l.error?.message,withinPortal:!0})}),e.jsx(y,{name:"excludedCounterparties",control:t,defaultValue:a.excludedCounterparties,render:({field:s,fieldState:l})=>e.jsx(E,{...s,data:f,value:s.value??[],disabled:v,label:"Excluded Counterparties",placeholder:"Scroll to see all options",maxDropdownHeight:160,searchable:!0,error:l.error?.message,withinPortal:!0})}),e.jsx(y,{name:"includedTags",control:t,defaultValue:a.includedTags,render:({field:s,fieldState:l})=>e.jsx(E,{...s,data:o,value:s.value??[],disabled:j,label:"Included Tags",placeholder:"Scroll to see all options",maxDropdownHeight:160,searchable:!0,error:l.error?.message,withinPortal:!0})}),e.jsx(y,{name:"excludedTags",control:t,defaultValue:a.excludedTags,render:({field:s,fieldState:l})=>e.jsx(E,{...s,data:n,value:s.value??[],disabled:j,label:"Excluded Tags",placeholder:"Scroll to see all options",maxDropdownHeight:160,searchable:!0,error:l.error?.message,withinPortal:!0})})]}),e.jsxs("div",{className:"flex justify-center mt-5 gap-3",children:[e.jsx("button",{type:"submit",disabled:h,className:"text-white bg-indigo-500 border-0 py-2 px-8 focus:outline-hidden hover:bg-indigo-600 rounded-sm text-lg",children:"Filter"}),e.jsx("button",{type:"button",className:"text-white bg-rose-500 border-0 py-2 px-8 focus:outline-hidden hover:bg-rose-600 rounded-sm text-lg",onClick:c,children:"Cancel"})]})]})}function we({filter:a,setFilter:i,initiallyOpened:c=!1}){const[t,r]=m.useState(c),[p,b]=m.useState(!!a),{get:h,set:f}=O();m.useEffect(()=>{const x=Ce(a),j=h(L);x!==j&&f(L,x)},[a,h,f]);const v=m.useCallback(x=>{V(x,a)||(i(x),b(!!x))},[a,i]);return e.jsxs("div",{className:"flex flex-row gap-5 items-center",children:[e.jsx(fe,{opened:t,onClose:()=>r(!1),content:e.jsx(Te,{filter:a,setFilter:v,closeModal:()=>r(!1)}),modalSize:"xl"}),e.jsx(_,{inline:!0,size:16,disabled:!p,children:e.jsx(I,{variant:"outline",size:"icon",className:"size-7.5",onClick:()=>r(!0),children:e.jsx(be,{className:"size-5"})})})]})}const Ne=({period:a,transactionIDs:i,onCloseExtendedTransactions:c})=>{const[{data:t,fetching:r}]=R({query:z,variables:{transactionIDs:i}}),p=m.useMemo(()=>t?.transactionsByIDs?i.map(b=>t?.transactionsByIDs.find(h=>h.id===b)).filter(Boolean):[],[t,i]);return e.jsx(P,{className:"mt-5 w-full",children:r?e.jsx(U,{}):e.jsxs(e.Fragment,{children:[e.jsx($,{children:e.jsxs(J,{className:"flex justify-between",children:[e.jsxs("span",{children:[a," Transactions"]}),e.jsxs("div",{className:"flex flex-row gap-2 items-center",children:[e.jsx(de,{rawTransactions:p}),e.jsx(I,{variant:"link",onClick:c,children:e.jsx(W,{className:"h-4 w-4"})})]})]})}),e.jsx(Y,{children:e.jsx(je,{transactionsProps:p})})]})})},w={income:{label:"Income",color:"rgba(0, 255, 50, 0.5)"},expense:{label:"Expense",color:"rgba(255, 0, 0, 0.5)"},delta:{label:"Delta",color:"rgba(0, 30, 255, 0.5)"},cumulative:{label:"Cumulative Balance",color:"rgba(100, 0, 255, 0.5)"}};function Me(a,i,c){switch(c){case g.MONTHLY:{const t=String(i).padStart(2,"0");return`${a}-${t}`}case g.BI_MONTHLY:{const t=i%2===0?i-1:i,r=String(t).padStart(2,"0");return`${a}-${r}`}case g.QUARTERLY:{const t=Math.ceil(i/3);return`${a}-Q${t}`}case g.SEMI_ANNUALLY:{const t=i>6?2:1;return`${a}-H${t}`}case g.ANNUALLY:return String(a)}}function Se(a,i){switch(i){case g.MONTHLY:{const[c,t]=a.split("-");return`${t}/${c}`}case g.BI_MONTHLY:{const[c,t]=a.split("-"),r=Number(t)+1,p=String(r).padStart(2,"0");return`${t}-${p}/${c}`}case g.QUARTERLY:{const[c,t]=a.split("-");return`${t}, ${c}`}case g.SEMI_ANNUALLY:{const[c,t]=a.split("-");return`${t}, ${c}`}case g.ANNUALLY:return a}}const B=te(ne.Usd),_e=()=>{const{setFiltersContext:a}=m.useContext(Z),{userContext:i}=m.useContext(ee),{get:c}=O(),t=m.useMemo(()=>{const o={ownerId:i?.context.adminBusinessId,toDate:S(new Date,"yyyy-MM-dd"),period:g.MONTHLY,fromDate:S(ye(new Date,{years:1}),"yyyy-MM-dd"),excludedCounterparties:[],includedTags:[],excludedTags:[]},d=c(L);if(d)try{return JSON.parse(decodeURIComponent(d))}catch(n){console.log("Error parsing balance report filters from URL:",n)}return o},[i?.context.adminBusinessId,c]),[r,p]=m.useState(t),[b,h]=m.useState(void 0),[f,v]=m.useState(Object.keys(w)),x=m.useMemo(()=>{const{ownerId:o,fromDate:d,toDate:n}=r;return{ownerId:o,fromDate:d,toDate:n}},[r]),[{data:j,fetching:M}]=R({query:re,variables:x,pause:!r});m.useEffect(()=>{a(e.jsxs("div",{className:"flex flex-row gap-x-5",children:[e.jsx(we,{filter:r,setFilter:p,initiallyOpened:!r}),e.jsx(se,{options:Object.entries(w).map(([o,d])=>({label:d.label,value:o})),onValueChange:v,defaultValue:f,placeholder:"Select Data Sets",variant:"default",maxCount:1})]})),h(void 0)},[j,M,r,a,p,f]),m.useEffect(()=>{p(o=>({...o,ownerId:i?.context.adminBusinessId}))},[i]);const C=m.useMemo(()=>{if(!j?.transactionsForBalanceReport)return[];const o=new Map;j.transactionsForBalanceReport.map(n=>{if(n.counterparty?.id&&(!n.isFee&&i?.context.financialAccountsBusinessesIds?.includes(n.counterparty.id)||r.excludedCounterparties?.includes(n.counterparty.id))||r.includedTags.length>0&&(!n.charge?.tags||n.charge.tags.length===0||!n.charge.tags.some(u=>r.includedTags.includes(u.id)))||r.excludedTags.length>0&&n.charge?.tags.length&&n.charge.tags.some(u=>r.excludedTags.includes(u.id)))return;const s=Me(n.year,n.month,r.period);o.has(s)||o.set(s,{income:0,expense:0,delta:0,transactions:[]});const l=o.get(s);n.amountUsd.raw>0?l.income+=n.amountUsd.raw:l.expense+=n.amountUsd.raw,l.delta+=n.amountUsd.raw,l.transactions.push(n)});let d=0;return Array.from(o.entries()).sort((n,s)=>n[0].localeCompare(s[0])).map(([n,s])=>(d+=s.delta,{period:n,income:s.income,expense:s.expense,delta:s.delta,cumulative:d,transactions:s.transactions.sort((l,u)=>Math.abs(u.amountUsd.raw)-Math.abs(l.amountUsd.raw))}))},[j,r.period,r.excludedCounterparties,i?.context.financialAccountsBusinessesIds,r.includedTags,r.excludedTags]);return e.jsx(oe,{title:"Balance Report",description:"Accounts periodical balance",children:M?e.jsx(U,{}):e.jsxs(e.Fragment,{children:[e.jsxs(P,{className:"w-full",children:[e.jsx($,{children:e.jsx(ae,{children:"Click specific period to expand it's transactions data"})}),e.jsx(Y,{children:e.jsx(ue,{config:w,className:"h-150 w-full",children:e.jsxs(ve,{accessibilityLayer:!0,data:C,onClick:o=>h(o.activeLabel),children:[e.jsx(me,{vertical:!1}),e.jsx(H,{dataKey:"period",tickLine:!1,tickMargin:10,axisLine:!1,tickFormatter:o=>Se(o,r.period)}),e.jsx(pe,{content:e.jsx(xe,{formatter:(o,d,n,s)=>{const l=`bg-[var(--color-${d})]`;return s<2?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:`${l} h-2.5 w-2.5 shrink-0 rounded-[2px]`}),w[d]?.label||d,e.jsx("div",{className:"ml-auto flex items-baseline gap-0.5 font-mono font-medium tabular-nums text-foreground",children:B.format(Number(o))})]}):e.jsxs("div",{className:"mt-1.5 flex basis-full items-center border-t pt-1.5 text-xs font-medium text-foreground",children:[e.jsx("div",{className:`h-2.5 w-2.5 shrink-0 rounded-[2px] mr-2 ${l}`}),w[d]?.label||d,e.jsx("div",{className:"ml-auto flex items-baseline gap-0.5 font-mono font-medium tabular-nums text-foreground",children:B.format(Number(o))})]})}})}),e.jsx(ge,{content:e.jsx(he,{})}),f.includes("income")&&e.jsx(N,{dataKey:"income",fill:"var(--color-income)",radius:4}),f.includes("expense")&&e.jsx(N,{dataKey:"expense",fill:"var(--color-expense)",radius:4}),f.includes("delta")&&e.jsx(N,{dataKey:"delta",fill:"var(--color-delta)",radius:4}),f.includes("cumulative")&&e.jsx(N,{dataKey:"cumulative",fill:"var(--color-cumulative)",radius:4})]})})})]}),b&&e.jsx(Ne,{period:b,onCloseExtendedTransactions:()=>h(void 0),transactionIDs:C.find(o=>o.period===b)?.transactions.map(o=>o.id)??[]})]})})};export{_e as BalanceReport};