총무랩 인테리어 견적 비교기는 두 견적서의 항목별 금액을 입력하면 차액과 절감률을 자동 계산하여 최적 견적을 선택하는 데 도움을 줍니다.
견적서 A
📄
견적서 A 업로드
클릭하거나 파일을 드래그하세요
XLSXXLSPDF
견적서 B
📄
견적서 B 업로드
클릭하거나 파일을 드래그하세요
XLSXXLSPDF
🏢 공사 면적
평
평단가 계산에 사용 (선택사항)
견적서 항목을 분석 중입니다
잠시만 기다려 주세요
항목 추출 중…
| 공사 항목 |
수량 |
단가 A |
금액 A |
수량 |
단가 B |
금액 B |
차이 (A−B) |
🔍 누락 항목 분석
🏗️
견적서 비교를 제대로 못 해서 2천만원 더 썼어요
"한 업체는 부가세 별도, 다른 업체는 철거비 누락이었어요. 기준을 통일해서 비교했다면 더 저렴한 업체를 선택했을 텐데요."
— 총무팀장, 사무실 이전 담당
📋
추가 공사가 계속 나와서 예산이 150% 초과됐어요
"사전에 범위를 명확히 했더라면 달랐을 텐데요."
— 경영지원팀, 중견기업
✅
이 계산기로 견적서 불일치를 바로 발견했어요
"전기 공사비 누락을 발견하고 재견적 받아서 500만원 절약했어요."
— 구매팀 과장
인테리어 공사 견적 완전 가이드
사무실 인테리어 견적 비교·계약 실무
사무실 인테리어는 총무팀이 처리하는 단일 프로젝트 중 가장 큰 예산이 투입됩니다. 3개 이상 업체 견적 비교와 공사 범위 명확화가 핵심입니다.
1 공사 유형별 평균 단가 (2026년 기준)
| 공사 유형 | 평균 단가(평당) | 비고 |
|---|
| 경량칸막이 설치 | 15~25만원 | 석고보드 기준 |
| 도배·장판 | 5~12만원 | 벽지 등급별 차이 |
| 타일 시공 | 15~30만원 | 재료비 포함 |
| 전기·조명 | 10~20만원 | 분전반 교체 별도 |
| 냉난방 설치 | 20~40만원 | 시스템에어컨 기준 |
2 견적서 검토 핵심 항목
공사 범위 명확화
벽체·바닥·천장·전기·조명·냉난방·가구 각각 포함 여부 명시. 추가 공사비 분쟁 예방
자재 등급 명시
"도배"가 아닌 "실크도배 LG지인 XX제품" 수준으로 명시 요구. 등급 차이로 단가 2배 차이 가능
하자보수 조건
공사 완료 후 1년 이상 하자보수 보증 조항 필수. 업체 폐업 대비 보증보험 요구
3 계약 체결 시 주의사항
가. 계약금 — 총 공사비의 30% 이하. 잔금은 완공 후 지급
나. 공사 일정 — 착공일·완공일 계약서 명시, 지연 시 패널티 조항
다. 폐기물 처리 — 처리 책임과 비용 부담 주체 명확화
라. 층간소음 — 야간·주말 공사 금지 조항 확인
4 예산 절감 팁
⚠️ 비수기(1~2월, 7~8월) 계약 시 10~20% 절감 가능. 기존 자재(파티션·가구) 재활용 범위를 먼저 확인하고 견적을 요청하면 불필요한 교체 비용을 줄일 수 있습니다.
FAQ 자주 묻는 질문
Q. 인테리어 계약금은 얼마가 적당한가요?
A. 총 공사비의 30% 이하가 적당합니다.
TIP 실무 활용 팁
- 비수기(1~2월) 계약으로 10~20% 절감이 가능합니다.
관련 키워드: 인테리어 공사 견적 완전 가이드 사무실 인테리어 견적 비교·계약 실무
`;
} else prW.innerHTML='';
const wS=document.getElementById('warnSection');
if(warnings.length){
const icon={red:'🔴',orange:'🟠',yellow:'🟡',ok:'✅',info:'ℹ️'};
wS.innerHTML=`
⚠️ 항목별 검토 사항
${warnings.map(w=>`
${icon[w.level]||'⚠️'}
[${esc(w.target)}] ${esc(w.title)}
${w.badge?`${esc(w.badge)}`:''}
${esc(w.body)}
`).join('')}
`;
} else wS.innerHTML='';
renderTable(matched,'all');
const oA=matched.filter(m=>m.itemA&&!m.itemB), oB=matched.filter(m=>!m.itemA&&m.itemB);
document.getElementById('missingCols').innerHTML=`
B에 없는 항목 (A에만)${oA.length}개
${oA.length?oA.map(m=>`
${esc(m.name)}
${fmtWon(m.itemA.amount)}
`).join(''):'
없음
'}
A에 없는 항목 (B에만)${oB.length}개
${oB.length?oB.map(m=>`
${esc(m.name)}
${fmtWon(m.itemB.amount)}
`).join(''):'
없음
'}
`;
document.getElementById('btnAnalyze').disabled=false;
setTimeout(()=>rs.scrollIntoView({behavior:'smooth',block:'start'}),80);
}
function renderTable(matched,filter){
tableFilter=filter;
let rows=matched;
if(filter==='diff') rows=matched.filter(m=>m.itemA&&m.itemB&&m.itemA.amount!==m.itemB.amount);
if(filter==='missing') rows=matched.filter(m=>!m.itemA||!m.itemB);
const groups={};
rows.forEach(m=>{ const c=m.category||'기타'; if(!groups[c]) groups[c]=[]; groups[c].push(m); });
let html='',tA=0,tB=0;
Object.entries(groups).forEach(([cat,items])=>{
html+=`
| 📁 ${esc(cat)} |
`;
items.forEach(m=>{
const a=m.itemA,b=m.itemB;
const aA=a?.amount||0,aB=b?.amount||0;
tA+=aA; tB+=aB;
const d=aA-aB, both=a&&b;
const ac=both?(aA
aB?'ac-pricey':'ac-same'):'ac-miss';
const bc=both?(aBaA?'ac-pricey':'ac-same'):'ac-miss';
const dc=d>0?'dp':d<0?'dn':'dz';
html+=`
|
${esc(m.name)}
${!a?'A 누락':''}${!b?'B 누락':''}
|
${a?`${fmtN(a.qty)} ${esc(a.unit)}`:'-'} |
${a?fmtWon(a.unitPrice):'-'} |
${a?fmtWon(aA):'누락'} |
${b?`${fmtN(b.qty)} ${esc(b.unit)}`:'-'} |
${b?fmtWon(b.unitPrice):'-'} |
${b?fmtWon(aB):'누락'} |
${d===0?'—':(d>0?'+':'')+fmtWon(d)} |
`;
});
});
document.getElementById('compareBody').innerHTML=html||
'| 해당 항목 없음 |
';
const fd=tA-tB;
document.getElementById('compareFoot').innerHTML=`
| 합 계 |
| | ${fmtWon(tA)} |
| | ${fmtWon(tB)} |
${fd===0?'동일':(fd>0?'+':'')+fmtWon(fd)} |
`;
}
function filterTable(mode,el){
document.querySelectorAll('.cf-chip').forEach(c=>c.classList.remove('active'));
el.classList.add('active');
renderTable(allMatched,mode);
}
/* ── 유틸 ── */
function toNum(v){ return parseFloat(String(v||'').replace(/[,\s]/g,''))||0; }
function fmtWon(n){ return Number(n||0).toLocaleString('ko-KR')+'원'; }
function fmtN(n) { return Number(n||0).toLocaleString('ko-KR'); }
function esc(s) { return String(s||'').replace(/&/g,'&').replace(//g,'>'); }
function sleep(ms){ return new Promise(r=>setTimeout(r,ms)); }