HAPPY SOLUTION · 실무도구

부동산 자산목록

낙찰·매입·기존 보유 부동산을 소유자별로 등록하고, 주소·면적·용도·취득정보를 보기 좋게 정리합니다.

등록 현황

고객용 보기와 PDF는 선택한 소유자와 현재 검색·유형 조건에 맞는 목록입니다. 내부 메모는 제외합니다. 전체 자산목록 PDF는 필터와 관계없이 등록된 전체 물건을 출력합니다.

공유 기기에서는 임시저장 대신 작성본 파일을 사용해주세요.

불러오기는 파일을 검사한 뒤 진행 여부를 확인합니다. 현재 목록을 먼저 백업해주세요.

현재 화면의 물건만 고객용 파일에 포함합니다. 내부 메모·다른 소유자의 물건·편집용 데이터는 포함하지 않습니다.

등록한 자산목록은 정기적으로 백업해주세요. 작성본 HTML을 저장해 다시 열면 이어서 작성할 수 있습니다. 다운로드한 파일은 인터넷 없이 사용할 수 있습니다. PDF는 인쇄 화면에서 ‘PDF로 저장’을 선택합니다.

입력한 소유자명·주소 등 정보는 현재 기기에서 처리되며, 필요한 사람에게만 파일을 전달해주세요.

보유정보를 정리하는 기록도구입니다. 현재가치 평가, 권리분석, 세금계산, 투자판단을 대신하지 않습니다. 면적 환산은 1평 = 400/121㎡ 기준 참고값이며, 공동소유 물건의 면적과 취득금액은 지분을 곱하지 않은 물건 전체 기준입니다.

부동산 등록

어떻게 취득한 부동산인가요?

부동산 상세

';} function printList(all){const list=all?state.properties:visible();if(!list.length){status('출력할 부동산이 없습니다.');return;}printIds=list.map(p=>p.id);renderCustomer(list,all?'':$('ownerFilter').value);hsToolAction('pdf');window.print();printIds=null;if(document.body.classList.contains('customer-mode'))renderCustomer(state.properties.filter(p=>clientIds.includes(p.id)),$('ownerFilter').value);} $('addProperty').addEventListener('click',()=>{if(state.properties.length>=300){status('v1은 300건까지 지원합니다. 목록을 나눠 별도 파일로 보관해주세요.');return;}showForm();});$('propertyForm').addEventListener('submit',e=>{e.preventDefault();if(photoBusy){$('formError').textContent='사진 처리가 끝난 뒤 저장해주세요.';return;}try{editing.privateMemo=$('privateMemo').value;editing.owners=editing.owners.map(n=>n.slice(0,100));editing.joint=editing.joint||editing.owners.length>1;validate(editing);const at=state.properties.findIndex(p=>p.id===editing.id);if(at<0)state.properties.push(editing);else state.properties[at]=editing;$('propertyDialog').close();editing=null;hsToolAction('use');changed();render();status('등록 내용을 저장했습니다. 정기적으로 작성본을 백업해주세요.');}catch(e){$('formError').textContent=e.message;}}); $('closeDialog').addEventListener('click',closeForm);$('cancelProperty').addEventListener('click',closeForm);$('propertyDialog').addEventListener('cancel',e=>{e.preventDefault();closeForm();});$('privateMemo').addEventListener('input',()=>{if(editing)editing.privateMemo=$('privateMemo').value;});$('closeDetail').addEventListener('click',()=>$('detailDialog').close());$('editProperty').addEventListener('click',()=>{const p=state.properties.find(p=>p.id===detailsId);$('detailDialog').close();if(p)showForm(p);});$('deleteProperty').addEventListener('click',()=>{const p=state.properties.find(p=>p.id===detailsId);if(!p||!confirm((p.name||p.address)+' 물건과 기록을 삭제할까요?'))return;state.properties=state.properties.filter(v=>v.id!==p.id);$('detailDialog').close();changed();render();status('물건을 삭제했습니다.');}); $('photoFile').addEventListener('change',async()=>{const file=$('photoFile').files[0],target=editing;if(!file||!target)return;if(file.size>15*1024*1024||!['image/jpeg','image/png','image/webp'].includes(file.type)){$('formError').textContent='15MB 이하 JPEG·PNG·WebP 사진을 선택해주세요.';return;}photoBusy=true;$('saveProperty').disabled=true;try{const url=URL.createObjectURL(file),img=new Image();try{img.src=url;await img.decode();if(img.naturalWidth*img.naturalHeight>50000000)throw Error('50메가픽셀 이하 사진을 사용해주세요.');const scale=Math.min(1,960/Math.max(img.naturalWidth,img.naturalHeight)),c=document.createElement('canvas');c.width=Math.round(img.naturalWidth*scale);c.height=Math.round(img.naturalHeight*scale);c.getContext('2d').drawImage(img,0,0,c.width,c.height);let data=c.toDataURL('image/jpeg',.78);if(data.length>400000)data=c.toDataURL('image/jpeg',.55);if(data.length>400000)throw Error('사진 용량을 더 줄여 다시 선택해주세요.');target.photo=data;$('photoPreview').src=data;$('photoPreview').hidden=false;$('formError').textContent='대표사진을 파일 안에 보관합니다.';}finally{URL.revokeObjectURL(url);}}catch(e){$('formError').textContent=e.message||'이 브라우저에서 사진을 처리할 수 없습니다.';}finally{photoBusy=false;$('saveProperty').disabled=false;$('photoFile').value='';}});$('removePhoto').addEventListener('click',()=>{if(!editing||photoBusy)return;if(editing.photo&&!confirm('선택한 대표사진을 제거할까요?'))return;editing.photo='';$('photoPreview').hidden=true;$('photoPreview').removeAttribute('src');}); ['search','ownerFilter','typeFilter'].forEach(id=>$(id).addEventListener(id==='search'?'input':'change',renderList));$('viewCustomer').addEventListener('click',customerView);$('backToEditor').addEventListener('click',()=>{document.body.classList.remove('customer-mode');window.scrollTo({top:0,behavior:'auto'});});$('saveOwner').addEventListener('click',()=>{download(ownerHTML(),'부동산 자산목록_작성본.html');dirty=false;status('작성본을 저장했습니다. 개인정보가 포함되므로 필요한 사람에게만 전달해주세요.');});$('backup').addEventListener('click',()=>{download(JSON.stringify({...state,savedAt:Date.now()},null,2),'부동산 자산목록_백업.json','application/json;charset=utf-8');dirty=false;status('전체 데이터 백업을 저장했습니다. 원본 도구에서 백업 불러오기로 복원할 수 있습니다.');});$('openBackup').addEventListener('click',()=>{document.body.classList.remove('customer-mode');$('backupFile').click();});$('backupFile').addEventListener('change',async()=>{const f=$('backupFile').files[0];if(!f)return;try{if(f.size>130*1024*1024)throw Error('백업 파일이 130MB를 넘습니다.');const parsed=normalize(JSON.parse(await f.text()));if(!parsed)throw Error('부동산 자산목록 v1의 정상 백업 파일인지 확인해주세요.');if(!confirm('백업의 '+parsed.properties.length+'건으로 현재 목록을 교체할까요? 현재 목록을 먼저 백업해주세요.'))return;parsed.id=uid();parsed.savedAt=0;state=parsed;$('search').value='';$('typeFilter').value='';$('ownerFilter').value='';changed();render();status('백업에서 '+state.properties.length+'건을 불러왔습니다.');}catch(e){status(e.message||'백업을 불러올 수 없습니다.');}finally{$('backupFile').value='';}}); $('saveCustomer').addEventListener('click',()=>{download(publicHTML(),filePart($('ownerFilter').value)+'_부동산보유현황.html');status('현재 고객용 목록만 저장했습니다. 내부 메모와 편집용 전체 데이터는 제외했습니다.');});$('printCustomer').addEventListener('click',()=>printList(false));$('printPreview').addEventListener('click',()=>{printIds=clientIds;renderCustomer(state.properties.filter(p=>clientIds.includes(p.id)),$('ownerFilter').value);hsToolAction('pdf');window.print();printIds=null;});$('printAll').addEventListener('click',()=>printList(true));$('allPDF').addEventListener('click',()=>printList(true)); $('autosave').addEventListener('change',()=>{if($('autosave').checked)changed();else{try{localStorage.removeItem(STORAGE+state.id);$('storageHelp').textContent='자동저장을 끄고 현재 목록의 임시저장을 제거했습니다. 작성본 파일로 보관해주세요.';}catch{$('storageHelp').textContent='자동저장을 껐습니다. 공유 기기에서는 브라우저 저장 데이터도 확인해주세요.';}}});try{const raw=localStorage.getItem(STORAGE+state.id);if(raw){const s=normalize(JSON.parse(raw));if(s&&s.savedAt>state.savedAt){draft=s;$('restoreNotice').hidden=false;}}}catch{}$('restoreDraft').addEventListener('click',()=>{if(!draft)return;if(dirty&&!confirm('현재 목록 대신 임시 작성본을 불러올까요? 현재 목록을 먼저 백업해주세요.'))return;state=draft;draft=null;$('restoreNotice').hidden=true;render();dirty=false;status('임시 작성본을 불러왔습니다.');}); window.addEventListener('beforeprint',()=>{const ids=printIds||clientIds,list=state.properties.filter(p=>ids.includes(p.id));renderCustomer(list,printIds?.length===state.properties.length?'':$('ownerFilter').value);if(!list.length)$('customerContent').innerHTML='

출력할 목록을 먼저 선택하거나 전체 자산목록 PDF 버튼을 사용해주세요.

';});window.addEventListener('beforeunload',e=>{if(dirty||editing&&(editing.owners.length||editing.address||editing.name)){e.preventDefault();e.returnValue='';}});render(); })();