Subversion Repositories SmartDukaan

Rev

Rev 11601 | Rev 13564 | 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
7188 rajveer 378
            if order.status not in (RechargeOrderStatus.RECHARGE_SUCCESSFUL, RechargeOrderStatus.PAYMENT_SUCCESSFUL, RechargeOrderStatus.RECHARGE_UNKNOWN):
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"
6451 rajveer 402
 
7163 rajveer 403
    ## For store transactions
7245 rajveer 404
    rorders = RechargeTransaction.query.filter(RechargeTransaction.status.in_([RechargeOrderStatus.RECHARGE_UNKNOWN, RechargeOrderStatus.INIT])).all()
7166 rajveer 405
    for order in rorders:
7163 rajveer 406
        try:
407
            if order.transactionTime + datetime.timedelta(minutes=10) < datetime.datetime.now():
408
                status, description = checkTransactionStatus('', str(order.id))
409
                print status, description
410
                if status:
411
                    update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_SUCCESSFUL)
7245 rajveer 412
                elif order.status == RechargeOrderStatus.INIT:
413
                    update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_FAILED)
7163 rajveer 414
                else:
7244 rajveer 415
                    update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED)
7163 rajveer 416
        except:
417
            print "Do Nothing"
418
 
419
 
6451 rajveer 420
def processAuthorizedTransactions(txn_id):
421
    update_recharge_order_status(txn_id, RechargeOrderStatus.PAYMENT_SUCCESSFUL)
6235 rajveer 422
 
7141 rajveer 423
 
424
def compute_recharge_collection(cdate):
425
    todate = datetime.datetime(cdate.year, cdate.month, cdate.day)
426
    tomorrow = todate + timedelta(days=1)
8868 rajveer 427
    txns = session.query(RechargeTransaction.storeId, RechargeTransaction.payMethod, RechargeTransaction.status, func.sum(RechargeTransaction.amount), func.sum(RechargeTransaction.discount)).filter(RechargeTransaction.status.in_([RechargeOrderStatus.RECHARGE_SUCCESSFUL, RechargeOrderStatus.RECHARGE_UNKNOWN])).filter(RechargeTransaction.transactionTime.between(todate, tomorrow)).group_by(RechargeTransaction.storeId, RechargeTransaction.payMethod, RechargeTransaction.status).order_by(RechargeTransaction.storeId).all()
8875 rajveer 428
    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 429
    storeData = {}
430
    for txn in txns:
431
        print txn
432
        if not storeData.has_key(txn[0]):
433
            data = [0,0,0,0,0]
434
            storeData[txn[0]] = data
435
        else:
436
            data = storeData[txn[0]]
7155 rajveer 437
        if txn[1] == 1:
7141 rajveer 438
            data[0] += int(txn[3]) - int(txn[4])
7155 rajveer 439
        if txn[1] == 2:
7141 rajveer 440
            data[1] += int(txn[3]) - int(txn[4])
9342 rajveer 441
 
442
        data[2] += int(txn[3])
443
        data[3] += int(txn[4])
444
        data[4] += int(txn[3]) - int(txn[4])
7141 rajveer 445
        storeData[txn[0]] = data
8868 rajveer 446
 
447
 
8875 rajveer 448
    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 449
    for txn in reftxns:
450
        print txn
451
        if not storeData.has_key(txn[0]):
452
            data = [0,0,0,0,0]
453
            storeData[txn[0]] = data
454
        else:
455
            data = storeData[txn[0]]
7155 rajveer 456
        if txn[1] == 1:
7148 rajveer 457
            data[0] -= int(txn[3]) - int(txn[4])
7155 rajveer 458
        if txn[1] == 2:
7148 rajveer 459
            data[1] -= int(txn[3]) - int(txn[4])
7141 rajveer 460
        data[2] -= int(txn[3])
461
        data[3] -= int(txn[4])
462
        data[4] -= int(txn[3]) - int(txn[4])
463
    print storeData
7163 rajveer 464
 
7175 rajveer 465
    wallet = WalletForCompany.query.filter(WalletForCompany.id == 1).one()    
466
 
467
    dt = session.query(func.sum(RechargeTransaction.amount)).filter(RechargeTransaction.status.in_([RechargeOrderStatus.RECHARGE_SUCCESSFUL])).one()
468
 
7511 rajveer 469
#    if int(dt[0]) != wallet.amount:
11118 kshitij.so 470
#        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 471
 
7175 rajveer 472
    maildata = "<html><body><table border='1'><thead><th>StoreId</th><th>Gross</th><th>Discount</th><th>Net</th></thead><tbody>"
473
    trecharge = 0
7967 anupam.sin 474
    hotspotServiceMatrices = HotspotServiceMatrix.query.all()
475
    hotspotServiceMatrixMap = {}
476
 
477
    for hotspotServiceMatrix in hotspotServiceMatrices:
478
        hotspotServiceMatrixMap[hotspotServiceMatrix.storeId] = hotspotServiceMatrix
479
 
7141 rajveer 480
    for storeId in storeData.keys():
481
        store = HotspotStore.get_by(id = storeId)
7967 anupam.sin 482
        if hotspotServiceMatrixMap.has_key(storeId):
483
            del hotspotServiceMatrixMap[storeId]
7141 rajveer 484
        store.collectedAmount = 0
485
        store.availableLimit = store.creditLimit
7142 rajveer 486
        session.commit()
487
 
7141 rajveer 488
        data = storeData.get(storeId)
7250 rajveer 489
        rc = RechargeCollection()
490
        rc.hotspotId = store.hotspotId
491
        rc.reconDate = int(todate.strftime("%Y%m%d"))
492
        rc.cash = data[0]
493
        rc.hdfc = data[1]
494
        rc.grossAmount = data[2]
495
        rc.discount = data[3]
496
        rc.netCollection = data[4]
497
        rc.addedAt = datetime.datetime.now()
498
        rc.pushedToOcr = False
499
        session.commit()
500
 
7175 rajveer 501
        maildata += "<tr><td>" + store.hotspotId + "</td><td>" + str(data[2]) + "</td><td>" + str(data[3]) + "</td><td>" + str(data[4]) + "</td></tr>"
502
        trecharge +=  data[2]
7250 rajveer 503
 
7276 rajveer 504
    dit = session.query(func.sum(RechargeCollection.grossAmount)).one()
7821 rajveer 505
    dit2 = session.query(func.sum(WalletHistoryForCompany.amount)).filter(WalletHistoryForCompany.walletId == 1).filter(WalletHistoryForCompany.amount >= 100000).one()
7276 rajveer 506
    wamt = int(dit2[0])- int(dit[0])
507
    wallet.amount = wamt
508
    session.commit()
509
 
7250 rajveer 510
    maildata += "</tbody></table></body></html>"
11118 kshitij.so 511
    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 512
    try:
513
        push_recharge_collection_to_ocr()
514
    except:
11118 kshitij.so 515
        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 516
    finally:
7986 anupam.sin 517
        msg = "<html><body>"
7967 anupam.sin 518
        for storeId in hotspotServiceMatrixMap.keys():
519
            if hotspotServiceMatrixMap.get(storeId).rechargeService:
520
                store = HotspotStore.get_by(id = storeId)
7986 anupam.sin 521
                msg = msg + str(store.hotspotId) + ' - ' + str(store.email) + '<br>'
522
        msg = msg + '</body></html>'
523
        helper_client = HelperClient().get_client()
10298 manish.sha 524
        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 525
 
7967 anupam.sin 526
 
7250 rajveer 527
 
528
def push_recharge_collection_to_ocr():
529
    rcs = RechargeCollection.query.filter(RechargeCollection.pushedToOcr == False).all()
530
 
531
    for rc in rcs:
532
        store_string = "<Store>" + rc.hotspotId + "</Store>"
533
        date_string = "<ReconDate>" + str(rc.reconDate) + "</ReconDate>"
534
        cash_string = "<Cash>" + str(rc.cash) + "</Cash>"
535
        card_string = "<Hdfc>" + str(rc.hdfc) + "</Hdfc>"
536
        type_string = "<Type>RechargeSale</Type>"
537
        amount_string = "<GrossRechargeAmount>" + str(rc.grossAmount) + "</GrossRechargeAmount><Discount>" + str(rc.discount) +  "</Discount><NetCollection>" + str(rc.netCollection) + "</NetCollection>";
538
 
7141 rajveer 539
        #SaholicRechargeSaleTransfer(string Store, int ReconDate, decimal Cash, decimal Hdfc, string Type, decimal GrossRechargeAmount, decimal Discount, decimal NetCollection)
540
 
7253 rajveer 541
        conn = httplib.HTTPConnection("182.71.104.186")
7141 rajveer 542
        XML="""
543
        <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/">
544
          <soap:Body>
545
            <SaholicRechargeSaleTransfer xmlns="http://tempuri.org/">
546
        """
547
 
8195 rajveer 548
        XML = XML + store_string + date_string + cash_string + card_string + "<Cheque>0</Cheque>" + type_string + amount_string 
7141 rajveer 549
 
550
        footer = """
551
            </SaholicRechargeSaleTransfer>
552
          </soap:Body>
553
        </soap:Envelope>
554
        """
555
        XML = XML + footer
556
 
557
        print XML
558
        params = urllib.urlencode({'op': 'SaholicRechargeSaleTransfer'})
559
        headers = { "Content-type": "text/xml", "Content-Length": "%d" % len(XML)}
560
        conn.request("POST", "/loaddetect/Service.asmx?"+params, "", headers)
561
        conn.send(XML)
562
        response = conn.getresponse()
563
        print response.status, response.reason
564
        resp = response.read()
565
        conn.close()
566
        print resp
7250 rajveer 567
        if "Saved Successfully" in resp:
568
            rc.pushedAt = datetime.datetime.now()
569
            rc.pushedToOcr = True
570
            session.commit()
571
        elif "Error in Saving Data" in resp:
11118 kshitij.so 572
            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 573
        else: 
11118 kshitij.so 574
            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 575
 
7141 rajveer 576
 
7175 rajveer 577
 
7147 rajveer 578
def topup_company_wallet(companyId, amount):
579
    wallet = WalletForCompany.query.filter(WalletForCompany.id == companyId).with_lockmode("update").one()
7285 rajveer 580
    company = Company.get_by(id = companyId)
7147 rajveer 581
    wh = WalletHistoryForCompany()
582
    wh.walletId = wallet.id
583
    wh.openingBal = wallet.amount
584
    wh.closingBal = wallet.amount +  amount
585
    wh.amount = amount
586
    wh.transactionTime = datetime.datetime.now()
7167 rajveer 587
    wh.referenceNumber =  get_next_invoice_number(OrderType.WALLETCREDIT)
7147 rajveer 588
    wh.description = "Wallet Credited"
589
 
590
    wallet.amount += amount
591
    session.commit()
11118 kshitij.so 592
    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 593
 
7983 rajveer 594
def compute_website_recharge_collection(cdate, oldBalance, newBalance):
8815 rajveer 595
    startTime = datetime.datetime(cdate.year, cdate.month, cdate.day)
596
    endTime = startTime + timedelta(days=1)
597
    tamount = 0
7147 rajveer 598
 
8815 rajveer 599
    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()    
600
    if txns and txns[0]:
601
        tamount += int(txns[0])
7821 rajveer 602
 
8815 rajveer 603
    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()
604
    if otxns and otxns[0]:
605
        tamount += int(otxns[0])
606
 
607
    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()
608
    if reftxns and reftxns[0]:
609
        tamount -= int(reftxns[0])
7821 rajveer 610
 
611
    wallet = WalletForCompany.query.filter(WalletForCompany.id == 2).with_lockmode("update").one()
7823 rajveer 612
 
613
 
614
    d = datetime.datetime.now()
615
    wh = WalletHistoryForCompany()
616
    wh.walletId = wallet.id
617
    wh.openingBal = wallet.amount
618
    wh.closingBal = wallet.amount - tamount
7982 rajveer 619
    wh.amount = -tamount
7823 rajveer 620
    wh.transactionTime = d
621
    wh.referenceNumber =  int(d.strftime("%Y%m%d"))
622
    wh.description = "Wallet Credited"
623
    wallet.amount = wallet.amount - tamount
7821 rajveer 624
    session.commit()
625
 
7823 rajveer 626
 
8007 rajveer 627
    maildata = ""
11118 kshitij.so 628
    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 629
 
8012 rajveer 630
    rAmount = 0
8815 rajveer 631
    ramount = session.query(func.sum(WalletHistoryForCompany.amount)).filter(WalletHistoryForCompany.transactionTime >= startTime).filter(WalletHistoryForCompany.amount >= 100000).one()
8012 rajveer 632
    if ramount[0]:
633
        rAmount = int(ramount[0])
8815 rajveer 634
    rcs = session.query(func.sum(RechargeCollection.grossAmount)).filter(RechargeCollection.reconDate == int(startTime.strftime("%Y%m%d"))).one()
8007 rajveer 635
    hamount = int(rcs[0])
636
 
8012 rajveer 637
    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 638
    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 639
 
6147 rajveer 640
if __name__ == '__main__':
7967 anupam.sin 641
    main()
9633 rajveer 642