Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
4008 mandeep.dh 1
/**
2
 * 
3
 */
4
package in.shop2020.crm.util;
5
 
6
import in.shop2020.crm.ActivityType;
7
import in.shop2020.crm.TicketCategory;
8
import in.shop2020.crm.TicketPriority;
9
import in.shop2020.crm.TicketStatus;
10
import in.shop2020.crm.domain.Activity;
11
import in.shop2020.crm.domain.SearchFilter;
12
import in.shop2020.crm.domain.Ticket;
13
import in.shop2020.crm.handler.ActivityHandler;
14
import in.shop2020.crm.handler.TicketHandler;
15
import in.shop2020.model.v1.order.ExtraTransactionProcessingType;
16
import in.shop2020.model.v1.order.TransactionService.Client;
17
import in.shop2020.model.v1.order.TransactionServiceException;
18
import in.shop2020.thrift.clients.TransactionClient;
19
 
20
import java.util.ArrayList;
21
import java.util.List;
22
 
23
import org.apache.commons.logging.Log;
24
import org.apache.commons.logging.LogFactory;
25
import org.apache.thrift.TException;
26
import org.apache.thrift.transport.TTransportException;
27
import org.springframework.transaction.annotation.Transactional;
28
 
29
/**
30
 * @author mandeep
31
 *
32
 * This class processes all the orders whose delivery has been delayed due
33
 * to one or the other issue (delayReason field). We create a ticket per customer
34
 * in such cases and Outbound team intimates them regarding the delay.
35
 */
36
public class DelayedOrderProcessorTask implements Runnable {
37
    private static Log log = LogFactory.getLog(DelayedOrderProcessorTask.class);
38
    private static final long   ADMIN_AGENT_ID   = 1;
39
    private static final long   OUTBOUND_DEFAULT_ASSIGNEE_ID   = 12;
40
 
41
    private TicketHandler      ticketHandler;
42
    private ActivityHandler    activityHandler;
43
 
44
    public DelayedOrderProcessorTask(TicketHandler ticketHandler,
45
            ActivityHandler activityHandler)
46
    {
47
        this.ticketHandler = ticketHandler;
48
        this.activityHandler = activityHandler;
49
    }
50
 
51
    /* (non-Javadoc)
52
     * @see java.lang.Runnable#run()
53
     */
54
    public void run() {
55
        try {
56
            Client client = new TransactionClient().getClient();
57
            List<Long> transactionIds = client.getTransactionsRequiringExtraProcessing(ExtraTransactionProcessingType.DELAYED_DELIVERY);
58
            if (transactionIds != null && !transactionIds.isEmpty()) {
59
                log.info("Fetched " + transactionIds.size() + " transactions");
60
                for (Long transactionId : transactionIds) {
61
                    processDelayedOrder(client.getTransaction(transactionId).getCustomer_id());
62
                    client.markTransactionAsProcessed(transactionId, ExtraTransactionProcessingType.DELAYED_DELIVERY);
63
                }
64
            }
65
            else {
66
                log.info("No transactions to process");
67
            }
68
        } catch (TTransportException e) {
69
            log.error("Could not create TransactionService client", e);
70
        } catch (TException e) {
71
            log.error("Could not fetch transactions for processing", e);
72
        } catch (TransactionServiceException e) {
73
            log.error("Could not lookup transaction", e);
74
        }
75
    }
76
 
77
    private void processDelayedOrder(Long customerId) {
78
        try {
79
            log.info("Processing delayed order for customerId: " + customerId);
80
            SearchFilter searchFilter = new SearchFilter();
81
            searchFilter.setTicketStatuses(new ArrayList<TicketStatus>());
82
            searchFilter.getTicketStatuses().add(TicketStatus.OPEN);
83
            searchFilter.getTicketStatuses().add(TicketStatus.REOPEN);
84
            searchFilter.setTicketCategory(TicketCategory.DELAYED_DELIVERY);
85
            searchFilter.setCustomerId(customerId);
86
 
87
            // No need to create a ticket if there exists one for the customer!
88
            if (ticketHandler.getTickets(searchFilter).isEmpty()) {
89
                Ticket ticket = new Ticket();
90
                ticket.setCategory(TicketCategory.DELAYED_DELIVERY);
91
                ticket.setCreatorId(ADMIN_AGENT_ID);
92
                ticket.setCustomerId(customerId);
93
                ticket.setDescription("Requires delayed delivery intimation");
94
                ticket.setPriority(TicketPriority.HIGH);
95
                ticket.setStatus(TicketStatus.OPEN);
96
                ticket.setAssigneeId(OUTBOUND_DEFAULT_ASSIGNEE_ID);
97
 
98
                Activity activity = new Activity();
99
                activity.setCreatorId(ticket.getCreatorId());
100
                activity.setCustomerId(ticket.getCustomerId());
101
                activity.setDescription("Creating ticket");
102
                activity.setTicketCategory(ticket.getCategory());
103
                activity.setTicketDescription(ticket.getDescription());
104
                activity.setTicketPriority(ticket.getPriority());
105
                activity.setTicketStatus(ticket.getStatus());
106
                activity.setType(ActivityType.OTHER);
107
                activity.setTicketAssigneeId(ticket.getAssigneeId());
108
 
109
                createTicket(ticket, activity);
110
            }
111
        } catch (Exception e) {
112
            log.error("Exception processing delayed delivery in order for customer Id: "
113
                    + customerId, e);
114
        }
115
    }
116
 
117
    @Transactional
118
    private void createTicket(Ticket ticket, Activity activity) {
119
        ticketHandler.insertTicket(ticket);
4179 mandeep.dh 120
        activity.setTicketId(ticket.getId());
4008 mandeep.dh 121
        activityHandler.insertActivity(activity);
122
    }
123
}