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}