Subversion Repositories SmartDukaan

Rev

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