PageSourceSearch

https://zephlyglobal.com/assets/index-D6MFd35X.js

js zephlyglobal.com collected 2026-09-24 14:20:37 UTC 110,313 bytes, 2 lines download raw bytes

1import{j as n,g as Cn,h as bn,c as ce,d as st,f as Ge,e as Oe,u as Pn,r as T,S as ye,T as We,b as M,H as ve,G as ie,B as pe,a4 as An,E as tn,U as Nn,i as wn}from"./index-CizX6laV.js";import{u as Xe}from"./useMutation-BgbbH4my.js";import{U as be}from"./UserErrorAlert-CCApUT1K.js";import{C as Ne}from"./Card-CwJGjGIO.js";import{S as Me}from"./SimpleGrid-C5Qf3rVg.js";import{T as Qe}from"./TextInput-CCVHacg5.js";import{A as je}from"./Alert-CT3ZC58d.js";import{P as at}from"./Paper-C28EM6C6.js";import{B as ae}from"./Badge-Ck_nKJEd.js";import{T as _}from"./Table-9tjYV88B.js";import{g as En,b as Mn}from"./OptionsDropdown-BdEez27M.js";import{I as nn}from"./InputBase-Dwkagcd_.js";import{u as Rt}from"./useQuery-C9Aql4Y3.js";import{M as _n}from"./Modal-Bqvcus0i.js";import{S as Tn}from"./Select-W3IlASEP.js";import{D as gt}from"./Divider-tjnTbUY4.js";import{C as In}from"./Collapse-CUyG3JiV.js";import{C as Un}from"./Checkbox-B1F4Bmbg.js";import{P as rn}from"./Progress-DvC30fNJ.js";import{D as $n}from"./Drawer-BpGUy0hJ.js";import{T as He}from"./Tabs-aAKDhEDf.js";import"./create-safe-context-5nIRqPuy.js";import"./get-sorted-breakpoints-G_ut2g9B.js";import"./get-base-value-JqT_q0U7.js";import"./CloseButton-BzH0WarH.js";import"./use-id-CFeqqdvM.js";import"./ScrollArea-isV4-MRj.js";import"./CheckIcon-B1bfNBMF.js";import"./Popover-CNocAeLk.js";import"./get-floating-position-CwW6Lyx8.js";import"./FocusTrap-Cp0q8dUw.js";import"./use-uncontrolled-BkQMXXxD.js";import"./create-optional-context-BPMLhvkb.js";import"./useBaseQuery-bGtRTCx2.js";import"./use-window-event-C2GHwEn1.js";import"./get-style-object-DUJZA7T_.js";import"./get-auto-contrast-value-Da6zqqWm.js";import"./InputsGroupFieldset-DAnBRBvU.js";import"./create-scoped-keydown-handler-C7O3t3U_.js";function Fn(t){return"group"in t}function Lt({data:t}){if(Fn(t)){const c=t.items.map(a=>n.jsx(Lt,{data:a},a.value));return n.jsx("optgroup",{label:t.group,children:c})}const{value:e,label:r,...s}=t;return n.jsx("option",{value:t.value,...s,children:t.label},t.value)}Lt.displayName="@mantine/core/NativeSelectOption";const Dn={rightSectionPointerEvents:"none"},_e=Cn((t,e)=>{const{data:r,children:s,size:c,error:a,rightSection:o,unstyled:i,...m}=bn("NativeSelect",Dn,t),p=En(r).map((x,f)=>n.jsx(Lt,{data:x},f));return n.jsx(nn,{component:"select",ref:e,...m,__staticSelector:"NativeSelect",size:c,pointer:!0,error:a,unstyled:i,rightSection:o||n.jsx(Mn,{size:c,error:a,unstyled:i}),children:s||p})});_e.classes=nn.classes;_e.displayName="@mantine/core/NativeSelect";const rt=24,On=64,Ln=rt,kt=128,xt=Symbol("rawJsonNumber"),_t=/-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/y,zn=new Set([" ","	",`
2`,"\r"]),Kt=(t,e,r)=>{const s=String(t);if(!s||s.length>On)throw new TypeError(`${r} must fit DECIMAL(${rt},${e})`);const c=s.match(/^([+-]?)(\d+)(?:\.(\d*))?(?:[eE]([+-]?\d+))?$/);if(!c)throw new TypeError(`${r} must be a decimal value`);const[,a,o,i="",m="0"]=c;if(m.replace(/^[+-]/,"").length>2)throw new TypeError(`${r} exponent is outside its declared decimal domain`);const x=Number(m);if(!Number.isInteger(x)||Math.abs(x)>Ln)throw new TypeError(`${r} exponent is outside its declared decimal domain`);let f=`${o}${i}`.replace(/^0+/,"");if(!f)return`0.${"0".repeat(e)}`;const h=x-i.length+e;if(h<0){const P=-h;if(P>f.length||!/^0+$/.test(f.slice(-P)))throw new TypeError(`${r} exceeds its persisted decimal scale`);f=f.slice(0,-P)||"0"}else f+="0".repeat(h);if(f=f.replace(/^0+(?=\d)/,""),f.length>rt)throw new TypeError(`${r} must fit DECIMAL(${rt},${e})`);const d=f.padStart(e+1,"0"),A=d.slice(0,-e)||"0",l=d.slice(-e);if(A.length>rt-e)throw new TypeError(`${r} must fit DECIMAL(${rt},${e})`);return`${a==="-"&&f!=="0"?"-":""}${A}.${l}`},Vn=t=>({[xt]:t}),kn=t=>!!(t!=null&&t[xt]),Kn=t=>{let e=0;const r=()=>{throw new SyntaxError(`Invalid JSON near character ${e}`)},s=()=>{for(;zn.has(t[e]);)e+=1},c=()=>{t[e]!=='"'&&r();const h=e;for(e+=1;e<t.length;){const d=t[e];if(d==="\\")e+=2;else{if(d==='"')return e+=1,JSON.parse(t.slice(h,e));d<" "&&r(),e+=1}}r()},a=(h,d)=>(t.startsWith(h,e)||r(),e+=h.length,d),o=()=>{_t.lastIndex=e;const h=_t.exec(t);return h||r(),e=_t.lastIndex,e<t.length&&!/[\s,}
2\]]/.test(t[e])&&r(),Vn(h[0])},i=h=>{if(h>=kt)throw new SyntaxError(`JSON nesting exceeds ${kt} levels`)},m=h=>{i(h);const d=[];if(e+=1,s(),t[e]==="]")return e+=1,d;for(;e<t.length;){if(d.push(x(h+1)),s(),t[e]==="]")return e+=1,d;t[e]!==","&&r(),e+=1,s()}r()},p=h=>{i(h);const d=Object.create(null);if(e+=1,s(),t[e]==="}")return e+=1,d;for(;e<t.length;){const A=c();if(s(),t[e]!==":"&&r(),e+=1,d[A]=x(h+1),s(),t[e]==="}")return e+=1,d;t[e]!==","&&r(),e+=1,s()}r()},x=(h=0)=>{s();const d=t[e];return d==='"'?c():d==="{"?p(h):d==="["?m(h):d==="t"?a("true",!0):d==="f"?a("false",!1):d==="n"?a("null",null):o()},f=x();return s(),e!==t.length&&r(),f},Bn=t=>t.map(e=>typeof e=="number"?"*":e).join("."),$t=(t,e,r=[])=>{const s=Bn(r),c=e.get(s);if(kn(t))return c===void 0?Number(t[xt]):Kt(t[xt],c,s);if(typeof t=="string")return c===void 0?t:Kt(t,c,s);if(Array.isArray(t))return t.map((a,o)=>$t(a,e,[...r,o]));if(t&&typeof t=="object")return Object.fromEntries(Object.entries(t).map(([a,o])=>[a,$t(o,e,[...r,a])]));if(c!==void 0&&t!==null)throw new TypeError(`${s} must be a decimal value`);return t},St=({moneyPaths:t=[],ratePaths:e=[],moneyFields:r=[],rateFields:s=[]}={})=>{const c=new Map([...[...r,...t].map(a=>[a,6]),...[...s,...e].map(a=>[a,10])]);return async a=>{const o=await a.text();return $t(Kn(o),c)}},ge=(t,e)=>t.flatMap(r=>e.map(s=>`${r}.${s}`)),Hn=St({ratePaths:["confidencePct"]}),qn=["totalSalesAmount","totalSalesQuantity","totalCancellationAmount","totalCancellationQuantity","totalAdSpend","totalRemainingInventoryQuantity","soldProductRemainingInventoryQuantity","previousDayRemainingInventoryQuantity","remainingInventoryDeltaQuantity"],Qn=["netSalesAmount","netSalesQuantity","totalCancellationAmount","totalCancellationQuantity","remainingInventoryQuantity","inboundExpectedQuantity"],Tt=["milkRunCost","storageCost","inventoryLossCompensation","returnCollectionCost","returnRestockingCost","removalCost","saverInsightCost"],sn=St({moneyPaths:[...ge(["summary"],qn),...ge(["productRows.*","resultView.products.*"],Qn),...ge(["productMasterRows.*"],["salePrice","outboundShippingCost","productCost","averageCost","sellerDiscountCoupon"]),...ge(["inventoryRows.*"],["availableInventoryQuantity","inboundExpectedQuantity"]),...ge(["adSpendRows.*"],["adBudget","spentAdAmount","adjustedSpentAdAmount","adjustedAdSpendAmount","excessSpentAmount","billableAdSpend","vatAmount","chargedAmount","adSpendAmount"]),...ge(["manualMonthlyCosts"],Tt),...ge(["manualMonthlyCostRows.*"],["unitProductCost",...Tt]),...ge(["revenueDailyRows.*"],["totalSalesAmount","sellerDiscountCouponAmount","commissionAndVatAmount","shippingAndVatAmount","profitAmount","rocketGrowthAdSpendAmount","adDeductedProfitAmount"]),...ge(["revenueMonthlyRows.*"],["totalSalesAmount","sellerDiscountCouponAmount","commissionAndVatAmount","shippingAndVatAmount","rocketGrowthAdSpendAmount","operatingProfitAmount","extraExpenseAmount","netProfitAmount","adDeductedProfitAmount"]),...ge(["revenueMonthlyRows.*.manualCosts"],Tt),...ge(["focusProductRows.*"],["salesQuantity","totalSalesAmount","grossMarginAmount","adBudget","executedAdSpendAmount","adRevenueAmount","adConversionSalesQuantity","organicSalesQuantity","dailyNetProfitAmount"]),...ge(["salesSheetRows.*"],["netSalesAmount","netSalesQuantity","totalTransactionAmount","totalTransactionQuantity","totalCancellationAmount","totalCancellationQuantity","immediateCancellationQuantity","sellerDiscountCouponAmount","salesCommissionAmount","salesCommissionVatAmount","netSalesAfterCommissionAmount","outboundShippingAmount","outboundShippingVatAmount","netSalesAfterShippingAmount","productCostAmount","vatSettlementAmount","profitAmount","sourcingUnitCost"]),"appliedSourcingCosts.*.unitCost","salesValidation.formulaErrorCandidates.*.netSalesAmount",...ge(["resultView.kpi"],["netSales","expectedPayout","dailyEstimatedProfit","adCostInclVat","pendingSalesAmount","soldQty","cancelledAmount","cancelledQty"]),...ge(["resultView.waterfall.*"],["amount","cumulativeAmount"]),...ge(["resultView.trend.*"],["netSales","productMargin","dailyEstimatedProfit","expectedPayout","adCostInclVat"]),...ge(["resultView.monthlySettlement"],["finalPayout","expectedFinalProfit","expenseAmount"]),"resultView.monthlySettlement.items.*.amount"],ratePaths:["mappingRows.*.candidates.*.confidencePct","productMasterRows.*.salesCommissionRate",...ge(["salesSheetRows.*"],["itemWinnerRate","salesCommissionRate"]),...ge(["focu
2sProductRows.*"],["targetAdRoas","adRoas","salesToAdSpendEfficiency","organicSalesRate"]),"resultView.kpi.marginRatePct"]}),Wn=t=>Ge({url:"/api/sourcing-mappings",init:{method:"PUT",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)},fetchFunc:Oe,responseParser:Hn}),on=({targetDate:t,files:e,manualMonthlyCostRows:r})=>{const s=new FormData;return s.append("targetDate",t),r!=null&&r.length&&s.append("manualMonthlyCostRows",JSON.stringify(r)),e.forEach(c=>s.append("files",c)),s},Gn=({targetDate:t,batchName:e,files:r,manualMonthlyCosts:s,manualMonthlyCostRows:c})=>{const a=on({targetDate:t,files:[]});return a.append("batchName",e||t),c!=null&&c.length?a.append("manualMonthlyCostRows",JSON.stringify(c)):s&&a.append("manualMonthlyCosts",JSON.stringify(s)),r.forEach(o=>a.append("files",o)),a},Jn=({targetDate:t,files:e,manualMonthlyCostRows:r,signal:s})=>Ge({url:"/api/ledger/imports/preview",init:{method:"POST",headers:{Accept:"application/json"},body:on({targetDate:t,files:e,manualMonthlyCostRows:r}),signal:s},fetchFunc:Oe,responseParser:sn}),Yn=({signal:t,...e})=>Ge({url:"/api/ledger/imports",init:{method:"POST",headers:{Accept:"application/json"},body:Gn(e),...t?{signal:t}:{}},fetchFunc:Oe,responseParser:sn}),Xn=({sourcingId:t}={})=>[{queryKey:["sourcing-mappings"]},{queryKey:["sourcing-products"]},{queryKey:["sourcing-product-detail"]},...t?[{queryKey:["sourcing-product-detail",t]}]:[],{queryKey:["sourcing-history"]}],Zn=()=>[{queryKey:["ledger-import-history"]},{queryKey:["ledger-result-summary"]},{queryKey:["sourcing-history"]},{queryKey:["sourcing-products"]},{queryKey:["sourcing-product-detail"]},{queryKey:["sourcing-mappings"]}],an=(t,e)=>{e.forEach(r=>t.invalidateQueries(r))};function er(t){const e=ce.c(5);let r;e[0]!==t?(r=t===void 0?{}:t,e[0]=t,e[1]=r):r=e[1];const{onMappingConfirmed:s}=r,c=st();let a;return e[2]!==s||e[3]!==c?(a={mutationFn:Wn,onSuccess:(o,i)=>{an(c,Xn({sourcingId:i.sourcingId})),s==null||s(i)}},e[2]=s,e[3]=c,e[4]=a):a=e[4],Xe(a)}function tr(){const t=ce.c(1);let e;return t[0]===Symbol.for("react.memo_cache_sentinel")?(e={mutationKey:["ledger-import-preview"],mutationFn:Jn},t[0]=e):e=t[0],Xe(e)}function nr(){const t=ce.c(2),e=st();let r;return t[0]!==e?(r={mutationFn:Yn,onSuccess:()=>an(e,Zn())},t[0]=e,t[1]=r):r=t[1],Xe(r)}const rr="_workspace_lt8im_1",sr="_tabScroller_lt8im_11",ir="_tabList_lt8im_17",or="_calculatorGrid_lt8im_23",ar="_resultCard_lt8im_30",cr="_actionBar_lt8im_35",lr="_toolbar_lt8im_36",ur="_growField_lt8im_40",dr="_tableScroller_lt8im_44",mr="_guideCalculatorGrid_lt8im_48",pr="_guideFocusedControl_lt8im_52",hr="_guidePanel_lt8im_60",gr="_guideStepList_lt8im_64",xr="_guideStep_lt8im_64",fr="_guideStepActive_lt8im_70",yr="_fileField_lt8im_105",oe={workspace:rr,tabScroller:sr,tabList:ir,calculatorGrid:or,resultCard:ar,actionBar:cr,toolbar:lr,growField:ur,tableScroller:dr,guideCalculatorGrid:mr,guideFocusedControl:pr,guidePanel:hr,guideStepList:gr,guideStep:xr,guideStepActive:fr,fileField:yr},jr=[["Parse","파일 읽기"],["Validate","필수 데이터 검증"],["Product Mapping","상품 연결"],["Cost Mapping","원가 연결"],["ABRS Calc","검증 후 장부 계산"]],vr={CONFIRMATION_REQUIRED:"매핑 확인 필요",UNMAPPED:"미매핑 상품 있음",COST_MISSING:"원가 미확인",READY:"가져오기 가능"};function Rr(){const t=Pn(),[e,r]=T.useState([]),[s,c]=T.useState(""),[a,o]=T.useState(""),[i,m]=T.useState(null),[p,x]=T.useState(null),[f,h]=T.useState(""),[d,A]=T.useState({}),l=T.useRef(0),C=tr(),P=nr(),K=async()=>{if(!s||e.length===0)return h("대상 날짜와 XLSX 파일을 선택해 주세요."),null;h("");const g=l.current+1;l.current=g;const w={targetDate:s,files:[...e],revision:g};try{const z=await C.mutateAsync({targetDate:w.targetDate,files:w.files});return w.revision===l.current&&(m(z),x(w)),z}catch{return null}},L=er({onMappingConfirmed:()=>{K()}}),I=()=>{l.current+=1,m(null),x(null),A({})},$=g=>{const w=Array.isArray(g)?g:g?[g]:[];if(w.some(z=>!z.name.toLowerCase().endsWith(".xlsx"))){r([]),I(),h(".xlsx 파일만 업로드할 수 있습니다.");return}h(""),I(),r(w)},U=async g=>{const w=d[g.rowId];if(!w){h("확정할 소싱 후보를 선택해 주세요.");return}try{await L.mutateAsync({marketplace:"COUPANG",productId:g.productId,optionId:g.optionId,sourcingId:w})}catch{}},N=async()=>
2{if(!((i==null?void 0:i.readiness)!=="READY"||!p||P.isPending))try{const g=await P.mutateAsync({targetDate:p.targetDate,batchName:a.trim()||p.targetDate,files:p.files});t(`/app/ledger-result?date=${encodeURIComponent(g.targetDate)}`)}catch{}},v=C.isPending||L.isPending||P.isPending,y=i==null?void 0:i.mappingSummary,F=(p==null?void 0:p.targetDate)===s&&(p==null?void 0:p.files.length)===e.length&&(p==null?void 0:p.files.every((g,w)=>g===e[w]));return n.jsx("section",{"aria-labelledby":"abrs-mapping-title","aria-busy":v,children:n.jsxs(ye,{gap:"md",children:[n.jsxs("div",{children:[n.jsx(We,{id:"abrs-mapping-title",order:2,children:"ABRS 업로드 · 자동 Mapping"}),n.jsx(M,{c:"dimmed",size:"sm",children:"기존 매핑과 유일한 정확 일치는 재사용되며 후보 일치는 직접 확인해야 합니다."})]}),n.jsx(Ne,{withBorder:!0,radius:"lg",padding:"lg",children:n.jsxs(ye,{gap:"md",children:[n.jsxs(Me,{cols:{base:1,sm:3},children:[n.jsx(Qe,{label:"대상 날짜",type:"date",value:s,onChange:g=>{const w=g.currentTarget.value;I(),c(w)},required:!0}),n.jsx(Qe,{label:"배치명",value:a,onChange:g=>o(g.currentTarget.value),placeholder:"미입력 시 대상 날짜"}),n.jsxs("label",{className:oe.fileField,children:[n.jsx(M,{size:"sm",fw:500,children:"ABRS XLSX 파일"}),n.jsx("input",{"aria-label":"ABRS XLSX 파일",type:"file",accept:".xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",multiple:!0,onChange:g=>$(Array.from(g.currentTarget.files||[]))}),n.jsx(M,{size:"xs",c:"dimmed",children:"통합 1개 또는 소스 4개"})]})]}),e.length?n.jsxs(M,{size:"sm",children:["선택 파일: ",e.map(g=>g.name).join(", ")]}):null,f?n.jsx(je,{color:"red",children:f}):null,n.jsx(be,{error:C.error?ve(C.error,{url:"/api/ledger/imports/preview"}):null}),n.jsx(be,{error:L.error?ve(L.error,{url:"/api/sourcing-mappings"}):null}),n.jsx(be,{error:P.error?ve(P.error,{url:"/api/ledger/imports"}):null}),n.jsxs(ie,{justify:"flex-end",children:[n.jsx(pe,{color:"orange",loading:C.isPending,disabled:v,onClick:K,children:"업로드 미리보기"}),n.jsx(pe,{color:"orange",variant:"filled",loading:P.isPending,disabled:v||(i==null?void 0:i.readiness)!=="READY"||!F,onClick:N,children:"최종 ABRS 가져ì˜
2¤ê¸°"})]})]})}),n.jsx(Me,{cols:{base:1,xs:2,md:5},children:jr.map(([g,w],z)=>{const V=!!i,q=V&&z>=2&&i.readiness!=="READY";return n.jsxs(at,{withBorder:!0,p:"md",radius:"md",children:[n.jsxs(ie,{justify:"space-between",children:[n.jsx(M,{fw:800,children:g}),n.jsx(ae,{color:V?q?"orange":"green":"gray",children:V?q?"확인":"완료":"대기"})]}),n.jsx(M,{size:"xs",c:"dimmed",children:w})]},g)})}),!i&&!C.isPending&&!C.error?n.jsx(je,{color:"gray",children:"파일을 선택하고 미리보기를 실행해 주세요."}):null,C.isPending?n.jsx(je,{color:"blue",children:"ABRS 파일을 분석하고 있습니다."}):null,i?n.jsxs(Ne,{withBorder:!0,radius:"lg",padding:"md",children:[n.jsxs(ie,{justify:"space-between",mb:"md",children:[n.jsxs(ie,{children:[n.jsxs(ae,{children:["전체 ",y.totalRows,"ê±´"]}),n.jsxs(ae,{color:"green",children:["기존 ",y.existingMappingCount,"ê±´"]}),n.jsxs(ae,{color:"blue",children:["정확 일치 ",y.autoExactCount,"ê±´"]}),n.jsxs(ae,{color:"orange",children:["확인 필요 ",y.confirmationRequiredCount,"ê±´"]}),n.jsxs(ae,{color:"red",children:["원가 미확인 ",y.costMissingCount,"ê±´"]})]}),n.jsx(ae,{color:i.readiness==="READY"?"green":"orange",children:vr[i.readiness]})]}),i.mappingRows.length===0?n.jsx(je,{color:"gray",children:"매핑할 판매 상품이 없습니다."}):n.jsx(_.ScrollContainer,{minWidth:980,className:oe.tableScroller,children:n.jsxs(_,{striped:!0,highlightOnHover:!0,children:[n.jsx(_.Thead,{children:n.jsxs(_.Tr,{children:[n.jsx(_.Th,{children:"상품"}),n.jsx(_.Th,{children:"Product / Option ID"}),n.jsx(_.Th,{children:"매핑 상태"}),n.jsx(_.Th,{children:"원가 상태"}),n.jsx(_.Th,{children:"소싱 후보"}),n.jsx(_.Th,{children:"확정"})]})}),n.jsx(_.Tbody,{children:i.mappingRows.map(g=>n.jsxs(_.Tr,{children:[n.jsx(_.Td,{children:g.productName||"상품명 없음"}),n.jsxs(_.Td,{children:[g.productId," / ",g.optionId]}),n.jsx(_.Td,{children:g.mappingState==="CONFIRMATION_REQUIRED"?n.jsx(ae,{color:"orange",children:"후보 · 사용자 확인 필요"}):n.jsx(ae,{color:g.ready?"green":"gray",children:g.mappingState})}),n.jsx(_.Td,{children:n.jsxs(ye,{gap:2,children:[n.jsx(M,{size:"sm",children:g.costState}),g.appliedSnapshot?n.jsx(ae,{size:"xs",children:g.appliedSnapshot.costKind}):null]})}),n.jsx(_.Td,{children:g.candidates.length?n.jsx(_e,{"aria-label":`${g.productId} ${g.optionId} 소싱 후보`,data:[{value:"",label:"후보 선택"},...g.candidates.map(w=>({value:w.sourcingId,label:`${w.productName} · ${w.confidencePct}%`}))],value:d[g.rowId]||"",onChange:w=>{const z=w.currentTarget.value;A(V=>({...V,[g.rowId]:z}))}}):g.sourcingId||"후보 없음"}),n.jsx(_.Td,{children:g.mappingState==="CONFIRMATION_REQUIRED"?n.jsx(pe,{size:"xs","aria-label":`${g.productId} ${g.optionId} 매핑 확정`,loading:L.isPending,disabled:v||!d[g.rowId],onClick:()=>U(g),children:"매핑 확정"}):"—"})]},g.rowId))})]})})]}):null]})})}const cn=["from","to","search","status"],Sr=St({moneyPaths:["items.*.productionCost","items.*.expectedSalePrice","items.*.expectedMarginAmount","items.*.rawUnitCost","items.*.marketAveragePrice","items.*.shippingFee","items.*.monthlyViewCount"],ratePaths:["items.*.exchangeRate","items.*.expectedMarginRatePct","items.*.salesCommissionRatePct","items.*.conversionRatePct"]}),ln=(t,e,r)=>{const s=new URLSearchParams;r.forEach(a=>{const o=e==null?void 0:e[a];o!=null&&o!==""&&s.set(a,String(o))});const c=s.toString();return c?`${t}?${c}`:t},Cr=(t={})=>ln("/api/sourcing-history",t,[...cn,"page","size"]),br=(t={})=>ln("/api/sourcing-history/export.csv",t,cn),Pr=(t={})=>["sourcing-history",t.from||null,t.to||null,t.search||null,t.status||null,t.page??0,t.size??20],Ar=({filters:t={},signal:e}={})=>Ge({url:Cr(t),init:{method:"GET",headers:{Accept:"application/json"},signal:e},fetchFunc:Oe,responseParser:Sr}),Nr=t=>{var r,s;if(!t)return"sourcing-history.csv";const e=(r=t.match(/filename\*=UTF-8''([^;]+)/i))==null?void 0:r[1];return e?decodeURIComponent(e.replace(/^"|"$/g,"")):((s=t.match(/filename="?([^";]+)"?/i))==null?void 0:s[1])||"sourcing-history.csv"};async function wr({filters:t={},signal:e}={}){const r=br(t),s=await Oe(r,{method:"GET",headers:{Accept:"text/csv"},signal:e});if(!s.ok){const c=await s.json().catch(()=>({}));throw An({url:r,status:s.status,payload:c})}return{blob:await s.blob(),fileName:Nr(s.headers.get("Content-Disposition"))}}async function Er(t={}){const{blob:e,fileName:r}=await wr(t),s=URL.createObjectURL(e);try{const c=document.createElement("a");c.href=s,c.download=r,c.click()}finally{URL.revokeObjectURL(s)}}function Mr(t,e){const r=ce.c(12);let s;r[0]!==t?(s=t===void 0?{}:t,r[0]=t,r[1]=s):s=r[1];const c=s;let a;r[2]!==e?(a={},r[2]=e,r[3]=a):a=r[3];const o=a;let i;r[4]!==c?(i=Pr(c),r[4]=c,r[5]=i):i=r[5];let m;r[6]!==c?(m=x=>{const{signal:f}=x;return Ar({filters:c,signal:f})},r[6]=c,r[7]=m):m=r[7];let p;return r[8]!==o||r[9]!==i||r[10]!==m?(p={queryKey:i,queryFn:m,placeholderData:_r,...o},r[8]=o,r[9]=i,r[10]=m,r[11]=p):p=r[11],Rt(p)}function _r(t){return t}function Ce(t,e=0){const r=String(t??"").trim().match(/^([+-]?)(\d+)(?:\.(\d*))?$/);if(!r)return null;const[,s,c,a=""]=r,o=a.slice(0,e).padEnd(e,"0"),m=BigInt(`${c}${o}`||"0")+(Number(a[e]||"0")>=5?1n:0n),p=m.toString().padStart(e+1,"0"),x=e?p.slice(0,-e):p,f=e?p.slice(-e):"",h=x.replace(/\B(?=(\d{3})+(?!\d))/g,",");return`${s==="-"&&m!==0n?"-":""}${h}${e?`.${f}`:""}`}function Tr(t){var s;const e=["CNY","KRW"].includes(t.currency),r=Object.hasOwn(t,"rawUnitCost");return{marginResultId:t.marginResultId,productName:"",searchKeyword:t.searchKeyword,supplierUrl:t.supplierUrl,supplierUrls:(s=t.productSourceUrls)!=null&&s.length?t.productSourceUrls:[t.supplierUrl||""],productionCost:e?t.rawUnitCost:r?t.productionCost:null,currency:e?t.currency:"KRW",exchangeRate:e&&t.currency!=="KRW"?t.exchangeRate??"":"1",expectedSalePrice:t.expectedSalePrice,shippingFee:t.shippingFee,salesCommissionRatePct:t.salesCommissionRatePct,monthlyViewCount:t.monthlyViewCount,conversionRatePct:t.conversionRatePct,...t.legacy===!1?{expectedReturnRatePct:"0",returnCollectionFee:"0",returnRestockingFee:"0"}:{},warnings:t.warnings||[]}}const Bt={from:"",to:"",search:"",status:""},un="Asia/Seoul",Ir=t=>{const e=new Intl.DateTimeFormat("ko-KR",{timeZone:un,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(new Date(t)),r=s=>{var c;return(c=e.find(a=>a.type===s))==null?void 0:c.value};return`${r("year")}-${r("month")}-${r("day")}`},lt=t=>
2{if(t==null)return"—";const e=Ce(t);return e===null?"—":`${e}원`};function Ur({onSaveToProduct:t}){var L,I,$,U;const[e,r]=T.useState(Bt),[s,c]=T.useState(Bt),[a,o]=T.useState(0),[i,m]=T.useState(null),[p,x]=T.useState(!1),f={...s,page:a,size:20},h=Mr(f),d=T.useMemo(()=>{var v;return[...((v=h.data)==null?void 0:v.items)||[]].sort((y,F)=>new Date(F.capturedAt)-new Date(y.capturedAt)).reduce((y,F)=>{const g=Ir(F.capturedAt),w=y.find(z=>z.date===g);return w?w.items.push(F):y.push({date:g,items:[F]}),y},[])},[(L=h.data)==null?void 0:L.items]),A=(I=h.data)==null?void 0:I.summary,l=!!(h.isPending||h.isFetching||h.isPlaceholderData),C=Math.max(1,Math.ceil(((($=h.data)==null?void 0:$.totalElements)||0)/20)),P=()=>{c({...e}),o(0)},K=async()=>{x(!0),m(null);try{await Er({filters:s})}catch(N){m(N)}finally{x(!1)}};return n.jsx("section",{"aria-labelledby":"extension-history-title","aria-busy":l,children:n.jsxs(ye,{gap:"md",children:[n.jsxs(ie,{justify:"space-between",align:"flex-end",className:oe.toolbar,children:[n.jsxs("div",{children:[n.jsx(We,{id:"extension-history-title",order:2,children:"Extension 수집 기록"}),n.jsx(M,{c:"dimmed",size:"sm",children:"수집 기록은 검토 후에만 소싱 상품으로 저장됩니다."})]}),n.jsx(pe,{variant:"light",color:"orange",loading:p,onClick:K,children:"전체 필터 CSV 다운로드"})]}),A?n.jsxs(Me,{cols:{base:2,sm:3},children:[n.jsx(at,{withBorder:!0,p:"md",radius:"md",children:n.jsxs(M,{fw:800,children:["전체 ",A.totalCount,"건"]})}),n.jsx(at,{withBorder:!0,p:"md",radius:"md",children:n.jsxs(M,{fw:800,c:"green.7",children:["연결 ",A.linkedCount,"건"]})}),n.jsx(at,{withBorder:!0,p:"md",radius:"md",children:n.jsxs(M,{fw:800,c:"orange.7",children:["미연결 ",A.unlinkedCount,"건"]})})]}):null,n.jsx(Ne,{withBorder:!0,radius:"lg",padding:"md",children:n.jsxs(ie,{align:"flex-end",className:oe.toolbar,children:[n.jsx(Qe,{label:"수집 기록 검색",placeholder:"검색어, URL, SID",value:e.search,onChange:N=>{const v=N.currentTarget.value;r(y=>({...y,search:v}))},className:oe.growField}),n.jsx(Qe,{label:"시작일",type:"date",value:e.from,onChange:N=>{const v=N.currentTarget.value;r(y=>({...y,from:v}))}}),n.jsx(Qe,{label:"종료일",type:"date",value:e.to,onChange:N=>{const v=N.currentTarget.value;r(y=>({...y,to:v}))}}),n.jsx(_e,{label:"연결 상태",value:e.status,data:[{value:"",label:"전체"},{value:"LINKED",label:"연결"},{value:"UNLINKED",label:"미연결"}],onChange:N=>{const v=N.currentTarget.value;r(y=>({...y,status:v}))}}),n.jsx(pe,{color:"orange",onClick:P,children:"조회"})]})}),i?n.jsx(be,{error:ve(i,{url:"/api/sourcing-history/export.csv"})}):null,l&&!h.isError?n.jsx(je,{color:"blue",children:"Extension 수집 기록을 불러오는 중입니다."}):null,h.isError?n.jsx(be,{error:ve(h.error,{url:"/api/sourcing-history"})}):null,!l&&!h.isError&&d.length===0?n.jsx(je,{color:"gray",children:"조건에 맞는 수집 기록이 없습니다."}):null,!l&&d.map(N=>n.jsxs(Ne,{withBorder:!0,radius:"lg",padding:"md",children:[n.jsx(We,{order:3,size:"md",mb:"sm",children:N.date}),n.jsx(_.ScrollContainer,{minWidth:880,className:oe.tableScroller,"data-testid":"history-table-scroll",children:n.jsxs(_,{striped:!0,highlightOnHover:!0,children:[n.jsx(_.Thead,{children:n.jsxs(_.Tr,{children:[n.jsx(_.Th,{children:"수집 시각"}),n.jsx(_.Th,{children:"검색 키워드"}),n.jsx(_.Th,{children:"환산 원가(KRW)"}),n.jsx(_.Th,{children:"예상 판매가"}),n.jsx(_.Th,{children:"예상 마진"}),n.jsx(_.Th,{children:"SID"}),n.jsx(_.Th,{children:"작업"})]})}),n.jsx(_.Tbody,{children:N.items.map(v=>{var y;return n.jsxs(_.Tr,{children:[n.jsx(_.Td,{children:new Date(v.capturedAt).toLocaleTimeString("ko-KR",{timeZone:un,hour:"2-digit",minute:"2-digit"})}),n.jsx(_.Td,{children:v.searchKeyword||"검색어 없음"}),n.jsxs(_.Td,{children:[lt(v.productionCost),v.currency&&v.rawUnitCost!=null?n.jsxs(M,{size:"xs",c:"dimmed",children:["입력 ",Ce(v.rawUnitCost)," ",v.currency]}):null,(y=v.warnings)!=null&&y.length?n.jsx(M,{size:"xs",c:"orange.8",children:"통화·판매가·수집값 확인 필요"}):null]}),n.jsxs(_.Td,{children:[lt(v.expectedSalePrice),v.marketAveragePrice!=null?n.jsxs(M,{size:"xs",c:"dimmed",children:["시장 평균 ",lt(v.marketAveragePrice)]}):null]}),n.jsx(_.Td,{children:lt(v.expectedMarginAmount)}),n.jsx(_.Td,{children:v.sourcingId?n.jsxs(ye,{gap:2,children:[n.jsx(M,{size:"sm",children:v.sourcingId}),n.jsx(ae,{size:"xs",children:v.sourcingStatus})]}):n.jsx(ae,{color:"gray",children:v.legacy?"레거시 수집 · SID 미연결":"SID 미연결"})}),n.jsx(_.Td,{children:v.sourcingId?n.jsx(M,{size:"sm",c:"dimmed",children:"저장 완료"}):n.jsx(pe,{size:"xs",variant:"light",color:"orange","aria-label":`${v.marginResultId} 소싱 상품 저장`,onClick:()=>t==null?void 0:t(Tr(v)),children:"소싱 상품 저장"})})]},v.marginResultId)})})]})})]},N.date)),!h.isPending&&!h.isError&&((U=h.data)==null?void 0:U.totalElements)>0?n.jsxs(ie,{justify:"center",children:[n.jsx(pe,{variant:"default",disabled:l||a===0,onClick:()=>{l||o(N=>N-1)},children:"이전 페이지"}),n.jsx(M,{children:l?"페이지 불러오는 중":`${a+1} / ${C}`}),n.jsx(pe,{variant:"default","aria-label":"다음 페이지",disabled:l||a+1>=C,onClick:()=>{l||o(N=>N+1)},children:"다음 페이지"})]}):null]})})}const $r={Accept:"application/json","Content-Type":"application/json"},zt={Accept:"application/json"},ut=(t,e)=>t.flatMap(r=>e.map(s=>`${r}.${s}`)),dn=["convertedUnitCost","shippingVatAmount","commissionAmount","commissionVatAmount","purchaseVatCreditAmount","estimatedVatAmount","returnReserveAmount","returnCostAmou
2nt","returnCostVatAmount","totalReturnAmount","expectedMarginAmount","expectedSalesQuantity","monthlyRevenueAmount","monthlyMarginAmount","appliedSalesQuantity","requiredSalesQuantity","requiredMonthlyViewCount","totalRevenueAmount","totalEstimatedVatAmount","totalMarginAmount"],mn=["expectedMarginRatePct","minimumRoasPct","totalMarginRatePct"],Fr=["rawUnitCost","convertedUnitCost","expectedSalePrice","shippingFee","returnCollectionFee","returnRestockingFee","monthlyViewCount","expectedMonthlySales","targetMonthlyProfit",...dn.slice(1)],Dr=["exchangeRate","salesCommissionRatePct","expectedReturnRatePct","targetMarginRatePct","conversionRatePct",...mn],Ht=["snapshots.*","items.*.currentSnapshot"],qt=["latestActualMargin","items.*.latestActualMargin"],Ct=St({moneyPaths:[...dn,...ut(Ht,Fr),...ut(qt,["actualMarginAmount","netSalesAmount"])],ratePaths:[...mn,"exchangeRate","*.exchangeRate",...ut(Ht,Dr),"mappings.*.confidencePct","items.*.mappings.*.confidencePct",...ut(qt,["actualMarginRatePct"])]}),Or=(t,e,r)=>{const s=new URLSearchParams;r.forEach(a=>{const o=e==null?void 0:e[a];o!=null&&o!==""&&s.set(a,String(o))});const c=s.toString();return c?`${t}?${c}`:t},bt=(t,e,r)=>Ge({url:t,init:{method:e,headers:$r,body:JSON.stringify(r)},fetchFunc:Oe,responseParser:Ct}),Lr=(t={})=>Or("/api/sourcing-products",t,["search","status","page","size"]),Vt=t=>`/api/sourcing-products/${encodeURIComponent(t)}`,zr=(t={})=>["sourcing-products",t.search||null,t.status||null,t.page??0,t.size??20],pn=t=>["sourcing-product-detail",t||null],hn=()=>["sourcing-logistics-rates"],Vr=({filters:t={},signal:e}={})=>Ge({url:Lr(t),init:{method:"GET",headers:zt,signal:e},fetchFunc:Oe,responseParser:Ct}),kr=({sourcingId:t,signal:e})=>Ge({url:Vt(t),init:{method:"GET",headers:zt,signal:e},fetchFunc:Oe,responseParser:Ct}),Kr=t=>bt("/api/sourcing-products","POST",t),Br=({sourcingId:t,patch:e})=>bt(Vt(t),"PATCH",e),Hr=({sourcingId:t,snapshot:e})=>bt(`${Vt(t)}/snapshots`,"POST",e),qr=({signal:t}={})=>Ge({url:"/api/sourcing-products/logistics-rates",init:{method:"GET",headers:zt,signal:t},fetchFunc:Oe,responseParser:Ct}),Qr=t=>bt("/api/sourcing-products/logistics-rates","PUT",t),Pt=({sourcingId:t,history:e=!1,rates:r=!1}={})=>[{queryKey:["sourcing-products"]},...t?[{queryKey:pn(t)}]:[],...e?[{queryKey:["sourcing-history"]}]:[],...r?[{queryKey:hn()}]:[]],At=(t,e)=>{e.forEach(r=>t.invalidateQueries(r))};function Wr(t,e){const r=ce.c(12);let s;r[0]!==t?(s=t===void 0?{}:t,r[0]=t,r[1]=s):s=r[1];const c=s;let a;r[2]!==e?(a={},r[2]=e,r[3]=a):a=r[3];const o=a;let i;r[4]!==c?(i=zr(c),r[4]=c,r[5]=i):i=r[5];let m;r[6]!==c?(m=x=>{const{signal:f}=x;return Vr({filters:c,signal:f})},r[6]=c,r[7]=m):m=r[7];let p;return r[8]!==o||r[9]!==i||r[10]!==m?(p={queryKey:i,queryFn:m,placeholderData:Gr,...o},r[8]=o,r[9]=i,r[10]=m,r[11]=p):p=r[11],Rt(p)}function Gr(t){return t}function Jr(t,e){const r=ce.c(11);let s;r[0]!==e?(s=e===void 0?{}:e,r[0]=e,r[1]=s):s=r[1];const c=s;let a;r[2]!==t?(a=pn(t),r[2]=t,r[3]=a):a=r[3];let o;r[4]!==t?(o=p=>{const{signal:x}=p;return kr({sourcingId:t,signal:x})},r[4]=t,r[5]=o):o=r[5];const i=!!t;let m;return r[6]!==c||r[7]!==a||r[8]!==o||r[9]!==i?(m={queryKey:a,queryFn:o,enabled:i,...c},r[6]=c,r[7]=a,r[8]=o,r[9]=i,r[10]=m):m=r[10],Rt(m)}function gn(){const t=ce.c(2),e=st();let r;return t[0]!==e?(r={mutationFn:Kr,onSuccess:s=>{var c;return At(e,Pt({sourcingId:(c=s==null?void 0:s.product)==null?void 0:c.sourcingId,history:!0}))}},t[0]=e,t[1]=r):r=t[1],Xe(r)}function Yr(){const t=ce.c(2),e=st();let r;return t[0]!==e?(r={mutationFn:Br,onSuccess:(s,c)=>At(e,Pt({sourcingId:c.sourcingId}))},t[0]=e,t[1]=r):r=t[1],Xe(r)}function Xr(){const t=ce.c(2),e=st();let r;return t[0]!==e?(r={mutationFn:Hr,onSuccess:(s,c)=>At(e,Pt({sourcingId:c.sourcingId}))},t[0]=e,t[1]=r):r=t[1],Xe(r)}function xn(t){const e=ce.c(5);let r;e[0]!==t?(r=t===void 0?{}:t,e[0]=t,e[1]=r):r=e[1];const s=r;let c;e[2]===Symbol.for("react.memo_cache_sentinel")?(c=hn(),e[2]=c):c=e[2];let a;return e[3]!==s?(a={queryKey:c,queryFn:Zr,...s},e[3]=s,e[4]=a):a=e[4],Rt(a)}function Zr(t){const{signal:e}=t;return qr({signal:e})}function fn(){const t=ce.c(2),e=st();let r;return t[0]!==e?(r={mutationFn:Qr,onSuccess:()=>At(e,Pt({rates:!0}))},t[0]=e,t[1]=r):r=t[1],Xe(r)}const Y=6,De=10,Ye=24,Qt=64,es=Ye,ft=t=>10n**BigInt(t),ts=(t,e)=>{let r=t<0n?-t:t,s=e<0n?-e:e;for(;s!==0n;)[r,s]=[s,r%s];return r||1n},se=(t,e=1n)=>{if(e===0n)throw new TypeError("decimal denominator must not be zero");const r=e<0n?-1n:1n,s=ts(t,e);return{numerator:t/s*r,denominator:e/s*r}},ns=(t,e)=>{if(typeof t=="number"){if(!Number.isFinite(t)||Math.abs(t)>Number.MAX_SAFE_INTEGER)throw new TypeError(`${e} must be supplied as a decimal string outside the safe range`);return String(t)}if(typeof t!="string")throw new TypeError(`${e} must be a decimal string or safe number`);return t.trim()},Ae=(t,e,r)=>{const s=ns(t,e);if(!s||s.length>Qt)throw new TypeError(`${e} must fit DECIMAL(${Ye},${r})`);const c=s.match(/^([+-]?)(\d+)(?:\.(\d*))?(?:[eE]([+-]?\d+))?$/);if(!c)throw new TypeError(`${e} must be numeric`);const[,a,o,i="",m="0"]=c;if(o.length+i.length>Qt)throw new TypeError(`${e} must fit DECIMAL(${Ye},${r})`);if(m.replace(/^[+-]/,"").length>2)throw new TypeError(`${e} exponent is outside the supported decimal domain`);const p=Number(m);if(!Number.isInteger(p)||Math.abs(p)>es)throw new TypeError(`${e} exponent is outside the supported decimal domain`);let x=`${o}${i}`.replace(/^0+(?=\d)/,""),f=i.length-p;for(;f>0&&x.endsWith("0");)x=x.slice(0,-1),f-=1;if(x===""||/^0+$/.test(x))return se(0n);if(f>r)throw new TypeError(`${e} must have at most ${r} decimal places`);if(x.length-f>Ye-r)throw new TypeError(`${e} must fit DECIMAL(${Ye},${r})`);let d=BigInt(x)*(a==="-"?-1n:1n);return f<0?(d*=ft(-f),se(d)):se(d,ft(f))},ot=(t,e,r,s)=>t==null||typeof t=="string"&&!t.trim()?Ae(s,e,r):Ae(t,e,r),rs=(t,e,r)=>t==null||typeof t=="string"&&!t.trim()?null:Ae(t,e,r),nt=(t,e)=>
2se(t.numerator*e.denominator-e.numerator*t.denominator,t.denominator*e.denominator),Wt=(t,e)=>se(t.numerator*e.denominator+e.numerator*t.denominator,t.denominator*e.denominator),ee=(t,e)=>se(t.numerator*e.numerator,t.denominator*e.denominator),Fe=(t,e)=>{if(e.numerator===0n)throw new TypeError("cannot divide by zero");return se(t.numerator*e.denominator,t.denominator*e.numerator)},le=(t,e)=>t.numerator*e.denominator-e.numerator*t.denominator,ss=(t,e)=>{const r=t.numerator*ft(e),s=r<0n,c=s?-r:r,a=c/t.denominator,i=c%t.denominator*2n>=t.denominator?a+1n:a;return s?-i:i},re=(t,e,r)=>{const s=ss(e,r),c=s<0n?-s:s;if(c>=ft(Ye))throw new TypeError(`${t} must fit DECIMAL(${Ye},${r})`);const a=s<0n,o=String(c).padStart(r+1,"0"),i=o.slice(0,-r)||"0",m=o.slice(-r);return`${a?"-":""}${i}.${m}`},dt=(t,e)=>{const r=se(0n),s=se(100n);if(le(e,r)<0n||le(e,s)>0n)throw new TypeError(`${t} must be between zero and one hundred`)},is="SOURCING_MARGIN_V2";function os(t){const e=Ae(t.rawUnitCost,"rawUnitCost",Y),r=Ae(t.exchangeRate,"exchangeRate",De);if(le(e,se(0n))<0n||le(r,se(0n))<=0n)throw new TypeError("원가와 환율을 확인해 주세요.");const s=typeof t.currency=="string"?t.currency.trim():"";if(!s||[...s].length>32)throw new TypeError("통화를 확인해 주세요.");return re("convertedUnitCost",s.toUpperCase()==="KRW"?e:ee(e,r),Y)}function yn(t){const e=typeof(t==null?void 0:t.currency)=="string"?t.currency.trim():"";if(!e||[...e].length>32)throw new TypeError("currency must contain between one and 32 characters");const r=Ae(t.rawUnitCost,"rawUnitCost",Y),s=Ae(t.exchangeRate,"exchangeRate",De),c=Ae(t.expectedSalePrice,"expectedSalePrice",Y),a=Ae(t.shippingFee,"shippingFee",Y),o=Ae(t.salesCommissionRatePct,"salesCommissionRatePct",De),i=Ae(t.expectedReturnRatePct,"expectedReturnRatePct",De),m=Ae(t.targetMarginRatePct,"targetMarginRatePct",De),p=ot(t.returnCollectionFee,"returnCollectionFee",Y,"0"),x=ot(t.returnRestockingFee,"returnRestockingFee",Y,"0"),f=ot(t.monthlyViewCount,"monthlyViewCount",Y,"0"),h=ot(t.conversionRatePct,"conversionRatePct",De,"3"),d=rs(t.expectedMonthlySales,"expectedMonthlySales",Y),A=ot(t.targetMonthlyProfit,"targetMonthlyProfit",Y,"0"),l=se(0n);if(le(c,l)<=0n)throw new TypeError("expectedSalePrice must be greater than zero");if(le(r,l)<0n)throw new TypeError("rawUnitCost must not be negative");if(le(s,l)<=0n)throw new TypeError("exchangeRate must be greater than zero");if(le(a,l)<0n)throw new TypeError("shippingFee must not be negative");if(le(p,l)<0n)throw new TypeError("returnCollectionFee must not be negative");if(le(x,l)<0n)throw new TypeError("returnRestockingFee must not be negative");if(le(f,l)<0n)throw new TypeError("monthlyViewCount must not be negative");if(d!==null&&le(d,l)<0n)throw new TypeError("expectedMonthlySales must not be negative");if(le(A,l)<0n)throw new TypeError("targetMonthlyProfit must not be negative");dt("salesCommissionRatePct",o),dt("expectedReturnRatePct",i),dt("targetMarginRatePct",m),dt("conversionRatePct",h);const C=se(1n,10n),P=se(1n,100n),K=e.toUpperCase()==="KRW"?r:ee(r,s),L=ee(a,C),I=ee(ee(c,o),P),$=ee(I,C),U=Fe(K,se(11n)),N=Fe(c,se(11n)),v=nt(nt(nt(N,U),L),$),y=le(v,l)>0n?v:l,F=l,g=ee(ee(i,Wt(p,x)),P),w=ee(g,C),z=Wt(g,w),V=[K,a,L,I,$,y].reduce((de,me)=>nt(de,me),c),q=ee(Fe(V,c),se(100n)),Q=le(V,l)>0n?ee(Fe(ee(c,se(11n,10n)),V),se(100n)):null,b=ee(ee(f,h),P),E=d!==null&&le(d,l)>0?d:b,D=ee(c,b),W=ee(V,b),G=le(V,l)>0?Fe(A,V):null,X=G!==null&&le(h,l)>0?Fe(ee(G,se(100n)),h):null,te=ee(c,E),J=ee(K,E),O=ee(a,E),k=ee(L,E),Z=ee(I,E),u=ee($,E),S=ee(g,E),R=ee(w,E),B=[Fe(J,se(11n)),k,u,R].reduce((de,me)=>nt(de,me),Fe(te,se(11n))),ne=le(B,l)>0?B:l,ue=[J,O,k,Z,u,S,R,ne].reduce((de,me)=>nt(de,me),te),he=le(te,l)===0n?l:ee(Fe(ue,te),se(100n));return{convertedUnitCost:re("convertedUnitCost",K,Y),shippingVatAmount:re("shippingVatAmount",L,Y),commissionAmount:re("commissionAmount",I,Y),commissionVatAmount:re("commissionVatAmount",$,Y),purchaseVatCreditAmount:re("purchaseVatCreditAmount",U,Y),estimatedVatAmount:re("estimatedVatAmount",y,Y),returnReserveAmount:re("returnReserveAmount",F,Y),returnCostAmou
2nt:re("returnCostAmount",g,Y),returnCostVatAmount:re("returnCostVatAmount",w,Y),totalReturnAmount:re("totalReturnAmount",z,Y),expectedMarginAmount:re("expectedMarginAmount",V,Y),expectedMarginRatePct:re("expectedMarginRatePct",q,De),minimumRoasPct:Q===null?null:re("minimumRoasPct",Q,De),expectedSalesQuantity:re("expectedSalesQuantity",b,Y),monthlyRevenueAmount:re("monthlyRevenueAmount",D,Y),monthlyMarginAmount:re("monthlyMarginAmount",W,Y),appliedSalesQuantity:re("appliedSalesQuantity",E,Y),requiredSalesQuantity:G===null?null:re("requiredSalesQuantity",G,Y),requiredMonthlyViewCount:X===null?null:re("requiredMonthlyViewCount",X,Y),totalRevenueAmount:re("totalRevenueAmount",te,Y),totalEstimatedVatAmount:re("totalEstimatedVatAmount",ne,Y),totalMarginAmount:re("totalMarginAmount",ue,Y),totalMarginRatePct:re("totalMarginRatePct",he,De),calculationVersion:is}}const Ft=[{value:"KOREA",label:"대한민국"},{value:"CHINA",label:"중국"},{value:"USA",label:"미국"},{value:"JAPAN",label:"일본"},{value:"SOUTHEAST_ASIA",label:"동남아시아"},{value:"OTHER",label:"기타"}],yt=t=>({KOREA:{currency:"KRW",exchangeRate:"1"},CHINA:{currency:"CNY",exchangeRate:""},USA:{currency:"USD",exchangeRate:""},JAPAN:{currency:"JPY",exchangeRate:""},SOUTHEAST_ASIA:{currency:"USD",exchangeRate:""},OTHER:{currency:"USD",exchangeRate:""}})[t],Dt=()=>{const t=new Date;return new Date(t.getTime()-t.getTimezoneOffset()*6e4).toISOString().slice(0,10)},as=()=>({productName:"",supplierUrl:"",supplierUrls:[""],providerId:"",listingUrl:"",sourceMarginResultId:null,effectiveDate:Dt(),costKind:"EXPECTED",sourceChannel:"WEB",originCountry:"CHINA",providerName:"",rawUnitCost:"",currency:"CNY",exchangeRate:"",expectedSalePrice:"",shippingFee:"0",salesCommissionRatePct:"10.8",expectedReturnRatePct:"8",targetMarginRatePct:"30",returnCollectionFee:"0",returnRestockingFee:"",monthlyViewCount:"0",conversionRatePct:"3",expectedMonthlySales:"",targetMonthlyProfit:"1000000"}),jn=t=>{const e=Number(t);return!Number.isFinite(e)||e<0?"0":e<5e3?"300":e<1e4?"400":e<15e3?"600":e<2e4?"800":"1000"},Gt=t=>({rawUnitCost:t.rawUnitCost,currency:t.currency,exchangeRate:t.exchangeRate,expectedSalePrice:t.expectedSalePrice,shippingFee:t.shippingFee,salesCommissionRatePct:t.salesCommissionRatePct,expectedReturnRatePct:t.expectedReturnRatePct,targetMarginRatePct:t.targetMarginRatePct,returnCollectionFee:t.returnCollectionFee,returnRestockingFee:t.returnRestockingFee||jn(t.expectedSalePrice),monthlyViewCount:t.monthlyViewCount,conversionRatePct:t.conversionRatePct,expectedMonthlySales:t.expectedMonthlySales.trim()||null,targetMonthlyProfit:t.targetMonthlyProfit}),jt=t=>JSON.stringify([t.originCountry||t.countryCode||"OTHER",t.providerName||t.name,t.currency]),ct=t=>{if(!t.trim())return!0;try{return["http:","https:"].includes(new URL(t).protocol)}catch{return!1}};function Ot(t,e){try{return JSON.parse(localStorage.getItem(t))??e}catch{return e}}function cs(t,e){const r=new Set(e.hidden||[]),s=new Map((e.items||[]).map(a=>[a.id,a]));return[...t.map(a=>({id:jt(a),countryCode:a.originCountry||"OTHER",name:a.providerName,currency:a.currency,rate:a.exchangeRate,url:"",serverKey:jt(a)})).filter(a=>!r.has(a.serverKey)&&!s.has(a.id)),...s.values()]}function ls(t,e){return t.name.trim()?!Number.isFinite(Number(t.rate))||Number(t.rate)<=0?"기본 환율은 0보다 커야 합니다.":ct(t.url)?e.some(r=>r.id!==t.id&&r.countryCode===t.countryCode&&r.name.trim().toLocaleLowerCase()===t.name.trim().toLocaleLowerCase())?"같은 국가에 동일한 이름의 배송 대행지가 있습니다.":"":"URL은 http:// 또는 https:// 주소를 입력해 주세요.":"배송 대행지 이름을 입력해 주세요."}const us="_page_ozmv5_1",ds="_pageHead_ozmv5_7",ms="_badge_ozmv5_27",ps="_tabs_ozmv5_39",hs="_tab_ozmv5_39",gs="_contentRoot_ozmv5_56",xs="_modalRoot_ozmv5_57",fs="_inlineActions_ozmv5_74",ys="_formActions_ozmv5_75",js="_deleteConfirm_ozmv5_76",vs="_calculatorGrid_ozmv5_146",Rs="_stack_ozmv5_153",Ss="_card_ozmv5_159",Cs="_cardHead_ozmv5_168",bs="_cardBody_ozmv5_190",Ps="_fields2_ozmv5_198",As="_fields3_ozmv5_199",Ns="_fields4_ozmv5_200",ws="_divider_ozmv5_218",Es="_fieldLabel_ozmv5_223",Ms="_urlList_ozmv5_229",_s="_urlRow_ozmv5_234",Ts="_urlActions_ozmv5_245",Is="_help_ozmv5_265",Us="_profileBar_ozmv5_273",$s="_soft_ozmv5_302",Fs="_quick_ozmv5_308",Ds="_optionalToggle_ozmv5_319",Os="_notice_ozmv5_329",Ls="_error_ozmv5_340",zs="_checkbox_ozmv5_349",Vs="_resultPanel_ozmv5_360",ks="_resultHero_ozmv5_372",Ks="_eyebrow_ozmv5_378",Bs="_rateRow_ozmv5_385",Hs="_status_ozmv5_405",qs="_progress_ozmv5_429",Qs="_scale_ozmv5_443",Ws="_metrics_ozmv5_451",Gs="_metric_ozmv5_451",Js="_wide_ozmv5_480",Ys="_breakdown_ozmv5_491",Xs="_resultSection_ozmv5_522",Zs="_resultActions_ozmv5_547",ei="_primary_ozmv5_554",ti="_empty_ozmv5_566",ni="_modalTitle_ozmv5_577",ri="_managerGrid_ozmv5_582",si="_providerItem_ozmv5_589",ii="_savedId_ozmv5_686",oi="_dataView_ozmv5_693",ai="_lossNotice_ozmv5_716",ci="_fieldError_ozmv5_727",li="_field_ozmv5_198",ui="_inputWithUnit_ozmv5_741",di="_inputUnit_ozmv5_750",j={page:us,pageHead:ds,badge:ms,tabs:ps,tab:hs,contentRoot:gs,modalRoot:xs,inlineActions:fs,formActions:ys,deleteConfirm:js,calculatorGrid:vs,stack:Rs,card:Ss,cardHead:Cs,cardBody:bs,fields2:Ps,fields3:As,fields4:Ns,divider:ws,fieldLabel:Es,urlList:Ms,urlRow:_s,urlActions:Ts,help:Is,profileBar:Us,soft:$s,quick:Fs,optionalToggle:Ds,notice:Os,error:Ls,checkbox:zs,resultPanel:Vs,resultHero:ks,eyebrow:Ks,rateRow:Bs,status:Hs,progress:qs,scale:Qs,metrics:Ws,metric:Gs,wide:Js,breakdown:Ys,resultSection:Xs,resultActions:Zs,primary:ei,empty:ti,modalTitle:ni,managerGrid:ri,providerItem:si,savedId:ii,dataView:oi,lossNotice:ai,fieldError:ci,field:li,inputWithUnit:ui,inputUnit:di},Jt=t=>({id:"",countryCode:t,name:"",currency:yt(t).currency,rate:t==="KOREA"?"1":"",url:""});function mi({opened:t,onClose:e,country:r,profiles:s,onSave:c,onDelete:a}){const[o,i]=T.useState(()=>Jt(r)),[m,p]=T.useState(""),[x,f]=T.useState(null),h=l=>C=>i(P=>({...P,[l]:C.target.value})),d=()=>{i(Jt(r)),p("")},A=()=>{const l=ls(o,s);if(l){p(l);return}try{c({...o,id:o.id||crypto.randomUUID(),name:o.name.trim(),url:o.url.trim()}),d()}catch{p("브라우저 저장 공간을 확인해 주세요. 변경 내용을 저장하지 못했습니다.")}};return n.jsxs(_n,{opened:t,onClose:e,title:"배송 대행지 관리",size:900,centered:!0,classNames:{content:j.modalRoot,title:j.modalTitle},children:[n.jsx("p",{className:j.help,children:"국가별 배송 대행지의 통화와 기본 환율을 관리합니다. 프로필 편집·삭제·URL은 현재 계정의 이 브라우저에 저장됩니다."}),n.jsxs("div",{className:j.managerGrid,children:[n.jsxs("section",{className:j.card,"aria-label":"등록된 배송 대행지",children:[n.jsxs("div",{className:j.cardHead,children:[n.jsx("h3",{children:"등록된 배송 대행지"}),n.jsxs("span",{children:[s.length,"개"]})]}),s.length===0?n.jsx("p",{className:j.empty,children:"등록된 배송 대행지가 없습니다. 오른쪽에서 추가해 주세요."}):s.map(l=>{var C;return n.jsxs("div",{className:j.providerItem,children:[n.jsxs("div",{children:[n.jsx("strong",{children:l.name}),n.jsxs("p",{children:[(C=Ft.find(P=>P.value===l.countryCode))==null?void 0:C.label," ·"," ",l.currency," · 기본 환율 ",l.rate,"원"]}),l.url?n.jsx("a",{href:l.url,target:"_blank",rel:"noreferrer",children:"배송 대행지 사이트 ↗"}):null]}),n.jsxs("div",{className:j.inlineActions,children:[n.jsx("button",{type:"button","aria-label":`${l.name} 수정`,onClick:()=>{i({...l}),p("")},children:"수정"}),n.jsx("button",{type:"button","aria-label":`${l.name} 삭제`,onClick:()=>f(l),children:"삭제"})]})]},l.id)})]}),n.jsxs("section",{className:j.card,children:[n.jsx("div",{className:j.cardHead,children:n.jsx("h3",{children:o.id?"배송 대행지 수정":"배송 대행지 추가"})}),n.jsxs("div",{className:j.cardBody,children:[n.jsxs("div",{className:j.fields2,children:[n.jsxs("label",{children:["공급 국가",n.jsx("select",{"aria-label":"관리 공급 국가",value:o.countryCode,onChange:l=>{const C=l.target.value;i(P=>({...P,countryCode:C,currency:yt(C).currency,rate:C==="KOREA"?"1":""}))},children:Ft.map(l=>n.jsx("option",{value:l.value,children:l.label},l.value))})]}),n.jsxs("label",{children:["배송 대행지 / 물류사명",n.jsx("input",{value:o.name,onChange:h("name"),placeholder:"배송 대행지 이름"})]}),n.jsxs("label",{children:["기본 통화",n.jsx("select",{value:o.currency,onChange:h("currency"),children:["CNY","KRW","USD","JPY","VND"].map(l=>n.jsx("option",{children:l},l))})]}),n.jsxs("label",{children:["기본 적용 환율",n.jsx("input",{inputMode:"decimal",value:o.rate,onChange:h("rate"),placeholder:"예: 200"})]})]}),n.jsxs("label",{children:["배송 대행지 URL",n.jsx("input",{value:o.url,onChange:h("url"),placeholder:"https://... (선택)"})]}),m?n.jsx("p",{role:"alert",className:j.error,children:m}):null,n.jsxs("div",{className:j.formActions,children:[n.jsx("button",{type:"button",onClick:d,children:"초기화"}),n.jsx("button",{type:"button",className:j.primary,onClick:A,children:"배송 대행지 정보 저장"})]})]})]})]}),x?n.jsxs("div",{role:"alertdialog","aria-label":"배송 대행지 삭제 확인",className:j.deleteConfirm,children:[n.jsxs("p",{children:["“",x.name,"” 배송 대행지를 이 브라우저의 목록에서 삭제할까요? 저장된 상품 원가는 유지됩니다."]}),n.jsx("button",{type:"button",onClick:()=>f(null),children:"취소"}),n.jsx("button",{type:"button",onClick:()=>{try{a(x),o.id===x.id&&d(),f(null)}catch{p("삭제 내용을 저장하지 못했습니다.")}},children:"삭제 확인"})]}):null,n.jsx("p",{className:j.help,children:"계산 화면에서 환율만 수정하면 기본값은 유지됩니다. ‘현재 환율을 기본값으로 저장’을 누르면 서버 환율에도 반영됩니다."})]})}const vn="zephly.margin-calculator.draft.v1",pi=[{value:"KOREA",label:"대한민국"},{value:"CHINA",label:"중국"},{value:"USA",label:"미국"},{value:"JAPAN",label:"일본"},{value:"SOUTHEAST_ASIA",label:"동남아시아"},{value:"OTHER",label:"기타"}],hi=t=>({KOREA:{currency:"KRW",exchangeRate:"1"},CHINA:{currency:"CNY",exchangeRate:""},USA:{currency:"USD",exchangeRate:""},JAPAN:{currency:"JPY",exchangeRate:""},SOUTHEAST_ASIA:{currency:"USD",exchangeRate:""},OTHER:{currency:"USD",exchangeRate:""}})[t],gi=()=>{const t=new Date;return new Date(t.getTime()-t.getTimezoneOffset()*6e4).toISOString().slice(0,10)},ht=()=>({productName:"",supplierUrl:"",sourceMarginResultId:null,effectiveDate:gi(),costKind:"EXPECTED",sourceChannel:"WEB",originCountry:"CHINA",providerName:"",rawUnitCost:"",currency:"CNY",exchangeRate:"",expectedSalePrice:"",shippingFee:"0",salesCommissionRatePct:"10.8",expectedReturnRatePct:"8",targetMarginRatePct:"30",returnCollectionFee:"0",returnRestockingFee:"",monthlyViewCount:"0",conversionRatePct:"3",expectedMonthlySales:"",targetMonthlyProfit:"
21000000"}),xi=()=>({...ht(),productName:"접이식 수납함 (가이드)",supplierUrl:"https://supplier.example/guide-item",providerName:"웨이하이 해운 (예시)",rawUnitCost:"16.8",exchangeRate:"195.71",expectedSalePrice:"23000",shippingFee:"4000",expectedReturnRatePct:"5",returnCollectionFee:"1625",returnRestockingFee:"1000",monthlyViewCount:"5000",conversionRatePct:"3"}),fi=()=>{try{const t=window.localStorage.getItem(vn);return t?{...ht(),...JSON.parse(t)}:ht()}catch{return ht()}},Rn=t=>{const e=Number(t);return!Number.isFinite(e)||e<0?"0":e<5e3?"300":e<1e4?"400":e<15e3?"600":e<2e4?"800":"1000"},Yt=t=>({rawUnitCost:t.rawUnitCost,currency:t.currency,exchangeRate:t.exchangeRate,expectedSalePrice:t.expectedSalePrice,shippingFee:t.shippingFee,salesCommissionRatePct:t.salesCommissionRatePct,expectedReturnRatePct:t.expectedReturnRatePct,targetMarginRatePct:t.targetMarginRatePct,returnCollectionFee:t.returnCollectionFee,returnRestockingFee:t.returnRestockingFee||Rn(t.expectedSalePrice),monthlyViewCount:t.monthlyViewCount,conversionRatePct:t.conversionRatePct,expectedMonthlySales:t.expectedMonthlySales.trim()||null,targetMonthlyProfit:t.targetMonthlyProfit}),Ee=t=>t===null?"계산 불가":`${Ce(t,0)??t}원`,mt=t=>t===null?"해당 없음":`${Ce(t,2)??t}%`,xe=(t,e,r,s,c={})=>n.jsx(Qe,{label:t,value:r[e],onChange:a=>{const o=a.currentTarget.value;s(i=>({...i,[e]:o}))},...c}),Pe=(t,e,r=!1)=>
2n.jsxs(at,{p:"sm",radius:"md",bg:r?"orange.0":void 0,withBorder:!0,children:[n.jsx(M,{size:"xs",c:"dimmed",children:t}),n.jsx(M,{fw:800,c:r?"orange.8":void 0,children:e})]});function yi(t){var te;const e=ce.c(106),{calculation:r,serverDetail:s,targetRate:c,guideProps:a}=t;let o;e[0]!==a?(o=a===void 0?{}:a,e[0]=a,e[1]=o):o=e[1];const i=o;let m,p;e[2]!==i?({className:p,...m}=i,e[2]=i,e[3]=m,e[4]=p):(m=e[3],p=e[4]);const x=p===void 0?"":p,f=`${oe.resultCard} ${x}`;let h;e[5]!==f?(h=f.trim(),e[5]=f,e[6]=h):h=e[6];const d=h;if(!r){let J,O;e[7]===Symbol.for("react.memo_cache_sentinel")?(J=n.jsx(We,{order:3,children:"예상 마진 결과"}),O=n.jsx(M,{c:"dimmed",mt:"sm",children:"유효한 원가와 판매가를 입력하면 결과가 실시간으로 표시됩니다."}),e[7]=J,e[8]=O):(J=e[7],O=e[8]);let k;return e[9]!==d||e[10]!==m?(k=n.jsxs(Ne,{...m,"data-testid":"margin-result-card",withBorder:!0,radius:"lg",padding:"lg",className:d,children:[J,O]}),e[9]=d,e[10]=m,e[11]=k):k=e[11],k}let A,l,C,P,K,L,I,$,U,N,v,y,F,g,w,z,V,q,Q,b,E,D,W;if(e[12]!==r||e[13]!==d||e[14]!==m||e[15]!==s||e[16]!==c){const J=(te=s==null?void 0:s.snapshots)==null?void 0:te.at(-1),O=J||r,k=(J==null?void 0:J.costKind)||"EXPECTED",Z=Number(O.expectedMarginRatePct),u=Number(c);let S;e[40]!==Z||e[41]!==u?(S=Z>=u?["소싱 가능","green"]:Z>=u-5?["검토 필요","yellow"]:["마진 부족","red"],e[40]=Z,e[41]=u,e[42]=S):S=e[42];const R=S;l=Ne,I=m,$="margin-result-card",U=!0,N="lg",v="lg",y=d;const B=s?"서버 저장 결과":"실시간 예상 결과";let ne;e[43]!==B?(ne=n.jsx(M,{size:"xs",c:"dimmed",fw:700,children:B}),e[43]=B,e[44]=ne):ne=e[44];const ue=n.jsxs(ye,{gap:2,children:[ne,n.jsx(We,{order:3,children:mt(O.expectedMarginRatePct)}),n.jsx(M,{fw:800,c:"orange.8",children:Ee(O.expectedMarginAmount)})]});let he;e[45]!==R[0]||e[46]!==R[1]?(he=n.jsx(ae,{color:R[1],children:R[0]}),e[45]=R[0],e[46]=R[1],e[47]=he):he=e[47];const de=n.jsxs(ye,{gap:"xs",align:"flex-end",children:[n.jsx(ae,{color:k==="ACTUAL"?"blue":"orange",children:k}),he]});e[48]!==ue||e[49]!==de?(F=n.jsxs(ie,{justify:"space-between",align:"flex-start",children:[ue,de]}),e[48]=ue,e[49]=de,e[50]=F):F=e[50],e[51]!==s?(g=s?n.jsx(M,{size:"sm",mt:"sm",fw:700,children:s.product.sourcingId}):null,e[51]=s,e[52]=g):g=e[52];const me=Math.max(0,Math.min(100,Z/60*100));e[53]!==R[1]||e[54]!==me?(w=n.jsx(rn,{value:me,color:R[1],mt:"md"}
2),e[53]=R[1],e[54]=me,e[55]=w):w=e[55];const Ze=Pe("건당 마진",Ee(O.expectedMarginAmount),!0),Le=Pe("최소 ROAS",mt(O.minimumRoasPct),!0),Re=`${Ce(O.expectedSalesQuantity,0)}개`;let H;e[56]!==Re?(H=Pe("예상 월 판매량",Re),e[56]=Re,e[57]=H):H=e[57];const Te=Pe("예상 월 매출",Ee(O.monthlyRevenueAmount)),Je=Pe("예상 월 마진",Ee(O.monthlyMarginAmount),!0);let ze;e[58]!==c?(ze=Pe("목표 마진율",mt(c)),e[58]=c,e[59]=ze):ze=e[59],z=n.jsxs(Me,{cols:2,spacing:"sm",mt:"lg",children:[Ze,Le,H,Te,Je,ze]}),e[60]===Symbol.for("react.memo_cache_sentinel")?(V=n.jsx(gt,{my:"lg"}),e[60]=V):V=e[60];let Ve;e[61]===Symbol.for("react.memo_cache_sentinel")?(Ve=n.jsx(M,{fw:800,size:"sm",children:"건당 손익 구성"}),e[61]=Ve):Ve=e[61];let we;e[62]===Symbol.for("react.memo_cache_sentinel")?(we=n.jsx(M,{size:"sm",children:"환산 원가"}),e[62]=we):we=e[62];const Ie=n.jsxs(ie,{justify:"space-between",children:[we,n.jsx(M,{fw:700,children:Ee(O.convertedUnitCost)})]});let $e;e[63]===Symbol.for("react.memo_cache_sentinel")?($e=n.jsx(M,{size:"sm",children:"입출고 배송비 VAT"}),e[63]=$e):$e=e[63];const ke=n.jsxs(ie,{justify:"space-between",children:[$e,n.jsx(M,{fw:700,children:Ee(O.shippingVatAmount)})]});let Ke;e[64]===Symbol.for("react.memo_cache_sentinel")?(Ke=n.jsx(M,{size:"sm",children:"판매 수수료"}),e[64]=Ke):Ke=e[64];const it=n.jsxs(ie,{justify:"space-between",children:[Ke,n.jsx(M,{fw:700,children:Ee(O.commissionAmount)})]});let Be;e[65]===Symbol.for("react.memo_cache_sentinel")?(Be=n.jsx(M,{size:"sm",children:"판매 수수료 VAT"}),e[65]=Be):Be=e[65];const et=n.jsxs(ie,{justify:"space-between",children:[Be,n.jsx(M,{fw:700,children:Ee(O.commissionVatAmount)})]});let tt;e[66]===Symbol.for("react.memo_cache_sentinel")?(tt=n.jsx(M,{size:"sm",children:"예상 부가세"}),e[66]=tt):tt=e[66];const Nt=n.jsxs(ie,{justify:"space-between",children:[tt,n.jsx(M,{fw:700,children:Ee(O.estimatedVatAmount)})]});e[67]!==Ie||e[68]!==ke||e[69]!==it||e[70]!==et||e[71]!==Nt?(q=n.jsxs(ye,{gap:"xs",children:[Ve,Ie,ke,it,et,Nt]}),e[67]=Ie,e[68]=ke,e[69]=it,e[70]=et,e[71]=Nt,e[72]=q):q=e[72],e[73]===Symbol.for("react.memo_cache_sentinel")?(Q=n.jsx(gt,{my:"lg"}),e[73]=Q):Q=e[73],A=Me,b=2,E="sm";const wt=O.requiredSalesQuantity===null?"계산 불가":`${Ce(O.requiredSalesQuantity,0)}개`;e[74]!==wt?(D=Pe("필요 예상 판매량",wt),e[74]=wt,e[75]=D):D=e[75];const Et=O.requiredMonthlyViewCount===null?"계산 불가":`${Ce(O.requiredMonthlyViewCount,0)}회`;e[76]!==Et?(W=Pe("필요 월 조회수",Et),e[76]=Et,e[77]=W):W=e[77];const Mt=`${Ce(O.appliedSalesQuantity,0)}개`;e[78]!==Mt?(C=Pe("반품 반영 판매량",Mt),e[78]=Mt,e[79]=C):C=e[79],P=Pe("반품 반영 총매출",Ee(O.totalRevenueAmount)),K=Pe("반품 반영 총마진",Ee(O.totalMarginAmount),!0),L=Pe("반품 반영 총마진율",mt(O.totalMarginRatePct),!0),e[12]=r,e[13]=d,e[14]=m,e[15]=s,e[16]=c,e[17]=A,e[18]=l,e[19]=C,e[20]=P,e[21]=K,e[22]=L,e[23]=I,e[24]=$,e[25]=U,e[26]=N,e[27]=v,e[28]=y,e[29]=F,e[30]=g,e[31]=w,e[32]=z,e[33]=V,e[34]=q,e[35]=Q,e[36]=b,e[37]=E,e[38]=D,e[39]=W}else A=e[17],l=e[18],C=e[19],P=e[20],K=e[21],L=e[22],I=e[23],$=e[24],U=e[25],N=e[26],v=e[27],y=e[28],F=e[29],g=e[30],w=e[31],z=e[32],V=e[33],q=e[34],Q=e[35],b=e[36],E=e[37],D=e[38],W=e[39];let G;e[80]!==A||e[81]!==C||e[82]!==P||e[83]!==K||e[84]!==L||e[85]!==b||e[86]!==E||e[87]!==D||e[88]!==W?(G=n.jsxs(A,{cols:b,spacing:E,children:[D,W,C,P,K,L]}),e[80]=A,e[81]=C,e[82]=P,e[83]=K,e[84]=L,e[85]=b,e[86]=E,e[87]=D,e[88]=W,e[89]=G):G=e[89];let X;return e[90]!==l||e[91]!==I||e[92]!==$||e[93]!==U||e[94]!==N||e[95]!==v||e[96]!==y||e[97]!==F||e[98]!==g||e[99]!==w||e[100]!==z||e[101]!==V||e[102]!==q||e[103]!==Q||e[104]!==G?(X=n.jsxs(l,{...I,"data-testid":$,withBorder:U,radius:N,padding:v,className:y,children:[F,g,w,z,V,q,Q,G]}),e[90]=l,e[91]=I,e[92]=$,e[93]=U,e[94]=N,e[95]=v,e[96]=y,e[97]=F,e[98]=g,e[99]=w,e[100]=z,e[101]=V,e[102]=q,e[103]=Q,e[104]=G,e[105]=X):X=e[105],X}function ji({prefill:t,simulationMode:e=!1,activeGuideTarget:r=null,onGuideTargetChange:s,guideAside:c=null}){var Q;const a=T.useRef(null),[o,i]=T.useState(()=>e?xi():fi()),[m,p]=T.useState(""),[x,f]=T.useState(()=>e?"가이드용 목데이터입니다. 이 화면의 저장 동작은 실제 데이터에 반영되지 않습니다.":""),[h,d]=T.useState(null),[A,l]=T.useState(()=>!!o.sourceMarginResultId),[C,P]=T.useState(!1),[K,L]=T.useState(e),I=xn({enabled:!e}),$=gn(),U=fn(),N=T.useRef(o);N.current=o;const v=(b,E=!1)=>e?{"data-guide-target":b,className:r===b?oe.guideFocusedControl:void 0,onFocusCapture:()=>s==null?void 0:s(b),...E?{tabIndex:0}:{}}:{},y=b=>{i(E=>{const D=typeof b=="function"?b(E):b;return N.current=D,D}),d(null)};T.useEffect(()=>{var b,E;t&&(y(D=>({...D,productName:t.productName||"",supplierUrl:t.supplierUrl||"",sourceMarginResultId:t.marginResultId,rawUnitCost:t.productionCost??"",expectedSalePrice:t.expectedSalePrice??"",originCountry:t.currency==="CNY"?"CHINA":"KOREA",providerName:"",currency:t.currency||"KRW",exchangeRate:t.exchangeRate??"1",shippingFee:t.shippingFee??D.shippingFee,salesCommissionRatePct:t.salesCommissionRatePct??D.salesCommissionRatePct,monthlyViewCount:t.monthlyViewCount??D.monthlyViewCount,conversionRatePct:t.conversionRatePct??D.conversionRatePct,expectedReturnRatePct:t.expectedReturnRatePct??D.expectedReturnRatePct,returnCollectionFee:t.returnCollectionFee??D.returnCollectionFee,returnRestockingFee:t.returnRestockingFee??D.returnRestockingFee,sourceChannel:"CHROME_EXTENSION"})),f((b=t.warnings)!=null&&b.length?"이전 수집 기록에 미확인 값이 있습니다. 원가 통화와 판매가를 확인한 뒤 저장해 주세요.":"판매가를 확인한 뒤 저장해 주세요."),d(null),l(!0),P(!1),(E=a.current)==null||E.focus())},[t]);const F=T.useMemo(()=>{try{return yn(Yt(o))}catch{return null}},[o]),g=T.useMemo(()=>(I.data||[]).filter(b=>b.originCountry===o.originCountry),[I.data,o.originCountry]),w=b=>{const E=g.find(D=>`${D.providerName}|${D.currency}`===b.currentTarget.value);E&&y(D=>({...D,originCountry:E.originCountry||"OTHER",providerName:E.providerName,currency:E.currency,exchangeRate:E.exchangeRate}))},z=()=>{if(e){f("임시 저장 과정을 체험했습니다. 브라우저와 서버 어디에도 저장하지 않았습니다.");return}window.localStorage.setItem(vn,JSON.stringify(o)),f("이 브라우저에만 임시 저장했습니다.")},V=async()=>
2{if(e){p(""),f("환율 저장 과정을 체험했습니다. 실제 물류 프로필은 변경하지 않았습니다.");return}if(!o.providerName.trim()||!o.currency||!o.exchangeRate){p("물류사명, 통화, 환율을 확인해 주세요.");return}p("");try{await U.mutateAsync({originCountry:o.originCountry,providerName:o.providerName.trim(),currency:o.currency,exchangeRate:o.exchangeRate}),f("현재 환율 프로필을 저장했습니다.")}catch{}},q=async()=>{if(e){p(""),f("소싱 상품 저장 과정을 체험했습니다. 실제 상품과 원가 스냅샷은 생성하지 않았습니다.");return}if(!o.productName.trim()){p("상품명을 입력해 주세요.");return}if(!F){p("원가와 판매가 등 계산 입력값을 확인해 주세요.");return}if(A&&!C){p("예상 판매가 확인이 필요합니다.");return}p("");const b=JSON.stringify(o);try{const E=await $.mutateAsync({productName:o.productName.trim(),supplierUrl:o.supplierUrl.trim()||null,sourceMarginResultId:o.sourceMarginResultId||null,effectiveDate:o.effectiveDate,costKind:o.costKind,sourceChannel:o.sourceChannel,originCountry:o.originCountry,providerName:o.providerName.trim()||null,calculationInput:Yt(o)});JSON.stringify(N.current)===b&&(d(E),f("서버에 소싱 상품과 원가 스냅샷을 저장했습니다."))}catch{}};return n.jsx("section",{"aria-labelledby":"margin-calculator-title",children:n.jsxs("div",{className:`${oe.calculatorGrid} ${e?oe.guideCalculatorGrid:""}`.trim(),"data-testid":"calculator-layout",children:[n.jsx(Ne,{withBorder:!0,radius:"lg",padding:"lg",children:n.jsxs(ye,{gap:"md",children:[n.jsxs("div",{children:[n.jsxs(ie,{gap:"xs",children:[n.jsx(We,{id:"margin-calculator-title",order:2,children:"마진 계산"}),e?n.jsx(ae,{color:"orange",children:"체험 모드"}):null]}),n.jsx(M,{c:"dimmed",size:"sm",children:e?"목데이터로 각 입력과 결과의 의미를 따라가며 사용법을 익힙니다.":"입력값은 문자열 정밀도를 유지하며 서버 저장 시 다시 계산됩니다."})]}),x?n.jsx(je,{color:"orange",children:x}):null,m?n.jsx(je,{color:"red",children:m}):null,e?null:n.jsx(be,{error:$.error?ve($.error,{url:"/api/sourcing-products"}):null}),e?null:n.jsx(be,{error:U.error?ve(U.error,{url:"/api/sourcing-products/logistics-rates"}):null}),!e&&I.isPending?n.jsx(je,{color:"blue",children:"물류 프로필을 불러오는 중입니다."}):null,!e&&I.isError?n.jsx(be,{error:ve(I.error,{url:"/api/sourcing-products/logistics-rates"})}):null,n.jsx(M,{fw:800,children:"1. 상품 · 공급 정보"}),T.createElement(_e,{...v("supply"),key:o.originCountry,label:"배송 대행지 / 물류사",data:[{label:"직접 입력",value:""},...g.map(b=>({label:`${b.providerName} · ${b.currency} ${b.exchangeRate}`,value:`${b.providerName}|${b.currency}`}))],onChange:w}),n.jsxs(Me,{cols:{base:1,sm:2},children:[xe("상품명","productName",o,y,{...v("supply"),required:!0,ref:a}),xe("공급처 URL","supplierUrl",o,y,{type:"url"}),xe("적용일","effectiveDate",o,y,{type:"date",required:!0}),n.jsx(Tn,{label:"스냅샷 구분",data:[{value:"EXPECTED",label:"EXPECTED · 예상 원가"},{value:"ACTUAL",label:"ACTUAL · 실제 원가"}],value:o.costKind,onChange:b=>y(E=>({...E,costKind:b}))}),n.jsx(_e,{label:"공급 국가",value:o.originCountry,data:pi,onChange:b=>{const E=b.currentTarget.value;y(D=>({...D,originCountry:E,providerName:"",...hi(E)}))}}),xe("물류사명","providerName",o,y)]}),n.jsx(gt,{}),n.jsx(M,{fw:800,children:"2. 마진 계산 입력"}),n.jsxs(Me,{cols:{base:1,sm:2},children:[n.jsx(_e,{label:"통화",value:o.currency,data:["KRW","CNY","USD","JPY"],onChange:b=>{const E=b.currentTarget.value;y(D=>({...D,currency:E}))}}),xe("상품 원가","rawUnitCost",o,y,{...v("cost"),inputMode:"decimal",required:!0}),xe("환율","exchangeRate",o,y,{...v("exchange"),inputMode:"decimal",required:!0}),xe("예상 판매가","expectedSalePrice",o,y,{...v("sale-price"),inputMode:"decimal",required:!0}),xe("입출고 배송비","shippingFee",o,y,{inputMode:"decimal"}),xe("판매 수수료율","salesCommissionRatePct",o,y,{inputMode:"decimal"}),xe("목표 마진율","targetMarginRatePct",o,y,{inputMode:"decimal"})]}),n.jsx(gt,{}),n.jsx(M,{fw:800,children:"3. Forecast 입력"}),n.jsx("div",{...v("forecast"),children:n.jsxs(Me,{cols:{base:1,sm:2}
2,children:[xe("최근 1달 조회수","monthlyViewCount",o,y,{inputMode:"decimal",required:!0}),xe("판매 전환 계수","conversionRatePct",o,y,{inputMode:"decimal",required:!0,description:"기본 3% · 상품별 변경 가능"}),xe("목표 월 순익","targetMonthlyProfit",o,y,{inputMode:"decimal",description:"필요 판매량과 조회수 역산에 사용"})]})}),n.jsxs(pe,{...v("optional"),variant:"subtle",color:"gray",justify:"space-between",onClick:()=>L(b=>!b),"aria-expanded":K,children:["선택 입력 · 반품 / 예상 판매 / 상품 등록 ",K?"접기 −":"펼치기 +"]}),n.jsxs(In,{in:K,children:[n.jsxs(Me,{cols:{base:1,sm:2},children:[xe("반품율","expectedReturnRatePct",o,y,{inputMode:"decimal"}),xe("반품 회수비","returnCollectionFee",o,y,{inputMode:"decimal"}),xe("반품 재입고비","returnRestockingFee",o,y,{inputMode:"decimal",placeholder:`비우면 판매가 기준 자동 계산 (${Rn(o.expectedSalePrice)}원)`}),xe("예상 판매량 직접 입력","expectedMonthlySales",o,y,{inputMode:"decimal",placeholder:"비우거나 0이면 자동 계산"})]}),n.jsx(je,{color:"blue",mt:"md",children:"상품 ID·Item ID·Option ID는 판매 후 ABRS Excel에서 확인되면 Sourcing ID와 연결됩니다."})]}),A?n.jsx(Un,{label:"예상 판매가를 확인했습니다",checked:C,onChange:b=>P(b.currentTarget.checked)}):null,n.jsxs(ie,{justify:"space-between",className:oe.actionBar,children:[n.jsxs(ie,{children:[n.jsx(pe,{variant:"light",color:"gray",onClick:z,children:"임시 저장"}),n.jsx(pe,{variant:"light",color:"orange",loading:!e&&U.isPending,onClick:V,children:"현재 환율 저장"})]}),n.jsx(pe,{...v("save"),color:"orange",loading:!e&&$.isPending,disabled:!e&&($.isPending||A&&!C),onClick:q,children:"소싱 상품 저장"})]})]})}),n.jsx(yi,{calculation:((Q=h==null?void 0:h.snapshots)==null?void 0:Q.at(-1))||F,serverDetail:h,targetRate:o.targetMarginRatePct,guideProps:v("result",!0)}),c]})})}const qe=t=>t==null?"—":`${Ce(t,0)??"—"}원`,It=t=>t==null?"—":`${Ce(t,2)??"—"}%`,pt=(t,e="개",r=!1)=>t==null?"계산 불가":`${r?Math.ceil(Number(t)).toLocaleString("ko-KR"):Ce(t,0)}${e}`;function Ut(t){const e=ce.c(17),{title:r,help:s,badge:c,children:a}=t;let o;e[0]!==r?(o=n.jsx("h3",{children:r}),e[0]=r,e[1]=o):o=e[1];let i;e[2]!==s?(i=s?n.jsx("p",{children:s}):null,e[2]=s,e[3]=i):i=e[3];let m;e[4]!==o||e[5]!==i?(m=n.jsxs("div",{children:[o,i]}),e[4]=o,e[5]=i,e[6]=m):m=e[6];let p;e[7]!==c?(p=c?n.jsx("span",{className:j.badge,children:c}):null,e[7]=c,e[8]=p):p=e[8];let x;e[9]!==m||e[10]!==p?(x=n.jsxs("div",{className:j.cardHead,children:[m,p]}),e[9]=m,e[10]=p,e[11]=x):x=e[11];let f;e[12]!==a?(f=n.jsx("div",{className:j.cardBody,children:a}),e[12]=a,e[13]=f):f=e[13];let h;return e[14]!==x||e[15]!==f?(h=n.jsxs("section",{className:j.card,children:[x,f]}),e[14]=x,e[15]=f,e[16]=h):h=e[16],h}function Se(t){const e=ce.c(9),{label:r,value:s,wide:c,loss:a}=t,o=c===void 0?!1:c,i=a===void 0?!1:a,m=`${j.metric} ${o?j.wide:""}`;let p;e[0]!==r?(p=n.jsx("span",{children:r}),e[0]=r,e[1]=p):p=e[1];const x=i||void 0;let f;e[2]!==x||e[3]!==s?(f=n.jsx("strong",{"data-loss":x,children:s}),e[2]=x,e[3]=s,e[4]=f):f=e[4];let h;return e[5]!==m||e[6]!==p||e[7]!==f?(h=n.jsxs("div",{className:m,children:[p,f]}),e[5]=m,e[6]=p,e[7]=f,e[8]=h):h=e[8],h}function vi(t){var R,B;const e=ce.c(98),{calculation:r,form:s,serverDetail:c,actions:a}=t;let o,i,m,p,x,f,h,d,A,l,C;if(e[0]!==r||e[1]!==s||e[2]!==c){i=((R=c==null?void 0:c.snapshots)==null?void 0:R.at(-1))||r;const ne=Number(i==null?void 0:i.expectedMarginRatePct);o=((B=c==null?void 0:c.snapshots)==null?void 0:B.at(-1))||s;const ue=Number(o.targetMarginRatePct),he=Number(i==null?void 0:i.expectedMarginAmount)<0,de=i?he?"예ìƒ
2 손실":ne>=ue?"소싱 가능":ne>=ue-5?"검토 필요":"마진 부족":"입력 대기",me=i?he?"bad":ne>=ue?"good":ne>=ue-5?"warn":"bad":"neutral",Ze=[["판매가",o.expectedSalePrice],["상품 원가",i==null?void 0:i.convertedUnitCost],["입출고 배송비",o.shippingFee],["입출고 배송비 VAT",i==null?void 0:i.shippingVatAmount],["판매 수수료",i==null?void 0:i.commissionAmount],["판매 수수료 VAT",i==null?void 0:i.commissionVatAmount],["예상 부가세",i==null?void 0:i.estimatedVatAmount],["건당 마진",i==null?void 0:i.expectedMarginAmount]];x=j.resultPanel,f="margin-result-card",h="예상 마진 ê²°ê³¼";const Le=c?"서버 저장 ê²°ê³¼":"실시간 예상 ê²°ê³¼";let Re;e[14]!==Le?(Re=n.jsx("div",{className:j.eyebrow,children:Le}),e[14]=Le,e[15]=Re):Re=e[15];let H;e[16]===Symbol.for("react.memo_cache_sentinel")?(H=n.jsx("small",{children:"%"}),e[16]=H):H=e[16];let Te;e[17]!==me||e[18]!==de?(Te=n.jsx("span",{className:j.status,"data-tone":me,children:de}),e[17]=me,e[18]=de,e[19]=Te):Te=e[19];const Je=n.jsxs("div",{className:j.rateRow,children:[n.jsxs("strong",{children:[i?Ce(i.expectedMarginRatePct,2):"—",H]}),Te]}),ze=i?Math.max(0,Math.min(60,ne)):0,Ve=`${i?Math.max(0,Math.min(100,ne/60*100)):0}%`;let we;e[20]!==Ve?(we=n.jsx("i",{style:{width:Ve}}),e[20]=Ve,e[21]=we):we=e[21];let Ie;e[22]!==ze||e[23]!==we?(Ie=n.jsx("div",{className:j.progress,role:"meter","aria-label":"예상 마진율","aria-valuenow":ze,"aria-valuemin":0,"aria-valuemax":60,children:we}),e[22]=ze,e[23]=we,e[24]=Ie):Ie=e[24];let $e;e[25]===Symbol.for("react.memo_cache_sentinel")?($e=n.jsx("span",{children:"0%"}),e[25]=$e):$e=e[25];let ke;e[26]===Symbol.for("react.memo_cache_sentinel")?(ke=n.jsx("span",{children:"60%+"}),e[26]=ke):ke=e[26];const Ke=n.jsxs("div",{className:j.scale,children:[$e,n.jsxs("span",{children:["목표 ",o.targetMarginRatePct||0,"%"]}),ke]});e[27]!==Re||e[28]!==Je||e[29]!==Ie||e[30]!==Ke?(d=n.jsxs("div",{className:j.resultHero,children:[Re,Je,Ie,Ke]}),e[27]=Re,e[28]=Je,e[29]=Ie,e[30]=Ke,e[31]=d):d=e[31],A=he||Number(i==null?void 0:i.monthlyMarginAmount)<0||Number(i==null?void 0:i.totalMarginAmount)<0?n.jsx("div",{className:j.lossNotice,role:"status",children:"예상 손실: 공급 통화·환율·예상 판매가(KRW)·배송비(KRW)를 확인해 주세요. 입력값이 맞다면 표시된 음수 금액이 실제 예상 손실입니다."}):null,l=i?null:n.jsx("p",{className:j.empty,children:"유효한 원가·환율·판매가를 입력하면 결과가 즉시 표시됩니다."}),C=n.jsxs("div",{className:j.metrics,children:[n.jsx(Se,{label:"건당 마진 (KRW)",value:qe(i==null?void 0:i.expectedMarginAmount),loss:he}),n.jsx(Se,{label:"최소 광고수익률",value:i&&i.minimumRoasPct==null?"계산 불가":It(i==null?void 0:i.minimumRoasPct)}),n.jsx(Se,{label:"예상 월 판매량",value:i?pt(i.expectedSalesQuantity):"—"}),n.jsx(Se,{label:"예상 월 매출 (KRW)",value:qe(i==null?void 0:i.monthlyRevenueAmount)}),n.jsx(Se,{label:Number(i==null?void 0:i.monthlyMarginAmount)<0?"예상 월 손실 (KRW)":"예상 월 손익 (KRW)",value:qe(i==null?void 0:i.monthlyMarginAmount),loss:Number(i==null?void 0:i.monthlyMarginAmount)<0,wide:!0})]}),m=j.breakdown,p=Ze.map((it,Be)=>{const[et,tt]=it;return n.jsxs("div",{children:[n.jsx("span",{children:et}),n.jsx("b",{"data-loss":Be===7&&he||void 0,children:i?`${Be>0&&Be<7?"−":""}${qe(tt)}`:"—"})]},et)}),e[0]=r,e[1]=s,e[2]=c,e[3]=o,e[4]=i,e[5]=m,e[6]=p,e[7]=x,e[8]=f,e[9]=h,e[10]=d,e[11]=A,e[12]=l,e[13]=C}else o=e[3],i=e[4],m=e[5],p=e[6],x=e[7],f=e[8],h=e[9],d=e[10],A=e[11],l=e[12],C=e[13];let P;e[32]!==m||e[33]!==p?(P=n.jsx("div",{className:m,children:p}),e[32]=m,e[33]=p,e[34]=P):P=e[34];let K;e[35]===Symbol.for("react.memo_cache_sentinel")?(K=n.jsx("h4",{children:"시장 크기 · 조회수 기준"}),e[35]=K):K=e[35];let L;e[36]!==o.conversionRatePct?(L=It(o.conversionRatePct),e[36]=o.conversionRatePct,e[37]=L):L=e[37];let I;e[38]!==L?(I=n.jsx(Se,{label:"판매 전환 계수",value:L}),e[38]=L,e[39]=I):I=e[39];let $;e[40]!==o.targetMonthlyProfit?($=qe(o.targetMonthlyProfit),e[40]=o.targetMonthlyProfit,e[41]=$):$=e[41];let U;e[42]!==$?(U=n.jsx(Se,{label:"목표 월 순익",value:$}),e[42]=$,e[43]=U):U=e[43];let N;e[44]!==i?(N=i?pt(i.requiredSalesQuantity,"개",!0):"—",e[44]=i,e[45]=N):N=e[45];let v;e[46]!==N?(v=n.jsx(Se,{label:"필요 예상 판매량",value:N}),e[46]=N,e[47]=v):v=e[47];let y;e[48]!==i?(y=i?pt(i.requiredMonthlyViewCount,"회",!0):"—",e[48]=i,e[49]=y):y=e[49];let F;e[50]!==y?(F=n.jsx(Se,{label:"필요 월 조회수",value:y}),e[50]=y,e[51]=F):F=e[51];let g;e[52]!==I||e[53]!==U||e[54]!==v||e[55]!==F?(g=n.jsxs("div",{className:j.resultSection,children:[K,n.jsxs("div",{className:j.metrics,children:[I,U,v,F]})]}),e[52]=I,e[53]=U,e[54]=v,e[55]=F,e[56]=g):g=e[56];let w;e[57]===Symbol.for("react.memo_cache_sentinel")?(w=n.jsx("h4",{children:"반품 반영 총 손익"}),e[57]=w):w=e[57];let z;e[58]!==i?(z=i?pt(i.appliedSalesQuantity):"—",e[58]=i,e[59]=z):z=e[59];let V;e[60]!==z?(V=n.jsx(Se,{label:"반품 반영 판매량",value:z}),e[60]=z,e[61]=V):V=e[61];const q=i==null?void 0:i.totalRevenueAmount;let Q;e[62]!==q?(Q=qe(q),e[62]=q,e[63]=Q):Q=e[63];let b;e[64]!==Q?(b=n.jsx(Se,{label:"반품 반영 총매출",value:Q}),e[64]=Q,e[65]=b):b=e[65];const E=Number(i==null?void 0:i.totalMarginAmount)<0?"반품 반영 예상 손실 (KRW)":"반품 반영 총마진 (KRW)",D=i==null?void 0:i.totalMarginAmount;let W;e[66]!==D?(W=qe(D),e[66]=D,e[67]=W):W=e[67];const G=Number(i==null?void 0:i.totalMarginAmount)<0;let X;e[68]!==E||e[69]!==W||e[70]!==G?(X=n.jsx(Se,{label:E,value:W,loss:G}),e[68]=E,e[69]=W,e[70]=G,e[71]=X):X=e[71];const te=i==null?void 0:i.totalMarginRatePct;let J;e[72]!==te?(J=It(te),e[72]=te,e[73]=J):J=e[73];let O;e[74]!==J?(O=n.jsx(Se,{label:"반품 반영 총마진율",value:J}),e[74]=J,e[75]=O):O=e[75];let k;e[76]!==V||e[77]!==b||e[78]!==X||e[79]!==O?(k=n.jsxs("div",{className:j.resultSection,children:[w,n.jsxs("div",{className:j.metrics,children:[V,b,X,O]})]}),e[76]=V,e[77]=b,e[78]=X,e[79]=O,e[80]=k):k=e[80];let Z;e[81]!==a?(Z=n.jsx("div",{className:j.resultActions,children:a}),e[81]=a,e[82]=Z):Z=e[82];let u;e[83]!==c?(u=c?n.jsx("p",{className:j.savedId,children:c.product.sourcingId}):null,e[83]=c,e[84]=u):u=e[84];let S;return e[85]!==P||e[86]!==g||e[87]!==x||e[88]!==k||e[89]!==Z||e[90]!==u||e[91]!==f||e[92]!==h||e[93]!==d||e[94]!==A||e[95]!==l||e[96]!==C?(S=n.jsxs("aside",{className:x,"data-testid":f,"aria-label":h,children:[d,A,l,C,P,g,k,Z,u]}),e[85]=P,e[86]=g,e[87]=x,e[88]=k,e[89]=Z,e[90]=u,e[91]=f,e[92]=h,e[93]=d,e[94]=A,e[95]=l,e[96]=C,e[97]=S):S=e[97],S}function Ri({prefill:t,userId:e}){const r=`zephly.margin-workspace.v2.${encodeURIComponent(e||"anonymous")}`,[s,c]=T.useState(()=>{const u=Ot(`${r}.draft`,{}),S={...as(),...u};return S.supplierUrls=Array.isArray(u.supplierUrls)&&u.supplierUrls.length?u.supplierUrls.filter(R=>
2typeof R=="string"):[u.supplierUrl||""],S.supplierUrls.length||(S.supplierUrls=[""]),S}),[a,o]=T.useState(()=>{const u=Ot(`${r}.providers`,{});return{items:Array.isArray(u.items)?u.items:[],hidden:Array.isArray(u.hidden)?u.hidden:[]}}),[i,m]=T.useState(!1),[p,x]=T.useState(!1),[f,h]=T.useState(""),[d,A]=T.useState(""),[l,C]=T.useState(null),[P,K]=T.useState(!1),L=T.useRef(null),I=T.useRef(s),$=T.useRef(!1);I.current=s;const U=xn(),N=gn(),v=fn(),y=T.useMemo(()=>cs(U.data||[],a),[U.data,a]),F=y.filter(u=>u.countryCode===s.originCountry),g=F.find(u=>u.id===s.providerId),w=u=>{c(S=>{const R=typeof u=="function"?u(S):{...S,...u};return I.current=R,R}),C(null)},z=(u,S=s.originCountry)=>w(R=>({...R,originCountry:S,providerId:(u==null?void 0:u.id)||"",providerName:(u==null?void 0:u.name)||"",currency:(u==null?void 0:u.currency)||yt(S).currency,exchangeRate:(u==null?void 0:u.rate)||yt(S).exchangeRate}));T.useEffect(()=>{!s.providerId&&!s.sourceMarginResultId&&F.length&&z(F[0])},[y,s.originCountry,s.providerId,s.sourceMarginResultId]),T.useEffect(()=>{var u,S;t&&(w(R=>({...R,productName:t.productName||"",supplierUrl:t.supplierUrl||"",supplierUrls:t.supplierUrls||[t.supplierUrl||""],sourceMarginResultId:t.marginResultId,rawUnitCost:t.productionCost??"",expectedSalePrice:t.expectedSalePrice??"",originCountry:t.currency==="CNY"?"CHINA":"KOREA",providerId:"",providerName:"",currency:t.currency||"KRW",exchangeRate:t.exchangeRate??"1",shippingFee:t.shippingFee??R.shippingFee,salesCommissionRatePct:t.salesCommissionRatePct??R.salesCommissionRatePct,monthlyViewCount:t.monthlyViewCount??R.monthlyViewCount,conversionRatePct:t.conversionRatePct??R.conversionRatePct,expectedReturnRatePct:t.expectedReturnRatePct??R.expectedReturnRatePct,returnCollectionFee:t.returnCollectionFee??R.returnCollectionFee,returnRestockingFee:t.returnRestockingFee??R.returnRestockingFee,sourceChannel:"CHROME_EXTENSION"})),K(!1),A((u=t.warnings)!=null&&u.length?"이전 수집 기록에 미확인 값이 있습니다. 원가 통화와 판매가를 확인한 뒤 저장해 주세요.":"판매가를 확인한 뒤 저장해 주세요."),(S=L.current)==null||S.focus())},[t]);const V=T.useMemo(()=>{try{return{result:yn(Gt(s)),errorKey:null}}catch(u){return{result:null,errorKey:u.message.split(" ")[0]}}},[s]),q=V.result,Q=T.useMemo(()=>{try{return os(s)}catch{return null}},[s]),b=Q!=null&&Number(s.expectedSalePrice)>0&&Number(Q)>Number(s.expectedSalePrice),E=u=>V.errorKey!==u||s[u]===""?null:u.endsWith("Pct")?"0~100% 범위의 숫자를 입력해 주세요.":u==="exchangeRate"||u==="expectedSalePrice"?"0보다 큰 숫자를 입력해 주세요.":"0 이상의 유효한 숫자를 입력해 주세요.",D=u=>{localStorage.setItem(`${r}.providers`,JSON.stringify(u)),o(u)},W=u=>{const S=y.find(B=>B.id===u.id),R=new Set(a.hidden);S!=null&&S.serverKey&&R.add(S.serverKey),D({items:[...a.items.filter(B=>B.id!==u.id),u],hidden:[...R]}),u.countryCode===s.originCountry?z(u):u.id===s.providerId&&z(F.find(B=>B.id!==u.id))},G=u=>{D({items:a.items.filter(S=>S.id!==u.id),hidden:[...new Set([...a.hidden,u.serverKey||jt(u)])]}),u.id===s.providerId&&z(F.find(S=>S.id!==u.id))},X=async()=>{if(!g){h("배송 대행지를 먼저 등록하거나 선택해 주세요.");return}if(!Number.isFinite(Number(s.exchangeRate))||Number(s.exchangeRate)<=0){h("환율은 0보다 커야 합니다.");return}if($.current)return;h(""),$.current=!0;const u={...g,rate:s.exchangeRate,serverKey:jt(g)};try{await v.mutateAsync({originCountry:u.countryCode,providerName:u.name,currency:u.currency,exchangeRate:u.rate}),o(S=>{const R={items:[...S.items.filter(B=>B.id!==u.id),u],hidden:[...new Set([...S.hidden,u.serverKey])]};try{localStorage.setItem(`${r}.providers`,JSON.stringify(R))}catch{h("서버 환율은 저장됐지만 브라우저 프로필 저장에 실패했습니다.")}return R}),A(`${u.name}의 기본 환율을 ${u.rate}원으로 저장했습니다.`)}catch{}finally{$.current=!1}},te=()=>{try{localStorage.setItem(`${r}.draft`,JSON.stringify(s)),A("이 브라우저에만 임시 저장했습니다."),h("")}catch{h("브라우저 저장 공간을 확인해 주세요. 임시 저장하지 못했습니다.")}},J=async()=>
2{if(!s.productName.trim()){h("상품명을 입력해 주세요.");return}if(!q){h("원가·환율·판매가 등 계산 입력값을 확인해 주세요.");return}if(s.supplierUrls.some(R=>!ct(R))||!ct(s.listingUrl)){h("URL은 http:// 또는 https:// 주소를 입력해 주세요.");return}if(s.sourceMarginResultId&&!P)return;h("");const u={...s,supplierUrls:s.supplierUrls.map(R=>R.trim()).filter(Boolean)},S=JSON.stringify(s);try{const R=await N.mutateAsync({productName:s.productName.trim(),supplierUrl:u.supplierUrls[0]||null,sourceMarginResultId:s.sourceMarginResultId||null,effectiveDate:Dt(),costKind:"EXPECTED",sourceChannel:s.sourceChannel,originCountry:s.originCountry,providerName:s.providerName.trim()||null,calculationInput:Gt(s)});let B=!0;try{localStorage.setItem(`${r}.product.${R.product.sourcingId}`,JSON.stringify({supplierUrls:u.supplierUrls,listingUrl:u.listingUrl}))}catch{B=!1}JSON.stringify(I.current)===S&&(C(R),A(B?"소싱 상품과 대표 URL을 서버에 저장했습니다. 전체 공급처 URL과 등록 링크는 이 브라우저에 보관했습니다.":"소싱 상품은 서버에 저장됐지만 추가 URL의 브라우저 저장에 실패했습니다."))}catch{}},O=(u,S,R={})=>{var ne;const B=R.inputMode==="decimal"?(ne=u.match(/\(([^)]+)\)$/))==null?void 0:ne[1]:null;return n.jsxs("label",{className:j.field,children:[u,n.jsxs("span",{className:j.inputWithUnit,children:[n.jsx("input",{...R,"aria-label":u,value:s[S],"data-has-unit":!!B||void 0,"aria-invalid":!!E(S),"aria-describedby":E(S)?`margin-error-${S}`:void 0,onChange:ue=>w({[S]:ue.target.value})}),B?n.jsx("span",{className:j.inputUnit,"aria-hidden":"true",children:B}):null]}),E(S)?n.jsx("span",{id:`margin-error-${S}`,className:j.fieldError,children:E(S)}):null]})},k=(u,S,R={})=>O(u,S,{inputMode:"decimal",...R}),Z=(u,S)=>n.jsx("div",{className:j.quick,children:S.map(R=>n.jsxs("button",{type:"button","aria-label":`빠른 조정: ${u==="rawUnitCost"?"상품 원가":"예상 판매가"} ${R>0?"+":""}${R}`,onClick:()=>{const B=Number(s[u]||0);Number.isFinite(B)&&w({[u]:String(Math.max(0,Math.round((B+R)*1e6)/1e6))})},children:[R>0?"+":"−",Math.abs(R).toLocaleString("ko-KR")]},R))});return n.jsxs("section",{className:j.contentRoot,"aria-label":"마진 계산","data-testid":"content-calculator",children:[d?n.jsx("div",{className:j.notice,role:"status",children:d}):null,f?n.jsx("div",{className:j.error,role:"alert",children:f}):null,n.jsx(be,{error:N.error?ve(N.error,{url:"/api/sourcing-products"}):v.error?ve(v.error,{url:"/api/sourcing-products/logistics-rates"}):U.error?ve(U.error,{url:"/api/sourcing-products/logistics-rates"}):null}),n.jsxs("div",{className:j.calculatorGrid,"data-testid":"calculator-layout",children:[n.jsxs("div",{className:j.stack,children:[n.jsxs(Ut,{title:"1. 상품 · 공급 정보",help:"배송 대행지를 선택하면 업체의 통화와 기본 환율을 적용합니다.",badge:"작성일 자동 저장",children:[n.jsxs("div",{className:j.fields2,children:[O("상품명 / 키워드","productName",{ref:L,placeholder:"상품명 또는 키워드를 입력해 주세요"}),n.jsxs("div",{children:[n.jsx("div",{className:j.fieldLabel,children:"상품 공급처 URL"}),n.jsx("div",{className:j.urlList,children:s.supplierUrls.map((u,S)=>n.jsxs("div",{className:j.urlRow,children:[n.jsx("input",{"aria-label":S===0?"공급처 URL":`공급처 URL ${S+1}`,value:u,placeholder:"https://...",onChange:R=>w({supplierUrls:s.supplierUrls.map((B,ne)=>ne===S?R.target.value:B)})}
2),n.jsx("button",{type:"button","aria-label":`공급처 ${S+1} 삭제`,disabled:s.supplierUrls.length===1,onClick:()=>w({supplierUrls:s.supplierUrls.filter((R,B)=>B!==S)}),children:"×"})]},S))}),n.jsxs("div",{className:j.urlActions,children:[n.jsx("button",{type:"button",onClick:()=>w({supplierUrls:[...s.supplierUrls,""]}),children:"+ 공급처 URL 추가"}),n.jsxs("span",{children:[s.supplierUrls.length,"개 공급처"]})]})]})]}),n.jsx("div",{className:j.divider}),n.jsxs("div",{className:j.fields4,children:[n.jsxs("label",{children:["공급 국가",n.jsx("select",{value:s.originCountry,onChange:u=>{const S=u.target.value;z(y.find(R=>R.countryCode===S),S)},children:Ft.map(u=>n.jsx("option",{value:u.value,children:u.label},u.value))})]}),n.jsxs("label",{children:["배송 대행지 / 물류사",n.jsxs("select",{value:(g==null?void 0:g.id)||"",onChange:u=>z(F.find(S=>S.id===u.target.value)),children:[g?null:n.jsx("option",{value:"",children:"배송 대행지 선택"}),F.map(u=>n.jsx("option",{value:u.id,children:u.name},u.id))]})]}),n.jsxs("label",{children:["통화",n.jsx("select",{value:s.currency,disabled:!0,children:["CNY","KRW","USD","JPY","VND"].map(u=>n.jsx("option",{children:u},u))})]}),n.jsxs("div",{children:[k("환율 (KRW)","exchangeRate"),n.jsx("p",{className:j.help,children:g?`저장된 기본 환율 ${String(g.rate).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,"")}원`:"배송 대행지를 등록해 주세요"})]})]}),n.jsxs("div",{className:j.profileBar,children:[n.jsxs("div",{children:[n.jsx("strong",{children:g?`${g.name} · ${g.currency}`:"배송 대행지 미등록"}),n.jsx("p",{children:"계산용 환율을 바꿔도 저장된 기본값은 유지됩니다."}),U.isPending?n.jsx("p",{children:"물류 프로필을 불러오는 중입니다."}):null]}),n.jsxs("div",{className:j.inlineActions,children:[n.jsx("button",{type:"button",onClick:()=>m(!0),children:"배송 대행지 관리"}),n.jsx("button",{type:"button",className:j.soft,disabled:v.isPending||!g,onClick:X,children:"현재 환율을 기본값으로 저장"})]})]})]}),n.jsxs(Ut,{title:"2. 마진 계산 입력",help:"입력값을 바꾸면 오른쪽 예상 결과가 즉시 갱신됩니다.",badge:"LIVE",children:[b?n.jsx("div",{className:j.lossNotice,role:"status",children:"입력값 확인: 원화 환산 상품 원가가 예상 판매가보다 높습니다. 공급 통화·환율·판매가 단위를 확인해 주세요."}):null,n.jsxs("div",{className:j.fields2,children:[n.jsxs("div",{children:[k(`상품 원가 (${s.currency})`,"rawUnitCost"),Z("rawUnitCost",[-5,-1,1,5]),n.jsxs("p",{className:j.help,children:["원화 환산 상품 원가 (KRW) ",n.jsx("b",{children:qe(Q)})]})]}),n.jsxs("div",{children:[k("예상 판매가 (KRW)","expectedSalePrice"),Z("expectedSalePrice",[-1e3,-500,500,1e3])]})]}),n.jsx("div",{className:j.divider}),n.jsxs("div",{className:j.fields4,children:[k("입출고 배송비 (KRW)","shippingFee"),k("판매 수수료율 (%)","salesCommissionRatePct"),k("최근 1달 조회수 (회)","monthlyViewCount"),n.jsxs("div",{children:[k("판매 전환 계수 (%)","conversionRatePct"),n.jsxs("p",{className:j.help,children:["최근 1달 조회수 중 실제 구매로 전환될 것으로 예상하는 비율입니다.",n.jsx("br",{}),"예: 조회수 10,000회 × 전환 계수 3% = 예상 판매량 300개"]})]})]}),n.jsx("div",{className:j.divider}),n.jsxs("div",{className:j.fields2,children:[k("목표 마진율 (%)","targetMarginRatePct"),k("목표 월 순익 (KRW)","targetMonthlyProfit")]}),n.jsxs("button",{type:"button",className:j.optionalToggle,onClick:()=>x(!p),"aria-expanded":p,"aria-controls":"margin-optional-inputs",children:["선택 입력 · 반품 / 예상 판매 / 상품 등록"," ",n.jsx("span",{children:p?"접기 −":"펼치기 +"})]}),n.jsxs("div",{id:"margin-optional-inputs",hidden:!p,children:[n.jsxs("div",{className:j.fields4,children:[k("반품율","expectedReturnRatePct"),k("반품 회수비","returnCollectionFee"),k("반품 재입고비","returnRestockingFee",{placeholder:`자동 ${jn(s.expectedSalePrice)}원`}),k("예상 판매량 직접 입력","expectedMonthlySales",{placeholder:"비우거나 0이면 자동"})]}),O("상품 등록 링크","listingUrl",{placeholder:"실제 판매 시작 후 선택 입력"})]})]}),n.jsxs(Ut,{title:"3. 저장 방식",help:"저장 시점의 날짜로 예ìƒ
2 원가를 기록합니다.",badge:`${Dt()} 자동 기록`,children:[n.jsxs("div",{className:j.fields3,children:[n.jsxs("label",{children:["수집 경로",n.jsx("input",{readOnly:!0,value:s.sourceChannel})]}),n.jsxs("label",{children:["Sourcing ID",n.jsx("input",{readOnly:!0,value:(l==null?void 0:l.product.sourcingId)||"저장 시 자동 생성"})]}),n.jsxs("label",{children:["ABRS 상품 연결",n.jsx("input",{readOnly:!0,value:"판매 후 Excel 업로드 시 연결"})]})]}),n.jsx("p",{className:j.notice,children:"판매 후 ABRS Excel에서 Option ID를 확인해 소싱 상품과 원가를 연결합니다. 대표 URL은 서버에, 전체 URLê³¼ 상품 등록 링크는 현재 계정의 이 브라우저에 저장됩니다."}),s.sourceMarginResultId?n.jsxs("label",{className:j.checkbox,children:[n.jsx("input",{type:"checkbox",checked:P,onChange:u=>K(u.target.checked)}),"예상 판매가를 확인했습니다"]}):null]})]}),n.jsx(vi,{calculation:q,form:s,serverDetail:l,actions:n.jsxs(n.Fragment,{children:[n.jsx("button",{type:"button",onClick:te,children:"임시 저장"}),n.jsx("button",{type:"button",className:j.primary,"aria-label":"소싱 상품 저장",disabled:N.isPending||!!(s.sourceMarginResultId&&!P),onClick:J,children:N.isPending?"저장 중…":"소싱 상품 저장"})]})})]}),i?n.jsx(mi,{opened:!0,onClose:()=>m(!1),country:s.originCountry,profiles:y,onSave:W,onDelete:G}):null]})}function Sn(t){const e=ce.c(3),r=tn(Si);let s;return e[0]!==t||e[1]!==r?(s=t.simulationMode?n.jsx(ji,{...t}):n.jsx(Ri,{...t,userId:r},r),e[0]=t,e[1]=r,e[2]=s):s=e[2],s}function Si(t){return t.id}const Ue=[{id:"supply",label:"상품 · 공급 정보",title:"어떤 상품을 계산하는지 먼저 확인합니다",description:"상품명, 공급처, 적용일과 원가 구분을 기록합니다. 예시 상품명에는 가이드 데이터임을 표시했습니다.",note:"목데이터는 실제 소싱 상품이나 Extension 수집 기록과 연결되지 않습니다."},{id:"cost",label:"상품 원가",title:"공급처에서 확인한 상품 단가를 입력합니다",description:"상품 원가는 선택한 통화 기준입니다. 현재 예시는 중국 공급가 16.8 CNY를 사용합니다.",note:"환산 원가는 상품 원가 × 환율로 계산됩니다."}
2,{id:"exchange",label:"환율",title:"원화 환산에 사용할 환율을 확인합니다",description:"환율을 변경하면 환산 원가부터 예상 마진까지 즉시 다시 계산됩니다. 예시 환율은 195.71원입니다.",note:"체험 모드의 현재 환율 저장 버튼은 실제 물류 프로필을 변경하지 않습니다."},{id:"sale-price",label:"예상 판매가",title:"판매 예정 가격을 기준으로 손익을 계산합니다",description:"예상 판매가는 실제 판매가격과 구분해야 합니다. 가격을 바꾸면 수수료, 부가세, 건당 마진이 함께 바뀝니다.",note:"현재 예시는 23,000원이며 입력값을 직접 바꿔 결과 변화를 체험할 수 있습니다."},{id:"forecast",label:"Forecast 입력",title:"조회수와 판매 전환 계수로 예상 판매량을 계산합니다",description:"최근 1달 조회수 × 판매 전환 계수로 예상 월 판매량을 계산합니다. 목표 월 순익은 필요한 판매량과 조회수를 역산할 때 사용합니다.",note:"판매 전환 계수 3%는 예시값이며 실제 상품별 근거를 확인해야 합니다."},{id:"optional",label:"반품 · 선택 입력",title:"반품과 직접 판매량을 포함해 결과를 보정합니다",description:"반품율, 회수비, 재입고비를 입력하면 반품 반영 손익이 계산됩니다. 예상 판매량을 직접 입력하면 자동 예상 판매량 대신 적용됩니다.",note:"가이드에서는 선택 입력 영역을 미리 펼쳐 전체 흐름을 보여줍니다."},{id:"result",label:"예상 마진 결과",title:"건당 손익과 월간 Forecast를 함께 확인합니다",description:"건당 마진, 최소 ROAS, 예상 월 매출과 목표 마진 충족 여부를 확인합니다. 입력값을 수정하면 이 카드도 실시간으로 갱신됩니다.",note:"서버 저장 결과가 아니라 목데이터로 계산한 실시간 예상 결과입니다."},{id:"save",label:"소싱 상품 저장 체험",title:"마지막으로 저장 흐름만 안전하게 체험합니다",description:"버튼을 누르면 저장 절차를 완료했다는 안내만 표시합니다. 실제 소싱 상품, 원가 스냅샷, 마진 히스토리는 생성되지 않습니다.",note:"체험 모드에서는 저장 관련 API와 브라우저 임시 저장을 모두 차단합니다."}];function Ci(){const t=ce.c(58),e=T.useRef(null),[r,s]=T.useState(Ue[0].id);let c;t[0]!==r?(c=Ue.findIndex(u=>u.id===r),t[0]=r,t[1]=c):c=t[1];const a=Math.max(0,c),o=Ue[a],i=u=>{const S=Ue.find(R=>R.id===u);S&&(s(S.id),window.requestAnimationFrame(()=>{var ne,ue,he,de,me;const R=(ne=e.current)==null?void 0:ne.querySelector(`[data-guide-target="${S.id}"]`);(ue=R==null?void 0:R.scrollIntoView)==null||ue.call(R,{behavior:"smooth",block:"center"});const B=(he=R==null?void 0:R.matches)!=null&&he.call(R,"input, select, button, [tabindex]")?R:(de=R==null?void 0:R.querySelector)==null?void 0:de.call(R,"input, select, button, [tabindex]");(me=B==null?void 0:B.focus)==null||me.call(B,{preventScroll:!0})}
2))},m=Ne,p=!0,x="lg",f="lg",h=`${oe.resultCard} ${oe.guidePanel}`,d="polite",A=ye,l="md";let C;t[2]===Symbol.for("react.memo_cache_sentinel")?(C=n.jsx(ae,{color:"orange",variant:"light",children:"사용 가이드"}),t[2]=C):C=t[2];const P=a+1;let K;t[3]!==P?(K=n.jsxs(ie,{justify:"space-between",gap:"xs",children:[C,n.jsxs(M,{size:"xs",c:"dimmed",children:[P," / ",Ue.length]})]}),t[3]=P,t[4]=K):K=t[4];const L=(a+1)/Ue.length*100;let I;t[5]!==L?(I=n.jsx(rn,{value:L,color:"orange",mt:"sm","aria-label":"가이드 진행률"}),t[5]=L,t[6]=I):I=t[6];let $;t[7]!==I||t[8]!==K?($=n.jsxs("div",{children:[K,I]}),t[7]=I,t[8]=K,t[9]=$):$=t[9];let U;t[10]!==o.label?(U=n.jsx(M,{size:"xs",fw:700,c:"orange.8",children:o.label}),t[10]=o.label,t[11]=U):U=t[11];let N;t[12]!==o.title?(N=n.jsx(We,{order:3,mt:4,children:o.title}),t[12]=o.title,t[13]=N):N=t[13];let v;t[14]!==o.description?(v=n.jsx(M,{size:"sm",mt:"sm",children:o.description}),t[14]=o.description,t[15]=v):v=t[15];let y;t[16]!==o.note?(y=n.jsx(M,{size:"xs",c:"dimmed",mt:"sm",children:o.note}),t[16]=o.note,t[17]=y):y=t[17];let F;t[18]!==U||t[19]!==N||t[20]!==v||t[21]!==y?(F=n.jsxs("div",{children:[U,N,v,y]}),t[18]=U,t[19]=N,t[20]=v,t[21]=y,t[22]=F):F=t[22];const g=ye,w=4,z=oe,V=Ue.map((u,S)=>n.jsxs(Nn,{type:"button",className:u.id===o.id?oe.guideStepActive:oe.guideStep,onClick:()=>i(u.id),"aria-current":u.id===o.id?"step":void 0,children:[n.jsx("span",{children:S+1}),u.label]},u.id));let q;t[23]!==g||t[24]!==z.guideStepList||t[25]!==V?(q=n.jsx(g,{gap:w,className:z.guideStepList,children:V}),t[23]=g,t[24]=z.guideStepList,t[25]=V,t[26]=q):q=t[26];const Q=a===0;let b;t[27]!==a||t[28]!==i?(b=()=>{var u;return i((u=Ue[a-1])==null?void 0:u.id)},t[27]=a,t[28]=i,t[29]=b):b=t[29];let E;t[30]!==Q||t[31]!==b?(E=n.jsx(pe,{variant:"default",disabled:Q,onClick:b,children:"이전"}),t[30]=Q,t[31]=b,t[32]=E):E=t[32];const D=a===Ue.length-1;let W;t[33]!==a||t[34]!==i?(W=()=>{var u;return i((u=Ue[a+1])==null?void 0:u.id)},t[33]=a,t[34]=i,t[35]=W):W=t[35];let G;t[36]!==D||t[37]!==W?(G=n.jsx(pe,{color:"orange",disabled:D,onClick:W,children:"다음"}),t[36]=D,t[37]=W,t[38]=G):G=t[38];let X;t[39]!==E||t[40]!==G?(X=n.jsxs(ie,{grow:!0,children:[E,G]}),t[39]=E,t[40]=G,t[41]=X):X=t[41];let te;t[42]!==A||t[43]!==$||t[44]!==F||t[45]!==q||t[46]!==X?(te=n.jsxs(A,{gap:l,children:[$,F,q,X]}),t[42]=A,t[43]=$,t[44]=F,t[45]=q,t[46]=X,t[47]=te):te=t[47];let J;t[48]!==m||t[49]!==te?(J=n.jsx(m,{withBorder:p,radius:x,padding:f,className:h,"aria-live":d,children:te}),t[48]=m,t[49]=te,t[50]=J):J=t[50];const O=J;let k;t[51]!==o.id||t[52]!==O||t[53]!==s?(k=n.jsx(Sn,{simulationMode:!0,activeGuideTarget:o.id,onGuideTargetChange:s,guideAside:O}),t[51]=o.id,t[52]=O,t[53]=s,t[54]=k):k=t[54];let Z;return t[55]!==e||t[56]!==k?(Z=n.jsx("div",{ref:e,"data-testid":"margin-guide-simulation",children:k}),t[55]=e,t[56]=k,t[57]=Z):Z=t[57],Z}const Xt=()=>({effectiveDate:"",costKind:"EXPECTED",originCountry:"KOREA",providerName:"",rawUnitCost:"",currency:"KRW",exchangeRate:"1",expectedSalePrice:"",shippingFee:"0",salesCommissionRatePct:"10.8",expectedReturnRatePct:"0",targetMarginRatePct:"30",returnCollectionFee:"0",returnRestockingFee:"0",monthlyViewCount:"0",conversionRatePct:"3",expectedMonthlySales:"",targetMonthlyProfit:"0"}),bi=t=>({rawUnitCost:t.rawUnitCost,currency:t.currency,exchangeRate:t.exchangeRate,expectedSalePrice:t.expectedSalePrice,shippingFee:t.shippingFee,salesCommissionRatePct:t.salesCommissionRatePct,expectedReturnRatePct:t.expectedReturnRatePct,targetMarginRatePct:t.targetMarginRatePct,returnCollectionFee:t.returnCollectionFee,returnRestockingFee:t.returnRestockingFee,monthlyViewCount:t.monthlyViewCount,conversionRatePct:t.conversionRatePct,expectedMonthlySales:t.expectedMonthlySales||null,targetMonthlyProfit:t.targetMonthlyProfit}),fe=(t,e,r,s,c={})=>n.jsx(Qe,{label:t,value:r[e],onChange:a=>{const o=a.currentTarget.value;s(i=>({...i,[e]:o}))},...c});function Pi({sourcingId:t,opened:e,onClose:r,productName:s}){var h,d,A;const c=Jr(t,{enabled:e}),a=Xr(),[o,i]=T.useState(Xt),[m,p]=T.useState(""),x=T.useMemo(()=>{var l;return[...((l=c.data)==null?void 0:l.snapshots)||[]].sort((C,P)=>P.effectiveDate.localeCompare(C.effectiveDate)||P.capturedAt.localeCompare(C.capturedAt))},[(h=c.data)==null?void 0:h.snapshots]),f=async()=>
2{if(!o.effectiveDate||!o.rawUnitCost||!o.expectedSalePrice){p("적용일, 상품 원가, 예상 판매가를 입력해 주세요.");return}p("");try{await a.mutateAsync({sourcingId:t,snapshot:{effectiveDate:o.effectiveDate,costKind:o.costKind,sourceChannel:o.costKind==="ACTUAL"?"MANUAL_ACTUAL":"WEB",originCountry:o.originCountry,providerName:o.providerName.trim()||null,calculationInput:bi(o)}}),i(Xt())}catch{}};return n.jsx($n,{opened:e,onClose:r,position:"right",size:"xl",title:`${s||"소싱 상품"} 원가 이력`,children:n.jsxs(ye,{gap:"md",children:[c.isPending?n.jsx(je,{color:"blue",children:"원가 이력을 불러오는 중입니다."}):null,c.isError?n.jsx(be,{error:ve(c.error,{url:`/api/sourcing-products/${t}`})}):null,(A=(d=c.data)==null?void 0:d.mappings)==null?void 0:A.map(l=>n.jsxs(ae,{variant:"light",children:[l.marketplace," · ",l.productId," · Option ID ",l.optionId]},`${l.productId}-${l.optionId}`)),!c.isPending&&!c.isError&&x.length===0?n.jsx(je,{color:"gray",children:"저장된 원가 스냅샷이 없습니다."}):null,x.map(l=>n.jsxs(Ne,{withBorder:!0,radius:"md",children:[n.jsxs(ie,{justify:"space-between",children:[n.jsx(M,{"data-testid":"snapshot-date",fw:800,children:l.effectiveDate}),n.jsxs(ie,{children:[n.jsx(ae,{color:l.costKind==="ACTUAL"?"blue":"orange",children:l.costKind}),n.jsx(ae,{color:"gray",children:"변경 불가"})]})]}),n.jsxs(Me,{cols:2,mt:"sm",children:[n.jsxs(M,{size:"sm",children:["원가 ",l.rawUnitCost," ",l.currency]}),n.jsxs(M,{size:"sm",children:["환산 ",l.convertedUnitCost,"원"]}),n.jsxs(M,{size:"sm",children:["예상 마진 ",l.expectedMarginRatePct,"%"]}),n.jsxs(M,{size:"sm",children:["적용 종료 ",l.effectiveTo||"현재"]}),n.jsxs(M,{size:"sm",children:["공급 ",l.originCountry||"OTHER",l.providerName?` · ${l.providerName}`:""]}),n.jsxs(M,{size:"sm",children:["월 예상 마진 ",l.monthlyMarginAmount||"0","원"]}),n.jsxs(M,{size:"sm",children:["반품 반영 총 마진 ",l.totalMarginAmount||"0","원"]})]})]},l.snapshotId)),n.jsx(Ne,{withBorder:!0,radius:"md",children:n.jsxs(ye,{gap:"sm",children:[n.jsx(M,{fw:800,children:"새 immutable 원가 스냅샷"}),m?n.jsx(je,{color:"red",children:m}):null,n.jsx(be,{error:a.error?ve(a.error,{url:`/api/sourcing-products/${t}
2/snapshots`}):null}),n.jsxs(Me,{cols:{base:1,sm:2},children:[fe("새 원가 적용일","effectiveDate",o,i,{type:"date"}),n.jsx(_e,{label:"추가 스냅샷 구분",data:[{value:"EXPECTED",label:"EXPECTED"},{value:"ACTUAL",label:"ACTUAL"}],value:o.costKind,onChange:l=>{const C=l.currentTarget.value;i(P=>({...P,costKind:C}))}}),n.jsx(_e,{label:"공급 국가",data:["KOREA","CHINA","USA","JAPAN","SEA","OTHER"],value:o.originCountry,onChange:l=>{const C=l.currentTarget.value;i(P=>({...P,originCountry:C}))}}),fe("물류사명","providerName",o,i),fe("새 상품 원가","rawUnitCost",o,i,{inputMode:"decimal"}),fe("새 예상 판매가","expectedSalePrice",o,i,{inputMode:"decimal"}),fe("통화","currency",o,i),fe("환율","exchangeRate",o,i,{inputMode:"decimal"}),fe("입출고 배송비","shippingFee",o,i,{inputMode:"decimal"}),fe("판매 수수료율","salesCommissionRatePct",o,i,{inputMode:"decimal"}),fe("예상 반품률","expectedReturnRatePct",o,i,{inputMode:"decimal"}),fe("목표 마진율","targetMarginRatePct",o,i,{inputMode:"decimal"}),fe("반품 회수비","returnCollectionFee",o,i,{inputMode:"decimal"}),fe("반품 재입고비","returnRestockingFee",o,i,{inputMode:"decimal"}),fe("최근 1달 조회수","monthlyViewCount",o,i,{inputMode:"decimal"}),fe("판매 전환 계수","conversionRatePct",o,i,{inputMode:"decimal"}),fe("예상 판매량 직접 입력","expectedMonthlySales",o,i,{inputMode:"decimal"}),fe("목표 월 순익","targetMonthlyProfit",o,i,{inputMode:"decimal"})]}),n.jsx(pe,{color:"orange",loading:a.isPending,disabled:a.isPending,onClick:f,children:"원가 스냅샷 추가"})]})})]})})}const Zt=[{value:"REVIEW",label:"소싱 검토"},{value:"CANDIDATE",label:"소싱 후보"},{value:"REGISTRATION_PENDING",label:"상품 등록 대기"}],vt=(t,e)=>Ce(t,e)??"—",Ai={KOREA:"한국",CHINA:"중국",USA:"미국",JAPAN:"일본",SEA:"동남아",OTHER:"기타"},Ni=t=>t?t.status==="LEGACY_DENOMINATOR_MISSING"?`실제율 계산 불가 · ${t.targetDate} · 이전 데이터(분모 없음)`:t.status==="LEGACY_RATE_ONLY"?`참고 실제 ${vt(t.actualMarginRatePct,2)}% · ${t.targetDate} · 이전 데이터(분모 없음)`:`실제 ${vt(t.actualMarginRatePct,2)}% · ${t.targetDate}`:"실제 데이터 없음";function wi(t){const e=ce.c(12),{product:r}=t,s=tn(_i);let c,a;if(e[0]!==r.sourcingId||e[1]!==r.supplierUrl||e[2]!==s){const x=Ot(`zephly.margin-workspace.v2.${encodeURIComponent(s||"anonymous")}.product.${r.sourcingId}`,{});a=[...new Set([r.supplierUrl,...Array.isArray(x.supplierUrls)?x.supplierUrls:[]])].filter(Mi),c=typeof x.listingUrl=="string"&&x.listingUrl.trim()&&ct(x.listingUrl)?x.listingUrl:null,e[0]=r.sourcingId,e[1]=r.supplierUrl,e[2]=s,e[3]=c,e[4]=a}else c=e[3],a=e[4];const o=c;let i;e[5]!==a?(i=a.map(Ei),e[5]=a,e[6]=i):i=e[6];let m;e[7]!==o?(m=o?n.jsx(M,{component:"a",href:o,target:"_blank",rel:"noreferrer",size:"xs",c:"orange.8",children:"상품 등록 ↗"}):null,e[7]=o,e[8]=m):m=e[8];let p;return e[9]!==i||e[10]!==m?(p=n.jsxs(ie,{gap:"xs",children:[i,m]}),e[9]=i,e[10]=m,e[11]=p):p=e[11],p}function Ei(t,e){return n.jsxs(M,{component:"a",href:t,target:"_blank",rel:"noreferrer",size:"xs",c:"orange.8",children:["공급처 ",e+1," ↗"]},t)}function Mi(t){return typeof t=="string"&&t.trim()&&ct(t)}function _i(t){return t.id}function Ti(){var u,S,R,B,ne,ue,he,de,me,Ze,Le,Re;const t=ce.c(67),[e,r]=T.useState(""),[s,c]=T.useState("");let a;t[0]===Symbol.for("react.memo_cache_sentinel")?(a={search:"",status:""},t[0]=a):a=t[0];const[o,i]=T.useState(a),[m,p]=T.useState(0),[x,f]=T.useState(null);let h;t[1]!==o||t[2]!==m?(h={...o,page:m,size:20},t[1]=o,t[2]=m,t[3]=h):h=t[3];const d=Wr(h),A=Yr(),l=!!(d.isPending||d.isFetching||d.isPlaceholderData),C=Math.max(1,Math.ceil((((u=d.data)==null?void 0:u.totalElements)||0)/20));let P;t[4]!==e||t[5]!==s?(P=()=>{i({search:e,status:s}),p(0)},t[4]=e,t[5]=s,t[6]=P):P=t[6];const K=P;let L;t[7]!==A?(L=async(H,Te)=>{try{await A.mutateAsync({sourcingId:H,patch:{status:Te}})}catch{}},t[7]=A,t[8]=L):L=t[8];const I=L;let $;t[9]===Symbol.for("react.memo_cache_sentinel")?($=n.jsxs("div",{children:[n.jsx(We,{id:"sourcing-products-title",order:2,children:"소싱 상품"}),n.jsx(M,{c:"dimmed",size:"sm",children:"현재 유효 원가와 연결된 Coupang Option ID, 실제 마진을 확인합니다."})]}),t[9]=$):$=t[9];let U;t[10]===Symbol.for("react.memo_cache_sentinel")?(U=H=>r(H.currentTarget.value),t[10]=U):U=t[10];let N;t[11]!==e?(N=n.jsx(Qe,{label:"소싱 상품 검색",placeholder:"상품명, SID, URL",value:e,onCh
2ange:U,className:oe.growField}),t[11]=e,t[12]=N):N=t[12];let v;t[13]===Symbol.for("react.memo_cache_sentinel")?(v={value:"",label:"전체"},t[13]=v):v=t[13];let y,F;t[14]===Symbol.for("react.memo_cache_sentinel")?(y=[v,...Zt,{value:"LINKED",label:"판매 연결 완료"}],F=H=>c(H.currentTarget.value),t[14]=y,t[15]=F):(y=t[14],F=t[15]);let g;t[16]!==s?(g=n.jsx(_e,{label:"상품 상태 필터",value:s,data:y,onChange:F}),t[16]=s,t[17]=g):g=t[17];let w;t[18]!==K?(w=n.jsx(pe,{color:"orange",onClick:K,children:"조회"}),t[18]=K,t[19]=w):w=t[19];let z;t[20]!==g||t[21]!==w||t[22]!==N?(z=n.jsx(Ne,{withBorder:!0,radius:"lg",padding:"md",children:n.jsxs(ie,{align:"flex-end",className:oe.toolbar,children:[N,g,w]})}),t[20]=g,t[21]=w,t[22]=N,t[23]=z):z=t[23];let V;t[24]!==A.error?(V=A.error?ve(A.error,{url:"/api/sourcing-products"}):null,t[24]=A.error,t[25]=V):V=t[25];let q;t[26]!==V?(q=n.jsx(be,{error:V}),t[26]=V,t[27]=q):q=t[27];let Q;t[28]!==l||t[29]!==d.isError?(Q=l&&!d.isError?n.jsx(je,{color:"blue",children:"소싱 상품을 불러오는 중입니다."}):null,t[28]=l,t[29]=d.isError,t[30]=Q):Q=t[30];let b;t[31]!==d.error||t[32]!==d.isError?(b=d.isError?n.jsx(be,{error:ve(d.error,{url:"/api/sourcing-products"})}):null,t[31]=d.error,t[32]=d.isError,t[33]=b):b=t[33];let E;t[34]!==l||t[35]!==((R=(S=d.data)==null?void 0:S.items)==null?void 0:R.length)||t[36]!==d.isError?(E=!l&&!d.isError&&((ne=(B=d.data)==null?void 0:B.items)==null?void 0:ne.length)===0?n.jsx(je,{color:"gray",children:"조건에 맞는 소싱 상품이 없습니다."}):null,t[34]=l,t[35]=(he=(ue=d.data)==null?void 0:ue.items)==null?void 0:he.length,t[36]=d.isError,t[37]=E):E=t[37];let D;t[38]!==l||t[39]!==I||t[40]!==d.data||t[41]!==A.isPending?(D=!l&&((me=(de=d.data)==null?void 0:de.items)!=null&&me.length)?n.jsx(Ne,{withBorder:!0,radius:"lg",padding:"md",children:n.jsx(_.ScrollContainer,{minWidth:1120,className:oe.tableScroller,children:n.jsxs(_,{striped:!0,highlightOnHover:!0,children:[n.jsx(_.Thead,{children:n.jsxs(_.Tr,{children:[n.jsx(_.Th,{children:"상품"}),n.jsx(_.Th,{children:"현재 원가"}),n.jsx(_.Th,{children:"연결 Option"}),n.jsx(_.Th,{children:"예상 마진"}),n.jsx(_.Th,{children:"최근 실제 마진"}),n.jsx(_.Th,{children:"상태"}),n.jsx(_.Th,{children:"상세"})]})}),n.jsx(_.Tbody,{children:d.data.items.map(H=>n.jsxs(_.Tr,{children:[n.jsx(_.Td,{children:n.jsxs(ye,{gap:2,children:[n.jsx(M,{fw:700,children:H.product.productName}),n.jsx(wi,{product:H.product}),n.jsx(M,{size:"xs",c:"dimmed",children:H.product.sourcingId})]})}),n.jsx(_.Td,{children:H.currentSnapshot?n.jsxs(ye,{gap:2,children:[n.jsxs(M,{children:[vt(H.currentSnapshot.convertedUnitCost,0),"원"]}),n.jsxs(M,{size:"xs",children:[H.currentSnapshot.effectiveDate," · ",H.currentSnapshot.costKind]}),n.jsxs(M,{size:"xs",c:"dimmed",children:[Ai[H.currentSnapshot.originCountry]||"기타",H.currentSnapshot.providerName?` · ${H.currentSnapshot.providerName}`:""]})]}):"원가 없음"}),n.jsx(_.Td,{children:H.mappings.length?H.mappings.map($i):"미연결"}),n.jsx(_.Td,{children:H.currentSnapshot?`예상 ${vt(H.currentSnapshot.expectedMarginRatePct,2)}%`:"—"}),n.jsx(_.Td,{children:Ni(H.latestActualMargin)}),n.jsx(_.Td,{children:H.product.status==="LINKED"?n.jsx(ae,{color:"green",children:"판매 연결 완료"}):n.jsx(_e,{"aria-label":`${H.product.sourcingId} 상태 변경`,data:Zt,value:H.product.status,disabled:A.isPending,onChange:Te=>{const Je=Te.currentTarget.value;I(H.product.sourcingId,Je)}})}),n.jsx(_.Td,{children:n.jsx(pe,{size:"xs",variant:"light","aria-label":`${H.product.sourcingId} 원가 이력 보기`,onClick:()=>f(H.product),children:"원가 이력"})})]},H.product.sourcingId))})]})})}):null,t[38]=l,t[39]=I,t[40]=d.data,t[41]=A.isPending,t[42]=D):D=t[42];let W;t[43]!==l||t[44]!==m||t[45]!==((Ze=d.data)==null?void 0:Ze.totalElements)||t[46]!==d.isError||t[47]!==d.isPending||t[48]!==C?(W=!d.isPending&&!d.isError&&((Le=d.data)==null?void 0:Le.totalElements)>0?n.jsxs(ie,{justify:"center",children:[n.jsx(pe,{variant:"default",disabled:l||m===0,onClick:()=>{l||p(Ui)},children:"이전 페이지"}),n.jsx(M,{children:l?"페이지 불러오는 중":`${m+1} / ${C}`}),n.jsx(pe,{variant:"default","aria-label":"다음 페이지",disabled:l||m+1>=C,onClick:()=>{l||p(Ii)},children:"다음 페이지"})]}):null,t[43]=l,t[44]=m,t[45]=(Re=d.data)==null?void 0:Re.totalElements,t[46]=d.isError,t[47]=d.isPending,t[48]=C,t[49]=W):W=t[49];let G;t[50]!==z||t[51]!==q||t[52]!==Q||t[53]!==b||t[54]!==E||t[55]!==D||t[56]!==W?(G=n.jsxs(ye,{gap:"md",children:[$,z,q,Q,b,E,D,W]}),t[50]=z,t[51]=q,t[52]=Q,t[53]=b,t[54]=E,t[55]=D,t[56]=W,t[57]=G):G=t[57];const X=(x==null?void 0:x.sourcingId)||null,te=x==null?void 0:x.productName,J=!!x;let O;t[58]===Symbol.for("react.memo_cache_sentinel")?(O=()=>f(null),t[58]=O):O=t[58];let k;t[59]!==X||t[60]!==te||t[61]!==J?(k=n.jsx(Pi,{sourcingId:X,productName:te,opened:J,onClose:O}),t[59]=X,t[60]=te,t[61]=J,t[62]=k):k=t[62];let Z;return t[63]!==l||t[64]!==G||t[65]!==k?(Z=n.jsxs("section",{"aria-labelledby":"sourcing-products-title","aria-busy":l,children:[G,k]}),t[63]=l,t[64]=G,t[65]=k,t[66]=Z):Z=t[66],Z}function Ii(t){return t+1}function Ui(t){return t-1}function $i(t){return n.jsxs(ae,{mr:4,children:["Option ID ",t.optionId]},`${t.productId}-${t.optionId}`)}const en=[["calculator","마진 계산"],["history","Extension 수집 기록"],["abrs","ABRS 업로드 · 자동 Mapping"],["products","소싱 상품"],["revenue-goal","목표 매출 시뮬레이션"]];function Fi(){var v;const t=ce.c(29),[e,r]=T.useState("calculator"),[s,c]=T.useState(null);let a;t[0]===Symbol.for("react.memo_cache_sentinel")?(a=y=>{c(y),r("calculator")},t[0]=a):a=t[0];const o=a;let i;t[1]!==e?(i=(v=en.find(y=>{const[F]=y;return F===e}))==null?void 0:v[1],t[1]=e,t[2]=i):i=t[2];let m;t[3]!==i?(m=n.jsx("h1",{children:i}),t[3]=i,t[4]=m):m=t[4];const p=e==="calculator"?"Excel 소싱리스트의 계산 원리로 판매 전 상품 수익성을 검토합니다.":"수집 기록부터 상품 원가와 판매 후 ABRS 연결까지 한곳에서 관리합니다.";let x;t[5]!==p?(x=n.jsx("p",{children:p}),t[5]=p,t[6]=x):x=t[6];let f;t[7]!==m||t[8]!==x?(f=n.jsxs("div",{children:[m,x]}),t[7]=m,t[8]=x,t[9]=f):f=t[9];const h=e==="calculator"?"LIVE CALCULATION":e==="history"?"EXTENSION HISTORY":e==="abrs"?"AUTO MAPPING":e==="products"?"COST MASTER":"SIMULATION";let d;t[10]!==h?(d=n.jsx("span",{className:j.badge,children:h}),t[10]=h,t[11]=d):d=t[11];let A;t[12]!==f||t[13]!==d?(A=n.jsxs("div",{className:j.pageHead,children:[f,d]}),t[12]=f,t[13]=d,t[14]=A):A=t[14];let l;t[15]===Symbol.for("react.memo_cache_sentinel")?(l={list:`${oe.tabList} ${j.tabs}`,tab:j.tab},t[15]=l):l=t[15];let C;t[16]===Symbol.for("react.memo_cache_sentinel")?(C=n.jsx("div",{className:oe.tabScroller,"data-testid":"margin-tab-scroll",children:n.jsx(He.List,{children:en.map(Di)})}
2),t[16]=C):C=t[16];let P;t[17]!==s?(P=n.jsx(He.Panel,{value:"calculator",pt:"md",keepMounted:!0,children:n.jsx(Sn,{prefill:s})}),t[17]=s,t[18]=P):P=t[18];let K;t[19]===Symbol.for("react.memo_cache_sentinel")?(K=n.jsx(He.Panel,{value:"history",pt:"md",className:j.dataView,children:n.jsx(Ur,{onSaveToProduct:o})}),t[19]=K):K=t[19];let L;t[20]===Symbol.for("react.memo_cache_sentinel")?(L=n.jsx(He.Panel,{value:"abrs",pt:"md",className:j.dataView,children:n.jsx(Rr,{})}),t[20]=L):L=t[20];let I;t[21]===Symbol.for("react.memo_cache_sentinel")?(I=n.jsx(He.Panel,{value:"products",pt:"md",className:j.dataView,children:n.jsx(Ti,{})}),t[21]=I):I=t[21];let $;t[22]===Symbol.for("react.memo_cache_sentinel")?($=n.jsx(He.Panel,{value:"revenue-goal",pt:"md",children:n.jsx(Ci,{})}),t[22]=$):$=t[22];let U;t[23]!==e||t[24]!==P?(U=n.jsxs(He,{value:e,onChange:r,keepMounted:!1,classNames:l,children:[C,P,K,L,I,$]}),t[23]=e,t[24]=P,t[25]=U):U=t[25];let N;return t[26]!==U||t[27]!==A?(N=n.jsxs(wn,{component:"main",className:`${oe.workspace} ${j.page} margin-workspace`,children:[A,U]}),t[26]=U,t[27]=A,t[28]=N):N=t[28],N}function Di(t){const[e,r]=t;return n.jsx(He.Tab,{value:e,children:r},e)}function bo(){const t=ce.c(1);let e;return t[0]===Symbol.for("react.memo_cache_sentinel")?(e=n.jsx(Fi,{}),t[0]=e):e=t[0],e}export{bo as MarginResultsPage};

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.