Subversion Repositories SmartDukaan

Rev

Rev 4008 | Rev 4179 | 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.domain.Activity;
7
import in.shop2020.crm.domain.SearchFilter;
8
import in.shop2020.crm.domain.Ticket;
9
import in.shop2020.crm.ActivityType;
10
import in.shop2020.crm.TicketCategory;
11
import in.shop2020.crm.TicketPriority;
12
import in.shop2020.crm.TicketStatus;
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.Order;
17
import in.shop2020.model.v1.order.OrderStatus;
18
import in.shop2020.model.v1.order.Transaction;
19
import in.shop2020.model.v1.order.TransactionService.Client;
20
import in.shop2020.model.v1.order.TransactionServiceException;
21
import in.shop2020.model.v1.user.User;
22
import in.shop2020.model.v1.user.UserContextException;
23
import in.shop2020.thrift.clients.TransactionClient;
24
import in.shop2020.thrift.clients.UserClient;
25
 
26
import java.util.ArrayList;
27
import java.util.List;
28
 
29
import org.apache.commons.logging.Log;
30
import org.apache.commons.logging.LogFactory;
31
import org.apache.thrift.TException;
32
import org.apache.thrift.transport.TTransportException;
33
import org.springframework.transaction.annotation.Transactional;
34
 
35
/**
36
 * @author mandeep
37
 * Processor all the COD transactions booked by customers, creates a ticket per
38
 * customer so as our Outbound team can work on them like verifying users
39
 * validity and order details.
40
 */
41
public class CODTransactionProcessorTask implements Runnable {
42
    private static Log log = LogFactory.getLog(CODTransactionProcessorTask.class);
43
    private static final double TRUST_THRESHOLD_LEVEL = 4.5;
44
    private static final long   ADMIN_AGENT_ID   = 1;
45
    private static final long   OUTBOUND_DEFAULT_ASSIGNEE_ID   = 12;
46
 
47
    private TicketHandler      ticketHandler;
48
    private ActivityHandler    activityHandler;
49
 
50
    public CODTransactionProcessorTask(TicketHandler ticketHandler,
51
            ActivityHandler activityHandler)
52
    {
53
        this.ticketHandler = ticketHandler;
54
        this.activityHandler = activityHandler;
55
    }
56
 
57
    /* (non-Javadoc)
58
     * @see java.lang.Runnable#run()
59
     */
60
    public void run() {
61
        try {
62
            Client client = new TransactionClient().getClient();
63
            List<Long> transactionIds = client.getTransactionsRequiringExtraProcessing(ExtraTransactionProcessingType.COD_VERIFICATION);
64
            if (transactionIds != null && !transactionIds.isEmpty()) {
65
                log.info("Fetched " + transactionIds.size() + " transactions");
66
                for (Long transactionId : transactionIds) {
67
                    processCODTxn(transactionId);
4022 mandeep.dh 68
                    client = new TransactionClient().getClient();
4008 mandeep.dh 69
                    client.markTransactionAsProcessed(transactionId, ExtraTransactionProcessingType.COD_VERIFICATION);
70
                }
71
            }
72
            else {
73
                log.info("No transactions to process");
74
            }
75
        } catch (TTransportException e) {
76
            log.error("Could not create TransactionService client", e);
77
        } catch (TException e) {
78
            log.error("Could not fetch transactions for processing", e);
79
        }
80
    }
81
 
82
    /**
83
     * Method that creates a ticket if necessary for COD verification
84
     */
85
    private void processCODTxn(long transactionId) {
86
        try {
87
            log.info("Processing txn id: " + transactionId);
88
            Client client = new TransactionClient().getClient();
89
            Transaction transaction = client.getTransaction(transactionId);
90
            in.shop2020.model.v1.user.UserContextService.Client userClient = new UserClient().getClient();
91
            User user = userClient.getUserById(transaction.getCustomer_id());
92
            if (user.getTrustLevel() - TRUST_THRESHOLD_LEVEL < 1e-4) {
93
                for (Order order : transaction.getOrders()) {
94
                    log.info("Processing order: " + order.getId());
95
                    if (order.isCod() && OrderStatus.INIT.equals(order.getStatus())) {
96
                        log.info("Processing COD order: " + order.getId());
97
                        in.shop2020.crm.domain.SearchFilter searchFilter = new SearchFilter();
98
                        searchFilter.setTicketStatuses(new ArrayList<TicketStatus>());
99
                        searchFilter.getTicketStatuses().add(TicketStatus.OPEN);
100
                        searchFilter.getTicketStatuses().add(TicketStatus.REOPEN);
101
                        searchFilter.setTicketCategory(TicketCategory.COD_VERIFICATION);
102
                        searchFilter.setCustomerId(transaction.getCustomer_id());
103
 
104
                        // No need to create a ticket if there exists one for the customer!
105
                        if (ticketHandler.getTickets(searchFilter).isEmpty()) {
106
                            log.info("Logging ticket");
107
                            Ticket ticket = new Ticket();
108
                            ticket.setCategory(TicketCategory.COD_VERIFICATION);
109
                            ticket.setCreatorId(ADMIN_AGENT_ID);
110
                            ticket.setCustomerId(transaction.getCustomer_id());
111
                            ticket.setDescription("Requires COD verification");
112
                            ticket.setPriority(TicketPriority.HIGH);
113
                            ticket.setStatus(TicketStatus.OPEN);
114
                            ticket.setAssigneeId(OUTBOUND_DEFAULT_ASSIGNEE_ID);
115
 
116
                            Activity activity = new Activity();
117
                            activity.setCreatorId(ticket.getCreatorId());
118
                            activity.setCustomerId(ticket.getCustomerId());
119
                            activity.setDescription("Creating ticket");
120
                            activity.setTicketCategory(ticket.getCategory());
121
                            activity.setTicketDescription(ticket.getDescription());
122
                            activity.setTicketPriority(ticket.getPriority());
123
                            activity.setTicketStatus(ticket.getStatus());
124
                            activity.setTicketAssigneeId(ticket.getAssigneeId());
125
                            activity.setType(ActivityType.OTHER);
126
 
127
                            createTicket(ticket, activity);
128
                            break;
129
                        }
130
                    }
131
                }
132
            }
133
            else {
134
                log.info("Autoverifying orders");
135
                // Submit order for processing
136
                for (Order order : transaction.getOrders()) {
137
                    log.info("Processing order: " + order.getId());
138
                    client.changeOrderStatus(order.getId(), OrderStatus.SUBMITTED_FOR_PROCESSING, "In Process");
139
                }
140
            }
141
        } catch (TransactionServiceException e) {
142
            log.error("Could not fetch transaction details", e);
143
        } catch (UserContextException e) {
144
            log.error("Could not fetch user details", e);
145
        } catch (TException e) {
146
            log.info("Error processing txn id: " + transactionId);
147
        } catch (Exception e) {
148
            log.info("Exception processing txn id: " + transactionId);
149
        }
150
    }
151
 
152
    @Transactional
153
    private void createTicket(Ticket ticket, Activity activity) {
154
        ticketHandler.insertTicket(ticket);
155
        activityHandler.insertActivity(activity);
156
    }
157
}