Subversion Repositories SmartDukaan

Rev

Rev 9342 | Rev 10298 | 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,\
42
    getRechargeClient, checkTransactionStatus, getAllTransactions
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()
110
    websiteOrders = {}
111
    storeOrders = {}
112
    spiceOrders = {}
113
    rechargeOrders = RechargeOrder.query.filter(not_(RechargeOrder.status.in_([RechargeOrderStatus.INIT, RechargeOrderStatus.PAYMENT_FAILED, RechargeOrderStatus.PAYMENT_PENDING]))).filter(RechargeOrder.creationTimestamp.between(startTime, endTime)).all()
114
    rechargeTransactions = RechargeTransaction.query.filter(not_(RechargeTransaction.status.in_([RechargeOrderStatus.INIT, RechargeOrderStatus.PAYMENT_FAILED, RechargeOrderStatus.PAYMENT_PENDING]))).filter(RechargeTransaction.transactionTime.between(startTime, endTime)).all()
115
    print "Creating MAps"
116
    for rechargeOrder in rechargeOrders:
117
        websiteOrders[int(rechargeOrder.id)] = rechargeOrder
118
 
119
    for rechargeTxn in rechargeTransactions:
120
        storeOrders[int(rechargeTxn.id)] = rechargeTxn
121
 
122
    print "***** Getting transactions from mobisoc..."
123
    transactions = getAllTransactions(startTime, endTime)
124
    print "***** Got all transactions"
6235 rajveer 125
 
9321 anupam.sin 126
    for txn in transactions:
127
        try:
128
            print "in for loop"
129
            respCode = txn.getElementsByTagName('transactionResponseCode')[0].childNodes[0].data
130
            merchantTid = txn.getElementsByTagName('merchantTid')[0].childNodes[0].data
131
            spiceTid = txn.getElementsByTagName('spiceTid')[0].childNodes[0].data
132
            rechargeTime = txn.getElementsByTagName('rechargeDate')[0].childNodes[0].data
133
            sth = SpiceTransactionHistory()
134
            sth.rechargeTime = rechargeTime
135
            sth.orderId = merchantTid
136
            sth.spiceTID = spiceTid
137
            sth.reponseCode = respCode
138
            session.commit()
139
            spiceOrders[int(merchantTid)] = respCode
140
        except:
141
            continue
142
 
143
    print "Length of storeOrders : " + str(len(storeOrders.keys()))
144
    print "Length of websiteOrders : " + str(len(websiteOrders.keys()))
145
    print "Length of spiceOrders : " + str(len(spiceOrders.keys()))
146
 
147
    for id in spiceOrders.keys():
148
        spiceorder = spiceOrders.get(id)
149
        order = storeOrders.get(id)
150
        if order is None:
151
            order = websiteOrders.get(id)
152
 
153
        if order:
154
            if spiceorder == '00' and order.status in (5, 6):
155
                removed = storeOrders.pop(id, -1)
156
                print str(removed)
157
                if removed == -1:
158
                    removed = websiteOrders.pop(id, -1)
159
                if removed != -1:
160
                    removed = spiceOrders.pop(id, -1)
161
 
162
            elif spiceorder in ('STO','US', 'UP') and order.status in (3, 4, 5, 10, 6, 7, 8):
163
                removed = storeOrders.pop(id, -1)
164
                if removed == -1:
165
                    removed = websiteOrders.pop(id, -1)
166
                if removed != -1:
167
                    removed = spiceOrders.pop(id, -1)
168
 
169
            elif spiceorder not in ('STO','US', 'UP', '00') and order.status in (4, 6, 7, 8) :
170
                removed = storeOrders.pop(id, -1)
171
                if removed == -1:
172
                    removed = websiteOrders.pop(id, -1)
173
                if removed != -1:
174
                    removed = spiceOrders.pop(id, -1)
175
 
176
    print "Length of storeOrders : " + str(len(storeOrders.keys()))
177
    print "Length of websiteOrders : " + str(len(websiteOrders.keys()))
178
    print "Length of spiceOrders : " + str(len(spiceOrders.keys()))
179
 
180
    if len(websiteOrders.keys()) > 0:
181
        for woid in websiteOrders.keys():
182
            try:
183
                result = checkTransactionStatus("", str(woid))
184
            except Exception:
185
                pass
186
            if result:
187
                removed = websiteOrders.pop(woid, -1)
188
 
189
    if len(storeOrders.keys()) > 0:
190
        for soid in storeOrders.keys():
191
            try:
192
                result = checkTransactionStatus("", str(soid))
193
            except Exception:
194
                pass
195
            if result[0] == False:
196
                removed = storeOrders.pop(soid, -1)
197
 
198
    if len(spiceOrders.keys()) > 0:
199
        for id in spiceOrders.keys():
200
            order = RechargeOrder.query.filter(RechargeOrder.id == id).first()
201
            if order is None:
202
                order = RechargeTransaction.query.filter(RechargeTransaction.id == id).first()
203
            if order:
204
                spiceorder = spiceOrders.get(id)
205
                if spiceorder == '00' and order.status in (5, 6):
206
                    removed = spiceOrders.pop(id, -1)
207
 
208
                elif spiceorder in ('STO','US', 'UP') and order.status in (3, 4, 10, 5, 6, 7, 8):
209
                    removed = spiceOrders.pop(id, -1)
210
 
211
                elif spiceorder not in ('STO','US', 'UP', '00') and order.status in (4, 6, 7, 8) :
212
                    removed = spiceOrders.pop(id, -1)
213
 
214
    maildata = "<html><body><b>Website Recharges</b><br><br>"
215
    for woid in websiteOrders.keys():
216
        wo = websiteOrders.get(woid)
217
        maildata = maildata + str(wo.id) + " : " +  str(wo.status) + "<br>"
218
 
219
    maildata = maildata + "<br><br><b>Store recharges</b><br><br>"
220
    for soid in storeOrders.keys():
221
        so = storeOrders.get(soid)
222
        maildata = maildata +  str(so.id) + " : " + str(so.status) + "<br>"
223
 
224
    maildata = maildata + "<br><br><b>Spice Orders</b><br><br>"
225
    for id in spiceOrders.keys():
226
        maildata = maildata + str(id) + " : " + str(spiceOrders.get(id)) + "<br>"
227
 
228
    maildata = maildata + "</body></html>"
229
    mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["rajveer.singh@shop2020.in", "anupam.singh@shop2020.in"], "Mobisoc Recharge Reconciliation for Date:- " + startTime.strftime("%d-%m-%Y"), maildata, [])
230
 
231
 
8788 rajveer 232
def processRecon():
233
    cdate = datetime.datetime.now() + timedelta(days = -1)
234
    startTime = datetime.datetime(cdate.year, cdate.month, cdate.day)
235
    endTime = startTime + timedelta(days=1)
236
 
8795 rajveer 237
 
8788 rajveer 238
    '''
239
    A - All such orders for which we have attempted the recharge and recharge is either successful or unknown.
240
    B - All such orders for which we have attempted the recharge and we received the refund after this time window.
241
    C - All such orders for which we have received the refund in this time window, although the recharge was attempted before this window.
242
    X1 = A + B - C         Net amount debited for all the customers in this time window.
243
    X2 - Total amount credited to all customers in their wallet under some promotion.
244
    X3 - Net difference in wallet amount between this time window.
245
    X4 - Payment received through gateway from all customer in this time window.
246
    X5 - Payment refunded through gateway by all customer in this time window.
247
    '''
248
 
8790 rajveer 249
    A1 = 0
250
    B1 = 0
251
    C1 = 0
252
    A2 = 0
253
    B2 = 0
254
    C2 = 0
255
    R = 0
256
    P = 0
8788 rajveer 257
    X1 = 0
258
    X2 = 0
259
    X3 = 0
260
    X4 = 0
261
    X5 = 0
8790 rajveer 262
    X6 = 0
8788 rajveer 263
    D = 0
264
 
8790 rajveer 265
    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 266
    if sorder and sorder[0]:
8790 rajveer 267
        A1 = int(sorder[0])
268
        A2 = int(sorder[1])
8788 rajveer 269
 
8790 rajveer 270
    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 271
    if forder and forder[0]:
8790 rajveer 272
        B1 = int(forder[0])
273
        B2 = int(forder[1])
8788 rajveer 274
 
8790 rajveer 275
    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 276
    if rorder and rorder[0]:
8790 rajveer 277
        C1 = int(rorder[0])
278
        C2 = int(rorder[1])
8788 rajveer 279
 
8790 rajveer 280
    R = R + A1 + B1 - C1
281
    X2 = X2 + A2 + B2 - C2
8788 rajveer 282
 
283
    rv = session.query(func.sum(RechargeVoucherTracker.amount)).filter(RechargeVoucherTracker.issuedOn.between(startTime,endTime)).first()
284
    if rv and rv[0]:
8790 rajveer 285
        X3 = int(rv[0])
8788 rajveer 286
 
287
    uw = session.query(func.sum(UserWalletHistory.amount)).filter(UserWalletHistory.timestamp.between(startTime,endTime)).first()
288
    if uw and uw[0]:
8790 rajveer 289
        X4 = int(uw[0])
8788 rajveer 290
 
8795 rajveer 291
    #X4 = 191497
8788 rajveer 292
 
293
    pc = PaymentClient().get_client()
294
    payments = pc.getPayments(to_java_date(startTime - datetime.timedelta(minutes = 30)), to_java_date(endTime + datetime.timedelta(minutes = 30)), 2, 1) + pc.getPayments(to_java_date(startTime - datetime.timedelta(minutes = 30)), to_java_date(endTime + datetime.timedelta(minutes = 30)), 2, 2) + pc.getPayments(to_java_date(startTime - datetime.timedelta(minutes = 30)), to_java_date(endTime + datetime.timedelta(minutes = 30)), 8, 1) + pc.getPayments(to_java_date(startTime - datetime.timedelta(minutes = 30)), to_java_date(endTime + datetime.timedelta(minutes = 30)), 8, 2)
295
    for payment in payments:
296
        if payment.isDigital and to_py_date(payment.successTimestamp) >= startTime and to_py_date(payment.successTimestamp) <= endTime:  
8790 rajveer 297
            X5 = X5 + payment.amount
8788 rajveer 298
 
299
 
300
 
301
    refunds = RechargeOrder.query.filter(RechargeOrder.status.in_([RechargeOrderStatus.PARTIALLY_REFUNDED, RechargeOrderStatus.REFUNDED])).filter(RechargeOrder.refundTimestamp.between(startTime, endTime)).all()
302
    pc = PaymentClient().get_client()
303
    for refund in refunds:
304
        payments = pc.getPaymentForRechargeTxnId(refund.transaction_id)
305
        for payment in payments:
306
            if payment.gatewayId in (1,2) and payment.status == 8 and payment.isDigital:
8790 rajveer 307
                X6 = X6 + payment.refundAmount
8788 rajveer 308
 
8790 rajveer 309
    P = X2+X3+X5-X4-X6
310
    D = R - P
8788 rajveer 311
 
312
    maildata = "<html><body><table border='1'><thead><th>Symbol</th><th>Type</th><th>Amount</th></thead><tbody>"
8790 rajveer 313
    maildata += "<tr><td>A</td><td>Recharge Amount</td><td>" + str(A1) + "</td></tr>"
314
    maildata += "<tr><td>B</td><td>Recharge Amount (Refunded in Future)</td><td>" + str(B1) + "</td></tr>"
315
    maildata += "<tr><td>C</td><td>Recharge Refund Amount</td><td>" + str(C1) + "</td></tr>"
316
    maildata += "<tr><td>R=A1+B1-C1</td><td>Net Recharge Amount</td><td>" + str(R) + "</td></tr>"
317
    maildata += "<tr><td></td><td></td><td></td></tr>"
318
 
319
    maildata += "<tr><td>A</td><td>Recharge Coupon Amount</td><td>" + str(A2) + "</td></tr>"
320
    maildata += "<tr><td>B</td><td>Recharge Coupon Amount (Refunded in Future)</td><td>" + str(B2) + "</td></tr>"
321
    maildata += "<tr><td>C</td><td>Recharge Coupon Refund Amount</td><td>" + str(C2) + "</td></tr>"    
322
    maildata += "<tr><td>X2=A2+B2-C2</td><td>Net Coupon Amount</td><td>" + str(X2) + "</td></tr>"
323
 
324
    maildata += "<tr><td>X3</td><td>Gift Amount</td><td>" + str(X3) + "</td></tr>"
325
    maildata += "<tr><td>X4</td><td>Wallet Difference</td><td>" + str(X4) + "</td></tr>"
326
    maildata += "<tr><td>X5</td><td>Payment Amount</td><td>" + str(X5) + "</td></tr>"
327
    maildata += "<tr><td>X6</td><td>Payment Refund Amount</td><td>" + str(X6) + "</td></tr>"
328
    maildata += "<tr><td>P=X2+X3+X5-X4-X6</td><td>Net Payments</td><td>" + str(P) + "</td></tr>"
329
    maildata += "<tr><td></td><td></td><td></td></tr>"
330
 
331
    maildata += "<tr><td>D=R-P</td><td>Net Reconciliation Difference</td><td>" + str(D) + "</td></tr>"
8788 rajveer 332
    maildata += "</tbody></table>"
333
 
334
    if D != 0:
8837 rajveer 335
        mismatches = []
9052 rajveer 336
        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 = 10))).all()
337
        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 = 10), startTime)).all()
8788 rajveer 338
        if mismatches and len(mismatches) > 0:
339
            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>"
340
            for mismatch in mismatches:
341
                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>"        
342
            maildata += "</tbody></table>"
343
 
344
    maildata += "</body></html>"
8795 rajveer 345
    mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["rajveer.singh@shop2020.in", "anupam.singh@shop2020.in", "rajneesh.arora@shop2020.in"], "Customer Recharge Reconciliation for Date:- " + startTime.strftime("%d-%m-%Y"), maildata, [])
8790 rajveer 346
 
8788 rajveer 347
 
6235 rajveer 348
def processRefunds():
349
    todate = datetime.datetime.now()
8788 rajveer 350
    for i in range(10):
6235 rajveer 351
        orderDate = todate + datetime.timedelta(days= -i)
352
        refunds = getRefunds(orderDate)
353
        for key in refunds.keys():
354
            refund = refunds.get(key)
355
            refundAmount = refund[0]
356
            refundDate = refund[1]
357
            order = RechargeOrder.get_by(spiceTID = key)
7127 rajveer 358
            if order:
359
                amount = order.totalAmount
360
                isStoreOrder = False
361
            else:
362
                order = RechargeTransaction.get_by(spiceTID = key)
7188 rajveer 363
                if not order:
364
                    continue
7127 rajveer 365
                isStoreOrder = True
366
                amount = order.amount
6235 rajveer 367
            if order.status == RechargeOrderStatus.RECHARGE_FAILED_REFUNDED:
368
                print "Refund is already processed."
369
                continue
7188 rajveer 370
            if order.status not in (RechargeOrderStatus.RECHARGE_SUCCESSFUL, RechargeOrderStatus.PAYMENT_SUCCESSFUL, RechargeOrderStatus.RECHARGE_UNKNOWN):
7075 rajveer 371
                print "Recharge/Payment is not successful. There is something wrong."
6235 rajveer 372
                continue
7127 rajveer 373
            if amount != refundAmount:
6235 rajveer 374
                print "Refund amount is not same as transaction amount"
375
                continue
7127 rajveer 376
            if isStoreOrder:
7244 rajveer 377
                update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED)
7127 rajveer 378
            else:
7780 rajveer 379
                update_recharge_order_status(order.id, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED)
6235 rajveer 380
 
381
def processUnknownTransactions():    
382
    orders = get_recharge_orders_for_status(RechargeOrderStatus.PAYMENT_SUCCESSFUL)
6219 rajveer 383
    for order in orders:
6276 rajveer 384
        try:
385
            if order.creationTimestamp + datetime.timedelta(minutes=10) < datetime.datetime.now():
386
                status, description = checkTransactionStatus('', str(order.id))
387
                print status, description
388
                if status:
389
                    update_recharge_order_status(order.id, RechargeOrderStatus.RECHARGE_SUCCESSFUL)
390
                else:
391
                    update_recharge_order_status(order.id, RechargeOrderStatus.RECHARGE_FAILED)
392
        except:
393
            print "Do Nothing"
6451 rajveer 394
 
7163 rajveer 395
    ## For store transactions
7245 rajveer 396
    rorders = RechargeTransaction.query.filter(RechargeTransaction.status.in_([RechargeOrderStatus.RECHARGE_UNKNOWN, RechargeOrderStatus.INIT])).all()
7166 rajveer 397
    for order in rorders:
7163 rajveer 398
        try:
399
            if order.transactionTime + datetime.timedelta(minutes=10) < datetime.datetime.now():
400
                status, description = checkTransactionStatus('', str(order.id))
401
                print status, description
402
                if status:
403
                    update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_SUCCESSFUL)
7245 rajveer 404
                elif order.status == RechargeOrderStatus.INIT:
405
                    update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_FAILED)
7163 rajveer 406
                else:
7244 rajveer 407
                    update_recharge_transaction_status(order.id, RechargeOrderStatus.RECHARGE_FAILED_REFUNDED)
7163 rajveer 408
        except:
409
            print "Do Nothing"
410
 
411
 
6451 rajveer 412
def processAuthorizedTransactions(txn_id):
413
    update_recharge_order_status(txn_id, RechargeOrderStatus.PAYMENT_SUCCESSFUL)
6235 rajveer 414
 
7141 rajveer 415
 
416
def compute_recharge_collection(cdate):
417
    todate = datetime.datetime(cdate.year, cdate.month, cdate.day)
418
    tomorrow = todate + timedelta(days=1)
8868 rajveer 419
    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 420
    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 421
    storeData = {}
422
    for txn in txns:
423
        print txn
424
        if not storeData.has_key(txn[0]):
425
            data = [0,0,0,0,0]
426
            storeData[txn[0]] = data
427
        else:
428
            data = storeData[txn[0]]
7155 rajveer 429
        if txn[1] == 1:
7141 rajveer 430
            data[0] += int(txn[3]) - int(txn[4])
7155 rajveer 431
        if txn[1] == 2:
7141 rajveer 432
            data[1] += int(txn[3]) - int(txn[4])
9342 rajveer 433
 
434
        data[2] += int(txn[3])
435
        data[3] += int(txn[4])
436
        data[4] += int(txn[3]) - int(txn[4])
7141 rajveer 437
        storeData[txn[0]] = data
8868 rajveer 438
 
439
 
8875 rajveer 440
    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 441
    for txn in reftxns:
442
        print txn
443
        if not storeData.has_key(txn[0]):
444
            data = [0,0,0,0,0]
445
            storeData[txn[0]] = data
446
        else:
447
            data = storeData[txn[0]]
7155 rajveer 448
        if txn[1] == 1:
7148 rajveer 449
            data[0] -= int(txn[3]) - int(txn[4])
7155 rajveer 450
        if txn[1] == 2:
7148 rajveer 451
            data[1] -= int(txn[3]) - int(txn[4])
7141 rajveer 452
        data[2] -= int(txn[3])
453
        data[3] -= int(txn[4])
454
        data[4] -= int(txn[3]) - int(txn[4])
455
    print storeData
7163 rajveer 456
 
7175 rajveer 457
    wallet = WalletForCompany.query.filter(WalletForCompany.id == 1).one()    
458
 
459
    dt = session.query(func.sum(RechargeTransaction.amount)).filter(RechargeTransaction.status.in_([RechargeOrderStatus.RECHARGE_SUCCESSFUL])).one()
460
 
7511 rajveer 461
#    if int(dt[0]) != wallet.amount:
462
#        mail("cnc.center@shop2020.in", "5h0p2o2o", ["rajveer.singh@shop2020.in", "anupam.singh@shop2020.in"], "Wallet amount: " + str(wallet.amount) + " does not match with transaction amount: " + str(int(dt[0])) , "", [], [], [])    
7250 rajveer 463
 
7175 rajveer 464
    maildata = "<html><body><table border='1'><thead><th>StoreId</th><th>Gross</th><th>Discount</th><th>Net</th></thead><tbody>"
465
    trecharge = 0
7967 anupam.sin 466
    hotspotServiceMatrices = HotspotServiceMatrix.query.all()
467
    hotspotServiceMatrixMap = {}
468
 
469
    for hotspotServiceMatrix in hotspotServiceMatrices:
470
        hotspotServiceMatrixMap[hotspotServiceMatrix.storeId] = hotspotServiceMatrix
471
 
7141 rajveer 472
    for storeId in storeData.keys():
473
        store = HotspotStore.get_by(id = storeId)
7967 anupam.sin 474
        if hotspotServiceMatrixMap.has_key(storeId):
475
            del hotspotServiceMatrixMap[storeId]
7141 rajveer 476
        store.collectedAmount = 0
477
        store.availableLimit = store.creditLimit
7142 rajveer 478
        session.commit()
479
 
7141 rajveer 480
        data = storeData.get(storeId)
7250 rajveer 481
        rc = RechargeCollection()
482
        rc.hotspotId = store.hotspotId
483
        rc.reconDate = int(todate.strftime("%Y%m%d"))
484
        rc.cash = data[0]
485
        rc.hdfc = data[1]
486
        rc.grossAmount = data[2]
487
        rc.discount = data[3]
488
        rc.netCollection = data[4]
489
        rc.addedAt = datetime.datetime.now()
490
        rc.pushedToOcr = False
491
        session.commit()
492
 
7175 rajveer 493
        maildata += "<tr><td>" + store.hotspotId + "</td><td>" + str(data[2]) + "</td><td>" + str(data[3]) + "</td><td>" + str(data[4]) + "</td></tr>"
494
        trecharge +=  data[2]
7250 rajveer 495
 
7276 rajveer 496
    dit = session.query(func.sum(RechargeCollection.grossAmount)).one()
7821 rajveer 497
    dit2 = session.query(func.sum(WalletHistoryForCompany.amount)).filter(WalletHistoryForCompany.walletId == 1).filter(WalletHistoryForCompany.amount >= 100000).one()
7276 rajveer 498
    wamt = int(dit2[0])- int(dit[0])
499
    wallet.amount = wamt
500
    session.commit()
501
 
7250 rajveer 502
    maildata += "</tbody></table></body></html>"
9633 rajveer 503
    mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["rajveer.singh@shop2020.in", "anupam.singh@shop2020.in", "Ashwani.Kumar@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 504
    try:
505
        push_recharge_collection_to_ocr()
506
    except:
507
        mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["rajveer.singh@shop2020.in", "anupam.singh@shop2020.in", "rajneesh.arora@shop2020.in"], "Problem while pushing recharge collection to OCR", "", [])
7967 anupam.sin 508
    finally:
7986 anupam.sin 509
        msg = "<html><body>"
7967 anupam.sin 510
        for storeId in hotspotServiceMatrixMap.keys():
511
            if hotspotServiceMatrixMap.get(storeId).rechargeService:
512
                store = HotspotStore.get_by(id = storeId)
7986 anupam.sin 513
                msg = msg + str(store.hotspotId) + ' - ' + str(store.email) + '<br>'
514
        msg = msg + '</body></html>'
515
        helper_client = HelperClient().get_client()
9633 rajveer 516
        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", ["anupam.singh@shop2020.in"], ["anupam.singh@shop2020.in"], 1)
7986 anupam.sin 517
 
7967 anupam.sin 518
 
7250 rajveer 519
 
520
def push_recharge_collection_to_ocr():
521
    rcs = RechargeCollection.query.filter(RechargeCollection.pushedToOcr == False).all()
522
 
523
    for rc in rcs:
524
        store_string = "<Store>" + rc.hotspotId + "</Store>"
525
        date_string = "<ReconDate>" + str(rc.reconDate) + "</ReconDate>"
526
        cash_string = "<Cash>" + str(rc.cash) + "</Cash>"
527
        card_string = "<Hdfc>" + str(rc.hdfc) + "</Hdfc>"
528
        type_string = "<Type>RechargeSale</Type>"
529
        amount_string = "<GrossRechargeAmount>" + str(rc.grossAmount) + "</GrossRechargeAmount><Discount>" + str(rc.discount) +  "</Discount><NetCollection>" + str(rc.netCollection) + "</NetCollection>";
530
 
7141 rajveer 531
        #SaholicRechargeSaleTransfer(string Store, int ReconDate, decimal Cash, decimal Hdfc, string Type, decimal GrossRechargeAmount, decimal Discount, decimal NetCollection)
532
 
7253 rajveer 533
        conn = httplib.HTTPConnection("182.71.104.186")
7141 rajveer 534
        XML="""
535
        <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/">
536
          <soap:Body>
537
            <SaholicRechargeSaleTransfer xmlns="http://tempuri.org/">
538
        """
539
 
8195 rajveer 540
        XML = XML + store_string + date_string + cash_string + card_string + "<Cheque>0</Cheque>" + type_string + amount_string 
7141 rajveer 541
 
542
        footer = """
543
            </SaholicRechargeSaleTransfer>
544
          </soap:Body>
545
        </soap:Envelope>
546
        """
547
        XML = XML + footer
548
 
549
        print XML
550
        params = urllib.urlencode({'op': 'SaholicRechargeSaleTransfer'})
551
        headers = { "Content-type": "text/xml", "Content-Length": "%d" % len(XML)}
552
        conn.request("POST", "/loaddetect/Service.asmx?"+params, "", headers)
553
        conn.send(XML)
554
        response = conn.getresponse()
555
        print response.status, response.reason
556
        resp = response.read()
557
        conn.close()
558
        print resp
7250 rajveer 559
        if "Saved Successfully" in resp:
560
            rc.pushedAt = datetime.datetime.now()
561
            rc.pushedToOcr = True
562
            session.commit()
563
        elif "Error in Saving Data" in resp:
7252 rajveer 564
            mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["rajveer.singh@shop2020.in", "anupam.singh@shop2020.in", "rajneesh.arora@shop2020.in"], "Problem while pushing recharge collection to OCR", resp, [])
7250 rajveer 565
        else: 
7252 rajveer 566
            mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["rajveer.singh@shop2020.in", "anupam.singh@shop2020.in", "rajneesh.arora@shop2020.in"], "Problem while pushing recharge collection to OCR", resp, [])
7250 rajveer 567
 
7141 rajveer 568
 
7175 rajveer 569
 
7147 rajveer 570
def topup_company_wallet(companyId, amount):
571
    wallet = WalletForCompany.query.filter(WalletForCompany.id == companyId).with_lockmode("update").one()
7285 rajveer 572
    company = Company.get_by(id = companyId)
7147 rajveer 573
    wh = WalletHistoryForCompany()
574
    wh.walletId = wallet.id
575
    wh.openingBal = wallet.amount
576
    wh.closingBal = wallet.amount +  amount
577
    wh.amount = amount
578
    wh.transactionTime = datetime.datetime.now()
7167 rajveer 579
    wh.referenceNumber =  get_next_invoice_number(OrderType.WALLETCREDIT)
7147 rajveer 580
    wh.description = "Wallet Credited"
581
 
582
    wallet.amount += amount
583
    session.commit()
9633 rajveer 584
    mail("cnc.center@shop2020.in", "5h0p2o2o", ["rajveer.singh@shop2020.in", "anupam.singh@shop2020.in", "Ashwani.Kumar@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 585
 
7983 rajveer 586
def compute_website_recharge_collection(cdate, oldBalance, newBalance):
8815 rajveer 587
    startTime = datetime.datetime(cdate.year, cdate.month, cdate.day)
588
    endTime = startTime + timedelta(days=1)
589
    tamount = 0
7147 rajveer 590
 
8815 rajveer 591
    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()    
592
    if txns and txns[0]:
593
        tamount += int(txns[0])
7821 rajveer 594
 
8815 rajveer 595
    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()
596
    if otxns and otxns[0]:
597
        tamount += int(otxns[0])
598
 
599
    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()
600
    if reftxns and reftxns[0]:
601
        tamount -= int(reftxns[0])
7821 rajveer 602
 
603
    wallet = WalletForCompany.query.filter(WalletForCompany.id == 2).with_lockmode("update").one()
7823 rajveer 604
 
605
 
606
    d = datetime.datetime.now()
607
    wh = WalletHistoryForCompany()
608
    wh.walletId = wallet.id
609
    wh.openingBal = wallet.amount
610
    wh.closingBal = wallet.amount - tamount
7982 rajveer 611
    wh.amount = -tamount
7823 rajveer 612
    wh.transactionTime = d
613
    wh.referenceNumber =  int(d.strftime("%Y%m%d"))
614
    wh.description = "Wallet Credited"
615
    wallet.amount = wallet.amount - tamount
7821 rajveer 616
    session.commit()
617
 
7823 rajveer 618
 
8007 rajveer 619
    maildata = ""
8815 rajveer 620
    mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["pardeep.panwar@spiceretail.co.in>", "amit.tyagi@spiceretail.co.in", "rajveer.singh@shop2020.in", "anupam.singh@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 621
 
8012 rajveer 622
    rAmount = 0
8815 rajveer 623
    ramount = session.query(func.sum(WalletHistoryForCompany.amount)).filter(WalletHistoryForCompany.transactionTime >= startTime).filter(WalletHistoryForCompany.amount >= 100000).one()
8012 rajveer 624
    if ramount[0]:
625
        rAmount = int(ramount[0])
8815 rajveer 626
    rcs = session.query(func.sum(RechargeCollection.grossAmount)).filter(RechargeCollection.reconDate == int(startTime.strftime("%Y%m%d"))).one()
8007 rajveer 627
    hamount = int(rcs[0])
628
 
8012 rajveer 629
    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)
8815 rajveer 630
    mail_html("cnc.center@shop2020.in", "5h0p2o2o", ["pardeep.panwar@spiceretail.co.in>", "amit.tyagi@spiceretail.co.in", "rajveer.singh@shop2020.in", "anupam.singh@shop2020.in", "j.p.gupta@shop2020.in", "rajneesh.arora@shop2020.in"], "MIS :- Wallet and Recharge (Date - " + startTime.strftime("%d-%m-%Y") + ")", maildata, [])
8007 rajveer 631
 
6147 rajveer 632
if __name__ == '__main__':
7967 anupam.sin 633
    main()
9633 rajveer 634