aboutsummaryrefslogtreecommitdiffstats
path: root/python/report_ops/sma.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/report_ops/sma.py')
-rw-r--r--python/report_ops/sma.py34
1 files changed, 32 insertions, 2 deletions
diff --git a/python/report_ops/sma.py b/python/report_ops/sma.py
index 8b95496c..bb58fe07 100644
--- a/python/report_ops/sma.py
+++ b/python/report_ops/sma.py
@@ -10,6 +10,9 @@ import pandas as pd
from io import StringIO
from typing import ClassVar
from .headers import POSITION_HEADERS
+from io import StringIO
+import csv
+from serenitas.utils.env import DAILY_DIR
@dataclass
@@ -95,6 +98,19 @@ _fund_client = {"BOWDST": "Hedgemark", "ISOSEL": "Innocap"}
_fund_fcm = {"BOWDST": "GS_FCM", "ISOSEL": "BOA_FC"}
+def get_path(cob, fund):
+ match fund:
+ case "ISOSEL":
+ filepath_pattern = "Innocap_{fund}_positions_{cob:%Y%m%d}.csv"
+ case _:
+ filepath_pattern = "{fund}_positions_{cob:%Y%m%d}.csv"
+ return (
+ DAILY_DIR
+ / str(datetime.date.today())
+ / filepath_pattern.format(fund=fund, cob=cob)
+ )
+
+
@dataclass
class PositionReport(Deal, deal_type=None, table_name=None):
client_name: str = field(metadata={"position": "Client Name"})
@@ -134,6 +150,7 @@ class PositionReport(Deal, deal_type=None, table_name=None):
account: str = field(default=None, metadata={"position": "AccountNumber"})
primebroker: str = field(default=None, metadata={"position": "Prime Broker"})
price: float = field(default=None, metadata={"position": "MarketPrice"})
+ staging_queue: ClassVar = []
asset_class: ClassVar[str] = field(metadata={"position": "Product Type"})
_query: ClassVar[str]
@@ -148,8 +165,21 @@ class PositionReport(Deal, deal_type=None, table_name=None):
c.execute(cls._query, params)
for row in c:
position = cls.from_query(row._asdict(), cob, fund)
- print(position)
- position.serialize("position")
+ cls.staging_queue.append(position.serialize("position"))
+
+ @classmethod
+ def build_buffer(cls, cob, fund, upload=False):
+ buf = StringIO()
+ csvwriter = csv.writer(buf)
+ csvwriter.writerow(POSITION_HEADERS)
+ csvwriter.writerows(
+ [[obj.get(h) for h in POSITION_HEADERS] for obj in cls.staging_queue]
+ )
+ buf = buf.getvalue().encode()
+ dest = get_path(cob, fund)
+ dest.parent.mkdir(exist_ok=True)
+ dest.write_bytes(buf)
+ return buf, dest
def from_query(d, cob, fund):
d["client_name"] = _fund_client[fund]