view src/ofxstatement/plugins/us_hsbc/transactions.py @ 8:164da24a2997

Minor adjustments Made those changes a couple weeks ago, can't exactly remember why :s.
author Louis Opter <kalessin@kalessin.fr>
date Thu, 01 Dec 2016 17:14:11 -0800
parents 829eb62755b0
children
line wrap: on
line source

# Copyright (c) 2016, Louis Opter <louis@opter.org>
#
# This file is part of ofxstatement-us-hsbc.
#
# ofxstatement-us-hsbc is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# ofxstatement-us-hsbc is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import dateutil.parser
import re

from ofxstatement.statement import StatementLine
from typing import Callable, Dict

from .record import Record


def _enrich_date_user(sl: StatementLine, record: Record, date: str) -> None:
    if not date:
        return

    dt = dateutil.parser.parse(date, dayfirst=False, yearfirst=False)
    sl.date_user = dt.replace(year=min(dt.year, sl.date.year))


def _enrich_check(sl: StatementLine, record: Record) -> None:
    sl.check_no = record.original_description.split("-")[-1].strip()
    sl.memo = record.user_description


def _enrich_cash_withdrawal(sl: StatementLine, record: Record) -> None:
    desc = record.original_description.replace("CASH WITHDRAWAL ON", "").strip()
    date, sl.memo = [part.strip() for part in desc.split("AT", 1)]
    _enrich_date_user(sl, record, date)


def _enrich_purchase(sl: StatementLine, record: Record) -> None:
    # ORIGINAL_DESCRIPTION has more informations than SIMPLE_DESCRIPTION even
    # if it's a bit less readable:
    sl.memo = record.original_description
    sl.memo = re.sub(r"^PURCHASE (-|(MADE )?ON)", "", sl.memo, re.I).strip()


def _enrich_credit(sl: StatementLine, record: Record) -> None:
    prefix = "CREDIT RECEIVED ON"
    sl.memo = record.original_description.replace(prefix, "").strip()
    parts = [part.strip() for part in sl.memo.split("FROM", 1)]
    if len(parts) > 1:
        date, sl.memo = parts
        _enrich_date_user(sl, record, date)


def _enrich_deposit(sl: StatementLine, record: Record) -> None:
    sl.memo = record.original_description.replace("DEPOSIT FROM", "").strip()


def _enrich_payment(sl: StatementLine, record: Record) -> None:
    sl.memo = record.original_description
    sl.memo = re.sub(r"^(ONLINE )?PAYMENT (TO|-)", "", sl.memo, re.I).strip()


def _enrich_generic(sl: StatementLine, record: Record) -> None:
    sl.memo = record.original_description

_TRNTYPE_TO_METHOD: Dict[str, Callable[[StatementLine, Record], None]] = {
    "CHECK": _enrich_check,
    "CASH": _enrich_cash_withdrawal,
    "PURCHASE": _enrich_purchase,
    "CREDIT": _enrich_credit,
    "DEP": _enrich_deposit,
    "PAYMENT": _enrich_payment,
}


def enrich(sl: StatementLine, record: Record) -> None:
    sl.payee = record.simple_description or record.category
    _TRNTYPE_TO_METHOD.get(sl.trntype, _enrich_generic)(sl, record)