/****************************************************************************** * Product: Adempiere ERP & CRM Smart Business Solution * * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * * by the Free Software Foundation. This program is distributed in the hope * * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * * For the text or an alternative of this public license, you may reach us * * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * * or via info@compiere.org or http://www.compiere.org/license.html * *****************************************************************************/ package org.compiere.model; import java.math.BigDecimal; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Timestamp; import java.util.Date; import java.util.Properties; import org.compiere.util.CCache; import org.compiere.util.DB; import org.compiere.util.Env; /** * Currency Model. * * @author Jorg Janke */ public class MCurrency extends X_C_Currency { /** * */ private static final long serialVersionUID = 5549233389514285323L; /** * Currency Constructor * @param ctx context * @param C_Currency_ID id * @param trxName transaction */ public MCurrency (Properties ctx, int C_Currency_ID, String trxName) { super (ctx, C_Currency_ID, trxName); if (C_Currency_ID == 0) { setIsEMUMember (false); setIsEuro (false); setStdPrecision (2); setCostingPrecision (4); } } // MCurrency /** * Resultset constructor * * @param ctx * @param rs * @param trxName */ public MCurrency(Properties ctx, ResultSet rs, String trxName) { super(ctx, rs, trxName); } /** * Currency Constructor * @param ctx context * @param ISO_Code ISO * @param Description Name * @param CurSymbol symbol * @param StdPrecision prec * @param CostingPrecision prec * @param trxName transaction */ public MCurrency (Properties ctx, String ISO_Code, String Description, String CurSymbol, int StdPrecision, int CostingPrecision, String trxName) { super(ctx, 0, trxName); setISO_Code(ISO_Code); setDescription(Description); setCurSymbol(CurSymbol); setStdPrecision (StdPrecision); setCostingPrecision (CostingPrecision); setIsEMUMember (false); setIsEuro (false); } // MCurrency /** Store System Currencies **/ private static CCache<Integer,MCurrency> s_currencies = new CCache<Integer,MCurrency>("C_Currency", 50); /** Cache System Currencies by using ISO code as key **/ private static CCache<String,MCurrency> s_currenciesISO = new CCache<String,MCurrency>("C_CurrencyISO", 50); /** * Get Currency using ISO code * @param ctx Context * @param ISOcode Iso code * @return MCurrency */ public static MCurrency get (Properties ctx, String ISOcode) { // Try Cache MCurrency retValue = (MCurrency)s_currenciesISO.get(ISOcode); if (retValue != null) return retValue; // Try database Query query = new Query(ctx, I_C_Currency.Table_Name, "ISO_Code=?", null); query.setParameters(ISOcode); retValue = (MCurrency)query.firstOnly(); // Save if (retValue!=null) s_currenciesISO.put(ISOcode, retValue); return retValue; } /** * Get Currency * @param ctx Context * @param C_Currency_ID currency * @return ISO Code */ public static MCurrency get (Properties ctx, int C_Currency_ID) { // Try Cache Integer key = new Integer(C_Currency_ID); MCurrency retValue = (MCurrency)s_currencies.get(key); if (retValue != null) return retValue; // Create it retValue = new MCurrency(ctx, C_Currency_ID, null); // Save in System if (retValue.getAD_Client_ID() == 0) s_currencies.put(key, retValue); return retValue; } // get /** * Get Currency Iso Code. * @param ctx Context * @param C_Currency_ID currency * @return ISO Code */ public static String getISO_Code (Properties ctx, int C_Currency_ID) { String contextKey = "C_Currency_" + C_Currency_ID; String retValue = ctx.getProperty(contextKey); if (retValue != null) return retValue; // Create it MCurrency c = get(ctx, C_Currency_ID); retValue = c.getISO_Code(); ctx.setProperty(contextKey, retValue); return retValue; } // getISO /** * Get Standard Precision. * @param ctx Context * @param C_Currency_ID currency * @return Standard Precision */ public static int getStdPrecision (Properties ctx, int C_Currency_ID) { MCurrency c = get(ctx, C_Currency_ID); return c.getStdPrecision(); } // getStdPrecision /** * String Representation * @return info */ public String toString() { return "MCurrency[" + getC_Currency_ID() + "-" + getISO_Code() + "-" + getCurSymbol() + "," + getDescription() + ",Precision=" + getStdPrecision() + "/" + getCostingPrecision(); } // toString // @fchiappano Codigo copiado desde Libertya. public static BigDecimal currencyConvert(BigDecimal amount, int currencyFrom, int currencyTo, Date date, int adOrg, Properties ctx) { BigDecimal result = null; try { StringBuffer sql = new StringBuffer("SELECT currencyconvert (?, ?, ?, ? ::timestamp, null, ?, "); if (adOrg > 0) sql.append("? )"); else sql.append("null )"); PreparedStatement pstmt = DB.prepareStatement(sql.toString()); pstmt.setBigDecimal(1, amount); pstmt.setInt(2, currencyFrom); pstmt.setInt(3, currencyTo); // pstmt.setDate(4, new java.sql.Date(date.getTime()) ); // currencyconvert requiere un timestamp como parametro. En ciertos // casos // estaba funcionando mal con el Date. pstmt.setTimestamp(4, new Timestamp(date.getTime())); pstmt.setInt(5, Env.getAD_Client_ID(ctx)); if (adOrg > 0) pstmt.setInt(6, adOrg); ResultSet rs = pstmt.executeQuery(); if (rs.next()) result = rs.getBigDecimal(1); } catch (Exception e) { e.printStackTrace(); } return result; } /*************************************************************************/ /** * Load/link Currencies * @param args args * public static void main (String[] args) { System.out.println("Currency"); Adempiere.startupClient(); // Loop through for (int i = 0; i < s_table.length; i++) { /** System.out.println(s_table[i][I_Currency] + " - " + s_table[i][I_Name]); int prec = Integer.parseInt(s_table[i][I_Precision]); MCurrency cur = new MCurrency(Env.getCtx(), s_table[i][I_Currency], s_table[i][I_Name], s_table[i][I_Symbol], prec, prec+2); cur.saveEx(); System.out.println(cur); ** String ISO = s_table[i][I_Currency]; String Country = s_table[i][I_Country]; String sql = "UPDATE C_Country SET C_Currency_ID=" + "(SELECT C_Currency_ID FROM C_Currency WHERE ISO_Code='" + ISO + "') " + "WHERE CountryCode='" + Country + "'"; int no = DB.executeUpdate(sql); System.out.println(ISO + " - " + Country + " - " + no); System.out.println(""); } } // main static int I_Country = 0; static int I_Currency = 1; static int I_Precision = 2; static int I_Symbol = 3; static int I_DecimalPoint = 4; static int I_FormatIndex = 5; static int I_Name = 6; static String[][] s_table = new String[][] { new String[]{"US","USD","2","$",".","0", "US Dollar"}, new String[]{"AR","ARS","2","$",",","0", "Argentine Peso"}, new String[]{"AS","USD","2","$",".","0","US Dollar"}, new String[]{"CC","AUD","2","$",".","0","Australian Dollar"}, new String[]{"CK","NZD","2","$",".","0","New Zealand Dollar"}, new String[]{"CX","AUD","2","$",".","0","Australian Dollar"}, new String[]{"EC","USD","2","$",".","0","US Dollar"}, new String[]{"FM","USD","2","$",".","0","US Dollar"}, new String[]{"GU","USD","2","$",".","0","US Dollar"}, new String[]{"KI","AUD","2","$",".","0","Australian Dollar"}, new String[]{"LR","LRD","2","$",".","0","Liberian Dollar"}, new String[]{"MH","USD","2","$",".","0","US Dollar"}, new String[]{"MP","USD","2","$",".","0","US Dollar"}, new String[]{"MX","MXN","2","$",".","0","Mexican Peso"}, new String[]{"NF","AUD","2","$",".","0","Australian Dollar"}, new String[]{"NR","AUD","2","$",".","0","Australian Dollar"}, new String[]{"NU","NZD","2","$",".","0","New Zealand Dollar"}, new String[]{"NZ","NZD","2","$",".","0","New Zealand Dollar"}, new String[]{"PR","USD","2","$",".","0","US Dollar"}, new String[]{"PW","USD","2","$",".","0","US Dollar"}, new String[]{"TC","USD","2","$",".","0","US Dollar"}, new String[]{"TK","NZD","2","$",".","0","New Zealand Dollar"}, new String[]{"TV","AUD","2","$",".","0","Australian Dollar"}, new String[]{"VG","USD","2","$",".","0","US Dollar"}, new String[]{"VI","USD","2","$",".","0","US Dollar"}, new String[]{"UY","UYU","2","$U",",","2","Peso Uruguayo"}, new String[]{"AM","AMD","2","",".","0","Armenian Dram"}, new String[]{"AO","AOA","2","",".","0","Kwanza"}, new String[]{"AZ","AZM","2","",".","0","Azerbaijanian Manat"}, new String[]{"BO","BOB","2","",".","0","Boliviano"}, new String[]{"CD","CDF","2","",".","0","Franc Congolais"}, new String[]{"CZ","CZK","2","",",","3","Czech Koruna"}, new String[]{"GE","GEL","2","",".","0","Lari"}, new String[]{"IR","IRR","2","",".","2","Iranian Rial"}, new String[]{"LT","LTL","2","",",","3","Lithuanian Litus"}, new String[]{"MD","MDL","2","",".","0","Moldovan Leu"}, new String[]{"PH","PHP","2","",".","0","Philippine Peso"}, new String[]{"PL","PLN","2","",",","3","Zloty"}, new String[]{"RU","RUR","2","",",","1","Russian Ruble"}, new String[]{"SD","SDD","2","",".","0","Sudanese Dinar"}, new String[]{"TJ","TJS","2","",".","0","Somoni"}, new String[]{"TM","TMM","2","",".","0","Manat"}, new String[]{"TP","TPE","0","",".","0","Timor Escudo"}, new String[]{"UA","UAH","2","",",","3","Hryvnia"}, new String[]{"UZ","UZS","2","",".","0","Uzbekistan Sum"}, new String[]{"GB","GBP","2","�",".","0","Pound Sterling"}, new String[]{"CY","CYP","2","�C",".","0","Cyprus Pound"}, new String[]{"EG","EGP","2","�E",".","2","Egyptian Pound"}, new String[]{"FK","FKP","2","�F",".","0","Falkland Islands Pound"}, new String[]{"GI","GIP","2","�G",".","0","Gibraltar Pound"}, new String[]{"SH","SHP","2","�S",".","0","Saint Helena Pound"}, new String[]{"SY","SYP","2","�S",".","2","Syrian Pound"}, new String[]{"JP","JPY","0","�",".","0","Yen"}, new String[]{"GH","GHC","2","�",".","0","Cedi"}, new String[]{"SV","SVC","2","�",".","0","El Salvador Colon"}, new String[]{"AD","EUR","2","�",".","0","euro"}, new String[]{"AT","EUR","2","�",",","2","euro"}, new String[]{"BE","EUR","2","�",",","3","euro"}, new String[]{"DE","EUR","2","�",",","3","euro"}, new String[]{"ES","EUR","2","�",",","3","euro"}, new String[]{"FI","EUR","2","�",",","3","euro"}, new String[]{"FR","EUR","2","�",",","3","euro"}, new String[]{"GF","EUR","2","�",".","0","euro"}, new String[]{"GP","EUR","2","�",".","0","euro"}, new String[]{"GR","EUR","2","�",",","3","euro"}, new String[]{"IE","EUR","2","�",".","0","euro"}, new String[]{"IT","EUR","2","�",",","2","euro"}, new String[]{"LU","EUR","2","�",",","3","euro"}, new String[]{"MC","EUR","2","�",".","0","euro"}, new String[]{"MQ","EUR","2","�",".","0","euro"}, new String[]{"NL","EUR","2","�",",","2","euro"}, new String[]{"PM","EUR","2","�",".","0","euro"}, new String[]{"PT","EUR","2","�","$","3","euro"}, new String[]{"RE","EUR","2","�",".","0","euro"}, new String[]{"SM","EUR","2","�",".","0","euro"}, new String[]{"VA","EUR","2","�",".","0","euro"}, new String[]{"YT","EUR","2","�",".","0","euro"}, new String[]{"AU","AUD","2","A$",".","0","Australian Dollar"}, new String[]{"AF","AFA","2","Af",".","0","Afghani"}, new String[]{"AW","AWG","2","Af.",".","0","Aruban Guilder"}, new String[]{"PA","PAB","2","B",".","0","Balboa"}, new String[]{"BN","BND","2","B$",".","0","Brunei Dollar"}, new String[]{"BS","BSD","2","B$",".","0","Bahamian Dollar"}, new String[]{"BH","BHD","3","BD",".","2","Bahraini Dinar"}, new String[]{"BM","BMD","2","Bd$",".","0","Bermudian Dollar"}, new String[]{"BB","BBD","2","Bds$",".","0","Barbados Dollar"}, new String[]{"BY","BYR","0","BR",",","3","Belarussian Ruble"}, new String[]{"ET","ETB","2","Br",".","0","Ethiopian Birr"}, new String[]{"VE","VEB","2","Bs",",","0","Bolivar"}, new String[]{"TH","THB","2","Bt",".","0","Baht"}, new String[]{"BZ","BZD","2","BZ$",".","0","Belize Dollar"}, new String[]{"CA","CAD","2","C$",".","0","Canadian Dollar"}, new String[]{"NI","NIO","2","C$",".","0","Cordoba Oro"}, new String[]{"CV","CVE","2","C.V.Esc.",".","0","Cape Verde Escudo"}, new String[]{"KM","KMF","0","CF",".","0","Comoro Franc"}, new String[]{"BF","XOF","0","CFAF",".","0","CFA Franc BCEAO"}, new String[]{"BJ","XOF","0","CFAF",".","0","CFA Franc BCEAO"}, new String[]{"CF","XAF","0","CFAF",".","0","CFA Franc BEAC"}, new String[]{"CG","XAF","0","CFAF",".","0","CFA Franc BEAC"}, new String[]{"CI","XOF","0","CFAF",".","0","CFA Franc BCEA"}, new String[]{"CM","XAF","0","CFAF",".","0","CFA Franc BEAC"}, new String[]{"GA","XAF","0","CFAF",".","0","CFA Franc BEAC"}, new String[]{"GQ","XAF","0","CFAF",".","0","CFA Franc BEAC"}, new String[]{"ML","XOF","0","CFAF",".","0","CFA Franc BCEAO"}, new String[]{"NE","XOF","0","CFAF",".","0","CFA Franc BCEAO"}, new String[]{"SN","XOF","0","CFAF",".","0","CFA Franc BCEAO"}, new String[]{"TD","XAF","0","CFAF",".","0","CFA Franc BEAC"}, new String[]{"TG","XOF","0","CFAF",".","0","CFA Franc BCEAO"}, new String[]{"NC","XPF","0","CFPF",".","0","CFP Franc"}, new String[]{"PF","XPF","0","CFPF",".","0","CFP Franc"}, new String[]{"WF","XPF","0","CFPF",".","0","CFP Franc"}, new String[]{"CL","CLP","0","Ch$",",","0","Chilean Peso"}, new String[]{"KY","KYD","2","CI$",".","0","Cayman Islands Dollar"}, new String[]{"CO","COP","2","Col$",".","0","Colombian Peso"}, new String[]{"KH","KHR","2","CR",".","0","Riel"}, new String[]{"CU","CUP","2","Cu$",".","0","Cuban Peso"}, new String[]{"GM","GMD","2","D",".","0","Dalasi"}, new String[]{"VN","VND","2","D",",","3","Dong"}, new String[]{"DZ","DZD","2","DA",".","2","Algerian Dinar"}, new String[]{"ST","STD","2","Db",".","0","Dobra"}, new String[]{"DJ","DJF","0","DF",".","0","Djibouti Franc"}, new String[]{"AE","AED","2","Dh",".","2","UAE Dirham"}, new String[]{"MA","MAD","2","DH",".","2","Moroccan Dirham"}, new String[]{"YU","YUM","2","Din",".","0","Yugoslavian Dinar"}, new String[]{"DK","DKK","2","Dkr",",","2","Danish Krone"}, new String[]{"FO","DKK","2","Dkr",",","2","Danish Krone"}, new String[]{"GL","DKK","2","Dkr",".","0","Danish Krone"}, new String[]{"AG","XCD","2","EC$",".","0","East Caribbean Dollar"}, new String[]{"AI","XCD","2","EC$",".","0","East Caribbean Dollar"}, new String[]{"DM","XCD","2","EC$",".","0","East Caribbean Dollar"}, new String[]{"GD","XCD","2","EC$",".","0","East Caribbean Dollar"}, new String[]{"KN","XCD","2","EC$",".","0","East Caribbean Dollar"}, new String[]{"LC","XCD","2","EC$",".","0","East Caribbean Dollar"}, new String[]{"MS","XCD","2","EC$",".","0","East Caribbean Dollar"}, new String[]{"VC","XCD","2","EC$",".","0","East Caribbean Dollar"}, new String[]{"FJ","FJD","2","F$",".","0","Fiji Dollar"}, new String[]{"BI","BIF","0","FBu",".","0","Burundi Franc"}, new String[]{"MG","MGF","0","FMG",".","0","Malagasy Franc"}, new String[]{"HU","HUF","2","Ft",",","3","Forint"}, new String[]{"HT","HTG","2","G",".","0","Gourde"}, new String[]{"GY","GYD","2","G$",".","0","Guyana Dollar"}, new String[]{"HK","HKD","2","HK$",".","0","Hong Kong Dollar"}, new String[]{"HR","HRK","2","HRK",",","2","Croatian Kuna"}, new String[]{"IQ","IQD","3","ID",".","2","Iraqi Dinar"}, new String[]{"IS","ISK","2","IKr",",","3","Iceland Krona"}, new String[]{"JM","JMD","2","J$",".","0","Jamaican Dollar"}, new String[]{"JO","JOD","3","JD",".","2","Jordanian Dinar"}, new String[]{"MM","MMK","2","K",".","0","Kyat"}, new String[]{"PG","PGK","2","K",".","0","Kina"}, new String[]{"KE","KES","2","K Sh",".","0","Kenyan Shilling"}, new String[]{"KW","KWD","3","KD",".","2","Kuwaiti Dinar"}, new String[]{"BA","BAM","2","KM",".","0","Convertible Marks"}, new String[]{"LA","LAK","2","KN",".","0","Kip"}, new String[]{"ER","ERN","2","KR",".","0","Nakfa"}, new String[]{"AL","ALL","2","L",",","1","Lek"}, new String[]{"HN","HNL","2","L",".","0","Lempira"}, new String[]{"RO","ROL","2","L",",","3","Leu"}, new String[]{"SZ","SZL","2","L",".","0","Lilangeni"}, new String[]{"LY","LYD","3","LD",".","2","Libyan Dinar"}, new String[]{"SL","SLL","2","Le",".","0","Leone"}, new String[]{"MT","MTL","2","Lm",".","0","Maltese Lira"}, new String[]{"LV","LVL","2","Ls",",","3","Latvian Lats"}, new String[]{"BG","BGL","2","Lv",",","3","Lev"}, new String[]{"MU","MUR","2","Mau Rs",".","0","Mauritius Rupee"}, new String[]{"MW","MWK","2","MK",".","0","Kwacha"}, new String[]{"MK","MKD","2","MKD",".","0","Denar"}, new String[]{"MZ","MZM","2","Mt",".","0","Metical"}, new String[]{"AN","ANG","2","NAf.",".","0","Netherlands Antillian Guilder"}, new String[]{"EE","EEK","2","Nfa",",","3","Kroon"}, new String[]{"IL","ILS","2","NIS",".","2","New Israeli Sheqel"}, new String[]{"NO","NOK","2","NKr",",","2","Norwegian Krone"}, new String[]{"NP","NPR","2","NRs",".","0","Nepalese Rupee"}, new String[]{"TW","TWD","2","NT$",".","0","New Taiwan Dollar"}, new String[]{"BW","BWP","2","P",".","0","Pula"}, new String[]{"MO","MOP","2","P",".","0","Pataca"}, new String[]{"GT","GTQ","2","Q",".","0","Quetzal"}, new String[]{"QA","QAR","2","QR",".","2","Qatari Rial"}, new String[]{"LS","ZAR","2","R",".","0","Rand"}, new String[]{"NA","ZAR","2","R",".","0","Rand"}, new String[]{"ZA","ZAR","2","R",".","2","Rand"}, new String[]{"BR","BRL","2","R$",",","0","Brazilian Real"}, new String[]{"DO","DOP","2","RD$",".","0","Dominican Peso"}, new String[]{"MV","MVR","2","Rf",".","0","Rufiyaa"}, new String[]{"RW","RWF","0","RF",".","0","Rwanda Franc"}, new String[]{"MY","MYR","2","RM",".","0","Malaysian Ringgit"}, new String[]{"OM","OMR","3","RO",".","2","Rial Omani"}, new String[]{"ID","IDR","2","Rp",",","0","Rupiah"}, new String[]{"BT","INR","2","Rs",".","0","Indian Rupee"}, new String[]{"IN","INR","2","Rs",".","0","Indian Rupee"}, new String[]{"PK","PKR","2","Rs",".","0","Pakistan Rupee"}, new String[]{"SG","SGD","2","S$",".","0","Singapore Dollar"}, new String[]{"PE","PEN","2","S/.",",","0","Nuevo Sol"}, new String[]{"SR","SRG","2","Sf.",".","0","Suriname Guilder"}, new String[]{"SB","SBD","2","SI$",".","0","Solomon Islands Dollar"}, new String[]{"SE","SEK","2","Sk",",","3","Swedish Krona"}, new String[]{"SK","SKK","2","Sk",",","3","Slovak Koruna"}, new String[]{"LK","LKR","2","SLRs",".","0","Sri Lanka Rupee"}, new String[]{"SI","SIT","2","SlT",",","3","Tolar"}, new String[]{"SO","SOS","2","So. Sh.",".","0","Somali Shilling"}, new String[]{"SC","SCR","2","SR",".","0","Seychelles Rupee"}, new String[]{"SA","SAR","2","SRls",".","2","Saudi Riyal"}, new String[]{"CH","CHF","2","SwF",".","2","Swiss Franc"}, new String[]{"LI","CHF","2","SwF",".","2","Swiss Franc"}, new String[]{"TO","TOP","2","T$",".","0","Pa�anga"}, new String[]{"TN","TND","3","TD",".","2","Tunisian Dinar"}, new String[]{"BD","BDT","2","Tk",".","0","Taka"}, new String[]{"TR","TRL","0","TL",",","3","Turkish Lira"}, new String[]{"TZ","TZS","2","TSh",".","0","Tanzanian Shilling"}, new String[]{"TT","TTD","2","TT$",".","0","Trinidad and Tobago Dollar"}, new String[]{"MN","MNT","2","Tug",".","0","Tugrik"}, new String[]{"MR","MRO","2","UM",".","0","Ouguiya"}, new String[]{"UG","UGX","2","USh",".","0","Uganda Shilling"}, new String[]{"VU","VUV","0","VT",".","0","Vatu"}, new String[]{"KR","KRW","0","W",".","0","Won"}, new String[]{"WS","WST","2","WS$",".","0","Tala"}, new String[]{"CN","CNY","2","Y",".","0","Yuan Renminbi"}, new String[]{"YE","YER","2","YRls",".","2","Yemeni Rial"}, new String[]{"ZW","ZWD","2","Z$",".","0","Zimbabwe Dollar"}, new String[]{"ZM","ZMK","2","ZK",".","0","Kwacha"}, new String[]{"CR","CRC","2","",".","0","Costa Rican Colon"}, new String[]{"GN","GNF","0","",".","0","Guinea Franc"}, new String[]{"GW","GWP","2","",".","0","Guinea-Bissau Peso"}, new String[]{"KG","KGS","2","",".","0","Som"}, new String[]{"KP","KPW","2","",".","0","North Korean Won"}, new String[]{"KZ","KZT","2","",".","0","Tenge"}, new String[]{"LB","LBP","2","",".","2","Lebanese Pound"}, new String[]{"NG","NGN","2","",".","0","Naira"}, new String[]{"PY","PYG","0","",",","0","Guarani"} }; **/ } // MCurrency