/* portal/commerce/public/products.js — 상품 목록(§6.1). 가격·한도는 서버(product_versions)에서 온다. 미확정 정책은 숫자 대신 '미확정 정책' 으로 보인다. */ (() => { const el = document.getElementById('products'); const esc = aw.esc; const GB = 1024 ** 3; const money = (n) => Number(n).toLocaleString('ko-KR') + '원'; const gb = (b) => (b / GB).toFixed(0) + ' GB'; async function load() { try { const d = await aw.api('GET', '/api/commerce/products'); if (!d.products.length) { aw.state(el, 'empty', '판매 중인 상품이 없습니다. 운영자에게 문의하세요'); return; } el.innerHTML = `

ⓘ 결제 방식: ${esc(d.paymentMethods.map((m) => m.label).join(', '))} — 자동 결제는 지원하지 않습니다.

` + `
${d.products.map((p) => `

${esc(p.name)} v${p.version}

${esc(p.audience)}

${esc(p.description || '')}

${money(p.price)}/${p.billingCycle === 'monthly' ? '월' : '년'} + 세금 ${money(p.tax)} = ${money(p.total)}

사이트 수
${p.limits.sites}개
웹 디스크
${gb(p.limits.web_disk)}
월간 웹 아웃바운드
${gb(p.limits.web_out)}
메일 저장 공간
${gb(p.limits.mail_storage)}
월간 메일 통수
${p.limits.mail_msgs.toLocaleString('ko-KR')}통(송신+수신)
메일함
${p.limits.mailboxes}개

추가 옵션

제공 범위

제외

${p.deferred.length ? `

미확정 정책

` : ''}

사용량 경고 ${p.warnLevels.join('·')}% · 승인 방식: 운영자 수동 승인 · 적용 ${esc(p.effectiveFrom.slice(0, 10))}

`).join('')}
` + `

도메인 등록

${d.domainRegistration.enabled ? `

등록기관(${esc(d.domainRegistration.registrar || '')})을 통해 도메인을 검색·등록할 수 있습니다.

` : `

${esc(d.domainRegistration.note)}

`}
`; } catch (e) { aw.state(el, 'failed', e.message, { retry: load }); } } load(); })();