From 9807472474efb895fc6f4c073c76e68e85bb4d15 Mon Sep 17 00:00:00 2001 From: ByungCheol Date: Tue, 9 Jun 2026 22:50:23 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=95=8C=EB=A6=BC=20=EC=9E=85=EA=B8=88?= =?UTF-8?q?=20=EC=9D=B8=EC=8B=9D=20+=20=EB=AF=B8=ED=99=95=EC=9D=B8=20?= =?UTF-8?q?=EC=88=98=EC=9E=85=20=EA=B8=B0=EB=B3=B8=20=EC=9D=80=ED=96=89?= =?UTF-8?q?=EA=B3=84=EC=A2=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 네이티브 알림 필터에 입금/이체/송금 키워드 추가(입금 알림도 수집) - 미확인(pending) 내역: 수입(입금)이면 기본 계좌종류 은행, 지출이면 카드 Co-Authored-By: Claude Opus 4.8 --- .../sblog/slimbudget/CardNotifListenerService.java | 12 +++++++----- src/views/account/AccountView.vue | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/android/app/src/main/java/kr/sblog/slimbudget/CardNotifListenerService.java b/android/app/src/main/java/kr/sblog/slimbudget/CardNotifListenerService.java index 3e67010..87d66d8 100644 --- a/android/app/src/main/java/kr/sblog/slimbudget/CardNotifListenerService.java +++ b/android/app/src/main/java/kr/sblog/slimbudget/CardNotifListenerService.java @@ -50,15 +50,17 @@ public class CardNotifListenerService extends NotificationListenerService { } /** - * 결제 알림 후보 판별: 금액(####원) + 결제/승인/출금 키워드. - * '카드'는 광고에도 흔해 제외. 강한 승인신호(승인/출금/취소/환불) 없이 광고성 표현이 있으면 제외. - * (1차 필터 — 최종 판별은 백엔드 파서) + * 결제/이체 알림 후보 판별: 금액(####원) + 승인/결제/출금/입금/이체/취소 키워드. + * '카드'는 광고에도 흔해 제외. 강한 신호 없이 광고성 표현이 있으면 제외. + * (1차 필터 — 최종 판별/분류는 백엔드 파서) */ private boolean looksLikePayment(String s) { boolean money = s.matches("(?s).*\\d[\\d,]{2,}\\s*원.*"); - boolean kw = s.contains("승인") || s.contains("결제") || s.contains("출금"); + boolean kw = s.contains("승인") || s.contains("결제") || s.contains("출금") + || s.contains("입금") || s.contains("이체") || s.contains("송금"); if (!money || !kw) return false; - boolean strong = s.contains("승인") || s.contains("출금") || s.contains("취소") || s.contains("환불"); + boolean strong = s.contains("승인") || s.contains("출금") || s.contains("입금") + || s.contains("이체") || s.contains("송금") || s.contains("취소") || s.contains("환불"); boolean adLike = s.matches("(?s).*(이벤트|광고|혜택|쿠폰|할인|적립|포인트|캐시백|마일리지|리워드|당첨|응모|추첨|프로모션|배너|무료|증정|모집).*"); return strong || !adLike; } diff --git a/src/views/account/AccountView.vue b/src/views/account/AccountView.vue index 6cf983f..f08a9fe 100644 --- a/src/views/account/AccountView.vue +++ b/src/views/account/AccountView.vue @@ -380,10 +380,10 @@ function openEdit(e) { category: e.category || '', amount: e.amount, memo: e.memo || '', - // 알림 자동인식(pending) 건은 카드 결제이므로 매칭 실패해도 '카드'로 기본 선택(현금 X) + // 알림 자동인식(pending): 매칭 실패 시 수입(입금)=은행, 지출(카드결제)=카드로 기본 선택(현금 X) walletKind: e.walletId ? walletKindOf(e.walletId) - : (e.pending ? 'CARD' : (e.type === 'TRANSFER' ? '' : 'CASH')), + : (e.pending ? (e.type === 'INCOME' ? 'BANK' : 'CARD') : (e.type === 'TRANSFER' ? '' : 'CASH')), walletId: e.walletId || '', toWalletKind: walletKindOf(e.toWalletId), toWalletId: e.toWalletId || '',