Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
3024 mandeep.dh 1
/**
2
 * 
3
 */
4
package in.shop2020.crm.service.handler;
5
 
6
import in.shop2020.crm.Activity;
3390 mandeep.dh 7
import in.shop2020.crm.ActivityType;
3024 mandeep.dh 8
import in.shop2020.crm.Agent;
9
import in.shop2020.crm.CRMService.Iface;
3390 mandeep.dh 10
import in.shop2020.crm.SearchFilter;
3024 mandeep.dh 11
import in.shop2020.crm.Ticket;
3499 mandeep.dh 12
import in.shop2020.crm.TicketCategory;
13
import in.shop2020.crm.TicketPriority;
14
import in.shop2020.crm.TicketStatus;
3024 mandeep.dh 15
import in.shop2020.crm.handler.ActivityHandler;
16
import in.shop2020.crm.handler.AgentHandler;
17
import in.shop2020.crm.handler.TicketHandler;
3499 mandeep.dh 18
import in.shop2020.model.v1.order.Order;
19
import in.shop2020.model.v1.order.OrderStatus;
20
import in.shop2020.model.v1.order.Transaction;
21
import in.shop2020.model.v1.order.TransactionService.Client;
22
import in.shop2020.model.v1.order.TransactionServiceException;
23
import in.shop2020.model.v1.user.User;
24
import in.shop2020.model.v1.user.UserContextException;
25
import in.shop2020.thrift.clients.TransactionClient;
26
import in.shop2020.thrift.clients.UserClient;
3024 mandeep.dh 27
 
28
import java.text.ParseException;
29
import java.util.ArrayList;
3339 mandeep.dh 30
import java.util.Date;
3024 mandeep.dh 31
import java.util.List;
32
 
3499 mandeep.dh 33
import org.apache.commons.logging.Log;
34
import org.apache.commons.logging.LogFactory;
3024 mandeep.dh 35
import org.apache.thrift.TException;
36
import org.springframework.context.ApplicationContext;
37
import org.springframework.context.support.ClassPathXmlApplicationContext;
38
import org.springframework.stereotype.Service;
3206 mandeep.dh 39
import org.springframework.transaction.annotation.Transactional;
3024 mandeep.dh 40
 
41
/**
42
 * Implementation of the interface/services exposed by thrift to clients!
43
 * 
44
 * @author mandeep
45
 */
46
@Service
47
public class CRMServiceHandler implements Iface {
3499 mandeep.dh 48
    public static final long   ADMIN_AGENT_ID   = 1;
3982 mandeep.dh 49
    public static final long   OUTBOUND_DEFAULT_ASSIGNEE_ID   = 12;
3168 mandeep.dh 50
    ApplicationContext context         = new ClassPathXmlApplicationContext(
51
                                               "context.xml");
3024 mandeep.dh 52
    TicketHandler      ticketHandler   = context.getBean(TicketHandler.class);
53
    ActivityHandler    activityHandler = context.getBean(ActivityHandler.class);
54
    AgentHandler       agentHandler    = context.getBean(AgentHandler.class);
55
 
3499 mandeep.dh 56
    private static final Log log = LogFactory.getLog(CRMServiceHandler.class);
3546 mandeep.dh 57
    private static final double TRUST_THRESHOLD_LEVEL = 4.5;
3499 mandeep.dh 58
 
3390 mandeep.dh 59
    public List<Ticket> getTickets(SearchFilter searchFilter) throws TException {
3024 mandeep.dh 60
        List<Ticket> ttickets = new ArrayList<Ticket>();
3390 mandeep.dh 61
        for (in.shop2020.crm.domain.Ticket ticket : ticketHandler
62
                .getTickets(in.shop2020.crm.domain.SearchFilter
63
                        .create(searchFilter))) {
3024 mandeep.dh 64
            ttickets.add(ticket.getThriftTicket());
65
        }
66
 
67
        return ttickets;
68
    }
69
 
3390 mandeep.dh 70
    public List<Ticket> getUnassignedTickets() throws TException {
71
        List<Ticket> tickets = new ArrayList<Ticket>();
72
 
73
        for (in.shop2020.crm.domain.Ticket ticket : ticketHandler
74
                .getUnassignedTickets()) {
75
            tickets.add(ticket.getThriftTicket());
76
        }
77
 
78
        return tickets;
79
    }
80
 
3206 mandeep.dh 81
    @Transactional
3390 mandeep.dh 82
    public void updateTicket(Ticket ticket, Activity activity)
83
            throws TException {
3024 mandeep.dh 84
        try {
85
            ticketHandler.updateTicket(in.shop2020.crm.domain.Ticket
86
                    .create(ticket));
3206 mandeep.dh 87
            activity.setTicketId(ticket.getId());
3390 mandeep.dh 88
            activityHandler.insertActivity(in.shop2020.crm.domain.Activity
89
                    .create(activity));
3024 mandeep.dh 90
        } catch (ParseException e) {
91
            throw new TException("Could not update " + ticket, e);
92
        }
93
    }
94
 
3206 mandeep.dh 95
    @Transactional
3390 mandeep.dh 96
    public long insertTicket(Ticket ticket, Activity activity)
97
            throws TException {
3024 mandeep.dh 98
        try {
3390 mandeep.dh 99
            long ticketId = ticketHandler
100
                    .insertTicket(in.shop2020.crm.domain.Ticket.create(ticket));
3206 mandeep.dh 101
            activity.setTicketId(ticketId);
3390 mandeep.dh 102
            activityHandler.insertActivity(in.shop2020.crm.domain.Activity
103
                    .create(activity));
3206 mandeep.dh 104
            return ticketId;
3024 mandeep.dh 105
        } catch (ParseException e) {
106
            throw new TException("Could not insert " + ticket, e);
107
        }
108
    }
109
 
3390 mandeep.dh 110
    public List<Activity> getActivities(SearchFilter searchFilter)
111
            throws TException {
3024 mandeep.dh 112
        List<Activity> tactivities = new ArrayList<Activity>();
3168 mandeep.dh 113
        List<in.shop2020.crm.domain.Activity> activities = activityHandler
3390 mandeep.dh 114
                .getActivities(in.shop2020.crm.domain.SearchFilter
115
                        .create(searchFilter));
116
 
3168 mandeep.dh 117
        if (activities != null) {
118
            for (in.shop2020.crm.domain.Activity ticket : activities) {
119
                tactivities.add(ticket.getThriftActivity());
120
            }
3024 mandeep.dh 121
        }
3390 mandeep.dh 122
 
3024 mandeep.dh 123
        return tactivities;
124
    }
125
 
3405 mandeep.dh 126
    public long insertActivity(Activity activity) throws TException {
3024 mandeep.dh 127
        try {
3405 mandeep.dh 128
            return activityHandler.insertActivity(in.shop2020.crm.domain.Activity
3024 mandeep.dh 129
                    .create(activity));
130
        } catch (ParseException e) {
131
            throw new TException("Could not insert " + activity, e);
132
        }
133
    }
134
 
3390 mandeep.dh 135
    @Transactional
136
    public void markAsRead(long activityId, long agentId) throws TException {
137
        in.shop2020.crm.domain.SearchFilter searchFilter = new in.shop2020.crm.domain.SearchFilter();
138
        searchFilter.setActivityId(activityId);
139
        activityHandler.markAsRead(activityId);
3168 mandeep.dh 140
        in.shop2020.crm.domain.Activity activity = activityHandler
3390 mandeep.dh 141
                .getActivities(searchFilter).get(0);
142
        activity.setCreatorId(agentId);
143
        activity.setDescription("Marked as read ticketId: "
144
                + activity.getTicketId() + ", activityId: " + activityId);
145
        activity.setType(ActivityType.OTHER);
146
        activityHandler.insertActivity(activity);
3024 mandeep.dh 147
    }
148
 
3390 mandeep.dh 149
    public List<Agent> getAgents(SearchFilter searchFilter) throws TException {
150
        List<Agent> agents = new ArrayList<Agent>();
3024 mandeep.dh 151
 
3390 mandeep.dh 152
        for (in.shop2020.crm.domain.Agent agent : agentHandler
153
                .getAgents(in.shop2020.crm.domain.SearchFilter
154
                        .create(searchFilter))) {
155
            agents.add(agent.getThriftAgent());
3024 mandeep.dh 156
        }
157
 
3390 mandeep.dh 158
        return agents;
3024 mandeep.dh 159
    }
160
 
3390 mandeep.dh 161
    public void updatePasswordForAgent(String agentEmailId, String password)
3339 mandeep.dh 162
            throws TException {
3390 mandeep.dh 163
        agentHandler.updatePasswordForAgent(agentEmailId, password);
164
    }
3339 mandeep.dh 165
 
3390 mandeep.dh 166
    public long getLastEmailProcessedTimestamp() throws TException {
167
        return agentHandler.getLastEmailProcessedTimestamp().getTime();
3339 mandeep.dh 168
    }
169
 
3390 mandeep.dh 170
    public void updateLastEmailProcessedTimestamp(long timestamp)
3024 mandeep.dh 171
            throws TException {
3390 mandeep.dh 172
        agentHandler.updateLastEmailProcessedTimestamp(new Date(timestamp));
3024 mandeep.dh 173
    }
174
 
3088 mandeep.dh 175
    public List<String> getRoleNamesForAgent(String agentEmailId)
3168 mandeep.dh 176
            throws TException {
3088 mandeep.dh 177
        return agentHandler.getRoleNamesForAgent(agentEmailId);
178
    }
179
 
180
    public List<String> getPermissionsForRoleName(String roleName)
3168 mandeep.dh 181
            throws TException {
3088 mandeep.dh 182
        return agentHandler.getPermissionsForRoleName(roleName);
183
    }
184
 
3375 rajveer 185
	public boolean isAlive() throws TException {
186
		// TODO Auto-generated method stub
187
		return true;
188
	}
189
 
190
	public void closeSession() throws TException {
191
		// TODO Auto-generated method stub
192
 
193
	}
3499 mandeep.dh 194
 
3955 mandeep.dh 195
	/**
196
	 * Async method that creates a ticket if necessary for COD verification
197
	 */
198
    public void processCODTxn(long transactionId) {
3499 mandeep.dh 199
        try {
200
            log.info("Processing txn id: " + transactionId);
201
            Client client = new TransactionClient().getClient();
202
            Transaction transaction = client.getTransaction(transactionId);
203
            in.shop2020.model.v1.user.UserContextService.Client userClient = new UserClient().getClient();
204
            User user = userClient.getUserById(transaction.getCustomer_id());
205
            if (user.getTrustLevel() - TRUST_THRESHOLD_LEVEL < 1e-4) {
206
                for (Order order : transaction.getOrders()) {
207
                    log.info("Processing order: " + order.getId());
3904 mandeep.dh 208
                    if (order.isCod() && OrderStatus.INIT.equals(order.getStatus())) {
3499 mandeep.dh 209
                        log.info("Processing COD order: " + order.getId());
3546 mandeep.dh 210
                        SearchFilter searchFilter = new SearchFilter();
211
                        searchFilter.setTicketStatuses(new ArrayList<TicketStatus>());
212
                        searchFilter.getTicketStatuses().add(TicketStatus.OPEN);
213
                        searchFilter.getTicketStatuses().add(TicketStatus.REOPEN);
214
                        searchFilter.setTicketCategory(TicketCategory.COD_VERIFICATION);
215
                        searchFilter.setCustomerId(transaction.getCustomer_id());
3499 mandeep.dh 216
 
3546 mandeep.dh 217
                        // No need to create a ticket if there exists one for the customer!
218
                        if (this.getTickets(searchFilter).isEmpty()) {
3904 mandeep.dh 219
                            log.info("Logging ticket");
3546 mandeep.dh 220
                            Ticket ticket = new Ticket();
221
                            ticket.setCategory(TicketCategory.COD_VERIFICATION);
222
                            ticket.setCreatorId(ADMIN_AGENT_ID);
223
                            ticket.setCustomerId(transaction.getCustomer_id());
224
                            ticket.setDescription("Requires COD verification");
225
                            ticket.setPriority(TicketPriority.HIGH);
226
                            ticket.setStatus(TicketStatus.OPEN);
3982 mandeep.dh 227
                            ticket.setAssigneeId(OUTBOUND_DEFAULT_ASSIGNEE_ID);
3499 mandeep.dh 228
 
3546 mandeep.dh 229
                            Activity activity = new Activity();
230
                            activity.setCreatorId(ticket.getCreatorId());
231
                            activity.setCustomerId(ticket.getCustomerId());
232
                            activity.setDescription("Creating ticket");
233
                            activity.setTicketCategory(ticket.getCategory());
234
                            activity.setTicketDescription(ticket.getDescription());
235
                            activity.setTicketPriority(ticket.getPriority());
236
                            activity.setTicketStatus(ticket.getStatus());
3949 mandeep.dh 237
                            activity.setTicketAssigneeId(ticket.getAssigneeId());
3546 mandeep.dh 238
                            activity.setType(ActivityType.OTHER);
239
 
240
                            this.insertTicket(ticket, activity);
241
                            break;                           
242
                        }
3955 mandeep.dh 243
                    }
3499 mandeep.dh 244
                }
245
            }
246
            else {
247
                log.info("Autoverifying orders");
248
                // Submit order for processing
249
                for (Order order : transaction.getOrders()) {
250
                    log.info("Processing order: " + order.getId());
251
                    client.changeOrderStatus(order.getId(), OrderStatus.SUBMITTED_FOR_PROCESSING, "In Process");
252
                }
253
            }
254
        } catch (TransactionServiceException e) {
255
            log.error("Could not fetch transaction details", e);
256
        } catch (UserContextException e) {
3853 mandeep.dh 257
            log.error("Could not fetch user details", e);
3955 mandeep.dh 258
        } catch (TException e) {
259
            log.info("Error processing txn id: " + transactionId);
260
        } catch (Exception e) {
261
            log.info("Exception processing txn id: " + transactionId);
3499 mandeep.dh 262
        }
263
    }
3578 mandeep.dh 264
 
3955 mandeep.dh 265
    /**
266
     * Async method to create tickets for failed payments.
267
     */
268
    public void processPaymentFailure(long customerId) {
269
        try {
270
            log.info("Processing Payment failure for customerId: " + customerId);
271
            SearchFilter searchFilter = new SearchFilter();
272
            searchFilter.setTicketStatuses(new ArrayList<TicketStatus>());
273
            searchFilter.getTicketStatuses().add(TicketStatus.OPEN);
274
            searchFilter.getTicketStatuses().add(TicketStatus.REOPEN);
275
            searchFilter.setTicketCategory(TicketCategory.FAILED_PAYMENTS);
276
            searchFilter.setCustomerId(customerId);
3578 mandeep.dh 277
 
3955 mandeep.dh 278
            // No need to create a ticket if there exists one for the customer!
279
            if (this.getTickets(searchFilter).isEmpty()) {
280
                Ticket ticket = new Ticket();
281
                ticket.setCategory(TicketCategory.FAILED_PAYMENTS);
282
                ticket.setCreatorId(ADMIN_AGENT_ID);
283
                ticket.setCustomerId(customerId);
284
                ticket.setDescription("Requires payment failures' follow-up!");
285
                ticket.setPriority(TicketPriority.HIGH);
286
                ticket.setStatus(TicketStatus.OPEN);
3982 mandeep.dh 287
                ticket.setAssigneeId(OUTBOUND_DEFAULT_ASSIGNEE_ID);
3578 mandeep.dh 288
 
3955 mandeep.dh 289
                Activity activity = new Activity();
290
                activity.setCreatorId(ticket.getCreatorId());
291
                activity.setCustomerId(ticket.getCustomerId());
292
                activity.setDescription("Creating ticket");
293
                activity.setTicketCategory(ticket.getCategory());
294
                activity.setTicketDescription(ticket.getDescription());
295
                activity.setTicketPriority(ticket.getPriority());
296
                activity.setTicketStatus(ticket.getStatus());
297
                activity.setType(ActivityType.OTHER);
298
                activity.setTicketAssigneeId(ticket.getAssigneeId());
3578 mandeep.dh 299
 
3955 mandeep.dh 300
                this.insertTicket(ticket, activity);
301
            }
302
        } catch (TException e) {
303
            log.error("Error fetching/inserting tickets for customer Id: " + customerId, e);
304
        } catch (Exception e) {
305
            log.error("Exception processing payment failrue for customer Id: " + customerId, e);
3578 mandeep.dh 306
        }
307
    }
3024 mandeep.dh 308
}