Money.java

package org.oxerr.viagogo.model;

import java.io.Serializable;
import java.math.BigDecimal;

import javax.annotation.Nullable;

import org.apache.commons.lang3.builder.CompareToBuilder;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

/**
 * Returned for monetary values, such as ticket prices, fees charged and tax amounts.
 *
 * <a href="https://developer.viagogo.net/api-reference/catalog#tag/BasicType_Money">Money</a>
 */
public class Money implements Comparable<Money>, Serializable {

	private static final long serialVersionUID = 2023021301L;

	/**
	 * The decimal amount of the money.
	 */
	@Nullable
	private BigDecimal amount;

	/**
	 * The ISO 4217 currency code that the monetary value is represented in.
	 */
	private String currencyCode;

	/**
	 * A user-friendly string representing the monetary value.
	 */
	private String display;

	public static Money of(String amount, String currencyCode) {
		return new Money(new BigDecimal(amount), currencyCode, null);
	}

	public Money() {
	}

	public Money(BigDecimal amount, String currencyCode, String display) {
		this.amount = amount;
		this.currencyCode = currencyCode;
		this.display = display;
	}

	public BigDecimal getAmount() {
		return amount;
	}

	public void setAmount(BigDecimal amount) {
		this.amount = amount;
	}

	public String getCurrencyCode() {
		return currencyCode;
	}

	public void setCurrencyCode(String currencyCode) {
		this.currencyCode = currencyCode;
	}

	public String getDisplay() {
		return display;
	}

	public void setDisplay(String display) {
		this.display = display;
	}

	@Override
	public int compareTo(Money o) {
		return new CompareToBuilder()
			.append(this.currencyCode, o.currencyCode)
			.append(this.amount, o.amount)
			.toComparison();
	}

	@Override
	public int hashCode() {
		return HashCodeBuilder.reflectionHashCode(this);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (!(obj instanceof Money)) {
			return false;
		}
		Money rhs = (Money) obj;
		return EqualsBuilder.reflectionEquals(this, rhs);
	}

	@Override
	public String toString() {
		return this.display;
	}

}