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.metis.data.MetisDataFieldValue;
20 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataFieldId;
21 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem.MetisFieldTableItem;
22 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
23 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.base.MoneyWiseXAnalysisEvent;
24 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.base.MoneyWiseXAnalysisHistory;
25 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisInterfaces.MoneyWiseXAnalysisBucketRegister;
26 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisTaxBasisAttr;
27 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisTaxBasisValues;
28 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseAssetType;
29 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransAsset;
30 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency;
31 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
32 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTaxBasis;
33 import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
34 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
35 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusDecimal;
36 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
37 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
38
39 import java.util.Currency;
40
41
42
43
44 public abstract class MoneyWiseXAnalysisTaxBasisBaseBucket
45 implements MetisFieldTableItem, MoneyWiseXAnalysisBucketRegister {
46
47
48
49 private static final MetisFieldSet<MoneyWiseXAnalysisTaxBasisBaseBucket> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseXAnalysisTaxBasisBaseBucket.class);
50
51
52
53
54 static {
55 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.ANALYSIS_NAME, MoneyWiseXAnalysisTaxBasisBaseBucket::getAnalysis);
56 FIELD_DEFS.declareLocalField(MoneyWiseStaticDataType.TAXBASIS, MoneyWiseXAnalysisTaxBasisBaseBucket::getTaxBasis);
57 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.BUCKET_BASEVALUES, MoneyWiseXAnalysisTaxBasisBaseBucket::getBaseValues);
58 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.BUCKET_HISTORY, MoneyWiseXAnalysisTaxBasisBaseBucket::getHistoryMap);
59 FIELD_DEFS.declareLocalFieldsForEnum(MoneyWiseXAnalysisTaxBasisAttr.class, MoneyWiseXAnalysisTaxBasisBaseBucket::getAttributeValue);
60 }
61
62
63
64
65 private static final MetisDataFieldId NAME_TOTALS = MoneyWiseXAnalysisBucketResource.ANALYSIS_TOTALS;
66
67
68
69
70 private final MoneyWiseXAnalysisHolder theAnalysis;
71
72
73
74
75 private final MoneyWiseTaxBasis theTaxBasis;
76
77
78
79
80 private final MoneyWiseXAnalysisTaxBasisValues theValues;
81
82
83
84
85 private final MoneyWiseXAnalysisTaxBasisValues theBaseValues;
86
87
88
89
90 private final MoneyWiseXAnalysisHistory<MoneyWiseXAnalysisTaxBasisValues, MoneyWiseXAnalysisTaxBasisAttr> theHistory;
91
92
93
94
95 private final boolean isExpense;
96
97
98
99
100
101
102
103 protected MoneyWiseXAnalysisTaxBasisBaseBucket(final MoneyWiseXAnalysisHolder pAnalysis,
104 final MoneyWiseTaxBasis pTaxBasis) {
105
106 theTaxBasis = pTaxBasis;
107 theAnalysis = pAnalysis;
108 isExpense = theTaxBasis != null
109 && theTaxBasis.getTaxClass().isExpense();
110
111
112 final MoneyWiseCurrency myDefault = theAnalysis.getCurrency();
113 final Currency myCurrency = myDefault == null
114 ? MoneyWiseXAnalysisAccountBucket.DEFAULT_CURRENCY
115 : myDefault.getCurrency();
116 final MoneyWiseXAnalysisTaxBasisValues myValues = new MoneyWiseXAnalysisTaxBasisValues(myCurrency);
117 theHistory = new MoneyWiseXAnalysisHistory<>(myValues);
118
119
120 theValues = theHistory.getValues();
121 theBaseValues = theHistory.getBaseValues();
122 }
123
124
125
126
127
128
129
130
131 protected MoneyWiseXAnalysisTaxBasisBaseBucket(final MoneyWiseXAnalysisHolder pAnalysis,
132 final MoneyWiseXAnalysisTaxBasisBaseBucket pBase,
133 final OceanusDate pDate) {
134
135 theTaxBasis = pBase.getTaxBasis();
136 theAnalysis = pAnalysis;
137 isExpense = pBase.isExpense();
138
139
140 theHistory = new MoneyWiseXAnalysisHistory<>(pBase.getHistoryMap(), pDate);
141
142
143 theValues = theHistory.getValues();
144 theBaseValues = theHistory.getBaseValues();
145 }
146
147
148
149
150
151
152
153
154 protected MoneyWiseXAnalysisTaxBasisBaseBucket(final MoneyWiseXAnalysisHolder pAnalysis,
155 final MoneyWiseXAnalysisTaxBasisBaseBucket pBase,
156 final OceanusDateRange pRange) {
157
158 theTaxBasis = pBase.getTaxBasis();
159 theAnalysis = pAnalysis;
160 isExpense = pBase.isExpense();
161
162
163 theHistory = new MoneyWiseXAnalysisHistory<>(pBase.getHistoryMap(), pRange);
164
165
166 theValues = theHistory.getValues();
167 theBaseValues = theHistory.getBaseValues();
168 }
169
170 @Override
171 public MetisFieldSet<? extends MoneyWiseXAnalysisTaxBasisBaseBucket> getDataFieldSet() {
172 return FIELD_DEFS;
173 }
174
175 @Override
176 public String formatObject(final OceanusDataFormatter pFormatter) {
177 return toString();
178 }
179
180 @Override
181 public String toString() {
182 return getName() + " " + theValues;
183 }
184
185 @Override
186 public Integer getIndexedId() {
187 return theTaxBasis.getIndexedId();
188 }
189
190 @Override
191 public Long getBucketId() {
192 return MoneyWiseAssetType.createExternalId(MoneyWiseAssetType.TAXBASIS, getIndexedId());
193 }
194
195
196
197
198
199
200 public String getName() {
201 return theTaxBasis == null
202 ? NAME_TOTALS.getId()
203 : theTaxBasis.getName();
204 }
205
206
207
208
209
210
211 public MoneyWiseTaxBasis getTaxBasis() {
212 return theTaxBasis;
213 }
214
215
216
217
218
219
220 public boolean isExpense() {
221 return isExpense;
222 }
223
224
225
226
227
228
229 public boolean isIdle() {
230 return theHistory.isIdle();
231 }
232
233
234
235
236
237
238 public MoneyWiseXAnalysisTaxBasisValues getValues() {
239 return theValues;
240 }
241
242
243
244
245
246
247
248 public OceanusMoney getMoneyValue(final MoneyWiseXAnalysisTaxBasisAttr pAttr) {
249 return theValues.getMoneyValue(pAttr);
250 }
251
252
253
254
255
256
257 public MoneyWiseXAnalysisTaxBasisValues getBaseValues() {
258 return theBaseValues;
259 }
260
261
262
263
264
265
266
267 public MoneyWiseXAnalysisTaxBasisValues getValuesForEvent(final MoneyWiseXAnalysisEvent pEvent) {
268
269 return theHistory.getValuesForEvent(pEvent);
270 }
271
272
273
274
275
276
277
278 public MoneyWiseXAnalysisTaxBasisValues getPreviousValuesForEvent(final MoneyWiseXAnalysisEvent pEvent) {
279 return theHistory.getPreviousValuesForEvent(pEvent);
280 }
281
282
283
284
285
286
287
288
289 public OceanusDecimal getDeltaForEvent(final MoneyWiseXAnalysisEvent pEvent,
290 final MoneyWiseXAnalysisTaxBasisAttr pAttr) {
291
292 return theHistory.getDeltaValue(pEvent, pAttr);
293 }
294
295
296
297
298
299
300 private MoneyWiseXAnalysisHistory<MoneyWiseXAnalysisTaxBasisValues, MoneyWiseXAnalysisTaxBasisAttr> getHistoryMap() {
301 return theHistory;
302 }
303
304
305
306
307
308
309 protected MoneyWiseXAnalysisHolder getAnalysis() {
310 return theAnalysis;
311 }
312
313
314
315
316
317
318 public OceanusDateRange getDateRange() {
319 return theAnalysis.getDateRange();
320 }
321
322
323
324
325
326
327
328 protected void setValue(final MoneyWiseXAnalysisTaxBasisAttr pAttr,
329 final OceanusMoney pValue) {
330
331 theValues.setValue(pAttr, pValue);
332 }
333
334
335
336
337
338
339
340 private Object getAttributeValue(final MoneyWiseXAnalysisTaxBasisAttr pAttr) {
341
342 final Object myValue = getValue(pAttr);
343
344
345 return myValue != null
346 ? myValue
347 : MetisDataFieldValue.SKIP;
348 }
349
350
351
352
353
354
355
356 private Object getValue(final MoneyWiseXAnalysisTaxBasisAttr pAttr) {
357
358 return theValues.getValue(pAttr);
359 }
360
361
362
363
364
365
366 public void adjustGrossAndNett(final OceanusMoney pAmount) {
367 adjustGrossAndNett(null, pAmount);
368 }
369
370
371
372
373
374
375 public void adjustGross(final OceanusMoney pAmount) {
376 adjustGross(null, pAmount);
377 }
378
379
380
381
382
383
384 public void adjustGrossAndTax(final OceanusMoney pAmount) {
385 adjustGrossAndTax(null, pAmount);
386 }
387
388
389
390
391
392
393
394
395 public MoneyWiseXAnalysisTaxBasisBaseBucket adjustGrossAndNett(final MoneyWiseTransAsset pAccount,
396 final OceanusMoney pAmount) {
397 return adjustValue(pAccount, pAmount, MoneyWiseXTaxBasisAdjust.STANDARD);
398 }
399
400
401
402
403
404
405
406
407 public MoneyWiseXAnalysisTaxBasisBaseBucket adjustGross(final MoneyWiseTransAsset pAccount,
408 final OceanusMoney pAmount) {
409 return adjustValue(pAccount, pAmount, MoneyWiseXTaxBasisAdjust.GROSS);
410 }
411
412
413
414
415
416
417
418
419 public MoneyWiseXAnalysisTaxBasisBaseBucket adjustGrossAndTax(final MoneyWiseTransAsset pAccount,
420 final OceanusMoney pAmount) {
421 return adjustValue(pAccount, pAmount, MoneyWiseXTaxBasisAdjust.TAXCREDIT);
422 }
423
424
425
426
427
428
429
430
431
432 MoneyWiseXAnalysisTaxBasisBaseBucket adjustValue(final MoneyWiseTransAsset pAccount,
433 final OceanusMoney pValue,
434 final MoneyWiseXTaxBasisAdjust pAdjust) {
435
436 OceanusMoney myGross = theValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.GROSS);
437 myGross = new OceanusMoney(myGross);
438
439
440 if (isExpense) {
441 myGross.subtractAmount(pValue);
442 } else {
443 myGross.addAmount(pValue);
444 }
445
446
447 setValue(MoneyWiseXAnalysisTaxBasisAttr.GROSS, myGross);
448
449
450 if (pAdjust.adjustNett()) {
451
452 OceanusMoney myNett = theValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.NETT);
453 myNett = new OceanusMoney(myNett);
454
455
456 if (isExpense) {
457 myNett.subtractAmount(pValue);
458 } else {
459 myNett.addAmount(pValue);
460 }
461
462
463 setValue(MoneyWiseXAnalysisTaxBasisAttr.NETT, myNett);
464 }
465
466
467 if (pAdjust.adjustTaxCredit()) {
468
469 OceanusMoney myTax = theValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.TAXCREDIT);
470 myTax = new OceanusMoney(myTax);
471
472
473 if (isExpense) {
474 myTax.subtractAmount(pValue);
475 } else {
476 myTax.addAmount(pValue);
477 }
478
479
480 setValue(MoneyWiseXAnalysisTaxBasisAttr.TAXCREDIT, myTax);
481 }
482
483
484 return adjustAccountValue(pAccount, pValue, pAdjust);
485 }
486
487
488
489
490
491
492
493
494
495 MoneyWiseXAnalysisTaxBasisBaseBucket adjustAccountValue(final MoneyWiseTransAsset pAccount,
496 final OceanusMoney pValue,
497 final MoneyWiseXTaxBasisAdjust pAdjust) {
498 return null;
499 }
500
501 @Override
502 public void registerEvent(final MoneyWiseXAnalysisEvent pEvent) {
503
504 theHistory.registerEvent(pEvent, theValues);
505 }
506
507
508
509
510
511
512 protected void addValues(final MoneyWiseXAnalysisTaxBasisBaseBucket pBucket) {
513
514 OceanusMoney myAmount = theValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.GROSS);
515 myAmount.addAmount(pBucket.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.GROSS));
516 myAmount = theValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.NETT);
517 myAmount.addAmount(pBucket.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.NETT));
518 }
519
520
521
522
523 protected void adjustToBase() {
524
525 theValues.adjustToBaseValues(theBaseValues);
526 theBaseValues.resetBaseValues();
527 }
528
529
530
531
532 public enum MoneyWiseXTaxBasisAdjust {
533
534
535
536 STANDARD,
537
538
539
540
541 GROSS,
542
543
544
545
546 TAXCREDIT;
547
548
549
550
551
552
553 private boolean adjustNett() {
554 return this == STANDARD;
555 }
556
557
558
559
560
561
562 private boolean adjustTaxCredit() {
563 return this == TAXCREDIT;
564 }
565 }
566 }