/* * Copyright (c) 2015 Ngewi Fet <ngewif@gmail.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.gnucash.android.model; import org.gnucash.android.app.GnuCashApplication; import org.gnucash.android.db.adapter.CommoditiesDbAdapter; /** * Commodities are the currencies used in the application. * At the moment only ISO4217 currencies are supported */ public class Commodity extends BaseModel { public enum Namespace { ISO4217 } //Namespace for commodities private Namespace mNamespace = Namespace.ISO4217; /** * Default commodity for device locale * <p>This value is set when a new application instance is created in {@link GnuCashApplication#onCreate()}. * The value initialized here is just a placeholder for unit tests</p> */ public static Commodity DEFAULT_COMMODITY = new Commodity("US Dollars", "USD", 100); //this value is a stub. Will be overwritten when the app is launched public static Commodity USD = new Commodity("", "USD", 100); public static Commodity EUR = new Commodity("", "EUR", 100); public static Commodity GBP = new Commodity("", "GBP", 100); public static Commodity CHF = new Commodity("", "CHF", 100); public static Commodity CAD = new Commodity("", "CAD", 100); public static Commodity JPY = new Commodity("", "JPY", 1); public static Commodity AUD = new Commodity("", "AUD", 100); /** * This is the currency code for ISO4217 currencies */ private String mMnemonic; private String mFullname; private String mCusip; private String mLocalSymbol = ""; private int mSmallestFraction; private int mQuoteFlag; /** * Create a new commodity * @param fullname Official full name of the currency * @param mnemonic Official abbreviated designation for the currency * @param smallestFraction Number of sub-units that the basic commodity can be divided into, as power of 10. e.g. 10^<number_of_fraction_digits> */ public Commodity(String fullname, String mnemonic, int smallestFraction){ this.mFullname = fullname; this.mMnemonic = mnemonic; setSmallestFraction(smallestFraction); } /** * Returns an instance of commodity for the specified currencyCode * @param currencyCode ISO 4217 currency code (3-letter) */ public static Commodity getInstance(String currencyCode){ switch (currencyCode){ //save time for database trip case "USD": return USD; case "EUR": return EUR; case "GBP": return GBP; case "CHF": return CHF; case "JPY": return JPY; case "AUD": return AUD; case "CAD": return CAD; default: return CommoditiesDbAdapter.getInstance().getCommodity(currencyCode); } } public Namespace getNamespace() { return mNamespace; } public void setNamespace(Namespace namespace) { this.mNamespace = namespace; } /** * Returns the mnemonic, or currency code for ISO4217 currencies * @return Mnemonic of the commodity */ public String getMnemonic() { return mMnemonic; } /** * Alias for {@link #getMnemonic()} * @return ISO 4217 code for this commodity */ public String getCurrencyCode(){ return getMnemonic(); } public void setMnemonic(String mMnemonic) { this.mMnemonic = mMnemonic; } public String getFullname() { return mFullname; } public void setFullname(String mFullname) { this.mFullname = mFullname; } public String getCusip() { return mCusip; } public void setCusip(String mCusip) { this.mCusip = mCusip; } public String getLocalSymbol() { return mLocalSymbol; } /** * Returns the symbol for this commodity. * <p>Normally this would be the local symbol, but in it's absence, the mnemonic (currency code) * is returned.</p> * @return */ public String getSymbol(){ if (mLocalSymbol == null || mLocalSymbol.isEmpty()){ return mMnemonic; } return mLocalSymbol; } public void setLocalSymbol(String localSymbol) { this.mLocalSymbol = localSymbol; } /** * Returns the smallest fraction supported by the commodity as a power of 10. * <p>i.e. for commodities with no fractions, 1 is returned, for commodities with 2 fractions, 100 is returned</p> * @return Smallest fraction as power of 10 */ public int getSmallestFraction() { return mSmallestFraction; } /** * Returns the (minimum) number of digits that this commodity supports in its fractional part * <p>For any unsupported values for the smallest fraction, a default value of 2 is returned. * Supported values for the smallest fraction are powers of 10 i.e. 1, 10, 100 etc</p> * @return Number of digits in fraction * @see #getSmallestFraction() */ public int getSmallestFractionDigits(){ if (mSmallestFraction == 0){ return 0; } else { return Integer.numberOfTrailingZeros(mSmallestFraction); } } /** * Sets the smallest fraction for the commodity. * <p>The fraction is a power of 10. So commodities with 2 fraction digits, have fraction of 10^2 = 100.<br> * If the parameter is any other value, a default fraction of 100 will be set</p> * @param smallestFraction Smallest fraction as power of ten * @throws IllegalArgumentException if the smallest fraction is not a power of 10 */ public void setSmallestFraction(int smallestFraction) { this.mSmallestFraction = smallestFraction; } public int getQuoteFlag() { return mQuoteFlag; } public void setQuoteFlag(int quoteFlag) { this.mQuoteFlag = quoteFlag; } @Override /** * Returns the full name of the currency, or the currency code if there is no full name * @return String representation of the commodity */ public String toString() { return mFullname == null || mFullname.isEmpty() ? mMnemonic : mFullname; } /** * Overrides {@link BaseModel#equals(Object)} to compare only the currency codes of the commodity. * <p>Two commodities are considered equal if they have the same currency code</p> * @param o Commodity instance to compare * @return {@code true} if both instances have same currency code, {@code false} otherwise */ @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Commodity commodity = (Commodity) o; return mMnemonic.equals(commodity.mMnemonic); } @Override public int hashCode() { return mMnemonic.hashCode(); } }