import datetime from serenitas.ops.funds import Service from report_ops.cash import IAMDeal from serenitas.analytics.dates import prev_business_day _bowdst_iam_cp = { "BAML_ISDA": "BOANNY", "CS": "CSITLN", "GS": "GOLINY", "BNP": "BNPBNY", "MS": "MSCILN", "JPM": "JPCBNY", "GS_FCM": "GOLDNY", } _serenitas_iam_cp = { "BAML_ISDA": "BAMSNY", "CS": "CSFBBO", "GS": "GOLDNY", "BNP": "BNPBNY", "MS": "MSCSNY", "JPM": "JPCBNY", "GS_FCM": "GOLDNY", } def get_counterparty(fund, iam_broker): match fund: case "SERCGMAST": return _serenitas_iam_cp[iam_broker] case "BOWDST": return _bowdst_iam_cp[iam_broker] def get_custodian_account(fund, iam_broker): match fund, iam_broker: case ("SERCGMAST", "WF_FCM"): return ("WELLSFCM", "WFNSCLMFCM") case ("SERCGMAST", "BAML_FCM"): return ("BOMLCM", "V0NSCLMFCM") case ("BOWDST", "GS_FCM"): return ("GS", "057363418ICE-CDS") case ("SERCGMAST", _): return ("UMB", "159260.1") case ("BOWDST", _): return ("BNY", "751254") def globeop_mapping(fund, iam_broker): (custodian, cash_account) = get_custodian_account(fund, iam_broker) return { "custodian": custodian, "cash_account": cash_account, "counterparty": get_counterparty(fund, iam_broker), } def gen_new_iam_deals(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() | globeop_mapping(fund, row.broker) yield IAMDeal.from_dict(**d) 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() | globeop_mapping(fund, row.broker) | {"offset": True, "folder": "M_CSH_CASH"} ) return IAMDeal.from_dict(**d) def main(fund, cob, conn): service = Service[fund] for iam in gen_iam_deals(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() 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)