diff options
Diffstat (limited to 'python/report_ops')
| -rw-r--r-- | python/report_ops/__main__.py | 9 | ||||
| -rw-r--r-- | python/report_ops/custodians.py | 39 |
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: |
