Subversion Repositories SmartDukaan

Rev

Rev 19096 | Rev 20805 | 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,\
14143 amit.gupta 39
    RechargeVoucherTracker, SpiceTransactionHistory, DtrBatchCreditTracker
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])
14143 amit.gupta 293
 
294
    rv1 = session.query(func.sum(DtrBatchCreditTracker.amount)).filter(DtrBatchCreditTracker.creditedOn.between(startTime,endTime)).first()
295
    if rv1 and rv1[0]:
296
        X3 += int(rv1[0])
8788 rajveer 297
 
298
    uw = session.query(func.sum(UserWalletHistory.amount)).filter(UserWalletHistory.timestamp.between(startTime,endTime)).first()
299
    if uw and uw[0]:
8790 rajveer 300
        X4 = int(uw[0])
8788 rajveer 301
 
8795 rajveer 302
    #X4 = 191497
8788 rajveer 303
 
304
    pc = PaymentClient().get_client()
13430 kshitij.so 305
    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)), 2, 19) + pc.getPayments(to_java_date(startTime - datetime.timedelta(minutes = 30)), to_java_date(endTime + datetime.timedelta(minutes = 30)), 8, 1) + \
306
    pc.getPayments(to_java_date(startTime - datetime.timedelta(minutes = 30)), to_java_date(endTime + datetime.timedelta(minutes = 30)), 8, 2) + pc.getPayments(to_java_date(startTime - datetime.timedelta(minutes = 30)), to_java_date(endTime + datetime.timedelta(minutes = 30)), 8, 19)
8788 rajveer 307
    for payment in payments:
308
        if payment.isDigital and to_py_date(payment.successTimestamp) >= startTime and to_py_date(payment.successTimestamp) <= endTime:  
8790 rajveer 309
            X5 = X5 + payment.amount
8788 rajveer 310
 
311
 
312
 
313
    refunds = RechargeOrder.query.filter(RechargeOrder.status.in_([RechargeOrderStatus.PARTIALLY_REFUNDED, RechargeOrderStatus.REFUNDED])).filter(RechargeOrder.refundTimestamp.between(startTime, endTime)).all()
314
    pc = PaymentClient().get_client()
315
    for refund in refunds:
316
        payments = pc.getPaymentForRechargeTxnId(refund.transaction_id)
317
        for payment in payments:
318
            if payment.gatewayId in (1,2) and payment.status == 8 and payment.isDigital:
8790 rajveer 319
                X6 = X6 + payment.refundAmount
8788 rajveer 320
 
8790 rajveer 321
    P = X2+X3+X5-X4-X6
322
    D = R - P
8788 rajveer 323
 
324
    maildata = "<html><body><table border='1'><thead><th>Symbol</th><th>Type</th><th>Amount</th></thead><tbody>"
8790 rajveer 325
    maildata += "<tr><td>A</td><td>Recharge Amount</td><td>" + str(A1) + "</td></tr>"
326
    maildata += "<tr><td>B</td><td>Recharge Amount (Refunded in Future)</td><td>" + str(B1) + "</td></tr>"
327
    maildata += "<tr><td>C</td><td>Recharge Refund Amount</td><td>" + str(C1) + "</td></tr>"
328
    maildata += "<tr><td>R=A1+B1-C1</td><td>Net Recharge Amount</td><td>" + str(R) + "</td></tr>"
329
    maildata += "<tr><td></td><td></td><td></td></tr>"
330
 
331
    maildata += "<tr><td>A</td><td>Recharge Coupon Amount</td><td>" + str(A2) + "</td></tr>"
332
    maildata += "<tr><td>B</td><td>Recharge Coupon Amount (Refunded in Future)</td><td>" + str(B2) + "</td></tr>"
333
    maildata += "<tr><td>C</td><td>Recharge Coupon Refund Amount</td><td>" + str(C2) + "</td></tr>"    
334
    maildata += "<tr><td>X2=A2+B2-C2</td><td>Net Coupon Amount</td><td>" + str(X2) + "</td></tr>"
335
 
336
    maildata += "<tr><td>X3</td><td>Gift Amount</td><td>" + str(X3) + "</td></tr>"
337
    maildata += "<tr><td>X4</td><td>Wallet Difference</td><td>" + str(X4) + "</td></tr>"
338
    maildata += "<tr><td>X5</td><td>Payment Amount</td><td>" + str(X5) + "</td></tr>"
339
    maildata += "<tr><td>X6</td><td>Payment Refund Amount</td><td>" + str(X6) + "</td></tr>"
340
    maildata += "<tr><td>P=X2+X3+X5-X4-X6</td><td>Net Payments</td><td>" + str(P) + "</td></tr>"
341
    maildata += "<tr><td></td><td></td><td></td></tr>"
342
 
343
    maildata += "<tr><td>D=R-P</td><td>Net Reconciliation Difference</td><td>" + str(D) + "</td></tr>"
8788 rajveer 344
    maildata += "</tbody></table>"
345
 
346
    if D != 0:
8837 rajveer 347
        mismatches = []
14242 kshitij.so 348
        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 = 60))).all()
349
        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 = 60), startTime)).all()
8788 rajveer 350
        if mismatches and len(mismatches) > 0:
351
            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>"
352
            for mismatch in mismatches:
353
                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>"        
354
            maildata += "</tbody></table>"
355
 
356
    maildata += "</body></html>"
14709 kshitij.so 357
    mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["anikendra.das@saholic.com", "kshitij.sood@shop2020.in", "rajneesh.arora@shop2020.in", "amit.gupta@saholic.com"], "Customer Recharge Reconciliation for Date:- " + startTime.strftime("%d-%m-%Y"), maildata, [])
8790 rajveer 358
 
8788 rajveer 359
 
6235 rajveer 360
def processRefunds():
361
    todate = datetime.datetime.now()
8788 rajveer 362
    for i in range(10):
6235 rajveer 363
        orderDate = todate + datetime.timedelta(days= -i)
364
        refunds = getRefunds(orderDate)
365
        for key in refunds.keys():
366
            refund = refunds.get(key)
367
            refundAmount = refund[0]
368
            refundDate = refund[1]
369
            order = RechargeOrder.get_by(spiceTID = key)
7127 rajveer 370
            if order:
371
                amount = order.totalAmount
372
                isStoreOrder = False
373
            else:
374
                order = RechargeTransaction.get_by(spiceTID = key)
7188 rajveer 375
                if not order:
376
                    continue
7127 rajveer 377
                isStoreOrder = True
378
                amount = order.amount
6235 rajveer 379
            if order.status == RechargeOrderStatus.RECHARGE_FAILED_REFUNDED:
380
                print "Refund is already processed."
381
                continue
13564 kshitij.so 382
            if order.status not in (RechargeOrderStatus.RECHARGE_SUCCESSFUL, RechargeOrderStatus.PAYMENT_SUCCESSFUL, RechargeOrderStatus.RECHARGE_UNKNOWN, RechargeOrderStatus.RECHARGE_IN_PROCESS):
7075 rajveer 383
                print "Recharge/Payment is not successful. There is something wrong."
6235 rajveer 384
                continue
7127 rajveer 385
            if amount != refundAmount:
6235 rajveer 386
                print "Refund amount is not same as transaction amount"
387
                continue
7127 rajveer 388
            if isStoreOrder:
7244 rajveer 389
                update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED)
7127 rajveer 390
            else:
7780 rajveer 391
                update_recharge_order_status(order.id, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED)
6235 rajveer 392
 
393
def processUnknownTransactions():    
394
    orders = get_recharge_orders_for_status(RechargeOrderStatus.PAYMENT_SUCCESSFUL)
6219 rajveer 395
    for order in orders:
6276 rajveer 396
        try:
397
            if order.creationTimestamp + datetime.timedelta(minutes=10) < datetime.datetime.now():
398
                status, description = checkTransactionStatus('', str(order.id))
399
                print status, description
400
                if status:
401
                    update_recharge_order_status(order.id, RechargeOrderStatus.RECHARGE_SUCCESSFUL)
402
                else:
403
                    update_recharge_order_status(order.id, RechargeOrderStatus.RECHARGE_FAILED)
404
        except:
405
            print "Do Nothing"
13564 kshitij.so 406
 
407
    inprocessOrders = RechargeTransaction.query.filter(RechargeTransaction.status == RechargeOrderStatus.RECHARGE_IN_PROCESS).all()
408
    for inprocessOrder in inprocessOrders:
409
        inprocessOrder.status = RechargeOrderStatus.RECHARGE_UNKNOWN
410
    session.commit()
411
 
7163 rajveer 412
    ## For store transactions
7245 rajveer 413
    rorders = RechargeTransaction.query.filter(RechargeTransaction.status.in_([RechargeOrderStatus.RECHARGE_UNKNOWN, RechargeOrderStatus.INIT])).all()
7166 rajveer 414
    for order in rorders:
7163 rajveer 415
        try:
416
            if order.transactionTime + datetime.timedelta(minutes=10) < datetime.datetime.now():
417
                status, description = checkTransactionStatus('', str(order.id))
418
                print status, description
419
                if status:
420
                    update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_SUCCESSFUL)
7245 rajveer 421
                elif order.status == RechargeOrderStatus.INIT:
422
                    update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_FAILED)
7163 rajveer 423
                else:
7244 rajveer 424
                    update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED)
7163 rajveer 425
        except:
426
            print "Do Nothing"
427
 
428
 
6451 rajveer 429
def processAuthorizedTransactions(txn_id):
430
    update_recharge_order_status(txn_id, RechargeOrderStatus.PAYMENT_SUCCESSFUL)
6235 rajveer 431
 
7141 rajveer 432
 
433
def compute_recharge_collection(cdate):
434
    todate = datetime.datetime(cdate.year, cdate.month, cdate.day)
435
    tomorrow = todate + timedelta(days=1)
13564 kshitij.so 436
    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, RechargeOrderStatus.RECHARGE_IN_PROCESS])).filter(RechargeTransaction.transactionTime.between(todate, tomorrow)).group_by(RechargeTransaction.storeId, RechargeTransaction.payMethod, RechargeTransaction.status).order_by(RechargeTransaction.storeId).all()
8875 rajveer 437
    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 438
    storeData = {}
439
    for txn in txns:
440
        print txn
441
        if not storeData.has_key(txn[0]):
442
            data = [0,0,0,0,0]
443
            storeData[txn[0]] = data
444
        else:
445
            data = storeData[txn[0]]
7155 rajveer 446
        if txn[1] == 1:
7141 rajveer 447
            data[0] += int(txn[3]) - int(txn[4])
7155 rajveer 448
        if txn[1] == 2:
7141 rajveer 449
            data[1] += int(txn[3]) - int(txn[4])
9342 rajveer 450
 
451
        data[2] += int(txn[3])
452
        data[3] += int(txn[4])
453
        data[4] += int(txn[3]) - int(txn[4])
7141 rajveer 454
        storeData[txn[0]] = data
8868 rajveer 455
 
456
 
8875 rajveer 457
    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 458
    for txn in reftxns:
459
        print txn
460
        if not storeData.has_key(txn[0]):
461
            data = [0,0,0,0,0]
462
            storeData[txn[0]] = data
463
        else:
464
            data = storeData[txn[0]]
7155 rajveer 465
        if txn[1] == 1:
7148 rajveer 466
            data[0] -= int(txn[3]) - int(txn[4])
7155 rajveer 467
        if txn[1] == 2:
7148 rajveer 468
            data[1] -= int(txn[3]) - int(txn[4])
7141 rajveer 469
        data[2] -= int(txn[3])
470
        data[3] -= int(txn[4])
471
        data[4] -= int(txn[3]) - int(txn[4])
472
    print storeData
7163 rajveer 473
 
7175 rajveer 474
    wallet = WalletForCompany.query.filter(WalletForCompany.id == 1).one()    
475
 
476
    dt = session.query(func.sum(RechargeTransaction.amount)).filter(RechargeTransaction.status.in_([RechargeOrderStatus.RECHARGE_SUCCESSFUL])).one()
477
 
7511 rajveer 478
#    if int(dt[0]) != wallet.amount:
11118 kshitij.so 479
#        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 480
 
7175 rajveer 481
    maildata = "<html><body><table border='1'><thead><th>StoreId</th><th>Gross</th><th>Discount</th><th>Net</th></thead><tbody>"
482
    trecharge = 0
7967 anupam.sin 483
    hotspotServiceMatrices = HotspotServiceMatrix.query.all()
484
    hotspotServiceMatrixMap = {}
485
 
486
    for hotspotServiceMatrix in hotspotServiceMatrices:
487
        hotspotServiceMatrixMap[hotspotServiceMatrix.storeId] = hotspotServiceMatrix
488
 
7141 rajveer 489
    for storeId in storeData.keys():
490
        store = HotspotStore.get_by(id = storeId)
7967 anupam.sin 491
        if hotspotServiceMatrixMap.has_key(storeId):
492
            del hotspotServiceMatrixMap[storeId]
7141 rajveer 493
        store.collectedAmount = 0
494
        store.availableLimit = store.creditLimit
7142 rajveer 495
        session.commit()
496
 
7141 rajveer 497
        data = storeData.get(storeId)
7250 rajveer 498
        rc = RechargeCollection()
499
        rc.hotspotId = store.hotspotId
500
        rc.reconDate = int(todate.strftime("%Y%m%d"))
501
        rc.cash = data[0]
502
        rc.hdfc = data[1]
503
        rc.grossAmount = data[2]
504
        rc.discount = data[3]
505
        rc.netCollection = data[4]
506
        rc.addedAt = datetime.datetime.now()
507
        rc.pushedToOcr = False
508
        session.commit()
509
 
7175 rajveer 510
        maildata += "<tr><td>" + store.hotspotId + "</td><td>" + str(data[2]) + "</td><td>" + str(data[3]) + "</td><td>" + str(data[4]) + "</td></tr>"
511
        trecharge +=  data[2]
7250 rajveer 512
 
7276 rajveer 513
    dit = session.query(func.sum(RechargeCollection.grossAmount)).one()
7821 rajveer 514
    dit2 = session.query(func.sum(WalletHistoryForCompany.amount)).filter(WalletHistoryForCompany.walletId == 1).filter(WalletHistoryForCompany.amount >= 100000).one()
7276 rajveer 515
    wamt = int(dit2[0])- int(dit[0])
516
    wallet.amount = wamt
517
    session.commit()
518
 
7250 rajveer 519
    maildata += "</tbody></table></body></html>"
14672 kshitij.so 520
    mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["anikendra.das@saholic.com", "kshitij.sood@shop2020.in", "sachin.tyagi@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 521
    try:
522
        push_recharge_collection_to_ocr()
523
    except:
11118 kshitij.so 524
        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 525
    finally:
7986 anupam.sin 526
        msg = "<html><body>"
7967 anupam.sin 527
        for storeId in hotspotServiceMatrixMap.keys():
528
            if hotspotServiceMatrixMap.get(storeId).rechargeService:
529
                store = HotspotStore.get_by(id = storeId)
7986 anupam.sin 530
                msg = msg + str(store.hotspotId) + ' - ' + str(store.email) + '<br>'
531
        msg = msg + '</body></html>'
532
        helper_client = HelperClient().get_client()
10298 manish.sha 533
        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 534
 
7967 anupam.sin 535
 
7250 rajveer 536
 
537
def push_recharge_collection_to_ocr():
538
    rcs = RechargeCollection.query.filter(RechargeCollection.pushedToOcr == False).all()
539
 
540
    for rc in rcs:
541
        store_string = "<Store>" + rc.hotspotId + "</Store>"
542
        date_string = "<ReconDate>" + str(rc.reconDate) + "</ReconDate>"
543
        cash_string = "<Cash>" + str(rc.cash) + "</Cash>"
544
        card_string = "<Hdfc>" + str(rc.hdfc) + "</Hdfc>"
545
        type_string = "<Type>RechargeSale</Type>"
546
        amount_string = "<GrossRechargeAmount>" + str(rc.grossAmount) + "</GrossRechargeAmount><Discount>" + str(rc.discount) +  "</Discount><NetCollection>" + str(rc.netCollection) + "</NetCollection>";
547
 
7141 rajveer 548
        #SaholicRechargeSaleTransfer(string Store, int ReconDate, decimal Cash, decimal Hdfc, string Type, decimal GrossRechargeAmount, decimal Discount, decimal NetCollection)
549
 
15479 kshitij.so 550
        conn = httplib.HTTPConnection("125.19.98.100")
7141 rajveer 551
        XML="""
552
        <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/">
553
          <soap:Body>
554
            <SaholicRechargeSaleTransfer xmlns="http://tempuri.org/">
555
        """
556
 
8195 rajveer 557
        XML = XML + store_string + date_string + cash_string + card_string + "<Cheque>0</Cheque>" + type_string + amount_string 
7141 rajveer 558
 
559
        footer = """
560
            </SaholicRechargeSaleTransfer>
561
          </soap:Body>
562
        </soap:Envelope>
563
        """
564
        XML = XML + footer
565
 
566
        print XML
567
        params = urllib.urlencode({'op': 'SaholicRechargeSaleTransfer'})
568
        headers = { "Content-type": "text/xml", "Content-Length": "%d" % len(XML)}
569
        conn.request("POST", "/loaddetect/Service.asmx?"+params, "", headers)
570
        conn.send(XML)
571
        response = conn.getresponse()
572
        print response.status, response.reason
573
        resp = response.read()
574
        conn.close()
575
        print resp
7250 rajveer 576
        if "Saved Successfully" in resp:
577
            rc.pushedAt = datetime.datetime.now()
578
            rc.pushedToOcr = True
579
            session.commit()
580
        elif "Error in Saving Data" in resp:
20596 amit.gupta 581
            mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["amit.gupta@shop2020.in", "kshitij.sood@shop2020.in", "rajneesh.arora@shop2020.in"], "Problem while pushing recharge collection to OCR", resp, [])
7250 rajveer 582
        else: 
20596 amit.gupta 583
            mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["amit.gupta@shop2020.in", "kshitij.sood@shop2020.in", "rajneesh.arora@shop2020.in"], "Problem while pushing recharge collection to OCR", resp, [])
7250 rajveer 584
 
7141 rajveer 585
 
7175 rajveer 586
 
7147 rajveer 587
def topup_company_wallet(companyId, amount):
588
    wallet = WalletForCompany.query.filter(WalletForCompany.id == companyId).with_lockmode("update").one()
7285 rajveer 589
    company = Company.get_by(id = companyId)
7147 rajveer 590
    wh = WalletHistoryForCompany()
591
    wh.walletId = wallet.id
592
    wh.openingBal = wallet.amount
593
    wh.closingBal = wallet.amount +  amount
594
    wh.amount = amount
595
    wh.transactionTime = datetime.datetime.now()
7167 rajveer 596
    wh.referenceNumber =  get_next_invoice_number(OrderType.WALLETCREDIT)
7147 rajveer 597
    wh.description = "Wallet Credited"
598
 
599
    wallet.amount += amount
600
    session.commit()
14672 kshitij.so 601
    mail("cnc.center@shop2020.in", "5h0p2o2o", ["anikendra.das@saholic.com", "kshitij.sood@shop2020.in", "sachin.tyagi@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 602
 
7983 rajveer 603
def compute_website_recharge_collection(cdate, oldBalance, newBalance):
8815 rajveer 604
    startTime = datetime.datetime(cdate.year, cdate.month, cdate.day)
605
    endTime = startTime + timedelta(days=1)
606
    tamount = 0
7147 rajveer 607
 
8815 rajveer 608
    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()    
609
    if txns and txns[0]:
610
        tamount += int(txns[0])
7821 rajveer 611
 
8815 rajveer 612
    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()
613
    if otxns and otxns[0]:
614
        tamount += int(otxns[0])
615
 
616
    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()
617
    if reftxns and reftxns[0]:
618
        tamount -= int(reftxns[0])
7821 rajveer 619
 
620
    wallet = WalletForCompany.query.filter(WalletForCompany.id == 2).with_lockmode("update").one()
7823 rajveer 621
 
622
 
623
    d = datetime.datetime.now()
624
    wh = WalletHistoryForCompany()
625
    wh.walletId = wallet.id
626
    wh.openingBal = wallet.amount
627
    wh.closingBal = wallet.amount - tamount
7982 rajveer 628
    wh.amount = -tamount
7823 rajveer 629
    wh.transactionTime = d
630
    wh.referenceNumber =  int(d.strftime("%Y%m%d"))
631
    wh.description = "Wallet Credited"
632
    wallet.amount = wallet.amount - tamount
7821 rajveer 633
    session.commit()
634
 
7823 rajveer 635
 
8007 rajveer 636
    maildata = ""
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 :- Saholic (Date - " + startTime.strftime("%d-%m-%Y") + ")   (Wallet Amount - " + str(wallet.amount) + ")    (Total Recharge - " + str(tamount) + ")", maildata, []) 
7821 rajveer 638
 
8012 rajveer 639
    rAmount = 0
8815 rajveer 640
    ramount = session.query(func.sum(WalletHistoryForCompany.amount)).filter(WalletHistoryForCompany.transactionTime >= startTime).filter(WalletHistoryForCompany.amount >= 100000).one()
8012 rajveer 641
    if ramount[0]:
642
        rAmount = int(ramount[0])
8815 rajveer 643
    rcs = session.query(func.sum(RechargeCollection.grossAmount)).filter(RechargeCollection.reconDate == int(startTime.strftime("%Y%m%d"))).one()
8007 rajveer 644
    hamount = int(rcs[0])
645
 
8012 rajveer 646
    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)
19096 kshitij.so 647
    mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["amit.tyagi@spiceretail.co.in", "karanpanchal@spiceretail.co.in", "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 648
 
6147 rajveer 649
if __name__ == '__main__':
7967 anupam.sin 650
    main()
9633 rajveer 651