Subversion Repositories SmartDukaan

Rev

Rev 11490 | Rev 13430 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6147 rajveer 1
#!/usr/bin/python
2
'''
3
It is used to process transactions for which the payment 
4
was received but the order was not processed.
5
 
6
@author: Rajveer
7
'''
8
import optparse
9
import sys
6219 rajveer 10
import datetime
9321 anupam.sin 11
import base64, re
7141 rajveer 12
from datetime import timedelta
6235 rajveer 13
from elixir import *
7141 rajveer 14
from sqlalchemy.sql import func
15
import urllib
16
import httplib
9321 anupam.sin 17
from xml.dom.minidom import parseString
7175 rajveer 18
from shop2020.utils.EmailAttachmentSender import mail, mail_html
8788 rajveer 19
from shop2020.model.v1.order.impl.model.UserWalletHistory import UserWalletHistory
20
from shop2020.utils.Utils import to_java_date, to_py_date
21
from shop2020.clients.PaymentClient import PaymentClient
9321 anupam.sin 22
from shop2020.model.v1.order.impl.model.BaseOrder import BaseOrder
6147 rajveer 23
 
9321 anupam.sin 24
from shop2020.clients.TransactionClient import TransactionClient
6147 rajveer 25
 
26
 
27
if __name__ == '__main__' and __package__ is None:
28
    import os
29
    sys.path.insert(0, os.getcwd())
7986 anupam.sin 30
from datetime import date, timedelta
7967 anupam.sin 31
from shop2020.clients.HelperClient import HelperClient
7167 rajveer 32
from shop2020.thriftpy.model.v1.order.ttypes import RechargeOrderStatus,\
33
    OrderType
6254 rajveer 34
from shop2020.model.v1.order.impl.DataAccessors import get_recharge_orders_for_status, update_recharge_order_status,\
7147 rajveer 35
    update_recharge_transaction_status, get_next_invoice_number
7128 rajveer 36
from shop2020.model.v1.order.impl import DataService
7147 rajveer 37
from shop2020.model.v1.order.impl.DataService import RechargeTransaction, HotspotStore,\
8788 rajveer 38
    WalletForCompany, WalletHistoryForCompany, RechargeCollection, Company, HotspotServiceMatrix,\
9321 anupam.sin 39
    RechargeVoucherTracker, SpiceTransactionHistory
6235 rajveer 40
from shop2020.model.v1.order.impl.model.RechargeOrder import RechargeOrder
9321 anupam.sin 41
from shop2020.model.v1.order.impl.RechargeService import checkTransactionStatus, getRefunds, getBalance,\
11486 kshitij.so 42
    getRechargeClient, checkTransactionStatus, getAllTransactions, getRechargeStatus
8788 rajveer 43
from sqlalchemy.sql.expression import and_, or_, desc, not_, distinct, cast, between
6147 rajveer 44
 
45
def main():
46
    parser = optparse.OptionParser()
47
    parser.add_option("-H", "--host", dest="hostname",
48
                      default="localhost",
49
                      type="string", help="The HOST where the DB server is running",
50
                      metavar="HOST")
6235 rajveer 51
    parser.add_option("-r", "--refund", dest="refund",
52
                      action="store_true",
53
                      help="")
54
    parser.add_option("-u", "--unknown", dest="unknown",
55
                      action="store_true",
56
                      help="")
6452 rajveer 57
    parser.add_option("-a", "--authorized", dest="authorized",
6451 rajveer 58
                      action="store_true",
59
                      help="")
7141 rajveer 60
    parser.add_option("-c", "--collection", dest="collection",
61
                      action="store_true",
62
                      help="")
9321 anupam.sin 63
    parser.add_option("-m", "--mobisoc", dest="mobisoc",
64
                      action="store_true",
65
                      help="")
8788 rajveer 66
    parser.add_option("-R", "--recon", dest="recon",
67
                      action="store_true",
68
                      help="")
7147 rajveer 69
    parser.add_option("-T", "--topup", dest="topup",
70
                      action="store_true",
71
                      help="")    
6451 rajveer 72
    parser.add_option("-t", "--txn-id", dest="txn_id",
73
                   type="int",
74
                   help="mark the transaction(recharge order id) TXN_ID as successful",
75
                   metavar="TXN_ID")
6235 rajveer 76
 
6147 rajveer 77
    (options, args) = parser.parse_args()
78
    if len(args) != 0:
79
        parser.error("You've supplied extra arguments. Are you sure you want to run this program?")
6254 rajveer 80
    DataService.initialize(db_hostname=options.hostname, echoOn=True)
81
 
6235 rajveer 82
    if options.refund:
83
        processRefunds()
8788 rajveer 84
    if options.recon:
85
        processRecon()
6235 rajveer 86
    if options.unknown:
87
        processUnknownTransactions()
6451 rajveer 88
    if options.authorized:
89
        processAuthorizedTransactions(options.txn_id)
7141 rajveer 90
    if options.collection:
7983 rajveer 91
        wallet = WalletForCompany.query.filter(WalletForCompany.id == 3).one()
92
        oldBalance = wallet.amount
93
        newBalance = getBalance()  
94
        wallet.amount = newBalance
95
        session.commit()
96
 
7141 rajveer 97
        d = datetime.datetime.now()
7144 rajveer 98
        d = d + timedelta(days = -1)
7141 rajveer 99
        compute_recharge_collection(d)
7983 rajveer 100
        compute_website_recharge_collection(d, oldBalance, newBalance)
7147 rajveer 101
    if options.topup:
102
        topup_company_wallet(1,100000)
9321 anupam.sin 103
 
104
    if options.mobisoc:
105
        reconcileWithMobisoc()
106
 
107
def reconcileWithMobisoc():
108
    startTime = datetime.datetime.now() + timedelta(days = -1)
109
    endTime = datetime.datetime.now()
11490 kshitij.so 110
    startTime = startTime.replace(hour=00,minute=00,second=00)
111
    endTime = endTime.replace(hour=00,minute=00,second=00)
9321 anupam.sin 112
    websiteOrders = {}
113
    storeOrders = {}
114
    spiceOrders = {}
115
    rechargeOrders = RechargeOrder.query.filter(not_(RechargeOrder.status.in_([RechargeOrderStatus.INIT, RechargeOrderStatus.PAYMENT_FAILED, RechargeOrderStatus.PAYMENT_PENDING]))).filter(RechargeOrder.creationTimestamp.between(startTime, endTime)).all()
116
    rechargeTransactions = RechargeTransaction.query.filter(not_(RechargeTransaction.status.in_([RechargeOrderStatus.INIT, RechargeOrderStatus.PAYMENT_FAILED, RechargeOrderStatus.PAYMENT_PENDING]))).filter(RechargeTransaction.transactionTime.between(startTime, endTime)).all()
117
    for rechargeOrder in rechargeOrders:
118
        websiteOrders[int(rechargeOrder.id)] = rechargeOrder
119
 
120
    for rechargeTxn in rechargeTransactions:
121
        storeOrders[int(rechargeTxn.id)] = rechargeTxn
122
 
123
    transactions = getAllTransactions(startTime, endTime)
6235 rajveer 124
 
9321 anupam.sin 125
    for txn in transactions:
126
        try:
127
            print "in for loop"
128
            respCode = txn.getElementsByTagName('transactionResponseCode')[0].childNodes[0].data
129
            merchantTid = txn.getElementsByTagName('merchantTid')[0].childNodes[0].data
130
            spiceTid = txn.getElementsByTagName('spiceTid')[0].childNodes[0].data
131
            rechargeTime = txn.getElementsByTagName('rechargeDate')[0].childNodes[0].data
132
            sth = SpiceTransactionHistory()
133
            sth.rechargeTime = rechargeTime
134
            sth.orderId = merchantTid
135
            sth.spiceTID = spiceTid
136
            sth.reponseCode = respCode
137
            session.commit()
138
            spiceOrders[int(merchantTid)] = respCode
139
        except:
140
            continue
141
 
142
    print "Length of storeOrders : " + str(len(storeOrders.keys()))
143
    print "Length of websiteOrders : " + str(len(websiteOrders.keys()))
144
    print "Length of spiceOrders : " + str(len(spiceOrders.keys()))
145
 
146
    for id in spiceOrders.keys():
147
        spiceorder = spiceOrders.get(id)
148
        order = storeOrders.get(id)
149
        if order is None:
150
            order = websiteOrders.get(id)
151
 
152
        if order:
153
            if spiceorder == '00' and order.status in (5, 6):
154
                removed = storeOrders.pop(id, -1)
155
                print str(removed)
156
                if removed == -1:
157
                    removed = websiteOrders.pop(id, -1)
158
                if removed != -1:
159
                    removed = spiceOrders.pop(id, -1)
160
 
161
            elif spiceorder in ('STO','US', 'UP') and order.status in (3, 4, 5, 10, 6, 7, 8):
162
                removed = storeOrders.pop(id, -1)
163
                if removed == -1:
164
                    removed = websiteOrders.pop(id, -1)
165
                if removed != -1:
166
                    removed = spiceOrders.pop(id, -1)
167
 
168
            elif spiceorder not in ('STO','US', 'UP', '00') and order.status in (4, 6, 7, 8) :
169
                removed = storeOrders.pop(id, -1)
170
                if removed == -1:
171
                    removed = websiteOrders.pop(id, -1)
172
                if removed != -1:
173
                    removed = spiceOrders.pop(id, -1)
174
 
175
    print "Length of storeOrders : " + str(len(storeOrders.keys()))
176
    print "Length of websiteOrders : " + str(len(websiteOrders.keys()))
177
    print "Length of spiceOrders : " + str(len(spiceOrders.keys()))
178
 
179
    if len(websiteOrders.keys()) > 0:
180
        for woid in websiteOrders.keys():
181
            try:
182
                result = checkTransactionStatus("", str(woid))
183
            except Exception:
11486 kshitij.so 184
                continue
185
            if result[0]:
9321 anupam.sin 186
                removed = websiteOrders.pop(woid, -1)
187
 
188
    if len(storeOrders.keys()) > 0:
189
        for soid in storeOrders.keys():
190
            try:
191
                result = checkTransactionStatus("", str(soid))
192
            except Exception:
11486 kshitij.so 193
                continue
194
            if result[0]:
9321 anupam.sin 195
                removed = storeOrders.pop(soid, -1)
196
 
197
    if len(spiceOrders.keys()) > 0:
198
        for id in spiceOrders.keys():
199
            order = RechargeOrder.query.filter(RechargeOrder.id == id).first()
200
            if order is None:
201
                order = RechargeTransaction.query.filter(RechargeTransaction.id == id).first()
202
            if order:
203
                spiceorder = spiceOrders.get(id)
204
                if spiceorder == '00' and order.status in (5, 6):
205
                    removed = spiceOrders.pop(id, -1)
206
 
207
                elif spiceorder in ('STO','US', 'UP') and order.status in (3, 4, 10, 5, 6, 7, 8):
208
                    removed = spiceOrders.pop(id, -1)
209
 
210
                elif spiceorder not in ('STO','US', 'UP', '00') and order.status in (4, 6, 7, 8) :
211
                    removed = spiceOrders.pop(id, -1)
212
 
213
    maildata = "<html><body><b>Website Recharges</b><br><br>"
214
    for woid in websiteOrders.keys():
215
        wo = websiteOrders.get(woid)
11486 kshitij.so 216
        try:
11489 kshitij.so 217
            recharge_status, desc = getRechargeStatus('',wo.id)
11486 kshitij.so 218
        except:
11489 kshitij.so 219
            recharge_status, desc= "",""
220
        maildata = maildata + str(wo.id) + " : " +  str(RechargeOrderStatus._VALUES_TO_NAMES.get(wo.status)) + " : "+recharge_status+" "+desc+"<br>"
9321 anupam.sin 221
 
222
    maildata = maildata + "<br><br><b>Store recharges</b><br><br>"
223
    for soid in storeOrders.keys():
224
        so = storeOrders.get(soid)
11486 kshitij.so 225
        try:
11489 kshitij.so 226
            recharge_status, desc = getRechargeStatus('',so.id)
11486 kshitij.so 227
        except:
11489 kshitij.so 228
            recharge_status,desc = "",""
229
        maildata = maildata +  str(so.id) + " : " + str(RechargeOrderStatus._VALUES_TO_NAMES.get(wo.status)) + " : "+recharge_status+" "+desc+"<br>"
9321 anupam.sin 230
 
231
    maildata = maildata + "<br><br><b>Spice Orders</b><br><br>"
232
    for id in spiceOrders.keys():
233
        maildata = maildata + str(id) + " : " + str(spiceOrders.get(id)) + "<br>"
234
 
235
    maildata = maildata + "</body></html>"
11118 kshitij.so 236
    mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["anikendra.das@saholic.com", "kshitij.sood@shop2020.in"], "Mobisoc Recharge Reconciliation for Date:- " + startTime.strftime("%d-%m-%Y"), maildata, [])
9321 anupam.sin 237
 
238
 
8788 rajveer 239
def processRecon():
240
    cdate = datetime.datetime.now() + timedelta(days = -1)
241
    startTime = datetime.datetime(cdate.year, cdate.month, cdate.day)
242
    endTime = startTime + timedelta(days=1)
243
 
8795 rajveer 244
 
8788 rajveer 245
    '''
246
    A - All such orders for which we have attempted the recharge and recharge is either successful or unknown.
247
    B - All such orders for which we have attempted the recharge and we received the refund after this time window.
248
    C - All such orders for which we have received the refund in this time window, although the recharge was attempted before this window.
249
    X1 = A + B - C         Net amount debited for all the customers in this time window.
250
    X2 - Total amount credited to all customers in their wallet under some promotion.
251
    X3 - Net difference in wallet amount between this time window.
252
    X4 - Payment received through gateway from all customer in this time window.
253
    X5 - Payment refunded through gateway by all customer in this time window.
254
    '''
255
 
8790 rajveer 256
    A1 = 0
257
    B1 = 0
258
    C1 = 0
259
    A2 = 0
260
    B2 = 0
261
    C2 = 0
262
    R = 0
263
    P = 0
8788 rajveer 264
    X1 = 0
265
    X2 = 0
266
    X3 = 0
267
    X4 = 0
268
    X5 = 0
8790 rajveer 269
    X6 = 0
8788 rajveer 270
    D = 0
271
 
8790 rajveer 272
    sorder = session.query(func.sum(RechargeOrder.totalAmount), func.sum(RechargeOrder.couponAmount)).filter(RechargeOrder.status.in_([RechargeOrderStatus.RECHARGE_SUCCESSFUL, RechargeOrderStatus.PAYMENT_SUCCESSFUL])).filter(RechargeOrder.creationTimestamp.between(startTime,endTime)).first()    
8788 rajveer 273
    if sorder and sorder[0]:
8790 rajveer 274
        A1 = int(sorder[0])
275
        A2 = int(sorder[1])
8788 rajveer 276
 
8790 rajveer 277
    forder = session.query(func.sum(RechargeOrder.totalAmount), func.sum(RechargeOrder.couponAmount)).filter(RechargeOrder.status.in_([RechargeOrderStatus.RECHARGE_FAILED, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED, RechargeOrderStatus.REFUNDED, RechargeOrderStatus.PARTIALLY_REFUNDED])).filter(RechargeOrder.creationTimestamp.between(startTime,endTime)).filter(not_(RechargeOrder.responseTimestamp.between(startTime,endTime))).first()
8788 rajveer 278
    if forder and forder[0]:
8790 rajveer 279
        B1 = int(forder[0])
280
        B2 = int(forder[1])
8788 rajveer 281
 
8790 rajveer 282
    rorder = session.query(func.sum(RechargeOrder.totalAmount), func.sum(RechargeOrder.couponAmount)).filter(RechargeOrder.status.in_([RechargeOrderStatus.RECHARGE_FAILED, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED, RechargeOrderStatus.REFUNDED, RechargeOrderStatus.PARTIALLY_REFUNDED])).filter(RechargeOrder.responseTimestamp.between(startTime,endTime)).filter(not_(RechargeOrder.creationTimestamp.between(startTime,endTime))).first()
8788 rajveer 283
    if rorder and rorder[0]:
8790 rajveer 284
        C1 = int(rorder[0])
285
        C2 = int(rorder[1])
8788 rajveer 286
 
8790 rajveer 287
    R = R + A1 + B1 - C1
288
    X2 = X2 + A2 + B2 - C2
8788 rajveer 289
 
290
    rv = session.query(func.sum(RechargeVoucherTracker.amount)).filter(RechargeVoucherTracker.issuedOn.between(startTime,endTime)).first()
291
    if rv and rv[0]:
8790 rajveer 292
        X3 = int(rv[0])
8788 rajveer 293
 
294
    uw = session.query(func.sum(UserWalletHistory.amount)).filter(UserWalletHistory.timestamp.between(startTime,endTime)).first()
295
    if uw and uw[0]:
8790 rajveer 296
        X4 = int(uw[0])
8788 rajveer 297
 
8795 rajveer 298
    #X4 = 191497
8788 rajveer 299
 
300
    pc = PaymentClient().get_client()
301
    payments = pc.getPayments(to_java_date(startTime - datetime.timedelta(minutes = 30)), to_java_date(endTime + datetime.timedelta(minutes = 30)), 2, 1) + pc.getPayments(to_java_date(startTime - datetime.timedelta(minutes = 30)), to_java_date(endTime + datetime.timedelta(minutes = 30)), 2, 2) + pc.getPayments(to_java_date(startTime - datetime.timedelta(minutes = 30)), to_java_date(endTime + datetime.timedelta(minutes = 30)), 8, 1) + pc.getPayments(to_java_date(startTime - datetime.timedelta(minutes = 30)), to_java_date(endTime + datetime.timedelta(minutes = 30)), 8, 2)
302
    for payment in payments:
303
        if payment.isDigital and to_py_date(payment.successTimestamp) >= startTime and to_py_date(payment.successTimestamp) <= endTime:  
8790 rajveer 304
            X5 = X5 + payment.amount
8788 rajveer 305
 
306
 
307
 
308
    refunds = RechargeOrder.query.filter(RechargeOrder.status.in_([RechargeOrderStatus.PARTIALLY_REFUNDED, RechargeOrderStatus.REFUNDED])).filter(RechargeOrder.refundTimestamp.between(startTime, endTime)).all()
309
    pc = PaymentClient().get_client()
310
    for refund in refunds:
311
        payments = pc.getPaymentForRechargeTxnId(refund.transaction_id)
312
        for payment in payments:
313
            if payment.gatewayId in (1,2) and payment.status == 8 and payment.isDigital:
8790 rajveer 314
                X6 = X6 + payment.refundAmount
8788 rajveer 315
 
8790 rajveer 316
    P = X2+X3+X5-X4-X6
317
    D = R - P
8788 rajveer 318
 
319
    maildata = "<html><body><table border='1'><thead><th>Symbol</th><th>Type</th><th>Amount</th></thead><tbody>"
8790 rajveer 320
    maildata += "<tr><td>A</td><td>Recharge Amount</td><td>" + str(A1) + "</td></tr>"
321
    maildata += "<tr><td>B</td><td>Recharge Amount (Refunded in Future)</td><td>" + str(B1) + "</td></tr>"
322
    maildata += "<tr><td>C</td><td>Recharge Refund Amount</td><td>" + str(C1) + "</td></tr>"
323
    maildata += "<tr><td>R=A1+B1-C1</td><td>Net Recharge Amount</td><td>" + str(R) + "</td></tr>"
324
    maildata += "<tr><td></td><td></td><td></td></tr>"
325
 
326
    maildata += "<tr><td>A</td><td>Recharge Coupon Amount</td><td>" + str(A2) + "</td></tr>"
327
    maildata += "<tr><td>B</td><td>Recharge Coupon Amount (Refunded in Future)</td><td>" + str(B2) + "</td></tr>"
328
    maildata += "<tr><td>C</td><td>Recharge Coupon Refund Amount</td><td>" + str(C2) + "</td></tr>"    
329
    maildata += "<tr><td>X2=A2+B2-C2</td><td>Net Coupon Amount</td><td>" + str(X2) + "</td></tr>"
330
 
331
    maildata += "<tr><td>X3</td><td>Gift Amount</td><td>" + str(X3) + "</td></tr>"
332
    maildata += "<tr><td>X4</td><td>Wallet Difference</td><td>" + str(X4) + "</td></tr>"
333
    maildata += "<tr><td>X5</td><td>Payment Amount</td><td>" + str(X5) + "</td></tr>"
334
    maildata += "<tr><td>X6</td><td>Payment Refund Amount</td><td>" + str(X6) + "</td></tr>"
335
    maildata += "<tr><td>P=X2+X3+X5-X4-X6</td><td>Net Payments</td><td>" + str(P) + "</td></tr>"
336
    maildata += "<tr><td></td><td></td><td></td></tr>"
337
 
338
    maildata += "<tr><td>D=R-P</td><td>Net Reconciliation Difference</td><td>" + str(D) + "</td></tr>"
8788 rajveer 339
    maildata += "</tbody></table>"
340
 
341
    if D != 0:
8837 rajveer 342
        mismatches = []
11601 kshitij.so 343
        mismatches += RechargeOrder.query.filter(RechargeOrder.status.in_([RechargeOrderStatus.RECHARGE_SUCCESSFUL, RechargeOrderStatus.RECHARGE_FAILED, RechargeOrderStatus.RECHARGE_UNKNOWN, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED, RechargeOrderStatus.PAYMENT_SUCCESSFUL])).filter(RechargeOrder.creationTimestamp.between(startTime, endTime)).filter(RechargeOrder.responseTimestamp.between(endTime, endTime + timedelta(minutes = 30))).all()
344
        mismatches += RechargeOrder.query.filter(RechargeOrder.status.in_([RechargeOrderStatus.RECHARGE_SUCCESSFUL, RechargeOrderStatus.RECHARGE_FAILED, RechargeOrderStatus.RECHARGE_UNKNOWN, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED, RechargeOrderStatus.PAYMENT_SUCCESSFUL])).filter(RechargeOrder.responseTimestamp.between(startTime, endTime)).filter(RechargeOrder.creationTimestamp.between(startTime - timedelta(minutes = 30), startTime)).all()
8788 rajveer 345
        if mismatches and len(mismatches) > 0:
346
            maildata += "<h3>Possible mismatch orders</h3><table style='margin-top:30px;' border='1'><thead><th>OrderId</th><th>Total Amount</th><th>Wallet Amount</th><th>Coupon Amount</th><th>Creation Time</th><th>Response Time</th></thead><tbody>"
347
            for mismatch in mismatches:
348
                maildata += "<tr><td>" + str(mismatch.id) + "</td><td>" + str(mismatch.totalAmount) + "</td><td>" + str(mismatch.walletAmount) + "</td><td>" + str(mismatch.couponAmount) + "</td><td>" + str(mismatch.creationTimestamp) + "</td><td>" + str(mismatch.responseTimestamp) + "</td></tr>"        
349
            maildata += "</tbody></table>"
350
 
351
    maildata += "</body></html>"
11118 kshitij.so 352
    mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["anikendra.das@saholic.com", "kshitij.sood@shop2020.in", "rajneesh.arora@shop2020.in"], "Customer Recharge Reconciliation for Date:- " + startTime.strftime("%d-%m-%Y"), maildata, [])
8790 rajveer 353
 
8788 rajveer 354
 
6235 rajveer 355
def processRefunds():
356
    todate = datetime.datetime.now()
8788 rajveer 357
    for i in range(10):
6235 rajveer 358
        orderDate = todate + datetime.timedelta(days= -i)
359
        refunds = getRefunds(orderDate)
360
        for key in refunds.keys():
361
            refund = refunds.get(key)
362
            refundAmount = refund[0]
363
            refundDate = refund[1]
364
            order = RechargeOrder.get_by(spiceTID = key)
7127 rajveer 365
            if order:
366
                amount = order.totalAmount
367
                isStoreOrder = False
368
            else:
369
                order = RechargeTransaction.get_by(spiceTID = key)
7188 rajveer 370
                if not order:
371
                    continue
7127 rajveer 372
                isStoreOrder = True
373
                amount = order.amount
6235 rajveer 374
            if order.status == RechargeOrderStatus.RECHARGE_FAILED_REFUNDED:
375
                print "Refund is already processed."
376
                continue
7188 rajveer 377
            if order.status not in (RechargeOrderStatus.RECHARGE_SUCCESSFUL, RechargeOrderStatus.PAYMENT_SUCCESSFUL, RechargeOrderStatus.RECHARGE_UNKNOWN):
7075 rajveer 378
                print "Recharge/Payment is not successful. There is something wrong."
6235 rajveer 379
                continue
7127 rajveer 380
            if amount != refundAmount:
6235 rajveer 381
                print "Refund amount is not same as transaction amount"
382
                continue
7127 rajveer 383
            if isStoreOrder:
7244 rajveer 384
                update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED)
7127 rajveer 385
            else:
7780 rajveer 386
                update_recharge_order_status(order.id, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED)
6235 rajveer 387
 
388
def processUnknownTransactions():    
389
    orders = get_recharge_orders_for_status(RechargeOrderStatus.PAYMENT_SUCCESSFUL)
6219 rajveer 390
    for order in orders:
6276 rajveer 391
        try:
392
            if order.creationTimestamp + datetime.timedelta(minutes=10) < datetime.datetime.now():
393
                status, description = checkTransactionStatus('', str(order.id))
394
                print status, description
395
                if status:
396
                    update_recharge_order_status(order.id, RechargeOrderStatus.RECHARGE_SUCCESSFUL)
397
                else:
398
                    update_recharge_order_status(order.id, RechargeOrderStatus.RECHARGE_FAILED)
399
        except:
400
            print "Do Nothing"
6451 rajveer 401
 
7163 rajveer 402
    ## For store transactions
7245 rajveer 403
    rorders = RechargeTransaction.query.filter(RechargeTransaction.status.in_([RechargeOrderStatus.RECHARGE_UNKNOWN, RechargeOrderStatus.INIT])).all()
7166 rajveer 404
    for order in rorders:
7163 rajveer 405
        try:
406
            if order.transactionTime + datetime.timedelta(minutes=10) < datetime.datetime.now():
407
                status, description = checkTransactionStatus('', str(order.id))
408
                print status, description
409
                if status:
410
                    update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_SUCCESSFUL)
7245 rajveer 411
                elif order.status == RechargeOrderStatus.INIT:
412
                    update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_FAILED)
7163 rajveer 413
                else:
7244 rajveer 414
                    update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED)
7163 rajveer 415
        except:
416
            print "Do Nothing"
417
 
418
 
6451 rajveer 419
def processAuthorizedTransactions(txn_id):
420
    update_recharge_order_status(txn_id, RechargeOrderStatus.PAYMENT_SUCCESSFUL)
6235 rajveer 421
 
7141 rajveer 422
 
423
def compute_recharge_collection(cdate):
424
    todate = datetime.datetime(cdate.year, cdate.month, cdate.day)
425
    tomorrow = todate + timedelta(days=1)
8868 rajveer 426
    txns = session.query(RechargeTransaction.storeId, RechargeTransaction.payMethod, RechargeTransaction.status, func.sum(RechargeTransaction.amount), func.sum(RechargeTransaction.discount)).filter(RechargeTransaction.status.in_([RechargeOrderStatus.RECHARGE_SUCCESSFUL, RechargeOrderStatus.RECHARGE_UNKNOWN])).filter(RechargeTransaction.transactionTime.between(todate, tomorrow)).group_by(RechargeTransaction.storeId, RechargeTransaction.payMethod, RechargeTransaction.status).order_by(RechargeTransaction.storeId).all()
8875 rajveer 427
    txns = txns + session.query(RechargeTransaction.storeId, RechargeTransaction.payMethod, RechargeTransaction.status, func.sum(RechargeTransaction.amount), func.sum(RechargeTransaction.discount)).filter(RechargeTransaction.status.in_([RechargeOrderStatus.RECHARGE_FAILED, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED])).filter(RechargeTransaction.transactionTime.between(todate, tomorrow)).filter(not_(RechargeTransaction.responseTime.between(todate, tomorrow))).group_by(RechargeTransaction.storeId, RechargeTransaction.payMethod, RechargeTransaction.status).order_by(RechargeTransaction.storeId).all()
7141 rajveer 428
    storeData = {}
429
    for txn in txns:
430
        print txn
431
        if not storeData.has_key(txn[0]):
432
            data = [0,0,0,0,0]
433
            storeData[txn[0]] = data
434
        else:
435
            data = storeData[txn[0]]
7155 rajveer 436
        if txn[1] == 1:
7141 rajveer 437
            data[0] += int(txn[3]) - int(txn[4])
7155 rajveer 438
        if txn[1] == 2:
7141 rajveer 439
            data[1] += int(txn[3]) - int(txn[4])
9342 rajveer 440
 
441
        data[2] += int(txn[3])
442
        data[3] += int(txn[4])
443
        data[4] += int(txn[3]) - int(txn[4])
7141 rajveer 444
        storeData[txn[0]] = data
8868 rajveer 445
 
446
 
8875 rajveer 447
    reftxns = session.query(RechargeTransaction.storeId, RechargeTransaction.payMethod, RechargeTransaction.status, func.sum(RechargeTransaction.amount), func.sum(RechargeTransaction.discount)).filter(RechargeTransaction.status.in_([RechargeOrderStatus.RECHARGE_FAILED, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED])).filter(RechargeTransaction.responseTime.between(todate, tomorrow)).filter(not_(RechargeTransaction.transactionTime.between(todate, tomorrow))).group_by(RechargeTransaction.storeId, RechargeTransaction.payMethod, RechargeTransaction.status).order_by(RechargeTransaction.storeId).all()
7141 rajveer 448
    for txn in reftxns:
449
        print txn
450
        if not storeData.has_key(txn[0]):
451
            data = [0,0,0,0,0]
452
            storeData[txn[0]] = data
453
        else:
454
            data = storeData[txn[0]]
7155 rajveer 455
        if txn[1] == 1:
7148 rajveer 456
            data[0] -= int(txn[3]) - int(txn[4])
7155 rajveer 457
        if txn[1] == 2:
7148 rajveer 458
            data[1] -= int(txn[3]) - int(txn[4])
7141 rajveer 459
        data[2] -= int(txn[3])
460
        data[3] -= int(txn[4])
461
        data[4] -= int(txn[3]) - int(txn[4])
462
    print storeData
7163 rajveer 463
 
7175 rajveer 464
    wallet = WalletForCompany.query.filter(WalletForCompany.id == 1).one()    
465
 
466
    dt = session.query(func.sum(RechargeTransaction.amount)).filter(RechargeTransaction.status.in_([RechargeOrderStatus.RECHARGE_SUCCESSFUL])).one()
467
 
7511 rajveer 468
#    if int(dt[0]) != wallet.amount:
11118 kshitij.so 469
#        mail("cnc.center@shop2020.in", "5h0p2o2o", ["anikendra.das@saholic.com", "kshitij.sood@shop2020.in"], "Wallet amount: " + str(wallet.amount) + " does not match with transaction amount: " + str(int(dt[0])) , "", [], [], [])    
7250 rajveer 470
 
7175 rajveer 471
    maildata = "<html><body><table border='1'><thead><th>StoreId</th><th>Gross</th><th>Discount</th><th>Net</th></thead><tbody>"
472
    trecharge = 0
7967 anupam.sin 473
    hotspotServiceMatrices = HotspotServiceMatrix.query.all()
474
    hotspotServiceMatrixMap = {}
475
 
476
    for hotspotServiceMatrix in hotspotServiceMatrices:
477
        hotspotServiceMatrixMap[hotspotServiceMatrix.storeId] = hotspotServiceMatrix
478
 
7141 rajveer 479
    for storeId in storeData.keys():
480
        store = HotspotStore.get_by(id = storeId)
7967 anupam.sin 481
        if hotspotServiceMatrixMap.has_key(storeId):
482
            del hotspotServiceMatrixMap[storeId]
7141 rajveer 483
        store.collectedAmount = 0
484
        store.availableLimit = store.creditLimit
7142 rajveer 485
        session.commit()
486
 
7141 rajveer 487
        data = storeData.get(storeId)
7250 rajveer 488
        rc = RechargeCollection()
489
        rc.hotspotId = store.hotspotId
490
        rc.reconDate = int(todate.strftime("%Y%m%d"))
491
        rc.cash = data[0]
492
        rc.hdfc = data[1]
493
        rc.grossAmount = data[2]
494
        rc.discount = data[3]
495
        rc.netCollection = data[4]
496
        rc.addedAt = datetime.datetime.now()
497
        rc.pushedToOcr = False
498
        session.commit()
499
 
7175 rajveer 500
        maildata += "<tr><td>" + store.hotspotId + "</td><td>" + str(data[2]) + "</td><td>" + str(data[3]) + "</td><td>" + str(data[4]) + "</td></tr>"
501
        trecharge +=  data[2]
7250 rajveer 502
 
7276 rajveer 503
    dit = session.query(func.sum(RechargeCollection.grossAmount)).one()
7821 rajveer 504
    dit2 = session.query(func.sum(WalletHistoryForCompany.amount)).filter(WalletHistoryForCompany.walletId == 1).filter(WalletHistoryForCompany.amount >= 100000).one()
7276 rajveer 505
    wamt = int(dit2[0])- int(dit[0])
506
    wallet.amount = wamt
507
    session.commit()
508
 
7250 rajveer 509
    maildata += "</tbody></table></body></html>"
11118 kshitij.so 510
    mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["anikendra.das@saholic.com", "kshitij.sood@shop2020.in", "digamber.chauhan@spiceretail.co.in","parveen.mittal@spiceretail.co.in","pardeep.panwar@spiceretail.co.in","adarsh.verma@spiceretail.co.in","j.p.gupta@shop2020.in", "rajneesh.arora@shop2020.in", "amit.tyagi@spiceretail.co.in"], "MIS :- SpiceRetail  (Date - " + todate.strftime("%d-%m-%Y") + ")   (Wallet Amount - " + str(wallet.amount) + ")    (Total Recharge - " + str(trecharge) + ")", maildata, []) 
7252 rajveer 511
    try:
512
        push_recharge_collection_to_ocr()
513
    except:
11118 kshitij.so 514
        mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["anikendra.das@saholic.com", "kshitij.sood@shop2020.in", "rajneesh.arora@shop2020.in"], "Problem while pushing recharge collection to OCR", "", [])
7967 anupam.sin 515
    finally:
7986 anupam.sin 516
        msg = "<html><body>"
7967 anupam.sin 517
        for storeId in hotspotServiceMatrixMap.keys():
518
            if hotspotServiceMatrixMap.get(storeId).rechargeService:
519
                store = HotspotStore.get_by(id = storeId)
7986 anupam.sin 520
                msg = msg + str(store.hotspotId) + ' - ' + str(store.email) + '<br>'
521
        msg = msg + '</body></html>'
522
        helper_client = HelperClient().get_client()
10298 manish.sha 523
        helper_client.saveUserEmailForSending(["adarsh.verma@spiceretail.co.in"], "cnc.center@shop2020.in", "No Recharge happened for these stores on " + str(date.today()-timedelta(days=1)), msg, "NRM", "NoRechargeMail", ["kshitij.sood@shop2020.in"], ["kshitij.sood@shop2020.in"], 1)
7986 anupam.sin 524
 
7967 anupam.sin 525
 
7250 rajveer 526
 
527
def push_recharge_collection_to_ocr():
528
    rcs = RechargeCollection.query.filter(RechargeCollection.pushedToOcr == False).all()
529
 
530
    for rc in rcs:
531
        store_string = "<Store>" + rc.hotspotId + "</Store>"
532
        date_string = "<ReconDate>" + str(rc.reconDate) + "</ReconDate>"
533
        cash_string = "<Cash>" + str(rc.cash) + "</Cash>"
534
        card_string = "<Hdfc>" + str(rc.hdfc) + "</Hdfc>"
535
        type_string = "<Type>RechargeSale</Type>"
536
        amount_string = "<GrossRechargeAmount>" + str(rc.grossAmount) + "</GrossRechargeAmount><Discount>" + str(rc.discount) +  "</Discount><NetCollection>" + str(rc.netCollection) + "</NetCollection>";
537
 
7141 rajveer 538
        #SaholicRechargeSaleTransfer(string Store, int ReconDate, decimal Cash, decimal Hdfc, string Type, decimal GrossRechargeAmount, decimal Discount, decimal NetCollection)
539
 
7253 rajveer 540
        conn = httplib.HTTPConnection("182.71.104.186")
7141 rajveer 541
        XML="""
542
        <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
543
          <soap:Body>
544
            <SaholicRechargeSaleTransfer xmlns="http://tempuri.org/">
545
        """
546
 
8195 rajveer 547
        XML = XML + store_string + date_string + cash_string + card_string + "<Cheque>0</Cheque>" + type_string + amount_string 
7141 rajveer 548
 
549
        footer = """
550
            </SaholicRechargeSaleTransfer>
551
          </soap:Body>
552
        </soap:Envelope>
553
        """
554
        XML = XML + footer
555
 
556
        print XML
557
        params = urllib.urlencode({'op': 'SaholicRechargeSaleTransfer'})
558
        headers = { "Content-type": "text/xml", "Content-Length": "%d" % len(XML)}
559
        conn.request("POST", "/loaddetect/Service.asmx?"+params, "", headers)
560
        conn.send(XML)
561
        response = conn.getresponse()
562
        print response.status, response.reason
563
        resp = response.read()
564
        conn.close()
565
        print resp
7250 rajveer 566
        if "Saved Successfully" in resp:
567
            rc.pushedAt = datetime.datetime.now()
568
            rc.pushedToOcr = True
569
            session.commit()
570
        elif "Error in Saving Data" in resp:
11118 kshitij.so 571
            mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["anikendra.das@saholic.com", "kshitij.sood@shop2020.in", "rajneesh.arora@shop2020.in"], "Problem while pushing recharge collection to OCR", resp, [])
7250 rajveer 572
        else: 
11118 kshitij.so 573
            mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["anikendra.das@saholic.com", "kshitij.sood@shop2020.in", "rajneesh.arora@shop2020.in"], "Problem while pushing recharge collection to OCR", resp, [])
7250 rajveer 574
 
7141 rajveer 575
 
7175 rajveer 576
 
7147 rajveer 577
def topup_company_wallet(companyId, amount):
578
    wallet = WalletForCompany.query.filter(WalletForCompany.id == companyId).with_lockmode("update").one()
7285 rajveer 579
    company = Company.get_by(id = companyId)
7147 rajveer 580
    wh = WalletHistoryForCompany()
581
    wh.walletId = wallet.id
582
    wh.openingBal = wallet.amount
583
    wh.closingBal = wallet.amount +  amount
584
    wh.amount = amount
585
    wh.transactionTime = datetime.datetime.now()
7167 rajveer 586
    wh.referenceNumber =  get_next_invoice_number(OrderType.WALLETCREDIT)
7147 rajveer 587
    wh.description = "Wallet Credited"
588
 
589
    wallet.amount += amount
590
    session.commit()
11118 kshitij.so 591
    mail("cnc.center@shop2020.in", "5h0p2o2o", ["anikendra.das@saholic.com", "kshitij.sood@shop2020.in", "digamber.chauhan@spiceretail.co.in","parveen.mittal@spiceretail.co.in","pardeep.panwar@spiceretail.co.in","adarsh.verma@spiceretail.co.in","j.p.gupta@shop2020.in", "rajneesh.arora@shop2020.in", "amit.tyagi@spiceretail.co.in"] , company.name + " wallet topped up by " +  str(amount) + " rupees.", "", [], [], [])
7821 rajveer 592
 
7983 rajveer 593
def compute_website_recharge_collection(cdate, oldBalance, newBalance):
8815 rajveer 594
    startTime = datetime.datetime(cdate.year, cdate.month, cdate.day)
595
    endTime = startTime + timedelta(days=1)
596
    tamount = 0
7147 rajveer 597
 
8815 rajveer 598
    txns = session.query(func.sum(RechargeOrder.totalAmount), func.sum(RechargeOrder.couponAmount)).filter(RechargeOrder.status.in_([RechargeOrderStatus.RECHARGE_SUCCESSFUL, RechargeOrderStatus.PAYMENT_SUCCESSFUL])).filter(RechargeOrder.creationTimestamp.between(startTime,endTime)).first()    
599
    if txns and txns[0]:
600
        tamount += int(txns[0])
7821 rajveer 601
 
8815 rajveer 602
    otxns = session.query(func.sum(RechargeOrder.totalAmount), func.sum(RechargeOrder.couponAmount)).filter(RechargeOrder.status.in_([RechargeOrderStatus.RECHARGE_FAILED, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED, RechargeOrderStatus.REFUNDED, RechargeOrderStatus.PARTIALLY_REFUNDED])).filter(RechargeOrder.creationTimestamp.between(startTime,endTime)).filter(not_(RechargeOrder.responseTimestamp.between(startTime,endTime))).first()
603
    if otxns and otxns[0]:
604
        tamount += int(otxns[0])
605
 
606
    reftxns = session.query(func.sum(RechargeOrder.totalAmount), func.sum(RechargeOrder.couponAmount)).filter(RechargeOrder.status.in_([RechargeOrderStatus.RECHARGE_FAILED, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED, RechargeOrderStatus.REFUNDED, RechargeOrderStatus.PARTIALLY_REFUNDED])).filter(RechargeOrder.responseTimestamp.between(startTime,endTime)).filter(not_(RechargeOrder.creationTimestamp.between(startTime,endTime))).first()
607
    if reftxns and reftxns[0]:
608
        tamount -= int(reftxns[0])
7821 rajveer 609
 
610
    wallet = WalletForCompany.query.filter(WalletForCompany.id == 2).with_lockmode("update").one()
7823 rajveer 611
 
612
 
613
    d = datetime.datetime.now()
614
    wh = WalletHistoryForCompany()
615
    wh.walletId = wallet.id
616
    wh.openingBal = wallet.amount
617
    wh.closingBal = wallet.amount - tamount
7982 rajveer 618
    wh.amount = -tamount
7823 rajveer 619
    wh.transactionTime = d
620
    wh.referenceNumber =  int(d.strftime("%Y%m%d"))
621
    wh.description = "Wallet Credited"
622
    wallet.amount = wallet.amount - tamount
7821 rajveer 623
    session.commit()
624
 
7823 rajveer 625
 
8007 rajveer 626
    maildata = ""
11118 kshitij.so 627
    mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["pardeep.panwar@spiceretail.co.in>", "amit.tyagi@spiceretail.co.in", "anikendra.das@saholic.com", "kshitij.sood@shop2020.in", "j.p.gupta@shop2020.in", "rajneesh.arora@shop2020.in"], "MIS :- Saholic (Date - " + startTime.strftime("%d-%m-%Y") + ")   (Wallet Amount - " + str(wallet.amount) + ")    (Total Recharge - " + str(tamount) + ")", maildata, []) 
7821 rajveer 628
 
8012 rajveer 629
    rAmount = 0
8815 rajveer 630
    ramount = session.query(func.sum(WalletHistoryForCompany.amount)).filter(WalletHistoryForCompany.transactionTime >= startTime).filter(WalletHistoryForCompany.amount >= 100000).one()
8012 rajveer 631
    if ramount[0]:
632
        rAmount = int(ramount[0])
8815 rajveer 633
    rcs = session.query(func.sum(RechargeCollection.grossAmount)).filter(RechargeCollection.reconDate == int(startTime.strftime("%Y%m%d"))).one()
8007 rajveer 634
    hamount = int(rcs[0])
635
 
8012 rajveer 636
    maildata = "(A) Old Wallet Amount is : " + str(oldBalance) + "<br>(B) New Wallet Amount is : " + str(newBalance) + "<br>(C) Recharge Amount is : " + str(rAmount) + "<br>---------------------------<br>(D) Total Debit Amount for Recharge(A-B+C) is : " + str(oldBalance - newBalance + rAmount) + "<br><br><br>(E) Saholic Recharge Amount is :" + str(tamount) + "<br>(F) Hotspot Recharge Amount is :" + str(hamount) + "<br>---------------------------<br>(G) Total Recharge Amount (E+F) is : " + str(tamount + hamount)
11118 kshitij.so 637
    mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["pardeep.panwar@spiceretail.co.in>", "amit.tyagi@spiceretail.co.in", "anikendra.das@saholic.com", "kshitij.sood@shop2020.in", "j.p.gupta@shop2020.in", "rajneesh.arora@shop2020.in"], "MIS :- Wallet and Recharge (Date - " + startTime.strftime("%d-%m-%Y") + ")", maildata, [])
8007 rajveer 638
 
6147 rajveer 639
if __name__ == '__main__':
7967 anupam.sin 640
    main()
9633 rajveer 641