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.OceanusDecimal;
22 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
23 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
24 import io.github.tonywasher.joceanus.metis.data.MetisDataFieldValue;
25 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataFieldId;
26 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataList;
27 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem;
28 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem.MetisFieldTableItem;
29 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
30 import io.github.tonywasher.joceanus.metis.list.MetisListIndexed;
31 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.base.MoneyWiseXAnalysisEvent;
32 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.base.MoneyWiseXAnalysisHistory;
33 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisInterfaces.MoneyWiseXAnalysisBucketRegister;
34 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisTaxBasisAccountBucket.MoneyWiseXAnalysisTaxBasisAccountBucketList;
35 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisTaxBasisAttr;
36 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisTaxBasisValues;
37 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseAssetType;
38 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransAsset;
39 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransaction;
40 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency;
41 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
42 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTaxBasis;
43 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTaxBasis.MoneyWiseTaxBasisList;
44 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTaxClass;
45 import io.github.tonywasher.joceanus.moneywise.tax.MoneyWiseChargeableGainSlice.MoneyWiseChargeableGainSliceList;
46 import io.github.tonywasher.joceanus.moneywise.tax.MoneyWiseTaxSource;
47 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
48
49 import java.util.Comparator;
50 import java.util.Currency;
51 import java.util.Iterator;
52 import java.util.List;
53
54
55
56
57 public class MoneyWiseXAnalysisTaxBasisBucket
58 implements MetisFieldTableItem, MoneyWiseXAnalysisBucketRegister {
59
60
61
62 private static final MetisFieldSet<MoneyWiseXAnalysisTaxBasisBucket> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseXAnalysisTaxBasisBucket.class);
63
64
65
66
67 static {
68 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.ANALYSIS_NAME, MoneyWiseXAnalysisTaxBasisBucket::getAnalysis);
69 FIELD_DEFS.declareLocalField(MoneyWiseStaticDataType.TAXBASIS, MoneyWiseXAnalysisTaxBasisBucket::getTaxBasis);
70 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.BUCKET_BASEVALUES, MoneyWiseXAnalysisTaxBasisBucket::getBaseValues);
71 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.BUCKET_HISTORY, MoneyWiseXAnalysisTaxBasisBucket::getHistoryMap);
72 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.TAXBASIS_ACCOUNTLIST, MoneyWiseXAnalysisTaxBasisBucket::getAccounts);
73 FIELD_DEFS.declareLocalFieldsForEnum(MoneyWiseXAnalysisTaxBasisAttr.class, MoneyWiseXAnalysisTaxBasisBucket::getAttributeValue);
74 }
75
76
77
78
79 private static final MetisDataFieldId NAME_TOTALS = MoneyWiseXAnalysisBucketResource.ANALYSIS_TOTALS;
80
81
82
83
84 private final MoneyWiseXAnalysis theAnalysis;
85
86
87
88
89 private final MoneyWiseTaxBasis theTaxBasis;
90
91
92
93
94 private final MoneyWiseXAnalysisTaxBasisValues theValues;
95
96
97
98
99 private final MoneyWiseXAnalysisTaxBasisValues theBaseValues;
100
101
102
103
104 private final MoneyWiseXAnalysisHistory<MoneyWiseXAnalysisTaxBasisValues, MoneyWiseXAnalysisTaxBasisAttr> theHistory;
105
106
107
108
109 private final boolean hasAccounts;
110
111
112
113
114 private final boolean isExpense;
115
116
117
118
119 private final MoneyWiseXAnalysisTaxBasisAccountBucketList theAccounts;
120
121
122
123
124
125
126
127 protected MoneyWiseXAnalysisTaxBasisBucket(final MoneyWiseXAnalysis pAnalysis,
128 final MoneyWiseTaxBasis pTaxBasis) {
129
130 theTaxBasis = pTaxBasis;
131 theAnalysis = pAnalysis;
132 isExpense = theTaxBasis != null
133 && theTaxBasis.getTaxClass().isExpense();
134
135
136 final MoneyWiseCurrency myDefault = theAnalysis.getCurrency();
137 final Currency myCurrency = myDefault == null
138 ? MoneyWiseXAnalysisAccountBucket.DEFAULT_CURRENCY
139 : myDefault.getCurrency();
140 final MoneyWiseXAnalysisTaxBasisValues myValues = new MoneyWiseXAnalysisTaxBasisValues(myCurrency);
141 theHistory = new MoneyWiseXAnalysisHistory<>(myValues);
142
143
144 hasAccounts = theTaxBasis != null
145 && !(this instanceof MoneyWiseXAnalysisTaxBasisAccountBucket)
146 && theTaxBasis.getTaxClass().analyseAccounts();
147 theAccounts = hasAccounts
148 ? new MoneyWiseXAnalysisTaxBasisAccountBucketList(theAnalysis, this)
149 : null;
150
151
152 theValues = theHistory.getValues();
153 theBaseValues = theHistory.getBaseValues();
154 }
155
156
157
158
159
160
161
162
163 protected MoneyWiseXAnalysisTaxBasisBucket(final MoneyWiseXAnalysis pAnalysis,
164 final MoneyWiseXAnalysisTaxBasisBucket pBase,
165 final OceanusDate pDate) {
166
167 theTaxBasis = pBase.getTaxBasis();
168 theAnalysis = pAnalysis;
169 isExpense = pBase.isExpense();
170
171
172 theHistory = new MoneyWiseXAnalysisHistory<>(pBase.getHistoryMap(), pDate);
173
174
175 hasAccounts = pBase.hasAccounts();
176 theAccounts = hasAccounts
177 ? new MoneyWiseXAnalysisTaxBasisAccountBucketList(theAnalysis, this, pBase.getAccounts(), pDate)
178 : null;
179
180
181 theValues = theHistory.getValues();
182 theBaseValues = theHistory.getBaseValues();
183 }
184
185
186
187
188
189
190
191
192 protected MoneyWiseXAnalysisTaxBasisBucket(final MoneyWiseXAnalysis pAnalysis,
193 final MoneyWiseXAnalysisTaxBasisBucket pBase,
194 final OceanusDateRange pRange) {
195
196 theTaxBasis = pBase.getTaxBasis();
197 theAnalysis = pAnalysis;
198 isExpense = pBase.isExpense();
199
200
201 theHistory = new MoneyWiseXAnalysisHistory<>(pBase.getHistoryMap(), pRange);
202
203
204 hasAccounts = pBase.hasAccounts();
205 theAccounts = hasAccounts
206 ? new MoneyWiseXAnalysisTaxBasisAccountBucketList(theAnalysis, this, pBase.getAccounts(), pRange)
207 : null;
208
209
210 theValues = theHistory.getValues();
211 theBaseValues = theHistory.getBaseValues();
212 }
213
214 @Override
215 public MetisFieldSet<? extends MoneyWiseXAnalysisTaxBasisBucket> getDataFieldSet() {
216 return FIELD_DEFS;
217 }
218
219 @Override
220 public String formatObject(final OceanusDataFormatter pFormatter) {
221 return toString();
222 }
223
224 @Override
225 public String toString() {
226 return getName() + " " + theValues;
227 }
228
229 @Override
230 public Integer getIndexedId() {
231 return theTaxBasis.getIndexedId();
232 }
233
234 @Override
235 public Long getBucketId() {
236 return MoneyWiseAssetType.createExternalId(MoneyWiseAssetType.TAXBASIS, getIndexedId());
237 }
238
239
240
241
242
243
244 public String getName() {
245 return theTaxBasis == null
246 ? NAME_TOTALS.getId()
247 : theTaxBasis.getName();
248 }
249
250
251
252
253
254
255 public MoneyWiseTaxBasis getTaxBasis() {
256 return theTaxBasis;
257 }
258
259
260
261
262
263
264 public boolean hasAccounts() {
265 return hasAccounts;
266 }
267
268
269
270
271
272
273 public boolean isExpense() {
274 return isExpense;
275 }
276
277
278
279
280
281
282 private MoneyWiseXAnalysisTaxBasisAccountBucketList getAccounts() {
283 return theAccounts;
284 }
285
286
287
288
289
290
291 public Iterator<MoneyWiseXAnalysisTaxBasisAccountBucket> accountIterator() {
292 return hasAccounts
293 ? theAccounts.iterator()
294 : null;
295 }
296
297
298
299
300
301
302
303 public MoneyWiseXAnalysisTaxBasisAccountBucket findAccountBucket(final MoneyWiseTransAsset pAccount) {
304 return hasAccounts
305 ? theAccounts.findBucket(pAccount)
306 : null;
307 }
308
309
310
311
312
313
314 public boolean isIdle() {
315 return theHistory.isIdle();
316 }
317
318
319
320
321
322
323 public MoneyWiseXAnalysisTaxBasisValues getValues() {
324 return theValues;
325 }
326
327
328
329
330
331
332
333 public OceanusMoney getMoneyValue(final MoneyWiseXAnalysisTaxBasisAttr pAttr) {
334 return theValues.getMoneyValue(pAttr);
335 }
336
337
338
339
340
341
342 public MoneyWiseXAnalysisTaxBasisValues getBaseValues() {
343 return theBaseValues;
344 }
345
346
347
348
349
350
351
352 public MoneyWiseXAnalysisTaxBasisValues getValuesForEvent(final MoneyWiseXAnalysisEvent pEvent) {
353
354 return theHistory.getValuesForEvent(pEvent);
355 }
356
357
358
359
360
361
362
363 public MoneyWiseXAnalysisTaxBasisValues getPreviousValuesForEvent(final MoneyWiseXAnalysisEvent pEvent) {
364 return theHistory.getPreviousValuesForEvent(pEvent);
365 }
366
367
368
369
370
371
372
373
374 public OceanusDecimal getDeltaForEvent(final MoneyWiseXAnalysisEvent pEvent,
375 final MoneyWiseXAnalysisTaxBasisAttr pAttr) {
376
377 return theHistory.getDeltaValue(pEvent, pAttr);
378 }
379
380
381
382
383
384
385 private MoneyWiseXAnalysisHistory<MoneyWiseXAnalysisTaxBasisValues, MoneyWiseXAnalysisTaxBasisAttr> getHistoryMap() {
386 return theHistory;
387 }
388
389
390
391
392
393
394 protected MoneyWiseXAnalysis getAnalysis() {
395 return theAnalysis;
396 }
397
398
399
400
401
402
403 public OceanusDateRange getDateRange() {
404 return theAnalysis.getDateRange();
405 }
406
407
408
409
410
411
412
413 protected void setValue(final MoneyWiseXAnalysisTaxBasisAttr pAttr,
414 final OceanusMoney pValue) {
415
416 theValues.setValue(pAttr, pValue);
417 }
418
419
420
421
422
423
424
425 private Object getAttributeValue(final MoneyWiseXAnalysisTaxBasisAttr pAttr) {
426
427 final Object myValue = getValue(pAttr);
428
429
430 return myValue != null
431 ? myValue
432 : MetisDataFieldValue.SKIP;
433 }
434
435
436
437
438
439
440
441 private Object getValue(final MoneyWiseXAnalysisTaxBasisAttr pAttr) {
442
443 return theValues.getValue(pAttr);
444 }
445
446
447
448
449
450
451 public void adjustGrossAndNett(final OceanusMoney pAmount) {
452 adjustGrossAndNett(null, pAmount);
453 }
454
455
456
457
458
459
460 public void adjustGross(final OceanusMoney pAmount) {
461 adjustGross(null, pAmount);
462 }
463
464
465
466
467
468
469 public void adjustGrossAndTax(final OceanusMoney pAmount) {
470 adjustGrossAndTax(null, pAmount);
471 }
472
473
474
475
476
477
478
479
480 public MoneyWiseXAnalysisTaxBasisAccountBucket adjustGrossAndNett(final MoneyWiseTransAsset pAccount,
481 final OceanusMoney pAmount) {
482 return adjustValue(pAccount, pAmount, MoneyWiseXTaxBasisAdjust.STANDARD);
483 }
484
485
486
487
488
489
490
491
492 public MoneyWiseXAnalysisTaxBasisAccountBucket adjustGross(final MoneyWiseTransAsset pAccount,
493 final OceanusMoney pAmount) {
494 return adjustValue(pAccount, pAmount, MoneyWiseXTaxBasisAdjust.GROSS);
495 }
496
497
498
499
500
501
502
503
504 public MoneyWiseXAnalysisTaxBasisAccountBucket adjustGrossAndTax(final MoneyWiseTransAsset pAccount,
505 final OceanusMoney pAmount) {
506 return adjustValue(pAccount, pAmount, MoneyWiseXTaxBasisAdjust.TAXCREDIT);
507 }
508
509
510
511
512
513
514
515
516
517 MoneyWiseXAnalysisTaxBasisAccountBucket adjustValue(final MoneyWiseTransAsset pAccount,
518 final OceanusMoney pValue,
519 final MoneyWiseXTaxBasisAdjust pAdjust) {
520
521 OceanusMoney myGross = theValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.GROSS);
522 myGross = new OceanusMoney(myGross);
523
524
525 if (isExpense) {
526 myGross.subtractAmount(pValue);
527 } else {
528 myGross.addAmount(pValue);
529 }
530
531
532 setValue(MoneyWiseXAnalysisTaxBasisAttr.GROSS, myGross);
533
534
535 if (pAdjust.adjustNett()) {
536
537 OceanusMoney myNett = theValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.NETT);
538 myNett = new OceanusMoney(myNett);
539
540
541 if (isExpense) {
542 myNett.subtractAmount(pValue);
543 } else {
544 myNett.addAmount(pValue);
545 }
546
547
548 setValue(MoneyWiseXAnalysisTaxBasisAttr.NETT, myNett);
549 }
550
551
552 if (pAdjust.adjustTaxCredit()) {
553
554 OceanusMoney myTax = theValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.TAXCREDIT);
555 myTax = new OceanusMoney(myTax);
556
557
558 if (isExpense) {
559 myTax.subtractAmount(pValue);
560 } else {
561 myTax.addAmount(pValue);
562 }
563
564
565 setValue(MoneyWiseXAnalysisTaxBasisAttr.TAXCREDIT, myTax);
566 }
567
568
569 return hasAccounts && pAccount != null
570 ? theAccounts.adjustValue(pAccount, pValue, pAdjust)
571 : null;
572 }
573
574 @Override
575 public void registerEvent(final MoneyWiseXAnalysisEvent pEvent) {
576
577 theHistory.registerEvent(pEvent, theValues);
578 }
579
580
581
582
583
584
585 protected void addValues(final MoneyWiseXAnalysisTaxBasisBucket pBucket) {
586
587 OceanusMoney myAmount = theValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.GROSS);
588 myAmount.addAmount(pBucket.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.GROSS));
589 myAmount = theValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.NETT);
590 myAmount.addAmount(pBucket.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.NETT));
591 }
592
593
594
595
596 protected void adjustToBase() {
597
598 theValues.adjustToBaseValues(theBaseValues);
599 theBaseValues.resetBaseValues();
600 }
601
602
603
604
605 public enum MoneyWiseXTaxBasisAdjust {
606
607
608
609 STANDARD,
610
611
612
613
614 GROSS,
615
616
617
618
619 TAXCREDIT;
620
621
622
623
624
625
626 private boolean adjustNett() {
627 return this == STANDARD;
628 }
629
630
631
632
633
634
635 private boolean adjustTaxCredit() {
636 return this == TAXCREDIT;
637 }
638 }
639
640
641
642
643 public static class MoneyWiseXAnalysisTaxBasisBucketList
644 implements MetisFieldItem, MoneyWiseTaxSource, MetisDataList<MoneyWiseXAnalysisTaxBasisBucket> {
645
646
647
648 private static final MetisFieldSet<MoneyWiseXAnalysisTaxBasisBucketList> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseXAnalysisTaxBasisBucketList.class);
649
650
651
652
653 static {
654 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.ANALYSIS_NAME, MoneyWiseXAnalysisTaxBasisBucketList::getAnalysis);
655 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.ANALYSIS_CHARGES, MoneyWiseXAnalysisTaxBasisBucketList::getGainSlices);
656 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.ANALYSIS_TOTALS, MoneyWiseXAnalysisTaxBasisBucketList::getTotals);
657 }
658
659
660
661
662 private final MoneyWiseXAnalysis theAnalysis;
663
664
665
666
667 private final MetisListIndexed<MoneyWiseXAnalysisTaxBasisBucket> theList;
668
669
670
671
672 private final PrometheusEditSet theEditSet;
673
674
675
676
677 private final MoneyWiseChargeableGainSliceList theCharges;
678
679
680
681
682 private final MoneyWiseXAnalysisTaxBasisBucket theTotals;
683
684
685
686
687
688
689
690 private MoneyWiseXAnalysisTaxBasisBucketList(final MoneyWiseXAnalysis pAnalysis,
691 final MoneyWiseChargeableGainSliceList pGains) {
692 theAnalysis = pAnalysis;
693 theEditSet = theAnalysis.getEditSet();
694 theCharges = pGains;
695 theTotals = allocateTotalsBucket();
696 theList = new MetisListIndexed<>();
697 theList.setComparator(Comparator.comparing(MoneyWiseXAnalysisTaxBasisBucket::getTaxBasis));
698 }
699
700
701
702
703
704
705 protected MoneyWiseXAnalysisTaxBasisBucketList(final MoneyWiseXAnalysis pAnalysis) {
706 this(pAnalysis, new MoneyWiseChargeableGainSliceList());
707 }
708
709
710
711
712
713
714
715
716 protected MoneyWiseXAnalysisTaxBasisBucketList(final MoneyWiseXAnalysis pAnalysis,
717 final MoneyWiseXAnalysisTaxBasisBucketList pBase,
718 final OceanusDate pDate) {
719
720 this(pAnalysis, new MoneyWiseChargeableGainSliceList(pBase.getGainSlices(), pAnalysis.getDateRange()));
721
722
723 final Iterator<MoneyWiseXAnalysisTaxBasisBucket> myIterator = pBase.iterator();
724 while (myIterator.hasNext()) {
725 final MoneyWiseXAnalysisTaxBasisBucket myCurr = myIterator.next();
726
727
728 final MoneyWiseXAnalysisTaxBasisBucket myBucket = new MoneyWiseXAnalysisTaxBasisBucket(pAnalysis, myCurr, pDate);
729
730
731 if (!myBucket.isIdle()) {
732
733 theList.add(myBucket);
734 }
735 }
736 }
737
738
739
740
741
742
743
744
745 protected MoneyWiseXAnalysisTaxBasisBucketList(final MoneyWiseXAnalysis pAnalysis,
746 final MoneyWiseXAnalysisTaxBasisBucketList pBase,
747 final OceanusDateRange pRange) {
748
749 this(pAnalysis, new MoneyWiseChargeableGainSliceList(pBase.getGainSlices(), pAnalysis.getDateRange()));
750
751
752 final Iterator<MoneyWiseXAnalysisTaxBasisBucket> myIterator = pBase.iterator();
753 while (myIterator.hasNext()) {
754 final MoneyWiseXAnalysisTaxBasisBucket myCurr = myIterator.next();
755
756
757 final MoneyWiseXAnalysisTaxBasisBucket myBucket = new MoneyWiseXAnalysisTaxBasisBucket(pAnalysis, myCurr, pRange);
758
759
760 if (!myBucket.isIdle()) {
761
762 myBucket.adjustToBase();
763 theList.add(myBucket);
764 }
765 }
766 }
767
768 @Override
769 public MetisFieldSet<MoneyWiseXAnalysisTaxBasisBucketList> getDataFieldSet() {
770 return FIELD_DEFS;
771 }
772
773 @Override
774 public List<MoneyWiseXAnalysisTaxBasisBucket> getUnderlyingList() {
775 return theList.getUnderlyingList();
776 }
777
778 @Override
779 public String formatObject(final OceanusDataFormatter pFormatter) {
780 return getDataFieldSet().getName();
781 }
782
783
784
785
786
787
788 protected MoneyWiseXAnalysis getAnalysis() {
789 return theAnalysis;
790 }
791
792
793
794
795
796
797
798 public MoneyWiseXAnalysisTaxBasisBucket findItemById(final Integer pId) {
799
800 return theList.getItemById(pId);
801 }
802
803 @Override
804 public MoneyWiseChargeableGainSliceList getGainSlices() {
805 return theCharges;
806 }
807
808
809
810
811
812
813 public MoneyWiseXAnalysisTaxBasisBucket getTotals() {
814 return theTotals;
815 }
816
817
818
819
820
821
822 private MoneyWiseXAnalysisTaxBasisBucket allocateTotalsBucket() {
823
824 return new MoneyWiseXAnalysisTaxBasisBucket(theAnalysis, null);
825 }
826
827
828
829
830
831
832
833 public MoneyWiseXAnalysisTaxBasisBucket getBucket(final MoneyWiseTaxClass pClass) {
834
835 final MoneyWiseTaxBasis myBasis = theEditSet.getDataList(MoneyWiseStaticDataType.TAXBASIS, MoneyWiseTaxBasisList.class).findItemByClass(pClass);
836 MoneyWiseXAnalysisTaxBasisBucket myItem = findItemById(myBasis.getIndexedId());
837
838
839 if (myItem == null) {
840
841 myItem = new MoneyWiseXAnalysisTaxBasisBucket(theAnalysis, myBasis);
842
843
844 theList.add(myItem);
845 }
846
847
848 return myItem;
849 }
850
851
852
853
854
855
856
857 public MoneyWiseXAnalysisTaxBasisBucket getMatchingBasis(final MoneyWiseXAnalysisTaxBasisBucket pTaxBasis) {
858
859 MoneyWiseXAnalysisTaxBasisBucket myBasis = findItemById(pTaxBasis.getTaxBasis().getIndexedId());
860 if (myBasis == null) {
861 myBasis = new MoneyWiseXAnalysisTaxBasisBucket(theAnalysis, pTaxBasis.getTaxBasis());
862 }
863
864
865 if (pTaxBasis instanceof MoneyWiseXAnalysisTaxBasisAccountBucket myBucket) {
866
867 final MoneyWiseTransAsset myAsset = myBucket.getAccount();
868 MoneyWiseXAnalysisTaxBasisAccountBucket myAccountBucket = myBasis.findAccountBucket(myAsset);
869
870
871 if (myAccountBucket == null) {
872
873 myAccountBucket = new MoneyWiseXAnalysisTaxBasisAccountBucket(theAnalysis, myBasis, myAsset);
874 }
875
876
877 myBasis = myAccountBucket;
878 }
879
880
881 return myBasis;
882 }
883
884
885
886
887
888
889 public MoneyWiseXAnalysisTaxBasisBucket getDefaultBasis() {
890
891 return isEmpty()
892 ? null
893 : theList.getUnderlyingList().get(0);
894 }
895
896
897
898
899
900
901
902
903
904 public void recordChargeableGain(final MoneyWiseTransaction pTrans,
905 final OceanusMoney pGain,
906 final OceanusMoney pSlice,
907 final Integer pYears) {
908
909 theCharges.addTransaction(pTrans, pGain, pSlice, pYears);
910 }
911
912
913
914
915 public void produceTotals() {
916
917 final Iterator<MoneyWiseXAnalysisTaxBasisBucket> myIterator = iterator();
918 while (myIterator.hasNext()) {
919 final MoneyWiseXAnalysisTaxBasisBucket myBucket = myIterator.next();
920
921
922 if (myBucket.isIdle()) {
923 myIterator.remove();
924 continue;
925 }
926
927
928 if (myBucket.hasAccounts()) {
929 myBucket.getAccounts().sortBuckets();
930 }
931
932
933 theTotals.addValues(myBucket);
934 }
935
936
937 theList.sortList();
938 }
939
940 @Override
941 public OceanusMoney getAmountForTaxBasis(final MoneyWiseTaxClass pBasis) {
942
943 final MoneyWiseXAnalysisTaxBasisBucket myItem = findItemById(pBasis.getClassId());
944
945
946 if (myItem == null) {
947 final MoneyWiseCurrency myAssetCurrency = theAnalysis.getCurrency();
948 final Currency myCurrency = myAssetCurrency == null
949 ? OceanusMoney.getDefaultCurrency()
950 : myAssetCurrency.getCurrency();
951 return new OceanusMoney(myCurrency);
952 }
953
954 return myItem.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.GROSS);
955 }
956 }
957 }