Subversion Repositories SmartDukaan

Rev

Rev 19732 | Rev 19761 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
18272 kshitij.so 1
from bson import json_util
15081 amit.gupta 2
from bson.json_util import dumps
19666 amit.gupta 3
from datetime import datetime, timedelta, date
15534 amit.gupta 4
from pyshorteners.shorteners  import Shortener
13582 amit.gupta 5
from dtr import main
15081 amit.gupta 6
from dtr.config import PythonPropertyReader
13629 kshitij.so 7
from dtr.storage import Mongo
15132 amit.gupta 8
from dtr.storage.DataService import Retailers, Users, CallHistory, RetryConfig, \
15254 amit.gupta 9
    RetailerLinks, Activation_Codes, Agents, Agent_Roles, AgentLoginTimings, \
15676 amit.gupta 10
    FetchDataHistory, RetailerContacts, Orders, OnboardedRetailerChecklists,\
17467 manas 11
    RetailerAddresses, Pincodeavailability, app_offers, appmasters, user_app_cashbacks, user_app_installs,\
19666 amit.gupta 12
    Postoffices, UserCrmCallingData, CallHistoryCrm, ProductPricingInputs,\
13
    tinxys_stats
15358 amit.gupta 14
from dtr.storage.Mongo import get_mongo_connection
15
from dtr.storage.Mysql import fetchResult
19651 manas 16
from dtr.utils import DealSheet as X_DealSheet, \
17
    UserSpecificDeals, utils, ThriftUtils
18256 manas 18
from dtr.utils.utils import getLogger,encryptMessage,decryptMessage,\
19
    get_mongo_connection_dtr_data, to_java_date
15081 amit.gupta 20
from elixir import *
15254 amit.gupta 21
from operator import and_
16714 manish.sha 22
from sqlalchemy.sql.expression import func, func, or_, desc, asc, case
15132 amit.gupta 23
from urllib import urlencode
24
import contextlib
13827 kshitij.so 25
import falcon
15081 amit.gupta 26
import json
15358 amit.gupta 27
import re
15254 amit.gupta 28
import string
15081 amit.gupta 29
import traceback
15132 amit.gupta 30
import urllib
31
import urllib2
32
import uuid
15465 amit.gupta 33
import gdshortener
16727 manish.sha 34
from dtr.dao import AppOfferObj, UserAppBatchDrillDown, UserAppBatchDateDrillDown
18097 manas 35
import base64
18272 kshitij.so 36
from falcon.util.uri import decode
18266 manas 37
import MySQLdb
18792 manas 38
from shop2020.clients.CatalogClient import CatalogClient  
18896 amit.gupta 39
from pyquery import PyQuery as pq
19463 manas 40
import time
19475 manas 41
from dtr.main import refundToWallet
19732 manas 42
import random
15207 amit.gupta 43
alphalist = list(string.uppercase)
44
alphalist.remove('O')
45
numList = ['1','2','3','4','5','6','7','8','9']
46
codesys = [alphalist, alphalist, numList, numList, numList]
19732 manas 47
newcodesys = alphalist + numList
15312 amit.gupta 48
CONTACT_PRIORITY = ['sms', 'called', 'ringing']
15368 amit.gupta 49
RETRY_MAP = {'fresh':'retry', 'followup':'fretry', 'onboarding':'oretry'}
15358 amit.gupta 50
ASSIGN_MAP = {'retry':'assigned', 'fretry':'fassigned', 'oretry':'oassigned'}
15207 amit.gupta 51
 
16882 amit.gupta 52
sticky_agents = [17]
53
 
19732 manas 54
def getNextRandomCode(newcodesys,size=6):
55
    return ''.join(random.choice(newcodesys) for _ in range(size))
15207 amit.gupta 56
def getNextCode(codesys, code=None):
57
    if code is None:
58
        code = []
59
        for charcode in codesys:
60
            code.append(charcode[0])
61
        return string.join(code, '')
62
    carry = True
63
    code = list(code)
64
    lastindex = len(codesys) - 1
65
    while carry:
66
        listChar = codesys[lastindex]
67
        newIndex = (listChar.index(code[lastindex])+1)%len(listChar)
68
        print newIndex
69
        code[lastindex] = listChar[newIndex]
70
        if newIndex != 0:
71
            carry = False
72
        lastindex -= 1
73
        if lastindex ==-1:
74
            raise BaseException("All codes are exhausted")
75
 
76
    return string.join(code, '')
77
 
18397 manas 78
 
15081 amit.gupta 79
global RETAILER_DETAIL_CALL_COUNTER
80
RETAILER_DETAIL_CALL_COUNTER = 0
18329 manas 81
global USER_DETAIL_MAP
18332 manas 82
USER_DETAIL_MAP={} 
18329 manas 83
USER_DETAIL_MAP['accs_cart']=0
84
USER_DETAIL_MAP['accs_active']=0
85
USER_DETAIL_MAP['accs_order']=0
19442 manas 86
USER_DETAIL_MAP['accs_cashback_scheme']=0
15168 amit.gupta 87
lgr = getLogger('/var/log/retailer-acquisition-api.log')
15081 amit.gupta 88
DEALER_RETRY_FACTOR = int(PythonPropertyReader.getConfig('DEALER_RETRY_FACTOR'))
16886 amit.gupta 89
DEALER_FRESH_FACTOR = int(PythonPropertyReader.getConfig('DEALER_FRESH_FACTOR'))
18329 manas 90
USER_CRM_DEFAULT_RETRY_FACTOR = int(PythonPropertyReader.getConfig('USER_CRM_DEFAULT_RETRY_FACTOR'))
91
USER_CRM_DEFAULT_FRESH_FACTOR = int(PythonPropertyReader.getConfig('USER_CRM_DEFAULT_FRESH_FACTOR'))
92
TOTAL = DEALER_RETRY_FACTOR + DEALER_FRESH_FACTOR
93
TOTAL_USER = USER_CRM_DEFAULT_FRESH_FACTOR + USER_CRM_DEFAULT_RETRY_FACTOR  
13572 kshitij.so 94
class CategoryDiscountInfo(object):
95
 
96
    def on_get(self, req, resp):
97
 
13629 kshitij.so 98
        result = Mongo.getAllCategoryDiscount()
99
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
100
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 101
 
102
    def on_post(self, req, resp):
103
        try:
104
            result_json = json.loads(req.stream.read(), encoding='utf-8')
105
        except ValueError:
106
            raise falcon.HTTPError(falcon.HTTP_400,
107
                'Malformed JSON',
108
                'Could not decode the request body. The '
109
                'JSON was incorrect.')
110
 
111
        result = Mongo.addCategoryDiscount(result_json)
112
        resp.body = json.dumps(result, encoding='utf-8')
13969 kshitij.so 113
 
114
    def on_put(self, req, resp, _id):
13970 kshitij.so 115
        try:
116
            result_json = json.loads(req.stream.read(), encoding='utf-8')
117
        except ValueError:
118
            raise falcon.HTTPError(falcon.HTTP_400,
119
                'Malformed JSON',
120
                'Could not decode the request body. The '
121
                'JSON was incorrect.')
122
 
123
        result = Mongo.updateCategoryDiscount(result_json, _id)
124
        resp.body = json.dumps(result, encoding='utf-8')
125
 
13966 kshitij.so 126
 
13969 kshitij.so 127
 
13572 kshitij.so 128
class SkuSchemeDetails(object):
129
 
130
    def on_get(self, req, resp):
13629 kshitij.so 131
 
14070 kshitij.so 132
        offset = req.get_param_as_int("offset")
133
        limit = req.get_param_as_int("limit")
134
 
135
        result = Mongo.getAllSkuWiseSchemeDetails(offset, limit)
13629 kshitij.so 136
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
137
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 138
 
139
 
140
    def on_post(self, req, resp):
141
 
14552 kshitij.so 142
        multi = req.get_param_as_int("multi")
143
 
13572 kshitij.so 144
        try:
145
            result_json = json.loads(req.stream.read(), encoding='utf-8')
146
        except ValueError:
147
            raise falcon.HTTPError(falcon.HTTP_400,
148
                'Malformed JSON',
149
                'Could not decode the request body. The '
150
                'JSON was incorrect.')
151
 
15852 kshitij.so 152
        result = Mongo.addSchemeDetailsForSku(result_json)
13572 kshitij.so 153
        resp.body = json.dumps(result, encoding='utf-8')
154
 
155
class SkuDiscountInfo():
156
 
157
    def on_get(self, req, resp):
13629 kshitij.so 158
 
13970 kshitij.so 159
        offset = req.get_param_as_int("offset")
160
        limit = req.get_param_as_int("limit")
161
        result = Mongo.getallSkuDiscountInfo(offset,limit)
13629 kshitij.so 162
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
163
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 164
 
165
 
166
    def on_post(self, req, resp):
167
 
14552 kshitij.so 168
        multi = req.get_param_as_int("multi")
169
 
13572 kshitij.so 170
        try:
171
            result_json = json.loads(req.stream.read(), encoding='utf-8')
172
        except ValueError:
173
            raise falcon.HTTPError(falcon.HTTP_400,
174
                'Malformed JSON',
175
                'Could not decode the request body. The '
176
                'JSON was incorrect.')
177
 
15852 kshitij.so 178
        result = Mongo.addSkuDiscountInfo(result_json)
13572 kshitij.so 179
        resp.body = json.dumps(result, encoding='utf-8')
13970 kshitij.so 180
 
181
    def on_put(self, req, resp, _id):
182
        try:
183
            result_json = json.loads(req.stream.read(), encoding='utf-8')
184
        except ValueError:
185
            raise falcon.HTTPError(falcon.HTTP_400,
186
                'Malformed JSON',
187
                'Could not decode the request body. The '
188
                'JSON was incorrect.')
189
 
190
        result = Mongo.updateSkuDiscount(result_json, _id)
191
        resp.body = json.dumps(result, encoding='utf-8')
13572 kshitij.so 192
 
193
class ExceptionalNlc():
194
 
195
    def on_get(self, req, resp):
13629 kshitij.so 196
 
13970 kshitij.so 197
        offset = req.get_param_as_int("offset")
198
        limit = req.get_param_as_int("limit")
199
 
200
        result = Mongo.getAllExceptionlNlcItems(offset, limit)
13629 kshitij.so 201
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
202
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 203
 
204
    def on_post(self, req, resp):
205
 
14552 kshitij.so 206
        multi = req.get_param_as_int("multi")
207
 
13572 kshitij.so 208
        try:
209
            result_json = json.loads(req.stream.read(), encoding='utf-8')
210
        except ValueError:
211
            raise falcon.HTTPError(falcon.HTTP_400,
212
                'Malformed JSON',
213
                'Could not decode the request body. The '
214
                'JSON was incorrect.')
215
 
15852 kshitij.so 216
        result = Mongo.addExceptionalNlc(result_json)
13572 kshitij.so 217
        resp.body = json.dumps(result, encoding='utf-8')
13970 kshitij.so 218
 
219
    def on_put(self, req, resp, _id):
220
        try:
221
            result_json = json.loads(req.stream.read(), encoding='utf-8')
222
        except ValueError:
223
            raise falcon.HTTPError(falcon.HTTP_400,
224
                'Malformed JSON',
225
                'Could not decode the request body. The '
226
                'JSON was incorrect.')
227
 
228
        result = Mongo.updateExceptionalNlc(result_json, _id)
229
        resp.body = json.dumps(result, encoding='utf-8')
13572 kshitij.so 230
 
13772 kshitij.so 231
class Deals():
13779 kshitij.so 232
    def on_get(self,req, resp, userId):
233
        categoryId = req.get_param_as_int("categoryId")
234
        offset = req.get_param_as_int("offset")
235
        limit = req.get_param_as_int("limit")
13798 kshitij.so 236
        sort = req.get_param("sort")
13802 kshitij.so 237
        direction = req.get_param_as_int("direction")
14853 kshitij.so 238
        filterData = req.get_param('filterData')
19558 kshitij.so 239
        if categoryId!=6:
240
            result = Mongo.getNewDeals(int(userId), categoryId, offset, limit, sort, direction, filterData)
241
        else:
242
            result = Mongo.getAccesoryDeals(int(userId), categoryId, offset, limit, sort, direction, filterData)
16078 kshitij.so 243
        resp.body = dumps(result) 
19440 kshitij.so 244
 
13790 kshitij.so 245
class MasterData():
246
    def on_get(self,req, resp, skuId):
16223 kshitij.so 247
        showDp = req.get_param_as_int("showDp")
16221 kshitij.so 248
        result = Mongo.getItem(skuId, showDp)
13798 kshitij.so 249
        try:
250
            json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
13966 kshitij.so 251
            resp.body = json.dumps(json_docs, encoding='utf-8')
13798 kshitij.so 252
        except:
253
            json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
13966 kshitij.so 254
            resp.body = json.dumps(json_docs, encoding='utf-8')
13790 kshitij.so 255
 
14586 kshitij.so 256
    def on_post(self,req, resp):
257
 
258
        addNew = req.get_param_as_int("addNew")
259
        update = req.get_param_as_int("update")
260
        addToExisting = req.get_param_as_int("addToExisting")
261
        multi = req.get_param_as_int("multi")
262
 
14589 kshitij.so 263
        try:
14592 kshitij.so 264
            result_json = json.loads(req.stream.read(), encoding='utf-8')
265
        except ValueError:
266
            raise falcon.HTTPError(falcon.HTTP_400,
267
                'Malformed JSON',
268
                'Could not decode the request body. The '
269
                'JSON was incorrect.')
270
 
271
        if addNew == 1:
272
            result = Mongo.addNewItem(result_json)
273
        elif update == 1:
274
            result = Mongo.updateMaster(result_json, multi)
275
        elif addToExisting == 1:
276
            result = Mongo.addItemToExistingBundle(result_json)
277
        else:
278
            raise
279
        resp.body = dumps(result)
13865 kshitij.so 280
 
13834 kshitij.so 281
class CashBack():
282
    def on_get(self,req, resp):
283
        identifier = req.get_param("identifier")
284
        source_id = req.get_param_as_int("source_id")
285
        try:
13838 kshitij.so 286
            result = Mongo.getCashBackDetails(identifier, source_id)
13837 kshitij.so 287
            json_docs = json.dumps(result, default=json_util.default)
13964 kshitij.so 288
            resp.body = json_docs
13834 kshitij.so 289
        except:
13837 kshitij.so 290
            json_docs = json.dumps({}, default=json_util.default)
13963 kshitij.so 291
            resp.body = json_docs
13892 kshitij.so 292
 
14398 amit.gupta 293
class ImgSrc():
294
    def on_get(self,req, resp):
295
        identifier = req.get_param("identifier")
296
        source_id = req.get_param_as_int("source_id")
297
        try:
298
            result = Mongo.getImgSrc(identifier, source_id)
299
            json_docs = json.dumps(result, default=json_util.default)
300
            resp.body = json_docs
301
        except:
302
            json_docs = json.dumps({}, default=json_util.default)
303
            resp.body = json_docs
304
 
13892 kshitij.so 305
class DealSheet():
306
    def on_get(self,req, resp):
13895 kshitij.so 307
        X_DealSheet.sendMail()
13897 kshitij.so 308
        json_docs = json.dumps({'True':'Sheet generated, mail sent.'}, default=json_util.default)
13966 kshitij.so 309
        resp.body = json.dumps(json_docs, encoding='utf-8')
13892 kshitij.so 310
 
13970 kshitij.so 311
class DealerPrice():
312
 
313
    def on_get(self, req, resp):
314
 
315
        offset = req.get_param_as_int("offset")
316
        limit = req.get_param_as_int("limit")
317
        result = Mongo.getAllDealerPrices(offset,limit)
318
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
319
        resp.body = json.dumps(json_docs, encoding='utf-8')
320
 
321
    def on_post(self, req, resp):
322
 
14552 kshitij.so 323
        multi = req.get_param_as_int("multi")
324
 
13970 kshitij.so 325
        try:
326
            result_json = json.loads(req.stream.read(), encoding='utf-8')
327
        except ValueError:
328
            raise falcon.HTTPError(falcon.HTTP_400,
329
                'Malformed JSON',
330
                'Could not decode the request body. The '
331
                'JSON was incorrect.')
332
 
15852 kshitij.so 333
        result = Mongo.addSkuDealerPrice(result_json)
13970 kshitij.so 334
        resp.body = json.dumps(result, encoding='utf-8')
335
 
336
    def on_put(self, req, resp, _id):
337
        try:
338
            result_json = json.loads(req.stream.read(), encoding='utf-8')
339
        except ValueError:
340
            raise falcon.HTTPError(falcon.HTTP_400,
341
                'Malformed JSON',
342
                'Could not decode the request body. The '
343
                'JSON was incorrect.')
344
 
345
        result = Mongo.updateSkuDealerPrice(result_json, _id)
346
        resp.body = json.dumps(result, encoding='utf-8')
347
 
348
 
14041 kshitij.so 349
class ResetCache():
350
 
351
    def on_get(self,req, resp, userId):
14044 kshitij.so 352
        result = Mongo.resetCache(userId)
14046 kshitij.so 353
        resp.body = json.dumps(result, encoding='utf-8')
354
 
355
class UserDeals():
356
    def on_get(self,req,resp,userId):
357
        UserSpecificDeals.generateSheet(userId)
358
        json_docs = json.dumps({'True':'Sheet generated, mail sent.'}, default=json_util.default)
359
        resp.body = json.dumps(json_docs, encoding='utf-8')
14075 kshitij.so 360
 
361
class CommonUpdate():
362
 
363
    def on_post(self,req,resp):
14575 kshitij.so 364
 
365
        multi = req.get_param_as_int("multi")
366
 
14075 kshitij.so 367
        try:
368
            result_json = json.loads(req.stream.read(), encoding='utf-8')
369
        except ValueError:
370
            raise falcon.HTTPError(falcon.HTTP_400,
371
                'Malformed JSON',
372
                'Could not decode the request body. The '
373
                'JSON was incorrect.')
374
 
15852 kshitij.so 375
        result = Mongo.updateCollection(result_json)
14075 kshitij.so 376
        resp.body = json.dumps(result, encoding='utf-8')
14106 kshitij.so 377
        resp.content_type = "application/json; charset=utf-8"
14481 kshitij.so 378
 
379
class NegativeDeals():
380
 
381
    def on_get(self, req, resp):
382
 
383
        offset = req.get_param_as_int("offset")
384
        limit = req.get_param_as_int("limit")
385
 
386
        result = Mongo.getAllNegativeDeals(offset, limit)
14483 kshitij.so 387
        resp.body = dumps(result) 
14481 kshitij.so 388
 
389
 
390
    def on_post(self, req, resp):
391
 
14552 kshitij.so 392
        multi = req.get_param_as_int("multi")
393
 
14481 kshitij.so 394
        try:
395
            result_json = json.loads(req.stream.read(), encoding='utf-8')
396
        except ValueError:
397
            raise falcon.HTTPError(falcon.HTTP_400,
398
                'Malformed JSON',
399
                'Could not decode the request body. The '
400
                'JSON was incorrect.')
401
 
14552 kshitij.so 402
        result = Mongo.addNegativeDeals(result_json, multi)
14481 kshitij.so 403
        resp.body = json.dumps(result, encoding='utf-8')
404
 
405
class ManualDeals():
406
 
407
    def on_get(self, req, resp):
408
 
409
        offset = req.get_param_as_int("offset")
410
        limit = req.get_param_as_int("limit")
411
 
412
        result = Mongo.getAllManualDeals(offset, limit)
14483 kshitij.so 413
        resp.body = dumps(result)
14481 kshitij.so 414
 
415
 
416
    def on_post(self, req, resp):
417
 
14552 kshitij.so 418
        multi = req.get_param_as_int("multi")
419
 
14481 kshitij.so 420
        try:
421
            result_json = json.loads(req.stream.read(), encoding='utf-8')
422
        except ValueError:
423
            raise falcon.HTTPError(falcon.HTTP_400,
424
                'Malformed JSON',
425
                'Could not decode the request body. The '
426
                'JSON was incorrect.')
427
 
14552 kshitij.so 428
        result = Mongo.addManualDeal(result_json, multi)
14481 kshitij.so 429
        resp.body = json.dumps(result, encoding='utf-8')
430
 
431
class CommonDelete():
14482 kshitij.so 432
 
14481 kshitij.so 433
    def on_post(self,req,resp):
434
        try:
435
            result_json = json.loads(req.stream.read(), encoding='utf-8')
436
        except ValueError:
437
            raise falcon.HTTPError(falcon.HTTP_400,
438
                'Malformed JSON',
439
                'Could not decode the request body. The '
440
                'JSON was incorrect.')
441
 
442
        result = Mongo.deleteDocument(result_json)
443
        resp.body = json.dumps(result, encoding='utf-8')
444
        resp.content_type = "application/json; charset=utf-8"
14482 kshitij.so 445
 
446
class SearchProduct():
447
 
448
    def on_get(self,req,resp):
449
        offset = req.get_param_as_int("offset")
450
        limit = req.get_param_as_int("limit")
451
        search_term = req.get_param("search")
452
 
453
        result = Mongo.searchMaster(offset, limit, search_term)
14483 kshitij.so 454
        resp.body = dumps(result) 
14482 kshitij.so 455
 
456
 
14495 kshitij.so 457
class FeaturedDeals():
14482 kshitij.so 458
 
14495 kshitij.so 459
    def on_get(self, req, resp):
460
 
461
        offset = req.get_param_as_int("offset")
462
        limit = req.get_param_as_int("limit")
463
 
464
        result = Mongo.getAllFeaturedDeals(offset, limit)
465
        resp.body = dumps(result)
466
 
467
 
468
    def on_post(self, req, resp):
469
 
14552 kshitij.so 470
        multi = req.get_param_as_int("multi")
471
 
14495 kshitij.so 472
        try:
473
            result_json = json.loads(req.stream.read(), encoding='utf-8')
474
        except ValueError:
475
            raise falcon.HTTPError(falcon.HTTP_400,
476
                'Malformed JSON',
477
                'Could not decode the request body. The '
478
                'JSON was incorrect.')
479
 
14552 kshitij.so 480
        result = Mongo.addFeaturedDeal(result_json, multi)
14495 kshitij.so 481
        resp.body = json.dumps(result, encoding='utf-8')
482
 
14497 kshitij.so 483
 
484
class CommonSearch():
14495 kshitij.so 485
 
14497 kshitij.so 486
    def on_get(self,req,resp):
487
        class_name = req.get_param("class")
488
        sku = req.get_param_as_int("sku")
489
        skuBundleId = req.get_param_as_int("skuBundleId")
14499 kshitij.so 490
 
491
        result = Mongo.searchCollection(class_name, sku, skuBundleId)
14497 kshitij.so 492
        resp.body = dumps(result)
14619 kshitij.so 493
 
494
class CricScore():
495
 
496
    def on_get(self,req,resp):
497
 
498
        result = Mongo.getLiveCricScore()
14853 kshitij.so 499
        resp.body = dumps(result)
500
 
501
class Notification():
502
 
503
    def on_post(self, req, resp):
504
 
505
        try:
506
            result_json = json.loads(req.stream.read(), encoding='utf-8')
507
        except ValueError:
508
            raise falcon.HTTPError(falcon.HTTP_400,
509
                'Malformed JSON',
510
                'Could not decode the request body. The '
511
                'JSON was incorrect.')
512
 
513
        result = Mongo.addBundleToNotification(result_json)
514
        resp.body = json.dumps(result, encoding='utf-8')
515
 
516
    def on_get(self, req, resp):
517
 
518
        offset = req.get_param_as_int("offset")
519
        limit = req.get_param_as_int("limit")
520
 
521
        result = Mongo.getAllNotifications(offset, limit)
522
        resp.body = dumps(result)
523
 
14998 kshitij.so 524
class DealBrands():
14853 kshitij.so 525
 
14998 kshitij.so 526
    def on_get(self, req, resp):
527
 
528
        category_id = req.get_param_as_int("category_id")
529
        result = Mongo.getBrandsForFilter(category_id)
14999 kshitij.so 530
        resp.body = dumps(result)
15161 kshitij.so 531
 
532
class DealRank():
14998 kshitij.so 533
 
15161 kshitij.so 534
    def on_get(self, req, resp):
535
        identifier = req.get_param("identifier")
536
        source_id = req.get_param_as_int("source_id")
537
        user_id = req.get_param_as_int("user_id")
538
        result = Mongo.getDealRank(identifier, source_id, user_id)
539
        json_docs = json.dumps(result, default=json_util.default)
540
        resp.body = json_docs
541
 
542
 
16560 amit.gupta 543
class OrderedOffers():
544
    def on_get(self, req, resp, storeId, storeSku):
545
        storeId = int(storeId)
16563 amit.gupta 546
        result = Mongo.getBundleBySourceSku(storeId, storeSku)
547
        json_docs = json.dumps(result, default=json_util.default)
548
        resp.body = json_docs
549
 
15081 amit.gupta 550
class RetailerDetail():
551
    global RETAILER_DETAIL_CALL_COUNTER
15105 amit.gupta 552
    def getRetryRetailer(self,failback=True):
15358 amit.gupta 553
        status = RETRY_MAP.get(self.callType)
17089 amit.gupta 554
        retailer = session.query(Retailers).filter_by(status=status).filter(Retailers.next_call_time<=datetime.now()).filter(or_(Retailers.agent_id==self.agentId, Retailers.agent_id==None)).order_by(Retailers.agent_id.desc(),Retailers.call_priority).order_by(Retailers.next_call_time).with_lockmode("update").first()
17029 amit.gupta 555
 
15239 amit.gupta 556
        if retailer is not None:
557
            lgr.info( "getRetryRetailer " + str(retailer.id))
558
        else:
559
            if failback:
560
                retailer = self.getNewRetailer(False)
561
                return retailer
16371 amit.gupta 562
            else:
563
                #No further calls for now
564
                return None
15358 amit.gupta 565
        retailer.status = ASSIGN_MAP.get(status)
16371 amit.gupta 566
        retailer.next_call_time = None
15239 amit.gupta 567
        lgr.info( "getRetryRetailer " + str(retailer.id))
15081 amit.gupta 568
        return retailer
569
 
15662 amit.gupta 570
    def getNotActiveRetailer(self):
571
        try:
15716 amit.gupta 572
            user = session.query(Users).filter_by(activated=0).filter_by(status=1).filter(Users.mobile_number != None).filter(~Users.mobile_number.like("0%")).filter(Users.created>datetime(2015,06,29)).order_by(Users.created.desc()).with_lockmode("update").first()
15662 amit.gupta 573
            if user is None: 
574
                return None
575
            else:
576
                retailerContact = session.query(RetailerContacts).filter_by(mobile_number=user.mobile_number).first()
577
                if retailerContact is not None:
578
                    retailer = session.query(Retailers).filter_by(id=retailerContact.retailer_id).first()
579
                else:
580
                    retailer = session.query(Retailers).filter_by(contact1=user.mobile_number).first()
581
                    if retailer is None:
582
                        retailer = session.query(Retailers).filter_by(contact2=user.mobile_number).first()
583
                        if retailer is None:
584
                            retailer = Retailers()
585
                            retailer.contact1 = user.mobile_number
586
                            retailer.status = 'assigned'
15672 amit.gupta 587
                            retailer.retry_count = 0
15673 amit.gupta 588
                            retailer.invalid_retry_count = 0
15699 amit.gupta 589
                            retailer.is_elavated=1
19732 manas 590
                            retailer.agent_id = 2
591
                            retailer.isvalidated = 0 
15662 amit.gupta 592
                user.status = 2
593
                session.commit()
594
                print "retailer id", retailer.id
595
                retailer.contact = user.mobile_number
596
                return retailer
597
        finally:
598
            session.close()
599
 
15081 amit.gupta 600
    def getNewRetailer(self,failback=True):
15663 amit.gupta 601
        if self.callType == 'fresh':
602
            retailer = self.getNotActiveRetailer()
603
            if retailer is not None:
604
                return retailer
15081 amit.gupta 605
        retry = True
606
        retailer = None 
607
        try:
608
            while(retry):
15168 amit.gupta 609
                lgr.info( "Calltype " + self.callType)
15081 amit.gupta 610
                status=self.callType
15545 amit.gupta 611
                query = session.query(Retailers).filter(Retailers.status==status).filter(or_(Retailers.agent_id==self.agentId, Retailers.agent_id==None))
15081 amit.gupta 612
                if status=='fresh':
19598 amit.gupta 613
                    query = query.filter_by(is_or=False, is_std=False).filter(Retailers.cod_limit > 19999).order_by(Retailers.is_elavated.desc(), Retailers.agent_id.desc())
15358 amit.gupta 614
                elif status=='followup':
15546 amit.gupta 615
                    query = query.filter(Retailers.next_call_time<=datetime.now()).order_by(Retailers.agent_id.desc(),Retailers.next_call_time)
15162 amit.gupta 616
                else:
15546 amit.gupta 617
                    query = query.filter(Retailers.modified<=datetime.now()).order_by(Retailers.agent_id.desc(), Retailers.modified)
15358 amit.gupta 618
 
15081 amit.gupta 619
                retailer = query.with_lockmode("update").first()
620
                if retailer is not None:
15168 amit.gupta 621
                    lgr.info( "retailer " +str(retailer.id))
15081 amit.gupta 622
                    if status=="fresh":
623
                        userquery = session.query(Users)
624
                        if retailer.contact2 is not None:
625
                            userquery = userquery.filter(Users.mobile_number.in_([retailer.contact1,retailer.contact2]))
626
                        else:
627
                            userquery = userquery.filter_by(mobile_number=retailer.contact1)
628
                        user = userquery.first()
629
                        if user is not None:
630
                            retailer.status = 'alreadyuser'
15168 amit.gupta 631
                            lgr.info( "retailer.status " + retailer.status)
15081 amit.gupta 632
                            session.commit()
633
                            continue
634
                        retailer.status = 'assigned'
15358 amit.gupta 635
                    elif status=='followup':
15276 amit.gupta 636
                        if isActivated(retailer.id):
637
                            print "Retailer Already %d activated and marked onboarded"%(retailer.id)
638
                            continue
15081 amit.gupta 639
                        retailer.status = 'fassigned'
15358 amit.gupta 640
                    else:
641
                        retailer.status = 'oassigned'
15081 amit.gupta 642
                    retailer.retry_count = 0
15123 amit.gupta 643
                    retailer.invalid_retry_count = 0
15168 amit.gupta 644
                    lgr.info( "Found Retailer " +  str(retailer.id) + " with status " + status + " assigned to " + str(self.agentId))
15081 amit.gupta 645
 
646
                else:
15168 amit.gupta 647
                    lgr.info( "No fresh/followup retailers found")
15081 amit.gupta 648
                    if failback:
649
                        retailer = self.getRetryRetailer(False)
15104 amit.gupta 650
                        return retailer
15148 amit.gupta 651
                retry=False
15081 amit.gupta 652
        except:
653
            print traceback.print_exc()
654
        return retailer
655
 
15132 amit.gupta 656
    def on_get(self, req, resp, agentId, callType=None, retailerId=None):
16927 amit.gupta 657
        try:
658
            global RETAILER_DETAIL_CALL_COUNTER
659
            RETAILER_DETAIL_CALL_COUNTER += 1
660
            lgr.info( "RETAILER_DETAIL_CALL_COUNTER " +  str(RETAILER_DETAIL_CALL_COUNTER))
661
            self.agentId = int(agentId)
662
            self.callType = callType
663
            if retailerId is not None:
664
                self.retailerId = int(retailerId)
665
                retailerLink = session.query(RetailerLinks).filter_by(retailer_id=self.retailerId).first()
666
                if retailerLink is not None:
667
                    code = retailerLink.code
19734 manas 668
                    retailerLink.agent_id = self.agentId
669
                    session.commit()
16927 amit.gupta 670
                else: 
19732 manas 671
                    code = self.getNewRandomCode()
16927 amit.gupta 672
                    retailerLink = RetailerLinks()
673
                    retailerLink.code = code
674
                    retailerLink.agent_id = self.agentId
675
                    retailerLink.retailer_id = self.retailerId
676
                    activationCode=Activation_Codes()
677
                    activationCode.code = code
678
                    session.commit()
679
                session.close()
680
                resp.body =  json.dumps({"result":{"code":code,"link":make_tiny(code)}}, encoding='utf-8')
681
                return 
682
            retryFlag = False 
683
            if RETAILER_DETAIL_CALL_COUNTER % TOTAL >= DEALER_FRESH_FACTOR:
684
                retryFlag=True
685
            try:
686
                if retryFlag:
687
                    retailer = self.getRetryRetailer()
688
                else:
689
                    retailer = self.getNewRetailer()
690
                if retailer is None:
691
                    resp.body = "{}"
692
                    return
693
                fetchInfo = FetchDataHistory()
694
                fetchInfo.agent_id = self.agentId
695
                fetchInfo.call_type = self.callType
696
                agent = session.query(Agents).filter_by(id=self.agentId).first()
697
                last_disposition = session.query(CallHistory).filter_by(agent_id=self.agentId).order_by(CallHistory.id.desc()).first()
698
                if last_disposition is None or last_disposition.created < agent.last_login:
699
                    fetchInfo.last_action = 'login'
700
                    fetchInfo.last_action_time = agent.last_login 
701
                else:
702
                    fetchInfo.last_action = 'disposition'
703
                    fetchInfo.last_action_time = last_disposition.created
704
                fetchInfo.retailer_id = retailer.id
705
                session.commit()
15135 amit.gupta 706
 
16927 amit.gupta 707
                otherContacts = [r for r, in session.query(RetailerContacts.mobile_number).filter_by(retailer_id=retailer.id).order_by(RetailerContacts.contact_type).all()]
708
                resp.body = json.dumps(todict(getRetailerObj(retailer, otherContacts, self.callType)), encoding='utf-8')
709
 
710
                return
711
 
712
            finally:
713
                session.close()
714
 
15343 amit.gupta 715
            if retailer is None:
716
                resp.body = "{}"
15239 amit.gupta 717
            else:
16927 amit.gupta 718
                print "It should never come here"
719
                resp.body = json.dumps(todict(getRetailerObj(retailer)), encoding='utf-8')
15239 amit.gupta 720
        finally:
721
            session.close()
15081 amit.gupta 722
 
723
    def on_post(self, req, resp, agentId, callType):
15112 amit.gupta 724
        returned = False
15081 amit.gupta 725
        self.agentId = int(agentId)
726
        self.callType = callType
727
        jsonReq = json.loads(req.stream.read(), encoding='utf-8')
15169 amit.gupta 728
        lgr.info( "Request ----\n"  + str(jsonReq))
15091 amit.gupta 729
        self.jsonReq = jsonReq
730
        invalidNumber = self.invalidNumber
731
        callLater = self.callLater
15096 amit.gupta 732
        alreadyUser = self.alReadyUser
15091 amit.gupta 733
        verifiedLinkSent = self.verifiedLinkSent
15368 amit.gupta 734
        onboarded = self.onboarded
15278 amit.gupta 735
        self.address = jsonReq.get('address')
15096 amit.gupta 736
        self.retailerId = int(jsonReq.get('retailerid'))
15671 amit.gupta 737
        self.smsNumber = jsonReq.get('smsnumber')
738
        if self.smsNumber is not None:
739
            self.smsNumber = self.smsNumber.strip().lstrip("0") 
15112 amit.gupta 740
        try:
741
            self.retailer = session.query(Retailers).filter_by(id=self.retailerId).first()
15281 amit.gupta 742
            if self.address:
15278 amit.gupta 743
                self.retailer.address_new = self.address
15112 amit.gupta 744
            self.callDisposition = jsonReq.get('calldispositiontype')
745
            self.callHistory = CallHistory()
746
            self.callHistory.agent_id=self.agentId
747
            self.callHistory.call_disposition = self.callDisposition
748
            self.callHistory.retailer_id=self.retailerId
15115 amit.gupta 749
            self.callHistory.call_type=self.callType
15112 amit.gupta 750
            self.callHistory.duration_sec = int(jsonReq.get("callduration"))
751
            self.callHistory.disposition_description = jsonReq.get('calldispositiondescritption')
15200 manas 752
            self.callHistory.disposition_comments = jsonReq.get('calldispositioncomments')
753
            lgr.info(self.callHistory.disposition_comments)
15112 amit.gupta 754
            self.callHistory.call_time = datetime.strptime(jsonReq.get("calltime"), '%d/%m/%Y %H:%M:%S')
755
            self.callHistory.mobile_number = jsonReq.get('number')
15145 amit.gupta 756
            self.callHistory.sms_verified = int(jsonReq.get("verified"))
15234 amit.gupta 757
            lastFetchData = session.query(FetchDataHistory).filter_by(agent_id=self.agentId).order_by(FetchDataHistory.id.desc()).first()
15368 amit.gupta 758
            if self.callDisposition == 'onboarded':
759
                self.checkList = jsonReq.get('checklist')
760
 
15234 amit.gupta 761
            if lastFetchData is None:
762
                raise
763
            self.callHistory.last_fetch_time= lastFetchData.created  
15112 amit.gupta 764
 
765
            dispositionMap = {  'call_later':callLater,
766
                        'ringing_no_answer':callLater,
767
                        'not_reachable':callLater,
768
                        'switch_off':callLater,
15202 manas 769
                        'not_retailer':invalidNumber,
15112 amit.gupta 770
                        'invalid_no':invalidNumber,
771
                        'wrong_no':invalidNumber,
772
                        'hang_up':invalidNumber,
773
                        'retailer_not_interested':invalidNumber,
15200 manas 774
                        'recharge_retailer':invalidNumber,
775
                        'accessory_retailer':invalidNumber,
776
                        'service_center_retailer':invalidNumber,
15112 amit.gupta 777
                        'alreadyuser':alreadyUser,
15368 amit.gupta 778
                        'verified_link_sent':verifiedLinkSent,
779
                        'onboarded':onboarded
15112 amit.gupta 780
                      }
781
            returned = dispositionMap[jsonReq.get('calldispositiontype')]()
782
        finally:
783
            session.close()
15096 amit.gupta 784
 
15112 amit.gupta 785
        if returned:
786
            resp.body = "{\"result\":\"success\"}"
787
        else:
788
            resp.body = "{\"result\":\"failed\"}"
15081 amit.gupta 789
 
15091 amit.gupta 790
    def invalidNumber(self,):
15108 manas 791
        #self.retailer.status = 'retry' if self.callType == 'fresh' else 'fretry'
792
        if self.callDisposition == 'invalid_no':
793
            self.retailer.status='failed'
794
            self.callHistory.disposition_description = 'Invalid Number'
795
        elif self.callDisposition == 'wrong_no':
15111 manas 796
            self.retailer.status='failed'
797
            self.callHistory.disposition_description = 'Wrong Number'
798
        elif self.callDisposition == 'hang_up':
799
            self.retailer.status='failed'
800
            self.callHistory.disposition_description = 'Hang Up'
801
        elif self.callDisposition == 'retailer_not_interested':
802
            self.retailer.status='failed'
803
            if self.callHistory.disposition_description is None:
804
                self.callHistory.disposition_description = 'NA'
15200 manas 805
            self.callHistory.disposition_description = 'Reason Retailer Not Interested ' + self.callHistory.disposition_description
806
        elif self.callDisposition == 'recharge_retailer':
807
            self.retailer.status='failed'
808
            self.callHistory.disposition_description = 'Recharge related. Not a retailer '
809
        elif self.callDisposition == 'accessory_retailer':
810
            self.retailer.status='failed'
811
            self.callHistory.disposition_description = 'Accessory related. Not a retailer'
812
        elif self.callDisposition == 'service_center_retailer':
813
            self.retailer.status='failed'
814
            self.callHistory.disposition_description = 'Service Center related. Not a retailer'
15202 manas 815
        elif self.callDisposition == 'not_retailer':
816
            self.retailer.status='failed'
817
            self.callHistory.disposition_description = 'Not a retailer'    
15108 manas 818
        session.commit()
819
        return True   
820
 
15132 amit.gupta 821
    def getCode(self,):
15207 amit.gupta 822
        newCode = None
823
        lastLink = session.query(RetailerLinks).order_by(RetailerLinks.id.desc()).with_lockmode("update").first()
824
        if lastLink is not None:
825
            if len(lastLink.code)==len(codesys):
826
                newCode=lastLink.code
827
        return getNextCode(codesys, newCode)
15108 manas 828
 
19732 manas 829
    def getNewRandomCode(self,):
830
        newCode = None
831
        while True:
832
            newCode = getNextRandomCode(newcodesys, 6)
833
            print 'NewCode',newCode
834
            isCodePresent = session.query(Activation_Codes).filter_by(code=newCode).first()
835
            if isCodePresent is not None:
836
                continue
837
            else:
838
                break
839
        return newCode
15254 amit.gupta 840
 
15091 amit.gupta 841
    def callLater(self,):
15368 amit.gupta 842
        self.retailer.status = RETRY_MAP.get(self.callType)
15100 amit.gupta 843
        self.retailer.call_priority = None
15096 amit.gupta 844
        if self.callDisposition == 'call_later':
15100 amit.gupta 845
            if self.callHistory.disposition_description is not None:
15102 amit.gupta 846
                self.retailer.call_priority = 'user_initiated'
15096 amit.gupta 847
                self.retailer.next_call_time = datetime.strptime(self.callHistory.disposition_description, '%d/%m/%Y %H:%M:%S')
848
                self.callHistory.disposition_description = 'User requested to call on ' + self.callHistory.disposition_description
849
            else:
15102 amit.gupta 850
                self.retailer.call_priority = 'system_initiated'
15096 amit.gupta 851
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=1)
15112 amit.gupta 852
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
853
        else: 
854
            if self.callDisposition == 'ringing_no_answer':
855
                if self.retailer.disposition == 'ringing_no_answer':
856
                    self.retailer.retry_count += 1
857
                else:
858
                    self.retailer.disposition = 'ringing_no_answer'
859
                    self.retailer.retry_count = 1
860
            else:
861
                if self.retailer.disposition == 'ringing_no_answer':
15122 amit.gupta 862
                    pass
15112 amit.gupta 863
                else:
15119 amit.gupta 864
                    self.retailer.disposition = 'not_reachable'
15122 amit.gupta 865
                self.retailer.retry_count += 1
866
                self.retailer.invalid_retry_count += 1
15119 amit.gupta 867
 
15122 amit.gupta 868
            retryConfig = session.query(RetryConfig).filter_by(call_type=self.callType, disposition_type=self.retailer.disposition, retry_count=self.retailer.retry_count).first()
15112 amit.gupta 869
            if retryConfig is not None:
870
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(minutes = retryConfig.minutes_ahead)
15119 amit.gupta 871
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
15112 amit.gupta 872
            else:
873
                self.retailer.status = 'failed'
874
                self.callHistory.disposition_description = 'Call failed as all attempts exhausted'
15119 amit.gupta 875
 
15101 amit.gupta 876
        session.commit()
877
        return True
15096 amit.gupta 878
 
15100 amit.gupta 879
 
15091 amit.gupta 880
    def alReadyUser(self,):
15112 amit.gupta 881
        self.retailer.status = self.callDisposition
15117 amit.gupta 882
        if self.callHistory.disposition_description is None:
883
            self.callHistory.disposition_description = 'Retailer already user' 
15112 amit.gupta 884
        session.commit()
885
        return True
15091 amit.gupta 886
    def verifiedLinkSent(self,):
15147 amit.gupta 887
        if self.callType == 'fresh':
19734 manas 888
            if self.retailer.isvalidated:
889
                self.retailer.status = 'followup'
890
                if self.retailer.agent_id not in sticky_agents:
891
                    self.retailer.agent_id = None
892
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=1)
893
                self.callHistory.disposition_description = 'App link sent via ' + self.callHistory.disposition_description+ '. followup on' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S') 
894
            else:
895
                self.retailer.status = 'pending_verification'
896
                if self.retailer.agent_id not in sticky_agents:
897
                    self.retailer.agent_id = None
898
                self.callHistory.disposition_description = "Retailer is pending for verification" 
15147 amit.gupta 899
        else:
15224 amit.gupta 900
            self.retailer.status = 'followup'
16882 amit.gupta 901
            if self.retailer.agent_id not in sticky_agents:
902
                self.retailer.agent_id = None
15147 amit.gupta 903
            self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=7)
15254 amit.gupta 904
            self.callHistory.disposition_description = 'App link sent via' + self.callHistory.disposition_description + '. Followup again on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
15328 amit.gupta 905
        addContactToRetailer(self.agentId, self.retailerId, self.smsNumber, self.callType, 'sms')     
15146 amit.gupta 906
        session.commit()
907
        return True
15368 amit.gupta 908
    def onboarded(self,):
909
        self.retailer.status = self.callDisposition
910
        checkList = OnboardedRetailerChecklists()
911
        checkList.contact_us = self.checkList.get('contactus')
15390 amit.gupta 912
        checkList.doa_return_policy = self.checkList.get('doareturnpolicy')
15368 amit.gupta 913
        checkList.number_verification = self.checkList.get('numberverification')
914
        checkList.payment_option = self.checkList.get('paymentoption')
915
        checkList.preferences = self.checkList.get('preferences')
916
        checkList.product_info = self.checkList.get('productinfo')
15372 amit.gupta 917
        checkList.redeem = self.checkList.get('redeem')
15368 amit.gupta 918
        checkList.retailer_id = self.retailerId
919
        session.commit()
920
        return True
921
 
922
 
15254 amit.gupta 923
def isActivated(retailerId):
15276 amit.gupta 924
    retailerLink = session.query(RetailerLinks).filter_by(retailer_id=retailerId).first()
15448 amit.gupta 925
    user = session.query(Users).filter(or_(func.lower(Users.referrer)==retailerLink.code.lower(), Users.utm_campaign==retailerLink.code)).first()
15276 amit.gupta 926
    if user is None:
927
        mobileNumbers = list(session.query(RetailerContacts.mobile_number).filter_by(retailer_id=retailerId).all())
928
        user = session.query(Users).filter(Users.mobile_number.in_(mobileNumbers)).first()
15254 amit.gupta 929
        if user is None:
15332 amit.gupta 930
            if retailerLink.created < datetime(2015,5,26):
15333 amit.gupta 931
                historyNumbers = [number for number, in session.query(CallHistory.mobile_number).filter_by(retailer_id = retailerId).all()]
15476 amit.gupta 932
                user = session.query(Users).filter(Users.mobile_number.in_(historyNumbers)).first()
15332 amit.gupta 933
                if user is None:
934
                    return False
15334 amit.gupta 935
                else:
936
                    mapped_with = 'contact'
15332 amit.gupta 937
            else:
938
                return False
15276 amit.gupta 939
        else:
940
            mapped_with = 'contact'
941
    else:
942
        mapped_with = 'code'
943
    retailerLink.mapped_with = mapped_with
15388 amit.gupta 944
    if user.activation_time is not None:
15448 amit.gupta 945
        retailerLink.activated = user.activation_time
946
    retailerLink.activated = user.created
15276 amit.gupta 947
    retailerLink.user_id = user.id
15291 amit.gupta 948
    retailer = session.query(Retailers).filter_by(id=retailerId).first()
15574 amit.gupta 949
    if retailer.status == 'followup' or retailer.status == 'fretry':
15389 amit.gupta 950
        retailer.status = 'onboarding'
16882 amit.gupta 951
        if retailer.agent_id not in sticky_agents:
952
                retailer.agent_id = None
15391 amit.gupta 953
        retailer.call_priority = None
954
        retailer.next_call_time = None
955
        retailer.retry_count = 0
956
        retailer.invalid_retry_count = 0
15276 amit.gupta 957
    session.commit()
15287 amit.gupta 958
    print "retailerLink.retailer_id", retailerLink.retailer_id
15700 amit.gupta 959
    print "retailer", retailer.id
15276 amit.gupta 960
    session.close()
961
    return True
15254 amit.gupta 962
 
963
class AddContactToRetailer():
964
    def on_post(self,req,resp, agentId):
965
        agentId = int(agentId)
966
        try:
967
            jsonReq = json.loads(req.stream.read(), encoding='utf-8')
968
            retailerId = int(jsonReq.get("retailerid"))
969
            mobile = jsonReq.get("mobile")
970
            callType = jsonReq.get("calltype")
971
            contactType = jsonReq.get("contacttype")
972
            addContactToRetailer(agentId, retailerId, mobile, callType, contactType)
973
            session.commit()
974
        finally:
975
            session.close()
15676 amit.gupta 976
 
15677 amit.gupta 977
class AddAddressToRetailer():
15676 amit.gupta 978
    def on_post(self,req,resp, agentId):
979
        agentId = int(agentId)
15678 amit.gupta 980
        jsonReq = json.loads(req.stream.read(), encoding='utf-8')
981
        retailerId = int(jsonReq.get("retailerid"))
15684 amit.gupta 982
        address = str(jsonReq.get("address"))
983
        storeName = str(jsonReq.get("storename"))
984
        pin = str(jsonReq.get("pin"))
985
        city = str(jsonReq.get("city"))
986
        state = str(jsonReq.get("state"))
987
        updateType = str(jsonReq.get("updatetype"))
19732 manas 988
        tinnumber = str(jsonReq.get("tinnumber"))
989
        addAddressToRetailer(agentId, retailerId, address, storeName, pin, city,state, updateType,tinnumber)
15254 amit.gupta 990
 
991
def addContactToRetailer(agentId, retailerId, mobile, callType, contactType):
15312 amit.gupta 992
    retailerContact = session.query(RetailerContacts).filter_by(retailer_id=retailerId).filter_by(mobile_number=mobile).first()
993
    if retailerContact is None:
15254 amit.gupta 994
        retailerContact = RetailerContacts()
15256 amit.gupta 995
        retailerContact.retailer_id = retailerId
15254 amit.gupta 996
        retailerContact.agent_id = agentId
997
        retailerContact.call_type = callType
998
        retailerContact.contact_type = contactType
999
        retailerContact.mobile_number = mobile
15312 amit.gupta 1000
    else:
15327 amit.gupta 1001
        if CONTACT_PRIORITY.index(retailerContact.contact_type) > CONTACT_PRIORITY.index(contactType):
15358 amit.gupta 1002
            retailerContact.contact_type = contactType
15676 amit.gupta 1003
 
19732 manas 1004
def addAddressToRetailer(agentId, retailerId, address, storeName, pin, city,state, updateType,tinnumber):
15679 amit.gupta 1005
    print "I am in addAddress"
15682 amit.gupta 1006
    print agentId, retailerId, address, storeName, pin, city, state, updateType
15679 amit.gupta 1007
    try:
19734 manas 1008
        retailer = session.query(Retailers).filter_by(id=retailerId).first()
1009
        retailer.tinnumber = tinnumber
15679 amit.gupta 1010
        if updateType=='new':
1011
            retailer.address = address
1012
            retailer.title = storeName
1013
            retailer.city = city
1014
            retailer.state = state
1015
            retailer.pin = pin
1016
        raddress = RetailerAddresses()
1017
        raddress.address = address
15682 amit.gupta 1018
        raddress.title = storeName
15679 amit.gupta 1019
        raddress.agent_id = agentId
1020
        raddress.city = city
1021
        raddress.pin = pin
1022
        raddress.retailer_id = retailerId
1023
        raddress.state = state
1024
        session.commit()
1025
    finally:
1026
        session.close() 
15254 amit.gupta 1027
 
15312 amit.gupta 1028
 
15189 manas 1029
class Login():
1030
 
1031
    def on_get(self, req, resp, agentId, role):
1032
        try:
15198 manas 1033
            self.agentId = int(agentId)
1034
            self.role = role
1035
            print str(self.agentId) + self.role;
15199 manas 1036
            agents=AgentLoginTimings()
1037
            lastLoginTime = session.query(Agents).filter(Agents.id==self.agentId).first()
1038
            print 'lastLogintime' + str(lastLoginTime)
1039
            agents.loginTime=lastLoginTime.last_login
1040
            agents.logoutTime=datetime.now()
1041
            agents.role =self.role
15282 amit.gupta 1042
            agents.agent_id = self.agentId
15199 manas 1043
            session.add(agents)    
1044
            session.commit()
1045
            resp.body =  json.dumps({"result":{"success":"true","message":"Success"}}, encoding='utf-8')
15189 manas 1046
        finally:
1047
            session.close()        
15112 amit.gupta 1048
 
15189 manas 1049
    def on_post(self,req,resp):
1050
        try:
1051
            jsonReq = json.loads(req.stream.read(), encoding='utf-8')
1052
            lgr.info( "Request ----\n"  + str(jsonReq))
1053
            email=jsonReq.get('email')
1054
            password = jsonReq.get('password')
1055
            role=jsonReq.get('role')    
15531 amit.gupta 1056
            agent = session.query(Agents).filter(and_(Agents.email==email,Agents.password==password)).first()
1057
            if agent is None:
15189 manas 1058
                resp.body =  json.dumps({"result":{"success":"false","message":"Invalid User"}}, encoding='utf-8')
1059
            else:
15531 amit.gupta 1060
                print agent.id
1061
                checkRole = session.query(Agent_Roles.id).filter(and_(Agent_Roles.agent_id==agent.id,Agent_Roles.role==role)).first()
15189 manas 1062
                if checkRole is None:
1063
                    resp.body =  json.dumps({"result":{"success":"false","message":"Invalid Role"}}, encoding='utf-8')
1064
                else:
15531 amit.gupta 1065
                    agent.last_login = datetime.now()
1066
                    agent.login_type = role
1067
                    resp.body =  json.dumps({"result":{"success":"true","message":"Valid User","id":agent.id}}, encoding='utf-8')
1068
                    session.commit()
15195 manas 1069
                    #session.query(Agents).filter_by(id = checkUser[0]).    
15189 manas 1070
        finally:
1071
            session.close()    
1072
 
15195 manas 1073
    def test(self,email,password,role):
15189 manas 1074
        checkUser = session.query(Agents.id).filter(and_(Agents.email==email,Agents.password==password)).first()
1075
        if checkUser is None:
1076
            print checkUser
15195 manas 1077
 
15189 manas 1078
        else:
1079
            print checkUser[0]
1080
            checkRole = session.query(Agent_Roles.id).filter(and_(Agent_Roles.agent_id==checkUser[0],Agent_Roles.role==role)).first()
1081
            if checkRole is None:
15195 manas 1082
                pass
15189 manas 1083
            else:
15195 manas 1084
                agents=AgentLoginTimings()
1085
                agents.loginTime=datetime.now()
1086
                agents.logoutTime=datetime.now()
1087
                agents.role =role
1088
                agents.agent_id = 2
1089
                #session.query(AgentLoginTimings).filter_by(id = checkUser[0]).update({"last_login":datetime.now()}, synchronize_session=False)
1090
                session.add(agents)    
1091
                session.commit()
1092
                session.close()
1093
 
1094
                #session.query(Agents).filter(Agents.id==checkUser[0]).update({"last_login":Agents.last_login})
15275 amit.gupta 1095
 
1096
class RetailerActivation():
1097
    def on_get(self, req, resp, userId):
15351 amit.gupta 1098
        res =  markDealerActivation(int(userId))
1099
        if res:
1100
            resp.body = "{\"activated\":true}"
1101
        else:
1102
            resp.body = "{\"activated\":false}"
1103
 
15275 amit.gupta 1104
 
1105
def markDealerActivation(userId):
1106
    try:
15343 amit.gupta 1107
        user = session.query(Users).filter_by(id=userId).first()
15275 amit.gupta 1108
        result = False                
1109
        mappedWith = 'contact'
15534 amit.gupta 1110
        retailer = None
15275 amit.gupta 1111
        if user is not None:
15454 amit.gupta 1112
            referrer = None if user.referrer is None else user.referrer.upper()
1113
            retailerLink = session.query(RetailerLinks).filter(or_(RetailerLinks.code==referrer, RetailerLinks.code==user.utm_campaign)).first()
15275 amit.gupta 1114
            if retailerLink is None:
15501 amit.gupta 1115
                if user.mobile_number is not None:
1116
                    retailerContact = session.query(RetailerContacts).filter_by(mobile_number=user.mobile_number).first()
1117
                    if retailerContact is None:
15613 amit.gupta 1118
                        retailer = session.query(Retailers).filter(Retailers.status.in_(['followup', 'fretry', 'fdone'])).filter(or_(Retailers.contact1==user.mobile_number,Retailers.contact2==user.mobile_number)).first()
15501 amit.gupta 1119
                    else:
1120
                        retailer = session.query(Retailers).filter_by(id = retailerContact.retailer_id).first()
15275 amit.gupta 1121
            else:
1122
                retailer = session.query(Retailers).filter_by(id = retailerLink.retailer_id).first()
1123
                mappedWith='code'
1124
            if retailer is not None:
1125
                retailerLink = session.query(RetailerLinks).filter_by(retailer_id=retailer.id).first()
1126
                if retailerLink is not None:
1127
                    retailerLink.user_id = user.id
1128
                    retailerLink.mapped_with=mappedWith
15358 amit.gupta 1129
                    retailer.status = 'onboarding'
15275 amit.gupta 1130
                    result = True
1131
                    session.commit()
15574 amit.gupta 1132
        return result
15275 amit.gupta 1133
    finally:
1134
        session.close()
1135
 
15189 manas 1136
 
15081 amit.gupta 1137
def todict(obj, classkey=None):
1138
    if isinstance(obj, dict):
1139
        data = {}
1140
        for (k, v) in obj.items():
1141
            data[k] = todict(v, classkey)
1142
        return data
1143
    elif hasattr(obj, "_ast"):
1144
        return todict(obj._ast())
1145
    elif hasattr(obj, "__iter__"):
1146
        return [todict(v, classkey) for v in obj]
1147
    elif hasattr(obj, "__dict__"):
1148
        data = dict([(key, todict(value, classkey)) 
1149
            for key, value in obj.__dict__.iteritems() 
1150
            if not callable(value) and not key.startswith('_')])
1151
        if classkey is not None and hasattr(obj, "__class__"):
1152
            data[classkey] = obj.__class__.__name__
1153
        return data
1154
    else:
1155
        return obj
18256 manas 1156
 
15358 amit.gupta 1157
def getRetailerObj(retailer, otherContacts1=None, callType=None):
15324 amit.gupta 1158
    print "before otherContacts1",otherContacts1
1159
    otherContacts = [] if otherContacts1 is None else otherContacts1
15662 amit.gupta 1160
    print "after otherContacts1",otherContacts
15081 amit.gupta 1161
    obj = Mock()
15280 amit.gupta 1162
    obj.id = retailer.id
15686 amit.gupta 1163
 
1164
 
15314 amit.gupta 1165
    if retailer.contact1 is not None and retailer.contact1 not in otherContacts:
15315 amit.gupta 1166
        otherContacts.append(retailer.contact1)
15314 amit.gupta 1167
    if retailer.contact2 is not None and retailer.contact2 not in otherContacts:
15315 amit.gupta 1168
        otherContacts.append(retailer.contact2)
15323 amit.gupta 1169
    obj.contact1 = None if len(otherContacts)==0 else otherContacts[0]
15325 amit.gupta 1170
    if obj.contact1 is not None:
1171
        obj.contact2 = None if len(otherContacts)==1 else otherContacts[1]
15096 amit.gupta 1172
    obj.scheduled = (retailer.call_priority is not None)
15686 amit.gupta 1173
    address = None
1174
    try:
1175
        address = session.query(RetailerAddresses).filter_by(retailer_id=retailer.id).order_by(RetailerAddresses.created.desc()).first()
1176
    finally:
1177
        session.close()
1178
    if address is not None:
1179
        obj.address = address.address
1180
        obj.title = address.title
1181
        obj.city = address.city
1182
        obj.state = address.state
1183
        obj.pin = address.pin 
1184
    else:
1185
        obj.address = retailer.address_new if retailer.address_new is not None else retailer.address
1186
        obj.title = retailer.title
1187
        obj.city = retailer.city
1188
        obj.state = retailer.state
1189
        obj.pin = retailer.pin 
15699 amit.gupta 1190
    obj.status = retailer.status
19732 manas 1191
    obj.tinnumber = retailer.tinnumber    
15662 amit.gupta 1192
    if hasattr(retailer, 'contact'):
1193
        obj.contact = retailer.contact
19732 manas 1194
        obj.isvalidated = retailer.isvalidated
1195
 
1196
    if callType == 'followup':
1197
        obj.last_call_time = datetime.strftime(retailer.modified, "%B %Y")
15358 amit.gupta 1198
    if callType == 'onboarding':
1199
        try:
15364 amit.gupta 1200
            userId, activatedTime = session.query(RetailerLinks.user_id, RetailerLinks.activated).filter(RetailerLinks.retailer_id==retailer.id).first()
15366 amit.gupta 1201
            activated, = session.query(Users.activation_time).filter(Users.id==userId).first()
15364 amit.gupta 1202
            if activated is not None:
15366 amit.gupta 1203
                activatedTime = activated
15362 amit.gupta 1204
            obj.user_id = userId
15364 amit.gupta 1205
            obj.created = datetime.strftime(activatedTime, '%d/%m/%Y %H:%M:%S')
15358 amit.gupta 1206
            result = fetchResult("select * from useractive where user_id=%d"%(userId))
1207
            if result == ():
1208
                obj.last_active = None
1209
            else:
15360 amit.gupta 1210
                obj.last_active =datetime.strftime(result[0][1], '%d/%m/%Y %H:%M:%S')
15361 amit.gupta 1211
            ordersCount = session.query(Orders).filter_by(user_id = userId).filter(~Orders.status.in_(['ORDER_NOT_CREATED_KNOWN', 'ORDER_ALREADY_CREATED_IGNORED'])).count()
15358 amit.gupta 1212
            obj.orders = ordersCount
1213
        finally:
1214
            session.close()
15081 amit.gupta 1215
    return obj
15091 amit.gupta 1216
 
15132 amit.gupta 1217
def make_tiny(code):
16939 manish.sha 1218
    url = 'https://play.google.com/store/apps/details?id=com.saholic.profittill&referrer=utm_source%3D0%26utm_medium%3DCRM%26utm_term%3D001%26utm_campaign%3D' + code
16881 manas 1219
    #url='https://play.google.com/store/apps/details?id=com.saholic.profittill&referrer=utm_source=0&utm_medium=CRM&utm_term=001&utm_campaign='+code
16939 manish.sha 1220
    #marketUrl='market://details?id=com.saholic.profittill&referrer=utm_source=0&utm_medium=CRM&utm_term=001&utm_campaign='+code
1221
    #url = urllib.quote(marketUrl)
15465 amit.gupta 1222
    #request_url = ('http://tinyurl.com/api-create.php?' + urlencode({'url':url}))
1223
    #filehandle = urllib2.Request(request_url)
1224
    #x= urllib2.urlopen(filehandle)
15546 amit.gupta 1225
    try:
1226
        shortener = Shortener('TinyurlShortener')
1227
        returnUrl =  shortener.short(url)
1228
    except:
1229
        shortener = Shortener('SentalaShortener')
19678 amit.gupta 1230
        returnUrl =  shortener.short(url)
15546 amit.gupta 1231
    return returnUrl
15171 amit.gupta 1232
 
15285 manas 1233
class SearchUser():
1234
 
1235
    def on_post(self, req, resp, agentId, searchType):
15314 amit.gupta 1236
        retailersJsonArray = []
15285 manas 1237
        try:
1238
            jsonReq = json.loads(req.stream.read(), encoding='utf-8')
1239
            lgr.info( "Request in Search----\n"  + str(jsonReq))
15302 amit.gupta 1240
            contact=jsonReq.get('searchTerm')
15285 manas 1241
            if(searchType=="number"):
15312 amit.gupta 1242
                retailer_ids = session.query(RetailerContacts.retailer_id).filter_by(mobile_number=contact).all()
1243
                retailer_ids = [r for r, in retailer_ids]    
1244
                anotherCondition = or_(Retailers.contact1==contact,Retailers.contact2==contact, Retailers.id.in_(retailer_ids))
1245
            else:
1246
                m = re.match("(.*?)(\d{6})(.*?)", contact)
1247
                if m is not None:
1248
                    pin = m.group(2)
1249
                    contact = m.group(1) if m.group(1) != '' else m.group(3)
15313 amit.gupta 1250
                    anotherCondition = and_(Retailers.title.ilike('%%%s%%'%(contact)), Retailers.pin==pin)
15312 amit.gupta 1251
                else:
1252
                    anotherCondition = Retailers.title.ilike('%%%s%%'%(contact))
15297 amit.gupta 1253
 
15326 amit.gupta 1254
            retailers = session.query(Retailers).filter(anotherCondition).limit(20).all()
15312 amit.gupta 1255
            if retailers is None:
15285 manas 1256
                resp.body = json.dumps("{}")
15312 amit.gupta 1257
            else:
1258
                for retailer in retailers:
15326 amit.gupta 1259
                    otherContacts = [r for r, in session.query(RetailerContacts.mobile_number).filter_by(retailer_id=retailer.id).order_by(RetailerContacts.contact_type).all()]
15314 amit.gupta 1260
                    retailersJsonArray.append(todict(getRetailerObj(retailer, otherContacts)))    
1261
            resp.body = json.dumps({"Retailers":retailersJsonArray}, encoding='utf-8')
15312 amit.gupta 1262
            return
15285 manas 1263
        finally:
1264
            session.close()
15171 amit.gupta 1265
 
15081 amit.gupta 1266
 
1267
class Mock(object):
1268
    pass
15189 manas 1269
 
15312 amit.gupta 1270
def tagActivatedReatilers():
15613 amit.gupta 1271
    retailerIds = [r for  r, in session.query(RetailerLinks.retailer_id).filter_by(user_id = None).all()]
15312 amit.gupta 1272
    session.close()
15288 amit.gupta 1273
    for retailerId in retailerIds:
1274
        isActivated(retailerId)
15312 amit.gupta 1275
    session.close()
15374 kshitij.so 1276
 
1277
class StaticDeals():
1278
 
1279
    def on_get(self, req, resp):
1280
 
1281
        offset = req.get_param_as_int("offset")
1282
        limit = req.get_param_as_int("limit")
1283
        categoryId = req.get_param_as_int("categoryId")
15458 kshitij.so 1284
        direction = req.get_param_as_int("direction")
15374 kshitij.so 1285
 
15458 kshitij.so 1286
        result = Mongo.getStaticDeals(offset, limit, categoryId, direction)
15374 kshitij.so 1287
        resp.body = dumps(result)
1288
 
16366 kshitij.so 1289
class DealNotification():
1290
 
1291
    def on_get(self,req,resp,skuBundleIds):
1292
        result = Mongo.getDealsForNotification(skuBundleIds)
1293
        resp.body = dumps(result)
16487 kshitij.so 1294
 
1295
class DealPoints():
1296
 
1297
    def on_get(self, req, resp):
16366 kshitij.so 1298
 
16487 kshitij.so 1299
        offset = req.get_param_as_int("offset")
1300
        limit = req.get_param_as_int("limit")
1301
 
1302
        result = Mongo.getAllBundlesWithDealPoints(offset, limit)
1303
        resp.body = dumps(result)
15374 kshitij.so 1304
 
16487 kshitij.so 1305
 
1306
    def on_post(self, req, resp):
1307
 
1308
 
1309
        try:
1310
            result_json = json.loads(req.stream.read(), encoding='utf-8')
1311
        except ValueError:
1312
            raise falcon.HTTPError(falcon.HTTP_400,
1313
                'Malformed JSON',
1314
                'Could not decode the request body. The '
1315
                'JSON was incorrect.')
1316
 
1317
        result = Mongo.addDealPoints(result_json)
1318
        resp.body = json.dumps(result, encoding='utf-8')
15374 kshitij.so 1319
 
16545 kshitij.so 1320
class AppAffiliates():
1321
 
1322
    def on_get(self, req, resp, retailerId, appId):
1323
        retailerId = int(retailerId)
1324
        appId = int(appId)
16554 kshitij.so 1325
        call_back = req.get_param("callback")
16545 kshitij.so 1326
        result = Mongo.generateRedirectUrl(retailerId, appId)
16555 kshitij.so 1327
        resp.body = call_back+'('+str(result)+')'
16557 kshitij.so 1328
 
1329
class AffiliatePayout():
1330
    def on_get(self, req, resp):
1331
        payout = req.get_param("payout")
1332
        transaction_id = req.get_param("transaction_id")
1333
        result = Mongo.addPayout(payout, transaction_id)
1334
        resp.body = str(result)
1335
 
16581 manish.sha 1336
class AppOffers():
1337
    def on_get(self, req, resp, retailerId):
16895 manish.sha 1338
        try:            
1339
            result = Mongo.getAppOffers(retailerId)
1340
            offerids = result.values()
1341
            if offerids is None or len(offerids)==0:
16887 kshitij.so 1342
                resp.body = json.dumps("{}")
1343
            else:
16941 manish.sha 1344
                appOffers = session.query(app_offers.id,app_offers.appmaster_id, app_offers.app_name, app_offers.affiliate_offer_id, app_offers.image_url, app_offers.downloads, app_offers.link, app_offers.offer_price, app_offers.offerCategory, app_offers.package_name, app_offers.promoImage, app_offers.ratings, case([(app_offers.override_payout == True, app_offers.overriden_payout)], else_=app_offers.user_payout).label('user_payout'), case([(appmasters.shortDescription != None, appmasters.shortDescription)], else_=None).label('shortDescription'), case([(appmasters.longDescription != None, appmasters.longDescription)], else_=None).label('longDescription'), appmasters.customerOneLiner, appmasters.retailerOneLiner,appmasters.rank, app_offers.offerCondition, app_offers.location).join((appmasters,appmasters.id==app_offers.appmaster_id)).filter(app_offers.id.in_(tuple(offerids))).all()
16895 manish.sha 1345
                appOffersMap = {}
1346
                jsonOffersArray=[]
1347
                for offer in appOffers:
1348
                    appOffersMap[long(offer[0])]= AppOfferObj(offer[0], offer[1], offer[2], offer[3], offer[4], offer[5], offer[6], offer[7], offer[8], offer[9], offer[10], offer[11], offer[12], offer[13], offer[14], offer[15], offer[16], offer[17], offer[18], offer[19]).__dict__
1349
                for rank in sorted(result):
1350
                    print 'Rank', rank, 'Data', appOffersMap[result[rank]]
1351
                    jsonOffersArray.append(appOffersMap[result[rank]])
1352
 
1353
            resp.body = json.dumps({"AppOffers":jsonOffersArray}, encoding='latin1')
16887 kshitij.so 1354
        finally:
1355
            session.close()
1356
 
16727 manish.sha 1357
 
1358
class AppUserBatchRefund():
1359
    def on_get(self, req, resp, batchId, userId):
16887 kshitij.so 1360
        try:
1361
            batchId = long(batchId)
1362
            userId = long(userId)
1363
            userBatchCashback = user_app_cashbacks.get_by(user_id=userId, batchCreditId=batchId)
1364
            if userBatchCashback is None:
1365
                resp.body = json.dumps("{}")
1366
            else:
16905 manish.sha 1367
                if userBatchCashback.creditedDate is not None:
1368
                    userBatchCashback.creditedDate = str(userBatchCashback.creditedDate)
16887 kshitij.so 1369
                resp.body = json.dumps(todict(userBatchCashback), encoding='utf-8')
1370
        finally:
1371
            session.close()
16727 manish.sha 1372
 
1373
class AppUserBatchDrillDown():
16777 manish.sha 1374
    def on_get(self, req, resp, fortNightOfYear, userId, yearVal):
16887 kshitij.so 1375
        try:
1376
            fortNightOfYear = long(fortNightOfYear)
1377
            userId = long(userId)
1378
            yearVal = long(yearVal)
1379
            appUserBatchDrillDown = session.query(user_app_installs.transaction_date, func.sum(user_app_installs.installCount).label('downloads'), func.sum(user_app_installs.payoutAmount).label('amount')).join((user_app_cashbacks,user_app_cashbacks.user_id==user_app_installs.user_id)).filter(user_app_cashbacks.fortnightOfYear==user_app_installs.fortnightOfYear).filter(user_app_cashbacks.user_id==userId).filter(user_app_cashbacks.yearVal==yearVal).filter(user_app_cashbacks.fortnightOfYear==fortNightOfYear).group_by(user_app_installs.transaction_date).all()
1380
            cashbackArray = []
1381
            if appUserBatchDrillDown is None or len(appUserBatchDrillDown)==0:
1382
                resp.body = json.dumps("{}")
1383
            else:
1384
                for appcashBack in appUserBatchDrillDown:
1385
                    userAppBatchDrillDown = UserAppBatchDrillDown(str(appcashBack[0]),long(appcashBack[1]), long(appcashBack[2]))
1386
                    cashbackArray.append(todict(userAppBatchDrillDown))
1387
                resp.body = json.dumps({"UserAppCashBackInBatch":cashbackArray}, encoding='utf-8')
1388
        finally:
1389
            session.close()
16727 manish.sha 1390
 
1391
class AppUserBatchDateDrillDown():
1392
    def on_get(self, req, resp, userId, date):
16887 kshitij.so 1393
        try:
1394
            userId = long(userId)
1395
            date = str(date)
1396
            date = datetime.strptime(date, '%Y-%m-%d')
1397
            appUserBatchDateDrillDown = session.query(user_app_installs.app_name, func.sum(user_app_installs.installCount).label('downloads'), func.sum(user_app_installs.payoutAmount).label('amount')).filter(user_app_installs.user_id==userId).filter(user_app_installs.transaction_date==date).group_by(user_app_installs.app_name).all()
1398
            cashbackArray = []
1399
            if appUserBatchDateDrillDown is None or len(appUserBatchDateDrillDown)==0:
1400
                resp.body = json.dumps("{}")
1401
            else:
1402
                for appcashBack in appUserBatchDateDrillDown:
1403
                    userAppBatchDateDrillDown = UserAppBatchDateDrillDown(str(appcashBack[0]),long(appcashBack[1]),long(appcashBack[2]))
1404
                    cashbackArray.append(todict(userAppBatchDateDrillDown))
1405
                resp.body = json.dumps({"UserAppCashBackDateWise":cashbackArray}, encoding='utf-8')
1406
        finally:
1407
            session.close()
16739 manish.sha 1408
 
16748 manish.sha 1409
class AppUserCashBack():
1410
    def on_get(self, req, resp, userId, status):
16887 kshitij.so 1411
        try:
1412
            userId = long(userId)
1413
            status = str(status)
1414
            appUserApprovedCashBacks = user_app_cashbacks.query.filter(user_app_cashbacks.user_id==userId).filter(user_app_cashbacks.status==status).all()
1415
            cashbackArray = []
1416
            if appUserApprovedCashBacks is None or len(appUserApprovedCashBacks)==0:
1417
                resp.body = json.dumps("{}")
1418
            else:
1419
                totalAmount = 0                
1420
                for appUserApprovedCashBack in appUserApprovedCashBacks:
1421
                    totalAmount = totalAmount + appUserApprovedCashBack.amount
16895 manish.sha 1422
                    if appUserApprovedCashBack.creditedDate is not None:
1423
                        appUserApprovedCashBack.creditedDate = str(appUserApprovedCashBack.creditedDate)  
16905 manish.sha 1424
                    cashbackArray.append(todict(appUserApprovedCashBack)) 
1425
 
16887 kshitij.so 1426
                resp.body = json.dumps({"UserAppCashBack":cashbackArray,"TotalAmount":totalAmount}, encoding='utf-8')
1427
        finally:
1428
            session.close()
17278 naman 1429
 
1430
class GetSaleDetail():
1431
    def on_get(self,req,res,date_val):
1432
        try:
1433
                db = get_mongo_connection()
1434
                sum=0
1435
                count=0
1436
                #print date_val, type(date_val)
1437
                #cursor = db.Dtr.merchantOrder.find({'createdOnInt':{'$lt':long(date_val)},'subOrders':{'$exists':True}})
17315 naman 1438
                cursor = db.Dtr.merchantOrder.find({"$and": [ { "createdOnInt":{"$gt":long(date_val)} }, {"createdOnInt":{"$lt":long(date_val)+86401} } ],"subOrders":{"$exists":True}})
17278 naman 1439
 
1440
                for document in cursor:
1441
                    for doc in document['subOrders']:
1442
                        sum = sum + float(doc['amountPaid'])
1443
                        count = count + int(doc['quantity'])
1444
 
1445
                data = {"amount":sum , "quantity":count}
1446
 
1447
                res.body= json.dumps(data,encoding='utf-8')
1448
        finally:
1449
                session.close()
1450
 
17301 kshitij.so 1451
class DummyDeals():
17304 kshitij.so 1452
    def on_get(self,req, resp):
17301 kshitij.so 1453
        categoryId = req.get_param_as_int("categoryId")
1454
        offset = req.get_param_as_int("offset")
1455
        limit = req.get_param_as_int("limit")
1456
        result = Mongo.getDummyDeals(categoryId, offset, limit)
17556 kshitij.so 1457
        resp.body = dumps(result)
17301 kshitij.so 1458
 
17467 manas 1459
class PincodeValidation():
17498 amit.gupta 1460
    def on_get(self,req,resp,pincode):
17467 manas 1461
        json_data={}
1462
        cities=[]
1463
        print pincode
1464
        if len(str(pincode)) ==6:
19391 amit.gupta 1465
            listCities = list(session.query(Postoffices.taluk,Postoffices.state).distinct().filter(Postoffices.pincode==pincode).all())
17467 manas 1466
            if len(listCities)>0:
1467
                for j in listCities:
19391 amit.gupta 1468
                    if j.taluk != 'NA':
1469
                        cities.append(j.taluk)
17467 manas 1470
                json_data['cities'] = cities
1471
                json_data['state'] = listCities[0][1]
1472
                resp.body =  json.dumps(json_data)
1473
            else:
1474
                resp.body = json.dumps("{}")       
1475
        else:
1476
            resp.body = json.dumps("{}")
1477
        session.close()
17301 kshitij.so 1478
 
17556 kshitij.so 1479
class SearchDummyDeals():
1480
    def on_get(self,req,resp):
1481
        offset = req.get_param_as_int("offset")
1482
        limit = req.get_param_as_int("limit")
1483
        searchTerm = req.get_param("searchTerm")
1484
        result = Mongo.searchDummyDeals(searchTerm, limit, offset)
1485
        resp.body = dumps(result)
1486
 
1487
class DummyPricing:
17560 kshitij.so 1488
    def on_get(self, req, resp):
17556 kshitij.so 1489
        skuBundleId = req.get_param_as_int("skuBundleId")
1490
        result = Mongo.getDummyPricing(skuBundleId)
1491
        resp.body = dumps(result)
1492
 
1493
class DealObject:
17560 kshitij.so 1494
    def on_post(self, req, resp):
17569 kshitij.so 1495
        update = req.get_param_as_int("update")
17556 kshitij.so 1496
        try:
1497
            result_json = json.loads(req.stream.read(), encoding='utf-8')
1498
        except ValueError:
1499
            raise falcon.HTTPError(falcon.HTTP_400,
1500
                'Malformed JSON',
1501
                'Could not decode the request body. The '
1502
                'JSON was incorrect.')
17569 kshitij.so 1503
        if update is None:    
1504
            result = Mongo.addDealObject(result_json)
1505
        else:
1506
            result = Mongo.updateDealObject(result_json)
1507
 
17556 kshitij.so 1508
        resp.body = dumps(result)
17569 kshitij.so 1509
 
17556 kshitij.so 1510
 
17560 kshitij.so 1511
    def on_get(self, req, resp):
17567 kshitij.so 1512
        edit = req.get_param_as_int("edit")
1513
        if edit is None:
1514
            offset = req.get_param_as_int("offset")
1515
            limit = req.get_param_as_int("limit")
17560 kshitij.so 1516
 
17567 kshitij.so 1517
            result = Mongo.getAllDealObjects(offset, limit)
1518
            resp.body = dumps(result)
1519
        else:
1520
            id = req.get_param_as_int("id")
1521
            result = Mongo.getDealObjectById(id)
1522
            resp.body = dumps(result)
17560 kshitij.so 1523
 
17563 kshitij.so 1524
class DeleteDealObject:
1525
    def on_get(self, req, resp, id):
1526
        result = Mongo.deleteDealObject(int(id))
1527
        resp.body = dumps(result)
1528
 
17611 kshitij.so 1529
class FeaturedDealObject:
1530
    def on_get(self, req, resp):
1531
 
1532
        offset = req.get_param_as_int("offset")
1533
        limit = req.get_param_as_int("limit")
1534
 
1535
        result = Mongo.getAllFeaturedDealsForDealObject(offset, limit)
1536
        resp.body = dumps(result)
1537
 
17556 kshitij.so 1538
 
17611 kshitij.so 1539
    def on_post(self, req, resp):
1540
 
1541
 
1542
        try:
1543
            result_json = json.loads(req.stream.read(), encoding='utf-8')
1544
        except ValueError:
1545
            raise falcon.HTTPError(falcon.HTTP_400,
1546
                'Malformed JSON',
1547
                'Could not decode the request body. The '
1548
                'JSON was incorrect.')
1549
 
17613 kshitij.so 1550
        result = Mongo.addFeaturedDealForDealObject(result_json)
17611 kshitij.so 1551
        resp.body = json.dumps(result, encoding='utf-8')
1552
 
17615 kshitij.so 1553
class DeleteFeaturedDealObject:
1554
    def on_get(self, req, resp, id):
1555
        result = Mongo.deleteFeaturedDealObject(int(id))
1556
        resp.body = dumps(result)
17611 kshitij.so 1557
 
17653 kshitij.so 1558
class SubCategoryFilter:
1559
    def on_get(self, req, resp):
1560
        category_id = req.get_param_as_int("category_id")
1561
        result = Mongo.getSubCategoryForFilter(category_id)
1562
        resp.body = dumps(result)
1563
 
17726 kshitij.so 1564
class DummyLogin:
1565
    def on_post(self,req,resp):
1566
        try:
1567
            result_json = json.loads(req.stream.read(), encoding='utf-8')
1568
        except ValueError:
1569
            raise falcon.HTTPError(falcon.HTTP_400,
1570
                'Malformed JSON',
1571
                'Could not decode the request body. The '
1572
                'JSON was incorrect.')
1573
 
1574
        result = Mongo.dummyLogin(result_json)
1575
        resp.body = json.dumps(result, encoding='utf-8')
17653 kshitij.so 1576
 
17726 kshitij.so 1577
class DummyRegister:
1578
    def on_post(self,req,resp):
1579
        try:
1580
            result_json = json.loads(req.stream.read(), encoding='utf-8')
1581
        except ValueError:
1582
            raise falcon.HTTPError(falcon.HTTP_400,
1583
                'Malformed JSON',
1584
                'Could not decode the request body. The '
1585
                'JSON was incorrect.')
1586
 
1587
        result = Mongo.dummyRegister(result_json)
1588
        resp.body = json.dumps(result, encoding='utf-8')
1589
 
18896 amit.gupta 1590
class TinSearch:
1591
    def on_get(self,req,resp):
1592
        tin = req.get_param("tin")
1593
        result = getTinInfo(tin)
1594
        resp.body = json.dumps(result, encoding='utf-8')
1595
 
1596
 
1597
def getTinInfo(tin):
1598
    try:
19718 amit.gupta 1599
        curData = session.query(tinxys_stats).filter_by(req_date=date.today()).first()
19666 amit.gupta 1600
        if not curData:
1601
            curData = tinxys_stats()
19718 amit.gupta 1602
            curData.total = 0
1603
            curData.request_failed = 0
1604
            curData.invalid_tin = 0
19666 amit.gupta 1605
        curData.total += 1
1606
        tinInfo = {"isError":False}
18995 amit.gupta 1607
        try:
19666 amit.gupta 1608
            params = ['tin','cst','counter_name','counter_address','state','pan','registered_on','cst_status','valid_since']
1609
            url  = "http://www.tinxsys.com/TinxsysInternetWeb/dealerControllerServlet?tinNumber=" + tin + "&searchBy=TIN"
1610
            req = urllib2.Request(url)
1611
            try:
1612
                connection = urllib2.urlopen(req, timeout=10)
1613
            except:
1614
                curData.request_failed += 1
1615
                tinInfo = {"isError":True,
1616
                        "errorMsg": "Some problem occurred. Try again after some time"
1617
                }
1618
                return tinInfo
1619
            pageHtml = connection.read()
1620
            connection.close()        
1621
            doc = pq(pageHtml)
1622
            index=-1
1623
            for ele in pq(doc.find('table')[2])('tr td:nth-child(2)'):
1624
                index += 1
1625
                text = pq(ele).text().strip()
1626
                if not text:
1627
                    text = pq(ele)('div').text().strip()
1628
                tinInfo[params[index]] = text
1629
            print index, "index"
1630
            if index != 8:
1631
                raise
1632
            if not get_mongo_connection().Dtr.tin.find({"tin":tinInfo['tin']}):
1633
                get_mongo_connection().Dtr.tin.insert(tinInfo)
1634
            address = tinInfo['counter_address']
1635
            m = re.match(".*?(\d{6}).*?", address)
1636
            if m:
1637
                tinInfo['pin'] = m.group(1)
1638
                tinInfo['pin_required'] = False
1639
            else:
1640
                tinInfo['pin_required'] = True
1641
 
1642
            print "TinNumber: Successfully fetched details", tin
18995 amit.gupta 1643
        except:
19666 amit.gupta 1644
            curData.invalid_tin = 1
1645
            traceback.print_exc()
18995 amit.gupta 1646
            tinInfo = {"isError":True,
19666 amit.gupta 1647
                        "errorMsg": "Could not find tin"
18995 amit.gupta 1648
            }
19666 amit.gupta 1649
            print "TinNumber: Problem fetching details", tin
1650
        session.commit()
1651
        return tinInfo
1652
    finally:
1653
        session.close()
18896 amit.gupta 1654
 
1655
 
17730 kshitij.so 1656
class UpdateUser:
1657
    def on_post(self,req,resp):
1658
        try:
1659
            result_json = json.loads(req.stream.read(), encoding='utf-8')
1660
        except ValueError:
1661
            raise falcon.HTTPError(falcon.HTTP_400,
1662
                'Malformed JSON',
1663
                'Could not decode the request body. The '
1664
                'JSON was incorrect.')
1665
 
1666
        result = Mongo.updateDummyUser(result_json)
1667
        resp.body = json.dumps(result, encoding='utf-8')
1668
 
1669
class FetchUser:
1670
    def on_get(self,req,resp):
1671
        user_id = req.get_param_as_int("user_id")
1672
        result = Mongo.getDummyUser(user_id)
1673
        resp.body = json.dumps(result, encoding='utf-8')
17928 kshitij.so 1674
 
1675
class SearchSubCategory:
1676
    def on_get(self,req, resp):
18088 kshitij.so 1677
        subCategoryIds = req.get_param("subCategoryId")
17928 kshitij.so 1678
        searchTerm = req.get_param("searchTerm")
1679
        offset = req.get_param_as_int("offset")
1680
        limit = req.get_param_as_int("limit")
17730 kshitij.so 1681
 
18088 kshitij.so 1682
        result = Mongo.getDealsForSearchText(subCategoryIds, searchTerm,offset, limit)
17928 kshitij.so 1683
        resp.body = json.dumps(result, encoding='utf-8')
1684
 
1685
class SearchSubCategoryCount:
1686
    def on_get(self,req, resp):
18088 kshitij.so 1687
        subCategoryIds = req.get_param("subCategoryId")
17928 kshitij.so 1688
        searchTerm = req.get_param("searchTerm")
18088 kshitij.so 1689
        result = Mongo.getCountForSearchText(subCategoryIds, searchTerm)
17928 kshitij.so 1690
        resp.body = json.dumps(result, encoding='utf-8')
18090 manas 1691
 
1692
class MessageEncryption:
1693
 
1694
    def on_get(self,req,resp):
1695
        message_type = req.get_param("type")
18093 manas 1696
        if message_type == 'encrypt':
18090 manas 1697
            encryption_data = req.get_param("data")
18101 manas 1698
            encrypted_data = encryptMessage(base64.decodestring(encryption_data))
18090 manas 1699
            resp.body =  json.dumps({"result":{"value":encrypted_data}}, encoding='utf-8')
1700
 
18093 manas 1701
        elif message_type == 'decrypt':
18090 manas 1702
            decryption_data = req.get_param("data")
1703
            decrypted_data = decryptMessage(decryption_data)
1704
            resp.body =  json.dumps({"result":{"value":decrypted_data}}, encoding='utf-8')
1705
 
1706
        else:
1707
            resp.body = json.dumps({}, encoding='utf-8')
18256 manas 1708
 
1709
class GetUserCrmApplication:
19442 manas 1710
 
18256 manas 1711
    def on_get(self,req,resp):
18329 manas 1712
        global USER_DETAIL_MAP
18256 manas 1713
        project_name = req.get_param("project_name")
18329 manas 1714
        USER_DETAIL_MAP[project_name]+=1
18386 manas 1715
        lgr.info( "USER_DETAIL_CALL_COUNTER " +  str(USER_DETAIL_MAP[project_name]))
18329 manas 1716
        retryFlag=False
1717
        if USER_DETAIL_MAP[project_name] % TOTAL_USER >= USER_CRM_DEFAULT_FRESH_FACTOR:
1718
                retryFlag=True
1719
        if project_name == 'accs_cart':
18792 manas 1720
            project_id=1
1721
        elif project_name == 'accs_active':
1722
            project_id=2
1723
        elif project_name == 'accs_order':
1724
            project_id=3
19442 manas 1725
        elif project_name == 'accs_cashback_scheme':
1726
            project_id=4
18792 manas 1727
        if retryFlag:
1728
            user = self.getRetryUser(project_id)
1729
        else:
1730
            user = self.getNewUser(project_id)
1731
 
1732
        if user is None:
1733
            resp.body ={}
1734
        else:        
1735
            user.status =  'assigned'
1736
            user.agent_id = req.get_param("agent_id")
1737
            user.counter=1
1738
            user.modified = datetime.now()
1739
            session.commit()
1740
            resp.body = json.dumps(todict(getUserObject(user)), encoding='utf-8')
1741
            session.close()
18620 manas 1742
 
18329 manas 1743
    def getRetryUser(self,projectId,failback=True):
1744
        status = "retry"
18367 manas 1745
        user = session.query(UserCrmCallingData).filter_by(status=status,project_id=projectId).filter(UserCrmCallingData.next_call_time<=datetime.now()).filter(~(UserCrmCallingData.contact1).like('')).order_by(UserCrmCallingData.next_call_time).with_lockmode("update").first()
18329 manas 1746
 
1747
        if user is not None:
18334 manas 1748
            lgr.info( "getRetryUser " + str(user.id))
18329 manas 1749
        else:
1750
            if failback:
18334 manas 1751
                user = self.getNewUser(projectId,False)
18329 manas 1752
                return user
1753
            else:
1754
                return None
1755
        return user
18291 manas 1756
 
18329 manas 1757
 
18331 manas 1758
    def getNewUser(self,projectId,failback=True):
18329 manas 1759
            user = None 
1760
            try:
18416 manas 1761
                user = session.query(UserCrmCallingData).filter_by(project_id=projectId).filter(UserCrmCallingData.status=='new').filter(UserCrmCallingData.pincode_servicable==True).filter(UserCrmCallingData.user_available==0).filter(UserCrmCallingData.contact1!=None).filter(~(UserCrmCallingData.contact1).like('')).order_by(UserCrmCallingData.next_call_time).order_by(UserCrmCallingData.id).with_lockmode("update").first()
18334 manas 1762
                if user is None:
1763
                    insertUserCrmData(projectId)
18416 manas 1764
                    user = session.query(UserCrmCallingData).filter_by(project_id=projectId).filter(UserCrmCallingData.status=='new').filter(UserCrmCallingData.pincode_servicable==True).filter(~(UserCrmCallingData.contact1).like('')).filter(UserCrmCallingData.user_available==0).filter(UserCrmCallingData.contact1!=None).order_by(UserCrmCallingData.next_call_time).order_by(UserCrmCallingData.id).with_lockmode("update").first()
18334 manas 1765
                    if user is not None:
1766
                        lgr.info( "getNewUser " + str(user.id))
1767
                    else:
1768
                        if failback:
1769
                            user = self.getRetryUser(projectId,False)
1770
                            return user
1771
                        else:
1772
                            return None
18329 manas 1773
            except:
1774
                print traceback.print_exc()
1775
            return user    
18386 manas 1776
 
18291 manas 1777
    def on_post(self, req, resp):
1778
        returned = False
1779
        self.agentId = req.get_param("agent_id")
1780
        project_name = req.get_param("project_name")
18637 manas 1781
 
18329 manas 1782
        if project_name == 'accs_cart':
18637 manas 1783
            project_id=1
1784
        elif project_name == 'accs_active':
1785
            project_id=2            
1786
        elif project_name == 'accs_order':
1787
            project_id=3            
19442 manas 1788
        elif project_name == 'accs_cashback_scheme':
1789
            project_id=4
1790
 
18637 manas 1791
        jsonReq = json.loads(req.stream.read(), encoding='utf-8')
1792
        lgr.info( "Request ----\n"  + str(jsonReq))
1793
        self.jsonReq = jsonReq
1794
        self.callType="default"
1795
        callLaterAccs = self.callLaterAccs
1796
        accsDisposition = self.accsDisposition
1797
        accsOrderDisposition=self.accsOrderDisposition
1798
        self.userId = int(jsonReq.get('user_id'))
1799
        try:
1800
            self.user = session.query(UserCrmCallingData).filter_by(user_id=self.userId).filter(UserCrmCallingData.project_id==project_id).first()
1801
            self.callDisposition = jsonReq.get('calldispositiontype')
1802
            self.callHistoryCrm = CallHistoryCrm()
1803
            self.callHistoryCrm.agent_id=self.agentId
1804
            self.callHistoryCrm.project_id = project_id
1805
            self.callHistoryCrm.call_disposition = self.callDisposition
1806
            self.callHistoryCrm.user_id=self.userId
1807
            self.callHistoryCrm.duration_sec = int(jsonReq.get("callduration"))
1808
            self.callHistoryCrm.disposition_comments = jsonReq.get('calldispositioncomments')
1809
            self.callHistoryCrm.call_time = datetime.strptime(jsonReq.get("calltime"), '%d/%m/%Y %H:%M:%S')
1810
            self.callHistoryCrm.mobile_number = jsonReq.get('number')
1811
            self.inputs = jsonReq.get("inputs")
1812
            dispositionMap = {  'call_later':callLaterAccs,
1813
                        'ringing_no_answer':callLaterAccs,
1814
                        'not_reachable':callLaterAccs,
1815
                        'switch_off':callLaterAccs,
1816
                        'technical_issue':accsDisposition,
1817
                        'pricing_issue':accsDisposition,
1818
                        'shipping_issue':accsDisposition,
1819
                        'internet_issue':accsDisposition,
1820
                        'checking_price':accsDisposition,
1821
                        'order_process':accsDisposition,
1822
                        'placed_order':accsDisposition,
1823
                        'place_order':accsDisposition,
1824
                        'product_availability':accsOrderDisposition,
1825
                        'return_replacement':accsOrderDisposition,
1826
                        'already_purchased':accsOrderDisposition,
1827
                        'product_quality_issue':accsOrderDisposition,
1828
                        'delayed_delivery':accsOrderDisposition,
18671 manas 1829
                        'other_complaint':accsOrderDisposition,
19442 manas 1830
                        'scheme_not_clear':accsOrderDisposition,
18671 manas 1831
                        'not_dealing_accessories':accsOrderDisposition
18637 manas 1832
                      }
1833
            returned = dispositionMap[jsonReq.get('calldispositiontype')]()
1834
        finally:
1835
            session.close()
1836
 
1837
        if returned:
1838
            resp.body = "{\"result\":\"success\"}"
1839
        else:
1840
            resp.body = "{\"result\":\"failed\"}"
1841
 
18628 manas 1842
    def accsOrderDisposition(self):
1843
        self.user.status='done'
1844
        self.user.user_available = 1
1845
        self.user.disposition=self.callDisposition
1846
        self.user.modified = datetime.now()
18712 manas 1847
        a = CrmTicketDtr()
18628 manas 1848
        if self.callDisposition == 'product_availability':
1849
            self.callHistoryCrm.disposition_description='Product Not available'
1850
        elif self.callDisposition == 'return_replacement':
1851
            self.callHistoryCrm.disposition_description='Return or replacement pending'
18923 manas 1852
            #utils.sendCrmProjectMail(self.userId,self.callHistoryCrm.disposition_description,self.callHistoryCrm.disposition_comments)
18713 manas 1853
            a.addTicket(self.userId, self.callHistoryCrm.disposition_description, self.callHistoryCrm.disposition_comments)
18628 manas 1854
        elif self.callDisposition == 'already_purchased':
1855
            self.callHistoryCrm.disposition_description='Already purchased required stock'
19442 manas 1856
        elif self.callDisposition == 'scheme_not_clear':
1857
            self.callHistoryCrm.disposition_description='Scheme Not Clear to the User'
18628 manas 1858
        elif self.callDisposition == 'product_quality_issue':
1859
            self.callHistoryCrm.disposition_description='Product Quality issue'
18923 manas 1860
            #utils.sendCrmProjectMail(self.userId,self.callHistoryCrm.disposition_description,self.callHistoryCrm.disposition_comments)
18713 manas 1861
            a.addTicket(self.userId, self.callHistoryCrm.disposition_description, self.callHistoryCrm.disposition_comments)            
18628 manas 1862
        elif self.callDisposition == 'delayed_delivery':
18637 manas 1863
            self.callHistoryCrm.disposition_description='Delayed Delivery' 
18923 manas 1864
            #utils.sendCrmProjectMail(self.userId,self.callHistoryCrm.disposition_description,self.callHistoryCrm.disposition_comments)
18713 manas 1865
            a.addTicket(self.userId, self.callHistoryCrm.disposition_description, self.callHistoryCrm.disposition_comments)   
18628 manas 1866
        elif self.callDisposition == 'other_complaint':
18637 manas 1867
            self.callHistoryCrm.disposition_description='Other complaint with profitmandi'
18923 manas 1868
            #utils.sendCrmProjectMail(self.userId,self.callHistoryCrm.disposition_description,self.callHistoryCrm.disposition_comments)
18713 manas 1869
            a.addTicket(self.userId, self.callHistoryCrm.disposition_description, self.callHistoryCrm.disposition_comments)
18671 manas 1870
        elif self.callDisposition == 'not_dealing_accessories':
1871
            self.callHistoryCrm.disposition_description='Not Dealing in Accessories/Not Interested'        
18628 manas 1872
        session.commit()
1873
        jdata = self.inputs
1874
        jdata = json.loads(jdata)
1875
        if jdata:
1876
            for d in jdata:
1877
                for key, value in d.iteritems():
1878
                    productpricingInputs = ProductPricingInputs()
1879
                    productpricingInputs.user_id = self.callHistoryCrm.user_id
1880
                    productpricingInputs.agent_id = self.callHistoryCrm.agent_id
1881
                    productpricingInputs.disposition_id = self.callHistoryCrm.id
1882
                    productpricingInputs.user_id = self.callHistoryCrm.user_id
1883
                    productpricingInputs.call_disposition = self.callHistoryCrm.call_disposition
1884
                    productpricingInputs.project_id = self.callHistoryCrm.project_id
1885
                    productpricingInputs.product_input = key
1886
                    productpricingInputs.pricing_input = value
1887
            session.commit()        
1888
        return True
1889
 
18291 manas 1890
    def accsDisposition(self):
1891
        self.user.status='done'
1892
        self.user.user_available = 1
1893
        self.user.disposition=self.callDisposition
1894
        self.user.modified = datetime.now()
1895
        if self.callDisposition == 'technical_issue':
1896
            self.callHistoryCrm.disposition_description='Technical issue at Profitmandi'
18923 manas 1897
            #utils.sendCrmProjectMail(self.userId,self.callHistoryCrm.disposition_description,self.callHistoryCrm.disposition_comments)
18716 manas 1898
            a = CrmTicketDtr()
1899
            a.addTicket(self.userId, self.callHistoryCrm.disposition_description, self.callHistoryCrm.disposition_comments)
18291 manas 1900
        elif self.callDisposition == 'pricing_issue':
1901
            self.callHistoryCrm.disposition_description='Pricing Issue(High)'
1902
        elif self.callDisposition == 'shipping_issue':
1903
            self.callHistoryCrm.disposition_description='Shipping charges related issue'
1904
        elif self.callDisposition == 'internet_issue':
1905
            self.callHistoryCrm.disposition_description='Internet issue at user end'
1906
        elif self.callDisposition == 'checking_price':
1907
            self.callHistoryCrm.disposition_description='Checking price'    
1908
        elif self.callDisposition == 'order_process':
1909
            self.callHistoryCrm.disposition_description='Order Process inquery'    
1910
        elif self.callDisposition == 'placed_order':
1911
            self.callHistoryCrm.disposition_description='Placed Order from Different Account'    
1912
        elif self.callDisposition == 'place_order':
1913
            self.callHistoryCrm.disposition_description='Will Place Order'            
1914
        session.commit()
18360 manas 1915
        jdata = self.inputs
18361 manas 1916
        jdata = json.loads(jdata)
18350 manas 1917
        if jdata:
1918
            for d in jdata:
18360 manas 1919
                for key, value in d.iteritems():
18350 manas 1920
                    productpricingInputs = ProductPricingInputs()
1921
                    productpricingInputs.user_id = self.callHistoryCrm.user_id
1922
                    productpricingInputs.agent_id = self.callHistoryCrm.agent_id
1923
                    productpricingInputs.disposition_id = self.callHistoryCrm.id
1924
                    productpricingInputs.user_id = self.callHistoryCrm.user_id
1925
                    productpricingInputs.call_disposition = self.callHistoryCrm.call_disposition
1926
                    productpricingInputs.project_id = self.callHistoryCrm.project_id
1927
                    productpricingInputs.product_input = key
1928
                    productpricingInputs.pricing_input = value
1929
            session.commit()        
18291 manas 1930
        return True
1931
 
1932
    def callLaterAccs(self):
18329 manas 1933
        self.user.status='retry'
1934
        self.user.modified = datetime.now()
18291 manas 1935
        if self.callDisposition == 'call_later':
18310 manas 1936
            if self.callHistoryCrm.disposition_comments is not None:
18321 manas 1937
                self.user.next_call_time = datetime.strptime(self.callHistoryCrm.disposition_comments, '%d/%m/%Y %H:%M:%S')
18310 manas 1938
                self.callHistoryCrm.disposition_description = 'User requested to call'
1939
                self.callHistoryCrm.disposition_comments = self.callHistoryCrm.disposition_comments
18291 manas 1940
            else:
1941
                self.user.next_call_time = self.callHistoryCrm.call_time + timedelta(days=1)
18310 manas 1942
                self.callHistoryCrm.disposition_description = 'Call Scheduled'
1943
                self.callHistoryCrm.disposition_comments = datetime.strftime(self.user.next_call_time, '%d/%m/%Y %H:%M:%S')
18291 manas 1944
        else: 
18310 manas 1945
            self.callHistoryCrm.disposition_description = 'User was not contactable'
18291 manas 1946
            if self.callDisposition == 'ringing_no_answer':
1947
                if self.user.disposition == 'ringing_no_answer':
1948
                    self.user.retry_count += 1
1949
                else:
1950
                    self.user.disposition = 'ringing_no_answer'
1951
                    self.user.retry_count = 1
1952
            else:
1953
                if self.user.disposition == 'ringing_no_answer':
1954
                    pass
1955
                else:
1956
                    self.user.disposition = 'not_reachable'
1957
                self.user.retry_count += 1
1958
                self.user.invalid_retry_count += 1
1959
 
18306 manas 1960
            retryConfig = session.query(RetryConfig).filter_by(call_type=self.callType, disposition_type=self.user.disposition, retry_count=self.user.retry_count).first()
1961
            if retryConfig is not None:
1962
                self.user.next_call_time = self.callHistoryCrm.call_time + timedelta(minutes = retryConfig.minutes_ahead)
1963
                self.callHistoryCrm.disposition_description = 'Call scheduled on ' + datetime.strftime(self.user.next_call_time, '%d/%m/%Y %H:%M:%S')
1964
            else:
1965
                self.user.status = 'failed'
18335 manas 1966
                self.user.user_available=1
18306 manas 1967
                self.callHistoryCrm.disposition_description = 'Call failed as all attempts exhausted'
18329 manas 1968
        self.user.disposition=self.callDisposition        
18291 manas 1969
        session.commit()
18347 manas 1970
        jdata =self.inputs
18361 manas 1971
        jdata = json.loads(jdata)
18350 manas 1972
        if jdata: 
1973
            for d in jdata:
18360 manas 1974
                for key, value in d.iteritems():
18350 manas 1975
                    productpricingInputs = ProductPricingInputs()
1976
                    productpricingInputs.user_id = self.callHistoryCrm.user_id
1977
                    productpricingInputs.agent_id = self.callHistoryCrm.agent_id
1978
                    productpricingInputs.disposition_id = self.callHistoryCrm.id
1979
                    productpricingInputs.user_id = self.callHistoryCrm.user_id
1980
                    productpricingInputs.call_disposition = self.callHistoryCrm.call_disposition
1981
                    productpricingInputs.project_id = self.callHistoryCrm.project_id
1982
                    productpricingInputs.product_input = key
1983
                    productpricingInputs.pricing_input = value
1984
            session.commit()        
18291 manas 1985
        return True
1986
 
18266 manas 1987
def insertUserCrmData(project_id):
1988
    if project_id==1:  
1989
        getCartDetailsUser()
18386 manas 1990
    if project_id==2:  
1991
        getCartTabsUser()
18620 manas 1992
    if project_id==3:
1993
        getAccsRepeatUsers(project_id)
19442 manas 1994
    if project_id==4:
1995
        getAccsSchemeCashback(project_id)
1996
 
1997
def getAccsSchemeCashback(project_id):
1998
    userMasterMap={}
1999
    skipUserList=[]
19444 manas 2000
    query = "select id from users where lower(referrer) in ('emp01','emp99','emp88')"
19442 manas 2001
    skipUsersresult = fetchResult(query)
2002
    for skipUser in skipUsersresult:
2003
        skipUserList.append(skipUser[0])
2004
    queryFilter = {"user_id":{"$nin":skipUserList}}
2005
    result = get_mongo_connection().Catalog.PromoOffer.find(queryFilter)
2006
    userMasterList =[]
2007
    for r in result:
2008
        userMasterList.append(r.get('user_id'))
2009
    queryfilter ={"url":{"$regex" : "http://api.profittill.com/categories/target"}}
2010
    result = get_mongo_connection_dtr_data().User.browsinghistories.find(queryfilter).distinct('user_id')
2011
    userSeenList=[]
2012
    for r in result:
2013
        userSeenList.append(r)
2014
    finalUserList  = list(set(userMasterList) - set(userSeenList))
2015
    queryFilter = {"user_id":{"$in":finalUserList}}
2016
    result = get_mongo_connection().Catalog.PromoOffer.find(queryFilter)
2017
    for r in result:
2018
        userMasterMap[r.get('user_id')] = r.get('target2')
2019
    d_sorted = sorted(zip(userMasterMap.values(), userMasterMap.keys()),reverse=True)
2020
    counter=0
2021
    for i in d_sorted:
2022
        try:
2023
            userId=i[1]
2024
            if counter==20:
2025
                break
2026
            userPresent = session.query(UserCrmCallingData).filter_by(user_id=userId).order_by(desc(UserCrmCallingData.modified)).first()
2027
            if userPresent is not None:
2028
                if userPresent.user_available==1:
2029
                    if userPresent.project_id==project_id:
2030
                        continue                        
2031
                    elif userPresent.modified.date()>=(datetime.now().date()-timedelta(days=30)):
2032
                        continue
2033
                else:
2034
                    continue               
2035
            counter=counter+1
2036
            userMasterData = UserCrmCallingData()
2037
            userMasterData.user_id = userId 
2038
            userMasterData.name =getUsername(userId) 
2039
            userMasterData.project_id = project_id
2040
            userMasterData.user_available=0
2041
            userMasterData.contact1 = getUserContactDetails(userId)
2042
            userMasterData.counter = 0
2043
            userMasterData.retry_count=0
2044
            userMasterData.invalid_retry_count=0
2045
            userMasterData.created = datetime.now()
2046
            userMasterData.modified = datetime.now()
2047
            userMasterData.status = 'new'
2048
            userMasterData.pincode_servicable = checkPincodeServicable(userId)
2049
            session.commit()
2050
        except:
2051
            print traceback.print_exc()
2052
        finally:
2053
            session.close()
2054
 
18620 manas 2055
def getAccsRepeatUsers(project_id):
2056
 
2057
    usersMasterList=[]
2058
    ACCS_ALL_ORDERS = "select distinct user_id from allorder where category in ('Accs','Accessories') and store_id='spice';"
2059
    result = fetchResult(ACCS_ALL_ORDERS)
2060
    for r in result:
2061
        usersMasterList.append(r[0])
2062
 
2063
    ACCS_LAST_FIFTEEN_DAYS = "select distinct user_id from allorder where category in ('Accs','Accessories') and store_id='spice' and (date(created_on) between date(curdate() - interval 15 day) and date(curdate())) order by user_id;"
2064
    result = fetchResult(ACCS_LAST_FIFTEEN_DAYS)
2065
    for r in result:
2066
        if r[0] in usersMasterList:
2067
            usersMasterList.remove(r[0])        
2068
 
2069
    PRIOPRITIZING_USER_QUERY = "select user_id from allorder where category in ('Accs','Accessories')and store_id ='spice' and user_id in (%s)" % ",".join(map(str,usersMasterList)) + "group by user_id order by sum(amount_paid) desc;"
2070
    userFinalList=[]
2071
    result = fetchResult(PRIOPRITIZING_USER_QUERY)
2072
    for r in result:
2073
        userFinalList.append(r[0])
2074
 
2075
    counter=0
2076
    for i in userFinalList:
2077
        try:
2078
            userId=i
18628 manas 2079
            if counter==20:
18620 manas 2080
                break
2081
            userPresent = session.query(UserCrmCallingData).filter_by(user_id=userId).order_by(desc(UserCrmCallingData.modified)).first()
2082
            if userPresent is not None:
2083
                if userPresent.user_available==1:
2084
                    if userPresent.project_id==project_id:
2085
                        if userPresent.modified.date()>=(datetime.now().date()-timedelta(days=30)):
2086
                            continue
2087
                        else:
2088
                            pass    
18792 manas 2089
                    elif userPresent.modified.date()>=(datetime.now().date()-timedelta(days=30)):
18620 manas 2090
                        continue
2091
                else:
2092
                    continue     
2093
            counter=counter+1
2094
            userMasterData = UserCrmCallingData()
2095
            userMasterData.user_id = userId 
2096
            userMasterData.name =getUsername(userId) 
2097
            userMasterData.project_id = project_id
2098
            userMasterData.user_available=0
2099
            userMasterData.contact1 = getUserContactDetails(userId)
2100
            userMasterData.counter = 0
2101
            userMasterData.retry_count=0
2102
            userMasterData.invalid_retry_count=0
2103
            userMasterData.created = datetime.now()
2104
            userMasterData.modified = datetime.now()
2105
            userMasterData.status = 'new'
2106
            userMasterData.pincode_servicable = checkPincodeServicable(userId)
2107
            session.commit()
2108
        except:
2109
            print traceback.print_exc()
2110
        finally:
2111
            session.close()
2112
 
18256 manas 2113
def getCartDetailsUser():
2114
    userList=[]
2115
    orderUserList=[]
18818 manas 2116
    #userMasterMap={}
18256 manas 2117
    queryfilter = {"$and":
2118
                   [
18792 manas 2119
                    {'created':{"$gte":(to_java_date(datetime.now())-3*86400000)}},
18256 manas 2120
                    {'created':{"$lte":(to_java_date(datetime.now())- 43200000)}},
2121
                    {"url":{"$regex" : "http://api.profittill.com/cartdetails"}}
2122
                    ]
2123
                   }
2124
    result = get_mongo_connection_dtr_data().User.browsinghistories.find(queryfilter).distinct('user_id')
2125
 
2126
    for r in result:
2127
        userList.append(r)
2128
 
18301 manas 2129
    myquery = "select a.user_id from allorder a join users u on a.user_id=u.id where a.store_id='spice' and (a.category='Accs' or a.category='Accessories') and u.referrer not like 'emp%%' and u.mobile_number IS NOT NULL and a.user_id in (%s)" % ",".join(map(str,userList)) + " UNION select id from users where lower(referrer) like 'emp%'"
2130
 
18256 manas 2131
    result = fetchResult(myquery)
2132
    for r in result:
18301 manas 2133
        orderUserList.append(r[0])
18256 manas 2134
    finalUserList  = list(set(userList) - set(orderUserList))
2135
 
18792 manas 2136
    userCartIdMap={}
2137
    fetchCartId = "select user_id,account_key from user_accounts where account_type='cartId' and user_id in (%s)" % ",".join(map(str,finalUserList))
2138
    result = fetchResult(fetchCartId)
2139
    for r in result:
18818 manas 2140
        userCartIdMap[long(r[1])] = long(r[0])
18843 manas 2141
    client = CatalogClient("catalog_service_server_host_prod","catalog_service_server_port").get_client()
18792 manas 2142
    userMapReturned = client.getCartByValue(userCartIdMap.keys())
18818 manas 2143
    userFinalList=[]
2144
    for i in userMapReturned:
2145
        userFinalList.append(userCartIdMap.get(i))
18792 manas 2146
#     queryfilternew = {"$and":
2147
#                    [
2148
#                     {'user_id':{"$in":finalUserList}},
2149
#                     {'created':{"$gte":(to_java_date(datetime.now())-2*86400000)}},
2150
#                     {'created':{"$lte":(to_java_date(datetime.now())- 43200000)}},
2151
#                     {"url":{"$regex" : "http://api.profittill.com/cartdetails"}}
2152
#                     ]
2153
#                    }
2154
#     itemIds = list(get_mongo_connection_dtr_data().User.browsinghistories.find(queryfilternew))
2155
#      
2156
#     for i in itemIds:
2157
#         if(userMasterMap.has_key(i.get('user_id'))):
2158
#             if userMasterMap.get(i.get('user_id')) > i.get('created'):
2159
#                 userMasterMap[i.get('user_id')]=i.get('created')
2160
#         else:
2161
#             userMasterMap[i.get('user_id')]=i.get('created')
2162
#             
2163
#     d_sorted = sorted(zip(userMasterMap.values(), userMasterMap.keys()))
18818 manas 2164
    addUserToTable(userFinalList,1)
18256 manas 2165
 
18301 manas 2166
def addUserToTable(userList,projectId):
18266 manas 2167
    counter=0
18301 manas 2168
    for i in userList:
2169
        try:
18792 manas 2170
            userId=i
18412 manas 2171
            if counter==20:
18301 manas 2172
                break
2173
            userPresent = session.query(UserCrmCallingData).filter_by(user_id=userId).order_by(desc(UserCrmCallingData.modified)).first()
2174
            if userPresent is not None:
2175
                if userPresent.user_available==1:
2176
                    if userPresent.project_id==projectId:
2177
                        continue
18792 manas 2178
                    elif userPresent.modified.date()>=(datetime.now().date()-timedelta(days=30)):
18301 manas 2179
                        continue
18306 manas 2180
                else:
2181
                    continue     
18266 manas 2182
            counter=counter+1
2183
            userMasterData = UserCrmCallingData()
2184
            userMasterData.user_id = userId 
2185
            userMasterData.name =getUsername(userId) 
18301 manas 2186
            userMasterData.project_id = projectId
18277 manas 2187
            userMasterData.user_available=0
18266 manas 2188
            userMasterData.contact1 = getUserContactDetails(userId)
2189
            userMasterData.counter = 0
18318 manas 2190
            userMasterData.retry_count=0
2191
            userMasterData.invalid_retry_count=0
18266 manas 2192
            userMasterData.created = datetime.now()
2193
            userMasterData.modified = datetime.now()
2194
            userMasterData.status = 'new'
2195
            userMasterData.pincode_servicable = checkPincodeServicable(userId)
2196
            session.commit()
18301 manas 2197
        except:
2198
            print traceback.print_exc()
2199
        finally:
2200
            session.close()    
2201
 
18256 manas 2202
def getCartTabsUser():
18346 manas 2203
    userMasterList=[]
2204
    userList = []
18256 manas 2205
    userMasterMap={}
2206
    queryfilter = {"$and":
2207
                   [
2208
                    {'created':{"$gte":(to_java_date(datetime.now())-2*86400000)}},
2209
                    {'created':{"$lte":(to_java_date(datetime.now())- 43200000)}},
2210
                    {"url":{"$regex" : "http://api.profittill.com/category/6"}}
2211
                    ]
2212
                   }
2213
    result = get_mongo_connection_dtr_data().User.browsinghistories.find(queryfilter).distinct('user_id')
2214
 
2215
    for r in result:
18346 manas 2216
        userMasterList.append(r)
2217
 
2218
    queryfilterVisistedCart = {"$and":
2219
                   [
18386 manas 2220
                    {'user_id':{"$in":userMasterList}},
18346 manas 2221
                    {"url":{"$regex" : "http://api.profittill.com/cartdetails"}}
2222
                    ]
2223
                  }
18386 manas 2224
    result = get_mongo_connection_dtr_data().User.browsinghistories.find(queryfilterVisistedCart).distinct('user_id')   
18346 manas 2225
    for r in result:
18256 manas 2226
        userList.append(r)
2227
 
18416 manas 2228
    myquery = "select user_id from allorder where store_id='spice' and (category='Accs' or category='Accessories') and user_id in (%s)" % ",".join(map(str,userMasterList)) + " UNION select id from users where lower(referrer) like 'emp%'"
18256 manas 2229
 
2230
    result = fetchResult(myquery)
2231
    for r in result:
18346 manas 2232
        if r[0] in userList:
2233
            continue
2234
        userList.append(r[0])
18386 manas 2235
 
18346 manas 2236
    finalUserList  = list(set(userMasterList) - set(userList))
18386 manas 2237
 
18256 manas 2238
    queryfilternew = {"$and":
2239
                   [
2240
                    {'user_id':{"$in":finalUserList}},
2241
                    {'created':{"$gte":(to_java_date(datetime.now())-2*86400000)}},
2242
                    {'created':{"$lte":(to_java_date(datetime.now())- 43200000)}},
2243
                    {"url":{"$regex" : "http://api.profittill.com/category/6"}}
2244
                    ]
2245
                   }
2246
    itemIds = list(get_mongo_connection_dtr_data().User.browsinghistories.find(queryfilternew))
2247
 
2248
    for i in itemIds:
2249
        if(userMasterMap.has_key(i.get('user_id'))):
2250
            if userMasterMap.get(i.get('user_id')) > i.get('created'):
2251
                userMasterMap[i.get('user_id')]=i.get('created')
2252
        else:
2253
            userMasterMap[i.get('user_id')]=i.get('created')
2254
 
2255
    d_sorted = sorted(zip(userMasterMap.values(), userMasterMap.keys()))
18792 manas 2256
    userFinalList=[]
2257
    for i in d_sorted:
2258
        userFinalList.append(i[1])
2259
    addUserToTable(userFinalList,2)
18346 manas 2260
 
18266 manas 2261
def getUserContactDetails(userId):
18792 manas 2262
    r = session.query(Users.mobile_number).filter_by(id=userId).first()
2263
    if r is None:
2264
        return None
2265
    else:
2266
        return r[0]
18712 manas 2267
 
18266 manas 2268
def getUsername(userId):
18792 manas 2269
    r = session.query(Users.first_name).filter_by(id=userId).first()
2270
    if r is None:
2271
        return None
2272
    else:
2273
        return r[0]
2274
 
18266 manas 2275
def checkPincodeServicable(userId):
2276
    checkAddressUser = "select distinct pincode from all_user_addresses where user_id= (%s)"
2277
    result = fetchResult(checkAddressUser,userId)
2278
    if len(result)==0:
2279
        return True
2280
    else:
2281
        myquery = "select count(*) from (select distinct pincode from all_user_addresses where user_id= (%s))a join pincodeavailability p on a.pincode=p.code"
2282
        result = fetchResult(myquery,userId)
2283
        if result[0][0]==0:
2284
            return False
2285
        else:
2286
            return True
2287
 
2288
def getUserObject(user):
2289
    obj = Mock()
2290
    obj.user_id = user.user_id
2291
    result = fetchResult("select * from useractive where user_id=%d"%(user.user_id))
2292
    if result == ():
2293
        obj.last_active = None
2294
    else:
2295
        obj.last_active =datetime.strftime(result[0][1], '%d/%m/%Y %H:%M:%S')
18269 manas 2296
    obj.name = user.name    
18266 manas 2297
    obj.contact = user.contact1
18275 manas 2298
    obj.lastOrderTimestamp=None
18256 manas 2299
 
18275 manas 2300
    details = session.query(Orders).filter_by(user_id = user.user_id).filter(~Orders.status.in_(['ORDER_NOT_CREATED_KNOWN','ORDER_NOT_CREATED_UNKNOWN', 'ORDER_ALREADY_CREATED_IGNORED'])).order_by(desc(Orders.created)).first()
18266 manas 2301
    if details is None:
18275 manas 2302
        obj.lastOrderTimestamp =None
18266 manas 2303
    else:
18366 manas 2304
        obj.lastOrderTimestamp =datetime.strftime(details.created, '%d/%m/%Y %H:%M:%S')
18275 manas 2305
    obj.totalOrders = session.query(Orders).filter_by(user_id = user.user_id).filter(~Orders.status.in_(['ORDER_NOT_CREATED_KNOWN','ORDER_NOT_CREATED_UNKNOWN', 'ORDER_ALREADY_CREATED_IGNORED'])).count()
18266 manas 2306
 
18275 manas 2307
    cartResult = fetchResult("select account_key from user_accounts where account_type ='cartId' and user_id=%d"%(user.user_id))
18266 manas 2308
    if cartResult == ():
18268 manas 2309
        obj.lastActiveCartTime = None
18266 manas 2310
    else:
2311
        conn = MySQLdb.connect("192.168.190.114", "root","shop2020", "user")
2312
        cursor = conn.cursor()
18275 manas 2313
        cursor.execute("select updated_on from cart where id=%s",(cartResult[0][0]))
18266 manas 2314
        result = cursor.fetchall()
2315
        if result ==():
18268 manas 2316
            obj.lastActiveCartTime = None
18266 manas 2317
        else:
2318
            print result
18275 manas 2319
            obj.lastActiveCartTime =datetime.strftime(result[0][0], '%d/%m/%Y %H:%M:%S')
18712 manas 2320
        conn.close()
2321
 
2322
    session.close()                
18266 manas 2323
    return obj
2324
 
18709 manas 2325
class CrmTicketDtr():
2326
    def on_post(self,req,resp):
18712 manas 2327
        try:
2328
            customerFeedbackBackMap = {}
2329
            customerFeedbackBackMap['user_id']=req.get_param("user_id")
2330
            user = session.query(Users).filter_by(id=customerFeedbackBackMap.get('user_id')).first()
2331
            if user is not None:
2332
                customerFeedbackBackMap['email']=user.email
2333
                customerFeedbackBackMap['mobile_number']=user.mobile_number
2334
                customerFeedbackBackMap['customer_name']=user.first_name + ' ' + user.last_name
2335
                customerFeedbackBackMap['subject'] = req.get_param("subject")
2336
                customerFeedbackBackMap['message'] = req.get_param("message")
2337
                customerFeedbackBackMap['created'] = datetime.now()
2338
                if utils.generateCrmTicket(customerFeedbackBackMap):
2339
                    resp.body={"result":"success"}
2340
                else:
2341
                    resp.body={"result":"failure"}    
18709 manas 2342
            else:
18712 manas 2343
                resp.body={"result":"failure"}
2344
        except:
2345
            print traceback.print_exc()
2346
        finally:
2347
            session.close()            
18709 manas 2348
    def addTicket(self,user_id,subject,message):
18712 manas 2349
        try:
2350
            customerFeedbackBackMap = {}
2351
            customerFeedbackBackMap['user_id']=user_id
2352
            user = session.query(Users).filter_by(id=user_id).first()
2353
            if user is not None:
2354
                customerFeedbackBackMap['email']=user.email
2355
                customerFeedbackBackMap['mobile_number']=user.mobile_number
2356
                customerFeedbackBackMap['customer_name']=user.first_name + ' ' + user.last_name
2357
                customerFeedbackBackMap['subject'] = subject
2358
                customerFeedbackBackMap['message'] = message
2359
                customerFeedbackBackMap['created'] = datetime.now()
19651 manas 2360
                ThriftUtils.generateCrmTicket(customerFeedbackBackMap)
18712 manas 2361
            else:
2362
                print 'User is not present'
2363
        except:
18926 manas 2364
            print traceback.print_exc()                
2365
 
18272 kshitij.so 2366
class UnitDeal():
2367
    def on_get(self,req,resp, id):
2368
        result = Mongo.getDealById(id)
2369
        resp.body = dumps(result)
19290 kshitij.so 2370
 
2371
class SpecialOffer():
2372
    def on_get(self,req,resp):
2373
        user_id = req.get_param_as_int('user_id')
2374
        result = Mongo.getOfferForUser(user_id)
2375
        resp.body = dumps(result)
19388 kshitij.so 2376
 
2377
class BrandSubCatFilter():
2378
    def on_get(self, req, resp):
2379
        category_id = req.get_param_as_int('category_id')
2380
        id_list = req.get_param('id_list')
2381
        type = req.get_param('type')
2382
        result = Mongo.getBrandSubCategoryInfo(category_id, id_list, type)
2383
        resp.body = dumps(result)
19444 manas 2384
 
19451 manas 2385
class RefundAmountWallet():
2386
    def on_post(self,req,resp):
2387
        jsonReq = json.loads(req.stream.read(), encoding='utf-8')
2388
        if Mongo.refundAmountInWallet(jsonReq):
2389
            resp.body = "{\"result\":\"success\"}"
2390
        else:
2391
            resp.body = "{\"result\":\"failed\"}"
2392
 
2393
    def on_get(self,req,resp):
2394
        offset = req.get_param_as_int("offset")
2395
        limit = req.get_param_as_int("limit")
2396
        status = req.get_param("status")
19529 manas 2397
        if status: 
2398
            userRefundDetails = Mongo.fetchCrmRefundUsers(status,offset,limit)
2399
        else:
2400
            userRefundDetails = Mongo.fetchCrmRefundUsers(None,offset,limit)
19454 manas 2401
        if userRefundDetails is not None:
19457 manas 2402
            resp.body = dumps(userRefundDetails)
19454 manas 2403
        else:
2404
            resp.body ="{}"
19463 manas 2405
 
2406
class RefundWalletStatus():
2407
    def on_post(self,req,resp):
2408
        status = req.get_param('status')
2409
        jsonReq = json.loads(req.stream.read(), encoding='utf-8')
19479 manas 2410
        user_id = int(jsonReq.get('user_id'))
19463 manas 2411
        _id = jsonReq.get('_id')
2412
        if status == utils.REFUND_ADJUSTMENT_MAP.get(1):
19475 manas 2413
            value = int(jsonReq.get('amount'))
2414
            userAmountMap = {}
19469 manas 2415
            datetimeNow = datetime.now()
2416
            batchId = int(time.mktime(datetimeNow.timetuple()))
19475 manas 2417
            userAmountMap[user_id] = value
19497 manas 2418
            Mongo.updateCrmWalletStatus(status, _id,user_id,None,None)
19475 manas 2419
            if refundToWallet(batchId,userAmountMap):
2420
                refundType = jsonReq.get('type')
19497 manas 2421
                approved_by = jsonReq.get('approved_by')
19475 manas 2422
                get_mongo_connection().Dtr.refund.insert({"userId": user_id, "batch":batchId, "userAmount":value, "timestamp":datetime.strftime(datetimeNow,"%Y-%m-%d %H:%M:%S"), "type":refundType})
2423
                get_mongo_connection().Dtr.user.update({"userId":user_id}, {"$inc": { "credited": value, refundType:value}}, upsert=True)
19497 manas 2424
                Mongo.updateCrmWalletStatus(utils.REFUND_ADJUSTMENT_MAP.get(3), _id,user_id,batchId,approved_by)
19475 manas 2425
                print user_id,value                
19556 manas 2426
                Mongo.sendNotification([user_id], 'Batch Credit', 'Cashback Credited for %ss'%(str(refundType)), 'Rs.%s has been added to your wallet'%(value),'url', 'http://api.profittill.com/cashbacks/mine?user_id=%s'%(user_id), '2999-01-01', True, "TRAN_SMS Dear Customer, Cashback Credited for %ss. Rs.%s has been added to your wallet"%(refundType,value))
19475 manas 2427
                resp.body = "{\"result\":\"success\"}"
2428
            else:
2429
                resp.body = "{\"result\":\"failed\"}"
19463 manas 2430
        elif status == utils.REFUND_ADJUSTMENT_MAP.get(2):
19497 manas 2431
            Mongo.updateCrmWalletStatus(status, _id,user_id,None,None)
19469 manas 2432
            resp.body = "{\"result\":\"success\"}"
2433
        else:
2434
            resp.body = "{\"result\":\"failed\"}"
19485 manas 2435
 
2436
class DetailsBatchId():
2437
    def on_get(self,req,resp):
2438
        batchId = req.get_param('batchId')
2439
        userRefundDetails = Mongo.fetchCrmRefundByBatchId(batchId)        
2440
        if userRefundDetails is not None:
19493 manas 2441
            resp.body = dumps(list(userRefundDetails))
19485 manas 2442
        else:
2443
            resp.body ="{}"
19654 kshitij.so 2444
 
2445
class HeaderLinks():
2446
    def on_get(self, req, resp):
2447
        category_id = req.get_param_as_int('category_id')
2448
        result = Mongo.getHeaderLinks(category_id)
2449
        resp.body = dumps(result)
19485 manas 2450
 
15312 amit.gupta 2451
def main():
18386 manas 2452
    a = RetailerDetail()
2453
    retailer = a.getNotActiveRetailer()
2454
    otherContacts = [r for r, in session.query(RetailerContacts.mobile_number).filter_by(retailer_id=retailer.id).order_by(RetailerContacts.contact_type).all()]
2455
    print json.dumps(todict(getRetailerObj(retailer, otherContacts, 'fresh')), encoding='utf-8')
15195 manas 2456
 
15081 amit.gupta 2457
if __name__ == '__main__':
18901 amit.gupta 2458
    #main()
19484 manas 2459
    print getTinInfo('07740388453')