Subversion Repositories SmartDukaan

Rev

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