Subversion Repositories SmartDukaan

Rev

Rev 12452 | Rev 12457 | 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")
458
            continue
459
 
12430 kshitij.so 460
        scrapInfo.append(ourSkuDetails)
461
        sortedScrapInfo =  sorted(scrapInfo, key=itemgetter('promoPrice','notOurSku'))
462
        for info in sortedScrapInfo:
463
            if  not info.notOurSku:
12442 kshitij.so 464
                ourSp = info['sellingPrice']
465
                promoPrice = info['promoPrice']
466
                isPromo = info['promotion']
12430 kshitij.so 467
                ourRank = iterator + 1
12363 kshitij.so 468
 
469
            if iterator == 0:
12430 kshitij.so 470
                lowestSellerSp = info['promoPrice']
471
                lowestSellerShippingTime = info['shippingTime']
472
                lowestSellerRating = info['rating']
473
                lowestSellerType = info['fulfillmentChannel']
12363 kshitij.so 474
 
475
            if iterator == 1:
12430 kshitij.so 476
                secondLowestSellerSp = info['promoPrice']
477
                secondLowestSellerShippingTime = info['shippingTime']
478
                secondLowestSellerRating = info['rating']
479
                secondLowestSellerType = info['fulfillmentChannel']
12363 kshitij.so 480
 
481
            if iterator == 2:
12430 kshitij.so 482
                thirdLowestSellerSp = info['promoPrice']
483
                thirdLowestSellerShippingTime = info['shippingTime']
484
                thirdLowestSellerRating = info['rating']
485
                thirdLowestSellerType = info['fulfillmentChannel']
12363 kshitij.so 486
 
487
            iterator += 1
12401 kshitij.so 488
        print "terminating iterator"
12363 kshitij.so 489
 
490
 
12408 kshitij.so 491
        print "Creating object am details",val.sku
12430 kshitij.so 492
        amDetails = __AmazonDetails(sku, float(ourSp), ourRank, lowestSellerName,float(lowestSellerSp),secondLowestSellerName, float(secondLowestSellerSp), thirdLowestSellerName, float(thirdLowestSellerSp),len(scrapInfo),multipleListings,promoPrice,isPromo, \
493
                    lowestSellerShippingTime ,lowestSellerRating, secondLowestSellerShippingTime, secondLowestSellerRating, thirdLowestSellerShippingTime , thirdLowestSellerRating, lowestSellerType, secondLowestSellerType, thirdLowestSellerType)
12414 kshitij.so 494
        print "am details obj created"
12363 kshitij.so 495
        try:
12414 kshitij.so 496
            print "inside val getter"
12418 kshitij.so 497
            itemVatMaster = ItemVatMaster.query.filter(and_(ItemVatMaster.itemId==int(val.sku[3:]), ItemVatMaster.stateId==val.state_id)).first()
498
            if itemVatMaster is None:
12419 kshitij.so 499
                d_item = Item.query.filter_by(id=int(val.sku[3:])).first()
500
                if d_item is None:
501
                    raise 
502
                else:
12430 kshitij.so 503
                    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 504
                if vatMaster is None:
12418 kshitij.so 505
                    raise
12419 kshitij.so 506
                else:
507
                    val.vatRate = vatMaster.vatPercent
508
                    print "vat fetched"
12418 kshitij.so 509
            else:
510
                val.vatRate = itemVatMaster.vatPercentage
12419 kshitij.so 511
                print "vat fetched"
12363 kshitij.so 512
        except:
12414 kshitij.so 513
            print "vat exception"
12363 kshitij.so 514
            temp = []
515
            temp.append(val)
516
            temp.append("Vat not available")
517
            exceptionList.append(temp)
518
            continue
519
 
520
        lowestPossibleSp = getLowestPossibleSp(amDetails,val,val.sourcePercentage)
12408 kshitij.so 521
        print "Creating pricing obj"
12432 kshitij.so 522
        amPricing = __AmazonPricing(ourSp,lowestPossibleSp)
12363 kshitij.so 523
 
12432 kshitij.so 524
        if amPricing.promoPrice < amPricing.lowestPossibleSp:
12363 kshitij.so 525
            temp = []
526
            temp.append(val)
527
            temp.append(amDetails)
528
            temp.append(amPricing)
529
            negativeMargin.append(temp)
530
            continue
531
 
532
        if amDetails.ourRank==1:
533
            temp = []
534
            temp.append(val)
535
            temp.append(amDetails)
536
            temp.append(amPricing)
537
            cheapest.append(temp)
538
            continue
539
 
12430 kshitij.so 540
        if (amDetails.lowestSellerSp > amPricing.lowestPossibleSp) and ((((float(amDetails.promoPrice - amDetails.lowestSellerSp))/amDetails.promoPrice)<=.01) or ((amDetails.promoPrice - amDetails.lowestSellerSp)<=25)):
12363 kshitij.so 541
            temp = []
542
            temp.append(val)
543
            temp.append(amDetails)
544
            temp.append(amPricing)
545
            amongCheapestAndCanCompete.append(temp)
546
            continue
547
 
548
        if (amDetails.lowestSellerSp > amPricing.lowestPossibleSp):
549
            temp = []
550
            temp.append(val)
551
            temp.append(amDetails)
552
            temp.append(amPricing)
553
            canCompete.append(temp)
554
            continue
555
 
12403 kshitij.so 556
        if amDetails.lowestSellerSp*(1+.01) >= amPricing.lowestPossibleSp:
12396 kshitij.so 557
            temp = []
558
            temp.append(val)
559
            temp.append(amDetails)
560
            temp.append(amPricing)
561
            almostCompete.append(temp)
562
            continue
563
 
564
 
12363 kshitij.so 565
        temp = []
566
        temp.append(val)
567
        temp.append(amDetails)
568
        temp.append(amPricing)
569
        cantCompete.append(temp)
12414 kshitij.so 570
    print "Created category..."
12363 kshitij.so 571
 
572
    return exceptionList, negativeMargin, cheapest, amongCheapestAndCanCompete, canCompete, almostCompete, cantCompete
12396 kshitij.so 573
 
12363 kshitij.so 574
 
575
def getLowestPossibleSp(amazonDetails,val,spm):
12447 kshitij.so 576
    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 577
    if val.isPromo:
578
        if amazonLongTermActivePromotions.has_key(val.sku):
579
            subsidy = (amazonLongTermActivePromotions.has_key(val.sku)).subsidy
580
        else:
581
            subsidy = (amazonShortTermActivePromotions.has_key(val.sku)).subsidy
582
        lowestPossibleSp = lowestPossibleSp - subsidy
12363 kshitij.so 583
    return round(lowestPossibleSp,2)
584
 
585
def getTargetTp(targetSp,spm,val):
12424 kshitij.so 586
    targetTp = targetSp- targetSp*(spm.commission/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost)*(1+(spm.serviceTax/100))
12363 kshitij.so 587
    return round(targetTp,2)
588
 
589
def commitExceptionList(exceptionList,timestamp,runType):
590
    for exceptionItem in exceptionList:
591
        val = exceptionItem[0]
592
        reason = exceptionItem[1]
593
        amazonScrapingHistory = AmazonScrapingHistory()
594
        amazonScrapingHistory.item_id = val.sku[3:]
595
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 596
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 597
        amazonScrapingHistory.reason = reason
598
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
599
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.EXCEPTION
600
        amazonScrapingHistory.timestamp = timestamp
601
    session.commit()
602
 
603
def commitNegativeMargin(negativeMargin,timestamp,runType):
604
    for negativeMarginItem in negativeMargin:
605
        val = negativeMarginItem[0]
606
        amDetails = negativeMarginItem[1]
607
        amPricing = negativeMarginItem[2]
608
        spm = val.sourcePercentage
609
        amazonScrapingHistory = AmazonScrapingHistory()
610
        amazonScrapingHistory.item_id = val.sku[3:]
611
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 612
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 613
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 614
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12363 kshitij.so 615
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
616
        amazonScrapingHistory.ourRank = amDetails.ourRank
617
        amazonScrapingHistory.ourInventory = val.ourInventory
618
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
619
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
620
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
621
        amazonScrapingHistory.wanlc = val.nlc
12447 kshitij.so 622
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 623
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 624
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 625
        amazonScrapingHistory.returnProvision = spm.returnProvision
626
        amazonScrapingHistory.courierCost = val.courierCost
627
        amazonScrapingHistory.risky = val.risky
628
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
629
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
630
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.NEGATIVE_MARGIN
631
        amazonScrapingHistory.timestamp = timestamp
632
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
633
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 634
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 635
    session.commit()
636
 
637
 
638
def commitCheapest(cheapest,timestamp,runType):
639
    for cheapestItem in cheapest:
640
        val = cheapestItem[0]
641
        amDetails = cheapestItem[1]
642
        amPricing = cheapestItem[2]
643
        spm = val.sourcePercentage
644
        amazonScrapingHistory = AmazonScrapingHistory()
645
        amazonScrapingHistory.item_id = val.sku[3:]
646
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 647
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 648
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 649
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12363 kshitij.so 650
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
651
        amazonScrapingHistory.ourRank = amDetails.ourRank
652
        amazonScrapingHistory.ourInventory = val.ourInventory
653
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 654
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
655
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
656
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12363 kshitij.so 657
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12430 kshitij.so 658
        amazonScrapingHistory.secondSellerShippingTime = amDetails.secondSellerShippingTime
659
        amazonScrapingHistory.secondSellerRating = amDetails.secondSellerRating
660
        amazonScrapingHistory.secondSellerType = amDetails.secondSellerType
12363 kshitij.so 661
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12430 kshitij.so 662
        amazonScrapingHistory.thirdSellerShippingTime = amDetails.thirdSellerShippingTime
663
        amazonScrapingHistory.thirdSellerRating = amDetails.thirdSellerRating
664
        amazonScrapingHistory.thirdSellerType = amDetails.thirdSellerType
12447 kshitij.so 665
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 666
        amazonScrapingHistory.wanlc = val.nlc
667
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 668
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 669
        amazonScrapingHistory.returnProvision = spm.returnProvision
670
        amazonScrapingHistory.courierCost = val.courierCost
671
        amazonScrapingHistory.risky = val.risky
672
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
673
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
674
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.BUY_BOX
675
        amazonScrapingHistory.timestamp = timestamp
676
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
12430 kshitij.so 677
        proposed_sp = max(amDetails.secondLowestSellerSp - max((20, amDetails.secondLowestSellerSp*0.002)), amPricing.lowestPossibleSp)
12433 kshitij.so 678
        if amazonScrapingHistory.isPromotion:
679
            if amazonLongTermActivePromotions.has_key(val.sku):
680
                proposed_sp = min(proposed_sp,(amazonLongTermActivePromotions.has_key(val.sku)).salePrice)
681
            else:
682
                proposed_sp = min(proposed_sp,(amazonShortTermActivePromotions.has_key(val.sku)).salePrice)
12363 kshitij.so 683
        proposed_tp = getTargetTp(proposed_sp,spm,val)
684
        amazonScrapingHistory.proposedSp = proposed_sp
685
        amazonScrapingHistory.proposedTp = proposed_tp
686
        amazonScrapingHistory.marginIncreasedPotential = proposed_tp - amPricing.ourTp
687
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
688
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 689
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 690
    session.commit()
691
 
692
 
693
 
694
def commitAmongCheapestAndCanCompete(amongCheapestAndCanCompete,timestamp,runType):
695
    for amongCheapestAndCanCompeteItem in amongCheapestAndCanCompete:
696
        val = amongCheapestAndCanCompeteItem[0]
697
        amDetails = amongCheapestAndCanCompeteItem[1]
698
        amPricing = amongCheapestAndCanCompeteItem[2]
699
        spm = val.sourcePercentage
700
        amazonScrapingHistory = AmazonScrapingHistory()
701
        amazonScrapingHistory.item_id = val.sku[3:]
702
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 703
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 704
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 705
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12363 kshitij.so 706
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
707
        amazonScrapingHistory.ourRank = amDetails.ourRank
708
        amazonScrapingHistory.ourInventory = val.ourInventory
709
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 710
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
711
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
712
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12363 kshitij.so 713
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12430 kshitij.so 714
        amazonScrapingHistory.secondSellerShippingTime = amDetails.secondSellerShippingTime
715
        amazonScrapingHistory.secondSellerRating = amDetails.secondSellerRating
716
        amazonScrapingHistory.secondSellerType = amDetails.secondSellerType
12363 kshitij.so 717
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12430 kshitij.so 718
        amazonScrapingHistory.thirdSellerShippingTime = amDetails.thirdSellerShippingTime
719
        amazonScrapingHistory.thirdSellerRating = amDetails.thirdSellerRating
720
        amazonScrapingHistory.thirdSellerType = amDetails.thirdSellerType
12447 kshitij.so 721
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 722
        amazonScrapingHistory.wanlc = val.nlc
723
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 724
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 725
        amazonScrapingHistory.returnProvision = spm.returnProvision
726
        amazonScrapingHistory.courierCost = val.courierCost
727
        amazonScrapingHistory.risky = val.risky
728
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
729
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
730
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE
731
        amazonScrapingHistory.timestamp = timestamp
732
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
733
        proposed_sp = max(amDetails.lowestSellerSp - max((5, amDetails.lowestSellerSp*0.001)), amPricing.lowestPossibleSp)
734
        proposed_tp = getTargetTp(proposed_sp,spm,val)
735
        amazonScrapingHistory.proposedSp = proposed_sp
736
        amazonScrapingHistory.proposedTp = proposed_tp
737
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
738
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 739
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 740
    session.commit()
741
 
742
def commitCanCompete(canCompete,timestamp,runType):
743
    for canCompeteItem in canCompete:
744
        val = canCompeteItem[0]
745
        amDetails = canCompeteItem[1]
746
        amPricing = canCompeteItem[2]
747
        spm = val.sourcePercentage
748
        amazonScrapingHistory = AmazonScrapingHistory()
749
        amazonScrapingHistory.item_id = val.sku[3:]
750
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 751
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 752
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 753
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12363 kshitij.so 754
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
755
        amazonScrapingHistory.ourRank = amDetails.ourRank
756
        amazonScrapingHistory.ourInventory = val.ourInventory
757
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 758
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
759
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
760
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12363 kshitij.so 761
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12430 kshitij.so 762
        amazonScrapingHistory.secondSellerShippingTime = amDetails.secondSellerShippingTime
763
        amazonScrapingHistory.secondSellerRating = amDetails.secondSellerRating
764
        amazonScrapingHistory.secondSellerType = amDetails.secondSellerType
12363 kshitij.so 765
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12430 kshitij.so 766
        amazonScrapingHistory.thirdSellerShippingTime = amDetails.thirdSellerShippingTime
767
        amazonScrapingHistory.thirdSellerRating = amDetails.thirdSellerRating
768
        amazonScrapingHistory.thirdSellerType = amDetails.thirdSellerType
12447 kshitij.so 769
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 770
        amazonScrapingHistory.wanlc = val.nlc
771
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 772
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 773
        amazonScrapingHistory.returnProvision = spm.returnProvision
774
        amazonScrapingHistory.courierCost = val.courierCost
775
        amazonScrapingHistory.risky = val.risky
776
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
777
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
778
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.COMPETITIVE
779
        amazonScrapingHistory.timestamp = timestamp
780
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
781
        proposed_sp = max(amDetails.lowestSellerSp - max((5, amDetails.lowestSellerSp*0.001)), amPricing.lowestPossibleSp)
782
        proposed_tp = getTargetTp(proposed_sp,spm,val)
783
        amazonScrapingHistory.proposedSp = proposed_sp
784
        amazonScrapingHistory.proposedTp = proposed_tp
785
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
786
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 787
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 788
    session.commit()
789
 
12383 kshitij.so 790
def commitAlmostCompete(almostCompete,timestamp,runType):
12396 kshitij.so 791
    for almostCompeteItem in almostCompete:
792
        val = almostCompeteItem[0]
793
        amDetails = almostCompeteItem[1]
794
        amPricing = almostCompeteItem[2]
795
        spm = val.sourcePercentage
796
        amazonScrapingHistory = AmazonScrapingHistory()
797
        amazonScrapingHistory.item_id = val.sku[3:]
798
        amazonScrapingHistory.warehouseLocation = val.state_id
799
        amazonScrapingHistory.parentCategoryId = val.parent_category
800
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 801
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12396 kshitij.so 802
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
803
        amazonScrapingHistory.ourRank = amDetails.ourRank
804
        amazonScrapingHistory.ourInventory = val.ourInventory
805
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 806
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
807
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
808
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12396 kshitij.so 809
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12430 kshitij.so 810
        amazonScrapingHistory.secondSellerShippingTime = amDetails.secondSellerShippingTime
811
        amazonScrapingHistory.secondSellerRating = amDetails.secondSellerRating
812
        amazonScrapingHistory.secondSellerType = amDetails.secondSellerType
12396 kshitij.so 813
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12430 kshitij.so 814
        amazonScrapingHistory.thirdSellerShippingTime = amDetails.thirdSellerShippingTime
815
        amazonScrapingHistory.thirdSellerRating = amDetails.thirdSellerRating
816
        amazonScrapingHistory.thirdSellerType = amDetails.thirdSellerType
12447 kshitij.so 817
        amazonScrapingHistory.otherCost = val.otherCost
12396 kshitij.so 818
        amazonScrapingHistory.wanlc = val.nlc
819
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 820
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12396 kshitij.so 821
        amazonScrapingHistory.returnProvision = spm.returnProvision
822
        amazonScrapingHistory.courierCost = val.courierCost
823
        amazonScrapingHistory.risky = val.risky
824
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
825
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
826
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.ALMOST_COMPETE
827
        amazonScrapingHistory.timestamp = timestamp
828
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
12425 kshitij.so 829
        proposed_sp = min(amDetails.lowestSellerSp*(1+.01),amPricing.lowestPossibleSp)
12396 kshitij.so 830
        proposed_tp = getTargetTp(proposed_sp,spm,val)
831
        target_nlc = proposed_tp - amPricing.lowestPossibleTp + val.nlc
832
        amazonScrapingHistory.proposedSp = proposed_sp
833
        amazonScrapingHistory.proposedTp = proposed_tp
834
        amazonScrapingHistory.targetNlc = target_nlc
835
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
836
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 837
        amazonScrapingHistory.isPromotion = val.isPromo
12396 kshitij.so 838
    session.commit()
12363 kshitij.so 839
 
12396 kshitij.so 840
 
12363 kshitij.so 841
def commitCantCompete(cantCompete, timestamp,runType):
842
    for cantCompeteItem in cantCompete:
843
        val = cantCompeteItem[0]
844
        amDetails = cantCompeteItem[1]
845
        amPricing = cantCompeteItem[2]
846
        spm = val.sourcePercentage
847
        amazonScrapingHistory = AmazonScrapingHistory()
848
        amazonScrapingHistory.item_id = val.sku[3:]
849
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 850
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 851
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 852
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12363 kshitij.so 853
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
854
        amazonScrapingHistory.ourRank = amDetails.ourRank
855
        amazonScrapingHistory.ourInventory = val.ourInventory
856
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 857
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
858
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
859
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12363 kshitij.so 860
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12430 kshitij.so 861
        amazonScrapingHistory.secondSellerShippingTime = amDetails.secondSellerShippingTime
862
        amazonScrapingHistory.secondSellerRating = amDetails.secondSellerRating
863
        amazonScrapingHistory.secondSellerType = amDetails.secondSellerType
12363 kshitij.so 864
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12430 kshitij.so 865
        amazonScrapingHistory.thirdSellerShippingTime = amDetails.thirdSellerShippingTime
866
        amazonScrapingHistory.thirdSellerRating = amDetails.thirdSellerRating
867
        amazonScrapingHistory.thirdSellerType = amDetails.thirdSellerType
12447 kshitij.so 868
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 869
        amazonScrapingHistory.wanlc = val.nlc
870
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 871
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 872
        amazonScrapingHistory.returnProvision = spm.returnProvision
873
        amazonScrapingHistory.courierCost = val.courierCost
874
        amazonScrapingHistory.risky = val.risky
875
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
876
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
877
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.CANT_COMPETE
878
        amazonScrapingHistory.timestamp = timestamp
879
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
880
        proposed_sp = amDetails.lowestSellerSp - max(5, amDetails.lowestSellerSp*0.001)
881
        proposed_tp = getTargetTp(proposed_sp,spm,val)
882
        target_nlc = proposed_tp - amPricing.lowestPossibleTp + val.nlc
883
        amazonScrapingHistory.proposedSp = proposed_sp
884
        amazonScrapingHistory.proposedTp = proposed_tp
885
        amazonScrapingHistory.targetNlc = target_nlc
886
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
887
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 888
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 889
    session.commit()
890
 
12396 kshitij.so 891
def markAutoFavourites(time):
892
    nowAutoFav = []
893
    previouslyAutoFav = []
894
    stockList = []
895
    saleList = []
896
    items = session.query(func.sum(AmazonScrapingHistory.ourInventory),AmazonScrapingHistory.item_id).group_by(AmazonScrapingHistory.item_id).all()
897
    allItems = session.query(Amazonlisted).all()
898
    for item in items:
899
        reason = ""
900
        if item[0]>=5:
901
            stockList.append(item[1])
902
 
903
    for sku, val in saleMap.iteritems():
904
        totalSale = 0
905
        item_id = sku.replace('FBA','').replace('FBB','')
906
        val =saleMap.get('FBA'+str(item_id))
907
        if val is not None:
908
            for sale in val:
909
                totalSale += sale.totalOrderCount
910
        val =saleMap.get('FBB'+str(item_id))
911
        if val is not None:
912
            for sale in val:
913
                totalSale += sale.totalOrderCount
914
        if totalSale > 0:
915
            saleList.append(item_id)
916
 
917
    for aItem in allItems:
918
        reason = ""
919
        toMark = False
920
        if aItem.itemId in saleList:
921
            toMark = True
922
            reason+="Total FC sale is greater than 1 for last five days.."
923
        if aItem.itemId in stockList:
924
            toMark = True
925
            reason+="Item is present in buy box in last 3 days"
926
        if not aItem.autoFavourite:
927
            print "Item is not under auto favourite"
928
        if toMark:
929
            temp=[]
930
            temp.append(aItem.itemId)
931
            temp.append(reason)
932
            nowAutoFav.append(temp)
933
        if (not toMark) and aItem.autoFavourite:
934
            previouslyAutoFav.append(aItem.itemId)
935
        aItem.autoFavourite = toMark
936
    session.commit()
937
    return previouslyAutoFav, nowAutoFav
938
 
12444 kshitij.so 939
def writeReport(timestamp,autoDecreaseItems,autoIncreaseItems,previousAutoFav,nowAutoFav,runType):
12396 kshitij.so 940
    wbk = xlwt.Workbook()
941
    sheet = wbk.add_sheet('Can\'t Compete')
942
    xstr = lambda s: s or ""
943
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
944
 
945
    excel_integer_format = '0'
946
    integer_style = xlwt.XFStyle()
947
    integer_style.num_format_str = excel_integer_format
948
 
949
    sheet.write(0, 0, "Item Id", heading_xf)
950
    sheet.write(0, 1, "Amazon Sku", heading_xf)
951
    sheet.write(0, 2, "Asin", heading_xf)
952
    sheet.write(0, 3, "Location", heading_xf)
953
    sheet.write(0, 4, "Brand", heading_xf)
954
    sheet.write(0, 5, "Product Name", heading_xf)
955
    sheet.write(0, 6, "Weight", heading_xf)
956
    sheet.write(0, 7, "Courier Cost", heading_xf)
957
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 958
    sheet.write(0, 9, "Promo Price", heading_xf)
959
    sheet.write(0, 10, "Is Promotion", heading_xf)
960
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 961
    sheet.write(0, 12, "Rank", heading_xf)
962
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 963
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
964
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
965
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 966
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 967
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
968
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
969
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
970
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
971
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 972
    sheet.write(0, 23, "Other Cost", heading_xf)
973
    sheet.write(0, 24, "WANLC", heading_xf)
974
    sheet.write(0, 25, "Commission", heading_xf)
975
    sheet.write(0, 26, "Competitor Commission", heading_xf)
976
    sheet.write(0, 27, "Return Provision", heading_xf)
977
    sheet.write(0, 28, "Margin", heading_xf)
978
    sheet.write(0, 29, "Risky", heading_xf)
979
    sheet.write(0, 30, "Proposed Sp", heading_xf)
980
    sheet.write(0, 31, "Proposed Tp", heading_xf)
981
    sheet.write(0, 32, "Target Nlc", heading_xf)
982
    sheet.write(0, 33, "Avg Sale", heading_xf)
983
    sheet.write(0, 34, "Sales History", heading_xf)
984
    sheet.write(0, 35, "Decision", heading_xf)
985
    sheet.write(0, 36, "Reason", heading_xf)
986
    sheet.write(0, 37, "Updated Price", heading_xf)
12396 kshitij.so 987
 
988
    sheet_iterator = 1
989
    cantCompeteItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.CANT_COMPETE).all()
990
    for cantCompeteItem in cantCompeteItems:
991
        amScraping =  cantCompeteItem[0]
992
        item = cantCompeteItem[1]
993
        sheet.write(sheet_iterator, 0, amScraping.item_id)
994
        if amScraping.warehouseLocation == 1:
995
            sku = 'FBA'+str(amScraping.item_id)
996
            loc = 'MUMBAI'
997
        else:
998
            sku = 'FBB'+str(amScraping.item_id)
999
            loc = 'BANGLORE'
1000
        sheet.write(sheet_iterator, 1, sku)
1001
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1002
        sheet.write(sheet_iterator, 3, loc)
1003
        sheet.write(sheet_iterator, 4, item.brand)
1004
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1005
        sheet.write(sheet_iterator, 6, item.weight)
1006
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1007
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1008
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1009
        if amScraping.isPromotion:
1010
            sheet.write(sheet_iterator, 10, "Yes")
1011
        else:
1012
            sheet.write(sheet_iterator, 10, "Yes")
1013
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1014
        if amScraping.ourRank > 3:
1015
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1016
        else:
1017
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1018
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1019
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1020
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1021
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1022
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1023
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1024
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1025
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1026
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1027
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1028
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1029
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1030
        sheet.write(sheet_iterator, 25, amScraping.commission)
1031
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1032
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
1033
        sheet.write(sheet_iterator, 28, round(amScraping.ourSellingPrice - amScraping.lowestPossibleSp))
1034
        sheet.write(sheet_iterator, 29, item.risky)
1035
        sheet.write(sheet_iterator, 30, amScraping.proposedSp)
1036
        sheet.write(sheet_iterator, 31, amScraping.proposedTp)
1037
        sheet.write(sheet_iterator, 32, amScraping.targetNlc)
1038
        sheet.write(sheet_iterator, 33, amScraping.avgSale)
1039
        sheet.write(sheet_iterator, 34, getOosString(saleMap.get(sku)))
12444 kshitij.so 1040
        if amScraping.decision is None:
12447 kshitij.so 1041
            sheet.write(sheet_iterator, 35, 'Auto Pricing Inactive')
12444 kshitij.so 1042
            sheet_iterator+=1
1043
            continue
12447 kshitij.so 1044
        sheet.write(sheet_iterator, 35, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1045
        sheet.write(sheet_iterator, 36, amScraping.reason)
12444 kshitij.so 1046
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12447 kshitij.so 1047
            sheet.write(sheet_iterator, 37, math.ceil(amScraping.proposedSellingPrice))
12444 kshitij.so 1048
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12447 kshitij.so 1049
            sheet.write(sheet_iterator, 37, math.ceil(amScraping.ourSellingPrice+max(10,.01*amScraping.ourSellingPrice)))
12396 kshitij.so 1050
        sheet_iterator+=1
1051
 
1052
    sheet = wbk.add_sheet('Competitive')
1053
    xstr = lambda s: s or ""
1054
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1055
 
1056
    excel_integer_format = '0'
1057
    integer_style = xlwt.XFStyle()
1058
    integer_style.num_format_str = excel_integer_format
1059
 
1060
    sheet.write(0, 0, "Item Id", heading_xf)
1061
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1062
    sheet.write(0, 2, "Asin", heading_xf)
1063
    sheet.write(0, 3, "Location", heading_xf)
1064
    sheet.write(0, 4, "Brand", heading_xf)
1065
    sheet.write(0, 5, "Product Name", heading_xf)
1066
    sheet.write(0, 6, "Weight", heading_xf)
1067
    sheet.write(0, 7, "Courier Cost", heading_xf)
1068
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1069
    sheet.write(0, 9, "Promo Price", heading_xf)
1070
    sheet.write(0, 10, "Is Promotion", heading_xf)
1071
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1072
    sheet.write(0, 12, "Rank", heading_xf)
1073
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1074
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1075
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1076
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1077
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1078
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1079
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1080
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1081
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1082
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1083
    sheet.write(0, 23, "Other Cost", heading_xf)
1084
    sheet.write(0, 24, "WANLC", heading_xf)
1085
    sheet.write(0, 25, "Commission", heading_xf)
1086
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1087
    sheet.write(0, 27, "Return Provision", heading_xf)
1088
    sheet.write(0, 28, "Margin", heading_xf)
1089
    sheet.write(0, 29, "Risky", heading_xf)
1090
    sheet.write(0, 30, "Proposed Sp", heading_xf)
1091
    sheet.write(0, 31, "Proposed Tp", heading_xf)
1092
    sheet.write(0, 32, "Avg Sale", heading_xf)
1093
    sheet.write(0, 33, "Sales History", heading_xf)
1094
    sheet.write(0, 34, "Decision", heading_xf)
1095
    sheet.write(0, 35, "Reason", heading_xf)
1096
    sheet.write(0, 36, "Updated Price", heading_xf)
12396 kshitij.so 1097
 
1098
    sheet_iterator = 1
1099
    competitiveItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.COMPETITIVE).all()
1100
    for competitiveItem in competitiveItems:
1101
        amScraping =  competitiveItem[0]
1102
        item = competitiveItem[1]
1103
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1104
        if amScraping.warehouseLocation == 1:
1105
            sku = 'FBA'+str(amScraping.item_id)
1106
            loc = 'MUMBAI'
1107
        else:
1108
            sku = 'FBB'+str(amScraping.item_id)
1109
            loc = 'BANGLORE'
1110
        sheet.write(sheet_iterator, 1, sku)
1111
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1112
        sheet.write(sheet_iterator, 3, loc)
1113
        sheet.write(sheet_iterator, 4, item.brand)
1114
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1115
        sheet.write(sheet_iterator, 6, item.weight)
1116
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1117
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1118
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1119
        if amScraping.isPromotion:
1120
            sheet.write(sheet_iterator, 10, "Yes")
1121
        else:
1122
            sheet.write(sheet_iterator, 10, "Yes")
1123
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1124
        if amScraping.ourRank > 3:
1125
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1126
        else:
1127
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1128
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1129
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1130
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1131
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1132
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1133
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1134
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1135
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1136
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1137
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1138
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1139
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1140
        sheet.write(sheet_iterator, 25, amScraping.commission)
1141
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1142
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
1143
        sheet.write(sheet_iterator, 28, round(amScraping.ourSellingPrice - amScraping.lowestPossibleSp))
1144
        sheet.write(sheet_iterator, 29, item.risky)
1145
        sheet.write(sheet_iterator, 30, amScraping.proposedSp)
1146
        sheet.write(sheet_iterator, 31, amScraping.proposedTp)
1147
        sheet.write(sheet_iterator, 32, amScraping.avgSale)
1148
        sheet.write(sheet_iterator, 33, getOosString(saleMap.get(sku)))
12444 kshitij.so 1149
        if amScraping.decision is None:
12447 kshitij.so 1150
            sheet.write(sheet_iterator, 34, 'Auto Pricing Inactive')
12444 kshitij.so 1151
            sheet_iterator+=1
1152
            continue
12447 kshitij.so 1153
        sheet.write(sheet_iterator, 34, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1154
        sheet.write(sheet_iterator, 35, amScraping.reason)
12444 kshitij.so 1155
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12447 kshitij.so 1156
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.proposedSellingPrice))
12444 kshitij.so 1157
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12447 kshitij.so 1158
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.ourSellingPrice+max(10,.01*amScraping.ourSellingPrice)))
12396 kshitij.so 1159
        sheet_iterator+=1
1160
 
1161
    sheet = wbk.add_sheet('Almost Competitive')
1162
    xstr = lambda s: s or ""
1163
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1164
 
1165
    excel_integer_format = '0'
1166
    integer_style = xlwt.XFStyle()
1167
    integer_style.num_format_str = excel_integer_format
1168
 
1169
    sheet.write(0, 0, "Item Id", heading_xf)
1170
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1171
    sheet.write(0, 2, "Asin", heading_xf)
1172
    sheet.write(0, 3, "Location", heading_xf)
1173
    sheet.write(0, 4, "Brand", heading_xf)
1174
    sheet.write(0, 5, "Product Name", heading_xf)
1175
    sheet.write(0, 6, "Weight", heading_xf)
1176
    sheet.write(0, 7, "Courier Cost", heading_xf)
1177
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1178
    sheet.write(0, 9, "Promo Price", heading_xf)
1179
    sheet.write(0, 10, "Is Promotion", heading_xf)
1180
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1181
    sheet.write(0, 12, "Rank", heading_xf)
1182
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1183
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1184
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1185
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1186
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1187
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1188
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1189
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1190
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1191
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1192
    sheet.write(0, 23, "Other Cost", heading_xf)
1193
    sheet.write(0, 24, "WANLC", heading_xf)
1194
    sheet.write(0, 25, "Commission", heading_xf)
1195
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1196
    sheet.write(0, 27, "Return Provision", heading_xf)
1197
    sheet.write(0, 28, "Margin", heading_xf)
1198
    sheet.write(0, 29, "Risky", heading_xf)
1199
    sheet.write(0, 30, "Proposed Sp", heading_xf)
1200
    sheet.write(0, 31, "Proposed Tp", heading_xf)
1201
    sheet.write(0, 32, "Avg Sale", heading_xf)
1202
    sheet.write(0, 33, "Sales History", heading_xf)
1203
    sheet.write(0, 34, "Decision", heading_xf)
1204
    sheet.write(0, 35, "Reason", heading_xf)
1205
    sheet.write(0, 36, "Updated Price", heading_xf)
12396 kshitij.so 1206
 
1207
    sheet_iterator = 1
1208
    almostCompetitiveItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.ALMOST_COMPETE).all()
1209
    for almostCompetitiveItem in almostCompetitiveItems:
1210
        amScraping =  almostCompetitiveItem[0]
1211
        item = almostCompetitiveItem[1]
1212
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1213
        if amScraping.warehouseLocation == 1:
1214
            sku = 'FBA'+str(amScraping.item_id)
1215
            loc = 'MUMBAI'
1216
        else:
1217
            sku = 'FBB'+str(amScraping.item_id)
1218
            loc = 'BANGLORE'
12432 kshitij.so 1219
        amScraping =  competitiveItem[0]
1220
        item = competitiveItem[1]
1221
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1222
        if amScraping.warehouseLocation == 1:
1223
            sku = 'FBA'+str(amScraping.item_id)
1224
            loc = 'MUMBAI'
1225
        else:
1226
            sku = 'FBB'+str(amScraping.item_id)
1227
            loc = 'BANGLORE'
12396 kshitij.so 1228
        sheet.write(sheet_iterator, 1, sku)
1229
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1230
        sheet.write(sheet_iterator, 3, loc)
1231
        sheet.write(sheet_iterator, 4, item.brand)
1232
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1233
        sheet.write(sheet_iterator, 6, item.weight)
1234
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1235
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1236
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1237
        if amScraping.isPromotion:
1238
            sheet.write(sheet_iterator, 10, "Yes")
1239
        else:
1240
            sheet.write(sheet_iterator, 10, "Yes")
1241
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1242
        if amScraping.ourRank > 3:
1243
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1244
        else:
1245
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1246
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1247
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1248
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1249
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1250
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1251
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1252
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1253
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1254
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1255
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1256
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1257
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1258
        sheet.write(sheet_iterator, 25, amScraping.commission)
1259
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1260
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
1261
        sheet.write(sheet_iterator, 28, round(amScraping.ourSellingPrice - amScraping.lowestPossibleSp))
1262
        sheet.write(sheet_iterator, 29, item.risky)
1263
        sheet.write(sheet_iterator, 30, amScraping.proposedSp)
1264
        sheet.write(sheet_iterator, 31, amScraping.proposedTp)
1265
        sheet.write(sheet_iterator, 32, amScraping.avgSale)
1266
        sheet.write(sheet_iterator, 33, getOosString(saleMap.get(sku)))
12444 kshitij.so 1267
        if amScraping.decision is None:
12447 kshitij.so 1268
            sheet.write(sheet_iterator, 34, 'Auto Pricing Inactive')
12444 kshitij.so 1269
            sheet_iterator+=1
1270
            continue
12447 kshitij.so 1271
        sheet.write(sheet_iterator, 34, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1272
        sheet.write(sheet_iterator, 35, amScraping.reason)
12444 kshitij.so 1273
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12447 kshitij.so 1274
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.proposedSellingPrice))
12444 kshitij.so 1275
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12447 kshitij.so 1276
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.ourSellingPrice+max(10,.01*amScraping.ourSellingPrice)))
12396 kshitij.so 1277
        sheet_iterator+=1
1278
 
1279
    sheet = wbk.add_sheet('Among Cheapest')
1280
    xstr = lambda s: s or ""
1281
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1282
 
1283
    excel_integer_format = '0'
1284
    integer_style = xlwt.XFStyle()
1285
    integer_style.num_format_str = excel_integer_format
1286
 
1287
    sheet.write(0, 0, "Item Id", heading_xf)
1288
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1289
    sheet.write(0, 2, "Asin", heading_xf)
1290
    sheet.write(0, 3, "Location", heading_xf)
1291
    sheet.write(0, 4, "Brand", heading_xf)
1292
    sheet.write(0, 5, "Product Name", heading_xf)
1293
    sheet.write(0, 6, "Weight", heading_xf)
1294
    sheet.write(0, 7, "Courier Cost", heading_xf)
1295
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1296
    sheet.write(0, 9, "Promo Price", heading_xf)
1297
    sheet.write(0, 10, "Is Promotion", heading_xf)
1298
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1299
    sheet.write(0, 12, "Rank", heading_xf)
1300
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1301
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1302
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1303
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1304
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1305
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1306
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1307
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1308
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1309
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1310
    sheet.write(0, 23, "Other Cost", heading_xf)
1311
    sheet.write(0, 24, "WANLC", heading_xf)
1312
    sheet.write(0, 25, "Commission", heading_xf)
1313
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1314
    sheet.write(0, 27, "Return Provision", heading_xf)
1315
    sheet.write(0, 28, "Margin", heading_xf)
1316
    sheet.write(0, 29, "Risky", heading_xf)
1317
    sheet.write(0, 30, "Proposed Sp", heading_xf)
1318
    sheet.write(0, 31, "Proposed Tp", heading_xf)
1319
    sheet.write(0, 32, "Avg Sale", heading_xf)
1320
    sheet.write(0, 33, "Sales History", heading_xf)
1321
    sheet.write(0, 34, "Decision", heading_xf)
1322
    sheet.write(0, 35, "Reason", heading_xf)
1323
    sheet.write(0, 36, "Updated Price", heading_xf)
12396 kshitij.so 1324
 
1325
    sheet_iterator = 1
1326
    amongCheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE).all()
1327
    for amongCheapestItem in amongCheapestItems:
1328
        amScraping =  amongCheapestItem[0]
1329
        item = amongCheapestItem[1]
1330
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1331
        if amScraping.warehouseLocation == 1:
1332
            sku = 'FBA'+str(amScraping.item_id)
1333
            loc = 'MUMBAI'
1334
        else:
1335
            sku = 'FBB'+str(amScraping.item_id)
1336
            loc = 'BANGLORE'
1337
        sheet.write(sheet_iterator, 1, sku)
1338
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1339
        sheet.write(sheet_iterator, 3, loc)
1340
        sheet.write(sheet_iterator, 4, item.brand)
1341
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1342
        sheet.write(sheet_iterator, 6, item.weight)
1343
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1344
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1345
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1346
        if amScraping.isPromotion:
1347
            sheet.write(sheet_iterator, 10, "Yes")
1348
        else:
1349
            sheet.write(sheet_iterator, 10, "Yes")
1350
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1351
        if amScraping.ourRank > 3:
1352
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1353
        else:
1354
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1355
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1356
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1357
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1358
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1359
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1360
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1361
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1362
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1363
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1364
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1365
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1366
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1367
        sheet.write(sheet_iterator, 25, amScraping.commission)
1368
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1369
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
1370
        sheet.write(sheet_iterator, 28, round(amScraping.ourSellingPrice - amScraping.lowestPossibleSp))
1371
        sheet.write(sheet_iterator, 29, item.risky)
1372
        sheet.write(sheet_iterator, 30, amScraping.proposedSp)
1373
        sheet.write(sheet_iterator, 31, amScraping.proposedTp)
1374
        sheet.write(sheet_iterator, 32, amScraping.avgSale)
1375
        sheet.write(sheet_iterator, 33, getOosString(saleMap.get(sku)))
12444 kshitij.so 1376
        if amScraping.decision is None:
12447 kshitij.so 1377
            sheet.write(sheet_iterator, 34, 'Auto Pricing Inactive')
12444 kshitij.so 1378
            sheet_iterator+=1
1379
            continue
12447 kshitij.so 1380
        sheet.write(sheet_iterator, 34, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1381
        sheet.write(sheet_iterator, 35, amScraping.reason)
12444 kshitij.so 1382
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12447 kshitij.so 1383
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.proposedSellingPrice))
12444 kshitij.so 1384
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12447 kshitij.so 1385
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.ourSellingPrice+max(10,.01*amScraping.ourSellingPrice)))
12396 kshitij.so 1386
        sheet_iterator+=1
1387
 
1388
    sheet = wbk.add_sheet('Cheapest')
1389
    xstr = lambda s: s or ""
1390
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1391
 
1392
    excel_integer_format = '0'
1393
    integer_style = xlwt.XFStyle()
1394
    integer_style.num_format_str = excel_integer_format
1395
 
1396
    sheet.write(0, 0, "Item Id", heading_xf)
1397
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1398
    sheet.write(0, 2, "Asin", heading_xf)
1399
    sheet.write(0, 3, "Location", heading_xf)
1400
    sheet.write(0, 4, "Brand", heading_xf)
1401
    sheet.write(0, 5, "Product Name", heading_xf)
1402
    sheet.write(0, 6, "Weight", heading_xf)
1403
    sheet.write(0, 7, "Courier Cost", heading_xf)
1404
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1405
    sheet.write(0, 9, "Promo Price", heading_xf)
1406
    sheet.write(0, 10, "Is Promotion", heading_xf)
1407
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1408
    sheet.write(0, 12, "Rank", heading_xf)
1409
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1410
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1411
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1412
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1413
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1414
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1415
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1416
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1417
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1418
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1419
    sheet.write(0, 23, "Other Cost", heading_xf)
1420
    sheet.write(0, 24, "WANLC", heading_xf)
1421
    sheet.write(0, 25, "Commission", heading_xf)
1422
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1423
    sheet.write(0, 27, "Return Provision", heading_xf)
1424
    sheet.write(0, 28, "Margin", heading_xf)
1425
    sheet.write(0, 29, "Risky", heading_xf)
1426
    sheet.write(0, 30, "Proposed Sp", heading_xf)
1427
    sheet.write(0, 31, "Proposed Tp", heading_xf)
1428
    sheet.write(0, 32, "Margin Increased Potential", heading_xf)
1429
    sheet.write(0, 33, "Avg Sale", heading_xf)
1430
    sheet.write(0, 34, "Sales History", heading_xf)
1431
    sheet.write(0, 35, "Decision", heading_xf)
1432
    sheet.write(0, 36, "Reason", heading_xf)
1433
    sheet.write(0, 37, "Updated Price", heading_xf)
12396 kshitij.so 1434
 
1435
    sheet_iterator = 1
1436
    cheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.BUY_BOX).all()
1437
    for cheapestItem in cheapestItems:
1438
        amScraping =  cheapestItem[0]
1439
        item = cheapestItem[1]
1440
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1441
        if amScraping.warehouseLocation == 1:
1442
            sku = 'FBA'+str(amScraping.item_id)
1443
            loc = 'MUMBAI'
1444
        else:
1445
            sku = 'FBB'+str(amScraping.item_id)
1446
            loc = 'BANGLORE'
1447
        sheet.write(sheet_iterator, 1, sku)
1448
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1449
        sheet.write(sheet_iterator, 3, loc)
1450
        sheet.write(sheet_iterator, 4, item.brand)
1451
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1452
        sheet.write(sheet_iterator, 6, item.weight)
1453
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1454
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1455
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1456
        if amScraping.isPromotion:
1457
            sheet.write(sheet_iterator, 10, "Yes")
1458
        else:
1459
            sheet.write(sheet_iterator, 10, "Yes")
1460
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1461
        if amScraping.ourRank > 3:
1462
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1463
        else:
1464
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1465
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1466
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1467
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1468
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1469
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1470
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1471
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1472
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1473
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1474
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1475
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1476
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1477
        sheet.write(sheet_iterator, 25, amScraping.commission)
1478
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1479
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
1480
        sheet.write(sheet_iterator, 28, round(amScraping.ourSellingPrice - amScraping.lowestPossibleSp))
1481
        sheet.write(sheet_iterator, 29, item.risky)
1482
        sheet.write(sheet_iterator, 30, amScraping.proposedSp)
1483
        sheet.write(sheet_iterator, 31, amScraping.proposedTp)
1484
        sheet.write(sheet_iterator, 32, amScraping.targetNlc)
1485
        sheet.write(sheet_iterator, 33, amScraping.avgSale)
1486
        sheet.write(sheet_iterator, 34, getOosString(saleMap.get(sku)))
12444 kshitij.so 1487
        if amScraping.decision is None:
12447 kshitij.so 1488
            sheet.write(sheet_iterator, 35, 'Auto Pricing Inactive')
12444 kshitij.so 1489
            sheet_iterator+=1
1490
            continue
12447 kshitij.so 1491
        sheet.write(sheet_iterator, 35, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1492
        sheet.write(sheet_iterator, 36, amScraping.reason)
12444 kshitij.so 1493
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12447 kshitij.so 1494
            sheet.write(sheet_iterator, 37, math.ceil(amScraping.proposedSellingPrice))
12444 kshitij.so 1495
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12447 kshitij.so 1496
            sheet.write(sheet_iterator, 37, math.ceil(amScraping.ourSellingPrice+max(10,.01*amScraping.ourSellingPrice)))
12396 kshitij.so 1497
        sheet_iterator+=1
1498
 
1499
    sheet = wbk.add_sheet('Negative Margin')
1500
    xstr = lambda s: s or ""
1501
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1502
 
1503
    excel_integer_format = '0'
1504
    integer_style = xlwt.XFStyle()
1505
    integer_style.num_format_str = excel_integer_format
1506
 
1507
    sheet.write(0, 0, "Item Id", heading_xf)
1508
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1509
    sheet.write(0, 2, "Asin", heading_xf)
1510
    sheet.write(0, 3, "Location", heading_xf)
1511
    sheet.write(0, 4, "Brand", heading_xf)
1512
    sheet.write(0, 5, "Product Name", heading_xf)
1513
    sheet.write(0, 6, "Weight", heading_xf)
1514
    sheet.write(0, 7, "Courier Cost", heading_xf)
1515
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1516
    sheet.write(0, 9, "Promo Price", heading_xf)
1517
    sheet.write(0, 10, "Is Promotion", heading_xf)
1518
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1519
    sheet.write(0, 12, "Rank", heading_xf)
1520
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1521
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1522
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1523
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1524
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1525
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1526
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1527
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1528
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1529
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1530
    sheet.write(0, 23, "Other Cost", heading_xf)
1531
    sheet.write(0, 24, "WANLC", heading_xf)
1532
    sheet.write(0, 25, "Commission", heading_xf)
1533
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1534
    sheet.write(0, 27, "Return Provision", heading_xf)
1535
    sheet.write(0, 28, "Margin", heading_xf)
1536
    sheet.write(0, 29, "Avg Sale", heading_xf)
1537
    sheet.write(0, 30, "Sales History", heading_xf)
12396 kshitij.so 1538
 
1539
    sheet_iterator = 1
1540
    amongCheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE).all()
1541
    for amongCheapestItem in amongCheapestItems:
1542
        amScraping =  amongCheapestItem[0]
1543
        item = amongCheapestItem[1]
1544
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1545
        if amScraping.warehouseLocation == 1:
1546
            sku = 'FBA'+str(amScraping.item_id)
1547
            loc = 'MUMBAI'
1548
        else:
1549
            sku = 'FBB'+str(amScraping.item_id)
1550
            loc = 'BANGLORE'
1551
        sheet.write(sheet_iterator, 1, sku)
1552
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1553
        sheet.write(sheet_iterator, 3, loc)
1554
        sheet.write(sheet_iterator, 4, item.brand)
1555
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1556
        sheet.write(sheet_iterator, 6, item.weight)
1557
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1558
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1559
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1560
        if amScraping.isPromotion:
1561
            sheet.write(sheet_iterator, 10, "Yes")
1562
        else:
1563
            sheet.write(sheet_iterator, 10, "Yes")
1564
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1565
        if amScraping.ourRank > 3:
1566
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1567
        else:
1568
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1569
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1570
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1571
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1572
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1573
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1574
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1575
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1576
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1577
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1578
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1579
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1580
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1581
        sheet.write(sheet_iterator, 25, amScraping.commission)
1582
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1583
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
1584
        sheet.write(sheet_iterator, 28, round(amScraping.ourTp - amScraping.lowestPossibleTp))
1585
        sheet.write(sheet_iterator, 29, amScraping.avgSale)
1586
        sheet.write(sheet_iterator, 30, getOosString(saleMap.get(sku)))
12396 kshitij.so 1587
        sheet_iterator+=1
1588
 
1589
    sheet = wbk.add_sheet('Exception List')
1590
    xstr = lambda s: s or ""
1591
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1592
 
1593
    excel_integer_format = '0'
1594
    integer_style = xlwt.XFStyle()
1595
    integer_style.num_format_str = excel_integer_format
1596
 
1597
    sheet.write(0, 0, "Item Id", heading_xf)
1598
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1599
    sheet.write(0, 2, "Asin", heading_xf)
1600
    sheet.write(0, 3, "Location", heading_xf)
1601
    sheet.write(0, 4, "Brand", heading_xf)
1602
    sheet.write(0, 5, "Product Name", heading_xf)
1603
    sheet.write(0, 6, "Reason", heading_xf)
1604
 
1605
    sheet_iterator = 1
1606
    amongCheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE).all()
1607
    for amongCheapestItem in amongCheapestItems:
1608
        amScraping =  amongCheapestItem[0]
1609
        item = amongCheapestItem[1]
1610
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1611
        if amScraping.warehouseLocation == 1:
1612
            sku = 'FBA'+str(amScraping.item_id)
1613
            loc = 'MUMBAI'
1614
        else:
1615
            sku = 'FBB'+str(amScraping.item_id)
1616
            loc = 'BANGLORE'
1617
        sheet.write(sheet_iterator, 1, sku)
1618
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1619
        sheet.write(sheet_iterator, 3, loc)
1620
        sheet.write(sheet_iterator, 4, item.brand)
1621
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1622
        sheet.write(sheet_iterator, 6, amScraping.reason)
1623
        sheet_iterator+=1      
1624
 
12444 kshitij.so 1625
 
1626
    if (runType=='FULL'):    
1627
        sheet = wbk.add_sheet('Auto Favorites')
1628
 
1629
        heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1630
 
1631
        excel_integer_format = '0'
1632
        integer_style = xlwt.XFStyle()
1633
        integer_style.num_format_str = excel_integer_format
1634
        xstr = lambda s: s or ""
1635
 
1636
        sheet.write(0, 0, "Item ID", heading_xf)
1637
        sheet.write(0, 1, "Brand", heading_xf)
1638
        sheet.write(0, 2, "Product Name", heading_xf)
1639
        sheet.write(0, 3, "Auto Favourite", heading_xf)
1640
        sheet.write(0, 4, "Reason", heading_xf)
1641
 
1642
        sheet_iterator=1
1643
        for autoFav in nowAutoFav:
1644
            itemId = autoFav[0]
1645
            reason = autoFav[1]
1646
            it = Item.query.filter_by(id=itemId).one()
1647
            sheet.write(sheet_iterator, 0, itemId)
1648
            sheet.write(sheet_iterator, 1, it.brand)
1649
            sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
1650
            sheet.write(sheet_iterator, 3, "True")
1651
            sheet.write(sheet_iterator, 4, reason)
1652
            sheet_iterator+=1
1653
        for prevFav in previousAutoFav:
1654
            it = Item.query.filter_by(id=prevFav).one()
1655
            sheet.write(sheet_iterator, 0, prevFav)
1656
            sheet.write(sheet_iterator, 1, it.brand)
1657
            sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
1658
            sheet.write(sheet_iterator, 3, "False")
1659
            sheet_iterator+=1
1660
 
12396 kshitij.so 1661
    filename = "/tmp/amazon-scraping.xls"
1662
    wbk.save(filename)
1663
 
12363 kshitij.so 1664
def main():
1665
    parser = optparse.OptionParser()
1666
    parser.add_option("-t", "--type", dest="runType",
1667
                   default="FULL", type="string",
1668
                   help="Run type FULL or FAVOURITE")
1669
    (options, args) = parser.parse_args()
1670
    if options.runType not in ('FULL','FAVOURITE'):
1671
        print "Run type argument illegal."
1672
        sys.exit(1)
1673
    time.sleep(5)
1674
    timestamp = datetime.now()
1675
    fetchFbaSale()
1676
    itemInfo = populateStuff(timestamp,options.runType)
1677
    itemsToPopulate = 0
12430 kshitij.so 1678
    toSync = 0
1679
    lenItems = len(itemInfo)
1680
    while(toSync < lenItems):
1681
        oldSync = toSync
1682
        if lenItems >= 20:
1683
            toSync = 20
1684
        else:
1685
            toSync = lenItems - oldSync
1686
        getPriceAndAsin(itemInfo[oldSync:toSync+oldSync])
1687
        toSync = oldSync + toSync
1688
 
12363 kshitij.so 1689
    while (len(itemInfo)>0):
12430 kshitij.so 1690
        if len(itemInfo) >= 20:
1691
            itemsToPopulate = 20
12363 kshitij.so 1692
        else:
1693
            itemsToPopulate = len(itemInfo)
12456 kshitij.so 1694
        print "items to popluate"
12370 kshitij.so 1695
        print itemsToPopulate
12363 kshitij.so 1696
        exceptionList, negativeMargin, cheapest, amongCheapestAndCanCompete, canCompete, almostCompete, cantCompete = decideCategory(itemInfo[0:itemsToPopulate])
1697
        itemInfo[0:itemsToPopulate] = []
1698
        commitExceptionList(exceptionList,timestamp,options.runType)
1699
        commitNegativeMargin(negativeMargin,timestamp,options.runType)
1700
        commitCheapest(cheapest,timestamp,options.runType)
1701
        commitAmongCheapestAndCanCompete(amongCheapestAndCanCompete,timestamp,options.runType)
1702
        commitCanCompete(canCompete,timestamp,options.runType)
1703
        commitAlmostCompete(almostCompete,timestamp,options.runType)
1704
        commitCantCompete(cantCompete, timestamp,options.runType)
12396 kshitij.so 1705
        exceptionList[:], negativeMargin[:], cheapest[:], amongCheapestAndCanCompete[:], canCompete[:], almostCompete[:], cantCompete[:] =[],[],[],[],[],[],[]
1706
    autoDecreaseItems = fetchItemsForAutoDecrease(timestamp)
1707
    autoIncreaseItems = fetchItemsForAutoIncrease(timestamp)
1708
    previousAutoFav, nowAutoFav = markAutoFavourites(timestamp)
12444 kshitij.so 1709
    writeReport(timestamp,autoDecreaseItems,autoIncreaseItems,previousAutoFav,nowAutoFav,options.runType)
12363 kshitij.so 1710
if __name__=='__main__':
1711
    main()