🏗 Expandable House Quotation
HUAYING HOUSE · Container House Pricing · Select options & auto-calculate
m²
(Floor area x unit price x qty for area-based items)
{"@context":"https://schema.org","@type":"Product","brand":{"@type":"Brand","name":"HUAYING"},"manufacturer":{"@type":"Organization","name":"Huaying Integrated House Co., Ltd."},"offers":{"@type":"Offer","priceCurrency":"CNY","availability":"https://schema.org/InStock"},"name":"Expandable Container House Quotation - HUAYING HOUSE","description":"HUAYING HOUSE expandable container house online quotation system. Customize foundation, flooring, roofing, doors & windows, plumbing, kitchen modules. Get instant pricing."}
const ITEM_IMAGES={};
const DATA=[{cat:"Foundation - Single",items:[{name:"Standard Double-Wing",desc:"Double-wing ext, 75mm EPS wall, sloped roof both sides",price:700},{name:"Standard Single-Wing",desc:"Single-wing ext, 75mm EPS wall, sloped roof one side",price:915},{name:"DN700 Narrow",price:964},{name:"100W Insulated",desc:"100mm EPS insulation, billed by floor area",price:854},{name:"100PUW Insulated",desc:"100mm PU insulation, billed by floor area",price:1010},{name:"75PUW Insulated",price:886},{name:"High Ceiling 2.8m",desc:"Ext height max 2.99m / Int height 2.8m",price:830,unit:"set",fixedPrice:!0},{name:"Flat Roof Double-Wing",price:750},{name:"Flat Roof Single-Wing",price:990},{name:"Flat Roof Double-WingInt. Height2.4",price:790},{name:"AUS N2 Flat Roof Double-Wing 2.4m",price:880},{name:"AUS N2 Flat Roof High (Open Top)",price:1000},{name:"AUS N3 20ft Flat Roof Double-Wing 2.4m",price:1326},],sel:"single",baseArea:!0},{cat:"Flooring - Single",items:[{name:"Vinyl Flooring 2.0mm",price:78},{name:"Wood Flooring",price:93},{name:"Locking Flooring (SPC)",desc:"SPC flooring 20ft 3mm",price:93},],sel:"single",baseArea:!0},{cat:"Exterior Wall - Single",items:[{name:"Metal Embossed Panel",desc:"Metal Embossed Panel-10ft",price:80},{name:"Metal Embossed Panel+Stone Paint",desc:"Metal Embossed Panel-20ft-Stone Paint",price:127},],sel:"single",baseArea:!0},{cat:"Interior Wall - Single",items:[{name:"Interior Wall Panel",price:156},],sel:"single",baseArea:!0},{cat:"Interior Trim - Multi",sel:"multi",baseArea:!0,items:[{name:"Skirting Board",desc:"PVCSkirting Board",price:25},]},{cat:"Additional Roof - Single",sel:"single",baseArea:!0,items:[{name:"Pitch Roof 50mm",price:175},{name:"Pitch Roof 75mm",price:186},{name:"AUS N2 Standard Pitch Roof",desc:"Incl. roof (75mm EPS), base, railing, WPC deck",price:233},{name:"AUS N3 Standard Pitch Roof",desc:"Incl. roof (75mm EPS), base, railing, WPC deck",price:326},]},{cat:"Electrical - Multi",sel:"multi",baseArea:!0,items:[{name:"UL/SAA/CE Standard Electrical",desc:"Sockets, switches, lights, wiring, intl standard compliant",price:64},{name:"Premium Wiring",price:16},]},{cat:"Performance Upgrade - Multi",sel:"multi",baseArea:!0,items:[{name:"Roof Extra Steel Sheet",price:40},{name:"Floor Insulation",price:100},{name:"Roof Waterproof Coating",price:80},]},{cat:"Drainage - Multi",sel:"multi",baseArea:!0,items:[{name:"Roof Drainage System",desc:"Rainwater gutter + downpipe 20ft",price:25,unit:"m"},]},
{cat:"Room Partition - Single",sel:"single",items:[{name:"Standard Partition",desc:"One room, 50mm EPS",price:1500,unit:"room"},{name:"Premium Partition",desc:"One room, 50mm+ integrated wall panel",price:2000,unit:"room"},]},{cat:"Doors & Windows - Multi",sel:"multi",items:[{name:"Aluminum Swing Door 1890x2230",price:2300},{name:"Aluminum Sliding Door 1890x2230",price:2500},{name:"Ti-Mg Swing Door 1890x2230",price:2200},{name:"Ti-Mg Sliding Door 1890x2230",price:2200},{name:"Ti-Mg Sliding Door 1890x2230 (Self-Seal)",price:2400},{name:"KFC Style Door 1890x2230",price:2500},{name:"Single KFC Door 900x2230",price:1750},{name:"Single Steel Door 980x1980",price:350},{name:"Double Steel Door 1740x1970",price:1200},{name:"Security Door 1890x2230",price:2500},{name:"PVC Double-Glazed Sliding Window 930x930",price:200},{name:"Aluminum Dbl-Glazed Window + Screen 930x930",desc:"Awning or casement",price:550},{name:"Aluminum Dbl-Glazed Sliding Window 930x930",price:600},{name:"Aluminum Casement Window 930x930",price:630},{name:"Alloy Dbl-Glazed Sliding Window w/ Screen",price:300},{name:"Stainless Steel Mesh Screen",price:120},{name:"Custom Aluminum Window (per m2)",price:550,unit:"m²"},]},{cat:"Bathroom Module - Multi",sel:"multi",items:[{name:"Wet-Dry Bathroom 1330x2200",price:6900},{name:"Bathroom w/ Washer 1330x2800",price:8600},{name:"Bathroom w/ Cabinet 1330x2800",price:9200},]},{cat:"Plumbing",sel:"single",items:[{name:"AUS Standard Plumbing",price:1200,unit:"set"},]},
{cat:"Kitchen Module - Multi",sel:"multi",lenBased:!0,items:[{name:"Laminate Cabinet - SS Sink",desc:"Type1, laminate door, SS/quartz countertop",price:675},{name:"Laminate Cabinet - Black Sink",desc:"Type1 + black handmade sink",price:703},{name:"Laminate Wall Cabinet",price:450},{name:"PET Cabinet",desc:"Type4, PET door, quartz countertop recommended",price:880},{name:"PET Wall Cabinet",price:650},]},
{cat:"Pergola - Multi",sel:"multi",selfArea:!0,items:[{name:"Pergola Full Set (WPC Deck+Rail+Roof)",price:600},{name:"Pergola - WPC Deck Terrace",price:230},{name:"Pergola - Railing",price:110},{name:"Pergola - Roof",price:170},{name:"AUS N2 Standard Pergola",desc:"Incl. roof (75mm EPS), base, railing, WPC deck",price:650},{name:"AUS N3 Standard Pergola",desc:"Incl. roof (75mm EPS), base, railing, WPC deck",price:980},]},{cat:"Custom Wall - Multi",sel:"multi",selfArea:!0,items:[{name:"Glass Curtain Wall",desc:"Tempered coated glass, aluminum alloy frame",price:435},]},];
const selections={};const qtyInputs={};
function render(){const container=document.getElementById('categories');let html='';DATA.forEach((cat,ci)=>{const label=cat.cat.replace(/-Single$/,'').replace(/-Multi$/,'');html+=`
cat.items.forEach((item,ii)=>{const key=`${ci}_${ii}`;const selState=selections[ci]||{};const isSelected=!!selState[ii];const qty=qtyInputs[key]!==undefined?qtyInputs[key]:1;html+=`
`;if(item.desc)html+=`
`;html+=`
`;
html+=`
`;html+=`
`});html+=`
`});container.innerHTML=html;recalc()}
function toggleItem(ci,ii){const cat=DATA[ci];if(!selections[ci])selections[ci]={};const sel=selections[ci];if(cat.sel==='single'){if(sel[ii]){delete sel[ii]}else{selections[ci]={};selections[ci][ii]=1}}else{if(sel[ii]){delete sel[ii]}else{sel[ii]=1}} recalc();render()}
function updateQty(ci,ii,el){const v=parseFloat(el.value)||1;if(v<0.1)el.value=0.1;if(v>9999)el.value=9999;qtyInputs[`${ci}_${ii}`]=parseFloat(el.value);if(selections[ci]&&selections[ci][ii]){selections[ci][ii]=parseFloat(el.value)} recalc()}
function recalc(){const area=parseFloat(document.getElementById('floorArea').value)||0;let total=0;DATA.forEach((cat,ci)=>{if(!selections[ci])return;cat.items.forEach((item,ii)=>{const qty=Math.max(0.5,(selections[ci][ii]||0));if(!selections[ci][ii])return;if(cat.baseArea){if(item.fixedPrice){total+=item.price*qty}else{total+=area*item.price*qty}}else if(cat.lenBased){total+=item.price*qty}else if(cat.selfArea){total+=item.price*qty}else{total+=item.price*qty}})});document.getElementById('totalDisplay').textContent='¥'+Math.round(total).toLocaleString()}
function showQuote(){const area=parseFloat(document.getElementById('floorArea').value)||0;const rows=[];let total=0;DATA.forEach((cat,ci)=>{if(!selections[ci])return;cat.items.forEach((item,ii)=>{if(!selections[ci][ii])return;const qty=Math.max(0.5,selections[ci][ii]);let amount=0,qtyLabel=qty,unitLabel='';if(cat.baseArea){if(item.fixedPrice){amount=item.price*qty;unitLabel='set'}else{qtyLabel=area;amount=area*item.price*qty;unitLabel='m²'}}else if(cat.lenBased){amount=item.price*qty;unitLabel='m'}else if(cat.selfArea){amount=item.price*qty;unitLabel='m²'}else{amount=item.price*qty;unitLabel='set'} total+=amount;rows.push({cat:cat.cat.replace(/-Single$/,'').replace(/-Multi$/,''),name:item.name,qty:qtyLabel,unit:unitLabel,price:item.price,amount})})});const tbody=document.getElementById('modalBody');let html='';rows.forEach(r=>{html+=`
`});html+=`
`;tbody.innerHTML=html;document.getElementById('quoteSub').textContent='Floor Area: '+area+'m² · Expandable House';document.getElementById('modalTotal').textContent='¥'+Math.round(total).toLocaleString();document.getElementById('modal').classList.add('show')}
function closeModal(){document.getElementById('modal').classList.remove('show')}
function resetAll(){Object.keys(selections).forEach(k=>delete selections[k]);Object.keys(qtyInputs).forEach(k=>delete qtyInputs[k]);render()}
function getSelectedRows(){const area=parseFloat(document.getElementById('floorArea').value)||0;const rows=[];DATA.forEach((cat,ci)=>{if(!selections[ci])return;cat.items.forEach((item,ii)=>{if(!selections[ci][ii])return;const qty=Math.max(0.5,selections[ci][ii]);let amount=0,qtyLabel=qty,unitLabel='';if(cat.baseArea){if(item.fixedPrice){amount=item.price*qty;unitLabel='set'}else{qtyLabel=area;amount=area*item.price*qty;unitLabel='m²'}}else if(cat.lenBased){amount=item.price*qty;unitLabel='m'}else if(cat.selfArea){amount=item.price*qty;unitLabel='m²'}else{amount=item.price*qty;unitLabel='set'} rows.push({cat:cat.cat.replace(/-Single$/,'').replace(/-Multi$/,''),name:item.name,qty:qtyLabel,unit:unitLabel,price:item.price,amount})})});return rows}
function composeEmail(){const rows=getSelectedRows();const area=parseFloat(document.getElementById('floorArea').value)||0;let total=rows.reduce((s,r)=>s+r.amount,0);let sub='Expandable House Quotation Confirmation - HUAYING HOUSE';let body=`Dear Customer,
Thank you for your interest in our Expandable House. Please find below the configuration details based on your selected options. Kindly review and confirm by replying to this email.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ QUOTATION SUMMARY ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
House Size: ${area}m²
`;
const grouped={};rows.forEach(r=>{if(!grouped[r.cat])grouped[r.cat]=[];grouped[r.cat].push(r)});
for(const[cat,items]of Object.entries(grouped)){body+=`◆ ${cat}\n`;items.forEach(r=>{body+=` ☐ ${r.name} × ${r.qty} ${r.unit} @ ¥${Math.round(r.price).toLocaleString()}/${r.unit} = ¥${Math.round(r.amount).toLocaleString()}\n`});body+='\n'}
body+=`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;body+=`Estimated Total: ¥${Math.round(total).toLocaleString()}\n`;body+=`Terms: EXW (Ex-Works)\n`;body+=`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n`;body+=`Please confirm your selections by ticking the checkboxes above and replying to this email. You may also modify quantities or substitute options as needed.\n\n`;body+=`If you have any questions, please do not hesitate to contact us.\n\n`;body+=`Best regards,\n`;body+=`HUAYING HOUSE International Sales\n`;body+=`E: trade@mhehy.com\n`;body+=`W: www.huayinghouse.com\n`;
const encodedBody=encodeURIComponent(body);const encodedSub=encodeURIComponent(sub);window.location.href=`mailto:?subject=${encodedSub}&body=${encodedBody}`}
function sendQuizEmail(){const area=parseFloat(document.getElementById('floorArea').value)||20;const rows=[];let total=0;
DATA.forEach((cat,ci)=>{if(!selections[ci])return;cat.items.forEach((item,ii)=>{if(!selections[ci][ii])return;const qty=Math.max(0.5,selections[ci][ii]);let amount=0,qtyLabel=qty,unitLabel='';if(cat.baseArea){if(item.fixedPrice){amount=item.price*qty;unitLabel='set'}else{qtyLabel=area;amount=area*item.price*qty;unitLabel='m²'}}else if(cat.lenBased){amount=item.price*qty;unitLabel='m'}else if(cat.selfArea){amount=item.price*qty;unitLabel='m²'}else{amount=item.price*qty;unitLabel='set'} total+=amount;rows.push({cat:cat.cat.replace(/-Single$/,'').replace(/-Multi$/,''),name:item.name,qty:qtyLabel,unit:unitLabel,price:item.price,amount})})});
const grouped={};rows.forEach(r=>{if(!grouped[r.cat])grouped[r.cat]=[];grouped[r.cat].push(r)});
let body=`QUOTATION QUIZ - Expandable House\n`;body+=`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;body+=`Please reply to this email with your choices:\n`;body+=` for "☐" items → change "☐" to "☑" for selection, or leave "☐" to skip\n`;body+=` quantities in ( ) → replace with your desired number\n`;body+=` write "OK" at bottom to confirm the entire selection\n`;body+=`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n`;body+=`House Size: ${area} m²\n\n`;
for(const[cat,items]of Object.entries(grouped)){body+=`── ${cat} ───────────────────────────────\n`;items.forEach(r=>{body+=` ☐ [qty:${r.qty}] ${r.name} @ ¥${Math.round(r.price).toLocaleString()}/${r.unit}\n`});body+='\n'}
body+=`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;body+=`Estimated Total: ¥${Math.round(total).toLocaleString()}\n`;body+=`Terms: EXW\n`;body+=`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n`;body+=`Please make your selections above and reply. Thank you!\n\n`;body+=`HUAYING HOUSE\n`;body+=`E: trade@mhehy.com\n`;body+=`W: www.huayinghouse.com\n`;
let htmlBody=`
📋 Expandable House Quotation Quiz
`;htmlBody+=`
HUAYING HOUSE · Please reply with your choices
`;
htmlBody+=`
`;htmlBody+=`✏️ How to reply: Change ☐ to ☑ for items you want.
`;htmlBody+=`Replace quantities in ( ) with your desired number.
`;htmlBody+=`Write "OK" at the bottom to confirm the whole selection.
`;
htmlBody+=`
`;
for(const[cat,items]of Object.entries(grouped)){htmlBody+=`
${cat}
`;items.forEach(r=>{htmlBody+=`
`})}
htmlBody+=`
`;htmlBody+=`
Terms: EXW (Ex-Works)
`;
htmlBody+=`
HUAYING HOUSE · trade@mhehy.com · www.huayinghouse.com
`;
const sub=encodeURIComponent('QUOTATION QUIZ - Expandable House Configuration - HUAYING HOUSE');const bodyText=body+'\n\n---\n(HTML version also attached in this email)';window.location.href=`mailto:trade@mhehy.com?subject=${sub}&body=${encodeURIComponent(bodyText)}`}
function exportDOCX(){const rows=getSelectedRows();const area=parseFloat(document.getElementById('floorArea').value)||0;let total=rows.reduce((s,r)=>s+r.amount,0);
const{Document,Packer,Paragraph,TextRun,Table,TableRow,TableCell,Header,Footer,AlignmentType,BorderStyle,WidthType,ShadingType,PageNumber}=window.docx;
const b={style:BorderStyle.SINGLE,size:1,color:'CCCCCC'},brds={top:b,bottom:b,left:b,right:b};const mg={top:60,bottom:60,left:100,right:100};function c(text,opts={}){return new TableCell({borders:brds,width:{size:opts.w||1500,type:WidthType.DXA},margins:mg,verticalAlign:'center',shading:opts.bg?{fill:opts.bg,type:ShadingType.CLEAR}:undefined,children:[new Paragraph({alignment:opts.align||AlignmentType.LEFT,children:[new TextRun({text,font:'Arial',size:opts.s||20,bold:!!opts.b,color:opts.c||'333333'})]})]})} function hdr(t,w){return c(t,{w,b:!0,bg:'2E75B6',c:'FFFFFF',align:AlignmentType.CENTER})}
const itemRows=rows.map((r,i)=>{const bg=i%2===0?'F5F7FA':undefined;return new TableRow({children:[c(r.cat,{w:1400,bg}),c(r.name,{w:2400,bg}),c(String(r.qty),{w:600,bg,align:AlignmentType.CENTER}),c(r.unit,{w:500,bg,align:AlignmentType.CENTER}),c('¥'+Math.round(r.price).toLocaleString(),{w:900,bg,align:AlignmentType.RIGHT}),c('¥'+Math.round(r.amount).toLocaleString(),{w:900,bg,align:AlignmentType.RIGHT}),]})});
const stax=Math.round(total*0.13);const gt=total+stax;function sRow(lbl,amt,last){return new TableRow({children:[c('',{w:1400,bg:'2E75B6'}),c('',{w:2400,bg:'2E75B6'}),c('',{w:600,bg:'2E75B6'}),c('',{w:500,bg:'2E75B6'}),c(lbl,{w:900,bg:'2E75B6',align:AlignmentType.CENTER,b:last,c:last?'FFFFFF':'333333',s:last?22:20}),c('¥'+Math.round(amt).toLocaleString(),{w:900,bg:'2E75B6',align:AlignmentType.RIGHT,b:last,c:last?'FFFFFF':'333333',s:last?22:20}),]})}
const doc=new Document({styles:{default:{document:{run:{font:'Arial',size:22}}}},sections:[{properties:{page:{size:{width:12240,height:15840},margin:{top:1440,right:1440,bottom:1440,left:1440}}},headers:{default:new Header({children:[new Paragraph({alignment:AlignmentType.RIGHT,border:{bottom:{style:BorderStyle.SINGLE,size:4,color:'2E75B6',space:4}},children:[new TextRun({text:'HUAYING HOUSE · www.huayinghouse.com',font:'Arial',size:18,color:'888888',italics:!0})]})]})},footers:{default:new Footer({children:[new Paragraph({alignment:AlignmentType.CENTER,children:[new TextRun({text:'Page ',font:'Arial',size:18,color:'999999'}),new TextRun({children:[PageNumber.CURRENT],font:'Arial',size:18,color:'999999'})]})]})},children:[new Paragraph({alignment:AlignmentType.CENTER,spacing:{after:40},children:[new TextRun({text:'HUAYING HOUSE',font:'Arial',size:48,bold:!0,color:'2E75B6'})]}),new Paragraph({alignment:AlignmentType.CENTER,spacing:{after:20},children:[new TextRun({text:'Expandable House Quotation',font:'Arial',size:24,color:'666666'})]}),new Paragraph({alignment:AlignmentType.CENTER,border:{bottom:{style:BorderStyle.SINGLE,size:4,color:'2E75B6',space:4}},children:[]}),new Paragraph({spacing:{before:200,after:40},children:[new TextRun({text:'Floor Area: '+area+'m²',font:'Arial',size:20,color:'444444'})]}),new Paragraph({spacing:{after:40},children:[new TextRun({text:'Quote No.: Q-'+new Date().toISOString().slice(0,10),font:'Arial',size:20,color:'444444'})]}),new Paragraph({spacing:{after:40},children:[new TextRun({text:'Date: '+new Date().toLocaleDateString('en-US'),font:'Arial',size:20,color:'444444'})]}),new Paragraph({spacing:{after:100},children:[new TextRun({text:'Terms: EXW (Ex-Works)',font:'Arial',size:20,color:'444444'})]}),
new Table({width:{size:6700,type:WidthType.DXA},columnWidths:[1400,2400,600,500,900,900],rows:[new TableRow({tableHeader:!0,children:[hdr('Category',1400),hdr('Item',2400),hdr('Qty',600),hdr('Unit',500),hdr('Unit Price',900),hdr('Amount',900)]}),...itemRows,sRow('Subtotal',total),sRow('VAT (13%)',stax),sRow('Total',gt,!0),]}),
new Paragraph({spacing:{before:300}}),new Paragraph({children:[new TextRun({text:'Notes:',font:'Arial',size:20,bold:!0})]}),new Paragraph({spacing:{after:40},children:[new TextRun({text:'1. EXW price, excl. shipping, insurance & customs',font:'Arial',size:20,color:'555555'})]}),new Paragraph({spacing:{after:40},children:[new TextRun({text:'2. Payment: 30% deposit + 70% before shipment',font:'Arial',size:20,color:'555555'})]}),new Paragraph({spacing:{after:40},children:[new TextRun({text:'3. Lead time: 15-20 working days after order confirmation',font:'Arial',size:20,color:'555555'})]}),new Paragraph({spacing:{after:40},children:[new TextRun({text:'4. Validity: 15 days',font:'Arial',size:20,color:'555555'})]}),
new Paragraph({spacing:{before:200}}),new Paragraph({children:[new TextRun({text:'HUAYING HOUSE International Sales',font:'Arial',size:20})]}),new Paragraph({children:[new TextRun({text:'E: trade@mhehy.com',font:'Arial',size:20})]}),new Paragraph({children:[new TextRun({text:'W: www.huayinghouse.com',font:'Arial',size:20})]}),]}]});
Packer.toBuffer(doc).then(buf=>{const blob=new Blob([buf],{type:'application/vnd.openxmlformats-officedocument.wordprocessingml.document'});const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='HUAYING-Expandable-Quote-'+new Date().toISOString().slice(0,10)+'.docx';a.click();URL.revokeObjectURL(a.href)})}
render();