1import{b as i,e as y,j as r,w as l,F as J,m as Q,g as F,A as Se,h as c,t as f,y as T,az as W,v as b,aW as fe,an as ue,at as me,c as B,Y as ge,X as Fe,G as pe,aI as De,r as h,d as Z,cN as $e,a4 as ve,a5 as ye,f as m,ag as Te,ax as _e,aB as Ce,k as j,V as oe,ai as Ue,aw as Ne,s as x,p as R,L as ie,bX as he,B as Ye,I as Be,a6 as Ee,M as xe,ao as Re,a7 as qe,q as We,N as je,aY as L,u as be,o as Le,a1 as Oe,au as He,aK as Ke,E as ze,b1 as Ge,bY as Xe,bZ as de,cL as Ze,cK as ce}from"./index-DUWew8AW.js";import{T as Je}from"./TagResource-CZNzqy7j.js";import{_ as Qe}from"./PageContent-_L2qDZ3g.js";import{P as et}from"./PageHeader-CuloWWA-.js";import{u as tt}from"./useClient-CIKlfvNb.js";const at={class:"p-1"},nt={key:0},lt={key:0},st={key:0},rt={key:0},ut={__name:"BudgetChangeTable",props:{budgets:{type:Array,default:()=>[]},loading:{type:Boolean,default:!1}},setup(k){const g=k,D=[{title:"Service",key:"Service.name"},{title:"Starts At",key:"startsAt"},{title:"Ends At",key:"endsAt"},{title:"Invoiced Amount",key:"invoiceAmount"},{title:"Markup %",key:"markupPercentage"},{title:"Partner Margin %",key:"partnerMargin"},{title:"Platform Margin %",key:"platformMargin"},{title:"Management %",key:"managementPercentage"},{title:"Notes",key:"notes"},{title:"Tags",key:"tags"}],_=B(()=>{var I,s;const p=[];for(const v of g.budgets){p.push(v);for(const o of((I=v.Service)==null?void 0:I.feeServices)||[])for(const V of o.fees)p.push({...V,Service:{...o,order:((s=v.Service)==null?void 0:s.order)||0}})}return ge.sortBy(p,"Service.order")});return(p,I)=>(i(),y("div",at,[r(me,{loading:k.loading,"items-per-page":-1,headers:D,items:_.value,"hide-default-footer":!0,class:"elevation-1"},{"item.Service.name":l(({item:s})=>[c(f(s.Service.name),1)]),"item.startsAt":l(({item:s})=>[c(f(T(ue)(s.startsAt,"MM/DD/YYYY")),1)]),"item.endsAt":l(({item:s})=>[c(f(T(ue)(s.endsAt,"MM/DD/YYYY")),1)]),"item.invoiceAmount":l(({item:s})=>[c(f(T(fe)(s.invoiceAmount)),1)]),"item.markupPercentage":l(({item:s})=>[s.feeType?b("",!0):(i(),y("div",nt,f(T(W)(s.markupPercentage)),1))]),"item.partnerMargin":l(({item:s})=>[!s.feeType&&s.partnerMargin?(i(),y("div",lt,f(T(W)(s.partnerMargin)),1)):b("",!0)]),"item.platformMargin":l(({item:s})=>[!s.feeType&&s.platformMargin?(i(),y("div",st,f(T(W)(s.platformMargin)),1)):b("",!0)]),"item.managementPercentage":l(({item:s})=>[s.feeType?(i(),y("div",rt,f(T(W)(s.managementPercentage)),1)):b("",!0)]),"item.notes":l(({item:s})=>[c(f(s.notes),1)]),"item.tags":l(({item:s})=>[(i(!0),y(J,null,Q(s.Tags,(v,o)=>(i(),F(Se,{key:o,color:"primary",size:"small",class:"mr-2"},{default:l(()=>[c(f(v.name),1)]),_:2},1024))),128))]),_:1},8,["loading","items"])]))}},ot={postFeeData(k){return Fe.post("/fees",k)}},it={__name:"BudgetDatePicker",props:{item:{type:String,default:null},minDate:{type:String,default:null}},emits:["update"],setup(k,{emit:g}){const D=k,_=g,p=h(null);pe(()=>D.item,()=>{p.value=D.item},{immediate:!0});function I(){_("update",p.value)}function s(v){p.value=v,I()}return(v,o)=>(i(),F(De,{"auto-commit":"",menu:"",value:p.value,type:"date",min:k.minDate,"picker-props":{class:"w-full"},"display-format":"MM/DD/YYYY",label:"Select Date","text-field-class":"min-w-[180px]","prepend-inner-icon":"event","hide-details":"",variant:"filled",onInput:s},null,8,["value","min"]))}},dt={class:"p-1"},ct={class:"text-3xl ml-4"},ft={key:0,class:"mr-3"},mt={__name:"ServiceChangeTable",props:{loading:{type:Boolean,default:!1},services:{type:Array,default:()=>[]},budgets:{type:Array,default:()=>[]},client:{type:Object,default:()=>({})},tags:{type:Array,default:()=>[]}},setup(k){Z.extend($e);const g=k,D=ve(),_=ye(),{showErrorNotification:p,showErrorNotificationFromError:I,showSuccessNotification:s}=be(),v=[{title:"Service",key:"name"},{title:"Starts At",key:"startsAt"},{title:"Invoiced Amount",key:"invoiceAmount"},{title:"Markup %",key:"markupPercentage"},{title:"Partner Margin %",key:"partnerMargin"},{title:"Platform Margin %",key:"platformMargin"},{title:"Management %",key:"managementPercentage"},{title:"Notes",key:"notes"},{title:"Tags",key:"tags"}],o=h([]),V=h([]),$=h([]),w=h(!1),N=h([]),C=h([]),O=B(()=>g.tags.filter(n=>{var a;return(a=n.allowedTypes)==null?void 0:a.includes("Recurring")})),H=B(()=>{var n;return((n=g.client)==null?void 0:n.defaultValue)||[]}),K=B(()=>o.value.reduce((n,a)=>n+Number(a.invoiceAmount?a.invoiceAmount:0),0)),Y=B(()=>{let n=!0;const a=[];return V.value.length===0?{valid:!1,reasons:[]}
1:(V.value.forEach(e=>{const t=e.budget||{},u=e.fee||{};(!t.startsAt||!t.invoiceAmount||[null,void 0,""].includes(t.markupPercentage))&&(t.startsAt||(a.push(`Start date is required for ${t.name||`related budget of ${u.name}`}`),n=!1),t.invoiceAmount||(a.push(`Amount is required for ${t.name||`related budget of ${u.name}`}`),n=!1),[null,void 0,""].includes(t.markupPercentage)&&(a.push(`Markup percentage is required for ${t.name||`related budget of ${u.name}`}`),n=!1)),Object.keys(u).length>0&&(u.startsAt||(a.push(`Fee start date is required for ${u.name}`),n=!1),u.invoiceAmount||(a.push(`Fee amount is required for ${u.name}`),n=!1),[null,void 0,""].includes(u.managementPercentage)&&(a.push(`Management percentage is required for ${u.name}`),n=!1))}),{valid:n,reasons:a})});function z(n){return g.budgets.find(a=>a.serviceId===n)}function A(n){const a=H.value.find(e=>e.serviceId===n.id);return a||{defaultMarkup:n.markupPercentage||0,defaultManagementFees:n.managementFee}}function M(){var a;const n=[];(a=g.services)==null||a.forEach(e=>{var E,te,ae,ne,le,se,re;const t=z(e.id),u=A(e),d=((ne=(ae=(te=(E=t==null?void 0:t.Service)==null?void 0:E.feeServices)==null?void 0:te[0])==null?void 0:ae.fees)==null?void 0:ne[0])||null,U=!!((le=e.serviceGroup)!=null&&le.canHavePlatformMargin);n.push({budgetType:"Recurring",serviceId:e.id,clientId:g.client.id,startsAt:null,invoiceAmount:t?t.invoiceAmount.toFixed(2):null,tags:((se=t==null?void 0:t.Tags)==null?void 0:se.map(q=>q.id))||[],activeBudgetId:(t==null?void 0:t.id)||null,notes:(t==null?void 0:t.notes)||null,markupPercentage:(t==null?void 0:t.markupPercentage)||(u?Number(u.defaultMarkup):null),partnerMargin:(t==null?void 0:t.partnerMargin)||(u?Number(u.partnerMargin):null),canHavePlatformMargin:U,platformMargin:U&&((t==null?void 0:t.platformMargin)||(u==null?void 0:u.platformMargin))||null,isExternal:t?t.isExternal:!1,isDirectPay:t?t.isDirectPay:!1,matchId:e.id,key:`service-${e.id}`,active:!1,isFee:!1,name:e.name,minStartsAt:t?Z(t.startsAt).utc().format("YYYY-MM-DD"):null,serviceOrder:e.order}),(re=e.feeServices)==null||re.forEach(q=>{n.push({clientId:g.client.id,feeType:"Recurring",startsAt:null,serviceId:q.id,invoiceAmount:d?d.invoiceAmount.toFixed(2):null,activeBudgetId:(t==null?void 0:t.id)||null,managementPercentage:(d==null?void 0:d.managementPercentage)??(u?Number(u.defaultManagementFees):null),notes:(d==null?void 0:d.notes)||null,matchId:e.id,key:`fee-service-${e.id}`,active:!1,isFee:!0,name:q.name,minStartsAt:d?Z(d.startsAt).utc().format("YYYY-MM-DD"):null,serviceOrder:e.order})})}),o.value=ge.sortBy(n,"serviceOrder")}function P(){const n=o.value.filter(e=>e.active),a=[];n.forEach(e=>{const t=e.isFee?"fee":"budget",u=a.findIndex(d=>{var U,E;return((U=d.fee)==null?void 0:U.matchId)===e.matchId||((E=d.budget)==null?void 0:E.matchId)===e.matchId});u===-1?a.push({fee:e.isFee?{...e}:{},budget:e.isFee?{}:{...e}}):a[u][t]={...e}}),V.value=a}function ee(n,a=!1){if(n.active=a?!0:!n.active,n.isFee&&!n.active&&!$.value.includes(n.key)&&$.value.push(n.key),n.isFee&&n.active){$.value=$.value.filter(t=>t!==n.key);const e=o.value.find(t=>t.matchId===n.matchId&&!t.isFee);e&&(e.active=!0)}if(!n.isFee){const e=o.value.find(t=>t.matchId===n.matchId&&t.isFee);e&&!$.value.includes(e.key)&&(e.active=n.active)}}function ke(n,a=!1){ee(n,a),P()}function Ve(n){const a=o.value.find(t=>t.matchId===n.matchId&&!t.isFee),e=o.value.find(t=>t.matchId===n.matchId&&t.isFee);if(a&&e){const t=Number(a.invoiceAmount)*(Number(e.managementPercentage)/100);e.invoiceAmount=t.toFixed(2)}}function S(n=null,a=!1){n&&(ee(n,!0),a&&Ve(n)),P()}function Ae(n){if(n.isFee){const a=o.value.find(e=>e.matchId===n.matchId&&!e.isFee);a&&(a.startsAt=n.startsAt)}else{const a=o.value.find(e=>e.matchId===n.matchId&&e.isFee);a&&(a.startsAt=n.startsAt)}S(n)}function G(){var n;_.push({name:"clients.profile.budgets",params:{slug:(n=g.client)==null?void 0:n.slug},query:{...D.query||{}}})}async function Me(n){var e,t,u;if(!((e=n.budget)!=null&&e.invoiceAmount))return;let a;try{a=(await L.postBudgetData(n.budget)).data.id}catch(d){throw p(`There was an error saving ${n.budget.name} budget.`),new Error(`There was an error saving ${n.budget.name} budget. ${(t=d.response)==null?void 0:t.data}`)}if(n.fee&&n.fee.invoiceAmount){const d={...n.fee,budgetId:a};try{await ot.postFeeData(d),s(`${n.budget.name} budget and its fee have been saved successfully.`)}catch(U){throw p(`There was an error saving ${n.budget.name} budget fee.`),new Error(`There was an error saving ${n.budget.name} budget fee. ${(u=U.response)==null?void 0:u.data}`)}return}s(`${n.budget.name} budget saved successfully.`)}async function Ie(){const n=await L.checkIfBudgetsShouldBeNotified(C.value);N.value=n.data.filter(a=>a.shouldNotify===!0),N.value.length>0?w.value=!0:G()}async function we(){const n=[];
1C.value=[],V.value.forEach(e=>{var t;n.push(Me(e)),Number((t=e.budget)==null?void 0:t.invoiceAmount)===0&&C.value.push(e.budget.activeBudgetId)}),!(await Promise.allSettled(n)).some(e=>e.status==="rejected")&&(C.value.length>0?await Ie():G(),V.value=[])}function X(){w.value=!1,N.value=[],G()}function Pe(){L.notifyServiceCancellations(C.value).then(()=>{s("Users have been notified successfully.")}).catch(n=>{I(n)}).finally(()=>{X()})}return pe(()=>g.loading,()=>{M()}),(n,a)=>(i(),y("div",dt,[r(me,{loading:k.loading,headers:v,items:o.value,"items-per-page":-1,"item-value":"key","hide-default-footer":!0,class:"elevation-1","row-props":({item:e})=>({class:(({active:t})=>t?"bg-blue-200":"")(e)})},{"item.name":l(({item:e})=>[r(oe,{start:"",onClick:t=>ke(e)},{default:l(()=>[c(f(e.active?"fa fa-square-check":"far fa-square"),1)]),_:2},1032,["onClick"]),c(" "+f(e.name),1)]),"item.startsAt":l(({item:e})=>[r(it,{item:e.startsAt,onUpdate:t=>{e.startsAt=t,Ae(e)},"min-date":e.minStartsAt},null,8,["item","onUpdate","min-date"])]),"item.invoiceAmount":l(({item:e})=>[r(x,{modelValue:e.invoiceAmount,"onUpdate:modelValue":[t=>e.invoiceAmount=t,t=>S(e,!0)],variant:"filled","prepend-inner-icon":"mdi-currency-usd","hide-details":"",type:"number",onWheel:a[0]||(a[0]=R(()=>{},["prevent","stop"]))},null,8,["modelValue","onUpdate:modelValue"])]),"item.markupPercentage":l(({item:e})=>[e.isFee?b("",!0):(i(),F(x,{key:0,modelValue:e.markupPercentage,"onUpdate:modelValue":[t=>e.markupPercentage=t,t=>S(e)],variant:"filled","append-inner-icon":"mdi-percent","hide-details":"",type:"number",onWheel:a[1]||(a[1]=R(()=>{},["prevent","stop"]))},null,8,["modelValue","onUpdate:modelValue"]))]),"item.partnerMargin":l(({item:e})=>[e.isFee?b("",!0):(i(),F(x,{key:0,modelValue:e.partnerMargin,"onUpdate:modelValue":[t=>e.partnerMargin=t,t=>S(e)],variant:"filled","append-inner-icon":"mdi-percent","hide-details":"",type:"number",onWheel:a[2]||(a[2]=R(()=>{},["prevent","stop"]))},null,8,["modelValue","onUpdate:modelValue"]))]),"item.platformMargin":l(({item:e})=>[!e.isFee&&e.canHavePlatformMargin?(i(),F(x,{key:0,modelValue:e.platformMargin,"onUpdate:modelValue":[t=>e.platformMargin=t,t=>S(e)],variant:"filled","append-inner-icon":"mdi-percent","hide-details":"",type:"number",onWheel:a[3]||(a[3]=R(()=>{},["prevent","stop"]))},null,8,["modelValue","onUpdate:modelValue"])):b("",!0)]),"item.managementPercentage":l(({item:e})=>[e.isFee?(i(),F(x,{key:0,modelValue:e.managementPercentage,"onUpdate:modelValue":[t=>e.managementPercentage=t,t=>S(e,!0)],variant:"filled","append-inner-icon":"mdi-percent","hide-details":"",type:"number",onWheel:a[4]||(a[4]=R(()=>{},["prevent","stop"]))},null,8,["modelValue","onUpdate:modelValue"])):b("",!0)]),"item.tags":l(({item:e})=>[e.tags?(i(),F(Ne,{key:0,modelValue:e.tags,"onUpdate:modelValue":[t=>e.tags=t,t=>S(e)],"item-value":"id",multiple:"","item-title":"name",placeholder:"All",items:O.value,clearable:"",label:"Tags",variant:"filled","hide-details":""},null,8,["modelValue","onUpdate:modelValue","items"])):b("",!0)]),"item.isDirectPay":l(({item:e})=>[e.isFee?b("",!0):(i(),F(_e,{key:0,modelValue:e.isDirectPay,"onUpdate:modelValue":[t=>e.isDirectPay=t,t=>S(e)]},{label:l(()=>[r(Ce,{location:"top"},{activator:l(({props:t})=>[a[7]||(a[7]=m("span",null,"Direct Pay",-1)),r(j,{density:"comfortable",variant:"text",icon:"",color:"primary"},{default:l(()=>[r(oe,Ue({size:"small"},t),{default:l(()=>[...a[6]||(a[6]=[c("fas fa-info-circle",-1)])]),_:1},16)]),_:2},1024)]),default:l(()=>[a[8]||(a[8]=c(" Indicates that this service is paid using the client's payment method ",-1))]),_:1})]),_:1},8,["modelValue","onUpdate:modelValue"]))]),"item.notes":l(({item:e})=>{var t;return[r(Te,{rows:((t=e.notes)==null?void 0:t.length)>0?4:2,modelValue:e.notes,"onUpdate:modelValue":[u=>e.notes=u,u=>S(e)],variant:"filled","hide-details":""},null,8,["rows","modelValue","onUpdate:modelValue"])]}),"body.append":l(()=>[m("tr",null,[a[9]||(a[9]=m("th",null,null,-1)),a[10]||(a[10]=m("th",null,[m("p",{class:"text-3xl"},"Total")],-1)),m("th",null,[m("p",ct,f(T(fe)(K.value)),1)])])]),_:1},8,["loading","items","row-props"]),r(Ye,{class:"my-6 mx-1"},{default:l(()=>[r(ie),!Y.value.valid&&Y.value.reasons.length>0?(i(),y("div",ft,[r(he,{density:"compact",type:"error",variant:"outlined"},{default:l(()=>[m("ul",null,[(i(!0),y(J,null,Q(Y.value.reasons,e=>(i(),y("li",{key:e},f(e),1))),128))])]),_:1})])):b("",!0),r(j,{color:"success",onClick:we,disabled:!Y.value.valid},{default:l(()=>[...a[11]||(a[11]=[c(" Save ",-1)])]),_:1},8,["disabled"])]),_:1}),r(je,{modelValue:w.value,"onUpdate:modelValue":a[5]||(a[5]=e=>w.value=e),onKeydown:We(X,["esc"]),persistent:"",width:"480px"},{default:l(()=>[r(Be,null,{default:l(()=>[r(Ee,{color:"warning"},{default:l(()=>[...a[12]||(a[12]=[c("Notify Users",-1)])]),_:1}),r(xe,null,{default:l(()=>[a[14]||(a[14]=m("p",null,"Would you like to notify the related users about the budget cancellation(s)?",-1)),r(Re,{class:"mt-3"},{default:l(()=>
1[a[13]||(a[13]=m("thead",null,[m("tr",null,[m("th",null,"Service")])],-1)),m("tbody",null,[(i(!0),y(J,null,Q(N.value,(e,t)=>(i(),y("tr",{key:t},[m("td",null,f(e.serviceName),1)]))),128))])]),_:1})]),_:1}),r(qe,null,{default:l(()=>[r(ie),r(j,{variant:"text",color:"error",onClick:X},{default:l(()=>[...a[15]||(a[15]=[c("Cancel",-1)])]),_:1}),r(j,{color:"primary",onClick:Pe},{default:l(()=>[...a[16]||(a[16]=[c("Confirm",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])]))}},gt={class:"budget_changes"},kt={__name:"BudgetChangeIndexPage",setup(k){const g=ve(),D=ye(),{showWarningNotification:_}=be(),{getCancellationMessage:p}=tt(),{isInAccountingDepartment:I}=Ke(),s=h(!0),v=h([]),o=h({id:null,name:null,slug:null,canceledAt:null}),V=h([]),$=h([]),w=h(1),N=B(()=>o.value?p(o.value):"");async function C(){o.value=await He.getClient(g.params.slug,{withFields:["id","name","slug","defaultValue","canceledAt"]}).then(A=>A.data)}async function O(){$.value=await Je.getTags().then(A=>A.data)}async function H(){v.value=await Ge.getServiceListWithRecurring(o.value.id).then(A=>A.data)}async function K(){V.value=await L.getActiveRecurringBudgetsForClient(o.value.id).then(A=>A.data)}async function Y(){s.value=!0,await Promise.all([O(),H(),K()]),await ze(),s.value=!1}async function z(){if(!I.value){_("You don't have permission to access this page."),await D.push({name:"clients.profile.budgets",params:{slug:o.value.slug}});return}await Y()}return Le(async()=>{await C(),await z()}),(A,M)=>(i(),y("section",gt,[r(et,null,{default:l(()=>{var P;return[c("Budget Changes for "+f(((P=o.value)==null?void 0:P.name)||""),1)]}),_:1}),r(Oe),r(Qe,null,{default:l(()=>[m("div",null,[o.value.canceledAt?(i(),F(he,{key:0,type:"error",icon:"mdi-alert",class:"mt-4"},{default:l(()=>[c(" You are making changes for a canceled client. "+f(N.value),1)]),_:1})):b("",!0),r(Xe,{modelValue:w.value,"onUpdate:modelValue":M[0]||(M[0]=P=>w.value=P),class:"my-3"},{default:l(()=>[r(de,{value:0},{default:l(()=>[...M[2]||(M[2]=[c("Current Budgets & Fees",-1)])]),_:1}),r(de,{value:1},{default:l(()=>[...M[3]||(M[3]=[c("Changes",-1)])]),_:1})]),_:1},8,["modelValue"]),r(Ze,{modelValue:w.value,"onUpdate:modelValue":M[1]||(M[1]=P=>w.value=P),class:"w-full"},{default:l(()=>[r(ce,null,{default:l(()=>[r(ut,{budgets:V.value,loading:s.value},null,8,["budgets","loading"])]),_:1}),r(ce,null,{default:l(()=>[r(mt,{services:v.value,budgets:V.value,loading:s.value,client:o.value,tags:$.value},null,8,["services","budgets","loading","client","tags"])]),_:1})]),_:1},8,["modelValue"])])]),_:1})]))}};export{kt as default};
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.