Subversion Repositories SmartDukaan

Rev

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