Subversion Repositories SmartDukaan

Rev

Rev 12408 | Rev 12414 | 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 *
12369 kshitij.so 2
from sqlalchemy.sql import or_ ,func, asc, desc
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, \
6
Category, SourcePercentageMaster,SourceCategoryPercentage, SourceItemPercentage, AmazonPromotion, AmazonScrapingHistory
12363 kshitij.so 7
from shop2020.thriftpy.model.v1.order.ttypes import OrderSource
12364 kshitij.so 8
from shop2020.thriftpy.model.v1.catalog.ttypes import CompetitionCategory, SalesPotential,\
12363 kshitij.so 9
Decision, RunType, AmazonPromotionType
10
from shop2020.model.v1.catalog.script import SellerCentralInventoryReport, AmazonAsyncScraper
11
from shop2020.clients.CatalogClient import CatalogClient
12
from shop2020.clients.InventoryClient import InventoryClient
13
from shop2020.clients.TransactionClient import TransactionClient
14
import urllib2
15
import time 
16
from datetime import date, datetime, timedelta
17
from shop2020.utils import EmailAttachmentSender
18
from shop2020.utils.EmailAttachmentSender import get_attachment_part
19
import math
20
import simplejson as json
21
import xlwt
22
import optparse
23
import sys
24
import smtplib
25
from email.mime.text import MIMEText
26
import email
27
from email.mime.multipart import MIMEMultipart
28
import email.encoders
29
import mechanize
30
import cookielib
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={}
38
amazonLongTermActivePromotions = []
12396 kshitij.so 39
amazonShortTermActivePromotions = []
12363 kshitij.so 40
saleMap = {}
41
DataService.initialize(db_hostname=host)
42
 
43
amScraper = AmazonAsyncScraper.AmazonAsyncScraper()
44
 
45
class __AmazonAsinPrice:
46
    def __init__(self, asin, price):
47
        self.asin = asin
48
        self.price = price
49
 
50
class __AmazonItemInfo:
51
 
52
    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):
12382 kshitij.so 53
        self.asin = asin
12363 kshitij.so 54
        self.nlc = nlc
55
        self.courierCost = courierCost
56
        self.sku = sku
57
        self.product_group = product_group
58
        self.brand = brand
59
        self.model_name = model_name
60
        self.model_number = model_number
61
        self.color = color
62
        self.weight = weight
63
        self.parent_category = parent_category
64
        self.risky = risky
65
        self.vatRate = vatRate
66
        self.runType = runType
67
        self.parent_category_name = parent_category_name
68
        self.sourcePercentage = sourcePercentage
69
        self.ourInventory = ourInventory
70
        self.state_id = state_id
71
 
72
class __AmazonDetails:
73
    def __init__(self, sku, ourSp, ourRank, lowestSellerName,lowestSellerSp,secondLowestSellerName, secondLowestSellerSp, thirdLowestSellerName, thirdLowestSellerSp, totalSeller, multipleListings):
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
84
        self.multipleListings = multipleListings 
85
 
86
class __AmazonPricing:
87
 
88
    def __init__(self, ourSp, ourTp, lowestPossibleTp, lowestPossibleSp):
89
        self.ourTp = ourTp
90
        self.lowestPossibleTp = lowestPossibleTp
91
        self.ourSp = ourSp
92
        self.lowestPossibleSp = lowestPossibleSp
93
 
94
 
12396 kshitij.so 95
def fetchItemsForAutoDecrease(time):
96
    successfulAutoDecrease = []
97
    autoDecrementItems = session.query(AmazonScrapingHistory).join((Amazonlisted,AmazonScrapingHistory.item_id==Amazonlisted.itemId))\
98
    .filter(AmazonScrapingHistory.timestamp==time).filter(or_(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE,AmazonScrapingHistory.competitiveCategory==CompetitionCategory.COMPETITIVE, AmazonScrapingHistory.competitiveCategory==CompetitionCategory.ALMOST_COMPETE ))\
99
    .filter(Amazonlisted.autoDecrement==True).all()
100
    for autoDecrementItem in autoDecrementItems:
101
        if autoDecrementItem.warehouseLocation == 1:
102
            sku = 'FBA'+str(autoDecrementItem.item_id)
103
        else:
104
            sku = 'FBB'+str(autoDecrementItem.item_id)
105
        if sku in amazonShortTermActivePromotions:
106
            markReasonForItem(autoDecrementItem,'Item in short term promotion',Decision.AUTO_DECREMENT_FAILED)
107
            continue
108
        if math.ceil(autoDecrementItem.proposedSp) >= autoDecrementItem.ourSellingPrice:
109
            markReasonForItem(autoDecrementItem,'Proposed SP greater than or equal to current SP',Decision.AUTO_DECREMENT_FAILED)
110
            continue
111
        if autoDecrementItem.proposedSellingPrice < autoDecrementItem.lowestPossibleSp:
112
            markReasonForItem(autoDecrementItem,'Proposed SP less than lowest possible SP',Decision.AUTO_DECREMENT_FAILED)
113
            continue
114
        try:
115
            daysOfStock = (float(autoDecrementItem.ourInventory))/autoDecrementItem.avgSale
116
        except:
117
            daysOfStock = float("inf")
118
        if autoDecrementItem.competitiveCategory == CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE:
119
            if daysOfStock < 20:
120
                markReasonForItem(autoDecrementItem,'Days of stock less than 20',Decision.AUTO_DECREMENT_FAILED)
121
 
122
        if autoDecrementItem.competitiveCategory == CompetitionCategory.COMPETITIVE:
123
            if autoDecrementItem.parentCategoryId in [10006,10009,11001]:
124
                if daysOfStock < 1:
125
                    markReasonForItem(autoDecrementItem,'Days of stock less than 1',Decision.AUTO_DECREMENT_FAILED)
126
            else:
127
                if daysOfStock < 3:
128
                    markReasonForItem(autoDecrementItem,'Days of stock less than 3',Decision.AUTO_DECREMENT_FAILED)
129
 
130
        autoDecrementItem.ourEnoughStock=True
131
        autoDecrementItem.decision = Decision.AUTO_DECREMENT_SUCCESS
132
        autoDecrementItem.reason = 'All conditions for auto decrement true'
133
        successfulAutoDecrease.append(autoDecrementItem)
134
    session.commit()
135
    session.close()
136
    return successfulAutoDecrease
137
 
138
def fetchItemsForAutoIncrease(time):
139
    successfulAutoIncrease = []
140
    autoIncrementItems = session.query(AmazonScrapingHistory).join((Amazonlisted,AmazonScrapingHistory.item_id==Amazonlisted.itemId))\
141
    .filter(AmazonScrapingHistory.timestamp==time).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.BUY_BOX)\
142
    .filter(Amazonlisted.autoIncrement==True).all()
143
    transaction_client = TransactionClient().get_client()
144
    for autoIncrementItem in autoIncrementItems:
145
        if autoIncrementItem.warehouseLocation == 1:
146
            sku = 'FBA'+str(autoIncrementItem.item_id)
147
        else:
148
            sku = 'FBB'+str(autoIncrementItem.item_id)
149
        if sku in amazonShortTermActivePromotions:
150
            markReasonForItem(autoIncrementItem,'Item in short term promotion',Decision.AUTO_INCREMENT_FAILED)
151
            continue
152
        if autoIncrementItem.totalSeller==1 and autoIncrementItem.ourRank==1:
153
            markReasonForItem(autoIncrementItem,'We are the only seller',Decision.AUTO_INCREMENT_FAILED)
154
            continue 
155
        if autoIncrementItem.proposedSp <= autoIncrementItem.ourSellingPrice:
156
            markReasonForItem(autoIncrementItem,'Proposed SP less than current SP',Decision.AUTO_INCREMENT_FAILED)
157
            continue
158
        if autoIncrementItem.proposedSellingPrice >=10000 and autoIncrementItem.ourSellingPrice<10000:
159
            markReasonForItem(autoIncrementItem,'Proposed SP is greater than 10,000 and current sp is less than 10,000',Decision.AUTO_INCREMENT_FAILED)
160
            continue
161
 
162
        if autoIncrementItem.avgSale==0:
163
            markReasonForItem(autoIncrementItem,'Avg sale is 0',Decision.AUTO_INCREMENT_FAILED)
164
            continue
165
 
166
        daysOfStock = (float(autoIncrementItem.ourInventory))/autoIncrementItem.avgSale
167
        if daysOfStock > 5:
168
            markReasonForItem(autoIncrementItem,'Days of stock greater than 5',Decision.AUTO_INCREMENT_FAILED)
169
            continue
170
        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()
171
        if antecedentPrice is not None:
172
            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:
173
                markReasonForItem(autoIncrementItem,'Maximum price increase in last 24 hours should be 2%',Decision.AUTO_INCREMENT_FAILED)
174
                continue
175
        fbaSaleSnapshot = transaction_client.getAmazonFbaSalesLatestSnapshotForItemLocationWise(autoIncrementItem.item_id,autoIncrementItem.warehouseLocation)
176
        if getLastDaySale(fbaSaleSnapshot,autoIncrementItem.warehouseLocation-1)<=2:
177
            markReasonForItem(autoIncrementItem,'Last day sale is less than 3',Decision.AUTO_INCREMENT_FAILED)
178
            continue
179
 
180
        autoIncrementItem.ourEnoughStock = False
181
        autoIncrementItem.decision = Decision.AUTO_INCREMENT_SUCCESS
182
        autoIncrementItem.reason = 'All conditions for auto increment true'
183
        successfulAutoIncrease.append(autoIncrementItem)
184
    session.commit()
185
    return successfulAutoIncrease     
186
 
187
 
188
def markReasonForItem(amHistory,reason,decision):
189
    amHistory.decision = decision
190
    amHistory.reason = reason
191
 
192
def getOosString(oosStatus):
193
    lastNdaySale=""
194
    for obj in oosStatus:
195
        if obj.is_oos:
196
            lastNdaySale += "X-"
197
        else:
198
            lastNdaySale += str(obj.num_orders) + "-"
199
    return lastNdaySale[:-1]
200
 
201
def getLastDaySale(fbaSaleSnapshot):
202
    if fbaSaleSnapshot.item_id==0:
203
        return 0
204
    else:
205
        return fbaSaleSnapshot.totalSale
206
 
12363 kshitij.so 207
def syncAsin():
12396 kshitij.so 208
#    notListedOnAmazon = []
209
#    diffAsins = []
210
    login_url = "https://sellercentral.amazon.in/gp/homepage.html"
211
    br = SellerCentralInventoryReport.login(login_url)
212
    report_url = "https://sellercentral.amazon.in/gp/upload-download-utils/requestReport.html?type=OpenListingReport&marketplaceID=44571&Request+Report="
213
    br = SellerCentralInventoryReport.requestReport(br,report_url)
214
    status_url="https://sellercentral.amazon.in/gp/upload-download-utils/reportStatusData.html"
215
    br, page = SellerCentralInventoryReport.checkStatus(br,status_url)
216
    br, batchId = SellerCentralInventoryReport.getReportBatchId(br,page)
217
    print "*********************************"
218
    print "Batch Id for request is ",batchId
219
    print "*********************************"
220
    ready = False
221
    retryCount = 0
222
    while not ready:
223
        if retryCount == 10:
224
            print "File not available for download after multiple retries"
225
            sys.exit(1)
226
        br, download_link = SellerCentralInventoryReport.downloadReport(br,batchId,status_url)
227
        if download_link is not None:
228
            ready= True
229
            continue
230
        print "File not ready for download yet.Will try again after 30 seconds."
231
        retryCount+=1
232
        time.sleep(30)
233
    fPath = SellerCentralInventoryReport.fetchFile(download_link['href'],br,batchId)
12363 kshitij.so 234
    global amazonAsinPrice
235
    for line in open(fPath):
236
        l = line.split('\t')
237
        if (str(l[0]).startswith('FBA') or str(l[0]).startswith('FBB')):
238
            obj = __AmazonAsinPrice(l[1],l[2])
239
            amazonAsinPrice[l[0]] = obj
12396 kshitij.so 240
#Can be used to sync asins, not doing due to multiple asins corresponding to one itemId
12363 kshitij.so 241
#    systemAsins = session.query(Item,Amazonlisted).join((Amazonlisted,Item.id==Amazonlisted.itemId)).all()
242
#    for systemAsin in systemAsins:
243
#        item = systemAsin[0]
244
#        amListed = systemAsin[1]
245
#        if amazonAsinPrice.get('FBA'+str(item.id)) is None:
246
#            temp=[]
247
#            temp.append(item)
248
#            temp.append(amListed)
249
#            notListedOnAmazon.append(temp)
250
#            continue
251
#        else:
252
#            temp=[]
253
#            temp.append(item)
254
#            temp.append(amListed)
255
#            if item.asin!=((amazonAsinPrice.get('FBA'+str(item.id))).asin).strip():
256
#                diffAsins.append(temp)
257
#                continue
258
#            
259
#    for diffAsin in diffAsins:
260
#        item = diffAsin[0]
261
#        amListed = diffAsin[1]
262
#        item.asin = ((amazonAsinPrice.get('FBA'+str(item.id))).asin).strip()
263
#        amListed.asin = ((amazonAsinPrice.get('FBA'+str(item.id))).asin).strip()
264
#    session.commit()
265
#    session.close()
266
 
267
def fetchFbaSale():
268
    global saleMap
269
    transaction_client = TransactionClient().get_client()
270
    fbaSaleSnapshot = transaction_client.getAmazonFbaSalesSnapshotForDays(4)
271
    for saleSnapshot in fbaSaleSnapshot:
272
        if saleSnapshot.fcLocation == 0:
273
            if saleMap.has_key('FBA'+str(saleSnapshot.item_id)):
274
                temp = []
12367 kshitij.so 275
                val = saleMap.get('FBA'+str(saleSnapshot.item_id))
276
                for l in val:
12363 kshitij.so 277
                    temp.append(l)
278
                temp.append(saleSnapshot)
12366 kshitij.so 279
                saleMap['FBA'+str(saleSnapshot.item_id)]=temp
12363 kshitij.so 280
            else:
12368 kshitij.so 281
                temp = []
282
                temp.append(saleSnapshot)
283
                saleMap['FBA'+str(saleSnapshot.item_id)] = temp
12363 kshitij.so 284
        else:
285
            if saleMap.has_key('FBB'+str(saleSnapshot.item_id)):
286
                temp = []
12367 kshitij.so 287
                val = saleMap.get('FBB'+str(saleSnapshot.item_id))
288
                for l in val:
12363 kshitij.so 289
                    temp.append(l)
12368 kshitij.so 290
                saleMap['FBB'+str(saleSnapshot.item_id)]=temp
12363 kshitij.so 291
                temp.append(saleSnapshot)
292
            else:
12368 kshitij.so 293
                temp = []
294
                temp.append(saleSnapshot)
295
                saleMap['FBB'+str(saleSnapshot.item_id)] = temp
12363 kshitij.so 296
 
297
def calculateAverageSale(sku):
298
    count,sale = 0,0
299
    oosStatus = saleMap.get(sku)
300
    for obj in oosStatus:
12396 kshitij.so 301
        if not obj.isOutOfStock:
12363 kshitij.so 302
            count+=1
12396 kshitij.so 303
            sale = sale+obj.totalSales
12363 kshitij.so 304
    avgSalePerDay=0 if count==0 else (float(sale)/count)
305
    return round(avgSalePerDay,2)
306
 
307
def computeCourierCost(weight):
12378 kshitij.so 308
    try:
309
        cCost = 10.0;
310
        slabs = int((weight*1000)/500-.001)
311
        for slab in range(0,slabs):
312
            cCost = cCost + 10.0;
313
        return cCost;
314
    except:
315
        return 10.0
12363 kshitij.so 316
 
317
 
318
def populateStuff(time,runType):
319
    global amazonLongTermActivePromotions
12396 kshitij.so 320
    global amazonShortTermActivePromotions
12363 kshitij.so 321
    itemInfo = []
322
    inventory_client = InventoryClient().get_client()
323
    fbaAvailableInventorySnapshot = inventory_client.getAllAvailableAmazonFbaItemInventory()
12387 kshitij.so 324
    print "length****"
325
    print len(fbaAvailableInventorySnapshot)
12363 kshitij.so 326
    for fbaInventoryItem in fbaAvailableInventorySnapshot:
327
        d_amazon_listed = Amazonlisted.get_by(itemId=fbaInventoryItem.item_id)
328
        if d_amazon_listed is None:
12389 kshitij.so 329
            print "amazon listed is none"
12363 kshitij.so 330
            continue
331
        if d_amazon_listed.overrrideWanlc:
332
            wanlc = d_amazon_listed.exceptionalWanlc
333
        else:
334
            wanlc = inventory_client.getWanNlcForSource(fbaInventoryItem.item_id,OrderSource.AMAZON)
335
        it = Item.query.filter_by(id=fbaInventoryItem.item_id).one()
336
        category = Category.query.filter_by(id=it.category).one()
337
        parent_category = Category.query.filter_by(id=category.parent_category_id).first()
338
        scp = SourceCategoryPercentage.query.filter(SourceCategoryPercentage.category_id==it.category).filter(SourceCategoryPercentage.source==OrderSource.AMAZON).filter(SourceCategoryPercentage.startDate<=time).filter(SourceCategoryPercentage.expiryDate>=time).first()
339
        if scp is not None:
340
            sourcePercentage = scp
341
        else:
342
            spm = SourcePercentageMaster.get_by(source=OrderSource.AMAZON)
343
            sourcePercentage = spm
12375 kshitij.so 344
        print "$$$$$$$$$$$$$$$$$"
345
        print fbaInventoryItem
346
        if fbaInventoryItem.location==0:
12377 kshitij.so 347
            sku = 'FBA'+str(fbaInventoryItem.item_id)
12363 kshitij.so 348
            state_id = 1
12375 kshitij.so 349
        elif fbaInventoryItem.location==1:
12377 kshitij.so 350
            sku = 'FBB'+str(fbaInventoryItem.item_id)
12363 kshitij.so 351
            state_id = 2
352
        else:
12371 kshitij.so 353
            print "continue*****"
12363 kshitij.so 354
            continue
355
        cc = computeCourierCost(it.weight)
356
        if amazonAsinPrice.get(sku) is None:
12381 kshitij.so 357
            asin = ''
12379 kshitij.so 358
        elif amazonAsinPrice.get(sku).asin is None:
12381 kshitij.so 359
            asin = ''
12379 kshitij.so 360
        else:
361
            asin = amazonAsinPrice.get(sku).asin
362
 
12380 kshitij.so 363
        amazonItemInfo = __AmazonItemInfo(asin, 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)
12371 kshitij.so 364
        print amazonItemInfo
12363 kshitij.so 365
        itemInfo.append(amazonItemInfo)
366
    amPromotions = AmazonPromotion.query.filter(AmazonPromotion.startDate<=time).filter(AmazonPromotion.endDate>=time).filter(AmazonPromotion.promotionType==AmazonPromotionType.LONGTERM).filter(AmazonPromotion.promotionActive==True) \
367
    .group_by(AmazonPromotion.sku).order_by(desc(AmazonPromotion.addedOn)).all()
368
    for amPromotion in amPromotions:
369
        amazonLongTermActivePromotions.append(amPromotion.sku)
12396 kshitij.so 370
    amPromotions = AmazonPromotion.query.filter(AmazonPromotion.startDate<=time).filter(AmazonPromotion.endDate>=time).filter(AmazonPromotion.promotionType==AmazonPromotionType.SHORTTERM).filter(AmazonPromotion.promotionActive==True) \
371
    .group_by(AmazonPromotion.sku).order_by(desc(AmazonPromotion.addedOn)).all()
372
    for amPromotion in amPromotions:
373
        amazonShortTermActivePromotions.append(amPromotion.sku)
12363 kshitij.so 374
    session.close()
12388 kshitij.so 375
    print "item info length"
376
    print len(itemInfo)
12363 kshitij.so 377
    return itemInfo
378
 
379
def decideCategory(itemInfo):
380
    exceptionList, negativeMargin, cheapest, amongCheapestAndCanCompete, canCompete, almostCompete, cantCompete = [],[],[],[],[],[],[] 
381
    skuUrls = []
382
    #skuAsinMap = {}
383
    for item in itemInfo:
12379 kshitij.so 384
        if item.asin is None or len(item.asin)==0:
12363 kshitij.so 385
            temp = []
386
            temp.append(item)
387
            temp.append("Asin not available")
388
            exceptionList.append(temp)
389
            continue
390
        skuUrls.append('http://www.amazon.in/gp/offer-listing/'+item.asin+'/ref=olp_sort_ps')
391
    aggResponse = amScraper.read(skuUrls, True)
12403 kshitij.so 392
 
12363 kshitij.so 393
    catalog_client = CatalogClient().get_client()
394
    for val in itemInfo:
12404 kshitij.so 395
        print "Trying to get details of ",val.sku
12379 kshitij.so 396
        if val.asin is None or len(val.asin)==0:
12363 kshitij.so 397
            continue
398
        scrapInfo = aggResponse.get(val.asin)
12404 kshitij.so 399
        print "Scraped info for asin is ",scrapInfo
12363 kshitij.so 400
        if val.sku in amazonLongTermActivePromotions:
401
            print "Sku in promotion, will handle it later.Moving to other..."
402
            continue
403
        if scrapInfo is None or val.nlc==0:
404
            temp = []
405
            temp.append(val)
406
            if val.nlc==0 or val.nlc is None:
407
                temp.append("WANLC is 0")
408
            else:
409
                temp.append("Not able to fetch")
410
            exceptionList.append(temp)
411
            continue
412
        iterator = 0
413
        sku, lowestSellerName,secondLowestSellerName, thirdLowestSellerName = ('',)*4
414
        ourSp, ourRank, lowestSellerSp, secondLowestSellerSp, thirdLowestSellerSp, ourTp, lowestPossibleSp, lowestPossibleTp = (0,)*8
415
        sku = val.sku
416
        scrapedSkuLocation = None
417
        multipleListings = False
418
        for info in scrapInfo:
12401 kshitij.so 419
            print "iterating scrap info"
12408 kshitij.so 420
            if iterator ==3:
421
                break
12400 kshitij.so 422
            if (info['sellerName']).strip()=='Saholic':
12363 kshitij.so 423
                if ourRank>0:
424
                    multipleListings = True
12400 kshitij.so 425
                ourSp = info['sellerPrice']
12363 kshitij.so 426
                ourRank = iterator+1
427
                if val.state_id==1:
428
                    #It means sku starts with FBA
429
                    fbaPrice = (amazonAsinPrice.get(val.sku)).price
430
                    try:
431
                        if ourSp==fbaPrice:
432
                            scrapedSkuLocation = val.state_id
433
                    except:
434
                        scrapedSkuLocation = None
435
                elif val.state_id==2:
436
                    #It means sku starts with FBB
437
                    fbbPrice = (amazonAsinPrice.get(val.sku)).price
438
                    try:
439
                        if ourSp==fbbPrice:
440
                            scrapedSkuLocation = val.state_id
441
                    except:
442
                        scrapedSkuLocation = None
443
                else:
444
                    scrapedSkuLocation = None
445
                if scrapedSkuLocation is None:
446
                    print "fishy...confused for ", val.sku
447
 
448
            if iterator == 0:
12400 kshitij.so 449
                lowestSellerName = info['sellerName']
450
                lowestSellerSp = info['sellerPrice']
12363 kshitij.so 451
 
452
            if iterator == 1:
12400 kshitij.so 453
                secondLowestSellerName = info['sellerName']
454
                secondLowestSellerSp = info['sellerPrice']
12363 kshitij.so 455
 
456
            if iterator == 2:
12400 kshitij.so 457
                thirdLowestSellerName = info['sellerName']
458
                thirdLowestSellerSp = info['sellerPrice']
12363 kshitij.so 459
 
460
            iterator += 1
12401 kshitij.so 461
        print "terminating iterator"
12363 kshitij.so 462
        #if cheapestSkuLocation!=val.state_id
463
 
464
        if ourSp==0 or scrapedSkuLocation is None:
465
            print "Sku not present in top 3.Getting price from amazonAsinPrice...or multiple listings"
466
            if ourSp==0:
467
                ourRank = 999 #Due to pagination and large no of sellers.Taking it as dummy value, means we are not in top 3
468
                ourSp = (amazonAsinPrice.get(val.sku)).price
469
                if ourSp is None or ourSp==0:
470
                    temp = []
471
                    temp.append(val)
472
                    temp.append("Price not available")
473
                    exceptionList.append(temp)
474
                    continue
475
            else:
476
                #determine rank
477
                if ourSp <= lowestSellerSp or lowestSellerSp==0:
478
                    ourRank = 1
479
                elif ourSp > lowestSellerSp and (ourSp <= secondLowestSellerSp or secondLowestSellerSp==0):
480
                    ourRank = 2
481
                elif ourSp > secondLowestSellerSp and (ourSp<=thirdLowestSellerSp or thirdLowestSellerSp==0):
482
                    ourRank = 3
483
                else:
484
                    ourRank = 999
485
 
486
        if multipleListings:
487
            print "multiple listings..."
488
            ourSp = (amazonAsinPrice.get(val.sku)).price
489
            if ourSp is None or ourSp==0:
490
                temp = []
491
                temp.append(val)
492
                temp.append("Price not available")
493
                exceptionList.append(temp)
494
                continue
495
            if ourSp <= lowestSellerSp:
496
                    ourRank = 1
497
            elif ourSp > lowestSellerSp and (ourSp <= secondLowestSellerSp or secondLowestSellerSp==0):
498
                ourRank = 2
499
            elif ourSp > secondLowestSellerSp and (ourSp<=thirdLowestSellerSp or thirdLowestSellerSp==0):
500
                ourRank = 3
501
            else:
502
                ourRank = 999
503
 
504
 
12408 kshitij.so 505
        print "Creating object am details",val.sku
12363 kshitij.so 506
        amDetails = __AmazonDetails(sku, ourSp, ourRank, lowestSellerName,lowestSellerSp,secondLowestSellerName, secondLowestSellerSp, thirdLowestSellerName, thirdLowestSellerSp,len(scrapInfo),multipleListings)
507
        try:
508
            val.vatRate = catalog_client.getVatPercentageForItem(int(val.sku[3:]), val.state_id, amDetails.ourSp)
509
        except:
510
            temp = []
511
            temp.append(val)
512
            temp.append("Vat not available")
513
            exceptionList.append(temp)
514
            continue
515
 
516
        ourTp = getOurTp(amDetails,val,val.sourcePercentage)
517
        lowestPossibleTp = getLowestPossibleTp(amDetails,val,val.sourcePercentage)
518
        lowestPossibleSp = getLowestPossibleSp(amDetails,val,val.sourcePercentage)
12408 kshitij.so 519
        print "Creating pricing obj"
12363 kshitij.so 520
        amPricing = __AmazonPricing(ourSp,ourTp,lowestPossibleTp,lowestPossibleSp)
521
 
522
        if amPricing.ourTp < amPricing.lowestPossibleTp:
523
            temp = []
524
            temp.append(val)
525
            temp.append(amDetails)
526
            temp.append(amPricing)
527
            negativeMargin.append(temp)
528
            continue
529
 
530
        if amDetails.ourRank==1:
531
            temp = []
532
            temp.append(val)
533
            temp.append(amDetails)
534
            temp.append(amPricing)
535
            cheapest.append(temp)
536
            continue
537
 
538
        if (amDetails.lowestSellerSp > amPricing.lowestPossibleSp) and ((((float(amDetails.ourSp - amDetails.lowestSellerSp))/amDetails.ourSp)<=.01) or ((amDetails.ourSp - amDetails.lowestSellerSp)<=25)):
539
            temp = []
540
            temp.append(val)
541
            temp.append(amDetails)
542
            temp.append(amPricing)
543
            amongCheapestAndCanCompete.append(temp)
544
            continue
545
 
546
        if (amDetails.lowestSellerSp > amPricing.lowestPossibleSp):
547
            temp = []
548
            temp.append(val)
549
            temp.append(amDetails)
550
            temp.append(amPricing)
551
            canCompete.append(temp)
552
            continue
553
 
12403 kshitij.so 554
        if amDetails.lowestSellerSp*(1+.01) >= amPricing.lowestPossibleSp:
12396 kshitij.so 555
            temp = []
556
            temp.append(val)
557
            temp.append(amDetails)
558
            temp.append(amPricing)
559
            almostCompete.append(temp)
560
            continue
561
 
562
 
12363 kshitij.so 563
        temp = []
564
        temp.append(val)
565
        temp.append(amDetails)
566
        temp.append(amPricing)
567
        cantCompete.append(temp)
12408 kshitij.so 568
        print "Created category..."
12363 kshitij.so 569
 
570
    return exceptionList, negativeMargin, cheapest, amongCheapestAndCanCompete, canCompete, almostCompete, cantCompete
12396 kshitij.so 571
 
12363 kshitij.so 572
def getOurTp(amazonDetails,val,spm):
573
    ourTp = amazonDetails.ourSp- amazonDetails.ourSp*(spm.commission/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost)*(1+(spm.serviceTax/100))*(1+(spm.serviceTax/100));
574
    return round(ourTp,2)
575
 
576
def getLowestPossibleTp(amazonDetails,val,spm):
577
    vat = (amazonDetails.ourSp/(1+(val.vatRate/100))-(val.nlc/(1+(val.vatRate/100))))*(val.vatRate/100)
578
    inHouseCost = 15+vat+(spm.returnProvision/100)*amazonDetails.ourSp
579
    lowest_possible_tp = val.nlc+inHouseCost
580
    return round(lowest_possible_tp,2)
581
 
582
def getLowestPossibleSp(amazonDetails,val,spm):
583
    lowestPossibleSp = (val.nlc+(val.courierCost)*(1+(spm.serviceTax/100))*(1+(val.vatRate/100))+(15)*(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));
584
    return round(lowestPossibleSp,2)
585
 
586
def getTargetTp(targetSp,spm,val):
587
    targetTp = targetSp- targetSp*(spm.commission/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost)*(1+(val.serviceTax/100))
588
    return round(targetTp,2)
589
 
590
def commitExceptionList(exceptionList,timestamp,runType):
591
    for exceptionItem in exceptionList:
592
        val = exceptionItem[0]
593
        reason = exceptionItem[1]
594
        amazonScrapingHistory = AmazonScrapingHistory()
595
        amazonScrapingHistory.item_id = val.sku[3:]
596
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 597
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 598
        amazonScrapingHistory.reason = reason
599
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
600
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.EXCEPTION
601
        amazonScrapingHistory.timestamp = timestamp
602
    session.commit()
603
 
604
def commitNegativeMargin(negativeMargin,timestamp,runType):
605
    for negativeMarginItem in negativeMargin:
606
        val = negativeMarginItem[0]
607
        amDetails = negativeMarginItem[1]
608
        amPricing = negativeMarginItem[2]
609
        spm = val.sourcePercentage
610
        amazonScrapingHistory = AmazonScrapingHistory()
611
        amazonScrapingHistory.item_id = val.sku[3:]
612
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 613
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 614
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
615
        amazonScrapingHistory.ourTp = amPricing.ourTp
616
        amazonScrapingHistory.lowestPossibleTp = amPricing.lowestPossibleTp
617
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
618
        amazonScrapingHistory.ourRank = amDetails.ourRank
619
        amazonScrapingHistory.ourInventory = val.ourInventory
620
        amazonScrapingHistory.lowestSellerName = amDetails.lowestSellerName
621
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
622
        amazonScrapingHistory.secondLowestSellerName = amDetails.secondLowestSellerName
623
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
624
        amazonScrapingHistory.thirdLowestSellerName = amDetails.thirdLowestSellerName
625
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
626
        amazonScrapingHistory.wanlc = val.nlc
627
        amazonScrapingHistory.commission = spm.commission
628
        amazonScrapingHistory.competitorCommission = spm.competitorCommission
629
        amazonScrapingHistory.returnProvision = spm.returnProvision
630
        amazonScrapingHistory.courierCost = val.courierCost
631
        amazonScrapingHistory.risky = val.risky
632
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
633
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
634
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.NEGATIVE_MARGIN
635
        amazonScrapingHistory.timestamp = timestamp
636
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
637
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
638
    session.commit()
639
 
640
 
641
def commitCheapest(cheapest,timestamp,runType):
642
    for cheapestItem in cheapest:
643
        val = cheapestItem[0]
644
        amDetails = cheapestItem[1]
645
        amPricing = cheapestItem[2]
646
        spm = val.sourcePercentage
647
        amazonScrapingHistory = AmazonScrapingHistory()
648
        amazonScrapingHistory.item_id = val.sku[3:]
649
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 650
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 651
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
652
        amazonScrapingHistory.ourTp = amPricing.ourTp
653
        amazonScrapingHistory.lowestPossibleTp = amPricing.lowestPossibleTp
654
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
655
        amazonScrapingHistory.ourRank = amDetails.ourRank
656
        amazonScrapingHistory.ourInventory = val.ourInventory
657
        amazonScrapingHistory.lowestSellerName = amDetails.lowestSellerName
658
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
659
        amazonScrapingHistory.secondLowestSellerName = amDetails.secondLowestSellerName
660
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
661
        amazonScrapingHistory.thirdLowestSellerName = amDetails.thirdLowestSellerName
662
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
663
        amazonScrapingHistory.wanlc = val.nlc
664
        amazonScrapingHistory.commission = spm.commission
665
        amazonScrapingHistory.competitorCommission = spm.competitorCommission
666
        amazonScrapingHistory.returnProvision = spm.returnProvision
667
        amazonScrapingHistory.courierCost = val.courierCost
668
        amazonScrapingHistory.risky = val.risky
669
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
670
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
671
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.BUY_BOX
672
        amazonScrapingHistory.timestamp = timestamp
673
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
674
        if amDetails.secondLowestSellerName!='Saholic':
675
            competitorSp = amDetails.secondLowestSellerSp
676
        else:
677
            competitorSp = amDetails.thirdLowestSellerSp
678
        proposed_sp = max(competitorSp - max((20, competitorSp*0.002)), amPricing.lowestPossibleSp)
679
        proposed_tp = getTargetTp(proposed_sp,spm,val)
680
        amazonScrapingHistory.proposedSp = proposed_sp
681
        amazonScrapingHistory.proposedTp = proposed_tp
682
        amazonScrapingHistory.marginIncreasedPotential = proposed_tp - amPricing.ourTp
683
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
684
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
685
    session.commit()
686
 
687
 
688
 
689
def commitAmongCheapestAndCanCompete(amongCheapestAndCanCompete,timestamp,runType):
690
    for amongCheapestAndCanCompeteItem in amongCheapestAndCanCompete:
691
        val = amongCheapestAndCanCompeteItem[0]
692
        amDetails = amongCheapestAndCanCompeteItem[1]
693
        amPricing = amongCheapestAndCanCompeteItem[2]
694
        spm = val.sourcePercentage
695
        amazonScrapingHistory = AmazonScrapingHistory()
696
        amazonScrapingHistory.item_id = val.sku[3:]
697
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 698
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 699
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
700
        amazonScrapingHistory.ourTp = amPricing.ourTp
701
        amazonScrapingHistory.lowestPossibleTp = amPricing.lowestPossibleTp
702
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
703
        amazonScrapingHistory.ourRank = amDetails.ourRank
704
        amazonScrapingHistory.ourInventory = val.ourInventory
705
        amazonScrapingHistory.lowestSellerName = amDetails.lowestSellerName
706
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
707
        amazonScrapingHistory.secondLowestSellerName = amDetails.secondLowestSellerName
708
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
709
        amazonScrapingHistory.thirdLowestSellerName = amDetails.thirdLowestSellerName
710
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
711
        amazonScrapingHistory.wanlc = val.nlc
712
        amazonScrapingHistory.commission = spm.commission
713
        amazonScrapingHistory.competitorCommission = spm.competitorCommission
714
        amazonScrapingHistory.returnProvision = spm.returnProvision
715
        amazonScrapingHistory.courierCost = val.courierCost
716
        amazonScrapingHistory.risky = val.risky
717
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
718
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
719
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE
720
        amazonScrapingHistory.timestamp = timestamp
721
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
722
        proposed_sp = max(amDetails.lowestSellerSp - max((5, amDetails.lowestSellerSp*0.001)), amPricing.lowestPossibleSp)
723
        proposed_tp = getTargetTp(proposed_sp,spm,val)
724
        amazonScrapingHistory.proposedSp = proposed_sp
725
        amazonScrapingHistory.proposedTp = proposed_tp
726
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
727
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
728
    session.commit()
729
 
730
def commitCanCompete(canCompete,timestamp,runType):
731
    for canCompeteItem in canCompete:
732
        val = canCompeteItem[0]
733
        amDetails = canCompeteItem[1]
734
        amPricing = canCompeteItem[2]
735
        spm = val.sourcePercentage
736
        amazonScrapingHistory = AmazonScrapingHistory()
737
        amazonScrapingHistory.item_id = val.sku[3:]
738
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 739
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 740
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
741
        amazonScrapingHistory.ourTp = amPricing.ourTp
742
        amazonScrapingHistory.lowestPossibleTp = amPricing.lowestPossibleTp
743
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
744
        amazonScrapingHistory.ourRank = amDetails.ourRank
745
        amazonScrapingHistory.ourInventory = val.ourInventory
746
        amazonScrapingHistory.lowestSellerName = amDetails.lowestSellerName
747
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
748
        amazonScrapingHistory.secondLowestSellerName = amDetails.secondLowestSellerName
749
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
750
        amazonScrapingHistory.thirdLowestSellerName = amDetails.thirdLowestSellerName
751
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
752
        amazonScrapingHistory.wanlc = val.nlc
753
        amazonScrapingHistory.commission = spm.commission
754
        amazonScrapingHistory.competitorCommission = spm.competitorCommission
755
        amazonScrapingHistory.returnProvision = spm.returnProvision
756
        amazonScrapingHistory.courierCost = val.courierCost
757
        amazonScrapingHistory.risky = val.risky
758
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
759
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
760
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.COMPETITIVE
761
        amazonScrapingHistory.timestamp = timestamp
762
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
763
        proposed_sp = max(amDetails.lowestSellerSp - max((5, amDetails.lowestSellerSp*0.001)), amPricing.lowestPossibleSp)
764
        proposed_tp = getTargetTp(proposed_sp,spm,val)
765
        amazonScrapingHistory.proposedSp = proposed_sp
766
        amazonScrapingHistory.proposedTp = proposed_tp
767
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
768
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
769
    session.commit()
770
 
12383 kshitij.so 771
def commitAlmostCompete(almostCompete,timestamp,runType):
12396 kshitij.so 772
    for almostCompeteItem in almostCompete:
773
        val = almostCompeteItem[0]
774
        amDetails = almostCompeteItem[1]
775
        amPricing = almostCompeteItem[2]
776
        spm = val.sourcePercentage
777
        amazonScrapingHistory = AmazonScrapingHistory()
778
        amazonScrapingHistory.item_id = val.sku[3:]
779
        amazonScrapingHistory.warehouseLocation = val.state_id
780
        amazonScrapingHistory.parentCategoryId = val.parent_category
781
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
782
        amazonScrapingHistory.ourTp = amPricing.ourTp
783
        amazonScrapingHistory.lowestPossibleTp = amPricing.lowestPossibleTp
784
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
785
        amazonScrapingHistory.ourRank = amDetails.ourRank
786
        amazonScrapingHistory.ourInventory = val.ourInventory
787
        amazonScrapingHistory.lowestSellerName = amDetails.lowestSellerName
788
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
789
        amazonScrapingHistory.secondLowestSellerName = amDetails.secondLowestSellerName
790
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
791
        amazonScrapingHistory.thirdLowestSellerName = amDetails.thirdLowestSellerName
792
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
793
        amazonScrapingHistory.wanlc = val.nlc
794
        amazonScrapingHistory.commission = spm.commission
795
        amazonScrapingHistory.competitorCommission = spm.competitorCommission
796
        amazonScrapingHistory.returnProvision = spm.returnProvision
797
        amazonScrapingHistory.courierCost = val.courierCost
798
        amazonScrapingHistory.risky = val.risky
799
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
800
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
801
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.ALMOST_COMPETE
802
        amazonScrapingHistory.timestamp = timestamp
803
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
804
        proposed_sp = min(amDetails.lowestSellerSp(1+.01),amPricing.lowestPossibleSp)
805
        proposed_tp = getTargetTp(proposed_sp,spm,val)
806
        target_nlc = proposed_tp - amPricing.lowestPossibleTp + val.nlc
807
        amazonScrapingHistory.proposedSp = proposed_sp
808
        amazonScrapingHistory.proposedTp = proposed_tp
809
        amazonScrapingHistory.targetNlc = target_nlc
810
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
811
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
812
    session.commit()
12363 kshitij.so 813
 
12396 kshitij.so 814
 
12363 kshitij.so 815
def commitCantCompete(cantCompete, timestamp,runType):
816
    for cantCompeteItem in cantCompete:
817
        val = cantCompeteItem[0]
818
        amDetails = cantCompeteItem[1]
819
        amPricing = cantCompeteItem[2]
820
        spm = val.sourcePercentage
821
        amazonScrapingHistory = AmazonScrapingHistory()
822
        amazonScrapingHistory.item_id = val.sku[3:]
823
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 824
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 825
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
826
        amazonScrapingHistory.ourTp = amPricing.ourTp
827
        amazonScrapingHistory.lowestPossibleTp = amPricing.lowestPossibleTp
828
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
829
        amazonScrapingHistory.ourRank = amDetails.ourRank
830
        amazonScrapingHistory.ourInventory = val.ourInventory
831
        amazonScrapingHistory.lowestSellerName = amDetails.lowestSellerName
832
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
833
        amazonScrapingHistory.secondLowestSellerName = amDetails.secondLowestSellerName
834
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
835
        amazonScrapingHistory.thirdLowestSellerName = amDetails.thirdLowestSellerName
836
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
837
        amazonScrapingHistory.wanlc = val.nlc
838
        amazonScrapingHistory.commission = spm.commission
839
        amazonScrapingHistory.competitorCommission = spm.competitorCommission
840
        amazonScrapingHistory.returnProvision = spm.returnProvision
841
        amazonScrapingHistory.courierCost = val.courierCost
842
        amazonScrapingHistory.risky = val.risky
843
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
844
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
845
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.CANT_COMPETE
846
        amazonScrapingHistory.timestamp = timestamp
847
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
848
        proposed_sp = amDetails.lowestSellerSp - max(5, amDetails.lowestSellerSp*0.001)
849
        proposed_tp = getTargetTp(proposed_sp,spm,val)
850
        target_nlc = proposed_tp - amPricing.lowestPossibleTp + val.nlc
851
        amazonScrapingHistory.proposedSp = proposed_sp
852
        amazonScrapingHistory.proposedTp = proposed_tp
853
        amazonScrapingHistory.targetNlc = target_nlc
854
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
855
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
856
    session.commit()
857
 
12396 kshitij.so 858
def markAutoFavourites(time):
859
    nowAutoFav = []
860
    previouslyAutoFav = []
861
    stockList = []
862
    saleList = []
863
    items = session.query(func.sum(AmazonScrapingHistory.ourInventory),AmazonScrapingHistory.item_id).group_by(AmazonScrapingHistory.item_id).all()
864
    allItems = session.query(Amazonlisted).all()
865
    for item in items:
866
        reason = ""
867
        if item[0]>=5:
868
            stockList.append(item[1])
869
 
870
    for sku, val in saleMap.iteritems():
871
        totalSale = 0
872
        item_id = sku.replace('FBA','').replace('FBB','')
873
        val =saleMap.get('FBA'+str(item_id))
874
        if val is not None:
875
            for sale in val:
876
                totalSale += sale.totalOrderCount
877
        val =saleMap.get('FBB'+str(item_id))
878
        if val is not None:
879
            for sale in val:
880
                totalSale += sale.totalOrderCount
881
        if totalSale > 0:
882
            saleList.append(item_id)
883
 
884
    for aItem in allItems:
885
        reason = ""
886
        toMark = False
887
        if aItem.itemId in saleList:
888
            toMark = True
889
            reason+="Total FC sale is greater than 1 for last five days.."
890
        if aItem.itemId in stockList:
891
            toMark = True
892
            reason+="Item is present in buy box in last 3 days"
893
        if not aItem.autoFavourite:
894
            print "Item is not under auto favourite"
895
        if toMark:
896
            temp=[]
897
            temp.append(aItem.itemId)
898
            temp.append(reason)
899
            nowAutoFav.append(temp)
900
        if (not toMark) and aItem.autoFavourite:
901
            previouslyAutoFav.append(aItem.itemId)
902
        aItem.autoFavourite = toMark
903
    session.commit()
904
    return previouslyAutoFav, nowAutoFav
905
 
906
def writeReport(timestamp,autoDecreaseItems,autoIncreaseItems,previousAutoFav,nowAutoFav):
907
    wbk = xlwt.Workbook()
908
    sheet = wbk.add_sheet('Can\'t Compete')
909
    xstr = lambda s: s or ""
910
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
911
 
912
    excel_integer_format = '0'
913
    integer_style = xlwt.XFStyle()
914
    integer_style.num_format_str = excel_integer_format
915
 
916
    sheet.write(0, 0, "Item Id", heading_xf)
917
    sheet.write(0, 1, "Amazon Sku", heading_xf)
918
    sheet.write(0, 2, "Asin", heading_xf)
919
    sheet.write(0, 3, "Location", heading_xf)
920
    sheet.write(0, 4, "Brand", heading_xf)
921
    sheet.write(0, 5, "Product Name", heading_xf)
922
    sheet.write(0, 6, "Weight", heading_xf)
923
    sheet.write(0, 7, "Courier Cost", heading_xf)
924
    sheet.write(0, 8, "Our SP", heading_xf)
925
    sheet.write(0, 9, "Our Tp", heading_xf)
926
    sheet.write(0, 10, "Lowest Possible SP", heading_xf)
927
    sheet.write(0, 11, "Lowest Possible TP", heading_xf)
928
    sheet.write(0, 12, "Rank", heading_xf)
929
    sheet.write(0, 13, "Our Inventory", heading_xf)
930
    sheet.write(0, 14, "Lowest Seller Name", heading_xf)
931
    sheet.write(0, 15, "Lowest Seller SP", heading_xf)
932
    sheet.write(0, 16, "Second Lowest Seller Name", heading_xf)
933
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
934
    sheet.write(0, 18, "Third Lowest Seller Name", heading_xf)
935
    sheet.write(0, 19, "Third Lowest Seller SP", heading_xf)
936
    sheet.write(0, 20, "WANLC", heading_xf)
937
    sheet.write(0, 21, "Commission", heading_xf)
938
    sheet.write(0, 22, "Competitor Commission", heading_xf)
939
    sheet.write(0, 23, "Return Provision", heading_xf)
940
    sheet.write(0, 24, "Margin", heading_xf)
941
    sheet.write(0, 25, "Risky", heading_xf)
942
    sheet.write(0, 26, "Proposed Sp", heading_xf)
943
    sheet.write(0, 27, "Proposed Tp", heading_xf)
944
    sheet.write(0, 28, "Target Nlc", heading_xf)
945
    sheet.write(0, 29, "Avg Sale", heading_xf)
946
    sheet.write(0, 30, "Sales History", heading_xf)
947
 
948
    sheet_iterator = 1
949
    cantCompeteItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.CANT_COMPETE).all()
950
    for cantCompeteItem in cantCompeteItems:
951
        amScraping =  cantCompeteItem[0]
952
        item = cantCompeteItem[1]
953
        sheet.write(sheet_iterator, 0, amScraping.item_id)
954
        if amScraping.warehouseLocation == 1:
955
            sku = 'FBA'+str(amScraping.item_id)
956
            loc = 'MUMBAI'
957
        else:
958
            sku = 'FBB'+str(amScraping.item_id)
959
            loc = 'BANGLORE'
960
        sheet.write(sheet_iterator, 1, sku)
961
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
962
        sheet.write(sheet_iterator, 3, loc)
963
        sheet.write(sheet_iterator, 4, item.brand)
964
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
965
        sheet.write(sheet_iterator, 6, item.weight)
966
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
967
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
968
        sheet.write(sheet_iterator, 9, amScraping.ourTp)
969
        sheet.write(sheet_iterator, 10, amScraping.lowestPossibleSp)
970
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleTp)
971
        if amScraping.ourRank > 3:
972
            sheet.write(sheet_iterator, 12, 'Greater than 3')
973
        else:
974
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
975
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
976
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerName)
977
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerSp)
978
        sheet.write(sheet_iterator, 16, amScraping.secondLowestSellerName)
979
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
980
        sheet.write(sheet_iterator, 18, amScraping.thirdLowestSellerName)
981
        sheet.write(sheet_iterator, 19, amScraping.thirdLowestSellerSp)
982
        sheet.write(sheet_iterator, 20, amScraping.wanlc)
983
        sheet.write(sheet_iterator, 21, amScraping.commission)
984
        sheet.write(sheet_iterator, 22, amScraping.competitorCommission)
985
        sheet.write(sheet_iterator, 23, amScraping.returnProvision)
986
        sheet.write(sheet_iterator, 24, round(amScraping.ourTp - amScraping.lowestPossibleTp))
987
        sheet.write(sheet_iterator, 25, item.risky)
988
        sheet.write(sheet_iterator, 26, amScraping.proposedSp)
989
        sheet.write(sheet_iterator, 27, amScraping.proposedTp)
990
        sheet.write(sheet_iterator, 28, amScraping.targetNlc)
991
        sheet.write(sheet_iterator, 29, amScraping.avgSale)
992
        sheet.write(sheet_iterator, 30, getOosString(saleMap.get(sku)))
993
        sheet_iterator+=1
994
 
995
    sheet = wbk.add_sheet('Competitive')
996
    xstr = lambda s: s or ""
997
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
998
 
999
    excel_integer_format = '0'
1000
    integer_style = xlwt.XFStyle()
1001
    integer_style.num_format_str = excel_integer_format
1002
 
1003
    sheet.write(0, 0, "Item Id", heading_xf)
1004
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1005
    sheet.write(0, 2, "Asin", heading_xf)
1006
    sheet.write(0, 3, "Location", heading_xf)
1007
    sheet.write(0, 4, "Brand", heading_xf)
1008
    sheet.write(0, 5, "Product Name", heading_xf)
1009
    sheet.write(0, 6, "Weight", heading_xf)
1010
    sheet.write(0, 7, "Courier Cost", heading_xf)
1011
    sheet.write(0, 8, "Our SP", heading_xf)
1012
    sheet.write(0, 9, "Our Tp", heading_xf)
1013
    sheet.write(0, 10, "Lowest Possible SP", heading_xf)
1014
    sheet.write(0, 11, "Lowest Possible TP", heading_xf)
1015
    sheet.write(0, 12, "Rank", heading_xf)
1016
    sheet.write(0, 13, "Our Inventory", heading_xf)
1017
    sheet.write(0, 14, "Lowest Seller Name", heading_xf)
1018
    sheet.write(0, 15, "Lowest Seller SP", heading_xf)
1019
    sheet.write(0, 16, "Second Lowest Seller Name", heading_xf)
1020
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
1021
    sheet.write(0, 18, "Third Lowest Seller Name", heading_xf)
1022
    sheet.write(0, 19, "Third Lowest Seller SP", heading_xf)
1023
    sheet.write(0, 20, "WANLC", heading_xf)
1024
    sheet.write(0, 21, "Commission", heading_xf)
1025
    sheet.write(0, 22, "Competitor Commission", heading_xf)
1026
    sheet.write(0, 23, "Return Provision", heading_xf)
1027
    sheet.write(0, 24, "Margin", heading_xf)
1028
    sheet.write(0, 25, "Risky", heading_xf)
1029
    sheet.write(0, 26, "Proposed Sp", heading_xf)
1030
    sheet.write(0, 27, "Proposed Tp", heading_xf)
1031
    sheet.write(0, 28, "Avg Sale", heading_xf)
1032
    sheet.write(0, 29, "Sales History", heading_xf)
1033
 
1034
    sheet_iterator = 1
1035
    competitiveItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.COMPETITIVE).all()
1036
    for competitiveItem in competitiveItems:
1037
        amScraping =  competitiveItem[0]
1038
        item = competitiveItem[1]
1039
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1040
        if amScraping.warehouseLocation == 1:
1041
            sku = 'FBA'+str(amScraping.item_id)
1042
            loc = 'MUMBAI'
1043
        else:
1044
            sku = 'FBB'+str(amScraping.item_id)
1045
            loc = 'BANGLORE'
1046
        sheet.write(sheet_iterator, 1, sku)
1047
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1048
        sheet.write(sheet_iterator, 3, loc)
1049
        sheet.write(sheet_iterator, 4, item.brand)
1050
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1051
        sheet.write(sheet_iterator, 6, item.weight)
1052
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1053
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
1054
        sheet.write(sheet_iterator, 9, amScraping.ourTp)
1055
        sheet.write(sheet_iterator, 10, amScraping.lowestPossibleSp)
1056
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleTp)
1057
        if amScraping.ourRank > 3:
1058
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1059
        else:
1060
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1061
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
1062
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerName)
1063
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerSp)
1064
        sheet.write(sheet_iterator, 16, amScraping.secondLowestSellerName)
1065
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
1066
        sheet.write(sheet_iterator, 18, amScraping.thirdLowestSellerName)
1067
        sheet.write(sheet_iterator, 19, amScraping.thirdLowestSellerSp)
1068
        sheet.write(sheet_iterator, 20, amScraping.wanlc)
1069
        sheet.write(sheet_iterator, 21, amScraping.commission)
1070
        sheet.write(sheet_iterator, 22, amScraping.competitorCommission)
1071
        sheet.write(sheet_iterator, 23, amScraping.returnProvision)
1072
        sheet.write(sheet_iterator, 24, round(amScraping.ourTp - amScraping.lowestPossibleTp))
1073
        sheet.write(sheet_iterator, 25, item.risky)
1074
        sheet.write(sheet_iterator, 26, amScraping.proposedSp)
1075
        sheet.write(sheet_iterator, 27, amScraping.proposedTp)
1076
        sheet.write(sheet_iterator, 28, amScraping.avgSale)
1077
        sheet.write(sheet_iterator, 29, getOosString(saleMap.get(sku)))
1078
        sheet_iterator+=1
1079
 
1080
    sheet = wbk.add_sheet('Almost Competitive')
1081
    xstr = lambda s: s or ""
1082
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1083
 
1084
    excel_integer_format = '0'
1085
    integer_style = xlwt.XFStyle()
1086
    integer_style.num_format_str = excel_integer_format
1087
 
1088
    sheet.write(0, 0, "Item Id", heading_xf)
1089
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1090
    sheet.write(0, 2, "Asin", heading_xf)
1091
    sheet.write(0, 3, "Location", heading_xf)
1092
    sheet.write(0, 4, "Brand", heading_xf)
1093
    sheet.write(0, 5, "Product Name", heading_xf)
1094
    sheet.write(0, 6, "Weight", heading_xf)
1095
    sheet.write(0, 7, "Courier Cost", heading_xf)
1096
    sheet.write(0, 8, "Our SP", heading_xf)
1097
    sheet.write(0, 9, "Our Tp", heading_xf)
1098
    sheet.write(0, 10, "Lowest Possible SP", heading_xf)
1099
    sheet.write(0, 11, "Lowest Possible TP", heading_xf)
1100
    sheet.write(0, 12, "Rank", heading_xf)
1101
    sheet.write(0, 13, "Our Inventory", heading_xf)
1102
    sheet.write(0, 14, "Lowest Seller Name", heading_xf)
1103
    sheet.write(0, 15, "Lowest Seller SP", heading_xf)
1104
    sheet.write(0, 16, "Second Lowest Seller Name", heading_xf)
1105
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
1106
    sheet.write(0, 18, "Third Lowest Seller Name", heading_xf)
1107
    sheet.write(0, 19, "Third Lowest Seller SP", heading_xf)
1108
    sheet.write(0, 20, "WANLC", heading_xf)
1109
    sheet.write(0, 21, "Commission", heading_xf)
1110
    sheet.write(0, 22, "Competitor Commission", heading_xf)
1111
    sheet.write(0, 23, "Return Provision", heading_xf)
1112
    sheet.write(0, 24, "Margin", heading_xf)
1113
    sheet.write(0, 25, "Risky", heading_xf)
1114
    sheet.write(0, 26, "Proposed Sp", heading_xf)
1115
    sheet.write(0, 27, "Proposed Tp", heading_xf)
1116
    sheet.write(0, 28, "Avg Sale", heading_xf)
1117
    sheet.write(0, 29, "Sales History", heading_xf)
1118
 
1119
    sheet_iterator = 1
1120
    almostCompetitiveItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.ALMOST_COMPETE).all()
1121
    for almostCompetitiveItem in almostCompetitiveItems:
1122
        amScraping =  almostCompetitiveItem[0]
1123
        item = almostCompetitiveItem[1]
1124
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1125
        if amScraping.warehouseLocation == 1:
1126
            sku = 'FBA'+str(amScraping.item_id)
1127
            loc = 'MUMBAI'
1128
        else:
1129
            sku = 'FBB'+str(amScraping.item_id)
1130
            loc = 'BANGLORE'
1131
        sheet.write(sheet_iterator, 1, sku)
1132
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1133
        sheet.write(sheet_iterator, 3, loc)
1134
        sheet.write(sheet_iterator, 4, item.brand)
1135
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1136
        sheet.write(sheet_iterator, 6, item.weight)
1137
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1138
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
1139
        sheet.write(sheet_iterator, 9, amScraping.ourTp)
1140
        sheet.write(sheet_iterator, 10, amScraping.lowestPossibleSp)
1141
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleTp)
1142
        if amScraping.ourRank > 3:
1143
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1144
        else:
1145
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1146
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
1147
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerName)
1148
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerSp)
1149
        sheet.write(sheet_iterator, 16, amScraping.secondLowestSellerName)
1150
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
1151
        sheet.write(sheet_iterator, 18, amScraping.thirdLowestSellerName)
1152
        sheet.write(sheet_iterator, 19, amScraping.thirdLowestSellerSp)
1153
        sheet.write(sheet_iterator, 20, amScraping.wanlc)
1154
        sheet.write(sheet_iterator, 21, amScraping.commission)
1155
        sheet.write(sheet_iterator, 22, amScraping.competitorCommission)
1156
        sheet.write(sheet_iterator, 23, amScraping.returnProvision)
1157
        sheet.write(sheet_iterator, 24, round(amScraping.ourTp - amScraping.lowestPossibleTp))
1158
        sheet.write(sheet_iterator, 25, item.risky)
1159
        sheet.write(sheet_iterator, 26, amScraping.proposedSp)
1160
        sheet.write(sheet_iterator, 27, amScraping.proposedTp)
1161
        sheet.write(sheet_iterator, 28, amScraping.avgSale)
1162
        sheet.write(sheet_iterator, 29, getOosString(saleMap.get(sku)))
1163
        sheet_iterator+=1
1164
 
1165
    sheet = wbk.add_sheet('Among Cheapest')
1166
    xstr = lambda s: s or ""
1167
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1168
 
1169
    excel_integer_format = '0'
1170
    integer_style = xlwt.XFStyle()
1171
    integer_style.num_format_str = excel_integer_format
1172
 
1173
    sheet.write(0, 0, "Item Id", heading_xf)
1174
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1175
    sheet.write(0, 2, "Asin", heading_xf)
1176
    sheet.write(0, 3, "Location", heading_xf)
1177
    sheet.write(0, 4, "Brand", heading_xf)
1178
    sheet.write(0, 5, "Product Name", heading_xf)
1179
    sheet.write(0, 6, "Weight", heading_xf)
1180
    sheet.write(0, 7, "Courier Cost", heading_xf)
1181
    sheet.write(0, 8, "Our SP", heading_xf)
1182
    sheet.write(0, 9, "Our Tp", heading_xf)
1183
    sheet.write(0, 10, "Lowest Possible SP", heading_xf)
1184
    sheet.write(0, 11, "Lowest Possible TP", heading_xf)
1185
    sheet.write(0, 12, "Rank", heading_xf)
1186
    sheet.write(0, 13, "Our Inventory", heading_xf)
1187
    sheet.write(0, 14, "Lowest Seller Name", heading_xf)
1188
    sheet.write(0, 15, "Lowest Seller SP", heading_xf)
1189
    sheet.write(0, 16, "Second Lowest Seller Name", heading_xf)
1190
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
1191
    sheet.write(0, 18, "Third Lowest Seller Name", heading_xf)
1192
    sheet.write(0, 19, "Third Lowest Seller SP", heading_xf)
1193
    sheet.write(0, 20, "WANLC", heading_xf)
1194
    sheet.write(0, 21, "Commission", heading_xf)
1195
    sheet.write(0, 22, "Competitor Commission", heading_xf)
1196
    sheet.write(0, 23, "Return Provision", heading_xf)
1197
    sheet.write(0, 24, "Margin", heading_xf)
1198
    sheet.write(0, 25, "Risky", heading_xf)
1199
    sheet.write(0, 26, "Proposed Sp", heading_xf)
1200
    sheet.write(0, 27, "Proposed Tp", heading_xf)
1201
    sheet.write(0, 28, "Avg Sale", heading_xf)
1202
    sheet.write(0, 29, "Sales History", heading_xf)
1203
 
1204
    sheet_iterator = 1
1205
    amongCheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE).all()
1206
    for amongCheapestItem in amongCheapestItems:
1207
        amScraping =  amongCheapestItem[0]
1208
        item = amongCheapestItem[1]
1209
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1210
        if amScraping.warehouseLocation == 1:
1211
            sku = 'FBA'+str(amScraping.item_id)
1212
            loc = 'MUMBAI'
1213
        else:
1214
            sku = 'FBB'+str(amScraping.item_id)
1215
            loc = 'BANGLORE'
1216
        sheet.write(sheet_iterator, 1, sku)
1217
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1218
        sheet.write(sheet_iterator, 3, loc)
1219
        sheet.write(sheet_iterator, 4, item.brand)
1220
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1221
        sheet.write(sheet_iterator, 6, item.weight)
1222
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1223
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
1224
        sheet.write(sheet_iterator, 9, amScraping.ourTp)
1225
        sheet.write(sheet_iterator, 10, amScraping.lowestPossibleSp)
1226
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleTp)
1227
        if amScraping.ourRank > 3:
1228
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1229
        else:
1230
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1231
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
1232
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerName)
1233
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerSp)
1234
        sheet.write(sheet_iterator, 16, amScraping.secondLowestSellerName)
1235
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
1236
        sheet.write(sheet_iterator, 18, amScraping.thirdLowestSellerName)
1237
        sheet.write(sheet_iterator, 19, amScraping.thirdLowestSellerSp)
1238
        sheet.write(sheet_iterator, 20, amScraping.wanlc)
1239
        sheet.write(sheet_iterator, 21, amScraping.commission)
1240
        sheet.write(sheet_iterator, 22, amScraping.competitorCommission)
1241
        sheet.write(sheet_iterator, 23, amScraping.returnProvision)
1242
        sheet.write(sheet_iterator, 24, round(amScraping.ourTp - amScraping.lowestPossibleTp))
1243
        sheet.write(sheet_iterator, 25, item.risky)
1244
        sheet.write(sheet_iterator, 26, amScraping.proposedSp)
1245
        sheet.write(sheet_iterator, 27, amScraping.proposedTp)
1246
        sheet.write(sheet_iterator, 28, amScraping.avgSale)
1247
        sheet.write(sheet_iterator, 29, getOosString(saleMap.get(sku)))
1248
        sheet_iterator+=1
1249
 
1250
    sheet = wbk.add_sheet('Cheapest')
1251
    xstr = lambda s: s or ""
1252
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1253
 
1254
    excel_integer_format = '0'
1255
    integer_style = xlwt.XFStyle()
1256
    integer_style.num_format_str = excel_integer_format
1257
 
1258
    sheet.write(0, 0, "Item Id", heading_xf)
1259
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1260
    sheet.write(0, 2, "Asin", heading_xf)
1261
    sheet.write(0, 3, "Location", heading_xf)
1262
    sheet.write(0, 4, "Brand", heading_xf)
1263
    sheet.write(0, 5, "Product Name", heading_xf)
1264
    sheet.write(0, 6, "Weight", heading_xf)
1265
    sheet.write(0, 7, "Courier Cost", heading_xf)
1266
    sheet.write(0, 8, "Our SP", heading_xf)
1267
    sheet.write(0, 9, "Our Tp", heading_xf)
1268
    sheet.write(0, 10, "Lowest Possible SP", heading_xf)
1269
    sheet.write(0, 11, "Lowest Possible TP", heading_xf)
1270
    sheet.write(0, 12, "Rank", heading_xf)
1271
    sheet.write(0, 13, "Our Inventory", heading_xf)
1272
    sheet.write(0, 14, "Lowest Seller Name", heading_xf)
1273
    sheet.write(0, 15, "Lowest Seller SP", heading_xf)
1274
    sheet.write(0, 16, "Second Lowest Seller Name", heading_xf)
1275
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
1276
    sheet.write(0, 18, "Third Lowest Seller Name", heading_xf)
1277
    sheet.write(0, 19, "Third Lowest Seller SP", heading_xf)
1278
    sheet.write(0, 20, "WANLC", heading_xf)
1279
    sheet.write(0, 21, "Commission", heading_xf)
1280
    sheet.write(0, 22, "Competitor Commission", heading_xf)
1281
    sheet.write(0, 23, "Return Provision", heading_xf)
1282
    sheet.write(0, 24, "Margin", heading_xf)
1283
    sheet.write(0, 25, "Risky", heading_xf)
1284
    sheet.write(0, 26, "Proposed Sp", heading_xf)
1285
    sheet.write(0, 27, "Proposed Tp", heading_xf)
1286
    sheet.write(0, 28, "Margin Increased Potential", heading_xf)
1287
    sheet.write(0, 29, "Avg Sale", heading_xf)
1288
    sheet.write(0, 30, "Sales History", heading_xf)
1289
 
1290
    sheet_iterator = 1
1291
    cheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.BUY_BOX).all()
1292
    for cheapestItem in cheapestItems:
1293
        amScraping =  cheapestItem[0]
1294
        item = cheapestItem[1]
1295
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1296
        if amScraping.warehouseLocation == 1:
1297
            sku = 'FBA'+str(amScraping.item_id)
1298
            loc = 'MUMBAI'
1299
        else:
1300
            sku = 'FBB'+str(amScraping.item_id)
1301
            loc = 'BANGLORE'
1302
        sheet.write(sheet_iterator, 1, sku)
1303
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1304
        sheet.write(sheet_iterator, 3, loc)
1305
        sheet.write(sheet_iterator, 4, item.brand)
1306
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1307
        sheet.write(sheet_iterator, 6, item.weight)
1308
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1309
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
1310
        sheet.write(sheet_iterator, 9, amScraping.ourTp)
1311
        sheet.write(sheet_iterator, 10, amScraping.lowestPossibleSp)
1312
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleTp)
1313
        if amScraping.ourRank > 3:
1314
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1315
        else:
1316
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1317
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
1318
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerName)
1319
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerSp)
1320
        sheet.write(sheet_iterator, 16, amScraping.secondLowestSellerName)
1321
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
1322
        sheet.write(sheet_iterator, 18, amScraping.thirdLowestSellerName)
1323
        sheet.write(sheet_iterator, 19, amScraping.thirdLowestSellerSp)
1324
        sheet.write(sheet_iterator, 20, amScraping.wanlc)
1325
        sheet.write(sheet_iterator, 21, amScraping.commission)
1326
        sheet.write(sheet_iterator, 22, amScraping.competitorCommission)
1327
        sheet.write(sheet_iterator, 23, amScraping.returnProvision)
1328
        sheet.write(sheet_iterator, 24, round(amScraping.ourTp - amScraping.lowestPossibleTp))
1329
        sheet.write(sheet_iterator, 25, item.risky)
1330
        sheet.write(sheet_iterator, 26, amScraping.proposedSp)
1331
        sheet.write(sheet_iterator, 27, amScraping.proposedTp)
1332
        sheet.write(sheet_iterator, 28, amScraping.marginIncreasedPotential)
1333
        sheet.write(sheet_iterator, 29, amScraping.avgSale)
1334
        sheet.write(sheet_iterator, 30, getOosString(saleMap.get(sku)))
1335
        sheet_iterator+=1
1336
 
1337
    sheet = wbk.add_sheet('Negative Margin')
1338
    xstr = lambda s: s or ""
1339
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1340
 
1341
    excel_integer_format = '0'
1342
    integer_style = xlwt.XFStyle()
1343
    integer_style.num_format_str = excel_integer_format
1344
 
1345
    sheet.write(0, 0, "Item Id", heading_xf)
1346
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1347
    sheet.write(0, 2, "Asin", heading_xf)
1348
    sheet.write(0, 3, "Location", heading_xf)
1349
    sheet.write(0, 4, "Brand", heading_xf)
1350
    sheet.write(0, 5, "Product Name", heading_xf)
1351
    sheet.write(0, 6, "Weight", heading_xf)
1352
    sheet.write(0, 7, "Courier Cost", heading_xf)
1353
    sheet.write(0, 8, "Our SP", heading_xf)
1354
    sheet.write(0, 9, "Our Tp", heading_xf)
1355
    sheet.write(0, 10, "Lowest Possible SP", heading_xf)
1356
    sheet.write(0, 11, "Lowest Possible TP", heading_xf)
1357
    sheet.write(0, 12, "Rank", heading_xf)
1358
    sheet.write(0, 13, "Our Inventory", heading_xf)
1359
    sheet.write(0, 14, "Lowest Seller Name", heading_xf)
1360
    sheet.write(0, 15, "Lowest Seller SP", heading_xf)
1361
    sheet.write(0, 16, "Second Lowest Seller Name", heading_xf)
1362
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
1363
    sheet.write(0, 18, "Third Lowest Seller Name", heading_xf)
1364
    sheet.write(0, 19, "Third Lowest Seller SP", heading_xf)
1365
    sheet.write(0, 20, "WANLC", heading_xf)
1366
    sheet.write(0, 21, "Commission", heading_xf)
1367
    sheet.write(0, 22, "Competitor Commission", heading_xf)
1368
    sheet.write(0, 23, "Return Provision", heading_xf)
1369
    sheet.write(0, 24, "Margin", heading_xf)
1370
    sheet.write(0, 25, "Avg Sale", heading_xf)
1371
    sheet.write(0, 26, "Sales History", heading_xf)
1372
 
1373
    sheet_iterator = 1
1374
    amongCheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE).all()
1375
    for amongCheapestItem in amongCheapestItems:
1376
        amScraping =  amongCheapestItem[0]
1377
        item = amongCheapestItem[1]
1378
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1379
        if amScraping.warehouseLocation == 1:
1380
            sku = 'FBA'+str(amScraping.item_id)
1381
            loc = 'MUMBAI'
1382
        else:
1383
            sku = 'FBB'+str(amScraping.item_id)
1384
            loc = 'BANGLORE'
1385
        sheet.write(sheet_iterator, 1, sku)
1386
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1387
        sheet.write(sheet_iterator, 3, loc)
1388
        sheet.write(sheet_iterator, 4, item.brand)
1389
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1390
        sheet.write(sheet_iterator, 6, item.weight)
1391
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1392
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
1393
        sheet.write(sheet_iterator, 9, amScraping.ourTp)
1394
        sheet.write(sheet_iterator, 10, amScraping.lowestPossibleSp)
1395
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleTp)
1396
        if amScraping.ourRank > 3:
1397
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1398
        else:
1399
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1400
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
1401
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerName)
1402
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerSp)
1403
        sheet.write(sheet_iterator, 16, amScraping.secondLowestSellerName)
1404
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
1405
        sheet.write(sheet_iterator, 18, amScraping.thirdLowestSellerName)
1406
        sheet.write(sheet_iterator, 19, amScraping.thirdLowestSellerSp)
1407
        sheet.write(sheet_iterator, 20, amScraping.wanlc)
1408
        sheet.write(sheet_iterator, 21, amScraping.commission)
1409
        sheet.write(sheet_iterator, 22, amScraping.competitorCommission)
1410
        sheet.write(sheet_iterator, 23, amScraping.returnProvision)
1411
        sheet.write(sheet_iterator, 24, round(amScraping.ourTp - amScraping.lowestPossibleTp))
1412
        sheet.write(sheet_iterator, 25, amScraping.avgSale)
1413
        sheet.write(sheet_iterator, 26, getOosString(saleMap.get(sku)))
1414
        sheet_iterator+=1
1415
 
1416
    sheet = wbk.add_sheet('Exception List')
1417
    xstr = lambda s: s or ""
1418
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1419
 
1420
    excel_integer_format = '0'
1421
    integer_style = xlwt.XFStyle()
1422
    integer_style.num_format_str = excel_integer_format
1423
 
1424
    sheet.write(0, 0, "Item Id", heading_xf)
1425
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1426
    sheet.write(0, 2, "Asin", heading_xf)
1427
    sheet.write(0, 3, "Location", heading_xf)
1428
    sheet.write(0, 4, "Brand", heading_xf)
1429
    sheet.write(0, 5, "Product Name", heading_xf)
1430
    sheet.write(0, 6, "Reason", heading_xf)
1431
 
1432
    sheet_iterator = 1
1433
    amongCheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE).all()
1434
    for amongCheapestItem in amongCheapestItems:
1435
        amScraping =  amongCheapestItem[0]
1436
        item = amongCheapestItem[1]
1437
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1438
        if amScraping.warehouseLocation == 1:
1439
            sku = 'FBA'+str(amScraping.item_id)
1440
            loc = 'MUMBAI'
1441
        else:
1442
            sku = 'FBB'+str(amScraping.item_id)
1443
            loc = 'BANGLORE'
1444
        sheet.write(sheet_iterator, 1, sku)
1445
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1446
        sheet.write(sheet_iterator, 3, loc)
1447
        sheet.write(sheet_iterator, 4, item.brand)
1448
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1449
        sheet.write(sheet_iterator, 6, amScraping.reason)
1450
        sheet_iterator+=1      
1451
 
1452
    filename = "/tmp/amazon-scraping.xls"
1453
    wbk.save(filename)
1454
 
12363 kshitij.so 1455
def main():
1456
    parser = optparse.OptionParser()
1457
    parser.add_option("-t", "--type", dest="runType",
1458
                   default="FULL", type="string",
1459
                   help="Run type FULL or FAVOURITE")
1460
    (options, args) = parser.parse_args()
1461
    if options.runType not in ('FULL','FAVOURITE'):
1462
        print "Run type argument illegal."
1463
        sys.exit(1)
1464
    time.sleep(5)
1465
    timestamp = datetime.now()
1466
    syncAsin()
1467
    fetchFbaSale()
1468
    itemInfo = populateStuff(timestamp,options.runType)
1469
    itemsToPopulate = 0
12370 kshitij.so 1470
    print len(itemInfo)
12363 kshitij.so 1471
    while (len(itemInfo)>0):
12399 kshitij.so 1472
        if len(itemInfo) > 50:
1473
            itemsToPopulate = 50
12363 kshitij.so 1474
        else:
1475
            itemsToPopulate = len(itemInfo)
12370 kshitij.so 1476
        print itemsToPopulate
12363 kshitij.so 1477
        exceptionList, negativeMargin, cheapest, amongCheapestAndCanCompete, canCompete, almostCompete, cantCompete = decideCategory(itemInfo[0:itemsToPopulate])
1478
        itemInfo[0:itemsToPopulate] = []
1479
        commitExceptionList(exceptionList,timestamp,options.runType)
1480
        commitNegativeMargin(negativeMargin,timestamp,options.runType)
1481
        commitCheapest(cheapest,timestamp,options.runType)
1482
        commitAmongCheapestAndCanCompete(amongCheapestAndCanCompete,timestamp,options.runType)
1483
        commitCanCompete(canCompete,timestamp,options.runType)
1484
        commitAlmostCompete(almostCompete,timestamp,options.runType)
1485
        commitCantCompete(cantCompete, timestamp,options.runType)
12396 kshitij.so 1486
        exceptionList[:], negativeMargin[:], cheapest[:], amongCheapestAndCanCompete[:], canCompete[:], almostCompete[:], cantCompete[:] =[],[],[],[],[],[],[]
1487
    autoDecreaseItems = fetchItemsForAutoDecrease(timestamp)
1488
    autoIncreaseItems = fetchItemsForAutoIncrease(timestamp)
1489
    previousAutoFav, nowAutoFav = markAutoFavourites(timestamp)
1490
    writeReport(timestamp,autoDecreaseItems,autoIncreaseItems,previousAutoFav,nowAutoFav)
12363 kshitij.so 1491
if __name__=='__main__':
1492
    main()