Subversion Repositories SmartDukaan

Rev

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