aboutsummaryrefslogtreecommitdiffstats
path: root/python/report_ops/custodians.py
blob: 8f952d572d02e3be3b97f45eebdca80e8a602ac3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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)