ofx-processor/ofx_processor/utils/base_ofx.py

70 lines
2 KiB
Python
Raw Normal View History

import sys
2021-12-04 11:35:26 +01:00
from decimal import Decimal
import click
2021-12-04 11:35:26 +01:00
import requests
from ofxtools import OFXTree
from ofxtools.header import OFXHeaderError
2021-12-04 11:35:26 +01:00
from ofxtools.models import Aggregate
from ofx_processor.utils.base_processor import BaseLine, BaseProcessor
2021-12-04 11:35:26 +01:00
from ofx_processor.utils.config import get_config
class OfxBaseLine(BaseLine):
def get_date(self):
return self.data.dtposted.isoformat().split("T")[0]
def get_amount(self):
return int(self.data.trnamt * 1000)
def get_memo(self):
return self.data.memo
def get_payee(self):
return self.data.name
class OfxBaseProcessor(BaseProcessor):
line_class = OfxBaseLine
2021-12-04 11:35:26 +01:00
account_name = ""
def parse_file(self):
2021-12-04 11:35:26 +01:00
ofx = self._parse_file()
return ofx.statements[0].transactions
def send_reconciled_amount(self):
amount = self._get_reconciled_amount()
click.secho(f"Reconciled balance: {amount}. Sending...", fg="blue")
self._send_mail(amount)
def _get_reconciled_amount(self) -> Decimal:
ofx = self._parse_file()
return ofx.statements[0].balance.balamt
def _parse_file(self) -> Aggregate:
parser = OFXTree()
try:
parser.parse(self.filename)
except (FileNotFoundError, OFXHeaderError):
click.secho("Couldn't open or parse ofx file", fg="red")
sys.exit(1)
ofx = parser.convert()
2021-12-04 11:35:26 +01:00
return ofx
def _send_mail(self, amount: Decimal):
config = get_config(self.account_name)
if not config.email_setup:
click.secho("Email is not properly setup", fg="yellow")
return
return requests.post(
f"https://api.mailgun.net/v3/{config.mailgun_domain}/messages",
auth=("api", config.mailgun_api_key),
data={
"from": config.mailgun_from,
"to": [config.email_recipient],
"subject": f"Reconciled balance: {amount}",
"text": f"Here's your reconciled balance: {amount}",
},
)