aboutsummaryrefslogtreecommitdiffstats
path: root/python/globeop_monitor.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/globeop_monitor.py')
-rw-r--r--python/globeop_monitor.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/python/globeop_monitor.py b/python/globeop_monitor.py
index cdd0dbb2..ae7fea86 100644
--- a/python/globeop_monitor.py
+++ b/python/globeop_monitor.py
@@ -1,8 +1,12 @@
import datetime
import logging
+from dataclasses import replace
from serenitas.analytics.dates import prev_business_day
from serenitas.utils.db import dbconn
+from serenitas.ops.trade_dataclasses import WireDeal
+from serenitas.ops.funds import Service
from report_ops.utils import GFSMonitor, check_cleared_cds
+from collateral.common import CASH_STRATEGY_MAPPING, STRATEGY_CASH_MAPPING
def check_gfs(date, fund, conn):
@@ -20,6 +24,42 @@ def check_gfs(date, fund, conn):
GFSMonitor._staging_queue.clear()
+def reallocate_strategy_cash(date, fund, conn):
+ service = Service[fund]
+ with conn.cursor() as c:
+ c.execute(
+ "SELECT 1 FROM wires WHERE trade_date=%s AND fund=%s AND author='auto'",
+ (
+ date,
+ fund,
+ ),
+ )
+ if c.fetchone():
+ return
+ c.execute(
+ "SELECT * FROM list_orphaned_cash(%s, %s) WHERE abs(amount) > 1",
+ (
+ date,
+ fund,
+ ),
+ )
+ for row in c:
+ if row.folder not in CASH_STRATEGY_MAPPING:
+ obj = WireDeal(**row._asdict())
+ offset = replace(
+ obj, folder=STRATEGY_CASH_MAPPING[obj.folder], amount=-obj.amount
+ )
+ obj.stage()
+ offset.stage()
+ if not WireDeal._insert_queue:
+ return
+ for wire in WireDeal.commit(returning=True):
+ service.push_trade(wire, "NEW")
+ buf, dest = service.build_buffer("wire")
+ service.upload(buf, dest.name)
+ service().clear()
+
+
if __name__ == "__main__":
import argparse
@@ -40,3 +80,5 @@ if __name__ == "__main__":
):
check_gfs(args.cob, fund, conn)
check_cleared_cds(args.cob, fund, conn)
+ for fund in ("BOWDST",):
+ reallocate_strategy_cash(args.cob, fund, conn)