aboutsummaryrefslogtreecommitdiffstats
path: root/python/process_queue.py
blob: 02752d035b595413b093421233bad8c598624d17 (plain)
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import redis
import pandas as pd
import csv
import sys
if sys.version_info.major == 3:
    from io import StringIO
else:
    from cStringIO import StringIO

# from io import BytesIO, StringIO
import datetime
from pickle import loads
from ftplib import FTP
import config
import os
import sys

def decode_dict(d):
    return {k.decode() if isinstance(k, bytes) else k: \
            v.decode() if isinstance(v, bytes) else v for k, v in d.items()}

def get_trades():
    q = redis.Redis(host = 'debian')
    p = q.pipeline()
    p.lrange('trades', 0, -1)
    #.delete('trades')
    r = p.execute()
    if sys.version_info.major == 3:
        df = pd.DataFrame([decode_dict(loads(e, encoding='bytes')) for e in r[0]])
    else:
        df = pd.DataFrame([loads(e) for e in r[0]])
    return df

def aux(v):
    if v.action.iat[-1] == 'CANCEL':
        return None
    if v.action.iat[0] == 'NEW':
        v.action.iat[-1] = 'NEW'
    return v.iloc[-1]

def build_line(obj):
    line = ["MortgageDeal", obj.dealid, obj.action ,"Serenitas", None, None , obj.folder,
            obj.custodian, obj.cashaccount, obj.cp_code, None, 'Valid',
            str(obj.trade_date), str(obj.settle_date), None, None, obj.cusip, obj['isin'],
            None, None, None, obj['description'], "Buy" if obj.buysell else "Sell", None,
            obj.accrued, obj.price, None, None, 'SERCGMAST', 'MORTGAGE',
            None, None, None, None, obj.faceamount, None, None, 'S']
    return line

def generate_csv(df):
    output = StringIO()
    csvwriter = csv.writer(output)
    headers = ['Deal Type', 'Deal ID', 'Action', 'Client', 'Reserved', 'Reserved',
               'Folder', 'Custodian', 'Cash Account', 'Counterparty', 'Comments',
               'State', 'Trade Date', 'Settlement Date', 'Reserved', 'GlopeOp Security Identifier',
               'CUSIP', 'ISIN', 'Reserved', 'Reserved',
               'Reserved', 'Security Description', 'Transaction Indicator',
               'SubTransaction Indicator', 'Accrued', 'Price', 'BlockId', 'BlockAmount',
	       'Fund', 'Portfolio', 'Reserved', 'Reserved', 'ClientReference', 'ClearingMode',
               'FaceAmount', 'Pool Factor', 'FactorAsOfDate', 'Delivery']
    csvwriter.writerow(headers)
    flag = False
    for tradeid, v  in df.sort('lastupdate').groupby('id'):
        trade = aux(v)
        if trade is not None:
            flag = True
            csvwriter.writerow(build_line(trade))
    #convert to bytes
    if flag:
        if sys.version_info.major == 3:
            return output.getvalue().encode()
        else:
            return output.getvalue()

def upload_file(timestamp):
    ftp = FTP('ftp.globeop.com')
    ftp.login('srntsftp', config.ftp_password)
    ftp.cwd('incoming')
    filename = 'Serenitas.ALL.{0:%Y%m%d.%H%M%S}.Mortgages.csv'.format(timestamp)
    cmd = 'STOR {0}'.format(filename)
    with open(os.path.join('/home/share/Daily', str(timestamp.date()), filename), 'rb') as fh:
        ftp.storbinary(cmd, fh)

def write_buffer(buf):
    timestamp = pd.datetime.now()
    filename = 'Serenitas.ALL.{0:%Y%m%d.%H%M%S}.Mortgages.csv'.format(timestamp)
    with open(os.path.join('/home/share/Daily', str(timestamp.date()), filename), 'wb') as fh:
        fh.write(buf)
    return timestamp

if __name__=="__main__":
    df = get_trades()
    if not df.empty:
        buf = generate_csv(df)
        if buf:
            timestamp = write_buffer(buf)
            #upload_file(timestamp)