Subversion Repositories SmartDukaan

Rev

Rev 11753 | Rev 11778 | 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 *
9990 kshitij.so 2
from sqlalchemy.sql import or_ ,func, asc
9881 kshitij.so 3
from shop2020.config.client.ConfigClient import ConfigClient
4
from shop2020.model.v1.catalog.impl import DataService
5
from shop2020.model.v1.catalog.impl.DataService import SnapdealItem, MarketplaceItems, Item, \
10289 kshitij.so 6
Category, SourcePercentageMaster, MarketPlaceHistory, MarketPlaceUpdateHistory, MarketPlaceItemPrice, \
7
SourceCategoryPercentage, SourceItemPercentage
9881 kshitij.so 8
from shop2020.thriftpy.model.v1.order.ttypes import OrderSource
9897 kshitij.so 9
from shop2020.thriftpy.model.v1.catalog.ttypes import CompetitionCategory, CompetitionBasis, SalesPotential,\
9949 kshitij.so 10
Decision, RunType
9881 kshitij.so 11
from shop2020.clients.CatalogClient import CatalogClient
12
from shop2020.clients.InventoryClient import InventoryClient
13
import urllib2
14
import time
9949 kshitij.so 15
from datetime import date, datetime, timedelta
16
from shop2020.utils import EmailAttachmentSender
17
from shop2020.utils.EmailAttachmentSender import get_attachment_part
18
import math
9881 kshitij.so 19
import simplejson as json
9949 kshitij.so 20
import xlwt
21
import optparse
9881 kshitij.so 22
import sys
9954 kshitij.so 23
import smtplib
24
from email.mime.text import MIMEText
10221 kshitij.so 25
import email
9954 kshitij.so 26
from email.mime.multipart import MIMEMultipart
10219 kshitij.so 27
import email.encoders
10280 kshitij.so 28
import mechanize
29
import cookielib
9881 kshitij.so 30
 
9954 kshitij.so 31
 
9881 kshitij.so 32
config_client = ConfigClient()
33
host = config_client.get_property('staging_hostname')
10280 kshitij.so 34
syncPrice=config_client.get_property('sync_price_on_marketplace')
35
 
36
 
9881 kshitij.so 37
DataService.initialize(db_hostname=host)
9897 kshitij.so 38
import logging
39
lgr = logging.getLogger()
40
lgr.setLevel(logging.DEBUG)
41
fh = logging.FileHandler('snapdeal-history.log')
42
fh.setLevel(logging.INFO)
43
frmt = logging.Formatter('%(asctime)s - %(name)s - %(message)s')
44
fh.setFormatter(frmt)
45
lgr.addHandler(fh)
9881 kshitij.so 46
 
9949 kshitij.so 47
inventoryMap = {}
48
itemSaleMap = {}
49
 
9881 kshitij.so 50
class __Exception:
51
    SERVER_SIDE=1
52
 
53
 
54
class __SnapdealDetails:
55
    def __init__(self, ourSp, ourInventory, otherInventory, rank, lowestSellerName, lowestSellerCode,lowestSp,secondLowestSellerName, secondLowestSellerCode,secondLowestSellerSp,secondLowestSellerInventory,lowestOfferPrice,secondLowestSellerOfferPrice,ourOfferPrice, totalSeller):
56
        self.ourSp = ourSp
57
        self.ourOfferPrice = ourOfferPrice
58
        self.ourInventory = ourInventory
59
        self.otherInventory = otherInventory
60
        self.rank = rank
61
        self.lowestSellerName = lowestSellerName
62
        self.lowestSellerCode = lowestSellerCode 
63
        self.lowestSp = lowestSp
64
        self.lowestOfferPrice = lowestOfferPrice
65
        self.secondLowestSellerName = secondLowestSellerName
66
        self.secondLowestSellerCode = secondLowestSellerCode
67
        self.secondLowestSellerSp = secondLowestSellerSp
68
        self.secondLowestSellerOfferPrice = secondLowestSellerOfferPrice
69
        self.secondLowestSellerInventory = secondLowestSellerInventory
70
        self.totalSeller = totalSeller
71
 
72
class __SnapdealItemInfo:
73
 
10289 kshitij.so 74
    def __init__(self, supc, nlc, courierCost, item_id, product_group, brand, model_name, model_number, color, weight, parent_category, risky, warehouseId, vatRate, runType, parent_category_name, sourcePercentage):
9881 kshitij.so 75
        self.supc = supc
76
        self.nlc = nlc
77
        self.courierCost = courierCost
78
        self.item_id = item_id
79
        self.product_group = product_group
80
        self.brand = brand
81
        self.model_name = model_name
82
        self.model_number = model_number
83
        self.color = color
84
        self.weight = weight
85
        self.parent_category = parent_category
86
        self.risky = risky
87
        self.warehouseId = warehouseId
88
        self.vatRate = vatRate
9949 kshitij.so 89
        self.runType = runType
90
        self.parent_category_name = parent_category_name
10289 kshitij.so 91
        self.sourcePercentage = sourcePercentage 
9881 kshitij.so 92
 
93
class __SnapdealPricing:
94
 
95
    def __init__(self, ourSp, ourTp, lowestTp, lowestPossibleTp, competitionBasis, secondLowestSellerTp, lowestPossibleSp):
96
        self.ourTp = ourTp
97
        self.lowestTp = lowestTp
98
        self.lowestPossibleTp = lowestPossibleTp
99
        self.competitionBasis = competitionBasis
100
        self.ourSp = ourSp
101
        self.secondLowestSellerTp = secondLowestSellerTp
102
        self.lowestPossibleSp = lowestPossibleSp
10280 kshitij.so 103
 
104
def getBrowserObject():
105
    br = mechanize.Browser(factory=mechanize.RobustFactory())
106
    cj = cookielib.LWPCookieJar()
107
    br.set_cookiejar(cj)
108
    br.set_handle_equiv(True)
109
    br.set_handle_redirect(True)
110
    br.set_handle_referer(True)
111
    br.set_handle_robots(False)
112
    br.set_debug_http(False)
113
    br.set_debug_redirects(False)
114
    br.set_debug_responses(False)
115
 
116
    br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
117
 
118
    br.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'),
119
                     ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
120
                     ('Accept-Encoding', 'gzip,deflate,sdch'),                  
121
                     ('Accept-Language', 'en-US,en;q=0.8'),                     
122
                     ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')]
123
    return br
9881 kshitij.so 124
 
9897 kshitij.so 125
def fetchItemsForAutoDecrease(time):
9954 kshitij.so 126
    successfulAutoDecrease = []
9920 kshitij.so 127
    autoDecrementItems = session.query(MarketPlaceHistory).join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
128
    .filter(MarketPlaceHistory.timestamp==time).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.COMPETITIVE)\
129
    .filter(MarketplaceItems.source==OrderSource.SNAPDEAL).filter(MarketplaceItems.autoDecrement==True).all()
130
    #autoDecrementItems = MarketplaceItems.query.filter(MarketplaceItems.autoDecrement==True).filter(MarketplaceItems.source==OrderSource.SNAPDEAL).all()
9897 kshitij.so 131
    inventory_client = InventoryClient().get_client()
9949 kshitij.so 132
    global inventoryMap
9897 kshitij.so 133
    inventoryMap = inventory_client.getInventorySnapshot(0)
134
    for autoDecrementItem in autoDecrementItems:
9920 kshitij.so 135
        #mpHistory = MarketPlaceHistory.get_by(source=OrderSource.SNAPDEAL,item_id=autoDecrementItem.itemId,timestamp=time)
136
        if not autoDecrementItem.competitiveCategory == CompetitionCategory.COMPETITIVE:
137
            markReasonForMpItem(autoDecrementItem,'Category is '+CompetitionCategory._VALUES_TO_NAMES.get(autoDecrementItem.competitiveCategory),Decision.AUTO_DECREMENT_FAILED)
9914 kshitij.so 138
            continue
11753 kshitij.so 139
#        if not autoDecrementItem.risky:
140
#            markReasonForMpItem(autoDecrementItem,'Item is not risky',Decision.AUTO_DECREMENT_FAILED)
141
#            continue
10008 kshitij.so 142
        if math.ceil(autoDecrementItem.proposedSellingPrice) >= autoDecrementItem.ourSellingPrice:
143
            markReasonForMpItem(autoDecrementItem,'Proposed SP greater than or equal to current SP',Decision.AUTO_DECREMENT_FAILED)
9897 kshitij.so 144
            continue
9966 kshitij.so 145
        if autoDecrementItem.proposedSellingPrice < autoDecrementItem.lowestPossibleSp:
146
            markReasonForMpItem(autoDecrementItem,'Proposed SP less than lowest possible SP',Decision.AUTO_DECREMENT_FAILED)
147
            continue
9920 kshitij.so 148
        if autoDecrementItem.otherInventory < 3:
149
            markReasonForMpItem(autoDecrementItem,'Competition stock is not enough',Decision.AUTO_DECREMENT_FAILED)
9897 kshitij.so 150
            continue
9949 kshitij.so 151
        #oosStatus = inventory_client.getOosStatusesForXDaysForItem(autoDecrementItem.item_id,0,3)
152
        #count,sale,daysOfStock = 0,0,0
153
        #for obj in oosStatus:
154
        #    if not obj.is_oos:
155
        #        count+=1
156
        #        sale = sale+obj.num_orders
157
        #avgSalePerDay=0 if count==0 else (float(sale)/count)
9897 kshitij.so 158
        totalAvailability, totalReserved = 0,0
9920 kshitij.so 159
        if (not inventoryMap.has_key(autoDecrementItem.item_id)):
9949 kshitij.so 160
            markReasonForMpItem(autoDecrementItem,'Inventory info not available',Decision.AUTO_DECREMENT_FAILED)
9913 kshitij.so 161
            continue
9920 kshitij.so 162
        itemInventory=inventoryMap[autoDecrementItem.item_id]
9897 kshitij.so 163
        availableMap  = itemInventory.availability
164
        reserveMap = itemInventory.reserved
165
        for warehouse,availability in availableMap.iteritems():
166
            if warehouse==16:
167
                continue
168
            totalAvailability = totalAvailability+availability
169
        for warehouse,reserve in reserveMap.iteritems():
170
            if warehouse==16:
171
                continue
172
            totalReserved = totalReserved+reserve
173
        if (totalAvailability-totalReserved)<=0:
9949 kshitij.so 174
            markReasonForMpItem(autoDecrementItem,'Net availability is 0',Decision.AUTO_DECREMENT_FAILED)
9897 kshitij.so 175
            continue
9949 kshitij.so 176
        #if (avgSalePerDay==0):  #exclude
177
        #    markReasonForMpItem(autoDecrementItem,'Average sale per day is zero',Decision.AUTO_DECREMENT_FAILED)
178
        #    continue
179
        avgSalePerDay = (itemSaleMap.get(autoDecrementItem.item_id))[2]
180
        try:
181
            daysOfStock = (float(totalAvailability-totalReserved))/avgSalePerDay
182
        except ZeroDivisionError,e:
183
            lgr.info("Infinite days of stock for item "+str(autoDecrementItem.item_id))
184
            daysOfStock = float("inf")
11753 kshitij.so 185
        if daysOfStock<2 and autoDecrementItem.risky:
9920 kshitij.so 186
            markReasonForMpItem(autoDecrementItem,'Our stock is not enough',Decision.AUTO_DECREMENT_FAILED)
9897 kshitij.so 187
            continue
188
 
9920 kshitij.so 189
        autoDecrementItem.competitorEnoughStock = True
190
        autoDecrementItem.ourEnoughStock = True
9949 kshitij.so 191
        #autoDecrementItem.avgSales = avgSalePerDay
9920 kshitij.so 192
        autoDecrementItem.decision = Decision.AUTO_DECREMENT_SUCCESS
193
        autoDecrementItem.reason = 'All conditions for auto decrement true'
9954 kshitij.so 194
        successfulAutoDecrease.append(autoDecrementItem)
9920 kshitij.so 195
        lgr.info("Auto decrement success for itemId "+str(autoDecrementItem.item_id)+" Days of stock "+str(daysOfStock)+" avg sales "+str(avgSalePerDay))
9897 kshitij.so 196
    session.commit()
9954 kshitij.so 197
    return successfulAutoDecrease
9897 kshitij.so 198
 
199
def fetchItemsForAutoIncrease(time):
9954 kshitij.so 200
    successfulAutoIncrease = []
9920 kshitij.so 201
    autoIncrementItems = session.query(MarketPlaceHistory).join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
202
    .filter(MarketPlaceHistory.timestamp==time).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.BUY_BOX)\
203
    .filter(MarketplaceItems.source==OrderSource.SNAPDEAL).filter(MarketplaceItems.autoIncrement==True).all()
204
    #autoIncrementItems = MarketplaceItems.query.filter(MarketplaceItems.autoIncrement==True).filter(MarketplaceItems.source==OrderSource.SNAPDEAL).all()
9949 kshitij.so 205
    #inventory_client = InventoryClient().get_client()
9897 kshitij.so 206
    for autoIncrementItem in autoIncrementItems:
9920 kshitij.so 207
        #mpHistory = MarketPlaceHistory.get_by(source=OrderSource.SNAPDEAL,item_id=autoIncrementItem.itemId,timestamp=time)
208
        if not autoIncrementItem.competitiveCategory == CompetitionCategory.BUY_BOX:
209
            markReasonForMpItem(autoIncrementItem,'Category is '+CompetitionCategory._VALUES_TO_NAMES.get(autoIncrementItem.competitiveCategory),Decision.AUTO_INCREMENT_FAILED)
9897 kshitij.so 210
            continue
9920 kshitij.so 211
        if autoIncrementItem.totalSeller==1 and autoIncrementItem.ourRank==1:
212
            markReasonForMpItem(autoIncrementItem,'We are the only seller',Decision.AUTO_INCREMENT_FAILED)
9897 kshitij.so 213
            continue
9920 kshitij.so 214
        if autoIncrementItem.proposedSellingPrice <= autoIncrementItem.ourSellingPrice:
215
            markReasonForMpItem(autoIncrementItem,'Proposed SP less than current SP',Decision.AUTO_INCREMENT_FAILED)
9919 kshitij.so 216
            continue
9966 kshitij.so 217
        if autoIncrementItem.proposedSellingPrice >=10000 and autoIncrementItem.ourSellingPrice<10000:
218
            markReasonForMpItem(autoIncrementItem,'Proposed SP is greater than 10,000 and current sp is less than 10,000',Decision.AUTO_INCREMENT_FAILED)
219
            continue
220
        if getLastDaySale(autoIncrementItem.item_id)<=2:
221
            markReasonForMpItem(autoIncrementItem,'Last day sale is less than 3',Decision.AUTO_INCREMENT_FAILED)
222
            continue
9990 kshitij.so 223
        antecedentPrice = session.query(MarketPlaceHistory.ourSellingPrice).filter(MarketPlaceHistory.item_id==autoIncrementItem.item_id).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.timestamp>time-timedelta(days=1)).order_by(asc(MarketPlaceHistory.timestamp)).first()
10839 kshitij.so 224
        try:
225
            if antecedentPrice[0] is not None:
226
                if float(math.ceil(autoIncrementItem.ourSellingPrice+max(10,.01*autoIncrementItem.ourSellingPrice))-math.ceil(antecedentPrice[0]+max(10,.01*antecedentPrice[0])))/math.ceil(antecedentPrice[0]+max(10,.01*antecedentPrice[0]))>.02:
227
                    markReasonForMpItem(autoIncrementItem,'Maximum price increase in last 24 hours should be 2%',Decision.AUTO_INCREMENT_FAILED)
228
                    continue
229
        except:
230
            if antecedentPrice is not None:
231
                if float(math.ceil(autoIncrementItem.ourSellingPrice+max(10,.01*autoIncrementItem.ourSellingPrice))-math.ceil(antecedentPrice[0]+max(10,.01*antecedentPrice[0])))/math.ceil(antecedentPrice[0]+max(10,.01*antecedentPrice[0]))>.02:
232
                    markReasonForMpItem(autoIncrementItem,'Maximum price increase in last 24 hours should be 2%',Decision.AUTO_INCREMENT_FAILED)
233
                    continue
9990 kshitij.so 234
        mpItem = MarketplaceItems.get_by(itemId=autoIncrementItem.item_id,source=OrderSource.SNAPDEAL)
235
        if mpItem.maximumSellingPrice is not None and mpItem.maximumSellingPrice > 0:
236
            if autoIncrementItem.ourSellingPrice+max(10,.01*autoIncrementItem.ourSellingPrice) > mpItem.maximumSellingPrice:
237
                markReasonForMpItem(autoIncrementItem,'Price cannot exceed Maximum Selling Price',Decision.AUTO_INCREMENT_FAILED)
238
                continue
9949 kshitij.so 239
        #oosStatus = inventory_client.getOosStatusesForXDaysForItem(autoIncrementItem.item_id,0,3)
240
        #count,sale,daysOfStock = 0,0,0
241
        #for obj in oosStatus:
242
        #    if not obj.is_oos:
243
        #        count+=1
244
        #        sale = sale+obj.num_orders
245
        #avgSalePerDay=0 if count==0 else (float(sale)/count)
9897 kshitij.so 246
        totalAvailability, totalReserved = 0,0
9920 kshitij.so 247
        if (not inventoryMap.has_key(autoIncrementItem.item_id)):
9949 kshitij.so 248
            markReasonForMpItem(autoIncrementItem,'Inventory info not available',Decision.AUTO_INCREMENT_FAILED)
9913 kshitij.so 249
            continue
9920 kshitij.so 250
        itemInventory=inventoryMap[autoIncrementItem.item_id]
9897 kshitij.so 251
        availableMap  = itemInventory.availability
252
        reserveMap = itemInventory.reserved
253
        for warehouse,availability in availableMap.iteritems():
254
            if warehouse==16:
255
                continue
256
            totalAvailability = totalAvailability+availability
257
        for warehouse,reserve in reserveMap.iteritems():
258
            if warehouse==16:
259
                continue
260
            totalReserved = totalReserved+reserve
9949 kshitij.so 261
        #if (totalAvailability-totalReserved)<=0:
262
        #    markReasonForMpItem(autoIncrementItem,'Our stock is 0',Decision.AUTO_INCREMENT_FAILED)
263
        #    continue
264
        avgSalePerDay = (itemSaleMap.get(autoIncrementItem.item_id))[2]
9912 kshitij.so 265
        if (avgSalePerDay==0):
9920 kshitij.so 266
            markReasonForMpItem(autoIncrementItem,'Average sale per day is zero',Decision.AUTO_INCREMENT_FAILED)
9912 kshitij.so 267
            continue
9897 kshitij.so 268
        daysOfStock = (float(totalAvailability-totalReserved))/avgSalePerDay
269
        if daysOfStock>5:
9920 kshitij.so 270
            markReasonForMpItem(autoIncrementItem,'Our stock is enough',Decision.AUTO_INCREMENT_FAILED)
9897 kshitij.so 271
            continue
272
 
9920 kshitij.so 273
        autoIncrementItem.ourEnoughStock = False
9949 kshitij.so 274
        #autoIncrementItem.avgSales = avgSalePerDay
9920 kshitij.so 275
        autoIncrementItem.decision = Decision.AUTO_INCREMENT_SUCCESS
276
        autoIncrementItem.reason = 'All conditions for auto increment true'
9954 kshitij.so 277
        successfulAutoIncrease.append(autoIncrementItem)
9920 kshitij.so 278
        lgr.info("Auto increment success for itemId "+str(autoIncrementItem.item_id)+" Days of stock "+str(daysOfStock)+" avg sales "+str(avgSalePerDay))
9897 kshitij.so 279
    session.commit()
9954 kshitij.so 280
    return successfulAutoIncrease
9897 kshitij.so 281
 
9949 kshitij.so 282
def calculateAverageSale(oosStatus):
283
    count,sale = 0,0
284
    for obj in oosStatus:
285
        if not obj.is_oos:
286
            count+=1
287
            sale = sale+obj.num_orders
288
    avgSalePerDay=0 if count==0 else (float(sale)/count)
9954 kshitij.so 289
    return round(avgSalePerDay,2)
9949 kshitij.so 290
 
10271 kshitij.so 291
def calculateTotalSale(oosStatus):
292
    sale = 0
293
    for obj in oosStatus:
294
        if not obj.is_oos:
295
            sale = sale+obj.num_orders
296
    return sale
297
 
9949 kshitij.so 298
def getNetAvailability(itemInventory):
299
    totalAvailability, totalReserved = 0,0
300
    availableMap  = itemInventory.availability
301
    reserveMap = itemInventory.reserved
302
    for warehouse,availability in availableMap.iteritems():
303
        if warehouse==16:
304
            continue
305
        totalAvailability = totalAvailability+availability
306
    for warehouse,reserve in reserveMap.iteritems():
307
        if warehouse==16:
308
            continue
309
        totalReserved = totalReserved+reserve
310
    return totalAvailability - totalReserved
311
 
312
def getOosString(oosStatus):
313
    lastNdaySale=""
314
    for obj in oosStatus:
315
        if obj.is_oos:
316
            lastNdaySale += "X-"
317
        else:
318
            lastNdaySale += str(obj.num_orders) + "-"
9954 kshitij.so 319
    return lastNdaySale[:-1]
9949 kshitij.so 320
 
9966 kshitij.so 321
def getLastDaySale(itemId):
322
    return (itemSaleMap.get(itemId))[4]
323
 
9949 kshitij.so 324
def markAutoFavourite():
325
    previouslyAutoFav = []
326
    nowAutoFav = []
327
    marketplaceItems = session.query(MarketplaceItems).filter(MarketplaceItems.source==OrderSource.SNAPDEAL).all()
328
    fromDate = datetime.now()-timedelta(days = 3, hours=datetime.now().hour, minutes=datetime.now().minute, seconds=datetime.now().second)
329
    toDate = datetime.now()-timedelta(days = 0, hours=datetime.now().hour, minutes=datetime.now().minute, seconds=datetime.now().second)
9954 kshitij.so 330
    items = session.query(MarketPlaceHistory.item_id,func.max(MarketPlaceHistory.timestamp)).group_by(MarketPlaceHistory.item_id).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.timestamp.between (fromDate,toDate)).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.BUY_BOX).all()
10271 kshitij.so 331
    toUpdate = [key for key, value in itemSaleMap.items() if value[5] >= 1]
9949 kshitij.so 332
    buyBoxLast3days = []
333
    for item in items:
334
        buyBoxLast3days.append(item[0])
335
    for marketplaceItem in marketplaceItems:
336
        reason = ""
337
        toMark = False
338
        if marketplaceItem.itemId in toUpdate:
339
            toMark = True
10271 kshitij.so 340
            reason+="Total sale is greater than 1 for last five days (Snapdeal)."
9949 kshitij.so 341
        if marketplaceItem.itemId in buyBoxLast3days:
342
            toMark = True
343
            reason+="Item is present in buy box in last 3 days"
344
        if not marketplaceItem.autoFavourite:
345
            print "Item is not under auto favourite"
346
        if toMark:
347
            temp=[]
348
            temp.append(marketplaceItem.itemId)
349
            temp.append(reason)
350
            nowAutoFav.append(temp)
351
        if (not toMark) and marketplaceItem.autoFavourite:
352
            previouslyAutoFav.append(marketplaceItem.itemId)
353
        marketplaceItem.autoFavourite = toMark
354
    session.commit()
355
    return previouslyAutoFav, nowAutoFav
9897 kshitij.so 356
 
9949 kshitij.so 357
 
358
 
9897 kshitij.so 359
def markReasonForMpItem(mpHistory,reason,decision):
360
    mpHistory.decision = decision
361
    mpHistory.reason = reason
362
 
9881 kshitij.so 363
def fetchDetails(supc_code):
10811 kshitij.so 364
    url="http://www.snapdeal.com/acors/json/gvbps?supc=%s&catId=91"%(supc_code)
9881 kshitij.so 365
    print url
366
    time.sleep(1)
367
    req = urllib2.Request(url)
368
    response = urllib2.urlopen(req)
369
    json_input = response.read()
370
    vendorInfo = json.loads(json_input)
371
    rank ,otherInventory ,ourInventory, ourOfferPrice, ourSp, iterator, secondLowestSellerSp, secondLowestSellerInventory, \
372
    lowestOfferPrice,  secondLowestSellerOfferPrice = (0,)*10
373
    lowestSellerName , lowestSellerCode, secondLowestSellerName, secondLowestSellerCode=('',)*4
374
    for vendor in vendorInfo:
375
        if iterator == 0:
376
            lowestSellerName = vendor['vendorDisplayName']
377
            lowestSellerCode = vendor['vendorCode']
378
            try:
379
                lowestSp = vendor['sellingPriceBefIntCashBack']
380
            except:
381
                lowestSp = vendor['sellingPrice']
382
            lowestOfferPrice = vendor['sellingPrice']
383
 
384
        if iterator ==1:
385
            secondLowestSellerName = vendor['vendorDisplayName']
386
            secondLowestSellerCode =vendor['vendorCode']
387
            try:
388
                secondLowestSellerSp = vendor['sellingPriceBefIntCashBack']
389
            except:
390
                secondLowestSellerSp = vendor['sellingPrice'] 
391
            secondLowestSellerOfferPrice = vendor['sellingPrice'] 
392
            secondLowestSellerInventory = vendor['buyableInventory']
393
 
394
        if vendor['vendorDisplayName'] == 'MobilesnMore':
395
            ourInventory = vendor['buyableInventory']
396
            try:
397
                ourSp = vendor['sellingPriceBefIntCashBack']
398
            except:
399
                ourSp = vendor['sellingPrice']
400
            ourOfferPrice = vendor['sellingPrice']
401
            rank = iterator +1
402
        else:
403
            if rank==0:
404
                otherInventory = otherInventory +vendor['buyableInventory']
405
        iterator+=1
406
    snapdealDetails = __SnapdealDetails(ourSp,ourInventory,otherInventory,rank,lowestSellerName, lowestSellerCode,lowestSp,secondLowestSellerName,secondLowestSellerCode,secondLowestSellerSp,secondLowestSellerInventory,lowestOfferPrice,secondLowestSellerOfferPrice,ourOfferPrice,len(vendorInfo))
407
    return snapdealDetails        
408
 
409
 
10289 kshitij.so 410
def populateStuff(runType,time):
9881 kshitij.so 411
    itemInfo = []
9949 kshitij.so 412
    if runType=='FAVOURITE':
413
        items = session.query(SnapdealItem).join((MarketplaceItems,SnapdealItem.item_id==MarketplaceItems.itemId)).filter(MarketplaceItems.source==OrderSource.SNAPDEAL).\
414
        filter(or_(MarketplaceItems.autoFavourite==True, MarketplaceItems.manualFavourite==True)).all()
415
    else:
416
        items = session.query(SnapdealItem).all()
10289 kshitij.so 417
    #spm = SourcePercentageMaster.get_by(source=OrderSource.SNAPDEAL)
418
 
9881 kshitij.so 419
    for snapdeal_item in items:
420
        it = Item.query.filter_by(id=snapdeal_item.item_id).one()
421
        category = Category.query.filter_by(id=it.category).one()
9949 kshitij.so 422
        parent_category = Category.query.filter_by(id=category.parent_category_id).first()
10290 kshitij.so 423
        sip = SourceItemPercentage.query.filter(SourceItemPercentage.item_id==it.id).filter(SourceItemPercentage.source==OrderSource.SNAPDEAL).filter(SourceItemPercentage.startDate<=time).filter(SourceItemPercentage.expiryDate>=time).first()
10289 kshitij.so 424
        sourcePercentage = None
425
        if sip is not None:
426
            sourcePercentage = sip
427
        else:
428
            scp = SourceCategoryPercentage.query.filter(SourceCategoryPercentage.category_id==it.category).filter(SourceCategoryPercentage.source==OrderSource.SNAPDEAL).filter(SourceCategoryPercentage.startDate<=time).filter(SourceCategoryPercentage.expiryDate>=time).first()
429
            if scp is not None:
430
                sourcePercentage = scp
431
            else:
432
                spm = SourcePercentageMaster.get_by(source=OrderSource.SNAPDEAL)
433
                sourcePercentage = spm
11099 kshitij.so 434
        snapdealItemInfo = __SnapdealItemInfo(snapdeal_item.supc, snapdeal_item.maxNlc,snapdeal_item.courierCostMarketplace, 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, runType, parent_category.display_name,sourcePercentage)
9881 kshitij.so 435
        itemInfo.append(snapdealItemInfo)
10289 kshitij.so 436
    return itemInfo
9881 kshitij.so 437
 
438
 
10289 kshitij.so 439
def decideCategory(itemInfo):
9949 kshitij.so 440
    global itemSaleMap
9881 kshitij.so 441
    cantCompete, buyBoxItems, competitive, competitiveNoInventory, exceptionItems, negativeMargin = [],[],[],[],[],[]
442
    catalog_client = CatalogClient().get_client()
443
    inventory_client = InventoryClient().get_client()
444
 
445
    for val in itemInfo:
10291 kshitij.so 446
        spm = val.sourcePercentage
9881 kshitij.so 447
        try:
448
            snapdealDetails = fetchDetails(val.supc)
449
        except:
450
            exceptionItems.append(val)
451
            continue
452
        mpItem = MarketplaceItems.get_by(itemId=val.item_id,source=OrderSource.SNAPDEAL)
453
        warehouse = inventory_client.getWarehouse(val.warehouseId)
9949 kshitij.so 454
 
455
        itemSaleList = []
456
        oosForAllSources = inventory_client.getOosStatusesForXDaysForItem(val.item_id, 0, 3)
457
        oosForSnapdeal = inventory_client.getOosStatusesForXDaysForItem(val.item_id, OrderSource.SNAPDEAL, 5)
9966 kshitij.so 458
        oosForSnapdealLastDay = inventory_client.getOosStatusesForXDaysForItem(val.item_id, OrderSource.SNAPDEAL, 1)
9949 kshitij.so 459
        itemSaleList.append(oosForAllSources)
460
        itemSaleList.append(oosForSnapdeal)
461
        itemSaleList.append(calculateAverageSale(oosForAllSources))
462
        itemSaleList.append(calculateAverageSale(oosForSnapdeal))
9966 kshitij.so 463
        itemSaleList.append(calculateAverageSale(oosForSnapdealLastDay))
10271 kshitij.so 464
        itemSaleList.append(calculateTotalSale(oosForSnapdeal))
9949 kshitij.so 465
        itemSaleMap[val.item_id]=itemSaleList
466
 
9881 kshitij.so 467
        if snapdealDetails.rank==0:
468
            snapdealDetails.ourSp = mpItem.currentSp
469
            snapdealDetails.ourOfferPrice = mpItem.currentSp
470
            ourSp = mpItem.currentSp
471
        else:
472
            ourSp = snapdealDetails.ourSp
473
        vatRate = catalog_client.getVatPercentageForItem(val.item_id, warehouse.stateId, snapdealDetails.ourSp)
474
        val.vatRate = vatRate
475
        if (snapdealDetails.rank==1):
476
            temp=[]
477
            temp.append(snapdealDetails)
478
            temp.append(val)
479
            if (snapdealDetails.secondLowestSellerOfferPrice == snapdealDetails.secondLowestSellerSp) and snapdealDetails.ourOfferPrice==snapdealDetails.ourSp:
480
                competitionBasis = 'SP'
481
            else:
482
                competitionBasis = 'TP'
483
            secondLowestTp=0 if snapdealDetails.totalSeller==1 else getOtherTp(snapdealDetails,val,spm)
484
            snapdealPricing = __SnapdealPricing(snapdealDetails.ourSp,getOurTp(snapdealDetails,val,spm,mpItem),None,getLowestPossibleTp(snapdealDetails,val,spm,mpItem),competitionBasis,secondLowestTp,getLowestPossibleSp(snapdealDetails,val,spm,mpItem))
485
            temp.append(snapdealPricing)
486
            temp.append(mpItem)
487
            buyBoxItems.append(temp)
488
            continue
489
 
490
 
491
        lowestTp = getOtherTp(snapdealDetails,val,spm)
492
        ourTp = getOurTp(snapdealDetails,val,spm,mpItem)
493
        lowestPossibleTp = getLowestPossibleTp(snapdealDetails,val,spm,mpItem)
494
        lowestPossibleSp = getLowestPossibleSp(snapdealDetails,val,spm,mpItem)
495
 
496
        if (ourTp<lowestPossibleTp):
497
            temp=[]
498
            temp.append(snapdealDetails)
499
            temp.append(val)
500
            snapdealPricing = __SnapdealPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,None,None,None)
501
            temp.append(snapdealPricing)
502
            negativeMargin.append(temp)
503
            continue
504
 
505
        if (snapdealDetails.lowestOfferPrice == snapdealDetails.lowestSp) and snapdealDetails.ourOfferPrice == snapdealDetails.ourSp:
506
            competitionBasis ='SP'
507
        else:
508
            competitionBasis ='TP'
509
 
510
        if competitionBasis=='SP':
511
            if snapdealDetails.lowestSp > lowestPossibleSp and snapdealDetails.ourInventory!=0:
512
                temp=[]
513
                temp.append(snapdealDetails)
514
                temp.append(val)
515
                snapdealPricing = __SnapdealPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,'SP',None,lowestPossibleSp)
516
                temp.append(snapdealPricing)
517
                temp.append(mpItem)
518
                competitive.append(temp)
519
                continue
520
        else:
10759 kshitij.so 521
            if (snapdealDetails.lowestSp-getSubsidyDiff(snapdealDetails) > lowestPossibleSp) and snapdealDetails.ourInventory!=0:
522
            #if lowestTp > lowestPossibleTp and snapdealDetails.ourInventory!=0:
9881 kshitij.so 523
                temp=[]
524
                temp.append(snapdealDetails)
525
                temp.append(val)
526
                snapdealPricing = __SnapdealPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,'TP',None,lowestPossibleSp)
527
                temp.append(snapdealPricing)
528
                temp.append(mpItem)
529
                competitive.append(temp)
530
                continue
531
 
532
        if competitionBasis=='SP':
533
            if snapdealDetails.lowestSp > lowestPossibleSp and snapdealDetails.ourInventory==0:
534
                temp=[]
535
                temp.append(snapdealDetails)
536
                temp.append(val)
537
                snapdealPricing = __SnapdealPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,'SP',None,lowestPossibleSp)
538
                temp.append(snapdealPricing)
539
                temp.append(mpItem)
540
                competitiveNoInventory.append(temp)
541
                continue
542
        else:
10760 kshitij.so 543
            if (snapdealDetails.lowestSp-getSubsidyDiff(snapdealDetails) > lowestPossibleSp) and snapdealDetails.ourInventory==0:
10473 kshitij.so 544
            #lowest sp - subs diff < lowest pos sp 
10759 kshitij.so 545
            #if lowestTp > lowestPossibleTp and snapdealDetails.ourInventory==0:
9881 kshitij.so 546
                temp=[]
547
                temp.append(snapdealDetails)
548
                temp.append(val)
549
                snapdealPricing = __SnapdealPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,'TP',None,lowestPossibleSp)
550
                temp.append(snapdealPricing)
551
                temp.append(mpItem)
552
                competitiveNoInventory.append(temp)
553
                continue
554
 
555
        temp=[]
556
        temp.append(snapdealDetails)
557
        temp.append(val)
558
        snapdealPricing = __SnapdealPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,competitionBasis,None,lowestPossibleSp)
559
        temp.append(snapdealPricing)
560
        temp.append(mpItem)
561
        cantCompete.append(temp)
562
 
9949 kshitij.so 563
    return cantCompete, buyBoxItems, competitive, competitiveNoInventory, exceptionItems, negativeMargin
564
 
9953 kshitij.so 565
def writeReport(cantCompete, buyBoxItems, competitive, competitiveNoInventory, exceptionList, negativeMargin, previousAutoFav, nowAutoFav,timestamp,runType):
9949 kshitij.so 566
    wbk = xlwt.Workbook()
567
    sheet = wbk.add_sheet('Can\'t Compete')
568
    xstr = lambda s: s or ""
569
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
570
 
571
    excel_integer_format = '0'
572
    integer_style = xlwt.XFStyle()
573
    integer_style.num_format_str = excel_integer_format
574
 
575
    sheet.write(0, 0, "Item ID", heading_xf)
576
    sheet.write(0, 1, "Category", heading_xf)
577
    sheet.write(0, 2, "Product Group.", heading_xf)
578
    sheet.write(0, 3, "SUPC", heading_xf)
579
    sheet.write(0, 4, "Brand", heading_xf)
580
    sheet.write(0, 5, "Product Name", heading_xf)
581
    sheet.write(0, 6, "Weight", heading_xf)
582
    sheet.write(0, 7, "Courier Cost", heading_xf)
583
    sheet.write(0, 8, "Risky", heading_xf)
584
    sheet.write(0, 9, "Our SP", heading_xf)
585
    sheet.write(0, 11, "Our TP", heading_xf)
586
    sheet.write(0, 10, "Our Offer Price", heading_xf)
587
    sheet.write(0, 12, "Our Rank", heading_xf)
588
    sheet.write(0, 13, "Lowest Seller", heading_xf)
589
    sheet.write(0, 14, "Lowest SP", heading_xf)
590
    sheet.write(0, 15, "Lowest TP", heading_xf)
591
    sheet.write(0, 16, "Lowest Offer Price", heading_xf)
592
    sheet.write(0, 17, "Inventory of Top Vendors", heading_xf)
593
    sheet.write(0, 18, "Our Snapdeal Inventory", heading_xf)
594
    sheet.write(0, 19, "Our Net Availability",heading_xf)
595
    sheet.write(0, 20, "Last Five Day Sale", heading_xf)
596
    sheet.write(0, 21, "Average Sale", heading_xf)
597
    sheet.write(0, 22, "Our NLC", heading_xf)
598
    sheet.write(0, 23, "Lowest Possible TP", heading_xf)
599
    sheet.write(0, 24, "Lowest Possible SP", heading_xf)
10381 manish.sha 600
    sheet.write(0, 25, "Subsidy Difference", heading_xf)
9949 kshitij.so 601
    sheet.write(0, 26, "Target TP", heading_xf)
602
    sheet.write(0, 27, "Target SP", heading_xf)  
603
    sheet.write(0, 28, "Target NLC", heading_xf)
604
    sheet.write(0, 29, "Sales Potential", heading_xf)
605
    sheet_iterator = 1
606
    for item in cantCompete:
607
        snapdealDetails = item[0]
608
        snapdealItemInfo = item[1]
609
        snapdealPricing = item[2]
610
        mpItem = item[3]
611
        sheet.write(sheet_iterator, 0, snapdealItemInfo.item_id)
612
        sheet.write(sheet_iterator, 1, snapdealItemInfo.parent_category_name)
613
        sheet.write(sheet_iterator, 2, snapdealItemInfo.product_group)
614
        sheet.write(sheet_iterator, 3, snapdealItemInfo.supc)
615
        sheet.write(sheet_iterator, 4, snapdealItemInfo.brand)
616
        sheet.write(sheet_iterator, 5, xstr(snapdealItemInfo.brand)+" "+xstr(snapdealItemInfo.model_name)+" "+xstr(snapdealItemInfo.model_number)+" "+xstr(snapdealItemInfo.color))
617
        sheet.write(sheet_iterator, 6, snapdealItemInfo.weight)
618
        sheet.write(sheet_iterator, 7, snapdealItemInfo.courierCost)
619
        sheet.write(sheet_iterator, 8, snapdealItemInfo.risky)
620
        sheet.write(sheet_iterator, 9, snapdealPricing.ourSp)
621
        sheet.write(sheet_iterator, 10, snapdealDetails.ourOfferPrice)
622
        sheet.write(sheet_iterator, 11, snapdealPricing.ourTp)
623
        sheet.write(sheet_iterator, 12, snapdealDetails.rank)
624
        sheet.write(sheet_iterator, 13, snapdealDetails.lowestSellerName)
625
        sheet.write(sheet_iterator, 14, snapdealDetails.lowestSp)
626
        sheet.write(sheet_iterator, 15, snapdealPricing.lowestTp)
627
        sheet.write(sheet_iterator, 16, snapdealDetails.lowestOfferPrice)
628
        sheet.write(sheet_iterator, 17, snapdealDetails.otherInventory)
629
        sheet.write(sheet_iterator, 18, snapdealDetails.ourInventory)
630
        if (not inventoryMap.has_key(snapdealItemInfo.item_id)):
631
            sheet.write(sheet_iterator, 19, 'Info not available')
632
        else:
633
            sheet.write(sheet_iterator, 19, getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id)))
634
        sheet.write(sheet_iterator, 20, getOosString((itemSaleMap.get(snapdealItemInfo.item_id))[1]))
635
        sheet.write(sheet_iterator, 21, (itemSaleMap.get(snapdealItemInfo.item_id))[3])
636
        sheet.write(sheet_iterator, 22, snapdealItemInfo.nlc)
637
        sheet.write(sheet_iterator, 23, snapdealPricing.lowestPossibleTp)
638
        sheet.write(sheet_iterator, 24, snapdealPricing.lowestPossibleSp)
10381 manish.sha 639
        sheet.write(sheet_iterator, 25, getSubsidyDiff(snapdealDetails))
9949 kshitij.so 640
        if (snapdealPricing.competitionBasis=='SP'):
641
            proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001)
642
            proposed_tp = getTargetTp(proposed_sp,mpItem)
643
            target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
644
        else:
10381 manish.sha 645
            #proposed_tp  = snapdealPricing.lowestTp - max(10, snapdealPricing.lowestTp*0.001)
646
            #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
647
            proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001) - getSubsidyDiff(snapdealDetails)
648
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9949 kshitij.so 649
            target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 650
        sheet.write(sheet_iterator, 26, round(proposed_tp,2))
651
        sheet.write(sheet_iterator, 27, round(proposed_sp,2))
652
        sheet.write(sheet_iterator, 28, round(target_nlc,2))
9949 kshitij.so 653
        sheet.write(sheet_iterator, 29, getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
654
        sheet_iterator+=1
655
 
656
    sheet = wbk.add_sheet('Lowest')
657
 
658
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
659
 
660
    excel_integer_format = '0'
661
    integer_style = xlwt.XFStyle()
662
    integer_style.num_format_str = excel_integer_format
663
    xstr = lambda s: s or ""
664
 
665
    sheet.write(0, 0, "Item ID", heading_xf)
666
    sheet.write(0, 1, "Category", heading_xf)
667
    sheet.write(0, 2, "Product Group.", heading_xf)
668
    sheet.write(0, 3, "SUPC", heading_xf)
669
    sheet.write(0, 4, "Brand", heading_xf)
670
    sheet.write(0, 5, "Product Name", heading_xf)
671
    sheet.write(0, 6, "Weight", heading_xf)
672
    sheet.write(0, 7, "Courier Cost", heading_xf)
673
    sheet.write(0, 8, "Risky", heading_xf)
674
    sheet.write(0, 9, "Our SP", heading_xf)
675
    sheet.write(0, 11, "Our TP", heading_xf)
676
    sheet.write(0, 10, "Our Offer Price", heading_xf)
677
    sheet.write(0, 12, "Our Rank", heading_xf)
678
    sheet.write(0, 13, "Lowest Seller", heading_xf)
679
    sheet.write(0, 14, "Second Lowest Seller", heading_xf)
680
    sheet.write(0, 15, "Second Lowest Price", heading_xf)
681
    sheet.write(0, 16, "Second Lowest Offer Price", heading_xf)
682
    sheet.write(0, 17, "Second Lowest Seller TP", heading_xf)
683
    sheet.write(0, 18, "Our Snapdeal Inventory", heading_xf)
684
    sheet.write(0, 19, "Our Net Availability",heading_xf)
685
    sheet.write(0, 20, "Last Five Day Sale", heading_xf)
686
    sheet.write(0, 21, "Average Sale", heading_xf)
687
    sheet.write(0, 22, "Second Lowest Seller Inventory", heading_xf)
688
    sheet.write(0, 23, "Our NLC", heading_xf)
10381 manish.sha 689
    sheet.write(0, 24, "Subsidy Difference", heading_xf)
9949 kshitij.so 690
    sheet.write(0, 25, "Target TP", heading_xf)
691
    sheet.write(0, 26, "Target SP", heading_xf)
692
    sheet.write(0, 27, "MARGIN INCREASED POTENTIAL", heading_xf)
10958 kshitij.so 693
    sheet.write(0, 28, "Auto Pricing Decision", heading_xf)
694
    sheet.write(0, 29, "Reason", heading_xf)
695
    sheet.write(0, 30, "Updated Price", heading_xf)
9949 kshitij.so 696
 
697
    sheet_iterator = 1
698
    for item in buyBoxItems:
699
        snapdealDetails = item[0]
700
        snapdealItemInfo = item[1]
701
        snapdealPricing = item[2]
702
        mpItem = item[3]
703
        sheet.write(sheet_iterator, 0, snapdealItemInfo.item_id)
704
        sheet.write(sheet_iterator, 1, snapdealItemInfo.parent_category_name)
705
        sheet.write(sheet_iterator, 2, snapdealItemInfo.product_group)
706
        sheet.write(sheet_iterator, 3, snapdealItemInfo.supc)
707
        sheet.write(sheet_iterator, 4, snapdealItemInfo.brand)
708
        sheet.write(sheet_iterator, 5, xstr(snapdealItemInfo.brand)+" "+xstr(snapdealItemInfo.model_name)+" "+xstr(snapdealItemInfo.model_number)+" "+xstr(snapdealItemInfo.color))
709
        sheet.write(sheet_iterator, 6, snapdealItemInfo.weight)
710
        sheet.write(sheet_iterator, 7, snapdealItemInfo.courierCost)
711
        sheet.write(sheet_iterator, 8, snapdealItemInfo.risky)
712
        sheet.write(sheet_iterator, 9, snapdealPricing.ourSp)
713
        sheet.write(sheet_iterator, 10, snapdealDetails.ourOfferPrice)
714
        sheet.write(sheet_iterator, 11, snapdealPricing.ourTp)
715
        sheet.write(sheet_iterator, 12, snapdealDetails.rank)
716
        sheet.write(sheet_iterator, 13, snapdealDetails.lowestSellerName)
717
        sheet.write(sheet_iterator, 14, snapdealDetails.secondLowestSellerName)
718
        sheet.write(sheet_iterator, 15, snapdealDetails.secondLowestSellerSp)
719
        sheet.write(sheet_iterator, 16, snapdealDetails.secondLowestSellerOfferPrice)
720
        sheet.write(sheet_iterator, 17, snapdealPricing.secondLowestSellerTp)
721
        sheet.write(sheet_iterator, 18, snapdealDetails.ourInventory)
722
        if (not inventoryMap.has_key(snapdealItemInfo.item_id)):
723
            sheet.write(sheet_iterator, 19, 'Info not available')
724
        else:
725
            sheet.write(sheet_iterator, 19, getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id)))
726
        sheet.write(sheet_iterator, 20, getOosString((itemSaleMap.get(snapdealItemInfo.item_id))[1]))
727
        sheet.write(sheet_iterator, 21, (itemSaleMap.get(snapdealItemInfo.item_id))[3])
728
        sheet.write(sheet_iterator, 22, snapdealDetails.secondLowestSellerInventory)
729
        sheet.write(sheet_iterator, 23, snapdealItemInfo.nlc)
10381 manish.sha 730
        sheet.write(sheet_iterator, 24, getSubsidyDiff(snapdealDetails))
9949 kshitij.so 731
        if (snapdealPricing.competitionBasis=='SP'):
732
            proposed_sp = max(snapdealDetails.secondLowestSellerSp - max((20, snapdealDetails.secondLowestSellerSp*0.002)), snapdealPricing.lowestPossibleSp)
733
            proposed_tp = getTargetTp(proposed_sp,mpItem)
734
            #target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
735
        else:
10381 manish.sha 736
            #proposed_tp  = max(snapdealPricing.secondLowestSellerTp - max((20, snapdealPricing.secondLowestSellerTp*0.002)), snapdealPricing.lowestPossibleTp)
737
            #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
738
            proposed_sp = max(snapdealDetails.secondLowestSellerSp - max((20, snapdealDetails.secondLowestSellerSp*0.002)) -getSubsidyDiff(snapdealDetails), snapdealPricing.lowestPossibleSp)
739
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9949 kshitij.so 740
            #target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 741
        sheet.write(sheet_iterator, 25, round(proposed_tp,2))
742
        sheet.write(sheet_iterator, 26, round(proposed_sp,2))
743
        sheet.write(sheet_iterator, 27, round((proposed_tp - snapdealPricing.ourTp),2))
10958 kshitij.so 744
        mp_history_item = session.query(MarketPlaceHistory).filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.item_id==snapdealItemInfo.item_id).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).one()
10960 kshitij.so 745
        if mp_history_item.decision is None:
10959 kshitij.so 746
            sheet.write(sheet_iterator, 28, 'Auto Pricing Inactive')
747
            sheet_iterator+=1
748
            continue
10958 kshitij.so 749
        sheet.write(sheet_iterator, 28, Decision._VALUES_TO_NAMES.get(mp_history_item.decision))
750
        sheet.write(sheet_iterator, 29, mp_history_item.reason)
751
        if Decision._VALUES_TO_NAMES.get(mp_history_item.decision) == "AUTO_DECREMENT_SUCCESS":
752
            sheet.write(sheet_iterator, 30, math.ceil(mp_history_item.proposedSellingPrice))
753
        if Decision._VALUES_TO_NAMES.get(mp_history_item.decision) == "AUTO_INCREMENT_SUCCESS":
754
            sheet.write(sheet_iterator, 30, math.ceil(mp_history_item.ourSellingPrice+max(10,.01*mp_history_item.ourSellingPrice)))
9949 kshitij.so 755
        sheet_iterator+=1
756
 
757
    sheet = wbk.add_sheet('Can Compete-With Inventory')
758
 
759
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
760
 
761
    excel_integer_format = '0'
762
    integer_style = xlwt.XFStyle()
763
    integer_style.num_format_str = excel_integer_format
764
    xstr = lambda s: s or ""
765
 
766
    sheet.write(0, 0, "Item ID", heading_xf)
767
    sheet.write(0, 1, "Category", heading_xf)
768
    sheet.write(0, 2, "Product Group.", heading_xf)
769
    sheet.write(0, 3, "SUPC", heading_xf)
770
    sheet.write(0, 4, "Brand", heading_xf)
771
    sheet.write(0, 5, "Product Name", heading_xf)
772
    sheet.write(0, 6, "Weight", heading_xf)
773
    sheet.write(0, 7, "Courier Cost", heading_xf)
774
    sheet.write(0, 8, "Risky", heading_xf)
775
    sheet.write(0, 9, "Our SP", heading_xf)
776
    sheet.write(0, 11, "Our TP", heading_xf)
777
    sheet.write(0, 10, "Our Offer Price", heading_xf)
778
    sheet.write(0, 12, "Our Rank", heading_xf)
779
    sheet.write(0, 13, "Lowest Seller", heading_xf)
780
    sheet.write(0, 14, "Lowest SP", heading_xf)
781
    sheet.write(0, 15, "Lowest TP", heading_xf)
782
    sheet.write(0, 16, "Lowest Offer Price", heading_xf)
783
    sheet.write(0, 17, "Inventory of Top Vendors", heading_xf)
784
    sheet.write(0, 18, "Our Snapdeal Inventory", heading_xf)
785
    sheet.write(0, 19, "Our Net Availability",heading_xf)
786
    sheet.write(0, 20, "Last Five Day Sale", heading_xf)
787
    sheet.write(0, 21, "Average Sale", heading_xf)
788
    sheet.write(0, 22, "Our NLC", heading_xf)
789
    sheet.write(0, 23, "Lowest Possible TP", heading_xf)
790
    sheet.write(0, 24, "Lowest Possible SP", heading_xf)
10381 manish.sha 791
    sheet.write(0, 25, "Subsidy Difference", heading_xf)
9949 kshitij.so 792
    sheet.write(0, 26, "Target TP", heading_xf)
793
    sheet.write(0, 27, "Target SP", heading_xf)  
794
    sheet.write(0, 28, "Sales Potential", heading_xf)
10958 kshitij.so 795
    sheet.write(0, 29, "Auto Pricing Decision", heading_xf)
796
    sheet.write(0, 30, "Reason", heading_xf)
797
    sheet.write(0, 31, "Updated Price", heading_xf)
9949 kshitij.so 798
 
799
    sheet_iterator = 1
800
    for item in competitive:
801
        snapdealDetails = item[0]
802
        snapdealItemInfo = item[1]
803
        snapdealPricing = item[2]
804
        mpItem = item[3]
805
        sheet.write(sheet_iterator, 0, snapdealItemInfo.item_id)
806
        sheet.write(sheet_iterator, 1, snapdealItemInfo.parent_category_name)
807
        sheet.write(sheet_iterator, 2, snapdealItemInfo.product_group)
808
        sheet.write(sheet_iterator, 3, snapdealItemInfo.supc)
809
        sheet.write(sheet_iterator, 4, snapdealItemInfo.brand)
810
        sheet.write(sheet_iterator, 5, xstr(snapdealItemInfo.brand)+" "+xstr(snapdealItemInfo.model_name)+" "+xstr(snapdealItemInfo.model_number)+" "+xstr(snapdealItemInfo.color))
811
        sheet.write(sheet_iterator, 6, snapdealItemInfo.weight)
812
        sheet.write(sheet_iterator, 7, snapdealItemInfo.courierCost)
813
        sheet.write(sheet_iterator, 8, snapdealItemInfo.risky)
814
        sheet.write(sheet_iterator, 9, snapdealPricing.ourSp)
815
        sheet.write(sheet_iterator, 10, snapdealDetails.ourOfferPrice)
816
        sheet.write(sheet_iterator, 11, snapdealPricing.ourTp)
817
        sheet.write(sheet_iterator, 12, snapdealDetails.rank)
818
        sheet.write(sheet_iterator, 13, snapdealDetails.lowestSellerName)
819
        sheet.write(sheet_iterator, 14, snapdealDetails.lowestSp)
820
        sheet.write(sheet_iterator, 15, snapdealPricing.lowestTp)
821
        sheet.write(sheet_iterator, 16, snapdealDetails.lowestOfferPrice)
822
        sheet.write(sheet_iterator, 17, snapdealDetails.otherInventory)
823
        sheet.write(sheet_iterator, 18, snapdealDetails.ourInventory)
824
        if (not inventoryMap.has_key(snapdealItemInfo.item_id)):
825
            sheet.write(sheet_iterator, 19, 'Info not available')
826
        else:
827
            sheet.write(sheet_iterator, 19, getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id)))
828
        sheet.write(sheet_iterator, 20, getOosString((itemSaleMap.get(snapdealItemInfo.item_id))[1]))
829
        sheet.write(sheet_iterator, 21, (itemSaleMap.get(snapdealItemInfo.item_id))[3])
830
        sheet.write(sheet_iterator, 22, snapdealItemInfo.nlc)
831
        sheet.write(sheet_iterator, 23, snapdealPricing.lowestPossibleTp)
832
        sheet.write(sheet_iterator, 24, snapdealPricing.lowestPossibleSp)
10381 manish.sha 833
        sheet.write(sheet_iterator, 25, getSubsidyDiff(snapdealDetails))
9949 kshitij.so 834
        if (snapdealPricing.competitionBasis=='SP'):
835
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)), snapdealPricing.lowestPossibleSp)
836
            proposed_tp = getTargetTp(proposed_sp,mpItem)
837
        else:
10381 manish.sha 838
            #proposed_tp  = max(snapdealPricing.lowestTp - max((10, snapdealPricing.lowestTp*0.001)), snapdealPricing.lowestPossibleTp)
839
            #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
840
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)) -getSubsidyDiff(snapdealDetails), snapdealPricing.lowestPossibleSp)
841
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9954 kshitij.so 842
        sheet.write(sheet_iterator, 26, round(proposed_tp,2))
843
        sheet.write(sheet_iterator, 27, round(proposed_sp,2))
9949 kshitij.so 844
        sheet.write(sheet_iterator, 28, getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
10958 kshitij.so 845
        mp_history_item = session.query(MarketPlaceHistory).filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.item_id==snapdealItemInfo.item_id).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).one()
10960 kshitij.so 846
        if mp_history_item.decision is None:
10959 kshitij.so 847
            sheet.write(sheet_iterator, 29, 'Auto pricing Inactive')
848
            sheet_iterator+=1
849
            continue
10958 kshitij.so 850
        sheet.write(sheet_iterator, 29, Decision._VALUES_TO_NAMES.get(mp_history_item.decision))
851
        sheet.write(sheet_iterator, 30, mp_history_item.reason)
852
        if Decision._VALUES_TO_NAMES.get(mp_history_item.decision) == "AUTO_DECREMENT_SUCCESS":
853
            sheet.write(sheet_iterator, 31, math.ceil(mp_history_item.proposedSellingPrice))
854
        if Decision._VALUES_TO_NAMES.get(mp_history_item.decision) == "AUTO_INCREMENT_SUCCESS":
855
            sheet.write(sheet_iterator, 31, math.ceil(mp_history_item.ourSellingPrice+max(10,.01*mp_history_item.ourSellingPrice)))
9949 kshitij.so 856
        sheet_iterator+=1
857
 
858
    sheet = wbk.add_sheet('Negative Margin')
859
 
860
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
861
 
862
    excel_integer_format = '0'
863
    integer_style = xlwt.XFStyle()
864
    integer_style.num_format_str = excel_integer_format
865
    xstr = lambda s: s or ""
866
 
867
    sheet.write(0, 0, "Item ID", heading_xf)
868
    sheet.write(0, 1, "Category", heading_xf)
869
    sheet.write(0, 2, "Product Group.", heading_xf)
870
    sheet.write(0, 3, "SUPC", heading_xf)
871
    sheet.write(0, 4, "Brand", heading_xf)
872
    sheet.write(0, 5, "Product Name", heading_xf)
873
    sheet.write(0, 6, "Weight", heading_xf)
874
    sheet.write(0, 7, "Courier Cost", heading_xf)
875
    sheet.write(0, 8, "Risky", heading_xf)
876
    sheet.write(0, 9, "Our SP", heading_xf)
877
    sheet.write(0, 11, "Our TP", heading_xf)
878
    sheet.write(0, 12, "Lowest Possible TP", heading_xf)
879
    sheet.write(0, 10, "Our Offer Price", heading_xf)
880
    sheet.write(0, 13, "Our Rank", heading_xf)
881
    sheet.write(0, 14, "Our Snapdeal Inventory", heading_xf)
882
    sheet.write(0, 15, "Net Availability", heading_xf)
883
    sheet.write(0, 16, "Last Five Day Sale", heading_xf)
884
    sheet.write(0, 17, "Average Sale", heading_xf)
885
    sheet.write(0, 18, "Our NLC", heading_xf)
886
    sheet.write(0, 19, "Margin", heading_xf)
887
 
888
    sheet_iterator=1
889
    for item in negativeMargin:
890
        snapdealDetails = item[0]
891
        snapdealItemInfo = item[1]
892
        snapdealPricing = item[2]
893
        sheet.write(sheet_iterator, 0, snapdealItemInfo.item_id)
894
        sheet.write(sheet_iterator, 1, snapdealItemInfo.parent_category_name)
895
        sheet.write(sheet_iterator, 2, snapdealItemInfo.product_group)
896
        sheet.write(sheet_iterator, 3, snapdealItemInfo.supc)
897
        sheet.write(sheet_iterator, 4, snapdealItemInfo.brand)
898
        sheet.write(sheet_iterator, 5, xstr(snapdealItemInfo.brand)+" "+xstr(snapdealItemInfo.model_name)+" "+xstr(snapdealItemInfo.model_number)+" "+xstr(snapdealItemInfo.color))
899
        sheet.write(sheet_iterator, 6, snapdealItemInfo.weight)
900
        sheet.write(sheet_iterator, 7, snapdealItemInfo.courierCost)
901
        sheet.write(sheet_iterator, 8, snapdealItemInfo.risky)
902
        sheet.write(sheet_iterator, 9, snapdealPricing.ourSp)
903
        sheet.write(sheet_iterator, 10, snapdealDetails.ourOfferPrice)
904
        sheet.write(sheet_iterator, 11, snapdealPricing.ourTp)
905
        sheet.write(sheet_iterator, 12, snapdealPricing.lowestPossibleTp)
906
        sheet.write(sheet_iterator, 13, snapdealDetails.rank)
907
        sheet.write(sheet_iterator, 14, snapdealDetails.ourInventory)
908
        if (not inventoryMap.has_key(snapdealItemInfo.item_id)):
909
            sheet.write(sheet_iterator, 15, 'Info not available')
910
        else:
911
            sheet.write(sheet_iterator, 15, getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id)))
912
        sheet.write(sheet_iterator, 16, getOosString((itemSaleMap.get(snapdealItemInfo.item_id))[1]))
913
        sheet.write(sheet_iterator, 17, (itemSaleMap.get(snapdealItemInfo.item_id))[3])
914
        sheet.write(sheet_iterator, 18, snapdealItemInfo.nlc)
9954 kshitij.so 915
        sheet.write(sheet_iterator, 19, round((snapdealPricing.ourTp - snapdealPricing.lowestPossibleTp),2))
9949 kshitij.so 916
        sheet_iterator+=1
917
 
918
    sheet = wbk.add_sheet('Exception Item List')
919
 
920
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
921
 
922
    excel_integer_format = '0'
923
    integer_style = xlwt.XFStyle()
924
    integer_style.num_format_str = excel_integer_format
925
    xstr = lambda s: s or ""
926
 
927
    sheet.write(0, 0, "Item ID", heading_xf)
928
    sheet.write(0, 1, "Brand", heading_xf)
929
    sheet.write(0, 2, "Product Name", heading_xf)
930
    sheet.write(0, 3, "Reason", heading_xf)
931
    sheet_iterator=1
932
    for item in exceptionList:
933
        sheet.write(sheet_iterator, 0, item.item_id)
934
        sheet.write(sheet_iterator, 1, item.brand)
935
        sheet.write(sheet_iterator, 2, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
936
        sheet.write(sheet_iterator, 3, "Unable to fetch info from Snapdeal")
937
        sheet_iterator+=1
938
 
939
    sheet = wbk.add_sheet('Can Compete-No Inv')
940
 
941
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
942
 
943
    excel_integer_format = '0'
944
    integer_style = xlwt.XFStyle()
945
    integer_style.num_format_str = excel_integer_format
946
    xstr = lambda s: s or ""
947
 
948
    sheet.write(0, 0, "Item ID", heading_xf)
949
    sheet.write(0, 1, "Category", heading_xf)
950
    sheet.write(0, 2, "Product Group.", heading_xf)
951
    sheet.write(0, 3, "SUPC", heading_xf)
952
    sheet.write(0, 4, "Brand", heading_xf)
953
    sheet.write(0, 5, "Product Name", heading_xf)
954
    sheet.write(0, 6, "Weight", heading_xf)
955
    sheet.write(0, 7, "Courier Cost", heading_xf)
956
    sheet.write(0, 8, "Risky", heading_xf)
957
    sheet.write(0, 9, "Our SP", heading_xf)
958
    sheet.write(0, 11, "Our TP", heading_xf)
959
    sheet.write(0, 10, "Our Offer Price", heading_xf)
960
    sheet.write(0, 12, "Our Rank", heading_xf)
961
    sheet.write(0, 13, "Lowest Seller", heading_xf)
962
    sheet.write(0, 14, "Lowest SP", heading_xf)
963
    sheet.write(0, 15, "Lowest TP", heading_xf)
964
    sheet.write(0, 16, "Lowest Offer Price", heading_xf)
965
    sheet.write(0, 17, "Inventory of Top Vendors", heading_xf)
966
    sheet.write(0, 18, "Our Snapdeal Inventory", heading_xf)
967
    sheet.write(0, 19, "Our Net Availability",heading_xf)
968
    sheet.write(0, 20, "Last Five Day Sale", heading_xf)
969
    sheet.write(0, 21, "Average Sale", heading_xf)
970
    sheet.write(0, 22, "Our NLC", heading_xf)
971
    sheet.write(0, 23, "Lowest Possible TP", heading_xf)
972
    sheet.write(0, 24, "Lowest Possible SP", heading_xf)
10381 manish.sha 973
    sheet.write(0, 25, "Subsidy Difference", heading_xf)
9949 kshitij.so 974
    sheet.write(0, 26, "Target TP", heading_xf)
975
    sheet.write(0, 27, "Target SP", heading_xf)  
976
    sheet.write(0, 28, "Target NLC", heading_xf)
977
    sheet.write(0, 29, "Sales Potential", heading_xf)
978
 
979
    sheet_iterator = 1
980
    for item in competitiveNoInventory:
981
        snapdealDetails = item[0]
982
        snapdealItemInfo = item[1]
983
        snapdealPricing = item[2]
984
        mpItem = item[3]
985
        if ((not inventoryMap.has_key(snapdealItemInfo.item_id)) or getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id))<=0):
986
            sheet.write(sheet_iterator, 0, snapdealItemInfo.item_id)
987
            sheet.write(sheet_iterator, 1, snapdealItemInfo.parent_category_name)
988
            sheet.write(sheet_iterator, 2, snapdealItemInfo.product_group)
989
            sheet.write(sheet_iterator, 3, snapdealItemInfo.supc)
990
            sheet.write(sheet_iterator, 4, snapdealItemInfo.brand)
991
            sheet.write(sheet_iterator, 5, xstr(snapdealItemInfo.brand)+" "+xstr(snapdealItemInfo.model_name)+" "+xstr(snapdealItemInfo.model_number)+" "+xstr(snapdealItemInfo.color))
992
            sheet.write(sheet_iterator, 6, snapdealItemInfo.weight)
993
            sheet.write(sheet_iterator, 7, snapdealItemInfo.courierCost)
994
            sheet.write(sheet_iterator, 8, snapdealItemInfo.risky)
995
            sheet.write(sheet_iterator, 9, snapdealPricing.ourSp)
996
            sheet.write(sheet_iterator, 10, snapdealDetails.ourOfferPrice)
997
            sheet.write(sheet_iterator, 11, snapdealPricing.ourTp)
998
            sheet.write(sheet_iterator, 12, snapdealDetails.rank)
999
            sheet.write(sheet_iterator, 13, snapdealDetails.lowestSellerName)
1000
            sheet.write(sheet_iterator, 14, snapdealDetails.lowestSp)
1001
            sheet.write(sheet_iterator, 15, snapdealPricing.lowestTp)
1002
            sheet.write(sheet_iterator, 16, snapdealDetails.lowestOfferPrice)
1003
            sheet.write(sheet_iterator, 17, snapdealDetails.otherInventory)
1004
            sheet.write(sheet_iterator, 18, snapdealDetails.ourInventory)
1005
            if (not inventoryMap.has_key(snapdealItemInfo.item_id)):
1006
                sheet.write(sheet_iterator, 19, 'Info not available')
1007
            else:
1008
                sheet.write(sheet_iterator, 19, getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id)))
1009
            sheet.write(sheet_iterator, 20, getOosString((itemSaleMap.get(snapdealItemInfo.item_id))[1]))
1010
            sheet.write(sheet_iterator, 21, (itemSaleMap.get(snapdealItemInfo.item_id))[3])
1011
            sheet.write(sheet_iterator, 22, snapdealItemInfo.nlc)
1012
            sheet.write(sheet_iterator, 23, snapdealPricing.lowestPossibleTp)
1013
            sheet.write(sheet_iterator, 24, snapdealPricing.lowestPossibleSp)
10381 manish.sha 1014
            sheet.write(sheet_iterator, 25, getSubsidyDiff(snapdealDetails))
9949 kshitij.so 1015
            if (snapdealPricing.competitionBasis=='SP'):
1016
                proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001)
1017
                proposed_tp = getTargetTp(proposed_sp,mpItem)
1018
                target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
1019
            else:
10381 manish.sha 1020
                #proposed_tp  = snapdealPricing.lowestTp - max(10, snapdealPricing.lowestTp*0.001)
1021
                #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
1022
                proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001) -getSubsidyDiff(snapdealDetails)
1023
                proposed_tp = getTargetTp(proposed_sp,mpItem)
9949 kshitij.so 1024
                target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 1025
            sheet.write(sheet_iterator, 26, round(proposed_tp,2))
1026
            sheet.write(sheet_iterator, 27, round(proposed_sp,2))
1027
            sheet.write(sheet_iterator, 28, round(target_nlc,2))
9949 kshitij.so 1028
            sheet.write(sheet_iterator, 29, getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
1029
            sheet_iterator+=1
1030
 
1031
    sheet = wbk.add_sheet('Can Compete-No Inv On SD')
1032
 
1033
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1034
 
1035
    excel_integer_format = '0'
1036
    integer_style = xlwt.XFStyle()
1037
    integer_style.num_format_str = excel_integer_format
1038
    xstr = lambda s: s or ""
1039
 
1040
    sheet.write(0, 0, "Item ID", heading_xf)
1041
    sheet.write(0, 1, "Category", heading_xf)
1042
    sheet.write(0, 2, "Product Group.", heading_xf)
1043
    sheet.write(0, 3, "SUPC", heading_xf)
1044
    sheet.write(0, 4, "Brand", heading_xf)
1045
    sheet.write(0, 5, "Product Name", heading_xf)
1046
    sheet.write(0, 6, "Weight", heading_xf)
1047
    sheet.write(0, 7, "Courier Cost", heading_xf)
1048
    sheet.write(0, 8, "Risky", heading_xf)
1049
    sheet.write(0, 9, "Our SP", heading_xf)
1050
    sheet.write(0, 11, "Our TP", heading_xf)
1051
    sheet.write(0, 10, "Our Offer Price", heading_xf)
1052
    sheet.write(0, 12, "Our Rank", heading_xf)
1053
    sheet.write(0, 13, "Lowest Seller", heading_xf)
1054
    sheet.write(0, 14, "Lowest SP", heading_xf)
1055
    sheet.write(0, 15, "Lowest TP", heading_xf)
1056
    sheet.write(0, 16, "Lowest Offer Price", heading_xf)
1057
    sheet.write(0, 17, "Inventory of Top Vendors", heading_xf)
1058
    sheet.write(0, 18, "Our Snapdeal Inventory", heading_xf)
1059
    sheet.write(0, 19, "Our Net Availability",heading_xf)
1060
    sheet.write(0, 20, "Last Five Day Sale", heading_xf)
1061
    sheet.write(0, 21, "Average Sale", heading_xf)
1062
    sheet.write(0, 22, "Our NLC", heading_xf)
1063
    sheet.write(0, 23, "Lowest Possible TP", heading_xf)
1064
    sheet.write(0, 24, "Lowest Possible SP", heading_xf)
10381 manish.sha 1065
    sheet.write(0, 25, "Subsidy Difference", heading_xf)
9949 kshitij.so 1066
    sheet.write(0, 26, "Target TP", heading_xf)
1067
    sheet.write(0, 27, "Target SP", heading_xf)  
1068
    sheet.write(0, 28, "Target NLC", heading_xf)
1069
    sheet.write(0, 29, "Sales Potential", heading_xf)
1070
 
1071
    sheet_iterator = 1
1072
    for item in competitiveNoInventory:
1073
        snapdealDetails = item[0]
1074
        snapdealItemInfo = item[1]
1075
        snapdealPricing = item[2]
1076
        mpItem = item[3]
1077
        if (inventoryMap.has_key(snapdealItemInfo.item_id) and getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id))>0):
1078
            sheet.write(sheet_iterator, 0, snapdealItemInfo.item_id)
1079
            sheet.write(sheet_iterator, 1, snapdealItemInfo.parent_category_name)
1080
            sheet.write(sheet_iterator, 2, snapdealItemInfo.product_group)
1081
            sheet.write(sheet_iterator, 3, snapdealItemInfo.supc)
1082
            sheet.write(sheet_iterator, 4, snapdealItemInfo.brand)
1083
            sheet.write(sheet_iterator, 5, xstr(snapdealItemInfo.brand)+" "+xstr(snapdealItemInfo.model_name)+" "+xstr(snapdealItemInfo.model_number)+" "+xstr(snapdealItemInfo.color))
1084
            sheet.write(sheet_iterator, 6, snapdealItemInfo.weight)
1085
            sheet.write(sheet_iterator, 7, snapdealItemInfo.courierCost)
1086
            sheet.write(sheet_iterator, 8, snapdealItemInfo.risky)
1087
            sheet.write(sheet_iterator, 9, snapdealPricing.ourSp)
1088
            sheet.write(sheet_iterator, 10, snapdealDetails.ourOfferPrice)
1089
            sheet.write(sheet_iterator, 11, snapdealPricing.ourTp)
1090
            sheet.write(sheet_iterator, 12, snapdealDetails.rank)
1091
            sheet.write(sheet_iterator, 13, snapdealDetails.lowestSellerName)
1092
            sheet.write(sheet_iterator, 14, snapdealDetails.lowestSp)
1093
            sheet.write(sheet_iterator, 15, snapdealPricing.lowestTp)
1094
            sheet.write(sheet_iterator, 16, snapdealDetails.lowestOfferPrice)
1095
            sheet.write(sheet_iterator, 17, snapdealDetails.otherInventory)
1096
            sheet.write(sheet_iterator, 18, snapdealDetails.ourInventory)
1097
            if (not inventoryMap.has_key(snapdealItemInfo.item_id)):
1098
                sheet.write(sheet_iterator, 19, 'Info not available')
1099
            else:
1100
                sheet.write(sheet_iterator, 19, getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id)))
1101
            sheet.write(sheet_iterator, 20, getOosString((itemSaleMap.get(snapdealItemInfo.item_id))[1]))
1102
            sheet.write(sheet_iterator, 21, (itemSaleMap.get(snapdealItemInfo.item_id))[3])
1103
            sheet.write(sheet_iterator, 22, snapdealItemInfo.nlc)
1104
            sheet.write(sheet_iterator, 23, snapdealPricing.lowestPossibleTp)
1105
            sheet.write(sheet_iterator, 24, snapdealPricing.lowestPossibleSp)
10381 manish.sha 1106
            sheet.write(sheet_iterator, 25, getSubsidyDiff(snapdealDetails))
9949 kshitij.so 1107
            if (snapdealPricing.competitionBasis=='SP'):
1108
                proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001)
1109
                proposed_tp = getTargetTp(proposed_sp,mpItem)
1110
                target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
1111
            else:
10381 manish.sha 1112
                #proposed_tp  = snapdealPricing.lowestTp - max(10, snapdealPricing.lowestTp*0.001)
1113
                #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
1114
                proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001) -getSubsidyDiff(snapdealDetails)
1115
                proposed_tp = getTargetTp(proposed_sp,mpItem)
9949 kshitij.so 1116
                target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 1117
            sheet.write(sheet_iterator, 26, round(proposed_tp,2))
1118
            sheet.write(sheet_iterator, 27, round(proposed_sp,2))
1119
            sheet.write(sheet_iterator, 28, round(target_nlc,2))
9949 kshitij.so 1120
            sheet.write(sheet_iterator, 29, getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
1121
            sheet_iterator+=1
9953 kshitij.so 1122
 
1123
    if (runType=='FULL'):    
1124
        sheet = wbk.add_sheet('Auto Favorites')
1125
 
1126
        heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1127
 
1128
        excel_integer_format = '0'
1129
        integer_style = xlwt.XFStyle()
1130
        integer_style.num_format_str = excel_integer_format
1131
        xstr = lambda s: s or ""
1132
 
1133
        sheet.write(0, 0, "Item ID", heading_xf)
1134
        sheet.write(0, 1, "Brand", heading_xf)
1135
        sheet.write(0, 2, "Product Name", heading_xf)
1136
        sheet.write(0, 3, "Auto Favourite", heading_xf)
1137
        sheet.write(0, 4, "Reason", heading_xf)
1138
 
1139
        sheet_iterator=1
1140
        for autoFav in nowAutoFav:
1141
            itemId = autoFav[0]
1142
            reason = autoFav[1]
1143
            it = Item.query.filter_by(id=itemId).one()
1144
            sheet.write(sheet_iterator, 0, itemId)
1145
            sheet.write(sheet_iterator, 1, it.brand)
1146
            sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
1147
            sheet.write(sheet_iterator, 3, "True")
1148
            sheet.write(sheet_iterator, 4, reason)
1149
            sheet_iterator+=1
1150
        for prevFav in previousAutoFav:
1151
            it = Item.query.filter_by(id=prevFav).one()
1152
            sheet.write(sheet_iterator, 0, prevFav)
1153
            sheet.write(sheet_iterator, 1, it.brand)
1154
            sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
1155
            sheet.write(sheet_iterator, 3, "False")
1156
            sheet_iterator+=1
9949 kshitij.so 1157
 
1158
 
10959 kshitij.so 1159
#    autoPricingItems = session.query(MarketPlaceHistory,Item).join((Item,MarketPlaceHistory.item_id==Item.id)).filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.decision.in_([1,2,3,4])).all()
1160
#    sheet = wbk.add_sheet('Auto Inc and Dec')
1161
#
1162
#    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1163
#    
1164
#    excel_integer_format = '0'
1165
#    integer_style = xlwt.XFStyle()
1166
#    integer_style.num_format_str = excel_integer_format
1167
#    xstr = lambda s: s or ""
1168
#    
1169
#    sheet.write(0, 0, "Item ID", heading_xf)
1170
#    sheet.write(0, 1, "Brand", heading_xf)
1171
#    sheet.write(0, 2, "Product Name", heading_xf)
1172
#    sheet.write(0, 3, "Decision", heading_xf)
1173
#    sheet.write(0, 4, "Reason", heading_xf)
1174
#    sheet.write(0, 5, "Old Selling Price", heading_xf)
1175
#    sheet.write(0, 6, "Selling Price Updated",heading_xf)
1176
#    
1177
#    sheet_iterator=1
1178
#    for autoPricingItem in autoPricingItems:
1179
#        mpHistory = autoPricingItem[0]
1180
#        item = autoPricingItem[1]
1181
#        it = Item.query.filter_by(id=item.id).one()
1182
#        sheet.write(sheet_iterator, 0, item.id)
1183
#        sheet.write(sheet_iterator, 1, it.brand)
1184
#        sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
1185
#        sheet.write(sheet_iterator, 3, Decision._VALUES_TO_NAMES.get(mpHistory.decision))
1186
#        sheet.write(sheet_iterator, 4, mpHistory.reason)
1187
#        if Decision._VALUES_TO_NAMES.get(mpHistory.decision) == "AUTO_DECREMENT_SUCCESS":
1188
#            sheet.write(sheet_iterator, 5, mpHistory.ourSellingPrice)
1189
#            sheet.write(sheet_iterator, 6, math.ceil(mpHistory.proposedSellingPrice))
1190
#        if Decision._VALUES_TO_NAMES.get(mpHistory.decision) == "AUTO_INCREMENT_SUCCESS":
1191
#            sheet.write(sheet_iterator, 5, mpHistory.ourSellingPrice)
1192
#            sheet.write(sheet_iterator, 6, math.ceil(mpHistory.ourSellingPrice+max(10,.01*mpHistory.ourSellingPrice)))
1193
#        sheet_iterator+=1
9949 kshitij.so 1194
 
9953 kshitij.so 1195
    filename = "/tmp/snapdeal-report-"+runType+" " + str(timestamp) + ".xls"
9949 kshitij.so 1196
    wbk.save(filename)
10207 kshitij.so 1197
    try:
10293 kshitij.so 1198
        #EmailAttachmentSender.mail("build@shop2020.in", "cafe@nes", ["kshitij.sood@saholic.com"], " Snapdeal Auto Pricing "+runType+" " + str(timestamp), "", [get_attachment_part(filename)], [""], [])
11116 kshitij.so 1199
        EmailAttachmentSender.mail("build@shop2020.in", "cafe@nes", ["chandan.kumar@saholic.com","manoj.kumar@saholic.com","yukti.jain@saholic.com","ankush.dhingra@saholic.com","manoj.pal@saholic.com"], " Snapdeal Auto Pricing "+runType+" " + str(timestamp), "", [get_attachment_part(filename)], ["rajneesh.arora@saholic.com","anikendra.das@saholic.com","vikram.raghav@saholic.com","kshitij.sood@saholic.com","chaitnaya.vats@saholic.com","khushal.bhatia@saholic.com"], [])
10207 kshitij.so 1200
    except Exception as e:
1201
        print e
10219 kshitij.so 1202
        print "Unable to send report.Trying with local SMTP"
1203
        smtpServer = smtplib.SMTP('localhost')
1204
        smtpServer.set_debuglevel(1)
11777 kshitij.so 1205
        sender = 'build@shop2020.in'
10293 kshitij.so 1206
        #recipients = ['kshitij.sood@saholic.com']
10219 kshitij.so 1207
        msg = MIMEMultipart()
11753 kshitij.so 1208
        msg['Subject'] = "Snapdeal Auto Pricing " +runType+" " + str(timestamp)
10219 kshitij.so 1209
        msg['From'] = sender
11116 kshitij.so 1210
        recipients = ['rajneesh.arora@saholic.com','anikendra.das@saholic.com','vikram.raghav@saholic.com','kshitij.sood@saholic.com','khushal.bhatia@saholic.com','chaitnaya.vats@saholic.com','chandan.kumar@saholic.com','manoj.kumar@saholic.com','yukti.jain@saholic.com','ankush.dhingra@saholic.com','manoj.pal@saholic.com']
10222 kshitij.so 1211
        msg['To'] = ",".join(recipients)
10219 kshitij.so 1212
        fileMsg = email.mime.base.MIMEBase('application','vnd.ms-excel')
1213
        fileMsg.set_payload(file(filename).read())
1214
        email.encoders.encode_base64(fileMsg)
1215
        fileMsg.add_header('Content-Disposition','attachment;filename=snapdeal.xls')
1216
        msg.attach(fileMsg)
1217
        try:
1218
            smtpServer.sendmail(sender, recipients, msg.as_string())
1219
            print "Successfully sent email"
1220
        except:
1221
            print "Error: unable to send email."
9881 kshitij.so 1222
 
10219 kshitij.so 1223
 
9881 kshitij.so 1224
def commitExceptionList(exceptionList,timestamp):
9949 kshitij.so 1225
    exceptionItems=[]
9881 kshitij.so 1226
    for item in exceptionList:
1227
        mpHistory = MarketPlaceHistory()
1228
        mpHistory.item_id =item.item_id
1229
        mpHistory.source = OrderSource.SNAPDEAL 
1230
        mpHistory.competitiveCategory = CompetitionCategory.EXCEPTION
1231
        mpHistory.risky = item.risky
1232
        mpHistory.timestamp = timestamp
9949 kshitij.so 1233
        mpHistory.run = RunType._NAMES_TO_VALUES.get(item.runType)
1234
        exceptionItems.append(mpHistory)
9881 kshitij.so 1235
    session.commit()
9949 kshitij.so 1236
    return exceptionItems
9881 kshitij.so 1237
 
1238
def commitNegativeMargin(negativeMargin,timestamp):
9949 kshitij.so 1239
    negativeMarginItems = []
9881 kshitij.so 1240
    for item in negativeMargin:
1241
        snapdealDetails = item[0]
1242
        snapdealItemInfo = item[1]
1243
        snapdealPricing = item[2]
1244
        mpHistory = MarketPlaceHistory()
1245
        mpHistory.item_id = snapdealItemInfo.item_id
1246
        mpHistory.source = OrderSource.SNAPDEAL
1247
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
1248
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
1249
        mpHistory.ourTp = snapdealPricing.ourTp
9919 kshitij.so 1250
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
9881 kshitij.so 1251
        mpHistory.ourNlc = snapdealItemInfo.nlc
1252
        mpHistory.ourInventory = snapdealDetails.ourInventory
1253
        mpHistory.otherInventory = snapdealDetails.otherInventory
1254
        mpHistory.ourRank = snapdealDetails.rank
9919 kshitij.so 1255
        mpHistory.risky = snapdealItemInfo.risky
1256
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp  
9881 kshitij.so 1257
        mpHistory.competitiveCategory = CompetitionCategory.NEGATIVE_MARGIN
1258
        mpHistory.totalSeller = snapdealDetails.totalSeller
11060 kshitij.so 1259
        mpHistory.avgSales = (itemSaleMap.get(snapdealItemInfo.item_id))[3]
9881 kshitij.so 1260
        mpHistory.timestamp = timestamp
9949 kshitij.so 1261
        mpHistory.run = RunType._NAMES_TO_VALUES.get(snapdealItemInfo.runType)
1262
        negativeMarginItems.append(mpHistory) 
9881 kshitij.so 1263
    session.commit()
9949 kshitij.so 1264
    return negativeMarginItems
9881 kshitij.so 1265
 
1266
def commitCompetitive(competitive,timestamp):
9949 kshitij.so 1267
    competitiveItems = []
9881 kshitij.so 1268
    for item in competitive:
1269
        snapdealDetails = item[0]
1270
        snapdealItemInfo = item[1]
1271
        snapdealPricing = item[2]
1272
        mpItem = item[3]
1273
        mpHistory = MarketPlaceHistory()
1274
        mpHistory.item_id = snapdealItemInfo.item_id
1275
        mpHistory.source = OrderSource.SNAPDEAL
1276
        mpHistory.lowestTp = snapdealPricing.lowestTp
1277
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
1278
        mpHistory.lowestPossibleSp = snapdealPricing.lowestPossibleSp
1279
        mpHistory.ourInventory = snapdealDetails.ourInventory
1280
        mpHistory.otherInventory = snapdealDetails.otherInventory
1281
        mpHistory.ourRank = snapdealDetails.rank
1282
        mpHistory.competitionBasis = CompetitionBasis._NAMES_TO_VALUES.get(snapdealPricing.competitionBasis)
1283
        mpHistory.competitiveCategory = CompetitionCategory.COMPETITIVE
1284
        mpHistory.risky = snapdealItemInfo.risky
1285
        mpHistory.lowestOfferPrice = snapdealDetails.lowestOfferPrice
1286
        mpHistory.lowestSellingPrice = snapdealDetails.lowestSp
1287
        mpHistory.lowestSellerName = snapdealDetails.lowestSellerName
1288
        mpHistory.lowestSellerCode = snapdealDetails.lowestSellerCode
1289
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
1290
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
1291
        mpHistory.ourTp = snapdealPricing.ourTp
1292
        mpHistory.ourNlc = snapdealItemInfo.nlc
1293
        if (snapdealPricing.competitionBasis=='SP'):
1294
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)), snapdealPricing.lowestPossibleSp)
1295
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9954 kshitij.so 1296
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1297
            mpHistory.proposedTp = round(proposed_tp,2)
9881 kshitij.so 1298
        else:
10381 manish.sha 1299
            #proposed_tp  = max(snapdealPricing.lowestTp - max((10, snapdealPricing.lowestTp*0.001)), snapdealPricing.lowestPossibleTp)
1300
            #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
1301
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)) -getSubsidyDiff(snapdealDetails), snapdealPricing.lowestPossibleSp)
1302
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9954 kshitij.so 1303
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1304
            mpHistory.proposedTp = round(proposed_tp,2)
9919 kshitij.so 1305
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
9881 kshitij.so 1306
        mpHistory.totalSeller = snapdealDetails.totalSeller
11060 kshitij.so 1307
        mpHistory.avgSales = (itemSaleMap.get(snapdealItemInfo.item_id))[3]
9881 kshitij.so 1308
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
1309
        mpHistory.timestamp = timestamp
9949 kshitij.so 1310
        mpHistory.run = RunType._NAMES_TO_VALUES.get(snapdealItemInfo.runType)
1311
        competitiveItems.append(mpHistory) 
9881 kshitij.so 1312
    session.commit()
9949 kshitij.so 1313
    return competitiveItems
9881 kshitij.so 1314
 
1315
def commitCompetitiveNoInventory(competitiveNoInventory,timestamp):
9949 kshitij.so 1316
    competitiveNoInventoryItems = []
9881 kshitij.so 1317
    for item in competitiveNoInventory:
1318
        snapdealDetails = item[0]
1319
        snapdealItemInfo = item[1]
1320
        snapdealPricing = item[2]
1321
        mpItem = item[3]
1322
        mpHistory = MarketPlaceHistory()
1323
        mpHistory.item_id = snapdealItemInfo.item_id
1324
        mpHistory.source = OrderSource.SNAPDEAL
1325
        mpHistory.lowestTp = snapdealPricing.lowestTp
1326
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
1327
        mpHistory.lowestPossibleSp = snapdealPricing.lowestPossibleSp
1328
        mpHistory.ourInventory = snapdealDetails.ourInventory
1329
        mpHistory.otherInventory = snapdealDetails.otherInventory
1330
        mpHistory.ourRank = snapdealDetails.rank
1331
        mpHistory.competitionBasis = CompetitionBasis._NAMES_TO_VALUES.get(snapdealPricing.competitionBasis)
1332
        mpHistory.competitiveCategory = CompetitionCategory.COMPETITIVE_NO_INVENTORY
1333
        mpHistory.risky = snapdealItemInfo.risky
1334
        mpHistory.lowestOfferPrice = snapdealDetails.lowestOfferPrice
1335
        mpHistory.lowestSellingPrice = snapdealDetails.lowestSp
1336
        mpHistory.lowestSellerName = snapdealDetails.lowestSellerName
1337
        mpHistory.lowestSellerCode = snapdealDetails.lowestSellerCode
1338
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
1339
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
1340
        mpHistory.ourTp = snapdealPricing.ourTp
1341
        mpHistory.ourNlc = snapdealItemInfo.nlc
1342
        if (snapdealPricing.competitionBasis=='SP'):
1343
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)), snapdealPricing.lowestPossibleSp)
1344
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9954 kshitij.so 1345
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1346
            mpHistory.proposedTp = round(proposed_tp,2)
9881 kshitij.so 1347
        else:
10381 manish.sha 1348
            #proposed_tp  = max(snapdealPricing.lowestTp - max((10, snapdealPricing.lowestTp*0.001)), snapdealPricing.lowestPossibleTp)
1349
            #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
1350
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)) -getSubsidyDiff(snapdealDetails), snapdealPricing.lowestPossibleSp)
1351
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9954 kshitij.so 1352
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1353
            mpHistory.proposedTp = round(proposed_tp,2)
9919 kshitij.so 1354
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
9881 kshitij.so 1355
        mpHistory.totalSeller = snapdealDetails.totalSeller
11060 kshitij.so 1356
        mpHistory.avgSales = (itemSaleMap.get(snapdealItemInfo.item_id))[3]
9881 kshitij.so 1357
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
1358
        mpHistory.timestamp = timestamp
9949 kshitij.so 1359
        mpHistory.run = RunType._NAMES_TO_VALUES.get(snapdealItemInfo.runType)
1360
        competitiveNoInventoryItems.append(mpHistory)
9881 kshitij.so 1361
    session.commit()
9949 kshitij.so 1362
    return competitiveNoInventoryItems
9881 kshitij.so 1363
 
1364
def commitCantCompete(cantCompete,timestamp):
9949 kshitij.so 1365
    cantComepeteItems = []
9881 kshitij.so 1366
    for item in cantCompete:
1367
        snapdealDetails = item[0]
1368
        snapdealItemInfo = item[1]
1369
        snapdealPricing = item[2]
1370
        mpItem = item[3]
1371
        mpHistory = MarketPlaceHistory()
1372
        mpHistory.item_id = snapdealItemInfo.item_id
1373
        mpHistory.source = OrderSource.SNAPDEAL
1374
        mpHistory.lowestTp = snapdealPricing.lowestTp
1375
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
1376
        mpHistory.lowestPossibleSp = snapdealPricing.lowestPossibleSp
1377
        mpHistory.ourInventory = snapdealDetails.ourInventory
1378
        mpHistory.otherInventory = snapdealDetails.otherInventory
1379
        mpHistory.ourRank = snapdealDetails.rank
1380
        mpHistory.competitionBasis = CompetitionBasis._NAMES_TO_VALUES.get(snapdealPricing.competitionBasis)
1381
        mpHistory.competitiveCategory = CompetitionCategory.CANT_COMPETE
1382
        mpHistory.risky = snapdealItemInfo.risky
1383
        mpHistory.lowestOfferPrice = snapdealDetails.lowestOfferPrice
1384
        mpHistory.lowestSellingPrice = snapdealDetails.lowestSp
1385
        mpHistory.lowestSellerName = snapdealDetails.lowestSellerName
1386
        mpHistory.lowestSellerCode = snapdealDetails.lowestSellerCode
1387
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
1388
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
1389
        mpHistory.ourTp = snapdealPricing.ourTp
1390
        mpHistory.ourNlc = snapdealItemInfo.nlc
1391
        if (snapdealPricing.competitionBasis=='SP'):
1392
            proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001)
1393
            proposed_tp = getTargetTp(proposed_sp,mpItem)
1394
            target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 1395
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1396
            mpHistory.proposedTp = round(proposed_tp,2)
1397
            mpHistory.targetNlc = round(target_nlc,2)
9881 kshitij.so 1398
        else:
10381 manish.sha 1399
            #proposed_tp  = snapdealPricing.lowestTp - max(10, snapdealPricing.lowestTp*0.001)
1400
            #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
1401
            proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001) -getSubsidyDiff(snapdealDetails)
1402
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9881 kshitij.so 1403
            target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 1404
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1405
            mpHistory.proposedTp = round(proposed_tp,2)
1406
            mpHistory.targetNlc = round(target_nlc,2)
9919 kshitij.so 1407
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
9881 kshitij.so 1408
        mpHistory.totalSeller = snapdealDetails.totalSeller
11060 kshitij.so 1409
        mpHistory.avgSales = (itemSaleMap.get(snapdealItemInfo.item_id))[3]
9881 kshitij.so 1410
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
1411
        mpHistory.timestamp = timestamp
9949 kshitij.so 1412
        mpHistory.run = RunType._NAMES_TO_VALUES.get(snapdealItemInfo.runType)
1413
        cantComepeteItems.append(mpHistory)
9881 kshitij.so 1414
    session.commit()
9949 kshitij.so 1415
    return cantComepeteItems
9881 kshitij.so 1416
 
1417
def commitBuyBox(buyBoxItems,timestamp):
9949 kshitij.so 1418
    buyBoxList = []
9881 kshitij.so 1419
    for item in buyBoxItems:
1420
        snapdealDetails = item[0]
1421
        snapdealItemInfo = item[1]
1422
        snapdealPricing = item[2]
1423
        mpItem = item[3]
1424
        mpHistory = MarketPlaceHistory()
1425
        mpHistory.item_id = snapdealItemInfo.item_id
1426
        mpHistory.source = OrderSource.SNAPDEAL
1427
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
1428
        mpHistory.lowestPossibleSp = snapdealPricing.lowestPossibleSp
1429
        mpHistory.ourInventory = snapdealDetails.ourInventory
1430
        mpHistory.secondLowestInventory = snapdealDetails.secondLowestSellerInventory
1431
        mpHistory.ourRank = snapdealDetails.rank
1432
        mpHistory.competitionBasis = CompetitionBasis._NAMES_TO_VALUES.get(snapdealPricing.competitionBasis)
1433
        mpHistory.competitiveCategory = CompetitionCategory.BUY_BOX
1434
        mpHistory.risky = snapdealItemInfo.risky
1435
        mpHistory.lowestOfferPrice = snapdealDetails.lowestOfferPrice
1436
        mpHistory.lowestSellingPrice = snapdealDetails.lowestSp
1437
        mpHistory.lowestSellerName = snapdealDetails.lowestSellerName
1438
        mpHistory.lowestSellerCode = snapdealDetails.lowestSellerCode
1439
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
1440
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
1441
        mpHistory.ourTp = snapdealPricing.ourTp
1442
        mpHistory.ourNlc = snapdealItemInfo.nlc
1443
        mpHistory.secondLowestSellerName = snapdealDetails.secondLowestSellerName
1444
        mpHistory.secondLowestSellerCode = snapdealDetails.secondLowestSellerCode
9885 kshitij.so 1445
        mpHistory.secondLowestSellingPrice = snapdealDetails.secondLowestSellerSp
9888 kshitij.so 1446
        mpHistory.secondLowestOfferPrice = snapdealDetails.secondLowestSellerOfferPrice
9881 kshitij.so 1447
        mpHistory.secondLowestTp = snapdealPricing.secondLowestSellerTp
1448
        if (snapdealPricing.competitionBasis=='SP'):
1449
            proposed_sp = max(snapdealDetails.secondLowestSellerSp - max((20, snapdealDetails.secondLowestSellerSp*0.002)), snapdealPricing.lowestPossibleSp)
1450
            proposed_tp = getTargetTp(proposed_sp,mpItem)
1451
            #target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 1452
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1453
            mpHistory.proposedTp = round(proposed_tp,2)
9881 kshitij.so 1454
            #mpHistory.targetNlc = target_nlc
1455
        else:
10381 manish.sha 1456
            #proposed_tp  = max(snapdealPricing.secondLowestSellerTp - max((20, snapdealPricing.secondLowestSellerTp*0.002)), snapdealPricing.lowestPossibleTp)
1457
            #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
1458
            proposed_sp = max(snapdealDetails.secondLowestSellerSp - max((20, snapdealDetails.secondLowestSellerSp*0.002)) -getSubsidyDiff(snapdealDetails), snapdealPricing.lowestPossibleSp)
1459
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9881 kshitij.so 1460
            #target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 1461
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1462
            mpHistory.proposedTp = round(proposed_tp,2)
9881 kshitij.so 1463
            #mpHistory.targetNlc = target_nlc
9919 kshitij.so 1464
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
9881 kshitij.so 1465
        mpHistory.marginIncreasedPotential = proposed_tp - snapdealPricing.ourTp
1466
        mpHistory.totalSeller = snapdealDetails.totalSeller
11060 kshitij.so 1467
        mpHistory.avgSales = (itemSaleMap.get(snapdealItemInfo.item_id))[3]
9881 kshitij.so 1468
        mpHistory.timestamp = timestamp
9949 kshitij.so 1469
        mpHistory.run = RunType._NAMES_TO_VALUES.get(snapdealItemInfo.runType)
1470
        buyBoxList.append(mpHistory)
9881 kshitij.so 1471
    session.commit()
9949 kshitij.so 1472
    return buyBoxList 
10219 kshitij.so 1473
 
9990 kshitij.so 1474
def sendAutoPricingMail(successfulAutoDecrease,successfulAutoIncrease):
11116 kshitij.so 1475
    if len(successfulAutoDecrease)==0 and len(successfulAutoIncrease)==0 :
1476
        return
9990 kshitij.so 1477
    xstr = lambda s: s or ""
1478
    catalog_client = CatalogClient().get_client()
1479
    inventory_client = InventoryClient().get_client()
1480
    message="""<html>
1481
            <body>
1482
            <h3>Auto Decrease Items</h3>
1483
            <table border="1" style="width:100%;">
1484
            <thead>
1485
            <tr><th>Item Id</th>
1486
            <th>Product Name</th>
1487
            <th>Old Price</th>
1488
            <th>New Price</th>
1489
            <th>Old Margin</th>
1490
            <th>New Margin</th>
1491
            <th>Snapdeal Inventory</th>
11167 kshitij.so 1492
            <th>Sales History</th>
9990 kshitij.so 1493
            </tr></thead>
1494
            <tbody>"""
1495
    for item in successfulAutoDecrease:
1496
        it = Item.query.filter_by(id=item.item_id).one()
1497
        mpItem = MarketplaceItems.get_by(itemId=item.item_id,source=OrderSource.SNAPDEAL)
1498
        sdItem = SnapdealItem.get_by(item_id=item.item_id)
1499
        warehouse = inventory_client.getWarehouse(sdItem.warehouseId)
1500
        vatRate = catalog_client.getVatPercentageForItem(item.item_id, warehouse.stateId, item.proposedSellingPrice)
1501
        newMargin = round(getNewOurTp(mpItem,item.proposedSellingPrice) - getNewLowestPossibleTp(mpItem,item.ourNlc,vatRate,item.proposedSellingPrice))  
1502
        message+="""<tr>
1503
                <td style="text-align:center">"""+str(item.item_id)+"""</td>
1504
                <td style="text-align:center">"""+xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color)+"""</td>
1505
                <td style="text-align:center">"""+str(item.ourSellingPrice)+"""</td>
1506
                <td style="text-align:center">"""+str(math.ceil(item.proposedSellingPrice))+"""</td>
1507
                <td style="text-align:center">"""+str(round(item.margin))+" ("+str(round((item.margin/item.ourSellingPrice)*100,1))+"%)"+"""</td>
1508
                <td style="text-align:center">"""+str(newMargin)+" ("+str(round((newMargin/item.proposedSellingPrice)*100,1))+"%)"+"""</td>
1509
                <td style="text-align:center">"""+str(item.ourInventory)+"""</td>
11167 kshitij.so 1510
                <td style="text-align:center">"""+getOosString((itemSaleMap.get(item.item_id))[1])+"""</td>
9990 kshitij.so 1511
                </tr>"""
1512
    message+="""</tbody></table><h3>Auto Increase Items</h3><table border="1" style="width:100%;">
1513
            <thead>
1514
            <tr><th>Item Id</th>
1515
            <th>Product Name</th>
1516
            <th>Old Price</th>
1517
            <th>New Price</th>
1518
            <th>Old Margin</th>
1519
            <th>New Margin</th>
1520
            <th>Snapdeal Inventory</th>
11167 kshitij.so 1521
            <th>Sales History</th>
9990 kshitij.so 1522
            </tr></thead>
1523
            <tbody>"""
1524
    for item in successfulAutoIncrease:
1525
        it = Item.query.filter_by(id=item.item_id).one()
1526
        mpItem = MarketplaceItems.get_by(itemId=item.item_id,source=OrderSource.SNAPDEAL)
1527
        sdItem = SnapdealItem.get_by(item_id=item.item_id)
1528
        warehouse = inventory_client.getWarehouse(sdItem.warehouseId)
1529
        vatRate = catalog_client.getVatPercentageForItem(item.item_id, warehouse.stateId, math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))
1530
        newMargin = round(getNewOurTp(mpItem,item.ourSellingPrice+max(10,.01*item.ourSellingPrice)) - getNewLowestPossibleTp(mpItem,item.ourNlc,vatRate,item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))  
1531
        message+="""<tr>
1532
                <td style="text-align:center">"""+str(item.item_id)+"""</td>
1533
                <td style="text-align:center">"""+xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color)+"""</td>
1534
                <td style="text-align:center">"""+str(item.ourSellingPrice)+"""</td>
1535
                <td style="text-align:center">"""+str(math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))+"""</td>
1536
                <td style="text-align:center">"""+str(round((item.margin),1))+" ("+str(round((item.margin/item.ourSellingPrice)*100,1))+"%)"+"""</td>
1537
                <td style="text-align:center">"""+str(newMargin)+" ("+str(round((newMargin/(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))*100,1))+"%)"+"""</td>
1538
                <td style="text-align:center">"""+str(item.ourInventory)+"""</td>
11167 kshitij.so 1539
                <td style="text-align:center">"""+getOosString((itemSaleMap.get(item.item_id))[1])+"""</td>
9990 kshitij.so 1540
                </tr>"""
1541
    message+="""</tbody></table></body></html>"""
1542
    print message
1543
    mailServer = smtplib.SMTP("smtp.gmail.com", 587)
1544
    mailServer.ehlo()
1545
    mailServer.starttls()
1546
    mailServer.ehlo()
1547
 
10293 kshitij.so 1548
    #recipients = ['kshitij.sood@saholic.com']
11116 kshitij.so 1549
    recipients = ['rajneesh.arora@saholic.com','anikendra.das@saholic.com','vikram.raghav@saholic.com','kshitij.sood@saholic.com','khushal.bhatia@saholic.com','chaitnaya.vats@saholic.com','chandan.kumar@saholic.com','manoj.kumar@saholic.com','yukti.jain@saholic.com','ankush.dhingra@saholic.com','manoj.pal@saholic.com']
9990 kshitij.so 1550
    msg = MIMEMultipart()
1551
    msg['Subject'] = "Snapdeal Auto Pricing" + ' - ' + str(datetime.now())
1552
    msg['From'] = ""
10005 kshitij.so 1553
    msg['To'] = ",".join(recipients)
9990 kshitij.so 1554
    msg.preamble = "Snapdeal Auto Pricing" + ' - ' + str(datetime.now())
1555
    html_msg = MIMEText(message, 'html')
1556
    msg.attach(html_msg)
10207 kshitij.so 1557
    try:
1558
        mailServer.login("build@shop2020.in", "cafe@nes")
1559
        #mailServer.sendmail("cafe@nes", ['kshitij.sood@saholic.com'], msg.as_string())
1560
        mailServer.sendmail("cafe@nes", recipients, msg.as_string())
1561
    except Exception as e:
1562
        print e
10219 kshitij.so 1563
        print "Unable to send pricing mail.Lets try with local SMTP."
1564
        smtpServer = smtplib.SMTP('localhost')
1565
        smtpServer.set_debuglevel(1)
11777 kshitij.so 1566
        sender = 'build@shop2020.in'
10219 kshitij.so 1567
        try:
1568
            smtpServer.sendmail(sender, recipients, msg.as_string())
1569
            print "Successfully sent email"
1570
        except:
1571
            print "Error: unable to send email."
1572
 
9990 kshitij.so 1573
 
1574
def commitPricing(successfulAutoDecrease,successfulAutoIncrease,timestamp):
1575
    catalog_client = CatalogClient().get_client()
1576
    inventory_client = InventoryClient().get_client()
1577
    for item in successfulAutoDecrease:
1578
        it = Item.query.filter_by(id=item.item_id).one()
1579
        mpItem = MarketplaceItems.get_by(itemId=item.item_id,source=OrderSource.SNAPDEAL)
1580
        sdItem = SnapdealItem.get_by(item_id=item.item_id)
1581
        warehouse = inventory_client.getWarehouse(sdItem.warehouseId)
1582
        vatRate = catalog_client.getVatPercentageForItem(item.item_id, warehouse.stateId, item.proposedSellingPrice)
1583
        addHistory(sdItem)
1584
        sdItem.transferPrice = getNewOurTp(mpItem,item.proposedSellingPrice)
1585
        sdItem.sellingPrice = math.ceil(item.proposedSellingPrice)
10293 kshitij.so 1586
        if ((mpItem.pgFee/100)*sdItem.sellingPrice)>=20:
1587
            sdItem.commission = round((mpItem.commission/100+mpItem.pgFee/100)*(sdItem.sellingPrice),2)
1588
        else:
1589
            sdItem.commission = round((mpItem.commission/100)*(sdItem.sellingPrice),2)+20
11099 kshitij.so 1590
        sdItem.serviceTax = round((mpItem.serviceTax/100)*(sdItem.commission+sdItem.courierCostMarketplace),2)
9990 kshitij.so 1591
        sdItem.updatedOn = timestamp
1592
        sdItem.priceUpdatedBy = 'SYSTEM'
1593
        mpItem.currentSp = sdItem.sellingPrice
1594
        mpItem.currentTp = sdItem.transferPrice
1595
        mpItem.minimumPossibleTp = getNewLowestPossibleTp(mpItem,item.ourNlc,vatRate,item.proposedSellingPrice) 
1596
        mpItem.minimumPossibleSp = getNewLowestPossibleSp(mpItem,item.ourNlc,vatRate)
1597
        markStatusForMarketplaceItems(sdItem,mpItem)
1598
    session.commit()
1599
    for item in successfulAutoIncrease:
1600
        it = Item.query.filter_by(id=item.item_id).one()
1601
        mpItem = MarketplaceItems.get_by(itemId=item.item_id,source=OrderSource.SNAPDEAL)
1602
        sdItem = SnapdealItem.get_by(item_id=item.item_id)
1603
        warehouse = inventory_client.getWarehouse(sdItem.warehouseId)
1604
        vatRate = catalog_client.getVatPercentageForItem(item.item_id, warehouse.stateId, math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))
1605
        addHistory(sdItem)
1606
        sdItem.transferPrice = getNewOurTp(mpItem,item.ourSellingPrice+max(10,.01*item.ourSellingPrice))
1607
        sdItem.sellingPrice = math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice))
10293 kshitij.so 1608
        if ((mpItem.pgFee/100)*sdItem.sellingPrice)>=20:
1609
            sdItem.commission = round((mpItem.commission/100+mpItem.pgFee/100)*(sdItem.sellingPrice),2)
1610
        else:
1611
            sdItem.commission = round((mpItem.commission/100)*(sdItem.sellingPrice),2)+20
11099 kshitij.so 1612
        sdItem.serviceTax = round((mpItem.serviceTax/100)*(sdItem.commission+sdItem.courierCostMarketplace),2)
9990 kshitij.so 1613
        sdItem.updatedOn = timestamp
1614
        sdItem.priceUpdatedBy = 'SYSTEM'
1615
        mpItem.currentSp = sdItem.sellingPrice
1616
        mpItem.currentTp = sdItem.transferPrice
1617
        mpItem.minimumPossibleTp = getNewLowestPossibleTp(mpItem,item.ourNlc,vatRate,sdItem.sellingPrice) 
1618
        mpItem.minimumPossibleSp = getNewLowestPossibleSp(mpItem,item.ourNlc,vatRate)
1619
        markStatusForMarketplaceItems(sdItem,mpItem)
1620
    session.commit()
1621
 
10280 kshitij.so 1622
def updatePricesOnSnapdeal(successfulAutoDecrease,successfulAutoIncrease):
10284 kshitij.so 1623
    if syncPrice=='false':
10280 kshitij.so 1624
        return
1625
    url = 'http://support.shop2020.in:8080/Support/reports'
1626
    br = getBrowserObject()
1627
    br.open(url)
1628
    br.select_form(nr=0)
10286 kshitij.so 1629
    br.form['username'] = "manoj"
1630
    br.form['password'] = "man0j"
10280 kshitij.so 1631
    br.submit()
1632
    for item in successfulAutoDecrease:
1633
        sdItem = SnapdealItem.get_by(item_id=item.item_id)
1634
        sellingPrice =  str(math.ceil(item.proposedSellingPrice))
1635
        supc = sdItem.supc
10286 kshitij.so 1636
        updateUrl = 'http://support.shop2020.in:8080/Support/snapdeal-list!updateForAutoPricing?sellingPrice=%s&supc=%s&itemId=%s'%(sellingPrice,supc,str(item.item_id))
1637
        br.open(updateUrl)
10280 kshitij.so 1638
    for item in successfulAutoIncrease:
1639
        sdItem = SnapdealItem.get_by(item_id=item.item_id)
1640
        sellingPrice =  str(math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))
1641
        supc = sdItem.supc
1642
        updateUrl = 'http://support.shop2020.in:8080/Support/snapdeal-list!updateForAutoPricing?sellingPrice=%s&supc=%s&itemId=%s'%(sellingPrice,supc,str(item.item_id))
1643
        br.open(updateUrl)
1644
 
1645
 
1646
 
9990 kshitij.so 1647
def addHistory(item):
10097 kshitij.so 1648
    itemHistory = MarketPlaceUpdateHistory()
9990 kshitij.so 1649
    itemHistory.item_id = item.item_id
10097 kshitij.so 1650
    itemHistory.source = OrderSource.SNAPDEAL
9990 kshitij.so 1651
    itemHistory.exceptionPrice = item.exceptionPrice
1652
    itemHistory.warehouseId = item.warehouseId
10097 kshitij.so 1653
    itemHistory.isListedOnSource = item.isListedOnSnapdeal
9990 kshitij.so 1654
    itemHistory.transferPrice = item.transferPrice
1655
    itemHistory.sellingPrice = item.sellingPrice
1656
    itemHistory.courierCost = item.courierCost
1657
    itemHistory.commission = item.commission
1658
    itemHistory.serviceTax = item.serviceTax
1659
    itemHistory.suppressPriceFeed = item.suppressPriceFeed
1660
    itemHistory.suppressInventoryFeed = item.suppressInventoryFeed
1661
    itemHistory.updatedOn = item.updatedOn
1662
    itemHistory.maxNlc = item.maxNlc
10097 kshitij.so 1663
    itemHistory.skuAtSource = item.skuAtSnapdeal
1664
    itemHistory.marketPlaceSerialNumber = item.supc
9990 kshitij.so 1665
    itemHistory.priceUpdatedBy = item.priceUpdatedBy
11099 kshitij.so 1666
    itemHistory.courierCostMarketplace = item.courierCostMarketplace
9990 kshitij.so 1667
 
1668
def markStatusForMarketplaceItems(snapdealItem,marketplaceItem):
1669
    markUpdatedItem = MarketPlaceItemPrice.query.filter(MarketPlaceItemPrice.item_id==snapdealItem.item_id).filter(MarketPlaceItemPrice.source==marketplaceItem.source).first()
1670
    if markUpdatedItem is None:
1671
        marketPlaceItemPrice = MarketPlaceItemPrice()
1672
        marketPlaceItemPrice.item_id = snapdealItem.item_id
1673
        marketPlaceItemPrice.source = marketplaceItem.source
1674
        marketPlaceItemPrice.lastUpdatedOn = snapdealItem.updatedOn
1675
        marketPlaceItemPrice.sellingPrice = snapdealItem.sellingPrice 
1676
        marketPlaceItemPrice.suppressPriceFeed = snapdealItem.suppressPriceFeed
1677
        marketPlaceItemPrice.isListedOnSource = snapdealItem.isListedOnSnapdeal
1678
    else:
1679
        if (markUpdatedItem.sellingPrice!=snapdealItem.sellingPrice or markUpdatedItem.suppressPriceFeed!=snapdealItem.suppressPriceFeed or markUpdatedItem.isListedOnSource!=snapdealItem.isListedOnSnapdeal):
1680
            markUpdatedItem.lastUpdatedOn = snapdealItem.updatedOn
1681
        markUpdatedItem.sellingPrice = snapdealItem.sellingPrice
1682
        markUpdatedItem.suppressPriceFeed = snapdealItem.suppressPriceFeed
1683
        markUpdatedItem.isListedOnSource = snapdealItem.isListedOnSnapdeal
10031 kshitij.so 1684
 
1685
def processLostBuyBoxItems(previousProcessingTimestamp,currentTimestamp):
1686
    previous_buy_box = session.query(MarketPlaceHistory.item_id).filter(MarketPlaceHistory.timestamp==previousProcessingTimestamp).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.BUY_BOX).all()
1687
    cant_compete = session.query(MarketPlaceHistory.item_id).filter(MarketPlaceHistory.timestamp==currentTimestamp).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.CANT_COMPETE).all()
10812 kshitij.so 1688
    if previous_buy_box is None:
1689
        print "No item in buy box for last run"
1690
        return
10032 kshitij.so 1691
    lost_buy_box = list(set(list(zip(*previous_buy_box)[0]))&set(list(zip(*cant_compete)[0])))
10031 kshitij.so 1692
    if len(lost_buy_box)==0:
1693
        return
1694
    xstr = lambda s: s or ""
1695
    message="""<html>
1696
            <body>
1697
            <h3>Lost Buy Box</h3>
1698
            <table border="1" style="width:100%;">
1699
            <thead>
1700
            <tr><th>Item Id</th>
1701
            <th>Product Name</th>
1702
            <th>Current Price</th>
1703
            <th>Current TP</th>
1704
            <th>Current Margin</th>
1705
            <th>Competition TP</th>
1706
            <th>Lowest Possible TP</th>
1707
            <th>NLC</th>
1708
            <th>Target NLC</th>
1709
            <th>Snapdeal Inventory</th>
1710
            <th>Total Inventory</th>
1711
            <th>Sales History</th>
1712
            </tr></thead>
1713
            <tbody>"""
1714
    items = session.query(MarketPlaceHistory).filter(MarketPlaceHistory.timestamp==currentTimestamp).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.item_id.in_(lost_buy_box)).all()
1715
    for item in items:
1716
        it = Item.query.filter_by(id=item.item_id).one()
1717
        netInventory=''
1718
        if not inventoryMap.has_key(item.item_id):
1719
            netInventory='Info Not Available'
1720
        else:
1721
            netInventory = str(getNetAvailability(inventoryMap.get(item.item_id)))
1722
        message+="""<tr>
1723
                <td style="text-align:center">"""+str(item.item_id)+"""</td>
1724
                <td style="text-align:center">"""+xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color)+"""</td>
1725
                <td style="text-align:center">"""+str(item.ourSellingPrice)+"""</td>
1726
                <td style="text-align:center">"""+str(item.ourTp)+"""</td>
1727
                <td style="text-align:center">"""+str(round(item.margin))+" ("+str(round((item.margin/item.ourSellingPrice)*100,1))+"%)"+"""</td>
1728
                <td style="text-align:center">"""+str(item.lowestTp)+"""</td>
1729
                <td style="text-align:center">"""+str(item.lowestPossibleTp)+"""</td>
1730
                <td style="text-align:center">"""+str(item.ourNlc)+"""</td>
1731
                <td style="text-align:center">"""+str(item.targetNlc)+"""</td>
1732
                <td style="text-align:center">"""+str(item.ourInventory)+"""</td>
1733
                <td style="text-align:center">"""+netInventory+"""</td>
1734
                <td style="text-align:center">"""+getOosString((itemSaleMap.get(item.item_id))[1])+"""</td>
1735
                </tr>"""
1736
    message+="""</tbody></table></body></html>"""
1737
    print message
1738
    mailServer = smtplib.SMTP("smtp.gmail.com", 587)
1739
    mailServer.ehlo()
1740
    mailServer.starttls()
1741
    mailServer.ehlo()
1742
 
10033 kshitij.so 1743
    #recipients = ['kshitij.sood@saholic.com']
11116 kshitij.so 1744
    recipients = ['rajneesh.arora@saholic.com','anikendra.das@saholic.com','vikram.raghav@saholic.com','kshitij.sood@saholic.com','khushal.bhatia@saholic.com','chaitnaya.vats@saholic.com','chandan.kumar@saholic.com','manoj.kumar@saholic.com','yukti.jain@saholic.com','ankush.dhingra@saholic.com','manoj.pal@saholic.com']
10031 kshitij.so 1745
    msg = MIMEMultipart()
1746
    msg['Subject'] = "Snapdeal Lost Buy Box" + ' - ' + str(datetime.now())
1747
    msg['From'] = ""
1748
    msg['To'] = ",".join(recipients)
1749
    msg.preamble = "Snapdeal Lost Buy Box" + ' - ' + str(datetime.now())
1750
    html_msg = MIMEText(message, 'html')
1751
    msg.attach(html_msg)
10207 kshitij.so 1752
    try:
1753
        mailServer.login("build@shop2020.in", "cafe@nes")
1754
        #mailServer.sendmail("cafe@nes", ['kshitij.sood@saholic.com'], msg.as_string())
1755
        mailServer.sendmail("cafe@nes", recipients, msg.as_string())
1756
    except Exception as e:
1757
        print e
10381 manish.sha 1758
        print "Unable to send lost buy box mail.Lets try local SMTP"
10219 kshitij.so 1759
        smtpServer = smtplib.SMTP('localhost')
1760
        smtpServer.set_debuglevel(1)
11777 kshitij.so 1761
        sender = 'build@shop2020.in'
10219 kshitij.so 1762
        try:
1763
            smtpServer.sendmail(sender, recipients, msg.as_string())
1764
            print "Successfully sent email"
1765
        except:
1766
            print "Error: unable to send email."
1767
 
10381 manish.sha 1768
def getSubsidyDiff(snapdealDetails):
1769
    ourSubsidy = snapdealDetails.ourSp - snapdealDetails.ourOfferPrice
1770
    if snapdealDetails.rank !=1:
1771
        competitionSubsidy = snapdealDetails.lowestSp - snapdealDetails.lowestOfferPrice
1772
    else:
10386 manish.sha 1773
        competitionSubsidy = snapdealDetails.secondLowestSellerSp - snapdealDetails.secondLowestSellerOfferPrice
10381 manish.sha 1774
    return competitionSubsidy - ourSubsidy    
9881 kshitij.so 1775
 
1776
def getOtherTp(snapdealDetails,val,spm):
10473 kshitij.so 1777
    if val.parent_category==10011 or val.parent_category==12001:
9881 kshitij.so 1778
        commissionPercentage = spm.competitorCommissionAccessory
1779
    else:
1780
        commissionPercentage = spm.competitorCommissionOther
1781
    if snapdealDetails.rank==1:
10289 kshitij.so 1782
        otherTp = snapdealDetails.secondLowestSellerSp- snapdealDetails.secondLowestSellerSp*(commissionPercentage/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost+spm.closingFee)*(1+(spm.serviceTax/100))-(max(20,(spm.pgFee/100)*snapdealDetails.secondLowestSellerSp)*(1+(spm.serviceTax/100)));
9954 kshitij.so 1783
        return round(otherTp,2)
10289 kshitij.so 1784
    otherTp = snapdealDetails.lowestSp- snapdealDetails.lowestSp*(commissionPercentage/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost+spm.closingFee)*(1+(spm.serviceTax/100))-(max(20,(spm.pgFee/100)*snapdealDetails.lowestSp)*(1+(spm.serviceTax/100)));
9954 kshitij.so 1785
    return round(otherTp,2)
9881 kshitij.so 1786
 
1787
def getLowestPossibleTp(snapdealDetails,val,spm,mpItem):
1788
    if snapdealDetails.rank==0:
1789
        return mpItem.minimumPossibleTp
1790
    vat = (snapdealDetails.ourSp/(1+(val.vatRate/100))-(val.nlc/(1+(val.vatRate/100))))*(val.vatRate/100);
1791
    inHouseCost = 15+vat+(mpItem.returnProvision/100)*snapdealDetails.ourSp+mpItem.otherCost;
1792
    lowest_possible_tp = val.nlc+inHouseCost;
9954 kshitij.so 1793
    return round(lowest_possible_tp,2)
9881 kshitij.so 1794
 
1795
def getOurTp(snapdealDetails,val,spm,mpItem):
1796
    if snapdealDetails.rank==0:
1797
        return mpItem.currentTp
10289 kshitij.so 1798
    ourTp = snapdealDetails.ourSp- snapdealDetails.ourSp*(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))-(val.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100))-(max(20,(spm.pgFee/100)*snapdealDetails.ourSp)*(1+(spm.serviceTax/100)));
9954 kshitij.so 1799
    return round(ourTp,2)
9966 kshitij.so 1800
 
1801
def getNewLowestPossibleTp(mpItem,nlc,vatRate,proposedSellingPrice):
1802
    vat = (proposedSellingPrice/(1+(vatRate/100))-(nlc/(1+(vatRate/100))))*(vatRate/100);
1803
    inHouseCost = 15+vat+(mpItem.returnProvision/100)*proposedSellingPrice+mpItem.otherCost;
1804
    lowest_possible_tp = nlc+inHouseCost;
1805
    return round(lowest_possible_tp,2)
1806
 
1807
def getNewOurTp(mpItem,proposedSellingPrice):
11099 kshitij.so 1808
    ourTp = proposedSellingPrice- proposedSellingPrice*(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))-(mpItem.courierCostMarketplace+mpItem.closingFee)*(1+(mpItem.serviceTax/100))-(max(20,(mpItem.pgFee/100)*proposedSellingPrice)*(1+(mpItem.serviceTax/100)));
9966 kshitij.so 1809
    return round(ourTp,2)
9990 kshitij.so 1810
 
1811
def getNewLowestPossibleSp(mpItem,nlc,vatRate):
10294 kshitij.so 1812
    if (mpItem.pgFee/100)*mpItem.currentSp>=20:
11099 kshitij.so 1813
        lowestPossibleSp = (nlc+(mpItem.courierCostMarketplace+mpItem.closingFee)*(1+(mpItem.serviceTax/100))*(1+(vatRate/100))+(15+mpItem.otherCost)*(1+(vatRate)/100))/(1-(mpItem.commission/100+mpItem.emiFee/100+mpItem.pgFee/100)*(1+(mpItem.serviceTax/100))*(1+(vatRate)/100)-(mpItem.returnProvision/100)*(1+(vatRate)/100));
10289 kshitij.so 1814
    else:
11099 kshitij.so 1815
        lowestPossibleSp = (nlc+(mpItem.courierCostMarketplace+mpItem.closingFee+20)*(1+(mpItem.serviceTax/100))*(1+(vatRate/100))+(15+mpItem.otherCost)*(1+(vatRate)/100))/(1-(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))*(1+(vatRate)/100)-(mpItem.returnProvision/100)*(1+(vatRate)/100));
9990 kshitij.so 1816
    return round(lowestPossibleSp,2)    
9881 kshitij.so 1817
 
1818
def getLowestPossibleSp(snapdealDetails,val,spm,mpItem):
1819
    if snapdealDetails.rank==0:
1820
        return mpItem.minimumPossibleSp
10289 kshitij.so 1821
    #lowestPossibleSp = (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));
1822
    if (mpItem.pgFee/100)*snapdealDetails.ourSp>=20:
1823
        lowestPossibleSp = (val.nlc+(val.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100))*(1+(mpItem.vat/100))+(15+mpItem.otherCost)*(1+(mpItem.vat)/100))/(1-(mpItem.commission/100+mpItem.emiFee/100+mpItem.pgFee/100)*(1+(mpItem.serviceTax/100))*(1+(mpItem.vat)/100)-(mpItem.returnProvision/100)*(1+(mpItem.vat)/100))
1824
    else:
1825
        lowestPossibleSp = (val.nlc+(val.courierCost+mpItem.closingFee+20)*(1+(mpItem.serviceTax/100))*(1+(mpItem.vat/100))+(15+mpItem.otherCost)*(1+(mpItem.vat)/100))/(1-(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))*(1+(mpItem.vat)/100)-(mpItem.returnProvision/100)*(1+(mpItem.vat)/100))
9954 kshitij.so 1826
    return round(lowestPossibleSp,2)    
9881 kshitij.so 1827
 
1828
def getTargetTp(targetSp,mpItem):
11099 kshitij.so 1829
    targetTp = targetSp- targetSp*(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))-(mpItem.courierCostMarketplace+mpItem.closingFee)*(1+(mpItem.serviceTax/100))-(max(20,(mpItem.pgFee/100)*targetSp)*(1+(mpItem.serviceTax/100)))
9954 kshitij.so 1830
    return round(targetTp,2)
9881 kshitij.so 1831
 
10289 kshitij.so 1832
def getTargetSp(targetTp,mpItem,ourSp):
10292 kshitij.so 1833
    if (ourSp*(mpItem.pgFee/100)) < 20:
11099 kshitij.so 1834
        targetSp = float(targetTp+(mpItem.courierCostMarketplace+mpItem.closingFee+20)*(1+(mpItem.serviceTax/100)))/(1-((mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))))
10289 kshitij.so 1835
    else:
11099 kshitij.so 1836
        targetSp = float(targetTp+(mpItem.courierCostMarkeplace+mpItem.closingFee)*(1+(mpItem.serviceTax/100)))/(1-((mpItem.commission/100+mpItem.emiFee/100+mpItem.pgFee/100)*(1+(mpItem.serviceTax/100))))
9954 kshitij.so 1837
    return round(targetSp,2)
9881 kshitij.so 1838
 
1839
def getSalesPotential(lowestOfferPrice,ourNlc):
1840
    if lowestOfferPrice - ourNlc < 0:
1841
        return 'HIGH'
9897 kshitij.so 1842
    elif (float(lowestOfferPrice - ourNlc))/lowestOfferPrice >=0 and (float(lowestOfferPrice - ourNlc))/lowestOfferPrice <=.02:
9881 kshitij.so 1843
        return 'MEDIUM'
1844
    else:
1845
        return 'LOW'  
1846
 
11041 kshitij.so 1847
def groupData(previousTimestamp,timestampNow):
1848
    previousData = session.query(MarketPlaceHistory).filter(MarketPlaceHistory.timestamp==previousTimestamp).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).all()
1849
    for data in previousData:
11043 kshitij.so 1850
        latestItemData = session.query(MarketPlaceHistory).filter(MarketPlaceHistory.timestamp==timestampNow).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.item_id==data.item_id).first()
11041 kshitij.so 1851
        if latestItemData is None:
1852
            continue
1853
        if data.ourSellingPrice == latestItemData.ourSellingPrice and data.ourOfferPrice == latestItemData.ourOfferPrice and data.competitiveCategory == latestItemData.competitiveCategory:
1854
            if data.toGroup is None:
1855
                data.toGroup=False
1856
                latestItemData.toGroup=True
1857
            else:
1858
                latestItemData.toGroup=True
1859
                data.toGroup=False
1860
        else:
1861
            latestItemData=None
11044 kshitij.so 1862
    session.commit()
11777 kshitij.so 1863
 
1864
def sendAlertForNegativeMargins(timestamp):
1865
    xstr = lambda s: s or ""
1866
    negativeMargins = session.query(MarketPlaceHistory,Item).join((Item,MarketPlaceHistory.item_id==Item.id)).filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.NEGATIVE_MARGIN).all()
1867
    if len(negativeMargins) == 0:
1868
        return
1869
    message="""<html>
1870
            <body>
1871
            <h3 style="color:red;font-weight:bold;">Snapdeal Negative Margins</h3>
1872
            <table border="1" style="width:100%;">
1873
            <thead>
1874
            <tr><th>Item Id</th>
1875
            <th>Product Name</th>
1876
            <th>SP</th>
1877
            <th>TP</th>
1878
            <th>Lowest Possible SP</th>
1879
            <th>Lowest Possible TP</th>
1880
            <th>Margin</th>
1881
            <th>Margin %</th>
1882
            <th>Flipkart Inventory</th>
1883
            <th>Total Inventory</th>
1884
            <th>Sales History</th>
1885
            </tr></thead>
1886
            <tbody>"""
1887
    for item in negativeMargins:
1888
        mpHistory = item[0]
1889
        catItem = item[1]
1890
        netInventory=''
1891
        if not inventoryMap.has_key(mpHistory.item_id):
1892
            netInventory='Info Not Available'
1893
        else:
1894
            netInventory = str(getNetAvailability(inventoryMap.get(mpHistory.item_id)))
1895
        message+="""<tr>
1896
            <td style="text-align:center">"""+str(mpHistory.item_id)+"""</td>
1897
            <td style="text-align:center">"""+xstr(catItem.brand)+" "+xstr(catItem.model_name)+" "+xstr(catItem.model_number)+" "+xstr(catItem.color)+"""</td>
1898
            <td style="text-align:center">"""+str(mpHistory.ourSellingPrice)+"""</td>
1899
            <td style="text-align:center">"""+str(mpHistory.ourTp)+"""</td>
1900
            <td style="text-align:center">"""+str(mpHistory.lowestPossibleSp)+"""</td>
1901
            <td style="text-align:center">"""+str(mpHistory.lowestPossibleTp)+"""</td>
1902
            <td style="text-align:center">"""+str(mpHistory.margin)+"""</td>
1903
            <td style="text-align:center">"""+str(round(mpHistory.margin/mpHistory.ourSellingPrice,2))+"""</td>
1904
            <td style="text-align:center">"""+str(mpHistory.ourInventory)+"""</td>
1905
            <td style="text-align:center">"""+netInventory+"""</td>
1906
            <td style="text-align:center">"""+getOosString((itemSaleMap.get(mpHistory.item_id))[1])+"""</td>
1907
            </tr>"""
1908
    message+="""</tbody></table></body></html>"""
1909
    print message
1910
    mailServer = smtplib.SMTP("smtp.gmail.com", 587)
1911
    mailServer.ehlo()
1912
    mailServer.starttls()
1913
    mailServer.ehlo()
1914
 
1915
    #recipients = ['kshitij.sood@saholic.com']
1916
    recipients = ['rajneesh.arora@saholic.com','anikendra.das@saholic.com','vikram.raghav@saholic.com','kshitij.sood@saholic.com','khushal.bhatia@saholic.com','chaitnaya.vats@saholic.com','chandan.kumar@saholic.com','manoj.kumar@saholic.com','yukti.jain@saholic.com','ankush.dhingra@saholic.com','manoj.pal@saholic.com']
1917
    msg = MIMEMultipart()
1918
    msg['Subject'] = "Snapdeal Negative Margin" + ' - ' + str(datetime.now())
1919
    msg['From'] = ""
1920
    msg['To'] = ",".join(recipients)
1921
    msg.preamble = "Snapdeal Negative Margin" + ' - ' + str(datetime.now())
1922
    html_msg = MIMEText(message, 'html')
1923
    msg.attach(html_msg)
1924
    try:
1925
        mailServer.login("build@shop2020.in", "cafe@nes")
1926
        #mailServer.sendmail("cafe@nes", ['kshitij.sood@saholic.com'], msg.as_string())
1927
        mailServer.sendmail("cafe@nes", recipients, msg.as_string())
1928
    except Exception as e:
1929
        print e
1930
        print "Unable to send Snapdeal Negative margin mail.Lets try local SMTP"
1931
        smtpServer = smtplib.SMTP('localhost')
1932
        smtpServer.set_debuglevel(1)
1933
        sender = 'build@shop2020.in'
1934
        try:
1935
            smtpServer.sendmail(sender, recipients, msg.as_string())
1936
            print "Successfully sent email"
1937
        except:
1938
            print "Error: unable to send email."
1939
 
11044 kshitij.so 1940
 
11041 kshitij.so 1941
 
9881 kshitij.so 1942
def main():
9949 kshitij.so 1943
    parser = optparse.OptionParser()
1944
    parser.add_option("-t", "--type", dest="runType",
1945
                   default="FULL", type="string",
1946
                   help="Run type FULL or FAVOURITE")
1947
    (options, args) = parser.parse_args()
1948
    if options.runType not in ('FULL','FAVOURITE'):
1949
        print "Run type argument illegal."
1950
        sys.exit(1)
10289 kshitij.so 1951
    timestamp = datetime.now()
1952
    itemInfo= populateStuff(options.runType,timestamp)
9881 kshitij.so 1953
    cantCompete, buyBoxItems, competitive, \
10289 kshitij.so 1954
    competitiveNoInventory, exceptionList, negativeMargin = decideCategory(itemInfo)
10759 kshitij.so 1955
    previousProcessingTimestamp = session.query(func.max(MarketPlaceHistory.timestamp)).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).one()
9949 kshitij.so 1956
    exceptionItems = commitExceptionList(exceptionList,timestamp)
1957
    cantComepeteItems = commitCantCompete(cantCompete,timestamp)
1958
    buyBoxList = commitBuyBox(buyBoxItems,timestamp)
1959
    competitiveItems = commitCompetitive(competitive,timestamp)
1960
    competitiveNoInventoryItems = commitCompetitiveNoInventory(competitiveNoInventory,timestamp)
1961
    negativeMarginItems = commitNegativeMargin(negativeMargin,timestamp)
11045 kshitij.so 1962
    groupData(previousProcessingTimestamp[0],timestamp)
9954 kshitij.so 1963
    successfulAutoDecrease = fetchItemsForAutoDecrease(timestamp)
1964
    successfulAutoIncrease = fetchItemsForAutoIncrease(timestamp)
9949 kshitij.so 1965
    if options.runType=='FULL':
1966
        previousAutoFav, nowAutoFav = markAutoFavourite()
9954 kshitij.so 1967
    if options.runType=='FULL':
1968
        writeReport(cantCompete, buyBoxItems, competitive, competitiveNoInventory, exceptionList, negativeMargin, previousAutoFav, nowAutoFav,timestamp, options.runType)
11777 kshitij.so 1969
        sendAlertForNegativeMargins(timestamp)
9954 kshitij.so 1970
    else:
1971
        writeReport(cantCompete, buyBoxItems, competitive, competitiveNoInventory, exceptionList, negativeMargin, None, None, timestamp, options.runType)
10293 kshitij.so 1972
    commitPricing(successfulAutoDecrease,successfulAutoIncrease,timestamp)
9954 kshitij.so 1973
    sendAutoPricingMail(successfulAutoDecrease,successfulAutoIncrease)
10031 kshitij.so 1974
    processLostBuyBoxItems(previousProcessingTimestamp[0],timestamp)
10293 kshitij.so 1975
    updatePricesOnSnapdeal(successfulAutoDecrease,successfulAutoIncrease)
9897 kshitij.so 1976
 
9881 kshitij.so 1977
if __name__ == '__main__':
11753 kshitij.so 1978
    main()