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.
{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)