Skip to content
Open

Forex #1237

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion app/components/debit_customer_modal.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ Balanced.DebitCustomerModalComponent = Balanced.ModalComponent.extend({

dollar_amount: null,

selected_currency: "USD",

currency_list: function() {
return Balanced.CURRENCY_LIST.map(function(currency) {
return _.extend({
formatted_name: "%@ (%@)".fmt(currency.name, currency.code)
}, currency);
});
}.property(),

actions: {
open: function() {
var fundingInstruments = this.get('customer.debitable_funding_instruments');
Expand All @@ -13,6 +23,7 @@ Balanced.DebitCustomerModalComponent = Balanced.ModalComponent.extend({
var debit = Balanced.Debit.create({
uri: debitUri,
amount: null,
selected_currency: null,
order: this.get('order.href')
});

Expand Down Expand Up @@ -40,7 +51,10 @@ Balanced.DebitCustomerModalComponent = Balanced.ModalComponent.extend({
});
return;
}
debit.set('amount', cents);
debit.setProperties({
amount: cents,
currency: this.get('selected_currency')
});
this._super(debit);
}
},
Expand Down
2 changes: 2 additions & 0 deletions app/lib/handlebars_helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ require('app/lib/utils');

Ember.Handlebars.registerBoundHelper('formatCurrency', Balanced.Utils.formatCurrency);

Ember.Handlebars.registerBoundHelper('formatCapturedCurrency', Balanced.Utils.formatCapturedCurrency);

Ember.Handlebars.registerBoundHelper('formatNumber', Balanced.Utils.formatNumber);

Ember.Handlebars.registerBoundHelper('formatError', Balanced.Utils.formatError);
Expand Down
16 changes: 16 additions & 0 deletions app/lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,22 @@ Balanced.Utils = Ember.Namespace.create({
return prepend + Balanced.Utils.centsToDollars(cents);
},

formatCapturedCurrency: function(amount, unit) {
if (!amount) {
return unit + ' 0';
}

var prepend = unit + ' ';

if (amount < 0) {
amount = amount * -1;
prepend = '-' + prepend;
}
amount = Balanced.Utils.formatNumber(amount);

return prepend + amount;
},

formatNumber: function(number) {
if (!number) {
return 0;
Expand Down
164 changes: 163 additions & 1 deletion app/lib/variables.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ Balanced.SEARCH = {
// time in ms to throttle between key presses for search
Balanced.THROTTLE = {
SEARCH: 400,
REFRESH: 1000
REFRESH: 1000,
CURRENCY_CONVERSION: 400
};

Balanced.PASSWORD = {
Expand All @@ -60,3 +61,164 @@ Balanced.DATES = {
RESULTS_MAX_TIME: moment().add('hours', 2).startOf('hour').toDate(),
RESULTS_MIN_TIME: moment().subtract('months', 1).startOf('hour').toDate()
};

Balanced.CURRENCY_LIST = [
{ code: "AED", name: "UAE Dirham", decimal_place: 2 },
{ code: "AFN", name: "Afghan Afghani", decimal_place: 2 },
{ code: "ALL", name: "Albanian Lek", decimal_place: 2 },
{ code: "AMD", name: "Armenian Dram", decimal_place: 2 },
{ code: "ANG", name: "Netherlands Antillian Guilder", decimal_place: 2 },
{ code: "AOA", name: "Angolan Kwanza", decimal_place: 2 },
{ code: "ARS", name: "Argentine Peso", decimal_place: 2 },
{ code: "AUD", name: "Australian Dollar", decimal_place: 2 },
{ code: "AWG", name: "Aruban Guilder", decimal_place: 2 },
{ code: "AZN", name: "Azerbaijanian Manat", decimal_place: 2 },
{ code: "BAM", name: "Convertible Marks", decimal_place: 2 },
{ code: "BBD", name: "Barbados Dollar", decimal_place: 2 },
{ code: "BDT", name: "Bangladeshi Taka", decimal_place: 2 },
{ code: "BGN", name: "Bulgarian Lev", decimal_place: 2 },
{ code: "BHD", name: "Bahraini Dinar", decimal_place: 3 },
{ code: "BIF", name: "Burundi Franc", decimal_place: 0 },
{ code: "BMD", name: "Bermudian Dollar", decimal_place: 2 },
{ code: "BND", name: "Brunei Dollar", decimal_place: 2 },
{ code: "BOB", name: "Boliviano", decimal_place: 2 },
{ code: "BRL", name: "Brazilian Real", decimal_place: 2 },
{ code: "BSD", name: "Bahamian Dollar", decimal_place: 2 },
{ code: "BWP", name: "Botswana Pula", decimal_place: 2 },
{ code: "BYR", name: "Belarussian Ruble", decimal_place: 0 },
{ code: "BZD", name: "Belize Dollar", decimal_place: 2 },
{ code: "CAD", name: "Canadian Dollar", decimal_place: 2 },
{ code: "CDF", name: "Franc Congolais", decimal_place: 2 },
{ code: "CHF", name: "Swiss Franc", decimal_place: 2 },
{ code: "CLP", name: "Chilean Peso", decimal_place: 2 },
{ code: "CNY", name: "Yuan Renminbi", decimal_place: 2 },
{ code: "COP", name: "Colombian Peso", decimal_place: 2 },
{ code: "CRC", name: "Costa Rican Colon", decimal_place: 2 },
{ code: "CUC", name: "Cuban Convertable Peso", decimal_place: 2 },
{ code: "CVE", name: "Cape Verde Escudo", decimal_place: 2 },
{ code: "CZK", name: "Czech Koruna", decimal_place: 2 },
{ code: "DJF", name: "Djibouti Franc", decimal_place: 0 },
{ code: "DKK", name: "Danish Krone", decimal_place: 2 },
{ code: "DOP", name: "Dominican Peso", decimal_place: 2 },
{ code: "DZD", name: "Algerian Dinar", decimal_place: 2 },
{ code: "EEK", name: "Estonian Kroon", decimal_place: 2 },
{ code: "EGP", name: "Egyptian Pound", decimal_place: 2 },
{ code: "ERN", name: "Nakfa", decimal_place: 2 },
{ code: "ETB", name: "Ethiopian Birr", decimal_place: 2 },
{ code: "EUR", name: "Euro", decimal_place: 2 },
{ code: "FJD", name: "Fiji Dollar", decimal_place: 2 },
{ code: "FKP", name: "Falkland Islands Pound", decimal_place: 2 },
{ code: "GBP", name: "Pound Sterling", decimal_place: 2 },
{ code: "GEL", name: "Georgian Lari", decimal_place: 2 },
{ code: "GHS", name: "Ghana Cedi", decimal_place: 2 },
{ code: "GIP", name: "Gibraltar Pound", decimal_place: 2 },
{ code: "GMD", name: "Gambian Dalasi", decimal_place: 2 },
{ code: "GNF", name: "Guinea Franc", decimal_place: 0 },
{ code: "GQE", name: "CFA Franc", decimal_place: 0 },
{ code: "GTQ", name: "Guatemalan Quetzal", decimal_place: 2 },
{ code: "GYD", name: "Guyana Dollar", decimal_place: 2 },
{ code: "HKD", name: "Hong Kong Dollar", decimal_place: 2 },
{ code: "HNL", name: "Honduran Lempira", decimal_place: 2 },
{ code: "HRK", name: "Croatian Kuna", decimal_place: 2 },
{ code: "HTG", name: "Haitian Gourde", decimal_place: 2 },
{ code: "HUF", name: "Hungarian Forint", decimal_place: 2 },
{ code: "IDR", name: "Indonesian Rupiah", decimal_place: 0 },
{ code: "ILS", name: "New Israeli Sheqel", decimal_place: 2 },
{ code: "INR", name: "Indian Rupee Ngultrum", decimal_place: 2 },
{ code: "IQD", name: "Iraqi Dinar", decimal_place: 3 },
{ code: "IRR", name: "Iranian Rial", decimal_place: 2 },
{ code: "ISK", name: "Iceland Krona", decimal_place: 2 },
{ code: "JMD", name: "Jamaican Dollar", decimal_place: 2 },
{ code: "JOD", name: "Jordanian Dinar", decimal_place: 3 },
{ code: "JPY", name: "Japanese Yen", decimal_place: 0 },
{ code: "KES", name: "Kenyan Shilling", decimal_place: 2 },
{ code: "KGS", name: "Kyrgyzstani Som", decimal_place: 2 },
{ code: "KHR", name: "Cambodian Riel", decimal_place: 2 },
{ code: "KMF", name: "Comoro Franc", decimal_place: 0 },
{ code: "KPW", name: "North Korean Won", decimal_place: 2 },
{ code: "KRW", name: "South Korean Won", decimal_place: 0 },
{ code: "KWD", name: "Kuwaiti Dinar", decimal_place: 3 },
{ code: "KYD", name: "Cayman Islands Dollar", decimal_place: 2 },
{ code: "KZT", name: "Kazakhstani Tenge", decimal_place: 2 },
{ code: "LAK", name: "Laotian Kip", decimal_place: 2 },
{ code: "LBP", name: "Lebanese Pound", decimal_place: 2 },
{ code: "LKR", name: "Sri Lanka Rupee", decimal_place: 2 },
{ code: "LRD", name: "Liberian Dollar", decimal_place: 2 },
{ code: "LSL", name: "Lesotho Loti", decimal_place: 2 },
{ code: "LTL", name: "Lithuanian Litas", decimal_place: 2 },
{ code: "LVL", name: "Latvian Lats", decimal_place: 2 },
{ code: "LYD", name: "Libyan Dinar", decimal_place: 3 },
{ code: "MAD", name: "Moroccan Dirham", decimal_place: 2 },
{ code: "MDL", name: "Moldovan Leu", decimal_place: 2 },
{ code: "MGA", name: "Malagasy Ariary", decimal_place: 0 },
{ code: "MKD", name: "Macedonian Denar", decimal_place: 2 },
{ code: "MMK", name: "Kyat", decimal_place: 2 },
{ code: "MNT", name: "Mongolian Tugrik", decimal_place: 2 },
{ code: "MOP", name: "Macanese Pataca", decimal_place: 2 },
{ code: "MRO", name: "Mauritanian Ouguiya", decimal_place: 2 },
{ code: "MUR", name: "Mauritius Rupee", decimal_place: 2 },
{ code: "MVR", name: "Rufiyaa", decimal_place: 2 },
{ code: "MWK", name: "Malawian Kwacha", decimal_place: 2 },
{ code: "MXN", name: "Mexican Peso", decimal_place: 2 },
{ code: "MYR", name: "Malaysian Ringgit", decimal_place: 2 },
{ code: "MZM", name: "Mozambican Meticalis", decimal_place: 2 },
{ code: "NAD", name: "Namibia Dollar", decimal_place: 2 },
{ code: "NGN", name: "Nigerian Naira", decimal_place: 2 },
{ code: "NIO", name: "Cordoba Oro", decimal_place: 2 },
{ code: "NOK", name: "Norwegian Krone", decimal_place: 2 },
{ code: "NPR", name: "Nepalese Rupee", decimal_place: 2 },
{ code: "NZD", name: "New Zealand Dollar", decimal_place: 2 },
{ code: "OMR", name: "Rial Omani", decimal_place: 3 },
{ code: "PAB", name: "Panamanian Balboa", decimal_place: 2 },
{ code: "PEN", name: "Nuevo Sol", decimal_place: 2 },
{ code: "PGK", name: "Papua New Guinean Kina", decimal_place: 2 },
{ code: "PHP", name: "Philippine Peso", decimal_place: 2 },
{ code: "PKR", name: "Pakistan Rupee", decimal_place: 2 },
{ code: "PLN", name: "Polish Zloty", decimal_place: 2 },
{ code: "PYG", name: "Paraguayan Guarani", decimal_place: 0 },
{ code: "QAR", name: "Qatari Rial", decimal_place: 2 },
{ code: "RON", name: "Romanian Leu", decimal_place: 2 },
{ code: "RSD", name: "Serbian Dinar", decimal_place: 2 },
{ code: "RUB", name: "Russian Ruble", decimal_place: 2 },
{ code: "RWF", name: "Rwanda Franc", decimal_place: 0 },
{ code: "SAR", name: "Saudi Riyal", decimal_place: 2 },
{ code: "SBD", name: "Solomon Islands Dollar", decimal_place: 2 },
{ code: "SCR", name: "Seychelles Rupee", decimal_place: 2 },
{ code: "SDG", name: "Sudanese Pound", decimal_place: 2 },
{ code: "SEK", name: "Swedish Krona", decimal_place: 2 },
{ code: "SGD", name: "Singapore Dollar", decimal_place: 2 },
{ code: "SHP", name: "Saint Helena Pound", decimal_place: 2 },
{ code: "SLL", name: "Sierra Leonean Leone", decimal_place: 2 },
{ code: "SOS", name: "Somali Shilling", decimal_place: 2 },
{ code: "SRD", name: "Surinam Dollar", decimal_place: 2 },
{ code: "STD", name: "São Tomé and Príncipe Dobra", decimal_place: 2 },
{ code: "SYP", name: "Syrian Pound", decimal_place: 2 },
{ code: "SZL", name: "Swazi Lilangeni", decimal_place: 2 },
{ code: "THB", name: "Thai Baht", decimal_place: 2 },
{ code: "TJS", name: "Tajikistani Somoni", decimal_place: 2 },
{ code: "TMM", name: "Manat", decimal_place: 2 },
{ code: "TMT", name: "Turkmenistan Manat", decimal_place: 2 },
{ code: "TND", name: "Tunisian Dinar", decimal_place: 3 },
{ code: "TOP", name: "Pa'anga", decimal_place: 2 },
{ code: "TRY", name: "New Turkish Lira", decimal_place: 2 },
{ code: "TTD", name: "Trinidad and Tobago Dollar", decimal_place: 2 },
{ code: "TWD", name: "New Taiwan Dollar", decimal_place: 2 },
{ code: "TZS", name: "Tanzanian Shilling", decimal_place: 2 },
{ code: "UAH", name: "Ukrainian Hryvnia", decimal_place: 2 },
{ code: "UGX", name: "Uganda Shilling", decimal_place: 2 },
{ code: "USD", name: "US Dollar", decimal_place: 3 },
{ code: "UYU", name: "Peso Uruguayo", decimal_place: 2 },
{ code: "UZS", name: "Uzbekistan Sum", decimal_place: 2 },
{ code: "VEB", name: "Venezuelan Bolivares", decimal_place: 2 },
{ code: "VND", name: "Vietnamese Dong", decimal_place: 2 },
{ code: "VUV", name: "Vanuatu Vatu", decimal_place: 0 },
{ code: "WST", name: "Samoan Tala", decimal_place: 2 },
{ code: "XAF", name: "Central African CFA Franc", decimal_place: 0 },
{ code: "XCD", name: "East Caribbean Dollar", decimal_place: 2 },
{ code: "XOF", name: "West African CFA Franc", decimal_place: 2 },
{ code: "XPF", name: "CFP Franc", decimal_place: 0 },
{ code: "YER", name: "Yemeni Rial", decimal_place: 2 },
{ code: "ZAR", name: "South African Rand", decimal_place: 2 },
{ code: "ZMK", name: "Kwacha", decimal_place: 2 },
{ code: "ZWR", name: "Zimbabwean Dollar", decimal_place: 2 }
];
15 changes: 15 additions & 0 deletions app/models/transaction.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,21 @@ Balanced.Transaction = Balanced.Model.extend(
}
}.property('amount'),

// Note: Returning dummy values while waiting for the forex API to be available
// TODO: Remove this when the API is available
currency: 'USD',
captured_currency: 'KRW',

// Note: Returing dummy value while waiting for the forex API to be available
// TODO: Remove this when the API is available
amount_in_captured_currency: function() {
return this.get('amount') * 1000;
}.property('amount'),

isUSD: function() {
return (this.get('captured_currency') === 'USD');
},

customer_name_summary: function() {
if (this.get('customer')) {
return this.get('customer.display_me_with_email');
Expand Down
52 changes: 30 additions & 22 deletions app/templates/components/debit-customer-modal.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -33,36 +33,44 @@
</div>
</div>

<div class="control-group">
<label class="control-label">Account holder's name</label>
<div class="controls">
<span class="label1a">{{selected_funding_instrument.name}}</span>
</div>
<div class="control-group">
<label class="control-label">Account holder's name</label>
<div class="controls">
<span class="label1a">{{selected_funding_instrument.name}}</span>
</div>
</div>

<div class="control-group">
<label class="control-label">Type</label>
<div class="controls">
<span class="label1a">{{selected_funding_instrument.brand}}</span>
</div>
<div class="control-group">
<label class="control-label">Type</label>
<div class="controls">
<span class="label1a">{{selected_funding_instrument.brand}}</span>
</div>
</div>

<div {{bind-attr class=":control-group model.validationErrors.amount:error"}}>
<label class="control-label">Amount</label>
<div class="controls">
<div class="input-prepend">
<span class="add-on">$</span>
{{view Ember.TextField valueBinding="dollar_amount" name="dollar_amount" class="span"}}
</div>
<div {{bind-attr class=":control-group model.validationErrors.amount:error"}}>
<label class="control-label">Amount</label>
<div class="controls inline-select">
{{view Ember.Select
contentBinding="currency_list"
optionValuePath="content.code"
optionLabelPath="content.formatted_name"
valueBinding="selected_currency"
value="selected_currency"
name="selected_currency"
}}
{{view Ember.TextField valueBinding="dollar_amount" name="dollar_amount"}}
<div class="input-note">
<span>{{formatCapturedCurrency dollar_amount selected_currency}} = USD {{formatCurrency dollar_amount}}</span>
</div>
</div>
</div>

<div {{bind-attr class=":control-group model.validationErrors.appears_on_statement_as:error"}}>
<label class="control-label">Appears on statement as ({{selected_funding_instrument.appears_on_statement_max_length}} characters max)</label>
<div class="controls">
{{view Ember.TextField valueBinding="model.appears_on_statement_as" name="appears_on_statement_as" class="full" maxlengthBinding="selected_funding_instrument.appears_on_statement_max_length"}}
</div>
<div {{bind-attr class=":control-group model.validationErrors.appears_on_statement_as:error"}}>
<label class="control-label">Appears on statement as ({{selected_funding_instrument.appears_on_statement_max_length}} characters max)</label>
<div class="controls">
{{view Ember.TextField valueBinding="model.appears_on_statement_as" name="appears_on_statement_as" class="full" maxlengthBinding="selected_funding_instrument.appears_on_statement_max_length"}}
</div>
</div>


<div {{bind-attr class=":control-group model.validationErrors.description:error"}}>
Expand Down
12 changes: 10 additions & 2 deletions app/templates/components/refund-debit-modal.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,16 @@
<label class="control-label">Amount</label>
<div class="controls">
<div class="input-prepend">
<span class="add-on">$</span>
{{view Ember.TextField valueBinding="dollar_amount" name="dollar_amount" class="span3"}}
{{#if isUSD}}
<span class="add-on">$</span>
{{view Ember.TextField valueBinding="dollar_amount" name="dollar_amount" class="span3"}}
{{else}}
<span class="add-on">{{debit.captured_currency}}</span>
{{view Ember.TextField valueBinding="debit.amount_in_captured_currency" name="dollar_amount" class="span3"}}
{{/if}}
</div>
<div class="input-note">
<span>{{formatCapturedCurrency debit.amount_in_captured_currency debit.captured_currency}} = USD {{dollar_amount}}</span>
</div>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion app/templates/components/txn-debit.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<div class="tt-label">Debit</div>
<div class="tt-content">
<span class="tt-title">
{{titleCase debit.status}}: {{formatCurrency debit.amount}}
{{titleCase debit.status}}: {{formatCurrency debit.amount}} ({{formatCapturedCurrency debit.amount_in_captured_currency debit.captured_currency}})
</span>
<div class="tt-buttons">
{{#if debit.can_refund}}
Expand Down
7 changes: 6 additions & 1 deletion app/templates/results/transactions_table.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,12 @@
<td class="span3 amount num">
{{#link-to transaction.route_name transaction}}
<span>
{{formatCurrency transaction.amount}}
{{#if view.transaction.isUSD}}
{{formatCurrency transaction.amount}}
{{else}}
<span class="primary">{{formatCurrency transaction.amount}}</span>
<span class="secondary">{{formatCapturedCurrency transaction.amount_in_captured_currency transaction.captured_currency}}</span>
{{/if}}
</span>
{{/link-to}}
</td>
Expand Down
Loading