from dataclasses import replace from serenitas.ops.funds import Bowdst from serenitas.ops.trade_dataclasses import WireDeal import datetime from serenitas.analytics.dates import prev_business_day from collateral.common import CASH_STRATEGY_MAPPING, STRATEGY_CASH_MAPPING def generate_csv(date, fund="BOWDST"): with WireDeal._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) ", ( 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): Bowdst.staging_queue.append(wire.to_globeop("NEW")) buf, dest = Bowdst.build_buffer("wire") Bowdst.upload(buf, dest.name) Bowdst().clear() if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument( "workdate", nargs="?", type=datetime.date.fromisoformat, default=prev_business_day(datetime.date.today()), help="working date", ) args = parser.parse_args() generate_csv(args.workdate)