import datetime from tabulate import tabulate from exchangelib import HTMLBody from serenitas.utils.db2 import dbconn from serenitas.utils.exchange import ExchangeMessage from report_ops.utils import Monitor from report_ops.misc import _settlement_recipients, _cc_recipients class FXMonitor( Monitor, headers=( "dealid", "counterparty_id", "trade_date", "settle_date", "cp_code", "name", "buy_currency", "buy_amount", "sell_currency", "sell_amount", ), num_format=[("{0:,.2f}", 7), ("{0:,.2f}", 9)], ): @classmethod def email(cls, fund, settle_date): if not cls._staging_queue: return cls._em.send_email( f"FX Settlements {fund}: {settle_date}", HTMLBody( f""" Hello,

We see the below FX Settlements for VD {settle_date}. Could you please draft wires and reach out to the counterparty? As these are electronically agreed, please send out the funds regardless of confirmation from counterparty. These trades should be settled net.

{cls.to_tabulate()} """ ), to_recipients=_settlement_recipients[fund], cc_recipients=_cc_recipients[fund], ) def email_setts(settle_date, conn, fund): QUERY = "SELECT dealid, trade_date, settle_date, ft.cp_code, ft.name, buy_currency, buy_amount, sell_currency, sell_amount, cpty_id as counterparty_id FROM forward_trades ft LEFT JOIN accounts2 USING (cash_account) WHERE accounts2.fund=%s AND ft.settle_date=%s AND accounts2.account_type='Cash';" with conn.cursor() as c: c.execute( QUERY, (fund, settle_date), ) for rec in c: d = rec._asdict() FXMonitor.stage(d) FXMonitor.email(fund, settle_date) FXMonitor.clear() if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument( "settle_date", nargs="?", type=datetime.date.fromisoformat, default=datetime.date.today(), help="settle date", ) args = parser.parse_args() conn = dbconn("dawndb") for fund in ( "SERCGMAST", "ISOSEL", # "BOWDST", ): email_setts(args.settle_date, conn, fund)