001
002package com.commercetools.api.models.common;
003
004import java.util.Arrays;
005import java.util.function.Function;
006
007import javax.annotation.Nullable;
008import javax.money.*;
009import javax.validation.constraints.NotNull;
010
011import com.fasterxml.jackson.annotation.*;
012import com.fasterxml.jackson.databind.annotation.*;
013
014import io.vrap.rmf.base.client.utils.Generated;
015
016/**
017 *  <p>Draft type that stores amounts in cent precision for the specified currency.</p>
018 *  <p>For storing money values in fractions of the minor unit in a currency, use HighPrecisionMoneyDraft instead.</p>
019 *
020 * <hr>
021 * Example to create an instance using the builder pattern
022 * <div class=code-example>
023 * <pre><code class='java'>
024 *     Money money = Money.builder()
025 *             .centAmount(0.3)
026 *             .currencyCode("{currencyCode}")
027 *             .build()
028 * </code></pre>
029 * </div>
030 */
031@Generated(value = "io.vrap.rmf.codegen.rendering.CoreCodeGenerator", comments = "https://github.com/commercetools/rmf-codegen")
032@JsonDeserialize(as = MoneyImpl.class)
033@JsonIgnoreProperties(value = { "factory", "context", "number", "currency", "negative", "negativeOrZero",
034        "positiveOrZero", "zero", "positive" })
035public interface Money extends com.commercetools.api.models.common.MonetaryAmountConvertable, MonetaryAmount {
036
037    /**
038     *  <p>Amount in the smallest indivisible unit of a currency, such as:</p>
039     *  <ul>
040     *   <li>Cents for EUR and USD, pence for GBP, or centime for CHF (5 CHF is specified as <code>500</code>).</li>
041     *   <li>The value in the major unit for currencies without minor units, like JPY (5 JPY is specified as <code>5</code>).</li>
042     *  </ul>
043     * @return centAmount
044     */
045    @NotNull
046    @JsonProperty("centAmount")
047    public Long getCentAmount();
048
049    /**
050     *  <p>Currency code compliant to ISO 4217.</p>
051     * @return currencyCode
052     */
053    @NotNull
054    @JsonProperty("currencyCode")
055    public String getCurrencyCode();
056
057    public void setCentAmount(final Long centAmount);
058
059    public void setCurrencyCode(final String currencyCode);
060
061    public static Money of() {
062        return new MoneyImpl();
063    }
064
065    public static Money of(final Money template) {
066        if (template instanceof CentPrecisionMoney) {
067            return CentPrecisionMoney.of((CentPrecisionMoney) template);
068        }
069        if (template instanceof CentPrecisionMoneyDraft) {
070            return CentPrecisionMoneyDraft.of((CentPrecisionMoneyDraft) template);
071        }
072        if (template instanceof HighPrecisionMoney) {
073            return HighPrecisionMoney.of((HighPrecisionMoney) template);
074        }
075        if (template instanceof HighPrecisionMoneyDraft) {
076            return HighPrecisionMoneyDraft.of((HighPrecisionMoneyDraft) template);
077        }
078        MoneyImpl instance = new MoneyImpl();
079        instance.setCentAmount(template.getCentAmount());
080        instance.setCurrencyCode(template.getCurrencyCode());
081        return instance;
082    }
083
084    public static CentPrecisionMoney of(final MonetaryAmount monetaryAmount) {
085        return MoneyUtil.of(monetaryAmount);
086    }
087
088    public static HighPrecisionMoney of(final MonetaryAmount monetaryAmount, int fractionDigits) {
089        return MoneyUtil.of(monetaryAmount, fractionDigits);
090    }
091
092    public static CentPrecisionMoneyDraft draftOf(final MonetaryAmount monetaryAmount) {
093        return MoneyUtil.draftOf(monetaryAmount);
094    }
095
096    public static HighPrecisionMoneyDraft draftOf(final MonetaryAmount monetaryAmount, int fractionDigits) {
097        return MoneyUtil.draftOf(monetaryAmount, fractionDigits);
098    }
099
100    @Nullable
101    public static Money deepCopy(@Nullable final Money template) {
102        if (template == null) {
103            return null;
104        }
105        MoneyImpl instance = new MoneyImpl();
106        instance.setCentAmount(template.getCentAmount());
107        instance.setCurrencyCode(template.getCurrencyCode());
108        return instance;
109    }
110
111    public static MoneyBuilder builder() {
112        return MoneyBuilder.of();
113    }
114
115    public static MoneyBuilder builder(final Money template) {
116        return MoneyBuilder.of(template);
117    }
118
119    default <T> T withMoney(Function<Money, T> helper) {
120        return helper.apply(this);
121    }
122
123    public default TypedMoneyDraft toDraft() {
124        if (this instanceof TypedMoneyDraft) {
125            return (TypedMoneyDraft) this;
126        }
127        return TypedMoneyDraft.centPrecisionBuilder()
128                .centAmount(this.getCentAmount())
129                .currencyCode(this.getCurrencyCode())
130                .build();
131    }
132
133    public static com.fasterxml.jackson.core.type.TypeReference<Money> typeReference() {
134        return new com.fasterxml.jackson.core.type.TypeReference<Money>() {
135            @Override
136            public String toString() {
137                return "TypeReference<Money>";
138            }
139        };
140    }
141
142    default MonetaryOperator createMoneyOperator() {
143        return MoneyUtil::of;
144    }
145
146    @Override
147    default MonetaryContext getContext() {
148        return toMonetaryAmount().getContext();
149    }
150
151    @Override
152    default MonetaryAmountFactory<? extends MonetaryAmount> getFactory() {
153        return toMonetaryAmount().getFactory();
154    }
155
156    @Override
157    default boolean isGreaterThan(MonetaryAmount amount) {
158        return toMonetaryAmount().isGreaterThan(amount);
159    }
160
161    @Override
162    default boolean isGreaterThanOrEqualTo(MonetaryAmount amount) {
163        return toMonetaryAmount().isGreaterThanOrEqualTo(amount);
164    }
165
166    @Override
167    default boolean isLessThan(MonetaryAmount amount) {
168        return toMonetaryAmount().isLessThan(amount);
169    }
170
171    @Override
172    default boolean isLessThanOrEqualTo(MonetaryAmount amount) {
173        return toMonetaryAmount().isLessThanOrEqualTo(amount);
174    }
175
176    @Override
177    default boolean isEqualTo(MonetaryAmount amount) {
178        return toMonetaryAmount().isEqualTo(amount);
179    }
180
181    @Override
182    default int signum() {
183        return toMonetaryAmount().signum();
184    }
185
186    @Override
187    default MonetaryAmount add(MonetaryAmount augend) {
188        return createMoneyOperator().apply(toMonetaryAmount().add(augend));
189    }
190
191    @Override
192    default MonetaryAmount subtract(MonetaryAmount subtrahend) {
193        return createMoneyOperator().apply(toMonetaryAmount().subtract(subtrahend));
194    }
195
196    @Override
197    default MonetaryAmount multiply(long multiplicand) {
198        return createMoneyOperator().apply(toMonetaryAmount().multiply(multiplicand));
199    }
200
201    @Override
202    default MonetaryAmount multiply(double multiplicand) {
203        return createMoneyOperator().apply(toMonetaryAmount().multiply(multiplicand));
204    }
205
206    @Override
207    default MonetaryAmount multiply(Number multiplicand) {
208        return createMoneyOperator().apply(toMonetaryAmount().multiply(multiplicand));
209    }
210
211    @Override
212    default MonetaryAmount divide(long divisor) {
213        return createMoneyOperator().apply(toMonetaryAmount().divide(divisor));
214    }
215
216    @Override
217    default MonetaryAmount divide(double divisor) {
218        return createMoneyOperator().apply(toMonetaryAmount().divide(divisor));
219    }
220
221    @Override
222    default MonetaryAmount divide(Number divisor) {
223        return createMoneyOperator().apply(toMonetaryAmount().divide(divisor));
224    }
225
226    @Override
227    default MonetaryAmount remainder(long divisor) {
228        return createMoneyOperator().apply(toMonetaryAmount().remainder(divisor));
229    }
230
231    @Override
232    default MonetaryAmount remainder(double divisor) {
233        return createMoneyOperator().apply(toMonetaryAmount().remainder(divisor));
234    }
235
236    @Override
237    default MonetaryAmount remainder(Number divisor) {
238        return createMoneyOperator().apply(toMonetaryAmount().remainder(divisor));
239    }
240
241    @Override
242    default MonetaryAmount[] divideAndRemainder(long divisor) {
243        MonetaryOperator op = createMoneyOperator();
244        return Arrays.stream(toMonetaryAmount().divideAndRemainder(divisor))
245                .map(op::apply)
246                .toArray(MonetaryAmount[]::new);
247    }
248
249    @Override
250    default MonetaryAmount[] divideAndRemainder(double divisor) {
251        MonetaryOperator op = createMoneyOperator();
252        return Arrays.stream(toMonetaryAmount().divideAndRemainder(divisor))
253                .map(op::apply)
254                .toArray(MonetaryAmount[]::new);
255    }
256
257    @Override
258    default MonetaryAmount[] divideAndRemainder(Number divisor) {
259        MonetaryOperator op = createMoneyOperator();
260        return Arrays.stream(toMonetaryAmount().divideAndRemainder(divisor))
261                .map(op::apply)
262                .toArray(MonetaryAmount[]::new);
263    }
264
265    @Override
266    default MonetaryAmount divideToIntegralValue(long divisor) {
267        return createMoneyOperator().apply(toMonetaryAmount().divideToIntegralValue(divisor));
268    }
269
270    @Override
271    default MonetaryAmount divideToIntegralValue(double divisor) {
272        return createMoneyOperator().apply(toMonetaryAmount().divideToIntegralValue(divisor));
273    }
274
275    @Override
276    default MonetaryAmount divideToIntegralValue(Number divisor) {
277        return createMoneyOperator().apply(toMonetaryAmount().divideToIntegralValue(divisor));
278    }
279
280    @Override
281    default MonetaryAmount scaleByPowerOfTen(int power) {
282        return createMoneyOperator().apply(toMonetaryAmount().scaleByPowerOfTen(power));
283    }
284
285    @Override
286    default MonetaryAmount abs() {
287        return createMoneyOperator().apply(toMonetaryAmount().abs());
288    }
289
290    @Override
291    default MonetaryAmount negate() {
292        return createMoneyOperator().apply(toMonetaryAmount().negate());
293    }
294
295    @Override
296    default MonetaryAmount plus() {
297        return createMoneyOperator().apply(toMonetaryAmount().plus());
298    }
299
300    @Override
301    default MonetaryAmount stripTrailingZeros() {
302        return createMoneyOperator().apply(toMonetaryAmount().stripTrailingZeros());
303    }
304
305    @Override
306    default int compareTo(MonetaryAmount o) {
307        return toMonetaryAmount().compareTo(o);
308    }
309
310    @Override
311    default CurrencyUnit getCurrency() {
312        return toMonetaryAmount().getCurrency();
313    }
314
315    @Override
316    default NumberValue getNumber() {
317        return toMonetaryAmount().getNumber();
318    }
319
320    @Override
321    default <R> R query(MonetaryQuery<R> query) {
322        return toMonetaryAmount().query(query);
323    }
324
325    @Override
326    default MonetaryAmount with(MonetaryOperator operator) {
327        return toMonetaryAmount().with(operator);
328    }
329}