Subversion Repositories SmartDukaan

Rev

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