ofx-processor/ofx_processor/processors/lcl.py

108 lines
3 KiB
Python
Raw Permalink Normal View History

import sys
2020-09-01 19:18:55 +02:00
from datetime import datetime
2024-10-14 23:08:13 +02:00
from operator import truediv
import click
2020-09-01 19:18:55 +02:00
import dateparser
2021-11-20 15:00:43 +01:00
from ofx_processor.downloaders import LclDownloader
from ofx_processor.utils.base_ofx import OfxBaseLine, OfxBaseProcessor
class LclLine(OfxBaseLine):
2020-09-01 19:18:55 +02:00
def _extract_payee_and_date(self):
default_date = (
self.data.dtposted.isoformat().split("T")[0] if self.data.dtposted else None
)
2020-09-12 08:08:44 +02:00
if self.data.trntype.lower() == "check":
return "CHQ", default_date
if not self.data.name:
return "", default_date
split = self.data.name.split()
2020-09-01 19:18:55 +02:00
if not split:
return "", default_date
date_spot = split[-1]
if "/" not in date_spot:
return " ".join(split), default_date
date = dateparser.parse(
split[-1], date_formats=["%d/%m/%Y"], languages=["fr"]
) # type: datetime
if date:
name = " ".join(split[:-1])
date = date.strftime("%Y-%m-%d") # type: str
else:
name = " ".join(split)
date = default_date
return name, date
def get_payee(self):
return self._extract_payee_and_date()[0]
def get_date(self):
return self._extract_payee_and_date()[1]
2020-09-12 08:08:44 +02:00
def get_memo(self):
if self.data.trntype.lower() == "check":
return f"CHQ {self.data.checknum}"
return super().get_memo()
class LclProcessor(OfxBaseProcessor):
line_class = LclLine
account_name = "lcl"
command_name = "lcl"
2021-12-04 11:35:26 +01:00
def _parse_file(self):
# The first line of this file needs to be removed.
# It contains something that is not part of the header of an OFX file.
try:
with open(self.filename, "r") as user_file:
2021-12-04 11:35:26 +01:00
data = user_file.read().splitlines(keepends=True)
except FileNotFoundError:
click.secho("Couldn't find ofx file", fg="red")
sys.exit(1)
2024-10-14 23:08:13 +02:00
new_lines = [line for line in data if is_valid_line(line)]
with open(self.filename, "w") as temp_file:
temp_file.writelines(new_lines)
2021-12-04 11:35:26 +01:00
ofx = super()._parse_file()
2024-10-14 23:08:13 +02:00
with open(self.filename, "w") as temp_file:
temp_file.writelines(data)
2021-12-04 11:35:26 +01:00
return ofx
2024-10-14 23:08:13 +02:00
def is_valid_line(line):
if "Content-Type:" in line:
return False
if "MKTGINFO" in line:
return False
return True
2022-09-04 21:24:33 +02:00
def main(filename, keep, download, send_method, push_to_ynab):
"""Import LCL bank statement (OFX file)."""
2021-11-20 15:00:43 +01:00
if download:
if filename:
click.secho(
"You can't specify a file name with auto download. "
"Specified file name will be ignored.",
fg="yellow",
)
filename = LclDownloader().download()
2021-12-04 11:35:26 +01:00
processor = LclProcessor(filename)
2024-10-14 23:08:13 +02:00
processor.parse_file()
if send_method:
processor.send_reconciled_amount(send_method)
2022-09-04 21:24:33 +02:00
if push_to_ynab:
processor.push_to_ynab(keep)