fix: 광고 푸시·문자 오등록 차단 강화 (죽은 코드 수정)

- 기존 광고 차단(if !strong && AD_HINT)은 강신호가 보장된 지점이라
  항상 false → 한 번도 실행되지 않는 죽은 코드였음. 광고어가 섞여도
  승인/입금 등 신호가 있으면 그대로 등록되던 원인.
- 광고어를 2단계로 분리:
  - AD_BLOCK(이벤트·쿠폰·혜택·당첨 등): 거래신호가 있어도 무조건 제외
  - AD_WEAK(적립·포인트·할인 등): '결제'만 있고 명확한 거래신호가 없을 때 제외
    (실거래 영수증의 '포인트 적립'은 보존)
- '결제'는 광고 문구에도 흔해 약신호(weakApproval)로 강등
- 파서 단위테스트 +4 (광고+강신호 차단, 실거래 포인트 보존, 결제단독 광고/정상)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ByungCheol
2026-06-12 22:15:54 +09:00
co-authored by Claude Opus 4.8
parent 31590343cf
commit 120e042971
2 changed files with 54 additions and 8 deletions
@@ -66,6 +66,39 @@ class CardNotificationParserTest {
assertThat(p.isRecognized()).isFalse();
}
@Test
@DisplayName("승인 신호가 있어도 명백한 광고어(이벤트/쿠폰/혜택)면 무시")
void blocksAdEvenWithSignal() {
var p = parser.parse("[Web발신]", "삼성카드 승인 9,900원 이벤트 쿠폰 혜택 받으세요", today);
assertThat(p.isRecognized()).isFalse();
}
@Test
@DisplayName("실거래(승인)에 포인트/적립이 붙어도 인식 유지")
void keepsRealTxnWithPoints() {
var p = parser.parse("신한카드", "승인 50,000원 스타벅스 포인트 적립 120P", today);
assertThat(p.isRecognized()).isTrue();
assertThat(p.isIncome()).isFalse();
assertThat(p.getAmount()).isEqualTo(50000L);
}
@Test
@DisplayName("'결제'만 있고 약한 광고어(적립/포인트)면 광고로 무시")
void blocksPaymentOnlyAd() {
var p = parser.parse("[Web발신]", "5,000원 결제하고 포인트 적립 받기", today);
assertThat(p.isRecognized()).isFalse();
}
@Test
@DisplayName("'결제'만 있어도 광고어 없으면 지출로 인식")
void keepsPaymentOnlyWhenNoAd() {
var p = parser.parse("롯데카드", "결제 3,000원 편의점", today);
assertThat(p.isRecognized()).isTrue();
assertThat(p.isIncome()).isFalse();
assertThat(p.isBankTransfer()).isFalse();
assertThat(p.getAmount()).isEqualTo(3000L);
}
@Test
@DisplayName("금액 없으면 무시")
void requiresAmount() {