Subversion Repositories SmartDukaan

Rev

Rev 17348 | Rev 17356 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
13774 amit.gupta 1
# coding=utf-8
13569 amit.gupta 2
'''
3
Created on Jan 15, 2015
4
 
5
@author: amit
6
'''
13774 amit.gupta 7
from base64 import encode
8
from bs4 import BeautifulSoup
17231 amit.gupta 9
from datetime import datetime, timedelta, date
16874 amit.gupta 10
from dtr.api.Order import process_rejects
14650 amit.gupta 11
from dtr.dao import Order, SubOrder, AmazonAffiliateInfo
14464 amit.gupta 12
from dtr.main import getStore, Store as MStore, ParseException, getBrowserObject, \
14624 amit.gupta 13
    ungzipResponse, tprint
14650 amit.gupta 14
from dtr.sources.flipkart import todict, AFF_REPORT_URL
17307 amit.gupta 15
from dtr.storage.DataService import OrdersRaw, Orders, Order_Parse_Info, \
16986 amit.gupta 16
    All_user_addresses
16874 amit.gupta 17
from dtr.storage.Mongo import getDealRank
17307 amit.gupta 18
from dtr.utils import utils
16874 amit.gupta 19
from dtr.utils.utils import fetchResponseUsingProxy, readSSh
20
from elixir import *
14650 amit.gupta 21
import base64
16874 amit.gupta 22
import dtr
14650 amit.gupta 23
import gzip
14624 amit.gupta 24
import mechanize
14285 amit.gupta 25
import os.path
13774 amit.gupta 26
import re
14033 amit.gupta 27
import time
13809 amit.gupta 28
import traceback
14650 amit.gupta 29
import urllib2
13774 amit.gupta 30
 
31
ORDER_REDIRECT_URL = 'https://www.amazon.in/gp/css/summary/edit.html?orderID=%s'
13810 amit.gupta 32
ORDER_SUCCESS_URL = 'https://www.amazon.in/gp/buy/spc/handlers/static-submit-decoupled.html'
13823 amit.gupta 33
THANKYOU_URL = 'https://www.amazon.in/gp/buy/thankyou/handlers/display.html'
14624 amit.gupta 34
AMAZON_AFF_URL = 'https://assoc-datafeeds-eu.amazon.com/datafeed/listReports'
14650 amit.gupta 35
AMAZON_AFF_FILE_URL = 'https://assoc-datafeeds-eu.amazon.com/datafeed/getReport?filename=saholic-21-orders-report-%s.tsv.gz'
13774 amit.gupta 36
class Store(MStore):
13821 amit.gupta 37
 
17348 amit.gupta 38
    orderStatusRegexMap = { MStore.ORDER_PLACED : ['ordered from', 'not yet dispatched','dispatching now', 'preparing for dispatch', 'order received'],
14064 amit.gupta 39
                            MStore.ORDER_SHIPPED : ['dispatched on','dispatched', 'on the way', 'out for delivery', 'Out for delivery'],
17324 amit.gupta 40
                            MStore.ORDER_CANCELLED : ['return complete', 'refunded', 'cancelled', 'replacement complete', 'return received'],
17258 amit.gupta 41
                            MStore.ORDER_DELIVERED : ['delivered', 'your package was delivered', 'package was handed directly to customer']
13821 amit.gupta 42
                           }
13774 amit.gupta 43
 
44
    def __init__(self,store_id):
45
        super(Store, self).__init__(store_id)
46
 
47
    def getName(self):
14749 amit.gupta 48
        return "amazon"
13774 amit.gupta 49
 
14945 amit.gupta 50
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl, track=False):
14958 amit.gupta 51
        parseString = "Tracking" if track else "Transacted"
52
        print parseString, "Order Id to be parsed is :", orderId
13796 amit.gupta 53
        resp = {}
14813 amit.gupta 54
        resp['result'] = 'ORDER_NOT_CREATED'
13821 amit.gupta 55
        if ORDER_SUCCESS_URL in orderSuccessUrl or THANKYOU_URL in orderSuccessUrl:
13774 amit.gupta 56
            try:
57
                soup = BeautifulSoup(rawHtml)
14608 amit.gupta 58
                try:
59
                    orderUrl = soup.find('div', {"id":"thank-you-box-wrapper"}).div.findAll('div', recursive=False)[1].a['href']
60
                    merchantOrderId = re.findall(r'.*&oid=(.*)&?.*?', orderUrl)[0]
61
                except:
62
                    merchantOrderId = soup.find(id="orders-list").div.span.b.text
14699 amit.gupta 63
                order = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl, True)
14972 amit.gupta 64
                order.orderTrackingUrl = ORDER_REDIRECT_URL % (merchantOrderId)
65
                order.orderSuccessUrl = orderSuccessUrl
14211 amit.gupta 66
                order.merchantOrderId = merchantOrderId
14291 amit.gupta 67
                order.requireDetail = True
14698 amit.gupta 68
                order.status = 'html_required'
14297 amit.gupta 69
                order.closed = None
14312 amit.gupta 70
                if self._saveToOrder(todict(order)):
71
                    resp['result'] = 'ORDER_CREATED'
72
                    resp["url"] = ORDER_REDIRECT_URL % (merchantOrderId)
73
                    resp["htmlRequired"] = True
74
                    resp['orderId'] = orderId
75
                else:
76
                    resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
77
 
13774 amit.gupta 78
            except:
14813 amit.gupta 79
                #Write all cases here for Order Not created Known
14809 amit.gupta 80
                try:
16874 amit.gupta 81
                    if not soup.body:
82
                        resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
16878 amit.gupta 83
                    elif 'Securely redirecting you' in soup.h3.text.strip() or soup.h3.text.strip()=="Orders":
14813 amit.gupta 84
                        resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
14809 amit.gupta 85
                    else:
14813 amit.gupta 86
                        raise
14809 amit.gupta 87
                except:
14814 amit.gupta 88
                    try:
16880 amit.gupta 89
                        if soup.h1.text.strip() in ['This is a duplicate order', 'There was a problem with your payment.', 'Your Orders', 'Your Shopping Cart is empty.', 'Select a payment method', 'Edit quantities'] or "Saved for later" in soup.h1.text.strip():
14814 amit.gupta 90
                            resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
91
                        else:
92
                            raise
93
                    except:
15046 amit.gupta 94
                        try:
17270 amit.gupta 95
                            if soup.h2.text.strip() in ['Web page not available','Webpage not available', 'Do you have an Amazon password?']:
15046 amit.gupta 96
                                resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
97
                            else:
98
                                raise
99
                        except:
15565 amit.gupta 100
                            try:
16876 amit.gupta 101
                                if soup.find(id="loading-spinner-img") is not None or soup.find(id="anonCarousel1") is not None or soup.find(id="ap_signin_pagelet_title") is not None or soup.find(id="nav-greeting-name") is not None:
15565 amit.gupta 102
                                    resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
16877 amit.gupta 103
                                elif soup.find("b", {'class':'h1'}).text.strip().find("We're sorry") > -1:
104
                                    resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
15565 amit.gupta 105
                                else:
106
                                    raise
107
                            except:
108
                                resp['result'] = 'ORDER_NOT_CREATED_UNKNOWN'
109
 
13774 amit.gupta 110
        else:
13781 amit.gupta 111
            try:
14722 amit.gupta 112
                mo = self.db.merchantOrder.find_one({"orderId":orderId})
113
                if mo is not None:
14749 amit.gupta 114
                    merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl, False)
14722 amit.gupta 115
                    merchantOrder.createdOn = mo.get("createdOn")
116
                    merchantOrder.createdOnInt =  mo.get("createdOnInt")
117
                else:
14945 amit.gupta 118
                    print "Could not find amazon order with order Id", orderId
14749 amit.gupta 119
                    merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
14464 amit.gupta 120
                soup = BeautifulSoup(rawHtml)
17331 amit.gupta 121
                if not soup.body:
17319 amit.gupta 122
                    resp['result'] = 'DETAIL_NOT_CREATED_KNOWN'
123
                else:   
14545 amit.gupta 124
                    try:
17319 amit.gupta 125
                        self.parseNewStlye(merchantOrder, soup)
15046 amit.gupta 126
                        resp['result'] = 'DETAIL_CREATED'
14545 amit.gupta 127
                    except:
15056 amit.gupta 128
                        try:
17319 amit.gupta 129
                            traceback.print_exc()
130
                            self.parseOldStlye(merchantOrder, soup)
131
                            resp['result'] = 'DETAIL_CREATED'
15056 amit.gupta 132
                        except:
17319 amit.gupta 133
                            traceback.print_exc()
15059 amit.gupta 134
                            try:
17319 amit.gupta 135
                                self.parseCancelled(merchantOrder, soup)
136
                                resp['result'] = 'ORDER_CANCELLED'
15059 amit.gupta 137
                            except:
17319 amit.gupta 138
                                try:
139
                                    if soup.h1.text.strip() in ["Your Account"] or soup.h1.span.text=="Account":
140
                                        resp['result'] = 'DETAIL_NOT_CREATED_KNOWN'
141
                                    else:
142
                                        raise
143
                                except:
144
                                    if soup.find(id="ap_signin_pagelet_title").h1.text.strip()=="Sign In":
145
                                        resp['result'] = 'DETAIL_NOT_CREATED_KNOWN'
146
                                    else:
147
                                        raise
13781 amit.gupta 148
            except:
14813 amit.gupta 149
                order = self.db.merchantOrder.find_one({"orderId":orderId})
150
                if order is not None:
151
                    self.db.merchantOrder.update({"orderId":orderId}, {"$set":{"status":"parse_failed"}})
152
                print "Error occurred"
15046 amit.gupta 153
                resp['result'] = 'DETAIL_NOT_CREATED_UNKNOWN'
14813 amit.gupta 154
                traceback.print_exc()
15046 amit.gupta 155
        return resp    
13774 amit.gupta 156
 
13868 amit.gupta 157
    #This should be exposed from api for specific sources
158
    def scrapeStoreOrders(self):
14624 amit.gupta 159
        orders = self.db.merchantOrder.find({"storeId":1, "closed":False, "subOrders.closed":False, "subOrders.trackingUrl":{"$exists":True}})
160
        for merchantOrder in orders:
14981 amit.gupta 161
            executeBulk = False
14624 amit.gupta 162
            try:
163
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
164
                closed = True
165
                map1 = {}
166
                for subOrder in merchantOrder.get("subOrders"):
167
                    if subOrder.get("closed"):
168
                        continue
169
                    elif subOrder.get("trackingUrl") is None:
170
                        closed = False
171
                        continue
172
                    findMap = {"orderId":merchantOrder.get("orderId"), "subOrders.merchantSubOrderId":subOrder.get("merchantSubOrderId")} 
173
                    trackingUrl = subOrder.get("trackingUrl")
174
                    if not map1.has_key(trackingUrl):
16468 amit.gupta 175
                        map1[trackingUrl] = self.parseTrackingUrl(trackingUrl, merchantOrder.get("orderId"))
14624 amit.gupta 176
                    newOrder = map1.get(trackingUrl)
16474 amit.gupta 177
                    if newOrder:
178
                        executeBulk = True
179
                        updateMap = self.getUpdateMap(newOrder, subOrder.get('cashBackStatus'))
180
                        print findMap, "\n", updateMap
181
                        bulk.find(findMap).update({'$set' : updateMap})
182
                        closed = closed and newOrder['closed']
14981 amit.gupta 183
                if executeBulk:
14697 amit.gupta 184
                    bulk.find({"orderId":merchantOrder.get("orderId")}).update({"$set":{"closed":closed, "parseError":False}})
14981 amit.gupta 185
                    bulk.execute()
14624 amit.gupta 186
            except:
14847 amit.gupta 187
                tprint("Could not update " + str(merchantOrder['orderId']) + " For store " + self.getName())
14692 amit.gupta 188
                self.db.merchantOrder.update({"orderId":merchantOrder['orderId']}, {"$set":{"parseError":True}})
14624 amit.gupta 189
                traceback.print_exc()
190
 
14608 amit.gupta 191
 
192
 
14771 amit.gupta 193
    def parserest(self, soup):
194
        print "Hi"
195
        if soup.find('h1'):
196
            print "OK"
14608 amit.gupta 197
 
14464 amit.gupta 198
    def parseOldStlye(self, merchantOrder, soup):
199
        merchantOrder.orderTrackingUrl = merchantOrder.orderSuccessUrl
200
        table = soup.body.findAll("table", recursive=False)[1]
201
        #print table
202
        tables = table.tr.td.findAll("table", recursive=False)
203
        for tr in tables[2].findAll("tr"):
204
            boldElement = tr.td.b
205
            if "Order Placed" in str(boldElement):
206
                merchantOrder.placedOn = boldElement.next_sibling.strip()
207
            if "order number" in str(boldElement):
208
                merchantOrder.merchantOrderId = boldElement.next_sibling.strip()
209
            if "Order Total" in str(boldElement):
210
                merchantOrder.paidAmount = int(float(boldElement.find('span').contents[-1].replace(',','')))
211
        anchors = table.tr.td.findAll("a", recursive=False)
212
        paymentAnchor = anchors.pop(-1)
213
 
214
        count = 0
215
        subOrders = []
216
        merchantOrder.subOrders = subOrders
217
        counter = 0 
218
        for anchor in anchors:
219
            count += 1
220
            tab = anchor.next_sibling
221
            status = MStore.ORDER_PLACED
222
            subStr = "Delivery #" + str(count) + ":"
223
            if subStr in  tab.find("b").text:
224
                detailedStatus = tab.find("b").text.replace(subStr, '').strip()
225
 
226
            tab = tab.next_sibling.next_sibling
227
            trs = tab.find("table").find('tbody').findAll("tr", recursive = False)
228
 
229
            estimatedDelivery = trs[0].td.find("b").next_sibling.strip()
230
 
231
            orderItemTrs = trs[1].findAll("td", recursive=False)[1].table.tbody.findAll("tr", recursive = False)
232
            i = -1
233
            for orderItemTr in orderItemTrs:
234
                i += 1
235
                if i%2 == 0:
236
                    continue
237
                counter += 1
238
                quantity =  int(re.findall(r'\d+', orderItemTr.td.contents[0])[0])
239
 
240
                productUrl = orderItemTr.td.contents[1].a["href"]
241
                productTitle = orderItemTr.td.contents[1].a.text
242
 
243
                unitPrice = int(float(orderItemTr.findAll('td')[1].span.text.replace('Rs. ','').replace(',','')))
244
 
245
 
246
                subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, unitPrice*quantity, status, quantity)
247
                subOrder.merchantSubOrderId = str(counter) + " of " + merchantOrder.merchantOrderId
248
                subOrder.estimatedDeliveryDate = estimatedDelivery
14722 amit.gupta 249
                estDlvyTime = datetime.strptime(estimatedDelivery.split('-')[0].strip(), "%A %d %B %Y")
250
                createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
251
                subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
14464 amit.gupta 252
                subOrder.productCode = productUrl.split('/')[5]
253
                subOrder.detailedStatus = detailedStatus
254
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, unitPrice*quantity)
15346 amit.gupta 255
                dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
256
                subOrder.dealRank = dealRank.get('rank')
257
                subOrder.rankDesc = dealRank.get('description')
16283 amit.gupta 258
                subOrder.maxNlc = dealRank.get('maxNlc')
259
                subOrder.minNlc = dealRank.get('minNlc')
260
                subOrder.db = dealRank.get('dp')
261
                subOrder.itemStatus = dealRank.get('status')
14464 amit.gupta 262
                cashbackStatus = Store.CB_PENDING
263
                if cashbackAmount <= 0:
264
                    cashbackStatus = Store.CB_NA
265
                subOrder.cashBackStatus = cashbackStatus
266
                subOrder.cashBackAmount = cashbackAmount
267
                if percentage > 0:
268
                    subOrder.cashBackPercentage = percentage
269
                subOrders.append(subOrder)
270
        priceList = paymentAnchor.next_sibling.next_sibling.next_sibling.table.table.tbody.tbody.tbody.findAll('tr', recursive=False)
271
        totalAmount = 0
272
        grandAmount = 0
273
        for price in priceList:
274
            labelTd = price.td
275
            if 'Subtotal:' in labelTd.text:
276
                totalAmount += int(float(labelTd.next_sibling.next_sibling.find('span').contents[-1].replace(',','')))
277
            elif 'Grand Total:' in labelTd.text:
278
                grandAmount += int(float(labelTd.next_sibling.next_sibling.find('span').contents[-1].replace(',','')))
279
        if grandAmount < totalAmount:
280
            diff = totalAmount - grandAmount
281
            for subOrder in merchantOrder.subOrders:
282
                subOrder.amountPaid -= int(diff*(1-subOrder.amountPaid/totalAmount))
14698 amit.gupta 283
        merchantOrder.status='success'
14464 amit.gupta 284
        self._updateToOrder(todict(merchantOrder))
285
 
286
    def parseNewStlye(self, merchantOrder, soup):
287
        merchantOrder.orderTrackingUrl = merchantOrder.orderSuccessUrl
288
        orderDetailsContainer = soup.body.find(id="orderDetails")
14566 amit.gupta 289
        divAfterH1 = orderDetailsContainer.h1.next_sibling.next_sibling
290
        orderLeftDiv = divAfterH1.div
14464 amit.gupta 291
        placedOnSpan = orderLeftDiv.find("span", {'class':'order-date-invoice-item'})
292
        merchantOrder.placedOn =placedOnSpan.text.split('Ordered on')[1].strip()
293
        merchantOrder.merchantOrderId = placedOnSpan.next_sibling.next_sibling.text.split('Order#')[1].strip()
15555 amit.gupta 294
        try:
295
            priceBox = divAfterH1.next_sibling.next_sibling.next_sibling.next_sibling.find("div", {"class":"a-box-inner"}).div.div.findAll('div', recursive=False)[-1]
296
        except:
297
            priceBox = divAfterH1.next_sibling.next_sibling.next_sibling.next_sibling.find("div", {"class":"a-box a-last"}).div.div.findAll('div', recursive=False)[-1]
14464 amit.gupta 298
        priceRows = priceBox.findAll('div', {'class':'a-row'})
299
        subTotal = 0
14566 amit.gupta 300
        shippingPrice = 0   
14464 amit.gupta 301
        promoApplied = 0
302
        for priceRow in priceRows:
303
            if "Item(s) Subtotal:" in str(priceRow):
304
                subTotal = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
305
            elif "Shipping:" in str(priceRow):
306
                shippingPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
307
            elif "Grand Total:" in str(priceRow):
308
                grandPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
309
                merchantOrder.paidAmount = grandPrice
310
            elif "Total:" in str(priceRow):
311
                totalPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
312
            elif "Promotion Applied:" in str(priceRow):
313
                promoApplied  += int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
314
        totalPaid = subTotal        
315
        if promoApplied > 0:
316
            totalPaid -= promoApplied
317
            if shippingPrice <= promoApplied:
318
                totalPaid  += shippingPrice
15473 amit.gupta 319
 
15474 amit.gupta 320
        shipmentDivs = orderDetailsContainer.find('div', class_='shipment').findAll('div', recursive = False)
14464 amit.gupta 321
        subOrders = []
322
        merchantOrder.subOrders = subOrders
15473 amit.gupta 323
        closedStatus = True
14464 amit.gupta 324
        for shipmentDiv in shipmentDivs:
17347 amit.gupta 325
            deliverySpanTop = None
14464 amit.gupta 326
            innerBoxes = shipmentDiv.findAll('div', recursive = False)
327
            statusDiv = innerBoxes[0]
328
            subOrderStatus = statusDiv.div.span.text.strip()
17347 amit.gupta 329
            try:
330
                deliverySpanTop = statusDiv.div.div.find_next_sibling('div').span
331
                productDivs = innerBoxes[-1].div.div.div.findAll('div', recursive=False)
332
            except:
333
                productDivs = innerBoxes[-1].div.div.findAll('div', recursive=False)
14464 amit.gupta 334
            subOrders = []
335
            merchantOrder.subOrders = subOrders
336
            for i, productDiv in enumerate(productDivs):
17347 amit.gupta 337
                deliverySpan = deliverySpanTop
338
                j=i+1
339
                if not deliverySpanTop:
340
                    if i%2==1:
341
                        continue
342
                    j=i/2 + 1
343
                    deliverySpan = productDiv.div.div.span
344
                    productDiv = productDivs[i+1].div
14464 amit.gupta 345
                imgDiv  = productDiv.div.div
346
                detailDiv = imgDiv.find_next_sibling('div')
347
                detailDivs = detailDiv.findAll('div', recursive=False)
348
                arr = detailDivs[0].a.text.strip().split(" of ", 1)
14465 amit.gupta 349
                (productTitle, quantity) = (arr[-1], (1 if len(arr)==1 else int(arr[0])) )
14820 amit.gupta 350
                try:
351
                    unitPrice = int(float(detailDivs[2].span.text.replace('Rs. ','').replace(',','')))
352
                except:
353
                    unitPrice = int(float(detailDivs[3].span.text.replace('Rs. ','').replace(',','')))
14464 amit.gupta 354
                amountPaid = int((unitPrice*quantity*totalPaid)/subTotal)
355
                productUrl = "http://www.amazon.in" + detailDivs[0].a.get('href')
356
                subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid, MStore.ORDER_PLACED, quantity)
357
                subOrder.productCode = productUrl.split('/')[5]
358
                subOrder.unitPrice = unitPrice
17347 amit.gupta 359
                subOrder.merchantSubOrderId = str(j) + " of " + merchantOrder.merchantOrderId
14722 amit.gupta 360
                estDlvyTime = datetime.now()
14566 amit.gupta 361
                if deliverySpan is not None:
14756 amit.gupta 362
                    try:
363
                        subOrder.estimatedDeliveryDate = deliverySpan.span.text.strip()
364
                        estDate = subOrder.estimatedDeliveryDate.split("-")[0].strip()
365
                        subOrder.estimatedDeliveryInt = int(time.mktime((datetime.strptime(estDate, "%A %d %B %Y")).timetuple()))
366
                        estDlvyTime = datetime.strptime(estDate, "%A %d %B %Y")
367
                    except:
15473 amit.gupta 368
                        if "Delivered on" in deliverySpan.text:
369
                            subOrder.deliveredOn = deliverySpan.text.split(":")[1].strip() 
14756 amit.gupta 370
                        subOrder.estimatedDeliveryDate = "Not available"
15473 amit.gupta 371
 
14722 amit.gupta 372
                createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
14756 amit.gupta 373
                subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
14464 amit.gupta 374
                subOrder.detailedStatus = subOrderStatus
375
                subOrder.deliveryCharges = shippingPrice
14466 amit.gupta 376
                subOrder.imgUrl = imgDiv.img["src"]
14464 amit.gupta 377
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amountPaid)
15346 amit.gupta 378
                dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
379
                subOrder.dealRank = dealRank.get('rank')
380
                subOrder.rankDesc = dealRank.get('description')
14464 amit.gupta 381
                cashbackStatus = Store.CB_PENDING
382
                if cashbackAmount <= 0:
383
                    cashbackStatus = Store.CB_NA
384
                subOrder.cashBackStatus = cashbackStatus
385
                subOrder.cashBackAmount = cashbackAmount
386
                if percentage > 0:
387
                    subOrder.cashBackPercentage = percentage
15473 amit.gupta 388
                if hasattr(subOrder, 'deliveredOn'):                               
389
                    subOrder.status = Store.ORDER_DELIVERED
390
                    subOrder.closed = True
391
                    if subOrder.cashBackStatus == Store.CB_PENDING:
392
                        subOrder.cashBackStatus = Store.CB_APPROVED
393
                elif closedStatus:
394
                    closedStatus= False
14464 amit.gupta 395
                subOrders.append(subOrder)
14698 amit.gupta 396
        merchantOrder.status='success'
15473 amit.gupta 397
        merchantOrder.closed = closedStatus
14464 amit.gupta 398
        self._updateToOrder(todict(merchantOrder))
14545 amit.gupta 399
 
400
    def parseCancelled(self, merchantOrder,soup):
14722 amit.gupta 401
        try:
402
            fonts = soup.body.findAll("table", recursive=False)[1].findAll("font")
403
            if fonts[0].text == "Important Message":
404
                if fonts[1].text=="This order has been cancelled.":
405
                    merchantOrder.closed = True
406
                    merchantOrder.status = "cancelled"
407
                    merchantOrder.requireDetail = False
408
                    self._updateToOrder(todict(merchantOrder))
409
                    return
410
                else:
411
                    raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14545 amit.gupta 412
            else:
413
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14722 amit.gupta 414
        except:
14549 amit.gupta 415
            orderDetails = soup.body.find(id="orderDetails")
416
            if orderDetails is not None and orderDetails.h4.text == "This order has been cancelled.":
417
                merchantOrder.closed = True
14698 amit.gupta 418
                merchantOrder.status = "cancelled"
14549 amit.gupta 419
                merchantOrder.requireDetail = False
420
                self._updateToOrder(todict(merchantOrder))
421
            else:
422
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14464 amit.gupta 423
 
13868 amit.gupta 424
    def getTrackingUrls(self, userId):
14074 amit.gupta 425
 
426
        missingOrderUrls = []
427
        missingOrders = self._getMissingOrders({'userId':userId})
428
        for missingOrder in missingOrders:
429
            missingOrderUrls.append(ORDER_REDIRECT_URL%(missingOrder['merchantOrderId']))
14683 amit.gupta 430
        orders = self._getActiveOrders({'userId':userId, "subOrders.trackingUrl":{"$exists":False} })
13882 amit.gupta 431
        count = len(orders)
13879 amit.gupta 432
        print "count", count
14948 amit.gupta 433
        print "Missing Urls"
434
        print "*************"
435
        print missingOrderUrls
13868 amit.gupta 436
        if count > 0:
14684 amit.gupta 437
            return missingOrderUrls + ['https://www.amazon.in/gp/css/order-history', 'https://www.amazon.in/gp/css/order-history/?orderFilter=cancelled', 'https://www.amazon.in/gp/css/order-history/?orderFilter=cancelled&startIndex=10']
13959 amit.gupta 438
        else: 
14074 amit.gupta 439
            return missingOrderUrls
13927 amit.gupta 440
 
441
    def trackOrdersForUser(self, userId, url, rawHtml):
14985 amit.gupta 442
        directory = "/AmazonTrack/User" + str(userId)
14285 amit.gupta 443
        if not os.path.exists(directory):
444
            os.makedirs(directory)
14173 amit.gupta 445
 
14945 amit.gupta 446
 
13995 amit.gupta 447
        try:
448
            searchMap = {'userId':userId}
449
            collectionMap = {'merchantOrderId':1}
450
            activeOrders = self._getActiveOrders(searchMap, collectionMap)
14033 amit.gupta 451
            datetimeNow = datetime.now()
452
            timestamp = int(time.mktime(datetimeNow.timetuple()))
14009 amit.gupta 453
            print "url----------------", url
14008 amit.gupta 454
 
14320 amit.gupta 455
            if url == 'https://www.amazon.in/gp/css/order-history' or 'https://www.amazon.in/gp/css/order-history/?orderFilter=cancelled' in url:
14945 amit.gupta 456
                if url == 'https://www.amazon.in/gp/css/order-history':
457
                    filename = directory + "/orderSummary" + datetime.strftime(datetime.now(), '%d-%m:%H:%M:%S')
458
                else:   
459
                    filename = directory + "/cancelledSummary" + datetime.strftime(datetime.now(), '%d-%m:%H:%M:%S')   
460
                f = open(filename,'w')
461
                f.write(rawHtml) # python will convert \n to os.linesep
462
                f.close() # you can omit in most cases as the destructor will call if
13995 amit.gupta 463
                soup = BeautifulSoup(rawHtml)
464
                allOrders = soup.find(id="ordersContainer").findAll('div', {'class':'a-box-group a-spacing-base order'})
465
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
466
                for activeOrder in activeOrders:
17307 amit.gupta 467
                    matched=False
13995 amit.gupta 468
                    for orderEle in allOrders:
17254 amit.gupta 469
                        deliveredOn = None
470
                        deliveryEstimate = None
17258 amit.gupta 471
                        shippingEstimate = None
13995 amit.gupta 472
                        orderdiv = orderEle.find('div', {'class':'a-box a-color-offset-background order-info'}).find('div', {'class':'a-fixed-right-grid-col actions a-col-right'})
473
                        merchantOrderId = orderdiv.find('span', {'class':'a-color-secondary value'}).text.strip()
474
                        if merchantOrderId==activeOrder['merchantOrderId']:
17307 amit.gupta 475
                            matched=True
13995 amit.gupta 476
                            closed = True
17324 amit.gupta 477
                            shipments = orderEle.findAll('div',{'class':re.compile('.*?shipment.*?')}, recursive=False)
13995 amit.gupta 478
                            for shipment in shipments:
17307 amit.gupta 479
                                orderStatusDesc = None
13995 amit.gupta 480
                                shipdiv = shipment.find('div', {'class':'a-box-inner'})
14050 amit.gupta 481
                                sdivs = shipment.div.div.findAll('div', recursive=False)
17254 amit.gupta 482
                                try:
17270 amit.gupta 483
                                    orderStatus = sdivs[0].span.text.strip()
484
                                    status = self._getStatusFromDetailedStatus(orderStatus)
17254 amit.gupta 485
                                except:
17270 amit.gupta 486
                                    try:
487
                                        dateString = orderStatus.split("Delivered ")[1].strip()
488
                                        status = MStore.ORDER_DELIVERED
489
                                        deliveredOn = datetime.strftime(getDateStringDelivered(dateString), '%d-%b-%y')
490
                                    except:
491
                                        try:
17271 amit.gupta 492
                                            dateString = sdivs[0].span.text.strip().split("Arriving ")[1].split("by")[0].strip()
17270 amit.gupta 493
                                            status = MStore.ORDER_SHIPPED
494
                                            deliveryEstimate = datetime.strftime(getDateStringArriving(dateString), '%d-%b-%y')
495
                                        except:
496
                                            print "Unknown status Alert -", orderStatus
17348 amit.gupta 497
                                print merchantOrderId, "Order Status", orderStatus
17256 amit.gupta 498
                                try:
17270 amit.gupta 499
                                    orderStatusDesc = sdivs[0].findAll('div')[1].div.text.strip()
500
                                except:
17271 amit.gupta 501
                                    try:
502
                                        orderStatusDesc = sdivs[0].findAll('div')[1].text.strip()
503
                                    except:
17307 amit.gupta 504
                                        print "Order Status Description None or empty for", merchantOrderId, "and User", userId
17270 amit.gupta 505
 
17271 amit.gupta 506
                                if orderStatusDesc: 
17348 amit.gupta 507
                                    print merchantOrderId, "Order status desc", orderStatusDesc
17271 amit.gupta 508
                                    try:
17348 amit.gupta 509
                                        status = self._getStatusFromDetailedStatus(orderStatus)
510
                                    except:
511
                                        pass
512
                                    try:
17271 amit.gupta 513
                                        if "Dispatch estimate" in orderStatusDesc:
514
                                            shippingEstimate = orderStatus.split("Dispatch estimate").split("-")[0].strip()
515
                                        elif "Delivery estimate" in orderStatus:
516
                                            deliveryEstimate = orderStatus.split("Delivery estimate").split("-")[0].strip()
517
                                        elif "Arriving" in orderStatus:
518
                                            deliveryEstimate = datetime.strftime(getDateStringArriving(orderStatus.split("Arriving")[1].strip().split("by")[0].strip()), '%d-%b-%y')
519
                                    except:
520
                                        print "Could not find anything relevent for merchantOrder", merchantOrderId, "and User", userId 
521
                                        closed=False
522
                                        status = None
17258 amit.gupta 523
 
14335 amit.gupta 524
                                productDivs = shipdiv.find('div', {'class':re.compile('.*?a-spacing-top-medium.*?')}).find('div', {'class':'a-row'}).findAll('div', recursive=False)
13995 amit.gupta 525
                                trackingUrl = None
526
                                for buttonDiv in shipdiv.findAll('span', {'class':'a-button-inner'}):
527
                                    if buttonDiv.find('a').text.strip()=='Track package':
528
                                        trackingUrl = buttonDiv.find('a')['href'].strip()
529
                                        if not trackingUrl.startswith("http"):
14608 amit.gupta 530
                                            trackingUrl = "http://www.amazon.in" + trackingUrl
13995 amit.gupta 531
                                        break
532
                                for prodDiv in productDivs:
533
                                    prodDiv.find('div', {'class':'a-fixed-left-grid-inner'})
534
                                    productTitle = prodDiv.find('div', {'class':'a-fixed-left-grid-inner'}).find("div", {'class':'a-row'}).find('a').text.strip()
535
                                    imgUrl = prodDiv.find("img")["src"]
536
                                    for subOrder in activeOrder['subOrders']:
17307 amit.gupta 537
                                        if subOrder['closed']==True:
538
                                            continue
17230 amit.gupta 539
                                        if subOrder['productTitle'] in productTitle:
13995 amit.gupta 540
                                            findMap = {"orderId": activeOrder['orderId'], "subOrders.merchantSubOrderId": subOrder.get("merchantSubOrderId")}
541
                                            updateMap = {}
542
                                            closedStatus = False
543
                                            updateMap['subOrders.$.imgUrl'] = imgUrl
14033 amit.gupta 544
                                            updateMap['subOrders.$.lastTracked'] = timestamp
17258 amit.gupta 545
                                            if status:
17348 amit.gupta 546
                                                updateMap['subOrders.$.detailedStatus'] = orderStatus
17258 amit.gupta 547
                                                updateMap['subOrders.$.status'] = status 
548
                                                cashbackStatus = subOrder.get("cashBackStatus")
13995 amit.gupta 549
 
17251 amit.gupta 550
                                            if status==MStore.ORDER_DELIVERED:
17271 amit.gupta 551
                                                if deliveredOn:                               
17254 amit.gupta 552
                                                    updateMap['subOrders.$.deliveredOn'] = deliveredOn
13995 amit.gupta 553
                                                closedStatus = True
554
                                                updateMap['subOrders.$.closed'] = True
555
                                                if cashbackStatus == Store.CB_PENDING:
14607 amit.gupta 556
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_APPROVED
13995 amit.gupta 557
                                            if status==MStore.ORDER_CANCELLED:     
558
                                                closedStatus = True
559
                                                updateMap['subOrders.$.closed'] = True
560
                                                if cashbackStatus == Store.CB_PENDING:
561
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_CANCELLED
17254 amit.gupta 562
                                            if status==MStore.ORDER_SHIPPED:
563
                                                if deliveryEstimate:   
564
                                                    updateMap['subOrders.$.estimatedDeliveryDate'] = deliveryEstimate
13995 amit.gupta 565
                                                if trackingUrl is not None:
566
                                                    updateMap['subOrders.$.trackingUrl'] = trackingUrl
17322 amit.gupta 567
                                                    updateMap['subOrders.$.trackMissing'] = False
17258 amit.gupta 568
                                            if shippingEstimate:   
569
                                                updateMap['subOrders.$.estimatedShippingDate'] = shippingEstimate
13995 amit.gupta 570
                                            if not closedStatus:
571
                                                closed = False
17307 amit.gupta 572
                                            #{"subOrders.closed":False,"subOrders.trackingUrl":{"$exists":False},"subOrders.trackAfter":{"$lt":utils.getCurrTimeStamp()}
13995 amit.gupta 573
                                            bulk.find(findMap).update({'$set' : updateMap})
574
                                            break
17321 amit.gupta 575
                            bulk.find({'orderId': activeOrder['orderId']}).update({"$set":{'closed':closed}})
17307 amit.gupta 576
                            break
577
                    if not matched:
17319 amit.gupta 578
                        updateMap = {'subOrders.$.trackMissing': True}
17307 amit.gupta 579
                        for subOrder in activeOrder['subOrders']:
580
                            if subOrder['closed']==True:
581
                                continue
582
                            findMap = {"orderId": activeOrder['orderId'], "subOrders.merchantSubOrderId": subOrder.get("merchantSubOrderId"), 
583
                                       "subOrders.trackAfter":{"$lt":utils.getCurrTimeStamp()}}
584
                            bulk.find({'orderId': activeOrder['orderId']})
585
                            bulk.find(findMap).update({'$set':updateMap})
14080 amit.gupta 586
                bulk.execute()
587
                return 'PARSED_SUCCESS'
588
            else:
15563 amit.gupta 589
                merchantOrderId = re.findall(r'https://www.amazon.in/gp/css/summary/edit.html\?orderID=(.*)?', url, re.IGNORECASE)[0]
590
                print  "merchantOrderId", merchantOrderId
14085 amit.gupta 591
                merchantOrder = self.db.merchantOrder.find_one({"merchantOrderId":merchantOrderId})
14945 amit.gupta 592
 
593
                filename = directory + "/" + merchantOrderId   
594
                f = open(filename,'w')
595
                f.write(rawHtml) # python will convert \n to os.linesep
596
                f.close() # you can omit in most cases as the destructor will call if
15555 amit.gupta 597
                result = self.parseOrderRawHtml(merchantOrder['orderId'], merchantOrder['subTagId'], merchantOrder['userId'], rawHtml, url, True)['result']
15562 amit.gupta 598
                print "result", result
15555 amit.gupta 599
                try:
15560 amit.gupta 600
                    order1 = session.query(OrdersRaw).filter_by(id=merchantOrder['orderId']).first()
601
                    order1.status = result
602
                    order1.rawhtml = rawHtml
15555 amit.gupta 603
                    session.commit()
15561 amit.gupta 604
                except:
605
                    traceback.print_exc()
15555 amit.gupta 606
                finally:
607
                    session.close()
14080 amit.gupta 608
                return 'PARSED_SUCCESS'
609
                pass
14008 amit.gupta 610
            return 'PARSED_SUCCESS_NO_ORDERS'
13995 amit.gupta 611
        except:
612
            traceback.print_exc()    
613
            return 'PARSED_FAILED'
614
 
615
    def _getStatusFromDetailedStatus(self, detailedStatus):
14061 amit.gupta 616
        if "ordered from" in detailedStatus.lower():
617
            return MStore.ORDER_PLACED 
618
 
13995 amit.gupta 619
        for key, value in self.orderStatusRegexMap.iteritems():
14032 amit.gupta 620
            if detailedStatus.lower() in value:
13995 amit.gupta 621
                return key
622
 
17253 amit.gupta 623
        print "Detailed Status need to be mapped", "Store:", self.store_id, detailedStatus
13995 amit.gupta 624
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
14624 amit.gupta 625
    def scrapeAffiliate(self, startDate=None, endDate=None):
14650 amit.gupta 626
        br = getBrowserObject()
627
        br.add_password('https://assoc-datafeeds-eu.amazon.com', 'Saholic', 'Fnubyvp')
628
        url = AMAZON_AFF_URL
629
        response = br.open(url)
630
        #get data for past 40 days and store it to mongo
631
        dt = datetime.now()
14701 amit.gupta 632
        dat = dt - timedelta(days=2)
14651 amit.gupta 633
        url = AMAZON_AFF_FILE_URL%(datetime.strftime(dat, "%Y%m%d"))
634
        response = br.open(url)
635
        page = gzip.GzipFile(fileobj=response, mode='rb').read()
636
        j=-1
637
        for row in page.split("\n"):
638
            j += 1
639
            if j== 0 or j==1:
640
                continue
641
            fields = row.split("\t")
642
            if len(fields)>1:
643
                print fields
644
                amazonAffiliate = AmazonAffiliateInfo(fields[0], fields[1], fields[2], fields[3], fields[4], fields[5], fields[6], fields[7], fields[8], fields[9])
645
                print amazonAffiliate
646
                self.db.amazonAffiliateInfo.insert(todict(amazonAffiliate))
647
            else:
648
                break
14650 amit.gupta 649
 
14608 amit.gupta 650
 
16468 amit.gupta 651
    def parseTrackingUrl(self, trackingUrl, orderId):
16474 amit.gupta 652
        print trackingUrl
14624 amit.gupta 653
        subOrder = {}
14749 amit.gupta 654
        page = fetchResponseUsingProxy(trackingUrl)
16468 amit.gupta 655
        status = MStore.ORDER_SHIPPED
656
        #print page
14624 amit.gupta 657
        soup = BeautifulSoup(page)
16468 amit.gupta 658
        header1 = soup.find("h1") 
659
        if header1:
660
            if header1.text=="Sign In":
661
                print "Login page is displayed for order id", orderId
17307 amit.gupta 662
                self.db.merchantOrder.update({"orderId":orderId}, {"$set":{"trackError":True}})
14624 amit.gupta 663
                return subOrder
16468 amit.gupta 664
        try:
16474 amit.gupta 665
            print "Tracking page is displayed for order id", orderId
16468 amit.gupta 666
            detailedStatus = soup.find("div", {"class":"top"}).span.text.strip()
667
            try:
668
                displayStatus = soup.find("div",{"class":"a-column a-span12 shipment-status-content"}).span.text.strip()
669
            except:
670
                displayStatus = detailedStatus
671
            print displayStatus
672
            if detailedStatus.lower().find("delivered")>=0:
673
                print detailedStatus
674
                displayStatus = "Delivered"
675
                status = "Delivered"
676
                try:
677
                    subOrder["deliveredOn"] = detailedStatus.split("on")[1].strip()
678
                except:
679
                    pass
680
 
681
            elif detailedStatus.lower() == 'returned':
682
                status = 'Cancelled'
683
            subOrder['status'] = status
684
            subOrder['detailedStatus'] = displayStatus 
17350 amit.gupta 685
            self.db.merchantOrder.update({"orderId":orderId}, {"$set":{"trackError":False}})    
16468 amit.gupta 686
 
687
        except:
17350 amit.gupta 688
            self.db.merchantOrder.update({"orderId":orderId}, {"$set":{"trackError":True}})    
16468 amit.gupta 689
            print "failed to parse", orderId
690
            traceback.print_exc()
691
 
14624 amit.gupta 692
        return subOrder
693
 
694
 
695
 
16980 amit.gupta 696
    def parseInfo(self,):
697
        from pyquery import PyQuery as pq
16986 amit.gupta 698
        orders = list(session.query(Orders).filter_by(store_id=self.store_id).filter_by(status='DETAIL_CREATED').group_by(Orders.user_id).all())
16980 amit.gupta 699
        try:
700
            for order in orders:
701
                try:
702
                    doc = pq(order.rawhtml)
703
                    #a1= " ".join(["" if not div.text else div.text.replace("\t","").replace("\n","").replace(" ", "") for div in pq(doc('article')[-1])('div')])
704
                    lists = doc('ul.displayAddressUL li')
16986 amit.gupta 705
                    orderInfo = All_user_addresses()
16980 amit.gupta 706
                    orderInfo.address = lists[-3].text
707
                    orderInfo.user_id = order.user_id
16986 amit.gupta 708
                    orderInfo.source = 'order' 
709
                    #orderInfo.order_id = order.id
710
                    #orderInfo.email = None
711
                    #orderInfo.name = lists[0].text 
712
                    #orderInfo.mobile = None
16980 amit.gupta 713
                    adSplit = lists[-2].text.split(",")
714
                    match = re.match(r"([a-z ]+)([0-9]+)", adSplit[1], re.I)
715
                    if match:
716
                        items = match.groups()
16986 amit.gupta 717
                    orderInfo.city = adSplit[0].strip()
718
                    orderInfo.pincode = items[1].strip()
719
                    orderInfo.state = items[0].strip().title()
16980 amit.gupta 720
                    session.commit()
721
                except:
722
                    session.rollback()
723
                    continue
724
        finally:
725
            session.close()
14608 amit.gupta 726
 
13927 amit.gupta 727
 
728
 
13774 amit.gupta 729
def main():
17251 amit.gupta 730
    #getSummaryFile("/AmazonTrack/User8703/")
16874 amit.gupta 731
    #process_rejects("/home/amit/Downloads/RejectCashbackTemplate.xlsx")
16283 amit.gupta 732
    #str1 = readSSh("/AmazonTrack/User2466/orderSummary28-06:13:25:08")
15046 amit.gupta 733
    #readSSh("/tmp/User2/404-2225153-7073122")
16874 amit.gupta 734
    #for orderId, trackingUrl in all.iteritems():
735
    store = getStore(1)
17347 amit.gupta 736
    #store.parseOrderRawHtml(46328, '3442342424334346', 9722, readSSh("/home/amit/46328"), "https://www.amazon.in/gp/css/summary/edit.html?orderID=403-4276089-1251522")
16874 amit.gupta 737
     #   print store.parseTrackingUrl(trackingUrl, orderId)
17350 amit.gupta 738
    store.scrapeStoreOrders()
14650 amit.gupta 739
#    store.scrapeStoreOrders()
17230 amit.gupta 740
    #store.parseInfo()
17331 amit.gupta 741
    #store.trackOrdersForUser(4355, "", readSSh("~/4355"))
14813 amit.gupta 742
    #readSSh("/tmp/User211/2015-04-12 10:32:41.905765")
14703 amit.gupta 743
    #store.scrapeAffiliate()
15565 amit.gupta 744
    #parseDetailNotCreated()
16283 amit.gupta 745
    #parseOrderNotCreated()
17331 amit.gupta 746
#    for userId in store.db.merchantOrder.find({"storeId":1, "subOrders.closed":False}).distinct("userId"):
747
#        userId = int(userId)
748
#        directory = "/AmazonTrack/User" + str(userId) + "/"
749
#        summaryFile=getSummaryFile(directory)
750
#        if summaryFile is None:
751
#            print "No summary for", userId
752
#        else:
753
#            print userId, directory+summaryFile
754
#            store.trackOrdersForUser(userId, 'https://www.amazon.in/gp/css/order-history', readSSh(directory + summaryFile))
17348 amit.gupta 755
    for orderId in store.db.merchantOrder.find({"storeId":1, "status":"parse_failed", "subOrders":{"$exists":False}}).distinct("orderId"):
17334 amit.gupta 756
        try:
17335 amit.gupta 757
            o = session.query(OrdersRaw).filter_by(id = orderId).one()
17334 amit.gupta 758
            store.parseOrderRawHtml(o.id, o.sub_tag, o.user_id, o.rawhtml, o.order_url)
759
        except:
17335 amit.gupta 760
            print "Could not parse", orderId
17231 amit.gupta 761
 
762
    #store.trackOrdersForUser(8703, 'https://www.amazon.in/gp/css/order-history', readSSh('/home/amit/Downloads/orderSummary06-10_12_15_54'))
763
 
764
def getSummaryFile(directory):
765
    date1 = datetime(2015,1,1)
766
    finalFile = None
767
    try:
768
        for file in os.listdir(directory):
769
            if file.startswith("orderSummary"):
770
                date2 = datetime.strptime("2015-" + file.split("orderSummary")[1].split(":")[0], "%Y-%d-%m")
771
                if date2 > date1:
772
                    date1 = date2
773
                    finalFile=file
774
    except:
775
        print "Missing directory"
17251 amit.gupta 776
    return finalFile 
17231 amit.gupta 777
 
15555 amit.gupta 778
 
779
def parseDetailNotCreated():
780
    try:
781
        store=getStore(1)
782
        orders = session.query(OrdersRaw).filter_by(status='DETAIL_NOT_CREATED_UNKNOWN').all()
15558 amit.gupta 783
        session.close()
15555 amit.gupta 784
        for order in orders:
785
            store.trackOrdersForUser(order.id, order.order_url, order.rawhtml)
786
 
787
    finally:
788
        session.close()
17251 amit.gupta 789
 
790
def getDateStringDelivered(dateString='Monday'):
17254 amit.gupta 791
    print dateString
17251 amit.gupta 792
    if dateString.lower()=='today':
793
        return date.today()
794
    if dateString.lower()=='yesterday':
795
        return date.today() - timedelta(days=1)
796
    try:
797
        return datetime.strptime(dateString, '%d-%b-%y')
798
    except:
799
        try:
800
            #get Closest Date from today
801
            curDate = date.today()
802
            curTime = datetime(curDate.year, curDate.month, curDate.day)
803
            curYear = curDate.year
804
            prevYear = curYear - 1
17254 amit.gupta 805
            dateMax = datetime.strptime(dateString + " " + str(curYear), "%A, %d %b %Y")
806
            dateMin = datetime.strptime(dateString + " " + str(prevYear), "%A, %d %b %Y")
17251 amit.gupta 807
            if dateMax <= curTime:
808
                return dateMax
809
            else:
810
                return dateMin 
811
        except:
17254 amit.gupta 812
            try:
813
                days_of_week = ['sunday','monday','tuesday','wednesday',
814
                            'thursday','friday','saturday']
815
                deltaDays = curDate.isoweekday() - days_of_week.index(dateString.lower())
816
                if deltaDays <= 0:
817
                    deltaDays= deltaDays + 7
818
                curDate = curDate - timedelta(days=deltaDays)
819
                print datetime.strftime(curDate, '%d-%b-%y')
820
                return curDate
821
            except:
822
                print "could not parse"
823
                return None
15565 amit.gupta 824
 
17254 amit.gupta 825
def getDateStringArriving(dateString='Thursday'):
826
    print dateString
827
    if dateString.lower()=='today':
828
        return date.today()
829
    if dateString.lower()=='tomorrow':
830
        return date.today() + timedelta(days=1)
831
    try:
832
        return datetime.strptime(dateString, '%d-%b-%y')
833
    except:
834
        try:
835
            #get Closest Date from today
836
            curDate = date.today()
837
            curTime = datetime(curDate.year, curDate.month, curDate.day)
838
            curYear = curDate.year
839
            nextYear = curYear + 1
840
            dateMin = datetime.strptime(dateString + " " + str(curYear), "%A, %d %b %Y")
841
            dateMax = datetime.strptime(dateString + " " + str(nextYear), "%A, %d %b %Y")
842
            if dateMin >= curTime:
843
                return dateMin
844
            else:
845
                return dateMax 
846
        except:
847
            try:
848
                days_of_week = ['sunday','monday','tuesday','wednesday',
849
                            'thursday','friday','saturday']
850
                deltaDays = days_of_week.index(dateString.lower()) - curDate.isoweekday()
851
                if deltaDays < 0:
852
                    deltaDays= deltaDays + 7
853
                curDate = curDate + timedelta(days=deltaDays)
854
                return curDate
855
            except:
856
                print "Could not parse"
857
                return None 
858
 
15565 amit.gupta 859
def parseOrderNotCreated():
860
    try:
861
        store=getStore(1)
862
        orders = session.query(OrdersRaw).filter_by(status='ORDER_NOT_CREATED_UNKNOWN').all()
863
        session.close()
864
        for order in orders:
15567 amit.gupta 865
            result = store.parseOrderRawHtml(order.id, order.sub_tag, order.user_id, order.rawhtml, order.order_url)['result']
866
            order1 = session.query(OrdersRaw).filter_by(id=order.id).first()
867
            order1.status = result
868
            session.commit()
15565 amit.gupta 869
 
870
    finally:
871
        session.close()
15555 amit.gupta 872
 
13774 amit.gupta 873
if __name__ == '__main__':
17331 amit.gupta 874
#        readSSh("~/46417.html")
17321 amit.gupta 875
        main()
17254 amit.gupta 876
        #getDateStringArriving()