Subversion Repositories SmartDukaan

Rev

Rev 3390 | Rev 3499 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package in.shop2020.serving.controllers;

import in.shop2020.crm.Activity;
import in.shop2020.crm.Agent;
import in.shop2020.crm.SearchFilter;
import in.shop2020.crm.Ticket;
import in.shop2020.crm.TicketStatus;
import in.shop2020.model.v1.order.Order;
import in.shop2020.model.v1.order.OrderStatus;
import in.shop2020.model.v1.order.TransactionServiceException;
import in.shop2020.model.v1.user.Cart;
import in.shop2020.model.v1.user.Line;
import in.shop2020.model.v1.user.User;
import in.shop2020.model.v1.user.UserCommunication;
import in.shop2020.model.v1.user.UserCommunicationException;
import in.shop2020.model.v1.user.UserContextException;
import in.shop2020.model.v1.user.UserState;
import in.shop2020.serving.auth.CRMAuthorizingRealm;
import in.shop2020.thrift.clients.CRMClient;
import in.shop2020.thrift.clients.TransactionClient;
import in.shop2020.thrift.clients.UserClient;
import in.shop2020.util.CRMConstants;

import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.thrift.TException;

/**
 * @author vikas
 *
 */
@SuppressWarnings("serial")
public class HomeController extends BaseController {
    private static final Logger log = Logger.getLogger(HomeController.class);

    private String email;
    private String orderId;
    private String mobileNumber;
    private User user;
    private long orderCount;
    private long completedOrderCount;
    private long openOrderCount;
    private long failedOrderCount;
    private long userCommunicationCount;
    private long ticketCount;
    private long openTicketCount;
    private long closedTicketCount;
    private String ticketId;
    private String lastLogin;
    private double cartItems;
    private String couponCode = "";
    private long agentTicketCount;
    private long agentOpenTicketCount;
    private long unassignedTicketCount;
    private long allTicketCount;
    private long allOpenTicketCount;
    private long activityCount;
    private long customerActivityCount;

    @Action("/")
    public String index() throws Exception {
        String returnValue = INPUT;

        try {
            if (email == null) {
                loadTicketCounts();
                loadCustomerActivities();
                return returnValue;
            }

            userContextServiceClient = new UserClient().getClient();
            if (email != null && !email.isEmpty()) {
                user = userContextServiceClient.getUserByEmail(email);
            }
            else if (mobileNumber != null && !mobileNumber.isEmpty()) {
                user = userContextServiceClient.getUserByMobileNumber(Long.parseLong(mobileNumber));
            }
            else if (orderId != null && !orderId.isEmpty()) {
                transactionServiceClient = new TransactionClient().getClient();
                Order order = transactionServiceClient.getOrder(Long.parseLong(orderId));
                user = userContextServiceClient.getUserById(order.getCustomer_id());
            }
            else if (ticketId != null && !ticketId.isEmpty()) {
                SearchFilter searchFilter = new SearchFilter();
                searchFilter.setTicketId(Long.parseLong(ticketId));
                crmServiceClient         = new CRMClient().getClient();
                List<Ticket> tickets = crmServiceClient.getTickets(searchFilter);
                if (!tickets.isEmpty()) {
                    Ticket ticket = tickets.get(0);
                    if (ticket.isSetCustomerId()) {
                        user = userContextServiceClient.getUserById(ticket.getCustomerId());
                    }
                    else {
                        // TODO support unregistered users!
                    }
                }
            }

            if (user == null || user.getUserId() <= 0) {
                addActionError("Invalid Input");
            }
            else {
                loadUserCommunicationDetails();
                loadOrderDetails();
                loadCartDetails();
                loadTicketDetails();
                loadActivityDetails();
                returnValue = INDEX;
            }
        }
        catch (Exception e) {
            addActionError("Invalid input");
            log.error("Error occurred", e);
        }

        if (INPUT.equals(returnValue)) {
            loadTicketCounts();
        }

        return returnValue;
    }

    private void loadCustomerActivities() throws TException {
        SearchFilter searchFilter = new SearchFilter();
        searchFilter.setActivityCreatorIds(Collections.singletonList(CRMConstants.ADMIN_AGENT_ID));
        searchFilter.setIsActivityRead(false);

        crmServiceClient         = new CRMClient().getClient();
        List<Activity> activities = crmServiceClient.getActivities(searchFilter);
        if (activities != null) {
            customerActivityCount = activities.size();
        }
    }

    private void loadActivityDetails() throws TException {
        SearchFilter searchFilter = new SearchFilter();
        searchFilter.setCustomerId(user.getUserId());

        crmServiceClient         = new CRMClient().getClient();
        List<Activity> activities = crmServiceClient.getActivities(searchFilter);
        if (activities != null) {
            activityCount = activities.size();
        }
    }

    private void loadTicketCounts() throws TException {
        SearchFilter searchFilter = new SearchFilter();
        searchFilter.setTicketAssigneeIds(Collections.singletonList(CRMAuthorizingRealm.getAgent(currentAgentEmailId).getId()));

        crmServiceClient         = new CRMClient().getClient();
        List<Ticket> tickets = crmServiceClient.getTickets(searchFilter);
        agentTicketCount = tickets.size();
        for (Ticket ticket : tickets) {
            if (TicketStatus.OPEN.equals(ticket.getStatus())) {
                agentOpenTicketCount++;
            }
        }

        List<Ticket> unassignedTickets = crmServiceClient.getUnassignedTickets();
        unassignedTicketCount = unassignedTickets.size();
        
        List<Ticket> allTickets = tickets;
        allTicketCount = allTickets.size();
        for (Ticket ticket : allTickets) {
            if (TicketStatus.OPEN.equals(ticket.getStatus())) {
                allOpenTicketCount++;
            }
        }
    }

    private void loadUserCommunicationDetails()
            throws UserCommunicationException, TException {
        userContextServiceClient = new UserClient().getClient();
        List<UserCommunication> userCommunication = userContextServiceClient.getUserCommunicationByUser(user.getUserId());
        userCommunicationCount = userCommunication.size();
    }

    private void loadOrderDetails()
            throws TransactionServiceException, TException {
        transactionServiceClient = new TransactionClient().getClient();
        List<Order> allOrders = transactionServiceClient.getOrdersForCustomer(user.getUserId(), 0, (new Date()).getTime(), null);
        orderCount = allOrders.size();

        for (Order o : allOrders) {
            if (o.getStatus() == OrderStatus.DELIVERY_SUCCESS) {
                completedOrderCount++;
            }
            else if (CRMConstants.failedStatusList.contains(o.getStatus())) {
                failedOrderCount++;
            }
            else {
                openOrderCount++;
            }
        }
    }

    private void loadCartDetails()
            throws UserContextException, TException {
        userContextServiceClient = new UserClient().getClient();
        UserState userState = userContextServiceClient.getUserState(user.getUserId());
        lastLogin = SDF.format(new Date(userState.getLastLogin()));
        Cart cart = null;

        try {
            cart = userContextServiceClient.getCurrentCart(user.getUserId());
            if (cart.getCouponCode() != null) {
                couponCode = cart.getCouponCode();
            }
            for (Line line : cart.getLines()) {
                cartItems += line.getQuantity();
            }
        } catch (Exception e) {
            log.warn("No cart assigned for this user", e);
        }
    }

    private void loadTicketDetails() throws TException {
        // Fetching tickets' info
        ticketCount = 0;
        openTicketCount = 0;
        closedTicketCount = 0;

        crmServiceClient         = new CRMClient().getClient();
        SearchFilter searchFilter = new SearchFilter();
        searchFilter.setCustomerId(user.getUserId());

        List<Ticket> tickets = crmServiceClient.getTickets(searchFilter);
        if (tickets != null) 
        {
            for (Ticket ticket : tickets) {
                ticketCount++;
                if (!ticket.getStatus().equals(TicketStatus.CLOSED)) {
                    openTicketCount++;
                }
                else {
                    closedTicketCount++;
                }
            }
        }
    }

    public String getToday() {
        return SDF.format(new Date());
    }

    public String getYesterday() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        return SDF.format(calendar.getTime());
    }

    public List<Agent> getAllAgents() {
        return CRMAuthorizingRealm.getAgents();
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEmail() {
        return email;
    }

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

    public String getOrderId() {
        return orderId;
    }
    
    public User getUser() {
        return user;
    }
    
    public long getOrderCount() {
        return orderCount;
    }
    
    public long getCompletedOrderCount() {
        return completedOrderCount;
    }
    
    public long getOpenOrderCount() {
        return openOrderCount;
    }
    
    public long getFailedOrderCount() {
        return failedOrderCount;
    }
    
    public double getCartItems() {
        return cartItems;
    }
    
    public String getLastLogin() {
        return lastLogin;
    }

    public String getCouponCode() {
        return couponCode;
    }

    public long getUserCommunicationCount() {
        return userCommunicationCount;
    }

    public long getTicketCount() {
        return ticketCount;
    }

    public long getOpenTicketCount() {
        return openTicketCount;
    }

    public long getClosedTicketCount() {
        return closedTicketCount;
    }

    public void setMobileNumber(String mobileNumber) {
        this.mobileNumber = mobileNumber;
    }

    public String getTicketId() {
        return ticketId;
    }

    public void setTicketId(String ticketId) {
        this.ticketId = ticketId;
    }

    public long getAgentTicketCount() {
        return agentTicketCount;
    }

    public long getAgentOpenTicketCount() {
        return agentOpenTicketCount;
    }

    public long getUnassignedTicketCount() {
        return unassignedTicketCount;
    }

    public long getAllTicketCount() {
        return allTicketCount;
    }

    public long getAllOpenTicketCount() {
        return allOpenTicketCount;
    }

    public long getActivityCount() {
        return activityCount;
    }

    public void setActivityCount(long activityCount) {
        this.activityCount = activityCount;
    }

    public long getCustomerActivityCount() {
        return customerActivityCount;
    }

    public void setCustomerActivityCount(long customerActivityCount) {
        this.customerActivityCount = customerActivityCount;
    }
}