Subversion Repositories SmartDukaan

Rev

Rev 13531 | Blame | Compare with Previous | Last modification | View Log | RSS feed

import pymongo
from datetime import datetime, timedelta, time, date
from shop2020.thriftpy.model.v1.order.ttypes import AmazonFCWarehouseLocation
from shop2020.utils.Utils import to_java_date, to_py_date
from shop2020.thriftpy.model.v1.order.ttypes import AmazonFbaSalesSnapshot, AmazonHourlySaleSnapshot, \
AmazonFbaOrderItem
import operator


con = None
prefix = {'FBA':0,'FBB':1,'FBG':2, 'FBD':3}

def get_mongo_connection(host='localhost', port=27017):
    global con
    if con is None:
        print "Establishing connection %s host and port %d" %(host,port)
        try:
            con = pymongo.MongoClient(host, port)
        except Exception, e:
            print e
            return None
    return con

def 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 amazonFbaSaleSnapshot
    amazonFbaSaleSnapshot.__dict__.update(saleSnapshot)
    return amazonFbaSaleSnapshot

def 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 amazonHourlySaleSnapshot
    amazonHourlySaleSnapshot.__dict__.update(saleSnapshot)
    return amazonHourlySaleSnapshot

def 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 amazonFbaOrderItem
    amazonFbaOrderItem.__dict__.update(orderData)
    return amazonFbaOrderItem 

def getAmazonFbaSalesLatestSnapshotForItemLocationWise(item_id,fcLocation):
    collection = get_mongo_connection().AmazonSaleSnapshot.AmazonDailySaleSnapshot
    list = []
    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.AmazonDailySaleSnapshot
    toDate = datetime.now()-timedelta(days = 1)
    fromDate = outOfStockTime
    list = []
    list.append({"item_id":item_id})
    list.append({"fcLocation":AmazonFCWarehouseLocation._VALUES_TO_NAMES.get(fcLocation)})
    query = {}
    query['$gt'] = fromDate 
    query['$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 = 0
    noOfDays = 0
    for sale in cursor:
        totalSale = totalSale + sale.get('totalOrderCount')
        noOfDays = noOfDays + 1 
    return totalSale, noOfDays 
        
def getAmazonFbaSalesSnapshotForDays(interval):
    fbasalessnapshot = []
    collection = get_mongo_connection().AmazonSaleSnapshot.AmazonDailySaleSnapshot
    toDate = 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 fbasalessnapshot

def getLastOutOfStock(item_id,fcLocation):
    collection = get_mongo_connection().AmazonSaleSnapshot.AmazonDailySaleSnapshot
    list = []
    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, 0
    else:
        totalSale, noOfDays =getInStockAmazonFbaSalesLatestSnapshotForItemLocationWise(item_id,fcLocation,lastOutOfStock.dateOfSale)
        return lastOutOfStock, totalSale, noOfDays 
    
def getLatestHourlySnapshot():
    fbaHourlySnapshot = []
    collection = get_mongo_connection().AmazonSaleSnapshot.AmazonHourlySaleSnapshot
    r = 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 fbaHourlySnapshot

def getAmazonOrderData(startDate, endDate, offset, limit):
    fbaOrderData = []
    collection = get_mongo_connection().AmazonSaleSnapshot.AmazonSaleData
    list = []
    query = {}
    list.append({"orderStatus":"Shipped"})
    query['$gte'] = to_java_date(startDate)
    query['$lte'] = to_java_date(endDate)
    list.append({"purchaseDate":query})
    print list
    if 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 fbaOrderData

def getDistinctItemsFromOrderData(startDate, endDate):
    item_ids = []
    collection = get_mongo_connection().AmazonSaleSnapshot.AmazonSaleData
    list = []
    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_ids

def getOrderByAmazonOrderIdAndSku(amazonOrderId, sku):
    list = []
    collection = get_mongo_connection().AmazonSaleSnapshot.AmazonSaleData
    list.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:
        raise
    elif r.count()==0:
        raise
    else:
        return to_amazonFbaOrderItem(r.next())
def getAmazonOrderDataByItemId(startDate, endDate, offset, limit, item_id):
    fbaOrderData = []
    collection = get_mongo_connection().AmazonSaleSnapshot.AmazonSaleData
    list = []
    query = {}
    list.append({"item_id":item_id})
    query['$gte'] = to_java_date(startDate)
    query['$lte'] = to_java_date(endDate)
    list.append({"purchaseDate":query})
    print list
    if 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 fbaOrderData



def dict_nlargest(d,n):
    import heapq
    return heapq.nlargest(n ,d, key = lambda k: d[k])


def main():
    endDate = (datetime.now()).replace(hour=0, minute=0, second=0, microsecond=0)
    print endDate
    startDate = (datetime.now() -timedelta(days=30)).replace(hour=0, minute=0, second=0, microsecond=0)
    print startDate
    orderItemData = getAmazonOrderDataByItemId(startDate, endDate,None,None,16914)
    priceSku = {}
    print len(orderItemData)
    count = 0
    for x in orderItemData:
        if x.promotionDiscount > 0 or x.orderStatus == 'Cancelled':
            count +=1
            continue
        print x.totalAmount
        print x.quantity
        print "*************"
        price = x.totalAmount / x.quantity
        if priceSku.has_key(price):
            qty = priceSku.get(price)
            priceSku[price] = qty + x.quantity
        else:
            priceSku[price] = x.quantity
            
    print priceSku
    print "promotion order count ",count
    newdict = {}
    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 rng
        total_qty = 0
        min = 0
        max = 0
        for x in range(int(key-25),int(key+1)):
            qty = priceSku.get(x)
            if qty is not None:
                if min==0:
                    min = x
                if max < x:
                    max = x 
                total_qty = qty + total_qty
        newdict[str(min)+'-'+str(max)] = total_qty 
    print newdict
    
    d = {}
    
    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 rng
        total_qty = 0
        min = 0
        max = 0
        for x in range(int(key),int(key+26)):
            qty = priceSku.get(x)
            if qty is not None:
                if min==0:
                    min = x
                if max < x:
                    max = x 
                total_qty = qty + total_qty
        d[str(min)+'-'+str(max)] = total_qty 
    print d
        
        
        
        
        
        
        
        
        
        
    
    
            
    
if __name__ == "__main__":
    main()