Subversion Repositories SmartDukaan

Rev

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

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