Rev 12241 | Blame | Compare with Previous | Last modification | View Log | RSS feed
from elixir import *from sqlalchemy.sql import funcfrom shop2020.model.v1.order.impl import DataServicefrom shop2020.model.v1.order.impl.DataService import Order, LineItemfrom shop2020.thriftpy.model.v1.order.ttypes import OrderSourcefrom datetime import datetime, timedeltaimport MySQLdbimport xlwtfrom operator import itemgetterimport smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email import encodersfrom email.mime.text import MIMETextfrom email.mime.base import MIMEBasefrom email.mime.multipart import MIMEMultipartDataService.initialize(db_hostname='192.168.190.114')SaleMap = {}BrandCatMap = {}UnUsableStatus = [25, 27, 30, 32, 47, 48, 68, 71, 72, 73, 74]UsableStatus = [21, 28, 64, 67, 69, 70]db = MySQLdb.connect('localhost',"root","shop2020","warehouse" )cursor = db.cursor()class __SaleAndReturnInfo:def __init__(self, websiteSale, amazonSale, ebaySale, snapdealSale, flipkartSale, productGroup, sellableCountWebsite, nonSellableCountWebsite, sellableCountAmazon, \nonSellableCountAmazon,sellableCountEbay,nonSellableCountEbay,sellableCountSnapdeal,nonSellableCountSnapdeal,sellableCountFlipkart,nonSellableCountFlipkart, \brand, model_name, model_number, color, sellableWebsitePercentage, nonSellableWebsitePercentage, sellableAmazonPercentage, nonSellableAmazonPercentage, \sellableEbayPercentage, nonSellableEbayPercentage, sellableSnapdealPercentage, nonSellableSnapdealPercentage, sellableFlipkartPercentage, nonSellableFlipkartPercentage, \sellableOverallPercentage, nonSellableOverallPercentage, item_id):self.websiteSale = websiteSaleself.amazonSale = amazonSaleself.ebaySale = ebaySaleself.snapdealSale = snapdealSaleself.flipkartSale = flipkartSaleself.productGroup = productGroupself.sellableCountWebsite = sellableCountWebsiteself.nonSellableCountWebsite = nonSellableCountWebsiteself.sellableCountAmazon = sellableCountAmazonself.nonSellableCountAmazon = nonSellableCountAmazonself.sellableCountEbay = sellableCountEbayself.nonSellableCountEbay = nonSellableCountEbayself.sellableCountSnapdeal = sellableCountSnapdealself.nonSellableCountSnapdeal = nonSellableCountSnapdealself.sellableCountFlipkart = sellableCountFlipkartself.nonSellableCountFlipkart = nonSellableCountFlipkartself.brand = brandself.model_name = model_nameself.model_number = model_numberself.color = colorself.sellableWebsitePercentage = sellableWebsitePercentageself.nonSellableWebsitePercentage = nonSellableWebsitePercentageself.sellableAmazonPercentage = sellableAmazonPercentageself.nonSellableAmazonPercentage = nonSellableAmazonPercentageself.sellableEbayPercentage = sellableEbayPercentageself.nonSellableEbayPercentage = nonSellableEbayPercentageself.sellableSnapdealPercentage = sellableSnapdealPercentageself.nonSellableSnapdealPercentage = nonSellableSnapdealPercentageself.sellableFlipkartPercentage = sellableFlipkartPercentageself.nonSellableFlipkartPercentage = nonSellableFlipkartPercentageself.sellablOverallPercentage = sellableOverallPercentageself.nonSellableOverallPercentage = nonSellableOverallPercentageself.item_id = item_idclass __BrandCatInfo:def __init__(self, totalSale, nonSellableReturn, nonSellableReturnPercentage, brand, productGroup):self.totalSale = totalSaleself.nonSellableReturn = nonSellableReturnself.nonSellableReturnPercentage = nonSellableReturnPercentageself.brand = brandself.productGroup = productGroupdef populateSaleInfo():global SaleMapfromDate = (datetime.now()-timedelta(days=45))toDate = (fromDate + timedelta(days=15))#allShippedOrders = Order.query.filter(Order.created_timestamp.between(fromDate.date(),toDate.date())).filter(Order.shipping_timestamp!=None).all()allShippedOrders = session.query(LineItem.item_id,LineItem.productGroup,Order.source,Order.status,Order.received_return_timestamp, \LineItem.quantity,Order.id,LineItem.brand,LineItem.model_name,LineItem.model_number,LineItem.color) \.join((Order,LineItem.order_id==Order.id)).filter(Order.created_timestamp.between(fromDate.date(),toDate.date())) \.filter(Order.shipping_timestamp!=None).filter(LineItem.productGroup.in_(('Handsets','Mobile Handset','Smart Phone','Mobile Phone','Tablets'))).all()for shippedOrder in allShippedOrders:if SaleMap.has_key(shippedOrder[0]):val = SaleMap.get(shippedOrder[0])if shippedOrder[2] in (OrderSource.WEBSITE,OrderSource.MOBILESITE):val.websiteSale = val.websiteSale + shippedOrder[5]elif shippedOrder[2]==OrderSource.AMAZON:val.amazonSale = val.amazonSale + shippedOrder[5]elif shippedOrder[2]==OrderSource.EBAY:val.ebaySale = val.ebaySale + shippedOrder[5]elif shippedOrder[2]==OrderSource.SNAPDEAL:val.snapdealSale = val.snapdealSale + shippedOrder[5]elif shippedOrder[2]==OrderSource.FLIPKART:val.flipkartSale = val.flipkartSale + shippedOrder[5]else:print "Unknown source for orderId ",shippedOrder[6]else:saleInfo = __SaleAndReturnInfo(0,0,0,0,0,shippedOrder[1],0,0,0,0,0,0,0,0,0,0,shippedOrder[7],shippedOrder[8],shippedOrder[9],shippedOrder[10], \0,0,0,0,0,0,0,0,0,0,0,0,shippedOrder[0])if shippedOrder[2] in (OrderSource.WEBSITE,OrderSource.MOBILESITE):saleInfo.websiteSale = saleInfo.websiteSale + shippedOrder[5]elif shippedOrder[2]==OrderSource.AMAZON:saleInfo.amazonSale = saleInfo.amazonSale + shippedOrder[5]elif shippedOrder[2]==OrderSource.EBAY:saleInfo.ebaySale = saleInfo.ebaySale + shippedOrder[5]elif shippedOrder[2]==OrderSource.SNAPDEAL:saleInfo.snapdealSale = saleInfo.snapdealSale + shippedOrder[5]elif shippedOrder[2]==OrderSource.FLIPKART:saleInfo.flipkartSale = saleInfo.flipkartSale + shippedOrder[5]else:print "Unknown source for orderId ",shippedOrder[6]SaleMap[shippedOrder[0]]=saleInfo#Checking returnsfor shippedOrder in allShippedOrders:if shippedOrder[4] is not None:val = SaleMap.get(shippedOrder[0])sql = "select quantity,type from scanNew where orderId=%d and type in ('SALE_RET','DOA_IN','SALE_RET_UNUSABLE')" %(shippedOrder[6])cursor.execute(sql)result = cursor.fetchone()print resultif result is None:continuequantity = result[0]returnType = result[1]if shippedOrder[2] in (OrderSource.WEBSITE,OrderSource.MOBILESITE):if returnType in ('DOA_IN','SALE_RET_UNUSABLE'):val.nonSellableCountWebsite = val.nonSellableCountWebsite + quantityelse:val.sellableCountWebsite = val.sellableCountWebsite + quantityelif shippedOrder[2]==OrderSource.AMAZON:if returnType in ('DOA_IN','SALE_RET_UNUSABLE'):val.nonSellableCountAmazon = val.nonSellableCountAmazon + quantityelse:val.sellableCountAmazon = val.sellableCountAmazon + quantityelif shippedOrder[2]==OrderSource.EBAY:if returnType in ('DOA_IN','SALE_RET_UNUSABLE'):val.nonSellableCountEbay = val.nonSellableCountEbay + quantityelse:val.sellableCountEbay = val.sellableCountEbay + quantityelif shippedOrder[2]==OrderSource.SNAPDEAL:if returnType in ('DOA_IN','SALE_RET_UNUSABLE'):val.nonSellableCountSnapdeal = val.nonSellableCountSnapdeal + quantityelse:val.sellableCountSnapdeal = val.sellableCountSnapdeal + quantityelif shippedOrder[2]==OrderSource.FLIPKART:if returnType in ('DOA_IN','SALE_RET_UNUSABLE'):val.nonSellableCountFlipkart = val.nonSellableCountFlipkart + quantityelse:val.sellableCountFlipkart = val.sellableCountFlipkart + quantityelse:print "Not counting, unknown source"allShippedOrders[:] = []db.close()def calculateReturnPercentage():global SaleMapfor k, v in SaleMap.iteritems():if v.websiteSale > 0:v.sellableWebsitePercentage = float(v.sellableCountWebsite)/v.websiteSalev.nonSellableWebsitePercentage = float(v.nonSellableCountWebsite)/v.websiteSaleif v.amazonSale > 0:v.sellableAmazonPercentage = float(v.sellableCountAmazon)/v.amazonSalev.nonSellableAmazonPercentage = float(v.nonSellableCountAmazon)/v.amazonSaleif v.ebaySale > 0:v.sellableEbayPercentage = float(v.sellableCountEbay)/v.ebaySalev.nonSellableEbayPercentage = float(v.nonSellableCountEbay)/v.ebaySaleif v.snapdealSale > 0:v.sellableSnapdealPercentage = float(v.sellableCountSnapdeal)/v.snapdealSalev.nonSellableSnapdealPercentage = float(v.nonSellableCountSnapdeal)/v.snapdealSaleif v.flipkartSale > 0:v.sellableFlipkartPercentage = float(v.sellableCountFlipkart)/v.flipkartSalev.nonSellableFlipkartPercentage = float(v.nonSellableCountFlipkart)/v.flipkartSaleif (v.websiteSale+v.amazonSale+v.ebaySale+v.snapdealSale+v.flipkartSale) > 0:v.sellableOverallPercentage = float(v.sellableCountWebsite+v.sellableCountAmazon+v.sellableCountEbay+ \v.sellableCountSnapdeal+v.sellableCountFlipkart)/(v.websiteSale+v.amazonSale+v.ebaySale+v.snapdealSale+v.flipkartSale)v.nonSellableOverallPercentage = float(v.nonSellableCountWebsite+v.nonSellableCountAmazon+v.nonSellableCountEbay+ \v.nonSellableCountSnapdeal+v.nonSellableCountFlipkart)/(v.websiteSale+v.amazonSale+v.ebaySale+v.snapdealSale+v.flipkartSale)def exit():import syssys.exit(1)def sendEmail():xstr = lambda s: s or ""message="""<html><body><h3>Source Wise Return</h3><h4>Orders from """+str((datetime.now()-timedelta(days=45)).date())+"""to """+str((datetime.now()-timedelta(days=30)).date())+"""</h4><table border="1" style="width:50%;"><thead><tr><th>Source</th><th>Total Sale</th><th>Total Returns</th><th>Total Sellable Returns</th><th>Total Non Sellable Returns</th><th>Return %</th><th>Sellable Return %</th><th>Non Sellable Return %</th></tr></thead><tbody>"""websiteSale, websiteSellableReturns, websiteNonSellableReturns, amazonSale, amazonSellableReturns, amazonNonSellableReturns, \ebaySale, ebaySellableReturns, ebayNonSellableReturns, snapdealSale, snapdealSellableReturns, snapdealNonSellableReturns, \flipkartSale, flipkartSellableReturns , flipkartNonSellableReturns, overallSale, overallSellableReturns, overallNonSellableReturns = (0,)*18for k, v in SaleMap.iteritems():websiteSale = websiteSale + v.websiteSalewebsiteSellableReturns = websiteSellableReturns + v.sellableCountWebsitewebsiteNonSellableReturns = websiteNonSellableReturns + v.nonSellableCountWebsiteamazonSale = amazonSale + v.amazonSaleamazonSellableReturns = amazonSellableReturns + v.sellableCountAmazonamazonNonSellableReturns = amazonNonSellableReturns + v.nonSellableCountAmazonebaySale = ebaySale + v.ebaySaleebaySellableReturns = ebaySellableReturns + v.sellableCountEbayebayNonSellableReturns = ebayNonSellableReturns + v.nonSellableCountEbaysnapdealSale = snapdealSale + v.snapdealSalesnapdealSellableReturns = snapdealSellableReturns + v.sellableCountSnapdealsnapdealNonSellableReturns = snapdealNonSellableReturns + v.nonSellableCountSnapdealflipkartSale = flipkartSale + v.flipkartSaleflipkartSellableReturns = flipkartSellableReturns + v.sellableCountFlipkartflipkartNonSellableReturns = flipkartNonSellableReturns + v.nonSellableCountFlipkartoverallSale = overallSale + websiteSale + amazonSale + ebaySale + snapdealSale + flipkartSaleoverallSellableReturns = overallSellableReturns + websiteSellableReturns + amazonSellableReturns + ebaySellableReturns + snapdealSellableReturns + flipkartSellableReturnsoverallNonSellableReturns = overallNonSellableReturns + websiteNonSellableReturns + amazonNonSellableReturns + ebayNonSellableReturns + snapdealNonSellableReturns + flipkartNonSellableReturnsmessage+="""<tr><td style="text-align:center">"""+"Website"+"""</td><td style="text-align:center">"""+str(int(websiteSale))+"""</td><td style="text-align:center">"""+str(websiteSellableReturns+websiteNonSellableReturns)+"""</td><td style="text-align:center">"""+str(websiteSellableReturns)+"""</td><td style="text-align:center">"""+str(websiteNonSellableReturns)+"""</td><td style="text-align:center">"""+str(round(float(websiteSellableReturns+websiteNonSellableReturns)*100/websiteSale,1))+" %"+"""</td><td style="text-align:center">"""+str(round(float(websiteSellableReturns)*100/websiteSale,1))+" %"+"""</td><td style="text-align:center">"""+str(round(float(websiteNonSellableReturns)*100/websiteSale,1))+" %"+"""</td></tr><tr><td style="text-align:center">"""+"Amazon MFN"+"""</td><td style="text-align:center">"""+str(int(amazonSale))+"""</td><td style="text-align:center">"""+str(amazonSellableReturns+amazonNonSellableReturns)+"""</td><td style="text-align:center">"""+str(amazonSellableReturns)+"""</td><td style="text-align:center">"""+str(amazonNonSellableReturns)+"""</td><td style="text-align:center">"""+str(round(float(amazonSellableReturns+amazonNonSellableReturns)*100/amazonSale,1))+" %"+"""</td><td style="text-align:center">"""+str(round(float(amazonSellableReturns)*100/amazonSale,1))+" %"+"""</td><td style="text-align:center">"""+str(round(float(amazonNonSellableReturns)*100/amazonSale,1))+" %"+"""</td></tr><tr><td style="text-align:center">"""+"Ebay"+"""</td><td style="text-align:center">"""+str(int(ebaySale))+"""</td><td style="text-align:center">"""+str(ebaySellableReturns+ebayNonSellableReturns)+"""</td><td style="text-align:center">"""+str(ebaySellableReturns)+"""</td><td style="text-align:center">"""+str(ebayNonSellableReturns)+"""</td><td style="text-align:center">"""+str(round(float(ebaySellableReturns+ebayNonSellableReturns)*100/ebaySale,1))+" %"+"""</td><td style="text-align:center">"""+str(round(float(ebaySellableReturns)*100/ebaySale,1))+" %"+"""</td><td style="text-align:center">"""+str(round(float(ebayNonSellableReturns)*100/ebaySale,1))+" %"+"""</td></tr><tr><td style="text-align:center">"""+"Snapdeal"+"""</td><td style="text-align:center">"""+str(int(snapdealSale))+"""</td><td style="text-align:center">"""+str(snapdealSellableReturns+snapdealNonSellableReturns)+"""</td><td style="text-align:center">"""+str(snapdealSellableReturns)+"""</td><td style="text-align:center">"""+str(snapdealNonSellableReturns)+"""</td><td style="text-align:center">"""+str(round(float(snapdealSellableReturns+snapdealNonSellableReturns)*100/snapdealSale,1))+" %"+"""</td><td style="text-align:center">"""+str(round(float(snapdealSellableReturns)*100/snapdealSale,1))+" %"+"""</td><td style="text-align:center">"""+str(round(float(snapdealNonSellableReturns)*100/snapdealSale,1))+" %"+"""</td></tr><tr><td style="text-align:center">"""+"Flipkart"+"""</td><td style="text-align:center">"""+str(int(flipkartSale))+"""</td><td style="text-align:center">"""+str(flipkartSellableReturns+flipkartNonSellableReturns)+"""</td><td style="text-align:center">"""+str(flipkartSellableReturns)+"""</td><td style="text-align:center">"""+str(flipkartNonSellableReturns)+"""</td><td style="text-align:center">"""+str(round(float(flipkartSellableReturns+flipkartNonSellableReturns)*100/flipkartSale,1))+" %"+"""</td><td style="text-align:center">"""+str(round(float(flipkartSellableReturns)*100/flipkartSale,1))+" %"+"""</td><td style="text-align:center">"""+str(round(float(flipkartNonSellableReturns)*100/flipkartSale,1))+" %"+"""</td></tr><tr><td style="text-align:center">"""+"Total"+"""</td><td style="text-align:center">"""+str(int(overallSale))+"""</td><td style="text-align:center">"""+str(overallSellableReturns+overallNonSellableReturns)+"""</td><td style="text-align:center">"""+str(overallSellableReturns)+"""</td><td style="text-align:center">"""+str(overallNonSellableReturns)+"""</td><td style="text-align:center">"""+str(round(float(overallSellableReturns+overallNonSellableReturns)*100/overallSale,1))+" %"+"""</td><td style="text-align:center">"""+str(round(float(overallSellableReturns)*100/overallSale,1))+" %"+"""</td><td style="text-align:center">"""+str(round(float(overallNonSellableReturns)*100/overallSale,1))+" %"+"""</td></tr></tbody></table>"""topWebsite, topAmazon, topEbay, topSnapdeal, topFlipkart, topOverall = [],[],[],[],[],[]for v in SaleMap.itervalues():# if v.websiteSale >=10:# topWebsite.append(v)# if v.amazonSale >=10:# topAmazon.append(v)# if v.ebaySale >=10:# topEbay.append(v)# if v.snapdealSale >=10:# topSnapdeal.append(v)# if v.flipkartSale >=10:# topFlipkart.append(v)if (v.websiteSale + v.amazonSale + v.ebaySale + v.snapdealSale + v.flipkartSale) >=25:topOverall.append(v)sortedHighReturnRate = sorted(topOverall, key=lambda x: x.nonSellableOverallPercentage, reverse=True)message+="""<h3>Top Sku's with high sale return</h3><table border="1" style="width:100%;"><thead><tr><th>Item Id</th><th>Product Name</th><th>Website Sale</th><th>Website Sellable Returns</th><th>Website Non Sellable Returns</th><th>Website Sellable Returns %</th><th>Website Non Sellable Returns %</th><th>Amazon Sale</th><th>Amazon Sellable Returns</th><th>Amazon Non Sellable Returns</th><th>Amazon Sellable Returns %</th><th>Amazon Non Sellable Returns %</th><th>Ebay Sale</th><th>Ebay Sellable Returns</th><th>Ebay Non Sellable Returns</th><th>Ebay Sellable Returns %</th><th>Ebay Non Sellable Returns %</th><th>Snapdeal Sale</th><th>Snapdeal Sellable Returns</th><th>Snapdeal Non Sellable Returns</th><th>Snapdeal Sellable Returns %</th><th>Snapdeal Non Sellable Returns %</th><th>Flipkart Sale</th><th>Flipkart Sellable Returns</th><th>Flipkart Non Sellable Returns</th><th>Flipkart Sellable Returns %</th><th>Flipkart Non Sellable Returns %</th><th>Total Sale</th><th>Total Sellable Returns</th><th>Total Non Sellable Returns</th><th>Total Sellable Returns %</th><th>Total Non Sellable Returns %</th></tr></thead><tbody>"""countItems = 0for highReturnData in sortedHighReturnRate:if countItems==11:breakcountItems+=1message+="""<tr><td style="text-align:center">"""+str(highReturnData.item_id)+"""</td><td style="text-align:center">"""+xstr(highReturnData.brand)+" "+xstr(highReturnData.model_name)+" "+xstr(highReturnData.model_number)+" "+xstr(highReturnData.color)+"""</td><td style="text-align:center">"""+str(int(highReturnData.websiteSale))+"""</td><td style="text-align:center">"""+str(highReturnData.sellableCountWebsite)+"""</td><td style="text-align:center">"""+str(highReturnData.nonSellableCountWebsite)+"""</td><td style="text-align:center">"""+str(round(highReturnData.sellableWebsitePercentage*100,1))+"""</td><td style="text-align:center">"""+str(round(highReturnData.nonSellableWebsitePercentage*100,1))+"""</td><td style="text-align:center">"""+str(int(highReturnData.amazonSale))+"""</td><td style="text-align:center">"""+str(highReturnData.sellableCountAmazon)+"""</td><td style="text-align:center">"""+str(highReturnData.nonSellableCountAmazon)+"""</td><td style="text-align:center">"""+str(round(highReturnData.sellableAmazonPercentage*100,1))+"""</td><td style="text-align:center">"""+str(round(highReturnData.nonSellableAmazonPercentage*100,1))+"""</td><td style="text-align:center">"""+str(int(highReturnData.ebaySale))+"""</td><td style="text-align:center">"""+str(highReturnData.sellableCountEbay)+"""</td><td style="text-align:center">"""+str(highReturnData.nonSellableCountEbay)+"""</td><td style="text-align:center">"""+str(round(highReturnData.sellableEbayPercentage*100,1))+"""</td><td style="text-align:center">"""+str(round(highReturnData.nonSellableEbayPercentage*100,1))+"""</td><td style="text-align:center">"""+str(int(highReturnData.snapdealSale))+"""</td><td style="text-align:center">"""+str(highReturnData.sellableCountSnapdeal)+"""</td><td style="text-align:center">"""+str(highReturnData.nonSellableCountSnapdeal)+"""</td><td style="text-align:center">"""+str(round(highReturnData.sellableSnapdealPercentage*100,1))+"""</td><td style="text-align:center">"""+str(round(highReturnData.nonSellableSnapdealPercentage*100,1))+"""</td><td style="text-align:center">"""+str(int(highReturnData.flipkartSale))+"""</td><td style="text-align:center">"""+str(highReturnData.sellableCountFlipkart)+"""</td><td style="text-align:center">"""+str(highReturnData.nonSellableCountFlipkart)+"""</td><td style="text-align:center">"""+str(round(highReturnData.sellableFlipkartPercentage*100,1))+"""</td><td style="text-align:center">"""+str(round(highReturnData.nonSellableFlipkartPercentage*100,1))+"""</td><td style="text-align:center">"""+str(int(highReturnData.websiteSale+highReturnData.amazonSale+highReturnData.ebaySale+highReturnData.snapdealSale+highReturnData.flipkartSale))+"""</td><td style="text-align:center">"""+str(highReturnData.sellableCountWebsite+highReturnData.sellableCountAmazon+highReturnData.sellableCountEbay+highReturnData.sellableCountSnapdeal+highReturnData.sellableCountFlipkart)+"""</td><td style="text-align:center">"""+str(highReturnData.nonSellableCountWebsite+highReturnData.nonSellableCountAmazon+highReturnData.nonSellableCountEbay+highReturnData.nonSellableCountSnapdeal+highReturnData.nonSellableCountFlipkart)+"""</td><td style="text-align:center">"""+str(round(highReturnData.sellableOverallPercentage*100,1))+"""</td><td style="text-align:center">"""+str(round(highReturnData.nonSellableOverallPercentage*100,1))+"""</td></tr>"""message+="""</tr></tbody></table>"""topBrandCatReturns = []for y in BrandCatMap.itervalues():if y.totalSale > 25:topBrandCatReturns.append(y)sortedHighReturnRateBrandCat = sorted(topBrandCatReturns, key=lambda x: x.nonSellableReturnPercentage, reverse=True)message+="""<h3>Brand Category Wise Non-Sellable Return</h3><table border="1" style="width:50%;"><thead><tr><th>Brand</th><th>Category</th><th>Total Sale</th><th>Non Sellable Returns</th><th>Non Sellable Returns %</th></tr></thead><tbody>"""for highReturnDataBrandCat in sortedHighReturnRateBrandCat:message+="""<tr><td style="text-align:center">"""+str(highReturnDataBrandCat.brand)+"""</td><td style="text-align:center">"""+str(highReturnDataBrandCat.productGroup)+"""</td><td style="text-align:center">"""+str(int(highReturnDataBrandCat.totalSale))+"""</td><td style="text-align:center">"""+str(int(highReturnDataBrandCat.nonSellableReturn))+"""</td><td style="text-align:center">"""+str(round(highReturnDataBrandCat.nonSellableReturnPercentage*100,1))+"""</td></tr>"""message+="""</tr></tbody></table></body></html>"""wbk = xlwt.Workbook(encoding="UTF-8")sheet = wbk.add_sheet('Source Wise Return')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_formatsheet.write(0, 0, "Item ID", heading_xf)sheet.write(0, 1, "Product Group", heading_xf)sheet.write(0, 2, "Brand", heading_xf)sheet.write(0, 3, "Product", heading_xf)sheet.write(0, 4, "Total Sale", heading_xf)sheet.write(0, 5, "Website Sale", heading_xf)sheet.write(0, 6, "Amazon Sale", heading_xf)sheet.write(0, 7, "Ebay Sale", heading_xf)sheet.write(0, 8, "Snapdeal Sale", heading_xf)sheet.write(0, 9, "Flipkart Sale", heading_xf)sheet.write(0, 10, "Sellable Website", heading_xf)sheet.write(0, 11, "Non Sellable Website", heading_xf)sheet.write(0, 12, "Sellable Amazon", heading_xf)sheet.write(0, 13, "Non Sellable Amazon", heading_xf)sheet.write(0, 14, "Sellable Ebay", heading_xf)sheet.write(0, 15, "Non Sellable Ebay", heading_xf)sheet.write(0, 16, "Sellable Snapdeal", heading_xf)sheet.write(0, 17, "Non Sellable Snapdeal", heading_xf)sheet.write(0, 18, "Sellable Flipkart", heading_xf)sheet.write(0, 19, "Non Sellable Flipkart", heading_xf)sheet.write(0, 20, "Total Sellable Returns", heading_xf)sheet.write(0, 21, "Sellable Returns %", heading_xf)sheet.write(0, 22, "Total Non Sellable Returns", heading_xf)sheet.write(0, 23, "Non Sellable Returns %", heading_xf)sheet_iterator=1for k, v in SaleMap.iteritems():sheet.write(sheet_iterator,0,k)sheet.write(sheet_iterator,1,v.productGroup)sheet.write(sheet_iterator,2,v.brand)sheet.write(sheet_iterator,3,xstr(v.brand)+" "+xstr(v.model_name)+" "+xstr(v.model_number)+" "+xstr(v.color))sheet.write(sheet_iterator,4,v.websiteSale+v.amazonSale+v.ebaySale+v.flipkartSale+v.snapdealSale)sheet.write(sheet_iterator,5,v.websiteSale)sheet.write(sheet_iterator,6,v.amazonSale)sheet.write(sheet_iterator,7,v.ebaySale)sheet.write(sheet_iterator,8,v.snapdealSale)sheet.write(sheet_iterator,9,v.flipkartSale)sheet.write(sheet_iterator,10,v.sellableCountWebsite)sheet.write(sheet_iterator,11,v.nonSellableCountWebsite)sheet.write(sheet_iterator,12,v.sellableCountAmazon)sheet.write(sheet_iterator,13,v.nonSellableCountAmazon)sheet.write(sheet_iterator,14,v.sellableCountEbay)sheet.write(sheet_iterator,15,v.nonSellableCountEbay)sheet.write(sheet_iterator,16,v.sellableCountSnapdeal)sheet.write(sheet_iterator,17,v.nonSellableCountSnapdeal)sheet.write(sheet_iterator,18,v.sellableCountFlipkart)sheet.write(sheet_iterator,19,v.nonSellableCountFlipkart)sheet.write(sheet_iterator,20,v.sellableCountWebsite+v.sellableCountAmazon+v.sellableCountEbay+v.sellableCountSnapdeal+v.sellableCountFlipkart)if (v.websiteSale+v.amazonSale+v.ebaySale+v.flipkartSale+v.snapdealSale) > 0:sheet.write(sheet_iterator,21,round(float(v.sellableCountWebsite+v.sellableCountAmazon+v.sellableCountEbay+v.sellableCountSnapdeal+v.sellableCountFlipkart)*100/(v.websiteSale+v.amazonSale+v.ebaySale+v.flipkartSale+v.snapdealSale),1))else:sheet.write(sheet_iterator,21,0)sheet.write(sheet_iterator,22,v.nonSellableCountWebsite+v.nonSellableCountAmazon+v.nonSellableCountEbay+v.nonSellableCountSnapdeal+v.nonSellableCountFlipkart)if (v.nonSellableCountWebsite+v.nonSellableCountAmazon+v.nonSellableCountEbay+v.nonSellableCountSnapdeal+v.nonSellableCountFlipkart) > 0:sheet.write(sheet_iterator,23,round(float(v.nonSellableCountWebsite+v.nonSellableCountAmazon+v.nonSellableCountEbay+v.nonSellableCountSnapdeal+v.nonSellableCountFlipkart)*100/(v.websiteSale+v.amazonSale+v.ebaySale+v.flipkartSale+v.snapdealSale),1))else:sheet.write(sheet_iterator,23,0)sheet_iterator+=1filename = "/tmp/return-report-source-mob-tab.xls"wbk.save(filename)mailServer = smtplib.SMTP("smtp.gmail.com", 587)mailServer.ehlo()mailServer.starttls()mailServer.ehlo()recipients = ['rajneesh.arora@saholic.com','anikendra.das@saholic.com','kshitij.sood@saholic.com','amit.sirohi@saholic.com','khushal.bhatia@saholic.com']msg = MIMEMultipart()msg['Subject'] = "Sale Return Source Wise Mobiles & Tablets" + ' - ' + str(datetime.now())msg['From'] = ""msg['To'] = ",".join(recipients)msg.preamble = "Sale Return Source Wise Sale Return Source Wise Mobiles & Tablets" + ' - ' + str(datetime.now())html_msg = MIMEText(message, 'html')msg.attach(html_msg)fileMsg = MIMEBase('application','vnd.ms-excel')fileMsg.set_payload(file(filename).read())encoders.encode_base64(fileMsg)from datetime import datefileMsg.add_header('Content-Disposition','attachment;filename=Return-Source-Wise-Mob-Tab' + ' - ' + date.today().isoformat() + '.xls')msg.attach(fileMsg)try:mailServer.login("cnc.center@shop2020.in", "5h0p2o2o")#mailServer.sendmail("cafe@nes", ['kshitij.sood@saholic.com'], msg.as_string())mailServer.sendmail("5h0p2o2o", recipients, msg.as_string())except Exception as e:print eprint "Unable to send return .Lets try with local SMTP."smtpServer = smtplib.SMTP('localhost')smtpServer.set_debuglevel(1)sender = 'cnc.center@shop2020.in'try:smtpServer.sendmail(sender, recipients, msg.as_string())print "Successfully sent email"except:print "Error: unable to send email."def populateBrandCategoryReturn():global BrandCatMapfor v in SaleMap.itervalues():if BrandCatMap.has_key(v.productGroup+" "+v.brand):brandCatObj = BrandCatMap.get(v.productGroup+" "+v.brand)totalSale = brandCatObj.totalSale + v.websiteSale + v.amazonSale + v.ebaySale + v.snapdealSale +v.flipkartSaletotalNonSellableReturn = brandCatObj.nonSellableReturn + v.nonSellableCountWebsite + v.nonSellableCountAmazon + v.nonSellableCountEbay + v.nonSellableCountSnapdeal + v.nonSellableCountFlipkartnonSellableReturnPercentage = float(totalNonSellableReturn)/totalSalebrandCatObj.totalSale = totalSalebrandCatObj.nonSellableReturn = totalNonSellableReturnbrandCatObj.nonSellableReturnPercentage = nonSellableReturnPercentageelse:totalSale = v.websiteSale + v.amazonSale + v.ebaySale + v.snapdealSale +v.flipkartSaletotalNonSellableReturn = v.nonSellableCountWebsite + v.nonSellableCountAmazon + v.nonSellableCountEbay + v.nonSellableCountSnapdeal + v.nonSellableCountFlipkartnonSellableReturnPercentage = float(totalNonSellableReturn)/totalSalebrandCatObj = __BrandCatInfo(totalSale,totalNonSellableReturn,nonSellableReturnPercentage,v.brand,v.productGroup)BrandCatMap[v.productGroup+" "+v.brand] = brandCatObjdef main():populateSaleInfo()calculateReturnPercentage()populateBrandCategoryReturn()sendEmail()if __name__=='__main__':main()