import datetime import argparse from exchangelib import HTMLBody from report_ops.utils import Monitor from mtm_status import get_latest_file counterparty_contacts = { ("BAMSNY", "USD"): ( "dg.gcss_usip_mo@bofa.com", "shalini.goel@bofa.com", "dtcc.chasing@bofa.com", "dg.cmbs-mbex_trade_support@bofa.com", ), ("BAMSNY", "EUR"): ( "emea_credit_fo_support@bofa.com", "dtcc.chasing@bofa.com", "dg.cmbs-mbex_trade_support@bofa.com", ), ("JPCBNY", "USD"): ("credit.na.affirmations@jpmorgan.com",), ("JPCBNY", "EUR"): ("JPM.creditassignmentseurope@jpmorgan.com",), ("MSCSNY", "USD"): ("msnovationsteam@morganstanley.com",), ("GOLDNY", "USD"): ( "Navneet.Sawant@gs.com", "Vishal.Kanojia@ny.email.gs.com", "NY-CDMO@ny.email.gs.com", ), ("GOLDNY", "EUR"): ( "Navneet.Sawant@gs.com", "Vishal.Kanojia@ny.email.gs.com", "LDNCDMO@gs.com", ), ("CITINY", "USD"): ( "citiassignmentsus@citigroup.com", "james.b.okun@citi.com", ), ("CITINY", "EUR"): ( "citiassignmentsus@citigroup.com", "aaron.beasant@citi.com", ), ("BNPBNY", "USD"): ("LM_Sales_Assistants@US.BNPParibas.com",), ("BNPBNY", "EUR"): ("CDSnovationsEurope@bnpparibas.com",), } class CreditNovationsMonitor( Monitor, headers=( "date", "ncm_id", "EE", "RP", "currency", ), num_format=[], ): @classmethod def email(cls, date, contacts): if not cls._staging_queue: return cls._em.send_email( f"*ACTION REQUESTED* Unconsented Novations Due Today {date}", HTMLBody( f""" Good morning,

We have the below novations expiring today. Could you please consent or provide us an update on the novations?

{cls.to_tabulate()} """ ), to_recipients=contacts, cc_recipients=("NYOPs@lmcg.com",), reply_to=("NYOPs@lmcg.com",), ) def contact_novation_counterparties(date): df = get_latest_file(date) df = df[ (df["SwapType"].isin(["ASGM"])) & (df["ThirdPartyStatus.1"].isin(["Pending Consent"])) ] df = ( df.groupby( ["ExecutingBroker", "RemainingBroker", "CurrencyCode"], group_keys=False )["Novation Consent ID"] .apply(list) .reset_index() ) for row in df.itertuples(): d = { "date": date, "currency": row.CurrencyCode, "EE": row.ExecutingBroker, "RP": row.RemainingBroker, } contacts = ( counterparty_contacts[(row.ExecutingBroker, row.CurrencyCode)] + counterparty_contacts[(row.RemainingBroker, row.CurrencyCode)] ) for novationid in row[4]: CreditNovationsMonitor.stage(d | {"ncm_id": novationid}) CreditNovationsMonitor.email(date, contacts) CreditNovationsMonitor.clear() if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument( "date", type=datetime.date.fromisoformat, default=datetime.date.today(), nargs="?", ) args = parser.parse_args() contact_novation_counterparties(args.date)