Subversion Repositories SmartDukaan

Rev

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