Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
12363 kshitij.so 1
from elixir import *
12418 kshitij.so 2
from sqlalchemy.sql import or_ ,func, asc, desc, and_
12363 kshitij.so 3
from shop2020.config.client.ConfigClient import ConfigClient
4
from shop2020.model.v1.catalog.impl import DataService
12364 kshitij.so 5
from shop2020.model.v1.catalog.impl.DataService import Amazonlisted, Item, \
12418 kshitij.so 6
Category, SourcePercentageMaster,SourceCategoryPercentage, SourceItemPercentage, AmazonPromotion, AmazonScrapingHistory, \
7
ItemVatMaster, CategoryVatMaster
12363 kshitij.so 8
from shop2020.thriftpy.model.v1.order.ttypes import OrderSource
12430 kshitij.so 9
from shop2020.thriftpy.model.v1.catalog.ttypes import CompetitionCategory, \
12363 kshitij.so 10
Decision, RunType, AmazonPromotionType
12430 kshitij.so 11
from shop2020.model.v1.catalog.script import AmazonAsyncScraper
12363 kshitij.so 12
from shop2020.clients.InventoryClient import InventoryClient
13
from shop2020.clients.TransactionClient import TransactionClient
12452 kshitij.so 14
import time
15
from time import sleep
12363 kshitij.so 16
from datetime import date, datetime, timedelta
17
import math
18
import simplejson as json
19
import xlwt
20
import optparse
21
import sys
12430 kshitij.so 22
from operator import itemgetter
12363 kshitij.so 23
 
24
 
25
config_client = ConfigClient()
26
host = config_client.get_property('staging_hostname')
27
syncPrice=config_client.get_property('sync_price_on_marketplace')
28
 
29
amazonAsinPrice={}
12432 kshitij.so 30
amazonLongTermActivePromotions = {}
31
amazonShortTermActivePromotions = {}
12363 kshitij.so 32
saleMap = {}
33
DataService.initialize(db_hostname=host)
34
 
12430 kshitij.so 35
amScraper = AmazonAsyncScraper.Products("AKIAII3SGRXBJDPCHSGQ", "B92xTbNBTYygbGs98w01nFQUhbec1pNCkCsKVfpg", "AF6E3O0VE0X4D")
12363 kshitij.so 36
 
37
class __AmazonItemInfo:
38
 
12447 kshitij.so 39
    def __init__(self, asin, nlc, courierCost, sku, product_group, brand, model_name, model_number, color, weight, parent_category, risky, vatRate, runType, parent_category_name, sourcePercentage, ourInventory, state_id, otherCost):
12382 kshitij.so 40
        self.asin = asin
12363 kshitij.so 41
        self.nlc = nlc
42
        self.courierCost = courierCost
43
        self.sku = sku
44
        self.product_group = product_group
45
        self.brand = brand
46
        self.model_name = model_name
47
        self.model_number = model_number
48
        self.color = color
49
        self.weight = weight
50
        self.parent_category = parent_category
51
        self.risky = risky
52
        self.vatRate = vatRate
53
        self.runType = runType
54
        self.parent_category_name = parent_category_name
55
        self.sourcePercentage = sourcePercentage
56
        self.ourInventory = ourInventory
57
        self.state_id = state_id
12447 kshitij.so 58
        self.otherCost = otherCost
12363 kshitij.so 59
 
60
class __AmazonDetails:
12430 kshitij.so 61
    def __init__(self, sku, ourSp, ourRank, lowestSellerName,lowestSellerSp,secondLowestSellerName, secondLowestSellerSp, thirdLowestSellerName, thirdLowestSellerSp, totalSeller, multipleListings, \
62
                 promoPrice, isPromotion, lowestSellerShippingTime, lowestSellerRating, secondLowestSellerShippingTime, secondLowestSellerRating, thirdLowestSellerShippingTime , \
63
                 thirdLowestSellerRating, lowestSellerType, secondLowestSellerType, thirdLowestSellerType):
12363 kshitij.so 64
        self.sku =sku
65
        self.ourSp = ourSp
66
        self.ourRank = ourRank
67
        self.lowestSellerName = lowestSellerName
68
        self.lowestSellerSp = lowestSellerSp
69
        self.secondLowestSellerName = secondLowestSellerName
70
        self.secondLowestSellerSp = secondLowestSellerSp
71
        self.thirdLowestSellerName = thirdLowestSellerName
72
        self.thirdLowestSellerSp = thirdLowestSellerSp
73
        self.totalSeller = totalSeller
12430 kshitij.so 74
        self.multipleListings = multipleListings
75
        self.promoPrice = promoPrice
76
        self.isPromotion = isPromotion
77
        self.lowestSellerShippingTime =lowestSellerShippingTime
78
        self.lowestSellerRating = lowestSellerRating
79
        self.secondLowestSellerShippingTime = secondLowestSellerShippingTime
80
        self.secondLowestSellerRating = secondLowestSellerRating
81
        self.thirdLowestSellerShippingTime= thirdLowestSellerShippingTime
82
        self.thirdLowestSellerRating = thirdLowestSellerRating
83
        self.lowestSellerType = lowestSellerType
84
        self.secondLowestSellerType = secondLowestSellerType
12447 kshitij.so 85
        self.thirdLowestSellerType = thirdLowestSellerType
12430 kshitij.so 86
 
12363 kshitij.so 87
 
88
class __AmazonPricing:
89
 
12432 kshitij.so 90
    def __init__(self, ourSp, lowestPossibleSp):
12363 kshitij.so 91
        self.ourSp = ourSp
92
        self.lowestPossibleSp = lowestPossibleSp
93
 
12432 kshitij.so 94
class __Promotion:
12433 kshitij.so 95
    def __init__(self, promoPrice, subsidy, promotionType,expiryDate):
12432 kshitij.so 96
        self.promoPrice = promoPrice
97
        self.subsidy = subsidy
98
        self.promotionType = promotionType
12433 kshitij.so 99
        self.expiryDate = expiryDate 
12432 kshitij.so 100
 
12363 kshitij.so 101
 
12432 kshitij.so 102
 
12396 kshitij.so 103
def fetchItemsForAutoDecrease(time):
104
    successfulAutoDecrease = []
105
    autoDecrementItems = session.query(AmazonScrapingHistory).join((Amazonlisted,AmazonScrapingHistory.item_id==Amazonlisted.itemId))\
106
    .filter(AmazonScrapingHistory.timestamp==time).filter(or_(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE,AmazonScrapingHistory.competitiveCategory==CompetitionCategory.COMPETITIVE, AmazonScrapingHistory.competitiveCategory==CompetitionCategory.ALMOST_COMPETE ))\
107
    .filter(Amazonlisted.autoDecrement==True).all()
108
    for autoDecrementItem in autoDecrementItems:
109
        if autoDecrementItem.warehouseLocation == 1:
110
            sku = 'FBA'+str(autoDecrementItem.item_id)
111
        else:
112
            sku = 'FBB'+str(autoDecrementItem.item_id)
12432 kshitij.so 113
        if amazonShortTermActivePromotions.has_key(sku):
12396 kshitij.so 114
            markReasonForItem(autoDecrementItem,'Item in short term promotion',Decision.AUTO_DECREMENT_FAILED)
115
            continue
116
        if math.ceil(autoDecrementItem.proposedSp) >= autoDecrementItem.ourSellingPrice:
117
            markReasonForItem(autoDecrementItem,'Proposed SP greater than or equal to current SP',Decision.AUTO_DECREMENT_FAILED)
118
            continue
119
        if autoDecrementItem.proposedSellingPrice < autoDecrementItem.lowestPossibleSp:
120
            markReasonForItem(autoDecrementItem,'Proposed SP less than lowest possible SP',Decision.AUTO_DECREMENT_FAILED)
121
            continue
122
        try:
123
            daysOfStock = (float(autoDecrementItem.ourInventory))/autoDecrementItem.avgSale
124
        except:
125
            daysOfStock = float("inf")
126
        if autoDecrementItem.competitiveCategory == CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE:
127
            if daysOfStock < 20:
128
                markReasonForItem(autoDecrementItem,'Days of stock less than 20',Decision.AUTO_DECREMENT_FAILED)
12433 kshitij.so 129
                continue
12396 kshitij.so 130
 
12433 kshitij.so 131
        if autoDecrementItem.competitiveCategory == CompetitionCategory.COMPETITIVE and not autoDecrementItem.isPromotion:
12396 kshitij.so 132
            if autoDecrementItem.parentCategoryId in [10006,10009,11001]:
12433 kshitij.so 133
                if daysOfStock < 1 :
12396 kshitij.so 134
                    markReasonForItem(autoDecrementItem,'Days of stock less than 1',Decision.AUTO_DECREMENT_FAILED)
12433 kshitij.so 135
                    continue
136
 
12396 kshitij.so 137
            else:
138
                if daysOfStock < 3:
139
                    markReasonForItem(autoDecrementItem,'Days of stock less than 3',Decision.AUTO_DECREMENT_FAILED)
12433 kshitij.so 140
                    continue
141
 
142
        if autoDecrementItem.competitiveCategory == CompetitionCategory.COMPETITIVE and autoDecrementItem.isPromotion:
143
            if autoDecrementItem.parentCategoryId in [10006,10009,11001]:
144
                if (amazonLongTermActivePromotions.get(sku).expiryDate - datetime.now()).days >2 and daysOfStock < 1 :
145
                    markReasonForItem(autoDecrementItem,'Promo Item, expiry after 2 days or not enough stock',Decision.AUTO_DECREMENT_FAILED)
146
                    continue
147
 
148
            else:
149
                if (amazonLongTermActivePromotions.get(sku).expiryDate - datetime.now()).days >2 and daysOfStock < 3:
150
                    markReasonForItem(autoDecrementItem,'Promo Item, expiry after 2 days or not enough stock',Decision.AUTO_DECREMENT_FAILED)
151
                    continue
12396 kshitij.so 152
 
153
        autoDecrementItem.ourEnoughStock=True
154
        autoDecrementItem.decision = Decision.AUTO_DECREMENT_SUCCESS
155
        autoDecrementItem.reason = 'All conditions for auto decrement true'
156
        successfulAutoDecrease.append(autoDecrementItem)
157
    session.commit()
158
    session.close()
159
    return successfulAutoDecrease
160
 
161
def fetchItemsForAutoIncrease(time):
162
    successfulAutoIncrease = []
163
    autoIncrementItems = session.query(AmazonScrapingHistory).join((Amazonlisted,AmazonScrapingHistory.item_id==Amazonlisted.itemId))\
164
    .filter(AmazonScrapingHistory.timestamp==time).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.BUY_BOX)\
165
    .filter(Amazonlisted.autoIncrement==True).all()
166
    transaction_client = TransactionClient().get_client()
167
    for autoIncrementItem in autoIncrementItems:
168
        if autoIncrementItem.warehouseLocation == 1:
169
            sku = 'FBA'+str(autoIncrementItem.item_id)
170
        else:
171
            sku = 'FBB'+str(autoIncrementItem.item_id)
12432 kshitij.so 172
        if amazonShortTermActivePromotions.has_key(sku):
12396 kshitij.so 173
            markReasonForItem(autoIncrementItem,'Item in short term promotion',Decision.AUTO_INCREMENT_FAILED)
174
            continue
175
        if autoIncrementItem.totalSeller==1 and autoIncrementItem.ourRank==1:
176
            markReasonForItem(autoIncrementItem,'We are the only seller',Decision.AUTO_INCREMENT_FAILED)
177
            continue 
178
        if autoIncrementItem.proposedSp <= autoIncrementItem.ourSellingPrice:
179
            markReasonForItem(autoIncrementItem,'Proposed SP less than current SP',Decision.AUTO_INCREMENT_FAILED)
180
            continue
181
        if autoIncrementItem.proposedSellingPrice >=10000 and autoIncrementItem.ourSellingPrice<10000:
182
            markReasonForItem(autoIncrementItem,'Proposed SP is greater than 10,000 and current sp is less than 10,000',Decision.AUTO_INCREMENT_FAILED)
183
            continue
184
 
12447 kshitij.so 185
        if autoIncrementItem.isPromotion and math.ceil(autoIncrementItem.promoPrice+max(10,.01*autoIncrementItem.promoPrice)) > (amazonLongTermActivePromotions.get(sku)).promoPrice:
186
            markReasonForItem(autoIncrementItem,'Proposed SP cant be greater than promo price',Decision.AUTO_INCREMENT_FAILED)
187
            continue
188
 
189
 
12396 kshitij.so 190
        if autoIncrementItem.avgSale==0:
191
            markReasonForItem(autoIncrementItem,'Avg sale is 0',Decision.AUTO_INCREMENT_FAILED)
192
            continue
193
 
194
        daysOfStock = (float(autoIncrementItem.ourInventory))/autoIncrementItem.avgSale
195
        if daysOfStock > 5:
196
            markReasonForItem(autoIncrementItem,'Days of stock greater than 5',Decision.AUTO_INCREMENT_FAILED)
197
            continue
198
        antecedentPrice = session.query(AmazonScrapingHistory.ourSellingPrice).filter(AmazonScrapingHistory.item_id==autoIncrementItem.item_id).filter(AmazonScrapingHistory.timestamp>time-timedelta(days=1)).order_by(asc(AmazonScrapingHistory.timestamp)).first()
199
        if antecedentPrice is not None:
200
            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:
201
                markReasonForItem(autoIncrementItem,'Maximum price increase in last 24 hours should be 2%',Decision.AUTO_INCREMENT_FAILED)
202
                continue
203
        fbaSaleSnapshot = transaction_client.getAmazonFbaSalesLatestSnapshotForItemLocationWise(autoIncrementItem.item_id,autoIncrementItem.warehouseLocation)
204
        if getLastDaySale(fbaSaleSnapshot,autoIncrementItem.warehouseLocation-1)<=2:
205
            markReasonForItem(autoIncrementItem,'Last day sale is less than 3',Decision.AUTO_INCREMENT_FAILED)
206
            continue
207
 
208
        autoIncrementItem.ourEnoughStock = False
209
        autoIncrementItem.decision = Decision.AUTO_INCREMENT_SUCCESS
210
        autoIncrementItem.reason = 'All conditions for auto increment true'
211
        successfulAutoIncrease.append(autoIncrementItem)
212
    session.commit()
213
    return successfulAutoIncrease     
214
 
215
 
216
def markReasonForItem(amHistory,reason,decision):
217
    amHistory.decision = decision
218
    amHistory.reason = reason
219
 
12424 kshitij.so 220
def calculateAverageSale(sku):
221
    count,sale = 0,0
222
    oosStatus = saleMap.get(sku)
223
    for obj in oosStatus:
224
        if not obj.isOutOfStock:
225
            count+=1
226
            sale = sale+obj.totalOrderCount
227
    avgSalePerDay=0 if count==0 else (float(sale)/count)
228
    return round(avgSalePerDay,2)
229
 
230
 
12396 kshitij.so 231
def getOosString(oosStatus):
232
    lastNdaySale=""
233
    for obj in oosStatus:
12423 kshitij.so 234
        if obj.isOutOfStock:
12396 kshitij.so 235
            lastNdaySale += "X-"
236
        else:
12426 kshitij.so 237
            lastNdaySale += str(obj.totalOrderCount) + "-"
12396 kshitij.so 238
    return lastNdaySale[:-1]
239
 
240
def getLastDaySale(fbaSaleSnapshot):
241
    if fbaSaleSnapshot.item_id==0:
242
        return 0
243
    else:
12423 kshitij.so 244
        return fbaSaleSnapshot.totalOrderCount
12396 kshitij.so 245
 
12430 kshitij.so 246
#def syncAsin():
247
##    notListedOnAmazon = []
248
##    diffAsins = []
249
##    login_url = "https://sellercentral.amazon.in/gp/homepage.html"
250
##    br = SellerCentralInventoryReport.login(login_url)
251
##    report_url = "https://sellercentral.amazon.in/gp/upload-download-utils/requestReport.html?type=OpenListingReport&marketplaceID=44571&Request+Report="
252
##    br = SellerCentralInventoryReport.requestReport(br,report_url)
253
##    status_url="https://sellercentral.amazon.in/gp/upload-download-utils/reportStatusData.html"
254
##    br, page = SellerCentralInventoryReport.checkStatus(br,status_url)
255
##    br, batchId = SellerCentralInventoryReport.getReportBatchId(br,page)
256
##    print "*********************************"
257
##    print "Batch Id for request is ",batchId
258
##    print "*********************************"
259
##    ready = False
260
##    retryCount = 0
261
##    while not ready:
262
##        if retryCount == 10:
263
##            print "File not available for download after multiple retries"
264
##            sys.exit(1)
265
##        br, download_link = SellerCentralInventoryReport.downloadReport(br,batchId,status_url)
266
##        if download_link is not None:
267
##            ready= True
268
##            continue
269
##        print "File not ready for download yet.Will try again after 30 seconds."
270
##        retryCount+=1
271
##        time.sleep(30)
272
##    fPath = SellerCentralInventoryReport.fetchFile(download_link['href'],br,batchId)
273
#    fPath = "/tmp/9940651090.txt"
274
#    global amazonAsinPrice
275
#    for line in open(fPath):
276
#        l = line.split('\t')
277
#        if (str(l[0]).startswith('FBA') or str(l[0]).startswith('FBB')):
278
#            obj = __AmazonAsinPrice(l[1],l[2])
279
#            amazonAsinPrice[l[0]] = obj
280
##Can be used to sync asins, not doing due to multiple asins corresponding to one itemId
281
##    systemAsins = session.query(Item,Amazonlisted).join((Amazonlisted,Item.id==Amazonlisted.itemId)).all()
282
##    for systemAsin in systemAsins:
283
##        item = systemAsin[0]
284
##        amListed = systemAsin[1]
285
##        if amazonAsinPrice.get('FBA'+str(item.id)) is None:
286
##            temp=[]
287
##            temp.append(item)
288
##            temp.append(amListed)
289
##            notListedOnAmazon.append(temp)
290
##            continue
291
##        else:
292
##            temp=[]
293
##            temp.append(item)
294
##            temp.append(amListed)
295
##            if item.asin!=((amazonAsinPrice.get('FBA'+str(item.id))).asin).strip():
296
##                diffAsins.append(temp)
297
##                continue
298
##            
299
##    for diffAsin in diffAsins:
300
##        item = diffAsin[0]
301
##        amListed = diffAsin[1]
302
##        item.asin = ((amazonAsinPrice.get('FBA'+str(item.id))).asin).strip()
303
##        amListed.asin = ((amazonAsinPrice.get('FBA'+str(item.id))).asin).strip()
304
##    session.commit()
305
##    session.close()
12363 kshitij.so 306
 
307
def fetchFbaSale():
308
    global saleMap
309
    transaction_client = TransactionClient().get_client()
310
    fbaSaleSnapshot = transaction_client.getAmazonFbaSalesSnapshotForDays(4)
311
    for saleSnapshot in fbaSaleSnapshot:
312
        if saleSnapshot.fcLocation == 0:
313
            if saleMap.has_key('FBA'+str(saleSnapshot.item_id)):
314
                temp = []
12367 kshitij.so 315
                val = saleMap.get('FBA'+str(saleSnapshot.item_id))
316
                for l in val:
12363 kshitij.so 317
                    temp.append(l)
318
                temp.append(saleSnapshot)
12366 kshitij.so 319
                saleMap['FBA'+str(saleSnapshot.item_id)]=temp
12363 kshitij.so 320
            else:
12368 kshitij.so 321
                temp = []
322
                temp.append(saleSnapshot)
323
                saleMap['FBA'+str(saleSnapshot.item_id)] = temp
12363 kshitij.so 324
        else:
325
            if saleMap.has_key('FBB'+str(saleSnapshot.item_id)):
326
                temp = []
12367 kshitij.so 327
                val = saleMap.get('FBB'+str(saleSnapshot.item_id))
328
                for l in val:
12363 kshitij.so 329
                    temp.append(l)
12368 kshitij.so 330
                saleMap['FBB'+str(saleSnapshot.item_id)]=temp
12363 kshitij.so 331
                temp.append(saleSnapshot)
332
            else:
12368 kshitij.so 333
                temp = []
334
                temp.append(saleSnapshot)
335
                saleMap['FBB'+str(saleSnapshot.item_id)] = temp
12363 kshitij.so 336
 
12424 kshitij.so 337
 
12363 kshitij.so 338
def computeCourierCost(weight):
12378 kshitij.so 339
    try:
340
        cCost = 10.0;
341
        slabs = int((weight*1000)/500-.001)
342
        for slab in range(0,slabs):
343
            cCost = cCost + 10.0;
344
        return cCost;
345
    except:
346
        return 10.0
12363 kshitij.so 347
 
348
 
349
def populateStuff(time,runType):
350
    global amazonLongTermActivePromotions
12396 kshitij.so 351
    global amazonShortTermActivePromotions
12363 kshitij.so 352
    itemInfo = []
353
    inventory_client = InventoryClient().get_client()
354
    fbaAvailableInventorySnapshot = inventory_client.getAllAvailableAmazonFbaItemInventory()
12387 kshitij.so 355
    print len(fbaAvailableInventorySnapshot)
12363 kshitij.so 356
    for fbaInventoryItem in fbaAvailableInventorySnapshot:
357
        d_amazon_listed = Amazonlisted.get_by(itemId=fbaInventoryItem.item_id)
358
        if d_amazon_listed is None:
359
            continue
360
        if d_amazon_listed.overrrideWanlc:
361
            wanlc = d_amazon_listed.exceptionalWanlc
362
        else:
363
            wanlc = inventory_client.getWanNlcForSource(fbaInventoryItem.item_id,OrderSource.AMAZON)
364
        it = Item.query.filter_by(id=fbaInventoryItem.item_id).one()
365
        category = Category.query.filter_by(id=it.category).one()
366
        parent_category = Category.query.filter_by(id=category.parent_category_id).first()
367
        scp = SourceCategoryPercentage.query.filter(SourceCategoryPercentage.category_id==it.category).filter(SourceCategoryPercentage.source==OrderSource.AMAZON).filter(SourceCategoryPercentage.startDate<=time).filter(SourceCategoryPercentage.expiryDate>=time).first()
368
        if scp is not None:
369
            sourcePercentage = scp
370
        else:
371
            spm = SourcePercentageMaster.get_by(source=OrderSource.AMAZON)
372
            sourcePercentage = spm
12375 kshitij.so 373
        if fbaInventoryItem.location==0:
12377 kshitij.so 374
            sku = 'FBA'+str(fbaInventoryItem.item_id)
12363 kshitij.so 375
            state_id = 1
12375 kshitij.so 376
        elif fbaInventoryItem.location==1:
12377 kshitij.so 377
            sku = 'FBB'+str(fbaInventoryItem.item_id)
12363 kshitij.so 378
            state_id = 2
379
        else:
380
            continue
381
        cc = computeCourierCost(it.weight)
12379 kshitij.so 382
 
12447 kshitij.so 383
        amazonItemInfo = __AmazonItemInfo(None, wanlc,cc, sku, it.product_group, it.brand, it.model_name, it.model_number, it.color, it.weight, category.parent_category_id, it.risky, None, runType, parent_category.display_name,sourcePercentage,fbaInventoryItem.availability,state_id,d_amazon_listed.otherCost)
12363 kshitij.so 384
        itemInfo.append(amazonItemInfo)
385
    amPromotions = AmazonPromotion.query.filter(AmazonPromotion.startDate<=time).filter(AmazonPromotion.endDate>=time).filter(AmazonPromotion.promotionType==AmazonPromotionType.LONGTERM).filter(AmazonPromotion.promotionActive==True) \
386
    .group_by(AmazonPromotion.sku).order_by(desc(AmazonPromotion.addedOn)).all()
387
    for amPromotion in amPromotions:
12433 kshitij.so 388
        amazonLongTermActivePromotions[amPromotion.sku] = __Promotion(amPromotion.salePrice,amPromotion.subsidy,amPromotion.promotionType,amPromotion.endDate)
12396 kshitij.so 389
    amPromotions = AmazonPromotion.query.filter(AmazonPromotion.startDate<=time).filter(AmazonPromotion.endDate>=time).filter(AmazonPromotion.promotionType==AmazonPromotionType.SHORTTERM).filter(AmazonPromotion.promotionActive==True) \
390
    .group_by(AmazonPromotion.sku).order_by(desc(AmazonPromotion.addedOn)).all()
391
    for amPromotion in amPromotions:
12433 kshitij.so 392
        amazonShortTermActivePromotions[amPromotion.sku] = __Promotion(amPromotion.salePrice,amPromotion.subsidy,amPromotion.promotionType,amPromotion.endDate)
12363 kshitij.so 393
    session.close()
12450 kshitij.so 394
    print "No of items populated ",len(itemInfo)
12452 kshitij.so 395
    sleep(5)
12363 kshitij.so 396
    return itemInfo
397
 
12430 kshitij.so 398
def getPriceAndAsin(itemInfo):
399
    skus = []
400
    for item in itemInfo:
401
        skus.append(item.sku)
402
    ourPricingForSku = amScraper.get_my_pricing_for_sku('A21TJRUUN4KGV', skus)
403
    for item in itemInfo:
404
        ourPricing = ourPricingForSku.get(item.sku)
12441 kshitij.so 405
        if ourPricing is None or len(ourPricing.keys())==0:
12430 kshitij.so 406
            item.ourSp = 0
407
            item.promoPrice = 0
408
            item.isPromotion = False
409
        else:
410
            item.ourSp = ourPricing.get('sellingPrice')
411
            item.promoPrice = ourPricing.get('promoPrice')
412
            item.isPromotion = ourPricing.get('promotion')
12450 kshitij.so 413
 
12430 kshitij.so 414
 
415
 
12363 kshitij.so 416
def decideCategory(itemInfo):
417
    exceptionList, negativeMargin, cheapest, amongCheapestAndCanCompete, canCompete, almostCompete, cantCompete = [],[],[],[],[],[],[] 
12430 kshitij.so 418
    skus = []
12363 kshitij.so 419
    for item in itemInfo:
12430 kshitij.so 420
        skus.append(item.sku)
421
    aggResponse = amScraper.get_competitive_pricing_for_sku('A21TJRUUN4KGV', skus)
422
    ourPricingForSku = amScraper.get_my_pricing_for_sku('A21TJRUUN4KGV', skus)
12403 kshitij.so 423
 
12363 kshitij.so 424
    for val in itemInfo:
12430 kshitij.so 425
        scrapInfo = aggResponse.get(val.sku)
12443 kshitij.so 426
        if scrapInfo is None or len(scrapInfo)==0 or val.nlc==0 or len(ourPricingForSku.get(val.sku).keys())==0:
12363 kshitij.so 427
            temp = []
428
            temp.append(val)
429
            if val.nlc==0 or val.nlc is None:
12456 kshitij.so 430
                print "WANLC is 0"
12363 kshitij.so 431
                temp.append("WANLC is 0")
12443 kshitij.so 432
            elif ourPricingForSku.get(val.sku) is None or ourPricingForSku.get(val.sku).keys()==0:
12456 kshitij.so 433
                print "Unable to fetch our price"
12430 kshitij.so 434
                temp.append("Unable to fetch our price")
12363 kshitij.so 435
            else:
12456 kshitij.so 436
                print "Unable to fetch competive pricing"
12430 kshitij.so 437
                temp.append("Unable to fetch competitive pricing")
12363 kshitij.so 438
            exceptionList.append(temp)
439
            continue
12430 kshitij.so 440
        val.asin = ourPricingForSku.get(val.sku).get('asin')
441
        val.ourSp = ourPricingForSku.get(val.sku).get('sellingPrice')
442
        val.promoPrice = ourPricingForSku.get(val.sku).get('promoPrice')
443
        val.isPromo = ourPricingForSku.get(val.sku).get('promotion')
12363 kshitij.so 444
        iterator = 0
445
        sku, lowestSellerName,secondLowestSellerName, thirdLowestSellerName = ('',)*4
12432 kshitij.so 446
        ourSp, ourRank, lowestSellerSp, secondLowestSellerSp, thirdLowestSellerSp, lowestPossibleSp = (0,)*6
12430 kshitij.so 447
        lowestSellerShippingTime, lowestSellerRating, secondLowestSellerShippingTime, secondLowestSellerRating, thirdLowestSellerShippingTime , \
448
        thirdLowestSellerRating, lowestSellerType, secondLowestSellerType, thirdLowestSellerType = (0,)*9
449
        isPromo = False
12363 kshitij.so 450
        sku = val.sku
451
        multipleListings = False
12430 kshitij.so 452
        ourSkuDetails = ourPricingForSku.get(val.sku)
12442 kshitij.so 453
        if not (ourSkuDetails.get('promotion') and (amazonLongTermActivePromotions.has_key(val.sku) or amazonShortTermActivePromotions.has_key(val.sku))):
12432 kshitij.so 454
            temp = []
455
            temp.append(val)
12456 kshitij.so 456
            print "promo misconfigured"
12432 kshitij.so 457
            temp.append("Promo misconfigured")
12457 kshitij.so 458
            exceptionList.append(temp)
12432 kshitij.so 459
            continue
460
 
12430 kshitij.so 461
        scrapInfo.append(ourSkuDetails)
462
        sortedScrapInfo =  sorted(scrapInfo, key=itemgetter('promoPrice','notOurSku'))
463
        for info in sortedScrapInfo:
464
            if  not info.notOurSku:
12442 kshitij.so 465
                ourSp = info['sellingPrice']
466
                promoPrice = info['promoPrice']
467
                isPromo = info['promotion']
12430 kshitij.so 468
                ourRank = iterator + 1
12363 kshitij.so 469
 
470
            if iterator == 0:
12430 kshitij.so 471
                lowestSellerSp = info['promoPrice']
472
                lowestSellerShippingTime = info['shippingTime']
473
                lowestSellerRating = info['rating']
474
                lowestSellerType = info['fulfillmentChannel']
12363 kshitij.so 475
 
476
            if iterator == 1:
12430 kshitij.so 477
                secondLowestSellerSp = info['promoPrice']
478
                secondLowestSellerShippingTime = info['shippingTime']
479
                secondLowestSellerRating = info['rating']
480
                secondLowestSellerType = info['fulfillmentChannel']
12363 kshitij.so 481
 
482
            if iterator == 2:
12430 kshitij.so 483
                thirdLowestSellerSp = info['promoPrice']
484
                thirdLowestSellerShippingTime = info['shippingTime']
485
                thirdLowestSellerRating = info['rating']
486
                thirdLowestSellerType = info['fulfillmentChannel']
12363 kshitij.so 487
 
488
            iterator += 1
12401 kshitij.so 489
        print "terminating iterator"
12363 kshitij.so 490
 
491
 
12408 kshitij.so 492
        print "Creating object am details",val.sku
12430 kshitij.so 493
        amDetails = __AmazonDetails(sku, float(ourSp), ourRank, lowestSellerName,float(lowestSellerSp),secondLowestSellerName, float(secondLowestSellerSp), thirdLowestSellerName, float(thirdLowestSellerSp),len(scrapInfo),multipleListings,promoPrice,isPromo, \
494
                    lowestSellerShippingTime ,lowestSellerRating, secondLowestSellerShippingTime, secondLowestSellerRating, thirdLowestSellerShippingTime , thirdLowestSellerRating, lowestSellerType, secondLowestSellerType, thirdLowestSellerType)
12414 kshitij.so 495
        print "am details obj created"
12363 kshitij.so 496
        try:
12414 kshitij.so 497
            print "inside val getter"
12418 kshitij.so 498
            itemVatMaster = ItemVatMaster.query.filter(and_(ItemVatMaster.itemId==int(val.sku[3:]), ItemVatMaster.stateId==val.state_id)).first()
499
            if itemVatMaster is None:
12419 kshitij.so 500
                d_item = Item.query.filter_by(id=int(val.sku[3:])).first()
501
                if d_item is None:
502
                    raise 
503
                else:
12430 kshitij.so 504
                    vatMaster = CategoryVatMaster.query.filter(and_(CategoryVatMaster.categoryId==d_item.category, CategoryVatMaster.minVal<=amDetails.promoPrice,  CategoryVatMaster.maxVal>=amDetails.promoPrice,  CategoryVatMaster.stateId == val.state_id)).first()
12419 kshitij.so 505
                if vatMaster is None:
12418 kshitij.so 506
                    raise
12419 kshitij.so 507
                else:
508
                    val.vatRate = vatMaster.vatPercent
509
                    print "vat fetched"
12418 kshitij.so 510
            else:
511
                val.vatRate = itemVatMaster.vatPercentage
12419 kshitij.so 512
                print "vat fetched"
12363 kshitij.so 513
        except:
12414 kshitij.so 514
            print "vat exception"
12363 kshitij.so 515
            temp = []
516
            temp.append(val)
517
            temp.append("Vat not available")
518
            exceptionList.append(temp)
519
            continue
520
 
521
        lowestPossibleSp = getLowestPossibleSp(amDetails,val,val.sourcePercentage)
12408 kshitij.so 522
        print "Creating pricing obj"
12432 kshitij.so 523
        amPricing = __AmazonPricing(ourSp,lowestPossibleSp)
12363 kshitij.so 524
 
12432 kshitij.so 525
        if amPricing.promoPrice < amPricing.lowestPossibleSp:
12363 kshitij.so 526
            temp = []
527
            temp.append(val)
528
            temp.append(amDetails)
529
            temp.append(amPricing)
530
            negativeMargin.append(temp)
531
            continue
532
 
533
        if amDetails.ourRank==1:
534
            temp = []
535
            temp.append(val)
536
            temp.append(amDetails)
537
            temp.append(amPricing)
538
            cheapest.append(temp)
539
            continue
540
 
12430 kshitij.so 541
        if (amDetails.lowestSellerSp > amPricing.lowestPossibleSp) and ((((float(amDetails.promoPrice - amDetails.lowestSellerSp))/amDetails.promoPrice)<=.01) or ((amDetails.promoPrice - amDetails.lowestSellerSp)<=25)):
12363 kshitij.so 542
            temp = []
543
            temp.append(val)
544
            temp.append(amDetails)
545
            temp.append(amPricing)
546
            amongCheapestAndCanCompete.append(temp)
547
            continue
548
 
549
        if (amDetails.lowestSellerSp > amPricing.lowestPossibleSp):
550
            temp = []
551
            temp.append(val)
552
            temp.append(amDetails)
553
            temp.append(amPricing)
554
            canCompete.append(temp)
555
            continue
556
 
12403 kshitij.so 557
        if amDetails.lowestSellerSp*(1+.01) >= amPricing.lowestPossibleSp:
12396 kshitij.so 558
            temp = []
559
            temp.append(val)
560
            temp.append(amDetails)
561
            temp.append(amPricing)
562
            almostCompete.append(temp)
563
            continue
564
 
565
 
12363 kshitij.so 566
        temp = []
567
        temp.append(val)
568
        temp.append(amDetails)
569
        temp.append(amPricing)
570
        cantCompete.append(temp)
12414 kshitij.so 571
    print "Created category..."
12363 kshitij.so 572
 
573
    return exceptionList, negativeMargin, cheapest, amongCheapestAndCanCompete, canCompete, almostCompete, cantCompete
12396 kshitij.so 574
 
12363 kshitij.so 575
 
576
def getLowestPossibleSp(amazonDetails,val,spm):
12447 kshitij.so 577
    lowestPossibleSp = (val.nlc+(val.courierCost)*(1+(spm.serviceTax/100))*(1+(val.vatRate/100))+(15+val.otherCost)*(1+(val.vatRate)/100))/(1-(spm.commission/100+spm.emiFee/100)*(1+(spm.serviceTax/100))*(1+(val.vatRate)/100)-(spm.returnProvision/100)*(1+(val.vatRate)/100));
12432 kshitij.so 578
    if val.isPromo:
579
        if amazonLongTermActivePromotions.has_key(val.sku):
580
            subsidy = (amazonLongTermActivePromotions.has_key(val.sku)).subsidy
581
        else:
582
            subsidy = (amazonShortTermActivePromotions.has_key(val.sku)).subsidy
583
        lowestPossibleSp = lowestPossibleSp - subsidy
12363 kshitij.so 584
    return round(lowestPossibleSp,2)
585
 
586
def getTargetTp(targetSp,spm,val):
12424 kshitij.so 587
    targetTp = targetSp- targetSp*(spm.commission/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost)*(1+(spm.serviceTax/100))
12363 kshitij.so 588
    return round(targetTp,2)
589
 
590
def commitExceptionList(exceptionList,timestamp,runType):
591
    for exceptionItem in exceptionList:
592
        val = exceptionItem[0]
593
        reason = exceptionItem[1]
594
        amazonScrapingHistory = AmazonScrapingHistory()
595
        amazonScrapingHistory.item_id = val.sku[3:]
596
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 597
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 598
        amazonScrapingHistory.reason = reason
599
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
600
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.EXCEPTION
601
        amazonScrapingHistory.timestamp = timestamp
602
    session.commit()
603
 
604
def commitNegativeMargin(negativeMargin,timestamp,runType):
605
    for negativeMarginItem in negativeMargin:
606
        val = negativeMarginItem[0]
607
        amDetails = negativeMarginItem[1]
608
        amPricing = negativeMarginItem[2]
609
        spm = val.sourcePercentage
610
        amazonScrapingHistory = AmazonScrapingHistory()
611
        amazonScrapingHistory.item_id = val.sku[3:]
612
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 613
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 614
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 615
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12363 kshitij.so 616
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
617
        amazonScrapingHistory.ourRank = amDetails.ourRank
618
        amazonScrapingHistory.ourInventory = val.ourInventory
619
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
620
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
621
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
622
        amazonScrapingHistory.wanlc = val.nlc
12447 kshitij.so 623
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 624
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 625
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 626
        amazonScrapingHistory.returnProvision = spm.returnProvision
627
        amazonScrapingHistory.courierCost = val.courierCost
628
        amazonScrapingHistory.risky = val.risky
629
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
630
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
631
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.NEGATIVE_MARGIN
632
        amazonScrapingHistory.timestamp = timestamp
633
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
634
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 635
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 636
    session.commit()
637
 
638
 
639
def commitCheapest(cheapest,timestamp,runType):
640
    for cheapestItem in cheapest:
641
        val = cheapestItem[0]
642
        amDetails = cheapestItem[1]
643
        amPricing = cheapestItem[2]
644
        spm = val.sourcePercentage
645
        amazonScrapingHistory = AmazonScrapingHistory()
646
        amazonScrapingHistory.item_id = val.sku[3:]
647
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 648
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 649
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 650
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12363 kshitij.so 651
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
652
        amazonScrapingHistory.ourRank = amDetails.ourRank
653
        amazonScrapingHistory.ourInventory = val.ourInventory
654
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 655
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
656
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
657
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12363 kshitij.so 658
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12430 kshitij.so 659
        amazonScrapingHistory.secondSellerShippingTime = amDetails.secondSellerShippingTime
660
        amazonScrapingHistory.secondSellerRating = amDetails.secondSellerRating
661
        amazonScrapingHistory.secondSellerType = amDetails.secondSellerType
12363 kshitij.so 662
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12430 kshitij.so 663
        amazonScrapingHistory.thirdSellerShippingTime = amDetails.thirdSellerShippingTime
664
        amazonScrapingHistory.thirdSellerRating = amDetails.thirdSellerRating
665
        amazonScrapingHistory.thirdSellerType = amDetails.thirdSellerType
12447 kshitij.so 666
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 667
        amazonScrapingHistory.wanlc = val.nlc
668
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 669
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 670
        amazonScrapingHistory.returnProvision = spm.returnProvision
671
        amazonScrapingHistory.courierCost = val.courierCost
672
        amazonScrapingHistory.risky = val.risky
673
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
674
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
675
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.BUY_BOX
676
        amazonScrapingHistory.timestamp = timestamp
677
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
12430 kshitij.so 678
        proposed_sp = max(amDetails.secondLowestSellerSp - max((20, amDetails.secondLowestSellerSp*0.002)), amPricing.lowestPossibleSp)
12433 kshitij.so 679
        if amazonScrapingHistory.isPromotion:
680
            if amazonLongTermActivePromotions.has_key(val.sku):
681
                proposed_sp = min(proposed_sp,(amazonLongTermActivePromotions.has_key(val.sku)).salePrice)
682
            else:
683
                proposed_sp = min(proposed_sp,(amazonShortTermActivePromotions.has_key(val.sku)).salePrice)
12363 kshitij.so 684
        proposed_tp = getTargetTp(proposed_sp,spm,val)
685
        amazonScrapingHistory.proposedSp = proposed_sp
686
        amazonScrapingHistory.proposedTp = proposed_tp
687
        amazonScrapingHistory.marginIncreasedPotential = proposed_tp - amPricing.ourTp
688
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
689
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 690
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 691
    session.commit()
692
 
693
 
694
 
695
def commitAmongCheapestAndCanCompete(amongCheapestAndCanCompete,timestamp,runType):
696
    for amongCheapestAndCanCompeteItem in amongCheapestAndCanCompete:
697
        val = amongCheapestAndCanCompeteItem[0]
698
        amDetails = amongCheapestAndCanCompeteItem[1]
699
        amPricing = amongCheapestAndCanCompeteItem[2]
700
        spm = val.sourcePercentage
701
        amazonScrapingHistory = AmazonScrapingHistory()
702
        amazonScrapingHistory.item_id = val.sku[3:]
703
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 704
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 705
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 706
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12363 kshitij.so 707
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
708
        amazonScrapingHistory.ourRank = amDetails.ourRank
709
        amazonScrapingHistory.ourInventory = val.ourInventory
710
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 711
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
712
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
713
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12363 kshitij.so 714
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12430 kshitij.so 715
        amazonScrapingHistory.secondSellerShippingTime = amDetails.secondSellerShippingTime
716
        amazonScrapingHistory.secondSellerRating = amDetails.secondSellerRating
717
        amazonScrapingHistory.secondSellerType = amDetails.secondSellerType
12363 kshitij.so 718
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12430 kshitij.so 719
        amazonScrapingHistory.thirdSellerShippingTime = amDetails.thirdSellerShippingTime
720
        amazonScrapingHistory.thirdSellerRating = amDetails.thirdSellerRating
721
        amazonScrapingHistory.thirdSellerType = amDetails.thirdSellerType
12447 kshitij.so 722
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 723
        amazonScrapingHistory.wanlc = val.nlc
724
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 725
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 726
        amazonScrapingHistory.returnProvision = spm.returnProvision
727
        amazonScrapingHistory.courierCost = val.courierCost
728
        amazonScrapingHistory.risky = val.risky
729
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
730
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
731
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE
732
        amazonScrapingHistory.timestamp = timestamp
733
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
734
        proposed_sp = max(amDetails.lowestSellerSp - max((5, amDetails.lowestSellerSp*0.001)), amPricing.lowestPossibleSp)
735
        proposed_tp = getTargetTp(proposed_sp,spm,val)
736
        amazonScrapingHistory.proposedSp = proposed_sp
737
        amazonScrapingHistory.proposedTp = proposed_tp
738
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
739
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 740
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 741
    session.commit()
742
 
743
def commitCanCompete(canCompete,timestamp,runType):
744
    for canCompeteItem in canCompete:
745
        val = canCompeteItem[0]
746
        amDetails = canCompeteItem[1]
747
        amPricing = canCompeteItem[2]
748
        spm = val.sourcePercentage
749
        amazonScrapingHistory = AmazonScrapingHistory()
750
        amazonScrapingHistory.item_id = val.sku[3:]
751
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 752
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 753
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 754
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12363 kshitij.so 755
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
756
        amazonScrapingHistory.ourRank = amDetails.ourRank
757
        amazonScrapingHistory.ourInventory = val.ourInventory
758
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 759
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
760
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
761
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12363 kshitij.so 762
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12430 kshitij.so 763
        amazonScrapingHistory.secondSellerShippingTime = amDetails.secondSellerShippingTime
764
        amazonScrapingHistory.secondSellerRating = amDetails.secondSellerRating
765
        amazonScrapingHistory.secondSellerType = amDetails.secondSellerType
12363 kshitij.so 766
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12430 kshitij.so 767
        amazonScrapingHistory.thirdSellerShippingTime = amDetails.thirdSellerShippingTime
768
        amazonScrapingHistory.thirdSellerRating = amDetails.thirdSellerRating
769
        amazonScrapingHistory.thirdSellerType = amDetails.thirdSellerType
12447 kshitij.so 770
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 771
        amazonScrapingHistory.wanlc = val.nlc
772
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 773
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 774
        amazonScrapingHistory.returnProvision = spm.returnProvision
775
        amazonScrapingHistory.courierCost = val.courierCost
776
        amazonScrapingHistory.risky = val.risky
777
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
778
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
779
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.COMPETITIVE
780
        amazonScrapingHistory.timestamp = timestamp
781
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
782
        proposed_sp = max(amDetails.lowestSellerSp - max((5, amDetails.lowestSellerSp*0.001)), amPricing.lowestPossibleSp)
783
        proposed_tp = getTargetTp(proposed_sp,spm,val)
784
        amazonScrapingHistory.proposedSp = proposed_sp
785
        amazonScrapingHistory.proposedTp = proposed_tp
786
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
787
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 788
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 789
    session.commit()
790
 
12383 kshitij.so 791
def commitAlmostCompete(almostCompete,timestamp,runType):
12396 kshitij.so 792
    for almostCompeteItem in almostCompete:
793
        val = almostCompeteItem[0]
794
        amDetails = almostCompeteItem[1]
795
        amPricing = almostCompeteItem[2]
796
        spm = val.sourcePercentage
797
        amazonScrapingHistory = AmazonScrapingHistory()
798
        amazonScrapingHistory.item_id = val.sku[3:]
799
        amazonScrapingHistory.warehouseLocation = val.state_id
800
        amazonScrapingHistory.parentCategoryId = val.parent_category
801
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 802
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12396 kshitij.so 803
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
804
        amazonScrapingHistory.ourRank = amDetails.ourRank
805
        amazonScrapingHistory.ourInventory = val.ourInventory
806
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 807
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
808
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
809
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12396 kshitij.so 810
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12430 kshitij.so 811
        amazonScrapingHistory.secondSellerShippingTime = amDetails.secondSellerShippingTime
812
        amazonScrapingHistory.secondSellerRating = amDetails.secondSellerRating
813
        amazonScrapingHistory.secondSellerType = amDetails.secondSellerType
12396 kshitij.so 814
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12430 kshitij.so 815
        amazonScrapingHistory.thirdSellerShippingTime = amDetails.thirdSellerShippingTime
816
        amazonScrapingHistory.thirdSellerRating = amDetails.thirdSellerRating
817
        amazonScrapingHistory.thirdSellerType = amDetails.thirdSellerType
12447 kshitij.so 818
        amazonScrapingHistory.otherCost = val.otherCost
12396 kshitij.so 819
        amazonScrapingHistory.wanlc = val.nlc
820
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 821
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12396 kshitij.so 822
        amazonScrapingHistory.returnProvision = spm.returnProvision
823
        amazonScrapingHistory.courierCost = val.courierCost
824
        amazonScrapingHistory.risky = val.risky
825
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
826
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
827
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.ALMOST_COMPETE
828
        amazonScrapingHistory.timestamp = timestamp
829
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
12425 kshitij.so 830
        proposed_sp = min(amDetails.lowestSellerSp*(1+.01),amPricing.lowestPossibleSp)
12396 kshitij.so 831
        proposed_tp = getTargetTp(proposed_sp,spm,val)
832
        target_nlc = proposed_tp - amPricing.lowestPossibleTp + val.nlc
833
        amazonScrapingHistory.proposedSp = proposed_sp
834
        amazonScrapingHistory.proposedTp = proposed_tp
835
        amazonScrapingHistory.targetNlc = target_nlc
836
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
837
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 838
        amazonScrapingHistory.isPromotion = val.isPromo
12396 kshitij.so 839
    session.commit()
12363 kshitij.so 840
 
12396 kshitij.so 841
 
12363 kshitij.so 842
def commitCantCompete(cantCompete, timestamp,runType):
843
    for cantCompeteItem in cantCompete:
844
        val = cantCompeteItem[0]
845
        amDetails = cantCompeteItem[1]
846
        amPricing = cantCompeteItem[2]
847
        spm = val.sourcePercentage
848
        amazonScrapingHistory = AmazonScrapingHistory()
849
        amazonScrapingHistory.item_id = val.sku[3:]
850
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 851
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 852
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 853
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12363 kshitij.so 854
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
855
        amazonScrapingHistory.ourRank = amDetails.ourRank
856
        amazonScrapingHistory.ourInventory = val.ourInventory
857
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 858
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
859
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
860
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12363 kshitij.so 861
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12430 kshitij.so 862
        amazonScrapingHistory.secondSellerShippingTime = amDetails.secondSellerShippingTime
863
        amazonScrapingHistory.secondSellerRating = amDetails.secondSellerRating
864
        amazonScrapingHistory.secondSellerType = amDetails.secondSellerType
12363 kshitij.so 865
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12430 kshitij.so 866
        amazonScrapingHistory.thirdSellerShippingTime = amDetails.thirdSellerShippingTime
867
        amazonScrapingHistory.thirdSellerRating = amDetails.thirdSellerRating
868
        amazonScrapingHistory.thirdSellerType = amDetails.thirdSellerType
12447 kshitij.so 869
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 870
        amazonScrapingHistory.wanlc = val.nlc
871
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 872
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 873
        amazonScrapingHistory.returnProvision = spm.returnProvision
874
        amazonScrapingHistory.courierCost = val.courierCost
875
        amazonScrapingHistory.risky = val.risky
876
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
877
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
878
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.CANT_COMPETE
879
        amazonScrapingHistory.timestamp = timestamp
880
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
881
        proposed_sp = amDetails.lowestSellerSp - max(5, amDetails.lowestSellerSp*0.001)
882
        proposed_tp = getTargetTp(proposed_sp,spm,val)
883
        target_nlc = proposed_tp - amPricing.lowestPossibleTp + val.nlc
884
        amazonScrapingHistory.proposedSp = proposed_sp
885
        amazonScrapingHistory.proposedTp = proposed_tp
886
        amazonScrapingHistory.targetNlc = target_nlc
887
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
888
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 889
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 890
    session.commit()
891
 
12396 kshitij.so 892
def markAutoFavourites(time):
893
    nowAutoFav = []
894
    previouslyAutoFav = []
895
    stockList = []
896
    saleList = []
897
    items = session.query(func.sum(AmazonScrapingHistory.ourInventory),AmazonScrapingHistory.item_id).group_by(AmazonScrapingHistory.item_id).all()
898
    allItems = session.query(Amazonlisted).all()
899
    for item in items:
900
        reason = ""
901
        if item[0]>=5:
902
            stockList.append(item[1])
903
 
904
    for sku, val in saleMap.iteritems():
905
        totalSale = 0
906
        item_id = sku.replace('FBA','').replace('FBB','')
907
        val =saleMap.get('FBA'+str(item_id))
908
        if val is not None:
909
            for sale in val:
910
                totalSale += sale.totalOrderCount
911
        val =saleMap.get('FBB'+str(item_id))
912
        if val is not None:
913
            for sale in val:
914
                totalSale += sale.totalOrderCount
915
        if totalSale > 0:
916
            saleList.append(item_id)
917
 
918
    for aItem in allItems:
919
        reason = ""
920
        toMark = False
921
        if aItem.itemId in saleList:
922
            toMark = True
923
            reason+="Total FC sale is greater than 1 for last five days.."
924
        if aItem.itemId in stockList:
925
            toMark = True
926
            reason+="Item is present in buy box in last 3 days"
927
        if not aItem.autoFavourite:
928
            print "Item is not under auto favourite"
929
        if toMark:
930
            temp=[]
931
            temp.append(aItem.itemId)
932
            temp.append(reason)
933
            nowAutoFav.append(temp)
934
        if (not toMark) and aItem.autoFavourite:
935
            previouslyAutoFav.append(aItem.itemId)
936
        aItem.autoFavourite = toMark
937
    session.commit()
938
    return previouslyAutoFav, nowAutoFav
939
 
12444 kshitij.so 940
def writeReport(timestamp,autoDecreaseItems,autoIncreaseItems,previousAutoFav,nowAutoFav,runType):
12396 kshitij.so 941
    wbk = xlwt.Workbook()
942
    sheet = wbk.add_sheet('Can\'t Compete')
943
    xstr = lambda s: s or ""
944
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
945
 
946
    excel_integer_format = '0'
947
    integer_style = xlwt.XFStyle()
948
    integer_style.num_format_str = excel_integer_format
949
 
950
    sheet.write(0, 0, "Item Id", heading_xf)
951
    sheet.write(0, 1, "Amazon Sku", heading_xf)
952
    sheet.write(0, 2, "Asin", heading_xf)
953
    sheet.write(0, 3, "Location", heading_xf)
954
    sheet.write(0, 4, "Brand", heading_xf)
955
    sheet.write(0, 5, "Product Name", heading_xf)
956
    sheet.write(0, 6, "Weight", heading_xf)
957
    sheet.write(0, 7, "Courier Cost", heading_xf)
958
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 959
    sheet.write(0, 9, "Promo Price", heading_xf)
960
    sheet.write(0, 10, "Is Promotion", heading_xf)
961
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 962
    sheet.write(0, 12, "Rank", heading_xf)
963
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 964
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
965
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
966
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 967
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 968
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
969
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
970
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
971
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
972
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 973
    sheet.write(0, 23, "Other Cost", heading_xf)
974
    sheet.write(0, 24, "WANLC", heading_xf)
975
    sheet.write(0, 25, "Commission", heading_xf)
976
    sheet.write(0, 26, "Competitor Commission", heading_xf)
977
    sheet.write(0, 27, "Return Provision", heading_xf)
978
    sheet.write(0, 28, "Margin", heading_xf)
979
    sheet.write(0, 29, "Risky", heading_xf)
980
    sheet.write(0, 30, "Proposed Sp", heading_xf)
981
    sheet.write(0, 31, "Proposed Tp", heading_xf)
982
    sheet.write(0, 32, "Target Nlc", heading_xf)
983
    sheet.write(0, 33, "Avg Sale", heading_xf)
984
    sheet.write(0, 34, "Sales History", heading_xf)
985
    sheet.write(0, 35, "Decision", heading_xf)
986
    sheet.write(0, 36, "Reason", heading_xf)
987
    sheet.write(0, 37, "Updated Price", heading_xf)
12396 kshitij.so 988
 
989
    sheet_iterator = 1
990
    cantCompeteItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.CANT_COMPETE).all()
991
    for cantCompeteItem in cantCompeteItems:
992
        amScraping =  cantCompeteItem[0]
993
        item = cantCompeteItem[1]
994
        sheet.write(sheet_iterator, 0, amScraping.item_id)
995
        if amScraping.warehouseLocation == 1:
996
            sku = 'FBA'+str(amScraping.item_id)
997
            loc = 'MUMBAI'
998
        else:
999
            sku = 'FBB'+str(amScraping.item_id)
1000
            loc = 'BANGLORE'
1001
        sheet.write(sheet_iterator, 1, sku)
1002
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1003
        sheet.write(sheet_iterator, 3, loc)
1004
        sheet.write(sheet_iterator, 4, item.brand)
1005
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1006
        sheet.write(sheet_iterator, 6, item.weight)
1007
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1008
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1009
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1010
        if amScraping.isPromotion:
1011
            sheet.write(sheet_iterator, 10, "Yes")
1012
        else:
1013
            sheet.write(sheet_iterator, 10, "Yes")
1014
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1015
        if amScraping.ourRank > 3:
1016
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1017
        else:
1018
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1019
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1020
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1021
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1022
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1023
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1024
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1025
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1026
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1027
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1028
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1029
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1030
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1031
        sheet.write(sheet_iterator, 25, amScraping.commission)
1032
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1033
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
1034
        sheet.write(sheet_iterator, 28, round(amScraping.ourSellingPrice - amScraping.lowestPossibleSp))
1035
        sheet.write(sheet_iterator, 29, item.risky)
1036
        sheet.write(sheet_iterator, 30, amScraping.proposedSp)
1037
        sheet.write(sheet_iterator, 31, amScraping.proposedTp)
1038
        sheet.write(sheet_iterator, 32, amScraping.targetNlc)
1039
        sheet.write(sheet_iterator, 33, amScraping.avgSale)
1040
        sheet.write(sheet_iterator, 34, getOosString(saleMap.get(sku)))
12444 kshitij.so 1041
        if amScraping.decision is None:
12447 kshitij.so 1042
            sheet.write(sheet_iterator, 35, 'Auto Pricing Inactive')
12444 kshitij.so 1043
            sheet_iterator+=1
1044
            continue
12447 kshitij.so 1045
        sheet.write(sheet_iterator, 35, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1046
        sheet.write(sheet_iterator, 36, amScraping.reason)
12444 kshitij.so 1047
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12447 kshitij.so 1048
            sheet.write(sheet_iterator, 37, math.ceil(amScraping.proposedSellingPrice))
12444 kshitij.so 1049
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12447 kshitij.so 1050
            sheet.write(sheet_iterator, 37, math.ceil(amScraping.ourSellingPrice+max(10,.01*amScraping.ourSellingPrice)))
12396 kshitij.so 1051
        sheet_iterator+=1
1052
 
1053
    sheet = wbk.add_sheet('Competitive')
1054
    xstr = lambda s: s or ""
1055
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1056
 
1057
    excel_integer_format = '0'
1058
    integer_style = xlwt.XFStyle()
1059
    integer_style.num_format_str = excel_integer_format
1060
 
1061
    sheet.write(0, 0, "Item Id", heading_xf)
1062
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1063
    sheet.write(0, 2, "Asin", heading_xf)
1064
    sheet.write(0, 3, "Location", heading_xf)
1065
    sheet.write(0, 4, "Brand", heading_xf)
1066
    sheet.write(0, 5, "Product Name", heading_xf)
1067
    sheet.write(0, 6, "Weight", heading_xf)
1068
    sheet.write(0, 7, "Courier Cost", heading_xf)
1069
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1070
    sheet.write(0, 9, "Promo Price", heading_xf)
1071
    sheet.write(0, 10, "Is Promotion", heading_xf)
1072
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1073
    sheet.write(0, 12, "Rank", heading_xf)
1074
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1075
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1076
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1077
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1078
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1079
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1080
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1081
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1082
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1083
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1084
    sheet.write(0, 23, "Other Cost", heading_xf)
1085
    sheet.write(0, 24, "WANLC", heading_xf)
1086
    sheet.write(0, 25, "Commission", heading_xf)
1087
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1088
    sheet.write(0, 27, "Return Provision", heading_xf)
1089
    sheet.write(0, 28, "Margin", heading_xf)
1090
    sheet.write(0, 29, "Risky", heading_xf)
1091
    sheet.write(0, 30, "Proposed Sp", heading_xf)
1092
    sheet.write(0, 31, "Proposed Tp", heading_xf)
1093
    sheet.write(0, 32, "Avg Sale", heading_xf)
1094
    sheet.write(0, 33, "Sales History", heading_xf)
1095
    sheet.write(0, 34, "Decision", heading_xf)
1096
    sheet.write(0, 35, "Reason", heading_xf)
1097
    sheet.write(0, 36, "Updated Price", heading_xf)
12396 kshitij.so 1098
 
1099
    sheet_iterator = 1
1100
    competitiveItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.COMPETITIVE).all()
1101
    for competitiveItem in competitiveItems:
1102
        amScraping =  competitiveItem[0]
1103
        item = competitiveItem[1]
1104
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1105
        if amScraping.warehouseLocation == 1:
1106
            sku = 'FBA'+str(amScraping.item_id)
1107
            loc = 'MUMBAI'
1108
        else:
1109
            sku = 'FBB'+str(amScraping.item_id)
1110
            loc = 'BANGLORE'
1111
        sheet.write(sheet_iterator, 1, sku)
1112
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1113
        sheet.write(sheet_iterator, 3, loc)
1114
        sheet.write(sheet_iterator, 4, item.brand)
1115
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1116
        sheet.write(sheet_iterator, 6, item.weight)
1117
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1118
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1119
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1120
        if amScraping.isPromotion:
1121
            sheet.write(sheet_iterator, 10, "Yes")
1122
        else:
1123
            sheet.write(sheet_iterator, 10, "Yes")
1124
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1125
        if amScraping.ourRank > 3:
1126
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1127
        else:
1128
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1129
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1130
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1131
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1132
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1133
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1134
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1135
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1136
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1137
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1138
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1139
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1140
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1141
        sheet.write(sheet_iterator, 25, amScraping.commission)
1142
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1143
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
1144
        sheet.write(sheet_iterator, 28, round(amScraping.ourSellingPrice - amScraping.lowestPossibleSp))
1145
        sheet.write(sheet_iterator, 29, item.risky)
1146
        sheet.write(sheet_iterator, 30, amScraping.proposedSp)
1147
        sheet.write(sheet_iterator, 31, amScraping.proposedTp)
1148
        sheet.write(sheet_iterator, 32, amScraping.avgSale)
1149
        sheet.write(sheet_iterator, 33, getOosString(saleMap.get(sku)))
12444 kshitij.so 1150
        if amScraping.decision is None:
12447 kshitij.so 1151
            sheet.write(sheet_iterator, 34, 'Auto Pricing Inactive')
12444 kshitij.so 1152
            sheet_iterator+=1
1153
            continue
12447 kshitij.so 1154
        sheet.write(sheet_iterator, 34, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1155
        sheet.write(sheet_iterator, 35, amScraping.reason)
12444 kshitij.so 1156
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12447 kshitij.so 1157
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.proposedSellingPrice))
12444 kshitij.so 1158
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12447 kshitij.so 1159
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.ourSellingPrice+max(10,.01*amScraping.ourSellingPrice)))
12396 kshitij.so 1160
        sheet_iterator+=1
1161
 
1162
    sheet = wbk.add_sheet('Almost Competitive')
1163
    xstr = lambda s: s or ""
1164
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1165
 
1166
    excel_integer_format = '0'
1167
    integer_style = xlwt.XFStyle()
1168
    integer_style.num_format_str = excel_integer_format
1169
 
1170
    sheet.write(0, 0, "Item Id", heading_xf)
1171
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1172
    sheet.write(0, 2, "Asin", heading_xf)
1173
    sheet.write(0, 3, "Location", heading_xf)
1174
    sheet.write(0, 4, "Brand", heading_xf)
1175
    sheet.write(0, 5, "Product Name", heading_xf)
1176
    sheet.write(0, 6, "Weight", heading_xf)
1177
    sheet.write(0, 7, "Courier Cost", heading_xf)
1178
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1179
    sheet.write(0, 9, "Promo Price", heading_xf)
1180
    sheet.write(0, 10, "Is Promotion", heading_xf)
1181
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1182
    sheet.write(0, 12, "Rank", heading_xf)
1183
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1184
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1185
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1186
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1187
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1188
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1189
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1190
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1191
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1192
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1193
    sheet.write(0, 23, "Other Cost", heading_xf)
1194
    sheet.write(0, 24, "WANLC", heading_xf)
1195
    sheet.write(0, 25, "Commission", heading_xf)
1196
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1197
    sheet.write(0, 27, "Return Provision", heading_xf)
1198
    sheet.write(0, 28, "Margin", heading_xf)
1199
    sheet.write(0, 29, "Risky", heading_xf)
1200
    sheet.write(0, 30, "Proposed Sp", heading_xf)
1201
    sheet.write(0, 31, "Proposed Tp", heading_xf)
1202
    sheet.write(0, 32, "Avg Sale", heading_xf)
1203
    sheet.write(0, 33, "Sales History", heading_xf)
1204
    sheet.write(0, 34, "Decision", heading_xf)
1205
    sheet.write(0, 35, "Reason", heading_xf)
1206
    sheet.write(0, 36, "Updated Price", heading_xf)
12396 kshitij.so 1207
 
1208
    sheet_iterator = 1
1209
    almostCompetitiveItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.ALMOST_COMPETE).all()
1210
    for almostCompetitiveItem in almostCompetitiveItems:
1211
        amScraping =  almostCompetitiveItem[0]
1212
        item = almostCompetitiveItem[1]
1213
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1214
        if amScraping.warehouseLocation == 1:
1215
            sku = 'FBA'+str(amScraping.item_id)
1216
            loc = 'MUMBAI'
1217
        else:
1218
            sku = 'FBB'+str(amScraping.item_id)
1219
            loc = 'BANGLORE'
12432 kshitij.so 1220
        amScraping =  competitiveItem[0]
1221
        item = competitiveItem[1]
1222
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1223
        if amScraping.warehouseLocation == 1:
1224
            sku = 'FBA'+str(amScraping.item_id)
1225
            loc = 'MUMBAI'
1226
        else:
1227
            sku = 'FBB'+str(amScraping.item_id)
1228
            loc = 'BANGLORE'
12396 kshitij.so 1229
        sheet.write(sheet_iterator, 1, sku)
1230
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1231
        sheet.write(sheet_iterator, 3, loc)
1232
        sheet.write(sheet_iterator, 4, item.brand)
1233
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1234
        sheet.write(sheet_iterator, 6, item.weight)
1235
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1236
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1237
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1238
        if amScraping.isPromotion:
1239
            sheet.write(sheet_iterator, 10, "Yes")
1240
        else:
1241
            sheet.write(sheet_iterator, 10, "Yes")
1242
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1243
        if amScraping.ourRank > 3:
1244
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1245
        else:
1246
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1247
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1248
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1249
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1250
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1251
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1252
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1253
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1254
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1255
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1256
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1257
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1258
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1259
        sheet.write(sheet_iterator, 25, amScraping.commission)
1260
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1261
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
1262
        sheet.write(sheet_iterator, 28, round(amScraping.ourSellingPrice - amScraping.lowestPossibleSp))
1263
        sheet.write(sheet_iterator, 29, item.risky)
1264
        sheet.write(sheet_iterator, 30, amScraping.proposedSp)
1265
        sheet.write(sheet_iterator, 31, amScraping.proposedTp)
1266
        sheet.write(sheet_iterator, 32, amScraping.avgSale)
1267
        sheet.write(sheet_iterator, 33, getOosString(saleMap.get(sku)))
12444 kshitij.so 1268
        if amScraping.decision is None:
12447 kshitij.so 1269
            sheet.write(sheet_iterator, 34, 'Auto Pricing Inactive')
12444 kshitij.so 1270
            sheet_iterator+=1
1271
            continue
12447 kshitij.so 1272
        sheet.write(sheet_iterator, 34, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1273
        sheet.write(sheet_iterator, 35, amScraping.reason)
12444 kshitij.so 1274
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12447 kshitij.so 1275
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.proposedSellingPrice))
12444 kshitij.so 1276
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12447 kshitij.so 1277
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.ourSellingPrice+max(10,.01*amScraping.ourSellingPrice)))
12396 kshitij.so 1278
        sheet_iterator+=1
1279
 
1280
    sheet = wbk.add_sheet('Among Cheapest')
1281
    xstr = lambda s: s or ""
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, "Amazon Sku", heading_xf)
1290
    sheet.write(0, 2, "Asin", heading_xf)
1291
    sheet.write(0, 3, "Location", 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, "Our SP", heading_xf)
12432 kshitij.so 1297
    sheet.write(0, 9, "Promo Price", heading_xf)
1298
    sheet.write(0, 10, "Is Promotion", heading_xf)
1299
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1300
    sheet.write(0, 12, "Rank", heading_xf)
1301
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1302
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1303
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1304
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1305
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1306
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1307
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1308
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1309
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1310
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1311
    sheet.write(0, 23, "Other Cost", heading_xf)
1312
    sheet.write(0, 24, "WANLC", heading_xf)
1313
    sheet.write(0, 25, "Commission", heading_xf)
1314
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1315
    sheet.write(0, 27, "Return Provision", heading_xf)
1316
    sheet.write(0, 28, "Margin", heading_xf)
1317
    sheet.write(0, 29, "Risky", heading_xf)
1318
    sheet.write(0, 30, "Proposed Sp", heading_xf)
1319
    sheet.write(0, 31, "Proposed Tp", heading_xf)
1320
    sheet.write(0, 32, "Avg Sale", heading_xf)
1321
    sheet.write(0, 33, "Sales History", heading_xf)
1322
    sheet.write(0, 34, "Decision", heading_xf)
1323
    sheet.write(0, 35, "Reason", heading_xf)
1324
    sheet.write(0, 36, "Updated Price", heading_xf)
12396 kshitij.so 1325
 
1326
    sheet_iterator = 1
1327
    amongCheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE).all()
1328
    for amongCheapestItem in amongCheapestItems:
1329
        amScraping =  amongCheapestItem[0]
1330
        item = amongCheapestItem[1]
1331
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1332
        if amScraping.warehouseLocation == 1:
1333
            sku = 'FBA'+str(amScraping.item_id)
1334
            loc = 'MUMBAI'
1335
        else:
1336
            sku = 'FBB'+str(amScraping.item_id)
1337
            loc = 'BANGLORE'
1338
        sheet.write(sheet_iterator, 1, sku)
1339
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1340
        sheet.write(sheet_iterator, 3, loc)
1341
        sheet.write(sheet_iterator, 4, item.brand)
1342
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1343
        sheet.write(sheet_iterator, 6, item.weight)
1344
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1345
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1346
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1347
        if amScraping.isPromotion:
1348
            sheet.write(sheet_iterator, 10, "Yes")
1349
        else:
1350
            sheet.write(sheet_iterator, 10, "Yes")
1351
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1352
        if amScraping.ourRank > 3:
1353
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1354
        else:
1355
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1356
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1357
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1358
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1359
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1360
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1361
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1362
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1363
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1364
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1365
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1366
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1367
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1368
        sheet.write(sheet_iterator, 25, amScraping.commission)
1369
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1370
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
1371
        sheet.write(sheet_iterator, 28, round(amScraping.ourSellingPrice - amScraping.lowestPossibleSp))
1372
        sheet.write(sheet_iterator, 29, item.risky)
1373
        sheet.write(sheet_iterator, 30, amScraping.proposedSp)
1374
        sheet.write(sheet_iterator, 31, amScraping.proposedTp)
1375
        sheet.write(sheet_iterator, 32, amScraping.avgSale)
1376
        sheet.write(sheet_iterator, 33, getOosString(saleMap.get(sku)))
12444 kshitij.so 1377
        if amScraping.decision is None:
12447 kshitij.so 1378
            sheet.write(sheet_iterator, 34, 'Auto Pricing Inactive')
12444 kshitij.so 1379
            sheet_iterator+=1
1380
            continue
12447 kshitij.so 1381
        sheet.write(sheet_iterator, 34, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1382
        sheet.write(sheet_iterator, 35, amScraping.reason)
12444 kshitij.so 1383
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12447 kshitij.so 1384
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.proposedSellingPrice))
12444 kshitij.so 1385
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12447 kshitij.so 1386
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.ourSellingPrice+max(10,.01*amScraping.ourSellingPrice)))
12396 kshitij.so 1387
        sheet_iterator+=1
1388
 
1389
    sheet = wbk.add_sheet('Cheapest')
1390
    xstr = lambda s: s or ""
1391
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1392
 
1393
    excel_integer_format = '0'
1394
    integer_style = xlwt.XFStyle()
1395
    integer_style.num_format_str = excel_integer_format
1396
 
1397
    sheet.write(0, 0, "Item Id", heading_xf)
1398
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1399
    sheet.write(0, 2, "Asin", heading_xf)
1400
    sheet.write(0, 3, "Location", heading_xf)
1401
    sheet.write(0, 4, "Brand", heading_xf)
1402
    sheet.write(0, 5, "Product Name", heading_xf)
1403
    sheet.write(0, 6, "Weight", heading_xf)
1404
    sheet.write(0, 7, "Courier Cost", heading_xf)
1405
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1406
    sheet.write(0, 9, "Promo Price", heading_xf)
1407
    sheet.write(0, 10, "Is Promotion", heading_xf)
1408
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1409
    sheet.write(0, 12, "Rank", heading_xf)
1410
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1411
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1412
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1413
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1414
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1415
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1416
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1417
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1418
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1419
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1420
    sheet.write(0, 23, "Other Cost", heading_xf)
1421
    sheet.write(0, 24, "WANLC", heading_xf)
1422
    sheet.write(0, 25, "Commission", heading_xf)
1423
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1424
    sheet.write(0, 27, "Return Provision", heading_xf)
1425
    sheet.write(0, 28, "Margin", heading_xf)
1426
    sheet.write(0, 29, "Risky", heading_xf)
1427
    sheet.write(0, 30, "Proposed Sp", heading_xf)
1428
    sheet.write(0, 31, "Proposed Tp", heading_xf)
1429
    sheet.write(0, 32, "Margin Increased Potential", heading_xf)
1430
    sheet.write(0, 33, "Avg Sale", heading_xf)
1431
    sheet.write(0, 34, "Sales History", heading_xf)
1432
    sheet.write(0, 35, "Decision", heading_xf)
1433
    sheet.write(0, 36, "Reason", heading_xf)
1434
    sheet.write(0, 37, "Updated Price", heading_xf)
12396 kshitij.so 1435
 
1436
    sheet_iterator = 1
1437
    cheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.BUY_BOX).all()
1438
    for cheapestItem in cheapestItems:
1439
        amScraping =  cheapestItem[0]
1440
        item = cheapestItem[1]
1441
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1442
        if amScraping.warehouseLocation == 1:
1443
            sku = 'FBA'+str(amScraping.item_id)
1444
            loc = 'MUMBAI'
1445
        else:
1446
            sku = 'FBB'+str(amScraping.item_id)
1447
            loc = 'BANGLORE'
1448
        sheet.write(sheet_iterator, 1, sku)
1449
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1450
        sheet.write(sheet_iterator, 3, loc)
1451
        sheet.write(sheet_iterator, 4, item.brand)
1452
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1453
        sheet.write(sheet_iterator, 6, item.weight)
1454
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1455
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1456
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1457
        if amScraping.isPromotion:
1458
            sheet.write(sheet_iterator, 10, "Yes")
1459
        else:
1460
            sheet.write(sheet_iterator, 10, "Yes")
1461
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1462
        if amScraping.ourRank > 3:
1463
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1464
        else:
1465
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1466
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1467
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1468
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1469
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1470
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1471
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1472
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1473
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1474
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1475
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1476
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1477
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1478
        sheet.write(sheet_iterator, 25, amScraping.commission)
1479
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1480
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
1481
        sheet.write(sheet_iterator, 28, round(amScraping.ourSellingPrice - amScraping.lowestPossibleSp))
1482
        sheet.write(sheet_iterator, 29, item.risky)
1483
        sheet.write(sheet_iterator, 30, amScraping.proposedSp)
1484
        sheet.write(sheet_iterator, 31, amScraping.proposedTp)
1485
        sheet.write(sheet_iterator, 32, amScraping.targetNlc)
1486
        sheet.write(sheet_iterator, 33, amScraping.avgSale)
1487
        sheet.write(sheet_iterator, 34, getOosString(saleMap.get(sku)))
12444 kshitij.so 1488
        if amScraping.decision is None:
12447 kshitij.so 1489
            sheet.write(sheet_iterator, 35, 'Auto Pricing Inactive')
12444 kshitij.so 1490
            sheet_iterator+=1
1491
            continue
12447 kshitij.so 1492
        sheet.write(sheet_iterator, 35, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1493
        sheet.write(sheet_iterator, 36, amScraping.reason)
12444 kshitij.so 1494
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12447 kshitij.so 1495
            sheet.write(sheet_iterator, 37, math.ceil(amScraping.proposedSellingPrice))
12444 kshitij.so 1496
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12447 kshitij.so 1497
            sheet.write(sheet_iterator, 37, math.ceil(amScraping.ourSellingPrice+max(10,.01*amScraping.ourSellingPrice)))
12396 kshitij.so 1498
        sheet_iterator+=1
1499
 
1500
    sheet = wbk.add_sheet('Negative Margin')
1501
    xstr = lambda s: s or ""
1502
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1503
 
1504
    excel_integer_format = '0'
1505
    integer_style = xlwt.XFStyle()
1506
    integer_style.num_format_str = excel_integer_format
1507
 
1508
    sheet.write(0, 0, "Item Id", heading_xf)
1509
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1510
    sheet.write(0, 2, "Asin", heading_xf)
1511
    sheet.write(0, 3, "Location", heading_xf)
1512
    sheet.write(0, 4, "Brand", heading_xf)
1513
    sheet.write(0, 5, "Product Name", heading_xf)
1514
    sheet.write(0, 6, "Weight", heading_xf)
1515
    sheet.write(0, 7, "Courier Cost", heading_xf)
1516
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1517
    sheet.write(0, 9, "Promo Price", heading_xf)
1518
    sheet.write(0, 10, "Is Promotion", heading_xf)
1519
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1520
    sheet.write(0, 12, "Rank", heading_xf)
1521
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1522
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1523
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1524
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1525
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1526
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1527
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1528
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1529
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1530
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1531
    sheet.write(0, 23, "Other Cost", heading_xf)
1532
    sheet.write(0, 24, "WANLC", heading_xf)
1533
    sheet.write(0, 25, "Commission", heading_xf)
1534
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1535
    sheet.write(0, 27, "Return Provision", heading_xf)
1536
    sheet.write(0, 28, "Margin", heading_xf)
1537
    sheet.write(0, 29, "Avg Sale", heading_xf)
1538
    sheet.write(0, 30, "Sales History", heading_xf)
12396 kshitij.so 1539
 
1540
    sheet_iterator = 1
1541
    amongCheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE).all()
1542
    for amongCheapestItem in amongCheapestItems:
1543
        amScraping =  amongCheapestItem[0]
1544
        item = amongCheapestItem[1]
1545
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1546
        if amScraping.warehouseLocation == 1:
1547
            sku = 'FBA'+str(amScraping.item_id)
1548
            loc = 'MUMBAI'
1549
        else:
1550
            sku = 'FBB'+str(amScraping.item_id)
1551
            loc = 'BANGLORE'
1552
        sheet.write(sheet_iterator, 1, sku)
1553
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1554
        sheet.write(sheet_iterator, 3, loc)
1555
        sheet.write(sheet_iterator, 4, item.brand)
1556
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1557
        sheet.write(sheet_iterator, 6, item.weight)
1558
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1559
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1560
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1561
        if amScraping.isPromotion:
1562
            sheet.write(sheet_iterator, 10, "Yes")
1563
        else:
1564
            sheet.write(sheet_iterator, 10, "Yes")
1565
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1566
        if amScraping.ourRank > 3:
1567
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1568
        else:
1569
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1570
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1571
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1572
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1573
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1574
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1575
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1576
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1577
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1578
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1579
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1580
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1581
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1582
        sheet.write(sheet_iterator, 25, amScraping.commission)
1583
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1584
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
1585
        sheet.write(sheet_iterator, 28, round(amScraping.ourTp - amScraping.lowestPossibleTp))
1586
        sheet.write(sheet_iterator, 29, amScraping.avgSale)
1587
        sheet.write(sheet_iterator, 30, getOosString(saleMap.get(sku)))
12396 kshitij.so 1588
        sheet_iterator+=1
1589
 
1590
    sheet = wbk.add_sheet('Exception List')
1591
    xstr = lambda s: s or ""
1592
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1593
 
1594
    excel_integer_format = '0'
1595
    integer_style = xlwt.XFStyle()
1596
    integer_style.num_format_str = excel_integer_format
1597
 
1598
    sheet.write(0, 0, "Item Id", heading_xf)
1599
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1600
    sheet.write(0, 2, "Asin", heading_xf)
1601
    sheet.write(0, 3, "Location", heading_xf)
1602
    sheet.write(0, 4, "Brand", heading_xf)
1603
    sheet.write(0, 5, "Product Name", heading_xf)
1604
    sheet.write(0, 6, "Reason", heading_xf)
1605
 
1606
    sheet_iterator = 1
1607
    amongCheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE).all()
1608
    for amongCheapestItem in amongCheapestItems:
1609
        amScraping =  amongCheapestItem[0]
1610
        item = amongCheapestItem[1]
1611
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1612
        if amScraping.warehouseLocation == 1:
1613
            sku = 'FBA'+str(amScraping.item_id)
1614
            loc = 'MUMBAI'
1615
        else:
1616
            sku = 'FBB'+str(amScraping.item_id)
1617
            loc = 'BANGLORE'
1618
        sheet.write(sheet_iterator, 1, sku)
1619
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1620
        sheet.write(sheet_iterator, 3, loc)
1621
        sheet.write(sheet_iterator, 4, item.brand)
1622
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1623
        sheet.write(sheet_iterator, 6, amScraping.reason)
1624
        sheet_iterator+=1      
1625
 
12444 kshitij.so 1626
 
1627
    if (runType=='FULL'):    
1628
        sheet = wbk.add_sheet('Auto Favorites')
1629
 
1630
        heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1631
 
1632
        excel_integer_format = '0'
1633
        integer_style = xlwt.XFStyle()
1634
        integer_style.num_format_str = excel_integer_format
1635
        xstr = lambda s: s or ""
1636
 
1637
        sheet.write(0, 0, "Item ID", heading_xf)
1638
        sheet.write(0, 1, "Brand", heading_xf)
1639
        sheet.write(0, 2, "Product Name", heading_xf)
1640
        sheet.write(0, 3, "Auto Favourite", heading_xf)
1641
        sheet.write(0, 4, "Reason", heading_xf)
1642
 
1643
        sheet_iterator=1
1644
        for autoFav in nowAutoFav:
1645
            itemId = autoFav[0]
1646
            reason = autoFav[1]
1647
            it = Item.query.filter_by(id=itemId).one()
1648
            sheet.write(sheet_iterator, 0, itemId)
1649
            sheet.write(sheet_iterator, 1, it.brand)
1650
            sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
1651
            sheet.write(sheet_iterator, 3, "True")
1652
            sheet.write(sheet_iterator, 4, reason)
1653
            sheet_iterator+=1
1654
        for prevFav in previousAutoFav:
1655
            it = Item.query.filter_by(id=prevFav).one()
1656
            sheet.write(sheet_iterator, 0, prevFav)
1657
            sheet.write(sheet_iterator, 1, it.brand)
1658
            sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
1659
            sheet.write(sheet_iterator, 3, "False")
1660
            sheet_iterator+=1
1661
 
12396 kshitij.so 1662
    filename = "/tmp/amazon-scraping.xls"
1663
    wbk.save(filename)
1664
 
12363 kshitij.so 1665
def main():
1666
    parser = optparse.OptionParser()
1667
    parser.add_option("-t", "--type", dest="runType",
1668
                   default="FULL", type="string",
1669
                   help="Run type FULL or FAVOURITE")
1670
    (options, args) = parser.parse_args()
1671
    if options.runType not in ('FULL','FAVOURITE'):
1672
        print "Run type argument illegal."
1673
        sys.exit(1)
1674
    time.sleep(5)
1675
    timestamp = datetime.now()
1676
    fetchFbaSale()
1677
    itemInfo = populateStuff(timestamp,options.runType)
1678
    itemsToPopulate = 0
12430 kshitij.so 1679
    toSync = 0
1680
    lenItems = len(itemInfo)
1681
    while(toSync < lenItems):
1682
        oldSync = toSync
1683
        if lenItems >= 20:
1684
            toSync = 20
1685
        else:
1686
            toSync = lenItems - oldSync
1687
        getPriceAndAsin(itemInfo[oldSync:toSync+oldSync])
1688
        toSync = oldSync + toSync
1689
 
12363 kshitij.so 1690
    while (len(itemInfo)>0):
12430 kshitij.so 1691
        if len(itemInfo) >= 20:
1692
            itemsToPopulate = 20
12363 kshitij.so 1693
        else:
1694
            itemsToPopulate = len(itemInfo)
12456 kshitij.so 1695
        print "items to popluate"
12370 kshitij.so 1696
        print itemsToPopulate
12363 kshitij.so 1697
        exceptionList, negativeMargin, cheapest, amongCheapestAndCanCompete, canCompete, almostCompete, cantCompete = decideCategory(itemInfo[0:itemsToPopulate])
1698
        itemInfo[0:itemsToPopulate] = []
1699
        commitExceptionList(exceptionList,timestamp,options.runType)
1700
        commitNegativeMargin(negativeMargin,timestamp,options.runType)
1701
        commitCheapest(cheapest,timestamp,options.runType)
1702
        commitAmongCheapestAndCanCompete(amongCheapestAndCanCompete,timestamp,options.runType)
1703
        commitCanCompete(canCompete,timestamp,options.runType)
1704
        commitAlmostCompete(almostCompete,timestamp,options.runType)
1705
        commitCantCompete(cantCompete, timestamp,options.runType)
12396 kshitij.so 1706
        exceptionList[:], negativeMargin[:], cheapest[:], amongCheapestAndCanCompete[:], canCompete[:], almostCompete[:], cantCompete[:] =[],[],[],[],[],[],[]
1707
    autoDecreaseItems = fetchItemsForAutoDecrease(timestamp)
1708
    autoIncreaseItems = fetchItemsForAutoIncrease(timestamp)
1709
    previousAutoFav, nowAutoFav = markAutoFavourites(timestamp)
12444 kshitij.so 1710
    writeReport(timestamp,autoDecreaseItems,autoIncreaseItems,previousAutoFav,nowAutoFav,options.runType)
12363 kshitij.so 1711
if __name__=='__main__':
1712
    main()