import codecs import datetime import re from csv import reader from io import BytesIO from serenitas.utils.remote import FtpClient from serenitas.utils.db import dbconn def ack_check(date: datetime.date, conn): ftp = FtpClient.from_creds("globeop") ftp.client.cwd("outgoing") files = [ f for f in ftp.client.nlst() if f.startswith(f"Serenitas.ALL.{date:%Y%m%d}") ] for f in files: buf = BytesIO() ftp.client.retrbinary("RETR " + f, buf.write) buf.seek(0) csv = reader(codecs.iterdecode(buf, "utf-8")) for serenitas_id, action, dealtype, result, globeop_id, _, _ in csv: if action == "NEW" and result == "Loaded": globeop_id = int(globeop_id) if m := re.match("[^0-9]*([0-9]*)", serenitas_id): serenitas_id = int(m.groups()[0]) if dealtype == "CreditDefaultSwapDeal": with conn.cursor() as c: c.execute( "SELECT trade_date, orig_attach FROM cds WHERE id=%s", (serenitas_id,), ) (trade_date, attach) = c.fetchone() if attach is None: continue with conn.cursor() as c: c.execute( "INSERT INTO id_mapping VALUES(%s, %s, %s, %s) " "ON CONFLICT DO NOTHING", (trade_date, "CDS", serenitas_id, globeop_id), ) if dealtype == "SwaptionDeal": with conn.cursor() as c: c.execute( "UPDATE swaptions SET globeop_id=%s WHERE id=%s", (globeop_id, serenitas_id), ) if dealtype == "ForwardDeal": with conn.cursor() as c: c.execute( "UPDATE spots SET globeop_id=%s WHERE id=%s", (globeop_id, serenitas_id), ) conn.commit() if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument( "workdate", nargs="?", type=datetime.date.fromisoformat, default=datetime.date.today(), help="working date", ) args = parser.parse_args() dawndb = dbconn("dawndb") ack_check(args.workdate, dawndb)