// @requirements REQ-EU-ORDER-CONFIRMATION // @requirements REQ-PRODUCT-ORDER-CONFIRMATION REQ-PRODUCT-DEMO-WORKSPACE // Synthetic host wiring. It sends no messages and creates no real contracts or payments. import {archivePaidOrderReview,activatePaidOrderReview,admitPaidOrder,paidOrderCheckoutRef} from 'notabenda-cf/orders'; import {preparePaidOrderConfirmation,claimPaidOrderConfirmation,settlePaidOrderConfirmation} from 'notabenda-cf/order-confirmations'; import {normalizePaidOrderReview,formatPaidOrderMoney} from 'notabenda/orders'; import {canonicalJson,sha256} from '../packages/notabenda-cf/dist/history.js'; import {orderDemoSite,orderDemoScope} from './order-demo.mjs'; const samples=[{id:'one',name:'Alex Morgan',reference:'JN-1042',at:'2026-10-17T09:35:00.000Z',status:'accepted'},{id:'two',name:'Casey Reed',reference:'JN-1043',at:'2026-10-18T11:10:00.000Z',status:'uncertain'},{id:'three',name:'Rowan Ellis',reference:'JN-1044',at:'2026-10-19T08:20:00.000Z',status:'pending'}]; export async function seedOrderConfirmations(storage,data){ const t=data.paidOrders.conditional,marker='demo/order-confirmations-v1/'+t.definition.definitionId;if(await storage.get(marker))return; for(const sample of samples)await storage.transaction(async tx=>{ const store={get:key=>tx.get(key),put:(key,value)=>tx.put(key,value),list:options=>tx.list(options),transaction:callback=>callback(tx)}; const context={siteId:orderDemoSite,scopeId:orderDemoScope,checkoutId:'seed-confirmation-'+sample.id+'-'+t.definition.definitionId,allowPreview:true,now:()=>new Date(sample.at)},ref=await paidOrderCheckoutRef(context),digest=await sha256('seed-confirmation-request-'+ref),requestId=`${digest.slice(0,8)}-${digest.slice(8,12)}-4${digest.slice(13,16)}-8${digest.slice(17,20)}-${digest.slice(20,32)}`,quote={quoteId:'seed-'+sample.reference,revision:'one',contextRef:ref,definitionId:t.definition.definitionId,issuedAt:sample.at,expiresAt:new Date(Date.parse(sample.at)+900000).toISOString(),lines:t.lines,pricing:t.pricing},content={schemaVersion:1,kind:'paid-order-review',definition:t.definition,quote},review=normalizePaidOrderReview({...content,reviewId:await sha256(canonicalJson(content))},{allowPreview:true}); if(await store.get('demo/order-confirmation-seeded/'+ref))return; await archivePaidOrderReview(store,review,context);await activatePaidOrderReview(store,{reviewId:review.reviewId,expectedRevision:0},context);const request={schemaVersion:1,requestId,reviewId:review.reviewId,definitionId:t.definition.definitionId,quoteId:quote.quoteId,quoteRevision:quote.revision,contextRef:ref};await admitPaidOrder(store,request,context,{hostPrefix:'demo/order-confirmation-host/',async decide(){return {status:'admit',writes:[]};}}); const payment=quote.pricing.payments[0],amount=payment.amount.kind==='fixed'?formatPaidOrderMoney(payment.amount.amountMinor,quote.pricing,'en'):payment.amount.method+' '+payment.amount.reason,body=`CONTRACT CONFIRMATION ${sample.reference}\n\nPrepared for ${sample.name}\nIssued ${sample.at}\n\nJuniper Works\n18 Orchard Lane, Example Town, EX1 2AB\nPhone +44 20 7946 0958 · support@example.test\n\nYour order\n${t.definition.items.map(i=>i.name+'\n'+i.characteristics.join('\n')).join('\n\n')}\n\nPrice and payment\n${payment.label}: ${amount}\n${quote.pricing.taxAndChargesNotice}\n${payment.due.kind==='conditional'?payment.due.condition:payment.due.kind==='now'?'Payable now.':'See the retained payment schedule.'}\nNo other charge or renewal is agreed in this sample contract.\n\nPerformance\nWe will contact you to arrange the appointment. No work begins before your applicable withdrawal period ends unless a separate reviewed request is captured.\n\nDuration and ending\n${t.definition.items.map(i=>Object.values(i.commitment).join('\n')).join('\n')}\n\nWithdrawal\nYou may withdraw from this sample service contract within 14 days of its conclusion by an unequivocal statement to support@example.test or the postal address above. Use the attached form if convenient; it is optional. Refunds use the original payment method. The host must review actual eligibility, dates and exceptions before using this wording.\n\nComplaints\nContact support@example.test at the address above. No separate commercial guarantee applies to this inspection service.\n\nEnclosures\norder-review.txt — the exact item, commitment and conditional payment information\nwithdrawal-form.txt — model declaration for this example\n\nThis is draft demonstration content, not a real contract or a reviewed legal template.\n`; await preparePaidOrderConfirmation(store,{request,contract:{reference:sample.reference,concludedAt:sample.at},addressee:{name:sample.name,recipientRef:'seed-person-'+sample.id,destinationRef:'seed-contact-'+sample.id,destinationVersion:'one'},issuedAt:sample.at,locale:'en',reviewStatus:'draft',coverage:{selfContained:true,preContractInformation:'included-in-files',digitalContent:{status:'not-applicable',reason:'Inspection service with no digital-content supply'}},files:[{id:'customer-copy',filename:'confirmation.txt',mediaType:'text/plain',role:'confirmation',bytes:new TextEncoder().encode(body)},{id:'review',filename:'order-review.txt',mediaType:'text/plain',role:'attachment',bytes:new TextEncoder().encode(canonicalJson(review))},{id:'withdrawal',filename:'withdrawal-form.txt',mediaType:'text/plain',role:'attachment',bytes:new TextEncoder().encode('To Juniper Works, 18 Orchard Lane, Example Town, EX1 2AB, support@example.test\nI hereby give notice that I withdraw from my contract for the following service:\nOrdered on:\nConsumer name:\nConsumer address:\nDate:\nSignature (only if submitted on paper):\n')}]},context); const state=await store.get('demo/order-confirmation-seeded/'+ref);if(!state&&sample.status!=='pending'){const lease=await claimPaidOrderConfirmation(store,context);if(lease)await settlePaidOrderConfirmation(store,lease,sample.status==='accepted'?{status:'accepted',providerRef:'demo-provider-'+sample.reference}:{status:'uncertain'},context);}await store.put('demo/order-confirmation-seeded/'+ref,true); }); await storage.put(marker,true); }