Subversion Repositories SmartDukaan

Rev

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

#!/usr/bin/python

'''
Send mail to courier partners to pickup the orders from store.

Created on 26-Jul-2012

@author: Rajveer
'''
from elixir import session
from optparse import OptionParser
from shop2020.clients.CRMClient import CRMClient
from shop2020.clients.CatalogClient import CatalogClient
from shop2020.clients.InventoryClient import InventoryClient
from shop2020.clients.LogisticsClient import LogisticsClient
from shop2020.clients.TransactionClient import TransactionClient
from shop2020.model.v1.order.impl import DataService
from shop2020.model.v1.order.impl.DataService import Order, Attribute
from shop2020.thriftpy.crm.ttypes import Ticket, Activity, TicketCategory, \
    TicketStatus, TicketPriority, ActivityType, SearchFilter
from shop2020.thriftpy.logistics.ttypes import PickupStore, DeliveryType
from shop2020.thriftpy.model.v1.order.ttypes import OrderStatus
from shop2020.utils.EmailAttachmentSender import mail, get_attachment_part
from textwrap import dedent
import datetime
import traceback
import xlwt


if __name__ == '__main__' and __package__ is None:
    import sys
    import os
    sys.path.insert(0, os.getcwd())
    



def createCrmTicket(order):
    try :
        cc = CRMClient().get_client()
        searchFilter = SearchFilter()
        searchFilter.ticketCategory = TicketCategory.STORE_PICKUP
        searchFilter.ticketStatuses = [TicketStatus.OPEN]
        tickets = cc.getTickets(searchFilter)
        
        ticketPresent = False
        for ticket in tickets :
            if ticket.orderId == order.id :
                ticketPresent = True
        if ticketPresent :
            return
        
        createTicket = True
        tc = TransactionClient().get_client()
        attributes = tc.getAllAttributesForOrderId(order.id)
        for attribute in attributes :
            if attribute.name == "pickupExtension" :
                expiryDate = order.delivery_timestamp + datetime.timedelta(days = 3) + datetime.timedelta(days = int(attribute.value))
                now = datetime.datetime.now()
                if expiryDate - now > datetime.timedelta(days = 2) :
                    createTicket = False
        
        if not createTicket:
            return
        
        ticket = Ticket()
        activity = Activity()
        ticket.category = TicketCategory.STORE_PICKUP
        ticket.customerEmailId = order.customer_email
        ticket.customerId = order.customer_id
        ticket.customerMobileNumber = order.customer_mobilenumber
        ticket.customerName = order.customer_name
        ticket.description = "Consignment not picked up yet. "
        ticket.orderId = order.id
        ticket.creatorId = 1
        ticket.priority = TicketPriority.HIGH
        ticket.status = TicketStatus.OPEN
        
        activity.creatorId = 1
        activity.ticketAssigneeId = ticket.assigneeId
        activity.type = ActivityType.OTHER
        activity.description = "Creating Ticket"
        activity.ticketCategory = ticket.category
        activity.ticketDescription = ticket.description
        activity.ticketPriority = ticket.priority
        activity.ticketStatus = ticket.status
        activity.customerEmailId = order.customer_email
        activity.customerId = order.customer_id
        activity.customerMobileNumber = order.customer_mobilenumber
        activity.customerName = order.customer_name
        
        cc.insertTicket(ticket, activity)
        
    except:
        print "Some issue while creating crm ticket for order :" + str(order.id)
        traceback.print_exc()


def process_pickup_store_returns():
    DataService.initialize(db_hostname="192.168.190.114", echoOn=True)
    to_date = datetime.datetime.today() + datetime.timedelta(days = -3)
    orders = Order.query.filter(Order.pickupStoreId > 0).filter(Order.status == OrderStatus.RECEIVED_AT_STORE).filter(Order.delivery_timestamp <= to_date).all()
    for order in orders:
        createCrmTicket(order)
    
    to_date = datetime.datetime.today() + datetime.timedelta(days = -5)
    logistics_store_order_mapping = {}
    orders = Order.query.filter(Order.pickupStoreId > 0).filter(Order.status == OrderStatus.RECEIVED_AT_STORE).filter(Order.delivery_timestamp <= to_date).order_by(Order.pickupStoreId).order_by(Order.logistics_provider_id).order_by(Order.warehouse_id).all()
    for order in orders:
        attribute = Attribute.query.filter(Attribute.orderId == order.id).filter(Attribute.name == "pickupExtension").first()
        expiry = order.delivery_timestamp + datetime.timedelta(days = 5)  
        if attribute:
            expiry = expiry + datetime.timedelta(days = int(attribute.value))
        if expiry > datetime.datetime.today() :
            continue        
        if logistics_store_order_mapping.has_key((order.pickupStoreId, order.logistics_provider_id, order.warehouse_id)):
            logistics_store_order_mapping.get((order.pickupStoreId, order.logistics_provider_id, order.warehouse_id)).append(order.id)
        else:
            logistics_store_order_mapping[order.pickupStoreId, order.logistics_provider_id, order.warehouse_id] = [order.id]
        order.status = OrderStatus.RTO_IN_TRANSIT
        order.statusDescription = "Return request raised"
    session.commit()
    
    lclient = LogisticsClient().get_client()
    iclient = InventoryClient().get_client()
    for key in logistics_store_order_mapping.keys():
        provider = lclient.getProvider(key[1])
        pickupStore = lclient.getPickupStore(key[0])
        warehouse = iclient.getWarehouse(key[2])
        for detail in provider.details:
            if detail.type == DeliveryType.PREPAID and detail.logisticLocation == warehouse.logisticsLocation :
                to_addr = detail.email
        
        subject = "Pickup request from " + pickupStore.city
        raw_message = '''
        Dear Sir/Madam,
        
        Kindly arrange a pickup today from %(customer_city)s. Pickup and delivery addresses are mentioned below.

        Pickup Order Ids: %(order_ids)s
        
        Pickup CODE: %(provider_code)s
        
        Pickup Address:

        %(customer_address)s

        Delivery Address:

        %(warehouse_executive)s
        %(warehouse_address)s
        PIN %(warehouse_pin)s
        
        Thanks and Regards
        Sandeep Sachdeva
        '''
        
        if warehouse.id == 7:
            executive = 'Amit Kumar'
        else:
            executive = 'Dinesh Kumar'
        
        address = pickupStore.name + "\n" + pickupStore.line1 + "\n"
        if pickupStore.line2:
            address = address + pickupStore.line2 + "\n"
        address = address + pickupStore.city + "\n"
        address = address + pickupStore.state + "\n"
        address = address + "PIN " + pickupStore.pin + "\n"
        address = address + "Phone: " + pickupStore.phone
        
        order_ids= ""
        for order_id in logistics_store_order_mapping.get(key):
            order_ids = order_ids + '    ' + str(order_id)
        
        providerCode = ''
        for detail in provider.details:
            if detail.type == DeliveryType.PREPAID and detail.logisticLocation == warehouse.logisticsLocation :
                providerCode = detail.accountNo        
        message = dedent(raw_message) % { 'customer_city' : pickupStore.city,
                                          'provider_code' : providerCode,
                                          'order_weight' : str(0.5),
                                          'customer_address' : address,
                                          'warehouse_executive' : executive,
                                          'warehouse_address' : warehouse.location,
                                          'warehouse_pin' : warehouse.pincode,
                                          'order_ids' : order_ids}
        to_addresses = [to_addr, 'amit.sirohi@shop2020.in']
        
        mail('cnc.center@shop2020.in', '5h0p2o2o', to_addresses, subject, message)

def main():
    process_pickup_store_returns()

if __name__ == '__main__':
    main()