DealStatus.java

package com.tradecloud.domain.model.deal;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Transient;
import java.io.Serializable;
import java.util.*;

@Embeddable
public class DealStatus implements Serializable, State {

    // QUOTED,
    // ACCEPTED,
    // INVOICED,
    // SETTLED,
    // AUDIT

    public static final DealStatus QUOTED = new DealStatus("QUOTED", 0, "dealInformationQuoted");
    public static final DealStatus ACCEPTED = new DealStatus("ACCEPTED", 1, "dealInformationAccepted");
    public static final DealStatus INVOICED = new DealStatus("INVOICED", 2, "dealInformationInvoiced");
    public static final DealStatus SETTLED = new DealStatus("SETTLED", 3, "dealInformationSettled");
    public static final DealStatus AUDIT = new DealStatus("AUDIT", 4, "");

    @Column(name = "status")
    private String statusName;
    @Transient
    private Integer displaySequence;
    @Transient
    private static final Map<String, DealStatus> lookup = new HashMap<String, DealStatus>();
    @Transient
    private static final String EMPTY_OPTION = "{optionValue:'', optionDisplay: ''}";

    public static final List<DealStatus> dealStatuses = new ArrayList<DealStatus>();
    @Transient
    private String messageKey;

    static {

        lookup.put("QUOTED", QUOTED);
        lookup.put("ACCEPTED", ACCEPTED);
        lookup.put("INVOICED", INVOICED);
        lookup.put("SETTLED", SETTLED);
        lookup.put("AUDIT", AUDIT);

        dealStatuses.add(QUOTED);
        dealStatuses.add(ACCEPTED);
        dealStatuses.add(INVOICED);
        dealStatuses.add(SETTLED);
        dealStatuses.add(AUDIT);
    }

    public DealStatus(String statusName, Integer displaySequence, String messageKey) {
        this.statusName = statusName;
        this.displaySequence = displaySequence;
        this.messageKey = messageKey;
    }

    @Deprecated
    public DealStatus() {
    }

    public String getStatusName() {
        return statusName;
    }

    public Integer getDisplaySequence() {
        return displaySequence;
    }

    public String toHTMLSelectOptionJSONString() {
        return "{optionValue:'" + statusName + "', optionDisplay: '" + statusName + "'}";
    }

    public static DealStatus get(String key) {
        return lookup.get(key);
    }

    public static String valuesAsHTMLSelectOptionsJSONString() {
        StringBuilder builder = new StringBuilder("[");
        // Arrays.sort(dealStatuses, new Comparator<DealStatus>() {
        // public int compare(DealStatus o1, DealStatus o2) {
        // return o2.getDisplaySequence().compareTo(o1.getDisplaySequence());
        // }
        // });
        if (dealStatuses.size() > 0) {
            for (DealStatus dealStatus : dealStatuses) {
                if (builder.length() > 1) {
                    builder.append(",");
                }
                builder.append(dealStatus.toHTMLSelectOptionJSONString());
            }
            builder.append(",").append(EMPTY_OPTION);
        }
        builder.append("]");
        return builder.toString();
    }

    public static boolean isInvalidStateForLinking(DealStatus status, boolean allowQuotedDealsToLinkToFecConfig) {
        return (status.equals(DealStatus.QUOTED) && !allowQuotedDealsToLinkToFecConfig) || status.equals(DealStatus.AUDIT);
    }

    public static String toXML(List<DealStatus> dealStatuses) {
        String builder = "<dealstatuses>";
        for (DealStatus dealStatus : dealStatuses) {
            builder += "<dealstatus>";
            builder += "<name>";
            builder += dealStatus.getStatusName();
            builder += "</name>";
            builder += "</dealstatus>";
        }
        builder += "</dealstatuses>";
        return builder;
    }

    public static String toXML() {
        return toXML(dealStatuses);
    }

    @Override
    public String toString() {
        return "DealStatus [statusName=" + statusName + "]";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((statusName == null) ? 0 : statusName.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        DealStatus other = (DealStatus) obj;
        if (statusName == null) {
            if (other.statusName != null)
                return false;
        } else if (!statusName.equals(other.statusName))
            return false;
        return true;
    }

    @Override
    public boolean isValidState() {
        return !this.equals(AUDIT);
    }

    @Override
    public String getMessageKey() {
        return messageKey;
    }

    public static Collection<String> allAsStrings() {
        return lookup.keySet();

    }
}