aboutsummaryrefslogtreecommitdiffstats
path: root/python/report_ops
diff options
context:
space:
mode:
Diffstat (limited to 'python/report_ops')
-rw-r--r--python/report_ops/__main__.py9
-rw-r--r--python/report_ops/custodians.py39
2 files changed, 43 insertions, 5 deletions
diff --git a/python/report_ops/__main__.py b/python/report_ops/__main__.py
index 9dec4db5..68708109 100644
--- a/python/report_ops/__main__.py
+++ b/python/report_ops/__main__.py
@@ -1,4 +1,5 @@
from serenitas.analytics.dates import prev_business_day
+from serenitas.utils.db import dbconn
import logging
import argparse
import datetime
@@ -6,7 +7,7 @@ from .sma import IsoselSMA, BowdstSMA
from .cash import NTCashReport, UMBCashReport, BNYCashReport
from .admin import AccruedReport, AllReport
from .wires import BowdstWire, NTWire
-from .custodians import BBH, UMB
+from .custodians import upload_to_custodian
logger = logging.getLogger(__name__)
@@ -91,9 +92,9 @@ if args.wire_reports:
logger.info(e)
if args.send_to_custodians:
- for custodian_cls in (BBH, UMB):
- custodian = custodian_cls(args.date)
+ conn = dbconn("dawndb")
+ for account in ("UMB", "BBH"):
try:
- custodian.upload_to_custodian(not args.no_upload)
+ upload_to_custodian(account, args.date, conn, not args.no_upload)
except ValueError as e:
logger.info(e)
diff --git a/python/report_ops/custodians.py b/python/report_ops/custodians.py
index 8da504d7..5702b278 100644
--- a/python/report_ops/custodians.py
+++ b/python/report_ops/custodians.py
@@ -5,10 +5,47 @@ import datetime
from .misc import get_dir, dt_from_fname
import gpg
import datetime
-from serenitas.ops.custodians import upload_to_bbh, upload_to_umb
+from serenitas.ops.trade_dataclasses import BondDeal
+from serenitas.ops.funds import Service
from typing import ClassVar
from dataclasses import dataclass
+_sql = (
+ "INSERT INTO bond_csv_upload (allocationid, cusip, principal, interest) SELECT id, identifier, principal_payment, "
+ "accrued_payment FROM bond_trades WHERE trade_date=%s AND account=%s AND tradeid IS NOT NULL ON CONFLICT DO NOTHING RETURNING allocationid;"
+)
+
+_bond_query = "SELECT * FROM bond_trades WHERE id in %s;"
+
+
+def upload_to_custodian(account, trade_date, conn, upload):
+ _fund = {"BBH": "BRINKER", "UMB": "UMB"}
+ custodian = Service[_fund[account]]
+ with conn.cursor() as c:
+ c.execute(
+ _sql,
+ (
+ trade_date,
+ account,
+ ),
+ )
+ tids = tuple(row.allocationid for row in c)
+ if not tids:
+ return
+ c.execute(_bond_query, (tids,))
+ for row in c:
+ trade = BondDeal.from_dict(**row._asdict(), scaled=True)
+ match account:
+ case "BBH":
+ custodian.staging_queue.append(trade.to_bbh("NEW"))
+ case "UMB":
+ custodian.staging_queue.append(trade.to_umb("NEW"))
+ buf, dest = custodian.build_buffer("bond")
+ custodian.staging_queue.clear()
+ conn.commit()
+ if upload:
+ custodian.upload(buf, dest.name, confirm=account != "UMB")
+
@dataclass
class Custodian: