import datetime from serenitas.ops.funds import Service from serenitas.analytics.dates import prev_business_day from report_ops.cash import IAMDeal def gen_old_iam(fund, cob, conn): """'Finds and cancels old IAM uploads""" with conn.cursor() as c: c.execute( "DELETE FROM iam_tickets WHERE trade_date=%s AND fund=%s RETURNING *", ( cob, fund, ), ) for row in c: d = row._asdict() yield IAMDeal.from_dict(**d) def gen_new_iam(fund, cob, conn): """Generates new IAM deals""" 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) def gen_new_iam_offsets(fund, cob, conn): """'Generates offsets if the sma has already updated these iam deals""" 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) def gen_matured_iam(fund, cob, conn): """Sets previous days as matured""" with conn.cursor() as c: c.execute( "UPDATE iam_tickets SET maturity=%s WHERE maturity is NULL AND trade_date<%s AND fund=%s RETURNING *", (cob, prev_business_day(cob), fund), ) for row in c: yield IAMDeal.from_dict(**d) def main(fund, cob, conn): service = Service[fund] for old_iam in gen_old_iam(fund, cob, conn): service.push_trade(old_iam, "CANCEL") for new_iam in gen_iam(fund, cob, conn): new_iam.stage() if fund in ("BOWDST"): for new_iam_offset in gen_iam_offsets(fund, cob, conn): new_iam_offset.stage() for iam in IAMDeal.commit(returning=True): service.push(iam, "NEW") for update_iam in gen_matured_iam(fund, cob, conn): service.push(update_iam, "UPDATE") conn.commit() buf, dest = service.build_buffer() service.upload(buf, dest.name) 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)