Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
11193 kshitij.so 1
from elixir import *
2
from sqlalchemy.sql import or_ ,func, asc
3
from shop2020.config.client.ConfigClient import ConfigClient
4
from shop2020.model.v1.catalog.impl import DataService
5
from shop2020.model.v1.catalog.script import FlipkartScraper
6
from shop2020.model.v1.catalog.impl.DataService import FlipkartItem, MarketplaceItems, Item, \
7
Category, SourcePercentageMaster, MarketPlaceHistory, MarketPlaceUpdateHistory, MarketPlaceItemPrice, \
12133 kshitij.so 8
SourceCategoryPercentage, SourceItemPercentage, SourceReturnPercentage
11193 kshitij.so 9
from shop2020.thriftpy.model.v1.order.ttypes import OrderSource
10
from shop2020.thriftpy.model.v1.catalog.ttypes import CompetitionCategory, CompetitionBasis, SalesPotential,\
11
Decision, RunType
12
from shop2020.clients.CatalogClient import CatalogClient
13
from shop2020.clients.InventoryClient import InventoryClient
14
import urllib2
15
import requests
16
import time
17
from datetime import date, datetime, timedelta
18
from shop2020.utils import EmailAttachmentSender
19
from shop2020.utils.EmailAttachmentSender import get_attachment_part
20
import math
21
from operator import itemgetter
11560 kshitij.so 22
from functools import partial
11193 kshitij.so 23
import simplejson as json
24
import xlwt
25
import optparse
26
import sys
27
import smtplib
11560 kshitij.so 28
import threading
29
from multiprocessing import Process 
11193 kshitij.so 30
from email.mime.text import MIMEText
31
import email
32
from email.mime.multipart import MIMEMultipart
33
import email.encoders
34
import cookielib
11561 kshitij.so 35
from multiprocessing import Pool
36
from multiprocessing.dummy import Pool as ThreadPool 
11193 kshitij.so 37
 
38
config_client = ConfigClient()
39
host = config_client.get_property('staging_hostname')
40
syncPrice=config_client.get_property('sync_price_on_marketplace')
41
 
42
 
43
DataService.initialize(db_hostname=host)
44
 
45
inventoryMap = {}
46
itemSaleMap = {}
11562 kshitij.so 47
scraper = FlipkartScraper.FlipkartScraper()
11615 kshitij.so 48
categoryMap = {}
11193 kshitij.so 49
 
50
class __FlipkartDetails:
51
 
52
    def __init__(self,rank ,ourSp , secondLowestSellerSp, prefSellerSp, lowestSellerSp, lowestSellerScore, prefSellerScore, secondLowestSellerScore, ourScore, shippingTimeLowerLimitLowestSeller,shippingTimeUpperLimitLowestSeller, \
53
    shippingTimeLowerLimitPrefSeller, shippingTimeUpperLimitPrefSeller, shippingTimeLowerLimitOur, shippingTimeUpperLimitOur, shippingTimeLowerLimitSecondLowestSeller, shippingTimeUpperLimitSecondLowestSeller, totalAvailableSeller, lowestSellerName, lowestSellerCode, secondLowestSellerName, secondLowestSellerCode, prefSellerName, prefSellerCode, lowestSellerBuyTrend, \
54
    ourBuyTrend, prefSellerBuyTrend, secondLowestSellerBuyTrend, ourCode ):
55
 
56
        self.rank = rank
57
        self.ourSp = ourSp
58
        self.secondLowestSellerSp = secondLowestSellerSp
59
        self.prefSellerSp = prefSellerSp
60
        self.lowestSellerSp = lowestSellerSp
61
        self.lowestSellerScore = lowestSellerScore
62
        self.prefSellerScore = prefSellerScore
63
        self.secondLowestSellerScore = secondLowestSellerScore
64
        self.ourScore = ourScore
65
        self.shippingTimeLowerLimitLowestSeller = shippingTimeLowerLimitLowestSeller
66
        self.shippingTimeUpperLimitLowestSeller = shippingTimeUpperLimitLowestSeller
67
        self.shippingTimeLowerLimitPrefSeller = shippingTimeLowerLimitPrefSeller
68
        self.shippingTimeUpperLimitPrefSeller = shippingTimeUpperLimitPrefSeller
69
        self.shippingTimeLowerLimitOur = shippingTimeLowerLimitOur
70
        self.shippingTimeUpperLimitOur = shippingTimeUpperLimitOur
71
        self.shippingTimeLowerLimitSecondLowestSeller = shippingTimeLowerLimitSecondLowestSeller
72
        self.shippingTimeUpperLimitSecondLowestSeller = shippingTimeUpperLimitSecondLowestSeller
73
        self.totalAvailableSeller = totalAvailableSeller
74
        self.lowestSellerName = lowestSellerName
75
        self.lowestSellerCode = lowestSellerCode
76
        self.secondLowestSellerName = secondLowestSellerName
77
        self.secondLowestSellerCode = secondLowestSellerCode
78
        self.prefSellerName = prefSellerName
79
        self.prefSellerCode = prefSellerCode
80
        self.lowestSellerBuyTrend = lowestSellerBuyTrend
81
        self.ourBuyTrend = ourBuyTrend
82
        self.prefSellerBuyTrend = prefSellerBuyTrend
83
        self.secondLowestSellerBuyTrend = secondLowestSellerBuyTrend
84
        self.ourCode = ourCode
85
 
86
class __FlipkartItemInfo:
87
 
11581 kshitij.so 88
    def __init__(self, fkSerialNumber, nlc, courierCost, item_id, product_group, brand, model_name, model_number, color, weight, parent_category, risky, warehouseId, vatRate, runType, parent_category_name, sourcePercentage, ourFlipkartInventory, skuAtFlipkart, flipkartDetails, stateId):
11193 kshitij.so 89
 
90
        self.fkSerialNumber = fkSerialNumber
91
        self.nlc = nlc
92
        self.courierCost = courierCost
93
        self.item_id = item_id
94
        self.product_group = product_group
95
        self.brand = brand
96
        self.model_name = model_name
97
        self.model_number = model_number
98
        self.color = color
99
        self.weight = weight
100
        self.parent_category = parent_category
101
        self.risky = risky
102
        self.warehouseId = warehouseId
103
        self.vatRate = vatRate
104
        self.runType = runType
105
        self.parent_category_name = parent_category_name
106
        self.sourcePercentage = sourcePercentage
11560 kshitij.so 107
        self.ourFlipkartInventory = ourFlipkartInventory
11571 kshitij.so 108
        self.skuAtFlipkart = skuAtFlipkart
11581 kshitij.so 109
        self.flipkartDetails = flipkartDetails
110
        self.stateId = stateId  
11193 kshitij.so 111
 
112
class __FlipkartPricing:
113
 
114
    def __init__(self, ourSp, ourTp, lowestTp, lowestPossibleTp, secondLowestSellerTp, lowestPossibleSp, prefSellerTp):
115
        self.ourTp = ourTp
116
        self.lowestTp = lowestTp
117
        self.lowestPossibleTp = lowestPossibleTp
118
        self.ourSp = ourSp
119
        self.secondLowestSellerTp = secondLowestSellerTp
120
        self.lowestPossibleSp = lowestPossibleSp
121
        self.prefSellerTp = prefSellerTp
122
 
123
def markReasonForMpItem(mpHistory,reason,decision):
124
    mpHistory.decision = decision
125
    mpHistory.reason = reason
126
 
127
def fetchItemsForAutoDecrease(time):
128
    successfulAutoDecrease = []
129
    autoDecrementItems = session.query(MarketPlaceHistory).join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
11615 kshitij.so 130
    .filter(MarketPlaceHistory.timestamp==time).filter(MarketPlaceHistory.source==OrderSource.FLIPKART).filter(or_(MarketPlaceHistory.competitiveCategory==CompetitionCategory.COMPETITIVE,MarketPlaceHistory.competitiveCategory==CompetitionCategory.PREF_BUT_NOT_CHEAP ))\
11193 kshitij.so 131
    .filter(MarketplaceItems.source==OrderSource.FLIPKART).filter(MarketplaceItems.autoDecrement==True).all()
132
    inventory_client = InventoryClient().get_client()
133
    global inventoryMap
134
    inventoryMap = inventory_client.getInventorySnapshot(0)
135
    for autoDecrementItem in autoDecrementItems:
11825 kshitij.so 136
#        if not autoDecrementItem.risky:
137
#            markReasonForMpItem(autoDecrementItem,'Item is not risky',Decision.AUTO_DECREMENT_FAILED)
138
#            continue
11193 kshitij.so 139
        if math.ceil(autoDecrementItem.proposedSellingPrice) >= autoDecrementItem.ourSellingPrice:
140
            markReasonForMpItem(autoDecrementItem,'Proposed SP greater than or equal to current SP',Decision.AUTO_DECREMENT_FAILED)
141
            continue
142
        if autoDecrementItem.proposedSellingPrice < autoDecrementItem.lowestPossibleSp:
143
            markReasonForMpItem(autoDecrementItem,'Proposed SP less than lowest possible SP',Decision.AUTO_DECREMENT_FAILED)
144
            continue
145
        totalAvailability, totalReserved = 0,0
146
        if (not inventoryMap.has_key(autoDecrementItem.item_id)):
147
            markReasonForMpItem(autoDecrementItem,'Inventory info not available',Decision.AUTO_DECREMENT_FAILED)
148
            continue
149
        itemInventory=inventoryMap[autoDecrementItem.item_id]
150
        availableMap  = itemInventory.availability
151
        reserveMap = itemInventory.reserved
152
        for warehouse,availability in availableMap.iteritems():
153
            if warehouse==16:
154
                continue
155
            totalAvailability = totalAvailability+availability
156
        for warehouse,reserve in reserveMap.iteritems():
157
            if warehouse==16:
158
                continue
159
            totalReserved = totalReserved+reserve
160
        if (totalAvailability-totalReserved)<=0:
161
            markReasonForMpItem(autoDecrementItem,'Net availability is 0',Decision.AUTO_DECREMENT_FAILED)
162
            continue
163
        avgSalePerDay = (itemSaleMap.get(autoDecrementItem.item_id))[2]
164
        try:
165
            daysOfStock = (float(totalAvailability-totalReserved))/avgSalePerDay
166
        except ZeroDivisionError,e:
167
            daysOfStock = float("inf")
11825 kshitij.so 168
        if daysOfStock<2 and autoDecrementItem.risky:
11193 kshitij.so 169
            markReasonForMpItem(autoDecrementItem,'Our stock is not enough',Decision.AUTO_DECREMENT_FAILED)
170
            continue
11615 kshitij.so 171
 
172
        if autoDecrementItem.competitiveCategory == CompetitionCategory.PREF_BUT_NOT_CHEAP:
173
            avgSaleLastTwoDay = (itemSaleMap.get(autoDecrementItem.item_id))[6]
174
            if avgSaleLastTwoDay >= 3:
175
                markReasonForMpItem(autoDecrementItem,'Last two day avg sale is greater than 2',Decision.AUTO_DECREMENT_FAILED)
176
                continue
11193 kshitij.so 177
 
178
        autoDecrementItem.ourEnoughStock = True
179
        autoDecrementItem.decision = Decision.AUTO_DECREMENT_SUCCESS
180
        autoDecrementItem.reason = 'All conditions for auto decrement true'
181
        successfulAutoDecrease.append(autoDecrementItem)
182
    session.commit()
183
    return successfulAutoDecrease
184
 
185
def fetchItemsForAutoIncrease(time):
186
    successfulAutoIncrease = []
187
    autoIncrementItems = session.query(MarketPlaceHistory).join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
188
    .filter(MarketPlaceHistory.timestamp==time).filter(MarketPlaceHistory.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.BUY_BOX)\
189
    .filter(MarketplaceItems.source==OrderSource.FLIPKART).filter(MarketplaceItems.autoIncrement==True).all()
190
    for autoIncrementItem in autoIncrementItems:
191
        if not autoIncrementItem.competitiveCategory == CompetitionCategory.BUY_BOX:
192
            markReasonForMpItem(autoIncrementItem,'Category is '+CompetitionCategory._VALUES_TO_NAMES.get(autoIncrementItem.competitiveCategory),Decision.AUTO_INCREMENT_FAILED)
193
            continue
194
        if autoIncrementItem.totalSeller==1 and autoIncrementItem.ourRank==1:
195
            markReasonForMpItem(autoIncrementItem,'We are the only seller',Decision.AUTO_INCREMENT_FAILED)
196
            continue
197
        if autoIncrementItem.proposedSellingPrice <= autoIncrementItem.ourSellingPrice:
198
            markReasonForMpItem(autoIncrementItem,'Proposed SP less than current SP',Decision.AUTO_INCREMENT_FAILED)
199
            continue
200
        if autoIncrementItem.proposedSellingPrice >=10000 and autoIncrementItem.ourSellingPrice<10000:
201
            markReasonForMpItem(autoIncrementItem,'Proposed SP is greater than 10,000 and current sp is less than 10,000',Decision.AUTO_INCREMENT_FAILED)
202
            continue
203
        if getLastDaySale(autoIncrementItem.item_id)<=2:
204
            markReasonForMpItem(autoIncrementItem,'Last day sale is less than 3',Decision.AUTO_INCREMENT_FAILED)
205
            continue
206
        antecedentPrice = session.query(MarketPlaceHistory.ourSellingPrice).filter(MarketPlaceHistory.item_id==autoIncrementItem.item_id).filter(MarketPlaceHistory.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.timestamp>time-timedelta(days=1)).order_by(asc(MarketPlaceHistory.timestamp)).first()
207
        if antecedentPrice is not None:
208
            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:
209
                markReasonForMpItem(autoIncrementItem,'Maximum price increase in last 24 hours should be 2%',Decision.AUTO_INCREMENT_FAILED)
210
                continue
211
        mpItem = MarketplaceItems.get_by(itemId=autoIncrementItem.item_id,source=OrderSource.FLIPKART)
212
        if mpItem.maximumSellingPrice is not None and mpItem.maximumSellingPrice > 0:
213
            if autoIncrementItem.ourSellingPrice+max(10,.01*autoIncrementItem.ourSellingPrice) > mpItem.maximumSellingPrice:
214
                markReasonForMpItem(autoIncrementItem,'Price cannot exceed Maximum Selling Price',Decision.AUTO_INCREMENT_FAILED)
215
                continue
216
        #oosStatus = inventory_client.getOosStatusesForXDaysForItem(autoIncrementItem.item_id,0,3)
217
        #count,sale,daysOfStock = 0,0,0
218
        #for obj in oosStatus:
219
        #    if not obj.is_oos:
220
        #        count+=1
221
        #        sale = sale+obj.num_orders
222
        #avgSalePerDay=0 if count==0 else (float(sale)/count)
223
        totalAvailability, totalReserved = 0,0
224
        if (not inventoryMap.has_key(autoIncrementItem.item_id)):
225
            markReasonForMpItem(autoIncrementItem,'Inventory info not available',Decision.AUTO_INCREMENT_FAILED)
226
            continue
227
        itemInventory=inventoryMap[autoIncrementItem.item_id]
228
        availableMap  = itemInventory.availability
229
        reserveMap = itemInventory.reserved
230
        for warehouse,availability in availableMap.iteritems():
231
            if warehouse==16:
232
                continue
233
            totalAvailability = totalAvailability+availability
234
        for warehouse,reserve in reserveMap.iteritems():
235
            if warehouse==16:
236
                continue
237
            totalReserved = totalReserved+reserve
238
        #if (totalAvailability-totalReserved)<=0:
239
        #    markReasonForMpItem(autoIncrementItem,'Our stock is 0',Decision.AUTO_INCREMENT_FAILED)
240
        #    continue
241
        avgSalePerDay = (itemSaleMap.get(autoIncrementItem.item_id))[2]
242
        if (avgSalePerDay==0):
243
            markReasonForMpItem(autoIncrementItem,'Average sale per day is zero',Decision.AUTO_INCREMENT_FAILED)
244
            continue
245
        daysOfStock = (float(totalAvailability-totalReserved))/avgSalePerDay
246
        if daysOfStock>5:
247
            markReasonForMpItem(autoIncrementItem,'Our stock is enough',Decision.AUTO_INCREMENT_FAILED)
248
            continue
249
 
250
        autoIncrementItem.ourEnoughStock = False
251
        autoIncrementItem.decision = Decision.AUTO_INCREMENT_SUCCESS
252
        autoIncrementItem.reason = 'All conditions for auto increment true'
253
        successfulAutoIncrease.append(autoIncrementItem)
254
    session.commit()
255
    return successfulAutoIncrease        
256
 
257
 
258
def commitExceptionList(exceptionList,timestamp):
259
    exceptionItems=[]
260
    for item in exceptionList:
261
        mpHistory = MarketPlaceHistory()
262
        mpHistory.item_id =item.item_id
263
        mpHistory.source = OrderSource.FLIPKART 
264
        mpHistory.competitiveCategory = CompetitionCategory.EXCEPTION
265
        mpHistory.risky = item.risky
266
        mpHistory.timestamp = timestamp
267
        mpHistory.run = RunType._NAMES_TO_VALUES.get(item.runType)
268
        exceptionItems.append(mpHistory)
269
    session.commit()
270
    return exceptionItems
271
 
272
def commitCantCompete(cantCompete,timestamp):
273
    for item in cantCompete:
274
        flipkartDetails = item[0]
275
        flipkartItemInfo = item[1]
276
        flipkartPricing = item[2]
277
        mpItem = item[3]
278
        mpHistory = MarketPlaceHistory()
279
        mpHistory.item_id = flipkartItemInfo.item_id
280
        mpHistory.source = OrderSource.FLIPKART
281
        mpHistory.lowestTp = flipkartPricing.lowestTp
282
        mpHistory.lowestPossibleTp = flipkartPricing.lowestPossibleTp
283
        mpHistory.lowestPossibleSp = flipkartPricing.lowestPossibleSp
284
        mpHistory.ourInventory = flipkartItemInfo.ourFlipkartInventory
285
        mpHistory.ourRank = flipkartDetails.rank
286
        mpHistory.competitiveCategory = CompetitionCategory.CANT_COMPETE
287
        mpHistory.risky = flipkartItemInfo.risky
288
        mpHistory.lowestSellingPrice = flipkartDetails.lowestSellerSp
289
        mpHistory.lowestSellerName = flipkartDetails.lowestSellerName
290
        mpHistory.lowestSellerCode = flipkartDetails.lowestSellerCode
291
        mpHistory.lowestSellerRating = flipkartDetails.lowestSellerScore
292
        mpHistory.lowestSellerShippingTime = ''
293
        mpHistory.lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
294
        else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
295
        mpHistory.ourSellingPrice = flipkartPricing.ourSp
296
        mpHistory.ourTp = flipkartPricing.ourTp
297
        mpHistory.ourNlc = flipkartItemInfo.nlc
298
        mpHistory.ourRating = flipkartDetails.ourScore
299
        mpHistory.ourShippingTime = ''
300
        mpHistory.ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
301
        else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
302
        mpHistory.prefferedSellerName = flipkartDetails.prefSellerName
303
        mpHistory.prefferedSellerCode = flipkartDetails.prefSellerCode
304
        mpHistory.prefferedSellerRating = flipkartDetails.prefSellerScore
305
        mpHistory.prefferedSellerSellingPrice = flipkartDetails.prefSellerSp
306
        mpHistory.prefferedSellerTp = flipkartPricing.prefSellerTp
307
        mpHistory.prefferedSellerShippingTime = ''
308
        mpHistory.prefferedSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitPrefSeller) if flipkartDetails.shippingTimeUpperLimitPrefSeller==0\
309
        else str(flipkartDetails.shippingTimeLowerLimitPrefSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitPrefSeller)
310
        proposed_sp = flipkartDetails.lowestSellerSp - max(10, flipkartDetails.lowestSellerSp*0.001)
311
        proposed_tp = getTargetTp(proposed_sp,mpItem)
312
        target_nlc = proposed_tp - flipkartPricing.lowestPossibleTp + flipkartItemInfo.nlc
313
        mpHistory.proposedSellingPrice = round(proposed_sp,2)
314
        mpHistory.proposedTp = round(proposed_tp,2)
315
        mpHistory.targetNlc = round(target_nlc,2)
316
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
317
        mpHistory.totalSeller = flipkartDetails.totalAvailableSeller
318
        mpHistory.avgSales = (itemSaleMap.get(flipkartItemInfo.item_id))[3]
319
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(flipkartDetails.lowestSellerSp,flipkartItemInfo.nlc))
320
        mpHistory.timestamp = timestamp
321
        mpHistory.run = RunType._NAMES_TO_VALUES.get(flipkartItemInfo.runType)
322
    session.commit()
323
 
324
def commitBuyBox(buyBoxItems,timestamp):
325
    for item in buyBoxItems:
326
        flipkartDetails = item[0]
327
        flipkartItemInfo = item[1]
328
        flipkartPricing = item[2]
329
        mpItem = item[3]
330
        mpHistory = MarketPlaceHistory()
331
        mpHistory.item_id = flipkartItemInfo.item_id
332
        mpHistory.source = OrderSource.FLIPKART
333
        mpHistory.lowestPossibleTp = flipkartPricing.lowestPossibleTp
334
        mpHistory.lowestPossibleSp = flipkartPricing.lowestPossibleSp
335
        mpHistory.ourInventory = flipkartItemInfo.ourFlipkartInventory
336
        mpHistory.ourRank = flipkartDetails.rank
337
        mpHistory.ourSellingPrice = flipkartPricing.ourSp
338
        mpHistory.ourTp = flipkartPricing.ourTp
339
        mpHistory.ourNlc = flipkartItemInfo.nlc
340
        mpHistory.ourRating = flipkartDetails.ourScore
341
        mpHistory.ourShippingTime = ''
342
        mpHistory.ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
343
        else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
344
        mpHistory.competitiveCategory = CompetitionCategory.BUY_BOX
345
        mpHistory.risky = flipkartItemInfo.risky
346
        mpHistory.lowestSellingPrice = flipkartDetails.lowestSellerSp
347
        mpHistory.lowestTp = flipkartPricing.lowestTp
348
        mpHistory.lowestSellerName = flipkartDetails.lowestSellerName
349
        mpHistory.lowestSellerCode = flipkartDetails.lowestSellerCode
350
        mpHistory.lowestSellerRating = flipkartDetails.lowestSellerScore
351
        mpHistory.lowestSellerShippingTime = ''
352
        mpHistory.lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
353
        else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
354
        proposed_sp = max(flipkartDetails.secondLowestSellerSp - max((20, flipkartDetails.secondLowestSellerSp*0.002)), flipkartPricing.lowestPossibleSp)
355
        proposed_tp = getTargetTp(proposed_sp,mpItem)
356
        #target_nlc = proposed_tp - flipkartPricing.lowestPossibleTp + flipkartItemInfo.nlc
357
        mpHistory.proposedSellingPrice = round(proposed_sp,2)
358
        mpHistory.proposedTp = round(proposed_tp,2)
359
        #mpHistory.targetNlc = target_nlc
360
        mpHistory.secondLowestSellerName = flipkartDetails.secondLowestSellerName
361
        mpHistory.secondLowestSellerCode = flipkartDetails.secondLowestSellerCode
362
        mpHistory.secondLowestSellingPrice = flipkartDetails.secondLowestSellerSp
363
        mpHistory.secondLowestTp = flipkartPricing.secondLowestSellerTp
364
        mpHistory.secondLowestSellerRating = flipkartDetails.secondLowestSellerScore
365
        mpHistory.secondLowestSellerShippingTime = ''
366
        mpHistory.secondLowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitSecondLowestSeller) if flipkartDetails.shippingTimeUpperLimitSecondLowestSeller==0\
367
        else str(flipkartDetails.shippingTimeLowerLimitSecondLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitSecondLowestSeller)
368
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
369
        mpHistory.marginIncreasedPotential = proposed_tp - flipkartPricing.ourTp
370
        mpHistory.totalSeller = flipkartDetails.totalAvailableSeller
371
        mpHistory.avgSales = (itemSaleMap.get(flipkartItemInfo.item_id))[3]
372
        mpHistory.run = RunType._NAMES_TO_VALUES.get(flipkartItemInfo.runType)
373
        mpHistory.timestamp = timestamp
374
    session.commit()
375
 
376
def commitCompetitiveNoInventory(competitiveNoInventory,timestamp):
377
    for item in competitiveNoInventory:
378
        flipkartDetails = item[0]
379
        flipkartItemInfo = item[1]
380
        flipkartPricing = item[2]
381
        mpItem = item[3]
382
        mpHistory = MarketPlaceHistory()
383
        mpHistory.item_id = flipkartItemInfo.item_id
384
        mpHistory.source = OrderSource.FLIPKART
385
        mpHistory.lowestTp = flipkartPricing.lowestTp
386
        mpHistory.lowestPossibleTp = flipkartPricing.lowestPossibleTp
387
        mpHistory.lowestPossibleSp = flipkartPricing.lowestPossibleSp
388
        mpHistory.ourInventory = flipkartItemInfo.ourFlipkartInventory
389
        mpHistory.ourRank = flipkartDetails.rank
390
        mpHistory.competitiveCategory = CompetitionCategory.COMPETITIVE_NO_INVENTORY
391
        mpHistory.risky = flipkartItemInfo.risky
392
        mpHistory.lowestSellingPrice = flipkartDetails.lowestSellerSp
393
        mpHistory.lowestSellerName = flipkartDetails.lowestSellerName
394
        mpHistory.lowestSellerCode = flipkartDetails.lowestSellerCode
395
        mpHistory.lowestSellerRating = flipkartDetails.lowestSellerScore
396
        mpHistory.lowestSellerShippingTime = ''
397
        mpHistory.lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
398
        else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
399
        mpHistory.ourSellingPrice = flipkartPricing.ourSp
400
        mpHistory.ourTp = flipkartPricing.ourTp
401
        mpHistory.ourNlc = flipkartItemInfo.nlc
402
        mpHistory.ourRating = flipkartDetails.ourScore
403
        mpHistory.ourShippingTime = ''
404
        mpHistory.ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
405
        else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
406
        mpHistory.prefferedSellerName = flipkartDetails.prefSellerName
407
        mpHistory.prefferedSellerCode = flipkartDetails.prefSellerCode
408
        mpHistory.prefferedSellerRating = flipkartDetails.prefSellerScore
409
        mpHistory.prefferedSellerSellingPrice = flipkartDetails.prefSellerSp
410
        mpHistory.prefferedSellerTp = flipkartPricing.prefSellerTp
411
        mpHistory.prefferedSellerShippingTime = ''
412
        mpHistory.prefferedSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitPrefSeller) if flipkartDetails.shippingTimeUpperLimitPrefSeller==0\
413
        else str(flipkartDetails.shippingTimeLowerLimitPrefSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitPrefSeller)
414
        proposed_sp = max(flipkartDetails.lowestSellerSp - max((10, flipkartDetails.lowestSellerSp*0.001)), flipkartPricing.lowestPossibleSp)
415
        proposed_tp = getTargetTp(proposed_sp,mpItem)
416
        mpHistory.proposedSellingPrice = round(proposed_sp,2)
417
        mpHistory.proposedTp = round(proposed_tp,2)
418
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
419
        mpHistory.totalSeller = flipkartDetails.totalAvailableSeller
420
        mpHistory.avgSales = (itemSaleMap.get(flipkartItemInfo.item_id))[3]
421
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(flipkartDetails.lowestSellerSp,flipkartItemInfo.nlc))
422
        mpHistory.timestamp = timestamp
423
        mpHistory.run = RunType._NAMES_TO_VALUES.get(flipkartItemInfo.runType)
424
    session.commit()
425
 
426
def commitCompetitive(competitive,timestamp):
427
    for item in competitive:
428
        flipkartDetails = item[0]
429
        flipkartItemInfo = item[1]
430
        flipkartPricing = item[2]
431
        mpItem = item[3]
432
        mpHistory = MarketPlaceHistory()
433
        mpHistory.item_id = flipkartItemInfo.item_id
434
        mpHistory.source = OrderSource.FLIPKART
435
        mpHistory.lowestTp = flipkartPricing.lowestTp
436
        mpHistory.lowestPossibleTp = flipkartPricing.lowestPossibleTp
437
        mpHistory.lowestPossibleSp = flipkartPricing.lowestPossibleSp
438
        mpHistory.ourInventory = flipkartItemInfo.ourFlipkartInventory
439
        mpHistory.ourRank = flipkartDetails.rank
440
        mpHistory.competitiveCategory = CompetitionCategory.COMPETITIVE
441
        mpHistory.risky = flipkartItemInfo.risky
442
        mpHistory.lowestSellingPrice = flipkartDetails.lowestSellerSp
443
        mpHistory.lowestSellerName = flipkartDetails.lowestSellerName
444
        mpHistory.lowestSellerCode = flipkartDetails.lowestSellerCode
445
        mpHistory.lowestSellerRating = flipkartDetails.lowestSellerScore
446
        mpHistory.lowestSellerShippingTime = ''
447
        mpHistory.lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
448
        else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
449
        mpHistory.ourSellingPrice = flipkartPricing.ourSp
450
        mpHistory.ourTp = flipkartPricing.ourTp
451
        mpHistory.ourNlc = flipkartItemInfo.nlc
452
        mpHistory.ourRating = flipkartDetails.ourScore
453
        mpHistory.ourShippingTime = ''
454
        mpHistory.ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
455
        else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
456
        mpHistory.prefferedSellerName = flipkartDetails.prefSellerName
457
        mpHistory.prefferedSellerCode = flipkartDetails.prefSellerCode
458
        mpHistory.prefferedSellerRating = flipkartDetails.prefSellerScore
459
        mpHistory.prefferedSellerSellingPrice = flipkartDetails.prefSellerSp
460
        mpHistory.prefferedSellerTp = flipkartPricing.prefSellerTp
461
        mpHistory.prefferedSellerShippingTime = ''
462
        mpHistory.prefferedSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitPrefSeller) if flipkartDetails.shippingTimeUpperLimitPrefSeller==0\
463
        else str(flipkartDetails.shippingTimeLowerLimitPrefSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitPrefSeller)
464
        proposed_sp = max(flipkartDetails.lowestSellerSp - max((10, flipkartDetails.lowestSellerSp*0.001)), flipkartPricing.lowestPossibleSp)
465
        proposed_tp = getTargetTp(proposed_sp,mpItem)
466
        mpHistory.proposedSellingPrice = round(proposed_sp,2)
467
        mpHistory.proposedTp = round(proposed_tp,2)
468
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
469
        mpHistory.totalSeller = flipkartDetails.totalAvailableSeller
470
        mpHistory.avgSales = (itemSaleMap.get(flipkartItemInfo.item_id))[3]
471
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(flipkartDetails.lowestSellerSp,flipkartItemInfo.nlc))
472
        mpHistory.timestamp = timestamp
473
        mpHistory.run = RunType._NAMES_TO_VALUES.get(flipkartItemInfo.runType)
474
    session.commit()
475
 
476
def commitNegativeMargin(negativeMargin,timestamp):
477
    for item in negativeMargin:
478
        flipkartDetails = item[0]
479
        flipkartItemInfo = item[1]
480
        flipkartPricing = item[2]
481
        mpHistory = MarketPlaceHistory()
482
        mpHistory.item_id = flipkartItemInfo.item_id
483
        mpHistory.source = OrderSource.FLIPKART
484
        mpHistory.lowestTp = flipkartPricing.lowestTp
485
        mpHistory.lowestPossibleTp = flipkartPricing.lowestPossibleTp
486
        mpHistory.lowestPossibleSp = flipkartPricing.lowestPossibleSp
487
        mpHistory.ourInventory = flipkartItemInfo.ourFlipkartInventory
488
        mpHistory.ourRank = flipkartDetails.rank
489
        mpHistory.competitiveCategory = CompetitionCategory.NEGATIVE_MARGIN
490
        mpHistory.risky = flipkartItemInfo.risky
491
        mpHistory.lowestSellingPrice = flipkartDetails.lowestSellerSp
492
        mpHistory.lowestSellerName = flipkartDetails.lowestSellerName
493
        mpHistory.lowestSellerCode = flipkartDetails.lowestSellerCode
494
        mpHistory.lowestSellerRating = flipkartDetails.lowestSellerScore
495
        mpHistory.lowestSellerShippingTime = ''
496
        mpHistory.lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
497
        else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
498
        mpHistory.ourSellingPrice = flipkartPricing.ourSp
499
        mpHistory.ourTp = flipkartPricing.ourTp
500
        mpHistory.ourNlc = flipkartItemInfo.nlc
501
        mpHistory.ourRating = flipkartDetails.ourScore
502
        mpHistory.ourShippingTime = ''
503
        mpHistory.ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
504
        else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
505
        mpHistory.prefferedSellerName = flipkartDetails.prefSellerName
506
        mpHistory.prefferedSellerCode = flipkartDetails.prefSellerCode
507
        mpHistory.prefferedSellerRating = flipkartDetails.prefSellerScore
508
        mpHistory.prefferedSellerSellingPrice = flipkartDetails.prefSellerSp
509
        mpHistory.prefferedSellerTp = flipkartPricing.prefSellerTp
510
        mpHistory.prefferedSellerShippingTime = ''
511
        mpHistory.prefferedSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitPrefSeller) if flipkartDetails.shippingTimeUpperLimitPrefSeller==0\
512
        else str(flipkartDetails.shippingTimeLowerLimitPrefSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitPrefSeller)
513
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
514
        mpHistory.totalSeller = flipkartDetails.totalAvailableSeller
515
        mpHistory.avgSales = (itemSaleMap.get(flipkartItemInfo.item_id))[3]
516
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(flipkartDetails.lowestSellerSp,flipkartItemInfo.nlc))
517
        mpHistory.timestamp = timestamp
518
        mpHistory.run = RunType._NAMES_TO_VALUES.get(flipkartItemInfo.runType)
519
    session.commit()
520
 
521
def commitCheapButNotPref(cheapButNotPref,timestamp):
522
    for item in cheapButNotPref:
523
        flipkartDetails = item[0]
524
        flipkartItemInfo = item[1]
525
        flipkartPricing = item[2]
526
        mpHistory = MarketPlaceHistory()
527
        mpHistory.item_id = flipkartItemInfo.item_id
528
        mpHistory.source = OrderSource.FLIPKART
529
        mpHistory.lowestTp = flipkartPricing.lowestTp
530
        mpHistory.lowestPossibleTp = flipkartPricing.lowestPossibleTp
531
        mpHistory.lowestPossibleSp = flipkartPricing.lowestPossibleSp
532
        mpHistory.ourInventory = flipkartItemInfo.ourFlipkartInventory
533
        mpHistory.ourRank = flipkartDetails.rank
534
        mpHistory.competitiveCategory = CompetitionCategory.CHEAP_BUT_NOT_PREF
535
        mpHistory.risky = flipkartItemInfo.risky
536
        mpHistory.lowestSellingPrice = flipkartDetails.lowestSellerSp
537
        mpHistory.lowestSellerName = flipkartDetails.lowestSellerName
538
        mpHistory.lowestSellerCode = flipkartDetails.lowestSellerCode
539
        mpHistory.lowestSellerRating = flipkartDetails.lowestSellerScore
540
        mpHistory.lowestSellerShippingTime = ''
541
        mpHistory.lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
542
        else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
543
        mpHistory.ourSellingPrice = flipkartPricing.ourSp
544
        mpHistory.ourTp = flipkartPricing.ourTp
545
        mpHistory.ourNlc = flipkartItemInfo.nlc
546
        mpHistory.ourRating = flipkartDetails.ourScore
547
        mpHistory.ourShippingTime = ''
548
        mpHistory.ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
549
        else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
550
        mpHistory.prefferedSellerName = flipkartDetails.prefSellerName
551
        mpHistory.prefferedSellerCode = flipkartDetails.prefSellerCode
552
        mpHistory.prefferedSellerRating = flipkartDetails.prefSellerScore
553
        mpHistory.prefferedSellerSellingPrice = flipkartDetails.prefSellerSp
554
        mpHistory.prefferedSellerTp = flipkartPricing.prefSellerTp
555
        mpHistory.prefferedSellerShippingTime = ''
556
        mpHistory.prefferedSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitPrefSeller) if flipkartDetails.shippingTimeUpperLimitPrefSeller==0\
557
        else str(flipkartDetails.shippingTimeLowerLimitPrefSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitPrefSeller)
558
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
559
        mpHistory.totalSeller = flipkartDetails.totalAvailableSeller
560
        mpHistory.avgSales = (itemSaleMap.get(flipkartItemInfo.item_id))[3]
561
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(flipkartDetails.lowestSellerSp,flipkartItemInfo.nlc))
562
        mpHistory.timestamp = timestamp
563
        mpHistory.run = RunType._NAMES_TO_VALUES.get(flipkartItemInfo.runType)
564
    session.commit()
565
 
566
def commitPrefButNotCheap(prefButNotCheap,timestamp):
567
    for item in prefButNotCheap:
568
        flipkartDetails = item[0]
569
        flipkartItemInfo = item[1]
570
        flipkartPricing = item[2]
11619 kshitij.so 571
        mpItem = item[3]
11193 kshitij.so 572
        mpHistory = MarketPlaceHistory()
573
        mpHistory.item_id = flipkartItemInfo.item_id
574
        mpHistory.source = OrderSource.FLIPKART
575
        mpHistory.lowestTp = flipkartPricing.lowestTp
576
        mpHistory.lowestPossibleTp = flipkartPricing.lowestPossibleTp
577
        mpHistory.lowestPossibleSp = flipkartPricing.lowestPossibleSp
578
        mpHistory.ourInventory = flipkartItemInfo.ourFlipkartInventory
579
        mpHistory.ourRank = flipkartDetails.rank
580
        mpHistory.competitiveCategory = CompetitionCategory.PREF_BUT_NOT_CHEAP
581
        mpHistory.risky = flipkartItemInfo.risky
582
        mpHistory.lowestSellingPrice = flipkartDetails.lowestSellerSp
583
        mpHistory.lowestSellerName = flipkartDetails.lowestSellerName
584
        mpHistory.lowestSellerCode = flipkartDetails.lowestSellerCode
585
        mpHistory.lowestSellerRating = flipkartDetails.lowestSellerScore
586
        mpHistory.lowestSellerShippingTime = ''
587
        mpHistory.lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
588
        else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
589
        mpHistory.ourSellingPrice = flipkartPricing.ourSp
590
        mpHistory.ourTp = flipkartPricing.ourTp
591
        mpHistory.ourNlc = flipkartItemInfo.nlc
592
        mpHistory.ourRating = flipkartDetails.ourScore
593
        mpHistory.ourShippingTime = ''
594
        mpHistory.ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
595
        else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
596
        mpHistory.prefferedSellerName = flipkartDetails.prefSellerName
597
        mpHistory.prefferedSellerCode = flipkartDetails.prefSellerCode
598
        mpHistory.prefferedSellerRating = flipkartDetails.prefSellerScore
599
        mpHistory.prefferedSellerSellingPrice = flipkartDetails.prefSellerSp
600
        mpHistory.prefferedSellerTp = flipkartPricing.prefSellerTp
601
        mpHistory.prefferedSellerShippingTime = ''
602
        mpHistory.prefferedSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitPrefSeller) if flipkartDetails.shippingTimeUpperLimitPrefSeller==0\
603
        else str(flipkartDetails.shippingTimeLowerLimitPrefSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitPrefSeller)
604
        mpHistory.margin = mpHistory.ourTp - mpHistory.lowestPossibleTp
11775 kshitij.so 605
        proposed_sp = max(flipkartDetails.lowestSellerSp - max((10, flipkartDetails.lowestSellerSp*0.001)), flipkartPricing.lowestPossibleSp)
11619 kshitij.so 606
        proposed_tp = getTargetTp(proposed_sp,mpItem)
607
        mpHistory.proposedSellingPrice = proposed_sp
608
        mpHistory.proposedTp = proposed_tp  
11193 kshitij.so 609
        mpHistory.totalSeller = flipkartDetails.totalAvailableSeller
610
        mpHistory.avgSales = (itemSaleMap.get(flipkartItemInfo.item_id))[3]
611
        mpHistory.salesPotential = SalesPotential._NAMES_TO_VALUES.get(getSalesPotential(flipkartDetails.lowestSellerSp,flipkartItemInfo.nlc))
612
        mpHistory.timestamp = timestamp
613
        mpHistory.run = RunType._NAMES_TO_VALUES.get(flipkartItemInfo.runType)
614
    session.commit()
615
 
616
def populateStuff(runType,time):
11581 kshitij.so 617
    global itemSaleMap
11615 kshitij.so 618
    global categoryMap
619
 
11193 kshitij.so 620
    itemInfo = []
621
    if runType=='FAVOURITE':
622
        items = session.query(FlipkartItem,MarketplaceItems).join((MarketplaceItems,FlipkartItem.item_id==MarketplaceItems.itemId)).filter(MarketplaceItems.source==OrderSource.FLIPKART).\
623
        filter(or_(MarketplaceItems.autoFavourite==True, MarketplaceItems.manualFavourite==True)).all()
624
    else:
625
        #items = session.query(FlipkartItem,MarketplaceItems).join((MarketplaceItems,FlipkartItem.item_id==MarketplaceItems.itemId)).filter(MarketplaceItems.source==OrderSource.FLIPKART).all()
626
        items = session.query(FlipkartItem,MarketplaceItems).join((MarketplaceItems,FlipkartItem.item_id==MarketplaceItems.itemId)).filter(MarketplaceItems.source==OrderSource.FLIPKART).all()
11581 kshitij.so 627
 
628
    inventory_client = InventoryClient().get_client()
629
 
11193 kshitij.so 630
    for item in items:
631
        flipkart_item = item[0]
632
        mp_item = item[1]
633
        it = Item.query.filter_by(id=flipkart_item.item_id).one()
634
        category = Category.query.filter_by(id=it.category).one()
635
        parent_category = Category.query.filter_by(id=category.parent_category_id).first()
11615 kshitij.so 636
        if not categoryMap.has_key(category.id):
637
            temp = []
11616 kshitij.so 638
            temp.append(category.display_name)
639
            temp.append(parent_category.display_name)
11615 kshitij.so 640
            categoryMap[category.id] = temp
12134 kshitij.so 641
        srm = SourceReturnPercentage.get_by(source=OrderSource.FLIPKART,brand=it.brand,category_id=it.category)
11193 kshitij.so 642
        sip = SourceItemPercentage.query.filter(SourceItemPercentage.item_id==it.id).filter(SourceItemPercentage.source==OrderSource.FLIPKART).filter(SourceItemPercentage.startDate<=time).filter(SourceItemPercentage.expiryDate>=time).first()
643
        sourcePercentage = None
644
        if sip is not None:
645
            sourcePercentage = sip
12137 kshitij.so 646
            sourcePercentage.returnProvision = srm.returnProvision
11193 kshitij.so 647
        else:
648
            scp = SourceCategoryPercentage.query.filter(SourceCategoryPercentage.category_id==it.category).filter(SourceCategoryPercentage.source==OrderSource.FLIPKART).filter(SourceCategoryPercentage.startDate<=time).filter(SourceCategoryPercentage.expiryDate>=time).first()
649
            if scp is not None:
650
                sourcePercentage = scp
12137 kshitij.so 651
                sourcePercentage.returnProvision = srm.returnProvision
11193 kshitij.so 652
            else:
653
                spm = SourcePercentageMaster.get_by(source=OrderSource.FLIPKART)
654
                sourcePercentage = spm
12137 kshitij.so 655
                sourcePercentage.returnProvision = srm.returnProvision
656
 
657
 
11581 kshitij.so 658
 
659
        warehouse = inventory_client.getWarehouse(flipkart_item.warehouseId)    
660
        itemSaleList = []
661
        oosForAllSources = inventory_client.getOosStatusesForXDaysForItem(flipkart_item.item_id, 0, 3)
662
        oosForFlipkart = inventory_client.getOosStatusesForXDaysForItem(flipkart_item.item_id, OrderSource.FLIPKART, 5)
663
        oosForFlipkartLastDay = inventory_client.getOosStatusesForXDaysForItem(flipkart_item.item_id, OrderSource.FLIPKART, 1)
11615 kshitij.so 664
        oosForFlipkartTwoDay = inventory_client.getOosStatusesForXDaysForItem(flipkart_item.item_id, OrderSource.FLIPKART, 2)
11581 kshitij.so 665
        itemSaleList.append(oosForAllSources)
666
        itemSaleList.append(oosForFlipkart)
667
        itemSaleList.append(calculateAverageSale(oosForAllSources))
668
        itemSaleList.append(calculateAverageSale(oosForFlipkart))
669
        itemSaleList.append(calculateAverageSale(oosForFlipkartLastDay))
670
        itemSaleList.append(calculateTotalSale(oosForFlipkart))
11615 kshitij.so 671
        itemSaleList.append(calculateAverageSale(oosForFlipkartTwoDay))
11581 kshitij.so 672
        itemSaleMap[flipkart_item.item_id]=itemSaleList
673
 
11560 kshitij.so 674
#        try:
675
#            request_url = "https://api.flipkart.net/sellers/skus/%s/listings"%(str(flipkart_item.skuAtFlipkart))
676
#            r = requests.get(request_url, auth=('m2z93iskuj81qiid', '0c7ab6a5-98c0-4cdc-8be3-72c591e0add4'))
677
#            print "Inventory info",r.json()
678
#            stock_count = int((r.json()['attributeValues'])['stock_count'])
679
#        except:
680
#            stock_count = 0
11581 kshitij.so 681
        flipkartItemInfo = __FlipkartItemInfo(flipkart_item.flipkartSerialNumber, flipkart_item.maxNlc,mp_item.courierCost, it.id, it.product_group, it.brand, it.model_name, it.model_number, it.color, it.weight, category.parent_category_id, it.risky, flipkart_item.warehouseId, None, runType, parent_category.display_name,sourcePercentage,None,flipkart_item.skuAtFlipkart,None,warehouse.stateId)
11193 kshitij.so 682
        itemInfo.append(flipkartItemInfo)
683
    return itemInfo
684
 
685
def fetchDetails(flipkartSerialNumber,scraper):
686
    url = "http://www.flipkart.com/ps/%s"%(flipkartSerialNumber)
687
    #url = "http://www.flipkart.com/ps/MOBDTXVZXVY3GFG8"
688
    scraper.read(url)
689
    vendorsData = scraper.createData()
690
    sortedVendorsData = sorted(vendorsData, key=itemgetter('sellingPrice'))
11968 kshitij.so 691
    vendorsData[:]=[]
11193 kshitij.so 692
    rank ,ourSp, iterator, secondLowestSellerSp, prefSellerSp, lowestSellerSp, lowestSellerScore, prefSellerScore, secondLowestSellerScore, ourScore, shippingTimeLowerLimitLowestSeller,shippingTimeUpperLimitLowestSeller, \
693
    shippingTimeLowerLimitPrefSeller, shippingTimeUpperLimitPrefSeller, shippingTimeLowerLimitOur, shippingTimeUpperLimitOur, shippingTimeLowerLimitSecondLowestSeller, shippingTimeUpperLimitSecondLowestSeller, totalAvailableSeller= (0,)*19
694
    lowestSellerName, lowestSellerCode, secondLowestSellerName, secondLowestSellerCode, prefSellerName, prefSellerCode, lowestSellerBuyTrend, \
695
    ourBuyTrend, prefSellerBuyTrend, secondLowestSellerBuyTrend, ourCode = ('',)*11
696
    for data in sortedVendorsData:
697
        if iterator == 0:
698
            lowestSellerName = data['sellerName']
699
            lowestSellerScore = data['sellerScore']
700
            lowestSellerCode = data['sellerCode']
701
            lowestSellerSp = data['sellingPrice']
702
            lowestSellerBuyTrend = data['buyTrend']
703
            try:
704
                shippingTimeLowerLimitLowestSeller, shippingTimeUpperLimitLowestSeller = data['shippingTime'].split('-')
705
            except ValueError:
706
                shippingTimeLowerLimitLowestSeller = int(data['shippingTime'])
707
 
708
        if iterator ==1:
709
            secondLowestSellerName = data['sellerName']
710
            secondLowestSellerScore = data['sellerScore']
711
            secondLowestSellerCode = data['sellerCode']
712
            secondLowestSellerSp = data['sellingPrice']
713
            secondLowestSellerBuyTrend = data['buyTrend']
714
            try:
715
                shippingTimeLowerLimitSecondLowestSeller, shippingTimeUpperLimitSecondLowestSeller = data['shippingTime'].split('-')
716
            except ValueError:
717
                shippingTimeLowerLimitSecondLowestSeller = int(data['shippingTime'])
718
 
719
        if data['sellerName'] == 'Saholic':
720
            ourScore = data['sellerScore']
721
            ourCode = data['sellerCode']
722
            ourSp = data['sellingPrice']
723
            ourBuyTrend = data['buyTrend']
724
            try:
725
                shippingTimeLowerLimitOur, shippingTimeUpperLimitOur = data['shippingTime'].split('-')
726
            except ValueError:
727
                shippingTimeLowerLimitOur = int(data['shippingTime'])
728
            rank = iterator + 1
729
 
730
        if data['buyTrend'] in ('PrefCheap','PrefNCheap',''):
731
            prefSellerName = data['sellerName']
732
            prefSellerScore = data['sellerScore']
733
            prefSellerCode = data['sellerCode']
734
            prefSellerSp = data['sellingPrice']
735
            prefSellerBuyTrend = data['buyTrend']
736
            try:
737
                shippingTimeLowerLimitPrefSeller, shippingTimeUpperLimitPrefSeller = data['shippingTime'].split('-')
738
            except ValueError:
739
                shippingTimeLowerLimitPrefSeller = int(data['shippingTime'])
740
 
741
        iterator+=1
11774 kshitij.so 742
 
11193 kshitij.so 743
    flipkartDetails = __FlipkartDetails(rank ,ourSp , secondLowestSellerSp, prefSellerSp, lowestSellerSp, lowestSellerScore, prefSellerScore, secondLowestSellerScore, ourScore, int(shippingTimeLowerLimitLowestSeller),int(shippingTimeUpperLimitLowestSeller), \
744
    int(shippingTimeLowerLimitPrefSeller), int(shippingTimeUpperLimitPrefSeller), int(shippingTimeLowerLimitOur), int(shippingTimeUpperLimitOur), int(shippingTimeLowerLimitSecondLowestSeller), int(shippingTimeUpperLimitSecondLowestSeller), len(sortedVendorsData), lowestSellerName, lowestSellerCode, secondLowestSellerName, secondLowestSellerCode, prefSellerName, prefSellerCode, lowestSellerBuyTrend, \
745
    ourBuyTrend, prefSellerBuyTrend, secondLowestSellerBuyTrend, ourCode)
11774 kshitij.so 746
 
747
    if flipkartDetails.ourBuyTrend == 'PrefCheap'and flipkartDetails.rank!=1 and flipkartDetails.ourSp==flipkartDetails.secondLowestSellerSp:
11775 kshitij.so 748
        print "Under PrefCheap category.Switching data for ",flipkartSerialNumber
11774 kshitij.so 749
        flipkartDetails.lowestSellerSp, flipkartDetails.secondLowestSellerSp = flipkartDetails.secondLowestSellerSp,flipkartDetails.lowestSellerSp
750
        flipkartDetails.lowestSellerScore, flipkartDetails.secondLowestSellerScore = flipkartDetails.secondLowestSellerScore,flipkartDetails.lowestSellerScore
751
        flipkartDetails.shippingTimeLowerLimitLowestSeller, flipkartDetails.shippingTimeLowerLimitSecondLowestSeller = flipkartDetails.shippingTimeLowerLimitSecondLowestSeller,flipkartDetails.shippingTimeLowerLimitLowestSeller
752
        flipkartDetails.shippingTimeUpperLimitLowestSeller, flipkartDetails.shippingTimeUpperLimitSecondLowestSeller = flipkartDetails.shippingTimeUpperLimitSecondLowestSeller,flipkartDetails.shippingTimeUpperLimitLowestSeller
753
        flipkartDetails.lowestSellerName, flipkartDetails.secondLowestSellerName = flipkartDetails.secondLowestSellerName,flipkartDetails.lowestSellerName
754
        flipkartDetails.lowestSellerCode, flipkartDetails.secondLowestSellerCode = flipkartDetails.secondLowestSellerCode,flipkartDetails.lowestSellerCode
755
        flipkartDetails.lowestSellerBuyTrend, flipkartDetails.secondLowestSellerBuyTrend = flipkartDetails.secondLowestSellerBuyTrend,flipkartDetails.lowestSellerBuyTrend
756
        flipkartDetails.rank=1
757
 
758
    if flipkartDetails.ourBuyTrend == 'NPrefCheap'and flipkartDetails.rank!=1 and flipkartDetails.ourSp==flipkartDetails.lowestSellerSp:
11775 kshitij.so 759
        print "Under NPrefCheap category.Switching data for ",flipkartSerialNumber
11774 kshitij.so 760
        flipkartDetails.lowestSellerSp = flipkartDetails.ourSp
761
        flipkartDetails.lowestSellerScore = flipkartDetails.ourScore
762
        flipkartDetails.shippingTimeLowerLimitLowestSeller = flipkartDetails.shippingTimeLowerLimitOur
763
        flipkartDetails.shippingTimeUpperLimitLowestSeller = flipkartDetails.shippingTimeUpperLimitOur
764
        flipkartDetails.lowestSellerName = 'Saholic'
765
        flipkartDetails.lowestSellerCode = flipkartDetails.ourCode
766
        flipkartDetails.lowestSellerBuyTrend = flipkartDetails.ourBuyTrend
767
 
11193 kshitij.so 768
    return flipkartDetails
769
 
770
def calculateAverageSale(oosStatus):
771
    count,sale = 0,0
772
    for obj in oosStatus:
773
        if not obj.is_oos:
774
            count+=1
775
            sale = sale+obj.num_orders
776
    avgSalePerDay=0 if count==0 else (float(sale)/count)
777
    return round(avgSalePerDay,2)
778
 
779
def calculateTotalSale(oosStatus):
780
    sale = 0
781
    for obj in oosStatus:
782
        if not obj.is_oos:
783
            sale = sale+obj.num_orders
784
    return sale
785
 
786
def getNetAvailability(itemInventory):
787
    totalAvailability, totalReserved = 0,0
788
    availableMap  = itemInventory.availability
789
    reserveMap = itemInventory.reserved
790
    for warehouse,availability in availableMap.iteritems():
791
        if warehouse==16:
792
            continue
793
        totalAvailability = totalAvailability+availability
794
    for warehouse,reserve in reserveMap.iteritems():
795
        if warehouse==16:
796
            continue
797
        totalReserved = totalReserved+reserve
798
    return totalAvailability - totalReserved
799
 
800
def getOosString(oosStatus):
801
    lastNdaySale=""
802
    for obj in oosStatus:
803
        if obj.is_oos:
804
            lastNdaySale += "X-"
805
        else:
806
            lastNdaySale += str(obj.num_orders) + "-"
807
    return lastNdaySale[:-1]
808
 
809
def getLastDaySale(itemId):
810
    return (itemSaleMap.get(itemId))[4]
811
 
812
def getSalesPotential(lowestSellingPrice,ourNlc):
813
    if lowestSellingPrice - ourNlc < 0:
814
        return 'HIGH'
815
    elif (float(lowestSellingPrice - ourNlc))/lowestSellingPrice >=0 and (float(lowestSellingPrice - ourNlc))/lowestSellingPrice <=.02:
816
        return 'MEDIUM'
817
    else:
818
        return 'LOW'  
819
 
11571 kshitij.so 820
def decideCategory(itemInfo):
11193 kshitij.so 821
    global itemSaleMap
11560 kshitij.so 822
 
11571 kshitij.so 823
    cantCompete, buyBoxItems, competitive, competitiveNoInventory, exceptionItems, negativeMargin, cheapButNotPref, prefButNotCheap = [],[],[],[],[],[],[],[]
824
 
11193 kshitij.so 825
    catalog_client = CatalogClient().get_client()
826
 
11571 kshitij.so 827
    for val in itemInfo:
828
        spm = val.sourcePercentage
829
        flipkartDetails = val.flipkartDetails
11581 kshitij.so 830
        if (flipkartDetails is None or flipkartDetails.totalAvailableSeller==0):
11571 kshitij.so 831
            exceptionItems.append(val)
832
            continue
833
 
834
        mpItem = MarketplaceItems.get_by(itemId=val.item_id,source=OrderSource.FLIPKART)
835
        if flipkartDetails.rank==0:
836
            flipkartDetails.ourSp = mpItem.currentSp
837
            ourSp = mpItem.currentSp
838
        else:
839
            ourSp = flipkartDetails.ourSp
11581 kshitij.so 840
        vatRate = catalog_client.getVatPercentageForItem(val.item_id, val.stateId, flipkartDetails.ourSp)
11571 kshitij.so 841
        val.vatRate = vatRate
842
        if (flipkartDetails.ourBuyTrend == 'PrefCheap') or (flipkartDetails.rank==1 and flipkartDetails.totalAvailableSeller==1):
843
            temp=[]
844
            temp.append(flipkartDetails)
845
            temp.append(val)
846
            secondLowestTp=0 if flipkartDetails.totalAvailableSeller==1 else getOtherTp(flipkartDetails,val,spm,False)
847
            prefSellerTp=0 if flipkartDetails.totalAvailableSeller < 2 else getOtherTp(flipkartDetails,val,spm,True)  
848
            flipkartPricing = __FlipkartPricing(flipkartDetails.ourSp,getOurTp(flipkartDetails,val,spm,mpItem),None,getLowestPossibleTp(flipkartDetails,val,spm,mpItem),secondLowestTp,getLowestPossibleSp(flipkartDetails,val,spm,mpItem),prefSellerTp)
849
            temp.append(flipkartPricing)
850
            temp.append(mpItem)
851
            buyBoxItems.append(temp)
852
            continue
853
 
854
        if (flipkartDetails.ourBuyTrend == 'PrefNCheap'):
855
            temp=[]
856
            temp.append(flipkartDetails)
857
            temp.append(val)
11618 kshitij.so 858
            secondLowestTp=0 if flipkartDetails.totalAvailableSeller==1 else getSecondLowestSellerTp(flipkartDetails,val,spm,False)
11615 kshitij.so 859
            lowestTp=0 if flipkartDetails.totalAvailableSeller==1 else getOtherTp(flipkartDetails,val,spm,False)
11571 kshitij.so 860
            prefSellerTp=0 if flipkartDetails.totalAvailableSeller < 2 else getOtherTp(flipkartDetails,val,spm,True)  
861
            flipkartPricing = __FlipkartPricing(flipkartDetails.ourSp,getOurTp(flipkartDetails,val,spm,mpItem),None,getLowestPossibleTp(flipkartDetails,val,spm,mpItem),secondLowestTp,getLowestPossibleSp(flipkartDetails,val,spm,mpItem),prefSellerTp)
862
            temp.append(flipkartPricing)
863
            temp.append(mpItem)
864
            prefButNotCheap.append(temp)
865
            continue
866
 
867
        if (flipkartDetails.ourBuyTrend == 'NPrefCheap') and (flipkartDetails.rank==1):
868
            temp=[]
869
            temp.append(flipkartDetails)
870
            temp.append(val)
11615 kshitij.so 871
            secondLowestTp=0 if flipkartDetails.totalAvailableSeller==1 else getOtherTp(flipkartDetails,val,spm,False)
11571 kshitij.so 872
            prefSellerTp=0 if flipkartDetails.totalAvailableSeller < 2 else getOtherTp(flipkartDetails,val,spm,True)  
11615 kshitij.so 873
            flipkartPricing = __FlipkartPricing(flipkartDetails.ourSp,getOurTp(flipkartDetails,val,spm,mpItem),None,getLowestPossibleTp(flipkartDetails,val,spm,mpItem),secondLowestTp,getLowestPossibleSp(flipkartDetails,val,spm,mpItem),prefSellerTp)
11571 kshitij.so 874
            temp.append(flipkartPricing)
875
            temp.append(mpItem)
876
            cheapButNotPref.append(temp)
877
            continue
878
 
879
        lowestTp = getOtherTp(flipkartDetails,val,spm,False)
880
        ourTp = getOurTp(flipkartDetails,val,spm,mpItem)
881
        lowestPossibleTp = getLowestPossibleTp(flipkartDetails,val,spm,mpItem)
882
        lowestPossibleSp = getLowestPossibleSp(flipkartDetails,val,spm,mpItem)
883
        prefSellerTp = getOtherTp(flipkartDetails,val,spm,True)
884
 
885
        if (ourTp<lowestPossibleTp):
886
            temp=[]
887
            temp.append(flipkartDetails)
888
            temp.append(val)
889
            flipkartPricing = __FlipkartPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,None,None,None)
890
            temp.append(flipkartPricing)
891
            negativeMargin.append(temp)
892
            continue
893
 
894
        if (flipkartDetails.lowestSellerSp > lowestPossibleSp) and val.ourFlipkartInventory!=0:
895
            type(val.ourFlipkartInventory)
896
            temp=[]
897
            temp.append(flipkartDetails)
898
            temp.append(val)
899
            flipkartPricing = __FlipkartPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,None,lowestPossibleSp,prefSellerTp)
900
            temp.append(flipkartPricing)
901
            temp.append(mpItem)
902
            competitive.append(temp)
903
            continue
904
 
905
        if (flipkartDetails.lowestSellerSp) > lowestPossibleSp and val.ourFlipkartInventory==0:
906
            temp=[]
907
            temp.append(flipkartDetails)
908
            temp.append(val)
909
            flipkartPricing = __FlipkartPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,None,lowestPossibleSp,prefSellerTp)
910
            temp.append(flipkartPricing)
911
            temp.append(mpItem)
912
            competitiveNoInventory.append(temp)
913
            continue
914
 
11193 kshitij.so 915
        temp=[]
916
        temp.append(flipkartDetails)
917
        temp.append(val)
918
        flipkartPricing = __FlipkartPricing(ourSp,ourTp,lowestTp,lowestPossibleTp,None,lowestPossibleSp,prefSellerTp)
919
        temp.append(flipkartPricing)
920
        temp.append(mpItem)
11571 kshitij.so 921
        cantCompete.append(temp)
11193 kshitij.so 922
 
11969 kshitij.so 923
    itemInfo[:]=[]
11571 kshitij.so 924
    return cantCompete, buyBoxItems, competitive, competitiveNoInventory, exceptionItems, negativeMargin, cheapButNotPref, prefButNotCheap
11193 kshitij.so 925
 
926
def getOtherTp(flipkartDetails,val,spm,prefferedSeller):
927
    if val.parent_category==10011 or val.parent_category==12001:
928
        commissionPercentage = spm.competitorCommissionAccessory
929
    else:
930
        commissionPercentage = spm.competitorCommissionOther
931
    if flipkartDetails.rank==1 and not prefferedSeller:
932
        otherTp = flipkartDetails.secondLowestSellerSp- flipkartDetails.secondLowestSellerSp*(commissionPercentage/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost+spm.closingFee)*(1+(spm.serviceTax/100))
933
        return round(otherTp,2)
934
    if prefferedSeller:
935
        otherTp = flipkartDetails.prefSellerSp- flipkartDetails.prefSellerSp*(commissionPercentage/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost+spm.closingFee)*(1+(spm.serviceTax/100))
936
        return round(otherTp,2)
937
    otherTp = flipkartDetails.lowestSellerSp- flipkartDetails.lowestSellerSp*(commissionPercentage/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost+spm.closingFee)*(1+(spm.serviceTax/100))
938
    return round(otherTp,2)
11618 kshitij.so 939
 
940
def getSecondLowestSellerTp(flipkartDetails,val,spm,prefferedSeller):
941
    if val.parent_category==10011 or val.parent_category==12001:
942
        commissionPercentage = spm.competitorCommissionAccessory
943
    else:
944
        commissionPercentage = spm.competitorCommissionOther
945
    otherTp = flipkartDetails.secondLowestSellerSp- flipkartDetails.secondLowestSellerSp*(commissionPercentage/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost+spm.closingFee)*(1+(spm.serviceTax/100))
946
    return round(otherTp,2)
11193 kshitij.so 947
 
948
def getLowestPossibleTp(flipkartDetails,val,spm,mpItem):
949
    if flipkartDetails.rank==0:
950
        return mpItem.minimumPossibleTp
951
    vat = (flipkartDetails.ourSp/(1+(val.vatRate/100))-(val.nlc/(1+(val.vatRate/100))))*(val.vatRate/100);
952
    inHouseCost = 15+vat+(mpItem.returnProvision/100)*flipkartDetails.ourSp+mpItem.otherCost;
953
    lowest_possible_tp = val.nlc+inHouseCost;
954
    return round(lowest_possible_tp,2)
955
 
956
def getOurTp(flipkartDetails,val,spm,mpItem):
957
    if flipkartDetails.rank==0:
958
        return mpItem.currentTp
959
    ourTp = flipkartDetails.ourSp- flipkartDetails.ourSp*(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))-(val.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100))
960
    return round(ourTp,2)
961
 
962
def getLowestPossibleSp(flipkartDetails,val,spm,mpItem):
963
    if flipkartDetails.rank==0:
964
        return mpItem.minimumPossibleSp
965
    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));
966
    return round(lowestPossibleSp,2)
967
 
968
def getTargetTp(targetSp,mpItem):
969
    targetTp = targetSp- targetSp*(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))-(mpItem.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100))
970
    return round(targetTp,2)
971
 
972
def getTargetSp(targetTp,mpItem,ourSp):
973
    targetSp = float(targetTp+(mpItem.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100)))/(1-((mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))))
974
    return round(targetSp,2)
975
 
11623 kshitij.so 976
def getNewLowestPossibleTp(mpItem,nlc,vatRate,proposedSellingPrice):
977
    vat = (proposedSellingPrice/(1+(vatRate/100))-(nlc/(1+(vatRate/100))))*(vatRate/100);
978
    inHouseCost = 15+vat+(mpItem.returnProvision/100)*proposedSellingPrice+mpItem.otherCost;
979
    lowest_possible_tp = nlc+inHouseCost;
980
    return round(lowest_possible_tp,2)
981
 
982
def getNewOurTp(mpItem,proposedSellingPrice):
11624 kshitij.so 983
    ourTp = proposedSellingPrice- proposedSellingPrice*(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))-(mpItem.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100))
11623 kshitij.so 984
    return round(ourTp,2)
985
 
986
def getNewLowestPossibleSp(mpItem,nlc,vatRate):
11624 kshitij.so 987
    lowestPossibleSp = (nlc+(mpItem.courierCost+mpItem.closingFee)*(1+(mpItem.serviceTax/100))*(1+(vatRate/100))+(15+mpItem.otherCost)*(1+(vatRate)/100))/(1-(mpItem.commission/100+mpItem.emiFee/100)*(1+(mpItem.serviceTax/100))*(1+(vatRate)/100)-(mpItem.returnProvision/100)*(1+(vatRate)/100));
11623 kshitij.so 988
    return round(lowestPossibleSp,2)    
989
 
990
 
11193 kshitij.so 991
def markAutoFavourite():
992
    previouslyAutoFav = []
993
    nowAutoFav = []
994
    marketplaceItems = session.query(MarketplaceItems).filter(MarketplaceItems.source==OrderSource.FLIPKART).all()
995
    fromDate = datetime.now()-timedelta(days = 3, hours=datetime.now().hour, minutes=datetime.now().minute, seconds=datetime.now().second)
996
    toDate = datetime.now()-timedelta(days = 0, hours=datetime.now().hour, minutes=datetime.now().minute, seconds=datetime.now().second)
11615 kshitij.so 997
    items = session.query(MarketPlaceHistory.item_id,func.max(MarketPlaceHistory.timestamp)).group_by(MarketPlaceHistory.item_id).filter(MarketPlaceHistory.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.timestamp.between (fromDate,toDate)).filter(or_(MarketPlaceHistory.competitiveCategory==CompetitionCategory.BUY_BOX,MarketPlaceHistory.competitiveCategory==CompetitionCategory.PREF_BUT_NOT_CHEAP)).all()
11193 kshitij.so 998
    toUpdate = [key for key, value in itemSaleMap.items() if value[5] >= 1]
999
    buyBoxLast3days = []
1000
    for item in items:
1001
        buyBoxLast3days.append(item[0])
1002
    for marketplaceItem in marketplaceItems:
1003
        reason = ""
1004
        toMark = False
1005
        if marketplaceItem.itemId in toUpdate:
1006
            toMark = True
1007
            reason+="Total sale is greater than 1 for last five days (Flipkart)."
1008
        if marketplaceItem.itemId in buyBoxLast3days:
1009
            toMark = True
1010
            reason+="Item is present in buy box in last 3 days"
1011
        if not marketplaceItem.autoFavourite:
1012
            print "Item is not under auto favourite"
1013
        if toMark:
1014
            temp=[]
1015
            temp.append(marketplaceItem.itemId)
1016
            temp.append(reason)
1017
            nowAutoFav.append(temp)
1018
        if (not toMark) and marketplaceItem.autoFavourite:
1019
            previouslyAutoFav.append(marketplaceItem.itemId)
1020
        marketplaceItem.autoFavourite = toMark
1021
    session.commit()
1022
    return previouslyAutoFav, nowAutoFav
1023
 
11615 kshitij.so 1024
def write_report(previousAutoFav, nowAutoFav,timestamp, runType):
11193 kshitij.so 1025
    wbk = xlwt.Workbook()
1026
    sheet = wbk.add_sheet('Can\'t Compete')
1027
    xstr = lambda s: s or ""
1028
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1029
 
1030
    excel_integer_format = '0'
1031
    integer_style = xlwt.XFStyle()
1032
    integer_style.num_format_str = excel_integer_format
1033
 
1034
    sheet.write(0, 0, "Item ID", heading_xf)
1035
    sheet.write(0, 1, "Category", heading_xf)
1036
    sheet.write(0, 2, "Product Group.", heading_xf)
1037
    sheet.write(0, 3, "FK Serial Number", heading_xf)
1038
    sheet.write(0, 4, "Brand", heading_xf)
1039
    sheet.write(0, 5, "Product Name", heading_xf)
1040
    sheet.write(0, 6, "Weight", heading_xf)
1041
    sheet.write(0, 7, "Courier Cost", heading_xf)
1042
    sheet.write(0, 8, "Risky", heading_xf)
11790 kshitij.so 1043
    sheet.write(0, 9, "Commission Rate", heading_xf)
1044
    sheet.write(0, 10, "Return Provision", heading_xf)
1045
    sheet.write(0, 11, "Our Rating", heading_xf)
1046
    sheet.write(0, 12, "Our Shipping Time", heading_xf)
1047
    sheet.write(0, 13, "Our Rank", heading_xf)
1048
    sheet.write(0, 14, "Our SP", heading_xf)
1049
    sheet.write(0, 15, "Our TP", heading_xf)
1050
    sheet.write(0, 16, "Lowest Seller", heading_xf)
1051
    sheet.write(0, 17, "Lowest Seller Rating", heading_xf)
1052
    sheet.write(0, 18, "Lowest Seller Shipping Time", heading_xf)
1053
    sheet.write(0, 19, "Lowest Seller SP", heading_xf)
1054
    sheet.write(0, 20, "Lowest Seller TP", heading_xf)
1055
    sheet.write(0, 21, "Preffered Seller", heading_xf)
1056
    sheet.write(0, 22, "Preffered Seller Rating", heading_xf)
1057
    sheet.write(0, 23, "Preffered Seller Shipping Time", heading_xf)
1058
    sheet.write(0, 24, "Preffer Seller SP", heading_xf)
1059
    sheet.write(0, 25, "Preffered Seller TP", heading_xf)
1060
    sheet.write(0, 26, "Our Flipkart Inventory", heading_xf)
1061
    sheet.write(0, 27, "Our Net Availability",heading_xf)
1062
    sheet.write(0, 28, "Last Five Day Sale", heading_xf)
1063
    sheet.write(0, 29, "Average Sale", heading_xf)
1064
    sheet.write(0, 30, "Our NLC", heading_xf)
1065
    sheet.write(0, 31, "Lowest Possible SP", heading_xf)
1066
    sheet.write(0, 32, "Lowest Possible TP", heading_xf)
1067
    sheet.write(0, 33, "Target SP", heading_xf)
1068
    sheet.write(0, 34, "Target TP", heading_xf)  
1069
    sheet.write(0, 35, "Target NLC", heading_xf)
1070
    sheet.write(0, 36, "Sales Potential", heading_xf)
1071
    sheet.write(0, 37, "Total Seller", heading_xf)
11193 kshitij.so 1072
    sheet_iterator = 1
11620 kshitij.so 1073
    canCompeteItems = session.query(MarketPlaceHistory,FlipkartItem,MarketplaceItems,Item)\
11622 kshitij.so 1074
    .join((FlipkartItem,MarketPlaceHistory.item_id==FlipkartItem.item_id))\
1075
    .join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
1076
    .join((Item,MarketPlaceHistory.item_id==Item.id))\
11615 kshitij.so 1077
    .filter(MarketplaceItems.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.source==OrderSource.FLIPKART)\
1078
    .filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.CANT_COMPETE).all()
1079
    for item in canCompeteItems:
1080
        mpHistory = item[0]
1081
        flipkartItem = item[1]
1082
        mpItem = item[2]
1083
        catItem = item[3]
1084
        sheet.write(sheet_iterator,0,mpHistory.item_id)
1085
        sheet.write(sheet_iterator,1,categoryMap.get(catItem.category)[0])
1086
        sheet.write(sheet_iterator,2,categoryMap.get(catItem.category)[1])
1087
        sheet.write(sheet_iterator,3,flipkartItem.flipkartSerialNumber)
1088
        sheet.write(sheet_iterator,4,catItem.brand)
1089
        sheet.write(sheet_iterator,5,xstr(catItem.brand)+" "+xstr(catItem.model_name)+" "+xstr(catItem.model_number)+" "+xstr(catItem.color))
1090
        sheet.write(sheet_iterator,6,catItem.weight)
1091
        sheet.write(sheet_iterator,7,mpItem.courierCost)
1092
        sheet.write(sheet_iterator,8,catItem.risky)
11790 kshitij.so 1093
        sheet.write(sheet_iterator,9,mpItem.commission)
1094
        sheet.write(sheet_iterator,10,mpItem.returnProvision)
1095
        sheet.write(sheet_iterator,11,mpHistory.ourRating)
11615 kshitij.so 1096
#        ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
1097
#        else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
11790 kshitij.so 1098
        sheet.write(sheet_iterator,12,mpHistory.ourShippingTime)
1099
        sheet.write(sheet_iterator,13,mpHistory.ourRank)
1100
        sheet.write(sheet_iterator,14,mpHistory.ourSellingPrice)
1101
        sheet.write(sheet_iterator,15,mpHistory.ourTp)
1102
        sheet.write(sheet_iterator,16,mpHistory.lowestSellerName)
1103
        sheet.write(sheet_iterator,17,mpHistory.lowestSellerRating)
11615 kshitij.so 1104
#       lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
1105
#       else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
11790 kshitij.so 1106
        sheet.write(sheet_iterator,18,mpHistory.lowestSellerShippingTime)
1107
        sheet.write(sheet_iterator,19,mpHistory.lowestSellingPrice)
1108
        sheet.write(sheet_iterator,20,mpHistory.lowestTp)
1109
        sheet.write(sheet_iterator,21,mpHistory.prefferedSellerName)
1110
        sheet.write(sheet_iterator,22,mpHistory.prefferedSellerRating)
11615 kshitij.so 1111
#        prefferedSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitPrefSeller) if flipkartDetails.shippingTimeUpperLimitPrefSeller==0\
1112
#        else str(flipkartDetails.shippingTimeLowerLimitPrefSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitPrefSeller)
11790 kshitij.so 1113
        sheet.write(sheet_iterator,23,mpHistory.prefferedSellerShippingTime)
1114
        sheet.write(sheet_iterator,24,mpHistory.prefferedSellerSellingPrice)
1115
        sheet.write(sheet_iterator,25,mpHistory.prefferedSellerTp)
1116
        sheet.write(sheet_iterator,26,mpHistory.ourInventory)
11615 kshitij.so 1117
        if (not inventoryMap.has_key(mpHistory.item_id)):
11790 kshitij.so 1118
            sheet.write(sheet_iterator, 27, 'Info not available')
11193 kshitij.so 1119
        else:
11790 kshitij.so 1120
            sheet.write(sheet_iterator, 27, getNetAvailability(inventoryMap.get(mpHistory.item_id)))
1121
        sheet.write(sheet_iterator, 28, getOosString((itemSaleMap.get(mpHistory.item_id))[1]))
1122
        sheet.write(sheet_iterator, 29, (itemSaleMap.get(mpHistory.item_id))[3])
1123
        sheet.write(sheet_iterator, 30, mpHistory.ourNlc)
1124
        sheet.write(sheet_iterator, 31, mpHistory.lowestPossibleSp)
1125
        sheet.write(sheet_iterator, 32, mpHistory.lowestPossibleTp)
11615 kshitij.so 1126
        proposed_sp = mpHistory.lowestSellingPrice - max(10, mpHistory.lowestSellingPrice*0.001)
11193 kshitij.so 1127
        proposed_tp = getTargetTp(proposed_sp,mpItem)
11615 kshitij.so 1128
        target_nlc = proposed_tp - mpHistory.lowestPossibleTp + mpHistory.ourNlc
11790 kshitij.so 1129
        sheet.write(sheet_iterator, 33, proposed_sp)
1130
        sheet.write(sheet_iterator, 34, proposed_tp)
1131
        sheet.write(sheet_iterator, 35, target_nlc)
1132
        sheet.write(sheet_iterator, 36, getSalesPotential(mpHistory.lowestSellingPrice,mpHistory.ourNlc))
1133
        sheet.write(sheet_iterator, 37, mpHistory.totalSeller)
11193 kshitij.so 1134
        sheet_iterator+=1
11615 kshitij.so 1135
 
1136
    canCompeteItems[:] = []
1137
 
11193 kshitij.so 1138
 
1139
    sheet = wbk.add_sheet('Pref and Cheap')
1140
 
1141
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1142
 
1143
    excel_integer_format = '0'
1144
    integer_style = xlwt.XFStyle()
1145
    integer_style.num_format_str = excel_integer_format
1146
    xstr = lambda s: s or ""
1147
 
1148
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1149
 
1150
    excel_integer_format = '0'
1151
    integer_style = xlwt.XFStyle()
1152
    integer_style.num_format_str = excel_integer_format
1153
 
1154
    sheet.write(0, 0, "Item ID", heading_xf)
1155
    sheet.write(0, 1, "Category", heading_xf)
1156
    sheet.write(0, 2, "Product Group.", heading_xf)
1157
    sheet.write(0, 3, "FK Serial Number", heading_xf)
1158
    sheet.write(0, 4, "Brand", heading_xf)
1159
    sheet.write(0, 5, "Product Name", heading_xf)
1160
    sheet.write(0, 6, "Weight", heading_xf)
1161
    sheet.write(0, 7, "Courier Cost", heading_xf)
1162
    sheet.write(0, 8, "Risky", heading_xf)
11790 kshitij.so 1163
    sheet.write(0, 9, "Commission Rate", heading_xf)
1164
    sheet.write(0, 10, "Return Provision", heading_xf)
1165
    sheet.write(0, 11, "Our Rating", heading_xf)
1166
    sheet.write(0, 12, "Our Shipping Time", heading_xf)
1167
    sheet.write(0, 13, "Our Rank", heading_xf)
1168
    sheet.write(0, 14, "Our SP", heading_xf)
1169
    sheet.write(0, 15, "Our TP", heading_xf)
1170
    sheet.write(0, 16, "Lowest Seller", heading_xf)
1171
    sheet.write(0, 17, "Lowest Seller Rating", heading_xf)
1172
    sheet.write(0, 18, "Lowest Seller Shipping Time", heading_xf)
1173
    sheet.write(0, 19, "Lowest Seller SP", heading_xf)
1174
    sheet.write(0, 20, "Lowest Seller TP", heading_xf)
1175
    sheet.write(0, 21, "Second Lowest Seller", heading_xf)
1176
    sheet.write(0, 22, "Second Lowest Seller Rating", heading_xf)
1177
    sheet.write(0, 23, "Second Lowest Seller Shipping Time", heading_xf)
1178
    sheet.write(0, 24, "Second Lowest Seller SP", heading_xf)
1179
    sheet.write(0, 25, "Second Lowest Seller TP", heading_xf)
1180
    sheet.write(0, 26, "Our Flipkart Inventory", heading_xf)
1181
    sheet.write(0, 27, "Our Net Availability",heading_xf)
1182
    sheet.write(0, 28, "Last Five Day Sale", heading_xf)
1183
    sheet.write(0, 29, "Average Sale", heading_xf)
1184
    sheet.write(0, 30, "Our NLC", heading_xf)
1185
    sheet.write(0, 31, "Lowest Possible SP", heading_xf)
1186
    sheet.write(0, 32, "Lowest Possible TP", heading_xf)
1187
    sheet.write(0, 33, "Target SP", heading_xf)
1188
    sheet.write(0, 34, "Target TP", heading_xf)  
1189
    sheet.write(0, 35, "Margin Increased Potential", heading_xf)
1190
    sheet.write(0, 36, "Total Seller", heading_xf)
1191
    sheet.write(0, 37, "Auto Pricing Decision", heading_xf)
1192
    sheet.write(0, 38, "Reason", heading_xf)
1193
    sheet.write(0, 39, "Updated Price", heading_xf)
11193 kshitij.so 1194
    sheet_iterator = 1
11615 kshitij.so 1195
 
11622 kshitij.so 1196
    buyBoxItems = session.query(MarketPlaceHistory,FlipkartItem,MarketplaceItems,Item)\
1197
    .join((FlipkartItem,MarketPlaceHistory.item_id==FlipkartItem.item_id))\
1198
    .join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
1199
    .join((Item,MarketPlaceHistory.item_id==Item.id))\
11615 kshitij.so 1200
    .filter(MarketplaceItems.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.source==OrderSource.FLIPKART)\
1201
    .filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.BUY_BOX).all()
1202
 
1203
 
11193 kshitij.so 1204
    for item in buyBoxItems:
11615 kshitij.so 1205
        mpHistory = item[0]
1206
        flipkartItem = item[1]
1207
        mpItem = item[2]
1208
        catItem = item[3]
1209
        sheet.write(sheet_iterator,0,mpHistory.item_id)
1210
        sheet.write(sheet_iterator,1,categoryMap.get(catItem.category)[0])
1211
        sheet.write(sheet_iterator,2,categoryMap.get(catItem.category)[1])
1212
        sheet.write(sheet_iterator,3,flipkartItem.flipkartSerialNumber)
1213
        sheet.write(sheet_iterator,4,catItem.brand)
1214
        sheet.write(sheet_iterator,5,xstr(catItem.brand)+" "+xstr(catItem.model_name)+" "+xstr(catItem.model_number)+" "+xstr(catItem.color))
1215
        sheet.write(sheet_iterator,6,catItem.weight)
1216
        sheet.write(sheet_iterator,7,mpItem.courierCost)
1217
        sheet.write(sheet_iterator,8,catItem.risky)
11790 kshitij.so 1218
        sheet.write(sheet_iterator,9,mpItem.commission)
1219
        sheet.write(sheet_iterator,10,mpItem.returnProvision)
1220
        sheet.write(sheet_iterator,11,mpHistory.ourRating)
11615 kshitij.so 1221
#        ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
1222
#        else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
11790 kshitij.so 1223
        sheet.write(sheet_iterator,12,mpHistory.ourShippingTime)
1224
        sheet.write(sheet_iterator,13,mpHistory.ourRank)
1225
        sheet.write(sheet_iterator,14,mpHistory.ourSellingPrice)
1226
        sheet.write(sheet_iterator,15,mpHistory.ourTp)
1227
        sheet.write(sheet_iterator,16,mpHistory.lowestSellerName)
1228
        sheet.write(sheet_iterator,17,mpHistory.lowestSellerRating)
11615 kshitij.so 1229
#        lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
1230
#        else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
11790 kshitij.so 1231
        sheet.write(sheet_iterator,18,mpHistory.lowestSellerShippingTime)
1232
        sheet.write(sheet_iterator,19,mpHistory.lowestSellingPrice)
1233
        sheet.write(sheet_iterator,20,mpHistory.lowestTp)
1234
        sheet.write(sheet_iterator,21,mpHistory.secondLowestSellerName)
1235
        sheet.write(sheet_iterator,22,mpHistory.secondLowestSellerRating)
11615 kshitij.so 1236
#        secondLowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitSecondLowestSeller) if flipkartDetails.shippingTimeUpperLimitSecondLowestSeller==0\
1237
#        else str(flipkartDetails.shippingTimeLowerLimitSecondLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitSecondLowestSeller)
11790 kshitij.so 1238
        sheet.write(sheet_iterator,23,mpHistory.secondLowestSellerShippingTime)
1239
        sheet.write(sheet_iterator,24,mpHistory.secondLowestSellingPrice)
1240
        sheet.write(sheet_iterator,25,mpHistory.secondLowestTp)
1241
        sheet.write(sheet_iterator,26,mpHistory.ourInventory)
11615 kshitij.so 1242
        if (not inventoryMap.has_key(mpHistory.item_id)):
11790 kshitij.so 1243
            sheet.write(sheet_iterator, 27, 'Info not available')
11193 kshitij.so 1244
        else:
11790 kshitij.so 1245
            sheet.write(sheet_iterator, 27, getNetAvailability(inventoryMap.get(mpHistory.item_id)))
1246
        sheet.write(sheet_iterator, 28, getOosString((itemSaleMap.get(mpHistory.item_id))[1]))
1247
        sheet.write(sheet_iterator, 29, (itemSaleMap.get(mpHistory.item_id))[3])
1248
        sheet.write(sheet_iterator, 30, mpHistory.ourNlc)
1249
        sheet.write(sheet_iterator, 31, mpHistory.lowestPossibleSp)
1250
        sheet.write(sheet_iterator, 32, mpHistory.lowestPossibleTp)
11615 kshitij.so 1251
        proposed_sp = max(mpHistory.secondLowestSellingPrice - max((20, mpHistory.secondLowestSellingPrice*0.002)), mpHistory.lowestPossibleSp)
11193 kshitij.so 1252
        proposed_tp = getTargetTp(proposed_sp,mpItem)
11615 kshitij.so 1253
        target_nlc = proposed_tp -  mpHistory.lowestPossibleTp + mpHistory.ourNlc
11790 kshitij.so 1254
        sheet.write(sheet_iterator, 33, proposed_sp)
1255
        sheet.write(sheet_iterator, 34, proposed_tp)
1256
        sheet.write(sheet_iterator, 35, proposed_tp -mpHistory.ourTp )
1257
        sheet.write(sheet_iterator, 36, mpHistory.totalSeller)
11775 kshitij.so 1258
        if mpHistory.decision is None:
11790 kshitij.so 1259
            sheet.write(sheet_iterator, 37, 'Auto Pricing Inactive')
11775 kshitij.so 1260
            sheet_iterator+=1
1261
            continue
11790 kshitij.so 1262
        sheet.write(sheet_iterator, 37, Decision._VALUES_TO_NAMES.get(mpHistory.decision))
1263
        sheet.write(sheet_iterator, 38, mpHistory.reason)
11776 kshitij.so 1264
        if Decision._VALUES_TO_NAMES.get(mpHistory.decision) == "AUTO_DECREMENT_SUCCESS":
11790 kshitij.so 1265
            sheet.write(sheet_iterator, 39, math.ceil(mpHistory.proposedSellingPrice))
11776 kshitij.so 1266
        if Decision._VALUES_TO_NAMES.get(mpHistory.decision) == "AUTO_INCREMENT_SUCCESS":
11790 kshitij.so 1267
            sheet.write(sheet_iterator, 39, math.ceil(mpHistory.ourSellingPrice+max(10,.01*mpHistory.ourSellingPrice)))
11776 kshitij.so 1268
 
11193 kshitij.so 1269
        sheet_iterator+=1
1270
 
11615 kshitij.so 1271
    buyBoxItems[:] = []
11193 kshitij.so 1272
 
11615 kshitij.so 1273
    sheet = wbk.add_sheet('Pref Not Cheap')
11193 kshitij.so 1274
 
1275
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1276
 
1277
    excel_integer_format = '0'
1278
    integer_style = xlwt.XFStyle()
1279
    integer_style.num_format_str = excel_integer_format
1280
    xstr = lambda s: s or ""
1281
 
1282
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1283
 
1284
    excel_integer_format = '0'
1285
    integer_style = xlwt.XFStyle()
1286
    integer_style.num_format_str = excel_integer_format
1287
 
1288
    sheet.write(0, 0, "Item ID", heading_xf)
1289
    sheet.write(0, 1, "Category", heading_xf)
1290
    sheet.write(0, 2, "Product Group.", heading_xf)
1291
    sheet.write(0, 3, "FK Serial Number", heading_xf)
1292
    sheet.write(0, 4, "Brand", heading_xf)
1293
    sheet.write(0, 5, "Product Name", heading_xf)
1294
    sheet.write(0, 6, "Weight", heading_xf)
1295
    sheet.write(0, 7, "Courier Cost", heading_xf)
1296
    sheet.write(0, 8, "Risky", heading_xf)
11790 kshitij.so 1297
    sheet.write(0, 9, "Commission Rate", heading_xf)
1298
    sheet.write(0, 10, "Return Provision", heading_xf)
1299
    sheet.write(0, 11, "Our Rating", heading_xf)
1300
    sheet.write(0, 12, "Our Shipping Time", heading_xf)
1301
    sheet.write(0, 13, "Our Rank", heading_xf)
1302
    sheet.write(0, 14, "Our SP", heading_xf)
1303
    sheet.write(0, 15, "Our TP", heading_xf)
1304
    sheet.write(0, 16, "Lowest Seller", heading_xf)
1305
    sheet.write(0, 17, "Lowest Seller Rating", heading_xf)
1306
    sheet.write(0, 18, "Lowest Seller Shipping Time", heading_xf)
1307
    sheet.write(0, 19, "Lowest Seller SP", heading_xf)
1308
    sheet.write(0, 20, "Lowest Seller TP", heading_xf)
1309
    sheet.write(0, 21, "Preffered Seller", heading_xf)
1310
    sheet.write(0, 22, "Preffered Seller Rating", heading_xf)
1311
    sheet.write(0, 23, "Preffered Seller Shipping Time", heading_xf)
1312
    sheet.write(0, 24, "Preffered Seller SP", heading_xf)
1313
    sheet.write(0, 25, "Preffered Seller TP", heading_xf)
1314
    sheet.write(0, 26, "Our Flipkart Inventory", heading_xf)
1315
    sheet.write(0, 27, "Our Net Availability",heading_xf)
1316
    sheet.write(0, 28, "Last Five Day Sale", heading_xf)
1317
    sheet.write(0, 29, "Average Sale", heading_xf)
1318
    sheet.write(0, 30, "Our NLC", heading_xf)
1319
    sheet.write(0, 31, "Lowest Possible SP", heading_xf)
1320
    sheet.write(0, 32, "Lowest Possible TP", heading_xf)
1321
    sheet.write(0, 33, "Target SP", heading_xf)
1322
    sheet.write(0, 34, "Target TP", heading_xf)  
1323
    sheet.write(0, 35, "Total Seller", heading_xf)
1324
    sheet.write(0, 36, "Auto Pricing Decision", heading_xf)
1325
    sheet.write(0, 37, "Reason", heading_xf)
1326
    sheet.write(0, 38, "Updated Price", heading_xf)
11775 kshitij.so 1327
 
11193 kshitij.so 1328
    sheet_iterator = 1
11615 kshitij.so 1329
 
11622 kshitij.so 1330
    prefNotCheapItems = session.query(MarketPlaceHistory,FlipkartItem,MarketplaceItems,Item)\
1331
    .join((FlipkartItem,MarketPlaceHistory.item_id==FlipkartItem.item_id))\
1332
    .join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
1333
    .join((Item,MarketPlaceHistory.item_id==Item.id))\
11615 kshitij.so 1334
    .filter(MarketplaceItems.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.source==OrderSource.FLIPKART)\
1335
    .filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.PREF_BUT_NOT_CHEAP).all()
1336
 
1337
 
1338
    for item in prefNotCheapItems:
1339
        mpHistory = item[0]
1340
        flipkartItem = item[1]
1341
        mpItem = item[2]
1342
        catItem = item[3]
1343
        sheet.write(sheet_iterator,0,mpHistory.item_id)
1344
        sheet.write(sheet_iterator,1,categoryMap.get(catItem.category)[0])
1345
        sheet.write(sheet_iterator,2,categoryMap.get(catItem.category)[1])
1346
        sheet.write(sheet_iterator,3,flipkartItem.flipkartSerialNumber)
1347
        sheet.write(sheet_iterator,4,catItem.brand)
1348
        sheet.write(sheet_iterator,5,xstr(catItem.brand)+" "+xstr(catItem.model_name)+" "+xstr(catItem.model_number)+" "+xstr(catItem.color))
1349
        sheet.write(sheet_iterator,6,catItem.weight)
1350
        sheet.write(sheet_iterator,7,mpItem.courierCost)
1351
        sheet.write(sheet_iterator,8,catItem.risky)
11790 kshitij.so 1352
        sheet.write(sheet_iterator,9,mpItem.commission)
1353
        sheet.write(sheet_iterator,10,mpItem.returnProvision)
1354
        sheet.write(sheet_iterator,11,mpHistory.ourRating)
11615 kshitij.so 1355
#        ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
1356
#        else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
11790 kshitij.so 1357
        sheet.write(sheet_iterator,12,mpHistory.ourShippingTime)
1358
        sheet.write(sheet_iterator,13,mpHistory.ourRank)
1359
        sheet.write(sheet_iterator,14,mpHistory.ourSellingPrice)
1360
        sheet.write(sheet_iterator,15,mpHistory.ourTp)
1361
        sheet.write(sheet_iterator,16,mpHistory.lowestSellerName)
1362
        sheet.write(sheet_iterator,17,mpHistory.lowestSellerRating)
11615 kshitij.so 1363
#        lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
1364
#        else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
11790 kshitij.so 1365
        sheet.write(sheet_iterator,18,mpHistory.lowestSellerShippingTime)
1366
        sheet.write(sheet_iterator,19,mpHistory.lowestSellingPrice)
1367
        sheet.write(sheet_iterator,20,mpHistory.lowestTp)
1368
        sheet.write(sheet_iterator,21,mpHistory.prefferedSellerName)
1369
        sheet.write(sheet_iterator,22,mpHistory.prefferedSellerRating)
11615 kshitij.so 1370
#        secondLowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitSecondLowestSeller) if flipkartDetails.shippingTimeUpperLimitSecondLowestSeller==0\
1371
#        else str(flipkartDetails.shippingTimeLowerLimitSecondLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitSecondLowestSeller)
11790 kshitij.so 1372
        sheet.write(sheet_iterator,23,mpHistory.prefferedSellerShippingTime)
1373
        sheet.write(sheet_iterator,24,mpHistory.prefferedSellerSellingPrice)
1374
        sheet.write(sheet_iterator,25,mpHistory.prefferedSellerTp)
1375
        sheet.write(sheet_iterator,26,mpHistory.ourInventory)
11615 kshitij.so 1376
        if (not inventoryMap.has_key(mpHistory.item_id)):
11790 kshitij.so 1377
            sheet.write(sheet_iterator, 27, 'Info not available')
11193 kshitij.so 1378
        else:
11790 kshitij.so 1379
            sheet.write(sheet_iterator, 27, getNetAvailability(inventoryMap.get(mpHistory.item_id)))
1380
        sheet.write(sheet_iterator, 28, getOosString((itemSaleMap.get(mpHistory.item_id))[1]))
1381
        sheet.write(sheet_iterator, 29, (itemSaleMap.get(mpHistory.item_id))[3])
1382
        sheet.write(sheet_iterator, 30, mpHistory.ourNlc)
1383
        sheet.write(sheet_iterator, 31, mpHistory.lowestPossibleSp)
1384
        sheet.write(sheet_iterator, 32, mpHistory.lowestPossibleTp)
11775 kshitij.so 1385
        proposed_sp = max(mpHistory.lowestSellingPrice - max((10, mpHistory.lowestSellingPrice*0.001)), mpHistory.lowestPossibleSp)
11615 kshitij.so 1386
        proposed_tp = getTargetTp(proposed_sp,mpItem)
1387
        target_nlc = proposed_tp -  mpHistory.lowestPossibleTp + mpHistory.ourNlc
11790 kshitij.so 1388
        sheet.write(sheet_iterator, 33, proposed_sp)
1389
        sheet.write(sheet_iterator, 34, proposed_tp)
1390
        sheet.write(sheet_iterator, 35, mpHistory.totalSeller)
11775 kshitij.so 1391
        if mpHistory.decision is None:
11790 kshitij.so 1392
            sheet.write(sheet_iterator, 36, 'Auto Pricing Inactive')
11775 kshitij.so 1393
            sheet_iterator+=1
1394
            continue
11790 kshitij.so 1395
        sheet.write(sheet_iterator, 36, Decision._VALUES_TO_NAMES.get(mpHistory.decision))
1396
        sheet.write(sheet_iterator, 37, mpHistory.reason)
11776 kshitij.so 1397
        if Decision._VALUES_TO_NAMES.get(mpHistory.decision) == "AUTO_DECREMENT_SUCCESS":
11790 kshitij.so 1398
            sheet.write(sheet_iterator, 38, math.ceil(mpHistory.proposedSellingPrice))
11776 kshitij.so 1399
        if Decision._VALUES_TO_NAMES.get(mpHistory.decision) == "AUTO_INCREMENT_SUCCESS":
11790 kshitij.so 1400
            sheet.write(sheet_iterator, 38, math.ceil(mpHistory.ourSellingPrice+max(10,.01*mpHistory.ourSellingPrice)))
11775 kshitij.so 1401
 
11193 kshitij.so 1402
        sheet_iterator+=1
11615 kshitij.so 1403
 
1404
    prefNotCheapItems[:] = []
11193 kshitij.so 1405
 
1406
    sheet = wbk.add_sheet('Cheap But Not Pref')
1407
 
1408
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1409
 
1410
    excel_integer_format = '0'
1411
    integer_style = xlwt.XFStyle()
1412
    integer_style.num_format_str = excel_integer_format
1413
    xstr = lambda s: s or ""
1414
 
1415
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1416
 
1417
    excel_integer_format = '0'
1418
    integer_style = xlwt.XFStyle()
1419
    integer_style.num_format_str = excel_integer_format
1420
 
1421
    sheet.write(0, 0, "Item ID", heading_xf)
1422
    sheet.write(0, 1, "Category", heading_xf)
1423
    sheet.write(0, 2, "Product Group.", heading_xf)
1424
    sheet.write(0, 3, "FK Serial Number", heading_xf)
1425
    sheet.write(0, 4, "Brand", heading_xf)
1426
    sheet.write(0, 5, "Product Name", heading_xf)
1427
    sheet.write(0, 6, "Weight", heading_xf)
1428
    sheet.write(0, 7, "Courier Cost", heading_xf)
1429
    sheet.write(0, 8, "Risky", heading_xf)
11790 kshitij.so 1430
    sheet.write(0, 9, "Commission Rate", heading_xf)
1431
    sheet.write(0, 10, "Return Provision", heading_xf)
1432
    sheet.write(0, 11, "Our Rank", heading_xf)
1433
    sheet.write(0, 12, "Lowest Seller", heading_xf)
1434
    sheet.write(0, 13, "Our Rating", heading_xf)
1435
    sheet.write(0, 14, "Our Shipping Time", heading_xf)
1436
    sheet.write(0, 15, "Our SP", heading_xf)
1437
    sheet.write(0, 16, "Our TP", heading_xf)
1438
    sheet.write(0, 17, "Preffered Seller", heading_xf)
1439
    sheet.write(0, 18, "Preffered Seller Rating", heading_xf)
1440
    sheet.write(0, 19, "Preffered Seller Shipping Time", heading_xf)
1441
    sheet.write(0, 20, "Preffered Seller SP", heading_xf)
1442
    sheet.write(0, 21, "Preffered Seller TP", heading_xf)
1443
    sheet.write(0, 22, "Our Flipkart Inventory", heading_xf)
1444
    sheet.write(0, 23, "Our Net Availability",heading_xf)
1445
    sheet.write(0, 24, "Last Five Day Sale", heading_xf)
1446
    sheet.write(0, 25, "Average Sale", heading_xf)
1447
    sheet.write(0, 26, "Our NLC", heading_xf)
1448
    sheet.write(0, 27, "Lowest Possible SP", heading_xf)
1449
    sheet.write(0, 28, "Lowest Possible TP", heading_xf)
1450
    sheet.write(0, 29, "Total Seller", heading_xf)
11193 kshitij.so 1451
    sheet_iterator = 1
11615 kshitij.so 1452
 
11622 kshitij.so 1453
    cheapNotPrefferedItems = session.query(MarketPlaceHistory,FlipkartItem,MarketplaceItems,Item)\
1454
    .join((FlipkartItem,MarketPlaceHistory.item_id==FlipkartItem.item_id))\
1455
    .join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
1456
    .join((Item,MarketPlaceHistory.item_id==Item.id))\
11615 kshitij.so 1457
    .filter(MarketplaceItems.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.source==OrderSource.FLIPKART)\
1458
    .filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.CHEAP_BUT_NOT_PREF).all()
1459
 
1460
    for item in cheapNotPrefferedItems:
1461
        mpHistory = item[0]
1462
        flipkartItem = item[1]
1463
        mpItem = item[2]
1464
        catItem = item[3]
1465
        sheet.write(sheet_iterator,0,mpHistory.item_id)
1466
        sheet.write(sheet_iterator,1,categoryMap.get(catItem.category)[0])
1467
        sheet.write(sheet_iterator,2,categoryMap.get(catItem.category)[1])
1468
        sheet.write(sheet_iterator,3,flipkartItem.flipkartSerialNumber)
1469
        sheet.write(sheet_iterator,4,catItem.brand)
1470
        sheet.write(sheet_iterator,5,xstr(catItem.brand)+" "+xstr(catItem.model_name)+" "+xstr(catItem.model_number)+" "+xstr(catItem.color))
1471
        sheet.write(sheet_iterator,6,catItem.weight)
1472
        sheet.write(sheet_iterator,7,mpItem.courierCost)
1473
        sheet.write(sheet_iterator,8,catItem.risky)
11790 kshitij.so 1474
        sheet.write(sheet_iterator,9,mpItem.commission)
1475
        sheet.write(sheet_iterator,10,mpItem.returnProvision)
1476
        sheet.write(sheet_iterator,11,mpHistory.ourRank)
1477
        sheet.write(sheet_iterator,12,mpHistory.lowestSellerName)
1478
        sheet.write(sheet_iterator,13,mpHistory.ourRating)
11615 kshitij.so 1479
#        ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
1480
#        else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
11790 kshitij.so 1481
        sheet.write(sheet_iterator,14,mpHistory.lowestSellerShippingTime)
1482
        sheet.write(sheet_iterator,15,mpHistory.lowestSellingPrice)
1483
        sheet.write(sheet_iterator,16,mpHistory.lowestTp)
1484
        sheet.write(sheet_iterator,17,mpHistory.prefferedSellerName)
1485
        sheet.write(sheet_iterator,18,mpHistory.prefferedSellerRating)
11615 kshitij.so 1486
#        prefferedSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitPrefSeller) if flipkartDetails.shippingTimeUpperLimitPrefSeller==0\
1487
#        else str(flipkartDetails.shippingTimeLowerLimitPrefSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitPrefSeller)
11790 kshitij.so 1488
        sheet.write(sheet_iterator,19,mpHistory.prefferedSellerShippingTime)
1489
        sheet.write(sheet_iterator,20,mpHistory.prefferedSellerSellingPrice)
1490
        sheet.write(sheet_iterator,21,mpHistory.prefferedSellerTp)
1491
        sheet.write(sheet_iterator,22,mpHistory.ourInventory)
11615 kshitij.so 1492
        if (not inventoryMap.has_key(mpHistory.item_id)):
11790 kshitij.so 1493
            sheet.write(sheet_iterator, 23, 'Info not available')
11193 kshitij.so 1494
        else:
11790 kshitij.so 1495
            sheet.write(sheet_iterator, 23, getNetAvailability(inventoryMap.get(mpHistory.item_id)))
1496
        sheet.write(sheet_iterator, 24, getOosString((itemSaleMap.get(mpHistory.item_id))[1]))
1497
        sheet.write(sheet_iterator, 25, (itemSaleMap.get(mpHistory.item_id))[3])
1498
        sheet.write(sheet_iterator, 26, mpHistory.ourNlc)
1499
        sheet.write(sheet_iterator, 27, mpHistory.lowestPossibleSp)
1500
        sheet.write(sheet_iterator, 28, mpHistory.lowestPossibleTp)
11193 kshitij.so 1501
        #proposed_sp = max(flipkartDetails.secondLowestSellerSp - max((20, flipkartDetails.secondLowestSellerSp*0.002)), flipkartPricing.lowestPossibleSp)
1502
        #proposed_tp = getTargetTp(proposed_sp,mpItem)
1503
        #target_nlc = proposed_tp - flipkartPricing.lowestPossibleTp + flipkartItemInfo.nlc
11790 kshitij.so 1504
        sheet.write(sheet_iterator, 29, mpHistory.totalSeller)
11193 kshitij.so 1505
        sheet_iterator+=1
11615 kshitij.so 1506
 
1507
    cheapNotPrefferedItems[:]=[]
11193 kshitij.so 1508
 
1509
    sheet = wbk.add_sheet('Can Compete-With Inventory')
1510
    xstr = lambda s: s or ""
1511
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1512
 
1513
    excel_integer_format = '0'
1514
    integer_style = xlwt.XFStyle()
1515
    integer_style.num_format_str = excel_integer_format
1516
 
1517
    sheet.write(0, 0, "Item ID", heading_xf)
1518
    sheet.write(0, 1, "Category", heading_xf)
1519
    sheet.write(0, 2, "Product Group.", heading_xf)
1520
    sheet.write(0, 3, "FK Serial Number", heading_xf)
1521
    sheet.write(0, 4, "Brand", heading_xf)
1522
    sheet.write(0, 5, "Product Name", heading_xf)
1523
    sheet.write(0, 6, "Weight", heading_xf)
1524
    sheet.write(0, 7, "Courier Cost", heading_xf)
1525
    sheet.write(0, 8, "Risky", heading_xf)
11790 kshitij.so 1526
    sheet.write(0, 9, "Commission Rate", heading_xf)
1527
    sheet.write(0, 10, "Return Provision", heading_xf)
1528
    sheet.write(0, 11, "Our Rating", heading_xf)
1529
    sheet.write(0, 12, "Our Shipping Time", heading_xf)
1530
    sheet.write(0, 13, "Our Rank", heading_xf)
1531
    sheet.write(0, 14, "Our SP", heading_xf)
1532
    sheet.write(0, 15, "Our TP", heading_xf)
1533
    sheet.write(0, 16, "Lowest Seller", heading_xf)
1534
    sheet.write(0, 17, "Lowest Seller Rating", heading_xf)
1535
    sheet.write(0, 18, "Lowest Seller Shipping Time", heading_xf)
1536
    sheet.write(0, 19, "Lowest Seller SP", heading_xf)
1537
    sheet.write(0, 20, "Lowest Seller TP", heading_xf)
1538
    sheet.write(0, 21, "Preffered Seller", heading_xf)
1539
    sheet.write(0, 22, "Preffered Seller Rating", heading_xf)
1540
    sheet.write(0, 23, "Preffered Seller Shipping Time", heading_xf)
1541
    sheet.write(0, 24, "Preffer Seller SP", heading_xf)
1542
    sheet.write(0, 25, "Preffered Seller TP", heading_xf)
1543
    sheet.write(0, 26, "Our Flipkart Inventory", heading_xf)
1544
    sheet.write(0, 27, "Our Net Availability",heading_xf)
1545
    sheet.write(0, 28, "Last Five Day Sale", heading_xf)
1546
    sheet.write(0, 29, "Average Sale", heading_xf)
1547
    sheet.write(0, 30, "Our NLC", heading_xf)
1548
    sheet.write(0, 31, "Lowest Possible SP", heading_xf)
1549
    sheet.write(0, 32, "Lowest Possible TP", heading_xf)
1550
    sheet.write(0, 33, "Target SP", heading_xf)
1551
    sheet.write(0, 34, "Target TP", heading_xf)  
1552
    sheet.write(0, 35, "Target NLC", heading_xf)
1553
    sheet.write(0, 36, "Sales Potential", heading_xf)
1554
    sheet.write(0, 37, "Total Seller", heading_xf)
1555
    sheet.write(0, 38, "Auto Pricing Decision", heading_xf)
1556
    sheet.write(0, 39, "Reason", heading_xf)
1557
    sheet.write(0, 40, "Updated Price", heading_xf)
11193 kshitij.so 1558
    sheet_iterator = 1
11615 kshitij.so 1559
 
11622 kshitij.so 1560
    competitiveItems = session.query(MarketPlaceHistory,FlipkartItem,MarketplaceItems,Item)\
1561
    .join((FlipkartItem,MarketPlaceHistory.item_id==FlipkartItem.item_id))\
1562
    .join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
1563
    .join((Item,MarketPlaceHistory.item_id==Item.id))\
11615 kshitij.so 1564
    .filter(MarketplaceItems.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.source==OrderSource.FLIPKART)\
1565
    .filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.COMPETITIVE).all()
1566
 
1567
    for item in competitiveItems:
1568
        mpHistory = item[0]
1569
        flipkartItem = item[1]
1570
        mpItem = item[2]
1571
        catItem = item[3]
1572
        sheet.write(sheet_iterator,0,mpHistory.item_id)
1573
        sheet.write(sheet_iterator,1,categoryMap.get(catItem.category)[0])
1574
        sheet.write(sheet_iterator,2,categoryMap.get(catItem.category)[1])
1575
        sheet.write(sheet_iterator,3,flipkartItem.flipkartSerialNumber)
1576
        sheet.write(sheet_iterator,4,catItem.brand)
1577
        sheet.write(sheet_iterator,5,xstr(catItem.brand)+" "+xstr(catItem.model_name)+" "+xstr(catItem.model_number)+" "+xstr(catItem.color))
1578
        sheet.write(sheet_iterator,6,catItem.weight)
1579
        sheet.write(sheet_iterator,7,mpItem.courierCost)
1580
        sheet.write(sheet_iterator,8,catItem.risky)
11790 kshitij.so 1581
        sheet.write(sheet_iterator,9,mpItem.commission)
1582
        sheet.write(sheet_iterator,10,mpItem.returnProvision)
1583
        sheet.write(sheet_iterator,11,mpHistory.ourRating)
11615 kshitij.so 1584
#        ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
1585
#        else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
11790 kshitij.so 1586
        sheet.write(sheet_iterator,12,mpHistory.ourShippingTime)
1587
        sheet.write(sheet_iterator,13,mpHistory.ourRank)
1588
        sheet.write(sheet_iterator,14,mpHistory.ourSellingPrice)
1589
        sheet.write(sheet_iterator,15,mpHistory.ourTp)
1590
        sheet.write(sheet_iterator,16,mpHistory.lowestSellerName)
1591
        sheet.write(sheet_iterator,17,mpHistory.lowestSellerRating)
11615 kshitij.so 1592
#        lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
1593
#        else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
11790 kshitij.so 1594
        sheet.write(sheet_iterator,18,mpHistory.lowestSellerShippingTime)
1595
        sheet.write(sheet_iterator,19,mpHistory.lowestSellingPrice)
1596
        sheet.write(sheet_iterator,20,mpHistory.lowestTp)
1597
        sheet.write(sheet_iterator,21,mpHistory.prefferedSellerName)
1598
        sheet.write(sheet_iterator,22,mpHistory.prefferedSellerRating)
11615 kshitij.so 1599
#        prefferedSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitPrefSeller) if flipkartDetails.shippingTimeUpperLimitPrefSeller==0\
1600
#        else str(flipkartDetails.shippingTimeLowerLimitPrefSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitPrefSeller)
11790 kshitij.so 1601
        sheet.write(sheet_iterator,23,mpHistory.prefferedSellerShippingTime)
1602
        sheet.write(sheet_iterator,24,mpHistory.prefferedSellerSellingPrice)
1603
        sheet.write(sheet_iterator,25,mpHistory.prefferedSellerTp)
1604
        sheet.write(sheet_iterator,26,mpHistory.ourInventory)
11615 kshitij.so 1605
        if (not inventoryMap.has_key(mpHistory.item_id)):
11790 kshitij.so 1606
            sheet.write(sheet_iterator, 27, 'Info not available')
11193 kshitij.so 1607
        else:
11790 kshitij.so 1608
            sheet.write(sheet_iterator, 27, getNetAvailability(inventoryMap.get(mpHistory.item_id)))
1609
        sheet.write(sheet_iterator, 28, getOosString((itemSaleMap.get(mpHistory.item_id))[1]))
1610
        sheet.write(sheet_iterator, 29, (itemSaleMap.get(mpHistory.item_id))[3])
1611
        sheet.write(sheet_iterator, 30, mpHistory.ourNlc)
1612
        sheet.write(sheet_iterator, 31, mpHistory.lowestPossibleSp)
1613
        sheet.write(sheet_iterator, 32, mpHistory.lowestPossibleTp)
11775 kshitij.so 1614
        proposed_sp = max(mpHistory.lowestSellingPrice - max((10, mpHistory.lowestSellingPrice*0.001)), mpHistory.lowestPossibleSp)
11193 kshitij.so 1615
        proposed_tp = getTargetTp(proposed_sp,mpItem)
11615 kshitij.so 1616
        target_nlc = proposed_tp - mpHistory.lowestPossibleTp + mpHistory.ourNlc
11790 kshitij.so 1617
        sheet.write(sheet_iterator, 33, proposed_sp)
1618
        sheet.write(sheet_iterator, 34, proposed_tp)
1619
        sheet.write(sheet_iterator, 35, target_nlc)
1620
        sheet.write(sheet_iterator, 36, getSalesPotential(mpHistory.lowestSellingPrice,mpHistory.ourNlc))
1621
        sheet.write(sheet_iterator, 37, mpHistory.totalSeller)
11775 kshitij.so 1622
        if mpHistory.decision is None:
11790 kshitij.so 1623
            sheet.write(sheet_iterator, 38, 'Auto Pricing Inactive')
11775 kshitij.so 1624
            sheet_iterator+=1
1625
            continue
11790 kshitij.so 1626
        sheet.write(sheet_iterator, 38, Decision._VALUES_TO_NAMES.get(mpHistory.decision))
1627
        sheet.write(sheet_iterator, 39, mpHistory.reason)
11776 kshitij.so 1628
        if Decision._VALUES_TO_NAMES.get(mpHistory.decision) == "AUTO_DECREMENT_SUCCESS":
11790 kshitij.so 1629
            sheet.write(sheet_iterator, 40, math.ceil(mpHistory.proposedSellingPrice))
11776 kshitij.so 1630
        if Decision._VALUES_TO_NAMES.get(mpHistory.decision) == "AUTO_INCREMENT_SUCCESS":
11790 kshitij.so 1631
            sheet.write(sheet_iterator, 40, math.ceil(mpHistory.ourSellingPrice+max(10,.01*mpHistory.ourSellingPrice)))
11775 kshitij.so 1632
 
11193 kshitij.so 1633
        sheet_iterator+=1
11615 kshitij.so 1634
 
1635
    competitiveItems[:]=[]
1636
 
11193 kshitij.so 1637
    sheet = wbk.add_sheet('Negative Margin')
1638
    xstr = lambda s: s or ""
1639
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1640
 
1641
    excel_integer_format = '0'
1642
    integer_style = xlwt.XFStyle()
1643
    integer_style.num_format_str = excel_integer_format
1644
 
1645
    sheet.write(0, 0, "Item ID", heading_xf)
1646
    sheet.write(0, 1, "Category", heading_xf)
1647
    sheet.write(0, 2, "Product Group.", heading_xf)
1648
    sheet.write(0, 3, "FK Serial Number", heading_xf)
1649
    sheet.write(0, 4, "Brand", heading_xf)
1650
    sheet.write(0, 5, "Product Name", heading_xf)
1651
    sheet.write(0, 6, "Weight", heading_xf)
1652
    sheet.write(0, 7, "Courier Cost", heading_xf)
1653
    sheet.write(0, 8, "Risky", heading_xf)
11790 kshitij.so 1654
    sheet.write(0, 9, "Commission Rate", heading_xf)
1655
    sheet.write(0, 10, "Return Provision", heading_xf)
1656
    sheet.write(0, 11, "Our Rating", heading_xf)
1657
    sheet.write(0, 12, "Our Shipping Time", heading_xf)
1658
    sheet.write(0, 13, "Our Rank", heading_xf)
1659
    sheet.write(0, 14, "Our SP", heading_xf)
1660
    sheet.write(0, 15, "Our TP", heading_xf)
1661
    sheet.write(0, 16, "Lowest Seller", heading_xf)
1662
    sheet.write(0, 17, "Lowest Seller Rating", heading_xf)
1663
    sheet.write(0, 18, "Lowest Seller Shipping Time", heading_xf)
1664
    sheet.write(0, 19, "Lowest Seller SP", heading_xf)
1665
    sheet.write(0, 20, "Lowest Seller TP", heading_xf)
1666
    sheet.write(0, 21, "Preffered Seller", heading_xf)
1667
    sheet.write(0, 22, "Preffered Seller Rating", heading_xf)
1668
    sheet.write(0, 23, "Preffered Seller Shipping Time", heading_xf)
1669
    sheet.write(0, 24, "Preffer Seller SP", heading_xf)
1670
    sheet.write(0, 25, "Preffered Seller TP", heading_xf)
1671
    sheet.write(0, 26, "Our Flipkart Inventory", heading_xf)
1672
    sheet.write(0, 27, "Our Net Availability",heading_xf)
1673
    sheet.write(0, 28, "Last Five Day Sale", heading_xf)
1674
    sheet.write(0, 29, "Average Sale", heading_xf)
1675
    sheet.write(0, 30, "Our NLC", heading_xf)
1676
    sheet.write(0, 31, "Lowest Possible SP", heading_xf)
1677
    sheet.write(0, 32, "Lowest Possible TP", heading_xf)
1678
    sheet.write(0, 33, "Margin", heading_xf)
1679
    sheet.write(0, 34, "Total Seller", heading_xf)
11193 kshitij.so 1680
    sheet_iterator = 1
11615 kshitij.so 1681
 
11622 kshitij.so 1682
    negativeMargin = session.query(MarketPlaceHistory,FlipkartItem,MarketplaceItems,Item)\
1683
    .join((FlipkartItem,MarketPlaceHistory.item_id==FlipkartItem.item_id))\
1684
    .join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
1685
    .join((Item,MarketPlaceHistory.item_id==Item.id))\
11615 kshitij.so 1686
    .filter(MarketplaceItems.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.source==OrderSource.FLIPKART)\
1687
    .filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.NEGATIVE_MARGIN).all()
1688
 
11193 kshitij.so 1689
    for item in negativeMargin:
11615 kshitij.so 1690
        mpHistory = item[0]
1691
        flipkartItem = item[1]
1692
        mpItem = item[2]
1693
        catItem = item[3]
1694
        sheet.write(sheet_iterator,0,mpHistory.item_id)
1695
        sheet.write(sheet_iterator,1,categoryMap.get(catItem.category)[0])
1696
        sheet.write(sheet_iterator,2,categoryMap.get(catItem.category)[1])
1697
        sheet.write(sheet_iterator,3,flipkartItem.flipkartSerialNumber)
1698
        sheet.write(sheet_iterator,4,catItem.brand)
1699
        sheet.write(sheet_iterator,5,xstr(catItem.brand)+" "+xstr(catItem.model_name)+" "+xstr(catItem.model_number)+" "+xstr(catItem.color))
1700
        sheet.write(sheet_iterator,6,catItem.weight)
1701
        sheet.write(sheet_iterator,7,mpItem.courierCost)
1702
        sheet.write(sheet_iterator,8,catItem.risky)
11790 kshitij.so 1703
        sheet.write(sheet_iterator,9,mpItem.commission)
1704
        sheet.write(sheet_iterator,10,mpItem.returnProvision)
1705
        sheet.write(sheet_iterator,11,mpHistory.ourRating)
11615 kshitij.so 1706
#        ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
1707
#        else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
11790 kshitij.so 1708
        sheet.write(sheet_iterator,12,mpHistory.ourShippingTime)
1709
        sheet.write(sheet_iterator,13,mpHistory.ourRank)
1710
        sheet.write(sheet_iterator,14,mpHistory.ourSellingPrice)
1711
        sheet.write(sheet_iterator,15,mpHistory.ourTp)
1712
        sheet.write(sheet_iterator,16,mpHistory.lowestSellerName)
1713
        sheet.write(sheet_iterator,17,mpHistory.lowestSellerRating)
11615 kshitij.so 1714
#        lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
1715
#        else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
11790 kshitij.so 1716
        sheet.write(sheet_iterator,18,mpHistory.lowestSellerShippingTime)
1717
        sheet.write(sheet_iterator,19,mpHistory.lowestSellingPrice)
1718
        sheet.write(sheet_iterator,20,mpHistory.lowestTp)
1719
        sheet.write(sheet_iterator,21,mpHistory.prefferedSellerName)
1720
        sheet.write(sheet_iterator,22,mpHistory.prefferedSellerRating)
11615 kshitij.so 1721
#        prefferedSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitPrefSeller) if flipkartDetails.shippingTimeUpperLimitPrefSeller==0\
1722
#        else str(flipkartDetails.shippingTimeLowerLimitPrefSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitPrefSeller)
11790 kshitij.so 1723
        sheet.write(sheet_iterator,23,mpHistory.prefferedSellerShippingTime)
1724
        sheet.write(sheet_iterator,24,mpHistory.prefferedSellerSellingPrice)
1725
        sheet.write(sheet_iterator,25,mpHistory.prefferedSellerTp)
1726
        sheet.write(sheet_iterator,26,mpHistory.ourInventory)
11615 kshitij.so 1727
        if (not inventoryMap.has_key(mpHistory.item_id)):
11790 kshitij.so 1728
            sheet.write(sheet_iterator, 27, 'Info not available')
11193 kshitij.so 1729
        else:
11790 kshitij.so 1730
            sheet.write(sheet_iterator, 27, getNetAvailability(inventoryMap.get(mpHistory.item_id)))
1731
        sheet.write(sheet_iterator, 28, getOosString((itemSaleMap.get(mpHistory.item_id))[1]))
1732
        sheet.write(sheet_iterator, 29, (itemSaleMap.get(mpHistory.item_id))[3])
1733
        sheet.write(sheet_iterator, 30, mpHistory.ourNlc)
1734
        sheet.write(sheet_iterator, 31, mpHistory.lowestPossibleSp)
1735
        sheet.write(sheet_iterator, 32, mpHistory.lowestPossibleTp)
1736
        sheet.write(sheet_iterator, 33, round((mpHistory.ourTp - mpHistory.lowestPossibleTp),2))
1737
        sheet.write(sheet_iterator, 34, mpHistory.totalSeller)
11193 kshitij.so 1738
        sheet_iterator+=1
11615 kshitij.so 1739
 
1740
    negativeMargin[:]=[]
11193 kshitij.so 1741
 
1742
    if (runType=='FULL'):    
1743
        sheet = wbk.add_sheet('Auto Favorites')
1744
 
1745
        heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1746
 
1747
        excel_integer_format = '0'
1748
        integer_style = xlwt.XFStyle()
1749
        integer_style.num_format_str = excel_integer_format
1750
        xstr = lambda s: s or ""
1751
 
1752
        sheet.write(0, 0, "Item ID", heading_xf)
1753
        sheet.write(0, 1, "Brand", heading_xf)
1754
        sheet.write(0, 2, "Product Name", heading_xf)
1755
        sheet.write(0, 3, "Auto Favourite", heading_xf)
1756
        sheet.write(0, 4, "Reason", heading_xf)
1757
 
1758
        sheet_iterator=1
1759
        for autoFav in nowAutoFav:
1760
            itemId = autoFav[0]
1761
            reason = autoFav[1]
1762
            it = Item.query.filter_by(id=itemId).one()
1763
            sheet.write(sheet_iterator, 0, itemId)
1764
            sheet.write(sheet_iterator, 1, it.brand)
1765
            sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
1766
            sheet.write(sheet_iterator, 3, "True")
1767
            sheet.write(sheet_iterator, 4, reason)
1768
            sheet_iterator+=1
1769
        for prevFav in previousAutoFav:
1770
            it = Item.query.filter_by(id=prevFav).one()
1771
            sheet.write(sheet_iterator, 0, prevFav)
1772
            sheet.write(sheet_iterator, 1, it.brand)
1773
            sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
1774
            sheet.write(sheet_iterator, 3, "False")
1775
            sheet_iterator+=1
1776
 
1777
    sheet = wbk.add_sheet('Exception Item List')
1778
 
1779
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1780
 
1781
    excel_integer_format = '0'
1782
    integer_style = xlwt.XFStyle()
1783
    integer_style.num_format_str = excel_integer_format
1784
    xstr = lambda s: s or ""
1785
 
1786
    sheet.write(0, 0, "Item ID", heading_xf)
1787
    sheet.write(0, 1, "FK Serial number", heading_xf)
1788
    sheet.write(0, 2, "Brand", heading_xf)
1789
    sheet.write(0, 3, "Product Name", heading_xf)
1790
    sheet.write(0, 4, "Reason", heading_xf)
1791
    sheet_iterator=1
11615 kshitij.so 1792
 
11622 kshitij.so 1793
    exeptionItems = session.query(MarketPlaceHistory,FlipkartItem,MarketplaceItems,Item)\
1794
    .join((FlipkartItem,MarketPlaceHistory.item_id==FlipkartItem.item_id))\
1795
    .join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
1796
    .join((Item,MarketPlaceHistory.item_id==Item.id))\
11615 kshitij.so 1797
    .filter(MarketplaceItems.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.source==OrderSource.FLIPKART)\
1798
    .filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.EXCEPTION).all()
1799
 
1800
    for item in exeptionItems:
1801
        mpHistory = item[0]
1802
        flipkartItem = item[1]
1803
        mpItem = item[2]
1804
        catItem = item[3]
1805
        sheet.write(sheet_iterator, 0, mpHistory.item_id)
1806
        sheet.write(sheet_iterator, 1, flipkartItem.flipkartSerialNumber)
1807
        sheet.write(sheet_iterator, 2, catItem.brand)
1808
        sheet.write(sheet_iterator, 3, xstr(catItem.brand)+" "+xstr(catItem.model_name)+" "+xstr(catItem.model_number)+" "+xstr(catItem.color))
11193 kshitij.so 1809
        try:
11615 kshitij.so 1810
            if mpHistory.totalSeller is None:
11193 kshitij.so 1811
                pass
1812
        except:
1813
            sheet.write(sheet_iterator, 4, "Unable to fetch info from Flipkart")
1814
            sheet_iterator+=1
1815
            continue
1816
        sheet.write(sheet_iterator, 4, "No Seller Available")
1817
        sheet_iterator+=1
11615 kshitij.so 1818
 
1819
    exeptionItems[:]=[]
11193 kshitij.so 1820
 
1821
    sheet = wbk.add_sheet('Can Compete-No Inv')
1822
    xstr = lambda s: s or ""
1823
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1824
 
1825
    excel_integer_format = '0'
1826
    integer_style = xlwt.XFStyle()
1827
    integer_style.num_format_str = excel_integer_format
1828
 
1829
    sheet.write(0, 0, "Item ID", heading_xf)
1830
    sheet.write(0, 1, "Category", heading_xf)
1831
    sheet.write(0, 2, "Product Group.", heading_xf)
1832
    sheet.write(0, 3, "FK Serial Number", heading_xf)
1833
    sheet.write(0, 4, "Brand", heading_xf)
1834
    sheet.write(0, 5, "Product Name", heading_xf)
1835
    sheet.write(0, 6, "Weight", heading_xf)
1836
    sheet.write(0, 7, "Courier Cost", heading_xf)
1837
    sheet.write(0, 8, "Risky", heading_xf)
11790 kshitij.so 1838
    sheet.write(0, 9, "Commission Rate", heading_xf)
1839
    sheet.write(0, 10, "Return Provision", heading_xf)
1840
    sheet.write(0, 11, "Our Rating", heading_xf)
1841
    sheet.write(0, 12, "Our Shipping Time", heading_xf)
1842
    sheet.write(0, 13, "Our Rank", heading_xf)
1843
    sheet.write(0, 14, "Our SP", heading_xf)
1844
    sheet.write(0, 15, "Our TP", heading_xf)
1845
    sheet.write(0, 16, "Lowest Seller", heading_xf)
1846
    sheet.write(0, 17, "Lowest Seller Rating", heading_xf)
1847
    sheet.write(0, 18, "Lowest Seller Shipping Time", heading_xf)
1848
    sheet.write(0, 19, "Lowest Seller SP", heading_xf)
1849
    sheet.write(0, 20, "Lowest Seller TP", heading_xf)
1850
    sheet.write(0, 21, "Preffered Seller", heading_xf)
1851
    sheet.write(0, 22, "Preffered Seller Rating", heading_xf)
1852
    sheet.write(0, 23, "Preffered Seller Shipping Time", heading_xf)
1853
    sheet.write(0, 24, "Preffer Seller SP", heading_xf)
1854
    sheet.write(0, 25, "Preffered Seller TP", heading_xf)
1855
    sheet.write(0, 26, "Our Flipkart Inventory", heading_xf)
1856
    sheet.write(0, 27, "Our Net Availability",heading_xf)
1857
    sheet.write(0, 28, "Last Five Day Sale", heading_xf)
1858
    sheet.write(0, 29, "Average Sale", heading_xf)
1859
    sheet.write(0, 30, "Our NLC", heading_xf)
1860
    sheet.write(0, 31, "Lowest Possible SP", heading_xf)
1861
    sheet.write(0, 32, "Lowest Possible TP", heading_xf)
1862
    sheet.write(0, 33, "Target SP", heading_xf)
1863
    sheet.write(0, 34, "Target TP", heading_xf)  
1864
    sheet.write(0, 35, "Sales Potential", heading_xf)
1865
    sheet.write(0, 36, "Total Seller", heading_xf)
11193 kshitij.so 1866
    sheet_iterator = 1
11615 kshitij.so 1867
 
11622 kshitij.so 1868
    competitiveNoInventory = session.query(MarketPlaceHistory,FlipkartItem,MarketplaceItems,Item)\
1869
    .join((FlipkartItem,MarketPlaceHistory.item_id==FlipkartItem.item_id))\
1870
    .join((MarketplaceItems,MarketPlaceHistory.item_id==MarketplaceItems.itemId))\
1871
    .join((Item,MarketPlaceHistory.item_id==Item.id))\
11615 kshitij.so 1872
    .filter(MarketplaceItems.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.source==OrderSource.FLIPKART)\
1873
    .filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.COMPETITIVE_NO_INVENTORY).all()
1874
 
11193 kshitij.so 1875
    for item in competitiveNoInventory:
11615 kshitij.so 1876
        mpHistory = item[0]
1877
        flipkartItem = item[1]
1878
        mpItem = item[2]
1879
        catItem = item[3]
1880
        if ((not inventoryMap.has_key(mpHistory.item_id)) or getNetAvailability(inventoryMap.get(mpHistory.item_id))<=0):
1881
            sheet.write(sheet_iterator,0,mpHistory.item_id)
1882
            sheet.write(sheet_iterator,1,categoryMap.get(catItem.category)[0])
1883
            sheet.write(sheet_iterator,2,categoryMap.get(catItem.category)[1])
1884
            sheet.write(sheet_iterator,3,flipkartItem.flipkartSerialNumber)
1885
            sheet.write(sheet_iterator,4,catItem.brand)
1886
            sheet.write(sheet_iterator,5,xstr(catItem.brand)+" "+xstr(catItem.model_name)+" "+xstr(catItem.model_number)+" "+xstr(catItem.color))
1887
            sheet.write(sheet_iterator,6,catItem.weight)
1888
            sheet.write(sheet_iterator,7,mpItem.courierCost)
1889
            sheet.write(sheet_iterator,8,catItem.risky)
11790 kshitij.so 1890
            sheet.write(sheet_iterator,9,mpItem.commission)
1891
            sheet.write(sheet_iterator,10,mpItem.returnProvision)
1892
            sheet.write(sheet_iterator,11,mpHistory.ourRating)
11615 kshitij.so 1893
#            ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
1894
#            else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
11790 kshitij.so 1895
            sheet.write(sheet_iterator,12,mpHistory.ourShippingTime)
1896
            sheet.write(sheet_iterator,13,mpHistory.ourRank)
1897
            sheet.write(sheet_iterator,14,mpHistory.ourSellingPrice)
1898
            sheet.write(sheet_iterator,15,mpHistory.ourTp)
1899
            sheet.write(sheet_iterator,16,mpHistory.lowestSellerName)
1900
            sheet.write(sheet_iterator,17,mpHistory.lowestSellerRating)
11615 kshitij.so 1901
#            lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
1902
#            else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
11790 kshitij.so 1903
            sheet.write(sheet_iterator,18,mpHistory.lowestSellerShippingTime)
1904
            sheet.write(sheet_iterator,19,mpHistory.lowestSellingPrice)
1905
            sheet.write(sheet_iterator,20,mpHistory.lowestTp)
1906
            sheet.write(sheet_iterator,21,mpHistory.prefferedSellerName)
1907
            sheet.write(sheet_iterator,22,mpHistory.prefferedSellerRating)
11615 kshitij.so 1908
#            prefferedSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitPrefSeller) if flipkartDetails.shippingTimeUpperLimitPrefSeller==0\
1909
#            else str(flipkartDetails.shippingTimeLowerLimitPrefSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitPrefSeller)
11790 kshitij.so 1910
            sheet.write(sheet_iterator,23,mpHistory.prefferedSellerShippingTime)
1911
            sheet.write(sheet_iterator,24,mpHistory.prefferedSellerSellingPrice)
1912
            sheet.write(sheet_iterator,25,mpHistory.prefferedSellerTp)
1913
            sheet.write(sheet_iterator,26,mpHistory.ourInventory)
11615 kshitij.so 1914
            if (not inventoryMap.has_key(mpHistory.item_id)):
11790 kshitij.so 1915
                sheet.write(sheet_iterator, 27, 'Info not available')
11193 kshitij.so 1916
            else:
11790 kshitij.so 1917
                sheet.write(sheet_iterator, 27, getNetAvailability(inventoryMap.get(mpHistory.item_id)))
1918
            sheet.write(sheet_iterator, 28, getOosString((itemSaleMap.get(mpHistory.item_id))[1]))
1919
            sheet.write(sheet_iterator, 29, (itemSaleMap.get(mpHistory.item_id))[3])
1920
            sheet.write(sheet_iterator, 30, mpHistory.ourNlc)
1921
            sheet.write(sheet_iterator, 31, mpHistory.lowestPossibleSp)
1922
            sheet.write(sheet_iterator, 32, mpHistory.lowestPossibleTp)
11615 kshitij.so 1923
            proposed_sp = max(mpHistory.lowestSellingPrice - max((10, mpHistory.lowestSellingPrice*0.001)), mpHistory.lowestPossibleSp)
11193 kshitij.so 1924
            proposed_tp = getTargetTp(proposed_sp,mpItem)
11790 kshitij.so 1925
            sheet.write(sheet_iterator, 33, proposed_sp)
1926
            sheet.write(sheet_iterator, 34, proposed_tp)
1927
            sheet.write(sheet_iterator, 35, getSalesPotential(mpHistory.lowestPossibleSp,mpHistory.ourNlc))
1928
            sheet.write(sheet_iterator, 36, mpHistory.totalSeller)
11193 kshitij.so 1929
            sheet_iterator+=1
1930
 
11615 kshitij.so 1931
 
11193 kshitij.so 1932
    sheet = wbk.add_sheet('Can Compete-No Inv On FK')
1933
    xstr = lambda s: s or ""
1934
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1935
 
1936
    excel_integer_format = '0'
1937
    integer_style = xlwt.XFStyle()
1938
    integer_style.num_format_str = excel_integer_format
1939
 
1940
    sheet.write(0, 0, "Item ID", heading_xf)
1941
    sheet.write(0, 1, "Category", heading_xf)
1942
    sheet.write(0, 2, "Product Group.", heading_xf)
1943
    sheet.write(0, 3, "FK Serial Number", heading_xf)
1944
    sheet.write(0, 4, "Brand", heading_xf)
1945
    sheet.write(0, 5, "Product Name", heading_xf)
1946
    sheet.write(0, 6, "Weight", heading_xf)
1947
    sheet.write(0, 7, "Courier Cost", heading_xf)
1948
    sheet.write(0, 8, "Risky", heading_xf)
11790 kshitij.so 1949
    sheet.write(0, 9, "Commission Rate", heading_xf)
1950
    sheet.write(0, 10, "Return Provision", heading_xf)
1951
    sheet.write(0, 11, "Our Rating", heading_xf)
1952
    sheet.write(0, 12, "Our Shipping Time", heading_xf)
1953
    sheet.write(0, 13, "Our Rank", heading_xf)
1954
    sheet.write(0, 14, "Our SP", heading_xf)
1955
    sheet.write(0, 15, "Our TP", heading_xf)
1956
    sheet.write(0, 16, "Lowest Seller", heading_xf)
1957
    sheet.write(0, 17, "Lowest Seller Rating", heading_xf)
1958
    sheet.write(0, 18, "Lowest Seller Shipping Time", heading_xf)
1959
    sheet.write(0, 19, "Lowest Seller SP", heading_xf)
1960
    sheet.write(0, 20, "Lowest Seller TP", heading_xf)
1961
    sheet.write(0, 21, "Preffered Seller", heading_xf)
1962
    sheet.write(0, 22, "Preffered Seller Rating", heading_xf)
1963
    sheet.write(0, 23, "Preffered Seller Shipping Time", heading_xf)
1964
    sheet.write(0, 24, "Preffer Seller SP", heading_xf)
1965
    sheet.write(0, 25, "Preffered Seller TP", heading_xf)
1966
    sheet.write(0, 26, "Our Flipkart Inventory", heading_xf)
1967
    sheet.write(0, 27, "Our Net Availability",heading_xf)
1968
    sheet.write(0, 28, "Last Five Day Sale", heading_xf)
1969
    sheet.write(0, 29, "Average Sale", heading_xf)
1970
    sheet.write(0, 30, "Our NLC", heading_xf)
1971
    sheet.write(0, 31, "Lowest Possible SP", heading_xf)
1972
    sheet.write(0, 32, "Lowest Possible TP", heading_xf)
1973
    sheet.write(0, 33, "Target SP", heading_xf)
1974
    sheet.write(0, 34, "Target TP", heading_xf)  
1975
    sheet.write(0, 35, "Sales Potential", heading_xf)
1976
    sheet.write(0, 36, "Total Seller", heading_xf)
11193 kshitij.so 1977
    sheet_iterator = 1
1978
    for item in competitiveNoInventory:
11615 kshitij.so 1979
        mpHistory = item[0]
1980
        flipkartItem = item[1]
1981
        mpItem = item[2]
1982
        catItem = item[3]
1983
        if (inventoryMap.has_key(mpHistory.item_id) and getNetAvailability(inventoryMap.get(mpHistory.item_id))>0):
1984
            sheet.write(sheet_iterator,0,mpHistory.item_id)
1985
            sheet.write(sheet_iterator,1,categoryMap.get(catItem.category)[0])
1986
            sheet.write(sheet_iterator,2,categoryMap.get(catItem.category)[1])
1987
            sheet.write(sheet_iterator,3,flipkartItem.flipkartSerialNumber)
1988
            sheet.write(sheet_iterator,4,catItem.brand)
1989
            sheet.write(sheet_iterator,5,xstr(catItem.brand)+" "+xstr(catItem.model_name)+" "+xstr(catItem.model_number)+" "+xstr(catItem.color))
1990
            sheet.write(sheet_iterator,6,catItem.weight)
1991
            sheet.write(sheet_iterator,7,mpItem.courierCost)
1992
            sheet.write(sheet_iterator,8,catItem.risky)
11790 kshitij.so 1993
            sheet.write(sheet_iterator,9,mpItem.commission)
1994
            sheet.write(sheet_iterator,10,mpItem.returnProvision)
1995
            sheet.write(sheet_iterator,11,mpHistory.ourRating)
11615 kshitij.so 1996
#            ourShippingTime= str(flipkartDetails.shippingTimeLowerLimitOur) if flipkartDetails.shippingTimeUpperLimitOur==0\
1997
#            else str(flipkartDetails.shippingTimeLowerLimitOur)+'-'+str(flipkartDetails.shippingTimeUpperLimitOur)
11790 kshitij.so 1998
            sheet.write(sheet_iterator,12,mpHistory.ourShippingTime)
1999
            sheet.write(sheet_iterator,13,mpHistory.ourRank)
2000
            sheet.write(sheet_iterator,14,mpHistory.ourSellingPrice)
2001
            sheet.write(sheet_iterator,15,mpHistory.ourTp)
2002
            sheet.write(sheet_iterator,16,mpHistory.lowestSellerName)
2003
            sheet.write(sheet_iterator,17,mpHistory.lowestSellerRating)
11615 kshitij.so 2004
#            lowestSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitLowestSeller) if flipkartDetails.shippingTimeUpperLimitLowestSeller==0\
2005
#            else str(flipkartDetails.shippingTimeLowerLimitLowestSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitLowestSeller)
11790 kshitij.so 2006
            sheet.write(sheet_iterator,18,mpHistory.lowestSellerShippingTime)
2007
            sheet.write(sheet_iterator,19,mpHistory.lowestSellingPrice)
2008
            sheet.write(sheet_iterator,20,mpHistory.lowestTp)
2009
            sheet.write(sheet_iterator,21,mpHistory.prefferedSellerName)
2010
            sheet.write(sheet_iterator,22,mpHistory.prefferedSellerRating)
11615 kshitij.so 2011
#            prefferedSellerShippingTime= str(flipkartDetails.shippingTimeLowerLimitPrefSeller) if flipkartDetails.shippingTimeUpperLimitPrefSeller==0\
2012
#            else str(flipkartDetails.shippingTimeLowerLimitPrefSeller)+'-'+str(flipkartDetails.shippingTimeUpperLimitPrefSeller)
11790 kshitij.so 2013
            sheet.write(sheet_iterator,23,mpHistory.prefferedSellerShippingTime)
2014
            sheet.write(sheet_iterator,24,mpHistory.prefferedSellerSellingPrice)
2015
            sheet.write(sheet_iterator,25,mpHistory.prefferedSellerTp)
2016
            sheet.write(sheet_iterator,26,mpHistory.ourInventory)
11615 kshitij.so 2017
            if (not inventoryMap.has_key(mpHistory.item_id)):
11790 kshitij.so 2018
                sheet.write(sheet_iterator, 27, 'Info not available')
11193 kshitij.so 2019
            else:
11790 kshitij.so 2020
                sheet.write(sheet_iterator, 27, getNetAvailability(inventoryMap.get(mpHistory.item_id)))
2021
            sheet.write(sheet_iterator, 28, getOosString((itemSaleMap.get(mpHistory.item_id))[1]))
2022
            sheet.write(sheet_iterator, 29, (itemSaleMap.get(mpHistory.item_id))[3])
2023
            sheet.write(sheet_iterator, 30, mpHistory.ourNlc)
2024
            sheet.write(sheet_iterator, 31, mpHistory.lowestPossibleSp)
2025
            sheet.write(sheet_iterator, 32, mpHistory.lowestPossibleTp)
11615 kshitij.so 2026
            proposed_sp = max(mpHistory.lowestSellingPrice - max((10, mpHistory.lowestSellingPrice*0.001)), mpHistory.lowestPossibleSp)
11193 kshitij.so 2027
            proposed_tp = getTargetTp(proposed_sp,mpItem)
11790 kshitij.so 2028
            sheet.write(sheet_iterator, 33, proposed_sp)
2029
            sheet.write(sheet_iterator, 34, proposed_tp)
2030
            sheet.write(sheet_iterator, 35, getSalesPotential(mpHistory.lowestPossibleSp,mpHistory.ourNlc))
2031
            sheet.write(sheet_iterator, 36, mpHistory.totalSeller)
11193 kshitij.so 2032
            sheet_iterator+=1
11615 kshitij.so 2033
    competitiveNoInventory[:]=[]
11193 kshitij.so 2034
 
11775 kshitij.so 2035
#    autoPricingItems = session.query(MarketPlaceHistory,Item).join((Item,MarketPlaceHistory.item_id==Item.id)).filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.decision.in_([1,2,3,4])).all()
2036
#    sheet = wbk.add_sheet('Auto Inc and Dec')
2037
#
2038
#    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
2039
#    
2040
#    excel_integer_format = '0'
2041
#    integer_style = xlwt.XFStyle()
2042
#    integer_style.num_format_str = excel_integer_format
2043
#    xstr = lambda s: s or ""
2044
#    
2045
#    sheet.write(0, 0, "Item ID", heading_xf)
2046
#    sheet.write(0, 1, "Brand", heading_xf)
2047
#    sheet.write(0, 2, "Product Name", heading_xf)
2048
#    sheet.write(0, 3, "Decision", heading_xf)
2049
#    sheet.write(0, 4, "Reason", heading_xf)
2050
#    sheet.write(0, 5, "Old Selling Price", heading_xf)
2051
#    sheet.write(0, 6, "Selling Price Updated",heading_xf)
2052
#    
2053
#    sheet_iterator=1
2054
#    for autoPricingItem in autoPricingItems:
2055
#        mpHistory = autoPricingItem[0]
2056
#        item = autoPricingItem[1]
2057
#        it = Item.query.filter_by(id=item.id).one()
2058
#        sheet.write(sheet_iterator, 0, item.id)
2059
#        sheet.write(sheet_iterator, 1, it.brand)
2060
#        sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
2061
#        sheet.write(sheet_iterator, 3, Decision._VALUES_TO_NAMES.get(mpHistory.decision))
2062
#        sheet.write(sheet_iterator, 4, mpHistory.reason)
2063
#        if Decision._VALUES_TO_NAMES.get(mpHistory.decision) == "AUTO_DECREMENT_SUCCESS":
2064
#            sheet.write(sheet_iterator, 5, mpHistory.ourSellingPrice)
2065
#            sheet.write(sheet_iterator, 6, math.ceil(mpHistory.proposedSellingPrice))
2066
#        if Decision._VALUES_TO_NAMES.get(mpHistory.decision) == "AUTO_INCREMENT_SUCCESS":
2067
#            sheet.write(sheet_iterator, 5, mpHistory.ourSellingPrice)
2068
#            sheet.write(sheet_iterator, 6, math.ceil(mpHistory.ourSellingPrice+max(10,.01*mpHistory.ourSellingPrice)))
2069
#        sheet_iterator+=1
11193 kshitij.so 2070
 
2071
    filename = "/tmp/flipkart-report-"+runType+" " + str(timestamp) + ".xls"
2072
    wbk.save(filename)
2073
    try:
12135 kshitij.so 2074
        #EmailAttachmentSender.mail("build@shop2020.in", "cafe@nes", ["kshitij.sood@saholic.com"], " Flipkart Auto Pricing "+runType+" " + str(timestamp), "", [get_attachment_part(filename)], [""], [])
2075
        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"], " Flipkart Scraping "+runType+" " + str(timestamp), "", [get_attachment_part(filename)], ["rajneesh.arora@saholic.com","anikendra.das@saholic.com","vikram.raghav@saholic.com","kshitij.sood@saholic.com","chaitnaya.vats@saholic.com","khushal.bhatia@saholic.com"], [])
11193 kshitij.so 2076
    except Exception as e:
2077
        print e
2078
        print "Unable to send report.Trying with local SMTP"
2079
        smtpServer = smtplib.SMTP('localhost')
2080
        smtpServer.set_debuglevel(1)
11779 kshitij.so 2081
        sender = 'build@shop2020.in'
11791 kshitij.so 2082
        #recipients = ["kshitij.sood@saholic.com"]
11193 kshitij.so 2083
        msg = MIMEMultipart()
11228 kshitij.so 2084
        msg['Subject'] = "Flipkart Scraping" + ' '+runType+' - ' + str(datetime.now())
11193 kshitij.so 2085
        msg['From'] = sender
11791 kshitij.so 2086
        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']
11193 kshitij.so 2087
        msg['To'] = ",".join(recipients)
2088
        fileMsg = email.mime.base.MIMEBase('application','vnd.ms-excel')
2089
        fileMsg.set_payload(file(filename).read())
2090
        email.encoders.encode_base64(fileMsg)
2091
        fileMsg.add_header('Content-Disposition','attachment;filename=flipkart.xls')
2092
        msg.attach(fileMsg)
2093
        try:
2094
            smtpServer.sendmail(sender, recipients, msg.as_string())
2095
            print "Successfully sent email"
2096
        except:
2097
            print "Error: unable to send email."
11560 kshitij.so 2098
 
11571 kshitij.so 2099
def populateScrapingResults(val):
2100
    try:
2101
        flipkartDetails = fetchDetails(val.fkSerialNumber,scraper)
2102
        val.flipkartDetails = flipkartDetails 
2103
    except Exception as e:
2104
        print "Unable to fetch details of",val.fkSerialNumber
2105
        print e
2106
        val.flipkartDetails = None
2107
        return
2108
 
2109
    try:
2110
        request_url = "https://api.flipkart.net/sellers/skus/%s/listings"%(str(val.skuAtFlipkart))
2111
        r = requests.get(request_url, auth=('m2z93iskuj81qiid', '0c7ab6a5-98c0-4cdc-8be3-72c591e0add4'))
2112
        print "Inventory info",r.json()
2113
        stock_count = int((r.json()['attributeValues'])['stock_count'])
2114
    except:
2115
        stock_count = 0
11969 kshitij.so 2116
    finally:
2117
        r={}
11571 kshitij.so 2118
 
2119
    val.ourFlipkartInventory = stock_count
11560 kshitij.so 2120
 
2121
def threadsToSpawn(runType,itemInfo,scraper,itemPopulated):
2122
    if runType == RunType.FAVOURITE:
11615 kshitij.so 2123
        count = 0
2124
        pool = ThreadPool(3)
2125
        startOffset = 0
11560 kshitij.so 2126
        endOffset = startOffset
11615 kshitij.so 2127
        while(count<3 and endOffset<len(itemInfo)):
11560 kshitij.so 2128
            endOffset = startOffset + 20
2129
            if (endOffset >= len(itemInfo)):
2130
                endOffset = len(itemInfo)
11615 kshitij.so 2131
            print "pool offset start end count"+str(startOffset)+" "+str(endOffset)+" "+str(count)
2132
            pool.map(populateScrapingResults,itemInfo[startOffset:endOffset])
2133
            #t = Process(target=decideCategory,args=(itemInfo[startOffset:endOffset], scraper))
2134
            #t = threading.Thread(target=partial(decideCategory, itemInfo[startOffset:endOffset], scraper))
11560 kshitij.so 2135
            #t = threading.Thread(target=partial(test, startOffset, endOffset))
11615 kshitij.so 2136
            #threads.append(t)
11560 kshitij.so 2137
            startOffset = startOffset + 20
11615 kshitij.so 2138
            count+=1
2139
        #[t.start() for t in threads]
2140
        #[t.join() for t in threads] 
2141
        #threads = []
2142
        pool.close()
2143
        pool.join()
11560 kshitij.so 2144
        return endOffset
2145
    else:
11561 kshitij.so 2146
        count = 0
11571 kshitij.so 2147
        pool = ThreadPool(5)
11581 kshitij.so 2148
        startOffset = 0
11560 kshitij.so 2149
        endOffset = startOffset
11571 kshitij.so 2150
        while(count<5 and endOffset<len(itemInfo)):
11581 kshitij.so 2151
            endOffset = startOffset + 20
11560 kshitij.so 2152
            if (endOffset >= len(itemInfo)):
2153
                endOffset = len(itemInfo)
11581 kshitij.so 2154
            print "pool offset start end count"+str(startOffset)+" "+str(endOffset)+" "+str(count)
2155
            time.sleep(10)
11571 kshitij.so 2156
            pool.map(populateScrapingResults,itemInfo[startOffset:endOffset])
11561 kshitij.so 2157
            #t = Process(target=decideCategory,args=(itemInfo[startOffset:endOffset], scraper))
11560 kshitij.so 2158
            #t = threading.Thread(target=partial(decideCategory, itemInfo[startOffset:endOffset], scraper))
2159
            #t = threading.Thread(target=partial(test, startOffset, endOffset))
11561 kshitij.so 2160
            #threads.append(t)
11581 kshitij.so 2161
            startOffset = startOffset + 20
11561 kshitij.so 2162
            count+=1
2163
        #[t.start() for t in threads]
2164
        #[t.join() for t in threads] 
2165
        #threads = []
11581 kshitij.so 2166
        print "terminating while"
11563 kshitij.so 2167
        pool.close()
2168
        pool.join()
11581 kshitij.so 2169
        print "joining threads"
2170
        time.sleep(5)
2171
        print "returning offset******"
11571 kshitij.so 2172
        time.sleep(5) 
11560 kshitij.so 2173
        return endOffset
2174
 
11623 kshitij.so 2175
def sendAutoPricingMail(successfulAutoDecrease,successfulAutoIncrease):
2176
    if len(successfulAutoDecrease)==0 and len(successfulAutoIncrease)==0 :
2177
        return
2178
    xstr = lambda s: s or ""
2179
    catalog_client = CatalogClient().get_client()
2180
    inventory_client = InventoryClient().get_client()
2181
    message="""<html>
2182
            <body>
11625 kshitij.so 2183
            <h3 style="color:red;font-weight:bold;">This is test run.Prices are not being updated by system.</h3>
11623 kshitij.so 2184
            <h3>Auto Decrease Items</h3>
2185
            <table border="1" style="width:100%;">
2186
            <thead>
2187
            <tr><th>Item Id</th>
2188
            <th>Product Name</th>
2189
            <th>Old Price</th>
2190
            <th>New Price</th>
2191
            <th>Old Margin</th>
2192
            <th>New Margin</th>
11790 kshitij.so 2193
            <th>Commission %</th>
2194
            <th>Return Provision %</th>
11623 kshitij.so 2195
            <th>Flipkart Inventory</th>
2196
            <th>Sales History</th>
2197
            </tr></thead>
2198
            <tbody>"""
2199
    for item in successfulAutoDecrease:
2200
        it = Item.query.filter_by(id=item.item_id).one()
2201
        mpItem = MarketplaceItems.get_by(itemId=item.item_id,source=OrderSource.FLIPKART)
2202
        fkItem = FlipkartItem.get_by(item_id=item.item_id)
2203
        warehouse = inventory_client.getWarehouse(fkItem.warehouseId)
2204
        vatRate = catalog_client.getVatPercentageForItem(item.item_id, warehouse.stateId, item.proposedSellingPrice)
2205
        newMargin = round(getNewOurTp(mpItem,item.proposedSellingPrice) - getNewLowestPossibleTp(mpItem,item.ourNlc,vatRate,item.proposedSellingPrice))  
2206
        message+="""<tr>
2207
                <td style="text-align:center">"""+str(item.item_id)+"""</td>
2208
                <td style="text-align:center">"""+xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color)+"""</td>
2209
                <td style="text-align:center">"""+str(item.ourSellingPrice)+"""</td>
2210
                <td style="text-align:center">"""+str(math.ceil(item.proposedSellingPrice))+"""</td>
2211
                <td style="text-align:center">"""+str(round(item.margin))+" ("+str(round((item.margin/item.ourSellingPrice)*100,1))+"%)"+"""</td>
2212
                <td style="text-align:center">"""+str(newMargin)+" ("+str(round((newMargin/item.proposedSellingPrice)*100,1))+"%)"+"""</td>
11806 kshitij.so 2213
                <td style="text-align:center">"""+str(mpItem.commission)+" %"+"""</td>
11790 kshitij.so 2214
                <td style="text-align:center">"""+str(mpItem.returnProvision)+" %"+"""</td>
11806 kshitij.so 2215
                <td style="text-align:center">"""+str(item.ourInventory)+"""</td>
11623 kshitij.so 2216
                <td style="text-align:center">"""+getOosString((itemSaleMap.get(item.item_id))[1])+"""</td>
2217
                </tr>"""
2218
    message+="""</tbody></table><h3>Auto Increase Items</h3><table border="1" style="width:100%;">
2219
            <thead>
2220
            <tr><th>Item Id</th>
2221
            <th>Product Name</th>
2222
            <th>Old Price</th>
2223
            <th>New Price</th>
2224
            <th>Old Margin</th>
2225
            <th>New Margin</th>
11790 kshitij.so 2226
            <th>Commission %</th>
2227
            <th>Return Provision %</th>
11623 kshitij.so 2228
            <th>Flipkart Inventory</th>
2229
            <th>Sales History</th>
2230
            </tr></thead>
2231
            <tbody>"""
2232
    for item in successfulAutoIncrease:
2233
        it = Item.query.filter_by(id=item.item_id).one()
2234
        mpItem = MarketplaceItems.get_by(itemId=item.item_id,source=OrderSource.FLIPKART)
2235
        fkItem = FlipkartItem.get_by(item_id=item.item_id)
2236
        warehouse = inventory_client.getWarehouse(fkItem.warehouseId)
2237
        vatRate = catalog_client.getVatPercentageForItem(item.item_id, warehouse.stateId, math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))
2238
        newMargin = round(getNewOurTp(mpItem,item.ourSellingPrice+max(10,.01*item.ourSellingPrice)) - getNewLowestPossibleTp(mpItem,item.ourNlc,vatRate,item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))  
2239
        message+="""<tr>
2240
                <td style="text-align:center">"""+str(item.item_id)+"""</td>
2241
                <td style="text-align:center">"""+xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color)+"""</td>
2242
                <td style="text-align:center">"""+str(item.ourSellingPrice)+"""</td>
2243
                <td style="text-align:center">"""+str(math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))+"""</td>
2244
                <td style="text-align:center">"""+str(round((item.margin),1))+" ("+str(round((item.margin/item.ourSellingPrice)*100,1))+"%)"+"""</td>
2245
                <td style="text-align:center">"""+str(newMargin)+" ("+str(round((newMargin/(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))*100,1))+"%)"+"""</td>
11806 kshitij.so 2246
                <td style="text-align:center">"""+str(mpItem.commission)+" %"+"""</td>
11790 kshitij.so 2247
                <td style="text-align:center">"""+str(mpItem.returnProvision)+" %"+"""</td>
11623 kshitij.so 2248
                <td style="text-align:center">"""+str(item.ourInventory)+"""</td>
2249
                <td style="text-align:center">"""+getOosString((itemSaleMap.get(item.item_id))[1])+"""</td>
2250
                </tr>"""
2251
    message+="""</tbody></table></body></html>"""
2252
    print message
2253
    mailServer = smtplib.SMTP("smtp.gmail.com", 587)
2254
    mailServer.ehlo()
2255
    mailServer.starttls()
2256
    mailServer.ehlo()
2257
 
11791 kshitij.so 2258
    #recipients = ['kshitij.sood@saholic.com']
2259
    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']
11623 kshitij.so 2260
    msg = MIMEMultipart()
2261
    msg['Subject'] = "Flipkart Auto Pricing" + ' - ' + str(datetime.now())
2262
    msg['From'] = ""
2263
    msg['To'] = ",".join(recipients)
2264
    msg.preamble = "Flipkart Auto Pricing" + ' - ' + str(datetime.now())
2265
    html_msg = MIMEText(message, 'html')
2266
    msg.attach(html_msg)
2267
    try:
2268
        mailServer.login("build@shop2020.in", "cafe@nes")
2269
        #mailServer.sendmail("cafe@nes", ['kshitij.sood@saholic.com'], msg.as_string())
2270
        mailServer.sendmail("cafe@nes", recipients, msg.as_string())
2271
    except Exception as e:
2272
        print e
2273
        print "Unable to send pricing mail.Lets try with local SMTP."
2274
        smtpServer = smtplib.SMTP('localhost')
2275
        smtpServer.set_debuglevel(1)
11779 kshitij.so 2276
        sender = 'build@shop2020.in'
11623 kshitij.so 2277
        try:
2278
            smtpServer.sendmail(sender, recipients, msg.as_string())
2279
            print "Successfully sent email"
2280
        except:
2281
            print "Error: unable to send email."
2282
 
2283
def processLostBuyBoxItems(previousProcessingTimestamp,currentTimestamp):
2284
    previous_buy_box = session.query(MarketPlaceHistory.item_id).filter(MarketPlaceHistory.timestamp==previousProcessingTimestamp).filter(MarketPlaceHistory.source==OrderSource.FLIPKART).filter(or_(MarketPlaceHistory.competitiveCategory==CompetitionCategory.BUY_BOX,MarketPlaceHistory.competitiveCategory==CompetitionCategory.PREF_BUT_NOT_CHEAP)).all()
2285
    cant_compete = session.query(MarketPlaceHistory.item_id).filter(MarketPlaceHistory.timestamp==currentTimestamp).filter(MarketPlaceHistory.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.CANT_COMPETE).all()
2286
    if previous_buy_box is None:
2287
        print "No item in buy box for last run"
2288
        return
2289
    lost_buy_box = list(set(list(zip(*previous_buy_box)[0]))&set(list(zip(*cant_compete)[0])))
2290
    if len(lost_buy_box)==0:
2291
        return
2292
    xstr = lambda s: s or ""
2293
    message="""<html>
2294
            <body>
2295
            <h3>Lost Buy Box</h3>
2296
            <table border="1" style="width:100%;">
2297
            <thead>
2298
            <tr><th>Item Id</th>
2299
            <th>Product Name</th>
2300
            <th>Current Price</th>
2301
            <th>Current Margin</th>
11844 kshitij.so 2302
            <th>Lowest Seller</th>
2303
            <th>Lowest Selling Price</th>
2304
            <th>Preffered Seller</th>
2305
            <th>Preffered Selling Price</th>
11623 kshitij.so 2306
            <th>NLC</th>
2307
            <th>Target NLC</th>
11790 kshitij.so 2308
            <th>Commission %</th>
2309
            <th>Return Provision %</th>
11623 kshitij.so 2310
            <th>Flipkart Inventory</th>
2311
            <th>Total Inventory</th>
2312
            <th>Sales History</th>
2313
            </tr></thead>
2314
            <tbody>"""
2315
    items = session.query(MarketPlaceHistory).filter(MarketPlaceHistory.timestamp==currentTimestamp).filter(MarketPlaceHistory.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.item_id.in_(lost_buy_box)).all()
2316
    for item in items:
2317
        it = Item.query.filter_by(id=item.item_id).one()
11790 kshitij.so 2318
        mpItem = MarketplaceItems.get_by(itemId=item.item_id,source=OrderSource.FLIPKART)
11623 kshitij.so 2319
        netInventory=''
2320
        if not inventoryMap.has_key(item.item_id):
2321
            netInventory='Info Not Available'
2322
        else:
2323
            netInventory = str(getNetAvailability(inventoryMap.get(item.item_id)))
2324
        message+="""<tr>
2325
                <td style="text-align:center">"""+str(item.item_id)+"""</td>
2326
                <td style="text-align:center">"""+xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color)+"""</td>
2327
                <td style="text-align:center">"""+str(item.ourSellingPrice)+"""</td>
2328
                <td style="text-align:center">"""+str(round(item.margin))+" ("+str(round((item.margin/item.ourSellingPrice)*100,1))+"%)"+"""</td>
11844 kshitij.so 2329
                <td style="text-align:center">"""+str(item.lowestSellerName)+"""</td>
2330
                <td style="text-align:center">"""+str(item.lowestSellingPrice)+"""</td>
2331
                <td style="text-align:center">"""+str(item.prefferedSellerName)+"""</td>
2332
                <td style="text-align:center">"""+str(item.prefferedSellerSellingPrice)+"""</td>
11623 kshitij.so 2333
                <td style="text-align:center">"""+str(item.ourNlc)+"""</td>
2334
                <td style="text-align:center">"""+str(item.targetNlc)+"""</td>
11790 kshitij.so 2335
                <td style="text-align:center">"""+str(mpItem.commission)+"""</td>
2336
                <td style="text-align:center">"""+str(mpItem.returnProvision)+" %"+"""</td>
11623 kshitij.so 2337
                <td style="text-align:center">"""+str(item.ourInventory)+"""</td>
2338
                <td style="text-align:center">"""+netInventory+"""</td>
2339
                <td style="text-align:center">"""+getOosString((itemSaleMap.get(item.item_id))[1])+"""</td>
2340
                </tr>"""
2341
    message+="""</tbody></table></body></html>"""
2342
    print message
2343
    mailServer = smtplib.SMTP("smtp.gmail.com", 587)
2344
    mailServer.ehlo()
2345
    mailServer.starttls()
2346
    mailServer.ehlo()
2347
 
11791 kshitij.so 2348
    #recipients = ['kshitij.sood@saholic.com']
2349
    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']
11623 kshitij.so 2350
    msg = MIMEMultipart()
2351
    msg['Subject'] = "Flipkart Lost Buy Box" + ' - ' + str(datetime.now())
2352
    msg['From'] = ""
2353
    msg['To'] = ",".join(recipients)
2354
    msg.preamble = "Flipkart Lost Buy Box" + ' - ' + str(datetime.now())
2355
    html_msg = MIMEText(message, 'html')
2356
    msg.attach(html_msg)
2357
    try:
2358
        mailServer.login("build@shop2020.in", "cafe@nes")
2359
        #mailServer.sendmail("cafe@nes", ['kshitij.sood@saholic.com'], msg.as_string())
2360
        mailServer.sendmail("cafe@nes", recipients, msg.as_string())
2361
    except Exception as e:
2362
        print e
2363
        print "Unable to send lost buy box mail.Lets try local SMTP"
2364
        smtpServer = smtplib.SMTP('localhost')
2365
        smtpServer.set_debuglevel(1)
11779 kshitij.so 2366
        sender = 'build@shop2020.in'
11623 kshitij.so 2367
        try:
2368
            smtpServer.sendmail(sender, recipients, msg.as_string())
2369
            print "Successfully sent email"
2370
        except:
2371
            print "Error: unable to send email."
2372
 
2373
def cheapButNotPrefAlert(timestamp):
11626 kshitij.so 2374
    cheap_but_not_pref = session.query(MarketPlaceHistory,Item).join((Item,MarketPlaceHistory.item_id==Item.id)).filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.CHEAP_BUT_NOT_PREF).all()
11758 kshitij.so 2375
    if len(cheap_but_not_pref)==0:
11623 kshitij.so 2376
        return
2377
    xstr = lambda s: s or ""
2378
    message="""<html>
2379
            <body>
2380
            <h3>Cheap But Not Preferred</h3>
2381
            <table border="1" style="width:100%;">
2382
            <thead>
2383
            <tr><th>Item Id</th>
2384
            <th>Product Name</th>
2385
            <th>Current Price</th>
11670 kshitij.so 2386
            <th>Our Rating</th>
2387
            <th>Our Shipping Time</th>
11623 kshitij.so 2388
            <th>Preffered Seller</th>
2389
            <th>Preffered Seller SP</th>
11670 kshitij.so 2390
            <th>Preffered Seller Rating</th>
2391
            <th>Preffered Seller Shipping Time</th>
2392
            <th>Price Variance %</th>
11792 kshitij.so 2393
            <th>Commission %</th>
2394
            <th>Return Provision %</th>
11623 kshitij.so 2395
            <th>Flipkart Inventory</th>
2396
            <th>Total Inventory</th>
2397
            <th>Sales History</th>
2398
            </tr></thead>
2399
            <tbody>"""
2400
    for item in cheap_but_not_pref:
2401
        mpHistory = item[0]
2402
        catItem = item[1]
2403
        netInventory=''
2404
        if not inventoryMap.has_key(mpHistory.item_id):
2405
            netInventory='Info Not Available'
2406
        else:
2407
            netInventory = str(getNetAvailability(inventoryMap.get(mpHistory.item_id)))
11670 kshitij.so 2408
        ourSt = mpHistory.ourShippingTime.split('-')
2409
        pfSt = mpHistory.prefferedSellerShippingTime.split('-')
11792 kshitij.so 2410
        mpItem = MarketplaceItems.get_by(itemId=mpHistory.item_id,source=OrderSource.FLIPKART)
11670 kshitij.so 2411
        if mpHistory.prefferedSellerName=='WS Retail' and mpHistory.ourRating > mpHistory.prefferedSellerRating and int(ourSt[0])<=int(pfSt[0]):
11623 kshitij.so 2412
            style="""background-color:red;\""""
2413
        else:
2414
            style="\""
11754 kshitij.so 2415
        message+="""<tr>
2416
            <td style="text-align:center;"""+str(style)+""">"""+str(mpHistory.item_id)+"""</td>
2417
            <td style="text-align:center;"""+str(style)+""">"""+xstr(catItem.brand)+" "+xstr(catItem.model_name)+" "+xstr(catItem.model_number)+" "+xstr(catItem.color)+"""</td>
2418
            <td style="text-align:center;"""+str(style)+""">"""+str(mpHistory.ourSellingPrice)+"""</td>
2419
            <td style="text-align:center;"""+str(style)+""">"""+str(mpHistory.ourRating)+"""</td>
2420
            <td style="text-align:center;"""+str(style)+""">"""+str(mpHistory.ourShippingTime)+"""</td>
2421
            <td style="text-align:center;"""+str(style)+""">"""+str(mpHistory.prefferedSellerName)+"""</td>
2422
            <td style="text-align:center;"""+str(style)+""">"""+str(mpHistory.prefferedSellerSellingPrice)+"""</td>
2423
            <td style="text-align:center;"""+str(style)+""">"""+str(mpHistory.prefferedSellerRating)+"""</td>
2424
            <td style="text-align:center;"""+str(style)+""">"""+str(mpHistory.prefferedSellerShippingTime)+"""</td>
2425
            <td style="text-align:center;"""+str(style)+""">"""+str(round(((mpHistory.prefferedSellerSellingPrice-mpHistory.ourSellingPrice)/mpHistory.ourSellingPrice)*100))+"%"+"""</td>
11806 kshitij.so 2426
            <td style="text-align:center">"""+str(mpItem.commission)+" %"+"""</td>
11792 kshitij.so 2427
            <td style="text-align:center">"""+str(mpItem.returnProvision)+" %"+"""</td>
11754 kshitij.so 2428
            <td style="text-align:center;"""+str(style)+""">"""+str(mpHistory.ourInventory)+"""</td>
2429
            <td style="text-align:center;"""+str(style)+""">"""+netInventory+"""</td>
2430
            <td style="text-align:center;"""+str(style)+""">"""+getOosString((itemSaleMap.get(mpHistory.item_id))[1])+"""</td>
2431
            </tr>"""
11623 kshitij.so 2432
    message+="""</tbody></table></body></html>"""
2433
    print message
2434
    mailServer = smtplib.SMTP("smtp.gmail.com", 587)
2435
    mailServer.ehlo()
2436
    mailServer.starttls()
2437
    mailServer.ehlo()
2438
 
11791 kshitij.so 2439
    #recipients = ['kshitij.sood@saholic.com']
2440
    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']
11623 kshitij.so 2441
    msg = MIMEMultipart()
2442
    msg['Subject'] = "Flipkart Cheap But Not In BuyBox Items" + ' - ' + str(datetime.now())
2443
    msg['From'] = ""
2444
    msg['To'] = ",".join(recipients)
2445
    msg.preamble = "Flipkart Cheap But Not In BuyBox Items" + ' - ' + str(datetime.now())
2446
    html_msg = MIMEText(message, 'html')
2447
    msg.attach(html_msg)
2448
    try:
2449
        mailServer.login("build@shop2020.in", "cafe@nes")
2450
        #mailServer.sendmail("cafe@nes", ['kshitij.sood@saholic.com'], msg.as_string())
2451
        mailServer.sendmail("cafe@nes", recipients, msg.as_string())
2452
    except Exception as e:
2453
        print e
2454
        print "Unable to send Flipkart Cheap But Not In BuyBox Items mail.Lets try local SMTP"
2455
        smtpServer = smtplib.SMTP('localhost')
2456
        smtpServer.set_debuglevel(1)
11779 kshitij.so 2457
        sender = 'build@shop2020.in'
11623 kshitij.so 2458
        try:
2459
            smtpServer.sendmail(sender, recipients, msg.as_string())
2460
            print "Successfully sent email"
2461
        except:
2462
            print "Error: unable to send email."
11754 kshitij.so 2463
 
2464
def sendPricingMismatch(timestamp):
2465
    xstr = lambda s: s or ""
2466
    message="""<html>
2467
            <body>
2468
            <h3>Flipkart Pricing Mismatch</h3>
2469
            <table border="1" style="width:100%;">
2470
            <thead>
2471
            <tr><th>Item Id</th>
2472
            <th>Product Name</th>
2473
            <th>Our System Price</th>
2474
            <th>Flipkart Price</th>
2475
            <th>Flipkart Inventory</th>
2476
            <th>Total Inventory</th>
2477
            <th>Sales History</th>
2478
            </tr></thead>
2479
            <tbody>"""
2480
    flipkartPricing = {}
2481
    saholicPricing = {}
2482
    mpHistoryItems = session.query(MarketPlaceHistory,Item).join((Item,MarketPlaceHistory.item_id==Item.id)).filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.source==OrderSource.FLIPKART).all()
2483
    for val in mpHistoryItems:
2484
        temp = []
2485
        temp.append(val[0].ourSellingPrice)
2486
        temp.append(xstr(val[1].brand)+" "+xstr(val[1].model_name)+" "+xstr(val[1].model_number)+" "+xstr(val[1].color))
11755 kshitij.so 2487
        temp.append(val[0].ourInventory)
11754 kshitij.so 2488
        flipkartPricing[val[0].item_id] = temp
2489
    mpHistoryItems[:] = []
2490
    mpItems = session.query(MarketplaceItems).filter(MarketplaceItems.source==OrderSource.FLIPKART).all()
2491
    for val in mpItems:
2492
        saholicPricing[val.itemId] = val.currentSp
2493
    mpItems[:] = []
2494
    mismatches = []
2495
    for k,v in flipkartPricing.iteritems():
2496
        flipkartSellingPrice = v[0]
2497
        ourSellingPrice = saholicPricing.get(k)
11771 kshitij.so 2498
        if flipkartSellingPrice is not None and not((ourSellingPrice - flipkartSellingPrice >= -3) and (ourSellingPrice - flipkartSellingPrice <=3)):
11754 kshitij.so 2499
            mismatches.append(k)
2500
    print "mismatches are ",mismatches
11755 kshitij.so 2501
    if len(mismatches)==0:
2502
        return
11754 kshitij.so 2503
    for item in mismatches:
2504
        netInventory=''
2505
        if not inventoryMap.has_key(item):
2506
            netInventory='Info Not Available'
2507
        else:
2508
            netInventory = str(getNetAvailability(inventoryMap.get(item)))
2509
        message+="""<tr>
11756 kshitij.so 2510
            <td style="text-align:center">"""+str(item)+"""</td>
2511
            <td style="text-align:center">"""+str((flipkartPricing.get(item))[1])+"""</td>
2512
            <td style="text-align:center">"""+str(saholicPricing.get(item))+"""</td>
2513
            <td style="text-align:center">"""+str((flipkartPricing.get(item))[0])+"""</td>
2514
            <td style="text-align:center">"""+str((flipkartPricing.get(item))[2])+"""</td>
2515
            <td style="text-align:center">"""+netInventory+"""</td>
2516
            <td style="text-align:center">"""+getOosString((itemSaleMap.get(item))[1])+"""</td>
11754 kshitij.so 2517
            </tr>"""
2518
    message+="""</tbody></table></body></html>"""
2519
    print message
2520
    mailServer = smtplib.SMTP("smtp.gmail.com", 587)
2521
    mailServer.ehlo()
2522
    mailServer.starttls()
2523
    mailServer.ehlo()
2524
 
11791 kshitij.so 2525
    #recipients = ['kshitij.sood@saholic.com']
2526
    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']
11754 kshitij.so 2527
    msg = MIMEMultipart()
2528
    msg['Subject'] = "Flipkart Price Mismatch" + ' - ' + str(datetime.now())
2529
    msg['From'] = ""
2530
    msg['To'] = ",".join(recipients)
2531
    msg.preamble = "Flipkart Price Mismatch" + ' - ' + str(datetime.now())
2532
    html_msg = MIMEText(message, 'html')
2533
    msg.attach(html_msg)
2534
    try:
2535
        mailServer.login("build@shop2020.in", "cafe@nes")
2536
        #mailServer.sendmail("cafe@nes", ['kshitij.sood@saholic.com'], msg.as_string())
2537
        mailServer.sendmail("cafe@nes", recipients, msg.as_string())
2538
    except Exception as e:
2539
        print e
2540
        print "Unable to send Flipkart Price Mismatch mail.Lets try local SMTP"
2541
        smtpServer = smtplib.SMTP('localhost')
2542
        smtpServer.set_debuglevel(1)
11779 kshitij.so 2543
        sender = 'build@shop2020.in'
11754 kshitij.so 2544
        try:
2545
            smtpServer.sendmail(sender, recipients, msg.as_string())
2546
            print "Successfully sent email"
2547
        except:
2548
            print "Error: unable to send email."
11775 kshitij.so 2549
 
2550
def sendAlertForNegativeMargins(timestamp):
2551
    xstr = lambda s: s or ""
2552
    negativeMargins = session.query(MarketPlaceHistory,Item).join((Item,MarketPlaceHistory.item_id==Item.id)).filter(MarketPlaceHistory.timestamp==timestamp).filter(MarketPlaceHistory.source==OrderSource.FLIPKART).filter(MarketPlaceHistory.competitiveCategory==CompetitionCategory.NEGATIVE_MARGIN).all()
2553
    if len(negativeMargins) == 0:
2554
        return
2555
    message="""<html>
2556
            <body>
2557
            <h3 style="color:red;font-weight:bold;">Flipkart Negative Margins</h3>
2558
            <table border="1" style="width:100%;">
2559
            <thead>
2560
            <tr><th>Item Id</th>
2561
            <th>Product Name</th>
2562
            <th>SP</th>
2563
            <th>TP</th>
2564
            <th>Lowest Possible SP</th>
2565
            <th>Lowest Possible TP</th>
2566
            <th>Margin</th>
2567
            <th>Margin %</th>
11790 kshitij.so 2568
            <th>Commission %</th>
2569
            <th>Return Provision %</th>
11775 kshitij.so 2570
            <th>Flipkart Inventory</th>
2571
            <th>Total Inventory</th>
2572
            <th>Sales History</th>
2573
            </tr></thead>
2574
            <tbody>"""
2575
    for item in negativeMargins:
2576
        mpHistory = item[0]
2577
        catItem = item[1]
2578
        netInventory=''
11776 kshitij.so 2579
        if not inventoryMap.has_key(mpHistory.item_id):
11775 kshitij.so 2580
            netInventory='Info Not Available'
2581
        else:
11776 kshitij.so 2582
            netInventory = str(getNetAvailability(inventoryMap.get(mpHistory.item_id)))
11790 kshitij.so 2583
        mpItem = MarketplaceItems.get_by(itemId=mpHistory.item_id,source=OrderSource.FLIPKART)
11775 kshitij.so 2584
        message+="""<tr>
2585
            <td style="text-align:center">"""+str(mpHistory.item_id)+"""</td>
2586
            <td style="text-align:center">"""+xstr(catItem.brand)+" "+xstr(catItem.model_name)+" "+xstr(catItem.model_number)+" "+xstr(catItem.color)+"""</td>
2587
            <td style="text-align:center">"""+str(mpHistory.ourSellingPrice)+"""</td>
2588
            <td style="text-align:center">"""+str(mpHistory.ourTp)+"""</td>
2589
            <td style="text-align:center">"""+str(mpHistory.lowestPossibleSp)+"""</td>
2590
            <td style="text-align:center">"""+str(mpHistory.lowestPossibleTp)+"""</td>
2591
            <td style="text-align:center">"""+str(mpHistory.margin)+"""</td>
11952 kshitij.so 2592
            <td style="text-align:center">"""+str(round((mpHistory.margin/mpHistory.ourSellingPrice)*100,1))+" %"+"""</td>
11790 kshitij.so 2593
            <td style="text-align:center">"""+str(mpItem.commission)+"""</td>
2594
            <td style="text-align:center">"""+str(mpItem.returnProvision)+" %"+"""</td>
11775 kshitij.so 2595
            <td style="text-align:center">"""+str(mpHistory.ourInventory)+"""</td>
2596
            <td style="text-align:center">"""+netInventory+"""</td>
11776 kshitij.so 2597
            <td style="text-align:center">"""+getOosString((itemSaleMap.get(mpHistory.item_id))[1])+"""</td>
11775 kshitij.so 2598
            </tr>"""
2599
    message+="""</tbody></table></body></html>"""
2600
    print message
2601
    mailServer = smtplib.SMTP("smtp.gmail.com", 587)
2602
    mailServer.ehlo()
2603
    mailServer.starttls()
2604
    mailServer.ehlo()
2605
 
11791 kshitij.so 2606
    #recipients = ['kshitij.sood@saholic.com']
2607
    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']
11775 kshitij.so 2608
    msg = MIMEMultipart()
2609
    msg['Subject'] = "Flipkart Negative Margin" + ' - ' + str(datetime.now())
2610
    msg['From'] = ""
2611
    msg['To'] = ",".join(recipients)
2612
    msg.preamble = "Flipkart Negative Margin" + ' - ' + str(datetime.now())
2613
    html_msg = MIMEText(message, 'html')
2614
    msg.attach(html_msg)
2615
    try:
2616
        mailServer.login("build@shop2020.in", "cafe@nes")
2617
        #mailServer.sendmail("cafe@nes", ['kshitij.sood@saholic.com'], msg.as_string())
2618
        mailServer.sendmail("cafe@nes", recipients, msg.as_string())
2619
    except Exception as e:
2620
        print e
2621
        print "Unable to send Flipkart Negative margin mail.Lets try local SMTP"
2622
        smtpServer = smtplib.SMTP('localhost')
2623
        smtpServer.set_debuglevel(1)
11779 kshitij.so 2624
        sender = 'build@shop2020.in'
11775 kshitij.so 2625
        try:
2626
            smtpServer.sendmail(sender, recipients, msg.as_string())
2627
            print "Successfully sent email"
2628
        except:
2629
            print "Error: unable to send email."
11560 kshitij.so 2630
 
11623 kshitij.so 2631
 
11775 kshitij.so 2632
 
2633
 
11193 kshitij.so 2634
def main():
2635
    parser = optparse.OptionParser()
2636
    parser.add_option("-t", "--type", dest="runType",
2637
                   default="FULL", type="string",
2638
                   help="Run type FULL or FAVOURITE")
2639
    (options, args) = parser.parse_args()
2640
    if options.runType not in ('FULL','FAVOURITE'):
2641
        print "Run type argument illegal."
2642
        sys.exit(1)
2643
    timestamp = datetime.now()
11581 kshitij.so 2644
    previousProcessingTimestamp = session.query(func.max(MarketPlaceHistory.timestamp)).filter(MarketPlaceHistory.source==OrderSource.FLIPKART).one()
11193 kshitij.so 2645
    itemInfo= populateStuff(options.runType,timestamp)
11560 kshitij.so 2646
    itemsPopulated = 0
11615 kshitij.so 2647
    while (len(itemInfo)>0):
11560 kshitij.so 2648
        itemsPopulated = threadsToSpawn(options.runType,itemInfo,scraper,itemsPopulated)
11581 kshitij.so 2649
        cantCompete, buyBoxItems, competitive, competitiveNoInventory, exceptionItems, negativeMargin, cheapButNotPref, prefButNotCheap = decideCategory(itemInfo[0:itemsPopulated])
2650
        itemInfo[0:itemsPopulated] = []
2651
        commitExceptionList(exceptionItems,timestamp)
2652
        commitCantCompete(cantCompete,timestamp)
2653
        commitBuyBox(buyBoxItems,timestamp)
2654
        commitCompetitive(competitive,timestamp)
2655
        commitCompetitiveNoInventory(competitiveNoInventory,timestamp)
2656
        commitNegativeMargin(negativeMargin,timestamp)
2657
        commitCheapButNotPref(cheapButNotPref,timestamp)
2658
        commitPrefButNotCheap(prefButNotCheap, timestamp)
2659
        cantCompete[:], buyBoxItems[:], competitive[:], competitiveNoInventory[:], exceptionItems[:], negativeMargin[:], cheapButNotPref[:], prefButNotCheap[:] =[],[],[],[],[],[],[],[]
2660
 
11615 kshitij.so 2661
    successfulAutoDecrease = fetchItemsForAutoDecrease(timestamp)
2662
    successfulAutoIncrease = fetchItemsForAutoIncrease(timestamp)
2663
    if options.runType=='FULL':
2664
        previousAutoFav, nowAutoFav = markAutoFavourite()
11621 kshitij.so 2665
    if options.runType =='FULL':
2666
        write_report(previousAutoFav,nowAutoFav,timestamp,options.runType)
2667
    else:
2668
        write_report(None,None,timestamp,options.runType)
11623 kshitij.so 2669
    sendAutoPricingMail(successfulAutoDecrease,successfulAutoIncrease)
11625 kshitij.so 2670
    if previousProcessingTimestamp[0] is not None:
2671
        processLostBuyBoxItems(previousProcessingTimestamp[0],timestamp)
11623 kshitij.so 2672
    if options.runType=='FULL':
2673
        cheapButNotPrefAlert(timestamp)
11754 kshitij.so 2674
        sendPricingMismatch(timestamp)
11775 kshitij.so 2675
        sendAlertForNegativeMargins(timestamp)
11193 kshitij.so 2676
 
2677
if __name__ == '__main__':
2678
    main()