Subversion Repositories SmartDukaan

Rev

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