Files
Gnuboard7/modules/_bundled/sirsoft-ecommerce/dist/js/module.iife.js
T
2026-04-01 10:30:52 +09:00

3 lines
130 KiB
JavaScript

var SirsoftEcommerce=function(he){"use strict";function We(r,c,t){const e=parseFloat(c)||1;if(e<=0)return r;const o=r/e;let n;switch(t){case"ceil":n=Math.ceil(o);break;case"floor":n=Math.floor(o);break;default:n=Math.round(o)}return n*e}function Ae(r,c){switch(c){case"KRW":return r.toLocaleString()+"원";case"USD":return"$"+r.toFixed(2);case"JPY":return"¥"+Math.floor(r).toLocaleString();case"CNY":return"¥"+r.toFixed(2);case"EUR":return"€"+r.toFixed(2);default:return r.toFixed(2)+" "+c}}function me(r,c){const{basePrice:t,currencies:e}=r,o=parseFloat(String(t))||0;if(!e||!Array.isArray(e)||e.length===0)return{};const n={};for(const a of e){const s=a.code;if(a.is_default??!1)n[s]={price:o,formatted:Ae(o,s),is_default:!0,editable:!0};else if(a.exchange_rate&&a.exchange_rate>0){const l=o/1e3*a.exchange_rate,d=We(l,a.rounding_unit||"0.01",a.rounding_method||"round");n[s]={price:d,formatted:Ae(d,s),is_default:!1,editable:!1,exchange_rate:a.exchange_rate}}}return n}const V=window.G7Core?.createLogger?.("Ecom:UpdateProduct")??{log:(...r)=>console.log("[Ecom:UpdateProduct]",...r),warn:(...r)=>console.warn("[Ecom:UpdateProduct]",...r),error:(...r)=>console.error("[Ecom:UpdateProduct]",...r)};function Ye(r,c){const t=r.params||{},{productId:e,field:o,dataSourceId:n="products"}=t;let{value:a}=t;if(a&&typeof a=="object"&&a.target!==void 0&&(a=a.target?.value,V.log("[updateProductField] Extracted value from event:",a)),!e||!o){V.warn("[updateProductField] Missing required params:",{productId:e,field:o});return}if(a===void 0){V.warn("[updateProductField] Value is undefined, skipping update");return}const s=window.G7Core;if(!s?.dataSource?.get||!s?.dataSource?.set){V.warn("[updateProductField] G7Core.dataSource API is not available");return}const i=s.dataSource.get(n);if(!i){console.warn(`[updateProductField] DataSource '${n}' not found`);return}const l=i.data?.data||[];if(!Array.isArray(l)||l.length===0){V.warn("[updateProductField] Products data is empty or invalid");return}const d=s.state.get()||{},u=d.modules?.["sirsoft-ecommerce"]?.language_currency?.currencies;let p=[...d._local?.productFieldErrors||[]];const g=l.map(C=>{if(String(C.id)===String(e)){const S=C[o];if(typeof a=="object"&&a!==null?JSON.stringify(S)===JSON.stringify(a):String(S)===String(a))return V.log(`[updateProductField] No change for product ${e}.${o}, skipping`),C;let k=a;const F=parseFloat(a)||0;if(o==="selling_price"){const U=parseFloat(C.list_price)||0;U>0&&F>U?(p.some(te=>te.productId===String(e)&&te.field===o)||p.push({productId:String(e),field:"selling_price",message:"판매가는 정가를 초과할 수 없습니다."}),k=U):p=p.filter(M=>!(M.productId===String(e)&&M.field===o))}else p=p.filter(U=>!(U.productId===String(e)&&U.field===o));const T={...C,[o]:k,_modified:!0};return o==="selling_price"&&u&&Array.isArray(u)&&(T.multi_currency_selling_price=me({basePrice:k,currencies:u}),V.log(`[updateProductField] Recalculated multi_currency_selling_price for product ${e}`)),T}return C});s.dataSource.set(n,{...i,data:{...i.data,data:g}});const w=s.state.getLocal()||{},_=new Set(w.modifiedProductIds||[]);_.add(e);const y={...w.modifiedProductFields||{}},f=String(e),v=new Set(y[f]||[]);v.add(o),y[f]=Array.from(v),s.state.setLocal({modifiedProductIds:Array.from(_),modifiedProductFields:y,productFieldErrors:p}),V.log(`[updateProductField] Updated product ${e}.${o} =`,a)}const B=window.G7Core?.createLogger?.("Ecom:UpdateOption")??{log:(...r)=>console.log("[Ecom:UpdateOption]",...r),warn:(...r)=>console.warn("[Ecom:UpdateOption]",...r),error:(...r)=>console.error("[Ecom:UpdateOption]",...r)};function Xe(r,c){const t=r.params||{},{productId:e,optionId:o,field:n,value:a,dataSourceId:s="products"}=t;if(!e||!o||!n){B.warn("[updateOptionField] Missing required params:",{productId:e,optionId:o,field:n});return}const i=window.G7Core;if(!i?.dataSource?.get||!i?.dataSource?.set){B.warn("[updateOptionField] G7Core.dataSource API is not available");return}const l=i.dataSource.get(s);if(!l){console.warn(`[updateOptionField] DataSource '${s}' not found`);return}const d=l.data?.data||[];if(!Array.isArray(d)||d.length===0){B.warn("[updateOptionField] Products data is empty or invalid");return}const u=i.state.get()||{},m=u.modules?.["sirsoft-ecommerce"]?.language_currency?.currencies;let g=[...u._local?.optionFieldErrors||[]];const w=d.map(S=>{if(String(S.id)===String(e)){const h=S.options||[],k=h.findIndex(N=>String(N.id)===String(o));if(k===-1)return B.warn("[updateOptionField] Option not found:",o),S;const F=h[k],T=F[n];if(typeof a=="object"&&a!==null?JSON.stringify(T)===JSON.stringify(a):String(T)===String(a))return B.log(`[updateOptionField] No change for option ${o}.${n}, skipping`),S;let M=a;const te=parseFloat(a)||0;if(n==="selling_price"){const N=parseFloat(F.list_price)||0;N>0&&te>N?(g.some(Oe=>Oe.productId===String(e)&&Oe.optionId===String(o)&&Oe.field===n)||g.push({productId:String(e),optionId:String(o),field:"selling_price",message:"판매가는 정가를 초과할 수 없습니다."}),M=N):g=g.filter(j=>!(j.productId===String(e)&&j.optionId===String(o)&&j.field===n))}else g=g.filter(N=>!(N.productId===String(e)&&N.optionId===String(o)&&N.field===n));const ye=[...h],ne={...ye[k],[n]:M,_modified:!0};if(n==="selling_price"){const N=parseFloat(F.list_price)||0,j=parseFloat(M)||0;ne.price_adjustment=j-N,ne.price_adjustment_formatted=(ne.price_adjustment>=0?"+":"")+ne.price_adjustment.toLocaleString()+"원"}n==="selling_price"&&m&&Array.isArray(m)&&(ne.multi_currency_selling_price=me({basePrice:M,currencies:m}),B.log(`[updateOptionField] Recalculated multi_currency_selling_price for option ${o}`)),ye[k]=ne;let ke=S.stock_quantity,Ge=S.option_stock_sum;return n==="stock_quantity"&&(Ge=ye.reduce((N,j)=>j.is_active===!1?N:N+(parseInt(j.stock_quantity,10)||0),0),ke=Ge,B.log(`[updateOptionField] Updated product stock to option sum: ${ke}`)),{...S,options:ye,stock_quantity:ke,option_stock_sum:Ge,_modified:!0}}return S});i.dataSource.set(s,{...l,data:{...l.data,data:w}});const _=i.state.getLocal()||{},y=new Set(_.modifiedOptionIds||[]),f=`${e}-${o}`;y.add(f);const v={..._.modifiedOptionFields||{}},C=new Set(v[f]||[]);C.add(n),v[f]=Array.from(C),i.state.setLocal({modifiedOptionIds:Array.from(y),modifiedOptionFields:v,optionFieldErrors:g}),B.log(`[updateOptionField] Updated option ${e}/${o}.${n} =`,a)}function Ze(r,c){const{currencies:t}=r.params||{};if(!t||!Array.isArray(t)||t.length===0)return[];const e=c._global?.locale||"ko";return t.filter(n=>!n.is_default&&n.exchange_rate).map(n=>({field:`multi_currency_selling_price.${n.code}`,header:n.name?.[e]||n.code,width:"110px",sortable:!1,editable:!1,cellChildren:[{type:"basic",name:"Span",props:{className:"text-sm text-gray-600 dark:text-gray-400"},text:`{{row.multi_currency_selling_price.${n.code}.formatted}}`}]}))}function et(r,c){const{currencies:t}=r.params||{};if(!t||!Array.isArray(t)||t.length===0)return[];const e=c._global?.locale||"ko";return t.filter(n=>!n.is_default&&n.exchange_rate).map(n=>({field:`multi_currency_selling_price.${n.code}`,header:n.name?.[e]||n.code,currencyCode:n.code,width:"100px",sortable:!1,editable:!1,cellChildren:[{type:"basic",name:"Span",props:{className:"text-sm text-gray-500 dark:text-gray-400"},text:`{{option.multi_currency_selling_price.${n.code}.formatted}}`}]}))}function z(r){const c=r.getFullYear(),t=String(r.getMonth()+1).padStart(2,"0"),e=String(r.getDate()).padStart(2,"0");return`${c}-${t}-${e}`}function tt(r){const c=new Date,t=z(c);let e;switch(r){case"today":e=t;break;case"3days":{const o=new Date(c);o.setDate(o.getDate()-2),e=z(o);break}case"week":{const o=new Date(c);o.setDate(o.getDate()-6),e=z(o);break}case"month":{const o=new Date(c);o.setMonth(o.getMonth()-1),e=z(o);break}case"3months":{const o=new Date(c);o.setMonth(o.getMonth()-3),e=z(o);break}case"6months":{const o=new Date(c);o.setMonth(o.getMonth()-6),e=z(o);break}case"1year":{const o=new Date(c);o.setFullYear(o.getFullYear()-1),e=z(o);break}case"all":default:return e="",{startDate:"",endDate:""}}return{startDate:e,endDate:t}}function ot(r){const{preset:c}=r.params||{preset:"today"},{startDate:t,endDate:e}=tt(c);return{startDate:t,endDate:e,preset:c}}const oe=window.G7Core?.createLogger?.("Ecom:DefaultOption")??{log:(...r)=>console.log("[Ecom:DefaultOption]",...r),warn:(...r)=>console.warn("[Ecom:DefaultOption]",...r),error:(...r)=>console.error("[Ecom:DefaultOption]",...r)};function rt(r,c){const t=r.params||{},{productId:e,optionId:o,dataSourceId:n="products"}=t;if(!e||!o){oe.warn("[setDefaultOption] Missing required params:",{productId:e,optionId:o});return}const a=window.G7Core;if(!a?.dataSource?.get||!a?.dataSource?.set){oe.warn("[setDefaultOption] G7Core.dataSource API is not available");return}const s=a.dataSource.get(n);if(!s){console.warn(`[setDefaultOption] DataSource '${n}' not found`);return}const i=s.data?.data||[];if(!Array.isArray(i)||i.length===0){oe.warn("[setDefaultOption] Products data is empty or invalid");return}const d=(a.state.get()||{}).modules?.["sirsoft-ecommerce"]?.language_currency?.currencies,u=i.map(w=>{if(String(w.id)!==String(e))return w;const _=w.options||[];if(_.length===0)return w;const y=_.find(h=>String(h.id)===String(o));if(!y)return oe.warn("[setDefaultOption] Option not found:",o),w;const f=_.map(h=>{const k=String(h.id)===String(o);return{...h,is_default:k,_modified:k?!0:h._modified}}),v=y.list_price,C=y.selling_price;let S=w.multi_currency_selling_price;return d&&Array.isArray(d)&&(S=me({basePrice:C,currencies:d})),oe.log(`[setDefaultOption] Set option ${o} as default for product ${e}. Syncing prices: list_price=${v}, selling_price=${C}`),{...w,options:f,list_price:v,selling_price:C,multi_currency_selling_price:S,_modified:!0}});a.dataSource.set(n,{...s,data:{...s.data,data:u}});const m=a.state.getLocal()||{},p=new Set(m.modifiedProductIds||[]);p.add(String(e));const g=new Set(m.modifiedOptionIds||[]);g.add(`${e}-${o}`),a.state.setLocal({modifiedProductIds:Array.from(p),modifiedOptionIds:Array.from(g)}),oe.log(`[setDefaultOption] Option ${o} set as default for product ${e}`)}const Ce=window.G7Core?.createLogger?.("Ecom:OptionSelect")??{log:(...r)=>console.log("[Ecom:OptionSelect]",...r),warn:(...r)=>console.warn("[Ecom:OptionSelect]",...r),error:(...r)=>console.error("[Ecom:OptionSelect]",...r)},ae=(r,c)=>`${r}-${c}`,be=r=>r.split("-")[0];function nt(r,c){const t=r.params||{},{productId:e,optionId:o,checked:n}=t,a=window.G7Core;if(!a?.state){Ce.warn("[toggleOption] G7Core.state를 사용할 수 없습니다.");return}const s=a.state.getLocal(),i=s.selectedOptionIds||[],l=s.selectedItems||[],d=ae(e,o);let u;n?i.includes(d)?u=i:u=[...i,d]:u=i.filter(f=>f!==d);const w=(a.dataSource?.get("products")?.data?.data||[]).find(f=>String(f.id)===String(e))?.options||[];let _=[...l];const y=Number(e);w.length>0&&(w.map(C=>ae(e,C.id)).filter(C=>u.includes(C)).length===w.length?_.includes(y)||_.push(y):_=_.filter(C=>C!==y)),a.state.setLocal({selectedOptionIds:u,selectedItems:_})}function Fe(r,c){const t=r.params||{},{productId:e,options:o,checked:n}=t,a=window.G7Core;if(!a?.state){Ce.warn("[toggleProductOptions] G7Core.state를 사용할 수 없습니다.");return}const s=a.state.getLocal(),i=s.selectedOptionIds||[],l=s.selectedItems||[],d=(o||[]).map(g=>ae(e,g.id));let u,m=[...l];const p=Number(e);n?(u=[...i.filter(w=>be(w)!==String(e)),...d],m.includes(p)||m.push(p)):(u=i.filter(g=>be(g)!==String(e)),m=m.filter(g=>g!==p)),a.state.setLocal({selectedOptionIds:u,selectedItems:m})}function at(r,c){return Fe(r)}function st(r,c){const t=r.params||{products:[],selectedOptionIds:[]},{products:e,selectedOptionIds:o}=t,n=o||[];if(!e||!Array.isArray(e))return{};const a={};for(const s of e){const i=String(s.id),l=s.options||[];if(l.length===0){a[i]="none";continue}const u=l.map(m=>ae(i,m.id)).filter(m=>n.includes(m)).length;u===0?a[i]="none":u===l.length?a[i]="all":a[i]="some"}return a}function it(r,c){const t=r.params||{},{selectedIds:e}=t,o=window.G7Core;if(!o?.state){Ce.warn("[syncProductSelection] G7Core.state를 사용할 수 없습니다.");return}const n=o.state.getLocal(),a=n.selectedItems||[],s=n.selectedOptionIds||[],l=o.dataSource?.get("products")?.data?.data||[],d=e.filter(p=>!a.includes(p)),u=a.filter(p=>!e.includes(p));let m=[...s];for(const p of d){const g=l.find(w=>Number(w.id)===p);if(g?.options)for(const w of g.options){const _=ae(p,w.id);m.includes(_)||m.push(_)}}for(const p of u)m=m.filter(g=>be(g)!==String(p));o.state.setLocal({selectedItems:e,selectedOptionIds:m})}const pe=window.G7Core?.createLogger?.("Ecom:CopyCode")??{log:(...r)=>console.log("[Ecom:CopyCode]",...r),warn:(...r)=>console.warn("[Ecom:CopyCode]",...r),error:(...r)=>console.error("[Ecom:CopyCode]",...r)};async function ct(r,c){const t=window.G7Core;if(!t?.state||!t?.api){pe.warn("[generateCopyProductCode] G7Core API is not available");return}try{const e=await t.api.post("/api/modules/sirsoft-ecommerce/admin/products/generate-code");if(!e?.data?.product_code)throw new Error("Invalid API response");const o=e.data.product_code;if((window.__g7LayoutContextStack||[]).length>0&&t.state.setParentLocal)t.state.setParentLocal({"ui.copyOptions.newProductCode":o}),pe.log(`[generateCopyProductCode] Generated (parent): ${o}`);else{const s=t.state.getLocal()||{};t.state.setLocal({ui:{...s.ui,copyOptions:{...s.ui?.copyOptions||{},newProductCode:o}}}),pe.log(`[generateCopyProductCode] Generated (local): ${o}`)}}catch(e){pe.error("[generateCopyProductCode] Failed:",e),t.toast?.error?.(t.t?.("sirsoft-ecommerce.admin.product.messages.code_generate_error")??"Failed to generate product code.")}}const De=window.G7Core?.createLogger?.("Ecom:CopyProduct")??{log:(...r)=>console.log("[Ecom:CopyProduct]",...r),warn:(...r)=>console.warn("[Ecom:CopyProduct]",...r),error:(...r)=>console.error("[Ecom:CopyProduct]",...r)};async function lt(r,c){const t=window.G7Core;if(!t?.state){De.warn("[copyProduct] G7Core API is not available");return}const e=t.state.getLocal()||{},n=(t.state.getParent?.()||{})._local||{},a=n.ui?.copyOptions||e.ui?.copyOptions||{},s=e.form?.product_code||n.form?.product_code||n.productList?.copyTargetProduct?.product_code||e.productList?.copyTargetProduct?.product_code;if(!s){t.toast?.error?.(t.t?.("sirsoft-ecommerce.admin.product.messages.copy_source_not_found")??"Could not find source product information.");return}t.modal?.close?.();const i={copy_id:s,copy_images:a.images??!0?"1":"0",copy_options:a.options??!0?"1":"0",copy_categories:a.categories??!0?"1":"0",copy_sales_info:a.sales_info??!0?"1":"0",copy_description:a.description??!0?"1":"0",copy_notice:a.notice??!0?"1":"0",copy_common_info:a.common_info??!0?"1":"0",copy_other_info:a.other_info??!0?"1":"0",copy_shipping:a.shipping??!0?"1":"0",copy_seo:a.seo??!1?"1":"0",copy_identification:a.identification??!0?"1":"0"},d=`/admin/ecommerce/products/create?${new URLSearchParams(i).toString()}`;De.log("[copyProduct] Navigating to:",d),t.navigate?t.navigate(d):c.navigate?c.navigate(d):window.location.href=d}const L=window.G7Core?.createLogger?.("Ecom:Category")??{log:(...r)=>console.log("[Ecom:Category]",...r),warn:(...r)=>console.warn("[Ecom:Category]",...r),error:(...r)=>console.error("[Ecom:Category]",...r)};function Ee(r,c,t,e=[]){for(const o of r){const n=o.name?.[t]||o.name?.ko||"";if(o.id===c)return[...e,n].join(" > ");if(o.children&&o.children.length>0){const a=Ee(o.children,c,t,[...e,n]);if(a)return a}}return null}function dt(r,c,t){return r.map(e=>{if(e.breadcrumb)return{id:e.id,breadcrumb:e.breadcrumb};const o=Ee(c,e.id,t);if(o)return{id:e.id,breadcrumb:o};const n=e.name?.[t]||e.name?.ko||e.name_localized||"";return{id:e.id,breadcrumb:n}})}function ut(r,c){const t=r.params||{},e=t.depth,o=t.category;if(e===void 0||!o){L.warn("[selectCategory] Missing depth or category param");return}const n=c.isolatedContext;if(n){const d=n.state.selectedCategories||[null,null,null,null];if(d[e]?.id===o.id){L.log(`[selectCategory] Same category already selected at depth ${e}, skipping`);return}const u=d.map((m,p)=>p<e?m:p===e?o:null);n.mergeState({selectedCategories:u}),L.log(`[selectCategory] Selected category at depth ${e} (isolated):`,o.id);return}const a=window.G7Core;if(!a?.state){L.warn("[selectCategory] G7Core.state API is not available");return}const s=a.state.getLocal()||{},i=s.ui?.selectedCategories||[null,null,null,null];if(i[e]?.id===o.id){L.log(`[selectCategory] Same category already selected at depth ${e}, skipping`);return}const l=i.map((d,u)=>u<e?d:u===e?o:null);a.state.setLocal({ui:{...s.ui,selectedCategories:l}}),L.log(`[selectCategory] Selected category at depth ${e}:`,o.id)}function mt(r,c){const t=r.params||{},e=t.depth,o=t.category;if(e===void 0||!o){L.warn("[selectCategoryMobile] Missing depth or category param");return}const n=c.isolatedContext;if(n){const m=n.state.selectedCategories||[null,null,null,null],p=n.state.categoryStep||1,g=m.map((y,f)=>f<e?y:f===e?o:null),_=o.children&&o.children.length>0?e+2:p;n.mergeState({selectedCategories:g,categoryStep:_}),L.log(`[selectCategoryMobile] Selected category at depth ${e} (isolated):`,o.id,"nextStep:",_);return}const a=window.G7Core;if(!a?.state){L.warn("[selectCategoryMobile] G7Core.state API is not available");return}const s=a.state.getLocal()||{},l=(s.ui?.selectedCategories||[null,null,null,null]).map((m,p)=>p<e?m:p===e?o:null),u=o.children&&o.children.length>0?e+2:s.ui?.categoryStep;a.state.setLocal({ui:{...s.ui,selectedCategories:l,categoryStep:u}}),L.log(`[selectCategoryMobile] Selected category at depth ${e}:`,o.id,"nextStep:",u)}function pt(r,c){L.log("[addCategoryToSelection] START");const t=window.G7Core;if(!t?.state){L.warn("[addCategoryToSelection] G7Core.state API is not available");return}const e=t.state.getLocal()||{},o=t.locale?.current?.()||"ko",n=c.isolatedContext,a=n?n.state.selectedCategories||[]:e.ui?.selectedCategories||[];L.log("[addCategoryToSelection] Current state:",{selectedCats:a.map(f=>f?.id??null),currentCategoryIds:e.form?.category_ids,currentSelectedCategoryInfos:e.selectedCategoryInfos,usingIsolatedContext:!!n});const s=a.filter(Boolean).pop();if(!s){L.warn("[addCategoryToSelection] No category selected");return}L.log("[addCategoryToSelection] Last selected category:",s.id,s.name);const i=e.form?.category_ids||[];if(i.length>=5){t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.product.category.messages.max_5")??"You can select up to 5 categories.");return}if(i.includes(s.id)){L.log("[addCategoryToSelection] Duplicate detected:",s.id,"in",i),t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.product.category.messages.already_selected")??"This category is already selected.");return}const l=a.filter(Boolean).map(f=>f.name?.[o]||f.name?.ko||"").join(" > "),d=[...i,s.id],u=e.form?.primary_category_id||s.id,p=(t.state.getDataSources?.()||{}).categories?.data?.data||[];let g=e.selectedCategoryInfos||[];const w=e.form?.categories||[];g.length===0&&w.length>0&&(L.log("[addCategoryToSelection] Initializing from form.categories:",w.length,"items"),g=dt(w,p,o));const _=[...g,{id:s.id,breadcrumb:l}];L.log("[addCategoryToSelection] Before setLocal:",{newCategoryIds:d,primaryCategoryId:u,newInfos:_});try{t.state.setLocal({form:{...e.form,category_ids:d,primary_category_id:u},selectedCategoryInfos:_,hasChanges:!0}),L.log("[addCategoryToSelection] setLocal SUCCESS")}catch(f){L.error("[addCategoryToSelection] setLocal FAILED:",f)}const y=t.state.getLocal()||{};L.log("[addCategoryToSelection] After setLocal:",{category_ids:y.form?.category_ids,selectedCategoryInfos:y.selectedCategoryInfos}),L.log(`[addCategoryToSelection] Added category ${s.id} with breadcrumb: ${l}. Total: ${d.length}`)}function gt(r,c){const e=(r.params||{}).categoryId;if(!e){L.warn("[removeCategoryFromSelection] Missing categoryId param");return}const o=window.G7Core;if(!o?.state){L.warn("[removeCategoryFromSelection] G7Core.state API is not available");return}const n=o.state.getLocal()||{},s=(n.form?.category_ids||[]).filter(u=>u!==e);let i=n.form?.primary_category_id;i===e&&(i=s[0]||null);const d=(n.selectedCategoryInfos||[]).filter(u=>u.id!==e);o.state.setLocal({form:{...n.form,category_ids:s,primary_category_id:i},selectedCategoryInfos:d,hasChanges:!0}),L.log(`[removeCategoryFromSelection] Removed category ${e}. Remaining: ${s.length}`)}function ft(r,c){const t=r.params||{},e=t.categoryId,o=t.categories;if(!e||!o||!Array.isArray(o))return"";const a=window.G7Core?.locale?.current?.()||"ko",s=(l,d,u=[])=>{for(const m of l){const p=m.name?.[a]||m.name?.ko||"";if(m.id===d)return[...u,p];if(m.children&&m.children.length>0){const g=s(m.children,d,[...u,p]);if(g)return g}}return null},i=s(o,e);return i?i.join(" > "):""}function _t(r,c){L.log("[initCategoryInfosFromProduct] START");const t=window.G7Core;if(!t?.state){L.warn("[initCategoryInfosFromProduct] G7Core.state API is not available");return}const e=t.state.getLocal()||{},o=t.locale?.current?.()||"ko",a=(t.state.getDataSources?.()||{}).categories?.data?.data||[],s=e.form?.categories||[],i=e.form?.category_ids||[];if(L.log("[initCategoryInfosFromProduct] Product categories:",s),L.log("[initCategoryInfosFromProduct] Category IDs:",i),L.log("[initCategoryInfosFromProduct] Categories tree available:",a.length>0),i.length===0){L.log("[initCategoryInfosFromProduct] No categories to initialize");return}const l=(u,m,p=[])=>{for(const g of u){const w=g.name?.[o]||g.name?.ko||"";if(g.id===m)return[...p,w];if(g.children&&g.children.length>0){const _=l(g.children,m,[...p,w]);if(_)return _}}return null},d=[];for(const u of i){const m=l(a,u);if(m)d.push({id:u,breadcrumb:m.join(" > ")});else{const p=s.find(g=>g.id===u);if(p){const g=p.name?.[o]||p.name?.ko||p.name_localized||"";d.push({id:u,breadcrumb:g})}}}L.log("[initCategoryInfosFromProduct] Generated selectedCategoryInfos:",d),t.state.setLocal({selectedCategoryInfos:d}),L.log("[initCategoryInfosFromProduct] DONE")}function wt(r,c){const t={category1:"",category2:"",category3:"",category4:""},e=r.params||{},o=e.categoryId1?String(e.categoryId1):"",n=e.categoryId2?String(e.categoryId2):"",a=e.categoryId3?String(e.categoryId3):"",s=e.categoryId4?String(e.categoryId4):"",i=e.categories;if(!i||!Array.isArray(i)||i.length===0)return L.warn("[validateCategoryPath] No categories data provided"),t;if(o){const l=i.find(d=>String(d.id)===o);if(l&&l.depth===0&&(t.category1=o,n&&l.children)){const d=l.children.find(u=>String(u.id)===n);if(d&&d.depth===1&&(t.category2=n,a&&d.children)){const u=d.children.find(m=>String(m.id)===a);if(u&&u.depth===2&&(t.category3=a,s&&u.children)){const m=u.children.find(p=>String(p.id)===s);m&&m.depth===3&&(t.category4=s)}}}}return L.log("[validateCategoryPath] Result:",t),t}function yt(r,c){const t=r.params||{},e=t.brandId,o=t.brands;if(!e||!o||!Array.isArray(o))return"";const a=window.G7Core?.locale?.current?.()||"ko",s=o.find(i=>i.id===e);return s?s.name?.[a]??s.name?.ko??"":""}function ht(r,c){const t=r.params||{},e=t.brandId,o=t.brands;if(!e||!o||!Array.isArray(o))return"";const a=window.G7Core?.locale?.current?.()||"ko",s=o.find(i=>i.id===e);return s?.description?.[a]??s?.description?.ko??""}const J=window.G7Core?.createLogger?.("Ecom:Price")??{log:(...r)=>console.log("[Ecom:Price]",...r),warn:(...r)=>console.warn("[Ecom:Price]",...r),error:(...r)=>console.error("[Ecom:Price]",...r)};function Ct(r,c,t){const e=r/1e3*c;switch(t){case"ceil":return Math.ceil(e);case"floor":return Math.floor(e);case"round":default:return Math.round(e)}}function bt(r,c){const t=r.params||{},e=t.field,o=t.currency,n=t.value,a=t.autoFill;if(!e||!o||n===void 0){J.warn("[updatePrice] Missing required params: field, currency, or value");return}const s=window.G7Core;if(!s?.state){J.warn("[updatePrice] G7Core.state API is not available");return}const i=s.state.getLocal()||{},l=c.datasources?.currencies?.data||{},d=l?.list||[],u=l?.default_currency||"KRW",m=l?.rounding_method||"round",p={...i.form?.multi_currency_prices||{}};p[o]={...p[o]||{},[e]:n},a&&o===u&&d.forEach(_=>{if(_.code!==u){const y=_.exchange_rate??1,f=Ct(n,y,m);p[_.code]={...p[_.code]||{},[e]:f}}});const g={list:"list_price",selling:"selling_price"},w=o===u?n:i.form?.[g[e]];s.state.setLocal({form:{...i.form,multi_currency_prices:p,[g[e]]:w},hasChanges:!0}),J.log(`[updatePrice] Updated ${e} price for ${o}: ${n}`)}function It(r,c){const e=(r.params||{}).options;if(!e||!Array.isArray(e)||e.length===0)return 0;const o=e.reduce((n,a)=>a.is_active===!1?n:n+(a.stock_quantity||0),0);return J.log(`[calculateTotalOptionStock] Total stock: ${o}`),o}function St(r,c){const t=window.G7Core;if(!t?.state){J.warn("[validatePriceRelation] G7Core.state API is not available");return}const e=t.state.getLocal()||{},o=parseFloat(String(e.form?.list_price))||0,n=parseFloat(String(e.form?.selling_price))||0,a=n>o&&o>0,s=t.t?.("sirsoft-ecommerce.admin.product.validation.selling_price_exceeds_list_price")??"판매가는 정가보다 클 수 없습니다.",i={...e.errors||{}};a?i.selling_price=[s]:delete i.selling_price;const l=Object.keys(i).length>0;t.state.setLocal({validation:{...e.validation,price_error:a},errors:l?i:null}),a?(t.toast?.warning?.(s),J.warn(`[validatePriceRelation] Selling price (${n}) exceeds list price (${o})`)):J.log("[validatePriceRelation] Price validation passed")}const G=window.G7Core?.createLogger?.("Ecom:ProductOption")??{log:(...r)=>console.log("[Ecom:ProductOption]",...r),warn:(...r)=>console.warn("[Ecom:ProductOption]",...r),error:(...r)=>console.error("[Ecom:ProductOption]",...r)};function vt(){return window.G7Core?.config?.("app.supported_locales")??["ko","en"]}function $e(){return vt().reduce((c,t)=>({...c,[t]:""}),{})}function xt(r,c,t){const e=parseFloat(c)||1;if(e<=0)return r;const o=r/e;let n;switch(t){case"ceil":n=Math.ceil(o);break;case"floor":n=Math.floor(o);break;default:n=Math.round(o)}return n*e}function ge(r,c){const t=c.exchange_rate||0;if(t<=0)return{price:0};const e=r/1e3*t,o=xt(e,c.rounding_unit||"0.01",c.rounding_method||"round"),n=c.decimal_places??2;return{price:parseFloat(o.toFixed(n))}}function Lt(r,c){const e=(r.params||{}).enabled,o=window.G7Core;if(!o?.state){G.warn("[toggleAutoMultiCurrency] G7Core.state API is not available");return}const n=o.state.getLocal()||{},a=o.state.get()||{};if(o.state.setLocal({ui:{...n.ui,autoMultiCurrency:e}}),e){const s=n.form?.options??[],i=(a.modules?.["sirsoft-ecommerce"]?.language_currency?.currencies||[]).filter(d=>!d.is_default&&d.exchange_rate);if(i.length===0){G.warn("[toggleAutoMultiCurrency] No non-default currencies with exchange rates found");return}const l=s.map(d=>{const u=d.selling_price??d.sale_price??0,m={};return i.forEach(p=>{m[p.code]=ge(u,p)}),{...d,multi_currency_selling_price:m}});o.state.setLocal({form:{...n.form,options:l},hasChanges:!0}),G.log("[toggleAutoMultiCurrency] Auto-calculated multi-currency prices for currencies:",i.map(d=>d.code))}G.log(`[toggleAutoMultiCurrency] Set to ${e}`)}function Pt(r,c){const e=(r.params||{}).optionCode;if(!e){G.warn("[setDefaultOption] Missing optionCode param");return}const o=window.G7Core;if(!o?.state){G.warn("[setDefaultOption] G7Core.state API is not available");return}const n=o.state.getLocal()||{},s=[...n.form?.options??[]].map(i=>({...i,is_default:i.option_code===e}));o.state.setLocal({form:{...n.form,options:s},hasChanges:!0}),G.log(`[setDefaultOption] Set default option to ${e}`)}function kt(r,c){const t=r.params||{},e=typeof t.index=="string"?parseInt(t.index,10):t.index,o=t.field,n=t.value;if(e==null||!o){G.warn("[updateFormOptionField] Missing required params:",{index:e,field:o});return}const a=window.G7Core;if(!a?.state){G.warn("[updateFormOptionField] G7Core.state API is not available");return}const s=a.state.getLocal()||{},i=[...s.form?.options??[]];if(e<0||e>=i.length){G.warn("[updateFormOptionField] Index out of bounds:",{index:e,length:i.length});return}const l=["regular_price","sale_price","list_price","selling_price","stock_quantity","safe_stock_quantity","weight","volume","mileage_value"];let d=n;if(l.includes(o)&&(d=parseFloat(n)||0),i[e]={...i[e],[o]:d},o==="selling_price"){const u=parseFloat(String(s.form?.selling_price))||0,m=parseFloat(String(d))||0;if(i[e].price_adjustment=m-u,(a.state.getLocal()||{}).ui?.multiCurrencyAutoFill??!0){const _=((a.state.get()||{}).modules?.["sirsoft-ecommerce"]?.language_currency?.currencies||[]).filter(y=>!y.is_default&&y.exchange_rate);if(_.length>0){const y={};_.forEach(f=>{y[f.code]=ge(m,f)}),i[e].multi_currency_selling_price=y,G.log(`[updateFormOptionField] Recalculated multi_currency_selling_price for option at index ${e}:`,_.map(f=>f.code))}}}if((o==="stock_quantity"||o==="is_active")&&i.length>0){const u=i.filter(m=>m.is_active!==!1).reduce((m,p)=>m+(parseInt(String(p.stock_quantity),10)||0),0);a.state.setLocal({form:{...s.form,options:i,stock_quantity:u},hasChanges:!0}),G.log(`[updateFormOptionField] Updated product stock_quantity to ${u} (sum of active options)`);return}a.state.setLocal({form:{...s.form,options:i},hasChanges:!0}),G.log(`[updateFormOptionField] Updated options[${e}].${o} =`,d)}function Gt(r,c){const t=r.params||{},e=typeof t.index=="string"?parseInt(t.index,10):t.index,o=t.currencyCode,n=t.value;if(e==null||!o){G.warn("[updateFormOptionCurrencyField] Missing required params:",{index:e,currencyCode:o});return}const a=window.G7Core;if(!a?.state){G.warn("[updateFormOptionCurrencyField] G7Core.state API is not available");return}const s=a.state.getLocal()||{},i=[...s.form?.options??[]];if(e<0||e>=i.length){G.warn("[updateFormOptionCurrencyField] Index out of bounds:",{index:e,length:i.length});return}const l=parseFloat(n)||0,d=i[e].multi_currency_selling_price||{};i[e]={...i[e],multi_currency_selling_price:{...d,[o]:{price:l}}},a.state.setLocal({form:{...s.form,options:i},hasChanges:!0}),G.log(`[updateFormOptionCurrencyField] Updated options[${e}].multi_currency_selling_price.${o} =`,l)}function Ot(r,c){const t=window.G7Core;if(!t?.state){G.warn("[addOptionRow] G7Core.state API is not available");return}const e=t.state.getLocal()||{},o=[...e.form?.options??[]],n=e.form?.option_groups??[],a=`OPT-${Date.now()}`,s=n.map(l=>({key:l.name,value:$e()})),i={id:null,option_code:a,option_name:$e(),option_values:s,is_default:o.length===0,regular_price:0,sale_price:0,list_price:0,selling_price:0,price_adjustment:0,multi_currency_selling_price:{},sku:"",stock_quantity:0,safe_stock_quantity:0,weight:0,volume:0,mileage_value:0,mileage_type:"percent",is_active:!0};t.state.setLocal({form:{...e.form,options:[...o,i]},hasChanges:!0}),G.log(`[addOptionRow] Added new option row: ${a}`)}function At(r,c){const t=window.G7Core;if(!t?.state){G.warn("[recalculateOptionPriceAdjustments] G7Core.state API is not available");return}const e=r.params||{},o=t.state.getLocal()||{},n=t.state.get()||{},a=e.newSellingPrice!==void 0?parseFloat(String(e.newSellingPrice))||0:parseFloat(String(o.form?.selling_price))||0,s=[...o.form?.options??[]];if(s.length===0){G.log("[recalculateOptionPriceAdjustments] No options to recalculate");return}const l=o.ui?.multiCurrencyAutoFill??!0?(n.modules?.["sirsoft-ecommerce"]?.language_currency?.currencies||[]).filter(u=>!u.is_default&&u.exchange_rate):[],d=s.map(u=>{const m=parseFloat(String(u.price_adjustment))||0,p=a+m,g={...u,selling_price:p};if(l.length>0){const w={};l.forEach(_=>{w[_.code]=ge(p,_)}),g.multi_currency_selling_price=w}return g});t.state.setLocal({form:{...o.form,options:d}}),G.log(`[recalculateOptionPriceAdjustments] Recalculated selling_price for ${s.length} options based on product selling_price: ${a}`)}const b=window.G7Core?.createLogger?.("Ecom:Option")??{log:(...r)=>console.log("[Ecom:Option]",...r),warn:(...r)=>console.warn("[Ecom:Option]",...r),error:(...r)=>console.error("[Ecom:Option]",...r)};function Ie(){return window.G7Core?.config?.("app.supported_locales")??["ko","en"]}function se(){return window.G7Core?.config?.("app.locale")??Ie()[0]??"ko"}function K(){return Ie().reduce((c,t)=>({...c,[t]:""}),{})}function Ft(r,c){return typeof r=="string"?r:r[c]??r.ko??Object.values(r)[0]??""}function Ne(r){return r&&typeof r=="object"&&!Array.isArray(r)}function Dt(r){return Array.isArray(r)?r:r&&typeof r=="object"?Object.values(r):[]}function Et(r){return r.reduce((c,t)=>{const e=[];return c.forEach(o=>{t.forEach(n=>{e.push([...o,n])})}),e},[[]])}function $t(r){const c=Ie(),t={};for(const e of c){const o=r.map(n=>Ft(n,e));t[e]=o.join("/")}return t}function Nt(r,c){return c.map((t,e)=>({key:typeof t.name=="string"?{...K(),[se()]:t.name}:t.name,value:Ne(r[e])?r[e]:{...K(),[se()]:r[e]}}))}function Tt(r,c){const t=window.G7Core;if(!t?.state){b.warn("[addOptionInput] G7Core.state API is not available");return}const e=t.state.getLocal()||{},o=e.ui?.optionInputs??[];if(o.length>=3){t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.product.options.messages.input_max_3")??"You can add up to 3 option inputs.");return}t.state.setLocal({ui:{...e.ui,optionInputs:[...o,{name:K(),values:[]}]}}),b.log(`[addOptionInput] Added option input. Total: ${o.length+1}`)}function Rt(r,c){const e=(r.params||{}).index;if(e===void 0){b.warn("[removeOptionInput] Missing index param");return}const o=window.G7Core;if(!o?.state){b.warn("[removeOptionInput] G7Core.state API is not available");return}const n=o.state.getLocal()||{},a=[...n.ui?.optionInputs??[]];a.splice(e,1),o.state.setLocal({ui:{...n.ui,optionInputs:a}}),b.log(`[removeOptionInput] Removed option input at index ${e}`)}function Mt(r,c){const t=r.params||{},e=t.index,o=t.field,n=t.value;if(e===void 0||!o){b.warn("[updateOptionInput] Missing required params");return}const a=window.G7Core;if(!a?.state){b.warn("[updateOptionInput] G7Core.state API is not available");return}b.log(`[updateOptionInput] Called with index=${e}, field="${o}" (type: ${typeof o}), value=`,n);const s=a.state.getLocal()||{},i=[...s.ui?.optionInputs??[]];if(b.log(`[updateOptionInput] Current inputs[${e}]:`,i[e]),i[e]||(b.log(`[updateOptionInput] inputs[${e}] not found, initializing with empty structure`),i[e]={name:K(),values:[]}),o==="name"){const l=se(),d=i[e].name;b.log(`[updateOptionInput] Processing 'name' field - defaultLocale: ${l}, existingName:`,d,`type: ${typeof d}`);let u;n&&typeof n=="object"&&!Array.isArray(n)?(u=n,b.log("[updateOptionInput] Using multilingual value directly:",u)):(u={...d&&typeof d=="object"&&!Array.isArray(d)?d:K(),[l]:n},b.log("[updateOptionInput] Setting single locale value:",u)),i[e]={...i[e],name:u}}else b.log(`[updateOptionInput] Processing non-name field '${o}'`),i[e]={...i[e],[o]:n};b.log(`[updateOptionInput] Final inputs[${e}]:`,i[e]),a.state.setLocal({ui:{...s.ui,optionInputs:i}})}function Ht(r,c){const t=window.G7Core;if(!t?.state){b.warn("[generateOptions] G7Core.state API is not available");return}const e=t.state.getLocal()||{},o=t.state.get()||{},n=e.ui?.optionInputs??[],a=se(),s=_=>_.name?typeof _.name=="string"?_.name:_.name[a]??"":"",i=n.map(_=>({..._,values:Dt(_.values)})),l=i.filter(_=>s(_)&&_.values&&_.values.length>0);if(b.log(`[generateOptions] Validating inputs - defaultLocale: ${a}, normalizedInputs:`,i.map(_=>({name:_.name,nameType:typeof _.name,extractedName:s(_),values:_.values,valuesIsArray:Array.isArray(_.values)}))),b.log(`[generateOptions] Valid inputs count: ${l.length}`),l.length===0){t.toast?.error?.(t.t?.("sirsoft-ecommerce.admin.product.options.messages.name_value_required")??"Please enter option name and values.");return}const d=e.form?.options??[],u=r.params?.skipConfirm===!0;if(d.length>0&&!u){t.modal?.open?.("modal_confirm_regenerate");return}const m=parseFloat(String(e.form?.list_price))||0,p=parseFloat(String(e.form?.selling_price))||0,g=e.form?.multi_currency_selling_price,w=(o.modules?.["sirsoft-ecommerce"]?.language_currency?.currencies||[]).filter(_=>!_.is_default&&_.exchange_rate);try{b.log("[generateOptions] Step 1: Creating optionGroups...");const _=l.map((h,k)=>(b.log(`[generateOptions] Processing input[${k}]:`,{name:h.name,values:h.values,valuesType:typeof h.values,valuesIsArray:Array.isArray(h.values)}),{name:typeof h.name=="string"?{...K(),[a]:h.name}:h.name,values:h.values.map(F=>Ne(F)?F:{...K(),[a]:F})})),f=Et(l.map(h=>h.values)).map((h,k)=>{const F=Nt(h,l),T=$t(h),U=`OPT-${String(k+1).padStart(3,"0")}`;let M={};return g&&typeof g=="object"&&Object.keys(g).length>0?M=JSON.parse(JSON.stringify(g)):p>0&&w.length>0&&w.forEach(te=>{M[te.code]=ge(p,te)}),{id:null,option_code:U,option_values:F,option_name:T,list_price:m,selling_price:p,price_adjustment:0,stock_quantity:0,safe_stock_quantity:0,is_default:k===0,is_active:!0,sku:"",multi_currency_selling_price:M}}),v=e.form?.options??[],C=h=>h.option_name?typeof h.option_name=="string"?h.option_name:h.option_name[a]??h.option_name.ko??"":"",S=f.map(h=>{const k=C(h),F=v.find(T=>C(T)===k);return F?{...h,...F,id:F.id}:h});t.state.setLocal({form:{...e.form,option_groups:_,options:S,has_options:S.length>0},hasChanges:!0}),t.toast?.success?.(t.t?.("sirsoft-ecommerce.admin.product.options.messages.generated",{count:S.length})??`${S.length} options have been generated.`),b.log(`[generateOptions] Generated ${S.length} options`)}catch(_){throw b.error("[generateOptions] Error occurred:",_),b.error("[generateOptions] Error message:",_.message),b.error("[generateOptions] Error stack:",_.stack),_}}function qt(r,c){const e=(r.params||{}).rowIndex;if(e===void 0){b.warn("[deleteOption] Missing rowIndex param");return}const o=window.G7Core;if(!o?.state){b.warn("[deleteOption] G7Core.state API is not available");return}const n=o.state.getLocal()||{},a=[...n.form?.options??[]];a.splice(e,1),o.state.setLocal({form:{...n.form,options:a},hasChanges:!0}),b.log(`[deleteOption] Deleted option at index ${e}`)}function Ut(r,c){const t=r.params||{},e=t.optionName,o=t.applyToAll,n=t.inheritPrice,a=window.G7Core;if(!a?.state){b.warn("[applyOptionAddTool] G7Core.state API is not available");return}if(!e?.trim()){a.toast?.warning?.(a.t?.("sirsoft-ecommerce.admin.product.options.messages.name_required")??"Please enter option name.");return}const s=a.state.getLocal()||{},l=[...s.form?.options??[]].map(d=>{const u={...d};return o&&(u.option_values={...d.option_values,[e]:""}),n&&(u.price_adjustment=d.price_adjustment??0),u});a.state.setLocal({form:{...s.form,options:l},ui:{...s.ui,optionAddToolName:"",optionAddToolApplyToAll:!1,optionAddToolInheritPrice:!1},hasChanges:!0}),a.toast?.success?.(a.t?.("sirsoft-ecommerce.admin.product.options.messages.add_tool_applied")??"Option add tool has been applied.")}function jt(r,c){const t=window.G7Core;if(!t?.state){b.warn("[addRequiredItem] G7Core.state API is not available");return}const e=t.state.getLocal()||{},o=e.form?.required_items??[],n={id:null,sort_order:o.length,option_name:{ko:"",en:""},description:{ko:"",en:""}};t.state.setLocal({form:{...e.form,required_items:[...o,n]},hasChanges:!0}),b.log(`[addRequiredItem] Added required item. Total: ${o.length+1}`)}function Vt(r,c){const t=r.params||{},e=t.index,o=t.field,n=t.locale,a=t.value;if(e===void 0||!o||!n){b.warn("[updateRequiredItem] Missing required params");return}const s=window.G7Core;if(!s?.state){b.warn("[updateRequiredItem] G7Core.state API is not available");return}const i=s.state.getLocal()||{},l=[...i.form?.required_items??[]];l[e]={...l[e],[o]:{...l[e][o],[n]:a}},s.state.setLocal({form:{...i.form,required_items:l},hasChanges:!0})}function Bt(r,c){const e=(r.params||{}).index;if(e===void 0){b.warn("[removeRequiredItem] Missing index param");return}const o=window.G7Core;if(!o?.state){b.warn("[removeRequiredItem] G7Core.state API is not available");return}const n=o.state.getLocal()||{},a=[...n.form?.required_items??[]];a.splice(e,1),a.forEach((s,i)=>{s.sort_order=i}),o.state.setLocal({form:{...n.form,required_items:a},hasChanges:!0}),b.log(`[removeRequiredItem] Removed required item at index ${e}`)}function Kt(r,c){const t=r.params||{},e=t.oldIndex,o=t.newIndex;if(e===void 0||o===void 0){b.warn("[reorderRequiredItems] Missing oldIndex or newIndex param");return}const n=window.G7Core;if(!n?.state){b.warn("[reorderRequiredItems] G7Core.state API is not available");return}const a=n.state.getLocal()||{},s=[...a.form?.required_items??[]],[i]=s.splice(e,1);s.splice(o,0,i),s.forEach((l,d)=>{l.sort_order=d}),n.state.setLocal({form:{...a.form,required_items:s},hasChanges:!0}),b.log(`[reorderRequiredItems] Moved item from ${e} to ${o}`)}function Qt(r,c){const t=window.G7Core;if(!t?.state){b.warn("[addAdditionalOption] G7Core.state API is not available");return}const e=t.state.getLocal()||{},o=e.form?.additional_options??[];if(o.length>=5){t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.product.options.messages.additional_max_5")??"You can add up to 5 additional options.");return}const n=`temp_${Date.now()}_${Math.random().toString(36).substring(2,9)}`;t.state.setLocal({form:{...e.form,additional_options:[...o,{id:n,name:{ko:"",en:""},is_required:!1,sort_order:o.length}]},hasChanges:!0}),b.log(`[addAdditionalOption] Added additional option. Total: ${o.length+1}`)}function zt(r,c){const t=r.params||{},e=t.index,o=t.field,n=t.value;if(e===void 0||!o){b.warn("[updateAdditionalOption] Missing required params");return}const a=window.G7Core;if(!a?.state){b.warn("[updateAdditionalOption] G7Core.state API is not available");return}const s=a.state.getLocal()||{},i=[...s.form?.additional_options??[]];if(!i[e]){b.warn("[updateAdditionalOption] Option not found at index",e);return}if(o==="name")if(n&&typeof n=="object"&&!Array.isArray(n))i[e]={...i[e],name:n};else{const l=se(),d=i[e].name,u=d&&typeof d=="object"&&!Array.isArray(d)?d:K();i[e]={...i[e],name:{...u,[l]:n}}}else i[e]={...i[e],[o]:n};a.state.setLocal({form:{...s.form,additional_options:i},hasChanges:!0}),b.log(`[updateAdditionalOption] Updated options[${e}].${o}`)}function Jt(r,c){const e=(r.params||{}).index;if(e===void 0){b.warn("[removeAdditionalOption] Missing index param");return}const o=window.G7Core;if(!o?.state){b.warn("[removeAdditionalOption] G7Core.state API is not available");return}const n=o.state.getLocal()||{},a=[...n.form?.additional_options??[]];a.splice(e,1),a.forEach((s,i)=>{s.sort_order=i}),o.state.setLocal({form:{...n.form,additional_options:a},hasChanges:!0}),b.log(`[removeAdditionalOption] Removed additional option at index ${e}`)}function Wt(r,c){const t=r.params||{},e=parseInt(String(t.oldIndex),10),o=parseInt(String(t.newIndex),10);if(isNaN(e)||isNaN(o)||e===o)return;const n=window.G7Core;if(!n?.state){b.warn("[reorderAdditionalOptions] G7Core.state API is not available");return}const a=n.state.getLocal()||{},s=[...a.form?.additional_options??[]];if(e<0||e>=s.length||o<0||o>=s.length)return;const[i]=s.splice(e,1);s.splice(o,0,i),s.forEach((l,d)=>{l.sort_order=d}),n.state.setLocal({form:{...a.form,additional_options:s},ui:{...a.ui,dragIndex:null},hasChanges:!0}),b.log(`[reorderAdditionalOptions] Moved item from ${e} to ${o}`)}const E=window.G7Core?.createLogger?.("Ecom:Image")??{log:(...r)=>console.log("[Ecom:Image]",...r),warn:(...r)=>console.warn("[Ecom:Image]",...r),error:(...r)=>console.error("[Ecom:Image]",...r)},Yt=["image/jpeg","image/png","image/gif","image/webp"],Xt=10*1024*1024,Zt=20;async function eo(r,c){const e=(r.params||{}).files;if(!e||e.length===0){E.warn("[uploadImages] No files provided");return}const o=window.G7Core;if(!o?.state||!o?.api){E.warn("[uploadImages] G7Core.state or G7Core.api is not available");return}const a=(o.state.getLocal()||{}).form?.images??[],s=Zt-a.length;e.length>s&&o.toast?.warning?.(o.t?.("sirsoft-ecommerce.admin.product.images.messages.max_count",{max:s})??`You can add up to ${s} images.`);const i=Array.from(e).slice(0,s);for(const l of i){if(!Yt.includes(l.type)){o.toast?.error?.(o.t?.("sirsoft-ecommerce.admin.product.images.messages.unsupported_format",{name:l.name})??`${l.name}: Unsupported format.`);continue}if(l.size>Xt){o.toast?.error?.(o.t?.("sirsoft-ecommerce.admin.product.images.messages.size_exceeded",{name:l.name})??`${l.name}: Exceeds 10MB.`);continue}const d=o.state.getLocal()||{};o.state.setLocal({ui:{...d.ui,uploadProgress:{...d.ui?.uploadProgress||{},[l.name]:0}}});try{const u=new FormData;u.append("file",l),u.append("collection","products");const m=await o.api.upload("/api/admin/media/upload",u,{onProgress:v=>{const C=o.state.getLocal()||{};o.state.setLocal({ui:{...C.ui,uploadProgress:{...C.ui?.uploadProgress||{},[l.name]:v}}})}}),p=o.state.getLocal()||{},g=p.form?.images??[],w={...m.data,is_thumbnail:g.length===0,sort_order:g.length};o.state.setLocal({form:{...p.form,images:[...g,w]},hasChanges:!0});const _=o.state.getLocal()||{},{[l.name]:y,...f}=_.ui?.uploadProgress||{};o.state.setLocal({ui:{..._.ui,uploadProgress:f}}),E.log(`[uploadImages] Uploaded ${l.name}`)}catch(u){o.toast?.error?.(o.t?.("sirsoft-ecommerce.admin.product.images.messages.upload_failed",{name:l.name})??`${l.name}: Upload failed`);const m=o.state.getLocal()||{},{[l.name]:p,...g}=m.ui?.uploadProgress||{};o.state.setLocal({ui:{...m.ui,uploadProgress:g}}),E.error(`[uploadImages] Failed to upload ${l.name}:`,u)}}}function to(r,c){const e=(r.params||{}).index;if(e===void 0){E.warn("[setThumbnail] Missing index param");return}const o=window.G7Core;if(!o?.state){E.warn("[setThumbnail] G7Core.state API is not available");return}const n=o.state.getLocal()||{},a=(n.form?.images??[]).map((s,i)=>({...s,is_thumbnail:i===e}));o.state.setLocal({form:{...n.form,images:a},hasChanges:!0}),E.log(`[setThumbnail] Set thumbnail to image at index ${e}`)}function oo(r,c){const e=(r.params||{}).index;if(e===void 0){E.warn("[confirmDeleteImage] Missing index param");return}const o=window.G7Core;if(!o?.state){E.warn("[confirmDeleteImage] G7Core.state API is not available");return}const n=o.state.getLocal()||{};o.state.setLocal({ui:{...n.ui,showImageDeleteModal:!0,imageToDeleteIndex:e}})}function ro(r,c){const t=window.G7Core;if(!t?.state){E.warn("[deleteImage] G7Core.state API is not available");return}const e=t.state.getLocal()||{},o=e.ui?.imageToDeleteIndex;if(o==null){E.warn("[deleteImage] No image index to delete");return}const n=[...e.form?.images??[]],a=n[o];n.splice(o,1),n.forEach((s,i)=>{s.sort_order=i}),a?.is_thumbnail&&n.length>0&&(n[0].is_thumbnail=!0),t.state.setLocal({form:{...e.form,images:n},ui:{...e.ui,showImageDeleteModal:!1,imageToDeleteIndex:null},hasChanges:!0}),E.log(`[deleteImage] Deleted image at index ${o}`)}function no(r,c){const t=r.params||{},e=t.oldIndex,o=t.newIndex;if(e===void 0||o===void 0){E.warn("[reorderImages] Missing oldIndex or newIndex param");return}const n=window.G7Core;if(!n?.state){E.warn("[reorderImages] G7Core.state API is not available");return}const a=n.state.getLocal()||{},s=[...a.form?.images??[]],[i]=s.splice(e,1);s.splice(o,0,i),s.forEach((l,d)=>{l.sort_order=d}),n.state.setLocal({form:{...a.form,images:s},hasChanges:!0}),E.log(`[reorderImages] Moved image from ${e} to ${o}`)}const Te=window.G7Core?.createLogger?.("Ecom:Description")??{log:(...r)=>console.log("[Ecom:Description]",...r),warn:(...r)=>console.warn("[Ecom:Description]",...r),error:(...r)=>console.error("[Ecom:Description]",...r)};function ao(r,c){const t=r.params||{},e=t.locale,o=t.value;if(!e){Te.warn("[updateDescription] Missing locale param");return}const n=window.G7Core;if(!n?.state){Te.warn("[updateDescription] G7Core.state API is not available");return}const a=n.state.getLocal()||{};n.state.setLocal({form:{...a.form,description:{...a.form?.description,[e]:o}},hasChanges:!0})}const P=window.G7Core?.createLogger?.("Ecom:Notice")??{log:(...r)=>console.log("[Ecom:Notice]",...r),warn:(...r)=>console.warn("[Ecom:Notice]",...r),error:(...r)=>console.error("[Ecom:Notice]",...r)};function fe(r=""){const t=window.G7Core?.locale?.supported?.()??["ko","en"],e={};for(const o of t)e[o]=r;return e}function so(r,c){const e=(r.params||{}).templateId,o=window.G7Core;if(!o?.state){P.warn("[confirmSelectNoticeTemplate] G7Core.state API is not available");return}const a=(o.state.getLocal()||{}).form?.notice_items??[],s=a.length>0&&a.some(i=>Object.values(i.content||{}).some(d=>d&&d.trim()!==""));if(!e||!s){Re(r);return}o.state.setGlobal({pendingNoticeTemplateId:e}),o.modal?.open?.("notice_template_confirm_modal"),P.log(`[confirmSelectNoticeTemplate] Showing confirm modal for template: ${e}`)}function Re(r,c){const e=(r.params||{}).templateId,o=window.G7Core;if(!o?.state){P.warn("[selectNoticeTemplate] G7Core.state API is not available");return}const n=o.state.getLocal()||{},a=o.dataSource?.get?.("notice_templates"),s=a?.data?.data??a?.data??[];if(!e){o.state.setLocal({form:{...n.form,notice_items:[]},ui:{...n.ui,selectedNoticeTemplateId:null},hasChanges:!0});return}const i=s.find(u=>u.id===e);if(!i){P.warn(`[selectNoticeTemplate] Template not found: ${e}`);return}const l=n.form?.notice_items??[],d=(i.fields??[]).map((u,m)=>{const p=JSON.stringify(u.name),g=l.find(w=>JSON.stringify(w.name)===p);return{key:`field_${m}`,name:u.name,content:g?.content??u.content??fe(),sort_order:m,is_custom:!1}});o.state.setLocal({form:{...n.form,notice_items:d},ui:{...n.ui,selectedNoticeTemplateId:e},hasChanges:!0}),P.log(`[selectNoticeTemplate] Selected template: ${e}`)}function io(r,c){const t=r.params||{},e=t.index,o=t.locale,n=t.value;if(e===void 0||!o){P.warn("[updateNoticeItem] Missing required params");return}const a=window.G7Core;if(!a?.state){P.warn("[updateNoticeItem] G7Core.state API is not available");return}const s=a.state.getLocal()||{},i=[...s.form?.notice_items??[]];i[e]={...i[e],content:{...i[e].content,[o]:n}},a.state.setLocal({form:{...s.form,notice_items:i},hasChanges:!0})}function co(r,c){const e=(r.params||{}).index;if(e===void 0){P.warn("[removeNoticeItem] Missing index param");return}const o=window.G7Core;if(!o?.state){P.warn("[removeNoticeItem] G7Core.state API is not available");return}const n=o.state.getLocal()||{},a=[...n.form?.notice_items??[]];a.splice(e,1),a.forEach((s,i)=>{s.sort_order=i}),o.state.setLocal({form:{...n.form,notice_items:a},hasChanges:!0}),P.log(`[removeNoticeItem] Removed notice item at index ${e}`)}function lo(r,c){const t=r.params||{},e=t.oldIndex,o=t.newIndex;if(e===void 0||o===void 0){P.warn("[reorderNoticeItems] Missing oldIndex or newIndex param");return}const n=window.G7Core;if(!n?.state){P.warn("[reorderNoticeItems] G7Core.state API is not available");return}const a=n.state.getLocal()||{},s=[...a.form?.notice_items??[]],[i]=s.splice(e,1);s.splice(o,0,i),s.forEach((l,d)=>{l.sort_order=d}),n.state.setLocal({form:{...a.form,notice_items:s},hasChanges:!0}),P.log(`[reorderNoticeItems] Moved item from ${e} to ${o}`)}function uo(r,c){const e=(r.params||{}).value,o=window.G7Core;if(!o?.state){P.warn("[fillNoticeWithValue] G7Core.state API is not available");return}const n=o.state.getLocal()||{},a=n.ui?.noticeLocale??"ko",s=(n.form?.notice_items??[]).map(i=>({...i,content:{...i.content,[a]:i.content?.[a]||e}}));o.state.setLocal({form:{...n.form,notice_items:s},hasChanges:!0}),o.toast?.success?.(o.t?.("sirsoft-ecommerce.admin.product.notice.messages.filled")??"Empty fields have been filled.")}function mo(r,c){const e=(r.params||{}).mode;if(!e){P.warn("[switchNoticeMode] Missing mode param");return}const o=window.G7Core;if(!o?.state){P.warn("[switchNoticeMode] G7Core.state API is not available");return}const n=o.state.getLocal()||{};o.state.setLocal({ui:{...n.ui,noticeMode:e}}),P.log(`[switchNoticeMode] Switched to ${e} mode`)}function po(r,c){const t=r.params||{},e=t.locale,o=t.value;if(!e){P.warn("[updateNewTemplateName] Missing locale param");return}const n=window.G7Core;if(!n?.state){P.warn("[updateNewTemplateName] G7Core.state API is not available");return}const a=n.state.getLocal()||{};n.state.setLocal({form:{...a.form,new_template_name:{...a.form?.new_template_name,[e]:o}}})}function go(r,c){const t=window.G7Core;if(!t?.state){P.warn("[addNoticeItem] G7Core.state API is not available");return}const e=t.state.getLocal()||{},o=e.form?.notice_items??[],n={key:`custom_${Date.now()}`,name:fe(),content:fe(),sort_order:o.length,is_custom:!0};t.state.setLocal({form:{...e.form,notice_items:[...o,n]},hasChanges:!0}),P.log(`[addNoticeItem] Added new notice item. Total: ${o.length+1}`)}function fo(r,c){const t=r.params||{},e=t.index,o=t.locale,n=t.value;if(e===void 0||!o){P.warn("[updateNoticeItemName] Missing required params");return}const a=window.G7Core;if(!a?.state){P.warn("[updateNoticeItemName] G7Core.state API is not available");return}const s=a.state.getLocal()||{},i=[...s.form?.notice_items??[]];i[e]={...i[e],name:{...i[e].name,[o]:n}},a.state.setLocal({form:{...s.form,notice_items:i},hasChanges:!0})}function _o(r,c){const t=window.G7Core;if(!t?.state){P.warn("[saveAsNoticeTemplate] G7Core.state API is not available");return}const e=t.state.getLocal()||{};if(!e.form?.new_template_name?.ko?.trim()){t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.product.notice.messages.template_name_required")??"Please enter template name.");return}if((e.form?.notice_items??[]).length===0){t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.product.notice.messages.no_items")??"No items to save.");return}t.state.setLocal({ui:{...e.ui,showSaveTemplateModal:!0}})}const _e={ko:"상세설명참조",en:"See detail description"};function wo(r,c){const t=window.G7Core;if(!t?.state){P.warn("[fillTemplateFieldsWithDetailReference] G7Core.state API is not available");return}const n=((r.params||{}).form||{}).fields??[];if(n.length===0){t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.product_notice_template.messages.no_fields_to_change")??"변경할 항목이 없습니다.");return}const a=t.locale?.supported?.()??["ko","en"],s={};for(const l of a)s[l]=_e[l]??_e.en??"See detail description";const i=n.map(l=>({...l,content:{...s}}));t.state.setLocal({"form.fields":i}),t.toast?.success?.(t.t?.("sirsoft-ecommerce.admin.product_notice_template.messages.all_fields_changed_to_detail_ref")??"모든 항목이 '상세설명참조'로 변경되었습니다."),P.log("[fillTemplateFieldsWithDetailReference] All fields updated to detail reference")}function yo(r,c){const t=window.G7Core;if(!t?.state){P.warn("[fillNoticeItemsWithDetailReference] G7Core.state API is not available");return}const n=((r.params||{}).form||{}).notice_items??[];if(n.length===0){t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.product.notice.messages.no_items_to_change")??"변경할 항목이 없습니다.");return}const a=t.locale?.supported?.()??["ko","en"],s={};for(const l of a)s[l]=_e[l]??_e.en??"See detail description";const i=n.map(l=>({...l,content:{...s}}));t.state.setLocal({"form.notice_items":i}),t.toast?.success?.(t.t?.("sirsoft-ecommerce.admin.product.notice.messages.all_items_changed_to_detail_ref")??"모든 항목이 '상세설명참조'로 변경되었습니다."),P.log("[fillNoticeItemsWithDetailReference] All notice items updated to detail reference")}async function ho(r,c){const t=window.G7Core;if(!t?.state||!t?.api){P.warn("[confirmSaveNoticeTemplate] G7Core.state or G7Core.api is not available");return}const e=t.state.getLocal()||{};try{const o=e.form?.notice_items??[],n=await t.api.post("/api/modules/sirsoft-ecommerce/admin/products/notice-templates",{name:e.form?.new_template_name,items:o.map(a=>({key:a.key,name:a.name}))});t.state.setLocal({form:{...e.form,new_template_name:fe()},ui:{...e.ui,showSaveTemplateModal:!1,noticeMode:"existing"},hasChanges:!0}),t.toast?.success?.(t.t?.("sirsoft-ecommerce.admin.product.notice.messages.template_saved")??"Template has been saved."),t.datasources?.refresh?.("notice_templates"),P.log(`[confirmSaveNoticeTemplate] Template saved: ${n.data.id}`)}catch(o){t.toast?.error?.(t.t?.("sirsoft-ecommerce.admin.product.notice.messages.template_save_error")??"Failed to save template."),P.error("[confirmSaveNoticeTemplate] Failed to save template:",o)}}const x=window.G7Core?.createLogger?.("Ecom:Misc")??{log:(...r)=>console.log("[Ecom:Misc]",...r),warn:(...r)=>console.warn("[Ecom:Misc]",...r),error:(...r)=>console.error("[Ecom:Misc]",...r)};function Co(r,c){const e=(r.params||{}).labelId;if(!e){x.warn("[toggleLabel] Missing labelId param");return}const o=window.G7Core;if(!o?.state){x.warn("[toggleLabel] G7Core.state API is not available");return}const n=o.state.getLocal()||{},a=n.form?.labels??[],s=a.includes(e)?a.filter(i=>i!==e):[...a,e];o.state.setLocal({form:{...n.form,labels:s},hasChanges:!0}),x.log(`[toggleLabel] Toggled label ${e}. Current labels: ${s.length}`)}async function bo(r,c){const t=window.G7Core;if(!t?.state||!t?.api){x.warn("[generateProductCode] G7Core.state or G7Core.api is not available");return}try{const e=await t.api.post("/api/modules/sirsoft-ecommerce/admin/products/generate-code"),o=t.state.getLocal()||{};t.state.setLocal({form:{...o.form,product_code:e.data.product_code}}),x.log(`[generateProductCode] Generated: ${e.data.product_code}`)}catch(e){t.toast?.error?.(t.t?.("sirsoft-ecommerce.admin.product.messages.code_generate_error")??"Failed to generate product code."),x.error("[generateProductCode] Failed:",e)}}function Io(r,c){const t=r.params||{},e=t.policyId,o=t.field,n=t.policies;if(!e||!o||!n)return"-";const a=n.find(s=>s.id===e);return a?a[o]??"-":"-"}function So(r,c){const t=r.params||{},e=t.templateId,o=t.templates;if(!e||!o)return"";const a=window.G7Core?.locale?.current?.()||"ko",s=o.find(i=>i.id===e);return s?.content?.[a]??s?.content?.ko??""}function vo(r,c){const t=r.params||{},e=t.platform,o=t.field,n=t.value;if(!e||!o){x.warn("[updateShoppingIntegration] Missing required params");return}const a=window.G7Core;if(!a?.state){x.warn("[updateShoppingIntegration] G7Core.state API is not available");return}const s=a.state.getLocal()||{},i=s.form?.shopping_integrations??{naver:{enabled:!1,sync_interval:"manual"},daum:{enabled:!1,sync_interval:"manual"},facebook:{enabled:!1,sync_interval:"manual"},google:{enabled:!1,sync_interval:"manual"}};a.state.setLocal({form:{...s.form,shopping_integrations:{...i,[e]:{...i[e],[o]:n}}},hasChanges:!0}),x.log(`[updateShoppingIntegration] Updated ${e}.${o} to ${n}`)}function xo(r,c){const e=(r.params||{}).type;if(!e){x.warn("[updateShippingType] Missing type param");return}const o=window.G7Core;if(!o?.state){x.warn("[updateShippingType] G7Core.state API is not available");return}const n=o.state.getLocal()||{};let a=0,s=0;e==="fixed_paid"?a=3e3:e==="threshold_free"&&(s=3e4),o.state.setLocal({form:{...n.form,shipping_type:e,shipping_fee:e==="fixed_free"?0:n.form?.shipping_fee??a,free_shipping_threshold:e==="threshold_free"?n.form?.free_shipping_threshold??s:0},hasChanges:!0}),x.log(`[updateShippingType] Updated shipping type to ${e}`)}function Lo(r,c){const t=r.params||{},e=t.field,o=t.value;if(!e){x.warn("[updateIdentificationCode] Missing field param");return}const n=window.G7Core;if(!n?.state){x.warn("[updateIdentificationCode] G7Core.state API is not available");return}const a=n.state.getLocal()||{};n.state.setLocal({form:{...a.form,[e]:o},hasChanges:!0})}function Po(r,c){const t=r.params||{},e=t.labelId,o=t.labelName;if(!e){x.warn("[openLabelPeriodModal] Missing labelId param");return}const n=window.G7Core;if(!n?.state){x.warn("[openLabelPeriodModal] G7Core.state API is not available");return}const a=n.state.getLocal()||{},i=(a.form?.labels??[]).find(l=>l.id===e);n.state.setLocal({ui:{...a.ui,showLabelPeriodModal:!0,labelPeriodModalData:{labelId:e,labelName:o,startDate:i?.start_date??null,endDate:i?.end_date??null}}})}function ko(r,c){const t=r.params||{},e=t.labelId,o=t.startDate,n=t.endDate;if(!e){x.warn("[saveLabelPeriod] Missing labelId param");return}const a=window.G7Core;if(!a?.state){x.warn("[saveLabelPeriod] G7Core.state API is not available");return}const s=a.state.getLocal()||{},i=[...s.form?.labels??[]],l=i.findIndex(d=>d.id===e);l>=0?i[l]={...i[l],start_date:o,end_date:n}:i.push({id:e,start_date:o,end_date:n}),a.state.setLocal({form:{...s.form,labels:i},ui:{...s.ui,showLabelPeriodModal:!1,labelPeriodModalData:null},hasChanges:!0}),a.toast?.success?.(a.t?.("sirsoft-ecommerce.admin.product.messages.label_period_saved")??"Label period has been saved."),x.log(`[saveLabelPeriod] Saved period for label ${e}`)}function Go(r,c){const e=(r.params||{}).labelId;if(!e){x.warn("[removeLabelPeriod] Missing labelId param");return}const o=window.G7Core;if(!o?.state){x.warn("[removeLabelPeriod] G7Core.state API is not available");return}const n=o.state.getLocal()||{},a=[...n.form?.labels??[]],s=a.findIndex(i=>i.id===e);s>=0&&(a[s]={...a[s],start_date:null,end_date:null}),o.state.setLocal({form:{...n.form,labels:a},hasChanges:!0}),o.toast?.success?.(o.t?.("sirsoft-ecommerce.admin.product.messages.label_period_removed")??"Label period has been removed."),x.log(`[removeLabelPeriod] Removed period for label ${e}`)}function Oo(r,c){const e=(r.params||{}).sort;if(!e){x.warn("[updateActivityLogSort] Missing sort param");return}const o=window.G7Core;if(!o?.state){x.warn("[updateActivityLogSort] G7Core.state API is not available");return}const n=o.state.getLocal()||{};o.state.setLocal({ui:{...n.ui,activityLogSort:e}}),o.datasources?.refresh?.("activity_logs",{params:{sort:e==="latest"?"desc":"asc",per_page:n.ui?.activityLogPerPage??10}}),x.log(`[updateActivityLogSort] Updated sort to ${e}`)}function Ao(r,c){const e=(r.params||{}).perPage;if(!e){x.warn("[updateActivityLogPerPage] Missing perPage param");return}const o=window.G7Core;if(!o?.state){x.warn("[updateActivityLogPerPage] G7Core.state API is not available");return}const n=o.state.getLocal()||{};o.state.setLocal({ui:{...n.ui,activityLogPerPage:e}}),o.datasources?.refresh?.("activity_logs",{params:{sort:n.ui?.activityLogSort==="oldest"?"asc":"desc",per_page:e}}),x.log(`[updateActivityLogPerPage] Updated perPage to ${e}`)}function Fo(r,c){const t=window.G7Core;if(!t?.state){x.warn("[setDefaultShippingPolicy] G7Core.state API is not available");return}const e=t.state.getLocal()||{};if(e.form?.shipping_policy_id){x.log("[setDefaultShippingPolicy] Shipping policy already set, skipping");return}if(e.ui?.useDefaultShippingPolicy===!1){x.log("[setDefaultShippingPolicy] useDefaultShippingPolicy is OFF, skipping");return}const o=t.dataSource?.get?.("shipping_policies"),n=o?.data?.data??o?.data??[];if(n.length===0){x.log("[setDefaultShippingPolicy] No shipping policies found");return}const a=n.find(s=>s.is_default===!0);a?(t.state.setLocal({form:{...e.form,shipping_policy_id:a.id}}),x.log(`[setDefaultShippingPolicy] Set default shipping policy: ${a.id} (${a.name})`)):x.log("[setDefaultShippingPolicy] No default shipping policy found")}function Do(r,c){const t=window.G7Core;if(!t?.state){x.warn("[toggleDefaultShippingPolicy] G7Core.state API is not available");return}const e=r.params?.checked??!1,o=t.state.getLocal()||{},n={...o.ui,useDefaultShippingPolicy:e};if(e){const a=t.dataSource?.get?.("shipping_policies"),i=(a?.data?.data??a?.data??[]).find(l=>l.is_default===!0);t.state.setLocal({ui:n,form:{...o.form,shipping_policy_id:i?.id??null}}),i?x.log(`[toggleDefaultShippingPolicy] ON - Selected default policy: ${i.id}`):x.log("[toggleDefaultShippingPolicy] ON - No default policy found")}else t.state.setLocal({ui:n}),x.log("[toggleDefaultShippingPolicy] OFF - Keeping current shipping policy")}function Eo(r,c){const t=window.G7Core;if(!t?.state){x.warn("[setLabelDatePreset] G7Core.state API is not available");return}const e=r.params?.preset;if(!e){x.warn("[setLabelDatePreset] Missing preset param");return}const o=new Date,n=i=>{const l=i.getFullYear(),d=String(i.getMonth()+1).padStart(2,"0"),u=String(i.getDate()).padStart(2,"0");return`${l}-${d}-${u}`},a=n(o);let s=null;switch(e){case"7d":{const i=new Date(o);i.setDate(i.getDate()+7),s=n(i);break}case"14d":{const i=new Date(o);i.setDate(i.getDate()+14),s=n(i);break}case"30d":{const i=new Date(o);i.setDate(i.getDate()+30),s=n(i);break}case"permanent":s=null;break;default:x.warn(`[setLabelDatePreset] Unknown preset: ${e}`);return}t.state.setGlobal({"labelFormData.start_date":a,"labelFormData.end_date":s}),x.log(`[setLabelDatePreset] Applied preset '${e}': ${a} ~ ${s??"permanent"}`)}const $o=(r,c)=>{const t=window.G7Core,o=(t?.state?.getLocal?.()||{}).form?.label_assignments??[],n=Number(r.params?.labelId);if(!n)return;const a=[...o],s=a.find(l=>l.label_id===n);if(s&&(s.started_at||s.ended_at)){t?.state?.setGlobal?.({labelToUncheckId:n}),t?.modal?.open?.("modal_label_uncheck_confirm");return}let i;s?i=a.filter(l=>l.label_id!==n):i=[...a,{label_id:n,started_at:null,ended_at:null}],t?.state?.setLocal?.({"form.label_assignments":i,"ui.lastClickedLabelId":n,hasChanges:!0})},No=(r,c)=>{const t=window.G7Core,o=(t?.state?.getLocal?.()||{}).form?.label_assignments??[],n=Number(r.params?.labelId),a=r.params?.field,s=r.params?.value;if(!n||!a)return;const i=[...o],l=i.findIndex(d=>d.label_id===n);l<0||(i[l]={...i[l],[a]:s||null},t?.state?.setLocal?.({"form.label_assignments":i,hasChanges:!0}))},To=(r,c)=>{const t=window.G7Core,e=t?.state?.getLocal?.()||{},o=e.form?.label_assignments??[],n=e.ui?.lastClickedLabelId,a=r.params?.preset;if(!n||!a)return;const s=[...o],i=s.findIndex(p=>p.label_id===n);if(i<0)return;const l=new Date,d=p=>p.toISOString().split("T")[0],u=d(l);let m=null;switch(a){case"7d":m=d(new Date(l.getTime()+7*24*60*60*1e3));break;case"14d":m=d(new Date(l.getTime()+14*24*60*60*1e3));break;case"30d":m=d(new Date(l.getTime()+30*24*60*60*1e3));break;case"permanent":m=null;break}s[i]={...s[i],started_at:u,ended_at:m},t?.state?.setLocal?.({"form.label_assignments":s,hasChanges:!0})},Ro=(r,c)=>{const t=window.G7Core,o=(t?.state?.get()||{}).labelToUncheckId;if(!o)return;const i=[...(t?.state?.getParent?.()?._local||{}).form?.label_assignments??[]].filter(l=>l.label_id!==o);t?.state?.setParentLocal?.({"form.label_assignments":i,hasChanges:!0}),t?.state?.setGlobal?.({labelToUncheckId:null}),t?.modal?.close?.()},Mo=async(r,c)=>{const t=window.G7Core,e=t?.state?.get()||{},n=(t?.state?.getLocal?.()||{}).form?.label_assignments??[],a=e.labelToDeleteId;if(a){t?.state?.setGlobal?.({isDeletingLabel:!0});try{const s=await t.api.delete(`/api/modules/sirsoft-ecommerce/admin/product-labels/${a}`);if(!s?.success)throw new Error(s?.message||"Failed to delete label");const l=[...n].filter(d=>d.label_id!==a);t?.state?.setLocal?.({"form.label_assignments":l,"ui.lastClickedLabelId":null}),await t?.dataSource?.refetch?.("product_labels"),t?.toast?.success?.(t.t?.("sirsoft-ecommerce.admin.product.labels.delete_success")??"Label deleted."),t?.modal?.close?.()}catch(s){t?.toast?.error?.(s?.response?.data?.message||s?.message||t.t?.("sirsoft-ecommerce.admin.product.labels.delete_error")||"Failed to delete label.")}finally{t?.state?.setGlobal?.({isDeletingLabel:!1,labelToDeleteId:null})}}},Ho=async(r,c)=>{const t=window.G7Core,e=t?.state?.get()||{},n=(t?.state?.getLocal?.()||{}).form?.label_assignments??[],a=e.editingLabelId,s=e.labelFormData;if(!(!a||!s?.name?.ko)){t?.state?.setGlobal?.({isSavingLabel:!0});try{const i=await t.api.put(`/api/modules/sirsoft-ecommerce/admin/product-labels/${a}`,{name:s.name,color:s.color});if(!i?.success)throw new Error(i?.message||"Failed to update label");const d=[...n].map(u=>u.label_id===a?{...u,started_at:s.started_at||null,ended_at:s.ended_at||null}:u);t?.state?.setLocal?.({"form.label_assignments":d,hasChanges:!0}),await t?.dataSource?.refetch?.("product_labels"),t?.toast?.success?.(t.t?.("sirsoft-ecommerce.admin.product.labels.save_success")??"Label saved."),t?.modal?.close?.()}catch(i){t?.toast?.error?.(i?.response?.data?.message||i?.message||t.t?.("sirsoft-ecommerce.admin.product.labels.save_error")||"Failed to save label.")}finally{t?.state?.setGlobal?.({isSavingLabel:!1})}}},W=window.G7Core?.createLogger?.("Ecom:DescriptionLocale")??{log:(...r)=>console.log("[Ecom:DescriptionLocale]",...r),warn:(...r)=>console.warn("[Ecom:DescriptionLocale]",...r),error:(...r)=>console.error("[Ecom:DescriptionLocale]",...r)};function Me(){return window.G7Core?.config?.("app.supported_locales")??["ko","en"]}function qo(r,c){const e=(r.params||{}).locale;if(!e){W.warn("[removeDescriptionLocale] Missing locale param");return}const o=window.G7Core;if(!o?.state){W.warn("[removeDescriptionLocale] G7Core.state API is not available");return}if(e==="ko"){o.toast?.error?.(o.t?.("sirsoft-ecommerce.admin.product.description_editor.messages.default_locale_cannot_delete")??"Default language cannot be deleted.");return}const n=o.state.getLocal()||{},a=Me(),s={...n.form?.description};delete s[e];const i={...n.form?.description_mobile};delete i[e];const l=(n.ui?.descriptionActiveLocales??a).filter(d=>d!==e);o.state.setLocal({form:{...n.form,description:s,description_mobile:i},ui:{...n.ui,descriptionActiveLocales:l,descriptionLocale:l[0]??"ko"},hasChanges:!0}),o.toast?.success?.(o.t?.("sirsoft-ecommerce.admin.product.description_editor.messages.locale_removed",{locale:e.toUpperCase()})??`${e.toUpperCase()} language has been removed.`),W.log(`[removeDescriptionLocale] Removed locale: ${e}`)}function Uo(r,c){const t=window.G7Core;if(!t?.state){W.warn("[showAddLocaleModal] G7Core.state API is not available");return}const e=t.state.getLocal()||{};t.state.setLocal({ui:{...e.ui,showAddLocaleModal:!0}})}function jo(r,c){const e=(r.params||{}).locale;if(!e){W.warn("[addDescriptionLocale] Missing locale param");return}const o=window.G7Core;if(!o?.state){W.warn("[addDescriptionLocale] G7Core.state API is not available");return}const n=o.state.getLocal()||{},a=Me(),s=n.ui?.descriptionActiveLocales??["ko"];if(s.includes(e)){o.toast?.warning?.(o.t?.("sirsoft-ecommerce.admin.product.description_editor.messages.locale_already_added")??"This language is already added.");return}if(!a.includes(e)){o.toast?.error?.(o.t?.("sirsoft-ecommerce.admin.product.description_editor.messages.locale_unsupported")??"Unsupported language.");return}o.state.setLocal({form:{...n.form,description:{...n.form?.description,[e]:""},description_mobile:{...n.form?.description_mobile,[e]:""}},ui:{...n.ui,descriptionActiveLocales:[...s,e],descriptionLocale:e,showAddLocaleModal:!1},hasChanges:!0}),o.toast?.success?.(o.t?.("sirsoft-ecommerce.admin.product.description_editor.messages.locale_added",{locale:e.toUpperCase()})??`${e.toUpperCase()} language has been added.`),W.log(`[addDescriptionLocale] Added locale: ${e}`)}const Y=window.G7Core?.createLogger?.("Ecom:BulkUpdate")??{log:(...r)=>console.log("[Ecom:BulkUpdate]",...r),warn:(...r)=>console.warn("[Ecom:BulkUpdate]",...r),error:(...r)=>console.error("[Ecom:BulkUpdate]",...r)};function X(r){return typeof r=="string"?r:r&&typeof r=="object"?r.ko||r.en||JSON.stringify(r):String(r??"")}function He(){const r=window.G7Core;return r||(Y.error("[bulkUpdate] G7Core is not available"),null)}function Vo(r,c){const t=He();if(!t)return;const e=t.state.getLocal()||{},o=t.state.get()||{},n=o.bulkSelectedItems||e.selectedItems||[],a=o.bulkSelectedOptionIds||e.selectedOptionIds||[];Y.log("[bulkUpdate] globalState.bulkSelectedItems:",o.bulkSelectedItems),Y.log("[bulkUpdate] localState.selectedItems:",e.selectedItems),Y.log("[bulkUpdate] Final selectedItems:",n),n.length>0?Bo(t,o,e,n):a.length>0?Ko(t,o,e,a):t.toast.warning(t.t("sirsoft-ecommerce.admin.product.bulk.no_selection"))}function Bo(r,c,t,e){const n=r.dataSource.get("products")?.data?.data||[],a={};c.bulkSalesStatus&&(a.sales_status=c.bulkSalesStatus),c.bulkDisplayStatus&&(a.display_status=c.bulkDisplayStatus);const s={};if(c.bulkPriceMethod&&c.bulkPriceValue!==void 0&&c.bulkPriceValue!==null&&c.bulkPriceValue!==""){const f={fixed:"set",increase:"add",decrease:"subtract"};c.bulkPriceUnit==="percent"?s.price_adjustment={method:"percent",value:c.bulkPriceMethod==="decrease"?-(Number(c.bulkPriceValue)||0):Number(c.bulkPriceValue)||0}:s.price_adjustment={method:f[c.bulkPriceMethod]||"add",value:Number(c.bulkPriceValue)||0}}if(c.bulkStockMethod&&c.bulkStockValue!==void 0&&c.bulkStockValue!==null&&c.bulkStockValue!==""){const f={set:"set",increase:"add",decrease:"subtract"};s.stock_quantity={method:f[c.bulkStockMethod]||"add",value:Number(c.bulkStockValue)||0}}const i=t.modifiedProductIds||[],l=t.modifiedOptionIds||[],d=t.modifiedProductFields||{},u=t.modifiedOptionFields||{},m=c.bulkSelectedOptionIds||t.selectedOptionIds||[],p=new Set(e),g=[],w=[];function _(f,v,C){if(v._modified||l.includes(C)){const h={product_id:f.id,option_id:v.id},k=u[C]||[];!s.price_adjustment&&k.includes("price_adjustment")&&(h.price_adjustment=v.price_adjustment),!s.price_adjustment&&k.includes("selling_price")&&(h.price_adjustment=v.price_adjustment),!s.stock_quantity&&k.includes("stock_quantity")&&(h.stock_quantity=v.stock_quantity),k.includes("option_name")&&(h.option_name=v.option_name),k.includes("sku")&&(h.sku=v.sku),k.includes("list_price")&&(h.list_price=v.list_price),k.includes("safe_stock_quantity")&&(h.safe_stock_quantity=v.safe_stock_quantity),k.includes("is_default")&&(h.is_default=v.is_default),k.includes("is_active")&&(h.is_active=v.is_active),Object.keys(h).length>2&&w.push(h)}}n.filter(f=>e.includes(f.id)).forEach(f=>{if(f._modified||i.includes(f.id)){const C={id:f.id},S=String(f.id),h=d[S]||[];!a.sales_status&&h.includes("sales_status")&&(C.sales_status=f.sales_status),!a.display_status&&h.includes("display_status")&&(C.display_status=f.display_status),h.includes("name")&&(C.name=f.name),h.includes("list_price")&&(C.list_price=f.list_price),h.includes("selling_price")&&(C.selling_price=f.selling_price),Object.keys(C).length>1&&g.push(C)}(f.options||[]).forEach(C=>{const S=`${f.id}-${C.id}`;_(f,C,S)})}),m.length>0&&n.forEach(f=>{p.has(f.id)||(f.options||[]).forEach(v=>{const C=`${f.id}-${v.id}`;m.includes(C)&&_(f,v,C)})});const y={ids:e};Object.keys(a).length>0&&(y.bulk_changes=a),g.length>0&&(y.items=g),Object.keys(s).length>0&&(y.option_bulk_changes=s),w.length>0&&(y.option_items=w),r.state.set({isProcessing:!0}),r.api.patch("/api/modules/sirsoft-ecommerce/admin/products/bulk-update",y).then(f=>{r.toast.success(r.t("sirsoft-ecommerce.admin.product.bulk.update_success",{products:f?.data?.products_updated||0,options:f?.data?.options_updated||0})),qe(r),r.dataSource.refetch("products"),r.modal.close()}).catch(f=>{Y.error("[bulkUpdateProducts] Error:",f),r.toast.error(r.t("sirsoft-ecommerce.admin.product.bulk.update_error"))}).finally(()=>{r.state.set({isProcessing:!1})})}function Ko(r,c,t,e){const n=r.dataSource.get("products")?.data?.data||[],a={};if(c.bulkPriceMethod&&c.bulkPriceValue!==void 0&&c.bulkPriceValue!==null&&c.bulkPriceValue!==""){const u={fixed:"set",increase:"add",decrease:"subtract"};c.bulkPriceUnit==="percent"?a.price_adjustment={method:"percent",value:c.bulkPriceMethod==="decrease"?-(Number(c.bulkPriceValue)||0):Number(c.bulkPriceValue)||0}:a.price_adjustment={method:u[c.bulkPriceMethod]||"add",value:Number(c.bulkPriceValue)||0}}if(c.bulkStockMethod&&c.bulkStockValue!==void 0&&c.bulkStockValue!==null&&c.bulkStockValue!==""){const u={set:"set",increase:"add",decrease:"subtract"};a.stock_quantity={method:u[c.bulkStockMethod]||"add",value:Number(c.bulkStockValue)||0}}const s=t.modifiedOptionFields||{},i=t.modifiedOptionIds||[],l=[];n.forEach(u=>{(u.options||[]).forEach(m=>{const p=`${u.id}-${m.id}`,g=m._modified||i.includes(p);if(e.includes(p)&&g){const w={product_id:u.id,option_id:m.id},_=s[p]||[];!a.price_adjustment&&_.includes("price_adjustment")&&(w.price_adjustment=m.price_adjustment),!a.price_adjustment&&_.includes("selling_price")&&(w.price_adjustment=m.price_adjustment),!a.stock_quantity&&_.includes("stock_quantity")&&(w.stock_quantity=m.stock_quantity),_.includes("option_name")&&(w.option_name=m.option_name),_.includes("sku")&&(w.sku=m.sku),_.includes("list_price")&&(w.list_price=m.list_price),_.includes("safe_stock_quantity")&&(w.safe_stock_quantity=m.safe_stock_quantity),_.includes("is_default")&&(w.is_default=m.is_default),_.includes("is_active")&&(w.is_active=m.is_active),Object.keys(w).length>2&&l.push(w)}})});const d={ids:e};Object.keys(a).length>0&&(d.bulk_changes=a),l.length>0&&(d.items=l),r.state.set({isProcessing:!0}),r.api.patch("/api/modules/sirsoft-ecommerce/admin/options/bulk-update",d).then(u=>{r.toast.success(r.t("sirsoft-ecommerce.admin.product.bulk.option_update_success",{count:u?.data?.options_updated||0})),qe(r),r.dataSource.refetch("products"),r.modal.close()}).catch(u=>{Y.error("[bulkUpdateOptions] Error:",u),r.toast.error(r.t("sirsoft-ecommerce.admin.product.bulk.option_update_error"))}).finally(()=>{r.state.set({isProcessing:!1})})}function qe(r){r.state.setLocal({modifiedProductIds:[],modifiedOptionIds:[],modifiedProductFields:{},modifiedOptionFields:{},selectedItems:[],selectedOptionIds:[]}),r.state.set({bulkSalesStatus:null,bulkDisplayStatus:null,bulkPriceCondition:null,bulkStockCondition:null,bulkConfirmData:null})}function Qo(r,c){const t=He();if(!t)return;const e=t.state.getLocal()||{},o=t.state.get()||{},a=t.dataSource.get("products")?.data?.data||[],s=e.selectedItems||[],i=e.selectedOptionIds||[],l={products:[],options:[],summary:{productCount:0,optionCount:0,hasBulkChanges:!1,hasInlineChanges:!1}},d=!!(o.bulkSalesStatus||o.bulkDisplayStatus||o.bulkPriceCondition||o.bulkStockCondition);l.summary.hasBulkChanges=d;const u=e.modifiedProductIds||[],m=e.modifiedOptionIds||[],p=e.modifiedProductFields||{},g=e.modifiedOptionFields||{},w=new Set(s);function _(y,f,v){const C=[],S=g[f]||[];if(o.bulkPriceCondition){const h=o.bulkPriceCondition;C.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_price_adjustment",{method:h.method,value:h.value})||`Price adjustment: ${h.method} ${h.value}`)}if(o.bulkStockCondition){const h=o.bulkStockCondition;C.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_stock",{method:h.method,value:h.value})||`Stock: ${h.method} ${h.value}`)}if(v){if(!o.bulkPriceCondition&&S.includes("price_adjustment")){const h=y.price_adjustment?.toLocaleString?.()??y.price_adjustment;C.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_price_adjustment_inline",{value:h})||`Price adjustment: ${h}`)}!o.bulkPriceCondition&&S.includes("selling_price")&&C.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_selling_price",{price:y.selling_price?.toLocaleString?.()??y.selling_price})||`Selling price: ${y.selling_price}`),!o.bulkStockCondition&&S.includes("stock_quantity")&&C.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_stock_inline",{value:y.stock_quantity})||`Stock: ${y.stock_quantity}`),S.includes("option_name")&&C.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_option_name",{name:X(y.option_name)})||`Option name: ${X(y.option_name)}`),S.includes("sku")&&C.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_sku",{sku:y.sku})||`SKU: ${y.sku}`),S.includes("list_price")&&C.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_list_price",{price:y.list_price?.toLocaleString?.()??y.list_price})||`List price: ${y.list_price}`),S.includes("safe_stock_quantity")&&C.push(`안전재고: ${y.safe_stock_quantity}`),S.includes("is_active")&&C.push(`사용: ${y.is_active?"ON":"OFF"}`),l.summary.hasInlineChanges=!0}return C}s.length>0&&a.filter(y=>s.includes(y.id)).forEach(y=>{const f=[],v=y._modified||u.includes(y.id),C=String(y.id),S=p[C]||[];o.bulkSalesStatus&&f.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_sales_status",{status:o.bulkSalesStatus})||`Sales status: ${o.bulkSalesStatus}`),o.bulkDisplayStatus&&f.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_display_status",{status:o.bulkDisplayStatus})||`Display status: ${o.bulkDisplayStatus}`),v&&(!o.bulkSalesStatus&&S.includes("sales_status")&&f.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_sales_status",{status:y.sales_status})||`Sales status: ${y.sales_status}`),!o.bulkDisplayStatus&&S.includes("display_status")&&f.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_display_status",{status:y.display_status})||`Display status: ${y.display_status}`),S.includes("name")&&f.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_name_changed")||"Name changed"),S.includes("list_price")&&f.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_list_price",{price:y.list_price?.toLocaleString?.()||y.list_price})||`List price: ${y.list_price?.toLocaleString?.()||y.list_price}`),S.includes("selling_price")&&f.push(t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_selling_price",{price:y.selling_price?.toLocaleString?.()||y.selling_price})||`Selling price: ${y.selling_price?.toLocaleString?.()||y.selling_price}`),l.summary.hasInlineChanges=!0),(f.length>0||d||v)&&l.products.push({id:y.id,name:X(y.name),changes:f.length>0?f.join(", "):v?t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_inline_modified")||"Inline modified":t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_bulk_applied")||"Bulk changes applied"}),(y.options||[]).forEach(h=>{const k=`${y.id}-${h.id}`,F=h._modified||m.includes(k),T=_(h,k,F);(T.length>0||d&&(o.bulkPriceCondition||o.bulkStockCondition)||F)&&l.options.push({productId:y.id,optionId:h.id,productName:X(y.name),optionName:h.option_name_localized||X(h.option_name)||h.name||"",changes:T.length>0?T.join(", "):F?t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_inline_modified")||"Inline modified":t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_bulk_applied")||"Bulk changes applied"})})}),i.length>0&&a.forEach(y=>{w.has(y.id)||(y.options||[]).forEach(f=>{const v=`${y.id}-${f.id}`;if(i.includes(v)){const C=f._modified||m.includes(v),S=_(f,v,C);l.options.push({productId:y.id,optionId:f.id,productName:X(y.name),optionName:f.option_name_localized||X(f.option_name)||f.name||"",changes:S.length>0?S.join(", "):C?t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_inline_modified")||"Inline modified":t.t("sirsoft-ecommerce.admin.product.messages.bulk_summary_selected")||"Selected"})}})}),l.summary.productCount=l.products.length,l.summary.optionCount=l.options.length,t.state.set({bulkConfirmData:l}),Y.log("[buildConfirmData] Built confirm data:",l)}const R=window.G7Core?.createLogger?.("Ecom:Order")??{log:(...r)=>console.log("[Ecom:Order]",...r),warn:(...r)=>console.warn("[Ecom:Order]",...r),error:(...r)=>console.error("[Ecom:Order]",...r)};function zo(r){const{currencies:c=[]}=r.params||{},t=[{field:"no",header:"NO",width:"60px",sortable:!1,required:!0},{field:"ordered_at",header:"$t:sirsoft-ecommerce.admin.order.column.order_date",width:"140px",sortable:!0,required:!0},{field:"order_number",header:"$t:sirsoft-ecommerce.admin.order.column.order_number",width:"140px",sortable:!0,required:!0},{field:"product",header:"$t:sirsoft-ecommerce.admin.order.column.product",width:"auto",sortable:!1,required:!0},{field:"order_amount",header:"$t:sirsoft-ecommerce.admin.order.column.order_amount",width:"120px",sortable:!0,required:!1},{field:"order_status",header:"$t:sirsoft-ecommerce.admin.order.column.order_status",width:"100px",sortable:!1,required:!1},{field:"orderer",header:"$t:sirsoft-ecommerce.admin.order.column.orderer",width:"120px",sortable:!1,required:!1},{field:"payment_method",header:"$t:sirsoft-ecommerce.admin.order.column.payment_method",width:"100px",sortable:!1,required:!1},{field:"delivery_method",header:"$t:sirsoft-ecommerce.admin.order.column.delivery_method",width:"100px",sortable:!1,required:!1},{field:"country",header:"$t:sirsoft-ecommerce.admin.order.column.country",width:"80px",sortable:!1,required:!1}],e=c.filter(o=>!o.is_default).map(o=>({field:`order_amount_${o.code.toLowerCase()}`,header:`${o.name} (${o.symbol})`,width:"100px",sortable:!0,required:!1}));return[...t,...e]}function Jo(r,c){const t=r.params||{},{target:e="_local",path:o,value:n}=t,a=window.G7Core;if(!a?.state)return R.warn("[toggleArrayValue] G7Core.state를 사용할 수 없습니다."),{success:!1,newValue:[]};const s=e==="_global"?a.state.getGlobal():a.state.getLocal(),i=o.split(".");let l=s;for(const u of i)l=l?.[u];Array.isArray(l)||(l=[]);let d;return l.includes(n)?d=l.filter(u=>u!==n):d=[...l,n],e==="_global"?a.state.setGlobal({[o]:d}):a.state.setLocal({[o]:d}),{success:!0,newValue:d}}function Wo(r,c){const t=r.params||{},{filterKey:e,checked:o}=t,n=window.G7Core;if(!n?.state)return R.warn("[toggleVisibleFilter] G7Core.state를 사용할 수 없습니다."),{success:!1,newValue:[]};const s=n.state.getLocal().visibleFilters||[];let i;o?i=s.includes(e)?s:[...s,e]:i=s.filter(l=>l!==e),n.state.setLocal({visibleFilters:i});try{localStorage.setItem("g7_order_filter_visible_filters",JSON.stringify(i))}catch(l){R.warn("[toggleVisibleFilter] LocalStorage 저장 실패:",l)}return{success:!0,newValue:i}}function Yo(r,c){const t=r.params||{},{selectedIds:e=[]}=t,o=window.G7Core;return o?.state?(o.state.setLocal({selectedItems:e,selectAll:!1}),{success:!0}):(R.warn("[syncOrderSelection] G7Core.state를 사용할 수 없습니다."),{success:!1})}function Xo(r,c){const t=r.params||{},{actionId:e,row:o}=t,n=window.G7Core;if(!e||!o?.order_number)return R.warn("[handleOrderRowAction] actionId 또는 row.order_number가 없습니다."),{success:!1};switch(e){case"view":n?.navigate?.(`/admin/ecommerce/orders/${o.order_number}`);break;case"edit":n?.navigate?.(`/admin/ecommerce/orders/${o.order_number}`);break;case"status":case"shipping":case"memo":case"delete":n?.state?.setGlobal({orderList:{currentActionOrderId:o.id,currentActionType:e}});break;case"print":window.open(`/admin/ecommerce/orders/${o.order_number}/shipping-label`,"_blank");break;default:return console.warn(`[handleOrderRowAction] 알 수 없는 액션: ${e}`),{success:!1}}return{success:!0,action:e,targetId:o.id}}async function Zo(r,c){const t=r.params||{},{actionType:e,orderIds:o,status:n,carrierId:a,trackingNumber:s}=t,i=window.G7Core;if(!o||o.length===0)throw new Error("선택된 주문이 없습니다.");let l="";const d={ids:o};switch(e){case"status":if(!n)throw new Error("변경할 상태를 선택해주세요.");l="/api/modules/sirsoft-ecommerce/admin/orders/bulk",d.order_status=n;break;case"shipping":if(!s&&!a)throw new Error("택배사 또는 운송장번호를 입력해주세요.");l="/api/modules/sirsoft-ecommerce/admin/orders/bulk",a&&(d.carrier_id=a),s&&(d.tracking_number=s);break;default:throw new Error(`알 수 없는 액션 타입: ${e}`)}const u=await i?.api?.call(l,{method:"PATCH",body:d});if(!u?.success)throw new Error(u?.message||"일괄 처리에 실패했습니다.");return{success:!0,successCount:u.data?.updated_count??o.length,failCount:u.data?.fail_count??0,errors:u.data?.errors??[]}}async function er(r,c){const t=r.params||{},{downloadType:e,orderIds:o,filters:n}=t,a=window.G7Core,s="/api/modules/sirsoft-ecommerce/admin/orders/export",i={};if(e==="selected"){if(!o||o.length===0)throw new Error("선택된 주문이 없습니다.");i.ids=o}else i.filters=n||{};const l=a?.auth?.getToken(),d=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",...l?{Authorization:`Bearer ${l}`}:{}},body:JSON.stringify(i)});if(!d.ok){const _=await d.json().catch(()=>null);throw new Error(_?.message||"엑셀 다운로드에 실패했습니다.")}const u=await d.blob(),m=window.URL.createObjectURL(u),p=document.createElement("a");p.href=m;const g=new Date,w=`${g.getFullYear()}-${String(g.getMonth()+1).padStart(2,"0")}-${String(g.getDate()).padStart(2,"0")}`;return p.download=`orders_${w}.xlsx`,document.body.appendChild(p),p.click(),document.body.removeChild(p),window.URL.revokeObjectURL(m),{success:!0}}function tr(r,c){const t=r.params||{},{columns:e=[]}=t;try{localStorage.setItem("g7_order_visible_columns",JSON.stringify(e))}catch(o){return R.warn("[saveVisibleColumns] LocalStorage 저장 실패:",o),{success:!1}}return{success:!0}}function or(r,c){const e=(r.params||{}).defaultColumns||["order_date","order_number","order_status","order_amount","product","orderer","payment_method","delivery_method","country"];try{const o=localStorage.getItem("g7_order_visible_columns");if(o){const n=JSON.parse(o);if(Array.isArray(n))return n}}catch(o){R.warn("[loadVisibleColumns] LocalStorage 로드 실패:",o)}return e}function rr(r,c){const t=r.params||{},{id:e,defaultFilters:o=[]}=t,n=window.G7Core;if(!e)return R.warn("[loadVisibleFilters] id 파라미터가 필요합니다."),o;let a;try{const i=n?.AuthManager?.getInstance();i&&(a=i.getUser()?.uuid)}catch{}const s=`g7_filters_${e}${a!==void 0?`_${a}`:""}`;try{const i=localStorage.getItem(s);if(i){const l=JSON.parse(i);if(Array.isArray(l)&&l.length>0)return R.log(`[loadVisibleFilters] localStorage에서 로드: ${s}`,l),l}}catch(i){R.warn("[loadVisibleFilters] LocalStorage 로드 실패:",i)}return R.log(`[loadVisibleFilters] 기본값 사용: ${s}`,o),o}function nr(r,c){const t=window.G7Core;if(!t)return;const e=t.state.get()||{},o=e.bulkSelectedItems||[],n=e.bulkOrderStatus||"",a=e.bulkCourier||"",s=e.bulkTrackingNumber||"";if(!n){t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.order.bulk.no_status_selected")||"변경할 주문상태를 선택해주세요.");return}if(["shipping_ready","shipping"].includes(n)&&(!a||!s)){t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.order.bulk.carrier_required")||"해당 상태로 변경하려면 택배사와 송장번호를 모두 입력해주세요.");return}t.state.set({bulkConfirmData:{selectedItems:o,orderStatus:n,courierId:a,trackingNumber:s}}),t.modal?.open?.("modal_bulk_confirm")}async function ar(r,c){const t=window.G7Core;if(!t)return;const o=(t.state.get()||{}).bulkConfirmData;if(!o||!o.selectedItems?.length){t.toast?.error?.(t.t?.("sirsoft-ecommerce.admin.order.bulk.error")||"일괄 처리에 실패했습니다.");return}const n={ids:o.selectedItems,order_status:o.orderStatus};o.courierId&&(n.carrier_id=o.courierId),o.trackingNumber&&(n.tracking_number=o.trackingNumber);try{await t.api.patch("/api/modules/sirsoft-ecommerce/admin/orders/bulk",n),t.toast?.success?.(t.t?.("sirsoft-ecommerce.admin.order.bulk.success")||"일괄 변경이 완료되었습니다."),t.state.setLocal({selectedItems:[],selectAll:!1,bulkOrderStatus:"",bulkCourier:"",bulkTrackingNumber:""}),t.state.set({bulkConfirmData:null}),t.dataSource?.refetch?.("orders"),t.modal?.close?.()}catch(a){R.error("[executeOrderBulkAction] Error:",a),t.toast?.error?.(a?.message||t.t?.("sirsoft-ecommerce.admin.order.bulk.error")||"일괄 처리에 실패했습니다.")}}const Se=window.G7Core?.createLogger?.("Ecom:ProductList")??{log:(...r)=>console.log("[Ecom:ProductList]",...r),warn:(...r)=>console.warn("[Ecom:ProductList]",...r),error:(...r)=>console.error("[Ecom:ProductList]",...r)};async function sr(r,c){const t=r.params||{},{actionId:e,row:o}=t,n=window.G7Core;if(!e||!o?.id)return Se.warn("[handleProductRowAction] actionId 또는 row.id가 없습니다."),{success:!1};switch(e){case"edit":n?.navigate?.(`/admin/ecommerce/products/${o.product_code}/edit`);break;case"copy":n?.state?.setLocal({productList:{copyTargetProduct:o},ui:{showCopyModal:!0}});break;case"delete":try{const s=(await n?.api?.get(`/api/modules/sirsoft-ecommerce/admin/products/${o.id}/can-delete`))?.data;n?.state?.setLocal({productList:{deleteTargetProduct:o,canDelete:s?.canDelete??!0,deleteBlockReason:s?.reason??null,relatedData:s?.relatedData??null},ui:{showDeleteModal:!0}})}catch(a){Se.error("[handleProductRowAction] 삭제 가능 여부 확인 실패:",a),n?.state?.setLocal({productList:{deleteTargetProduct:o,canDelete:!1,deleteBlockReason:"삭제 가능 여부를 확인할 수 없습니다.",relatedData:null},ui:{showDeleteModal:!0}})}break;default:return Se.warn(`[handleProductRowAction] 알 수 없는 액션: ${e}`),{success:!1}}return{success:!0,action:e,targetId:o.id}}const Q=window.G7Core?.createLogger?.("Ecom:OrderDetail")??{log:(...r)=>console.log("[Ecom:OrderDetail]",...r),warn:(...r)=>console.warn("[Ecom:OrderDetail]",...r),error:(...r)=>console.error("[Ecom:OrderDetail]",...r)};function ir(r,c){const t=window.G7Core;if(!t?.state){Q.warn("[initOrderDetailForm] G7Core.state를 사용할 수 없습니다.");return}t.state.getLocal();const o=c?.data?.data??t.dataSource?.get?.("order")?.data;if(!o){Q.warn("[initOrderDetailForm] order 데이터가 없습니다.");return}t.state.setLocal({form:{recipient_name:o.recipient_name||"",recipient_phone:o.recipient_phone||"",recipient_tel:o.recipient_tel||"",recipient_zipcode:o.recipient_zipcode||"",recipient_address:o.recipient_address||"",recipient_detail_address:o.recipient_detail_address||"",delivery_memo:o.delivery_memo||"",admin_memo:o.admin_memo||""}}),Q.log("[initOrderDetailForm] 폼 초기화 완료")}function cr(r,c){const t=window.G7Core,{optionId:e}=r.params||{};if(!t?.state||!e)return;const n=t.state.getLocal().selectedProducts||[];let a;n.includes(e)?a=n.filter(d=>d!==e):a=[...n,e];const i=(t.dataSource?.get?.("order")?.data?.options||[]).length,l=a.length===i&&i>0;t.state.setLocal({selectedProducts:a,selectAll:l})}function lr(r,c){const t=window.G7Core;if(!t?.state)return;const o=t.state.getLocal().selectAll,a=t.dataSource?.get?.("order")?.data?.options||[];if(o)t.state.setLocal({selectedProducts:[],selectAll:!1});else{const s=a.map(i=>i.id);t.state.setLocal({selectedProducts:s,selectAll:!0})}}function dr(r,c){const t=window.G7Core;if(!t)return;const e=r.params||{},o=e.selectedProducts||[],n=e.batchOrderStatus||"",a=e.batchCarrierId||"",s=e.batchTrackingNumber||"";if(!n){t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.order.bulk.no_status_selected")||"변경할 주문상태를 선택해주세요.");return}if(o.length===0){t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.order.bulk.no_items_selected")||"변경할 상품을 선택해주세요.");return}if(n==="cancelled"){const p=e.cancelPg??!0,g=t.dataSource?.get?.("order")?.data,w=g?.options||[],_=o.map(y=>{const f=w.find(v=>v.id===y);return!f||f.option_status==="cancelled"?null:{id:f.id,product_name:f.product_name,product_option_name:f.product_option_name,thumbnail_url:f.product_snapshot?.thumbnail_url||"",unit_price:f.unit_price,quantity:f.quantity,cancel_quantity:f.quantity,option_status:f.option_status,option_status_label:f.option_status_label||f.option_status}}).filter(Boolean);if(_.length===0){t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.order.bulk.no_cancellable_items")||"취소할 수 있는 상품이 없습니다. 이미 취소된 상품은 제외됩니다.");return}if(p){t.state.setLocal({cancelItems:_,cancelReason:"",cancelReasonDetail:"",cancelPg:!0,refundPriority:"pg_first",refundEstimate:null,refundLoading:!1,isCancelling:!1,cancelError:null,cancelValidationErrors:null}),t.modal?.open?.("modal_cancel_order");const y=g?.order_number||"";y&&t.dispatch?.({handler:"sirsoft-ecommerce.estimateRefundAmount",params:{orderId:y,cancelItems:_}})}else{const y={};for(const f of _)y[f.id]=f.quantity;t.state.setLocal({bulkConfirmItems:_,changeQuantities:y,batchOrderStatus:n}),t.modal?.open?.("modal_batch_change_confirm")}return}if(["shipping_ready","shipping","delivered"].includes(n)&&(!a||!s)){t.toast?.warning?.(t.t?.("sirsoft-ecommerce.admin.order.bulk.carrier_required")||"해당 상태로 변경하려면 택배사와 송장번호를 모두 입력해주세요.");return}const d=t.dataSource?.get?.("order")?.data?.options||[],u=[],m={};for(const p of o){const g=d.find(w=>w.id===p);g&&(u.push({id:g.id,product_name:g.product_name,product_option_name:g.product_option_name,sku:g.sku,thumbnail_url:g.product_snapshot?.thumbnail_url||"",unit_price:g.unit_price,original_price:g.product_snapshot?.original_price||g.unit_price,quantity:g.quantity,option_status:g.option_status}),m[g.id]=g.quantity)}t.state.setLocal({bulkConfirmItems:u,changeQuantities:m,batchOrderStatus:n,batchCarrierId:a,batchTrackingNumber:s}),t.modal?.open?.("modal_batch_change_confirm")}async function ur(r,c){const t=window.G7Core,{orderId:e}=r.params||{};if(!t?.state||!e){Q.warn("[processOrderDetailBulkChange] orderId가 없습니다.");return}const o=r.params?.selectedProducts,n=r.params?.batchOrderStatus,a=r.params?.batchCarrierId,s=r.params?.batchTrackingNumber,i=r.params?.changeQuantities;if(!o||o.length===0){Q.warn("[processOrderDetailBulkChange] 선택된 상품이 없습니다.");return}if(!n){Q.warn("[processOrderDetailBulkChange] 변경할 상태가 없습니다.");return}const d=t.dataSource?.get?.("order")?.data?.options||[],m={items:o.map(p=>{const g=d.find(w=>w.id===p);return{option_id:p,quantity:i?.[p]??g?.quantity??1}}),status:n};a&&(m.carrier_id=a),s&&(m.tracking_number=s);try{const p=await t.api.patch(`/api/modules/sirsoft-ecommerce/admin/orders/${e}/options/bulk-status`,m);if(p?.success){const g=t.t,w=p.data?.changed_count??o.length;t.toast?.success?.(g?.("sirsoft-ecommerce.admin.order.detail.handler.bulk_change_success",{count:w})??`${w}개 옵션의 상태가 변경되었습니다.`),t.modal?.close?.("modal_batch_change_confirm"),t.dispatch?.({handler:"refetchDataSource",params:{dataSourceId:"order"}}),t.dispatch?.({handler:"refetchDataSource",params:{dataSourceId:"order_logs"}}),t.state.setLocal({selectedProducts:[],selectAll:!1,batchOrderStatus:"",batchCarrierId:"",batchTrackingNumber:"",changeQuantities:{}})}else throw new Error(p?.message||"상태 변경에 실패했습니다.")}catch(p){Q.error("[processOrderDetailBulkChange] API 호출 실패:",p),t.toast?.error?.(t.t?.("sirsoft-ecommerce.admin.order.detail.handler.bulk_change_failed")??"상태 변경에 실패했습니다.")}}async function mr(r,c){const t=window.G7Core,{orderId:e}=r.params||{};if(!t?.state||!e)return;const n=t.state.getLocal().form?.admin_memo??"";try{const a=await t.api.patch(`/api/modules/sirsoft-ecommerce/admin/orders/${e}`,{admin_memo:n});if(a?.success)t.toast?.success?.(t.t?.("sirsoft-ecommerce.admin.order.detail.handler.memo_save_success")??"관리자 메모가 저장되었습니다.");else throw new Error(a?.message)}catch(a){Q.error("[saveAdminMemo] 저장 실패:",a),t.toast?.error?.(a?.message??"메모 저장에 실패했습니다.")}}function pr(r,c){const t=window.G7Core;if(!t?.state)return;const{optionId:e,maxQuantity:o}=r.params||{};if(!e||!o)return;const n=r.params?.value??r.$event?.target?.value,a=parseInt(String(n),10),s=Math.max(1,Math.min(isNaN(a)?o:a,o)),l={...t.state.getLocal().changeQuantities||{}};l[e]=s,t.state.setLocal({changeQuantities:l})}const ve=window.G7Core?.createLogger?.("Ecom:CancelOrder")??{log:(...r)=>console.log("[Ecom:CancelOrder]",...r),warn:(...r)=>console.warn("[Ecom:CancelOrder]",...r),error:(...r)=>console.error("[Ecom:CancelOrder]",...r)};let q=null;function gr(){q&&(clearTimeout(q),q=null,ve.log("[clearCancelOrderTimers] debounce 타이머 정리 완료"))}function fr(r,c){const t=window.G7Core;if(!t?.state)return;const{optionId:e,maxQuantity:o,orderId:n}=r.params||{};if(!e||!o||!n)return;const a=r.params?.value??r.$event?.target?.value,s=parseInt(String(a),10),i=Math.max(1,Math.min(isNaN(s)?o:s,o)),d=(t.state.getLocal().cancelItems||[]).map(m=>m.id===e?{...m,cancel_quantity:i}:m);t.state.setLocal({cancelItems:d});const u=window.__g7ActionContext;q&&clearTimeout(q),q=setTimeout(()=>{const m=window.__g7ActionContext;window.__g7ActionContext=u;try{xe(t,n)}finally{window.__g7ActionContext=m}},500)}async function _r(r,c){const t=window.G7Core;if(!t?.state)return;const{orderId:e,cancelItems:o}=r.params||{};e&&await xe(t,e,o)}async function xe(r,c,t){const e=r.state.getLocal(),o=t||e.cancelItems||[],n=e.refundPriority||"pg_first";if(o.length===0){r.state.setLocal({refundEstimate:null});return}const a=o.map(s=>({order_option_id:s.id,cancel_quantity:s.cancel_quantity}));r.state.setLocal({refundLoading:!0});try{const s=await r.api.post(`/api/modules/sirsoft-ecommerce/admin/orders/${c}/estimate-refund`,{items:a,refund_priority:n});if(s?.success)r.state.setLocal({refundEstimate:s.data,refundLoading:!1,cancelError:null});else throw new Error(s?.message||"Estimate failed")}catch(s){ve.error("[estimateRefundAmount] 실패:",s),r.state.setLocal({refundLoading:!1,refundEstimate:null}),r.toast?.error?.(r.t?.("sirsoft-ecommerce.admin.order.detail.modal.cancel.estimate_failed")??"환불 예상금액 계산에 실패했습니다.")}}function wr(r,c){const t=window.G7Core;if(!t?.state)return;const{priority:e,orderId:o}=r.params||{};if(!e||!o)return;t.state.setLocal({refundPriority:e});const n=window.__g7ActionContext;q&&clearTimeout(q),q=setTimeout(()=>{const a=window.__g7ActionContext;window.__g7ActionContext=n;try{xe(t,o)}finally{window.__g7ActionContext=a}},300)}async function yr(r,c){const t=window.G7Core;if(!t?.state)return;const{orderId:e}=r.params||{};if(!e)return;const o=t.state.getLocal(),n=r.params?.cancelItems||o.cancelItems||[],a=r.params?.cancelReason||o.cancelReason||"",s=r.params?.cancelReasonDetail||o.cancelReasonDetail||"",i=r.params?.cancelPg??o.cancelPg??!0,l=r.params?.refundPriority||o.refundPriority||"pg_first",m=(t.dataSource?.get?.("order")?.data?.options||[]).filter(w=>w.option_status!=="cancelled"),p=n.length>=m.length,g={type:p?"full":"partial",cancel_pg:i,refund_priority:l};a&&(g.reason=a),s&&(g.reason_detail=s),p||(g.items=n.map(w=>({order_option_id:w.id,cancel_quantity:w.cancel_quantity}))),t.state.setLocal({isCancelling:!0,cancelError:null,cancelValidationErrors:null});try{const w=await t.api.post(`/api/modules/sirsoft-ecommerce/admin/orders/${e}/cancel`,g);if(w?.success)t.state.setLocal({isCancelling:!1}),t.toast?.success?.(t.t?.("sirsoft-ecommerce.admin.order.detail.modal.cancel.cancel_success")??"주문이 취소되었습니다."),t.modal?.close?.("modal_cancel_order"),t.dispatch?.({handler:"refetchDataSource",params:{dataSourceId:"order"}}),t.dispatch?.({handler:"refetchDataSource",params:{dataSourceId:"order_logs"}}),t.state.setLocal({selectedProducts:[],selectAll:!1,batchOrderStatus:""});else throw new Error(w?.message||"Cancel failed")}catch(w){ve.error("[executeCancelOrder] 실패:",w);const _=w?.response?.data||w?.data,f=(w?.response?.status||w?.status)===422,v=_?.errors?.detail,C=_?.errors??null,S=v||_?.message||w?.message||"",h=t.t?.("sirsoft-ecommerce.admin.order.detail.modal.cancel.cancel_failed")??"주문 취소에 실패했습니다.";f?(t.state.setLocal({isCancelling:!1,cancelError:null,cancelValidationErrors:C}),t.toast?.error?.(S||h)):(t.state.setLocal({isCancelling:!1,cancelError:S||h,cancelValidationErrors:null}),t.toast?.error?.(S||h))}}const Ue=window.G7Core?.createLogger?.("Ecom:UserCancelOrder")??{log:(...r)=>console.log("[Ecom:UserCancelOrder]",...r),warn:(...r)=>console.warn("[Ecom:UserCancelOrder]",...r),error:(...r)=>console.error("[Ecom:UserCancelOrder]",...r)};let $=null;function hr(){$&&(clearTimeout($),$=null)}function Cr(r,c){const t=window.G7Core;if(!t?.state)return;const{optionId:e}=r.params||{};if(!e)return;const n=[...t.state.getLocal().selectedItemIds||[]],a=n.indexOf(e);a>=0?n.splice(a,1):n.push(e);const i=(t.dataSource?.get?.("order")?.data?.options||[]).filter(d=>d.option_status!=="cancelled").map(d=>d.id),l=i.length>0&&i.every(d=>n.includes(d));t.state.setLocal({selectedItemIds:n,selectAllItems:l})}function br(r,c){const t=window.G7Core;if(!t?.state)return;const e=t.state.getLocal(),n=(t.dataSource?.get?.("order")?.data?.options||[]).filter(s=>s.option_status!=="cancelled").map(s=>s.id),a=!e.selectAllItems;t.state.setLocal({selectedItemIds:a?n:[],selectAllItems:a})}function Ir(r,c){const t=window.G7Core;if(!t?.state)return;const e=t.dataSource?.get?.("order")?.data;if(!e)return;const n=t.state.getLocal().selectedItemIds||[];if(n.length===0){t.toast?.warning?.(t.t?.("mypage.order_detail.cancel_modal.no_selected_items")??"취소할 상품을 선택해주세요.");return}const s=(e.options||[]).filter(l=>n.includes(l.id)&&l.option_status!=="cancelled").map(l=>({id:l.id,product_name:l.product_name??"",product_option_name:l.product_option_name??"",thumbnail_url:l.product_snapshot?.thumbnail_url||"",unit_price:l.unit_price??0,quantity:l.quantity??1,cancel_quantity:l.quantity??1,option_status:l.option_status??"",selected:!0}));if(s.length===0){t.toast?.warning?.(t.t?.("mypage.order_detail.cancel_modal.no_cancellable_items")??"취소 가능한 상품이 없습니다.");return}t.state.setLocal({cancelItems:s,cancelSelectAll:!0,cancelReason:"",refundEstimate:null,refundLoading:!1,isCancelling:!1,cancelError:null}),t.modal?.open?.("modal_cancel_order");const i=r.params?.orderId||e.id;i&&re(t,i)}function Sr(r,c){const t=window.G7Core;if(!t?.state)return;const{optionId:e,orderId:o}=r.params||{};if(!e)return;const a=(t.state.getLocal().cancelItems||[]).map(i=>i.id===e?{...i,selected:!i.selected}:i),s=a.every(i=>i.selected);t.state.setLocal({cancelItems:a,cancelSelectAll:s}),$&&clearTimeout($),$=setTimeout(()=>{re(t,o)},500)}function vr(r,c){const t=window.G7Core;if(!t?.state)return;const{orderId:e}=r.params||{},o=t.state.getLocal(),n=!o.cancelSelectAll,a=(o.cancelItems||[]).map(s=>({...s,selected:n}));t.state.setLocal({cancelItems:a,cancelSelectAll:n}),$&&clearTimeout($),$=setTimeout(()=>{re(t,e)},500)}function xr(r,c){const t=window.G7Core;if(!t?.state)return;const{optionId:e,maxQuantity:o,orderId:n}=r.params||{};if(!e||!o||!n)return;const a=r.params?.value??r.$event?.target?.value,s=parseInt(String(a),10),i=Math.max(1,Math.min(isNaN(s)?o:s,o)),d=(t.state.getLocal().cancelItems||[]).map(m=>m.id===e?{...m,cancel_quantity:i}:m);t.state.setLocal({cancelItems:d});const u=window.__g7ActionContext;$&&clearTimeout($),$=setTimeout(()=>{const m=window.__g7ActionContext;window.__g7ActionContext=u;try{re(t,n)}finally{window.__g7ActionContext=m}},500)}async function Lr(r,c){const t=window.G7Core;if(!t?.state)return;const{orderId:e}=r.params||{};e&&await re(t,e)}async function re(r,c){const t=r.state.getLocal(),e=t.cancelItems||[],o=t.refundPriority||"pg_first",n=e.filter(s=>s.selected);if(n.length===0){r.state.setLocal({refundEstimate:null,refundLoading:!1});return}const a=n.map(s=>({order_option_id:s.id,cancel_quantity:s.cancel_quantity}));r.state.setLocal({refundLoading:!0});try{const s=await r.api.post(`/api/modules/sirsoft-ecommerce/user/orders/${c}/estimate-refund`,{items:a,refund_priority:o});if(s?.success)r.state.setLocal({refundEstimate:s.data,refundLoading:!1,cancelError:null});else throw new Error(s?.message||"Estimate failed")}catch(s){Ue.error("[estimateUserRefund] 실패:",s),r.state.setLocal({refundLoading:!1,refundEstimate:null}),r.toast?.error?.(r.t?.("mypage.order_detail.cancel_modal.estimate_failed")??"환불 예상금액 계산에 실패했습니다.")}}function Pr(r,c){const t=window.G7Core;if(!t?.state)return;const{priority:e,orderId:o}=r.params||{};if(!e||!o)return;t.state.setLocal({refundPriority:e});const n=window.__g7ActionContext;$&&clearTimeout($),$=setTimeout(()=>{const a=window.__g7ActionContext;window.__g7ActionContext=n;try{re(t,o)}finally{window.__g7ActionContext=a}},300)}async function kr(r,c){const t=window.G7Core;if(!t?.state)return;const{orderId:e}=r.params||{};if(!e)return;const o=t.state.getLocal(),n=o.cancelItems||[],a=n.filter(p=>p.selected),s=r.params?.cancelReason||o.cancelReason||"",i=r.params?.refundPriority||o.refundPriority||"pg_first";if(a.length===0){t.toast?.warning?.(t.t?.("mypage.order_detail.cancel_modal.no_selected_items")??"취소할 상품을 선택해주세요.");return}if(!s){t.toast?.warning?.(t.t?.("mypage.order_detail.cancel_modal.reason_required")??"취소 사유를 선택해주세요.");return}const l=n.every(p=>p.selected),d=a.every(p=>p.cancel_quantity===p.quantity),u=l&&d,m={reason:s,refund_priority:i};u||(m.items=a.map(p=>({order_option_id:p.id,cancel_quantity:p.cancel_quantity}))),t.state.setLocal({isCancelling:!0,cancelError:null,cancelValidationErrors:null});try{const p=await t.api.post(`/api/modules/sirsoft-ecommerce/user/orders/${e}/cancel`,m);if(p?.success)t.state.setLocal({isCancelling:!1}),t.toast?.success?.(t.t?.("mypage.order_detail.cancel_success")??"주문이 취소되었습니다."),t.modal?.close?.("modal_cancel_order"),t.dispatch?.({handler:"refetchDataSource",params:{dataSourceId:"order"}});else throw new Error(p?.message||"Cancel failed")}catch(p){Ue.error("[executeUserCancelOrder] 실패:",p);const g=p?.response?.data||p?.data,w=g?.message||p?.message||"",_=g?.errors??null,y=t.t?.("mypage.order_detail.cancel_modal.cancel_failed")??"주문 취소에 실패했습니다.";t.state.setLocal({isCancelling:!1,cancelError:w||y,cancelValidationErrors:_}),t.toast?.error?.(w||y)}}const je=window.G7Core?.createLogger?.("Ecom:ConfirmOrder")??{log:(...r)=>console.log("[Ecom:ConfirmOrder]",...r),warn:(...r)=>console.warn("[Ecom:ConfirmOrder]",...r),error:(...r)=>console.error("[Ecom:ConfirmOrder]",...r)};async function Gr(r,c){const t=window.G7Core;if(!t?.state)return;const{orderId:e,optionId:o}=r.params||{};if(!e||!o){je.error("[confirmOrderOption] orderId 또는 optionId 누락");return}t.state.setLocal({isConfirming:!0});try{const n=await t.api.post(`/api/modules/sirsoft-ecommerce/user/orders/${e}/options/${o}/confirm`);if(n?.success)t.state.setLocal({isConfirming:!1,confirmTarget:null}),t.modal?.close?.("modal_confirm_purchase"),t.dispatch?.({handler:"refetchDataSource",params:{dataSourceId:"order"}}),t.toast?.success?.(n.message??t.t?.("sirsoft-ecommerce::messages.order.confirmed")??"구매확정이 완료되었습니다.");else throw new Error(n?.message||"Confirm failed")}catch(n){je.error("[confirmOrderOption] 실패:",n);const a=n?.response?.data?.message||n?.data?.message||n?.message||t.t?.("sirsoft-ecommerce::messages.order.cannot_confirm")||"구매확정에 실패했습니다.";t.state.setLocal({isConfirming:!1}),t.toast?.error?.(a)}}const Le=window.G7Core?.createLogger?.("Ecom:Review")??{log:(...r)=>console.log("[Ecom:Review]",...r),warn:(...r)=>console.warn("[Ecom:Review]",...r),error:(...r)=>console.error("[Ecom:Review]",...r)};async function Or(r,c){const t=window.G7Core;if(!t?.state)return;const{orderId:e,optionId:o,productId:n}=r.params||{};if(!e||!o||!n){Le.error("[submitReview] orderId, optionId 또는 productId 누락");return}const a=t.state.getLocal(),s=r.params?.rating??a.reviewRating??5,i=(r.params?.content??a.reviewContent??"").trim(),d=(r.params?.images??a.reviewImages??[]).map(u=>u instanceof File?u:u?.file instanceof File||u?.file instanceof Blob||u?.file&&typeof u.file.name=="string"&&u.file.size>0?u.file:u instanceof Blob?u:null).filter(u=>u!==null);if(!s||s<1||s>5){t.toast?.error?.(t.t?.("sirsoft-ecommerce.user.review.validation.rating_required")??"별점을 선택해 주세요.");return}if(i.length<10){t.state.setLocal({reviewError:t.t?.("sirsoft-ecommerce.user.review.validation.content_min")??"리뷰 내용을 최소 10자 이상 입력해 주세요."});return}t.state.setLocal({isSubmittingReview:!0,reviewError:null});try{const u=await t.api.post("/api/modules/sirsoft-ecommerce/user/reviews",{order_option_id:o,product_id:n,rating:s,content:i});if(!u?.success)throw new Error(u?.message||"Review creation failed");const m=u.data?.id;if(m&&d.length>0)for(let p=0;p<d.length;p++){const g=new FormData;g.append("image",d[p]),g.append("sort_order",String(p));try{await t.api.post(`/api/modules/sirsoft-ecommerce/user/reviews/${m}/images`,g,{headers:{"Content-Type":"multipart/form-data"}})}catch(w){Le.warn(`[submitReview] 이미지 ${p+1} 업로드 실패:`,w),t.toast?.warning?.(t.t?.("sirsoft-ecommerce.user.review.image_upload_partial_fail")??`이미지 ${p+1}번 업로드에 실패했습니다.`)}}t.state.setLocal({isSubmittingReview:!1,reviewTarget:null,reviewRating:5,reviewContent:"",reviewImages:[],reviewError:null}),t.modal?.close?.("modal_write_review"),t.dispatch?.({handler:"refetchDataSource",params:{dataSourceId:"order"}}),t.toast?.success?.(u.message??t.t?.("sirsoft-ecommerce.user.review.submit_success")??"리뷰가 등록되었습니다.")}catch(u){Le.error("[submitReview] 실패:",u);const m=u?.response?.data||u?.data,p=u?.response?.status||u?.status,g=m?.message||u?.message||t.t?.("sirsoft-ecommerce.user.review.submit_failed")||"리뷰 등록에 실패했습니다.";if(p===422){const w=m?.errors??{},_=Object.values(w).flat()[0];t.state.setLocal({isSubmittingReview:!1,reviewError:_||g})}else t.state.setLocal({isSubmittingReview:!1});t.toast?.error?.(g)}}const I=window.G7Core?.createLogger?.("Ecom:ShippingPolicyForm")??{log:(...r)=>console.log("[Ecom:ShippingPolicyForm]",...r),warn:(...r)=>console.warn("[Ecom:ShippingPolicyForm]",...r),error:(...r)=>console.error("[Ecom:ShippingPolicyForm]",...r)},Ar=["fixed","conditional_free","per_quantity","per_weight","per_volume","per_volume_weight","per_amount"],Fr=["conditional_free"],Dr=["range_amount","range_quantity","range_weight","range_volume","range_volume_weight"],Er=["api"],$r=["per_quantity","per_weight","per_volume","per_volume_weight","per_amount"],Nr={shipping_method:"parcel",carrier:null,currency_code:"KRW",charge_policy:"fixed",base_fee:0,free_threshold:null,ranges:null,api_endpoint:null,api_request_fields:null,api_response_fee_field:null,extra_fee_enabled:!1,extra_fee_settings:[],extra_fee_multiply:!1,is_active:!0};function Z(r){return{showBaseFee:Ar.includes(r),showFreeThreshold:Fr.includes(r),showRanges:Dr.includes(r),showApiSettings:Er.includes(r),showUnitValue:$r.includes(r)}}function O(){const r=window.G7Core;return r?.state?r:(I.warn("G7Core.state not available"),null)}function A(r,c){r.setLocalState?r.setLocalState(c):O()?.state?.setLocal(c)}function D(r){return[...(r.state.getLocal?.()??{}).form?.country_settings??[]]}function Tr(r,c){const t=r.params||{},e=t.policy,o=!!t.isEdit,n=!!t.isCopy;if(t.availableCountries,!O())return;const s={activeCountryTab:0,rangeErrors:{}};if((o||n)&&e){const i=e.country_settings??[],d=i[0]?.charge_policy??"fixed",u=Z(d);Object.assign(s,u),I.log("[initShippingPolicyForm]",o?"Edit":"Copy","mode, countries:",i.length,"first charge_policy:",d)}else{const i=Z("fixed");Object.assign(s,i),I.log("[initShippingPolicyForm] Create mode, default flags")}A(c,s)}function Rr(r,c){const e=(r.params||{}).country_code??"";if(!e){I.warn("[addCountrySetting] country_code is empty");return}const o=O();if(!o)return;const n=D(o);if(n.some(d=>d.country_code===e)){I.warn("[addCountrySetting] Duplicate country_code:",e);return}const a={country_code:e,...Nr};n.push(a);const s=n.length-1,i=Z(a.charge_policy),l={"form.country_settings":n,activeCountryTab:s,...i};A(c,l),I.log("[addCountrySetting] Added country:",e,"index:",s)}function Mr(r,c){const t=r.params||{},e=Number(t.index);if(isNaN(e)||e<0){I.warn("[removeCountrySetting] Invalid index:",t.index);return}const o=O();if(!o)return;const n=D(o),a=o.state.getLocal?.()??{};if(e>=n.length){I.warn("[removeCountrySetting] Index out of bounds:",e);return}const s=n[e].country_code;n.splice(e,1);const i=a.activeCountryTab??0;let l=i;n.length===0?l=0:i>=n.length?l=n.length-1:i>e&&(l=i-1);const d={...a.rangeErrors??{}};d[s]=[];const u=n[l],m=Z(u?u.charge_policy:"fixed"),p={"form.country_settings":n,activeCountryTab:l,rangeErrors:d,...m};A(c,p),I.log("[removeCountrySetting] Removed index:",e,"country:",s,"newTab:",l)}function Hr(r,c){const t=r.params||{},e=Number(t.index);if(isNaN(e)||e<0){I.warn("[switchCountryTab] Invalid index:",t.index);return}const o=O();if(!o)return;const n=D(o);if(e>=n.length){I.warn("[switchCountryTab] Index out of bounds:",e);return}const a=n[e],s=Z(a.charge_policy),i={activeCountryTab:e,...s};A(c,i),I.log("[switchCountryTab] Switched to tab:",e,"country:",a.country_code,"charge_policy:",a.charge_policy)}function qr(r,c){const t=r.params||{},e=t.field??"",o=t.value;if(!e){I.warn("[updateCountryField] field is empty");return}const n=O();if(!n)return;const a=n.state.getLocal?.()??{},s=Number(a.activeCountryTab??0),i=D(n);if(s>=i.length){I.warn("[updateCountryField] Index out of bounds:",s);return}i[s]={...i[s],[e]:o},A(c,{"form.country_settings":i}),I.log("[updateCountryField] Updated",e,"=",o,"at index:",s)}function Ur(r,c){const t=r.params||{},e=t.value??"",o=Number(t.index??0);if(!e){I.warn("[onChargePolicyChange] charge_policy value is empty");return}const n=O();if(!n)return;const a=Z(e);I.log("[onChargePolicyChange]",e,a,"countryIndex:",o);const s=D(n),i=s[o];if(!i){I.warn("[onChargePolicyChange] No country setting at index:",o);return}const l={...i,charge_policy:e};if(a.showBaseFee||(l.base_fee=0),a.showFreeThreshold||(l.free_threshold=null),!a.showRanges&&!a.showUnitValue&&(l.ranges=null),a.showApiSettings||(l.api_endpoint=null,l.api_request_fields=null,l.api_response_fee_field=null),a.showRanges&&(!l.ranges||!l.ranges.tiers)){const u=e.replace("range_","");l.ranges={type:u,tiers:[{min:0,max:null,fee:0}]}}a.showUnitValue&&(!l.ranges||!l.ranges.unit_value)&&(l.ranges={type:e,unit_value:1}),s[o]=l;const d={"form.country_settings":s,...a};A(c,d)}function jr(r,c){const t=r.params||{},e=Number(t.index??0),o=O();if(!o)return;const n=D(o),a=n[e];if(!a){I.warn("[addRangeTier] No country setting at index:",e);return}const s=[...a.ranges?.tiers??[]],i=s[s.length-1],d={min:i?.max!=null?i.max+1:0,max:null,fee:0};s.push(d),n[e]={...a,ranges:{...a.ranges??{},tiers:s}},A(c,{"form.country_settings":n}),we(o,c,e,s,a.country_code),I.log("[addRangeTier] Added tier, total:",s.length)}function Vr(r,c){const t=r.params||{},e=Number(t.countryIndex??0),o=Number(t.tierIndex);if(isNaN(o)||o<0){I.warn("[removeRangeTier] Invalid tierIndex:",t.tierIndex);return}const n=O();if(!n)return;const a=D(n),s=a[e];if(!s){I.warn("[removeRangeTier] No country setting at index:",e);return}const i=[...s.ranges?.tiers??[]];if(o>=i.length){I.warn("[removeRangeTier] tierIndex out of bounds:",o);return}i.splice(o,1),a[e]={...s,ranges:{...s.ranges??{},tiers:i}},A(c,{"form.country_settings":a}),we(n,c,e,i,s.country_code),I.log("[removeRangeTier] Removed tier:",o,"remaining:",i.length)}function Br(r,c){const t=r.params||{},e=Number(t.countryIndex??0),o=Number(t.tierIndex),n=t.field,a=t.value;if(isNaN(o)||o<0){I.warn("[updateRangeTierField] Invalid tierIndex:",t.tierIndex);return}if(!["min","max","fee"].includes(n)){I.warn("[updateRangeTierField] Invalid field:",n);return}const s=O();if(!s)return;const i=D(s),l=i[e];if(!l){I.warn("[updateRangeTierField] No country setting at index:",e);return}const d=[...l.ranges?.tiers??[]];if(o>=d.length){I.warn("[updateRangeTierField] tierIndex out of bounds:",o);return}let u;n==="max"?u=a===""||a===null||a===void 0?null:Number(a):u=Number(a),d[o]={...d[o],[n]:u},i[e]={...l,ranges:{...l.ranges??{},tiers:d}},A(c,{"form.country_settings":i}),we(s,c,e,d,l.country_code)}function Kr(r,c){const t=r.params||{},e=Number(t.countryIndex??0),o=O();if(!o)return;const a=D(o)[e];if(!a)return;const s=a.ranges?.tiers??[];we(o,c,e,s,a.country_code)}function we(r,c,t,e,o){const a={...(r.state.getLocal?.()??{}).rangeErrors??{}};if(e.length===0){a[o]=[],A(c,{rangeErrors:a});return}const s=new Array(e.length).fill(null).map(()=>({}));let i=!1;const l=r.t;for(let d=0;d<e.length;d++){const u=e[d];if(d===0&&u.min!==0&&(s[d].min=l?.("sirsoft-ecommerce.validation.shipping_policy.ranges.first_min_zero")??"첫 구간의 시작값은 0이어야 합니다.",i=!0),d===e.length-1&&u.max!==null&&u.max!==void 0&&(s[d].max=l?.("sirsoft-ecommerce.validation.shipping_policy.ranges.last_max_unlimited")??"마지막 구간의 종료값은 비워야 합니다.",i=!0),d<e.length-1&&u.max!==null&&u.max!==void 0&&u.min>=u.max&&(s[d].min=l?.("sirsoft-ecommerce.validation.shipping_policy.ranges.min_less_than_max")??"시작값이 종료값보다 작아야 합니다.",i=!0),d<e.length-1){const m=e[d+1];u.max!==null&&u.max!==void 0&&u.max+1!==m.min&&(s[d].max=l?.("sirsoft-ecommerce.validation.shipping_policy.ranges.continuity")??"구간이 연속적이지 않습니다.",i=!0)}u.fee<0&&(s[d].fee=l?.("sirsoft-ecommerce.validation.shipping_policy.ranges.fee_non_negative")??"배송비는 0 이상이어야 합니다.",i=!0)}a[o]=i?s:[],A(c,{rangeErrors:a})}function Qr(r,c){const t=r.params||{},e=Number(t.countryIndex??0),o=O();if(!o)return;const n=D(o),a=n[e];if(!a){I.warn("[addExtraFeeRow] No country setting at index:",e);return}if(a.country_code!=="KR"){I.warn("[addExtraFeeRow] Extra fee only available for KR, current:",a.country_code);return}const s=[...a.extra_fee_settings??[]];s.push({zipcode:"",fee:0,region:""}),n[e]={...a,extra_fee_settings:s},A(c,{"form.country_settings":n}),I.log("[addExtraFeeRow] Added row, total:",s.length)}function zr(r,c){const t=r.params||{},e=Number(t.countryIndex??0),o=Number(t.feeIndex);if(isNaN(o)||o<0){I.warn("[removeExtraFeeRow] Invalid feeIndex:",t.feeIndex);return}const n=O();if(!n)return;const a=D(n),s=a[e];if(!s){I.warn("[removeExtraFeeRow] No country setting at index:",e);return}const i=[...s.extra_fee_settings??[]];if(o>=i.length){I.warn("[removeExtraFeeRow] feeIndex out of bounds:",o);return}i.splice(o,1),a[e]={...s,extra_fee_settings:i},A(c,{"form.country_settings":a}),I.log("[removeExtraFeeRow] Removed index:",o,"remaining:",i.length)}function Jr(r,c){const t=r.params||{},e=Number(t.countryIndex??0),o=t.settings;if(!o||!Array.isArray(o)){I.warn("[applyExtraFeeTemplate] Invalid settings:",o);return}const n=O();if(!n)return;const a=D(n),s=a[e];if(!s){I.warn("[applyExtraFeeTemplate] No country setting at index:",e);return}a[e]={...s,extra_fee_settings:o},A(c,{"form.country_settings":a});const i=n.t,l=i?.("sirsoft-ecommerce.admin.shipping_policy.form.template_applied")??"템플릿이 적용되었습니다.";n.toast?.success?.(l),I.log("[applyExtraFeeTemplate] Applied template with",o.length,"rows")}function Wr(r,c){const t=r.params||{},e=parseFloat(t.value)||1,o=O();if(!o)return;const n=o.state.getLocal?.()??{},a=Number(n.activeCountryTab??0),s=D(o),i=s[a];i&&(s[a]={...i,ranges:{...i.ranges??{},type:i.charge_policy,unit_value:e}},A(c,{"form.country_settings":s}),I.log("[updateUnitValue] Updated unit_value:",e))}function Yr(r,c){const t=O();if(!t)return;const e=t.state.getLocal?.()??{},o=Number(e.activeCountryTab??0),n=D(t),a=n[o];if(!a)return;const s=[...a.api_request_fields??[]];s.push(""),n[o]={...a,api_request_fields:s},A(c,{"form.country_settings":n}),I.log("[addApiRequestField] Added field, total:",s.length)}function Xr(r,c){const t=r.params||{},e=Number(t.fieldIndex),o=t.value??"";if(isNaN(e)||e<0){I.warn("[updateApiRequestField] Invalid fieldIndex:",t.fieldIndex);return}const n=O();if(!n)return;const a=n.state.getLocal?.()??{},s=Number(a.activeCountryTab??0),i=D(n),l=i[s];if(!l)return;const d=[...l.api_request_fields??[]];e>=d.length||(d[e]=o,i[s]={...l,api_request_fields:d},A(c,{"form.country_settings":i}),I.log("[updateApiRequestField] Updated index:",e,"value:",o))}function Zr(r,c){const t=r.params||{},e=Number(t.fieldIndex);if(isNaN(e)||e<0){I.warn("[removeApiRequestField] Invalid fieldIndex:",t.fieldIndex);return}const o=O();if(!o)return;const n=o.state.getLocal?.()??{},a=Number(n.activeCountryTab??0),s=D(o),i=s[a];if(!i)return;const l=[...i.api_request_fields??[]];e>=l.length||(l.splice(e,1),s[a]={...i,api_request_fields:l},A(c,{"form.country_settings":s}),I.log("[removeApiRequestField] Removed index:",e,"remaining:",l.length))}function en(r,c){const t=r.params||{},e=Number(t.feeIndex),o=t.field,n=t.value;if(isNaN(e)||e<0){I.warn("[updateExtraFeeField] Invalid feeIndex:",t.feeIndex);return}if(!["zipcode","fee","region"].includes(o)){I.warn("[updateExtraFeeField] Invalid field:",o);return}const a=O();if(!a)return;const s=a.state.getLocal?.()??{},i=Number(s.activeCountryTab??0),l=D(a),d=l[i];if(!d)return;const u=[...d.extra_fee_settings??[]];if(e>=u.length)return;const m=o==="fee"?parseFloat(n)||0:n;u[e]={...u[e],[o]:m},l[i]={...d,extra_fee_settings:u},A(c,{"form.country_settings":l}),I.log("[updateExtraFeeField] Updated index:",e,o,"=",m)}const ie=window.G7Core?.createLogger?.("Handler:InitCategory")??{log:(...r)=>console.log("[Handler:InitCategory]",...r),warn:(...r)=>console.warn("[Handler:InitCategory]",...r),error:(...r)=>console.error("[Handler:InitCategory]",...r)};function Ve(r,c){for(const t of r){if(t.id===c)return t;if(t.children&&t.children.length>0){const e=Ve(t.children,c);if(e)return e}}return null}function Be(r){return new URLSearchParams(window.location.search).get(r)}function tn(r){return window.G7Core?.state?.getDataSource?.(r)}async function on(r,c,t=30,e=100){for(let o=0;o<t;o++){const n=tn(r),a=c(n);if(Array.isArray(a)&&a.length>0)return a;await new Promise(s=>setTimeout(s,e))}return null}async function rn(r,c){const t=window.G7Core,e=Be("id"),o=Be("mode");if(!e){ie.log("[initCategoryFromUrl] No id parameter in URL");return}if(!t?.state?.set){ie.warn("[initCategoryFromUrl] G7Core.state.set not available");return}const n=await on("categories",l=>l?.data?.data);if(!n){ie.warn("[initCategoryFromUrl] categories data not available after waiting");return}const a=parseInt(e,10),s=Ve(n,a);if(!s){ie.warn("[initCategoryFromUrl] Category not found with id:",a);return}const i=o==="edit"?"edit":"view";t.state.set({selectedCategoryId:s.id,selectedCategory:s,panelMode:i}),ie.log("[initCategoryFromUrl] Category initialized from URL:",{id:a,mode:i})}const ce=window.G7Core?.createLogger?.("Handler:InitBrand")??{log:(...r)=>console.log("[Handler:InitBrand]",...r),warn:(...r)=>console.warn("[Handler:InitBrand]",...r),error:(...r)=>console.error("[Handler:InitBrand]",...r)};function Ke(r){return new URLSearchParams(window.location.search).get(r)}function nn(r){return window.G7Core?.state?.getDataSource?.(r)}async function an(r,c,t=30,e=100){for(let o=0;o<t;o++){const n=nn(r),a=c(n);if(Array.isArray(a)&&a.length>0)return a;await new Promise(s=>setTimeout(s,e))}return null}async function sn(r,c){const t=window.G7Core,e=Ke("id"),o=Ke("mode");if(!e){ce.log("[initBrandFromUrl] No id parameter in URL");return}if(!t?.state?.set){ce.warn("[initBrandFromUrl] G7Core.state.set not available");return}const n=await an("brands",l=>l?.data?.data);if(!n){ce.warn("[initBrandFromUrl] brands data not available after waiting");return}const a=parseInt(e,10),s=n.find(l=>l.id===a);if(!s){ce.warn("[initBrandFromUrl] Brand not found with id:",a);return}const i=o==="edit"?"edit":"view";t.state.set({selectedBrandId:s.id,selectedBrand:s,panelMode:i}),ce.log("[initBrandFromUrl] Brand initialized from URL:",{id:a,mode:i})}const le=window.G7Core?.createLogger?.("Handler:InitCommonInfo")??{log:(...r)=>console.log("[Handler:InitCommonInfo]",...r),warn:(...r)=>console.warn("[Handler:InitCommonInfo]",...r),error:(...r)=>console.error("[Handler:InitCommonInfo]",...r)};function Qe(r){return new URLSearchParams(window.location.search).get(r)}function cn(r){return window.G7Core?.state?.getDataSource?.(r)}async function ln(r,c,t=30,e=100){for(let o=0;o<t;o++){const n=cn(r),a=c(n);if(Array.isArray(a)&&a.length>0)return a;await new Promise(s=>setTimeout(s,e))}return null}async function dn(r,c){const t=window.G7Core,e=Qe("id"),o=Qe("mode");if(!e){le.log("[initCommonInfoFromUrl] No id parameter in URL");return}if(!t?.state?.set){le.warn("[initCommonInfoFromUrl] G7Core.state.set not available");return}const n=await ln("commonInfos",l=>l?.data);if(!n){le.warn("[initCommonInfoFromUrl] commonInfos data not available after waiting");return}const a=parseInt(e,10),s=n.find(l=>l.id===a);if(!s){le.warn("[initCommonInfoFromUrl] Common info not found with id:",a);return}const i=o==="edit"?"edit":"view";t.state.set({selectedId:s.id,selectedItem:s,panelMode:i}),le.log("[initCommonInfoFromUrl] Common info initialized from URL:",{id:a,mode:i})}const de=window.G7Core?.createLogger?.("Handler:InitNotice")??{log:(...r)=>console.log("[Handler:InitNotice]",...r),warn:(...r)=>console.warn("[Handler:InitNotice]",...r),error:(...r)=>console.error("[Handler:InitNotice]",...r)};function ze(r){return new URLSearchParams(window.location.search).get(r)}function un(r){return window.G7Core?.state?.getDataSource?.(r)}async function mn(r,c,t=30,e=100){for(let o=0;o<t;o++){const n=un(r),a=c(n);if(Array.isArray(a)&&a.length>0)return a;await new Promise(s=>setTimeout(s,e))}return null}async function pn(r,c){const t=window.G7Core,e=ze("id"),o=ze("mode");if(!e){de.log("[initNoticeFromUrl] No id parameter in URL");return}if(!t?.state?.set){de.warn("[initNoticeFromUrl] G7Core.state.set not available");return}const n=await mn("templates",l=>l?.data);if(!n){de.warn("[initNoticeFromUrl] templates data not available after waiting");return}const a=parseInt(e,10),s=n.find(l=>l.id===a);if(!s){de.warn("[initNoticeFromUrl] Template not found with id:",a);return}const i=o==="edit"?"edit":"view";t.state.set({selectedTemplateId:s.id,selectedTemplate:s,panelMode:i}),de.log("[initNoticeFromUrl] Template initialized from URL:",{id:a,mode:i})}const ee={updateProductField:Ye,updateOptionField:Xe,buildProductColumns:Ze,buildOptionColumns:et,calculateCurrencyPrices:me,setDateRange:ot,setDefaultOption:rt,toggleOption:nt,toggleProductOptions:Fe,toggleAllOptionsInRow:at,getProductOptionStates:st,syncProductSelection:it,generateCopyProductCode:ct,copyProduct:lt,selectCategory:ut,selectCategoryMobile:mt,addCategoryToSelection:pt,removeCategoryFromSelection:gt,getCategoryBreadcrumb:ft,validateCategoryPath:wt,initCategoryInfosFromProduct:_t,getBrandName:yt,getBrandDescription:ht,updatePrice:bt,calculateTotalOptionStock:It,validatePriceRelation:St,addOptionInput:Tt,removeOptionInput:Rt,updateOptionInput:Mt,generateOptions:Ht,deleteOption:qt,applyOptionAddTool:Ut,addRequiredItem:jt,updateRequiredItem:Vt,removeRequiredItem:Bt,reorderRequiredItems:Kt,addAdditionalOption:Qt,updateAdditionalOption:zt,removeAdditionalOption:Jt,reorderAdditionalOptions:Wt,uploadImages:eo,setThumbnail:to,confirmDeleteImage:oo,deleteImage:ro,reorderImages:no,updateDescription:ao,confirmSelectNoticeTemplate:so,selectNoticeTemplate:Re,updateNoticeItem:io,removeNoticeItem:co,reorderNoticeItems:lo,fillNoticeWithValue:uo,switchNoticeMode:mo,updateNewTemplateName:po,addNoticeItem:go,updateNoticeItemName:fo,saveAsNoticeTemplate:_o,confirmSaveNoticeTemplate:ho,fillTemplateFieldsWithDetailReference:wo,fillNoticeItemsWithDetailReference:yo,toggleLabel:Co,generateProductCode:bo,getShippingPolicyInfo:Io,getCommonInfoContent:So,updateShoppingIntegration:vo,updateShippingType:xo,updateIdentificationCode:Lo,openLabelPeriodModal:Po,saveLabelPeriod:ko,removeLabelPeriod:Go,updateActivityLogSort:Oo,updateActivityLogPerPage:Ao,setDefaultShippingPolicy:Fo,setLabelDatePreset:Eo,toggleDefaultShippingPolicy:Do,toggleLabelAssignment:$o,saveLabelSettings:Ho,deleteLabel:Mo,updateLabelPeriodInline:No,setLabelDatePresetInline:To,confirmUncheckLabel:Ro,removeDescriptionLocale:qo,showAddLocaleModal:Uo,addDescriptionLocale:jo,toggleAutoMultiCurrency:Lt,setDefaultOptionFromGrid:Pt,addOptionRow:Ot,updateFormOptionField:kt,updateFormOptionCurrencyField:Gt,recalculateOptionPriceAdjustments:At,bulkUpdate:Vo,buildConfirmData:Qo,buildOrderColumns:zo,toggleArrayValue:Jo,toggleVisibleFilter:Wo,syncOrderSelection:Yo,handleOrderRowAction:Xo,processOrderBulkAction:Zo,buildOrderBulkConfirmData:nr,executeOrderBulkAction:ar,downloadOrderExcel:er,saveVisibleColumns:tr,loadVisibleColumns:or,loadVisibleFilters:rr,handleProductRowAction:sr,initOrderDetailForm:ir,toggleProductSelection:cr,toggleAllProducts:lr,buildOrderDetailBulkConfirmData:dr,processOrderDetailBulkChange:ur,saveAdminMemo:mr,updateChangeQuantity:pr,initShippingPolicyForm:Tr,addCountrySetting:Rr,removeCountrySetting:Mr,switchCountryTab:Hr,updateCountryField:qr,onChargePolicyChange:Ur,addRangeTier:jr,removeRangeTier:Vr,updateRangeTierField:Br,validateRangeTiers:Kr,addExtraFeeRow:Qr,removeExtraFeeRow:zr,applyExtraFeeTemplate:Jr,updateUnitValue:Wr,addApiRequestField:Yr,updateApiRequestField:Xr,removeApiRequestField:Zr,updateExtraFeeField:en,updateCancelQuantity:fr,estimateRefundAmount:_r,changeRefundPriority:wr,executeCancelOrder:yr,clearCancelOrderTimers:gr,toggleItemSelection:Cr,toggleSelectAllItems:br,initUserCancelItems:Ir,toggleUserCancelItem:Sr,toggleUserCancelSelectAll:vr,updateUserCancelQuantity:xr,estimateUserRefund:Lr,changeUserRefundPriority:Pr,executeUserCancelOrder:kr,clearUserCancelOrderTimers:hr,confirmOrderOption:Gr,submitReview:Or,initCategoryFromUrl:rn,initBrandFromUrl:sn,initCommonInfoFromUrl:dn,initNoticeFromUrl:pn},H="sirsoft-ecommerce",ue=window.G7Core?.createLogger?.(`Module:${H}`)??{log:(...r)=>console.log(`[Module:${H}]`,...r),warn:(...r)=>console.warn(`[Module:${H}]`,...r),error:(...r)=>console.error(`[Module:${H}]`,...r)};function Je(r=!1){const c=window.G7Core?.getActionDispatcher?.();if(c)Object.entries(ee).forEach(([t,e])=>{const o=`${H}.${t}`;c.registerHandler(o,e,{category:"module",source:H})}),ue.log(`${Object.keys(ee).length} handler(s) registered:`,Object.keys(ee).map(t=>`${H}.${t}`));else if(r){let t=0;const e=50,o=()=>{const n=window.G7Core?.getActionDispatcher?.();n?(Object.entries(ee).forEach(([a,s])=>{const i=`${H}.${a}`;n.registerHandler(i,s,{category:"module",source:H})}),ue.log(`${Object.keys(ee).length} handler(s) registered:`,Object.keys(ee).map(a=>`${H}.${a}`))):(t++,t<=e?(ue.warn(`ActionDispatcher not found, retrying... (${t}/${e})`),setTimeout(o,100)):ue.error("Failed to register handlers: ActionDispatcher not available after maximum retries"))};o()}else ue.warn("ActionDispatcher not found, handlers not registered")}function Pe(){if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",()=>Je(!0));else{const r=!!window.G7Core?.getActionDispatcher?.();Je(!r)}}return Pe(),typeof window<"u"&&(window.__SirsoftEcommerce={identifier:H,handlers:Object.keys(ee),initModule:Pe}),he.initModule=Pe,Object.defineProperty(he,Symbol.toStringTag,{value:"Module"}),he}({});
//# sourceMappingURL=module.iife.js.map