aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/report_ops/custodians.py101
1 files changed, 101 insertions, 0 deletions
diff --git a/python/report_ops/custodians.py b/python/report_ops/custodians.py
new file mode 100644
index 00000000..8f952d57
--- /dev/null
+++ b/python/report_ops/custodians.py
@@ -0,0 +1,101 @@
+from serenitas.utils.exchange import ExchangeMessage
+from serenitas.utils.env import DAILY_DIR
+import warnings
+import datetime
+from .misc import get_dir, dt_from_fname
+import gpg
+
+
+class NT:
+ @classmethod
+ def download_reports(cls, date=datetime.date.today()):
+ em = ExchangeMessage()
+ for msg in em.get_msgs(path=["SeleneOps", "Passport"]):
+ for attach in msg.attachments:
+ message_time = attach.last_modified_time
+ if attach.name == "Attachment1.pgp" and message_time.date() == date:
+ dest = get_dir(message_time.date(), archived=False)
+ dest.mkdir(exist_ok=True, parents=True)
+ with attach.fp as fp:
+ plaintext, result, verify_result = gpg.Context().decrypt(
+ fp.read(), passphrase="Serenitas1"
+ )
+ fname = (
+ "custodian_wires"
+ if "custodian" in verify_result.file_name
+ else "cash"
+ )
+ dest = dest / f"{fname}_{message_time:%Y%m%d%H%M}.csv"
+ with open(dest, "w") as csvFile:
+ text = plaintext.decode("utf-8").replace("\t", ",")
+ csvFile.write(text)
+
+
+class UMB:
+ @classmethod
+ def download_reports(cls, date=datetime.date.today()):
+ em = ExchangeMessage()
+ for msg in em.get_msgs(count=20, path=["NYops", "Powerstation"]):
+ for attach in msg.attachments:
+ timestamp = attach.last_modified_time
+ if (
+ attach.name.startswith("cash_reporting")
+ and timestamp.date() == date
+ ):
+ dest = get_dir(timestamp.date(), archived=False)
+ dest.mkdir(exist_ok=True, parents=True)
+ p = dest / f"umb_{timestamp:%Y%m%d%H%M}.xlsx"
+ if not p.exists():
+ p.write_bytes(attach.content)
+
+
+class BNY:
+ @classmethod
+ def download_reports(cls, date=datetime.date.today()):
+ em = ExchangeMessage()
+ bowdst_wire_recent = True
+ 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"):
+ base_name = fname.removesuffix(".csv")
+ file_type, date_part = base_name.split("_")
+ match file_type:
+ case (
+ "Asset Detail"
+ | "Net Investment Earned Income by Security"
+ | "Settled Cash Statement"
+ ):
+ date = datetime.datetime.strptime(
+ date_part, "%d %b %Y"
+ ).date()
+ case "BowdstWires":
+ try:
+ date = datetime.datetime.strptime(
+ date_part, "%Y%m%d%H%M%S"
+ ).date()
+ except ValueError:
+ date = datetime.datetime.strptime(
+ date_part, "%d %b %Y%H%M%S"
+ ).date()
+ case "Live-cash":
+ date = datetime.datetime.strptime(
+ date_part, "%Y%m%d%H%M%S"
+ ).date()
+ case _:
+ warnings.warn(f"Unknown report type {file_type}")
+ continue
+ p = DAILY_DIR / str(date) / "Reports" / fname
+ if not p.parent.exists():
+ p.parent.mkdir(parents=True, exist_ok=True)
+ if not p.exists() or (
+ fname.startswith("BowdstWires") and bowdst_wire_recent
+ ):
+ if fname.startswith("BowdstWires"):
+ bowdst_wire_recent = False
+ p.write_bytes(attach.content)