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

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
hyowons
2026-08-04 02:00:05 +09:00
parent 153ef20ae5
commit 7e7d759b34
167 changed files with 2732 additions and 1306 deletions
@@ -179,15 +179,16 @@ def parse_kakao_bank(raw: str, created_at: str) -> "dict | None":
return result
# 현대카드 승인 형식 (취소는 별도 샘플 확보 후 추가):
# 현대카드 블루멤버스 승인
# 방*원
# 5,170원 일시불
# 04/25 11:34
# 쿠팡
# 누적1,466,011원
HYUNDAI_CARD_APPROVE_RE = re.compile(
r"^\s*현대카드[^\n]*승인\s*\n"
# 현대카드 승인/취소 형식 (취소도 헤더 단어만 다르고 본문 구조는 같다):
# 현대카드 블루멤버스 승인 현대카드 블루멤버스 취소
# 방*원 방*원
# 5,170원 일시불 150,000원 일시불
# 04/25 11:34 08/02 13:06
# 쿠팡 현대가스
# 누적1,466,011원 누적4,696,608원
# 앞의 `현대카드[^\n]*` 가 greedy 라 "승인취소" 형태도 kind=취소 로 잡힌다.
HYUNDAI_CARD_RE = re.compile(
r"^\s*현대카드[^\n]*(?P<kind>승인|취소)\s*\n"
r"(?P<who>[^\n]+)\s*\n"
r"(?P<amount>[\d,]+)\s*원[^\n]*\n"
r"\d{2}/\d{2}\s+\d{2}:\d{2}\s*\n"
@@ -198,8 +199,8 @@ HYUNDAI_CARD_APPROVE_RE = re.compile(
# RCS/MAAP 형식은 한 줄로 들어온다:
# [Web발신] 현대카드 블루멤버스 승인 방*원 84,000원 일시불 05/16 11:57 네이버페이 누적820,000원
HYUNDAI_CARD_APPROVE_INLINE_RE = re.compile(
r"현대카드[^\n]*승인\s+"
HYUNDAI_CARD_INLINE_RE = re.compile(
r"현대카드[^\n]*(?P<kind>승인|취소)\s+"
r"(?P<who>\S+)\s+"
r"(?P<amount>[\d,]+)\s*원[^\n]*?"
r"\d{2}/\d{2}\s+\d{2}:\d{2}\s+"
@@ -211,13 +212,13 @@ HYUNDAI_CARD_APPROVE_INLINE_RE = re.compile(
def parse_hyundai_card(raw: str, created_at: str) -> "dict | None":
text = _normalize(raw).replace("[Web발신]", "").strip()
m = HYUNDAI_CARD_APPROVE_RE.search(text) or HYUNDAI_CARD_APPROVE_INLINE_RE.search(text)
m = HYUNDAI_CARD_RE.search(text) or HYUNDAI_CARD_INLINE_RE.search(text)
if not m:
return None
amount = int(m.group("amount").replace(",", ""))
merchant = re.sub(r"\s+", " ", m.group("merchant").strip()) or "(가맹점없음)"
result = {
"kind": "card_approval",
"kind": "card_cancel" if m.group("kind") == "취소" else "card_approval",
"entry_date": _iso_to_kst_date(created_at),
"amount": amount,
"merchant": merchant,