Subversion Repositories SmartDukaan

Rev

Rev 3090 | Blame | Last modification | View Log | RSS feed

/**
 * 
 */
package in.shop2020.serving.controllers;

import in.shop2020.crm.Activity;
import in.shop2020.crm.ActivityType;
import in.shop2020.crm.Agent;
import in.shop2020.crm.Ticket;
import in.shop2020.crm.TicketCategory;
import in.shop2020.crm.TicketPriority;
import in.shop2020.crm.TicketStatus;
import in.shop2020.model.v1.user.User;
import in.shop2020.model.v1.user.UserContextException;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.thrift.TException;

/**
 * Action class for ticket pages in CRM tool.
 * 
 * @author mandeep
 */
@SuppressWarnings("serial")
public class UserTicketsController extends BaseController {
    private static final String AGENT = "Agent";

    private Map<Long, Ticket> ticketsMap = new HashMap<Long, Ticket>();

    private long              userId;
    private String            id;
    private String            activityDescription;
    private String            description;
    private String            assigneeEmailId;
    private String            status;
    private String            priority;
    private String            category;
    private String            activityType;
    private Ticket            ticket;
    private List<Activity>    activities;
    private String            orderId;

    public String index() {
        try {
            createServiceClients();
            List<Ticket> ticketsList = crmServiceClient.getTickets(userId);
            if (ticketsList != null) {
                for (Ticket ticket : ticketsList) {
                    ticketsMap.put(ticket.getId(), ticket);
                }
            }
        } catch (TException e) {
            log.error("Error while getting tickets", e);
            return EXCEPTION;
        }
        return INDEX;
    }

    public String update() {
        try {
            createServiceClients();

            long creatorId = crmServiceClient.getAgentByEmailId(
                    currentAgentEmailId).getId();

            // Only subject and close date are editable fields for a ticket
            Ticket ticket = new Ticket();
            ticket.setId(Long.parseLong(id));
            ticket.setDescription(description);
            ticket.setCategory(TicketCategory.valueOf(category));
            ticket.setPriority(TicketPriority.valueOf(priority));
            ticket.setStatus(TicketStatus.valueOf(status));

            // Update when a ticket is closed!
            if (TicketStatus.CLOSED.name().equals(status)) {
                ticket.setCloseDate(new Date().getTime());
            } else {
                ticket.setCloseDateIsSet(false);
            }

            Activity activity = new Activity();
            activity.setDescription(activityDescription);
            activity.setCustomerId(userId);
            activity.setType(ActivityType.valueOf(activityType));
            activity.setTicketPriority(TicketPriority.valueOf(priority));
            activity.setTicketStatus(TicketStatus.valueOf(status));
            activity.setCreatorId(creatorId);
            activity.setTicketCategory(TicketCategory.valueOf(category));
            activity.setTicketDescription(description);

            // handling null values appropriately
            if (assigneeEmailId != null && !assigneeEmailId.isEmpty()) {
                long assigneeId = crmServiceClient.getAgentByEmailId(
                        assigneeEmailId).getId();
                ticket.setAssigneeId(assigneeId);
                activity.setTicketAssigneeId(assigneeId);
            } else {
                ticket.setAssigneeIdIsSet(false);
                activity.setTicketAssigneeIdIsSet(false);
            }

            crmServiceClient.updateTicket(ticket);
            activity.setTicketId(ticket.getId());
            crmServiceClient.insertActivity(activity);
        } catch (TException e) {
            log.error("Error while updating ticket", e);
            return EXCEPTION;
        }

        return index();
    }

    public String edit() {
        try {
            createServiceClients();
            long ticketId = Long.parseLong(id);
            ticket = crmServiceClient.getTicket(ticketId);
            activities = crmServiceClient.getActivitiesForTicket(Long
                    .parseLong(id));
        } catch (TException e) {
            log.error("Error while loading edit page", e);
            return EXCEPTION;
        }

        return EDIT;
    }

    public Map<Long, Ticket> getTickets() {
        return ticketsMap;
    }

    public User getUser() throws UserContextException, TException {
        return userContextServiceClient.getUserById(userId);
    }

    public Agent getAgent(long agentId) throws TException {
        return crmServiceClient.getAgent(agentId);
    }

    public TicketStatus[] getTicketStatuses() {
        return TicketStatus.values();
    }

    public TicketPriority[] getTicketPriorities() {
        return TicketPriority.values();
    }

    public String create() {
        try {
            createServiceClients();
            long creatorId = crmServiceClient.getAgentByEmailId(
                    currentAgentEmailId).getId();
            Ticket ticket = new Ticket();
            ticket.setDescription(description);
            ticket.setCustomerId(userId);
            ticket.setCreatorId(creatorId);

            if (orderId == null || orderId.isEmpty()) {
                ticket.setOrderIdIsSet(false);
            }
            else {
                ticket.setOrderId(Long.parseLong(orderId));
            }

            ticket.setStatus(TicketStatus.OPEN);
            ticket.setPriority(TicketPriority.valueOf(priority));
            ticket.setCategory(TicketCategory.valueOf(category));

            Activity activity = new Activity();
            // At creation of ticket activity's description is same as that of
            // ticket
            activity.setDescription(description);
            activity.setCustomerId(userId);
            activity.setType(ActivityType.OTHER);
            activity.setTicketPriority(TicketPriority.valueOf(priority));
            activity.setTicketStatus(TicketStatus.OPEN);
            activity.setCreatorId(creatorId);
            activity.setTicketCategory(TicketCategory.valueOf(category));
            activity.setTicketDescription(description);

            // handling null values appropriately
            if (assigneeEmailId != null && !assigneeEmailId.isEmpty()) {
                long assigneeId = crmServiceClient.getAgentByEmailId(
                        assigneeEmailId).getId();
                ticket.setAssigneeId(assigneeId);
                activity.setTicketAssigneeId(assigneeId);
            } else {
                ticket.setAssigneeIdIsSet(false);
                activity.setTicketAssigneeIdIsSet(false);
            }

            activity.setTicketId(crmServiceClient.insertTicket(ticket));
            crmServiceClient.insertActivity(activity);
        } catch (TException e) {
            log.error("Error while creating ticket", e);
            return EXCEPTION;
        }

        return index();
    }

    public String getLoggerRole() {
        try {
            createServiceClients();
            return crmServiceClient.getRoleNamesForAgent(currentAgentEmailId).get(0);
        } catch (TException e) {
            log.error("Error while getting roles", e);
            return AGENT;
        }
    }

    public TicketCategory[] getTicketCategories() {
        return TicketCategory.values();
    }

    public ActivityType[] getActivityTypes() {
        return ActivityType.values();
    }

    public List<Agent> getAllAgents() {
        List<Agent> agents = null;

        try {
            createServiceClients();
            agents = crmServiceClient.getAllAgents();            
        }
        catch (TException e) {
            String errorString = "Error while getting roles";
            log.error(errorString, e);
            addActionError(errorString);
        }

        return agents;
    }

    public Map<Long, Ticket> getTicketsMap() {
        return ticketsMap;
    }

    public void setUserId(String userId) {
        this.userId = Long.parseLong(userId);
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getActivityDescription() {
        return activityDescription;
    }

    public void setActivityDescription(String activityDescription) {
        this.activityDescription = activityDescription;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getAssigneeEmailId() {
        return assigneeEmailId;
    }

    public void setAssigneeEmailId(String assigneeEmailId) {
        this.assigneeEmailId = assigneeEmailId;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getPriority() {
        return priority;
    }

    public void setPriority(String priority) {
        this.priority = priority;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getActivityType() {
        return activityType;
    }

    public void setActivityType(String activityType) {
        this.activityType = activityType;
    }

    public Ticket getTicket() {
        return ticket;
    }

    public void setTicket(Ticket ticket) {
        this.ticket = ticket;
    }

    public List<Activity> getActivities() {
        return activities;
    }

    public void setActivities(List<Activity> activities) {
        this.activities = activities;
    }

    public String getOrderId() {
        return orderId;
    }

    public void setTicketsMap(Map<Long, Ticket> ticketsMap) {
        this.ticketsMap = ticketsMap;
    }
}