diff options
Diffstat (limited to 'python/report_ops')
| -rw-r--r-- | python/report_ops/misc.py | 6 | ||||
| -rw-r--r-- | python/report_ops/remote.py | 68 |
2 files changed, 37 insertions, 37 deletions
diff --git a/python/report_ops/misc.py b/python/report_ops/misc.py index 73f08f90..72bf0399 100644 --- a/python/report_ops/misc.py +++ b/python/report_ops/misc.py @@ -20,3 +20,9 @@ def dt_from_fname(f, dt_format="%Y%m%d%H%M"): return datetime.datetime.strptime( f.name.removesuffix(".csv").removesuffix(".xlsx").rsplit("_")[-1], dt_format ) + + +def dt_from_citco(filename, file_tag, dt_format): + return datetime.datetime.strptime( + filename.removesuffix(".csv").removeprefix(file_tag), dt_format + ) diff --git a/python/report_ops/remote.py b/python/report_ops/remote.py index 2dac0db2..5d66fd7f 100644 --- a/python/report_ops/remote.py +++ b/python/report_ops/remote.py @@ -5,18 +5,9 @@ from serenitas.utils.db import dawn_engine, dbconn import datetime import re from serenitas.analytics.dates import prev_business_day, next_business_day - - -def citco_accrued(s): - if m := re.search("100502500_INNOCAP_ISOSEL.([\d]+)\.", s): - dt = datetime.datetime.strptime(m.group(1), "%Y%m%d%H%M%S") - return prev_business_day(dt) - - -def citco_all(s): - if m := re.search("SPOS4X_INNOCAP_ISOSEL_D_IM.([\d.]+)\.", s): - dt = datetime.datetime.strptime(m.group(1), "%Y%m%d.%H%M%S") - return dt +from .misc import dt_from_citco +from functools import partial +from typing import ClassVar def load_citco_report(fh, kd, date_cols): @@ -31,41 +22,44 @@ def load_citco_report(fh, kd, date_cols): class Report: table: str - ped_func: Callable[[str], datetime.datetime] _sftp = SftpClient.from_creds("citco", folder="outgoing") _conn: dbconn = dbconn("dawndb") date_cols: List[str] = [] + dtkey_fun: ClassVar - def __init_subclass__(cls, table, f, fname, date_cols): + def __init_subclass__(cls, table, fname, date_cols, dtkey): cls.table = table - cls.ped_func = f cls.fname = fname cls.date_cols = date_cols + cls.dtkey_fun = partial(dt_from_citco, file_tag=cls.fname, dt_format=dtkey) def __init__(self, date): self.date = date - @property - def most_recent_report(self): - report_files = [ - filename - for filename in self._sftp.client.listdir() - if self.fname in filename - if type(self).ped_func(filename).date() == self.date - ] - try: - return max(report_files, key=type(self).ped_func) - except ValueError: - raise ValueError(f"Missing data for {self.table}: {self.date}") + @classmethod + def get_newest_report(cls, date): + p = max( + [ + f + for f in cls._sftp.client.listdir() + if (cls.fname in f) and (cls.dtkey_fun(f).date() == date) + ], + key=cls.dtkey_fun, + default=None, + ) + if not p: + raise ValueError(f"No reports for {cls.fund} on {date}") + return p - def to_df(self): - with self._sftp.client.open(self.most_recent_report) as fh: - return load_citco_report( - fh, type(self).ped_func(self.most_recent_report), self.date_cols - ) + @classmethod + def to_df(cls, fname): + kd = cls.dtkey_fun(fname) + with cls._sftp.client.open(fname) as fh: + return load_citco_report(fh, kd, cls.date_cols) def to_db(self): - df = self.to_df() + p = self.get_newest_report(self.date) + df = self.to_df(p) with self._conn.cursor() as c: c.execute( f"DELETE FROM {self.table} WHERE period_end_date= %s", @@ -80,8 +74,7 @@ class Report: class AccruedReport( Report, table="isosel_accrued", - f=citco_accrued, - fname="100502500_INNOCAP_ISOSEL", + fname="100502500_INNOCAP_ISOSEL_", date_cols=[ "Init Date", "Init Settle Date", @@ -92,6 +85,7 @@ class AccruedReport( "Start Date", "End Date", ], + dtkey="%Y%m%d%H%M%S", ): pass @@ -99,8 +93,8 @@ class AccruedReport( class AllReport( Report, table="citco_reports", - f=citco_all, - fname="SPOS4X_INNOCAP_ISOSEL_D_IM", + fname="SPOS4X_INNOCAP_ISOSEL_D_IM.", date_cols=["Maturity Date"], + dtkey="%Y%m%d.%H%M%S", ): pass |
