1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets;
18
19 import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
20 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
21 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
22 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
23 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataList;
24 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem;
25 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
26 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseAssetType;
27 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
28 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransAsset;
29
30 import java.util.ArrayList;
31 import java.util.HashMap;
32 import java.util.Iterator;
33 import java.util.List;
34 import java.util.Map;
35
36
37
38
39 public final class MoneyWiseXAnalysisTaxBasisAccountBucket
40 extends MoneyWiseXAnalysisTaxBasisBucket {
41
42
43
44 private static final MetisFieldSet<MoneyWiseXAnalysisTaxBasisAccountBucket> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseXAnalysisTaxBasisAccountBucket.class);
45
46
47
48
49 static {
50 FIELD_DEFS.declareLocalField(MoneyWiseBasicResource.TRANSACTION_ACCOUNT, MoneyWiseXAnalysisTaxBasisAccountBucket::getAccount);
51 }
52
53
54
55
56 private final Long theAssetId;
57
58
59
60
61 private final MoneyWiseXAnalysisTaxBasisBucket theParent;
62
63
64
65
66 private final MoneyWiseTransAsset theAccount;
67
68
69
70
71
72
73
74
75 MoneyWiseXAnalysisTaxBasisAccountBucket(final MoneyWiseXAnalysis pAnalysis,
76 final MoneyWiseXAnalysisTaxBasisBucket pParent,
77 final MoneyWiseTransAsset pAccount) {
78
79 super(pAnalysis, pParent.getTaxBasis());
80 theAssetId = deriveAssetId(pAccount);
81 theAccount = pAccount;
82 theParent = pParent;
83 }
84
85
86
87
88
89
90
91
92
93 private MoneyWiseXAnalysisTaxBasisAccountBucket(final MoneyWiseXAnalysis pAnalysis,
94 final MoneyWiseXAnalysisTaxBasisBucket pParent,
95 final MoneyWiseXAnalysisTaxBasisAccountBucket pBase,
96 final OceanusDate pDate) {
97
98 super(pAnalysis, pBase, pDate);
99 theAssetId = pBase.getBucketId();
100 theAccount = pBase.getAccount();
101 theParent = pParent;
102 }
103
104
105
106
107
108
109
110
111
112 private MoneyWiseXAnalysisTaxBasisAccountBucket(final MoneyWiseXAnalysis pAnalysis,
113 final MoneyWiseXAnalysisTaxBasisBucket pParent,
114 final MoneyWiseXAnalysisTaxBasisAccountBucket pBase,
115 final OceanusDateRange pRange) {
116
117 super(pAnalysis, pBase, pRange);
118 theAssetId = pBase.getBucketId();
119 theAccount = pBase.getAccount();
120 theParent = pParent;
121 }
122
123
124
125
126
127
128
129 private static Long deriveAssetId(final MoneyWiseTransAsset pAsset) {
130
131 return MoneyWiseAssetType.createAlternateExternalId(MoneyWiseAssetType.TAXBASISACCOUNT, pAsset.getExternalId());
132 }
133
134 @Override
135 public MetisFieldSet<MoneyWiseXAnalysisTaxBasisAccountBucket> getDataFieldSet() {
136 return FIELD_DEFS;
137 }
138
139 @Override
140 public Integer getIndexedId() {
141 return theAccount.getExternalId().intValue();
142 }
143
144 @Override
145 public Long getBucketId() {
146 return theAssetId;
147 }
148
149
150
151
152
153
154 public String getSimpleName() {
155 return theAccount.getName();
156 }
157
158 @Override
159 public String getName() {
160 return getTaxBasis().getName()
161 + ':'
162 + getSimpleName();
163 }
164
165
166
167
168
169
170 public MoneyWiseTransAsset getAccount() {
171 return theAccount;
172 }
173
174
175
176
177
178
179 public MoneyWiseXAnalysisTaxBasisBucket getParent() {
180 return theParent;
181 }
182
183
184
185
186 public static class MoneyWiseXAnalysisTaxBasisAccountBucketList
187 implements MetisFieldItem, MetisDataList<MoneyWiseXAnalysisTaxBasisAccountBucket> {
188
189
190
191 private static final MetisFieldSet<MoneyWiseXAnalysisTaxBasisAccountBucketList> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseXAnalysisTaxBasisAccountBucketList.class);
192
193
194
195
196 static {
197 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.ANALYSIS_NAME, MoneyWiseXAnalysisTaxBasisAccountBucketList::getAnalysis);
198 }
199
200
201
202
203 private final MoneyWiseXAnalysis theAnalysis;
204
205
206
207
208 private final List<MoneyWiseXAnalysisTaxBasisAccountBucket> theList;
209
210
211
212
213 private final MoneyWiseXAnalysisTaxBasisBucket theParent;
214
215
216
217
218 private final Map<Long, MoneyWiseXAnalysisTaxBasisAccountBucket> theMap;
219
220
221
222
223
224
225
226 protected MoneyWiseXAnalysisTaxBasisAccountBucketList(final MoneyWiseXAnalysis pAnalysis,
227 final MoneyWiseXAnalysisTaxBasisBucket pParent) {
228 theAnalysis = pAnalysis;
229 theParent = pParent;
230 theMap = new HashMap<>();
231 theList = new ArrayList<>();
232 }
233
234
235
236
237
238
239
240
241
242 protected MoneyWiseXAnalysisTaxBasisAccountBucketList(final MoneyWiseXAnalysis pAnalysis,
243 final MoneyWiseXAnalysisTaxBasisBucket pParent,
244 final MoneyWiseXAnalysisTaxBasisAccountBucketList pBase,
245 final OceanusDate pDate) {
246
247 this(pAnalysis, pParent);
248
249
250 final Iterator<MoneyWiseXAnalysisTaxBasisAccountBucket> myIterator = pBase.iterator();
251 while (myIterator.hasNext()) {
252 final MoneyWiseXAnalysisTaxBasisAccountBucket myCurr = myIterator.next();
253
254
255 final MoneyWiseXAnalysisTaxBasisAccountBucket myBucket = new MoneyWiseXAnalysisTaxBasisAccountBucket(pAnalysis, theParent, myCurr, pDate);
256
257
258 if (!myBucket.isIdle()) {
259
260 theList.add(myBucket);
261 theMap.put(myBucket.getBucketId(), myBucket);
262 }
263 }
264 }
265
266
267
268
269
270
271
272
273
274 protected MoneyWiseXAnalysisTaxBasisAccountBucketList(final MoneyWiseXAnalysis pAnalysis,
275 final MoneyWiseXAnalysisTaxBasisBucket pParent,
276 final MoneyWiseXAnalysisTaxBasisAccountBucketList pBase,
277 final OceanusDateRange pRange) {
278
279 this(pAnalysis, pParent);
280
281
282 final Iterator<MoneyWiseXAnalysisTaxBasisAccountBucket> myIterator = pBase.iterator();
283 while (myIterator.hasNext()) {
284 final MoneyWiseXAnalysisTaxBasisAccountBucket myCurr = myIterator.next();
285
286
287 final MoneyWiseXAnalysisTaxBasisAccountBucket myBucket = new MoneyWiseXAnalysisTaxBasisAccountBucket(pAnalysis, theParent, myCurr, pRange);
288
289
290 if (!myBucket.isIdle()) {
291
292 myBucket.adjustToBase();
293
294
295 theList.add(myBucket);
296 theMap.put(myBucket.getBucketId(), myBucket);
297 }
298 }
299 }
300
301 @Override
302 public MetisFieldSet<MoneyWiseXAnalysisTaxBasisAccountBucketList> getDataFieldSet() {
303 return FIELD_DEFS;
304 }
305
306 @Override
307 public List<MoneyWiseXAnalysisTaxBasisAccountBucket> getUnderlyingList() {
308 return theList;
309 }
310
311 @Override
312 public String formatObject(final OceanusDataFormatter pFormatter) {
313 return getDataFieldSet().getName();
314 }
315
316
317
318
319
320
321 protected MoneyWiseXAnalysis getAnalysis() {
322 return theAnalysis;
323 }
324
325
326
327
328
329
330
331
332
333 MoneyWiseXAnalysisTaxBasisAccountBucket adjustValue(final MoneyWiseTransAsset pAccount,
334 final OceanusMoney pValue,
335 final MoneyWiseXTaxBasisAdjust pAdjust) {
336
337 final MoneyWiseXAnalysisTaxBasisAccountBucket myBucket = getBucket(pAccount);
338
339
340 return myBucket.adjustValue(pAccount, pValue, pAdjust);
341 }
342
343
344
345
346
347
348
349 private MoneyWiseXAnalysisTaxBasisAccountBucket getBucket(final MoneyWiseTransAsset pAccount) {
350
351 final Long myKey = deriveAssetId(pAccount);
352 return theMap.computeIfAbsent(myKey, m -> {
353
354 final MoneyWiseXAnalysisTaxBasisAccountBucket myNew = new MoneyWiseXAnalysisTaxBasisAccountBucket(theAnalysis, theParent, pAccount);
355
356
357 theList.add(myNew);
358 return myNew;
359 });
360 }
361
362
363
364
365 protected void sortBuckets() {
366 theList.sort((l, r) -> l.getBucketId().compareTo(r.getBucketId()));
367 }
368
369
370
371
372
373
374
375 protected MoneyWiseXAnalysisTaxBasisAccountBucket findBucket(final MoneyWiseTransAsset pAccount) {
376
377 final Long myKey = deriveAssetId(pAccount);
378 return theMap.get(myKey);
379 }
380 }
381 }