auto: 일일 백업 2026-08-07 02:00

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
hyowons
2026-08-07 02:00:02 +09:00
parent 307f7844c4
commit f38a3878b1
175 changed files with 3594 additions and 2983 deletions
@@ -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")