Subversion Repositories SmartDukaan

Rev

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