Subversion Repositories SmartDukaan

Rev

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