import datetime from serenitas.ops.funds import Service from report_ops.cash import IAMDeal from serenitas.analytics.dates import prev_business_day def gen_old_iam(fund, cob, conn): with conn.cursor() as c: c.execute( "SELECT * FROM iam_tickets WHERE trade_date=%s AND fund=%s", ( cob, fund, ), ) for row in c: d = row._asdict() yield IAMDeal.from_dict(**d).to_globeop("CANCEL") c.execute("DELETE FROM iam_tickets WHERE trade_date=%s AND fund=%s") def gen_new_iam(fund, cob, conn): with conn.cursor() as c: c.execute( "SELECT * FROM list_iam(%s, %s)", ( cob, fund, ), ) for row in c: d = row._asdict() yield IAMDeal.from_dict(**d).to_globeop("NEW") def gen_new_iam_offsets(fund, cob, conn): with conn.cursor() as c: c.execute( "SELECT trade_date, broker, currency, fund, sum(start_money) AS start_money " "FROM list_iam(%s, %s) GROUP BY (trade_date, broker, currency, fund);", ( cob, fund, ), ) for row in c: d = row._asdict() | {"offset": True, "folder": "M_CSH_CASH"} yield IAMDeal.from_dict(**d).to_globeop("NEW") def gen_matured_iam(fund, cob, conn): with conn.cursor() as c: c.execute( "SELECT * FROM iam_tickets WHERE maturity is NULL AND trade_date=%s AND fund=%s", (prev_business_day(cob), fund), ) for row in c: yield IAMDeal.from_dict(**d).to_globeop("UPDATE") c.execute( "UPDATE iam_tickets SET maturity =%s WHERE maturity is NULL AND trade_date=%s AND fund=%s", (cob, fund), ) def main(fund, cob, conn): service = Service[fund] for iam in gen_old_iam(fund, cob, conn): iam.stage() for iam in gen_iam(fund, cob, conn): iam.stage() if fund in ("BOWDST"): for iam in gen_iam_offsets(fund, cob, conn): iam.stage() for iam in IamDeal.commit(): service.push(iam) buf, dest = service.build_buffer() conn.commit() if __name__ == "__main__": import argparse from serenitas.utils.db import dbconn conn = dbconn("dawndb") parser = argparse.ArgumentParser(description="Generate IAM file for globeop") parser.add_argument( "cob", nargs="?", type=datetime.date.fromisoformat, default=prev_business_day(datetime.date.today()), ) args = parser.parse_args() for fund in ("BOWDST",): main(fund, args.cob, conn)