// Generated from packages/notabenda/src/paid-order.ts by scripts/sync-order-policy.mjs. // @requirements REQ-EU-ORDER-ACTION REQ-EU-GUARANTEE-LABEL REQ-PRODUCT-A11Y REQ-PRODUCT-MOBILE import {normalizePaidOrderReview,formatPaidOrderMoney} from './order-policy.js'; import type {PaidOrderReview,PaidOrderAmount,PaidOrderWording} from './order-policy.js'; import {renderDurabilityGuaranteeLabel} from './order-guarantee-label.js'; export {normalizePaidOrderDefinition,normalizePaidOrderQuote,normalizePaidOrderReview,copyPaidOrderData,formatPaidOrderMoney,paidOrderEnglishWording,paidOrderHash,paidOrderMinor} from './order-policy.js'; export type {PaidOrderDefinition,PaidOrderQuote,PaidOrderReview,PaidOrderAmount,PaidOrderItem,PaidOrderGuarantee,PaidOrderPayment,PaidOrderWording} from './order-policy.js'; export interface PaidOrderRenderOptions {idPrefix:string;allowPreview?:boolean;headingLevel?:2|3} const e=(v:string)=>v.replace(/[&<>"']/gu,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]!)); function amount(value:PaidOrderAmount,review:PaidOrderReview,w:PaidOrderWording):string { if(value.kind==='fixed')return `${e(formatPaidOrderMoney(value.amountMinor,review.quote.pricing,review.definition.locale))}`; return `

${e(w.calculated)}

${e(w.method)}
${e(value.method)}
${e(w.reason)}
${e(value.reason)}
`; } /** Static final-review information only. No order submission, terms acceptance, payment execution or confirmation is implied. */ export function renderPaidOrderReview(input:unknown,options:PaidOrderRenderOptions):string { if(!options||!/^[a-z][a-z0-9-]{0,89}$/u.test(options.idPrefix)||options.headingLevel!==undefined&&![2,3].includes(options.headingLevel))throw Error('Use a unique lowercase paid-order prefix and heading level 2–3 (prefix at most 90 characters).'); const review=normalizePaidOrderReview(input,{allowPreview:options.allowPreview===true}),{definition:d,quote:q}=review,w=d.wording,id=options.idPrefix,level=options.headingLevel??2,h='h'+level,section='h'+(level+1),sub='h'+(level+2); const items=q.lines.map((line,index)=>{ const item=d.items.find(item=>item.id===line.itemId)!,guarantee=item.guarantee; return `
<${sub}>${e(item.name)}

${e(w.quantity)} ${line.quantity}

${e(w.duration)}
${e(item.commitment.duration)}
${e(w.termination)}
${e(item.commitment.termination)}
${e(w.minimum)}
${e(item.commitment.minimum)}
${guarantee?.status==='label-provided'?renderDurabilityGuaranteeLabel(guarantee.label,{idPrefix:id+'-label-'+index,headingLevel:(level+3) as 5|6,allowPreview:options.allowPreview===true}):guarantee?`

${e(w.guarantee)}

${e(guarantee.disclosure)}

`:''}
`; }).join(''); const payments=q.pricing.payments.map(payment=>`
<${sub}>${e(payment.label)}${amount(payment.amount,review,w)}

${payment.lineIds.map(lineId=>e(d.items.find(i=>i.id===lineId)!.name)).join(' · ')}

${e(payment.due.kind==='conditional'?w.condition:w.due)}
${payment.due.kind==='now'?e(w.dueNow):e(payment.due.kind==='later'?payment.due.when:payment.due.condition)}
${e(payment.recurrence.kind==='once'?w.frequency:w.period)}
${payment.recurrence.kind==='once'?e(w.once):e(payment.recurrence.period)}
${payment.recurrence.kind==='recurring'?`
${e(w.cycles)}
${payment.recurrence.cycles===null?e(w.unbounded):payment.recurrence.cycles}
${e(w.monthly)}
${amount(payment.recurrence.monthlyCost,review,w)}
${e(w.changes)}
${e(payment.recurrence.changes)}
`:''}
`).join(''); return `
<${h} id="${id}-title">${e(w.title)}${d.reviewStatus==='draft'?`

${e(w.draft)}

`:''}
<${section} id="${id}-items">${e(w.items)}${items}
<${section} id="${id}-prices">${e(w.prices)}${payments}
<${sub}>${e(w.taxes)}

${e(q.pricing.taxAndChargesNotice)}

${e(w.totalPrice)}

${amount(q.pricing.totalPrice,review,w)}

${e(w.dueNow)}

${amount(q.pricing.dueNow,review,w)}
${d.documents.length?``:''}
`; }