Rev 23130 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#!/usr/bin/python'''It processes the following reports received from Couriersthrough email:1. Pickup Report : contains details of orders that werepicked up from our warehouse, Return orders and DOA orders that werepicked up from our customers.2. Delivery & RTO Report: contains details of orders thatwere either successfully delivered to our customers orwhich are being returned to us.3. Non-delivery Report: contains details of orders whosedelivery date has passed but which have not beendelivered yet.It sends out a Pickup mismatch report, Return orders Pickup Mismatch report, Doa Pickup mismatch report,Undelivered orders report and Returned Orders report to cnc.center@shop2020.in@author: Chandranshu'''from shop2020.clients import HelperClientfrom shop2020.clients.TransactionClient import TransactionClientfrom shop2020.clients.CRMClient import CRMClientfrom shop2020.clients.UserClient import UserClientfrom shop2020.thriftpy.crm.ttypes import SearchFilter, TicketCategory, Ticket, \Activity, TicketPriority, TicketStatus, ActivityTypefrom shop2020.thriftpy.model.v1.order.ttypes import OrderStatus, \TransactionServiceExceptionfrom shop2020.thriftpy.model.v1.user.ttypes import PrivateDealUserfrom shop2020.utils.Utils import to_py_datefrom string import Templateimport sysimport tracebackif __name__ == '__main__' and __package__ is None:import ossys.path.insert(0, os.getcwd())logistics_providers = {1: {'name': 'BlueDart', 'phone': '011-66111234'}, 2: {'name': 'Aramex', 'phone': '0124- 39419900'}, 3: {'name': 'Delhivery', 'phone' : '0124- 4212200'}, 7: {'name': 'FedEx', 'phone' : '0120-4354176'}, 6: {'name' : 'RedExpress', 'phone' : '8373915813'}}FDASubjectTemplate = Template('First attempt made to deliver your $productName')FDABodyTemplate = Template('<div>'+'<p> Dear $customerName,<br>'+'<br>An attempt was made to deliver the product you ordered. The Courier '+'used was: $courierName and Airway Bill Number: $awbNumber. '+'However, the product could not be delivered due to $delayReason. '+'Please<a target="_blank" href="http://saholic.com/contactus"> Contact us </a>to coordinate the next delivery date.</p>'+'<div> <span>Order</span> Date: $orderDate</div>'+'<div>'+'<table>'+' <tbody>'+' <tr>'+' <td colspan="6">'+' <hr></td>'+' </tr>'+' <tr>'+' <td align="left" colspan="6"><b><span>Order</span> <span>Details</span></b></td>'+' </tr>'+' <tr>'+' <td colspan="6">'+' <hr></td>'+' </tr>'+' <tr>'+' <th width="100"><span>Order</span> No.</th>'+' <th>Product</th>'+' <th width="100">Quantity</th>'+' <td style="vertical-align:top"><span style="font-weight:bold">First Delivery Attempt</span><br>'+' </td>'+'<th width="100">Unit Price</th>'+' <th width="100">Amount</th>'+' </tr>'+' <tr>'+' <td align="center">$orderId</td>'+' <td>$productName</td>'+' <td align="center">$quantity</td>'+' <td style="vertical-align:top">$fdaDate</td>'+'<td align="center"> Rs. $unitPrice</td>'+' <td align="center"> Rs. $total</td>'+' </tr>'+' '+' <tr>'+' <td colspan="6">'+' <hr></td>'+' </tr>'+' <tr>'+' <td colspan="5">Total Amount</td>'+' <td> Rs. $totalAmount</td>'+' </tr>'+' <tr>'+' <td style="vertical-align:top" rowspan="1" colspan="6"><br>'+'</td>'+' </tr>'+'<tr>'+' <td colspan="6">'+' <hr></td>'+' </tr>'+' </tbody>'+'</table>'+'</div>'+'<br>'+'<p>Best Wishes,<br>'+'SmartDukaan Team </p>'+'</div>')dtrUndeliveredAsssigneeId = 71defaultUndeliveredAsssigneeId = 71def enqueueMailForFDA(order):dt = to_py_date(order.created_timestamp)formatted_order_date = dt.strftime("%A, %d. %B %Y %I:%M%p")sdt = to_py_date(order.first_attempt_timestamp)fda_date = sdt.strftime("%d %B %Y")'''order.lineitems[0]'''lineitem = order.lineitems[0]productName = "{0} {1} {2} {3}".format(lineitem.brand or "", lineitem.model_name or "", lineitem.model_number or "", lineitem.color or "")subject = FDASubjectTemplate.substitute(productName=productName)body = FDABodyTemplate.substitute(productName=productName, customerName=order.customer_name, quantity="%.0f" % lineitem.quantity,orderDate=formatted_order_date, orderId=order.id, unitPrice="%.2f" % lineitem.unit_price,total = "%.2f" % lineitem.total_price, totalAmount = "%.2f" % order.total_amount, fdaDate= fda_date,delayReason=order.statusDescription , awbNumber=order.airwaybill_no, courierName = logistics_providers[order.logistics_provider_id]['name'])print bodytry:helper_client = HelperClient(host_key = "helper_service_server_host_prod").get_client()helper_client.saveUserEmailForSending([order.customer_email], "", subject, body, str(order.id), "FirstDeliveryAttempted", [], ['kshitij.sood@shop2020.in', 'rajneesh.arora@shop2020.in', 'pramit.singh@shop2020.in', 'amit.sirohi@shop2020.in', 'rajveer.singh@shop2020.in'], 1)except Exception as e:print "Some problem occurred while enquing mail for user" + str(order.id) +" to inform FIRST_DELIVERY_ATTEMPT_MADE status"print edef create_crm_tickets_for_delivey_attempted_orders(provider):try:tickets_tobe_created = fetch_data(provider.id, [OrderStatus.FIRST_DELIVERY_ATTEMPT_MADE, OrderStatus.RTO_IN_TRANSIT])userClient = UserClient().get_client()crmServiceClient = CRMClient().get_client()shipimentIdMap = {}for order in tickets_tobe_created:if shipimentIdMap.has_key(order.logisticsTransactionId):ordersList = shipimentIdMap.get(order.logisticsTransactionId)ordersList.append(order)shipimentIdMap[order.logisticsTransactionId]=ordersListelse:ordersList = []ordersList.append(order)shipimentIdMap[order.logisticsTransactionId]=ordersListfor ordersList in shipimentIdMap.values():order = ordersList[0]ticket_created = FalsesearchFilter = SearchFilter()user = userClient.getUserByEmail(order.customer_email)privateDealUser = PrivateDealUser()if user is None or user.userId == -1:searchFilter.customerEmailId = order.customer_emailsearchFilter.customerMobileNumber = order.customer_mobilenumberelse:searchFilter.customerId = user.userIdprivateDealUser= userClient.getPrivateDealUser(user.userId)searchFilter.ticketCategory = TicketCategory.UNDELIVEREDtickets = crmServiceClient.getTickets(searchFilter)print ticketsfor old_ticket in tickets:if old_ticket.orderId == order.id:ticket_created = Truebreakif not ticket_created:if order.status == OrderStatus.RTO_IN_TRANSIT and not privateDealUser.isActive:continueprint "creating ticket for shipment Id:"+str(order.logisticsTransactionId)ticket = Ticket()activity = Activity()description = order.statusDescription + "\n\nShipment:- "+str(order.logisticsTransactionId)+" not delivered by courier due to problems at customer end."ticket.creatorId = 1#Tickets of Undelivered tickets to private deal user should be assigned to Riteshif privateDealUser.isActive:ticket.assigneeId = dtrUndeliveredAsssigneeIdelse:ticket.assigneeId = defaultUndeliveredAsssigneeIdticket.category = TicketCategory.UNDELIVEREDticket.priority = TicketPriority.HIGHticket.status = TicketStatus.OPENticket.description = descriptionticket.orderId = order.idticket.airwayBillNo = order.airwaybill_noactivity.creatorId = 1activity.ticketAssigneeId = ticket.assigneeIdactivity.type = ActivityType.OTHERactivity.description = descriptionactivity.ticketCategory = ticket.categoryactivity.ticketDescription = ticket.descriptionactivity.ticketPriority = ticket.priorityactivity.ticketStatus = ticket.statusif user is None or user.userId == -1:ticket.customerEmailId = order.customer_emailticket.customerMobileNumber = order.customer_mobilenumberticket.customerName = order.customer_nameactivity.customerEmailId = order.customer_emailactivity.customerMobileNumber = order.customer_mobilenumberactivity.customerName = order.customer_nameelse:ticket.customerId = user.userIdactivity.customerId = user.userIdcrmServiceClient.insertTicket(ticket, activity)'''Inform user about first delivery attempt'''if not OrderStatus.RTO_IN_TRANSIT:enqueueMailForFDA(order)except:print "Some issue while creating crm tickets for orders in FIRST_DELIVERY_ATTEMPT_MADE status"traceback.print_exc()def fetch_data(provider_id, order_status_list):txnClient = TransactionClient().get_client()try:doas_tobe_picked_up = txnClient.getOrdersForProviderForStatus(provider_id, order_status_list)return doas_tobe_picked_upexcept TransactionServiceException as tex:print tex.message