Subversion Repositories SmartDukaan

Rev

Rev 10839 | Rev 10959 | 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
9920 kshitij.so 139
        if not autoDecrementItem.risky:
140
            markReasonForMpItem(autoDecrementItem,'Item is not risky',Decision.AUTO_DECREMENT_FAILED)
9897 kshitij.so 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")
9897 kshitij.so 185
        if daysOfStock<2:
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
434
        snapdealItemInfo = __SnapdealItemInfo(snapdeal_item.supc, snapdeal_item.maxNlc,snapdeal_item.courierCost, it.id, it.product_group, it.brand, it.model_name, it.model_number, it.color, it.weight, category.parent_category_id, it.risky, snapdeal_item.warehouseId, None, 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()
745
        sheet.write(sheet_iterator, 28, Decision._VALUES_TO_NAMES.get(mp_history_item.decision))
746
        sheet.write(sheet_iterator, 29, mp_history_item.reason)
747
        if Decision._VALUES_TO_NAMES.get(mp_history_item.decision) == "AUTO_DECREMENT_SUCCESS":
748
            sheet.write(sheet_iterator, 30, math.ceil(mp_history_item.proposedSellingPrice))
749
        if Decision._VALUES_TO_NAMES.get(mp_history_item.decision) == "AUTO_INCREMENT_SUCCESS":
750
            sheet.write(sheet_iterator, 30, math.ceil(mp_history_item.ourSellingPrice+max(10,.01*mp_history_item.ourSellingPrice)))
9949 kshitij.so 751
        sheet_iterator+=1
752
 
753
    sheet = wbk.add_sheet('Can Compete-With Inventory')
754
 
755
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
756
 
757
    excel_integer_format = '0'
758
    integer_style = xlwt.XFStyle()
759
    integer_style.num_format_str = excel_integer_format
760
    xstr = lambda s: s or ""
761
 
762
    sheet.write(0, 0, "Item ID", heading_xf)
763
    sheet.write(0, 1, "Category", heading_xf)
764
    sheet.write(0, 2, "Product Group.", heading_xf)
765
    sheet.write(0, 3, "SUPC", heading_xf)
766
    sheet.write(0, 4, "Brand", heading_xf)
767
    sheet.write(0, 5, "Product Name", heading_xf)
768
    sheet.write(0, 6, "Weight", heading_xf)
769
    sheet.write(0, 7, "Courier Cost", heading_xf)
770
    sheet.write(0, 8, "Risky", heading_xf)
771
    sheet.write(0, 9, "Our SP", heading_xf)
772
    sheet.write(0, 11, "Our TP", heading_xf)
773
    sheet.write(0, 10, "Our Offer Price", heading_xf)
774
    sheet.write(0, 12, "Our Rank", heading_xf)
775
    sheet.write(0, 13, "Lowest Seller", heading_xf)
776
    sheet.write(0, 14, "Lowest SP", heading_xf)
777
    sheet.write(0, 15, "Lowest TP", heading_xf)
778
    sheet.write(0, 16, "Lowest Offer Price", heading_xf)
779
    sheet.write(0, 17, "Inventory of Top Vendors", heading_xf)
780
    sheet.write(0, 18, "Our Snapdeal Inventory", heading_xf)
781
    sheet.write(0, 19, "Our Net Availability",heading_xf)
782
    sheet.write(0, 20, "Last Five Day Sale", heading_xf)
783
    sheet.write(0, 21, "Average Sale", heading_xf)
784
    sheet.write(0, 22, "Our NLC", heading_xf)
785
    sheet.write(0, 23, "Lowest Possible TP", heading_xf)
786
    sheet.write(0, 24, "Lowest Possible SP", heading_xf)
10381 manish.sha 787
    sheet.write(0, 25, "Subsidy Difference", heading_xf)
9949 kshitij.so 788
    sheet.write(0, 26, "Target TP", heading_xf)
789
    sheet.write(0, 27, "Target SP", heading_xf)  
790
    sheet.write(0, 28, "Sales Potential", heading_xf)
10958 kshitij.so 791
    sheet.write(0, 29, "Auto Pricing Decision", heading_xf)
792
    sheet.write(0, 30, "Reason", heading_xf)
793
    sheet.write(0, 31, "Updated Price", heading_xf)
9949 kshitij.so 794
 
795
    sheet_iterator = 1
796
    for item in competitive:
797
        snapdealDetails = item[0]
798
        snapdealItemInfo = item[1]
799
        snapdealPricing = item[2]
800
        mpItem = item[3]
801
        sheet.write(sheet_iterator, 0, snapdealItemInfo.item_id)
802
        sheet.write(sheet_iterator, 1, snapdealItemInfo.parent_category_name)
803
        sheet.write(sheet_iterator, 2, snapdealItemInfo.product_group)
804
        sheet.write(sheet_iterator, 3, snapdealItemInfo.supc)
805
        sheet.write(sheet_iterator, 4, snapdealItemInfo.brand)
806
        sheet.write(sheet_iterator, 5, xstr(snapdealItemInfo.brand)+" "+xstr(snapdealItemInfo.model_name)+" "+xstr(snapdealItemInfo.model_number)+" "+xstr(snapdealItemInfo.color))
807
        sheet.write(sheet_iterator, 6, snapdealItemInfo.weight)
808
        sheet.write(sheet_iterator, 7, snapdealItemInfo.courierCost)
809
        sheet.write(sheet_iterator, 8, snapdealItemInfo.risky)
810
        sheet.write(sheet_iterator, 9, snapdealPricing.ourSp)
811
        sheet.write(sheet_iterator, 10, snapdealDetails.ourOfferPrice)
812
        sheet.write(sheet_iterator, 11, snapdealPricing.ourTp)
813
        sheet.write(sheet_iterator, 12, snapdealDetails.rank)
814
        sheet.write(sheet_iterator, 13, snapdealDetails.lowestSellerName)
815
        sheet.write(sheet_iterator, 14, snapdealDetails.lowestSp)
816
        sheet.write(sheet_iterator, 15, snapdealPricing.lowestTp)
817
        sheet.write(sheet_iterator, 16, snapdealDetails.lowestOfferPrice)
818
        sheet.write(sheet_iterator, 17, snapdealDetails.otherInventory)
819
        sheet.write(sheet_iterator, 18, snapdealDetails.ourInventory)
820
        if (not inventoryMap.has_key(snapdealItemInfo.item_id)):
821
            sheet.write(sheet_iterator, 19, 'Info not available')
822
        else:
823
            sheet.write(sheet_iterator, 19, getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id)))
824
        sheet.write(sheet_iterator, 20, getOosString((itemSaleMap.get(snapdealItemInfo.item_id))[1]))
825
        sheet.write(sheet_iterator, 21, (itemSaleMap.get(snapdealItemInfo.item_id))[3])
826
        sheet.write(sheet_iterator, 22, snapdealItemInfo.nlc)
827
        sheet.write(sheet_iterator, 23, snapdealPricing.lowestPossibleTp)
828
        sheet.write(sheet_iterator, 24, snapdealPricing.lowestPossibleSp)
10381 manish.sha 829
        sheet.write(sheet_iterator, 25, getSubsidyDiff(snapdealDetails))
9949 kshitij.so 830
        if (snapdealPricing.competitionBasis=='SP'):
831
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)), snapdealPricing.lowestPossibleSp)
832
            proposed_tp = getTargetTp(proposed_sp,mpItem)
833
        else:
10381 manish.sha 834
            #proposed_tp  = max(snapdealPricing.lowestTp - max((10, snapdealPricing.lowestTp*0.001)), snapdealPricing.lowestPossibleTp)
835
            #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
836
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)) -getSubsidyDiff(snapdealDetails), snapdealPricing.lowestPossibleSp)
837
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9954 kshitij.so 838
        sheet.write(sheet_iterator, 26, round(proposed_tp,2))
839
        sheet.write(sheet_iterator, 27, round(proposed_sp,2))
9949 kshitij.so 840
        sheet.write(sheet_iterator, 28, getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
10958 kshitij.so 841
        mp_history_item = session.query(MarketPlaceHistory).filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.item_id==snapdealItemInfo.item_id).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).one()
842
        sheet.write(sheet_iterator, 29, Decision._VALUES_TO_NAMES.get(mp_history_item.decision))
843
        sheet.write(sheet_iterator, 30, mp_history_item.reason)
844
        if Decision._VALUES_TO_NAMES.get(mp_history_item.decision) == "AUTO_DECREMENT_SUCCESS":
845
            sheet.write(sheet_iterator, 31, math.ceil(mp_history_item.proposedSellingPrice))
846
        if Decision._VALUES_TO_NAMES.get(mp_history_item.decision) == "AUTO_INCREMENT_SUCCESS":
847
            sheet.write(sheet_iterator, 31, math.ceil(mp_history_item.ourSellingPrice+max(10,.01*mp_history_item.ourSellingPrice)))
9949 kshitij.so 848
        sheet_iterator+=1
849
 
850
    sheet = wbk.add_sheet('Negative Margin')
851
 
852
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
853
 
854
    excel_integer_format = '0'
855
    integer_style = xlwt.XFStyle()
856
    integer_style.num_format_str = excel_integer_format
857
    xstr = lambda s: s or ""
858
 
859
    sheet.write(0, 0, "Item ID", heading_xf)
860
    sheet.write(0, 1, "Category", heading_xf)
861
    sheet.write(0, 2, "Product Group.", heading_xf)
862
    sheet.write(0, 3, "SUPC", heading_xf)
863
    sheet.write(0, 4, "Brand", heading_xf)
864
    sheet.write(0, 5, "Product Name", heading_xf)
865
    sheet.write(0, 6, "Weight", heading_xf)
866
    sheet.write(0, 7, "Courier Cost", heading_xf)
867
    sheet.write(0, 8, "Risky", heading_xf)
868
    sheet.write(0, 9, "Our SP", heading_xf)
869
    sheet.write(0, 11, "Our TP", heading_xf)
870
    sheet.write(0, 12, "Lowest Possible TP", heading_xf)
871
    sheet.write(0, 10, "Our Offer Price", heading_xf)
872
    sheet.write(0, 13, "Our Rank", heading_xf)
873
    sheet.write(0, 14, "Our Snapdeal Inventory", heading_xf)
874
    sheet.write(0, 15, "Net Availability", heading_xf)
875
    sheet.write(0, 16, "Last Five Day Sale", heading_xf)
876
    sheet.write(0, 17, "Average Sale", heading_xf)
877
    sheet.write(0, 18, "Our NLC", heading_xf)
878
    sheet.write(0, 19, "Margin", heading_xf)
879
 
880
    sheet_iterator=1
881
    for item in negativeMargin:
882
        snapdealDetails = item[0]
883
        snapdealItemInfo = item[1]
884
        snapdealPricing = item[2]
885
        sheet.write(sheet_iterator, 0, snapdealItemInfo.item_id)
886
        sheet.write(sheet_iterator, 1, snapdealItemInfo.parent_category_name)
887
        sheet.write(sheet_iterator, 2, snapdealItemInfo.product_group)
888
        sheet.write(sheet_iterator, 3, snapdealItemInfo.supc)
889
        sheet.write(sheet_iterator, 4, snapdealItemInfo.brand)
890
        sheet.write(sheet_iterator, 5, xstr(snapdealItemInfo.brand)+" "+xstr(snapdealItemInfo.model_name)+" "+xstr(snapdealItemInfo.model_number)+" "+xstr(snapdealItemInfo.color))
891
        sheet.write(sheet_iterator, 6, snapdealItemInfo.weight)
892
        sheet.write(sheet_iterator, 7, snapdealItemInfo.courierCost)
893
        sheet.write(sheet_iterator, 8, snapdealItemInfo.risky)
894
        sheet.write(sheet_iterator, 9, snapdealPricing.ourSp)
895
        sheet.write(sheet_iterator, 10, snapdealDetails.ourOfferPrice)
896
        sheet.write(sheet_iterator, 11, snapdealPricing.ourTp)
897
        sheet.write(sheet_iterator, 12, snapdealPricing.lowestPossibleTp)
898
        sheet.write(sheet_iterator, 13, snapdealDetails.rank)
899
        sheet.write(sheet_iterator, 14, snapdealDetails.ourInventory)
900
        if (not inventoryMap.has_key(snapdealItemInfo.item_id)):
901
            sheet.write(sheet_iterator, 15, 'Info not available')
902
        else:
903
            sheet.write(sheet_iterator, 15, getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id)))
904
        sheet.write(sheet_iterator, 16, getOosString((itemSaleMap.get(snapdealItemInfo.item_id))[1]))
905
        sheet.write(sheet_iterator, 17, (itemSaleMap.get(snapdealItemInfo.item_id))[3])
906
        sheet.write(sheet_iterator, 18, snapdealItemInfo.nlc)
9954 kshitij.so 907
        sheet.write(sheet_iterator, 19, round((snapdealPricing.ourTp - snapdealPricing.lowestPossibleTp),2))
9949 kshitij.so 908
        sheet_iterator+=1
909
 
910
    sheet = wbk.add_sheet('Exception Item List')
911
 
912
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
913
 
914
    excel_integer_format = '0'
915
    integer_style = xlwt.XFStyle()
916
    integer_style.num_format_str = excel_integer_format
917
    xstr = lambda s: s or ""
918
 
919
    sheet.write(0, 0, "Item ID", heading_xf)
920
    sheet.write(0, 1, "Brand", heading_xf)
921
    sheet.write(0, 2, "Product Name", heading_xf)
922
    sheet.write(0, 3, "Reason", heading_xf)
923
    sheet_iterator=1
924
    for item in exceptionList:
925
        sheet.write(sheet_iterator, 0, item.item_id)
926
        sheet.write(sheet_iterator, 1, item.brand)
927
        sheet.write(sheet_iterator, 2, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
928
        sheet.write(sheet_iterator, 3, "Unable to fetch info from Snapdeal")
929
        sheet_iterator+=1
930
 
931
    sheet = wbk.add_sheet('Can Compete-No Inv')
932
 
933
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
934
 
935
    excel_integer_format = '0'
936
    integer_style = xlwt.XFStyle()
937
    integer_style.num_format_str = excel_integer_format
938
    xstr = lambda s: s or ""
939
 
940
    sheet.write(0, 0, "Item ID", heading_xf)
941
    sheet.write(0, 1, "Category", heading_xf)
942
    sheet.write(0, 2, "Product Group.", heading_xf)
943
    sheet.write(0, 3, "SUPC", heading_xf)
944
    sheet.write(0, 4, "Brand", heading_xf)
945
    sheet.write(0, 5, "Product Name", heading_xf)
946
    sheet.write(0, 6, "Weight", heading_xf)
947
    sheet.write(0, 7, "Courier Cost", heading_xf)
948
    sheet.write(0, 8, "Risky", heading_xf)
949
    sheet.write(0, 9, "Our SP", heading_xf)
950
    sheet.write(0, 11, "Our TP", heading_xf)
951
    sheet.write(0, 10, "Our Offer Price", heading_xf)
952
    sheet.write(0, 12, "Our Rank", heading_xf)
953
    sheet.write(0, 13, "Lowest Seller", heading_xf)
954
    sheet.write(0, 14, "Lowest SP", heading_xf)
955
    sheet.write(0, 15, "Lowest TP", heading_xf)
956
    sheet.write(0, 16, "Lowest Offer Price", heading_xf)
957
    sheet.write(0, 17, "Inventory of Top Vendors", heading_xf)
958
    sheet.write(0, 18, "Our Snapdeal Inventory", heading_xf)
959
    sheet.write(0, 19, "Our Net Availability",heading_xf)
960
    sheet.write(0, 20, "Last Five Day Sale", heading_xf)
961
    sheet.write(0, 21, "Average Sale", heading_xf)
962
    sheet.write(0, 22, "Our NLC", heading_xf)
963
    sheet.write(0, 23, "Lowest Possible TP", heading_xf)
964
    sheet.write(0, 24, "Lowest Possible SP", heading_xf)
10381 manish.sha 965
    sheet.write(0, 25, "Subsidy Difference", heading_xf)
9949 kshitij.so 966
    sheet.write(0, 26, "Target TP", heading_xf)
967
    sheet.write(0, 27, "Target SP", heading_xf)  
968
    sheet.write(0, 28, "Target NLC", heading_xf)
969
    sheet.write(0, 29, "Sales Potential", heading_xf)
970
 
971
    sheet_iterator = 1
972
    for item in competitiveNoInventory:
973
        snapdealDetails = item[0]
974
        snapdealItemInfo = item[1]
975
        snapdealPricing = item[2]
976
        mpItem = item[3]
977
        if ((not inventoryMap.has_key(snapdealItemInfo.item_id)) or getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id))<=0):
978
            sheet.write(sheet_iterator, 0, snapdealItemInfo.item_id)
979
            sheet.write(sheet_iterator, 1, snapdealItemInfo.parent_category_name)
980
            sheet.write(sheet_iterator, 2, snapdealItemInfo.product_group)
981
            sheet.write(sheet_iterator, 3, snapdealItemInfo.supc)
982
            sheet.write(sheet_iterator, 4, snapdealItemInfo.brand)
983
            sheet.write(sheet_iterator, 5, xstr(snapdealItemInfo.brand)+" "+xstr(snapdealItemInfo.model_name)+" "+xstr(snapdealItemInfo.model_number)+" "+xstr(snapdealItemInfo.color))
984
            sheet.write(sheet_iterator, 6, snapdealItemInfo.weight)
985
            sheet.write(sheet_iterator, 7, snapdealItemInfo.courierCost)
986
            sheet.write(sheet_iterator, 8, snapdealItemInfo.risky)
987
            sheet.write(sheet_iterator, 9, snapdealPricing.ourSp)
988
            sheet.write(sheet_iterator, 10, snapdealDetails.ourOfferPrice)
989
            sheet.write(sheet_iterator, 11, snapdealPricing.ourTp)
990
            sheet.write(sheet_iterator, 12, snapdealDetails.rank)
991
            sheet.write(sheet_iterator, 13, snapdealDetails.lowestSellerName)
992
            sheet.write(sheet_iterator, 14, snapdealDetails.lowestSp)
993
            sheet.write(sheet_iterator, 15, snapdealPricing.lowestTp)
994
            sheet.write(sheet_iterator, 16, snapdealDetails.lowestOfferPrice)
995
            sheet.write(sheet_iterator, 17, snapdealDetails.otherInventory)
996
            sheet.write(sheet_iterator, 18, snapdealDetails.ourInventory)
997
            if (not inventoryMap.has_key(snapdealItemInfo.item_id)):
998
                sheet.write(sheet_iterator, 19, 'Info not available')
999
            else:
1000
                sheet.write(sheet_iterator, 19, getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id)))
1001
            sheet.write(sheet_iterator, 20, getOosString((itemSaleMap.get(snapdealItemInfo.item_id))[1]))
1002
            sheet.write(sheet_iterator, 21, (itemSaleMap.get(snapdealItemInfo.item_id))[3])
1003
            sheet.write(sheet_iterator, 22, snapdealItemInfo.nlc)
1004
            sheet.write(sheet_iterator, 23, snapdealPricing.lowestPossibleTp)
1005
            sheet.write(sheet_iterator, 24, snapdealPricing.lowestPossibleSp)
10381 manish.sha 1006
            sheet.write(sheet_iterator, 25, getSubsidyDiff(snapdealDetails))
9949 kshitij.so 1007
            if (snapdealPricing.competitionBasis=='SP'):
1008
                proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001)
1009
                proposed_tp = getTargetTp(proposed_sp,mpItem)
1010
                target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
1011
            else:
10381 manish.sha 1012
                #proposed_tp  = snapdealPricing.lowestTp - max(10, snapdealPricing.lowestTp*0.001)
1013
                #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
1014
                proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001) -getSubsidyDiff(snapdealDetails)
1015
                proposed_tp = getTargetTp(proposed_sp,mpItem)
9949 kshitij.so 1016
                target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 1017
            sheet.write(sheet_iterator, 26, round(proposed_tp,2))
1018
            sheet.write(sheet_iterator, 27, round(proposed_sp,2))
1019
            sheet.write(sheet_iterator, 28, round(target_nlc,2))
9949 kshitij.so 1020
            sheet.write(sheet_iterator, 29, getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
1021
            sheet_iterator+=1
1022
 
1023
    sheet = wbk.add_sheet('Can Compete-No Inv On SD')
1024
 
1025
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1026
 
1027
    excel_integer_format = '0'
1028
    integer_style = xlwt.XFStyle()
1029
    integer_style.num_format_str = excel_integer_format
1030
    xstr = lambda s: s or ""
1031
 
1032
    sheet.write(0, 0, "Item ID", heading_xf)
1033
    sheet.write(0, 1, "Category", heading_xf)
1034
    sheet.write(0, 2, "Product Group.", heading_xf)
1035
    sheet.write(0, 3, "SUPC", heading_xf)
1036
    sheet.write(0, 4, "Brand", heading_xf)
1037
    sheet.write(0, 5, "Product Name", heading_xf)
1038
    sheet.write(0, 6, "Weight", heading_xf)
1039
    sheet.write(0, 7, "Courier Cost", heading_xf)
1040
    sheet.write(0, 8, "Risky", heading_xf)
1041
    sheet.write(0, 9, "Our SP", heading_xf)
1042
    sheet.write(0, 11, "Our TP", heading_xf)
1043
    sheet.write(0, 10, "Our Offer Price", heading_xf)
1044
    sheet.write(0, 12, "Our Rank", heading_xf)
1045
    sheet.write(0, 13, "Lowest Seller", heading_xf)
1046
    sheet.write(0, 14, "Lowest SP", heading_xf)
1047
    sheet.write(0, 15, "Lowest TP", heading_xf)
1048
    sheet.write(0, 16, "Lowest Offer Price", heading_xf)
1049
    sheet.write(0, 17, "Inventory of Top Vendors", heading_xf)
1050
    sheet.write(0, 18, "Our Snapdeal Inventory", heading_xf)
1051
    sheet.write(0, 19, "Our Net Availability",heading_xf)
1052
    sheet.write(0, 20, "Last Five Day Sale", heading_xf)
1053
    sheet.write(0, 21, "Average Sale", heading_xf)
1054
    sheet.write(0, 22, "Our NLC", heading_xf)
1055
    sheet.write(0, 23, "Lowest Possible TP", heading_xf)
1056
    sheet.write(0, 24, "Lowest Possible SP", heading_xf)
10381 manish.sha 1057
    sheet.write(0, 25, "Subsidy Difference", heading_xf)
9949 kshitij.so 1058
    sheet.write(0, 26, "Target TP", heading_xf)
1059
    sheet.write(0, 27, "Target SP", heading_xf)  
1060
    sheet.write(0, 28, "Target NLC", heading_xf)
1061
    sheet.write(0, 29, "Sales Potential", heading_xf)
1062
 
1063
    sheet_iterator = 1
1064
    for item in competitiveNoInventory:
1065
        snapdealDetails = item[0]
1066
        snapdealItemInfo = item[1]
1067
        snapdealPricing = item[2]
1068
        mpItem = item[3]
1069
        if (inventoryMap.has_key(snapdealItemInfo.item_id) and getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id))>0):
1070
            sheet.write(sheet_iterator, 0, snapdealItemInfo.item_id)
1071
            sheet.write(sheet_iterator, 1, snapdealItemInfo.parent_category_name)
1072
            sheet.write(sheet_iterator, 2, snapdealItemInfo.product_group)
1073
            sheet.write(sheet_iterator, 3, snapdealItemInfo.supc)
1074
            sheet.write(sheet_iterator, 4, snapdealItemInfo.brand)
1075
            sheet.write(sheet_iterator, 5, xstr(snapdealItemInfo.brand)+" "+xstr(snapdealItemInfo.model_name)+" "+xstr(snapdealItemInfo.model_number)+" "+xstr(snapdealItemInfo.color))
1076
            sheet.write(sheet_iterator, 6, snapdealItemInfo.weight)
1077
            sheet.write(sheet_iterator, 7, snapdealItemInfo.courierCost)
1078
            sheet.write(sheet_iterator, 8, snapdealItemInfo.risky)
1079
            sheet.write(sheet_iterator, 9, snapdealPricing.ourSp)
1080
            sheet.write(sheet_iterator, 10, snapdealDetails.ourOfferPrice)
1081
            sheet.write(sheet_iterator, 11, snapdealPricing.ourTp)
1082
            sheet.write(sheet_iterator, 12, snapdealDetails.rank)
1083
            sheet.write(sheet_iterator, 13, snapdealDetails.lowestSellerName)
1084
            sheet.write(sheet_iterator, 14, snapdealDetails.lowestSp)
1085
            sheet.write(sheet_iterator, 15, snapdealPricing.lowestTp)
1086
            sheet.write(sheet_iterator, 16, snapdealDetails.lowestOfferPrice)
1087
            sheet.write(sheet_iterator, 17, snapdealDetails.otherInventory)
1088
            sheet.write(sheet_iterator, 18, snapdealDetails.ourInventory)
1089
            if (not inventoryMap.has_key(snapdealItemInfo.item_id)):
1090
                sheet.write(sheet_iterator, 19, 'Info not available')
1091
            else:
1092
                sheet.write(sheet_iterator, 19, getNetAvailability(inventoryMap.get(snapdealItemInfo.item_id)))
1093
            sheet.write(sheet_iterator, 20, getOosString((itemSaleMap.get(snapdealItemInfo.item_id))[1]))
1094
            sheet.write(sheet_iterator, 21, (itemSaleMap.get(snapdealItemInfo.item_id))[3])
1095
            sheet.write(sheet_iterator, 22, snapdealItemInfo.nlc)
1096
            sheet.write(sheet_iterator, 23, snapdealPricing.lowestPossibleTp)
1097
            sheet.write(sheet_iterator, 24, snapdealPricing.lowestPossibleSp)
10381 manish.sha 1098
            sheet.write(sheet_iterator, 25, getSubsidyDiff(snapdealDetails))
9949 kshitij.so 1099
            if (snapdealPricing.competitionBasis=='SP'):
1100
                proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001)
1101
                proposed_tp = getTargetTp(proposed_sp,mpItem)
1102
                target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
1103
            else:
10381 manish.sha 1104
                #proposed_tp  = snapdealPricing.lowestTp - max(10, snapdealPricing.lowestTp*0.001)
1105
                #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
1106
                proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001) -getSubsidyDiff(snapdealDetails)
1107
                proposed_tp = getTargetTp(proposed_sp,mpItem)
9949 kshitij.so 1108
                target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 1109
            sheet.write(sheet_iterator, 26, round(proposed_tp,2))
1110
            sheet.write(sheet_iterator, 27, round(proposed_sp,2))
1111
            sheet.write(sheet_iterator, 28, round(target_nlc,2))
9949 kshitij.so 1112
            sheet.write(sheet_iterator, 29, getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
1113
            sheet_iterator+=1
9953 kshitij.so 1114
 
1115
    if (runType=='FULL'):    
1116
        sheet = wbk.add_sheet('Auto Favorites')
1117
 
1118
        heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1119
 
1120
        excel_integer_format = '0'
1121
        integer_style = xlwt.XFStyle()
1122
        integer_style.num_format_str = excel_integer_format
1123
        xstr = lambda s: s or ""
1124
 
1125
        sheet.write(0, 0, "Item ID", heading_xf)
1126
        sheet.write(0, 1, "Brand", heading_xf)
1127
        sheet.write(0, 2, "Product Name", heading_xf)
1128
        sheet.write(0, 3, "Auto Favourite", heading_xf)
1129
        sheet.write(0, 4, "Reason", heading_xf)
1130
 
1131
        sheet_iterator=1
1132
        for autoFav in nowAutoFav:
1133
            itemId = autoFav[0]
1134
            reason = autoFav[1]
1135
            it = Item.query.filter_by(id=itemId).one()
1136
            sheet.write(sheet_iterator, 0, itemId)
1137
            sheet.write(sheet_iterator, 1, it.brand)
1138
            sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
1139
            sheet.write(sheet_iterator, 3, "True")
1140
            sheet.write(sheet_iterator, 4, reason)
1141
            sheet_iterator+=1
1142
        for prevFav in previousAutoFav:
1143
            it = Item.query.filter_by(id=prevFav).one()
1144
            sheet.write(sheet_iterator, 0, prevFav)
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, "False")
1148
            sheet_iterator+=1
9949 kshitij.so 1149
 
1150
 
1151
    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()
1152
    sheet = wbk.add_sheet('Auto Inc and Dec')
1153
 
1154
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1155
 
1156
    excel_integer_format = '0'
1157
    integer_style = xlwt.XFStyle()
1158
    integer_style.num_format_str = excel_integer_format
1159
    xstr = lambda s: s or ""
1160
 
1161
    sheet.write(0, 0, "Item ID", heading_xf)
1162
    sheet.write(0, 1, "Brand", heading_xf)
1163
    sheet.write(0, 2, "Product Name", heading_xf)
1164
    sheet.write(0, 3, "Decision", heading_xf)
1165
    sheet.write(0, 4, "Reason", heading_xf)
9954 kshitij.so 1166
    sheet.write(0, 5, "Old Selling Price", heading_xf)
1167
    sheet.write(0, 6, "Selling Price Updated",heading_xf)
9949 kshitij.so 1168
 
1169
    sheet_iterator=1
1170
    for autoPricingItem in autoPricingItems:
1171
        mpHistory = autoPricingItem[0]
1172
        item = autoPricingItem[1]
9954 kshitij.so 1173
        it = Item.query.filter_by(id=item.id).one()
9949 kshitij.so 1174
        sheet.write(sheet_iterator, 0, item.id)
1175
        sheet.write(sheet_iterator, 1, it.brand)
1176
        sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
1177
        sheet.write(sheet_iterator, 3, Decision._VALUES_TO_NAMES.get(mpHistory.decision))
1178
        sheet.write(sheet_iterator, 4, mpHistory.reason)
1179
        if Decision._VALUES_TO_NAMES.get(mpHistory.decision) == "AUTO_DECREMENT_SUCCESS":
9954 kshitij.so 1180
            sheet.write(sheet_iterator, 5, mpHistory.ourSellingPrice)
1181
            sheet.write(sheet_iterator, 6, math.ceil(mpHistory.proposedSellingPrice))
9949 kshitij.so 1182
        if Decision._VALUES_TO_NAMES.get(mpHistory.decision) == "AUTO_INCREMENT_SUCCESS":
9954 kshitij.so 1183
            sheet.write(sheet_iterator, 5, mpHistory.ourSellingPrice)
1184
            sheet.write(sheet_iterator, 6, math.ceil(mpHistory.ourSellingPrice+max(10,.01*mpHistory.ourSellingPrice)))
9949 kshitij.so 1185
        sheet_iterator+=1
1186
 
9953 kshitij.so 1187
    filename = "/tmp/snapdeal-report-"+runType+" " + str(timestamp) + ".xls"
9949 kshitij.so 1188
    wbk.save(filename)
10207 kshitij.so 1189
    try:
10293 kshitij.so 1190
        #EmailAttachmentSender.mail("build@shop2020.in", "cafe@nes", ["kshitij.sood@saholic.com"], " Snapdeal Auto Pricing "+runType+" " + str(timestamp), "", [get_attachment_part(filename)], [""], [])
1191
        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","rajveer.singh@saholic.com","vikram.raghav@saholic.com","kshitij.sood@saholic.com","chaitnaya.vats@saholic.com","khushal.bhatia@saholic.com"], [])
10207 kshitij.so 1192
    except Exception as e:
1193
        print e
10219 kshitij.so 1194
        print "Unable to send report.Trying with local SMTP"
1195
        smtpServer = smtplib.SMTP('localhost')
1196
        smtpServer.set_debuglevel(1)
1197
        sender = 'support@shop2020.in'
10293 kshitij.so 1198
        #recipients = ['kshitij.sood@saholic.com']
10219 kshitij.so 1199
        msg = MIMEMultipart()
1200
        msg['Subject'] = "Snapdeal Auto Pricing" + ' - ' + str(datetime.now())
1201
        msg['From'] = sender
10293 kshitij.so 1202
        recipients = ['rajneesh.arora@saholic.com','rajveer.singh@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 1203
        msg['To'] = ",".join(recipients)
10219 kshitij.so 1204
        fileMsg = email.mime.base.MIMEBase('application','vnd.ms-excel')
1205
        fileMsg.set_payload(file(filename).read())
1206
        email.encoders.encode_base64(fileMsg)
1207
        fileMsg.add_header('Content-Disposition','attachment;filename=snapdeal.xls')
1208
        msg.attach(fileMsg)
1209
        try:
1210
            smtpServer.sendmail(sender, recipients, msg.as_string())
1211
            print "Successfully sent email"
1212
        except:
1213
            print "Error: unable to send email."
9881 kshitij.so 1214
 
10219 kshitij.so 1215
 
9881 kshitij.so 1216
def commitExceptionList(exceptionList,timestamp):
9949 kshitij.so 1217
    exceptionItems=[]
9881 kshitij.so 1218
    for item in exceptionList:
1219
        mpHistory = MarketPlaceHistory()
1220
        mpHistory.item_id =item.item_id
1221
        mpHistory.source = OrderSource.SNAPDEAL 
1222
        mpHistory.competitiveCategory = CompetitionCategory.EXCEPTION
1223
        mpHistory.risky = item.risky
1224
        mpHistory.timestamp = timestamp
9949 kshitij.so 1225
        mpHistory.run = RunType._NAMES_TO_VALUES.get(item.runType)
1226
        exceptionItems.append(mpHistory)
9881 kshitij.so 1227
    session.commit()
9949 kshitij.so 1228
    return exceptionItems
9881 kshitij.so 1229
 
1230
def commitNegativeMargin(negativeMargin,timestamp):
9949 kshitij.so 1231
    negativeMarginItems = []
9881 kshitij.so 1232
    for item in negativeMargin:
1233
        snapdealDetails = item[0]
1234
        snapdealItemInfo = item[1]
1235
        snapdealPricing = item[2]
1236
        mpHistory = MarketPlaceHistory()
1237
        mpHistory.item_id = snapdealItemInfo.item_id
1238
        mpHistory.source = OrderSource.SNAPDEAL
1239
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
1240
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
1241
        mpHistory.ourTp = snapdealPricing.ourTp
9919 kshitij.so 1242
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
9881 kshitij.so 1243
        mpHistory.ourNlc = snapdealItemInfo.nlc
1244
        mpHistory.ourInventory = snapdealDetails.ourInventory
1245
        mpHistory.otherInventory = snapdealDetails.otherInventory
1246
        mpHistory.ourRank = snapdealDetails.rank
9919 kshitij.so 1247
        mpHistory.risky = snapdealItemInfo.risky
1248
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp  
9881 kshitij.so 1249
        mpHistory.competitiveCategory = CompetitionCategory.NEGATIVE_MARGIN
1250
        mpHistory.totalSeller = snapdealDetails.totalSeller
9949 kshitij.so 1251
        mpHistory.avgSales = (itemSaleMap.get(snapdealItemInfo.item_id))[2]
9881 kshitij.so 1252
        mpHistory.timestamp = timestamp
9949 kshitij.so 1253
        mpHistory.run = RunType._NAMES_TO_VALUES.get(snapdealItemInfo.runType)
1254
        negativeMarginItems.append(mpHistory) 
9881 kshitij.so 1255
    session.commit()
9949 kshitij.so 1256
    return negativeMarginItems
9881 kshitij.so 1257
 
1258
def commitCompetitive(competitive,timestamp):
9949 kshitij.so 1259
    competitiveItems = []
9881 kshitij.so 1260
    for item in competitive:
1261
        snapdealDetails = item[0]
1262
        snapdealItemInfo = item[1]
1263
        snapdealPricing = item[2]
1264
        mpItem = item[3]
1265
        mpHistory = MarketPlaceHistory()
1266
        mpHistory.item_id = snapdealItemInfo.item_id
1267
        mpHistory.source = OrderSource.SNAPDEAL
1268
        mpHistory.lowestTp = snapdealPricing.lowestTp
1269
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
1270
        mpHistory.lowestPossibleSp = snapdealPricing.lowestPossibleSp
1271
        mpHistory.ourInventory = snapdealDetails.ourInventory
1272
        mpHistory.otherInventory = snapdealDetails.otherInventory
1273
        mpHistory.ourRank = snapdealDetails.rank
1274
        mpHistory.competitionBasis = CompetitionBasis._NAMES_TO_VALUES.get(snapdealPricing.competitionBasis)
1275
        mpHistory.competitiveCategory = CompetitionCategory.COMPETITIVE
1276
        mpHistory.risky = snapdealItemInfo.risky
1277
        mpHistory.lowestOfferPrice = snapdealDetails.lowestOfferPrice
1278
        mpHistory.lowestSellingPrice = snapdealDetails.lowestSp
1279
        mpHistory.lowestSellerName = snapdealDetails.lowestSellerName
1280
        mpHistory.lowestSellerCode = snapdealDetails.lowestSellerCode
1281
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
1282
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
1283
        mpHistory.ourTp = snapdealPricing.ourTp
1284
        mpHistory.ourNlc = snapdealItemInfo.nlc
1285
        if (snapdealPricing.competitionBasis=='SP'):
1286
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)), snapdealPricing.lowestPossibleSp)
1287
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9954 kshitij.so 1288
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1289
            mpHistory.proposedTp = round(proposed_tp,2)
9881 kshitij.so 1290
        else:
10381 manish.sha 1291
            #proposed_tp  = max(snapdealPricing.lowestTp - max((10, snapdealPricing.lowestTp*0.001)), snapdealPricing.lowestPossibleTp)
1292
            #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
1293
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)) -getSubsidyDiff(snapdealDetails), snapdealPricing.lowestPossibleSp)
1294
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9954 kshitij.so 1295
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1296
            mpHistory.proposedTp = round(proposed_tp,2)
9919 kshitij.so 1297
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
9881 kshitij.so 1298
        mpHistory.totalSeller = snapdealDetails.totalSeller
9949 kshitij.so 1299
        mpHistory.avgSales = (itemSaleMap.get(snapdealItemInfo.item_id))[2]
9881 kshitij.so 1300
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
1301
        mpHistory.timestamp = timestamp
9949 kshitij.so 1302
        mpHistory.run = RunType._NAMES_TO_VALUES.get(snapdealItemInfo.runType)
1303
        competitiveItems.append(mpHistory) 
9881 kshitij.so 1304
    session.commit()
9949 kshitij.so 1305
    return competitiveItems
9881 kshitij.so 1306
 
1307
def commitCompetitiveNoInventory(competitiveNoInventory,timestamp):
9949 kshitij.so 1308
    competitiveNoInventoryItems = []
9881 kshitij.so 1309
    for item in competitiveNoInventory:
1310
        snapdealDetails = item[0]
1311
        snapdealItemInfo = item[1]
1312
        snapdealPricing = item[2]
1313
        mpItem = item[3]
1314
        mpHistory = MarketPlaceHistory()
1315
        mpHistory.item_id = snapdealItemInfo.item_id
1316
        mpHistory.source = OrderSource.SNAPDEAL
1317
        mpHistory.lowestTp = snapdealPricing.lowestTp
1318
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
1319
        mpHistory.lowestPossibleSp = snapdealPricing.lowestPossibleSp
1320
        mpHistory.ourInventory = snapdealDetails.ourInventory
1321
        mpHistory.otherInventory = snapdealDetails.otherInventory
1322
        mpHistory.ourRank = snapdealDetails.rank
1323
        mpHistory.competitionBasis = CompetitionBasis._NAMES_TO_VALUES.get(snapdealPricing.competitionBasis)
1324
        mpHistory.competitiveCategory = CompetitionCategory.COMPETITIVE_NO_INVENTORY
1325
        mpHistory.risky = snapdealItemInfo.risky
1326
        mpHistory.lowestOfferPrice = snapdealDetails.lowestOfferPrice
1327
        mpHistory.lowestSellingPrice = snapdealDetails.lowestSp
1328
        mpHistory.lowestSellerName = snapdealDetails.lowestSellerName
1329
        mpHistory.lowestSellerCode = snapdealDetails.lowestSellerCode
1330
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
1331
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
1332
        mpHistory.ourTp = snapdealPricing.ourTp
1333
        mpHistory.ourNlc = snapdealItemInfo.nlc
1334
        if (snapdealPricing.competitionBasis=='SP'):
1335
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)), snapdealPricing.lowestPossibleSp)
1336
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9954 kshitij.so 1337
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1338
            mpHistory.proposedTp = round(proposed_tp,2)
9881 kshitij.so 1339
        else:
10381 manish.sha 1340
            #proposed_tp  = max(snapdealPricing.lowestTp - max((10, snapdealPricing.lowestTp*0.001)), snapdealPricing.lowestPossibleTp)
1341
            #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
1342
            proposed_sp = max(snapdealDetails.lowestSp - max((10, snapdealDetails.lowestSp*0.001)) -getSubsidyDiff(snapdealDetails), snapdealPricing.lowestPossibleSp)
1343
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9954 kshitij.so 1344
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1345
            mpHistory.proposedTp = round(proposed_tp,2)
9919 kshitij.so 1346
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
9881 kshitij.so 1347
        mpHistory.totalSeller = snapdealDetails.totalSeller
9949 kshitij.so 1348
        mpHistory.avgSales = (itemSaleMap.get(snapdealItemInfo.item_id))[2]
9881 kshitij.so 1349
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
1350
        mpHistory.timestamp = timestamp
9949 kshitij.so 1351
        mpHistory.run = RunType._NAMES_TO_VALUES.get(snapdealItemInfo.runType)
1352
        competitiveNoInventoryItems.append(mpHistory)
9881 kshitij.so 1353
    session.commit()
9949 kshitij.so 1354
    return competitiveNoInventoryItems
9881 kshitij.so 1355
 
1356
def commitCantCompete(cantCompete,timestamp):
9949 kshitij.so 1357
    cantComepeteItems = []
9881 kshitij.so 1358
    for item in cantCompete:
1359
        snapdealDetails = item[0]
1360
        snapdealItemInfo = item[1]
1361
        snapdealPricing = item[2]
1362
        mpItem = item[3]
1363
        mpHistory = MarketPlaceHistory()
1364
        mpHistory.item_id = snapdealItemInfo.item_id
1365
        mpHistory.source = OrderSource.SNAPDEAL
1366
        mpHistory.lowestTp = snapdealPricing.lowestTp
1367
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
1368
        mpHistory.lowestPossibleSp = snapdealPricing.lowestPossibleSp
1369
        mpHistory.ourInventory = snapdealDetails.ourInventory
1370
        mpHistory.otherInventory = snapdealDetails.otherInventory
1371
        mpHistory.ourRank = snapdealDetails.rank
1372
        mpHistory.competitionBasis = CompetitionBasis._NAMES_TO_VALUES.get(snapdealPricing.competitionBasis)
1373
        mpHistory.competitiveCategory = CompetitionCategory.CANT_COMPETE
1374
        mpHistory.risky = snapdealItemInfo.risky
1375
        mpHistory.lowestOfferPrice = snapdealDetails.lowestOfferPrice
1376
        mpHistory.lowestSellingPrice = snapdealDetails.lowestSp
1377
        mpHistory.lowestSellerName = snapdealDetails.lowestSellerName
1378
        mpHistory.lowestSellerCode = snapdealDetails.lowestSellerCode
1379
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
1380
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
1381
        mpHistory.ourTp = snapdealPricing.ourTp
1382
        mpHistory.ourNlc = snapdealItemInfo.nlc
1383
        if (snapdealPricing.competitionBasis=='SP'):
1384
            proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001)
1385
            proposed_tp = getTargetTp(proposed_sp,mpItem)
1386
            target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 1387
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1388
            mpHistory.proposedTp = round(proposed_tp,2)
1389
            mpHistory.targetNlc = round(target_nlc,2)
9881 kshitij.so 1390
        else:
10381 manish.sha 1391
            #proposed_tp  = snapdealPricing.lowestTp - max(10, snapdealPricing.lowestTp*0.001)
1392
            #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
1393
            proposed_sp = snapdealDetails.lowestSp - max(10, snapdealDetails.lowestSp*0.001) -getSubsidyDiff(snapdealDetails)
1394
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9881 kshitij.so 1395
            target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 1396
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1397
            mpHistory.proposedTp = round(proposed_tp,2)
1398
            mpHistory.targetNlc = round(target_nlc,2)
9919 kshitij.so 1399
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
9881 kshitij.so 1400
        mpHistory.totalSeller = snapdealDetails.totalSeller
9949 kshitij.so 1401
        mpHistory.avgSales = (itemSaleMap.get(snapdealItemInfo.item_id))[2]
9881 kshitij.so 1402
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(snapdealDetails.lowestOfferPrice,snapdealItemInfo.nlc))
1403
        mpHistory.timestamp = timestamp
9949 kshitij.so 1404
        mpHistory.run = RunType._NAMES_TO_VALUES.get(snapdealItemInfo.runType)
1405
        cantComepeteItems.append(mpHistory)
9881 kshitij.so 1406
    session.commit()
9949 kshitij.so 1407
    return cantComepeteItems
9881 kshitij.so 1408
 
1409
def commitBuyBox(buyBoxItems,timestamp):
9949 kshitij.so 1410
    buyBoxList = []
9881 kshitij.so 1411
    for item in buyBoxItems:
1412
        snapdealDetails = item[0]
1413
        snapdealItemInfo = item[1]
1414
        snapdealPricing = item[2]
1415
        mpItem = item[3]
1416
        mpHistory = MarketPlaceHistory()
1417
        mpHistory.item_id = snapdealItemInfo.item_id
1418
        mpHistory.source = OrderSource.SNAPDEAL
1419
        mpHistory.lowestPossibleTp = snapdealPricing.lowestPossibleTp
1420
        mpHistory.lowestPossibleSp = snapdealPricing.lowestPossibleSp
1421
        mpHistory.ourInventory = snapdealDetails.ourInventory
1422
        mpHistory.secondLowestInventory = snapdealDetails.secondLowestSellerInventory
1423
        mpHistory.ourRank = snapdealDetails.rank
1424
        mpHistory.competitionBasis = CompetitionBasis._NAMES_TO_VALUES.get(snapdealPricing.competitionBasis)
1425
        mpHistory.competitiveCategory = CompetitionCategory.BUY_BOX
1426
        mpHistory.risky = snapdealItemInfo.risky
1427
        mpHistory.lowestOfferPrice = snapdealDetails.lowestOfferPrice
1428
        mpHistory.lowestSellingPrice = snapdealDetails.lowestSp
1429
        mpHistory.lowestSellerName = snapdealDetails.lowestSellerName
1430
        mpHistory.lowestSellerCode = snapdealDetails.lowestSellerCode
1431
        mpHistory.ourOfferPrice = snapdealDetails.ourOfferPrice
1432
        mpHistory.ourSellingPrice = snapdealPricing.ourSp
1433
        mpHistory.ourTp = snapdealPricing.ourTp
1434
        mpHistory.ourNlc = snapdealItemInfo.nlc
1435
        mpHistory.secondLowestSellerName = snapdealDetails.secondLowestSellerName
1436
        mpHistory.secondLowestSellerCode = snapdealDetails.secondLowestSellerCode
9885 kshitij.so 1437
        mpHistory.secondLowestSellingPrice = snapdealDetails.secondLowestSellerSp
9888 kshitij.so 1438
        mpHistory.secondLowestOfferPrice = snapdealDetails.secondLowestSellerOfferPrice
9881 kshitij.so 1439
        mpHistory.secondLowestTp = snapdealPricing.secondLowestSellerTp
1440
        if (snapdealPricing.competitionBasis=='SP'):
1441
            proposed_sp = max(snapdealDetails.secondLowestSellerSp - max((20, snapdealDetails.secondLowestSellerSp*0.002)), snapdealPricing.lowestPossibleSp)
1442
            proposed_tp = getTargetTp(proposed_sp,mpItem)
1443
            #target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 1444
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1445
            mpHistory.proposedTp = round(proposed_tp,2)
9881 kshitij.so 1446
            #mpHistory.targetNlc = target_nlc
1447
        else:
10381 manish.sha 1448
            #proposed_tp  = max(snapdealPricing.secondLowestSellerTp - max((20, snapdealPricing.secondLowestSellerTp*0.002)), snapdealPricing.lowestPossibleTp)
1449
            #proposed_sp = getTargetSp(proposed_tp,mpItem,snapdealPricing.ourSp)
1450
            proposed_sp = max(snapdealDetails.secondLowestSellerSp - max((20, snapdealDetails.secondLowestSellerSp*0.002)) -getSubsidyDiff(snapdealDetails), snapdealPricing.lowestPossibleSp)
1451
            proposed_tp = getTargetTp(proposed_sp,mpItem)
9881 kshitij.so 1452
            #target_nlc = proposed_tp - snapdealPricing.lowestPossibleTp + snapdealItemInfo.nlc
9954 kshitij.so 1453
            mpHistory.proposedSellingPrice = round(proposed_sp,2)
1454
            mpHistory.proposedTp = round(proposed_tp,2)
9881 kshitij.so 1455
            #mpHistory.targetNlc = target_nlc
9919 kshitij.so 1456
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
9881 kshitij.so 1457
        mpHistory.marginIncreasedPotential = proposed_tp - snapdealPricing.ourTp
1458
        mpHistory.totalSeller = snapdealDetails.totalSeller
9949 kshitij.so 1459
        mpHistory.avgSales = (itemSaleMap.get(snapdealItemInfo.item_id))[2]
9881 kshitij.so 1460
        mpHistory.timestamp = timestamp
9949 kshitij.so 1461
        mpHistory.run = RunType._NAMES_TO_VALUES.get(snapdealItemInfo.runType)
1462
        buyBoxList.append(mpHistory)
9881 kshitij.so 1463
    session.commit()
9949 kshitij.so 1464
    return buyBoxList 
10219 kshitij.so 1465
 
9990 kshitij.so 1466
def sendAutoPricingMail(successfulAutoDecrease,successfulAutoIncrease):
1467
    xstr = lambda s: s or ""
1468
    catalog_client = CatalogClient().get_client()
1469
    inventory_client = InventoryClient().get_client()
1470
    message="""<html>
1471
            <body>
1472
            <h3>Auto Decrease Items</h3>
1473
            <table border="1" style="width:100%;">
1474
            <thead>
1475
            <tr><th>Item Id</th>
1476
            <th>Product Name</th>
1477
            <th>Old Price</th>
1478
            <th>New Price</th>
1479
            <th>Old Margin</th>
1480
            <th>New Margin</th>
1481
            <th>Snapdeal Inventory</th>
1482
            </tr></thead>
1483
            <tbody>"""
1484
    for item in successfulAutoDecrease:
1485
        it = Item.query.filter_by(id=item.item_id).one()
1486
        mpItem = MarketplaceItems.get_by(itemId=item.item_id,source=OrderSource.SNAPDEAL)
1487
        sdItem = SnapdealItem.get_by(item_id=item.item_id)
1488
        warehouse = inventory_client.getWarehouse(sdItem.warehouseId)
1489
        vatRate = catalog_client.getVatPercentageForItem(item.item_id, warehouse.stateId, item.proposedSellingPrice)
1490
        newMargin = round(getNewOurTp(mpItem,item.proposedSellingPrice) - getNewLowestPossibleTp(mpItem,item.ourNlc,vatRate,item.proposedSellingPrice))  
1491
        message+="""<tr>
1492
                <td style="text-align:center">"""+str(item.item_id)+"""</td>
1493
                <td style="text-align:center">"""+xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color)+"""</td>
1494
                <td style="text-align:center">"""+str(item.ourSellingPrice)+"""</td>
1495
                <td style="text-align:center">"""+str(math.ceil(item.proposedSellingPrice))+"""</td>
1496
                <td style="text-align:center">"""+str(round(item.margin))+" ("+str(round((item.margin/item.ourSellingPrice)*100,1))+"%)"+"""</td>
1497
                <td style="text-align:center">"""+str(newMargin)+" ("+str(round((newMargin/item.proposedSellingPrice)*100,1))+"%)"+"""</td>
1498
                <td style="text-align:center">"""+str(item.ourInventory)+"""</td>
1499
                </tr>"""
1500
    message+="""</tbody></table><h3>Auto Increase Items</h3><table border="1" style="width:100%;">
1501
            <thead>
1502
            <tr><th>Item Id</th>
1503
            <th>Product Name</th>
1504
            <th>Old Price</th>
1505
            <th>New Price</th>
1506
            <th>Old Margin</th>
1507
            <th>New Margin</th>
1508
            <th>Snapdeal Inventory</th>
1509
            </tr></thead>
1510
            <tbody>"""
1511
    for item in successfulAutoIncrease:
1512
        it = Item.query.filter_by(id=item.item_id).one()
1513
        mpItem = MarketplaceItems.get_by(itemId=item.item_id,source=OrderSource.SNAPDEAL)
1514
        sdItem = SnapdealItem.get_by(item_id=item.item_id)
1515
        warehouse = inventory_client.getWarehouse(sdItem.warehouseId)
1516
        vatRate = catalog_client.getVatPercentageForItem(item.item_id, warehouse.stateId, math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))
1517
        newMargin = round(getNewOurTp(mpItem,item.ourSellingPrice+max(10,.01*item.ourSellingPrice)) - getNewLowestPossibleTp(mpItem,item.ourNlc,vatRate,item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))  
1518
        message+="""<tr>
1519
                <td style="text-align:center">"""+str(item.item_id)+"""</td>
1520
                <td style="text-align:center">"""+xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color)+"""</td>
1521
                <td style="text-align:center">"""+str(item.ourSellingPrice)+"""</td>
1522
                <td style="text-align:center">"""+str(math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))+"""</td>
1523
                <td style="text-align:center">"""+str(round((item.margin),1))+" ("+str(round((item.margin/item.ourSellingPrice)*100,1))+"%)"+"""</td>
1524
                <td style="text-align:center">"""+str(newMargin)+" ("+str(round((newMargin/(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))*100,1))+"%)"+"""</td>
1525
                <td style="text-align:center">"""+str(item.ourInventory)+"""</td>
1526
                </tr>"""
1527
    message+="""</tbody></table></body></html>"""
1528
    print message
1529
    mailServer = smtplib.SMTP("smtp.gmail.com", 587)
1530
    mailServer.ehlo()
1531
    mailServer.starttls()
1532
    mailServer.ehlo()
1533
 
10293 kshitij.so 1534
    #recipients = ['kshitij.sood@saholic.com']
1535
    recipients = ['rajneesh.arora@saholic.com','rajveer.singh@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 1536
    msg = MIMEMultipart()
1537
    msg['Subject'] = "Snapdeal Auto Pricing" + ' - ' + str(datetime.now())
1538
    msg['From'] = ""
10005 kshitij.so 1539
    msg['To'] = ",".join(recipients)
9990 kshitij.so 1540
    msg.preamble = "Snapdeal Auto Pricing" + ' - ' + str(datetime.now())
1541
    html_msg = MIMEText(message, 'html')
1542
    msg.attach(html_msg)
10207 kshitij.so 1543
    try:
1544
        mailServer.login("build@shop2020.in", "cafe@nes")
1545
        #mailServer.sendmail("cafe@nes", ['kshitij.sood@saholic.com'], msg.as_string())
1546
        mailServer.sendmail("cafe@nes", recipients, msg.as_string())
1547
    except Exception as e:
1548
        print e
10219 kshitij.so 1549
        print "Unable to send pricing mail.Lets try with local SMTP."
1550
        smtpServer = smtplib.SMTP('localhost')
1551
        smtpServer.set_debuglevel(1)
1552
        sender = 'support@shop2020.in'
1553
        try:
1554
            smtpServer.sendmail(sender, recipients, msg.as_string())
1555
            print "Successfully sent email"
1556
        except:
1557
            print "Error: unable to send email."
1558
 
9990 kshitij.so 1559
 
1560
def commitPricing(successfulAutoDecrease,successfulAutoIncrease,timestamp):
1561
    catalog_client = CatalogClient().get_client()
1562
    inventory_client = InventoryClient().get_client()
1563
    for item in successfulAutoDecrease:
1564
        it = Item.query.filter_by(id=item.item_id).one()
1565
        mpItem = MarketplaceItems.get_by(itemId=item.item_id,source=OrderSource.SNAPDEAL)
1566
        sdItem = SnapdealItem.get_by(item_id=item.item_id)
1567
        warehouse = inventory_client.getWarehouse(sdItem.warehouseId)
1568
        vatRate = catalog_client.getVatPercentageForItem(item.item_id, warehouse.stateId, item.proposedSellingPrice)
1569
        addHistory(sdItem)
1570
        sdItem.transferPrice = getNewOurTp(mpItem,item.proposedSellingPrice)
1571
        sdItem.sellingPrice = math.ceil(item.proposedSellingPrice)
10293 kshitij.so 1572
        if ((mpItem.pgFee/100)*sdItem.sellingPrice)>=20:
1573
            sdItem.commission = round((mpItem.commission/100+mpItem.pgFee/100)*(sdItem.sellingPrice),2)
1574
        else:
1575
            sdItem.commission = round((mpItem.commission/100)*(sdItem.sellingPrice),2)+20
9990 kshitij.so 1576
        sdItem.serviceTax = round((mpItem.serviceTax/100)*(sdItem.commission+sdItem.courierCost),2)
1577
        sdItem.updatedOn = timestamp
1578
        sdItem.priceUpdatedBy = 'SYSTEM'
1579
        mpItem.currentSp = sdItem.sellingPrice
1580
        mpItem.currentTp = sdItem.transferPrice
1581
        mpItem.minimumPossibleTp = getNewLowestPossibleTp(mpItem,item.ourNlc,vatRate,item.proposedSellingPrice) 
1582
        mpItem.minimumPossibleSp = getNewLowestPossibleSp(mpItem,item.ourNlc,vatRate)
1583
        markStatusForMarketplaceItems(sdItem,mpItem)
1584
    session.commit()
1585
    for item in successfulAutoIncrease:
1586
        it = Item.query.filter_by(id=item.item_id).one()
1587
        mpItem = MarketplaceItems.get_by(itemId=item.item_id,source=OrderSource.SNAPDEAL)
1588
        sdItem = SnapdealItem.get_by(item_id=item.item_id)
1589
        warehouse = inventory_client.getWarehouse(sdItem.warehouseId)
1590
        vatRate = catalog_client.getVatPercentageForItem(item.item_id, warehouse.stateId, math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))
1591
        addHistory(sdItem)
1592
        sdItem.transferPrice = getNewOurTp(mpItem,item.ourSellingPrice+max(10,.01*item.ourSellingPrice))
1593
        sdItem.sellingPrice = math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice))
10293 kshitij.so 1594
        if ((mpItem.pgFee/100)*sdItem.sellingPrice)>=20:
1595
            sdItem.commission = round((mpItem.commission/100+mpItem.pgFee/100)*(sdItem.sellingPrice),2)
1596
        else:
1597
            sdItem.commission = round((mpItem.commission/100)*(sdItem.sellingPrice),2)+20
9990 kshitij.so 1598
        sdItem.serviceTax = round((mpItem.serviceTax/100)*(sdItem.commission+sdItem.courierCost),2)
1599
        sdItem.updatedOn = timestamp
1600
        sdItem.priceUpdatedBy = 'SYSTEM'
1601
        mpItem.currentSp = sdItem.sellingPrice
1602
        mpItem.currentTp = sdItem.transferPrice
1603
        mpItem.minimumPossibleTp = getNewLowestPossibleTp(mpItem,item.ourNlc,vatRate,sdItem.sellingPrice) 
1604
        mpItem.minimumPossibleSp = getNewLowestPossibleSp(mpItem,item.ourNlc,vatRate)
1605
        markStatusForMarketplaceItems(sdItem,mpItem)
1606
    session.commit()
1607
 
10280 kshitij.so 1608
def updatePricesOnSnapdeal(successfulAutoDecrease,successfulAutoIncrease):
10284 kshitij.so 1609
    if syncPrice=='false':
10280 kshitij.so 1610
        return
1611
    url = 'http://support.shop2020.in:8080/Support/reports'
1612
    br = getBrowserObject()
1613
    br.open(url)
1614
    br.open(url)
1615
    br.select_form(nr=0)
10286 kshitij.so 1616
    br.form['username'] = "manoj"
1617
    br.form['password'] = "man0j"
10280 kshitij.so 1618
    br.submit()
1619
    for item in successfulAutoDecrease:
1620
        sdItem = SnapdealItem.get_by(item_id=item.item_id)
1621
        sellingPrice =  str(math.ceil(item.proposedSellingPrice))
1622
        supc = sdItem.supc
10286 kshitij.so 1623
        updateUrl = 'http://support.shop2020.in:8080/Support/snapdeal-list!updateForAutoPricing?sellingPrice=%s&supc=%s&itemId=%s'%(sellingPrice,supc,str(item.item_id))
1624
        br.open(updateUrl)
10280 kshitij.so 1625
    for item in successfulAutoIncrease:
1626
        sdItem = SnapdealItem.get_by(item_id=item.item_id)
1627
        sellingPrice =  str(math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))
1628
        supc = sdItem.supc
1629
        updateUrl = 'http://support.shop2020.in:8080/Support/snapdeal-list!updateForAutoPricing?sellingPrice=%s&supc=%s&itemId=%s'%(sellingPrice,supc,str(item.item_id))
1630
        br.open(updateUrl)
1631
 
1632
 
1633
 
9990 kshitij.so 1634
def addHistory(item):
10097 kshitij.so 1635
    itemHistory = MarketPlaceUpdateHistory()
9990 kshitij.so 1636
    itemHistory.item_id = item.item_id
10097 kshitij.so 1637
    itemHistory.source = OrderSource.SNAPDEAL
9990 kshitij.so 1638
    itemHistory.exceptionPrice = item.exceptionPrice
1639
    itemHistory.warehouseId = item.warehouseId
10097 kshitij.so 1640
    itemHistory.isListedOnSource = item.isListedOnSnapdeal
9990 kshitij.so 1641
    itemHistory.transferPrice = item.transferPrice
1642
    itemHistory.sellingPrice = item.sellingPrice
1643
    itemHistory.courierCost = item.courierCost
1644
    itemHistory.commission = item.commission
1645
    itemHistory.serviceTax = item.serviceTax
1646
    itemHistory.suppressPriceFeed = item.suppressPriceFeed
1647
    itemHistory.suppressInventoryFeed = item.suppressInventoryFeed
1648
    itemHistory.updatedOn = item.updatedOn
1649
    itemHistory.maxNlc = item.maxNlc
10097 kshitij.so 1650
    itemHistory.skuAtSource = item.skuAtSnapdeal
1651
    itemHistory.marketPlaceSerialNumber = item.supc
9990 kshitij.so 1652
    itemHistory.priceUpdatedBy = item.priceUpdatedBy
1653
 
1654
def markStatusForMarketplaceItems(snapdealItem,marketplaceItem):
1655
    markUpdatedItem = MarketPlaceItemPrice.query.filter(MarketPlaceItemPrice.item_id==snapdealItem.item_id).filter(MarketPlaceItemPrice.source==marketplaceItem.source).first()
1656
    if markUpdatedItem is None:
1657
        marketPlaceItemPrice = MarketPlaceItemPrice()
1658
        marketPlaceItemPrice.item_id = snapdealItem.item_id
1659
        marketPlaceItemPrice.source = marketplaceItem.source
1660
        marketPlaceItemPrice.lastUpdatedOn = snapdealItem.updatedOn
1661
        marketPlaceItemPrice.sellingPrice = snapdealItem.sellingPrice 
1662
        marketPlaceItemPrice.suppressPriceFeed = snapdealItem.suppressPriceFeed
1663
        marketPlaceItemPrice.isListedOnSource = snapdealItem.isListedOnSnapdeal
1664
    else:
1665
        if (markUpdatedItem.sellingPrice!=snapdealItem.sellingPrice or markUpdatedItem.suppressPriceFeed!=snapdealItem.suppressPriceFeed or markUpdatedItem.isListedOnSource!=snapdealItem.isListedOnSnapdeal):
1666
            markUpdatedItem.lastUpdatedOn = snapdealItem.updatedOn
1667
        markUpdatedItem.sellingPrice = snapdealItem.sellingPrice
1668
        markUpdatedItem.suppressPriceFeed = snapdealItem.suppressPriceFeed
1669
        markUpdatedItem.isListedOnSource = snapdealItem.isListedOnSnapdeal
10031 kshitij.so 1670
 
1671
def processLostBuyBoxItems(previousProcessingTimestamp,currentTimestamp):
1672
    previous_buy_box = session.query(MarketPlaceHistory.item_id).filter(MarketPlaceHistory.timestamp==previousProcessingTimestamp).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.BUY_BOX).all()
1673
    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 1674
    if previous_buy_box is None:
1675
        print "No item in buy box for last run"
1676
        return
10032 kshitij.so 1677
    lost_buy_box = list(set(list(zip(*previous_buy_box)[0]))&set(list(zip(*cant_compete)[0])))
10031 kshitij.so 1678
    if len(lost_buy_box)==0:
1679
        return
1680
    xstr = lambda s: s or ""
1681
    message="""<html>
1682
            <body>
1683
            <h3>Lost Buy Box</h3>
1684
            <table border="1" style="width:100%;">
1685
            <thead>
1686
            <tr><th>Item Id</th>
1687
            <th>Product Name</th>
1688
            <th>Current Price</th>
1689
            <th>Current TP</th>
1690
            <th>Current Margin</th>
1691
            <th>Competition TP</th>
1692
            <th>Lowest Possible TP</th>
1693
            <th>NLC</th>
1694
            <th>Target NLC</th>
1695
            <th>Snapdeal Inventory</th>
1696
            <th>Total Inventory</th>
1697
            <th>Sales History</th>
1698
            </tr></thead>
1699
            <tbody>"""
1700
    items = session.query(MarketPlaceHistory).filter(MarketPlaceHistory.timestamp==currentTimestamp).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).filter(MarketPlaceHistory.item_id.in_(lost_buy_box)).all()
1701
    for item in items:
1702
        it = Item.query.filter_by(id=item.item_id).one()
1703
        netInventory=''
1704
        if not inventoryMap.has_key(item.item_id):
1705
            netInventory='Info Not Available'
1706
        else:
1707
            netInventory = str(getNetAvailability(inventoryMap.get(item.item_id)))
1708
        message+="""<tr>
1709
                <td style="text-align:center">"""+str(item.item_id)+"""</td>
1710
                <td style="text-align:center">"""+xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color)+"""</td>
1711
                <td style="text-align:center">"""+str(item.ourSellingPrice)+"""</td>
1712
                <td style="text-align:center">"""+str(item.ourTp)+"""</td>
1713
                <td style="text-align:center">"""+str(round(item.margin))+" ("+str(round((item.margin/item.ourSellingPrice)*100,1))+"%)"+"""</td>
1714
                <td style="text-align:center">"""+str(item.lowestTp)+"""</td>
1715
                <td style="text-align:center">"""+str(item.lowestPossibleTp)+"""</td>
1716
                <td style="text-align:center">"""+str(item.ourNlc)+"""</td>
1717
                <td style="text-align:center">"""+str(item.targetNlc)+"""</td>
1718
                <td style="text-align:center">"""+str(item.ourInventory)+"""</td>
1719
                <td style="text-align:center">"""+netInventory+"""</td>
1720
                <td style="text-align:center">"""+getOosString((itemSaleMap.get(item.item_id))[1])+"""</td>
1721
                </tr>"""
1722
    message+="""</tbody></table></body></html>"""
1723
    print message
1724
    mailServer = smtplib.SMTP("smtp.gmail.com", 587)
1725
    mailServer.ehlo()
1726
    mailServer.starttls()
1727
    mailServer.ehlo()
1728
 
10033 kshitij.so 1729
    #recipients = ['kshitij.sood@saholic.com']
1730
    recipients = ['rajneesh.arora@saholic.com','rajveer.singh@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 1731
    msg = MIMEMultipart()
1732
    msg['Subject'] = "Snapdeal Lost Buy Box" + ' - ' + str(datetime.now())
1733
    msg['From'] = ""
1734
    msg['To'] = ",".join(recipients)
1735
    msg.preamble = "Snapdeal Lost Buy Box" + ' - ' + str(datetime.now())
1736
    html_msg = MIMEText(message, 'html')
1737
    msg.attach(html_msg)
10207 kshitij.so 1738
    try:
1739
        mailServer.login("build@shop2020.in", "cafe@nes")
1740
        #mailServer.sendmail("cafe@nes", ['kshitij.sood@saholic.com'], msg.as_string())
1741
        mailServer.sendmail("cafe@nes", recipients, msg.as_string())
1742
    except Exception as e:
1743
        print e
10381 manish.sha 1744
        print "Unable to send lost buy box mail.Lets try local SMTP"
10219 kshitij.so 1745
        smtpServer = smtplib.SMTP('localhost')
1746
        smtpServer.set_debuglevel(1)
1747
        sender = 'support@shop2020.in'
1748
        try:
1749
            smtpServer.sendmail(sender, recipients, msg.as_string())
1750
            print "Successfully sent email"
1751
        except:
1752
            print "Error: unable to send email."
1753
 
10381 manish.sha 1754
def getSubsidyDiff(snapdealDetails):
1755
    ourSubsidy = snapdealDetails.ourSp - snapdealDetails.ourOfferPrice
1756
    if snapdealDetails.rank !=1:
1757
        competitionSubsidy = snapdealDetails.lowestSp - snapdealDetails.lowestOfferPrice
1758
    else:
10386 manish.sha 1759
        competitionSubsidy = snapdealDetails.secondLowestSellerSp - snapdealDetails.secondLowestSellerOfferPrice
10381 manish.sha 1760
    return competitionSubsidy - ourSubsidy    
9881 kshitij.so 1761
 
1762
def getOtherTp(snapdealDetails,val,spm):
10473 kshitij.so 1763
    if val.parent_category==10011 or val.parent_category==12001:
9881 kshitij.so 1764
        commissionPercentage = spm.competitorCommissionAccessory
1765
    else:
1766
        commissionPercentage = spm.competitorCommissionOther
1767
    if snapdealDetails.rank==1:
10289 kshitij.so 1768
        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 1769
        return round(otherTp,2)
10289 kshitij.so 1770
    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 1771
    return round(otherTp,2)
9881 kshitij.so 1772
 
1773
def getLowestPossibleTp(snapdealDetails,val,spm,mpItem):
1774
    if snapdealDetails.rank==0:
1775
        return mpItem.minimumPossibleTp
1776
    vat = (snapdealDetails.ourSp/(1+(val.vatRate/100))-(val.nlc/(1+(val.vatRate/100))))*(val.vatRate/100);
1777
    inHouseCost = 15+vat+(mpItem.returnProvision/100)*snapdealDetails.ourSp+mpItem.otherCost;
1778
    lowest_possible_tp = val.nlc+inHouseCost;
9954 kshitij.so 1779
    return round(lowest_possible_tp,2)
9881 kshitij.so 1780
 
1781
def getOurTp(snapdealDetails,val,spm,mpItem):
1782
    if snapdealDetails.rank==0:
1783
        return mpItem.currentTp
10289 kshitij.so 1784
    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 1785
    return round(ourTp,2)
9966 kshitij.so 1786
 
1787
def getNewLowestPossibleTp(mpItem,nlc,vatRate,proposedSellingPrice):
1788
    vat = (proposedSellingPrice/(1+(vatRate/100))-(nlc/(1+(vatRate/100))))*(vatRate/100);
1789
    inHouseCost = 15+vat+(mpItem.returnProvision/100)*proposedSellingPrice+mpItem.otherCost;
1790
    lowest_possible_tp = nlc+inHouseCost;
1791
    return round(lowest_possible_tp,2)
1792
 
1793
def getNewOurTp(mpItem,proposedSellingPrice):
10289 kshitij.so 1794
    ourTp = proposedSellingPrice- proposedSellingPrice*(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))-(mpItem.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100))-(max(20,(mpItem.pgFee/100)*proposedSellingPrice)*(1+(mpItem.serviceTax/100)));
9966 kshitij.so 1795
    return round(ourTp,2)
9990 kshitij.so 1796
 
1797
def getNewLowestPossibleSp(mpItem,nlc,vatRate):
10294 kshitij.so 1798
    if (mpItem.pgFee/100)*mpItem.currentSp>=20:
10289 kshitij.so 1799
        lowestPossibleSp = (nlc+(mpItem.courierCost+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));
1800
    else:
1801
        lowestPossibleSp = (nlc+(mpItem.courierCost+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 1802
    return round(lowestPossibleSp,2)    
9881 kshitij.so 1803
 
1804
def getLowestPossibleSp(snapdealDetails,val,spm,mpItem):
1805
    if snapdealDetails.rank==0:
1806
        return mpItem.minimumPossibleSp
10289 kshitij.so 1807
    #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));
1808
    if (mpItem.pgFee/100)*snapdealDetails.ourSp>=20:
1809
        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))
1810
    else:
1811
        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 1812
    return round(lowestPossibleSp,2)    
9881 kshitij.so 1813
 
1814
def getTargetTp(targetSp,mpItem):
10289 kshitij.so 1815
    targetTp = targetSp- targetSp*(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))-(mpItem.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100))-(max(20,(mpItem.pgFee/100)*targetSp)*(1+(mpItem.serviceTax/100)))
9954 kshitij.so 1816
    return round(targetTp,2)
9881 kshitij.so 1817
 
10289 kshitij.so 1818
def getTargetSp(targetTp,mpItem,ourSp):
10292 kshitij.so 1819
    if (ourSp*(mpItem.pgFee/100)) < 20:
10289 kshitij.so 1820
        targetSp = float(targetTp+(mpItem.courierCost+mpItem.closingFee+20)*(1+(mpItem.serviceTax/100)))/(1-((mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))))
1821
    else:
1822
        targetSp = float(targetTp+(mpItem.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100)))/(1-((mpItem.commission/100+mpItem.emiFee/100+mpItem.pgFee/100)*(1+(mpItem.serviceTax/100))))
9954 kshitij.so 1823
    return round(targetSp,2)
9881 kshitij.so 1824
 
1825
def getSalesPotential(lowestOfferPrice,ourNlc):
1826
    if lowestOfferPrice - ourNlc < 0:
1827
        return 'HIGH'
9897 kshitij.so 1828
    elif (float(lowestOfferPrice - ourNlc))/lowestOfferPrice >=0 and (float(lowestOfferPrice - ourNlc))/lowestOfferPrice <=.02:
9881 kshitij.so 1829
        return 'MEDIUM'
1830
    else:
1831
        return 'LOW'  
1832
 
1833
def main():
9949 kshitij.so 1834
    parser = optparse.OptionParser()
1835
    parser.add_option("-t", "--type", dest="runType",
1836
                   default="FULL", type="string",
1837
                   help="Run type FULL or FAVOURITE")
1838
    (options, args) = parser.parse_args()
1839
    if options.runType not in ('FULL','FAVOURITE'):
1840
        print "Run type argument illegal."
1841
        sys.exit(1)
10289 kshitij.so 1842
    timestamp = datetime.now()
1843
    itemInfo= populateStuff(options.runType,timestamp)
9881 kshitij.so 1844
    cantCompete, buyBoxItems, competitive, \
10289 kshitij.so 1845
    competitiveNoInventory, exceptionList, negativeMargin = decideCategory(itemInfo)
10759 kshitij.so 1846
    previousProcessingTimestamp = session.query(func.max(MarketPlaceHistory.timestamp)).filter(MarketPlaceHistory.source==OrderSource.SNAPDEAL).one()
9949 kshitij.so 1847
    exceptionItems = commitExceptionList(exceptionList,timestamp)
1848
    cantComepeteItems = commitCantCompete(cantCompete,timestamp)
1849
    buyBoxList = commitBuyBox(buyBoxItems,timestamp)
1850
    competitiveItems = commitCompetitive(competitive,timestamp)
1851
    competitiveNoInventoryItems = commitCompetitiveNoInventory(competitiveNoInventory,timestamp)
1852
    negativeMarginItems = commitNegativeMargin(negativeMargin,timestamp)
9954 kshitij.so 1853
    successfulAutoDecrease = fetchItemsForAutoDecrease(timestamp)
1854
    successfulAutoIncrease = fetchItemsForAutoIncrease(timestamp)
9949 kshitij.so 1855
    if options.runType=='FULL':
1856
        previousAutoFav, nowAutoFav = markAutoFavourite()
9954 kshitij.so 1857
    if options.runType=='FULL':
1858
        writeReport(cantCompete, buyBoxItems, competitive, competitiveNoInventory, exceptionList, negativeMargin, previousAutoFav, nowAutoFav,timestamp, options.runType)
1859
    else:
1860
        writeReport(cantCompete, buyBoxItems, competitive, competitiveNoInventory, exceptionList, negativeMargin, None, None, timestamp, options.runType)
10293 kshitij.so 1861
    commitPricing(successfulAutoDecrease,successfulAutoIncrease,timestamp)
9954 kshitij.so 1862
    sendAutoPricingMail(successfulAutoDecrease,successfulAutoIncrease)
10031 kshitij.so 1863
    processLostBuyBoxItems(previousProcessingTimestamp[0],timestamp)
10293 kshitij.so 1864
    updatePricesOnSnapdeal(successfulAutoDecrease,successfulAutoIncrease)
9897 kshitij.so 1865
 
9881 kshitij.so 1866
if __name__ == '__main__':
10759 kshitij.so 1867
    main()