diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/report_ops/__main__.py | 4 | ||||
| -rw-r--r-- | python/report_ops/admin.py | 89 |
2 files changed, 49 insertions, 44 deletions
diff --git a/python/report_ops/__main__.py b/python/report_ops/__main__.py index c0700d66..d4103df6 100644 --- a/python/report_ops/__main__.py +++ b/python/report_ops/__main__.py @@ -89,9 +89,9 @@ if args.cash_reports: if args.isosel_reports: for report in ("isosel_accrued", "citco_reports"): - report = CitcoReport[report] try: - report.to_db(cob) + report = CitcoReport[report](cob, "ISOSEL") + report.to_db() except ValueError as e: logger.warning(e) diff --git a/python/report_ops/admin.py b/python/report_ops/admin.py index 01a8929b..1f82afdb 100644 --- a/python/report_ops/admin.py +++ b/python/report_ops/admin.py @@ -7,23 +7,20 @@ from .misc import dt_from_citco from functools import partial from typing import ClassVar import datetime +from dataclasses import dataclass +from serenitas.ops.trade_dataclasses import Fund -def load_citco_report(fh, kd, date_cols): - df = pd.read_csv(fh, parse_dates=date_cols, infer_datetime_format=True) - df["row"] = df.index - df.columns = df.columns.str.lower() - df.columns = df.columns.str.replace(" ", "_") - df["period_end_date"] = kd.date() - df["knowledge_date"] = next_business_day(kd) - return df - - +@dataclass class CitcoReport: - table: str - _sftp = SftpClient.from_creds("citco", folder="outgoing") + date: datetime.date + fund: Fund + report_name: ClassVar + table: ClassVar + knowledge_date: datetime.date = None + fund: Fund = None _conn: dbconn = dbconn("dawndb") - date_cols: List[str] = [] + date_cols: ClassVar = [] dtkey_fun: ClassVar _registry = {} @@ -34,51 +31,57 @@ class CitcoReport: cls.dtkey_fun = partial(dt_from_citco, file_tag=cls.fname, dt_format=dtkey) cls._registry[table] = cls - def __init__(self, date): - self.date = date - def __class_getitem__(cls, table): return cls._registry[table] - @classmethod - def get_newest_report(cls, report_file_date): + def __post_init__(self): + match self.fund: + case "ISOSEL": + self._sftp = SftpClient.from_creds("citco", folder="outgoing") + self.report_name = self.get_latest_report() + self.knowledge_date = datetime.datetime.combine( + self.date, self.dtkey_fun(self.report_name).time() + ) + + @property + def report_date(self): + return self.date + + def get_latest_report(self): p = max( [ f - for f in cls._sftp.client.listdir() - if (cls.fname in f) and (cls.dtkey_fun(f).date() == report_file_date) + for f in self._sftp.client.listdir() + if (self.fname in f) and (self.dtkey_fun(f).date() == self.report_date) ], - key=cls.dtkey_fun, + key=self.dtkey_fun, default=None, ) if not p: - raise ValueError(f"No reports for {cls.table} on {report_file_date}") + raise ValueError(f"No reports for {self.table} on {self.date}") return p - @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_df(self): + with self._sftp.client.open(self.report_name) as fh: + df = pd.read_csv(fh, parse_dates=self.date_cols, infer_datetime_format=True) + df["row"] = df.index + df.columns = df.columns.str.lower() + df.columns = df.columns.str.replace(" ", "_") + df["period_end_date"] = self.date + df["knowledge_date"] = self.knowledge_date + return df - @classmethod - def to_db(cls, ped): - report_file_date = ped if cls is AllReport else next_business_day(ped) - p = cls.get_newest_report(report_file_date) - df = cls.to_df(p) - df["knowledge_date"] = datetime.datetime.combine( - next_business_day(ped), cls.dtkey_fun(p).time() - ) - df["period_end_date"] = ped - with cls._conn.cursor() as c: + def to_db(self): + df = self.to_df() + with self._conn.cursor() as c: c.execute( - f"DELETE FROM {cls.table} WHERE period_end_date= %s", - (ped,), + f"DELETE FROM {self.table} WHERE period_end_date= %s", + (self.date,), ) - cls._conn.commit() + self._conn.commit() if "strategy" in df.columns: df["strategy"] = df["strategy"].str.replace("/M_|/SER_", "/", regex=True) - df.to_sql(cls.table, dawn_engine, if_exists="append", index=False) + df.to_sql(self.table, dawn_engine, if_exists="append", index=False) class AccruedReport( @@ -97,7 +100,9 @@ class AccruedReport( ], dtkey="%Y%m%d%H%M%S", ): - pass + @property + def report_date(self): + return next_business_day(self.date) class AllReport( |
