Subversion Repositories SmartDukaan

Rev

Rev 12507 | Rev 12512 | 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
12507 kshitij.so 382
            if wanlc is None:
383
                wanlc = 0.0
12363 kshitij.so 384
        else:
385
            wanlc = inventory_client.getWanNlcForSource(fbaInventoryItem.item_id,OrderSource.AMAZON)
386
        it = Item.query.filter_by(id=fbaInventoryItem.item_id).one()
387
        category = Category.query.filter_by(id=it.category).one()
388
        parent_category = Category.query.filter_by(id=category.parent_category_id).first()
12489 kshitij.so 389
        sourcePercentage = None
390
        sip = SourceItemPercentage.query.filter(SourceItemPercentage.item_id==it.id).filter(SourceItemPercentage.source==OrderSource.AMAZON).filter(SourceItemPercentage.startDate<=time).filter(SourceItemPercentage.expiryDate>=time).first()
391
        if sip is not None:
392
            sourcePercentage = sip
12363 kshitij.so 393
        else:
12489 kshitij.so 394
            scp = SourceCategoryPercentage.query.filter(SourceCategoryPercentage.category_id==it.category).filter(SourceCategoryPercentage.source==OrderSource.AMAZON).filter(SourceCategoryPercentage.startDate<=time).filter(SourceCategoryPercentage.expiryDate>=time).first()
395
            if scp is not None:
396
                sourcePercentage = scp
397
            else:
398
                spm = SourcePercentageMaster.get_by(source=OrderSource.AMAZON)
399
                sourcePercentage = spm
12375 kshitij.so 400
        if fbaInventoryItem.location==0:
12377 kshitij.so 401
            sku = 'FBA'+str(fbaInventoryItem.item_id)
12363 kshitij.so 402
            state_id = 1
12375 kshitij.so 403
        elif fbaInventoryItem.location==1:
12377 kshitij.so 404
            sku = 'FBB'+str(fbaInventoryItem.item_id)
12363 kshitij.so 405
            state_id = 2
406
        else:
407
            continue
408
        cc = computeCourierCost(it.weight)
12379 kshitij.so 409
 
12447 kshitij.so 410
        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 411
        itemInfo.append(amazonItemInfo)
412
    amPromotions = AmazonPromotion.query.filter(AmazonPromotion.startDate<=time).filter(AmazonPromotion.endDate>=time).filter(AmazonPromotion.promotionType==AmazonPromotionType.LONGTERM).filter(AmazonPromotion.promotionActive==True) \
413
    .group_by(AmazonPromotion.sku).order_by(desc(AmazonPromotion.addedOn)).all()
414
    for amPromotion in amPromotions:
12433 kshitij.so 415
        amazonLongTermActivePromotions[amPromotion.sku] = __Promotion(amPromotion.salePrice,amPromotion.subsidy,amPromotion.promotionType,amPromotion.endDate)
12396 kshitij.so 416
    amPromotions = AmazonPromotion.query.filter(AmazonPromotion.startDate<=time).filter(AmazonPromotion.endDate>=time).filter(AmazonPromotion.promotionType==AmazonPromotionType.SHORTTERM).filter(AmazonPromotion.promotionActive==True) \
417
    .group_by(AmazonPromotion.sku).order_by(desc(AmazonPromotion.addedOn)).all()
418
    for amPromotion in amPromotions:
12433 kshitij.so 419
        amazonShortTermActivePromotions[amPromotion.sku] = __Promotion(amPromotion.salePrice,amPromotion.subsidy,amPromotion.promotionType,amPromotion.endDate)
12363 kshitij.so 420
    session.close()
12450 kshitij.so 421
    print "No of items populated ",len(itemInfo)
12452 kshitij.so 422
    sleep(5)
12363 kshitij.so 423
    return itemInfo
424
 
12430 kshitij.so 425
def getPriceAndAsin(itemInfo):
426
    skus = []
427
    for item in itemInfo:
428
        skus.append(item.sku)
429
    ourPricingForSku = amScraper.get_my_pricing_for_sku('A21TJRUUN4KGV', skus)
430
    for item in itemInfo:
431
        ourPricing = ourPricingForSku.get(item.sku)
12441 kshitij.so 432
        if ourPricing is None or len(ourPricing.keys())==0:
12430 kshitij.so 433
            item.ourSp = 0
434
            item.promoPrice = 0
435
            item.isPromotion = False
12473 kshitij.so 436
            item.asin = ''
12430 kshitij.so 437
        else:
438
            item.ourSp = ourPricing.get('sellingPrice')
439
            item.promoPrice = ourPricing.get('promoPrice')
440
            item.isPromotion = ourPricing.get('promotion')
12473 kshitij.so 441
            item.asin = ourPricing.get('asin')
12450 kshitij.so 442
 
12430 kshitij.so 443
 
444
 
12363 kshitij.so 445
def decideCategory(itemInfo):
446
    exceptionList, negativeMargin, cheapest, amongCheapestAndCanCompete, canCompete, almostCompete, cantCompete = [],[],[],[],[],[],[] 
12430 kshitij.so 447
    skus = []
12363 kshitij.so 448
    for item in itemInfo:
12430 kshitij.so 449
        skus.append(item.sku)
450
    aggResponse = amScraper.get_competitive_pricing_for_sku('A21TJRUUN4KGV', skus)
451
    ourPricingForSku = amScraper.get_my_pricing_for_sku('A21TJRUUN4KGV', skus)
12403 kshitij.so 452
 
12363 kshitij.so 453
    for val in itemInfo:
12430 kshitij.so 454
        scrapInfo = aggResponse.get(val.sku)
12443 kshitij.so 455
        if scrapInfo is None or len(scrapInfo)==0 or val.nlc==0 or len(ourPricingForSku.get(val.sku).keys())==0:
12363 kshitij.so 456
            temp = []
457
            temp.append(val)
458
            if val.nlc==0 or val.nlc is None:
12456 kshitij.so 459
                print "WANLC is 0"
12363 kshitij.so 460
                temp.append("WANLC is 0")
12443 kshitij.so 461
            elif ourPricingForSku.get(val.sku) is None or ourPricingForSku.get(val.sku).keys()==0:
12456 kshitij.so 462
                print "Unable to fetch our price"
12430 kshitij.so 463
                temp.append("Unable to fetch our price")
12363 kshitij.so 464
            else:
12456 kshitij.so 465
                print "Unable to fetch competive pricing"
12430 kshitij.so 466
                temp.append("Unable to fetch competitive pricing")
12363 kshitij.so 467
            exceptionList.append(temp)
468
            continue
12430 kshitij.so 469
        val.ourSp = ourPricingForSku.get(val.sku).get('sellingPrice')
470
        val.promoPrice = ourPricingForSku.get(val.sku).get('promoPrice')
471
        val.isPromo = ourPricingForSku.get(val.sku).get('promotion')
12363 kshitij.so 472
        iterator = 0
473
        sku, lowestSellerName,secondLowestSellerName, thirdLowestSellerName = ('',)*4
12432 kshitij.so 474
        ourSp, ourRank, lowestSellerSp, secondLowestSellerSp, thirdLowestSellerSp, lowestPossibleSp = (0,)*6
12430 kshitij.so 475
        lowestSellerShippingTime, lowestSellerRating, secondLowestSellerShippingTime, secondLowestSellerRating, thirdLowestSellerShippingTime , \
476
        thirdLowestSellerRating, lowestSellerType, secondLowestSellerType, thirdLowestSellerType = (0,)*9
477
        isPromo = False
12363 kshitij.so 478
        sku = val.sku
479
        multipleListings = False
12430 kshitij.so 480
        ourSkuDetails = ourPricingForSku.get(val.sku)
12475 kshitij.so 481
        if (ourSkuDetails.get('promotion')!=(amazonLongTermActivePromotions.has_key(val.sku) or amazonShortTermActivePromotions.has_key(val.sku))):
12432 kshitij.so 482
            temp = []
483
            temp.append(val)
12456 kshitij.so 484
            print "promo misconfigured"
12432 kshitij.so 485
            temp.append("Promo misconfigured")
12457 kshitij.so 486
            exceptionList.append(temp)
12432 kshitij.so 487
            continue
12475 kshitij.so 488
 
12430 kshitij.so 489
        scrapInfo.append(ourSkuDetails)
490
        sortedScrapInfo =  sorted(scrapInfo, key=itemgetter('promoPrice','notOurSku'))
491
        for info in sortedScrapInfo:
12465 kshitij.so 492
            if  not info['notOurSku']:
12442 kshitij.so 493
                ourSp = info['sellingPrice']
494
                promoPrice = info['promoPrice']
495
                isPromo = info['promotion']
12430 kshitij.so 496
                ourRank = iterator + 1
12363 kshitij.so 497
 
498
            if iterator == 0:
12430 kshitij.so 499
                lowestSellerSp = info['promoPrice']
500
                lowestSellerShippingTime = info['shippingTime']
501
                lowestSellerRating = info['rating']
502
                lowestSellerType = info['fulfillmentChannel']
12363 kshitij.so 503
 
504
            if iterator == 1:
12430 kshitij.so 505
                secondLowestSellerSp = info['promoPrice']
506
                secondLowestSellerShippingTime = info['shippingTime']
507
                secondLowestSellerRating = info['rating']
508
                secondLowestSellerType = info['fulfillmentChannel']
12363 kshitij.so 509
 
510
            if iterator == 2:
12430 kshitij.so 511
                thirdLowestSellerSp = info['promoPrice']
512
                thirdLowestSellerShippingTime = info['shippingTime']
513
                thirdLowestSellerRating = info['rating']
514
                thirdLowestSellerType = info['fulfillmentChannel']
12363 kshitij.so 515
 
516
            iterator += 1
12401 kshitij.so 517
        print "terminating iterator"
12483 kshitij.so 518
 
12408 kshitij.so 519
        print "Creating object am details",val.sku
12430 kshitij.so 520
        amDetails = __AmazonDetails(sku, float(ourSp), ourRank, lowestSellerName,float(lowestSellerSp),secondLowestSellerName, float(secondLowestSellerSp), thirdLowestSellerName, float(thirdLowestSellerSp),len(scrapInfo),multipleListings,promoPrice,isPromo, \
521
                    lowestSellerShippingTime ,lowestSellerRating, secondLowestSellerShippingTime, secondLowestSellerRating, thirdLowestSellerShippingTime , thirdLowestSellerRating, lowestSellerType, secondLowestSellerType, thirdLowestSellerType)
12414 kshitij.so 522
        print "am details obj created"
12363 kshitij.so 523
        try:
12414 kshitij.so 524
            print "inside val getter"
12418 kshitij.so 525
            itemVatMaster = ItemVatMaster.query.filter(and_(ItemVatMaster.itemId==int(val.sku[3:]), ItemVatMaster.stateId==val.state_id)).first()
526
            if itemVatMaster is None:
12419 kshitij.so 527
                d_item = Item.query.filter_by(id=int(val.sku[3:])).first()
528
                if d_item is None:
529
                    raise 
530
                else:
12430 kshitij.so 531
                    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 532
                if vatMaster is None:
12418 kshitij.so 533
                    raise
12419 kshitij.so 534
                else:
535
                    val.vatRate = vatMaster.vatPercent
536
                    print "vat fetched"
12418 kshitij.so 537
            else:
538
                val.vatRate = itemVatMaster.vatPercentage
12419 kshitij.so 539
                print "vat fetched"
12363 kshitij.so 540
        except:
12414 kshitij.so 541
            print "vat exception"
12363 kshitij.so 542
            temp = []
543
            temp.append(val)
544
            temp.append("Vat not available")
545
            exceptionList.append(temp)
546
            continue
547
 
548
        lowestPossibleSp = getLowestPossibleSp(amDetails,val,val.sourcePercentage)
12408 kshitij.so 549
        print "Creating pricing obj"
12432 kshitij.so 550
        amPricing = __AmazonPricing(ourSp,lowestPossibleSp)
12483 kshitij.so 551
        print "sku ",val.sku
552
        print "oursp ",ourSp
553
        print "promoPrice ",promoPrice
554
        print "lowestpossbile sp ",lowestPossibleSp
555
        print "objlowestPossiblesp ",amPricing.lowestPossibleSp
12363 kshitij.so 556
 
12467 kshitij.so 557
        if amDetails.promoPrice < amPricing.lowestPossibleSp:
12363 kshitij.so 558
            temp = []
559
            temp.append(val)
560
            temp.append(amDetails)
561
            temp.append(amPricing)
562
            negativeMargin.append(temp)
12483 kshitij.so 563
            print "val sku cat negative ",val.sku
12363 kshitij.so 564
            continue
565
 
566
        if amDetails.ourRank==1:
567
            temp = []
568
            temp.append(val)
569
            temp.append(amDetails)
570
            temp.append(amPricing)
571
            cheapest.append(temp)
12483 kshitij.so 572
            print "val sku cat cheapest ",val.sku
12363 kshitij.so 573
            continue
574
 
12469 kshitij.so 575
        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 576
            temp = []
577
            temp.append(val)
578
            temp.append(amDetails)
579
            temp.append(amPricing)
580
            amongCheapestAndCanCompete.append(temp)
12483 kshitij.so 581
            print "val sku cat amongCheapestAndCanCompete  ",val.sku
12363 kshitij.so 582
            continue
583
 
584
        if (amDetails.lowestSellerSp > amPricing.lowestPossibleSp):
585
            temp = []
586
            temp.append(val)
587
            temp.append(amDetails)
588
            temp.append(amPricing)
589
            canCompete.append(temp)
12483 kshitij.so 590
            print "val sku cat can compete  ",val.sku
12363 kshitij.so 591
            continue
592
 
12403 kshitij.so 593
        if amDetails.lowestSellerSp*(1+.01) >= amPricing.lowestPossibleSp:
12396 kshitij.so 594
            temp = []
595
            temp.append(val)
596
            temp.append(amDetails)
597
            temp.append(amPricing)
598
            almostCompete.append(temp)
12483 kshitij.so 599
            print "val sku cat almost compete  ",val.sku
12396 kshitij.so 600
            continue
601
 
602
 
12363 kshitij.so 603
        temp = []
604
        temp.append(val)
605
        temp.append(amDetails)
606
        temp.append(amPricing)
12483 kshitij.so 607
        print "val sku cat cant compete  ",val.sku
12363 kshitij.so 608
        cantCompete.append(temp)
12414 kshitij.so 609
    print "Created category..."
12363 kshitij.so 610
 
611
    return exceptionList, negativeMargin, cheapest, amongCheapestAndCanCompete, canCompete, almostCompete, cantCompete
12396 kshitij.so 612
 
12363 kshitij.so 613
 
614
def getLowestPossibleSp(amazonDetails,val,spm):
12497 kshitij.so 615
    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 616
    if val.isPromo:
617
        if amazonLongTermActivePromotions.has_key(val.sku):
12466 kshitij.so 618
            subsidy = (amazonLongTermActivePromotions.get(val.sku)).subsidy
12432 kshitij.so 619
        else:
12466 kshitij.so 620
            subsidy = (amazonShortTermActivePromotions.get(val.sku)).subsidy
12432 kshitij.so 621
        lowestPossibleSp = lowestPossibleSp - subsidy
12496 kshitij.so 622
        print "subsidy ",subsidy
12495 kshitij.so 623
    print (val.nlc+(val.courierCost)*(1+(spm.serviceTax/100))*(1+(val.vatRate/100))+(15+val.otherCost)*(1+(val.vatRate)/100))
624
    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 625
    return round(lowestPossibleSp,2)
626
 
12489 kshitij.so 627
def getNewLowestPossibleSp(item,serviceTax,newVatRate):
628
    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));
629
    if item.isPromotion:
630
        sku = ''
631
        if item.warehouseLocation==1:
632
            sku='FBA'+str(item.item_id)
633
        else:
634
            sku='FBB'+str(item.item_id)
635
        if amazonLongTermActivePromotions.has_key(sku):
636
            subsidy = (amazonLongTermActivePromotions.get(sku)).subsidy
637
        else:
638
            subsidy = (amazonShortTermActivePromotions.get(sku)).subsidy
639
        lowestPossibleSp = lowestPossibleSp - subsidy
640
    return round(lowestPossibleSp,2)
641
 
642
 
12363 kshitij.so 643
def getTargetTp(targetSp,spm,val):
12424 kshitij.so 644
    targetTp = targetSp- targetSp*(spm.commission/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost)*(1+(spm.serviceTax/100))
12363 kshitij.so 645
    return round(targetTp,2)
646
 
647
def commitExceptionList(exceptionList,timestamp,runType):
648
    for exceptionItem in exceptionList:
649
        val = exceptionItem[0]
650
        reason = exceptionItem[1]
651
        amazonScrapingHistory = AmazonScrapingHistory()
652
        amazonScrapingHistory.item_id = val.sku[3:]
653
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 654
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 655
        amazonScrapingHistory.reason = reason
656
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
657
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.EXCEPTION
658
        amazonScrapingHistory.timestamp = timestamp
659
    session.commit()
660
 
661
def commitNegativeMargin(negativeMargin,timestamp,runType):
662
    for negativeMarginItem in negativeMargin:
663
        val = negativeMarginItem[0]
664
        amDetails = negativeMarginItem[1]
665
        amPricing = negativeMarginItem[2]
666
        spm = val.sourcePercentage
12510 kshitij.so 667
        if amazonLongTermActivePromotions.has_key(val.sku):
668
            subsidy = (amazonLongTermActivePromotions.get(val.sku)).subsidy
669
        elif amazonShortTermActivePromotions.has_key(val.sku):
670
            subsidy = (amazonShortTermActivePromotions.get(val.sku)).subsidy
671
        else:
672
            subsidy = 0
12363 kshitij.so 673
        amazonScrapingHistory = AmazonScrapingHistory()
674
        amazonScrapingHistory.item_id = val.sku[3:]
12471 kshitij.so 675
        amazonScrapingHistory.asin = val.asin
12363 kshitij.so 676
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 677
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 678
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 679
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12510 kshitij.so 680
        amazonScrapingHistory.subsidy = subsidy
681
        amazonScrapingHistory.vatRate = val.vatRate
12363 kshitij.so 682
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
683
        amazonScrapingHistory.ourRank = amDetails.ourRank
684
        amazonScrapingHistory.ourInventory = val.ourInventory
685
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12468 kshitij.so 686
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
687
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
688
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12363 kshitij.so 689
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12468 kshitij.so 690
        amazonScrapingHistory.secondLowestSellerShippingTime = amDetails.secondLowestSellerShippingTime
691
        amazonScrapingHistory.secondLowestSellerRating = amDetails.secondLowestSellerRating
692
        amazonScrapingHistory.secondLowestSellerType = amDetails.secondLowestSellerType
12363 kshitij.so 693
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12468 kshitij.so 694
        amazonScrapingHistory.thirdLowestSellerShippingTime = amDetails.thirdLowestSellerShippingTime
695
        amazonScrapingHistory.thirdLowestSellerRating = amDetails.thirdLowestSellerRating
696
        amazonScrapingHistory.thirdLowestSellerType = amDetails.thirdLowestSellerType
12363 kshitij.so 697
        amazonScrapingHistory.wanlc = val.nlc
12447 kshitij.so 698
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 699
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 700
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 701
        amazonScrapingHistory.returnProvision = spm.returnProvision
702
        amazonScrapingHistory.courierCost = val.courierCost
703
        amazonScrapingHistory.risky = val.risky
704
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
705
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
706
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.NEGATIVE_MARGIN
707
        amazonScrapingHistory.timestamp = timestamp
708
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
709
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 710
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 711
    session.commit()
712
 
713
 
714
def commitCheapest(cheapest,timestamp,runType):
715
    for cheapestItem in cheapest:
716
        val = cheapestItem[0]
717
        amDetails = cheapestItem[1]
718
        amPricing = cheapestItem[2]
719
        spm = val.sourcePercentage
12510 kshitij.so 720
        if amazonLongTermActivePromotions.has_key(val.sku):
721
            subsidy = (amazonLongTermActivePromotions.get(val.sku)).subsidy
722
        elif amazonShortTermActivePromotions.has_key(val.sku):
723
            subsidy = (amazonShortTermActivePromotions.get(val.sku)).subsidy
724
        else:
725
            subsidy = 0
12363 kshitij.so 726
        amazonScrapingHistory = AmazonScrapingHistory()
727
        amazonScrapingHistory.item_id = val.sku[3:]
12471 kshitij.so 728
        amazonScrapingHistory.asin = val.asin
12363 kshitij.so 729
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 730
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 731
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 732
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12510 kshitij.so 733
        amazonScrapingHistory.subsidy = subsidy
734
        amazonScrapingHistory.vatRate = val.vatRate
12363 kshitij.so 735
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
736
        amazonScrapingHistory.ourRank = amDetails.ourRank
737
        amazonScrapingHistory.ourInventory = val.ourInventory
738
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 739
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
740
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
741
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12363 kshitij.so 742
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12468 kshitij.so 743
        amazonScrapingHistory.secondLowestSellerShippingTime = amDetails.secondLowestSellerShippingTime
744
        amazonScrapingHistory.secondLowestSellerRating = amDetails.secondLowestSellerRating
745
        amazonScrapingHistory.secondLowestSellerType = amDetails.secondLowestSellerType
12363 kshitij.so 746
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12468 kshitij.so 747
        amazonScrapingHistory.thirdLowestSellerShippingTime = amDetails.thirdLowestSellerShippingTime
748
        amazonScrapingHistory.thirdLowestSellerRating = amDetails.thirdLowestSellerRating
749
        amazonScrapingHistory.thirdLowestSellerType = amDetails.thirdLowestSellerType
12447 kshitij.so 750
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 751
        amazonScrapingHistory.wanlc = val.nlc
752
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 753
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 754
        amazonScrapingHistory.returnProvision = spm.returnProvision
755
        amazonScrapingHistory.courierCost = val.courierCost
756
        amazonScrapingHistory.risky = val.risky
757
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
758
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
759
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.BUY_BOX
760
        amazonScrapingHistory.timestamp = timestamp
761
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
12430 kshitij.so 762
        proposed_sp = max(amDetails.secondLowestSellerSp - max((20, amDetails.secondLowestSellerSp*0.002)), amPricing.lowestPossibleSp)
12433 kshitij.so 763
        if amazonScrapingHistory.isPromotion:
764
            if amazonLongTermActivePromotions.has_key(val.sku):
12466 kshitij.so 765
                proposed_sp = min(proposed_sp,(amazonLongTermActivePromotions.get(val.sku)).salePrice)
12433 kshitij.so 766
            else:
12466 kshitij.so 767
                proposed_sp = min(proposed_sp,(amazonShortTermActivePromotions.get(val.sku)).salePrice)
12468 kshitij.so 768
        #proposed_tp = getTargetTp(proposed_sp,spm,val)
12363 kshitij.so 769
        amazonScrapingHistory.proposedSp = proposed_sp
12468 kshitij.so 770
        #amazonScrapingHistory.proposedTp = proposed_tp
771
        #amazonScrapingHistory.marginIncreasedPotential = proposed_tp - amPricing.ourTp
12363 kshitij.so 772
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
773
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 774
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 775
    session.commit()
776
 
777
 
778
 
779
def commitAmongCheapestAndCanCompete(amongCheapestAndCanCompete,timestamp,runType):
780
    for amongCheapestAndCanCompeteItem in amongCheapestAndCanCompete:
781
        val = amongCheapestAndCanCompeteItem[0]
782
        amDetails = amongCheapestAndCanCompeteItem[1]
783
        amPricing = amongCheapestAndCanCompeteItem[2]
784
        spm = val.sourcePercentage
12510 kshitij.so 785
        if amazonLongTermActivePromotions.has_key(val.sku):
786
            subsidy = (amazonLongTermActivePromotions.get(val.sku)).subsidy
787
        elif amazonShortTermActivePromotions.has_key(val.sku):
788
            subsidy = (amazonShortTermActivePromotions.get(val.sku)).subsidy
789
        else:
790
            subsidy = 0
12363 kshitij.so 791
        amazonScrapingHistory = AmazonScrapingHistory()
792
        amazonScrapingHistory.item_id = val.sku[3:]
12471 kshitij.so 793
        amazonScrapingHistory.asin = val.asin
12363 kshitij.so 794
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 795
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 796
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 797
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12510 kshitij.so 798
        amazonScrapingHistory.subsidy = subsidy
799
        amazonScrapingHistory.vatRate = val.vatRate
12363 kshitij.so 800
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
801
        amazonScrapingHistory.ourRank = amDetails.ourRank
802
        amazonScrapingHistory.ourInventory = val.ourInventory
803
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 804
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
805
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
806
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12363 kshitij.so 807
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12468 kshitij.so 808
        amazonScrapingHistory.secondLowestSellerShippingTime = amDetails.secondLowestSellerShippingTime
809
        amazonScrapingHistory.secondLowestSellerRating = amDetails.secondLowestSellerRating
810
        amazonScrapingHistory.secondLowestSellerType = amDetails.secondLowestSellerType
12470 kshitij.so 811
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12468 kshitij.so 812
        amazonScrapingHistory.thirdLowestSellerShippingTime = amDetails.thirdLowestSellerShippingTime
813
        amazonScrapingHistory.thirdLowestSellerRating = amDetails.thirdLowestSellerRating
814
        amazonScrapingHistory.thirdLowestSellerType = amDetails.thirdLowestSellerType
12447 kshitij.so 815
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 816
        amazonScrapingHistory.wanlc = val.nlc
817
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 818
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 819
        amazonScrapingHistory.returnProvision = spm.returnProvision
820
        amazonScrapingHistory.courierCost = val.courierCost
821
        amazonScrapingHistory.risky = val.risky
822
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
823
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
824
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE
825
        amazonScrapingHistory.timestamp = timestamp
826
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
827
        proposed_sp = max(amDetails.lowestSellerSp - max((5, amDetails.lowestSellerSp*0.001)), amPricing.lowestPossibleSp)
12468 kshitij.so 828
        #proposed_tp = getTargetTp(proposed_sp,spm,val)
12363 kshitij.so 829
        amazonScrapingHistory.proposedSp = proposed_sp
12468 kshitij.so 830
        #amazonScrapingHistory.proposedTp = proposed_tp
12363 kshitij.so 831
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
832
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 833
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 834
    session.commit()
835
 
836
def commitCanCompete(canCompete,timestamp,runType):
837
    for canCompeteItem in canCompete:
838
        val = canCompeteItem[0]
839
        amDetails = canCompeteItem[1]
840
        amPricing = canCompeteItem[2]
841
        spm = val.sourcePercentage
12510 kshitij.so 842
        if amazonLongTermActivePromotions.has_key(val.sku):
843
            subsidy = (amazonLongTermActivePromotions.get(val.sku)).subsidy
844
        elif amazonShortTermActivePromotions.has_key(val.sku):
845
            subsidy = (amazonShortTermActivePromotions.get(val.sku)).subsidy
846
        else:
847
            subsidy = 0
12363 kshitij.so 848
        amazonScrapingHistory = AmazonScrapingHistory()
849
        amazonScrapingHistory.item_id = val.sku[3:]
12471 kshitij.so 850
        amazonScrapingHistory.asin = val.asin
12363 kshitij.so 851
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 852
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 853
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 854
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12510 kshitij.so 855
        amazonScrapingHistory.subsidy = subsidy
856
        amazonScrapingHistory.vatRate = val.vatRate
12363 kshitij.so 857
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
858
        amazonScrapingHistory.ourRank = amDetails.ourRank
859
        amazonScrapingHistory.ourInventory = val.ourInventory
860
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 861
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
862
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
863
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12363 kshitij.so 864
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12468 kshitij.so 865
        amazonScrapingHistory.secondLowestSellerShippingTime = amDetails.secondLowestSellerShippingTime
866
        amazonScrapingHistory.secondLowestSellerRating = amDetails.secondLowestSellerRating
867
        amazonScrapingHistory.secondLowestSellerType = amDetails.secondLowestSellerType
12363 kshitij.so 868
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12468 kshitij.so 869
        amazonScrapingHistory.thirdLowestSellerShippingTime = amDetails.thirdLowestSellerShippingTime
870
        amazonScrapingHistory.thirdLowestSellerRating = amDetails.thirdLowestSellerRating
871
        amazonScrapingHistory.thirdLowestSellerType = amDetails.thirdLowestSellerType
12447 kshitij.so 872
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 873
        amazonScrapingHistory.wanlc = val.nlc
874
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 875
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 876
        amazonScrapingHistory.returnProvision = spm.returnProvision
877
        amazonScrapingHistory.courierCost = val.courierCost
878
        amazonScrapingHistory.risky = val.risky
879
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
880
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
881
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.COMPETITIVE
882
        amazonScrapingHistory.timestamp = timestamp
883
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
884
        proposed_sp = max(amDetails.lowestSellerSp - max((5, amDetails.lowestSellerSp*0.001)), amPricing.lowestPossibleSp)
12468 kshitij.so 885
        #proposed_tp = getTargetTp(proposed_sp,spm,val)
12363 kshitij.so 886
        amazonScrapingHistory.proposedSp = proposed_sp
12468 kshitij.so 887
        #amazonScrapingHistory.proposedTp = proposed_tp
12363 kshitij.so 888
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
889
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 890
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 891
    session.commit()
892
 
12383 kshitij.so 893
def commitAlmostCompete(almostCompete,timestamp,runType):
12396 kshitij.so 894
    for almostCompeteItem in almostCompete:
895
        val = almostCompeteItem[0]
896
        amDetails = almostCompeteItem[1]
897
        amPricing = almostCompeteItem[2]
898
        spm = val.sourcePercentage
12510 kshitij.so 899
        if amazonLongTermActivePromotions.has_key(val.sku):
900
            subsidy = (amazonLongTermActivePromotions.get(val.sku)).subsidy
901
        elif amazonShortTermActivePromotions.has_key(val.sku):
902
            subsidy = (amazonShortTermActivePromotions.get(val.sku)).subsidy
903
        else:
904
            subsidy = 0
12396 kshitij.so 905
        amazonScrapingHistory = AmazonScrapingHistory()
906
        amazonScrapingHistory.item_id = val.sku[3:]
12471 kshitij.so 907
        amazonScrapingHistory.asin = val.asin
12396 kshitij.so 908
        amazonScrapingHistory.warehouseLocation = val.state_id
909
        amazonScrapingHistory.parentCategoryId = val.parent_category
910
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 911
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12510 kshitij.so 912
        amazonScrapingHistory.subsidy = subsidy
913
        amazonScrapingHistory.vatRate = val.vatRate
12396 kshitij.so 914
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
915
        amazonScrapingHistory.ourRank = amDetails.ourRank
916
        amazonScrapingHistory.ourInventory = val.ourInventory
917
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 918
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
919
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
920
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12396 kshitij.so 921
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12468 kshitij.so 922
        amazonScrapingHistory.secondLowestSellerShippingTime = amDetails.secondLowestSellerShippingTime
923
        amazonScrapingHistory.secondLowestSellerRating = amDetails.secondLowestSellerRating
924
        amazonScrapingHistory.secondLowestSellerType = amDetails.secondLowestSellerType
12396 kshitij.so 925
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12468 kshitij.so 926
        amazonScrapingHistory.thirdLowestSellerShippingTime = amDetails.thirdLowestSellerShippingTime
927
        amazonScrapingHistory.thirdLowestSellerRating = amDetails.thirdLowestSellerRating
928
        amazonScrapingHistory.thirdLowestSellerType = amDetails.thirdLowestSellerType
12447 kshitij.so 929
        amazonScrapingHistory.otherCost = val.otherCost
12396 kshitij.so 930
        amazonScrapingHistory.wanlc = val.nlc
931
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 932
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12396 kshitij.so 933
        amazonScrapingHistory.returnProvision = spm.returnProvision
934
        amazonScrapingHistory.courierCost = val.courierCost
935
        amazonScrapingHistory.risky = val.risky
936
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
937
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
938
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.ALMOST_COMPETE
939
        amazonScrapingHistory.timestamp = timestamp
940
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
12425 kshitij.so 941
        proposed_sp = min(amDetails.lowestSellerSp*(1+.01),amPricing.lowestPossibleSp)
12468 kshitij.so 942
        #proposed_tp = getTargetTp(proposed_sp,spm,val)
943
        #target_nlc = proposed_tp - amPricing.lowestPossibleTp + val.nlc
12396 kshitij.so 944
        amazonScrapingHistory.proposedSp = proposed_sp
12468 kshitij.so 945
        #amazonScrapingHistory.proposedTp = proposed_tp
946
        #amazonScrapingHistory.targetNlc = target_nlc
12396 kshitij.so 947
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
948
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 949
        amazonScrapingHistory.isPromotion = val.isPromo
12396 kshitij.so 950
    session.commit()
12363 kshitij.so 951
 
12396 kshitij.so 952
 
12363 kshitij.so 953
def commitCantCompete(cantCompete, timestamp,runType):
954
    for cantCompeteItem in cantCompete:
955
        val = cantCompeteItem[0]
956
        amDetails = cantCompeteItem[1]
957
        amPricing = cantCompeteItem[2]
958
        spm = val.sourcePercentage
12510 kshitij.so 959
        if amazonLongTermActivePromotions.has_key(val.sku):
960
            subsidy = (amazonLongTermActivePromotions.get(val.sku)).subsidy
961
        elif amazonShortTermActivePromotions.has_key(val.sku):
962
            subsidy = (amazonShortTermActivePromotions.get(val.sku)).subsidy
963
        else:
964
            subsidy = 0
12363 kshitij.so 965
        amazonScrapingHistory = AmazonScrapingHistory()
966
        amazonScrapingHistory.item_id = val.sku[3:]
12471 kshitij.so 967
        amazonScrapingHistory.asin = val.asin
12363 kshitij.so 968
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 969
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 970
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
12432 kshitij.so 971
        amazonScrapingHistory.promoPrice = amDetails.promoPrice
12510 kshitij.so 972
        amazonScrapingHistory.subsidy = subsidy
973
        amazonScrapingHistory.vatRate = val.vatRate
12363 kshitij.so 974
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
975
        amazonScrapingHistory.ourRank = amDetails.ourRank
976
        amazonScrapingHistory.ourInventory = val.ourInventory
977
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
12430 kshitij.so 978
        amazonScrapingHistory.lowestSellerShippingTime = amDetails.lowestSellerShippingTime
979
        amazonScrapingHistory.lowestSellerRating = amDetails.lowestSellerRating
980
        amazonScrapingHistory.lowestSellerType = amDetails.lowestSellerType
12363 kshitij.so 981
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
12468 kshitij.so 982
        amazonScrapingHistory.secondLowestSellerShippingTime = amDetails.secondLowestSellerShippingTime
983
        amazonScrapingHistory.secondLowestSellerRating = amDetails.secondLowestSellerRating
984
        amazonScrapingHistory.secondLowestSellerType = amDetails.secondLowestSellerType
12363 kshitij.so 985
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
12468 kshitij.so 986
        amazonScrapingHistory.thirdLowestSellerShippingTime = amDetails.thirdLowestSellerShippingTime
987
        amazonScrapingHistory.thirdLowestSellerRating = amDetails.thirdLowestSellerRating
988
        amazonScrapingHistory.thirdLowestSellerType = amDetails.thirdLowestSellerType
12447 kshitij.so 989
        amazonScrapingHistory.otherCost = val.otherCost
12363 kshitij.so 990
        amazonScrapingHistory.wanlc = val.nlc
991
        amazonScrapingHistory.commission = spm.commission
12422 kshitij.so 992
        amazonScrapingHistory.competitorCommission = spm.competitorCommissionOther
12363 kshitij.so 993
        amazonScrapingHistory.returnProvision = spm.returnProvision
994
        amazonScrapingHistory.courierCost = val.courierCost
995
        amazonScrapingHistory.risky = val.risky
996
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
997
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
998
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.CANT_COMPETE
999
        amazonScrapingHistory.timestamp = timestamp
1000
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
1001
        proposed_sp = amDetails.lowestSellerSp - max(5, amDetails.lowestSellerSp*0.001)
12468 kshitij.so 1002
        #proposed_tp = getTargetTp(proposed_sp,spm,val)
1003
        #target_nlc = proposed_tp - amPricing.lowestPossibleTp + val.nlc
12363 kshitij.so 1004
        amazonScrapingHistory.proposedSp = proposed_sp
12468 kshitij.so 1005
        #amazonScrapingHistory.proposedTp = proposed_tp
1006
        #amazonScrapingHistory.targetNlc = target_nlc
12363 kshitij.so 1007
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
1008
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
12432 kshitij.so 1009
        amazonScrapingHistory.isPromotion = val.isPromo
12363 kshitij.so 1010
    session.commit()
1011
 
12396 kshitij.so 1012
def markAutoFavourites(time):
1013
    nowAutoFav = []
1014
    previouslyAutoFav = []
1015
    stockList = []
1016
    saleList = []
1017
    items = session.query(func.sum(AmazonScrapingHistory.ourInventory),AmazonScrapingHistory.item_id).group_by(AmazonScrapingHistory.item_id).all()
1018
    allItems = session.query(Amazonlisted).all()
1019
    for item in items:
1020
        reason = ""
1021
        if item[0]>=5:
1022
            stockList.append(item[1])
1023
 
1024
    for sku, val in saleMap.iteritems():
1025
        totalSale = 0
1026
        item_id = sku.replace('FBA','').replace('FBB','')
1027
        val =saleMap.get('FBA'+str(item_id))
1028
        if val is not None:
1029
            for sale in val:
1030
                totalSale += sale.totalOrderCount
1031
        val =saleMap.get('FBB'+str(item_id))
1032
        if val is not None:
1033
            for sale in val:
1034
                totalSale += sale.totalOrderCount
1035
        if totalSale > 0:
1036
            saleList.append(item_id)
1037
 
1038
    for aItem in allItems:
1039
        reason = ""
1040
        toMark = False
1041
        if aItem.itemId in saleList:
1042
            toMark = True
1043
            reason+="Total FC sale is greater than 1 for last five days.."
1044
        if aItem.itemId in stockList:
1045
            toMark = True
1046
            reason+="Item is present in buy box in last 3 days"
1047
        if not aItem.autoFavourite:
1048
            print "Item is not under auto favourite"
1049
        if toMark:
1050
            temp=[]
1051
            temp.append(aItem.itemId)
1052
            temp.append(reason)
1053
            nowAutoFav.append(temp)
1054
        if (not toMark) and aItem.autoFavourite:
1055
            previouslyAutoFav.append(aItem.itemId)
1056
        aItem.autoFavourite = toMark
1057
    session.commit()
1058
    return previouslyAutoFav, nowAutoFav
1059
 
12444 kshitij.so 1060
def writeReport(timestamp,autoDecreaseItems,autoIncreaseItems,previousAutoFav,nowAutoFav,runType):
12396 kshitij.so 1061
    wbk = xlwt.Workbook()
1062
    sheet = wbk.add_sheet('Can\'t Compete')
1063
    xstr = lambda s: s or ""
1064
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1065
 
1066
    excel_integer_format = '0'
1067
    integer_style = xlwt.XFStyle()
1068
    integer_style.num_format_str = excel_integer_format
1069
 
1070
    sheet.write(0, 0, "Item Id", heading_xf)
1071
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1072
    sheet.write(0, 2, "Asin", heading_xf)
1073
    sheet.write(0, 3, "Location", heading_xf)
1074
    sheet.write(0, 4, "Brand", heading_xf)
1075
    sheet.write(0, 5, "Product Name", heading_xf)
1076
    sheet.write(0, 6, "Weight", heading_xf)
1077
    sheet.write(0, 7, "Courier Cost", heading_xf)
1078
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1079
    sheet.write(0, 9, "Promo Price", heading_xf)
1080
    sheet.write(0, 10, "Is Promotion", heading_xf)
1081
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1082
    sheet.write(0, 12, "Rank", heading_xf)
1083
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1084
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1085
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1086
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1087
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1088
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1089
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1090
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1091
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1092
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1093
    sheet.write(0, 23, "Other Cost", heading_xf)
1094
    sheet.write(0, 24, "WANLC", heading_xf)
1095
    sheet.write(0, 25, "Commission", heading_xf)
1096
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1097
    sheet.write(0, 27, "Return Provision", heading_xf)
12510 kshitij.so 1098
    sheet.write(0, 28, "Vat Rate", heading_xf)
1099
    sheet.write(0, 29, "Margin", heading_xf)
1100
    sheet.write(0, 30, "Risky", heading_xf)
1101
    sheet.write(0, 31, "Proposed Sp", heading_xf)
1102
    sheet.write(0, 32, "Avg Sale", heading_xf)
1103
    sheet.write(0, 33, "Sales History", heading_xf)
12396 kshitij.so 1104
 
1105
    sheet_iterator = 1
12476 kshitij.so 1106
    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 1107
    for cantCompeteItem in cantCompeteItems:
1108
        amScraping =  cantCompeteItem[0]
1109
        item = cantCompeteItem[1]
1110
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1111
        if amScraping.warehouseLocation == 1:
1112
            sku = 'FBA'+str(amScraping.item_id)
1113
            loc = 'MUMBAI'
1114
        else:
1115
            sku = 'FBB'+str(amScraping.item_id)
1116
            loc = 'BANGLORE'
1117
        sheet.write(sheet_iterator, 1, sku)
12471 kshitij.so 1118
        sheet.write(sheet_iterator, 2, amScraping.asin)
12396 kshitij.so 1119
        sheet.write(sheet_iterator, 3, loc)
1120
        sheet.write(sheet_iterator, 4, item.brand)
1121
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1122
        sheet.write(sheet_iterator, 6, item.weight)
1123
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1124
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1125
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1126
        if amScraping.isPromotion:
1127
            sheet.write(sheet_iterator, 10, "Yes")
1128
        else:
12483 kshitij.so 1129
            sheet.write(sheet_iterator, 10, "No")
12432 kshitij.so 1130
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1131
        if amScraping.ourRank > 3:
1132
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1133
        else:
1134
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1135
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1136
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1137
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1138
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1139
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1140
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1141
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1142
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1143
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1144
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1145
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1146
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1147
        sheet.write(sheet_iterator, 25, amScraping.commission)
1148
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1149
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
12510 kshitij.so 1150
        sheet.write(sheet_iterator, 28, amScraping.vatRate)
1151
        sheet.write(sheet_iterator, 29, round(amScraping.promoPrice - amScraping.lowestPossibleSp))
1152
        sheet.write(sheet_iterator, 30, item.risky)
1153
        sheet.write(sheet_iterator, 31, amScraping.proposedSp)
1154
        sheet.write(sheet_iterator, 32, amScraping.avgSale)
1155
        sheet.write(sheet_iterator, 33, getOosString(saleMap.get(sku)))
12396 kshitij.so 1156
        sheet_iterator+=1
1157
 
1158
    sheet = wbk.add_sheet('Competitive')
1159
    xstr = lambda s: s or ""
1160
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1161
 
1162
    excel_integer_format = '0'
1163
    integer_style = xlwt.XFStyle()
1164
    integer_style.num_format_str = excel_integer_format
1165
 
1166
    sheet.write(0, 0, "Item Id", heading_xf)
1167
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1168
    sheet.write(0, 2, "Asin", heading_xf)
1169
    sheet.write(0, 3, "Location", heading_xf)
1170
    sheet.write(0, 4, "Brand", heading_xf)
1171
    sheet.write(0, 5, "Product Name", heading_xf)
1172
    sheet.write(0, 6, "Weight", heading_xf)
1173
    sheet.write(0, 7, "Courier Cost", heading_xf)
1174
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1175
    sheet.write(0, 9, "Promo Price", heading_xf)
1176
    sheet.write(0, 10, "Is Promotion", heading_xf)
1177
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1178
    sheet.write(0, 12, "Rank", heading_xf)
1179
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1180
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1181
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1182
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1183
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1184
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1185
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1186
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1187
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1188
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1189
    sheet.write(0, 23, "Other Cost", heading_xf)
1190
    sheet.write(0, 24, "WANLC", heading_xf)
1191
    sheet.write(0, 25, "Commission", heading_xf)
1192
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1193
    sheet.write(0, 27, "Return Provision", heading_xf)
12510 kshitij.so 1194
    sheet.write(0, 28, "Vat Rate", heading_xf)
1195
    sheet.write(0, 29, "Margin", heading_xf)
1196
    sheet.write(0, 30, "Risky", heading_xf)
1197
    sheet.write(0, 31, "Proposed Sp", heading_xf)
1198
    sheet.write(0, 32, "Avg Sale", heading_xf)
1199
    sheet.write(0, 33, "Sales History", heading_xf)
1200
    sheet.write(0, 34, "Decision", heading_xf)
1201
    sheet.write(0, 35, "Reason", heading_xf)
1202
    sheet.write(0, 36, "Updated Price", heading_xf)
12396 kshitij.so 1203
 
1204
    sheet_iterator = 1
12476 kshitij.so 1205
    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 1206
    for competitiveItem in competitiveItems:
1207
        amScraping =  competitiveItem[0]
1208
        item = competitiveItem[1]
1209
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1210
        if amScraping.warehouseLocation == 1:
1211
            sku = 'FBA'+str(amScraping.item_id)
1212
            loc = 'MUMBAI'
1213
        else:
1214
            sku = 'FBB'+str(amScraping.item_id)
1215
            loc = 'BANGLORE'
1216
        sheet.write(sheet_iterator, 1, sku)
12471 kshitij.so 1217
        sheet.write(sheet_iterator, 2, amScraping.asin)
12396 kshitij.so 1218
        sheet.write(sheet_iterator, 3, loc)
1219
        sheet.write(sheet_iterator, 4, item.brand)
1220
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1221
        sheet.write(sheet_iterator, 6, item.weight)
1222
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1223
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1224
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1225
        if amScraping.isPromotion:
1226
            sheet.write(sheet_iterator, 10, "Yes")
1227
        else:
12483 kshitij.so 1228
            sheet.write(sheet_iterator, 10, "No")
12432 kshitij.so 1229
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1230
        if amScraping.ourRank > 3:
1231
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1232
        else:
1233
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1234
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1235
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1236
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1237
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1238
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1239
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1240
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1241
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1242
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1243
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1244
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1245
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1246
        sheet.write(sheet_iterator, 25, amScraping.commission)
1247
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1248
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
12510 kshitij.so 1249
        sheet.write(sheet_iterator, 28, amScraping.vatRate)
1250
        sheet.write(sheet_iterator, 29, round(amScraping.promoPrice - amScraping.lowestPossibleSp))
1251
        sheet.write(sheet_iterator, 30, item.risky)
1252
        sheet.write(sheet_iterator, 31, amScraping.proposedSp)
1253
        sheet.write(sheet_iterator, 32, amScraping.avgSale)
1254
        sheet.write(sheet_iterator, 33, getOosString(saleMap.get(sku)))
12444 kshitij.so 1255
        if amScraping.decision is None:
12510 kshitij.so 1256
            sheet.write(sheet_iterator, 34, 'Auto Pricing Inactive')
12444 kshitij.so 1257
            sheet_iterator+=1
1258
            continue
12510 kshitij.so 1259
        sheet.write(sheet_iterator, 34, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1260
        sheet.write(sheet_iterator, 35, amScraping.reason)
12444 kshitij.so 1261
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12510 kshitij.so 1262
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.proposedSp))
12444 kshitij.so 1263
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12510 kshitij.so 1264
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.promoPrice+max(10,.01*amScraping.promoPrice)))
12396 kshitij.so 1265
        sheet_iterator+=1
1266
 
1267
    sheet = wbk.add_sheet('Almost Competitive')
1268
    xstr = lambda s: s or ""
1269
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1270
 
1271
    excel_integer_format = '0'
1272
    integer_style = xlwt.XFStyle()
1273
    integer_style.num_format_str = excel_integer_format
1274
 
1275
    sheet.write(0, 0, "Item Id", heading_xf)
1276
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1277
    sheet.write(0, 2, "Asin", heading_xf)
1278
    sheet.write(0, 3, "Location", heading_xf)
1279
    sheet.write(0, 4, "Brand", heading_xf)
1280
    sheet.write(0, 5, "Product Name", heading_xf)
1281
    sheet.write(0, 6, "Weight", heading_xf)
1282
    sheet.write(0, 7, "Courier Cost", heading_xf)
1283
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1284
    sheet.write(0, 9, "Promo Price", heading_xf)
1285
    sheet.write(0, 10, "Is Promotion", heading_xf)
1286
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1287
    sheet.write(0, 12, "Rank", heading_xf)
1288
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1289
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1290
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1291
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1292
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1293
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1294
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1295
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1296
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1297
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1298
    sheet.write(0, 23, "Other Cost", heading_xf)
1299
    sheet.write(0, 24, "WANLC", heading_xf)
1300
    sheet.write(0, 25, "Commission", heading_xf)
1301
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1302
    sheet.write(0, 27, "Return Provision", heading_xf)
12510 kshitij.so 1303
    sheet.write(0, 28, "Vat Rate", heading_xf)
1304
    sheet.write(0, 29, "Margin", heading_xf)
1305
    sheet.write(0, 30, "Risky", heading_xf)
1306
    sheet.write(0, 31, "Proposed Sp", heading_xf)
1307
    sheet.write(0, 32, "Avg Sale", heading_xf)
1308
    sheet.write(0, 33, "Sales History", heading_xf)
1309
    sheet.write(0, 34, "Decision", heading_xf)
1310
    sheet.write(0, 35, "Reason", heading_xf)
1311
    sheet.write(0, 36, "Updated Price", heading_xf)
12396 kshitij.so 1312
 
1313
    sheet_iterator = 1
12476 kshitij.so 1314
    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 1315
    for almostCompetitiveItem in almostCompetitiveItems:
1316
        amScraping =  almostCompetitiveItem[0]
1317
        item = almostCompetitiveItem[1]
1318
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1319
        if amScraping.warehouseLocation == 1:
1320
            sku = 'FBA'+str(amScraping.item_id)
1321
            loc = 'MUMBAI'
1322
        else:
1323
            sku = 'FBB'+str(amScraping.item_id)
1324
            loc = 'BANGLORE'
12432 kshitij.so 1325
        amScraping =  competitiveItem[0]
1326
        item = competitiveItem[1]
1327
        if amScraping.warehouseLocation == 1:
1328
            sku = 'FBA'+str(amScraping.item_id)
1329
            loc = 'MUMBAI'
1330
        else:
1331
            sku = 'FBB'+str(amScraping.item_id)
1332
            loc = 'BANGLORE'
12396 kshitij.so 1333
        sheet.write(sheet_iterator, 1, sku)
12471 kshitij.so 1334
        sheet.write(sheet_iterator, 2, amScraping.asin)
12396 kshitij.so 1335
        sheet.write(sheet_iterator, 3, loc)
1336
        sheet.write(sheet_iterator, 4, item.brand)
1337
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1338
        sheet.write(sheet_iterator, 6, item.weight)
1339
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1340
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1341
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1342
        if amScraping.isPromotion:
1343
            sheet.write(sheet_iterator, 10, "Yes")
1344
        else:
12483 kshitij.so 1345
            sheet.write(sheet_iterator, 10, "No")
12432 kshitij.so 1346
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1347
        if amScraping.ourRank > 3:
1348
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1349
        else:
1350
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1351
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1352
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1353
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1354
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1355
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1356
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1357
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1358
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1359
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1360
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1361
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1362
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1363
        sheet.write(sheet_iterator, 25, amScraping.commission)
1364
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1365
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
12510 kshitij.so 1366
        sheet.write(sheet_iterator, 28, amScraping.vatRate)
1367
        sheet.write(sheet_iterator, 29, round(amScraping.promoPrice - amScraping.lowestPossibleSp))
1368
        sheet.write(sheet_iterator, 30, item.risky)
1369
        sheet.write(sheet_iterator, 31, amScraping.proposedSp)
1370
        sheet.write(sheet_iterator, 32, amScraping.avgSale)
1371
        sheet.write(sheet_iterator, 33, getOosString(saleMap.get(sku)))
12444 kshitij.so 1372
        if amScraping.decision is None:
12510 kshitij.so 1373
            sheet.write(sheet_iterator, 34, 'Auto Pricing Inactive')
12444 kshitij.so 1374
            sheet_iterator+=1
1375
            continue
12510 kshitij.so 1376
        sheet.write(sheet_iterator, 34, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1377
        sheet.write(sheet_iterator, 35, amScraping.reason)
12444 kshitij.so 1378
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12510 kshitij.so 1379
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.proposedSp))
12444 kshitij.so 1380
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12510 kshitij.so 1381
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.promoPrice+max(10,.01*amScraping.promoPrice)))
12396 kshitij.so 1382
        sheet_iterator+=1
1383
 
1384
    sheet = wbk.add_sheet('Among Cheapest')
1385
    xstr = lambda s: s or ""
1386
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1387
 
1388
    excel_integer_format = '0'
1389
    integer_style = xlwt.XFStyle()
1390
    integer_style.num_format_str = excel_integer_format
1391
 
1392
    sheet.write(0, 0, "Item Id", heading_xf)
1393
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1394
    sheet.write(0, 2, "Asin", heading_xf)
1395
    sheet.write(0, 3, "Location", heading_xf)
1396
    sheet.write(0, 4, "Brand", heading_xf)
1397
    sheet.write(0, 5, "Product Name", heading_xf)
1398
    sheet.write(0, 6, "Weight", heading_xf)
1399
    sheet.write(0, 7, "Courier Cost", heading_xf)
1400
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1401
    sheet.write(0, 9, "Promo Price", heading_xf)
1402
    sheet.write(0, 10, "Is Promotion", heading_xf)
1403
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1404
    sheet.write(0, 12, "Rank", heading_xf)
1405
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1406
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1407
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1408
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1409
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1410
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1411
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1412
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1413
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1414
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1415
    sheet.write(0, 23, "Other Cost", heading_xf)
1416
    sheet.write(0, 24, "WANLC", heading_xf)
1417
    sheet.write(0, 25, "Commission", heading_xf)
1418
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1419
    sheet.write(0, 27, "Return Provision", heading_xf)
12510 kshitij.so 1420
    sheet.write(0, 28, "Vat Rate", heading_xf)
1421
    sheet.write(0, 29, "Margin", heading_xf)
1422
    sheet.write(0, 30, "Risky", heading_xf)
1423
    sheet.write(0, 31, "Proposed Sp", heading_xf)
1424
    sheet.write(0, 32, "Avg Sale", heading_xf)
1425
    sheet.write(0, 33, "Sales History", heading_xf)
1426
    sheet.write(0, 34, "Decision", heading_xf)
1427
    sheet.write(0, 35, "Reason", heading_xf)
1428
    sheet.write(0, 36, "Updated Price", heading_xf)
12396 kshitij.so 1429
 
1430
    sheet_iterator = 1
12476 kshitij.so 1431
    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 1432
    for amongCheapestItem in amongCheapestItems:
1433
        amScraping =  amongCheapestItem[0]
1434
        item = amongCheapestItem[1]
1435
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1436
        if amScraping.warehouseLocation == 1:
1437
            sku = 'FBA'+str(amScraping.item_id)
1438
            loc = 'MUMBAI'
1439
        else:
1440
            sku = 'FBB'+str(amScraping.item_id)
1441
            loc = 'BANGLORE'
1442
        sheet.write(sheet_iterator, 1, sku)
12471 kshitij.so 1443
        sheet.write(sheet_iterator, 2, amScraping.asin)
12396 kshitij.so 1444
        sheet.write(sheet_iterator, 3, loc)
1445
        sheet.write(sheet_iterator, 4, item.brand)
1446
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1447
        sheet.write(sheet_iterator, 6, item.weight)
1448
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1449
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1450
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1451
        if amScraping.isPromotion:
1452
            sheet.write(sheet_iterator, 10, "Yes")
1453
        else:
12483 kshitij.so 1454
            sheet.write(sheet_iterator, 10, "No")
12432 kshitij.so 1455
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1456
        if amScraping.ourRank > 3:
1457
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1458
        else:
1459
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1460
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1461
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1462
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1463
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1464
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1465
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1466
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1467
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1468
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1469
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1470
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1471
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1472
        sheet.write(sheet_iterator, 25, amScraping.commission)
1473
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1474
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
12510 kshitij.so 1475
        sheet.write(sheet_iterator, 28, amScraping.vatRate)
1476
        sheet.write(sheet_iterator, 29, round(amScraping.promoPrice - amScraping.lowestPossibleSp))
1477
        sheet.write(sheet_iterator, 30, item.risky)
1478
        sheet.write(sheet_iterator, 31, amScraping.proposedSp)
1479
        sheet.write(sheet_iterator, 32, amScraping.avgSale)
1480
        sheet.write(sheet_iterator, 33, getOosString(saleMap.get(sku)))
12444 kshitij.so 1481
        if amScraping.decision is None:
12510 kshitij.so 1482
            sheet.write(sheet_iterator, 34, 'Auto Pricing Inactive')
12444 kshitij.so 1483
            sheet_iterator+=1
1484
            continue
12510 kshitij.so 1485
        sheet.write(sheet_iterator, 34, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1486
        sheet.write(sheet_iterator, 35, amScraping.reason)
12444 kshitij.so 1487
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12510 kshitij.so 1488
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.proposedSp))
12444 kshitij.so 1489
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12510 kshitij.so 1490
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.promoPrice+max(10,.01*amScraping.promoPrice)))
12396 kshitij.so 1491
        sheet_iterator+=1
1492
 
1493
    sheet = wbk.add_sheet('Cheapest')
1494
    xstr = lambda s: s or ""
1495
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1496
 
1497
    excel_integer_format = '0'
1498
    integer_style = xlwt.XFStyle()
1499
    integer_style.num_format_str = excel_integer_format
1500
 
1501
    sheet.write(0, 0, "Item Id", heading_xf)
1502
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1503
    sheet.write(0, 2, "Asin", heading_xf)
1504
    sheet.write(0, 3, "Location", heading_xf)
1505
    sheet.write(0, 4, "Brand", heading_xf)
1506
    sheet.write(0, 5, "Product Name", heading_xf)
1507
    sheet.write(0, 6, "Weight", heading_xf)
1508
    sheet.write(0, 7, "Courier Cost", heading_xf)
1509
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1510
    sheet.write(0, 9, "Promo Price", heading_xf)
1511
    sheet.write(0, 10, "Is Promotion", heading_xf)
1512
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1513
    sheet.write(0, 12, "Rank", heading_xf)
1514
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1515
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1516
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1517
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1518
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1519
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1520
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1521
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1522
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1523
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1524
    sheet.write(0, 23, "Other Cost", heading_xf)
1525
    sheet.write(0, 24, "WANLC", heading_xf)
1526
    sheet.write(0, 25, "Commission", heading_xf)
1527
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1528
    sheet.write(0, 27, "Return Provision", heading_xf)
12510 kshitij.so 1529
    sheet.write(0, 28, "Vat Rate", heading_xf)
1530
    sheet.write(0, 29, "Margin", heading_xf)
1531
    sheet.write(0, 30, "Risky", heading_xf)
1532
    sheet.write(0, 31, "Proposed Sp", heading_xf)
1533
    sheet.write(0, 32, "Avg Sale", heading_xf)
1534
    sheet.write(0, 33, "Sales History", heading_xf)
1535
    sheet.write(0, 34, "Decision", heading_xf)
1536
    sheet.write(0, 35, "Reason", heading_xf)
1537
    sheet.write(0, 36, "Updated Price", heading_xf)
12396 kshitij.so 1538
 
1539
    sheet_iterator = 1
12476 kshitij.so 1540
    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 1541
    for cheapestItem in cheapestItems:
1542
        amScraping =  cheapestItem[0]
1543
        item = cheapestItem[1]
1544
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1545
        if amScraping.warehouseLocation == 1:
1546
            sku = 'FBA'+str(amScraping.item_id)
1547
            loc = 'MUMBAI'
1548
        else:
1549
            sku = 'FBB'+str(amScraping.item_id)
1550
            loc = 'BANGLORE'
1551
        sheet.write(sheet_iterator, 1, sku)
12471 kshitij.so 1552
        sheet.write(sheet_iterator, 2, amScraping.asin)
12396 kshitij.so 1553
        sheet.write(sheet_iterator, 3, loc)
1554
        sheet.write(sheet_iterator, 4, item.brand)
1555
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1556
        sheet.write(sheet_iterator, 6, item.weight)
1557
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1558
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1559
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1560
        if amScraping.isPromotion:
1561
            sheet.write(sheet_iterator, 10, "Yes")
1562
        else:
12483 kshitij.so 1563
            sheet.write(sheet_iterator, 10, "No")
12432 kshitij.so 1564
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1565
        if amScraping.ourRank > 3:
1566
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1567
        else:
1568
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1569
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1570
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1571
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1572
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1573
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1574
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1575
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1576
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1577
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1578
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1579
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1580
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1581
        sheet.write(sheet_iterator, 25, amScraping.commission)
1582
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
12510 kshitij.so 1583
        sheet.write(sheet_iterator, 27, amScraping.vatRate)
1584
        sheet.write(sheet_iterator, 28, amScraping.returnProvision)
1585
        sheet.write(sheet_iterator, 29, round(amScraping.promoPrice - amScraping.lowestPossibleSp))
1586
        sheet.write(sheet_iterator, 30, item.risky)
1587
        sheet.write(sheet_iterator, 31, amScraping.proposedSp)
1588
        sheet.write(sheet_iterator, 32, amScraping.avgSale)
1589
        sheet.write(sheet_iterator, 33, getOosString(saleMap.get(sku)))
12444 kshitij.so 1590
        if amScraping.decision is None:
12510 kshitij.so 1591
            sheet.write(sheet_iterator, 34, 'Auto Pricing Inactive')
12444 kshitij.so 1592
            sheet_iterator+=1
1593
            continue
12510 kshitij.so 1594
        sheet.write(sheet_iterator, 34, Decision._VALUES_TO_NAMES.get(amScraping.decision))
1595
        sheet.write(sheet_iterator, 35, amScraping.reason)
12444 kshitij.so 1596
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_DECREMENT_SUCCESS":
12510 kshitij.so 1597
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.proposedSp))
12444 kshitij.so 1598
        if Decision._VALUES_TO_NAMES.get(amScraping.decision) == "AUTO_INCREMENT_SUCCESS":
12510 kshitij.so 1599
            sheet.write(sheet_iterator, 36, math.ceil(amScraping.promoPrice+max(10,.01*amScraping.promoPrice)))
12396 kshitij.so 1600
        sheet_iterator+=1
1601
 
1602
    sheet = wbk.add_sheet('Negative Margin')
1603
    xstr = lambda s: s or ""
1604
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1605
 
1606
    excel_integer_format = '0'
1607
    integer_style = xlwt.XFStyle()
1608
    integer_style.num_format_str = excel_integer_format
1609
 
1610
    sheet.write(0, 0, "Item Id", heading_xf)
1611
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1612
    sheet.write(0, 2, "Asin", heading_xf)
1613
    sheet.write(0, 3, "Location", heading_xf)
1614
    sheet.write(0, 4, "Brand", heading_xf)
1615
    sheet.write(0, 5, "Product Name", heading_xf)
1616
    sheet.write(0, 6, "Weight", heading_xf)
1617
    sheet.write(0, 7, "Courier Cost", heading_xf)
1618
    sheet.write(0, 8, "Our SP", heading_xf)
12432 kshitij.so 1619
    sheet.write(0, 9, "Promo Price", heading_xf)
1620
    sheet.write(0, 10, "Is Promotion", heading_xf)
1621
    sheet.write(0, 11, "Lowest Possible SP", heading_xf)
12396 kshitij.so 1622
    sheet.write(0, 12, "Rank", heading_xf)
1623
    sheet.write(0, 13, "Our Inventory", heading_xf)
12432 kshitij.so 1624
    sheet.write(0, 14, "Lowest Seller SP", heading_xf)
1625
    sheet.write(0, 15, "Lowest Seller Rating", heading_xf)
1626
    sheet.write(0, 16, "Lowest Seller Shipping Time", heading_xf)
12396 kshitij.so 1627
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
12432 kshitij.so 1628
    sheet.write(0, 18, "Second Lowest Seller Rating", heading_xf)
1629
    sheet.write(0, 19, "Second Lowest Seller Shipping Time", heading_xf)
1630
    sheet.write(0, 20, "Third Lowest Seller SP", heading_xf)
1631
    sheet.write(0, 21, "Third Lowest Seller Rating", heading_xf)
1632
    sheet.write(0, 22, "Third Lowest Seller Shipping Time", heading_xf)
12447 kshitij.so 1633
    sheet.write(0, 23, "Other Cost", heading_xf)
1634
    sheet.write(0, 24, "WANLC", heading_xf)
1635
    sheet.write(0, 25, "Commission", heading_xf)
1636
    sheet.write(0, 26, "Competitor Commission", heading_xf)
1637
    sheet.write(0, 27, "Return Provision", heading_xf)
12510 kshitij.so 1638
    sheet.write(0, 28, "Vat Rate", heading_xf)
1639
    sheet.write(0, 29, "Margin", heading_xf)
1640
    sheet.write(0, 30, "Avg Sale", heading_xf)
1641
    sheet.write(0, 31, "Sales History", heading_xf)
12396 kshitij.so 1642
 
1643
    sheet_iterator = 1
12476 kshitij.so 1644
    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 1645
    for amongCheapestItem in amongCheapestItems:
1646
        amScraping =  amongCheapestItem[0]
1647
        item = amongCheapestItem[1]
1648
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1649
        if amScraping.warehouseLocation == 1:
1650
            sku = 'FBA'+str(amScraping.item_id)
1651
            loc = 'MUMBAI'
1652
        else:
1653
            sku = 'FBB'+str(amScraping.item_id)
1654
            loc = 'BANGLORE'
1655
        sheet.write(sheet_iterator, 1, sku)
12471 kshitij.so 1656
        sheet.write(sheet_iterator, 2, amScraping.asin)
12396 kshitij.so 1657
        sheet.write(sheet_iterator, 3, loc)
1658
        sheet.write(sheet_iterator, 4, item.brand)
1659
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1660
        sheet.write(sheet_iterator, 6, item.weight)
1661
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1662
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
12432 kshitij.so 1663
        sheet.write(sheet_iterator, 9, amScraping.promoPrice)
1664
        if amScraping.isPromotion:
1665
            sheet.write(sheet_iterator, 10, "Yes")
1666
        else:
12483 kshitij.so 1667
            sheet.write(sheet_iterator, 10, "No")
12432 kshitij.so 1668
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleSp)
12396 kshitij.so 1669
        if amScraping.ourRank > 3:
1670
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1671
        else:
1672
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1673
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
12432 kshitij.so 1674
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerSp)
1675
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerRating)
1676
        sheet.write(sheet_iterator, 16, amScraping.lowestSellerShippingTime)
12396 kshitij.so 1677
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
12432 kshitij.so 1678
        sheet.write(sheet_iterator, 18, amScraping.secondLowestSellerRating)
1679
        sheet.write(sheet_iterator, 19, amScraping.secondLowestSellerShippingTime)
1680
        sheet.write(sheet_iterator, 20, amScraping.thirdLowestSellerSp)
1681
        sheet.write(sheet_iterator, 21, amScraping.thirdLowestSellerRating)
1682
        sheet.write(sheet_iterator, 22, amScraping.thirdLowestSellerShippingTime)
12447 kshitij.so 1683
        sheet.write(sheet_iterator, 23, amScraping.otherCost)
1684
        sheet.write(sheet_iterator, 24, amScraping.wanlc)
1685
        sheet.write(sheet_iterator, 25, amScraping.commission)
1686
        sheet.write(sheet_iterator, 26, amScraping.competitorCommission)
1687
        sheet.write(sheet_iterator, 27, amScraping.returnProvision)
12510 kshitij.so 1688
        sheet.write(sheet_iterator, 28, amScraping.vatRate)
1689
        sheet.write(sheet_iterator, 29, round(amScraping.promoPrice - amScraping.lowestPossibleSp))
1690
        sheet.write(sheet_iterator, 30, amScraping.avgSale)
1691
        sheet.write(sheet_iterator, 31, getOosString(saleMap.get(sku)))
12396 kshitij.so 1692
        sheet_iterator+=1
1693
 
1694
    sheet = wbk.add_sheet('Exception List')
1695
    xstr = lambda s: s or ""
1696
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1697
 
1698
    excel_integer_format = '0'
1699
    integer_style = xlwt.XFStyle()
1700
    integer_style.num_format_str = excel_integer_format
1701
 
1702
    sheet.write(0, 0, "Item Id", heading_xf)
1703
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1704
    sheet.write(0, 2, "Asin", heading_xf)
1705
    sheet.write(0, 3, "Location", heading_xf)
1706
    sheet.write(0, 4, "Brand", heading_xf)
1707
    sheet.write(0, 5, "Product Name", heading_xf)
1708
    sheet.write(0, 6, "Reason", heading_xf)
1709
 
1710
    sheet_iterator = 1
12476 kshitij.so 1711
    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 1712
    for amongCheapestItem in amongCheapestItems:
1713
        amScraping =  amongCheapestItem[0]
1714
        item = amongCheapestItem[1]
1715
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1716
        if amScraping.warehouseLocation == 1:
1717
            sku = 'FBA'+str(amScraping.item_id)
1718
            loc = 'MUMBAI'
1719
        else:
1720
            sku = 'FBB'+str(amScraping.item_id)
1721
            loc = 'BANGLORE'
1722
        sheet.write(sheet_iterator, 1, sku)
12471 kshitij.so 1723
        sheet.write(sheet_iterator, 2, amScraping.asin)
12396 kshitij.so 1724
        sheet.write(sheet_iterator, 3, loc)
1725
        sheet.write(sheet_iterator, 4, item.brand)
1726
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1727
        sheet.write(sheet_iterator, 6, amScraping.reason)
1728
        sheet_iterator+=1      
1729
 
12444 kshitij.so 1730
 
1731
    if (runType=='FULL'):    
1732
        sheet = wbk.add_sheet('Auto Favorites')
1733
 
1734
        heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1735
 
1736
        excel_integer_format = '0'
1737
        integer_style = xlwt.XFStyle()
1738
        integer_style.num_format_str = excel_integer_format
1739
        xstr = lambda s: s or ""
1740
 
1741
        sheet.write(0, 0, "Item ID", heading_xf)
1742
        sheet.write(0, 1, "Brand", heading_xf)
1743
        sheet.write(0, 2, "Product Name", heading_xf)
1744
        sheet.write(0, 3, "Auto Favourite", heading_xf)
1745
        sheet.write(0, 4, "Reason", heading_xf)
1746
 
1747
        sheet_iterator=1
1748
        for autoFav in nowAutoFav:
1749
            itemId = autoFav[0]
1750
            reason = autoFav[1]
1751
            it = Item.query.filter_by(id=itemId).one()
1752
            sheet.write(sheet_iterator, 0, itemId)
1753
            sheet.write(sheet_iterator, 1, it.brand)
1754
            sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
1755
            sheet.write(sheet_iterator, 3, "True")
1756
            sheet.write(sheet_iterator, 4, reason)
1757
            sheet_iterator+=1
1758
        for prevFav in previousAutoFav:
1759
            it = Item.query.filter_by(id=prevFav).one()
1760
            sheet.write(sheet_iterator, 0, prevFav)
1761
            sheet.write(sheet_iterator, 1, it.brand)
1762
            sheet.write(sheet_iterator, 2, xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color))
1763
            sheet.write(sheet_iterator, 3, "False")
1764
            sheet_iterator+=1
1765
 
12478 kshitij.so 1766
    filename = "/tmp/amazon-report-"+runType+" " + str(timestamp) + ".xls"
12396 kshitij.so 1767
    wbk.save(filename)
12489 kshitij.so 1768
    try:
12503 kshitij.so 1769
        #EmailAttachmentSender.mail("build@shop2020.in", "cafe@nes", ["kshitij.sood@saholic.com"], " Amazon Auto Pricing "+runType+" " + str(timestamp), "", [get_attachment_part(filename)], [""], [])
1770
        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 1771
    except Exception as e:
1772
        print e
1773
        print "Unable to send report.Trying with local SMTP"
1774
        smtpServer = smtplib.SMTP('localhost')
1775
        smtpServer.set_debuglevel(1)
1776
        sender = 'build@shop2020.in'
1777
        recipients = ["kshitij.sood@saholic.com"]
1778
        msg = MIMEMultipart()
1779
        msg['Subject'] = "Amazon Auto Pricing" + ' '+runType+' - ' + str(datetime.now())
1780
        msg['From'] = sender
1781
        #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']
1782
        msg['To'] = ",".join(recipients)
1783
        fileMsg = email.mime.base.MIMEBase('application','vnd.ms-excel')
1784
        fileMsg.set_payload(file(filename).read())
1785
        email.encoders.encode_base64(fileMsg)
1786
        fileMsg.add_header('Content-Disposition','attachment;filename=amazon-auto-pricing.xls')
1787
        msg.attach(fileMsg)
1788
        try:
1789
            smtpServer.sendmail(sender, recipients, msg.as_string())
1790
            print "Successfully sent email"
1791
        except:
1792
            print "Error: unable to send email."
1793
 
1794
def getNewVatRate(item_id,state,price):
1795
    itemVatMaster = ItemVatMaster.query.filter(and_(ItemVatMaster.itemId==item_id, ItemVatMaster.stateId==state)).first()
1796
    if itemVatMaster is None:
1797
        d_item = Item.query.filter_by(id=item_id).first()
1798
        if d_item is None:
1799
            raise 
1800
        else:
1801
            vatMaster = CategoryVatMaster.query.filter(and_(CategoryVatMaster.categoryId==d_item.category, CategoryVatMaster.minVal<=price,  CategoryVatMaster.maxVal>=price,  CategoryVatMaster.stateId == state)).first()
1802
        if vatMaster is None:
1803
            raise
1804
        else:
1805
            vatRate = vatMaster.vatPercent
1806
    else:
1807
        vatRate = itemVatMaster.vatPercentage
1808
    return vatRate
1809
 
1810
def sendAutoPricingMail(successfulAutoDecrease,successfulAutoIncrease):
1811
    if len(successfulAutoDecrease)==0 and len(successfulAutoIncrease)==0 :
12494 kshitij.so 1812
        print "returning"
12489 kshitij.so 1813
        return
1814
    xstr = lambda s: s or ""
1815
    message="""<html>
12502 kshitij.so 1816
            <h3 style="color:red;">Test Run.Please validate with costing sheet before taking any decision</h3>
12489 kshitij.so 1817
            <body>
1818
            <h3>Auto Decrease Items</h3>
1819
            <table border="1" style="width:100%;">
1820
            <thead>
1821
            <tr><th>Item Id</th>
1822
            <th>Amazon SKU</th>
1823
            <th>Product Name</th>
1824
            <th>Old Price</th>
1825
            <th>New Price</th>
1826
            <th>Subsidy</th>
1827
            <th>Old Margin</th>
1828
            <th>New Margin</th>
1829
            <th>Commission %</th>
1830
            <th>Return Provision %</th>
1831
            <th>Inventory</th>
1832
            <th>Sales History</th>
1833
            <th>Category</th>
1834
            </tr></thead>
1835
            <tbody>"""
1836
    for item in successfulAutoDecrease:
1837
        it = Item.query.filter_by(id=item.item_id).one()
1838
        vatRate = getNewVatRate(item.item_id,item.warehouseLocation,item.proposedSp)
1839
        oldMargin = item.ourSellingPrice - item.lowestPossibleSp
1840
        newMargin = round(item.proposedSp - getNewLowestPossibleSp(item,12.36,vatRate))
1841
        sku = ''
1842
        if item.warehouseLocation==1:
1843
            sku='FBA'+str(item.item_id)
1844
        else:
1845
            sku='FBB'+str(item.item_id)  
1846
        if amazonLongTermActivePromotions.has_key(sku):
1847
            subsidy = (amazonLongTermActivePromotions.get(sku)).subsidy
1848
        elif amazonShortTermActivePromotions.has_key(sku):
1849
            subsidy = (amazonShortTermActivePromotions.get(sku)).subsidy
1850
        else:
1851
            subsidy = 0
1852
        message+="""<tr>
1853
                <td style="text-align:center">"""+str(item.item_id)+"""</td>
1854
                <td style="text-align:center">"""+sku+"""</td>
1855
                <td style="text-align:center">"""+xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color)+"""</td>
1856
                <td style="text-align:center">"""+str(item.ourSellingPrice)+"""</td>
1857
                <td style="text-align:center">"""+str(math.ceil(item.proposedSp))+"""</td>
1858
                <td style="text-align:center">"""+str(round(subsidy))+"""</td>
1859
                <td style="text-align:center">"""+str(round(oldMargin))+" ("+str(round((oldMargin/item.ourSellingPrice)*100,1))+"%)"+"""</td>
12501 kshitij.so 1860
                <td style="text-align:center">"""+str(newMargin)+" ("+str(round((newMargin/item.proposedSp)*100,1))+"%)"+"""</td>
12489 kshitij.so 1861
                <td style="text-align:center">"""+str(item.commission)+" %"+"""</td>
1862
                <td style="text-align:center">"""+str(item.returnProvision)+" %"+"""</td>
1863
                <td style="text-align:center">"""+str(item.ourInventory)+"""</td>
1864
                <td style="text-align:center">"""+getOosString(saleMap.get(sku))+"""</td>
1865
                <td style="text-align:center">"""+str(CompetitionCategory._VALUES_TO_NAMES.get(item.competitiveCategory))+"""</td>
1866
                </tr>"""
1867
    message+="""</tbody></table><h3>Auto Increase Items</h3><table border="1" style="width:100%;">
1868
            <thead>
1869
            <tr><th>Item Id</th>
1870
            <th>Amazon SKU</th>
1871
            <th>Product Name</th>
1872
            <th>Old Price</th>
1873
            <th>New Price</th>
1874
            <th>Subsidy</th>
1875
            <th>Old Margin</th>
1876
            <th>New Margin</th>
1877
            <th>Commission %</th>
1878
            <th>Return Provision %</th>
1879
            <th>Inventory</th>
1880
            <th>Sales History</th>
1881
            <th>Category</th>
1882
            </tr></thead>
1883
            <tbody>"""
1884
    for item in successfulAutoIncrease:
1885
        it = Item.query.filter_by(id=item.item_id).one()
1886
        vatRate = getNewVatRate(item.item_id,item.warehouseLocation,math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))
1887
        oldMargin = item.ourSellingPrice - item.lowestPossibleSp
1888
        newMargin = round(math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)) - getNewLowestPossibleSp(item,12.36,vatRate))
1889
        sku = ''
1890
        if item.warehouseLocation==1:
1891
            sku='FBA'+str(item.item_id)
1892
        else:
1893
            sku='FBB'+str(item.item_id)  
1894
        if amazonLongTermActivePromotions.has_key(sku):
1895
            subsidy = (amazonLongTermActivePromotions.get(sku)).subsidy
1896
        elif amazonShortTermActivePromotions.has_key(sku):
1897
            subsidy = (amazonShortTermActivePromotions.get(sku)).subsidy
1898
        else:
1899
            subsidy = 0
1900
        message+="""<tr>
1901
                <td style="text-align:center">"""+str(item.item_id)+"""</td>
1902
                <td style="text-align:center">"""+sku+"""</td>
1903
                <td style="text-align:center">"""+xstr(it.brand)+" "+xstr(it.model_name)+" "+xstr(it.model_number)+" "+xstr(it.color)+"""</td>
1904
                <td style="text-align:center">"""+str(item.ourSellingPrice)+"""</td>
1905
                <td style="text-align:center">"""+str(math.ceil(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))+"""</td>
1906
                <td style="text-align:center">"""+str(round(subsidy))+"""</td>
1907
                <td style="text-align:center">"""+str(round((oldMargin),1))+" ("+str(round((oldMargin/item.ourSellingPrice)*100,1))+"%)"+"""</td>
1908
                <td style="text-align:center">"""+str(newMargin)+" ("+str(round((newMargin/(item.ourSellingPrice+max(10,.01*item.ourSellingPrice)))*100,1))+"%)"+"""</td>
1909
                <td style="text-align:center">"""+str(item.commission)+" %"+"""</td>
1910
                <td style="text-align:center">"""+str(item.returnProvision)+" %"+"""</td>
1911
                <td style="text-align:center">"""+str(item.ourInventory)+"""</td>
1912
                <td style="text-align:center">"""+getOosString(saleMap.get(sku))+"""</td>
1913
                <td style="text-align:center">"""+str(CompetitionCategory._VALUES_TO_NAMES.get(item.competitiveCategory))+"""</td>
1914
                </tr>"""
1915
    message+="""</tbody></table></body></html>"""
1916
    print message
1917
    mailServer = smtplib.SMTP("smtp.gmail.com", 587)
1918
    mailServer.ehlo()
1919
    mailServer.starttls()
1920
    mailServer.ehlo()
1921
 
12503 kshitij.so 1922
    #recipients = ['kshitij.sood@saholic.com']
1923
    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 1924
    msg = MIMEMultipart()
1925
    msg['Subject'] = "Amazon Auto Pricing" + ' - ' + str(datetime.now())
1926
    msg['From'] = ""
1927
    msg['To'] = ",".join(recipients)
1928
    msg.preamble = "Amazon Auto Pricing" + ' - ' + str(datetime.now())
1929
    html_msg = MIMEText(message, 'html')
1930
    msg.attach(html_msg)
1931
    try:
1932
        mailServer.login("build@shop2020.in", "cafe@nes")
1933
        #mailServer.sendmail("cafe@nes", ['kshitij.sood@saholic.com'], msg.as_string())
1934
        mailServer.sendmail("cafe@nes", recipients, msg.as_string())
1935
    except Exception as e:
1936
        print e
1937
        print "Unable to send pricing mail.Lets try with local SMTP."
1938
        smtpServer = smtplib.SMTP('localhost')
1939
        smtpServer.set_debuglevel(1)
1940
        sender = 'build@shop2020.in'
1941
        try:
1942
            smtpServer.sendmail(sender, recipients, msg.as_string())
1943
            print "Successfully sent email"
1944
        except:
1945
            print "Error: unable to send email."
1946
 
12396 kshitij.so 1947
 
12363 kshitij.so 1948
def main():
1949
    parser = optparse.OptionParser()
1950
    parser.add_option("-t", "--type", dest="runType",
1951
                   default="FULL", type="string",
1952
                   help="Run type FULL or FAVOURITE")
1953
    (options, args) = parser.parse_args()
1954
    if options.runType not in ('FULL','FAVOURITE'):
1955
        print "Run type argument illegal."
1956
        sys.exit(1)
1957
    time.sleep(5)
1958
    timestamp = datetime.now()
1959
    fetchFbaSale()
1960
    itemInfo = populateStuff(timestamp,options.runType)
1961
    itemsToPopulate = 0
12430 kshitij.so 1962
    toSync = 0
1963
    lenItems = len(itemInfo)
1964
    while(toSync < lenItems):
1965
        oldSync = toSync
1966
        if lenItems >= 20:
1967
            toSync = 20
1968
        else:
1969
            toSync = lenItems - oldSync
1970
        getPriceAndAsin(itemInfo[oldSync:toSync+oldSync])
1971
        toSync = oldSync + toSync
1972
 
12363 kshitij.so 1973
    while (len(itemInfo)>0):
12430 kshitij.so 1974
        if len(itemInfo) >= 20:
1975
            itemsToPopulate = 20
12363 kshitij.so 1976
        else:
1977
            itemsToPopulate = len(itemInfo)
12456 kshitij.so 1978
        print "items to popluate"
12370 kshitij.so 1979
        print itemsToPopulate
12363 kshitij.so 1980
        exceptionList, negativeMargin, cheapest, amongCheapestAndCanCompete, canCompete, almostCompete, cantCompete = decideCategory(itemInfo[0:itemsToPopulate])
1981
        itemInfo[0:itemsToPopulate] = []
1982
        commitExceptionList(exceptionList,timestamp,options.runType)
1983
        commitNegativeMargin(negativeMargin,timestamp,options.runType)
1984
        commitCheapest(cheapest,timestamp,options.runType)
1985
        commitAmongCheapestAndCanCompete(amongCheapestAndCanCompete,timestamp,options.runType)
1986
        commitCanCompete(canCompete,timestamp,options.runType)
1987
        commitAlmostCompete(almostCompete,timestamp,options.runType)
1988
        commitCantCompete(cantCompete, timestamp,options.runType)
12396 kshitij.so 1989
        exceptionList[:], negativeMargin[:], cheapest[:], amongCheapestAndCanCompete[:], canCompete[:], almostCompete[:], cantCompete[:] =[],[],[],[],[],[],[]
1990
    autoDecreaseItems = fetchItemsForAutoDecrease(timestamp)
1991
    autoIncreaseItems = fetchItemsForAutoIncrease(timestamp)
1992
    previousAutoFav, nowAutoFav = markAutoFavourites(timestamp)
12444 kshitij.so 1993
    writeReport(timestamp,autoDecreaseItems,autoIncreaseItems,previousAutoFav,nowAutoFav,options.runType)
12494 kshitij.so 1994
    print "send auto pricing email"
12491 kshitij.so 1995
    sendAutoPricingMail(autoDecreaseItems,autoIncreaseItems)
12363 kshitij.so 1996
if __name__=='__main__':
1997
    main()