diff --git a/agents/budget/workspace/skills/whooing-sync/scripts/parsers.py b/agents/budget/workspace/skills/whooing-sync/scripts/parsers.py index e3182e1..166db74 100644 --- a/agents/budget/workspace/skills/whooing-sync/scripts/parsers.py +++ b/agents/budget/workspace/skills/whooing-sync/scripts/parsers.py @@ -135,8 +135,32 @@ KAKAOBANK_RE = re.compile( ) +KAKAOBANK_CARD_RE = re.compile( + r"\[Web발신\]\s*\[카카오뱅크\]\s+카드결제\s+" + r"(?P\S+)\s+" + r"(?P\d{2}/\d{2})\s+(?P\d{2}:\d{2})\s+" + r"(?P[\d,]+)원\s+" + r"(?P[^\n]+?)" + r"(?:\s+잔액\s+(?P[\d,]+)원?)?\s*$", + re.DOTALL, +) + + def parse_kakao_bank(raw: str, created_at: str) -> "dict | None": text = _normalize(raw) + card = KAKAOBANK_CARD_RE.search(text) + if card: + result = { + "kind": "withdrawal", + "entry_date": _iso_to_kst_date(created_at), + "amount": int(card.group("amount").replace(",", "")), + "merchant": _normalize(card.group("merchant")).split("\n")[0].strip() or "(메모없음)", + "raw": raw, + } + if card.group("balance"): + result["balance"] = int(card.group("balance").replace(",", "")) + return result + m = KAKAOBANK_RE.search(text) if not m: return None