PageSourceSearch

https://gnomebrewshop.com/_nuxt/CCoYUxBG.js

js gnomebrewshop.com collected 2026-10-01 23:50:59 UTC 26,308 bytes, 1 lines download raw bytes

1import{r as F,e as d,J as ee,ab as Ce,M as Te,a3 as s,a5 as G,a6 as h,ac as w,O as m,a8 as D,ad as K,av as q,az as ce,ae as I,af as L,a9 as j,u as T,i as re,w as de,ar as Re,aA as Me,b as $e,g as ve,ay as Ve}from"./CPHMDxSy.js";import{d as He}from"./CF3ekcrf.js";import{a as ie,u as me}from"./LIcSYixB.js";import{P as ae}from"./kSx_Pxwk.js";import{C as xe}from"./B-BXowIC.js";import{_ as ne,c as Ne,g as Be,M as Ge,B as oe,q as Fe,u as Ie}from"./BCVOGkAC.js";import{_ as Oe}from"./BNmBNcUa.js";import{F as Qe}from"./1HxAjWj1.js";import{P as ye}from"./BbVtzymq.js";import{_ as Ee}from"./DHgu6cFf.js";import{P as Pe}from"./DfjV8eVC.js";import{b as Le,a as ue}from"./CHbSAB4g.js";import{B as ge}from"./DbawNpKw.js";import{P as he}from"./DA2KLNx_.js";import{u as Se,P as ke}from"./C6WZ57Pb.js";import{P as _e}from"./DghZEPNX.js";import{I as pe}from"./BZieGJiT.js";import{h as fe}from"./B7I8KK-k.js";import{_ as be}from"./C6d-JCPc.js";import{u as je}from"./CXysDsJK.js";import{u as Ue}from"./CLRGPaVP.js";import"./CIpF2gQE.js";import"./C2g_QCx2.js";import"./DN81lIVS.js";import"./DTKt8JxR.js";import"./B-bT-vEY.js";import"./DP-1LsjY.js";import"./dcLugj8V.js";import"./CwmQBgaN.js";import"./5GtQloGm.js";import"./DDQlkgxm.js";import"./3ZK7xv3D.js";import"./CJYiG3cp.js";import"./Dc7E06Xw.js";import"./CXF61m3z.js";import"./8aQM5ZF0.js";import"./B5oxlj9p.js";const te="/sales-analytics",De=a=>a&&a.type!=="none"&&!(typeof a.value=="string"&&a.value.trim()==="")?{filterType:a.type,filterValue:String(a.value)}:void 0,Ae=a=>({...a.mode?{mode:a.mode}:{},...a.dateRange?{startDate:a.dateRange.startDate,endDate:a.dateRange.endDate}:{},...De(a.filter),...a.detailsItemToken?{detailsItemToken:a.detailsItemToken}:{}}),Ke=async(a={})=>ae(`${te}/performance`,{query:Ae(a)}),ze=async(a={})=>ae(`${te}/pricing-health`,{query:{...De(a.filter),...a.detailsItemToken?{detailsItemToken:a.detailsItemToken}:{}}}),We=async(a={})=>ae(`${te}/margin-policy`,{query:a}),Je=async a=>{await ae(`${te}/margin-policy`,{method:"PUT",body:a})},Ye=async(a,f)=>{await ae(`${te}/margin-policy`,{method:"DELETE",body:{level:a,subjectToken:f}})},se="pos-sales-analytics",Y={all:()=>[se],performancePrefix:()=>[se,"performance"],pricingHealthPrefix:()=>[se,"pricing-health"],marginPoliciesPrefix:()=>[se,"margin-policy"],performance:a=>[...Y.performancePrefix(),{mode:a.mode??"items",startDate:a.dateRange?.startDate??null,endD
1ate:a.dateRange?.endDate??null,filter:a.filter?{type:a.filter.type,value:a.filter.value,showHidden:a.filter.showHidden}:null,detailsItemToken:a.detailsItemToken??null}],pricingHealth:a=>[...Y.pricingHealthPrefix(),{filter:a.filter?{type:a.filter.type,value:a.filter.value,showHidden:a.filter.showHidden}:null,detailsItemToken:a.detailsItemToken??null}],marginPolicies:a=>[...Y.marginPoliciesPrefix(),{categoryToken:a.categoryToken??null,itemToken:a.itemToken??null}]},Xe=(a,f=F(!0))=>{const l=ie(),p=d(()=>Y.performance(a.value)),S=async()=>l.invalidateExact(p.value),{data:g,error:C,status:r}=me({queryKey:p,queryFn:()=>Ke(a.value),enabled:f});return{salesPerformance:d(()=>g.value??null),error:C,status:r,refresh:S}},Ze=(a,f=F(!0))=>{const l=ie(),p=d(()=>Y.pricingHealth(a.value)),S=async()=>l.invalidateExact(p.value),{data:g,error:C,status:r}=me({queryKey:p,queryFn:()=>ze(a.value),enabled:f});return{pricingHealth:d(()=>g.value??null),error:C,status:r,refresh:S}},qe=a=>{const f=ie(),l=d(()=>Y.marginPolicies(a.value)),p=async()=>f.invalidateExact(l.value),{data:S,error:g,status:C}=me({queryKey:l,queryFn:()=>We(a.value)});return{salesMarginPolicies:d(()=>S.value??[]),error:g,status:C,refresh:p}},ea=()=>{const a=ie(),f=async()=>{await Promise.all([a.invalidate(Y.marginPoliciesPrefix()),a.invalidate(Y.pricingHealthPrefix())])};return{save:async S=>{await Je(S),await f()},remove:async(S,g)=>{await Ye(S,g),await f()},refreshPolicyViews:f}},aa=ee({__name:"POSSalesPerformanceDetailsModal",props:{row:{},response:{},mode:{}},emits:["close"],setup(a,{emit:f}){const l=a,p=f,S=Ce("detailsDialog");Te(async()=>{await S.value?.open()});const g=P=>P==null||P===""?"—":String(P),C=P=>P==null?"—":`$${P.toFixed(2)}`,r=P=>P==null?"—":`${(P/100).toFixed(2)}%`,R=d(()=>l.mode==="items"?l.row.name:l.row.categoryName),x=d(()=>[{label:"Start date",value:l.response.dateRange.startDate},{label:"End date",value:l.response.dateRange.endDate}]),O=d(()=>[{label:"Net Sales",value:C(l.row.netSales)},{label:"Net Quantity",value:g(l.row.netQuantity)},{label:"Transactions",value:g(l.row.transactions)},{label:"Average Selling Price",value:C(l.row.averageSellingPrice)},{label:"Discount Rate",value:r(l.row.discountRateBasisPoints)},{label:"Reversal Rate",value:r(l.row.reversalRateBasisPoints)}]),V=d(()=>[{label:"COGS",value:C(l.row.cogs)},{label:"Gross Profit",value:C(l.row.grossProfit)},{label:"Gross Margin",value:r(l.row.grossMarginBasisPoints)},{label:"Supported range",value:l.response.profitabilitySupportedRange?`${l.response.profitabilitySupportedRange.startDate} through ${l.response.profitabilitySupportedRange.endDate}`:"Not available"}]);return(P,N)=>(s(),G(Le,{ref_key:"detailsDialog",ref:S,title:R.value,onClose:N[0]||(N[0]=Q=>p("close"))},{default:h(()=>[w(ue,{title:"Selected range",rows:x.value},null,8,["rows"]),w(ue,{title:"Sales measures",rows:O.value},null,8,["rows"]),w(ue,{title:"Profitability evidence",rows:V.value},null,8,["rows"])]),_:1},8,["title"]))}}),ta={class:"sales-performance-table","aria-live":"polite"},la={key:0},sa={key:1},ra=["aria-label","title"],oa={key:2},ia=ee({__name:"POSSalesPerformanceTable",props:{mode:{},response:{},loading:{type:Boolean},error:{}},emits:["view"],setup(a,{emit:f}){const l=a,p=f,S=[{id:"sku",label:"SKU",hideable:!1},{id:"name",label:"Item",hideable:!1},{id:"category",label:"Category",defaultVisible:!1},{id:"netQuantity",label:"Net Quantity",hideable:!1},{id:"netSales",label:"Net Sales",hideable:!1},{id:"grossProfit",label:"Gross Profit",hideable:!1},{id:"grossMargin",label:"Gross Margin",hideable:!1},{id:"averageSellingPrice",label:"ASP",defaultVisible:!1},{id:"discountRate",label:"Discount Rate",defaultVisible:!1},{id:"reversalRate",label:"Reversal Rate",defaultVisible:!1}],g=[{id:"category",label:"Category",hideable:!1},{id:"sellingItemCount",label:"Selling Items",defaultVisible:!1},{id:"netQuantity",label:"Net Quantity",hideable:!1},{id:"netSales",label:"Net Sales",hideable:!1},{id:"grossProfit",label:"Gross Profit",hideable:!1},{id:"grossMargin",label:"Gross Margin",hideable:!1},{id:"averageSellingPrice",label:"ASP",defaultVisible:!1},{id:"discountRate",label:"Discount Rate",defaultVisible:!1},{id:"reversalRate",label:"Reversal Rate",defaultVisible:!1}],C=d(()=>(l.mode==="items"?S:g).concat([{id:"details",label:"Details",hideable:!1}])),r=d(()=>`pos-sales-performance-${l.mode}-columns-v1`),{visibility:R,resetToDefaults:x}=Se({columns:C.value,storageKey:r.value}),O=d(()=>C.value.filter(t=>R.value[t.id]!==!1)),V=F((l.mode==="items","netSales")),P=F(-1),N=t=>l.mode==="items"?t.name:t.categoryName,Q=t=>l.mode==="items"?t.categoryName??"Uncategorized":t.categoryName,z=d(()=>l.mode==="items"?l.response?.items??[]:l.response?.categories??[]),W=(t,u)=>{const v=u==="category"?Q(t):u==="name"?N(t):u==="sku"?t.sku??0:u==="sellingItemCount"?t.sellingItemCount:u==="discountRate"?t.discountRateBasisPoints:u==="reversalRate"?t.reversalRateBasisPoints:u==="grossMargin"?t.grossMarginBasisPoints:u==="averageSellingPrice"?t.averageSellingPrice:t[u];return typeof v=="number"?v:String(v??"")},J=d(()=>z.value.toSorted((t,u)=>{const v=W(t,V.value),H=W(u,V.value);return typeof v=="string"||typeof H=="string"?P.value*String(v).localeCompare(String(H)):P.value*(v-H)})),E=({field:t,direction:u})=>{V.value=t,P.value=u},B=t=>l.mode==="items"?t.itemToken:t.categoryID??"uncategorized",e=t=>t===null?"—":`$${t.toFixed(2)}`,i=t=>t===null?"—":`${(t/100).toFixed(2)}%`,b=t=>
1t.toLocaleString(),M=t=>t!=="name"&&t!=="category"&&t!=="details",X=t=>({numeric:M(t),"details-column":t==="details"}),Z=(t,u)=>{switch(u){case"sku":return String(t.sku??"—");case"name":return N(t);case"category":return Q(t);case"sellingItemCount":return String(t.sellingItemCount);case"netQuantity":return b(t.netQuantity);case"netSales":return e(t.netSales);case"averageSellingPrice":return e(t.averageSellingPrice);case"grossProfit":return e(t.grossProfit);case"grossMargin":return i(t.grossMarginBasisPoints);case"discountRate":return i(t.discountRateBasisPoints);case"reversalRate":return i(t.reversalRateBasisPoints);default:return"—"}},U=d(()=>{const t=l.response;if(!t)return!1;const u=t.profitabilitySupportedRange;return u!==null&&u.startDate>t.dateRange.startDate}),A=d(()=>{const t=l.response;if(!t)return"Profitability is not available for this date range.";const u=t.profitabilitySupportedRange;return u?[`Profitability is supported from ${u.startDate} through ${u.endDate}.`].join(" "):"Profitability is not available for this date range."});return(t,u)=>(s(),m("section",ta,[w(he,{items:J.value,rowKey:B,loading:l.loading,emptyText:l.error?"No Sales Performance results are available.":"No sales match this range and filter.",caption:"Sales Performance",columnControlsHeaderClass:"details-column"},{"header-cells":h(()=>[(s(!0),m(K,null,q(O.value,v=>(s(),m(K,{key:v.id},[v.id!=="details"?(s(),G(_e,{key:0,field:v.id,sortField:V.value,sortDirection:P.value,onSort:E},{default:h(()=>[I(L(v.label),1)]),_:2},1032,["field","sortField","sortDirection"])):j("",!0)],64))),128))]),"column-controls":h(()=>[u[1]||(u[1]=I("Details",-1)),w(ke,{columns:C.value,modelValue:T(R),"onUpdate:modelValue":u[0]||(u[0]=v=>re(R)?R.value=v:null),onReset:T(x)},null,8,["columns","modelValue","onReset"])]),row:h(({item:v})=>[D("tr",null,[(s(!0),m(K,null,q(O.value,H=>(s(),m("td",{key:H.id,class:ce(X(H.id))},[H.id==="details"?(s(),m("span",la,[w(ge,{type:"button","aria-label":`View details for ${N(v)}`,onClick:le=>p("view",v)},{default:h(()=>[...u[2]||(u[2]=[I("View",-1)])]),_:1},8,["aria-label","onClick"])])):H.id==="grossProfit"||H.id==="grossMargin"?(s(),m("span",sa,[D("span",null,L(Z(v,H.id)),1),U.value?(s(),m("button",{key:0,class:"info-button",type:"button","aria-label":A.value,title:A.value},"ⓘ",8,ra)):j("",!0)])):(s(),m("span",oa,L(Z(v,H.id)),1))],2))),128))])]),_:1},8,["items","loading","emptyText"])]))}}),na=ne(ia,[["__scopeId","data-v-3a4b1bd8"]]),ua={class:"sales-pricing-health-table","aria-live":"polite"},ca={key:1},da={key:2},ma=ee({__name:"POSSalesPricingHealthTable",props:{response:{},loading:{type:Boolean},error:{}},emits:["view"],setup(a,{emit:f}){const l=a,p=f,S=[{id:"name",label:"Item",hideable:!1},{id:"category",label:"Category",defaultVisible:!1},{id:"regularPrice",label:"Regular Price",defaultVisible:!1},{id:"effectivePrice",label:"Effective Price",hideable:!1},{id:"replacementCost",label:"Replacement Cost",hideable:!1},{id:"costBasis",label:"Cost Basis",defaultVisible:!1},{id:"projectedGrossProfit",label:"Projected Gross Profit",defaultVisible:!1},{id:"projectedGrossMargin",label:"Projected Gross Margin",hideable:!1},{id:"minimumMargin",label:"Minimum Margin",hideable:!1},{id:"policyLevel",label:"Policy Level",defaultVisible:!1},{id:"marginStatus",label:"Margin Status",hideable:!1},{id:"thirtyDayNetQuantity",label:"30-day Net Quantity",defaultVisible:!1},{id:"onHand",label:"On Hand",defaultVisible:!1},{id:"details",label:"Details",hideable:!1}],{visibility:g,resetToDefaults:C}=Se({columns:S,storageKey:"pos-sales-pricing-health-columns-v1"}),r=d(()=>S.filter(e=>g.value[e.id]!==!1)),R=F("marginStatus"),x=F(1),O={belowPolicy:0,withinPolicy:1,notEvaluable:2},V=(e,i)=>i==="marginStatus"?O[e.marginStatus]:i==="name"?e.name:i==="category"?e.categoryName??"Uncategorized":i==="projectedGrossMargin"?e.projectedGrossMarginBasisPoints??-1/0:i==="minimumMargin"?e.minimumMarginBasisPoints:i==="thirtyDayNetQuantity"?e.thirtyDayNetQuantity:i==="onHand"?e.onHand??-1/0:i==="regularPrice"?e.regularPrice:i==="effectivePrice"?e.effectivePrice:i==="replacementCost"?e.replacementCost??-1/0:i==="projectedGrossProfit"?e.projectedGrossProfit??-1/0:String(e[i]??""),P=d(()=>(l.response?.rows??[]).toSorted((e,i)=>{const b=V(e,R.value),M=V(i,R.value);
1return typeof b=="string"||typeof M=="string"?x.value*String(b).localeCompare(String(M)):x.value*(b-M)})),N=({field:e,direction:i})=>{R.value=e,x.value=i},Q=e=>e===null?"—":`$${e.toFixed(2)}`,z=e=>e===null?"—":`${(e/100).toFixed(2)}%`,W=e=>e==="belowPolicy"?"Below Policy":e==="withinPolicy"?"Within Policy":"Not Evaluable",J=e=>!["name","category","costBasis","policyLevel","marginStatus","details"].includes(e),E=e=>({numeric:J(e),"details-column":e==="details"}),B=(e,i)=>{switch(i){case"name":return e.name;case"category":return e.categoryName??"Uncategorized";case"regularPrice":return Q(e.regularPrice);case"effectivePrice":return Q(e.effectivePrice);case"replacementCost":return Q(e.replacementCost);case"costBasis":return e.costBasis??"—";case"projectedGrossProfit":return Q(e.projectedGrossProfit);case"projectedGrossMargin":return z(e.projectedGrossMarginBasisPoints);case"minimumMargin":return z(e.minimumMarginBasisPoints);case"policyLevel":return e.policyLevel;case"thirtyDayNetQuantity":return e.thirtyDayNetQuantity.toLocaleString();case"onHand":return e.onHand===null?"—":e.onHand.toLocaleString();default:return"—"}};return(e,i)=>(s(),m("section",ua,[w(he,{items:P.value,rowKey:b=>b.itemToken,loading:l.loading,emptyText:l.error?"No Pricing Health results are available.":"No inventory items match this filter.",caption:"Pricing Health",columnControlsHeaderClass:"details-column"},{"header-cells":h(()=>[(s(!0),m(K,null,q(r.value,b=>(s(),m(K,{key:b.id},[b.id!=="details"?(s(),G(_e,{key:0,field:b.id,sortField:R.value,sortDirection:x.value,onSort:N},{default:h(()=>[I(L(b.label),1)]),_:2},1032,["field","sortField","sortDirection"])):j("",!0)],64))),128))]),"column-controls":h(()=>[i[1]||(i[1]=I("Details",-1)),w(ke,{columns:S,modelValue:T(g),"onUpdate:modelValue":i[0]||(i[0]=b=>re(g)?g.value=b:null),onReset:T(C)},null,8,["modelValue","onReset"])]),row:h(({item:b})=>[D("tr",null,[(s(!0),m(K,null,q(r.value,M=>(s(),m("td",{key:M.id,class:ce(E(M.id))},[M.id==="details"?(s(),G(ge,{key:0,type:"button","aria-label":`View Pricing Health details for ${b.name}`,onClick:X=>p("view",b)},{default:h(()=>[...i[2]||(i[2]=[I("View",-1)])]),_:1},8,["aria-label","onClick"])):M.id==="marginStatus"?(s(),m("span",ca,[D("span",{class:ce(["status-label",`status-${b.marginStatus}`])},L(W(b.marginStatus)),3)])):(s(),m("span",da,L(B(b,M.id)),1))],2))),128))])]),_:1},8,["items","rowKey","loading","emptyText"])]))}}),ga=ne(ma,[["__scopeId","data-v-7538a859"]]),va={class:"pricing-health-details"},ya={class:"policy-explanation"},pa={key:0,class:"policy-error",role:"alert"},fa={key:1,class:"policy-error",role:"alert"},ba=["disabled"],Pa=["type","aria-label","onUpdate:modelValue"],ha={key:0},Sa=ee({__name:"POSSalesPricingHealthDetailsModal",props:{row:{},categoryToken:{}},emits:["close"],setup(a,{emit:f}){const l=a,p=f,{modalController:S,showModal:g,closeModal:C}=Ne(),r=ve(l,"row"),R=ve(l,"categoryToken"),x={modalStyles:{desktop:{width:"min(48rem, 92dvw)",maxWidth:"48rem",height:"88dvh"},mobile:{width:"95dvw",maxWidth:"95dvw",height:"90dvh"}}},O=()=>{C(),p("close")};g(x);const V=d(()=>r.value?.itemToken),P=d(()=>({categoryToken:R.value??void 0,itemToken:V.value})),{salesMarginPolicies:N,error:Q}=qe(P),{save:z,remove:W}=ea(),J=Be("analytics"),E=F(!1),B=F(""),e=$e({global:"",category:"",item:""}),i=d(()=>[{level:"global",label:"Global",value:e.global,hasOverride:!0},{level:"category",label:"Current category",value:e.category,hasOverride:b("category")},{level:"item",label:"Current item",value:e.item,hasOverride:b("item")}]),b=n=>N.value.some(y=>y.level===n),M=n=>N.value.find(y=>y.level===n);de([N,r],()=>{const n=M("global");e.global=n?String(n.minimumMarginBasisPoints/100):"40",e.category=M("category")?String(M("category").minimumMarginBasisPoints/100):"",e.item=M("item")?String(M("item").minimumMarginBasisPoints/100):""},{immediate:!0});const X=d(()=>r.value?`Pricing Health: ${r.value.name}`:"Pricing Health details"),Z=d(()=>r.value?r.value.policyLevel==="global"?"Global":r.value.policyLevel==="category"?"Current category":"Current item":"the resolved policy"),U=n=>n===null?"—":`$${n.toFixed(2)}`,A=n=>n===null?"—":`${(n/100).toFixed(2)}%`,t=d(()=>r.value?[{label:"Regular Price",value:U(r.value.regularPrice)},{label:"Effective Price",value:U(r.value.effectivePrice)},{label:"Replacement Cost",value:U(r.value.replacementCost)},{label:"Cost Basis",value:r.value.costBasis??"—"},{label:"Projected Gross Profit",value:U(r.value.projectedGrossProfit)},{label:"Projected Gross Margin",value:A(r.value.projectedGrossMarginBasisPoints)},{label:"Minimum Margin",value:A(r.value.minimumMarginBasisPoints)},{label:"Margin Status",value:v(r.value.marginStatus)}]:[]),u=d(()=>r.value?[{label:"30-day Net Quantity",value:r.value.thirtyDayNetQuantity.toLocaleStr
1ing()},{label:"On Hand",value:r.value.onHand===null?"—":r.value.onHand.toLocaleString()},{label:"30-day Sell-through",value:A(r.value.thirtyDaySellThroughBasisPoints)},{label:"Category",value:r.value.categoryName??"Uncategorized"}]:[]),v=n=>n==="belowPolicy"?"Below Policy":n==="withinPolicy"?"Within Policy":"Not Evaluable",H=async n=>{const y=Number(e[n]);if(!Number.isFinite(y)||y<0||y>100){B.value="Enter a minimum margin between 0 and 100 percent.";return}const k=n==="global"?null:n==="category"?R.value:V.value;if(n!=="global"&&!k){B.value="This policy cannot be changed until its category or item identity is available.";return}E.value=!0,B.value="";try{await z({level:n,subjectToken:k,minimumMarginPercent:y})}catch($){fe($,{logger:J,log:{server:{event:"sales_analytics.policy_save.server_error_handled",message:"Handled Pricing Health policy save server error"},network:{event:"sales_analytics.policy_save.network_error_handled",message:"Handled Pricing Health policy save network error"},unknown:{event:"sales_analytics.policy_save.unknown_error_handled",message:"Handled Pricing Health policy save unknown error"}}}),B.value="The policy could not be saved. No changes were applied; try again."}finally{E.value=!1}},le=async n=>{const y=n==="category"?R.value:V.value;if(y){E.value=!0,B.value="";try{await W(n,y)}catch(k){fe(k,{logger:J,log:{server:{event:"sales_analytics.policy_remove.server_error_handled",message:"Handled Pricing Health policy removal server error"},network:{event:"sales_analytics.policy_remove.network_error_handled",message:"Handled Pricing Health policy removal network error"},unknown:{event:"sales_analytics.policy_remove.unknown_error_handled",message:"Handled Pricing Health policy removal unknown error"}}}),B.value="The policy override could not be removed. No changes were applied; try again."}finally{E.value=!1}}};return(n,y)=>(s(),G(Ge,{modalController:T(S)},{header:h(()=>[w(Pe,{title:X.value},null,8,["title"])]),footer:h(()=>[w(oe,{type:"button",onClick:O},{default:h(()=>[...y[6]||(y[6]=[I("Close",-1)])]),_:1})]),default:h(()=>[D("section",va,[D("section",null,[y[0]||(y[0]=D("h2",null,"Pricing evidence",-1)),w(pe,{rows:t.value,rowDividers:""},null,8,["rows"])]),D("section",null,[y[1]||(y[1]=D("h2",null,"Sales and inventory context",-1)),w(pe,{rows:u.value,rowDividers:""},null,8,["rows"])]),D("section",null,[y[5]||(y[5]=D("h2",null,"Margin policy",-1)),D("p",ya,"The effective policy is "+L(Z.value)+". Category and item overrides inherit from the broader level when not set.",1),B.value?(s(),m("p",pa,L(B.value),1)):T(Q)?(s(),m("p",fa,"Policy settings could not be loaded. You can close and retry the details view.")):j("",!0),D("fieldset",{class:"policy-fields",disabled:E.value},[y[4]||(y[4]=D("legend",null,"Minimum projected gross margin",-1)),(s(!0),m(K,null,q(i.value,k=>(s(),m("label",{class:"policy-field",key:k.level},[D("span",null,L(k.label),1),Re(D("input",{type:(k.level==="global","number"),min:0,max:100,step:.1,"aria-label":`${k.label} minimum projected gross margin percent`,"onUpdate:modelValue":$=>e[k.level]=$},null,8,Pa),[[Me,e[k.level]]]),k.level!=="global"&&!k.hasOverride?(s(),m("span",ha,"Use inherited")):j("",!0),k.level!=="global"&&k.hasOverride?(s(),G(ge,{key:1,type:"button","aria-label":`Remove ${k.label} margin override`,onClick:$=>le(k.level)},{default:h(()=>[...y[2]||(y[2]=[I("Use inherited",-1)])]),_:1},8,["aria-label","onClick"])):j("",!0),w(oe,{type:"button",disabled:k.value==="",onClick:$=>H(k.level)},{default:h(()=>[...y[3]||(y[3]=[I("Save",-1)])]),_:1},8,["disabled","onClick"])]))),128))],8,ba)])])]),_:1},8,["modalController"]))}}),ka=ne(Sa,[["__scopeId","data-v-860ecf2a"]]),_a={key:0,class:"sales-performance"},Da={class:"sales-summary","aria-label":"Sales Summary"},wa={class:"sales-performance__results"},Ca={key:0,class:"sales-performance__error",role:"alert"},Ta={key:1,class:"sales-performance__degraded"},Ra={key:1,class:"pricing-health"},Ma={key:0,class:"sales-performance__error",role:"alert"},$a=ee({__name:"sales-analytics",setup(a){Fe("POS Sales Analytics");const f=F("performance"),l=[{key:"performance",label:"Sales Performance"},{key:"pricing-health",label:"Pricing Health"}],p=F("items"),S=[{key:"items",label:"Items"},{key:"categories",label:"Categories"}],g=F({type:"none",value:"",showHidden:!1});de(p,o=>{o==="categories"&&["text","supplierSKU"].includes(g.value.type)&&(g.value={type:"none",value:"",showHidden:!1})},{flush:"sync"});const{showDialog:C}=Ie(),r=He(),R=Ve.PlainDate.from(r).subtract({days:29}).toString(),{inputStartDate:x,inputEndDate:O,appliedStartDate:V,appliedEndDate:P,applyDraftRangeWithFeedback:N,draftRenderKey:Q,resetToDefaults:z}=Ue({defaultStart:R,defaultEnd:r,showDialog:C}),W=()=>{N()},J=()=>{z()},E=d(()=>
1({mode:p.value,dateRange:{startDate:V.value,endDate:P.value},filter:g.value})),B=d(()=>f.value==="performance"),{salesPerformance:e,error:i,status:b,refresh:M}=Xe(E,B),X=d(()=>({filter:g.value})),Z=d(()=>f.value==="pricing-health"),{pricingHealth:U,error:A,status:t,refresh:u}=Ze(X,Z),v=F(null),H=o=>{e.value&&(v.value={row:o,response:e.value,mode:p.value})},{shopCategories:le}=je(),n=F(null),y=o=>{const c=le.value.find(_=>_.id===o.categoryID);n.value={row:o,categoryToken:c?.token??null}};de(U,o=>{if(!n.value||!o)return;const c=o.rows.find(_=>_.itemToken===n.value?.row.itemToken);c&&(n.value.row=c)});const k=d(()=>{const o=e.value?.summary;return o?[{label:"Gross Sales",value:$(o.grossSales)},{label:"Discounts",value:$(o.discounts)},{label:"Sales Reversals",value:$(o.salesReversals)},{label:"Net Sales",value:$(o.netSales)},{label:"Tax",value:$(o.tax)},{label:"Fees",value:$(o.fulfillmentFees+o.millingFees)},{label:"Total Sales",value:$(o.totalSales)},{label:"Net Quantity",value:o.netQuantity.toLocaleString()},{label:"Transactions",value:o.transactions.toLocaleString()},{label:"ASP",value:$(o.averageSellingPrice)},{label:"ATV",value:$(o.averageTransactionValue)},{label:"UPT",value:o.unitsPerTransaction===null?"—":o.unitsPerTransaction.toFixed(2)},{label:"COGS",value:$(o.cogs)},{label:"Gross Profit",value:$(o.grossProfit)},{label:"Gross Margin",value:we(o.grossMarginBasisPoints)}]:[{label:"Gross Sales",value:"—"},{label:"Discounts",value:"—"},{label:"Sales Reversals",value:"—"},{label:"Net Sales",value:"—"},{label:"Tax",value:"—"},{label:"Fees",value:"—"},{label:"Total Sales",value:"—"},{label:"Net Quantity",value:"—"},{label:"Transactions",value:"—"},{label:"ASP",value:"—"},{label:"ATV",value:"—"},{label:"UPT",value:"—"},{label:"COGS",value:"—"},{label:"Gross Profit",value:"—"},{label:"Gross Margin",value:"—"}]}),$=o=>o===null?"—":`$${o.toFixed(2)}`,we=o=>o===null?"—":`${(o/100).toFixed(2)}%`;return(o,c)=>(s(),G(Ee,null,{header:h(()=>[w(Pe,{title:"Sales Analytics"})]),controls:h(()=>[w(ye,{modelValue:f.value,"onUpdate:modelValue":c[0]||(c[0]=_=>f.value=_),label:"Sales Analytics mode",tabs:l},null,8,["modelValue"]),f.value==="performance"?(s(),m(K,{key:0},[w(xe,null,{default:h(()=>[w(Qe,{"aria-label":"Sales Performance filters"},{default:h(()=>[(s(),G(Oe,{key:T(Q),startDate:T(x),"onUpdate:startDate":c[1]||(c[1]=_=>re(x)?x.value=_:null),endDate:T(O),"onUpdate:endDate":c[2]||(c[2]=_=>re(O)?O.value=_:null),onApply:W,onReset:J},null,8,["startDate","endDate"]))]),_:1})]),_:1}),w(ye,{modelValue:p.value,"onUpdate:modelValue":c[3]||(c[3]=_=>p.value=_),label:"Sales Performance mode",tabs:S},null,8,["modelValue"]),(s(),G(be,{key:p.value,modelValue:g.value,"onUpdate:modelValue":c[4]||(c[4]=_=>g.value=_),showTextFilter:p.value==="items",showSupplierSKUFilter:p.value==="items",showVisibilityControls:!1},null,8,["modelValue","showTextFilter","showSupplierSKUFilter"]))],64)):(s(),G(be,{key:1,modelValue:g.value,"onUpdate:modelValue":c[5]||(c[5]=_=>g.value=_),showVisibilityControls:!1},null,8,["modelValue"]))]),default:h(()=>[f.value==="performance"?(s(),m("section",_a,[c[10]||(c[10]=D("h2",null,"Sales Summary",-1)),D("dl",Da,[(s(!0),m(K,null,q(k.value,_=>(s(),m("div",{key:_.label},[D("dt",null,L(_.label),1),D("dd",null,L(_.value),1)]))),128))]),D("div",wa,[T(i)?(s(),m("p",Ca,[c[9]||(c[9]=I("Sales Performance could not be loaded. Try again or adjust the filters.",-1)),w(oe,{type:"button",onClick:T(M)},{default:h(()=>[...c[8]||(c[8]=[I("Retry",-1)])]),_:1},8,["onClick"])])):T(e)?.profitabilityDegraded?(s(),m("p",Ta,"Some profitability values are unavailable because required cost information could not be verified.")):j("",!0),(s(),G(na,{key:p.value,mode:p.value,response:T(e),loading:T(b)==="pending",error:T(i),onView:H},null,8,["mode","response","loading","error"]))])])):(s(),m("section",Ra,[T(A)?(s(),m("p",Ma,[c[12]||(c[12]=I("Pricing Health could not be loaded. Try again or adjust the filters.",-1)),w(oe,{type:"button",onClick:T(u)},{default:h(()=>[...c[11]||(c[11]=[I("Retry",-1)])]),_:1},8,["onClick"])])):j("",!0),w(ga,{response:T(U),loading:T(t)==="pending",error:T(A),onView:y},null,8,["response","loading","error"])])),v.value?(s(),G(aa,{key:2,row:v.value.row,response:v.value.response,mode:v.value.mode,onClose:c[6]||(c[6]=_=>v.value=null)},null,8,["row","response","mode"])):j("",!0),n.value?(s(),G(ka,{key:3,row:n.value.row,categoryToken:n.value.categoryToken,onClose:c[7]||(c[7]=_=>n.value=null)},null,8,["row","categoryToken"])):j("",!0)]),_:1}))}}),vt=ne($a,[["__scopeId","data-v-2a643860"]]);export{vt 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.