Subversion Repositories SmartDukaan

Rev

Rev 13480 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
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()