Subversion Repositories SmartDukaan

Rev

Rev 13335 | Rev 13337 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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