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