Subversion Repositories SmartDukaan

Rev

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

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