Rev 13531 | Blame | Compare with Previous | Last modification | View Log | RSS feed
import pymongofrom datetime import datetime, timedelta, time, datefrom shop2020.thriftpy.model.v1.order.ttypes import AmazonFCWarehouseLocationfrom shop2020.utils.Utils import to_java_date, to_py_datefrom shop2020.thriftpy.model.v1.order.ttypes import AmazonFbaSalesSnapshot, AmazonHourlySaleSnapshot, \AmazonFbaOrderItemimport operatorcon = Noneprefix = {'FBA':0,'FBB':1,'FBG':2, 'FBD':3}def get_mongo_connection(host='localhost', port=27017):global conif con is None:print "Establishing connection %s host and port %d" %(host,port)try:con = pymongo.MongoClient(host, port)except Exception, e:print ereturn Nonereturn condef to_amazonFbaSaleSnapshot(saleSnapshot):amazonFbaSaleSnapshot = AmazonFbaSalesSnapshot(dateOfSale=0, item_id=0, totalOrderCount=0, amazonFbaInventory=0, isOutOfStock=False, salePrice=0, minFbaPrice=0, minMfnPrice=0, totalSale=0, promotionSale=0, promotionOrderCount=0, ourPrice=0, minFbaPriceSnapshotDate=0, minMfnPriceSnapshotDate=0, ourPriceSnapshotDate=0, salePriceSnapshotDate=0, fcLocation=None)if saleSnapshot is None:return amazonFbaSaleSnapshotamazonFbaSaleSnapshot.__dict__.update(saleSnapshot)return amazonFbaSaleSnapshotdef to_amazonFbaHourlySnapshot(saleSnapshot):amazonHourlySaleSnapshot = AmazonHourlySaleSnapshot(snapshotTime=0, item_id=0, totalOrderCount=0, amazonFbaInventory=0, isOutOfStock=False, totalSale=0, promotionSale=0, promotionOrderCount=0, fcLocation=None)if saleSnapshot is None:return amazonHourlySaleSnapshotamazonHourlySaleSnapshot.__dict__.update(saleSnapshot)return amazonHourlySaleSnapshotdef to_amazonFbaOrderItem(orderData):amazonFbaOrderItem = AmazonFbaOrderItem(amazonOrderId=None, purchaseDate=None, orderStatus=None, item_id=None, fcLocation=None, totalAmount=None, promotionDiscount=None, quantity=None)if orderData is None:return amazonFbaOrderItemamazonFbaOrderItem.__dict__.update(orderData)return amazonFbaOrderItemdef getAmazonFbaSalesLatestSnapshotForItemLocationWise(item_id,fcLocation):collection = get_mongo_connection().AmazonSaleSnapshot.AmazonDailySaleSnapshotlist = []list.append({"dateOfSale": to_java_date(datetime.combine((datetime.now()-timedelta(days=1)).date(), time(00,00,00)))})list.append({"item_id":item_id})list.append({"fcLocation":AmazonFCWarehouseLocation._VALUES_TO_NAMES.get(fcLocation)})r = collection.find({"$and":list}).sort([('dateOfSale',pymongo.DESCENDING)]).limit(1)if r.count() > 0:return to_amazonFbaSaleSnapshot(r.next())else:return to_amazonFbaSaleSnapshot(None)def getInStockAmazonFbaSalesLatestSnapshotForItemLocationWise(item_id,fcLocation,outOfStockTime):fbasalessnapshot = []collection = get_mongo_connection().AmazonSaleSnapshot.AmazonDailySaleSnapshottoDate = datetime.now()-timedelta(days = 1)fromDate = outOfStockTimelist = []list.append({"item_id":item_id})list.append({"fcLocation":AmazonFCWarehouseLocation._VALUES_TO_NAMES.get(fcLocation)})query = {}query['$gt'] = fromDatequery['$lte'] = to_java_date(datetime.combine(toDate.date(), time(00,00,00)))list.append({"dateOfSale":query})cursor = collection.find({"$and":list}).sort([('dateOfSale',pymongo.ASCENDING)])totalSale = 0noOfDays = 0for sale in cursor:totalSale = totalSale + sale.get('totalOrderCount')noOfDays = noOfDays + 1return totalSale, noOfDaysdef getAmazonFbaSalesSnapshotForDays(interval):fbasalessnapshot = []collection = get_mongo_connection().AmazonSaleSnapshot.AmazonDailySaleSnapshottoDate = datetime.now()-timedelta(days = 1)fromDate = toDate-timedelta(days = interval)query = {}query['$gte'] = to_java_date(datetime.combine(fromDate.date(), time(00,00,00)))query['$lte'] = to_java_date(datetime.combine(toDate.date(), time(00,00,00)))cursor = collection.find({"dateOfSale":query}).sort([('dateOfSale',pymongo.ASCENDING)])for sale in cursor:fbasalessnapshot.append(to_amazonFbaSaleSnapshot(sale))return fbasalessnapshotdef getLastOutOfStock(item_id,fcLocation):collection = get_mongo_connection().AmazonSaleSnapshot.AmazonDailySaleSnapshotlist = []list.append({"item_id":item_id})list.append({"fcLocation":AmazonFCWarehouseLocation._VALUES_TO_NAMES.get(fcLocation)})list.append({"isOutOfStock":True})r = collection.find({"$and":list}).sort([('dateOfSale',pymongo.DESCENDING)]).limit(1)if r.count() > 0:lastOutOfStock = to_amazonFbaSaleSnapshot(r.next())else:lastOutOfStock = to_amazonFbaSaleSnapshot(None)if lastOutOfStock.dateOfSale == 0:return lastOutOfStock, 0, 0else:totalSale, noOfDays =getInStockAmazonFbaSalesLatestSnapshotForItemLocationWise(item_id,fcLocation,lastOutOfStock.dateOfSale)return lastOutOfStock, totalSale, noOfDaysdef getLatestHourlySnapshot():fbaHourlySnapshot = []collection = get_mongo_connection().AmazonSaleSnapshot.AmazonHourlySaleSnapshotr = collection.find().sort([('snapshotTime',pymongo.DESCENDING)]).limit(1)lastestSnapshotTime = r.next().get('snapshotTime')cursor = collection.find({"snapshotTime":{"$in":[lastestSnapshotTime]}})for sale in cursor:fbaHourlySnapshot.append(to_amazonFbaHourlySnapshot(sale))return fbaHourlySnapshotdef getAmazonOrderData(startDate, endDate, offset, limit):fbaOrderData = []collection = get_mongo_connection().AmazonSaleSnapshot.AmazonSaleDatalist = []query = {}list.append({"orderStatus":"Shipped"})query['$gte'] = to_java_date(startDate)query['$lte'] = to_java_date(endDate)list.append({"purchaseDate":query})print listif offset is None and limit is None:cursor = collection.find({"$and":list}).sort([('purchaseDate',pymongo.ASCENDING)])print cursor.count()else:cursor = collection.find({"$and":list}).skip(offset).limit(limit).sort([('purchaseDate',pymongo.ASCENDING)])for orderData in cursor:fbaOrderData.append(to_amazonFbaOrderItem(orderData))return fbaOrderDatadef getDistinctItemsFromOrderData(startDate, endDate):item_ids = []collection = get_mongo_connection().AmazonSaleSnapshot.AmazonSaleDatalist = []query = {}list.append({"orderStatus":"Shipped"})query['$gte'] = to_java_date(startDate)query['$lte'] = to_java_date(endDate)list.append({"purchaseDate":query})cursor = collection.find({"$and":list}).distinct('item_id')for item_id in cursor:item_ids.append(item_id)return item_idsdef getOrderByAmazonOrderIdAndSku(amazonOrderId, sku):list = []collection = get_mongo_connection().AmazonSaleSnapshot.AmazonSaleDatalist.append({"amazonOrderId": amazonOrderId})list.append({"item_id":int(sku[3:])})list.append({"fcLocation":AmazonFCWarehouseLocation._VALUES_TO_NAMES.get(prefix.get(sku[0:3]))})r = collection.find({"$and":list})if r.count() > 1:raiseelif r.count()==0:raiseelse:return to_amazonFbaOrderItem(r.next())def getAmazonOrderDataByItemId(startDate, endDate, offset, limit, item_id):fbaOrderData = []collection = get_mongo_connection().AmazonSaleSnapshot.AmazonSaleDatalist = []query = {}list.append({"item_id":item_id})query['$gte'] = to_java_date(startDate)query['$lte'] = to_java_date(endDate)list.append({"purchaseDate":query})print listif offset is None and limit is None:cursor = collection.find({"$and":list}).sort([('purchaseDate',pymongo.ASCENDING)])print cursor.count()else:cursor = collection.find({"$and":list}).skip(offset).limit(limit).sort([('purchaseDate',pymongo.ASCENDING)])for orderData in cursor:fbaOrderData.append(to_amazonFbaOrderItem(orderData))return fbaOrderDatadef dict_nlargest(d,n):import heapqreturn heapq.nlargest(n ,d, key = lambda k: d[k])def main():endDate = (datetime.now()).replace(hour=0, minute=0, second=0, microsecond=0)print endDatestartDate = (datetime.now() -timedelta(days=30)).replace(hour=0, minute=0, second=0, microsecond=0)print startDateorderItemData = getAmazonOrderDataByItemId(startDate, endDate,None,None,16914)priceSku = {}print len(orderItemData)count = 0for x in orderItemData:if x.promotionDiscount > 0 or x.orderStatus == 'Cancelled':count +=1continueprint x.totalAmountprint x.quantityprint "*************"price = x.totalAmount / x.quantityif priceSku.has_key(price):qty = priceSku.get(price)priceSku[price] = qty + x.quantityelse:priceSku[price] = x.quantityprint priceSkuprint "promotion order count ",countnewdict = {}for key, value in sorted(priceSku.iteritems(), key=lambda (k,v): (v,k),reverse=True):print "%s: %s" % (key, value)rng = str(int(key)-25)+'-'+str(int(key))print rngtotal_qty = 0min = 0max = 0for x in range(int(key-25),int(key+1)):qty = priceSku.get(x)if qty is not None:if min==0:min = xif max < x:max = xtotal_qty = qty + total_qtynewdict[str(min)+'-'+str(max)] = total_qtyprint newdictd = {}for key, value in sorted(priceSku.iteritems(), key=lambda (k,v): (v,k),reverse=True):print "%s: %s" % (key, value)rng = str(int(key))+'-'+str(int(key)+26)print rngtotal_qty = 0min = 0max = 0for x in range(int(key),int(key+26)):qty = priceSku.get(x)if qty is not None:if min==0:min = xif max < x:max = xtotal_qty = qty + total_qtyd[str(min)+'-'+str(max)] = total_qtyprint dif __name__ == "__main__":main()