Subversion Repositories SmartDukaan

Rev

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