Subversion Repositories SmartDukaan

Rev

Rev 3904 | Rev 3955 | 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
 
194
    public void processCODTxn(long transactionId) throws TException {
195
        try {
196
            log.info("Processing txn id: " + transactionId);
197
            Client client = new TransactionClient().getClient();
198
            Transaction transaction = client.getTransaction(transactionId);
199
            in.shop2020.model.v1.user.UserContextService.Client userClient = new UserClient().getClient();
200
            User user = userClient.getUserById(transaction.getCustomer_id());
201
            log.info(TRUST_THRESHOLD_LEVEL);
202
            log.info(user.getTrustLevel());
203
            if (user.getTrustLevel() - TRUST_THRESHOLD_LEVEL < 1e-4) {
204
                for (Order order : transaction.getOrders()) {
205
                    log.info("Processing order: " + order.getId());
3904 mandeep.dh 206
                    if (order.isCod() && OrderStatus.INIT.equals(order.getStatus())) {
3499 mandeep.dh 207
                        log.info("Processing COD order: " + order.getId());
3546 mandeep.dh 208
                        SearchFilter searchFilter = new SearchFilter();
209
                        searchFilter.setTicketStatuses(new ArrayList<TicketStatus>());
210
                        searchFilter.getTicketStatuses().add(TicketStatus.OPEN);
211
                        searchFilter.getTicketStatuses().add(TicketStatus.REOPEN);
212
                        searchFilter.setTicketCategory(TicketCategory.COD_VERIFICATION);
213
                        searchFilter.setCustomerId(transaction.getCustomer_id());
3499 mandeep.dh 214
 
3546 mandeep.dh 215
                        // No need to create a ticket if there exists one for the customer!
216
                        if (this.getTickets(searchFilter).isEmpty()) {
3904 mandeep.dh 217
                            log.info("Logging ticket");
3546 mandeep.dh 218
                            Ticket ticket = new Ticket();
219
                            ticket.setCategory(TicketCategory.COD_VERIFICATION);
220
                            ticket.setCreatorId(ADMIN_AGENT_ID);
221
                            ticket.setCustomerId(transaction.getCustomer_id());
222
                            ticket.setDescription("Requires COD verification");
223
                            ticket.setPriority(TicketPriority.HIGH);
224
                            ticket.setStatus(TicketStatus.OPEN);
3949 mandeep.dh 225
                            ticket.setAssigneeId(ADMIN_AGENT_ID);
3499 mandeep.dh 226
 
3546 mandeep.dh 227
                            Activity activity = new Activity();
228
                            activity.setCreatorId(ticket.getCreatorId());
229
                            activity.setCustomerId(ticket.getCustomerId());
230
                            activity.setDescription("Creating ticket");
231
                            activity.setTicketCategory(ticket.getCategory());
232
                            activity.setTicketDescription(ticket.getDescription());
233
                            activity.setTicketPriority(ticket.getPriority());
234
                            activity.setTicketStatus(ticket.getStatus());
3949 mandeep.dh 235
                            activity.setTicketAssigneeId(ticket.getAssigneeId());
3546 mandeep.dh 236
                            activity.setType(ActivityType.OTHER);
237
 
238
                            this.insertTicket(ticket, activity);
239
                            break;                           
240
                        }
241
                     }
3499 mandeep.dh 242
                }
243
            }
244
            else {
245
                log.info("Autoverifying orders");
246
                // Submit order for processing
247
                for (Order order : transaction.getOrders()) {
248
                    log.info("Processing order: " + order.getId());
249
                    client.changeOrderStatus(order.getId(), OrderStatus.SUBMITTED_FOR_PROCESSING, "In Process");
250
                }
251
            }
252
        } catch (TransactionServiceException e) {
253
            log.error("Could not fetch transaction details", e);
254
        } catch (UserContextException e) {
3853 mandeep.dh 255
            log.error("Could not fetch user details", e);
3499 mandeep.dh 256
        }
257
    }
3578 mandeep.dh 258
 
259
    public void processPaymentFailure(long customerId) throws TException {
260
        log.info("Processing Payment failure for customerId: " + customerId);
261
        SearchFilter searchFilter = new SearchFilter();
262
        searchFilter.setTicketStatuses(new ArrayList<TicketStatus>());
263
        searchFilter.getTicketStatuses().add(TicketStatus.OPEN);
264
        searchFilter.getTicketStatuses().add(TicketStatus.REOPEN);
265
        searchFilter.setTicketCategory(TicketCategory.FAILED_PAYMENTS);
266
        searchFilter.setCustomerId(customerId);
267
 
268
        // No need to create a ticket if there exists one for the customer!
269
        if (this.getTickets(searchFilter).isEmpty()) {
270
            Ticket ticket = new Ticket();
271
            ticket.setCategory(TicketCategory.FAILED_PAYMENTS);
272
            ticket.setCreatorId(ADMIN_AGENT_ID);
273
            ticket.setCustomerId(customerId);
274
            ticket.setDescription("Requires payment failures' follow-up!");
275
            ticket.setPriority(TicketPriority.HIGH);
276
            ticket.setStatus(TicketStatus.OPEN);
3949 mandeep.dh 277
            ticket.setAssigneeId(ADMIN_AGENT_ID);
3578 mandeep.dh 278
 
279
            Activity activity = new Activity();
280
            activity.setCreatorId(ticket.getCreatorId());
281
            activity.setCustomerId(ticket.getCustomerId());
282
            activity.setDescription("Creating ticket");
283
            activity.setTicketCategory(ticket.getCategory());
284
            activity.setTicketDescription(ticket.getDescription());
285
            activity.setTicketPriority(ticket.getPriority());
286
            activity.setTicketStatus(ticket.getStatus());
287
            activity.setType(ActivityType.OTHER);
3949 mandeep.dh 288
            activity.setTicketAssigneeId(ticket.getAssigneeId());
3578 mandeep.dh 289
 
290
            this.insertTicket(ticket, activity);
291
        }
292
    }
3024 mandeep.dh 293
}