Subversion Repositories SmartDukaan

Rev

Rev 12404 | Rev 12413 | 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
    itemInfo[:]=[]
571
    return exceptionList, negativeMargin, cheapest, amongCheapestAndCanCompete, canCompete, almostCompete, cantCompete
12396 kshitij.so 572
 
12363 kshitij.so 573
def getOurTp(amazonDetails,val,spm):
574
    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));
575
    return round(ourTp,2)
576
 
577
def getLowestPossibleTp(amazonDetails,val,spm):
578
    vat = (amazonDetails.ourSp/(1+(val.vatRate/100))-(val.nlc/(1+(val.vatRate/100))))*(val.vatRate/100)
579
    inHouseCost = 15+vat+(spm.returnProvision/100)*amazonDetails.ourSp
580
    lowest_possible_tp = val.nlc+inHouseCost
581
    return round(lowest_possible_tp,2)
582
 
583
def getLowestPossibleSp(amazonDetails,val,spm):
584
    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));
585
    return round(lowestPossibleSp,2)
586
 
587
def getTargetTp(targetSp,spm,val):
588
    targetTp = targetSp- targetSp*(spm.commission/100+spm.emiFee/100)*(1+(spm.serviceTax/100))-(val.courierCost)*(1+(val.serviceTax/100))
589
    return round(targetTp,2)
590
 
591
def commitExceptionList(exceptionList,timestamp,runType):
592
    for exceptionItem in exceptionList:
593
        val = exceptionItem[0]
594
        reason = exceptionItem[1]
595
        amazonScrapingHistory = AmazonScrapingHistory()
596
        amazonScrapingHistory.item_id = val.sku[3:]
597
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 598
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 599
        amazonScrapingHistory.reason = reason
600
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
601
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.EXCEPTION
602
        amazonScrapingHistory.timestamp = timestamp
603
    session.commit()
604
 
605
def commitNegativeMargin(negativeMargin,timestamp,runType):
606
    for negativeMarginItem in negativeMargin:
607
        val = negativeMarginItem[0]
608
        amDetails = negativeMarginItem[1]
609
        amPricing = negativeMarginItem[2]
610
        spm = val.sourcePercentage
611
        amazonScrapingHistory = AmazonScrapingHistory()
612
        amazonScrapingHistory.item_id = val.sku[3:]
613
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 614
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 615
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
616
        amazonScrapingHistory.ourTp = amPricing.ourTp
617
        amazonScrapingHistory.lowestPossibleTp = amPricing.lowestPossibleTp
618
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
619
        amazonScrapingHistory.ourRank = amDetails.ourRank
620
        amazonScrapingHistory.ourInventory = val.ourInventory
621
        amazonScrapingHistory.lowestSellerName = amDetails.lowestSellerName
622
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
623
        amazonScrapingHistory.secondLowestSellerName = amDetails.secondLowestSellerName
624
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
625
        amazonScrapingHistory.thirdLowestSellerName = amDetails.thirdLowestSellerName
626
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
627
        amazonScrapingHistory.wanlc = val.nlc
628
        amazonScrapingHistory.commission = spm.commission
629
        amazonScrapingHistory.competitorCommission = spm.competitorCommission
630
        amazonScrapingHistory.returnProvision = spm.returnProvision
631
        amazonScrapingHistory.courierCost = val.courierCost
632
        amazonScrapingHistory.risky = val.risky
633
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
634
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
635
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.NEGATIVE_MARGIN
636
        amazonScrapingHistory.timestamp = timestamp
637
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
638
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
639
    session.commit()
640
 
641
 
642
def commitCheapest(cheapest,timestamp,runType):
643
    for cheapestItem in cheapest:
644
        val = cheapestItem[0]
645
        amDetails = cheapestItem[1]
646
        amPricing = cheapestItem[2]
647
        spm = val.sourcePercentage
648
        amazonScrapingHistory = AmazonScrapingHistory()
649
        amazonScrapingHistory.item_id = val.sku[3:]
650
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 651
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 652
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
653
        amazonScrapingHistory.ourTp = amPricing.ourTp
654
        amazonScrapingHistory.lowestPossibleTp = amPricing.lowestPossibleTp
655
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
656
        amazonScrapingHistory.ourRank = amDetails.ourRank
657
        amazonScrapingHistory.ourInventory = val.ourInventory
658
        amazonScrapingHistory.lowestSellerName = amDetails.lowestSellerName
659
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
660
        amazonScrapingHistory.secondLowestSellerName = amDetails.secondLowestSellerName
661
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
662
        amazonScrapingHistory.thirdLowestSellerName = amDetails.thirdLowestSellerName
663
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
664
        amazonScrapingHistory.wanlc = val.nlc
665
        amazonScrapingHistory.commission = spm.commission
666
        amazonScrapingHistory.competitorCommission = spm.competitorCommission
667
        amazonScrapingHistory.returnProvision = spm.returnProvision
668
        amazonScrapingHistory.courierCost = val.courierCost
669
        amazonScrapingHistory.risky = val.risky
670
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
671
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
672
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.BUY_BOX
673
        amazonScrapingHistory.timestamp = timestamp
674
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
675
        if amDetails.secondLowestSellerName!='Saholic':
676
            competitorSp = amDetails.secondLowestSellerSp
677
        else:
678
            competitorSp = amDetails.thirdLowestSellerSp
679
        proposed_sp = max(competitorSp - max((20, competitorSp*0.002)), amPricing.lowestPossibleSp)
680
        proposed_tp = getTargetTp(proposed_sp,spm,val)
681
        amazonScrapingHistory.proposedSp = proposed_sp
682
        amazonScrapingHistory.proposedTp = proposed_tp
683
        amazonScrapingHistory.marginIncreasedPotential = proposed_tp - amPricing.ourTp
684
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
685
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
686
    session.commit()
687
 
688
 
689
 
690
def commitAmongCheapestAndCanCompete(amongCheapestAndCanCompete,timestamp,runType):
691
    for amongCheapestAndCanCompeteItem in amongCheapestAndCanCompete:
692
        val = amongCheapestAndCanCompeteItem[0]
693
        amDetails = amongCheapestAndCanCompeteItem[1]
694
        amPricing = amongCheapestAndCanCompeteItem[2]
695
        spm = val.sourcePercentage
696
        amazonScrapingHistory = AmazonScrapingHistory()
697
        amazonScrapingHistory.item_id = val.sku[3:]
698
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 699
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 700
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
701
        amazonScrapingHistory.ourTp = amPricing.ourTp
702
        amazonScrapingHistory.lowestPossibleTp = amPricing.lowestPossibleTp
703
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
704
        amazonScrapingHistory.ourRank = amDetails.ourRank
705
        amazonScrapingHistory.ourInventory = val.ourInventory
706
        amazonScrapingHistory.lowestSellerName = amDetails.lowestSellerName
707
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
708
        amazonScrapingHistory.secondLowestSellerName = amDetails.secondLowestSellerName
709
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
710
        amazonScrapingHistory.thirdLowestSellerName = amDetails.thirdLowestSellerName
711
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
712
        amazonScrapingHistory.wanlc = val.nlc
713
        amazonScrapingHistory.commission = spm.commission
714
        amazonScrapingHistory.competitorCommission = spm.competitorCommission
715
        amazonScrapingHistory.returnProvision = spm.returnProvision
716
        amazonScrapingHistory.courierCost = val.courierCost
717
        amazonScrapingHistory.risky = val.risky
718
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
719
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
720
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE
721
        amazonScrapingHistory.timestamp = timestamp
722
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
723
        proposed_sp = max(amDetails.lowestSellerSp - max((5, amDetails.lowestSellerSp*0.001)), amPricing.lowestPossibleSp)
724
        proposed_tp = getTargetTp(proposed_sp,spm,val)
725
        amazonScrapingHistory.proposedSp = proposed_sp
726
        amazonScrapingHistory.proposedTp = proposed_tp
727
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
728
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
729
    session.commit()
730
 
731
def commitCanCompete(canCompete,timestamp,runType):
732
    for canCompeteItem in canCompete:
733
        val = canCompeteItem[0]
734
        amDetails = canCompeteItem[1]
735
        amPricing = canCompeteItem[2]
736
        spm = val.sourcePercentage
737
        amazonScrapingHistory = AmazonScrapingHistory()
738
        amazonScrapingHistory.item_id = val.sku[3:]
739
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 740
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 741
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
742
        amazonScrapingHistory.ourTp = amPricing.ourTp
743
        amazonScrapingHistory.lowestPossibleTp = amPricing.lowestPossibleTp
744
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
745
        amazonScrapingHistory.ourRank = amDetails.ourRank
746
        amazonScrapingHistory.ourInventory = val.ourInventory
747
        amazonScrapingHistory.lowestSellerName = amDetails.lowestSellerName
748
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
749
        amazonScrapingHistory.secondLowestSellerName = amDetails.secondLowestSellerName
750
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
751
        amazonScrapingHistory.thirdLowestSellerName = amDetails.thirdLowestSellerName
752
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
753
        amazonScrapingHistory.wanlc = val.nlc
754
        amazonScrapingHistory.commission = spm.commission
755
        amazonScrapingHistory.competitorCommission = spm.competitorCommission
756
        amazonScrapingHistory.returnProvision = spm.returnProvision
757
        amazonScrapingHistory.courierCost = val.courierCost
758
        amazonScrapingHistory.risky = val.risky
759
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
760
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
761
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.COMPETITIVE
762
        amazonScrapingHistory.timestamp = timestamp
763
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
764
        proposed_sp = max(amDetails.lowestSellerSp - max((5, amDetails.lowestSellerSp*0.001)), amPricing.lowestPossibleSp)
765
        proposed_tp = getTargetTp(proposed_sp,spm,val)
766
        amazonScrapingHistory.proposedSp = proposed_sp
767
        amazonScrapingHistory.proposedTp = proposed_tp
768
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
769
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
770
    session.commit()
771
 
12383 kshitij.so 772
def commitAlmostCompete(almostCompete,timestamp,runType):
12396 kshitij.so 773
    for almostCompeteItem in almostCompete:
774
        val = almostCompeteItem[0]
775
        amDetails = almostCompeteItem[1]
776
        amPricing = almostCompeteItem[2]
777
        spm = val.sourcePercentage
778
        amazonScrapingHistory = AmazonScrapingHistory()
779
        amazonScrapingHistory.item_id = val.sku[3:]
780
        amazonScrapingHistory.warehouseLocation = val.state_id
781
        amazonScrapingHistory.parentCategoryId = val.parent_category
782
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
783
        amazonScrapingHistory.ourTp = amPricing.ourTp
784
        amazonScrapingHistory.lowestPossibleTp = amPricing.lowestPossibleTp
785
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
786
        amazonScrapingHistory.ourRank = amDetails.ourRank
787
        amazonScrapingHistory.ourInventory = val.ourInventory
788
        amazonScrapingHistory.lowestSellerName = amDetails.lowestSellerName
789
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
790
        amazonScrapingHistory.secondLowestSellerName = amDetails.secondLowestSellerName
791
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
792
        amazonScrapingHistory.thirdLowestSellerName = amDetails.thirdLowestSellerName
793
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
794
        amazonScrapingHistory.wanlc = val.nlc
795
        amazonScrapingHistory.commission = spm.commission
796
        amazonScrapingHistory.competitorCommission = spm.competitorCommission
797
        amazonScrapingHistory.returnProvision = spm.returnProvision
798
        amazonScrapingHistory.courierCost = val.courierCost
799
        amazonScrapingHistory.risky = val.risky
800
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
801
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
802
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.ALMOST_COMPETE
803
        amazonScrapingHistory.timestamp = timestamp
804
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
805
        proposed_sp = min(amDetails.lowestSellerSp(1+.01),amPricing.lowestPossibleSp)
806
        proposed_tp = getTargetTp(proposed_sp,spm,val)
807
        target_nlc = proposed_tp - amPricing.lowestPossibleTp + val.nlc
808
        amazonScrapingHistory.proposedSp = proposed_sp
809
        amazonScrapingHistory.proposedTp = proposed_tp
810
        amazonScrapingHistory.targetNlc = target_nlc
811
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
812
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
813
    session.commit()
12363 kshitij.so 814
 
12396 kshitij.so 815
 
12363 kshitij.so 816
def commitCantCompete(cantCompete, timestamp,runType):
817
    for cantCompeteItem in cantCompete:
818
        val = cantCompeteItem[0]
819
        amDetails = cantCompeteItem[1]
820
        amPricing = cantCompeteItem[2]
821
        spm = val.sourcePercentage
822
        amazonScrapingHistory = AmazonScrapingHistory()
823
        amazonScrapingHistory.item_id = val.sku[3:]
824
        amazonScrapingHistory.warehouseLocation = val.state_id
12396 kshitij.so 825
        amazonScrapingHistory.parentCategoryId = val.parent_category
12363 kshitij.so 826
        amazonScrapingHistory.ourSellingPrice = amDetails.ourSp
827
        amazonScrapingHistory.ourTp = amPricing.ourTp
828
        amazonScrapingHistory.lowestPossibleTp = amPricing.lowestPossibleTp
829
        amazonScrapingHistory.lowestPossibleSp = amPricing.lowestPossibleSp
830
        amazonScrapingHistory.ourRank = amDetails.ourRank
831
        amazonScrapingHistory.ourInventory = val.ourInventory
832
        amazonScrapingHistory.lowestSellerName = amDetails.lowestSellerName
833
        amazonScrapingHistory.lowestSellerSp = amDetails.lowestSellerSp
834
        amazonScrapingHistory.secondLowestSellerName = amDetails.secondLowestSellerName
835
        amazonScrapingHistory.secondLowestSellerSp = amDetails.secondLowestSellerSp
836
        amazonScrapingHistory.thirdLowestSellerName = amDetails.thirdLowestSellerName
837
        amazonScrapingHistory.thirdLowestSellerSp = amDetails.thirdLowestSellerSp
838
        amazonScrapingHistory.wanlc = val.nlc
839
        amazonScrapingHistory.commission = spm.commission
840
        amazonScrapingHistory.competitorCommission = spm.competitorCommission
841
        amazonScrapingHistory.returnProvision = spm.returnProvision
842
        amazonScrapingHistory.courierCost = val.courierCost
843
        amazonScrapingHistory.risky = val.risky
844
        amazonScrapingHistory.runType = RunType._NAMES_TO_VALUES.get(runType)
845
        amazonScrapingHistory.totalSeller = amDetails.totalSeller
846
        amazonScrapingHistory.competitiveCategory = CompetitionCategory.CANT_COMPETE
847
        amazonScrapingHistory.timestamp = timestamp
848
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
849
        proposed_sp = amDetails.lowestSellerSp - max(5, amDetails.lowestSellerSp*0.001)
850
        proposed_tp = getTargetTp(proposed_sp,spm,val)
851
        target_nlc = proposed_tp - amPricing.lowestPossibleTp + val.nlc
852
        amazonScrapingHistory.proposedSp = proposed_sp
853
        amazonScrapingHistory.proposedTp = proposed_tp
854
        amazonScrapingHistory.targetNlc = target_nlc
855
        amazonScrapingHistory.multipleListings = amDetails.multipleListings
856
        amazonScrapingHistory.avgSale = calculateAverageSale(val.sku) #Last five days
857
    session.commit()
858
 
12396 kshitij.so 859
def markAutoFavourites(time):
860
    nowAutoFav = []
861
    previouslyAutoFav = []
862
    stockList = []
863
    saleList = []
864
    items = session.query(func.sum(AmazonScrapingHistory.ourInventory),AmazonScrapingHistory.item_id).group_by(AmazonScrapingHistory.item_id).all()
865
    allItems = session.query(Amazonlisted).all()
866
    for item in items:
867
        reason = ""
868
        if item[0]>=5:
869
            stockList.append(item[1])
870
 
871
    for sku, val in saleMap.iteritems():
872
        totalSale = 0
873
        item_id = sku.replace('FBA','').replace('FBB','')
874
        val =saleMap.get('FBA'+str(item_id))
875
        if val is not None:
876
            for sale in val:
877
                totalSale += sale.totalOrderCount
878
        val =saleMap.get('FBB'+str(item_id))
879
        if val is not None:
880
            for sale in val:
881
                totalSale += sale.totalOrderCount
882
        if totalSale > 0:
883
            saleList.append(item_id)
884
 
885
    for aItem in allItems:
886
        reason = ""
887
        toMark = False
888
        if aItem.itemId in saleList:
889
            toMark = True
890
            reason+="Total FC sale is greater than 1 for last five days.."
891
        if aItem.itemId in stockList:
892
            toMark = True
893
            reason+="Item is present in buy box in last 3 days"
894
        if not aItem.autoFavourite:
895
            print "Item is not under auto favourite"
896
        if toMark:
897
            temp=[]
898
            temp.append(aItem.itemId)
899
            temp.append(reason)
900
            nowAutoFav.append(temp)
901
        if (not toMark) and aItem.autoFavourite:
902
            previouslyAutoFav.append(aItem.itemId)
903
        aItem.autoFavourite = toMark
904
    session.commit()
905
    return previouslyAutoFav, nowAutoFav
906
 
907
def writeReport(timestamp,autoDecreaseItems,autoIncreaseItems,previousAutoFav,nowAutoFav):
908
    wbk = xlwt.Workbook()
909
    sheet = wbk.add_sheet('Can\'t Compete')
910
    xstr = lambda s: s or ""
911
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
912
 
913
    excel_integer_format = '0'
914
    integer_style = xlwt.XFStyle()
915
    integer_style.num_format_str = excel_integer_format
916
 
917
    sheet.write(0, 0, "Item Id", heading_xf)
918
    sheet.write(0, 1, "Amazon Sku", heading_xf)
919
    sheet.write(0, 2, "Asin", heading_xf)
920
    sheet.write(0, 3, "Location", heading_xf)
921
    sheet.write(0, 4, "Brand", heading_xf)
922
    sheet.write(0, 5, "Product Name", heading_xf)
923
    sheet.write(0, 6, "Weight", heading_xf)
924
    sheet.write(0, 7, "Courier Cost", heading_xf)
925
    sheet.write(0, 8, "Our SP", heading_xf)
926
    sheet.write(0, 9, "Our Tp", heading_xf)
927
    sheet.write(0, 10, "Lowest Possible SP", heading_xf)
928
    sheet.write(0, 11, "Lowest Possible TP", heading_xf)
929
    sheet.write(0, 12, "Rank", heading_xf)
930
    sheet.write(0, 13, "Our Inventory", heading_xf)
931
    sheet.write(0, 14, "Lowest Seller Name", heading_xf)
932
    sheet.write(0, 15, "Lowest Seller SP", heading_xf)
933
    sheet.write(0, 16, "Second Lowest Seller Name", heading_xf)
934
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
935
    sheet.write(0, 18, "Third Lowest Seller Name", heading_xf)
936
    sheet.write(0, 19, "Third Lowest Seller SP", heading_xf)
937
    sheet.write(0, 20, "WANLC", heading_xf)
938
    sheet.write(0, 21, "Commission", heading_xf)
939
    sheet.write(0, 22, "Competitor Commission", heading_xf)
940
    sheet.write(0, 23, "Return Provision", heading_xf)
941
    sheet.write(0, 24, "Margin", heading_xf)
942
    sheet.write(0, 25, "Risky", heading_xf)
943
    sheet.write(0, 26, "Proposed Sp", heading_xf)
944
    sheet.write(0, 27, "Proposed Tp", heading_xf)
945
    sheet.write(0, 28, "Target Nlc", heading_xf)
946
    sheet.write(0, 29, "Avg Sale", heading_xf)
947
    sheet.write(0, 30, "Sales History", heading_xf)
948
 
949
    sheet_iterator = 1
950
    cantCompeteItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.CANT_COMPETE).all()
951
    for cantCompeteItem in cantCompeteItems:
952
        amScraping =  cantCompeteItem[0]
953
        item = cantCompeteItem[1]
954
        sheet.write(sheet_iterator, 0, amScraping.item_id)
955
        if amScraping.warehouseLocation == 1:
956
            sku = 'FBA'+str(amScraping.item_id)
957
            loc = 'MUMBAI'
958
        else:
959
            sku = 'FBB'+str(amScraping.item_id)
960
            loc = 'BANGLORE'
961
        sheet.write(sheet_iterator, 1, sku)
962
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
963
        sheet.write(sheet_iterator, 3, loc)
964
        sheet.write(sheet_iterator, 4, item.brand)
965
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
966
        sheet.write(sheet_iterator, 6, item.weight)
967
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
968
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
969
        sheet.write(sheet_iterator, 9, amScraping.ourTp)
970
        sheet.write(sheet_iterator, 10, amScraping.lowestPossibleSp)
971
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleTp)
972
        if amScraping.ourRank > 3:
973
            sheet.write(sheet_iterator, 12, 'Greater than 3')
974
        else:
975
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
976
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
977
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerName)
978
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerSp)
979
        sheet.write(sheet_iterator, 16, amScraping.secondLowestSellerName)
980
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
981
        sheet.write(sheet_iterator, 18, amScraping.thirdLowestSellerName)
982
        sheet.write(sheet_iterator, 19, amScraping.thirdLowestSellerSp)
983
        sheet.write(sheet_iterator, 20, amScraping.wanlc)
984
        sheet.write(sheet_iterator, 21, amScraping.commission)
985
        sheet.write(sheet_iterator, 22, amScraping.competitorCommission)
986
        sheet.write(sheet_iterator, 23, amScraping.returnProvision)
987
        sheet.write(sheet_iterator, 24, round(amScraping.ourTp - amScraping.lowestPossibleTp))
988
        sheet.write(sheet_iterator, 25, item.risky)
989
        sheet.write(sheet_iterator, 26, amScraping.proposedSp)
990
        sheet.write(sheet_iterator, 27, amScraping.proposedTp)
991
        sheet.write(sheet_iterator, 28, amScraping.targetNlc)
992
        sheet.write(sheet_iterator, 29, amScraping.avgSale)
993
        sheet.write(sheet_iterator, 30, getOosString(saleMap.get(sku)))
994
        sheet_iterator+=1
995
 
996
    sheet = wbk.add_sheet('Competitive')
997
    xstr = lambda s: s or ""
998
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
999
 
1000
    excel_integer_format = '0'
1001
    integer_style = xlwt.XFStyle()
1002
    integer_style.num_format_str = excel_integer_format
1003
 
1004
    sheet.write(0, 0, "Item Id", heading_xf)
1005
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1006
    sheet.write(0, 2, "Asin", heading_xf)
1007
    sheet.write(0, 3, "Location", heading_xf)
1008
    sheet.write(0, 4, "Brand", heading_xf)
1009
    sheet.write(0, 5, "Product Name", heading_xf)
1010
    sheet.write(0, 6, "Weight", heading_xf)
1011
    sheet.write(0, 7, "Courier Cost", heading_xf)
1012
    sheet.write(0, 8, "Our SP", heading_xf)
1013
    sheet.write(0, 9, "Our Tp", heading_xf)
1014
    sheet.write(0, 10, "Lowest Possible SP", heading_xf)
1015
    sheet.write(0, 11, "Lowest Possible TP", heading_xf)
1016
    sheet.write(0, 12, "Rank", heading_xf)
1017
    sheet.write(0, 13, "Our Inventory", heading_xf)
1018
    sheet.write(0, 14, "Lowest Seller Name", heading_xf)
1019
    sheet.write(0, 15, "Lowest Seller SP", heading_xf)
1020
    sheet.write(0, 16, "Second Lowest Seller Name", heading_xf)
1021
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
1022
    sheet.write(0, 18, "Third Lowest Seller Name", heading_xf)
1023
    sheet.write(0, 19, "Third Lowest Seller SP", heading_xf)
1024
    sheet.write(0, 20, "WANLC", heading_xf)
1025
    sheet.write(0, 21, "Commission", heading_xf)
1026
    sheet.write(0, 22, "Competitor Commission", heading_xf)
1027
    sheet.write(0, 23, "Return Provision", heading_xf)
1028
    sheet.write(0, 24, "Margin", heading_xf)
1029
    sheet.write(0, 25, "Risky", heading_xf)
1030
    sheet.write(0, 26, "Proposed Sp", heading_xf)
1031
    sheet.write(0, 27, "Proposed Tp", heading_xf)
1032
    sheet.write(0, 28, "Avg Sale", heading_xf)
1033
    sheet.write(0, 29, "Sales History", heading_xf)
1034
 
1035
    sheet_iterator = 1
1036
    competitiveItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.COMPETITIVE).all()
1037
    for competitiveItem in competitiveItems:
1038
        amScraping =  competitiveItem[0]
1039
        item = competitiveItem[1]
1040
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1041
        if amScraping.warehouseLocation == 1:
1042
            sku = 'FBA'+str(amScraping.item_id)
1043
            loc = 'MUMBAI'
1044
        else:
1045
            sku = 'FBB'+str(amScraping.item_id)
1046
            loc = 'BANGLORE'
1047
        sheet.write(sheet_iterator, 1, sku)
1048
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1049
        sheet.write(sheet_iterator, 3, loc)
1050
        sheet.write(sheet_iterator, 4, item.brand)
1051
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1052
        sheet.write(sheet_iterator, 6, item.weight)
1053
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1054
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
1055
        sheet.write(sheet_iterator, 9, amScraping.ourTp)
1056
        sheet.write(sheet_iterator, 10, amScraping.lowestPossibleSp)
1057
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleTp)
1058
        if amScraping.ourRank > 3:
1059
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1060
        else:
1061
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1062
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
1063
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerName)
1064
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerSp)
1065
        sheet.write(sheet_iterator, 16, amScraping.secondLowestSellerName)
1066
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
1067
        sheet.write(sheet_iterator, 18, amScraping.thirdLowestSellerName)
1068
        sheet.write(sheet_iterator, 19, amScraping.thirdLowestSellerSp)
1069
        sheet.write(sheet_iterator, 20, amScraping.wanlc)
1070
        sheet.write(sheet_iterator, 21, amScraping.commission)
1071
        sheet.write(sheet_iterator, 22, amScraping.competitorCommission)
1072
        sheet.write(sheet_iterator, 23, amScraping.returnProvision)
1073
        sheet.write(sheet_iterator, 24, round(amScraping.ourTp - amScraping.lowestPossibleTp))
1074
        sheet.write(sheet_iterator, 25, item.risky)
1075
        sheet.write(sheet_iterator, 26, amScraping.proposedSp)
1076
        sheet.write(sheet_iterator, 27, amScraping.proposedTp)
1077
        sheet.write(sheet_iterator, 28, amScraping.avgSale)
1078
        sheet.write(sheet_iterator, 29, getOosString(saleMap.get(sku)))
1079
        sheet_iterator+=1
1080
 
1081
    sheet = wbk.add_sheet('Almost Competitive')
1082
    xstr = lambda s: s or ""
1083
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1084
 
1085
    excel_integer_format = '0'
1086
    integer_style = xlwt.XFStyle()
1087
    integer_style.num_format_str = excel_integer_format
1088
 
1089
    sheet.write(0, 0, "Item Id", heading_xf)
1090
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1091
    sheet.write(0, 2, "Asin", heading_xf)
1092
    sheet.write(0, 3, "Location", heading_xf)
1093
    sheet.write(0, 4, "Brand", heading_xf)
1094
    sheet.write(0, 5, "Product Name", heading_xf)
1095
    sheet.write(0, 6, "Weight", heading_xf)
1096
    sheet.write(0, 7, "Courier Cost", heading_xf)
1097
    sheet.write(0, 8, "Our SP", heading_xf)
1098
    sheet.write(0, 9, "Our Tp", heading_xf)
1099
    sheet.write(0, 10, "Lowest Possible SP", heading_xf)
1100
    sheet.write(0, 11, "Lowest Possible TP", heading_xf)
1101
    sheet.write(0, 12, "Rank", heading_xf)
1102
    sheet.write(0, 13, "Our Inventory", heading_xf)
1103
    sheet.write(0, 14, "Lowest Seller Name", heading_xf)
1104
    sheet.write(0, 15, "Lowest Seller SP", heading_xf)
1105
    sheet.write(0, 16, "Second Lowest Seller Name", heading_xf)
1106
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
1107
    sheet.write(0, 18, "Third Lowest Seller Name", heading_xf)
1108
    sheet.write(0, 19, "Third Lowest Seller SP", heading_xf)
1109
    sheet.write(0, 20, "WANLC", heading_xf)
1110
    sheet.write(0, 21, "Commission", heading_xf)
1111
    sheet.write(0, 22, "Competitor Commission", heading_xf)
1112
    sheet.write(0, 23, "Return Provision", heading_xf)
1113
    sheet.write(0, 24, "Margin", heading_xf)
1114
    sheet.write(0, 25, "Risky", heading_xf)
1115
    sheet.write(0, 26, "Proposed Sp", heading_xf)
1116
    sheet.write(0, 27, "Proposed Tp", heading_xf)
1117
    sheet.write(0, 28, "Avg Sale", heading_xf)
1118
    sheet.write(0, 29, "Sales History", heading_xf)
1119
 
1120
    sheet_iterator = 1
1121
    almostCompetitiveItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.ALMOST_COMPETE).all()
1122
    for almostCompetitiveItem in almostCompetitiveItems:
1123
        amScraping =  almostCompetitiveItem[0]
1124
        item = almostCompetitiveItem[1]
1125
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1126
        if amScraping.warehouseLocation == 1:
1127
            sku = 'FBA'+str(amScraping.item_id)
1128
            loc = 'MUMBAI'
1129
        else:
1130
            sku = 'FBB'+str(amScraping.item_id)
1131
            loc = 'BANGLORE'
1132
        sheet.write(sheet_iterator, 1, sku)
1133
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1134
        sheet.write(sheet_iterator, 3, loc)
1135
        sheet.write(sheet_iterator, 4, item.brand)
1136
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1137
        sheet.write(sheet_iterator, 6, item.weight)
1138
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1139
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
1140
        sheet.write(sheet_iterator, 9, amScraping.ourTp)
1141
        sheet.write(sheet_iterator, 10, amScraping.lowestPossibleSp)
1142
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleTp)
1143
        if amScraping.ourRank > 3:
1144
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1145
        else:
1146
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1147
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
1148
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerName)
1149
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerSp)
1150
        sheet.write(sheet_iterator, 16, amScraping.secondLowestSellerName)
1151
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
1152
        sheet.write(sheet_iterator, 18, amScraping.thirdLowestSellerName)
1153
        sheet.write(sheet_iterator, 19, amScraping.thirdLowestSellerSp)
1154
        sheet.write(sheet_iterator, 20, amScraping.wanlc)
1155
        sheet.write(sheet_iterator, 21, amScraping.commission)
1156
        sheet.write(sheet_iterator, 22, amScraping.competitorCommission)
1157
        sheet.write(sheet_iterator, 23, amScraping.returnProvision)
1158
        sheet.write(sheet_iterator, 24, round(amScraping.ourTp - amScraping.lowestPossibleTp))
1159
        sheet.write(sheet_iterator, 25, item.risky)
1160
        sheet.write(sheet_iterator, 26, amScraping.proposedSp)
1161
        sheet.write(sheet_iterator, 27, amScraping.proposedTp)
1162
        sheet.write(sheet_iterator, 28, amScraping.avgSale)
1163
        sheet.write(sheet_iterator, 29, getOosString(saleMap.get(sku)))
1164
        sheet_iterator+=1
1165
 
1166
    sheet = wbk.add_sheet('Among Cheapest')
1167
    xstr = lambda s: s or ""
1168
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1169
 
1170
    excel_integer_format = '0'
1171
    integer_style = xlwt.XFStyle()
1172
    integer_style.num_format_str = excel_integer_format
1173
 
1174
    sheet.write(0, 0, "Item Id", heading_xf)
1175
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1176
    sheet.write(0, 2, "Asin", heading_xf)
1177
    sheet.write(0, 3, "Location", heading_xf)
1178
    sheet.write(0, 4, "Brand", heading_xf)
1179
    sheet.write(0, 5, "Product Name", heading_xf)
1180
    sheet.write(0, 6, "Weight", heading_xf)
1181
    sheet.write(0, 7, "Courier Cost", heading_xf)
1182
    sheet.write(0, 8, "Our SP", heading_xf)
1183
    sheet.write(0, 9, "Our Tp", heading_xf)
1184
    sheet.write(0, 10, "Lowest Possible SP", heading_xf)
1185
    sheet.write(0, 11, "Lowest Possible TP", heading_xf)
1186
    sheet.write(0, 12, "Rank", heading_xf)
1187
    sheet.write(0, 13, "Our Inventory", heading_xf)
1188
    sheet.write(0, 14, "Lowest Seller Name", heading_xf)
1189
    sheet.write(0, 15, "Lowest Seller SP", heading_xf)
1190
    sheet.write(0, 16, "Second Lowest Seller Name", heading_xf)
1191
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
1192
    sheet.write(0, 18, "Third Lowest Seller Name", heading_xf)
1193
    sheet.write(0, 19, "Third Lowest Seller SP", heading_xf)
1194
    sheet.write(0, 20, "WANLC", heading_xf)
1195
    sheet.write(0, 21, "Commission", heading_xf)
1196
    sheet.write(0, 22, "Competitor Commission", heading_xf)
1197
    sheet.write(0, 23, "Return Provision", heading_xf)
1198
    sheet.write(0, 24, "Margin", heading_xf)
1199
    sheet.write(0, 25, "Risky", heading_xf)
1200
    sheet.write(0, 26, "Proposed Sp", heading_xf)
1201
    sheet.write(0, 27, "Proposed Tp", heading_xf)
1202
    sheet.write(0, 28, "Avg Sale", heading_xf)
1203
    sheet.write(0, 29, "Sales History", heading_xf)
1204
 
1205
    sheet_iterator = 1
1206
    amongCheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE).all()
1207
    for amongCheapestItem in amongCheapestItems:
1208
        amScraping =  amongCheapestItem[0]
1209
        item = amongCheapestItem[1]
1210
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1211
        if amScraping.warehouseLocation == 1:
1212
            sku = 'FBA'+str(amScraping.item_id)
1213
            loc = 'MUMBAI'
1214
        else:
1215
            sku = 'FBB'+str(amScraping.item_id)
1216
            loc = 'BANGLORE'
1217
        sheet.write(sheet_iterator, 1, sku)
1218
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1219
        sheet.write(sheet_iterator, 3, loc)
1220
        sheet.write(sheet_iterator, 4, item.brand)
1221
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1222
        sheet.write(sheet_iterator, 6, item.weight)
1223
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1224
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
1225
        sheet.write(sheet_iterator, 9, amScraping.ourTp)
1226
        sheet.write(sheet_iterator, 10, amScraping.lowestPossibleSp)
1227
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleTp)
1228
        if amScraping.ourRank > 3:
1229
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1230
        else:
1231
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1232
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
1233
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerName)
1234
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerSp)
1235
        sheet.write(sheet_iterator, 16, amScraping.secondLowestSellerName)
1236
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
1237
        sheet.write(sheet_iterator, 18, amScraping.thirdLowestSellerName)
1238
        sheet.write(sheet_iterator, 19, amScraping.thirdLowestSellerSp)
1239
        sheet.write(sheet_iterator, 20, amScraping.wanlc)
1240
        sheet.write(sheet_iterator, 21, amScraping.commission)
1241
        sheet.write(sheet_iterator, 22, amScraping.competitorCommission)
1242
        sheet.write(sheet_iterator, 23, amScraping.returnProvision)
1243
        sheet.write(sheet_iterator, 24, round(amScraping.ourTp - amScraping.lowestPossibleTp))
1244
        sheet.write(sheet_iterator, 25, item.risky)
1245
        sheet.write(sheet_iterator, 26, amScraping.proposedSp)
1246
        sheet.write(sheet_iterator, 27, amScraping.proposedTp)
1247
        sheet.write(sheet_iterator, 28, amScraping.avgSale)
1248
        sheet.write(sheet_iterator, 29, getOosString(saleMap.get(sku)))
1249
        sheet_iterator+=1
1250
 
1251
    sheet = wbk.add_sheet('Cheapest')
1252
    xstr = lambda s: s or ""
1253
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1254
 
1255
    excel_integer_format = '0'
1256
    integer_style = xlwt.XFStyle()
1257
    integer_style.num_format_str = excel_integer_format
1258
 
1259
    sheet.write(0, 0, "Item Id", heading_xf)
1260
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1261
    sheet.write(0, 2, "Asin", heading_xf)
1262
    sheet.write(0, 3, "Location", heading_xf)
1263
    sheet.write(0, 4, "Brand", heading_xf)
1264
    sheet.write(0, 5, "Product Name", heading_xf)
1265
    sheet.write(0, 6, "Weight", heading_xf)
1266
    sheet.write(0, 7, "Courier Cost", heading_xf)
1267
    sheet.write(0, 8, "Our SP", heading_xf)
1268
    sheet.write(0, 9, "Our Tp", heading_xf)
1269
    sheet.write(0, 10, "Lowest Possible SP", heading_xf)
1270
    sheet.write(0, 11, "Lowest Possible TP", heading_xf)
1271
    sheet.write(0, 12, "Rank", heading_xf)
1272
    sheet.write(0, 13, "Our Inventory", heading_xf)
1273
    sheet.write(0, 14, "Lowest Seller Name", heading_xf)
1274
    sheet.write(0, 15, "Lowest Seller SP", heading_xf)
1275
    sheet.write(0, 16, "Second Lowest Seller Name", heading_xf)
1276
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
1277
    sheet.write(0, 18, "Third Lowest Seller Name", heading_xf)
1278
    sheet.write(0, 19, "Third Lowest Seller SP", heading_xf)
1279
    sheet.write(0, 20, "WANLC", heading_xf)
1280
    sheet.write(0, 21, "Commission", heading_xf)
1281
    sheet.write(0, 22, "Competitor Commission", heading_xf)
1282
    sheet.write(0, 23, "Return Provision", heading_xf)
1283
    sheet.write(0, 24, "Margin", heading_xf)
1284
    sheet.write(0, 25, "Risky", heading_xf)
1285
    sheet.write(0, 26, "Proposed Sp", heading_xf)
1286
    sheet.write(0, 27, "Proposed Tp", heading_xf)
1287
    sheet.write(0, 28, "Margin Increased Potential", heading_xf)
1288
    sheet.write(0, 29, "Avg Sale", heading_xf)
1289
    sheet.write(0, 30, "Sales History", heading_xf)
1290
 
1291
    sheet_iterator = 1
1292
    cheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.BUY_BOX).all()
1293
    for cheapestItem in cheapestItems:
1294
        amScraping =  cheapestItem[0]
1295
        item = cheapestItem[1]
1296
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1297
        if amScraping.warehouseLocation == 1:
1298
            sku = 'FBA'+str(amScraping.item_id)
1299
            loc = 'MUMBAI'
1300
        else:
1301
            sku = 'FBB'+str(amScraping.item_id)
1302
            loc = 'BANGLORE'
1303
        sheet.write(sheet_iterator, 1, sku)
1304
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1305
        sheet.write(sheet_iterator, 3, loc)
1306
        sheet.write(sheet_iterator, 4, item.brand)
1307
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1308
        sheet.write(sheet_iterator, 6, item.weight)
1309
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1310
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
1311
        sheet.write(sheet_iterator, 9, amScraping.ourTp)
1312
        sheet.write(sheet_iterator, 10, amScraping.lowestPossibleSp)
1313
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleTp)
1314
        if amScraping.ourRank > 3:
1315
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1316
        else:
1317
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1318
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
1319
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerName)
1320
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerSp)
1321
        sheet.write(sheet_iterator, 16, amScraping.secondLowestSellerName)
1322
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
1323
        sheet.write(sheet_iterator, 18, amScraping.thirdLowestSellerName)
1324
        sheet.write(sheet_iterator, 19, amScraping.thirdLowestSellerSp)
1325
        sheet.write(sheet_iterator, 20, amScraping.wanlc)
1326
        sheet.write(sheet_iterator, 21, amScraping.commission)
1327
        sheet.write(sheet_iterator, 22, amScraping.competitorCommission)
1328
        sheet.write(sheet_iterator, 23, amScraping.returnProvision)
1329
        sheet.write(sheet_iterator, 24, round(amScraping.ourTp - amScraping.lowestPossibleTp))
1330
        sheet.write(sheet_iterator, 25, item.risky)
1331
        sheet.write(sheet_iterator, 26, amScraping.proposedSp)
1332
        sheet.write(sheet_iterator, 27, amScraping.proposedTp)
1333
        sheet.write(sheet_iterator, 28, amScraping.marginIncreasedPotential)
1334
        sheet.write(sheet_iterator, 29, amScraping.avgSale)
1335
        sheet.write(sheet_iterator, 30, getOosString(saleMap.get(sku)))
1336
        sheet_iterator+=1
1337
 
1338
    sheet = wbk.add_sheet('Negative Margin')
1339
    xstr = lambda s: s or ""
1340
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1341
 
1342
    excel_integer_format = '0'
1343
    integer_style = xlwt.XFStyle()
1344
    integer_style.num_format_str = excel_integer_format
1345
 
1346
    sheet.write(0, 0, "Item Id", heading_xf)
1347
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1348
    sheet.write(0, 2, "Asin", heading_xf)
1349
    sheet.write(0, 3, "Location", heading_xf)
1350
    sheet.write(0, 4, "Brand", heading_xf)
1351
    sheet.write(0, 5, "Product Name", heading_xf)
1352
    sheet.write(0, 6, "Weight", heading_xf)
1353
    sheet.write(0, 7, "Courier Cost", heading_xf)
1354
    sheet.write(0, 8, "Our SP", heading_xf)
1355
    sheet.write(0, 9, "Our Tp", heading_xf)
1356
    sheet.write(0, 10, "Lowest Possible SP", heading_xf)
1357
    sheet.write(0, 11, "Lowest Possible TP", heading_xf)
1358
    sheet.write(0, 12, "Rank", heading_xf)
1359
    sheet.write(0, 13, "Our Inventory", heading_xf)
1360
    sheet.write(0, 14, "Lowest Seller Name", heading_xf)
1361
    sheet.write(0, 15, "Lowest Seller SP", heading_xf)
1362
    sheet.write(0, 16, "Second Lowest Seller Name", heading_xf)
1363
    sheet.write(0, 17, "Second Lowest Seller SP", heading_xf)
1364
    sheet.write(0, 18, "Third Lowest Seller Name", heading_xf)
1365
    sheet.write(0, 19, "Third Lowest Seller SP", heading_xf)
1366
    sheet.write(0, 20, "WANLC", heading_xf)
1367
    sheet.write(0, 21, "Commission", heading_xf)
1368
    sheet.write(0, 22, "Competitor Commission", heading_xf)
1369
    sheet.write(0, 23, "Return Provision", heading_xf)
1370
    sheet.write(0, 24, "Margin", heading_xf)
1371
    sheet.write(0, 25, "Avg Sale", heading_xf)
1372
    sheet.write(0, 26, "Sales History", heading_xf)
1373
 
1374
    sheet_iterator = 1
1375
    amongCheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE).all()
1376
    for amongCheapestItem in amongCheapestItems:
1377
        amScraping =  amongCheapestItem[0]
1378
        item = amongCheapestItem[1]
1379
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1380
        if amScraping.warehouseLocation == 1:
1381
            sku = 'FBA'+str(amScraping.item_id)
1382
            loc = 'MUMBAI'
1383
        else:
1384
            sku = 'FBB'+str(amScraping.item_id)
1385
            loc = 'BANGLORE'
1386
        sheet.write(sheet_iterator, 1, sku)
1387
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1388
        sheet.write(sheet_iterator, 3, loc)
1389
        sheet.write(sheet_iterator, 4, item.brand)
1390
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1391
        sheet.write(sheet_iterator, 6, item.weight)
1392
        sheet.write(sheet_iterator, 7, amScraping.courierCost)
1393
        sheet.write(sheet_iterator, 8, amScraping.ourSellingPrice)
1394
        sheet.write(sheet_iterator, 9, amScraping.ourTp)
1395
        sheet.write(sheet_iterator, 10, amScraping.lowestPossibleSp)
1396
        sheet.write(sheet_iterator, 11, amScraping.lowestPossibleTp)
1397
        if amScraping.ourRank > 3:
1398
            sheet.write(sheet_iterator, 12, 'Greater than 3')
1399
        else:
1400
            sheet.write(sheet_iterator, 12, amScraping.ourRank)
1401
        sheet.write(sheet_iterator, 13, amScraping.ourInventory)
1402
        sheet.write(sheet_iterator, 14, amScraping.lowestSellerName)
1403
        sheet.write(sheet_iterator, 15, amScraping.lowestSellerSp)
1404
        sheet.write(sheet_iterator, 16, amScraping.secondLowestSellerName)
1405
        sheet.write(sheet_iterator, 17, amScraping.secondLowestSellerSp)
1406
        sheet.write(sheet_iterator, 18, amScraping.thirdLowestSellerName)
1407
        sheet.write(sheet_iterator, 19, amScraping.thirdLowestSellerSp)
1408
        sheet.write(sheet_iterator, 20, amScraping.wanlc)
1409
        sheet.write(sheet_iterator, 21, amScraping.commission)
1410
        sheet.write(sheet_iterator, 22, amScraping.competitorCommission)
1411
        sheet.write(sheet_iterator, 23, amScraping.returnProvision)
1412
        sheet.write(sheet_iterator, 24, round(amScraping.ourTp - amScraping.lowestPossibleTp))
1413
        sheet.write(sheet_iterator, 25, amScraping.avgSale)
1414
        sheet.write(sheet_iterator, 26, getOosString(saleMap.get(sku)))
1415
        sheet_iterator+=1
1416
 
1417
    sheet = wbk.add_sheet('Exception List')
1418
    xstr = lambda s: s or ""
1419
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
1420
 
1421
    excel_integer_format = '0'
1422
    integer_style = xlwt.XFStyle()
1423
    integer_style.num_format_str = excel_integer_format
1424
 
1425
    sheet.write(0, 0, "Item Id", heading_xf)
1426
    sheet.write(0, 1, "Amazon Sku", heading_xf)
1427
    sheet.write(0, 2, "Asin", heading_xf)
1428
    sheet.write(0, 3, "Location", heading_xf)
1429
    sheet.write(0, 4, "Brand", heading_xf)
1430
    sheet.write(0, 5, "Product Name", heading_xf)
1431
    sheet.write(0, 6, "Reason", heading_xf)
1432
 
1433
    sheet_iterator = 1
1434
    amongCheapestItems = session.query(AmazonScrapingHistory,Item).join((Item,AmazonScrapingHistory.item_id==Item.id)).filter(AmazonScrapingHistory.competitiveCategory==CompetitionCategory.AMONG_CHEAPEST_CAN_COMPETE).all()
1435
    for amongCheapestItem in amongCheapestItems:
1436
        amScraping =  amongCheapestItem[0]
1437
        item = amongCheapestItem[1]
1438
        sheet.write(sheet_iterator, 0, amScraping.item_id)
1439
        if amScraping.warehouseLocation == 1:
1440
            sku = 'FBA'+str(amScraping.item_id)
1441
            loc = 'MUMBAI'
1442
        else:
1443
            sku = 'FBB'+str(amScraping.item_id)
1444
            loc = 'BANGLORE'
1445
        sheet.write(sheet_iterator, 1, sku)
1446
        sheet.write(sheet_iterator, 2, (amazonAsinPrice.get(sku).asin))
1447
        sheet.write(sheet_iterator, 3, loc)
1448
        sheet.write(sheet_iterator, 4, item.brand)
1449
        sheet.write(sheet_iterator, 5, xstr(item.brand)+" "+xstr(item.model_name)+" "+xstr(item.model_number)+" "+xstr(item.color))
1450
        sheet.write(sheet_iterator, 6, amScraping.reason)
1451
        sheet_iterator+=1      
1452
 
1453
    filename = "/tmp/amazon-scraping.xls"
1454
    wbk.save(filename)
1455
 
12363 kshitij.so 1456
def main():
1457
    parser = optparse.OptionParser()
1458
    parser.add_option("-t", "--type", dest="runType",
1459
                   default="FULL", type="string",
1460
                   help="Run type FULL or FAVOURITE")
1461
    (options, args) = parser.parse_args()
1462
    if options.runType not in ('FULL','FAVOURITE'):
1463
        print "Run type argument illegal."
1464
        sys.exit(1)
1465
    time.sleep(5)
1466
    timestamp = datetime.now()
1467
    syncAsin()
1468
    fetchFbaSale()
1469
    itemInfo = populateStuff(timestamp,options.runType)
1470
    itemsToPopulate = 0
12370 kshitij.so 1471
    print len(itemInfo)
12363 kshitij.so 1472
    while (len(itemInfo)>0):
12399 kshitij.so 1473
        if len(itemInfo) > 50:
1474
            itemsToPopulate = 50
12363 kshitij.so 1475
        else:
1476
            itemsToPopulate = len(itemInfo)
12370 kshitij.so 1477
        print itemsToPopulate
12363 kshitij.so 1478
        exceptionList, negativeMargin, cheapest, amongCheapestAndCanCompete, canCompete, almostCompete, cantCompete = decideCategory(itemInfo[0:itemsToPopulate])
1479
        itemInfo[0:itemsToPopulate] = []
1480
        commitExceptionList(exceptionList,timestamp,options.runType)
1481
        commitNegativeMargin(negativeMargin,timestamp,options.runType)
1482
        commitCheapest(cheapest,timestamp,options.runType)
1483
        commitAmongCheapestAndCanCompete(amongCheapestAndCanCompete,timestamp,options.runType)
1484
        commitCanCompete(canCompete,timestamp,options.runType)
1485
        commitAlmostCompete(almostCompete,timestamp,options.runType)
1486
        commitCantCompete(cantCompete, timestamp,options.runType)
12396 kshitij.so 1487
        exceptionList[:], negativeMargin[:], cheapest[:], amongCheapestAndCanCompete[:], canCompete[:], almostCompete[:], cantCompete[:] =[],[],[],[],[],[],[]
1488
    autoDecreaseItems = fetchItemsForAutoDecrease(timestamp)
1489
    autoIncreaseItems = fetchItemsForAutoIncrease(timestamp)
1490
    previousAutoFav, nowAutoFav = markAutoFavourites(timestamp)
1491
    writeReport(timestamp,autoDecreaseItems,autoIncreaseItems,previousAutoFav,nowAutoFav)
12363 kshitij.so 1492
if __name__=='__main__':
1493
    main()