All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.revinate.ship.common.MonetaryValue Maven / Gradle / Ivy

The newest version!
package com.revinate.ship.common;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Objects;

@Getter
@Setter
@NoArgsConstructor
@Builder
@EqualsAndHashCode
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MonetaryValue {

    public static final MonetaryValue ZERO = new MonetaryValue(BigDecimal.ZERO);

    @JsonProperty(required = true)
    @NotNull
    private BigDecimal value;

    private String currency;

    @JsonIgnore
    public MonetaryValue(BigDecimal value, String currency) {
        this.value = value;
        this.currency = currency;
    }

    @JsonIgnore
    public MonetaryValue(String value, String currency) {
        this(new BigDecimal(value), currency);
    }

    @JsonIgnore
    public MonetaryValue(BigDecimal value) {
        this(value, null);
    }

    @JsonIgnore
    public MonetaryValue(String value) {
        this(new BigDecimal(value), null);
    }

    public MonetaryValue add(MonetaryValue augend) {
        String currency = this.currency;
        if (Objects.isNull(currency)) {
            currency = augend.currency;
        } else if (Objects.nonNull(augend.currency) && !currency.equals(augend.currency)) {
            throw new UnsupportedOperationException(
                    "Adding monetary values with different currencies is unsupported.");
        }

        return new MonetaryValue(this.value.add(augend.value), currency);
    }

    public MonetaryValue multiply(BigDecimal multiplicand) {
        return new MonetaryValue(this.value.multiply(multiplicand), this.currency);
    }

    public MonetaryValue multiply(String multiplicand) {
        return multiply(new BigDecimal(multiplicand));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy