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.base.OceanusException;
20 import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
21 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
22 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusDecimal;
23 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
24 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusPrice;
25 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusRatio;
26 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusUnits;
27 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
28 import io.github.tonywasher.joceanus.metis.data.MetisDataDifference;
29 import io.github.tonywasher.joceanus.metis.data.MetisDataFieldValue;
30 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataList;
31 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem;
32 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem.MetisFieldTableItem;
33 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
34 import io.github.tonywasher.joceanus.metis.list.MetisListIndexed;
35 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.base.MoneyWiseXAnalysisEvent;
36 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.base.MoneyWiseXAnalysisHistory;
37 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisInterfaces.MoneyWiseXAnalysisBucketPriced;
38 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisInterfaces.MoneyWiseXAnalysisCursor;
39 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisSecurityAttr;
40 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisSecurityValues;
41 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
42 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePortfolio;
43 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurity;
44 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurityHolding;
45 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency;
46 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseSecurityClass;
47 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseSecurityType;
48 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
49 import io.github.tonywasher.joceanus.moneywise.exc.MoneyWiseDataException;
50
51 import java.util.Currency;
52 import java.util.Iterator;
53 import java.util.List;
54
55
56
57
58 public final class MoneyWiseXAnalysisSecurityBucket
59 implements MetisFieldTableItem, MoneyWiseXAnalysisBucketPriced {
60
61
62
63 private static final MetisFieldSet<MoneyWiseXAnalysisSecurityBucket> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseXAnalysisSecurityBucket.class);
64
65
66
67
68 static {
69 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.ANALYSIS_NAME, MoneyWiseXAnalysisSecurityBucket::getAnalysis);
70 FIELD_DEFS.declareLocalField(MoneyWiseBasicResource.ASSETTYPE_SECURITYHOLDING, MoneyWiseXAnalysisSecurityBucket::getSecurityHolding);
71 FIELD_DEFS.declareLocalField(MoneyWiseStaticDataType.SECURITYTYPE, MoneyWiseXAnalysisSecurityBucket::getSecurityType);
72 FIELD_DEFS.declareLocalField(MoneyWiseStaticDataType.CURRENCY, MoneyWiseXAnalysisSecurityBucket::getCurrency);
73 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.BUCKET_BASEVALUES, MoneyWiseXAnalysisSecurityBucket::getBaseValues);
74 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.BUCKET_HISTORY, MoneyWiseXAnalysisSecurityBucket::getHistoryMap);
75 FIELD_DEFS.declareLocalFieldsForEnum(MoneyWiseXAnalysisSecurityAttr.class, MoneyWiseXAnalysisSecurityBucket::getAttributeValue);
76 }
77
78
79
80
81 private final MoneyWiseXAnalysis theAnalysis;
82
83
84
85
86 private final MoneyWiseSecurityHolding theHolding;
87
88
89
90
91 private final MoneyWiseSecurity theSecurity;
92
93
94
95
96 private final MoneyWisePortfolio thePortfolio;
97
98
99
100
101 private final MoneyWiseCurrency theCurrency;
102
103
104
105
106 private final boolean isForeignCurrency;
107
108
109
110
111 private final boolean isStockOption;
112
113
114
115
116 private final MoneyWiseSecurityType theCategory;
117
118
119
120
121 private final MoneyWiseXAnalysisSecurityValues theValues;
122
123
124
125
126 private final MoneyWiseXAnalysisSecurityValues theBaseValues;
127
128
129
130
131 private final MoneyWiseXAnalysisHistory<MoneyWiseXAnalysisSecurityValues, MoneyWiseXAnalysisSecurityAttr> theHistory;
132
133
134
135
136
137
138
139 MoneyWiseXAnalysisSecurityBucket(final MoneyWiseXAnalysis pAnalysis,
140 final MoneyWiseSecurityHolding pHolding) {
141
142 theHolding = pHolding;
143 theCurrency = pHolding.getAssetCurrency();
144 theSecurity = pHolding.getSecurity();
145 thePortfolio = pHolding.getPortfolio();
146 theAnalysis = pAnalysis;
147
148
149 theCategory = theSecurity.getCategory();
150
151
152 final MoneyWiseCurrency myReportingCurrency = pAnalysis.getCurrency();
153 final MoneyWiseCurrency myHoldingCurrency = pHolding.getAssetCurrency();
154
155
156 isForeignCurrency = !MetisDataDifference.isEqual(myReportingCurrency, myHoldingCurrency);
157 final Currency myCurrency = MoneyWiseXAnalysisAccountBucket.deriveCurrency(myHoldingCurrency);
158 final Currency myRepCurrency = MoneyWiseXAnalysisAccountBucket.deriveCurrency(myReportingCurrency);
159
160
161 isStockOption = theSecurity.getUnderlyingStock() != null;
162
163
164 final MoneyWiseXAnalysisSecurityValues myValues = new MoneyWiseXAnalysisSecurityValues(myCurrency, myRepCurrency);
165 theHistory = new MoneyWiseXAnalysisHistory<>(myValues);
166
167
168 theValues = theHistory.getValues();
169 theBaseValues = theHistory.getBaseValues();
170
171
172 final MoneyWiseXAnalysisCursor myCursor = theAnalysis.getCursor();
173 myCursor.registerForPriceUpdates(this);
174
175
176 recordSecurityPrice();
177
178
179 if (isForeignCurrency) {
180
181 myCursor.registerForXchgRateUpdates(this);
182
183
184 recordExchangeRate();
185 theBaseValues.setValue(MoneyWiseXAnalysisSecurityAttr.EXCHANGERATE, getValue(MoneyWiseXAnalysisSecurityAttr.EXCHANGERATE));
186
187
188 final OceanusMoney myReported = new OceanusMoney(theAnalysis.getCurrency().getCurrency());
189 theValues.setValue(MoneyWiseXAnalysisSecurityAttr.VALUATION, myReported);
190 theBaseValues.setValue(MoneyWiseXAnalysisSecurityAttr.VALUATION, myReported);
191 }
192 }
193
194
195
196
197
198
199
200
201 private MoneyWiseXAnalysisSecurityBucket(final MoneyWiseXAnalysis pAnalysis,
202 final MoneyWiseXAnalysisSecurityBucket pBase,
203 final OceanusDate pDate) {
204
205 theHolding = pBase.getSecurityHolding();
206 theCurrency = pBase.getCurrency();
207 theSecurity = pBase.getSecurity();
208 thePortfolio = pBase.getPortfolio();
209 theCategory = pBase.getSecurityType();
210 theAnalysis = pAnalysis;
211 isForeignCurrency = pBase.isForeignCurrency();
212 isStockOption = pBase.isStockOption();
213
214
215 theHistory = new MoneyWiseXAnalysisHistory<>(pBase.getHistoryMap(), pDate);
216
217
218 theValues = theHistory.getValues();
219 theBaseValues = theHistory.getBaseValues();
220 }
221
222
223
224
225
226
227
228
229 private MoneyWiseXAnalysisSecurityBucket(final MoneyWiseXAnalysis pAnalysis,
230 final MoneyWiseXAnalysisSecurityBucket pBase,
231 final OceanusDateRange pRange) {
232
233 theHolding = pBase.getSecurityHolding();
234 theCurrency = pBase.getCurrency();
235 theSecurity = pBase.getSecurity();
236 thePortfolio = pBase.getPortfolio();
237 theCategory = pBase.getSecurityType();
238 theAnalysis = pAnalysis;
239 isForeignCurrency = pBase.isForeignCurrency();
240 isStockOption = pBase.isStockOption();
241
242
243 theHistory = new MoneyWiseXAnalysisHistory<>(pBase.getHistoryMap(), pRange);
244
245
246 theValues = theHistory.getValues();
247 theBaseValues = theHistory.getBaseValues();
248 }
249
250 @Override
251 public MetisFieldSet<MoneyWiseXAnalysisSecurityBucket> getDataFieldSet() {
252 return FIELD_DEFS;
253 }
254
255 @Override
256 public String formatObject(final OceanusDataFormatter pFormatter) {
257 return toString();
258 }
259
260 @Override
261 public Long getBucketId() {
262 return theHolding.getExternalId();
263 }
264
265 @Override
266 public String toString() {
267 return getDecoratedName() + " " + theValues;
268 }
269
270
271
272
273
274
275 public String getSecurityName() {
276 return theSecurity.getName();
277 }
278
279
280
281
282
283
284 public String getDecoratedName() {
285 return theHolding.getName();
286 }
287
288
289
290
291
292
293 public MoneyWiseSecurityHolding getSecurityHolding() {
294 return theHolding;
295 }
296
297 @Override
298 public MoneyWiseSecurity getSecurity() {
299 return theSecurity;
300 }
301
302
303
304
305
306
307 public MoneyWisePortfolio getPortfolio() {
308 return thePortfolio;
309 }
310
311 @Override
312 public MoneyWiseCurrency getCurrency() {
313 return theCurrency;
314 }
315
316
317
318
319
320
321 public boolean isForeignCurrency() {
322 return isForeignCurrency;
323 }
324
325 @Override
326 public boolean isStockOption() {
327 return isStockOption;
328 }
329
330 @Override
331 public Integer getIndexedId() {
332 return theSecurity.getIndexedId();
333 }
334
335
336
337
338
339
340 public MoneyWiseSecurityType getSecurityType() {
341 return theCategory;
342 }
343
344
345
346
347
348
349 public boolean isIdle() {
350 return theHistory.isIdle();
351 }
352
353
354
355
356
357
358 MoneyWiseXAnalysis getAnalysis() {
359 return theAnalysis;
360 }
361
362
363
364
365
366
367 public OceanusDateRange getDateRange() {
368 return theAnalysis.getDateRange();
369 }
370
371
372
373
374
375
376 public MoneyWiseXAnalysisSecurityValues getValues() {
377 return theValues;
378 }
379
380
381
382
383
384
385 public MoneyWiseXAnalysisSecurityValues getBaseValues() {
386 return theBaseValues;
387 }
388
389
390
391
392
393
394
395 public MoneyWiseXAnalysisSecurityValues getValuesForEvent(final MoneyWiseXAnalysisEvent pEvent) {
396 return theHistory.getValuesForEvent(pEvent);
397 }
398
399
400
401
402
403
404
405 public MoneyWiseXAnalysisSecurityValues getPreviousValuesForEvent(final MoneyWiseXAnalysisEvent pEvent) {
406 return theHistory.getPreviousValuesForEvent(pEvent);
407 }
408
409
410
411
412
413
414
415
416 public OceanusDecimal getDeltaForEvent(final MoneyWiseXAnalysisEvent pEvent,
417 final MoneyWiseXAnalysisSecurityAttr pAttr) {
418
419 return theHistory.getDeltaValue(pEvent, pAttr);
420 }
421
422
423
424
425
426
427
428
429 public OceanusMoney getMoneyDeltaForEvent(final MoneyWiseXAnalysisEvent pEvent,
430 final MoneyWiseXAnalysisSecurityAttr pAttr) {
431
432 return theHistory.getDeltaMoneyValue(pEvent, pAttr);
433 }
434
435
436
437
438
439
440
441
442 public OceanusUnits getUnitsDeltaForEvent(final MoneyWiseXAnalysisEvent pEvent,
443 final MoneyWiseXAnalysisSecurityAttr pAttr) {
444
445 return theHistory.getDeltaUnitsValue(pEvent, pAttr);
446 }
447
448
449
450
451
452
453 private MoneyWiseXAnalysisHistory<MoneyWiseXAnalysisSecurityValues, MoneyWiseXAnalysisSecurityAttr> getHistoryMap() {
454 return theHistory;
455 }
456
457
458
459
460
461
462
463 public void setValue(final MoneyWiseXAnalysisSecurityAttr pAttr,
464 final Object pValue) {
465
466 theValues.setValue(pAttr, pValue);
467 }
468
469
470
471
472
473
474
475 private Object getAttributeValue(final MoneyWiseXAnalysisSecurityAttr pAttr) {
476
477 final Object myValue = getValue(pAttr);
478
479
480 return myValue != null
481 ? myValue
482 : MetisDataFieldValue.SKIP;
483 }
484
485
486
487
488
489
490
491 private Object getValue(final MoneyWiseXAnalysisSecurityAttr pAttr) {
492
493 return theValues.getValue(pAttr);
494 }
495
496
497
498
499
500
501 public void adjustUnits(final OceanusUnits pDelta) {
502 OceanusUnits myValue = theValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
503 myValue = new OceanusUnits(myValue);
504 myValue.addUnits(pDelta);
505 setValue(MoneyWiseXAnalysisSecurityAttr.UNITS, myValue);
506 }
507
508
509
510
511
512
513 public void adjustResidualCost(final OceanusMoney pDelta) {
514 OceanusMoney myValue = theValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST);
515 myValue = new OceanusMoney(myValue);
516 myValue.addAmount(pDelta);
517 setValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST, myValue);
518 }
519
520
521
522
523
524
525 public void adjustRealisedGains(final OceanusMoney pDelta) {
526 OceanusMoney myValue = theValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.REALISEDGAINS);
527 myValue = new OceanusMoney(myValue);
528 myValue.addAmount(pDelta);
529 setValue(MoneyWiseXAnalysisSecurityAttr.REALISEDGAINS, myValue);
530 }
531
532
533
534
535
536
537 public void adjustDividend(final OceanusMoney pDelta) {
538 OceanusMoney myValue = theValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.DIVIDEND);
539 myValue = new OceanusMoney(myValue);
540 myValue.addAmount(pDelta);
541 setValue(MoneyWiseXAnalysisSecurityAttr.DIVIDEND, myValue);
542 }
543
544
545
546
547
548
549 public void adjustFunded(final OceanusMoney pDelta) {
550 OceanusMoney myValue = theValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.FUNDED);
551 myValue = new OceanusMoney(myValue);
552 myValue.addAmount(pDelta);
553 setValue(MoneyWiseXAnalysisSecurityAttr.FUNDED, myValue);
554 }
555
556
557
558
559
560
561 public void ensureStartDate(final OceanusDate pDate) {
562 if (theValues.getValue(MoneyWiseXAnalysisSecurityAttr.STARTDATE) == null) {
563 setValue(MoneyWiseXAnalysisSecurityAttr.STARTDATE, pDate);
564 }
565 }
566
567 @Override
568 public void calculateUnrealisedGains() {
569
570 OceanusMoney myValue = theValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.VALUATION);
571 myValue = new OceanusMoney(myValue);
572 myValue.subtractAmount(theValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST));
573 setValue(MoneyWiseXAnalysisSecurityAttr.UNREALISEDGAINS, myValue);
574 }
575
576 @Override
577 public void recordSecurityPrice() {
578
579 final MoneyWiseXAnalysisCursor myCursor = theAnalysis.getCursor();
580 OceanusPrice myPrice = myCursor.getCurrentPrice(getSecurity());
581
582
583 if (isStockOption) {
584
585 myPrice = new OceanusPrice(myPrice);
586 myPrice.subtractPrice(getSecurity().getOptionPrice());
587 if (!myPrice.isPositive()) {
588 myPrice.setZero();
589 }
590 }
591
592
593 final OceanusMoney myFunded = new OceanusMoney(theValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.FUNDED));
594 if (myFunded.isNonZero()) {
595
596 theValues.setZeroMoney(MoneyWiseXAnalysisSecurityAttr.FUNDED);
597
598
599 final MoneyWiseSecurityClass mySecClass = getSecurity().getCategoryClass();
600 final OceanusUnits myUnits = theValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
601 if (myUnits.isZero() && mySecClass.isAutoUnits()) {
602 final OceanusUnits myAutoUnits = OceanusUnits.getWholeUnits(mySecClass.getAutoUnits());
603 theValues.setValue(MoneyWiseXAnalysisSecurityAttr.UNITS, myAutoUnits);
604 }
605 }
606
607
608 theValues.setValue(MoneyWiseXAnalysisSecurityAttr.PRICE, myPrice);
609 }
610
611 @Override
612 public void recordExchangeRate() {
613 final MoneyWiseXAnalysisCursor myCursor = theAnalysis.getCursor();
614 final OceanusRatio myRate = myCursor.getCurrentXchgRate(getSecurity().getAssetCurrency());
615 theValues.setValue(MoneyWiseXAnalysisSecurityAttr.EXCHANGERATE, myRate);
616 }
617
618 @Override
619 public void registerEvent(final MoneyWiseXAnalysisEvent pEvent) {
620
621 theHistory.registerEvent(pEvent, theValues);
622 }
623
624 @Override
625 public void valueAsset() {
626
627 final OceanusUnits myUnits = theValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
628 final OceanusPrice myPrice = theValues.getPriceValue(MoneyWiseXAnalysisSecurityAttr.PRICE);
629
630
631 final OceanusMoney myLocalValue = myUnits.valueAtPrice(myPrice);
632 setValue(MoneyWiseXAnalysisSecurityAttr.VALUE, myLocalValue);
633
634
635 adjustValuation();
636 }
637
638 @Override
639 public void adjustValuation() {
640
641 OceanusMoney myBalance = theValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.VALUE);
642
643
644 if (isForeignCurrency) {
645
646 final OceanusRatio myRate = theValues.getRatioValue(MoneyWiseXAnalysisSecurityAttr.EXCHANGERATE);
647 myBalance = myBalance.convertCurrency(theAnalysis.getCurrency().getCurrency(), myRate);
648 }
649
650
651 final OceanusMoney myFunded = theValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.FUNDED);
652 if (myFunded.isNonZero()) {
653
654 myBalance.addAmount(myFunded);
655 }
656
657
658 theValues.setValue(MoneyWiseXAnalysisSecurityAttr.VALUATION, myBalance);
659 }
660
661 @Override
662 public OceanusMoney getDeltaValuation() {
663
664 final OceanusMoney myDelta = new OceanusMoney(theValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.VALUATION));
665 myDelta.subtractAmount(theHistory.getLastValues().getMoneyValue(MoneyWiseXAnalysisSecurityAttr.VALUATION));
666 return myDelta;
667 }
668
669
670
671
672
673
674 public OceanusMoney getDeltaUnrealisedGains() {
675
676 final OceanusMoney myDelta = new OceanusMoney(theValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.UNREALISEDGAINS));
677 myDelta.subtractAmount(theHistory.getLastValues().getMoneyValue(MoneyWiseXAnalysisSecurityAttr.UNREALISEDGAINS));
678 return myDelta;
679 }
680
681
682
683
684 private void calculateDeltas() {
685
686 OceanusMoney myValue = theValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.VALUATION);
687 myValue = new OceanusMoney(myValue);
688
689
690 myValue.subtractAmount(theBaseValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.VALUATION));
691
692
693 setValue(MoneyWiseXAnalysisSecurityAttr.VALUEDELTA, myValue);
694 }
695
696
697
698
699 void adjustToBase() {
700
701 theValues.adjustToBaseValues(theBaseValues);
702 theBaseValues.resetBaseValues();
703 }
704
705
706
707
708
709
710 public boolean isActive() {
711 return theValues.isActive();
712 }
713
714
715
716
717 public static final class MoneyWiseXAnalysisSecurityBucketList
718 implements MetisFieldItem, MetisDataList<MoneyWiseXAnalysisSecurityBucket> {
719
720
721
722 private static final MetisFieldSet<MoneyWiseXAnalysisSecurityBucketList> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseXAnalysisSecurityBucketList.class);
723
724
725
726
727 static {
728 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.ANALYSIS_NAME, MoneyWiseXAnalysisSecurityBucketList::getAnalysis);
729 }
730
731
732
733
734 private final MoneyWiseXAnalysis theAnalysis;
735
736
737
738
739 private final MetisListIndexed<MoneyWiseXAnalysisSecurityBucket> theList;
740
741
742
743
744
745
746 MoneyWiseXAnalysisSecurityBucketList(final MoneyWiseXAnalysis pAnalysis) {
747 theAnalysis = pAnalysis;
748 theList = new MetisListIndexed<>();
749 theList.setComparator((l, r) -> l.getSecurity().compareTo(r.getSecurity()));
750 }
751
752
753
754
755
756
757
758
759 MoneyWiseXAnalysisSecurityBucketList(final MoneyWiseXAnalysis pAnalysis,
760 final MoneyWiseXAnalysisSecurityBucketList pBase,
761 final OceanusDate pDate) {
762
763 this(pAnalysis);
764
765
766 final Iterator<MoneyWiseXAnalysisSecurityBucket> myIterator = pBase.iterator();
767 while (myIterator.hasNext()) {
768 final MoneyWiseXAnalysisSecurityBucket myCurr = myIterator.next();
769
770
771 final MoneyWiseXAnalysisSecurityBucket myBucket = new MoneyWiseXAnalysisSecurityBucket(pAnalysis, myCurr, pDate);
772
773
774
775
776
777 if (!myBucket.isIdle()) {
778
779 theList.add(myBucket);
780 }
781 }
782 }
783
784
785
786
787
788
789
790
791 MoneyWiseXAnalysisSecurityBucketList(final MoneyWiseXAnalysis pAnalysis,
792 final MoneyWiseXAnalysisSecurityBucketList pBase,
793 final OceanusDateRange pRange) {
794
795 this(pAnalysis);
796
797
798 final Iterator<MoneyWiseXAnalysisSecurityBucket> myIterator = pBase.iterator();
799 while (myIterator.hasNext()) {
800 final MoneyWiseXAnalysisSecurityBucket myCurr = myIterator.next();
801
802
803 final MoneyWiseXAnalysisSecurityBucket myBucket = new MoneyWiseXAnalysisSecurityBucket(pAnalysis, myCurr, pRange);
804
805
806 if (myBucket.isActive() || !myBucket.isIdle()) {
807
808 myBucket.adjustToBase();
809 theList.add(myBucket);
810 }
811 }
812 }
813
814 @Override
815 public MetisFieldSet<MoneyWiseXAnalysisSecurityBucketList> getDataFieldSet() {
816 return FIELD_DEFS;
817 }
818
819 @Override
820 public List<MoneyWiseXAnalysisSecurityBucket> getUnderlyingList() {
821 return theList.getUnderlyingList();
822 }
823
824 @Override
825 public String formatObject(final OceanusDataFormatter pFormatter) {
826 return getDataFieldSet().getName();
827 }
828
829
830
831
832
833
834 MoneyWiseXAnalysis getAnalysis() {
835 return theAnalysis;
836 }
837
838
839
840
841
842
843
844 public MoneyWiseXAnalysisSecurityBucket findItemById(final Integer pId) {
845
846 return theList.getItemById(pId);
847 }
848
849
850
851
852 void sortBuckets() {
853 theList.sortList();
854 }
855
856
857
858
859
860
861
862 public MoneyWiseXAnalysisSecurityBucket getBucket(final MoneyWiseSecurityHolding pHolding) {
863
864 final MoneyWiseSecurity mySecurity = pHolding.getSecurity();
865 MoneyWiseXAnalysisSecurityBucket myItem = findItemById(mySecurity.getIndexedId());
866
867
868 if (myItem == null) {
869
870 myItem = new MoneyWiseXAnalysisSecurityBucket(theAnalysis, pHolding);
871
872
873 theList.add(myItem);
874 }
875
876
877 return myItem;
878 }
879
880
881
882
883
884
885
886 boolean markActiveSecurities() throws OceanusException {
887
888 boolean areActive = false;
889 final Iterator<MoneyWiseXAnalysisSecurityBucket> myIterator = iterator();
890 while (myIterator.hasNext()) {
891 final MoneyWiseXAnalysisSecurityBucket myCurr = myIterator.next();
892 final MoneyWiseSecurity mySecurity = myCurr.getSecurity();
893
894
895 if (myCurr.isActive()) {
896
897 mySecurity.setRelevant();
898 areActive = true;
899 }
900
901
902 if (Boolean.TRUE.equals(mySecurity.isClosed())) {
903
904 mySecurity.adjustClosed();
905
906
907 if (mySecurity.isRelevant()
908 && theAnalysis.getData().checkClosedAccounts()) {
909
910 throw new MoneyWiseDataException(myCurr, "Illegally closed security");
911 }
912 }
913 }
914
915
916 return areActive;
917 }
918 }
919 }