Subversion Repositories SmartDukaan

Rev

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