diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/bowdst.py | 9 | ||||
| -rw-r--r-- | python/bowdst_wire.py | 31 | ||||
| -rw-r--r-- | python/citco_ops/bowdst.py | 46 |
3 files changed, 84 insertions, 2 deletions
diff --git a/python/bowdst.py b/python/bowdst.py index b74eafa3..47b6577d 100644 --- a/python/bowdst.py +++ b/python/bowdst.py @@ -10,6 +10,7 @@ from serenitas.utils.env import DAILY_DIR def download_messages(em): + bowdst_wire_recent = True for msg in em.get_msgs( 20, path=["BowdoinOps", "Reports"], @@ -22,7 +23,7 @@ def download_messages(em): fname.startswith("Asset Detail") or fname.startswith("Net Investment") or fname.startswith("Settled Cash") - or fname.startswith("bowdst_wire") + or fname.startswith("BowdstWires") ): date = datetime.datetime.strptime( fname.split("_")[1].split(".")[0], "%d %b %Y" @@ -30,7 +31,11 @@ def download_messages(em): p = DAILY_DIR / str(date) / "Reports" / fname if not p.parent.exists(): p.parent.mkdir(parents=True, exist_ok=True) - if not p.exists(): + 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) diff --git a/python/bowdst_wire.py b/python/bowdst_wire.py new file mode 100644 index 00000000..4e8c99f0 --- /dev/null +++ b/python/bowdst_wire.py @@ -0,0 +1,31 @@ +from bowdst import get_dir, download_messages +from csv import DictReader +from citco_ops.bowdst import BowdstWire +import datetime + + +def load_wire_report(workdate: datetime.date): + p = get_dir(workdate) / f"BowdstWires_{workdate:%d %b %Y}.csv" + with open(p) as fh: + reader = DictReader(fh) + for line in reader: + BowdstWire.from_nexen_line(line).stage() + BowdstWire.commit() + + +if __name__ == "__main__": + import argparse + from serenitas.utils.exchange import ExchangeMessage + + parser = argparse.ArgumentParser() + parser.add_argument( + "workdate", + nargs="?", + type=datetime.date.fromisoformat, + default=datetime.date.today(), + help="working date", + ) + args = parser.parse_args() + em = ExchangeMessage() + download_messages(em) + load_wire_report(args.workdate) diff --git a/python/citco_ops/bowdst.py b/python/citco_ops/bowdst.py new file mode 100644 index 00000000..7d93060b --- /dev/null +++ b/python/citco_ops/bowdst.py @@ -0,0 +1,46 @@ +from dataclasses import dataclass, field +import datetime +from serenitas.ops.trade_dataclasses import Fund, Deal, Ccy +from psycopg.errors import UniqueViolation + + +@dataclass +class WireBase(Deal, table_name="custodian_wires", deal_type="custodian_wires"): + date: datetime.date + fund: Fund + entry_date: datetime.date + value_date: datetime.date + pay_date: datetime.date + currency: Ccy + amount: float + wire_details: str + unique_ref: str + + def __init_subclass__(cls, fund, **kwargs): + cls.fund = fund + + @classmethod + def commit(cls): + cls._sql_insert += " ON CONFLICT (unique_ref) DO NOTHING" + with cls._conn.cursor() as c: + c.executemany(cls._sql_insert, cls._insert_queue) + cls._conn.commit() + cls._insert_queue.clear() + + +class BowdstWire(WireBase, fund="BOWDST"): + @classmethod + def from_nexen_line(cls, line: dict): + return cls( + date=line["Report Run Date"], + entry_date=line["Cash Entry Date"], + value_date=line["Cash Value Date"], + pay_date=line["Settle / Pay Date"], + currency=line["Reporting Currency Code"], + amount=line["Local Amount"].replace(",", ""), + wire_details=line["Transaction Description 1"] + if line["Transaction Type Code"] == "CW" + else line["Transaction Description 2"], + unique_ref=line["Reference Number"], + fund="BOWDST", + ) |
