auto: 일일 백업 2026-08-07 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
# 2026-05-07
|
||||
|
||||
- 관리자님 지시: `삼천리도시가스`는 후잉에서 `주거,관리` 항목으로 분류하고, item은 `공과금`으로 처리.
|
||||
- ⚠️ **2026-08-06 정정: 계정은 `주거,통신`** — 후잉 차트에 `주거,관리` 계정이 존재하지 않는다(그래서 이 날 실제 입력분도 `주거,통신`으로 들어갔다). item `공과금`은 그대로. 상세는 `memory/2026-08-06.md`.
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
# 2026-08-06
|
||||
|
||||
## 신한카드 삼천리도시가스 분류 실패 — 원인 3겹 (코디 수정)
|
||||
|
||||
가스요금 14,000원 SMS가 structured 분류를 통과하지 못하고 raw 폴백 → **후잉에 거래가 아예 생성되지 않았다**(후잉 자체 파서도 이 형식을 못 읽음). 8/6 후잉 거래에 복권·톨비·쿠팡 3건만 있었음.
|
||||
|
||||
1. **파서 공백** — 신한카드 `자동납부` SMS는 기존 승인 SMS와 **금액/상호 순서가 반대**다.
|
||||
- 기존: `신한카드(6847)승인 방*원님 아파트 관리비 184,440원 정상승인 되었습니다.` (상호 → 금액)
|
||||
- 자동납부: `[신한카드] 자동납부 정상승인 방효원님 08/06 (일시불) 14,000원 삼천리도시가스` (금액 → 상호)
|
||||
|
||||
`SHINHAN_APPROVE_RE`가 `[신한카드]`의 `]`에서 막혀 처음부터 한 번도 파싱된 적 없음(2026-05-07·08-06 두 건 전부 raw). `parsers.py`에 `SHINHAN_AUTOPAY_RE` 신설, `parse_shinhan_card`가 자동납부 → 일반 순으로 시도.
|
||||
⚠️ `SHINHAN_APPROVE_RE`를 느슨하게 고치는 건 안 된다 — merchant 자리에 `08/06 (일시불)`이 잡힌다.
|
||||
|
||||
2. **계정 `주거,관리`는 후잉에 없다** — `삼천리도시가스` 매핑이 이 죽은 계정을 가리키고 있었다. 2026-06-30 `주택임대료`가 같은 계정으로 `left account does not exist at entry_date` 실패한 그 계정. **`주거,통신` / item `공과금`으로 확정**(2026-05-07 실제 입력분·`도시가스` 기본 매핑·주택임대료 정정 선례와 동일). 2026-05-07 메모의 `주거,관리` 지시는 그 메모에 정정 표기함.
|
||||
|
||||
3. **`state/whooing_accounts.json`이 stale**(updated_at 2026-04-23) — `whooing_manual.py`의 차트 검증이 이 파일을 보는데 죽은 계정 `주거,관리`·`카뱅지금통`(실제는 `카뱅저금통`)을 싣고 있어 로컬 검증만 통과하고 후잉에서 터졌다. 라이브 `accounts.json`으로 전체 동기화(자산 +7/−1, 부채 +2, 비용 −1, updated_at 2026-08-06). 매핑 계정을 늘릴 때는 이 스냅샷이 최신인지 먼저 확인할 것.
|
||||
|
||||
누락분 14,000원은 `whooing_manual.py`로 보정 입력 완료(`20260806 / 공과금 / 주거,통신 ← 신한신용(효원)`).
|
||||
|
||||
## ⚠️ raw 폴백 200은 "후잉에 기록됨"이 아니다
|
||||
|
||||
후잉 raw 엔드포인트는 **자기 파서가 실패해도 200을 준다**. `✅ [raw] … 200` 로그와 `sent_raw` 카운트는 "접수됨"일 뿐이라, 이번 누락이 5월부터 안 보인 이유다. raw 폴백 알림을 받으면 **후잉에 실제로 줄이 생겼는지 `entries.json`으로 확인**해야 한다. (`imsg send`의 rc=0이 발송 성공이 아닌 것과 같은 함정.)
|
||||
|
||||
## 범위 밖 (관리자님 판단 대기)
|
||||
|
||||
- **현대카드 자동납부도 같은 파서 공백** — `[현대카드] 자동납부 승인 방*원님 라이나생명 31,100원`(2026-05-17 raw). 다만 `whooing_sync.py`의 잔액차 기반 월 1회 자동보정 + `_should_skip_hyundai_insurance_duplicate`가 이미 커버해 실질 누락 없음. 미수정.
|
||||
- raw 폴백분이 후잉에 실제 반영됐는지 자동 검출하는 장치는 붙이지 않았다.
|
||||
@@ -74,6 +74,22 @@ SHINHAN_APPROVE_RE = re.compile(
|
||||
)
|
||||
|
||||
|
||||
# 신한카드 자동납부 형식은 위 승인 SMS와 금액/상호 순서가 반대다:
|
||||
# "[신한카드] 자동납부 정상승인 방효원님 08/06 (일시불) 14,000원 삼천리도시가스"
|
||||
# SHINHAN_APPROVE_RE 를 느슨하게 고치는 대신 별도 패턴으로 먼저 시도한다 —
|
||||
# 느슨하게 고치면 merchant 자리에 "08/06 (일시불)" 이 잡힌다.
|
||||
# kind 대안 순서 주의: `정상승인`·`승인취소` 가 `승인` 보다 앞에 와야 한다(왼쪽 우선).
|
||||
SHINHAN_AUTOPAY_RE = re.compile(
|
||||
r"\[?신한카드\]?\s*자동납부\s*(?P<kind>정상승인|승인취소|매입취소|승인|취소)\s+"
|
||||
r"(?P<who>\S+?님)\s+"
|
||||
r"\d{2}/\d{2}\s+"
|
||||
r"(?:\([^)]*\)\s+)?" # (일시불) / (3개월) — 없는 변형도 통과
|
||||
r"(?P<amount>[\d,]+)\s*원\s+"
|
||||
r"(?P<merchant>[^\n]+)",
|
||||
re.DOTALL,
|
||||
)
|
||||
|
||||
|
||||
SHINHAN_BANK_RE = re.compile(
|
||||
r"\[Web발신\]\s*\n"
|
||||
r"신한\s*(?P<md>\d{2}/\d{2})\s+(?P<hm>\d{2}:\d{2})\s*\n"
|
||||
@@ -107,7 +123,7 @@ def parse_shinhan_bank(raw: str, created_at: str) -> "dict | None":
|
||||
|
||||
def parse_shinhan_card(raw: str, created_at: str) -> "dict | None":
|
||||
text = _normalize(raw).replace("[Web발신]", "")
|
||||
m = SHINHAN_APPROVE_RE.search(text)
|
||||
m = SHINHAN_AUTOPAY_RE.search(text) or SHINHAN_APPROVE_RE.search(text)
|
||||
if not m:
|
||||
return None
|
||||
kind_raw = m.group("kind")
|
||||
|
||||
Reference in New Issue
Block a user