From e3ab2f9f3cce7f02afb20992f5f42df63035c749 Mon Sep 17 00:00:00 2001 From: sb Date: Mon, 6 Jul 2026 22:25:29 +0900 Subject: [PATCH] =?UTF-8?q?fix(account):=20=EB=B9=A0=EB=A5=B8=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=E2=80=94=20=EA=B3=84=EC=A2=8C=E2=86=92=EB=8C=80?= =?UTF-8?q?=EC=B6=9C/=EC=B9=B4=EB=93=9C=20=EC=9D=B4=EC=B2=B4=EB=8A=94=20?= =?UTF-8?q?=EC=83=81=ED=99=98(REPAYMENT)=EC=9C=BC=EB=A1=9C=20=EC=9E=AC?= =?UTF-8?q?=EB=B6=84=EB=A5=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AI가 TRANSFER로 준 것을, 받는 계좌가 대출/카드면 상환으로 바꿔 폼을 상환모드로 염 (출금=walletId·대상=toWalletId·원금=금액). 이자 있으면 사용자가 분리 입력. Co-Authored-By: Claude Opus 4.8 --- src/views/account/AccountView.vue | 38 +++++++++++++++++-------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/views/account/AccountView.vue b/src/views/account/AccountView.vue index ff3c98b..5585a52 100644 --- a/src/views/account/AccountView.vue +++ b/src/views/account/AccountView.vue @@ -825,27 +825,31 @@ const pasteText = ref('') const pasteError = ref('') function applyParsed(p) { if (!p || !p.recognized) return - const transfer = p.type === 'TRANSFER' - form.type = p.type === 'INCOME' ? 'INCOME' : transfer ? 'TRANSFER' : 'EXPENSE' if (p.amount) form.amount = Number(p.amount) if (p.merchant) form.memo = p.merchant if (p.date) form.entryDate = p.date - // 이체는 분류 없음. 그 외엔 AI 추천 분류(후보 중). 없으면 사용자가 선택 - form.category = transfer ? '' : p.category || '' - // AI 추천 계좌 매칭 — 지출/수입=결제수단(walletId), 이체=보내는(walletId)/받는(toWalletId) 계좌 - if (p.wallet) { - const w = wallets.value.find((x) => x.name === p.wallet) - if (w) { - form.walletKind = w.type - form.walletId = w.id - } + // 계좌 매칭: 출금(from) / 받는·대상(to) + const fromW = p.wallet ? wallets.value.find((x) => x.name === p.wallet) : null + const toW = p.toWallet ? wallets.value.find((x) => x.name === p.toWallet) : null + // 이체 대상이 대출/카드면 '상환(REPAYMENT)'으로 재분류 — 앱은 계좌→대출/카드 납입을 상환으로 처리(원금=이체·이자=지출) + const isTransfer = p.type === 'TRANSFER' + const repayment = isTransfer && toW && (toW.type === 'LOAN' || toW.type === 'CARD') + form.type = + p.type === 'INCOME' ? 'INCOME' : repayment ? 'REPAYMENT' : isTransfer ? 'TRANSFER' : 'EXPENSE' + // 이체·상환은 분류 없음. 그 외엔 AI 추천 분류(후보 중) + form.category = isTransfer || repayment ? '' : p.category || '' + if (fromW) { + form.walletKind = fromW.type + form.walletId = fromW.id } - if (transfer && p.toWallet) { - const tw = wallets.value.find((x) => x.name === p.toWallet) - if (tw) { - form.toWalletKind = tw.type - form.toWalletId = tw.id - } + if ((isTransfer || repayment) && toW) { + form.toWalletKind = toW.type + form.toWalletId = toW.id + } + if (repayment) { + // 상환: 전액을 원금으로 우선 채움(이자가 있으면 사용자가 분리 입력) + form.principal = p.amount ? Number(p.amount) : null + form.interest = null } pasteDetected.value = null pasteModalOpen.value = false