Subversion Repositories SmartDukaan

Rev

Rev 8381 | Rev 9338 | 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
 
5851 amar.kumar 6
import in.shop2020.alert.AlertService;
7
import in.shop2020.alert.EntityType;
8
import in.shop2020.alert.MonitoredEntity;
8371 manish.sha 9
import in.shop2020.config.ConfigException;
3024 mandeep.dh 10
import in.shop2020.crm.Activity;
3390 mandeep.dh 11
import in.shop2020.crm.ActivityType;
3024 mandeep.dh 12
import in.shop2020.crm.Agent;
5936 amar.kumar 13
import in.shop2020.crm.TicketStatus;
3024 mandeep.dh 14
import in.shop2020.crm.CRMService.Iface;
3390 mandeep.dh 15
import in.shop2020.crm.SearchFilter;
3024 mandeep.dh 16
import in.shop2020.crm.Ticket;
5916 amar.kumar 17
import in.shop2020.crm.TicketCategory;
3024 mandeep.dh 18
import in.shop2020.crm.handler.ActivityHandler;
19
import in.shop2020.crm.handler.AgentHandler;
20
import in.shop2020.crm.handler.TicketHandler;
8371 manish.sha 21
import in.shop2020.serving.model.ShipmentUpdate;
22
import in.shop2020.serving.services.FedExTrackingService;
5851 amar.kumar 23
import in.shop2020.thrift.clients.AlertClient;
8371 manish.sha 24
import in.shop2020.thrift.clients.TransactionClient;
25
import in.shop2020.thrift.clients.config.ConfigClient;
26
import in.shop2020.model.v1.order.Order;
27
import in.shop2020.model.v1.order.TransactionServiceException;
3024 mandeep.dh 28
 
29
import java.text.ParseException;
30
import java.util.ArrayList;
5851 amar.kumar 31
import java.util.Calendar;
3339 mandeep.dh 32
import java.util.Date;
3024 mandeep.dh 33
import java.util.List;
5909 amar.kumar 34
import java.util.Map;
3024 mandeep.dh 35
 
3499 mandeep.dh 36
import org.apache.commons.logging.Log;
37
import org.apache.commons.logging.LogFactory;
3024 mandeep.dh 38
import org.apache.thrift.TException;
8371 manish.sha 39
import org.apache.thrift.transport.TTransportException;
3024 mandeep.dh 40
import org.springframework.context.ApplicationContext;
41
import org.springframework.context.support.ClassPathXmlApplicationContext;
42
import org.springframework.stereotype.Service;
3206 mandeep.dh 43
import org.springframework.transaction.annotation.Transactional;
3024 mandeep.dh 44
 
45
/**
46
 * Implementation of the interface/services exposed by thrift to clients!
47
 * 
48
 * @author mandeep
49
 */
50
@Service
51
public class CRMServiceHandler implements Iface {
3499 mandeep.dh 52
    private static final Log log = LogFactory.getLog(CRMServiceHandler.class);
53
 
4008 mandeep.dh 54
    private TicketHandler      ticketHandler;
55
    private ActivityHandler    activityHandler;
56
    private AgentHandler       agentHandler;
8371 manish.sha 57
    private FedExTrackingService fedexTrackClient = new FedExTrackingService();
4008 mandeep.dh 58
 
59
    public CRMServiceHandler() {
60
        log.info("Creating context");
61
        ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
62
        ticketHandler              = context.getBean(TicketHandler.class);
63
        activityHandler            = context.getBean(ActivityHandler.class);
64
        agentHandler               = context.getBean(AgentHandler.class);
65
    }
66
 
3390 mandeep.dh 67
    public List<Ticket> getTickets(SearchFilter searchFilter) throws TException {
3024 mandeep.dh 68
        List<Ticket> ttickets = new ArrayList<Ticket>();
3390 mandeep.dh 69
        for (in.shop2020.crm.domain.Ticket ticket : ticketHandler
70
                .getTickets(in.shop2020.crm.domain.SearchFilter
71
                        .create(searchFilter))) {
3024 mandeep.dh 72
            ttickets.add(ticket.getThriftTicket());
73
        }
74
 
75
        return ttickets;
76
    }
77
 
3390 mandeep.dh 78
    public List<Ticket> getUnassignedTickets() throws TException {
79
        List<Ticket> tickets = new ArrayList<Ticket>();
80
 
81
        for (in.shop2020.crm.domain.Ticket ticket : ticketHandler
82
                .getUnassignedTickets()) {
83
            tickets.add(ticket.getThriftTicket());
84
        }
85
 
86
        return tickets;
87
    }
88
 
3206 mandeep.dh 89
    @Transactional
3390 mandeep.dh 90
    public void updateTicket(Ticket ticket, Activity activity)
91
            throws TException {
3024 mandeep.dh 92
        try {
93
            ticketHandler.updateTicket(in.shop2020.crm.domain.Ticket
94
                    .create(ticket));
3206 mandeep.dh 95
            activity.setTicketId(ticket.getId());
3390 mandeep.dh 96
            activityHandler.insertActivity(in.shop2020.crm.domain.Activity
97
                    .create(activity));
5851 amar.kumar 98
            try{
99
	            /*For now monitoring is only done for New tickets and hence once any 
100
	        	 * activity is done on a ticket after its creation, we stop monitoring that ticket*/
5916 amar.kumar 101
            	if(activity.getType()== ActivityType.SEND_EMAIL_TO_CUSTOMER || 
102
            			activity.getType()== ActivityType.ESCALATE_TICKET ||
5936 amar.kumar 103
            			activity.getType()== ActivityType.CALLED_CUSTOMER || 
104
            			activity.getTicketStatus().equals(TicketStatus.CLOSED)) {
5916 amar.kumar 105
		        	AlertService.Client alertClient = new AlertClient().getClient();
106
		            alertClient.endMonitoringEntity(EntityType.TICKET, "ticketId = " + ticket.getId());
107
            	}
5851 amar.kumar 108
            } catch(Exception ex) {
109
            	log.error("Exception while ending monitoring for ticketId " + ticket.getId());
110
            	log.error(ex);
111
            }
3024 mandeep.dh 112
        } catch (ParseException e) {
113
            throw new TException("Could not update " + ticket, e);
114
        }
115
    }
116
 
3206 mandeep.dh 117
    @Transactional
3390 mandeep.dh 118
    public long insertTicket(Ticket ticket, Activity activity)
119
            throws TException {
3024 mandeep.dh 120
        try {
3390 mandeep.dh 121
            long ticketId = ticketHandler
122
                    .insertTicket(in.shop2020.crm.domain.Ticket.create(ticket));
3206 mandeep.dh 123
            activity.setTicketId(ticketId);
3390 mandeep.dh 124
            activityHandler.insertActivity(in.shop2020.crm.domain.Activity
125
                    .create(activity));
5851 amar.kumar 126
            try {
7871 amar.kumar 127
            	if(ticket.getCategory()!= TicketCategory.DELIVERY_PROBLEM &&
128
            			ticket.getCategory()!= TicketCategory.PRODUCT_PROCUREMENT &&
129
            			ticket.getCategory()!= TicketCategory.DOA_RECEIVED) {
5916 amar.kumar 130
		            MonitoredEntity entity = new MonitoredEntity();
131
		            entity.setEntityType(EntityType.TICKET);
132
		            entity.setEventType(0);
133
		            entity.setEntityIdentifier("ticketId = " + new Long(ticketId).toString());
134
		            entity.setDescription(ticket.getDescription());
135
		            Calendar thresholdTime = Calendar.getInstance();
136
		            thresholdTime.add(Calendar.HOUR, 4);
137
		            entity.setWarnExpiryTime(thresholdTime.getTimeInMillis());
138
		            thresholdTime.add(Calendar.HOUR, 2);
139
		            entity.setCriticalExpiryTime(thresholdTime.getTimeInMillis());
140
		            AlertService.Client alertClient = new AlertClient().getClient();
141
		            alertClient.scheduleAlert(entity);
142
            	}
5851 amar.kumar 143
            } catch (Exception ex) {
144
            	log.error("Exception while scheduling alert for Ticket Id "+ticketId);
145
            	log.error(ex);
146
            }
3206 mandeep.dh 147
            return ticketId;
3024 mandeep.dh 148
        } catch (ParseException e) {
149
            throw new TException("Could not insert " + ticket, e);
150
        }
151
    }
152
 
3390 mandeep.dh 153
    public List<Activity> getActivities(SearchFilter searchFilter)
154
            throws TException {
3024 mandeep.dh 155
        List<Activity> tactivities = new ArrayList<Activity>();
7596 kshitij.so 156
        //Start:- Added By Manish Sharma for Displaying Current Ticket Status for Unread Customer Activities on 21-Jun-2013
157
        in.shop2020.crm.domain.SearchFilter filter_to_check  =in.shop2020.crm.domain.SearchFilter.create(searchFilter);
3168 mandeep.dh 158
        List<in.shop2020.crm.domain.Activity> activities = activityHandler
7596 kshitij.so 159
                .getActivities(filter_to_check);
160
        in.shop2020.crm.domain.SearchFilter new_searchFilter = new in.shop2020.crm.domain.SearchFilter();
161
        //End:- Added By Manish Sharma for Displaying Current Ticket Status for Unread Customer Activities on 21-Jun-2013
162
 
3168 mandeep.dh 163
        if (activities != null) {
164
            for (in.shop2020.crm.domain.Activity ticket : activities) {
7596 kshitij.so 165
            	//Start:- Added By Manish Sharma for Displaying Current Ticket Status for Unread Customer Activities on 21-Jun-2013
166
            	in.shop2020.crm.Activity activity = ticket.getThriftActivity();
167
            	if(filter_to_check.getIsActivityRead()!=null && !filter_to_check.getIsActivityRead()){
168
	            	if(activity.getTicketId() > 0){
169
		            	new_searchFilter.setTicketId(activity.getTicketId());
170
		            	List<in.shop2020.crm.domain.Ticket> tickets_as_per_activity= ticketHandler.getTickets(new_searchFilter);
171
		            	activity.setTicketStatus(tickets_as_per_activity.get(0).getStatus());
172
		            }
173
            	}
174
                tactivities.add(activity);
175
                //End:- Added By Manish Sharma for Displaying Current Ticket Status for Unread Customer Activities on 21-Jun-2013
3168 mandeep.dh 176
            }
3024 mandeep.dh 177
        }
3390 mandeep.dh 178
 
3024 mandeep.dh 179
        return tactivities;
180
    }
181
 
3405 mandeep.dh 182
    public long insertActivity(Activity activity) throws TException {
3024 mandeep.dh 183
        try {
3405 mandeep.dh 184
            return activityHandler.insertActivity(in.shop2020.crm.domain.Activity
3024 mandeep.dh 185
                    .create(activity));
186
        } catch (ParseException e) {
187
            throw new TException("Could not insert " + activity, e);
188
        }
189
    }
190
 
3390 mandeep.dh 191
    @Transactional
192
    public void markAsRead(long activityId, long agentId) throws TException {
193
        in.shop2020.crm.domain.SearchFilter searchFilter = new in.shop2020.crm.domain.SearchFilter();
194
        searchFilter.setActivityId(activityId);
195
        activityHandler.markAsRead(activityId);
3168 mandeep.dh 196
        in.shop2020.crm.domain.Activity activity = activityHandler
3390 mandeep.dh 197
                .getActivities(searchFilter).get(0);
4089 mandeep.dh 198
 
199
        // Setting activity fields from latest ticket fields
200
        if (activity.getTicketId() != null) {
201
            searchFilter.setTicketId(activity.getTicketId());
202
            in.shop2020.crm.domain.Ticket ticket = ticketHandler.getTickets(searchFilter).get(0);
203
            activity.setTicketAssigneeId(ticket.getAssigneeId());
204
            activity.setTicketCategory(ticket.getCategory());
205
            activity.setTicketDescription(ticket.getDescription());
206
            activity.setTicketPriority(ticket.getPriority());
207
            activity.setTicketStatus(ticket.getStatus());
208
        }
209
 
3390 mandeep.dh 210
        activity.setCreatorId(agentId);
211
        activity.setDescription("Marked as read ticketId: "
212
                + activity.getTicketId() + ", activityId: " + activityId);
213
        activity.setType(ActivityType.OTHER);
214
        activityHandler.insertActivity(activity);
3024 mandeep.dh 215
    }
216
 
3390 mandeep.dh 217
    public List<Agent> getAgents(SearchFilter searchFilter) throws TException {
218
        List<Agent> agents = new ArrayList<Agent>();
3024 mandeep.dh 219
 
3390 mandeep.dh 220
        for (in.shop2020.crm.domain.Agent agent : agentHandler
221
                .getAgents(in.shop2020.crm.domain.SearchFilter
222
                        .create(searchFilter))) {
223
            agents.add(agent.getThriftAgent());
3024 mandeep.dh 224
        }
225
 
3390 mandeep.dh 226
        return agents;
3024 mandeep.dh 227
    }
5286 amar.kumar 228
 
229
    public List<Agent> getInactiveAgents(SearchFilter searchFilter) throws TException {
230
        List<Agent> agents = new ArrayList<Agent>();
3024 mandeep.dh 231
 
5286 amar.kumar 232
        for (in.shop2020.crm.domain.Agent agent : agentHandler
233
                .getInactiveAgents(in.shop2020.crm.domain.SearchFilter
234
                        .create(searchFilter))) {
235
            agents.add(agent.getThriftAgent());
236
        }
237
 
238
        return agents;
239
    }
240
 
3390 mandeep.dh 241
    public void updatePasswordForAgent(String agentEmailId, String password)
3339 mandeep.dh 242
            throws TException {
3390 mandeep.dh 243
        agentHandler.updatePasswordForAgent(agentEmailId, password);
244
    }
3339 mandeep.dh 245
 
3390 mandeep.dh 246
    public long getLastEmailProcessedTimestamp() throws TException {
247
        return agentHandler.getLastEmailProcessedTimestamp().getTime();
3339 mandeep.dh 248
    }
249
 
3390 mandeep.dh 250
    public void updateLastEmailProcessedTimestamp(long timestamp)
3024 mandeep.dh 251
            throws TException {
3390 mandeep.dh 252
        agentHandler.updateLastEmailProcessedTimestamp(new Date(timestamp));
3024 mandeep.dh 253
    }
254
 
3088 mandeep.dh 255
    public List<String> getRoleNamesForAgent(String agentEmailId)
3168 mandeep.dh 256
            throws TException {
3088 mandeep.dh 257
        return agentHandler.getRoleNamesForAgent(agentEmailId);
258
    }
259
 
260
    public List<String> getPermissionsForRoleName(String roleName)
3168 mandeep.dh 261
            throws TException {
3088 mandeep.dh 262
        return agentHandler.getPermissionsForRoleName(roleName);
263
    }
4793 amar.kumar 264
 
265
    public void changeAgentStatus(boolean status, String emailId)
266
    		throws TException {
267
    	agentHandler.changeAgentStatus(status, emailId);
268
    }
3088 mandeep.dh 269
 
3375 rajveer 270
	public boolean isAlive() throws TException {
4624 mandeep.dh 271
        try {
272
            return !agentHandler.getAgents(null).isEmpty();
273
        } catch (Exception e) {
274
            log.error("Could not fetch agents", e);
275
        }
3375 rajveer 276
 
4624 mandeep.dh 277
        return false;
278
    }
279
 
3375 rajveer 280
	public void closeSession() throws TException {
281
	}
4793 amar.kumar 282
 
283
	public void insertAgent(Agent agent, List<String> role) throws TException {
284
		agentHandler.insertAgent(in.shop2020.crm.domain.Agent.create(agent), role);
285
	}
286
 
287
	public void unassignAgentTickets(int assigneeId) {
288
		ticketHandler.unassignAgentTickets(assigneeId);
289
	}
5168 amar.kumar 290
 
291
	public void changeAgentRole(long id, List<String> role) {
292
		agentHandler.changeAgentRole(id,role);
293
	}
294
 
295
	public int getOpenTicketCountForAgent(long agentId) {
296
		return ticketHandler.getOpenTicketCountForAgent(agentId);
297
	}
5909 amar.kumar 298
 
299
	public Map<String,Long> getOpenTicketsMap() {
300
		return ticketHandler.getOpenTicketsMap();
301
	}
8371 manish.sha 302
 
303
 
304
	public Map<String, String> getFedexReconciliationDataMap(
305
			List<Long> order_ids, String method_key) {
8384 manish.sha 306
		log.info("Into Method of CRM Service to get Fedex Reconciliation Data");
8371 manish.sha 307
		Map<String, String> fedexReconciliationDataMap = null;
308
		try{
309
			TransactionClient transactionServiceClient = new TransactionClient();
310
			List<Order> orderList= transactionServiceClient.getClient().getOrderList(order_ids);
311
			if("delivered_orders".equalsIgnoreCase(method_key)){
312
				fedexReconciliationDataMap = fedexTrackClient.readFedExDeliveredOrdersMap(orderList);
313
			}
314
			if("returned_orders".equalsIgnoreCase(method_key)){
315
				fedexReconciliationDataMap = fedexTrackClient.readFedExReturnedOrdersMap(orderList);
316
			}
317
			if("undelivered_orders".equalsIgnoreCase(method_key)){
318
				fedexReconciliationDataMap = fedexTrackClient.readFedExUnDeliveredOrdersMap(orderList);
319
			}
320
			if("first_delivery_attempted_orders".equalsIgnoreCase(method_key)){
321
				fedexReconciliationDataMap = fedexTrackClient.readFedExFirstDeliveryAttemptedOrdersMap(orderList);
322
			}
323
			if("destination_city_reached_orders".equalsIgnoreCase(method_key)){
324
				fedexReconciliationDataMap = fedexTrackClient.readFedExReachedDestinationOrdersMap(orderList);
325
			}
326
			if("picked_up_orders".equalsIgnoreCase(method_key) || "local_connection_orders".equalsIgnoreCase(method_key)){
327
				fedexReconciliationDataMap = fedexTrackClient.readFedExPickupOrdersMap(orderList);
328
			}
329
		// TODO Auto-generated method stub
330
		}
331
		catch (TTransportException e) {
8384 manish.sha 332
			log.error("Unable to create thrift Client from fedex reconciliation method.... ", e);
8371 manish.sha 333
		} catch (TException e) {
8384 manish.sha 334
			log.error("Unable to get thrift Client from fedex reconciliation method.... ", e);
8371 manish.sha 335
		}
8384 manish.sha 336
		log.info("Into Method of CRM Service to get Fedex Reconciliation Data....and got it successfully");
8371 manish.sha 337
		return fedexReconciliationDataMap;
338
	}
339
 }