1 package com.leonarduk.clearcheckbook.file;
2
3 import java.io.IOException;
4 import java.util.LinkedList;
5 import java.util.List;
6 import java.util.Map;
7
8 import com.google.common.base.Splitter;
9 import com.leonarduk.clearcheckbook.ClearcheckbookException;
10 import com.leonarduk.clearcheckbook.dto.TransactionDataType;
11
12 public class TransactionFilePreprocessor implements FilePreProcessor {
13
14 private Long defaultAccountId;
15 private int rowsToSkip;
16
17
18
19
20 @Override
21 public int getRowsToSkip() {
22 return rowsToSkip;
23 }
24
25 public TransactionFilePreprocessor() {
26 this(0);
27 }
28
29 public TransactionFilePreprocessor(int rowsToSkip) {
30 this(rowsToSkip, 0L);
31 }
32
33 public TransactionFilePreprocessor(Long accountId) {
34 this(0, accountId);
35 }
36
37 public TransactionFilePreprocessor(int rowsToSkip, Long accountId) {
38 this.defaultAccountId = accountId;
39 this.rowsToSkip = rowsToSkip;
40 }
41
42 @Override
43 public List<String> processHeaderRow(String separator, String line)
44 throws IOException {
45
46 List<String> headerFields = new LinkedList<>();
47 Iterable<String> columnNames = Splitter.on(separator).trimResults()
48 .split(line);
49 for (String columnn : columnNames) {
50
51 headerFields.add(columnn.replace("\"", ""));
52 }
53 return headerFields;
54 }
55
56
57
58
59
60 @Override
61 public Map<String, String> processRow(Map<String, String> fieldsMap)
62 throws ClearcheckbookException {
63 fieldsMap.put(TransactionDataType.Fields.DATE.name().toLowerCase(),
64 getDate(fieldsMap));
65 fieldsMap.put(TransactionDataType.Fields.AMOUNT.name().toLowerCase(),
66 getAmount(fieldsMap));
67 fieldsMap.put(TransactionDataType.Fields.DESCRIPTION.name()
68 .toLowerCase(), getDesription(fieldsMap));
69 fieldsMap.put(
70 TransactionDataType.Fields.CHECK_NUM.name().toLowerCase(),
71 getCheckNum(fieldsMap));
72 fieldsMap.put(TransactionDataType.Fields.MEMO.name().toLowerCase(),
73 getMemo(fieldsMap));
74 fieldsMap.put(TransactionDataType.Fields.PAYEE.name().toLowerCase(),
75 getPayee(fieldsMap));
76 fieldsMap.put(TransactionDataType.Fields.ACCOUNT_ID.name()
77 .toLowerCase(), getAccountId(fieldsMap));
78
79 return fieldsMap;
80 }
81
82 protected String getAccountId(Map<String, String> fieldsMap) {
83 String accountId = fieldsMap.get(TransactionDataType.Fields.ACCOUNT_ID
84 .name().toLowerCase());
85 if (null == accountId || accountId.equals("0")) {
86 accountId = String.valueOf(this.defaultAccountId);
87 }
88 return accountId;
89 }
90
91 protected String getPayee(Map<String, String> fieldsMap) {
92 return fieldsMap.get(TransactionDataType.Fields.PAYEE.name()
93 .toLowerCase());
94 }
95
96 protected String getMemo(Map<String, String> fieldsMap) {
97 return fieldsMap.get(TransactionDataType.Fields.MEMO.name()
98 .toLowerCase());
99 }
100
101 protected String getCheckNum(Map<String, String> fieldsMap) {
102 return fieldsMap.get(TransactionDataType.Fields.CHECK_NUM.name()
103 .toLowerCase());
104 }
105
106 protected String getDesription(Map<String, String> fieldsMap) {
107 return fieldsMap.get(TransactionDataType.Fields.DESCRIPTION.name()
108 .toLowerCase());
109 }
110
111 protected String getAmount(Map<String, String> fieldsMap) {
112 return fieldsMap.get(TransactionDataType.Fields.AMOUNT.name()
113 .toLowerCase());
114 }
115
116 protected String getDate(Map<String, String> fieldsMap)
117 throws ClearcheckbookException {
118 return fieldsMap.get(TransactionDataType.Fields.DATE.name()
119 .toLowerCase());
120 }
121
122 /***
123 * Helper function to remove all but numbers and periods
124 *
125 * @param nextValue
126 * @return
127 */
128 public double getDouble(String nextValue) {
129 if (!nextValue.isEmpty()) {
130 String number = nextValue.replaceAll("[^0-9. ]", "");
131 return Double.valueOf(number);
132 }
133 return 0;
134 }
135 }