from serenitas.utils.db import dbconn from process_queue import rename_keys from io import StringIO import csv from serenitas.utils.env import DAILY_DIR from serenitas.utils.remote import SftpClient from serenitas.analytics.dates import next_business_day import datetime from trade_dataclasses import CDSDeal HEADERS = { "tranche": [ "Swap ID", "Allocation ID", "Description", "Broker Id", "DTCC CounterParty ID", "Trade ID", "Trade Date", "Effective Date", "Settle Date", "Maturity Date", "Account Abbreviation", "1st Leg Notional", "Currency Code", "1st Leg Rate", "Initial Payment", "Initial Payment Currency", "Original Issue Date", "Interest Payment Method Description", "First Payment Date", "Product Type", "Product Sub Type", "Transaction Type", "Protection", "Transaction Code", "Remaining Party", "DTCC Remaining CounterParty ID", "Independent Amount (%)", "Independent Amount ($)", "RED", "Issuer Name", "Settlement Amount", "Trader", "Executing Broker", "Dealer Trade ID", "Notes", "Parent Transaction Code", "Parent Trade Date", "Parent Notional", "Parent Currency Code", "Parent Net Amount", "Parent Effective Date", "Parent First Payment Date", "Parent Settle Date", "ComplianceHubAction", "DTCC Ineligible", "Master Document Date", "Master Document Version", "Include Contractual Supplement", "Contractual Supplement", "Supplement Date", "Entity Matrix", "Entity Matrix Date", "Modified Equity Delivery", "Calculation Agent Business Center", "Calculation Agent", "Attachment Point", "Exhaustion Point", "Strategy", "First Payment Period Accrual Start Date", "TieOut Ineligible", "Electronic Consent Ineligible", "External OMS ID", "Independent Amount Currency", "Independent Amount Payer", "Trade Revision", "Alternate Swap ID", "Alternate Trade ID", "Definitions Type", ] } def tranche_trades(conn): trades = [] obj = CDSDeal.from_tradeid(3472).to_markit() trades.append(obj) return trades def tranche_term_trades(conn): with conn.cursor() as c: trades = [] c.execute( "SELECT * FROM terminations where termination_date > %s and dealid LIKE %s", (datetime.date(2021, 12, 15), "SCCDS%"), ) for row in c: obj = row._asdict() rename_keys( obj, { "dealid": "Swap ID", "termination_cp": "Broker Id", "termination_amount": "1st Leg Notional", "termination_fee": "Initial Payment", "termination_date": "Trade Date", "fee_payment_date": "Settle Date", }, ) if obj["Initial Payment"] >= 0: obj["Transaction Code"] = "Receive" else: obj["Initial Payment"] = abs(obj["Initial Payment"]) obj["Transaction Code"] = "Pay" obj["Product Type"] = "TRN" obj["Entity Matrix"] = "Publisher" obj["Definitions Type"] = "ISDA2003Credit" obj["Account Abbreviation"] = "Serenitas-test1" obj["Broker Id"] = "0000571T" obj["Remaining Party"] = "0000571T" obj["Trade ID"] = obj["Swap ID"] + "-" + str(obj["id"]) obj["Transaction Type"] = "Partial Assignment" obj["Effective Date"] = obj["Trade Date"] + datetime.timedelta(days=1) trades.append(obj) return trades def build_line(obj, asset_type): return [obj.get(h, None) for h in HEADERS[asset_type]] def process_upload(trades, asset_type, upload): buf = StringIO() csvwriter = csv.writer(buf) csvwriter.writerow(HEADERS[asset_type]) csvwriter.writerows(build_line(trade, asset_type) for trade in trades) buf = buf.getvalue().encode() fname = f"MTM.{datetime.datetime.now():%Y%m%d.%H%M%S}.{asset_type.capitalize()}.csv" sftp = SftpClient.from_creds("mtm") sftp.put(buf, fname) dest = DAILY_DIR / str(datetime.date.today()) / fname dest.write_bytes(buf) def upload_trades(conn): process_upload(tranche_trades(conn), "tranche", upload=False) if __name__ == "__main__": conn = dbconn("dawndb") upload_trades(conn)