1 package com.jbidwatcher.auction.server.ebay;
2 
3 import com.jbidwatcher.util.Currency;
4 import com.jbidwatcher.util.config.JConfig;
5 
6 public class ebayCurrencyTables {
7   private static Currency[][] us_incrementTable = {
8     { new Currency(   "$0.99"), new Currency( "$0.05") },
9     { new Currency(   "$4.99"), new Currency( "$0.25") },
10     { new Currency(  "$24.99"), new Currency( "$0.50") },
11     { new Currency(  "$99.99"), new Currency( "$1.00") },
12     { new Currency( "$249.99"), new Currency( "$2.50") },
13     { new Currency( "$499.99"), new Currency( "$5.00") },
14     { new Currency( "$999.99"), new Currency("$10.00") },
15     { new Currency("$2499.99"), new Currency("$25.00") },
16     { new Currency("$4999.99"), new Currency("$50.00") },
17     { Currency.NoValue(), new Currency("$100.00") } };
18 
19   private static Currency[][] au_incrementTable = {
20       { new Currency(   "AUD0.99"), new Currency( "AUD0.05") },
21       { new Currency(   "AUD4.99"), new Currency( "AUD0.25") },
22       { new Currency(  "AUD24.99"), new Currency( "AUD0.50") },
23       { new Currency(  "AUD99.99"), new Currency( "AUD1.00") },
24       { new Currency( "AUD249.99"), new Currency( "AUD2.50") },
25       { new Currency( "AUD499.99"), new Currency( "AUD5.00") },
26       { new Currency( "AUD999.99"), new Currency("AUD10.00") },
27       { new Currency("AUD2499.99"), new Currency("AUD25.00") },
28       { new Currency("AUD4999.99"), new Currency("AUD50.00") },
29       { Currency.NoValue(), new Currency("AUD100.00") } };
30 
31   private static Currency[][] ca_incrementTable = {
32         { new Currency( "CAD0.99"), new Currency( "CAD0.05") },
33         { new Currency( "CAD4.99"), new Currency( "CAD0.25") },
34         { new Currency("CAD24.99"), new Currency( "CAD0.50") },
35         { new Currency("CAD99.99"), new Currency( "CAD1.00") },
36         { Currency.NoValue(), new Currency("CAD2.50") } };
37 
38     // eBay.co.uk increments change *at* the boundary regardless of what the documentation
39     // may say: http://pages.ebay.co.uk/help/buy/bid-increments.html
40     private static Currency[][] uk_incrementTable = {
41         { new Currency(   "GBP0.99"), new Currency( "GBP0.05") },
42         { new Currency(   "GBP4.99"), new Currency( "GBP0.20") },
43         { new Currency(  "GBP14.99"), new Currency( "GBP0.50") },
44         { new Currency(  "GBP59.99"), new Currency( "GBP1.00") },
45         { new Currency( "GBP149.99"), new Currency( "GBP2.00") },
46         { new Currency( "GBP299.99"), new Currency( "GBP5.00") },
47         { new Currency( "GBP599.99"), new Currency("GBP10.00") },
48         { new Currency("GBP1499.99"), new Currency("GBP25.00") },
49         { new Currency("GBP2999.99"), new Currency("GBP50.00") },
50         { Currency.NoValue(), new Currency("GBP100.00") } };
51 
52   private static Currency[][] fr_incrementTable = {
53             { new Currency(    "FRF4.99"), new Currency( "FRF0.25") },
54             { new Currency(   "FRF24.99"), new Currency( "FRF0.50") },
55             { new Currency(   "FRF99.99"), new Currency( "FRF1.00") },
56             { new Currency(  "FRF249.99"), new Currency( "FRF2.50") },
57             { new Currency(  "FRF499.99"), new Currency( "FRF5.00") },
58             { new Currency(  "FRF999.99"), new Currency("FRF10.00") },
59             { new Currency( "FRF2499.99"), new Currency("FRF25.00") },
60             { new Currency( "FRF9999.99"), new Currency("FRF100.00") },
61             { new Currency("FRF49999.99"), new Currency("FRF250.00") },
62             { Currency.NoValue(), new Currency("FRF500.00") } };
63 
64   private static Currency[][] eu_incrementTable = {
65               { new Currency(   "EUR49.99"), new Currency( "EUR0.50") },
66               { new Currency(  "EUR499.99"), new Currency( "EUR1.00") },
67               { new Currency(  "EUR999.99"), new Currency( "EUR5.00") },
68               { new Currency( "EUR4999.99"), new Currency("EUR10.00") },
69               { Currency.NoValue(), new Currency("EUR50.00") } };
70 
71   private static Currency[][] tw_incrementTable = {
72                 { new Currency(   "NTD500"), new Currency( "NTD15") },
73                 { new Currency(  "NTD2500"), new Currency( "NTD30") },
74                 { new Currency(  "NTD5000"), new Currency( "NTD50") },
75                 { new Currency( "NTD25000"), new Currency("NTD100") },
76                 { Currency.NoValue(), new Currency("NTD200") } };
77 
78   private static Currency[][] ch_incrementTable = {
79                   { new Currency(   "CHF49.99"), new Currency( "CHF0.50") },
80                   { new Currency(  "CHF499.99"), new Currency( "CHF1.00") },
81                   { new Currency(  "CHF999.99"), new Currency( "CHF5.00") },
82                   { new Currency( "CHF4999.99"), new Currency("CHF10.00") },
83                   { Currency.NoValue(), new Currency("CHF50.00") } };
84 
85   private static Currency[][] ir_incrementTable = {
86           {new Currency("INR99.99"), new Currency("INR25.00")},
87           {new Currency("INR499.99"), new Currency("INR50.00")},
88           {new Currency("INR999.99"), new Currency("INR75.00")},
89           {new Currency("INR1999.99"), new Currency("INR100.00")},
90           {new Currency("INR3999.99"), new Currency("INR150.00")},
91           {new Currency("INR9999.99"), new Currency("INR200.00")},
92           {new Currency("INR24999.99"), new Currency("INR300.00")},
93           {new Currency("INR49999.99"), new Currency("INR500.00")},
94           {new Currency("INR99999.99"), new Currency("INR750.00")},
95           {Currency.NoValue(), new Currency("INR2000.00")}};
96 
97   private static Currency zeroDollars = new Currency("$0.00");
98   private static Currency zeroPounds = new Currency("GBP 0.00");
99   private static Currency zeroFrancs = new Currency("FR 0.00");
100   private static Currency zeroSwissFrancs = new Currency("CHF0.00");
101   private static Currency zeroEuros = new Currency("EUR 0.00");
102   private static Currency zeroAustralian = new Currency("AUD0.00");
103   private static Currency zeroIndianRupee = new Currency("INR0.00");
104   private static Currency zeroTaiwanese = new Currency("NTD0.00");
105   private static Currency zeroCanadian = new Currency("CAD0.00");
106 
getMinimumBidIncrement(Currency currentBid, int bidCount)107   Currency getMinimumBidIncrement(Currency currentBid, int bidCount) {
108     Currency correctedValue = currentBid;
109     Currency zeroIncrement = zeroDollars;
110     Currency[][] rightTable;
111 
112     switch (currentBid.getCurrencyType()) {
113       //  Default to USD, so we don't freak if we're passed a bad
114       //  value.  We'll get the wrong answer, but we won't thrash.
115       default:
116         correctedValue = zeroDollars;
117         rightTable = us_incrementTable;
118         break;
119       case Currency.US_DOLLAR:
120         rightTable = us_incrementTable;
121         break;
122       case Currency.UK_POUND:
123         rightTable = uk_incrementTable;
124         zeroIncrement = zeroPounds;
125         break;
126       case Currency.FR_FRANC:
127         rightTable = fr_incrementTable;
128         zeroIncrement = zeroFrancs;
129         break;
130       case Currency.CH_FRANC:
131         rightTable = ch_incrementTable;
132         zeroIncrement = zeroSwissFrancs;
133         break;
134       case Currency.EURO:
135         rightTable = eu_incrementTable;
136         zeroIncrement = zeroEuros;
137         break;
138       case Currency.TW_DOLLAR:
139         rightTable = tw_incrementTable;
140         zeroIncrement = zeroTaiwanese;
141         break;
142       case Currency.CAN_DOLLAR:
143         rightTable = ca_incrementTable;
144         zeroIncrement = zeroCanadian;
145         break;
146       case Currency.AU_DOLLAR:
147         rightTable = au_incrementTable;
148         zeroIncrement = zeroAustralian;
149         break;
150       case Currency.IND_RUPEE:
151         rightTable = ir_incrementTable;
152         zeroIncrement = zeroIndianRupee;
153         break;
154     }
155 
156     if (bidCount == 0) return zeroIncrement;
157 
158     for (Currency[] aRightTable : rightTable) {
159       Currency endValue = aRightTable[0];
160       Currency incrementValue = aRightTable[1];
161 
162       //  Sentinel.  If we reach the end, return the max.
163       if (endValue == null || endValue.isNull()) return incrementValue;
164 
165       try {
166         //  If it's less than, or equal, to the end value than we use
167         //  that increment amount.
168         if (correctedValue.less(endValue)) return incrementValue;
169         if (!endValue.less(correctedValue)) return incrementValue;
170       } catch (Currency.CurrencyTypeException e) {
171         /* Should never happen, since we've checked the currency already.  */
172         JConfig.log().handleException("Currency comparison threw a bad currency exception, which should be impossible.", e);
173       }
174     }
175     return null;
176   }
177 }
178