Subversion Repositories SmartDukaan

Rev

Rev 23130 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#!/usr/bin/python
'''
It processes the following reports received from Couriers
through email:
 1. Pickup Report : contains details of orders that were 
     picked up from our warehouse, Return orders and DOA orders that were
     picked up from our customers.
 2. Delivery & RTO Report: contains details of orders that
     were either successfully delivered to our customers or
     which are being returned to us.
 3. Non-delivery Report: contains details of orders whose
     delivery date has passed but which have not been 
     delivered 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 HelperClient
from shop2020.clients.TransactionClient import TransactionClient
from shop2020.clients.CRMClient import CRMClient
from shop2020.clients.UserClient import UserClient
from shop2020.thriftpy.crm.ttypes import SearchFilter, TicketCategory, Ticket, \
    Activity, TicketPriority, TicketStatus, ActivityType
from shop2020.thriftpy.model.v1.order.ttypes import OrderStatus, \
    TransactionServiceException
from shop2020.thriftpy.model.v1.user.ttypes import PrivateDealUser
from shop2020.utils.Utils import to_py_date
from string import Template
import sys
import traceback

if __name__ == '__main__' and __package__ is None:
    import os
    sys.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 = 71
defaultUndeliveredAsssigneeId = 71 


def 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 body
    try:
        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 e

def 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]=ordersList
            else:
                ordersList = []
                ordersList.append(order)
                shipimentIdMap[order.logisticsTransactionId]=ordersList
        for ordersList in shipimentIdMap.values():
            order = ordersList[0]
            ticket_created = False
            searchFilter = SearchFilter()
            user = userClient.getUserByEmail(order.customer_email)
            privateDealUser = PrivateDealUser()
            if user is None or user.userId == -1:
                searchFilter.customerEmailId = order.customer_email
                searchFilter.customerMobileNumber = order.customer_mobilenumber
            else:
                searchFilter.customerId = user.userId
                privateDealUser= userClient.getPrivateDealUser(user.userId)
            searchFilter.ticketCategory = TicketCategory.UNDELIVERED
            tickets = crmServiceClient.getTickets(searchFilter)
            print tickets
            for old_ticket in tickets:
                if old_ticket.orderId == order.id:
                    ticket_created = True
                    break
            if not ticket_created:
                if order.status == OrderStatus.RTO_IN_TRANSIT and not privateDealUser.isActive:
                    continue
                    
                print "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 Ritesh
                if privateDealUser.isActive:
                    ticket.assigneeId = dtrUndeliveredAsssigneeId
                else:    
                    ticket.assigneeId = defaultUndeliveredAsssigneeId
                ticket.category = TicketCategory.UNDELIVERED
                ticket.priority = TicketPriority.HIGH
                ticket.status = TicketStatus.OPEN
                ticket.description = description
                ticket.orderId = order.id
                ticket.airwayBillNo = order.airwaybill_no
                
                activity.creatorId = 1
                activity.ticketAssigneeId = ticket.assigneeId
                activity.type = ActivityType.OTHER
                activity.description = description
                activity.ticketCategory = ticket.category
                activity.ticketDescription = ticket.description
                activity.ticketPriority = ticket.priority
                activity.ticketStatus = ticket.status
                
                if user is None or user.userId == -1:
                    ticket.customerEmailId = order.customer_email
                    ticket.customerMobileNumber = order.customer_mobilenumber
                    ticket.customerName = order.customer_name
                    activity.customerEmailId = order.customer_email
                    activity.customerMobileNumber = order.customer_mobilenumber
                    activity.customerName = order.customer_name
                else:
                    ticket.customerId = user.userId
                    activity.customerId = user.userId
                
                crmServiceClient.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_up
    except TransactionServiceException as tex:
        print tex.message