aboutsummaryrefslogtreecommitdiffstats
path: root/python/report_ops
diff options
context:
space:
mode:
Diffstat (limited to 'python/report_ops')
-rw-r--r--python/report_ops/__main__.py4
-rw-r--r--python/report_ops/admin.py89
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(