Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
9881 kshitij.so 1
from elixir import *
2
from shop2020.config.client.ConfigClient import ConfigClient
3
from shop2020.model.v1.catalog.impl import DataService
4
from shop2020.model.v1.catalog.impl.DataService import SnapdealItem, MarketplaceItems, Item, \
5
Category, SourcePercentageMaster, MarketPlaceHistory
6
from shop2020.thriftpy.model.v1.order.ttypes import OrderSource
9897 kshitij.so 7
from shop2020.thriftpy.model.v1.catalog.ttypes import CompetitionCategory, CompetitionBasis, SalesPotential,\
8
Decision
9881 kshitij.so 9
from shop2020.clients.CatalogClient import CatalogClient
10
from shop2020.clients.InventoryClient import InventoryClient
11
import urllib2
12
import time
13
from datetime import date, datetime
14
import simplejson as json
15
import sys
16
 
17
config_client = ConfigClient()
18
host = config_client.get_property('staging_hostname')
19
DataService.initialize(db_hostname=host)
9897 kshitij.so 20
import logging
21
lgr = logging.getLogger()
22
lgr.setLevel(logging.DEBUG)
23
fh = logging.FileHandler('snapdeal-history.log')
24
fh.setLevel(logging.INFO)
25
frmt = logging.Formatter('%(asctime)s - %(name)s - %(message)s')
26
fh.setFormatter(frmt)
27
lgr.addHandler(fh)
9881 kshitij.so 28
 
29
class __Exception:
30
    SERVER_SIDE=1
31
 
32
 
33
class __SnapdealDetails:
34
    def __init__(self, ourSp, ourInventory, otherInventory, rank, lowestSellerName, lowestSellerCode,lowestSp,secondLowestSellerName, secondLowestSellerCode,secondLowestSellerSp,secondLowestSellerInventory,lowestOfferPrice,secondLowestSellerOfferPrice,ourOfferPrice, totalSeller):
35
        self.ourSp = ourSp
36
        self.ourOfferPrice = ourOfferPrice
37
        self.ourInventory = ourInventory
38
        self.otherInventory = otherInventory
39
        self.rank = rank
40
        self.lowestSellerName = lowestSellerName
41
        self.lowestSellerCode = lowestSellerCode 
42
        self.lowestSp = lowestSp
43
        self.lowestOfferPrice = lowestOfferPrice
44
        self.secondLowestSellerName = secondLowestSellerName
45
        self.secondLowestSellerCode = secondLowestSellerCode
46
        self.secondLowestSellerSp = secondLowestSellerSp
47
        self.secondLowestSellerOfferPrice = secondLowestSellerOfferPrice
48
        self.secondLowestSellerInventory = secondLowestSellerInventory
49
        self.totalSeller = totalSeller
50
 
51
class __SnapdealItemInfo:
52
 
53
    def __init__(self, supc, nlc, courierCost, item_id, product_group, brand, model_name, model_number, color, weight, parent_category, risky, warehouseId, vatRate):
54
        self.supc = supc
55
        self.nlc = nlc
56
        self.courierCost = courierCost
57
        self.item_id = item_id
58
        self.product_group = product_group
59
        self.brand = brand
60
        self.model_name = model_name
61
        self.model_number = model_number
62
        self.color = color
63
        self.weight = weight
64
        self.parent_category = parent_category
65
        self.risky = risky
66
        self.warehouseId = warehouseId
67
        self.vatRate = vatRate
68
 
69
class __SnapdealPricing:
70
 
71
    def __init__(self, ourSp, ourTp, lowestTp, lowestPossibleTp, competitionBasis, secondLowestSellerTp, lowestPossibleSp):
72
        self.ourTp = ourTp
73
        self.lowestTp = lowestTp
74
        self.lowestPossibleTp = lowestPossibleTp
75
        self.competitionBasis = competitionBasis
76
        self.ourSp = ourSp
77
        self.secondLowestSellerTp = secondLowestSellerTp
78
        self.lowestPossibleSp = lowestPossibleSp
79
 
9897 kshitij.so 80
def fetchItemsForAutoDecrease(time):
9920 kshitij.so 81
    autoDecrementItems = session.query(MarketPlaceHistory).join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
82
    .filter(MarketPlaceHistory.timestamp==time).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.COMPETITIVE)\
83
    .filter(MarketplaceItems.source==OrderSource.SNAPDEAL).filter(MarketplaceItems.autoDecrement==True).all()
84
    #autoDecrementItems = MarketplaceItems.query.filter(MarketplaceItems.autoDecrement==True).filter(MarketplaceItems.source==OrderSource.SNAPDEAL).all()
9897 kshitij.so 85
    inventory_client = InventoryClient().get_client()
86
    inventoryMap = inventory_client.getInventorySnapshot(0)
87
    for autoDecrementItem in autoDecrementItems:
9920 kshitij.so 88
        #mpHistory = MarketPlaceHistory.get_by(source=OrderSource.SNAPDEAL,item_id=autoDecrementItem.itemId,timestamp=time)
89
        if not autoDecrementItem.competitiveCategory == CompetitionCategory.COMPETITIVE:
90
            markReasonForMpItem(autoDecrementItem,'Category is '+CompetitionCategory._VALUES_TO_NAMES.get(autoDecrementItem.competitiveCategory),Decision.AUTO_DECREMENT_FAILED)
9914 kshitij.so 91
            continue
9920 kshitij.so 92
        if not autoDecrementItem.risky:
93
            markReasonForMpItem(autoDecrementItem,'Item is not risky',Decision.AUTO_DECREMENT_FAILED)
9897 kshitij.so 94
            continue
9920 kshitij.so 95
        if autoDecrementItem.proposedSellingPrice >= autoDecrementItem.ourSellingPrice:
96
            markReasonForMpItem(autoDecrementItem,'Proposed SP greater than current SP',Decision.AUTO_DECREMENT_FAILED)
9897 kshitij.so 97
            continue
9920 kshitij.so 98
        if autoDecrementItem.otherInventory < 3:
99
            markReasonForMpItem(autoDecrementItem,'Competition stock is not enough',Decision.AUTO_DECREMENT_FAILED)
9897 kshitij.so 100
            continue
9920 kshitij.so 101
        oosStatus = inventory_client.getOosStatusesForXDaysForItem(autoDecrementItem.item_id,0,3)
9897 kshitij.so 102
        count,sale,daysOfStock = 0,0,0
103
        for obj in oosStatus:
104
            if not obj.is_oos:
105
                count+=1
106
                sale = sale+obj.num_orders
107
        avgSalePerDay=0 if count==0 else (float(sale)/count)
108
        totalAvailability, totalReserved = 0,0
9920 kshitij.so 109
        if (not inventoryMap.has_key(autoDecrementItem.item_id)):
110
            markReasonForMpItem(autoDecrementItem,'Average sale per day is zero',Decision.AUTO_DECREMENT_FAILED)
9913 kshitij.so 111
            continue
9920 kshitij.so 112
        itemInventory=inventoryMap[autoDecrementItem.item_id]
9897 kshitij.so 113
        availableMap  = itemInventory.availability
114
        reserveMap = itemInventory.reserved
115
        for warehouse,availability in availableMap.iteritems():
116
            if warehouse==16:
117
                continue
118
            totalAvailability = totalAvailability+availability
119
        for warehouse,reserve in reserveMap.iteritems():
120
            if warehouse==16:
121
                continue
122
            totalReserved = totalReserved+reserve
123
        if (totalAvailability-totalReserved)<=0:
9920 kshitij.so 124
            markReasonForMpItem(autoDecrementItem,'Our stock is not enough',Decision.AUTO_DECREMENT_FAILED)
9897 kshitij.so 125
            continue
9912 kshitij.so 126
        if (avgSalePerDay==0):
9920 kshitij.so 127
            markReasonForMpItem(autoDecrementItem,'Average sale per day is zero',Decision.AUTO_DECREMENT_FAILED)
9912 kshitij.so 128
            continue
9897 kshitij.so 129
        daysOfStock = (float(totalAvailability-totalReserved))/avgSalePerDay
130
        if daysOfStock<2:
9920 kshitij.so 131
            markReasonForMpItem(autoDecrementItem,'Our stock is not enough',Decision.AUTO_DECREMENT_FAILED)
9897 kshitij.so 132
            continue
133
 
9920 kshitij.so 134
        autoDecrementItem.competitorEnoughStock = True
135
        autoDecrementItem.ourEnoughStock = True
136
        autoDecrementItem.avgSales = avgSalePerDay
137
        autoDecrementItem.decision = Decision.AUTO_DECREMENT_SUCCESS
138
        autoDecrementItem.reason = 'All conditions for auto decrement true'
139
        lgr.info("Auto decrement success for itemId "+str(autoDecrementItem.item_id)+" Days of stock "+str(daysOfStock)+" avg sales "+str(avgSalePerDay))
9897 kshitij.so 140
    session.commit()
141
 
142
def fetchItemsForAutoIncrease(time):
9920 kshitij.so 143
    autoIncrementItems = session.query(MarketPlaceHistory).join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
144
    .filter(MarketPlaceHistory.timestamp==time).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.BUY_BOX)\
145
    .filter(MarketplaceItems.source==OrderSource.SNAPDEAL).filter(MarketplaceItems.autoIncrement==True).all()
146
    #autoIncrementItems = MarketplaceItems.query.filter(MarketplaceItems.autoIncrement==True).filter(MarketplaceItems.source==OrderSource.SNAPDEAL).all()
9897 kshitij.so 147
    inventory_client = InventoryClient().get_client()
148
    inventoryMap = inventory_client.getInventorySnapshot(0)
149
    for autoIncrementItem in autoIncrementItems:
9920 kshitij.so 150
        #mpHistory = MarketPlaceHistory.get_by(source=OrderSource.SNAPDEAL,item_id=autoIncrementItem.itemId,timestamp=time)
151
        if not autoIncrementItem.competitiveCategory == CompetitionCategory.BUY_BOX:
152
            markReasonForMpItem(autoIncrementItem,'Category is '+CompetitionCategory._VALUES_TO_NAMES.get(autoIncrementItem.competitiveCategory),Decision.AUTO_INCREMENT_FAILED)
9897 kshitij.so 153
            continue
9920 kshitij.so 154
        if autoIncrementItem.totalSeller==1 and autoIncrementItem.ourRank==1:
155
            markReasonForMpItem(autoIncrementItem,'We are the only seller',Decision.AUTO_INCREMENT_FAILED)
9897 kshitij.so 156
            continue
9920 kshitij.so 157
        if autoIncrementItem.proposedSellingPrice <= autoIncrementItem.ourSellingPrice:
158
            markReasonForMpItem(autoIncrementItem,'Proposed SP less than current SP',Decision.AUTO_INCREMENT_FAILED)
9919 kshitij.so 159
            continue
9920 kshitij.so 160
        oosStatus = inventory_client.getOosStatusesForXDaysForItem(autoIncrementItem.item_id,0,3)
9897 kshitij.so 161
        count,sale,daysOfStock = 0,0,0
162
        for obj in oosStatus:
163
            if not obj.is_oos:
164
                count+=1
165
                sale = sale+obj.num_orders
166
        avgSalePerDay=0 if count==0 else (float(sale)/count)
167
        totalAvailability, totalReserved = 0,0
9920 kshitij.so 168
        if (not inventoryMap.has_key(autoIncrementItem.item_id)):
169
            markReasonForMpItem(autoIncrementItem,'Average sale per day is zero',Decision.AUTO_INCREMENT_FAILED)
9913 kshitij.so 170
            continue
9920 kshitij.so 171
        itemInventory=inventoryMap[autoIncrementItem.item_id]
9897 kshitij.so 172
        availableMap  = itemInventory.availability
173
        reserveMap = itemInventory.reserved
174
        for warehouse,availability in availableMap.iteritems():
175
            if warehouse==16:
176
                continue
177
            totalAvailability = totalAvailability+availability
178
        for warehouse,reserve in reserveMap.iteritems():
179
            if warehouse==16:
180
                continue
181
            totalReserved = totalReserved+reserve
182
        if (totalAvailability-totalReserved)<=0:
9920 kshitij.so 183
            markReasonForMpItem(autoIncrementItem,'Our stock is 0',Decision.AUTO_INCREMENT_FAILED)
9897 kshitij.so 184
            continue
9912 kshitij.so 185
        if (avgSalePerDay==0):
9920 kshitij.so 186
            markReasonForMpItem(autoIncrementItem,'Average sale per day is zero',Decision.AUTO_INCREMENT_FAILED)
9912 kshitij.so 187
            continue
9897 kshitij.so 188
        daysOfStock = (float(totalAvailability-totalReserved))/avgSalePerDay
189
        if daysOfStock>5:
9920 kshitij.so 190
            markReasonForMpItem(autoIncrementItem,'Our stock is enough',Decision.AUTO_INCREMENT_FAILED)
9897 kshitij.so 191
            continue
192
 
9920 kshitij.so 193
        autoIncrementItem.ourEnoughStock = False
194
        autoIncrementItem.avgSales = avgSalePerDay
195
        autoIncrementItem.decision = Decision.AUTO_INCREMENT_SUCCESS
196
        autoIncrementItem.reason = 'All conditions for auto increment true'
197
        lgr.info("Auto increment success for itemId "+str(autoIncrementItem.item_id)+" Days of stock "+str(daysOfStock)+" avg sales "+str(avgSalePerDay))
9897 kshitij.so 198
    session.commit()
199
 
200
 
201
def markReasonForMpItem(mpHistory,reason,decision):
202
    mpHistory.decision = decision
203
    mpHistory.reason = reason
204
 
9881 kshitij.so 205
def fetchDetails(supc_code):
206
    url="http://www.snapdeal.com/json/gvbps?supc=%s&catId=91"%(supc_code)
207
    print url
208
    time.sleep(1)
209
    req = urllib2.Request(url)
210
    response = urllib2.urlopen(req)
211
    json_input = response.read()
212
    vendorInfo = json.loads(json_input)
213
    rank ,otherInventory ,ourInventory, ourOfferPrice, ourSp, iterator, secondLowestSellerSp, secondLowestSellerInventory, \
214
    lowestOfferPrice,  secondLowestSellerOfferPrice = (0,)*10
215
    lowestSellerName , lowestSellerCode, secondLowestSellerName, secondLowestSellerCode=('',)*4
216
    for vendor in vendorInfo:
217
        if iterator == 0:
218
            lowestSellerName = vendor['vendorDisplayName']
219
            lowestSellerCode = vendor['vendorCode']
220
            try:
221
                lowestSp = vendor['sellingPriceBefIntCashBack']
222
            except:
223
                lowestSp = vendor['sellingPrice']
224
            lowestOfferPrice = vendor['sellingPrice']
225
 
226
        if iterator ==1:
227
            secondLowestSellerName = vendor['vendorDisplayName']
228
            secondLowestSellerCode =vendor['vendorCode']
229
            try:
230
                secondLowestSellerSp = vendor['sellingPriceBefIntCashBack']
231
            except:
232
                secondLowestSellerSp = vendor['sellingPrice'] 
233
            secondLowestSellerOfferPrice = vendor['sellingPrice'] 
234
            secondLowestSellerInventory = vendor['buyableInventory']
235
 
236
        if vendor['vendorDisplayName'] == 'MobilesnMore':
237
            ourInventory = vendor['buyableInventory']
238
            try:
239
                ourSp = vendor['sellingPriceBefIntCashBack']
240
            except:
241
                ourSp = vendor['sellingPrice']
242
            ourOfferPrice = vendor['sellingPrice']
243
            rank = iterator +1
244
        else:
245
            if rank==0:
246
                otherInventory = otherInventory +vendor['buyableInventory']
247
        iterator+=1
248
    snapdealDetails = __SnapdealDetails(ourSp,ourInventory,otherInventory,rank,lowestSellerName, lowestSellerCode,lowestSp,secondLowestSellerName,secondLowestSellerCode,secondLowestSellerSp,secondLowestSellerInventory,lowestOfferPrice,secondLowestSellerOfferPrice,ourOfferPrice,len(vendorInfo))
249
    return snapdealDetails        
250
 
251
 
252
def populateStuff():
253
    itemInfo = []
254
    items = session.query(SnapdealItem).all()
255
    spm = SourcePercentageMaster.get_by(source=OrderSource.SNAPDEAL)
256
    for snapdeal_item in items:
257
        it = Item.query.filter_by(id=snapdeal_item.item_id).one()
258
        category = Category.query.filter_by(id=it.category).one()
259
        snapdealItemInfo = __SnapdealItemInfo(snapdeal_item.supc, snapdeal_item.maxNlc,snapdeal_item.courierCost, it.id, it.product_group, it.brand, it.model_name, it.model_number, it.color, it.weight, category.parent_category_id, it.risky, snapdeal_item.warehouseId, None)
260
        itemInfo.append(snapdealItemInfo)
261
    return itemInfo, spm
262
 
263
 
264
def decideCategory(itemInfo,spm):
265
    cantCompete, buyBoxItems, competitive, competitiveNoInventory, exceptionItems, negativeMargin = [],[],[],[],[],[]
266
    catalog_client = CatalogClient().get_client()
267
    inventory_client = InventoryClient().get_client()
268
 
269
    for val in itemInfo:
270
        try:
271
            snapdealDetails = fetchDetails(val.supc)
272
        except:
273
            exceptionItems.append(val)
274
            continue
275
        mpItem = MarketplaceItems.get_by(itemId=val.item_id,source=OrderSource.SNAPDEAL)
276
        warehouse = inventory_client.getWarehouse(val.warehouseId)
277
        if snapdealDetails.rank==0:
278
            snapdealDetails.ourSp = mpItem.currentSp
279
            snapdealDetails.ourOfferPrice = mpItem.currentSp
280
            ourSp = mpItem.currentSp
281
        else:
282
            ourSp = snapdealDetails.ourSp
283
        vatRate = catalog_client.getVatPercentageForItem(val.item_id, warehouse.stateId, snapdealDetails.ourSp)
284
        val.vatRate = vatRate
285
        if (snapdealDetails.rank==1):
286
            temp=[]
287
            temp.append(snapdealDetails)
288
            temp.append(val)
289
            if (snapdealDetails.secondLowestSellerOfferPrice == snapdealDetails.secondLowestSellerSp) and snapdealDetails.ourOfferPrice==snapdealDetails.ourSp:
290
                competitionBasis = 'SP'
291
            else:
292
                competitionBasis = 'TP'
293
            secondLowestTp=0 if snapdealDetails.totalSeller==1 else getOtherTp(snapdealDetails,val,spm)
294
            snapdealPricing = __SnapdealPricing(snapdealDetails.ourSp,getOurTp(snapdealDetails,val,spm,mpItem),None,getLowestPossibleTp(snapdealDetails,val,spm,mpItem),competitionBasis,secondLowestTp,getLowestPossibleSp(snapdealDetails,val,spm,mpItem))
295
            temp.append(snapdealPricing)
296
            temp.append(mpItem)
297
            buyBoxItems.append(temp)
298
            continue
299
 
300
 
301
        lowestTp = getOtherTp(snapdealDetails,val,spm)
302
        ourTp = getOurTp(snapdealDetails,val,spm,mpItem)
303
        lowestPossibleTp = getLowestPossibleTp(snapdealDetails,val,spm,mpItem)
304
        lowestPossibleSp = getLowestPossibleSp(snapdealDetails,val,spm,mpItem)
305
 
306
        if (ourTp<lowestPossibleTp):
307
            temp=[]
308
            temp.append(snapdealDetails)
309
            temp.append(val)
310
            snapdealPricing = __SnapdealPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,None,None,None)
311
            temp.append(snapdealPricing)
312
            negativeMargin.append(temp)
313
            continue
314
 
315
        if (snapdealDetails.lowestOfferPrice == snapdealDetails.lowestSp) and snapdealDetails.ourOfferPrice == snapdealDetails.ourSp:
316
            competitionBasis ='SP'
317
        else:
318
            competitionBasis ='TP'
319
 
320
        if competitionBasis=='SP':
321
            if snapdealDetails.lowestSp > lowestPossibleSp and snapdealDetails.ourInventory!=0:
322
                temp=[]
323
                temp.append(snapdealDetails)
324
                temp.append(val)
325
                snapdealPricing = __SnapdealPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,'SP',None,lowestPossibleSp)
326
                temp.append(snapdealPricing)
327
                temp.append(mpItem)
328
                competitive.append(temp)
329
                continue
330
        else:
331
            if lowestTp > lowestPossibleTp and snapdealDetails.ourInventory!=0:
332
                temp=[]
333
                temp.append(snapdealDetails)
334
                temp.append(val)
335
                snapdealPricing = __SnapdealPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,'TP',None,lowestPossibleSp)
336
                temp.append(snapdealPricing)
337
                temp.append(mpItem)
338
                competitive.append(temp)
339
                continue
340
 
341
        if competitionBasis=='SP':
342
            if snapdealDetails.lowestSp > lowestPossibleSp and snapdealDetails.ourInventory==0:
343
                temp=[]
344
                temp.append(snapdealDetails)
345
                temp.append(val)
346
                snapdealPricing = __SnapdealPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,'SP',None,lowestPossibleSp)
347
                temp.append(snapdealPricing)
348
                temp.append(mpItem)
349
                competitiveNoInventory.append(temp)
350
                continue
351
        else:
352
            if lowestTp > lowestPossibleTp and snapdealDetails.ourInventory==0:
353
                temp=[]
354
                temp.append(snapdealDetails)
355
                temp.append(val)
356
                snapdealPricing = __SnapdealPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,'TP',None,lowestPossibleSp)
357
                temp.append(snapdealPricing)
358
                temp.append(mpItem)
359
                competitiveNoInventory.append(temp)
360
                continue
361
 
362
        temp=[]
363
        temp.append(snapdealDetails)
364
        temp.append(val)
365
        snapdealPricing = __SnapdealPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,competitionBasis,None,lowestPossibleSp)
366
        temp.append(snapdealPricing)
367
        temp.append(mpItem)
368
        cantCompete.append(temp)
369
 
370
    return cantCompete, buyBoxItems, competitive, competitiveNoInventory, exceptionItems, negativeMargin    
371
 
372
 
373
def commitExceptionList(exceptionList,timestamp):
374
    for item in exceptionList:
375
        mpHistory = MarketPlaceHistory()
376
        mpHistory.item_id =item.item_id
377
        mpHistory.source = OrderSource.SNAPDEAL 
378
        mpHistory.competitiveCategory = CompetitionCategory.EXCEPTION
379
        mpHistory.risky = item.risky
380
        mpHistory.timestamp = timestamp
381
    session.commit()
382
 
383
def commitNegativeMargin(negativeMargin,timestamp):
384
    for item in negativeMargin:
385
        snapdealDetails = item[0]
386
        snapdealItemInfo = item[1]
387
        snapdealPricing = item[2]
388
        mpHistory = MarketPlaceHistory()
389
        mpHistory.item_id = snapdealItemInfo.item_id
390
        mpHistory.source = OrderSource.SNAPDEAL
391
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
392
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
393
        mpHistory.ourTp = snapdealPricing.ourTp
9919 kshitij.so 394
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
9881 kshitij.so 395
        mpHistory.ourNlc = snapdealItemInfo.nlc
396
        mpHistory.ourInventory = snapdealDetails.ourInventory
397
        mpHistory.otherInventory = snapdealDetails.otherInventory
398
        mpHistory.ourRank = snapdealDetails.rank
9919 kshitij.so 399
        mpHistory.risky = snapdealItemInfo.risky
400
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp  
9881 kshitij.so 401
        mpHistory.competitiveCategory = CompetitionCategory.NEGATIVE_MARGIN
402
        mpHistory.totalSeller = snapdealDetails.totalSeller
403
        mpHistory.timestamp = timestamp
404
    session.commit()
405
 
406
def commitCompetitive(competitive,timestamp):
407
    for item in competitive:
408
        snapdealDetails = item[0]
409
        snapdealItemInfo = item[1]
410
        snapdealPricing = item[2]
411
        mpItem = item[3]
412
        mpHistory = MarketPlaceHistory()
413
        mpHistory.item_id = snapdealItemInfo.item_id
414
        mpHistory.source = OrderSource.SNAPDEAL
415
        mpHistory.lowestTp = snapdealPricing.lowestTp
416
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
417
        mpHistory.lowestPossibleSp = snapdealPricing.lowestPossibleSp
418
        mpHistory.ourInventory = snapdealDetails.ourInventory
419
        mpHistory.otherInventory = snapdealDetails.otherInventory
420
        mpHistory.ourRank = snapdealDetails.rank
421
        mpHistory.competitionBasis = CompetitionBasis._NAMES_TO_VALUES.get(snapdealPricing.competitionBasis)
422
        mpHistory.competitiveCategory = CompetitionCategory.COMPETITIVE
423
        mpHistory.risky = snapdealItemInfo.risky
424
        mpHistory.lowestOfferPrice = snapdealDetails.lowestOfferPrice
425
        mpHistory.lowestSellingPrice = snapdealDetails.lowestSp
426
        mpHistory.lowestSellerName = snapdealDetails.lowestSellerName
427
        mpHistory.lowestSellerCode = snapdealDetails.lowestSellerCode
428
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
429
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
430
        mpHistory.ourTp = snapdealPricing.ourTp
431
        mpHistory.ourNlc = snapdealItemInfo.nlc
432
        if (snapdealPricing.competitionBasis=='SP'):
433
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)), snapdealPricing.lowestPossibleSp)
434
            proposed_tp = getTargetTp(proposed_sp,mpItem)
435
            mpHistory.proposedSellingPrice = proposed_sp
436
            mpHistory.proposedTp = proposed_tp
437
        else:
438
            proposed_tp  = max(snapdealPricing.lowestTp - max((10, snapdealPricing.lowestTp*0.001)), snapdealPricing.lowestPossibleTp)
439
            proposed_sp = getTargetSp(proposed_tp,mpItem)
440
            mpHistory.proposedSellingPrice = proposed_sp
441
            mpHistory.proposedTp = proposed_tp
9919 kshitij.so 442
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
9881 kshitij.so 443
        mpHistory.totalSeller = snapdealDetails.totalSeller
444
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
445
        mpHistory.timestamp = timestamp
446
    session.commit()
447
 
448
def commitCompetitiveNoInventory(competitiveNoInventory,timestamp):
449
    for item in competitiveNoInventory:
450
        snapdealDetails = item[0]
451
        snapdealItemInfo = item[1]
452
        snapdealPricing = item[2]
453
        mpItem = item[3]
454
        mpHistory = MarketPlaceHistory()
455
        mpHistory.item_id = snapdealItemInfo.item_id
456
        mpHistory.source = OrderSource.SNAPDEAL
457
        mpHistory.lowestTp = snapdealPricing.lowestTp
458
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
459
        mpHistory.lowestPossibleSp = snapdealPricing.lowestPossibleSp
460
        mpHistory.ourInventory = snapdealDetails.ourInventory
461
        mpHistory.otherInventory = snapdealDetails.otherInventory
462
        mpHistory.ourRank = snapdealDetails.rank
463
        mpHistory.competitionBasis = CompetitionBasis._NAMES_TO_VALUES.get(snapdealPricing.competitionBasis)
464
        mpHistory.competitiveCategory = CompetitionCategory.COMPETITIVE_NO_INVENTORY
465
        mpHistory.risky = snapdealItemInfo.risky
466
        mpHistory.lowestOfferPrice = snapdealDetails.lowestOfferPrice
467
        mpHistory.lowestSellingPrice = snapdealDetails.lowestSp
468
        mpHistory.lowestSellerName = snapdealDetails.lowestSellerName
469
        mpHistory.lowestSellerCode = snapdealDetails.lowestSellerCode
470
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
471
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
472
        mpHistory.ourTp = snapdealPricing.ourTp
473
        mpHistory.ourNlc = snapdealItemInfo.nlc
474
        if (snapdealPricing.competitionBasis=='SP'):
475
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)), snapdealPricing.lowestPossibleSp)
476
            proposed_tp = getTargetTp(proposed_sp,mpItem)
477
            mpHistory.proposedSellingPrice = proposed_sp
478
            mpHistory.proposedTp = proposed_tp
479
        else:
480
            proposed_tp  = max(snapdealPricing.lowestTp - max((10, snapdealPricing.lowestTp*0.001)), snapdealPricing.lowestPossibleTp)
481
            proposed_sp = getTargetSp(proposed_tp,mpItem)
482
            mpHistory.proposedSellingPrice = proposed_sp
483
            mpHistory.proposedTp = proposed_tp
9919 kshitij.so 484
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
9881 kshitij.so 485
        mpHistory.totalSeller = snapdealDetails.totalSeller
486
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
487
        mpHistory.timestamp = timestamp
488
    session.commit()
489
 
490
def commitCantCompete(cantCompete,timestamp):
491
    for item in cantCompete:
492
        snapdealDetails = item[0]
493
        snapdealItemInfo = item[1]
494
        snapdealPricing = item[2]
495
        mpItem = item[3]
496
        mpHistory = MarketPlaceHistory()
497
        mpHistory.item_id = snapdealItemInfo.item_id
498
        mpHistory.source = OrderSource.SNAPDEAL
499
        mpHistory.lowestTp = snapdealPricing.lowestTp
500
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
501
        mpHistory.lowestPossibleSp = snapdealPricing.lowestPossibleSp
502
        mpHistory.ourInventory = snapdealDetails.ourInventory
503
        mpHistory.otherInventory = snapdealDetails.otherInventory
504
        mpHistory.ourRank = snapdealDetails.rank
505
        mpHistory.competitionBasis = CompetitionBasis._NAMES_TO_VALUES.get(snapdealPricing.competitionBasis)
506
        mpHistory.competitiveCategory = CompetitionCategory.CANT_COMPETE
507
        mpHistory.risky = snapdealItemInfo.risky
508
        mpHistory.lowestOfferPrice = snapdealDetails.lowestOfferPrice
509
        mpHistory.lowestSellingPrice = snapdealDetails.lowestSp
510
        mpHistory.lowestSellerName = snapdealDetails.lowestSellerName
511
        mpHistory.lowestSellerCode = snapdealDetails.lowestSellerCode
512
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
513
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
514
        mpHistory.ourTp = snapdealPricing.ourTp
515
        mpHistory.ourNlc = snapdealItemInfo.nlc
516
        if (snapdealPricing.competitionBasis=='SP'):
517
            proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001)
518
            proposed_tp = getTargetTp(proposed_sp,mpItem)
519
            target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
520
            mpHistory.proposedSellingPrice = proposed_sp
521
            mpHistory.proposedTp = proposed_tp
522
            mpHistory.targetNlc = target_nlc
523
        else:
524
            proposed_tp  = snapdealPricing.lowestTp - max(10, snapdealPricing.lowestTp*0.001)
525
            proposed_sp = getTargetSp(proposed_tp,mpItem)
526
            target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
527
            mpHistory.proposedSellingPrice = proposed_sp
528
            mpHistory.proposedTp = proposed_tp
529
            mpHistory.targetNlc = target_nlc
9919 kshitij.so 530
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
9881 kshitij.so 531
        mpHistory.totalSeller = snapdealDetails.totalSeller
532
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
533
        mpHistory.timestamp = timestamp
534
    session.commit()
535
 
536
def commitBuyBox(buyBoxItems,timestamp):
537
    for item in buyBoxItems:
538
        snapdealDetails = item[0]
539
        snapdealItemInfo = item[1]
540
        snapdealPricing = item[2]
541
        mpItem = item[3]
542
        mpHistory = MarketPlaceHistory()
543
        mpHistory.item_id = snapdealItemInfo.item_id
544
        mpHistory.source = OrderSource.SNAPDEAL
545
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
546
        mpHistory.lowestPossibleSp = snapdealPricing.lowestPossibleSp
547
        mpHistory.ourInventory = snapdealDetails.ourInventory
548
        mpHistory.secondLowestInventory = snapdealDetails.secondLowestSellerInventory
549
        mpHistory.ourRank = snapdealDetails.rank
550
        mpHistory.competitionBasis = CompetitionBasis._NAMES_TO_VALUES.get(snapdealPricing.competitionBasis)
551
        mpHistory.competitiveCategory = CompetitionCategory.BUY_BOX
552
        mpHistory.risky = snapdealItemInfo.risky
553
        mpHistory.lowestOfferPrice = snapdealDetails.lowestOfferPrice
554
        mpHistory.lowestSellingPrice = snapdealDetails.lowestSp
555
        mpHistory.lowestSellerName = snapdealDetails.lowestSellerName
556
        mpHistory.lowestSellerCode = snapdealDetails.lowestSellerCode
557
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
558
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
559
        mpHistory.ourTp = snapdealPricing.ourTp
560
        mpHistory.ourNlc = snapdealItemInfo.nlc
561
        mpHistory.secondLowestSellerName = snapdealDetails.secondLowestSellerName
562
        mpHistory.secondLowestSellerCode = snapdealDetails.secondLowestSellerCode
9885 kshitij.so 563
        mpHistory.secondLowestSellingPrice = snapdealDetails.secondLowestSellerSp
9888 kshitij.so 564
        mpHistory.secondLowestOfferPrice = snapdealDetails.secondLowestSellerOfferPrice
9881 kshitij.so 565
        mpHistory.secondLowestTp = snapdealPricing.secondLowestSellerTp
566
        if (snapdealPricing.competitionBasis=='SP'):
567
            proposed_sp = max(snapdealDetails.secondLowestSellerSp - max((20, snapdealDetails.secondLowestSellerSp*0.002)), snapdealPricing.lowestPossibleSp)
568
            proposed_tp = getTargetTp(proposed_sp,mpItem)
569
            #target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
570
            mpHistory.proposedSellingPrice = proposed_sp
571
            mpHistory.proposedTp = proposed_tp
572
            #mpHistory.targetNlc = target_nlc
573
        else:
574
            proposed_tp  = max(snapdealPricing.secondLowestSellerTp - max((20, snapdealPricing.secondLowestSellerTp*0.002)), snapdealPricing.lowestPossibleTp)
575
            proposed_sp = getTargetSp(proposed_tp,mpItem)
576
            #target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
577
            mpHistory.proposedSellingPrice = proposed_sp
578
            mpHistory.proposedTp = proposed_tp
579
            #mpHistory.targetNlc = target_nlc
9919 kshitij.so 580
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
9881 kshitij.so 581
        mpHistory.marginIncreasedPotential = proposed_tp - snapdealPricing.ourTp
582
        mpHistory.totalSeller = snapdealDetails.totalSeller
583
        mpHistory.timestamp = timestamp
584
    session.commit()
585
 
586
 
587
def getOtherTp(snapdealDetails,val,spm):
588
    if val.parent_category==10011:
589
        commissionPercentage = spm.competitorCommissionAccessory
590
    else:
591
        commissionPercentage = spm.competitorCommissionOther
592
    if snapdealDetails.rank==1:
593
        return snapdealDetails.secondLowestSellerSp- snapdealDetails.secondLowestSellerSp*(commissionPercentage/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost+spm.closingFee)*(1+(spm.serviceTax/100));  
594
    return snapdealDetails.lowestSp- snapdealDetails.lowestSp*(commissionPercentage/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost+spm.closingFee)*(1+(spm.serviceTax/100));
595
 
596
def getLowestPossibleTp(snapdealDetails,val,spm,mpItem):
597
    if snapdealDetails.rank==0:
598
        return mpItem.minimumPossibleTp
599
    vat = (snapdealDetails.ourSp/(1+(val.vatRate/100))-(val.nlc/(1+(val.vatRate/100))))*(val.vatRate/100);
600
    inHouseCost = 15+vat+(mpItem.returnProvision/100)*snapdealDetails.ourSp+mpItem.otherCost;
601
    lowest_possible_tp = val.nlc+inHouseCost;
602
    return lowest_possible_tp
603
 
604
def getOurTp(snapdealDetails,val,spm,mpItem):
605
    if snapdealDetails.rank==0:
606
        return mpItem.currentTp
607
    return snapdealDetails.ourSp- snapdealDetails.ourSp*(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))-(val.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100));
608
 
609
def getLowestPossibleSp(snapdealDetails,val,spm,mpItem):
610
    if snapdealDetails.rank==0:
611
        return mpItem.minimumPossibleSp
612
    return (val.nlc+(val.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100))*(1+(val.vatRate/100))+(15+mpItem.otherCost)*(1+(val.vatRate)/100))/(1-(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))*(1+(val.vatRate)/100)-(mpItem.returnProvision/100)*(1+(val.vatRate)/100));    
613
 
614
def getTargetTp(targetSp,mpItem):
615
    return targetSp- targetSp*(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))-(mpItem.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100));
616
 
617
def getTargetSp(targetTp,mpItem):
9897 kshitij.so 618
    return float(targetTp+(mpItem.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100)))/(1-((mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))))
9881 kshitij.so 619
 
620
def getSalesPotential(lowestOfferPrice,ourNlc):
621
    if lowestOfferPrice - ourNlc < 0:
622
        return 'HIGH'
9897 kshitij.so 623
    elif (float(lowestOfferPrice - ourNlc))/lowestOfferPrice >=0 and (float(lowestOfferPrice - ourNlc))/lowestOfferPrice <=.02:
9881 kshitij.so 624
        return 'MEDIUM'
625
    else:
626
        return 'LOW'  
627
 
628
def main():
629
    itemInfo,spm= populateStuff()
630
    cantCompete, buyBoxItems, competitive, \
631
    competitiveNoInventory, exceptionItems, negativeMargin = decideCategory(itemInfo,spm)
632
    timestamp = datetime.now()
633
    commitExceptionList(exceptionItems,timestamp)
634
    commitCantCompete(cantCompete,timestamp)
635
    commitBuyBox(buyBoxItems,timestamp)
636
    commitCompetitive(competitive,timestamp)
637
    commitCompetitiveNoInventory(competitiveNoInventory,timestamp)
638
    commitNegativeMargin(negativeMargin,timestamp)
9897 kshitij.so 639
    fetchItemsForAutoDecrease(timestamp)
640
    fetchItemsForAutoIncrease(timestamp)
641
 
642
 
9881 kshitij.so 643
if __name__ == '__main__':
644
    main()