1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
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)",
(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),
)
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)
|