diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/citco_ops/utils.py | 40 | ||||
| -rw-r--r-- | python/innocap_bond_setts.py | 48 |
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) |
