| 13480 |
kshitij.so |
1 |
from elixir import *
|
|
|
2 |
from shop2020.config.client.ConfigClient import ConfigClient
|
|
|
3 |
from shop2020.model.v1.catalog.impl import DataService
|
|
|
4 |
from shop2020.model.v1.catalog.impl.DataService import AmazonPromotion, Item
|
|
|
5 |
from shop2020.model.v1.order.script import MongoService
|
|
|
6 |
from shop2020.thriftpy.model.v1.catalog.ttypes import AmazonPromotionType
|
|
|
7 |
from shop2020.thriftpy.model.v1.order.ttypes import AmazonFCWarehouseLocation
|
|
|
8 |
from shop2020.utils.Utils import to_py_date
|
|
|
9 |
from datetime import datetime, timedelta
|
|
|
10 |
import xlwt
|
|
|
11 |
|
| 13484 |
kshitij.so |
12 |
|
| 13480 |
kshitij.so |
13 |
config_client = ConfigClient()
|
|
|
14 |
host = config_client.get_property('staging_hostname')
|
|
|
15 |
|
| 13484 |
kshitij.so |
16 |
DataService.initialize(db_hostname=host)
|
| 13480 |
kshitij.so |
17 |
|
| 13484 |
kshitij.so |
18 |
startDate = datetime.strptime('01-12-2014 00:00:00', '%d-%m-%Y %H:%M:%S')
|
|
|
19 |
endDate = datetime.strptime('28-12-2014 00:00:00', '%d-%m-%Y %H:%M:%S')
|
|
|
20 |
|
| 13480 |
kshitij.so |
21 |
wpiPromoMap = {}
|
|
|
22 |
dodPromoMap = {}
|
|
|
23 |
itemInfoMap = {}
|
|
|
24 |
|
|
|
25 |
prefix = {0:'FBA',1:'FBB',2:'FBG'}
|
|
|
26 |
|
|
|
27 |
offset, limit, sheet_iterator = 0, 1000, 1
|
|
|
28 |
|
|
|
29 |
class __ItemInfo:
|
|
|
30 |
|
|
|
31 |
def __init__(self, brand, model_name, model_number, color, productGroup):
|
|
|
32 |
self.brand = brand
|
|
|
33 |
self.model_name = model_name
|
|
|
34 |
self.model_number = model_number
|
|
|
35 |
self.color = color
|
|
|
36 |
self.productGroup = productGroup
|
|
|
37 |
|
|
|
38 |
|
|
|
39 |
def populateItemInfo():
|
|
|
40 |
global itemInfoMap
|
|
|
41 |
item_ids = MongoService.getDistinctItemsFromOrderData(startDate, endDate)
|
|
|
42 |
for item_id in item_ids:
|
|
|
43 |
it = Item.get_by(id=item_id)
|
|
|
44 |
if it is None:
|
|
|
45 |
itemInfoMap[item_id] = __ItemInfo(' ', ' ', ' ', ' ', ' ')
|
|
|
46 |
continue
|
|
|
47 |
itemInfoMap[item_id] = __ItemInfo(it.brand, it.model_name, it.model_number, it.color, it.product_group)
|
|
|
48 |
|
|
|
49 |
def populateSubsidyInfo():
|
|
|
50 |
promotions = AmazonPromotion.query.filter(AmazonPromotion.endDate>=startDate - timedelta(days=7)).filter(AmazonPromotion.endDate<=endDate + timedelta(days=7)).all()
|
|
|
51 |
for promo in promotions:
|
|
|
52 |
if not promo.promotionActive:
|
|
|
53 |
continue
|
|
|
54 |
temp = []
|
|
|
55 |
if promo.promotionType == AmazonPromotionType.LONGTERM:
|
|
|
56 |
if wpiPromoMap.has_key(promo.sku):
|
|
|
57 |
val = wpiPromoMap.get(promo.sku)
|
|
|
58 |
for l in val:
|
|
|
59 |
temp.append(l)
|
|
|
60 |
temp.append(promo)
|
|
|
61 |
wpiPromoMap[promo.sku] = temp
|
|
|
62 |
else:
|
|
|
63 |
temp.append(promo)
|
|
|
64 |
wpiPromoMap[promo.sku] = temp
|
|
|
65 |
else:
|
|
|
66 |
if dodPromoMap.has_key(promo.sku):
|
|
|
67 |
val = dodPromoMap.get(promo.sku)
|
|
|
68 |
for l in val:
|
|
|
69 |
temp.append(l)
|
|
|
70 |
temp.append(promo)
|
|
|
71 |
dodPromoMap[promo.sku] = temp
|
|
|
72 |
else:
|
|
|
73 |
temp.append(promo)
|
|
|
74 |
dodPromoMap[promo.sku] = temp
|
|
|
75 |
|
|
|
76 |
def writeReport():
|
|
|
77 |
global sheet_iterator
|
|
|
78 |
global offset
|
|
|
79 |
wbk = xlwt.Workbook(encoding="UTF-8")
|
|
|
80 |
sheet = wbk.add_sheet('AmazonSubsidy')
|
|
|
81 |
xstr = lambda s: s or ""
|
|
|
82 |
heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
|
|
|
83 |
|
|
|
84 |
excel_integer_format = '0'
|
|
|
85 |
integer_style = xlwt.XFStyle()
|
|
|
86 |
integer_style.num_format_str = excel_integer_format
|
|
|
87 |
writeHead(sheet,heading_xf)
|
|
|
88 |
while(True):
|
|
|
89 |
orders = MongoService.getAmazonOrderData(startDate, endDate, offset, limit)
|
|
|
90 |
if len(orders) == 0:
|
|
|
91 |
break
|
|
|
92 |
for order in orders:
|
|
|
93 |
sheet.write(sheet_iterator, 0, order.amazonOrderId)
|
|
|
94 |
sheet.write(sheet_iterator, 1, order.item_id)
|
|
|
95 |
sheet.write(sheet_iterator, 2, prefix.get(AmazonFCWarehouseLocation._NAMES_TO_VALUES.get(order.fcLocation))+str(order.item_id))
|
|
|
96 |
sheet.write(sheet_iterator, 3, order.fcLocation)
|
|
|
97 |
sheet.write(sheet_iterator, 4, getItemInfo(order.item_id).productGroup)
|
|
|
98 |
sheet.write(sheet_iterator, 5, getItemInfo(order.item_id).brand)
|
|
|
99 |
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))
|
|
|
100 |
sheet.write(sheet_iterator, 7, str(to_py_date(order.purchaseDate)))
|
|
|
101 |
sheet.write(sheet_iterator, 8, order.totalAmount)
|
|
|
102 |
sheet.write(sheet_iterator, 9, order.quantity)
|
|
|
103 |
sheet.write(sheet_iterator, 10, order.promotionDiscount)
|
|
|
104 |
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)
|
|
|
105 |
if subsidy > 0:
|
|
|
106 |
sheet.write(sheet_iterator, 11, (order.quantity)*(subsidy))
|
|
|
107 |
sheet.write(sheet_iterator, 12, toleranceAmount)
|
|
|
108 |
sheet.write(sheet_iterator, 13, str(promoStartDate))
|
|
|
109 |
sheet.write(sheet_iterator, 14, str(promoEndDate))
|
|
|
110 |
sheet.write(sheet_iterator, 15, maxSalePrice)
|
|
|
111 |
sheet.write(sheet_iterator, 16, AmazonPromotionType._VALUES_TO_NAMES.get(promoType))
|
|
|
112 |
sheet_iterator+=1
|
|
|
113 |
offset = offset + 1000
|
|
|
114 |
file_subsidy = "/tmp/subsidy"+" " + str(datetime.now()) + ".xls"
|
|
|
115 |
wbk.save(file_subsidy)
|
|
|
116 |
|
|
|
117 |
def calculateSubsidy(item_id, fcLocation, purchaseDate, sellingPrice, amazonOrderId, promotionDiscount):
|
|
|
118 |
validPromosWpi = []
|
|
|
119 |
validPromosDod = []
|
|
|
120 |
sku = prefix.get(fcLocation)+str(item_id)
|
|
|
121 |
if wpiPromoMap.has_key(sku):
|
|
|
122 |
promos = wpiPromoMap.get(sku)
|
|
|
123 |
for promo in promos:
|
|
|
124 |
if promo.startDate <= purchaseDate and promo.endDate >= purchaseDate:
|
|
|
125 |
validPromosWpi.append(promo)
|
|
|
126 |
if dodPromoMap.has_key(sku):
|
|
|
127 |
promos = dodPromoMap.get(sku)
|
|
|
128 |
for promo in promos:
|
|
|
129 |
if promo.startDate <= purchaseDate and promo.endDate >= purchaseDate:
|
|
|
130 |
validPromosDod.append(promo)
|
|
|
131 |
return figureOutBestPossibleSubsidy(validPromosWpi, validPromosDod, sellingPrice, purchaseDate, amazonOrderId, promotionDiscount, sku)
|
|
|
132 |
|
|
|
133 |
#def figureOutBestPossibleSubsidy(validPromosWpi, validPromosDod , sellingPrice, purchaseDate,amazonOrderId):
|
|
|
134 |
# if len(validPromos) > 0:
|
|
|
135 |
# print "No of valid promo for sku ", (validPromos[0]).sku ,"is ", len(validPromos), "and purchase date ", purchaseDate, "amazon order id ",amazonOrderId
|
|
|
136 |
# subsidy, maxSalePrice, promoStartDate, promoEndDate, promoType = 0.0, 0.0, None, None, None
|
|
|
137 |
# toleranceAmount = 50 if sellingPrice <=1000 else 100
|
|
|
138 |
# for validPromo in validPromos:
|
|
|
139 |
# if validPromo.promotionType == AmazonPromotionType.LONGTERM:
|
|
|
140 |
# if validPromo.salePrice >= sellingPrice:
|
|
|
141 |
# if validPromo.subsidy > subsidy:
|
|
|
142 |
# subsidy = validPromo.subsidy
|
|
|
143 |
# maxSalePrice = validPromo.salePrice
|
|
|
144 |
# promoStartDate = validPromo.startDate
|
|
|
145 |
# promoEndDate = validPromo.endDate
|
|
|
146 |
# promoType = AmazonPromotionType.LONGTERM
|
|
|
147 |
# elif validPromo.salePrice >= sellingPrice - toleranceAmount:
|
|
|
148 |
# if validPromo.subsidy > subsidy:
|
|
|
149 |
# subsidy = validPromo.subsidy
|
|
|
150 |
# maxSalePrice = validPromo.salePrice
|
|
|
151 |
# promoStartDate = validPromo.startDate
|
|
|
152 |
# promoEndDate = validPromo.endDate
|
|
|
153 |
# promoType = AmazonPromotionType.LONGTERM
|
|
|
154 |
# elif validPromo.promotionType == AmazonPromotionType.SHORTTERM:
|
|
|
155 |
# if validPromo.salePrice >= sellingPrice:
|
|
|
156 |
# if validPromo.subsidy > subsidy:
|
|
|
157 |
# subsidy = validPromo.subsidy
|
|
|
158 |
# maxSalePrice = validPromo.salePrice
|
|
|
159 |
# promoStartDate = validPromo.startDate
|
|
|
160 |
# promoEndDate = validPromo.endDate
|
|
|
161 |
# promoType = AmazonPromotionType.SHORTTERM
|
|
|
162 |
# elif validPromo.salePrice >= sellingPrice - toleranceAmount:
|
|
|
163 |
# if validPromo.subsidy > subsidy:
|
|
|
164 |
# subsidy = validPromo.subsidy
|
|
|
165 |
# maxSalePrice = validPromo.salePrice
|
|
|
166 |
# promoStartDate = validPromo.startDate
|
|
|
167 |
# promoEndDate = validPromo.endDate
|
|
|
168 |
# promoType = AmazonPromotionType.SHORTTERM
|
|
|
169 |
# return subsidy, maxSalePrice, promoStartDate, promoEndDate, promoType
|
|
|
170 |
|
|
|
171 |
def figureOutBestPossibleSubsidy(validPromosWpi, validPromosDod, sellingPrice, purchaseDate, amazonOrderId, promotionDiscount, sku):
|
|
|
172 |
toleranceAmount = 50 if sellingPrice <=1000 else 100
|
|
|
173 |
subsidy, maxSalePrice, tolerance, startDate, endDate = 0.0, 0.0, 0.0, None, None
|
|
|
174 |
if len(validPromosDod)==0:
|
|
|
175 |
"""No info about deals , check wpiPromo or add buffer to dod promos"""
|
|
|
176 |
dodPromos = dodPromoMap.get(sku)
|
|
|
177 |
if dodPromos is not None:
|
|
|
178 |
for dodPromo in dodPromos:
|
|
|
179 |
if dodPromo.salePrice >=(sellingPrice -toleranceAmount) and purchaseDate >= dodPromo.startDate and purchaseDate <= dodPromo.endDate + timedelta(days=2) and dodPromo.subsidy > subsidy:
|
|
|
180 |
subsidy = dodPromo.subsidy
|
|
|
181 |
maxSalePrice = dodPromo.salePrice
|
|
|
182 |
tolerance = toleranceAmount
|
|
|
183 |
startDate = dodPromo.startDate
|
|
|
184 |
endDate = dodPromo.endDate
|
|
|
185 |
if subsidy == 0.0:
|
|
|
186 |
"""Still no information after adding buffer, checking wpi now"""
|
|
|
187 |
return getInformationForWpi(validPromosWpi, sellingPrice, purchaseDate, amazonOrderId, sku, toleranceAmount)
|
|
|
188 |
return subsidy, maxSalePrice, startDate, endDate, AmazonPromotionType.SHORTTERM, tolerance
|
|
|
189 |
elif len(validPromosDod)==1:
|
|
|
190 |
"""Single deal found"""
|
|
|
191 |
if validPromosDod[0].salePrice >= sellingPrice:
|
|
|
192 |
return validPromosDod[0].subsidy, validPromosDod[0].salePrice, validPromosDod[0].startDate, validPromosDod[0].endDate, AmazonPromotionType.SHORTTERM, 0.0
|
|
|
193 |
elif validPromosDod[0].salePrice >= sellingPrice - toleranceAmount:
|
|
|
194 |
return validPromosDod[0].subsidy, validPromosDod[0].salePrice, validPromosDod[0].startDate, validPromosDod[0].endDate, AmazonPromotionType.SHORTTERM, toleranceAmount
|
|
|
195 |
else:
|
|
|
196 |
return getInformationForWpi(validPromosWpi, sellingPrice, purchaseDate, amazonOrderId, sku, toleranceAmount)
|
|
|
197 |
else:
|
|
|
198 |
"""Mutiple validPromosDod exist for order.Selecting best possible"""
|
|
|
199 |
for promo in validPromosDod:
|
|
|
200 |
if promo.salePrice >=sellingPrice and promo.subsidy > subsidy:
|
|
|
201 |
subsidy = promo.subsidy
|
|
|
202 |
maxSalePrice = promo.salePrice
|
|
|
203 |
tolerance = 0.0
|
|
|
204 |
startDate = promo.startDate
|
|
|
205 |
endDate = promo.endDate
|
|
|
206 |
if subsidy == 0.0:
|
|
|
207 |
"""Adding tolerance amount"""
|
|
|
208 |
if promo.salePrice >=(sellingPrice-toleranceAmount) and promo.subsidy > subsidy:
|
|
|
209 |
subsidy = promo.subsidy
|
|
|
210 |
maxSalePrice = promo.salePrice
|
|
|
211 |
tolerance = toleranceAmount
|
|
|
212 |
startDate = promo.startDate
|
|
|
213 |
endDate = promo.endDate
|
|
|
214 |
return subsidy, maxSalePrice, startDate, endDate, AmazonPromotionType.SHORTTERM, tolerance
|
|
|
215 |
|
|
|
216 |
def getInformationForWpi(validPromosWpi, sellingPrice, purchaseDate, amazonOrderId, sku, toleranceAmount):
|
|
|
217 |
subsidy, maxSalePrice, tolerance, startDate, endDate, addedOnDate = 0.0, 0.0, 0.0, None, None, None
|
|
|
218 |
if len(validPromosWpi) == 0:
|
|
|
219 |
return subsidy, maxSalePrice, tolerance, startDate, endDate, 0.0
|
|
|
220 |
|
|
|
221 |
elif len(validPromosWpi) == 1:
|
|
|
222 |
if validPromosWpi[0].salePrice >= sellingPrice:
|
|
|
223 |
return validPromosWpi[0].subsidy, validPromosWpi[0].salePrice, validPromosWpi[0].startDate, validPromosWpi[0].endDate, AmazonPromotionType.LONGTERM, 0.0
|
|
|
224 |
|
|
|
225 |
elif validPromosWpi[0].salePrice >= sellingPrice - toleranceAmount:
|
|
|
226 |
return validPromosWpi[0].subsidy, validPromosWpi[0].salePrice, validPromosWpi[0].startDate, validPromosWpi[0].endDate, AmazonPromotionType.LONGTERM, toleranceAmount
|
|
|
227 |
|
|
|
228 |
else:
|
|
|
229 |
return subsidy, validPromosWpi[0].salePrice, validPromosWpi[0].startDate, validPromosWpi[0].endDate, AmazonPromotionType.LONGTERM, toleranceAmount
|
|
|
230 |
else:
|
|
|
231 |
"""Mutiple WPI"""
|
|
|
232 |
for wpiPromo in validPromosWpi:
|
|
|
233 |
if wpiPromo.salePrice >= sellingPrice and addedOnDate is None:
|
|
|
234 |
subsidy = wpiPromo.subsidy
|
|
|
235 |
maxSalePrice = wpiPromo.salePrice
|
|
|
236 |
startDate = wpiPromo.startDate
|
|
|
237 |
endDate = wpiPromo.endDate
|
|
|
238 |
tolerance = 0.0
|
|
|
239 |
addedOnDate = wpiPromo.addedOn
|
|
|
240 |
elif wpiPromo.salePrice >= (sellingPrice -toleranceAmount) and addedOnDate is None:
|
|
|
241 |
subsidy = wpiPromo.subsidy
|
|
|
242 |
maxSalePrice = wpiPromo.salePrice
|
|
|
243 |
startDate = wpiPromo.startDate
|
|
|
244 |
endDate = wpiPromo.endDate
|
|
|
245 |
tolerance = toleranceAmount
|
|
|
246 |
addedOnDate = wpiPromo.addedOn
|
|
|
247 |
elif wpiPromo.salePrice >= sellingPrice and wpiPromo.subsidy > subsidy :
|
|
|
248 |
subsidy = wpiPromo.subsidy
|
|
|
249 |
maxSalePrice = wpiPromo.salePrice
|
|
|
250 |
startDate = wpiPromo.startDate
|
|
|
251 |
endDate = wpiPromo.endDate
|
|
|
252 |
tolerance = 0.0
|
|
|
253 |
addedOnDate = wpiPromo.addedOn
|
|
|
254 |
elif wpiPromo.salePrice >= (sellingPrice- toleranceAmount) and wpiPromo.subsidy > subsidy:
|
|
|
255 |
subsidy = wpiPromo.subsidy
|
|
|
256 |
maxSalePrice = wpiPromo.salePrice
|
|
|
257 |
startDate = wpiPromo.startDate
|
|
|
258 |
endDate = wpiPromo.endDate
|
|
|
259 |
tolerance = toleranceAmount
|
|
|
260 |
addedOnDate = wpiPromo.addedOn
|
|
|
261 |
else:
|
|
|
262 |
pass
|
|
|
263 |
return subsidy, maxSalePrice, startDate, endDate, AmazonPromotionType.LONGTERM, tolerance
|
|
|
264 |
|
|
|
265 |
|
|
|
266 |
def writeHead(sheet,heading_xf):
|
|
|
267 |
sheet.write(0, 0, "Amazon Order Id", heading_xf)
|
|
|
268 |
sheet.write(0, 1, "Item Id", heading_xf)
|
|
|
269 |
sheet.write(0, 2, "Amazon Sku", heading_xf)
|
|
|
270 |
sheet.write(0, 3, "Location", heading_xf)
|
|
|
271 |
sheet.write(0, 4, "Product Group", heading_xf)
|
|
|
272 |
sheet.write(0, 5, "Brand", heading_xf)
|
|
|
273 |
sheet.write(0, 6, "Product Name", heading_xf)
|
|
|
274 |
sheet.write(0, 7, "Purchase Date", heading_xf)
|
|
|
275 |
sheet.write(0, 8, "Selling Price", heading_xf)
|
|
|
276 |
sheet.write(0, 9, "Quantity", heading_xf)
|
|
|
277 |
sheet.write(0, 10, "Item Promotion Discount", heading_xf)
|
|
|
278 |
sheet.write(0, 11, "Subsidy", heading_xf)
|
|
|
279 |
sheet.write(0, 12, "Tolerance Amount", heading_xf)
|
|
|
280 |
sheet.write(0, 13, "Promo Start Date", heading_xf)
|
|
|
281 |
sheet.write(0, 14, "Promo End Date", heading_xf)
|
|
|
282 |
sheet.write(0, 15, "MSP", heading_xf)
|
|
|
283 |
sheet.write(0, 16, "Promo Type", heading_xf)
|
|
|
284 |
|
|
|
285 |
def getItemInfo(item_id):
|
|
|
286 |
return itemInfoMap.get(item_id)
|
|
|
287 |
|
|
|
288 |
def main():
|
|
|
289 |
populateItemInfo()
|
|
|
290 |
populateSubsidyInfo()
|
|
|
291 |
writeReport()
|
|
|
292 |
|
|
|
293 |
if __name__=='__main__':
|
|
|
294 |
main()
|