View Javadoc

1   package com.leonarduk.clearcheckbook.dto;
2   
3   import java.util.Arrays;
4   import java.util.LinkedList;
5   import java.util.List;
6   import java.util.Map;
7   
8   import org.apache.log4j.Logger;
9   
10  import com.leonarduk.clearcheckbook.ClearcheckbookException;
11  
12  /***
13   * 
14   * 
15   * 
16   * @author Stephen Leonard
17   * @since 28 Jan 2014
18   * 
19   * @version $Author:: $: Author of last commit
20   * @version $Rev:: $: Revision of last commit
21   * @version $Date:: $: Date of last commit
22   * 
23   */
24  public class TransactionDataType extends AbstractDataType<TransactionDataType> {
25  
26  	/***
27  	 * 
28  	 * This holds the output fields
29  	 */
30  	public enum Fields {
31  		ID, DATE, AMOUNT, DESCRIPTION, CHECK_NUM, MEMO, PAYEE, ACCOUNT_ID, CATEGORY_ID, JIVE, TRANSACTION_TYPE, SPECIALSTATUS, PARENT, RELATED_TRANSFER, INITIAL_BALANCE;
32  	}
33  
34  	@Override
35  	protected Enum<?>[] getFields() {
36  		return Fields.values();
37  	}
38  
39  	public static Enum<?>[] getFileFields() {
40  		Fields[] values = Fields.values();
41  		List<Fields> asList = new LinkedList<>(Arrays.asList(values));
42  		asList.remove(Fields.TRANSACTION_TYPE.ordinal());
43  		return asList.toArray(new Fields[asList.size()]);
44  	}
45  
46  	public enum NonoutputFields {
47  		FROM_ACCOUNT_ID, TO_ACCOUNT_ID;
48  	}
49  
50  	@Override
51  	public String[] getValues() throws ClearcheckbookException {
52  		Enum<?>[] fields = getFileFields();
53  		String[] values = new String[fields.length];
54  		for (int i = 0; i < values.length; i++) {
55  			values[i] = getNonNullValue(fields[i]);
56  		}
57  		return values;
58  	}
59  
60  	public enum Type {
61  		WITHDRAWAL, DEPOSIT;
62  
63  		public String toString() {
64  			return String.valueOf(ordinal());
65  		};
66  
67  		public static boolean isMember(String key) {
68  			Type[] values = values();
69  			for (int i = 0; i < values.length; i++) {
70  				if (values[i].name().equalsIgnoreCase(key)) {
71  					return true;
72  				}
73  			}
74  			return false;
75  		}
76  
77  		public static Type fromString(String ordinal)
78  				throws ClearcheckbookException {
79  			try {
80  				int i = Integer.valueOf(ordinal);
81  				return Type.values()[i];
82  			} catch (Exception e) {
83  				throw new ClearcheckbookException(ordinal
84  						+ " is not a valid Type", e);
85  			}
86  		}
87  
88  		public static Type fromOrdinal(int ordinal)
89  				throws ClearcheckbookException {
90  			try {
91  				return Type.values()[ordinal];
92  			} catch (Exception e) {
93  				throw new ClearcheckbookException(ordinal
94  						+ " is not a valid Type", e);
95  			}
96  		}
97  	}
98  
99  	private static final Logger _logger = Logger
100 			.getLogger(TransactionDataType.class);
101 
102 	/***
103 	 * Version with id field.
104 	 * 
105 	 * @param id
106 	 * @param date
107 	 * @param amount
108 	 * @param transactionType
109 	 * @param accountId
110 	 * @param categoryId
111 	 * @param description
112 	 * @param jive
113 	 * @param fromAccountId
114 	 * @param toAccountId
115 	 * @param checkNum
116 	 * @param memo
117 	 * @param payee
118 	 * @return
119 	 */
120 	public static TransactionDataType create(Long id, String date,
121 			double amount, long accountId, long categoryId, String description,
122 			boolean jive, long fromAccountId, long toAccountId,
123 			String checkNum, String memo, String payee) {
124 		TransactionDataType create = TransactionDataType.create(date, amount,
125 				accountId, categoryId, description, jive, fromAccountId,
126 				toAccountId, checkNum, memo, payee);
127 		create.setValue(Fields.ID, id);
128 		return create;
129 	}
130 
131 	public static TransactionDataType create(String date, Double amount,
132 			Long accountId, Long categoryId, String description, Boolean jive,
133 			Long fromAccountId, Long toAccountId, String checkNum, String memo,
134 			String payee) {
135 		TransactionDataType transactionDataType = new TransactionDataType();
136 		transactionDataType.setDate(date);
137 		transactionDataType.setAmount(amount);
138 		transactionDataType.setTransactionType(getTransactionType(amount));
139 		transactionDataType.setAccountId(accountId);
140 		transactionDataType.setCategoryId(categoryId);
141 		transactionDataType.setDescription(description);
142 		transactionDataType.setJive(jive);
143 		transactionDataType.setFromAccountId(fromAccountId);
144 		transactionDataType.setToAccountId(toAccountId);
145 		transactionDataType.setCheckNum(checkNum);
146 		transactionDataType.setMemo(memo);
147 		transactionDataType.setPayee(payee);
148 
149 		_logger.debug("createCategoriesDataType: " + transactionDataType);
150 		return transactionDataType;
151 	}
152 
153 	/***
154 	 * if amount is negative is WITHDRAWAL else DEPOSIT
155 	 * 
156 	 * @param amount
157 	 * @return
158 	 */
159 	private static Type getTransactionType(double amount) {
160 		if (amount < 0) {
161 			return Type.WITHDRAWAL;
162 		}
163 		return Type.DEPOSIT;
164 	}
165 
166 	private TransactionDataType() {
167 		super();
168 	}
169 
170 	public TransactionDataType(TransactionDataType original){
171 		super(original);
172 	}
173 	public TransactionDataType(Map<String, String> map)
174 			throws ClearcheckbookException {
175 		super(map);
176 		if (null == getJive()) {
177 			setJive(false);
178 		}
179 		setTransactionType(getTransactionType(getAmount()));
180 	}
181 
182 	public Long getAccountId() {
183 		return getLongValue(Fields.ACCOUNT_ID);
184 	}
185 
186 	public Double getAmount() {
187 		return getDoubleValue(Fields.AMOUNT);
188 	}
189 
190 	public Long getCategoryId() {
191 		return getLongValue(Fields.CATEGORY_ID);
192 	}
193 
194 	public String getCheckNum() {
195 		return getValue(Fields.CHECK_NUM);
196 	}
197 
198 	public String getDate() {
199 		return getValue(Fields.DATE);
200 	}
201 
202 	public String getDescription() {
203 		return getValue(Fields.DESCRIPTION);
204 	}
205 
206 	@Override
207 	protected Enum<?>[] getEditFields() {
208 		Fields[] insertFields = new Fields[] { Fields.ID, Fields.DATE,
209 				Fields.AMOUNT, Fields.TRANSACTION_TYPE, Fields.ACCOUNT_ID,
210 				Fields.CATEGORY_ID, Fields.DESCRIPTION, Fields.JIVE,
211 				Fields.CHECK_NUM, Fields.MEMO };
212 		return insertFields;
213 	}
214 
215 	public Long getFromAccountId() {
216 		return getLongValue(NonoutputFields.FROM_ACCOUNT_ID);
217 	}
218 
219 	protected Enum<?>[] getInsertFields() {
220 		Enum<?>[] insertFields = new Enum<?>[] { Fields.DATE, Fields.AMOUNT,
221 				Fields.TRANSACTION_TYPE, Fields.ACCOUNT_ID, Fields.CATEGORY_ID,
222 				Fields.DESCRIPTION, Fields.JIVE,
223 				NonoutputFields.FROM_ACCOUNT_ID, NonoutputFields.TO_ACCOUNT_ID,
224 				Fields.CHECK_NUM, Fields.MEMO, Fields.PAYEE };
225 		return insertFields;
226 	}
227 
228 	public Boolean getJive() {
229 		return getBooleanValue(Fields.JIVE);
230 	}
231 
232 	public String getMemo() {
233 		return getValue(Fields.MEMO);
234 	}
235 
236 	public String getPayee() {
237 		return getValue(Fields.PAYEE);
238 	}
239 
240 	public Long getToAccount() {
241 		return getLongValue(NonoutputFields.TO_ACCOUNT_ID);
242 	}
243 
244 	public Type getTransactionType() throws ClearcheckbookException {
245 		return Type.fromString(getValue(Fields.TRANSACTION_TYPE));
246 	}
247 
248 	public void setAccountId(Long string) {
249 		setValue(Fields.ACCOUNT_ID, string);
250 	}
251 
252 	public void setAmount(Double amount) {
253 		setValue(Fields.AMOUNT, amount);
254 	}
255 
256 	public void setCategoryId(Long string) {
257 		setValue(Fields.CATEGORY_ID, string);
258 	}
259 
260 	public void setCheckNum(String string) {
261 		setValue(Fields.CHECK_NUM, string);
262 	}
263 
264 	public void setDate(String string) {
265 		setValue(Fields.DATE, string);
266 	}
267 
268 	public void setDescription(String string) {
269 		setValue(Fields.DESCRIPTION, string);
270 	}
271 
272 	public void setFromAccountId(Long fromAccountId) {
273 		setValue(NonoutputFields.FROM_ACCOUNT_ID, fromAccountId);
274 	}
275 
276 	public void setJive(Boolean jive) {
277 		setValue(Fields.JIVE, jive);
278 	}
279 
280 	public void setMemo(String string) {
281 		setValue(Fields.MEMO, string);
282 	}
283 
284 	public void setPayee(String valString) {
285 		setValue(Fields.PAYEE, valString);
286 	}
287 
288 	public void setToAccountId(Long toAccountId) {
289 		setValue(NonoutputFields.TO_ACCOUNT_ID, toAccountId);
290 	}
291 
292 	public void setTransactionType(Type transactionType) {
293 		setValue(Fields.TRANSACTION_TYPE, transactionType);
294 	}
295 
296 	public void markToBeDeleted() {
297 		setValue(Fields.ID, -1 * getId());
298 	}
299 
300 }