diff options
Diffstat (limited to 'python/citco_ops/bowdst.py')
| -rw-r--r-- | python/citco_ops/bowdst.py | 53 |
1 files changed, 49 insertions, 4 deletions
diff --git a/python/citco_ops/bowdst.py b/python/citco_ops/bowdst.py index 59f46769..9f1965fd 100644 --- a/python/citco_ops/bowdst.py +++ b/python/citco_ops/bowdst.py @@ -2,6 +2,10 @@ from dataclasses import dataclass import datetime from serenitas.ops.trade_dataclasses import Deal, Ccy from typing import ClassVar +from .custodians import NT, BNY +from .misc import get_dir +from dataclasses import field +from csv import DictReader _nt_to_currency = {"EURO - EUR": "EUR", "U.S. DOLLARS - USD": "USD"} @@ -17,13 +21,15 @@ class Wire(Deal, table_name="custodian_wires", deal_type="custodian_wires"): amount: float wire_details: str unique_ref: str + dtkey: ClassVar = field(metadata={"insert": False, "select": False}) - def __init_subclass__(cls, fund, **kwargs): + def __init_subclass__(cls, fund, dtkey, **kwargs): cls._sql_insert = ( cls._sql_insert.removesuffix("RETURNING *") + "ON CONFLICT (unique_ref) DO NOTHING RETURNING *" ) cls.fund = fund + cls.dtkey = dtkey def __post_init__(self): self.amount = self.amount.replace(",", "") @@ -32,10 +38,30 @@ class Wire(Deal, table_name="custodian_wires", deal_type="custodian_wires"): else: self.amount = float(self.amount) + @classmethod + def to_db(cls, fname, date): + cls.download_reports(date) + p = max( + [f for f in get_dir(date).iterdir() if fname in f.name], + key=cls.dtkey_fun(), + default=None, + ) + return p + + @classmethod + def dtkey_fun(cls): + def dtkey_fun(f): + return datetime.datetime.strptime( + f.name.removesuffix(".csv").removesuffix(".xlsx").rsplit("_")[-1], + cls.dtkey, + ) + + return dtkey_fun -class BowdstWire(Wire, fund="BOWDST"): + +class BowdstWire(Wire, BNY, fund="BOWDST", dtkey="%Y%m%d%H%M%S"): @classmethod - def from_nexen_line(cls, line: dict): + def from_report_line(cls, line: dict): return cls( date=line["Report Run Date"], entry_date=line["Cash Entry Date"], @@ -49,8 +75,17 @@ class BowdstWire(Wire, fund="BOWDST"): unique_ref=line["Reference Number"], ) + @classmethod + def to_db(cls, date): + p = super().to_db("BowdstWires", date) + with open(p) as fh: + reader = DictReader(fh) + for line in reader: + cls.from_report_line(line).stage() + cls.commit() + -class IsoselWire(Wire, fund="ISOSEL"): +class NTWire(Wire, NT, fund="ISOSEL", dtkey="%Y%m%d%H%M"): @classmethod def from_passport_line(cls, line: dict): return cls( @@ -63,3 +98,13 @@ class IsoselWire(Wire, fund="ISOSEL"): wire_details=line["narrative"], unique_ref=line["C-EXTL-SYS-TRN-DSC-3"], ) + + @classmethod + def to_db(cls, date): + p = super().to_db("custodian_wires", date) + with open(p) as fh: + reader = DictReader(fh) + for line in reader: + if "sponsor" in line["narrative"].lower(): + cls.from_preport_line(line).stage() + cls.commit() |
