aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/citco_ops/utils.py40
-rw-r--r--python/innocap_bond_setts.py48
2 files changed, 49 insertions, 39 deletions
diff --git a/python/citco_ops/utils.py b/python/citco_ops/utils.py
index ba863a01..b2b5b356 100644
--- a/python/citco_ops/utils.py
+++ b/python/citco_ops/utils.py
@@ -6,6 +6,7 @@ import csv
from serenitas.ops.trade_dataclasses import Deal
from serenitas.utils.exchange import ExchangeMessage
from psycopg.errors import UniqueViolation
+from typing import ClassVar
logger = logging.getLogger(__name__)
@@ -119,3 +120,42 @@ class CitcoSubmission(Deal, deal_type=None, table_name="citco_submission"):
)
finally:
cls._insert_queue.clear()
+
+
+_recipients = {
+ "ISOSEL": (
+ "simon.oreilly@innocap.com",
+ "margincalls@innocapglobal.com",
+ ),
+}
+
+
+@dataclass
+class PaymentSettlement:
+ settle_date: datetime.date
+ currency: str
+ amount: float
+ _insert_queue: ClassVar[list] = []
+
+ @classmethod
+ def stage_payment(cls, settlements):
+ for row in settlements:
+ cls._insert_queue.append(
+ cls(row.settle_date, row.currency, row.payment_amount)
+ )
+
+ def to_innocap(self):
+ return f"\t* {self.settle_date}: {self.amount:,.2f} {self.currency}"
+
+ @classmethod
+ def email_innocap(cls, date):
+ if not cls._insert_queue:
+ return
+ em = ExchangeMessage()
+ em.send_email(
+ f"Payment Settlements Bond NT: ISOSEL {date}",
+ "Good morning, \n\nWe have the following amounts settling in the next few days at Northern Trust: (Positive Amounts = Receive, Negative Amounts=Pay)\n\n"
+ + "\n".join(settlement.to_innocap() for settlement in cls._insert_queue),
+ to_recipients=_recipients["ISOSEL"],
+ cc_recipients=("Selene-Ops@lmcg.com",),
+ )
diff --git a/python/innocap_bond_setts.py b/python/innocap_bond_setts.py
index 49eb910d..124e0210 100644
--- a/python/innocap_bond_setts.py
+++ b/python/innocap_bond_setts.py
@@ -1,34 +1,8 @@
-from serenitas.utils.db import dbconn
-from serenitas.utils.exchange import ExchangeMessage
import datetime
import logging
-
-_recipients = {
- "ISOSEL": (
- "simon.oreilly@innocap.com",
- "margincalls@innocapglobal.com",
- ),
-}
-
-
-def _formatting(payment_values):
- if not payment_values:
- return None
- else:
- return "\n".join(
- f"\t* {settle_date}: {amount:,.2f} {currency}"
- for settle_date, (amount, currency) in payment_values.items()
- )
-
-
-def payment_values(ped, conn, fund):
- sql_str = "SELECT settle_date, currency, sum(payment_amount) as payment_amount FROM payment_settlements ps2 WHERE fund=%s AND asset_class='bond' AND %s < (settle_date + INTERVAL '5' DAY) group by settle_date, currency;"
- with conn.cursor() as c:
- c.execute(sql_str, (fund, ped))
- return _formatting(
- {row.settle_date: (row.payment_amount, row.currency) for row in c}
- )
-
+from serenitas.utils.db import dbconn
+from serenitas.utils.exchange import ExchangeMessage
+from citco_ops.utils import PaymentSettlement
if __name__ == "__main__":
import argparse
@@ -44,13 +18,9 @@ if __name__ == "__main__":
args = parser.parse_args()
logger = logging.getLogger(__name__)
conn = dbconn("dawndb")
- em = ExchangeMessage()
- for fund in ("ISOSEL",):
- if vals := payment_values(args.date, conn, fund):
- em.send_email(
- f"Payment Settlements Bond NT: {fund} {args.date}",
- "Good morning, \n\nWe have the following amounts settling in the next few days: (Positive Amounts = Receive, Negative Amounts=Pay)\n\n"
- + vals,
- to_recipients=_recipients[fund],
- cc_recipients=("Selene-Ops@lmcg.com",),
- )
+ sql_str = "SELECT settle_date, currency, sum(payment_amount) as payment_amount FROM payment_settlements ps2 WHERE fund=%s AND asset_class in ('bond', 'spot') AND %s < (settle_date + INTERVAL '5' DAY) group by settle_date, currency;"
+ with conn.cursor() as c:
+ for fund in ("ISOSEL",):
+ c.execute(sql_str, (fund, args.date))
+ PaymentSettlement.stage_payment(c)
+ PaymentSettlement.email_innocap(args.date)