import datetime import pandas as pd from env import DAILY_DIR from exchange import ExchangeMessage, Message from exchangelib import FileAttachment from io import StringIO from remote import SftpClient from typing import Tuple from utils.db import dbconn def download_messages(em): for msg in em.get_msgs( 20, path=["BowdoinOps", "Reports"], subject__startswith="Document(s) from Reporting", ): if msg.sender == "notify@bnymellon.com": for attach in msg.attachments: fname = attach.name if fname.endswith("csv") and fname.startswith("Asset Detail"): date = datetime.datetime.strptime( fname.split("_")[1].split(".")[0], "%d %b %Y" ).date() p = DAILY_DIR / str(date) / "Reports" / fname if not p.parent.exists(): p.parent.mkdir(parents=True) if not p.exists(): p.write_bytes(attach.content) def get_positions(workdate: datetime.date) -> Tuple[pd.DataFrame, pd.DataFrame]: p = DAILY_DIR / str(workdate) / "Reports" / f"Asset Detail_{workdate:%d %b %Y}.csv" df = pd.read_csv(p, thousands=",") df = df[df["Asset Type"] == "FIXED INCOME SECURITIES"] df = df.set_index("CUSIP") df = df[["Shares/Par", "Base Price", "Local Market Value"]] for col in df.select_dtypes(include=["object"]).columns: df[col] = df[col].apply(lambda s: s[1:-1] if s.startswith("(") else s) df[col] = pd.to_numeric(df[col].str.replace(",", "")) dawndb = dbconn("dawndb") df_blotter = pd.read_sql_query( "SELECT * FROM risk_positions(%s, NULL, %s)", dawndb, params=(workdate, "BOWDST"), index_col=["identifier"], ) check = df_blotter.join(df) cds_positions = pd.read_sql_query( "SELECT * FROM list_cds_marks_pre(%s, NULL, %s)", dawndb, params=(workdate, "BOWDST"), ) return df_blotter, cds_positions def send_email( em, workdate: datetime.date, df_bonds: pd.DataFrame, df_cds: pd.DataFrame ): email = Message( account=em._account, folder=em._account.sent, subject=f"{workdate} positions", body="", to_recipients=("reconfiles@bnymellon.com", "hm-operations@bnymellon.com"), cc_recipients=("bowdoin-ops@lmcg.com",), ) buf = StringIO() df_bonds.to_csv(buf) bond_attach = FileAttachment( name=f"{workdate} bonds.csv", content=buf.getvalue().encode() ) buf.close() email.attach(bond_attach) buf = StringIO() df_cds.to_csv(buf, index=False) cds_attach = FileAttachment( name=f"{workdate} cds.csv", content=buf.getvalue().encode() ) buf.close() email.attach(cds_attach) email.send_and_save() if __name__ == "__main__": em = ExchangeMessage() download_messages(em) workdate = datetime.date.today() df_bonds, df_cds = get_positions(workdate) send_email(em, workdate, df_bonds, df_cds) # sftp = SftpClient.from_creds("gs")