Subversion Repositories SmartDukaan

Rev

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

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