Rev 13480 | Blame | Compare with Previous | Last modification | View Log | RSS feed
from elixir import *from shop2020.config.client.ConfigClient import ConfigClientfrom shop2020.model.v1.catalog.impl import DataServicefrom shop2020.model.v1.catalog.impl.DataService import AmazonPromotion, Itemfrom shop2020.model.v1.order.script import MongoServicefrom shop2020.thriftpy.model.v1.catalog.ttypes import AmazonPromotionTypefrom shop2020.thriftpy.model.v1.order.ttypes import AmazonFCWarehouseLocationfrom shop2020.utils.Utils import to_py_datefrom datetime import datetime, timedeltaimport xlwtconfig_client = ConfigClient()host = config_client.get_property('staging_hostname')DataService.initialize(db_hostname=host)startDate = datetime.strptime('01-12-2014 00:00:00', '%d-%m-%Y %H:%M:%S')endDate = datetime.strptime('28-12-2014 00:00:00', '%d-%m-%Y %H:%M:%S')wpiPromoMap = {}dodPromoMap = {}itemInfoMap = {}prefix = {0:'FBA',1:'FBB',2:'FBG'}offset, limit, sheet_iterator = 0, 1000, 1class __ItemInfo:def __init__(self, brand, model_name, model_number, color, productGroup):self.brand = brandself.model_name = model_nameself.model_number = model_numberself.color = colorself.productGroup = productGroupdef populateItemInfo():global itemInfoMapitem_ids = MongoService.getDistinctItemsFromOrderData(startDate, endDate)for item_id in item_ids:it = Item.get_by(id=item_id)if it is None:itemInfoMap[item_id] = __ItemInfo(' ', ' ', ' ', ' ', ' ')continueitemInfoMap[item_id] = __ItemInfo(it.brand, it.model_name, it.model_number, it.color, it.product_group)def populateSubsidyInfo():promotions = AmazonPromotion.query.filter(AmazonPromotion.endDate>=startDate - timedelta(days=7)).filter(AmazonPromotion.endDate<=endDate + timedelta(days=7)).all()for promo in promotions:if not promo.promotionActive:continuetemp = []if promo.promotionType == AmazonPromotionType.LONGTERM:if wpiPromoMap.has_key(promo.sku):val = wpiPromoMap.get(promo.sku)for l in val:temp.append(l)temp.append(promo)wpiPromoMap[promo.sku] = tempelse:temp.append(promo)wpiPromoMap[promo.sku] = tempelse:if dodPromoMap.has_key(promo.sku):val = dodPromoMap.get(promo.sku)for l in val:temp.append(l)temp.append(promo)dodPromoMap[promo.sku] = tempelse:temp.append(promo)dodPromoMap[promo.sku] = tempdef writeReport():global sheet_iteratorglobal offsetwbk = xlwt.Workbook(encoding="UTF-8")sheet = wbk.add_sheet('AmazonSubsidy')xstr = lambda s: s or ""heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')excel_integer_format = '0'integer_style = xlwt.XFStyle()integer_style.num_format_str = excel_integer_formatwriteHead(sheet,heading_xf)while(True):orders = MongoService.getAmazonOrderData(startDate, endDate, offset, limit)if len(orders) == 0:breakfor order in orders:sheet.write(sheet_iterator, 0, order.amazonOrderId)sheet.write(sheet_iterator, 1, order.item_id)sheet.write(sheet_iterator, 2, prefix.get(AmazonFCWarehouseLocation._NAMES_TO_VALUES.get(order.fcLocation))+str(order.item_id))sheet.write(sheet_iterator, 3, order.fcLocation)sheet.write(sheet_iterator, 4, getItemInfo(order.item_id).productGroup)sheet.write(sheet_iterator, 5, getItemInfo(order.item_id).brand)sheet.write(sheet_iterator, 6, xstr(getItemInfo(order.item_id).brand)+" "+xstr(getItemInfo(order.item_id).model_name)+" "+xstr(getItemInfo(order.item_id).model_number)+" "+xstr(getItemInfo(order.item_id).color))sheet.write(sheet_iterator, 7, str(to_py_date(order.purchaseDate)))sheet.write(sheet_iterator, 8, order.totalAmount)sheet.write(sheet_iterator, 9, order.quantity)sheet.write(sheet_iterator, 10, order.promotionDiscount)subsidy, maxSalePrice, promoStartDate, promoEndDate, promoType, toleranceAmount = calculateSubsidy(order.item_id, AmazonFCWarehouseLocation._NAMES_TO_VALUES.get(order.fcLocation), to_py_date(order.purchaseDate),order.totalAmount, order.amazonOrderId, order.promotionDiscount)if subsidy > 0:sheet.write(sheet_iterator, 11, (order.quantity)*(subsidy))sheet.write(sheet_iterator, 12, toleranceAmount)sheet.write(sheet_iterator, 13, str(promoStartDate))sheet.write(sheet_iterator, 14, str(promoEndDate))sheet.write(sheet_iterator, 15, maxSalePrice)sheet.write(sheet_iterator, 16, AmazonPromotionType._VALUES_TO_NAMES.get(promoType))sheet_iterator+=1offset = offset + 1000file_subsidy = "/tmp/subsidy"+" " + str(datetime.now()) + ".xls"wbk.save(file_subsidy)def calculateSubsidy(item_id, fcLocation, purchaseDate, sellingPrice, amazonOrderId, promotionDiscount):validPromosWpi = []validPromosDod = []sku = prefix.get(fcLocation)+str(item_id)if wpiPromoMap.has_key(sku):promos = wpiPromoMap.get(sku)for promo in promos:if promo.startDate <= purchaseDate and promo.endDate >= purchaseDate:validPromosWpi.append(promo)if dodPromoMap.has_key(sku):promos = dodPromoMap.get(sku)for promo in promos:if promo.startDate <= purchaseDate and promo.endDate >= purchaseDate:validPromosDod.append(promo)return figureOutBestPossibleSubsidy(validPromosWpi, validPromosDod, sellingPrice, purchaseDate, amazonOrderId, promotionDiscount, sku)#def figureOutBestPossibleSubsidy(validPromosWpi, validPromosDod , sellingPrice, purchaseDate,amazonOrderId):# if len(validPromos) > 0:# print "No of valid promo for sku ", (validPromos[0]).sku ,"is ", len(validPromos), "and purchase date ", purchaseDate, "amazon order id ",amazonOrderId# subsidy, maxSalePrice, promoStartDate, promoEndDate, promoType = 0.0, 0.0, None, None, None# toleranceAmount = 50 if sellingPrice <=1000 else 100# for validPromo in validPromos:# if validPromo.promotionType == AmazonPromotionType.LONGTERM:# if validPromo.salePrice >= sellingPrice:# if validPromo.subsidy > subsidy:# subsidy = validPromo.subsidy# maxSalePrice = validPromo.salePrice# promoStartDate = validPromo.startDate# promoEndDate = validPromo.endDate# promoType = AmazonPromotionType.LONGTERM# elif validPromo.salePrice >= sellingPrice - toleranceAmount:# if validPromo.subsidy > subsidy:# subsidy = validPromo.subsidy# maxSalePrice = validPromo.salePrice# promoStartDate = validPromo.startDate# promoEndDate = validPromo.endDate# promoType = AmazonPromotionType.LONGTERM# elif validPromo.promotionType == AmazonPromotionType.SHORTTERM:# if validPromo.salePrice >= sellingPrice:# if validPromo.subsidy > subsidy:# subsidy = validPromo.subsidy# maxSalePrice = validPromo.salePrice# promoStartDate = validPromo.startDate# promoEndDate = validPromo.endDate# promoType = AmazonPromotionType.SHORTTERM# elif validPromo.salePrice >= sellingPrice - toleranceAmount:# if validPromo.subsidy > subsidy:# subsidy = validPromo.subsidy# maxSalePrice = validPromo.salePrice# promoStartDate = validPromo.startDate# promoEndDate = validPromo.endDate# promoType = AmazonPromotionType.SHORTTERM# return subsidy, maxSalePrice, promoStartDate, promoEndDate, promoTypedef figureOutBestPossibleSubsidy(validPromosWpi, validPromosDod, sellingPrice, purchaseDate, amazonOrderId, promotionDiscount, sku):toleranceAmount = 50 if sellingPrice <=1000 else 100subsidy, maxSalePrice, tolerance, startDate, endDate = 0.0, 0.0, 0.0, None, Noneif len(validPromosDod)==0:"""No info about deals , check wpiPromo or add buffer to dod promos"""dodPromos = dodPromoMap.get(sku)if dodPromos is not None:for dodPromo in dodPromos:if dodPromo.salePrice >=(sellingPrice -toleranceAmount) and purchaseDate >= dodPromo.startDate and purchaseDate <= dodPromo.endDate + timedelta(days=2) and dodPromo.subsidy > subsidy:subsidy = dodPromo.subsidymaxSalePrice = dodPromo.salePricetolerance = toleranceAmountstartDate = dodPromo.startDateendDate = dodPromo.endDateif subsidy == 0.0:"""Still no information after adding buffer, checking wpi now"""return getInformationForWpi(validPromosWpi, sellingPrice, purchaseDate, amazonOrderId, sku, toleranceAmount)return subsidy, maxSalePrice, startDate, endDate, AmazonPromotionType.SHORTTERM, toleranceelif len(validPromosDod)==1:"""Single deal found"""if validPromosDod[0].salePrice >= sellingPrice:return validPromosDod[0].subsidy, validPromosDod[0].salePrice, validPromosDod[0].startDate, validPromosDod[0].endDate, AmazonPromotionType.SHORTTERM, 0.0elif validPromosDod[0].salePrice >= sellingPrice - toleranceAmount:return validPromosDod[0].subsidy, validPromosDod[0].salePrice, validPromosDod[0].startDate, validPromosDod[0].endDate, AmazonPromotionType.SHORTTERM, toleranceAmountelse:return getInformationForWpi(validPromosWpi, sellingPrice, purchaseDate, amazonOrderId, sku, toleranceAmount)else:"""Mutiple validPromosDod exist for order.Selecting best possible"""for promo in validPromosDod:if promo.salePrice >=sellingPrice and promo.subsidy > subsidy:subsidy = promo.subsidymaxSalePrice = promo.salePricetolerance = 0.0startDate = promo.startDateendDate = promo.endDateif subsidy == 0.0:"""Adding tolerance amount"""if promo.salePrice >=(sellingPrice-toleranceAmount) and promo.subsidy > subsidy:subsidy = promo.subsidymaxSalePrice = promo.salePricetolerance = toleranceAmountstartDate = promo.startDateendDate = promo.endDatereturn subsidy, maxSalePrice, startDate, endDate, AmazonPromotionType.SHORTTERM, tolerancedef getInformationForWpi(validPromosWpi, sellingPrice, purchaseDate, amazonOrderId, sku, toleranceAmount):subsidy, maxSalePrice, tolerance, startDate, endDate, addedOnDate = 0.0, 0.0, 0.0, None, None, Noneif len(validPromosWpi) == 0:return subsidy, maxSalePrice, tolerance, startDate, endDate, 0.0elif len(validPromosWpi) == 1:if validPromosWpi[0].salePrice >= sellingPrice:return validPromosWpi[0].subsidy, validPromosWpi[0].salePrice, validPromosWpi[0].startDate, validPromosWpi[0].endDate, AmazonPromotionType.LONGTERM, 0.0elif validPromosWpi[0].salePrice >= sellingPrice - toleranceAmount:return validPromosWpi[0].subsidy, validPromosWpi[0].salePrice, validPromosWpi[0].startDate, validPromosWpi[0].endDate, AmazonPromotionType.LONGTERM, toleranceAmountelse:return subsidy, validPromosWpi[0].salePrice, validPromosWpi[0].startDate, validPromosWpi[0].endDate, AmazonPromotionType.LONGTERM, toleranceAmountelse:"""Mutiple WPI"""for wpiPromo in validPromosWpi:if wpiPromo.salePrice >= sellingPrice and addedOnDate is None:subsidy = wpiPromo.subsidymaxSalePrice = wpiPromo.salePricestartDate = wpiPromo.startDateendDate = wpiPromo.endDatetolerance = 0.0addedOnDate = wpiPromo.addedOnelif wpiPromo.salePrice >= (sellingPrice -toleranceAmount) and addedOnDate is None:subsidy = wpiPromo.subsidymaxSalePrice = wpiPromo.salePricestartDate = wpiPromo.startDateendDate = wpiPromo.endDatetolerance = toleranceAmountaddedOnDate = wpiPromo.addedOnelif wpiPromo.salePrice >= sellingPrice and wpiPromo.subsidy > subsidy :subsidy = wpiPromo.subsidymaxSalePrice = wpiPromo.salePricestartDate = wpiPromo.startDateendDate = wpiPromo.endDatetolerance = 0.0addedOnDate = wpiPromo.addedOnelif wpiPromo.salePrice >= (sellingPrice- toleranceAmount) and wpiPromo.subsidy > subsidy:subsidy = wpiPromo.subsidymaxSalePrice = wpiPromo.salePricestartDate = wpiPromo.startDateendDate = wpiPromo.endDatetolerance = toleranceAmountaddedOnDate = wpiPromo.addedOnelse:passreturn subsidy, maxSalePrice, startDate, endDate, AmazonPromotionType.LONGTERM, tolerancedef writeHead(sheet,heading_xf):sheet.write(0, 0, "Amazon Order Id", heading_xf)sheet.write(0, 1, "Item Id", heading_xf)sheet.write(0, 2, "Amazon Sku", heading_xf)sheet.write(0, 3, "Location", heading_xf)sheet.write(0, 4, "Product Group", heading_xf)sheet.write(0, 5, "Brand", heading_xf)sheet.write(0, 6, "Product Name", heading_xf)sheet.write(0, 7, "Purchase Date", heading_xf)sheet.write(0, 8, "Selling Price", heading_xf)sheet.write(0, 9, "Quantity", heading_xf)sheet.write(0, 10, "Item Promotion Discount", heading_xf)sheet.write(0, 11, "Subsidy", heading_xf)sheet.write(0, 12, "Tolerance Amount", heading_xf)sheet.write(0, 13, "Promo Start Date", heading_xf)sheet.write(0, 14, "Promo End Date", heading_xf)sheet.write(0, 15, "MSP", heading_xf)sheet.write(0, 16, "Promo Type", heading_xf)def getItemInfo(item_id):return itemInfoMap.get(item_id)def main():populateItemInfo()populateSubsidyInfo()writeReport()if __name__=='__main__':main()