aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/bowdst.py9
-rw-r--r--python/bowdst_wire.py31
-rw-r--r--python/citco_ops/bowdst.py46
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",
+ )