aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/report_ops/base.py43
-rw-r--r--python/report_ops/cash.py7
-rw-r--r--python/report_ops/wires.py42
3 files changed, 49 insertions, 43 deletions
diff --git a/python/report_ops/base.py b/python/report_ops/base.py
new file mode 100644
index 00000000..367faf50
--- /dev/null
+++ b/python/report_ops/base.py
@@ -0,0 +1,43 @@
+from typing import ClassVar
+from dataclasses import Field
+
+from serenitas.utils.db2 import dbconn
+
+
+class Report:
+ _sql_insert: ClassVar[str]
+ _insert_queue: ClassVar[list]
+ _insert_fields: ClassVar[list]
+ _conn: ClassVar = dbconn("dawndb")
+
+ def __init_subclass__(cls, table_name: str):
+ cls._insert_fields = list(filter(cls.is_insert_field, cls.__annotations__))
+ place_holders = ",".join(["%s"] * len(cls._insert_fields))
+ cls._sql_insert = f"INSERT INTO {table_name}({','.join(cls._insert_fields)}) VALUES({place_holders}) ON CONFLICT DO NOTHING RETURNING *"
+ cls._insert_queue = []
+
+ @classmethod
+ def is_insert_field(cls, attr):
+ """fields are insertable by default unless specified otherwise"""
+ match getattr(cls, attr, None):
+ case Field(metadata={"insert": False}) | Field(init=False):
+ return False
+ case _:
+ return True
+
+ @classmethod
+ def clear(cls):
+ cls._insert_queue.clear()
+
+ def stage(self):
+ self._insert_queue.append(
+ tuple([getattr(self, col) for col in self._insert_fields])
+ )
+
+ @classmethod
+ def commit(cls):
+ conn = cls._conn
+ with conn.cursor() as c:
+ c.executemany(cls._sql_insert, cls._insert_queue)
+ conn.commit()
+ cls._insert_queue.clear()
diff --git a/python/report_ops/cash.py b/python/report_ops/cash.py
index f851d8d1..552058a8 100644
--- a/python/report_ops/cash.py
+++ b/python/report_ops/cash.py
@@ -12,7 +12,7 @@ from serenitas.ops.trade_dataclasses import Ccy
from serenitas.ops.dataclass_mapping import Fund
from .misc import Custodian, get_dir
-from .wires import Report
+from .base import Report
@dataclass
@@ -24,6 +24,7 @@ class CashReport(Report, table_name="cash_balances"):
currency_code: Ccy
balance: float
custodian: ClassVar[Custodian] = field(metadata={"insert": False})
+ _registry: ClassVar = field(default={}, metadata={"insert": False})
def __init_subclass__(cls, custodian):
cls.custodian = custodian
@@ -144,8 +145,8 @@ class ScotiaCashReport(CashReport, custodian="SCOTIA"):
return cls(
date=prev_business_day(d["knowledge_date"]),
fund=d["fund"],
- account_name=d["Account"],
- account_number=d["Account Name"],
+ account_name=d["Account Name"],
+ account_number=d["Account"],
currency_code="USD",
balance=d["Opening Bal."],
)
diff --git a/python/report_ops/wires.py b/python/report_ops/wires.py
index baaae19d..6da3ac29 100644
--- a/python/report_ops/wires.py
+++ b/python/report_ops/wires.py
@@ -13,46 +13,7 @@ from serenitas.utils.env import DAILY_DIR
from serenitas.utils.db2 import dbconn
from .misc import get_dir, dt_from_fname, Custodian
-
-
-class Report:
- _sql_insert: ClassVar[str]
- _insert_queue: ClassVar[list]
- _insert_fields: ClassVar[list]
- _conn: ClassVar = dbconn("dawndb")
- _registry = {}
-
- def __init_subclass__(cls, table_name: str):
- cls._insert_fields = list(filter(cls.is_insert_field, cls.__annotations__))
- place_holders = ",".join(["%s"] * len(cls._insert_fields))
- cls._sql_insert = f"INSERT INTO {table_name}({','.join(cls._insert_fields)}) VALUES({place_holders}) ON CONFLICT DO NOTHING RETURNING *"
- cls._insert_queue = []
-
- @classmethod
- def is_insert_field(cls, attr):
- """fields are insertable by default unless specified otherwise"""
- match getattr(cls, attr, None):
- case Field(metadata={"insert": False}) | Field(init=False):
- return False
- case _:
- return True
-
- @classmethod
- def clear(cls):
- cls._insert_queue.clear()
-
- def stage(self):
- self._insert_queue.append(
- tuple([getattr(self, col) for col in self._insert_fields])
- )
-
- @classmethod
- def commit(cls):
- conn = cls._conn
- with conn.cursor() as c:
- c.executemany(cls._sql_insert, cls._insert_queue)
- conn.commit()
- cls._insert_queue.clear()
+from .base import Report
@dataclass
@@ -68,6 +29,7 @@ class WireReport(Report, table_name="custodian_wires"):
wire_details: str
unique_ref: str
dtkey: ClassVar = field(metadata={"insert": False})
+ _registry: ClassVar = field(default={}, metadata={"insert": False})
def __init_subclass__(cls, custodian, dtkey):
cls.custodian = custodian