1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.data.basic;
18
19 import io.github.tonywasher.joceanus.metis.data.MetisDataDifference;
20 import io.github.tonywasher.joceanus.metis.data.MetisDataEditState;
21 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataFieldId;
22 import io.github.tonywasher.joceanus.metis.data.MetisDataResource;
23 import io.github.tonywasher.joceanus.metis.data.MetisDataState;
24 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem;
25 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
26 import io.github.tonywasher.joceanus.metis.field.MetisFieldVersionedSet;
27 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee.MoneyWisePayeeList;
28 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePortfolioInfo.MoneyWisePortfolioInfoList;
29 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurityHoldingMapCtl.MoneyWiseSecurityHoldingMapGenerator;
30 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTax.MoneyWiseTaxCredit;
31 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransCategory.MoneyWiseTransCategoryList;
32 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseAccountInfoClass;
33 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseAccountInfoType.MoneyWiseAccountInfoTypeList;
34 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency;
35 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency.MoneyWiseCurrencyList;
36 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePortfolioClass;
37 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePortfolioType;
38 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePortfolioType.MoneyWisePortfolioTypeList;
39 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
40 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryClass;
41 import io.github.tonywasher.joceanus.moneywise.exc.MoneyWiseDataException;
42 import io.github.tonywasher.joceanus.moneywise.exc.MoneyWiseLogicException;
43 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
44 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
45 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataInstanceMap;
46 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
47 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataMapItem;
48 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataResource;
49 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataSet;
50 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataValues;
51 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataValues.PrometheusInfoItem;
52 import io.github.tonywasher.joceanus.prometheus.data.PrometheusEncrypted.PrometheusDataInfoSetItemCtl;
53 import io.github.tonywasher.joceanus.prometheus.data.PrometheusListStyle;
54 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
55
56 import java.util.HashMap;
57 import java.util.Iterator;
58 import java.util.Map;
59 import java.util.Objects;
60
61
62
63
64 public class MoneyWisePortfolio
65 extends MoneyWiseAssetBase
66 implements PrometheusDataInfoSetItemCtl<MoneyWisePortfolioInfo> {
67
68
69
70 public static final String OBJECT_NAME = MoneyWiseBasicDataType.PORTFOLIO.getItemName();
71
72
73
74
75 public static final String LIST_NAME = MoneyWiseBasicDataType.PORTFOLIO.getListName();
76
77
78
79
80 private static final MetisFieldVersionedSet<MoneyWisePortfolio> FIELD_DEFS = MetisFieldVersionedSet.newVersionedFieldSet(MoneyWisePortfolio.class);
81
82
83
84
85 static {
86 FIELD_DEFS.declareLocalField(PrometheusDataResource.DATAINFOSET_NAME, MoneyWisePortfolio::getInfoSet);
87 FIELD_DEFS.buildFieldMap(MoneyWiseAccountInfoClass.class, MoneyWisePortfolio::getFieldValue);
88 }
89
90
91
92
93 private final boolean hasInfoSet;
94
95
96
97
98 private final boolean useInfoSet;
99
100
101
102
103 private final MoneyWisePortfolioInfoSet theInfoSet;
104
105
106
107
108
109
110
111 protected MoneyWisePortfolio(final MoneyWisePortfolioList pList,
112 final MoneyWisePortfolio pPortfolio) {
113
114 super(pList, pPortfolio);
115
116
117 switch (getList().getStyle()) {
118 case EDIT:
119 theInfoSet = new MoneyWisePortfolioInfoSet(this, pList.getActInfoTypes(), pList.getPortfolioInfo());
120 theInfoSet.cloneDataInfoSet(pPortfolio.getInfoSet());
121 hasInfoSet = true;
122 useInfoSet = true;
123 break;
124 case CLONE, CORE:
125 theInfoSet = new MoneyWisePortfolioInfoSet(this, pList.getActInfoTypes(), pList.getPortfolioInfo());
126 hasInfoSet = true;
127 useInfoSet = false;
128 break;
129 default:
130 theInfoSet = null;
131 hasInfoSet = false;
132 useInfoSet = false;
133 break;
134 }
135 }
136
137
138
139
140
141
142
143
144 private MoneyWisePortfolio(final MoneyWisePortfolioList pList,
145 final PrometheusDataValues pValues) throws OceanusException {
146
147 super(pList, pValues);
148
149
150 theInfoSet = new MoneyWisePortfolioInfoSet(this, pList.getActInfoTypes(), pList.getPortfolioInfo());
151 hasInfoSet = true;
152 useInfoSet = false;
153 }
154
155
156
157
158
159
160 public MoneyWisePortfolio(final MoneyWisePortfolioList pList) {
161 super(pList);
162
163
164 theInfoSet = new MoneyWisePortfolioInfoSet(this, pList.getActInfoTypes(), pList.getPortfolioInfo());
165 hasInfoSet = true;
166 useInfoSet = true;
167 }
168
169 @Override
170 public MetisFieldSetDef getDataFieldSet() {
171 return FIELD_DEFS;
172 }
173
174 @Override
175 public boolean includeXmlField(final MetisDataFieldId pField) {
176
177 if (MoneyWiseBasicResource.CATEGORY_NAME.equals(pField)) {
178 return true;
179 }
180 if (MoneyWiseBasicResource.ASSET_PARENT.equals(pField)) {
181 return true;
182 }
183 if (MoneyWiseStaticDataType.CURRENCY.equals(pField)) {
184 return true;
185 }
186
187
188 return super.includeXmlField(pField);
189 }
190
191 @Override
192 public Long getExternalId() {
193 return MoneyWiseAssetType.createExternalId(MoneyWiseAssetType.PORTFOLIO, getIndexedId());
194 }
195
196 @Override
197 public MoneyWisePortfolioInfoSet getInfoSet() {
198 return theInfoSet;
199 }
200
201 @Override
202 public MoneyWisePayee getParent() {
203 return (MoneyWisePayee) super.getParent();
204 }
205
206
207
208
209
210
211
212 private Object getFieldValue(final MetisDataFieldId pFieldId) {
213 return theInfoSet != null ? theInfoSet.getFieldValue(pFieldId) : null;
214 }
215
216
217
218
219
220
221 public char[] getWebSite() {
222 return hasInfoSet
223 ? theInfoSet.getValue(MoneyWiseAccountInfoClass.WEBSITE, char[].class)
224 : null;
225 }
226
227
228
229
230
231
232 public char[] getCustNo() {
233 return hasInfoSet
234 ? theInfoSet.getValue(MoneyWiseAccountInfoClass.CUSTOMERNO, char[].class)
235 : null;
236 }
237
238
239
240
241
242
243 public char[] getUserId() {
244 return hasInfoSet
245 ? theInfoSet.getValue(MoneyWiseAccountInfoClass.USERID, char[].class)
246 : null;
247 }
248
249
250
251
252
253
254 public char[] getPassword() {
255 return hasInfoSet
256 ? theInfoSet.getValue(MoneyWiseAccountInfoClass.PASSWORD, char[].class)
257 : null;
258 }
259
260
261
262
263
264
265 public char[] getSortCode() {
266 return hasInfoSet
267 ? theInfoSet.getValue(MoneyWiseAccountInfoClass.SORTCODE, char[].class)
268 : null;
269 }
270
271
272
273
274
275
276 public char[] getReference() {
277 return hasInfoSet
278 ? theInfoSet.getValue(MoneyWiseAccountInfoClass.REFERENCE, char[].class)
279 : null;
280 }
281
282
283
284
285
286
287 public char[] getAccount() {
288 return hasInfoSet
289 ? theInfoSet.getValue(MoneyWiseAccountInfoClass.ACCOUNT, char[].class)
290 : null;
291 }
292
293
294
295
296
297
298 public char[] getNotes() {
299 return hasInfoSet
300 ? theInfoSet.getValue(MoneyWiseAccountInfoClass.NOTES, char[].class)
301 : null;
302 }
303
304 @Override
305 public MoneyWisePortfolioType getCategory() {
306 return getValues().getValue(MoneyWiseBasicResource.CATEGORY_NAME, MoneyWisePortfolioType.class);
307 }
308
309
310
311
312
313
314 public Integer getCategoryId() {
315 final MoneyWisePortfolioType myType = getCategory();
316 return myType == null
317 ? null
318 : myType.getIndexedId();
319 }
320
321
322
323
324
325
326 public String getCategoryName() {
327 final MoneyWisePortfolioType myType = getCategory();
328 return myType == null
329 ? null
330 : myType.getName();
331 }
332
333
334
335
336
337
338 public MoneyWisePortfolioClass getCategoryClass() {
339 final MoneyWisePortfolioType myType = getCategory();
340 return myType == null
341 ? null
342 : myType.getPortfolioClass();
343 }
344
345 @Override
346 public boolean isTaxFree() {
347 final MoneyWisePortfolioClass myClass = getCategoryClass();
348 return myClass != null && myClass.isTaxFree();
349 }
350
351 @Override
352 public boolean isForeign() {
353 final MoneyWiseCurrency myDefault = getDefaultCurrency();
354 return !myDefault.equals(getAssetCurrency());
355 }
356
357 @Override
358 public MoneyWisePortfolio getBase() {
359 return (MoneyWisePortfolio) super.getBase();
360 }
361
362 @Override
363 public MoneyWisePortfolioList getList() {
364 return (MoneyWisePortfolioList) super.getList();
365 }
366
367 @Override
368 public MetisDataState getState() {
369
370 MetisDataState myState = super.getState();
371
372
373 if ((myState == MetisDataState.CLEAN) && useInfoSet) {
374
375 myState = theInfoSet.getState();
376 }
377
378
379 return myState;
380 }
381
382 @Override
383 public MetisDataEditState getEditState() {
384
385 MetisDataEditState myState = super.getEditState();
386
387
388 if (myState == MetisDataEditState.CLEAN
389 && useInfoSet) {
390
391 myState = theInfoSet.getEditState();
392 }
393
394
395 return myState;
396 }
397
398 @Override
399 public boolean hasHistory() {
400
401 boolean hasHistory = super.hasHistory();
402
403
404 if (!hasHistory && useInfoSet) {
405
406 hasHistory = theInfoSet.hasHistory();
407 }
408
409
410 return hasHistory;
411 }
412
413 @Override
414 public void pushHistory() {
415
416 super.pushHistory();
417
418
419 if (useInfoSet) {
420
421 theInfoSet.pushHistory();
422 }
423 }
424
425 @Override
426 public void popHistory() {
427
428 super.popHistory();
429
430
431 if (useInfoSet) {
432
433 theInfoSet.popHistory();
434 }
435 }
436
437 @Override
438 public boolean checkForHistory() {
439
440 boolean bChanges = super.checkForHistory();
441
442
443 if (useInfoSet) {
444
445 bChanges |= theInfoSet.checkForHistory();
446 }
447
448
449 return bChanges;
450 }
451
452 @Override
453 public MetisDataDifference fieldChanged(final MetisDataFieldId pField) {
454
455 final MoneyWiseAccountInfoClass myClass = MoneyWisePortfolioInfoSet.getClassForField(pField);
456 if (myClass != null) {
457 return useInfoSet
458 ? theInfoSet.fieldChanged(myClass)
459 : MetisDataDifference.IDENTICAL;
460 }
461
462
463 return super.fieldChanged(pField);
464 }
465
466 @Override
467 public void setDeleted(final boolean bDeleted) {
468
469 if (useInfoSet) {
470 theInfoSet.setDeleted(bDeleted);
471 }
472
473
474 super.setDeleted(bDeleted);
475 }
476
477
478
479
480
481
482
483 public boolean isPortfolioClass(final MoneyWisePortfolioClass pClass) {
484
485 return getCategoryClass() == pClass;
486 }
487
488 @Override
489 public void deRegister() {
490 final MoneyWiseSecurityHoldingMapCtl myMap = getList().getSecurityHoldingsMap();
491 myMap.deRegister(this);
492 }
493
494
495
496
497
498
499 public void setDefaults() throws OceanusException {
500 getList().getValidator().setDefaults(this);
501 }
502
503
504
505
506
507
508 public void autoCorrect() throws OceanusException {
509 getList().getValidator().autoCorrect(this);
510 }
511
512 @Override
513 public int compareValues(final PrometheusDataItem pThat) {
514
515 final MoneyWisePortfolio myThat = (MoneyWisePortfolio) pThat;
516 int iDiff = MetisDataDifference.compareObject(getCategory(), myThat.getCategory());
517 if (iDiff == 0) {
518 iDiff = MetisDataDifference.compareObject(getName(), myThat.getName());
519 }
520 return iDiff;
521 }
522
523 @Override
524 public void resolveDataSetLinks() throws OceanusException {
525
526 super.resolveDataSetLinks();
527
528
529 resolveDataLink(MoneyWiseBasicResource.ASSET_PARENT, MoneyWiseBasicDataType.PAYEE);
530 resolveDataLink(MoneyWiseBasicResource.CATEGORY_NAME, MoneyWiseStaticDataType.PORTFOLIOTYPE);
531 resolveDataLink(MoneyWiseStaticDataType.CURRENCY, MoneyWiseStaticDataType.CURRENCY);
532 }
533
534 @Override
535 protected void resolveEditSetLinks() throws OceanusException {
536
537 final PrometheusEditSet myEditSet = getList().getEditSet();
538
539
540 resolveDataLink(MoneyWiseBasicResource.ASSET_PARENT, myEditSet.getDataList(MoneyWiseBasicDataType.PAYEE, MoneyWisePayeeList.class));
541 if (myEditSet.hasDataType(MoneyWiseStaticDataType.PORTFOLIOTYPE)) {
542 resolveDataLink(MoneyWiseBasicResource.CATEGORY_NAME, myEditSet.getDataList(MoneyWiseStaticDataType.PORTFOLIOTYPE, MoneyWisePortfolioTypeList.class));
543 }
544 if (myEditSet.hasDataType(MoneyWiseStaticDataType.CURRENCY)) {
545 resolveDataLink(MoneyWiseStaticDataType.CURRENCY, myEditSet.getDataList(MoneyWiseStaticDataType.CURRENCY, MoneyWiseCurrencyList.class));
546 }
547
548
549 theInfoSet.resolveEditSetLinks(myEditSet);
550 }
551
552
553
554
555
556
557
558 public void setWebSite(final char[] pWebSite) throws OceanusException {
559 setInfoSetValue(MoneyWiseAccountInfoClass.WEBSITE, pWebSite);
560 }
561
562
563
564
565
566
567
568 public void setCustNo(final char[] pCustNo) throws OceanusException {
569 setInfoSetValue(MoneyWiseAccountInfoClass.CUSTOMERNO, pCustNo);
570 }
571
572
573
574
575
576
577
578 public void setUserId(final char[] pUserId) throws OceanusException {
579 setInfoSetValue(MoneyWiseAccountInfoClass.USERID, pUserId);
580 }
581
582
583
584
585
586
587
588 public void setPassword(final char[] pPassword) throws OceanusException {
589 setInfoSetValue(MoneyWiseAccountInfoClass.PASSWORD, pPassword);
590 }
591
592
593
594
595
596
597
598 public void setSortCode(final char[] pSortCode) throws OceanusException {
599 setInfoSetValue(MoneyWiseAccountInfoClass.SORTCODE, pSortCode);
600 }
601
602
603
604
605
606
607
608 public void setAccount(final char[] pAccount) throws OceanusException {
609 setInfoSetValue(MoneyWiseAccountInfoClass.ACCOUNT, pAccount);
610 }
611
612
613
614
615
616
617
618 public void setReference(final char[] pReference) throws OceanusException {
619 setInfoSetValue(MoneyWiseAccountInfoClass.REFERENCE, pReference);
620 }
621
622
623
624
625
626
627
628 public void setNotes(final char[] pNotes) throws OceanusException {
629 setInfoSetValue(MoneyWiseAccountInfoClass.NOTES, pNotes);
630 }
631
632
633
634
635
636
637
638
639 private void setInfoSetValue(final MoneyWiseAccountInfoClass pInfoClass,
640 final Object pValue) throws OceanusException {
641
642 if (!hasInfoSet) {
643 throw new MoneyWiseLogicException(ERROR_BADINFOSET);
644 }
645
646
647 theInfoSet.setValue(pInfoClass, pValue);
648 }
649
650 @Override
651 public MoneyWiseTransCategory getDetailedCategory(final MoneyWiseTransCategory pCategory,
652 final MoneyWiseTaxCredit pYear) {
653
654 final MoneyWiseTransCategoryList myCategories = getDataSet().getDataList(MoneyWiseBasicDataType.TRANSCATEGORY, MoneyWiseTransCategoryList.class);
655 return switch (Objects.requireNonNull(pCategory.getCategoryTypeClass())) {
656 case INTEREST -> {
657 if (isTaxFree()) {
658 yield myCategories.getSingularClass(MoneyWiseTransCategoryClass.TAXFREEINTEREST);
659 }
660 yield myCategories.getSingularClass(isGross()
661 || !pYear.isTaxCreditRequired()
662 ? MoneyWiseTransCategoryClass.GROSSINTEREST
663 : MoneyWiseTransCategoryClass.TAXEDINTEREST);
664 }
665 case LOYALTYBONUS -> {
666 if (isTaxFree()) {
667 yield myCategories.getSingularClass(MoneyWiseTransCategoryClass.TAXFREELOYALTYBONUS);
668 }
669 yield myCategories.getSingularClass(isGross()
670 ? MoneyWiseTransCategoryClass.GROSSLOYALTYBONUS
671 : MoneyWiseTransCategoryClass.TAXEDLOYALTYBONUS);
672 }
673 case DIVIDEND -> isTaxFree()
674 ? myCategories.getSingularClass(MoneyWiseTransCategoryClass.TAXFREEDIVIDEND)
675 : pCategory;
676 default -> pCategory;
677 };
678 }
679
680 @Override
681 public void touchUnderlyingItems() {
682
683 getCategory().touchItem(this);
684 getParent().touchItem(this);
685 getAssetCurrency().touchItem(this);
686
687
688 theInfoSet.touchUnderlyingItems();
689 }
690
691 @Override
692 public void touchOnUpdate() {
693
694 getParent().touchItem(this);
695 }
696
697
698
699
700
701
702
703 @Override
704 public boolean applyChanges(final PrometheusDataItem pPortfolio) {
705
706 if (!(pPortfolio instanceof MoneyWisePortfolio myPortfolio)) {
707 return false;
708 }
709
710
711 pushHistory();
712
713
714 applyBasicChanges(myPortfolio);
715
716
717 return checkForHistory();
718 }
719
720 @Override
721 public void adjustMapForItem() {
722 final MoneyWisePortfolioList myList = getList();
723 final MoneyWisePortfolioDataMap myMap = myList.getDataMap();
724 myMap.adjustForItem(this);
725 }
726
727 @Override
728 public void removeItem() {
729 theInfoSet.removeItems();
730 super.removeItem();
731 }
732
733
734
735
736 public static class MoneyWisePortfolioList
737 extends MoneyWiseAssetBaseList<MoneyWisePortfolio> {
738
739
740
741 private static final MetisFieldSet<MoneyWisePortfolioList> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWisePortfolioList.class);
742
743
744
745
746 static {
747 FIELD_DEFS.declareLocalField(MoneyWiseBasicResource.MONEYWISEDATA_HOLDINGSMAP, MoneyWisePortfolioList::getSecurityHoldingsMap);
748 }
749
750
751
752
753 private MoneyWisePortfolioInfoList theInfoList;
754
755
756
757
758 private MoneyWiseAccountInfoTypeList theInfoTypeList;
759
760
761
762
763 private MoneyWiseSecurityHoldingMapCtl theSecurityHoldings;
764
765
766
767
768
769
770 public MoneyWisePortfolioList(final PrometheusDataSet pData) {
771 super(pData, MoneyWisePortfolio.class, MoneyWiseBasicDataType.PORTFOLIO);
772 }
773
774
775
776
777
778
779 protected MoneyWisePortfolioList(final MoneyWisePortfolioList pSource) {
780 super(pSource);
781 }
782
783 @Override
784 public MetisFieldSet<MoneyWisePortfolioList> getDataFieldSet() {
785 return FIELD_DEFS;
786 }
787
788 @Override
789 public String listName() {
790 return LIST_NAME;
791 }
792
793 @Override
794 public MetisFieldSetDef getItemFields() {
795 return MoneyWisePortfolio.FIELD_DEFS;
796 }
797
798 @Override
799 public MoneyWisePortfolioDataMap getDataMap() {
800 return (MoneyWisePortfolioDataMap) super.getDataMap();
801 }
802
803
804
805
806
807
808 public MoneyWisePortfolioInfoList getPortfolioInfo() {
809 if (theInfoList == null) {
810 theInfoList = getDataSet().getDataList(MoneyWiseBasicDataType.PORTFOLIOINFO, MoneyWisePortfolioInfoList.class);
811 }
812 return theInfoList;
813 }
814
815
816
817
818
819
820 public MoneyWiseAccountInfoTypeList getActInfoTypes() {
821 if (theInfoTypeList == null) {
822 theInfoTypeList = getEditSet() == null
823 ? getDataSet().getDataList(MoneyWiseStaticDataType.ACCOUNTINFOTYPE, MoneyWiseAccountInfoTypeList.class)
824 : getEditSet().getDataList(MoneyWiseStaticDataType.ACCOUNTINFOTYPE, MoneyWiseAccountInfoTypeList.class);
825 }
826 return theInfoTypeList;
827 }
828
829
830
831
832
833
834 public MoneyWiseSecurityHoldingMapCtl getSecurityHoldingsMap() {
835 if (theSecurityHoldings == null) {
836 final MoneyWiseSecurityHoldingMapGenerator myGenerator =
837 (MoneyWiseSecurityHoldingMapGenerator) getDataSet();
838 theSecurityHoldings = getEditSet() == null
839 ? myGenerator.newSecurityHoldingMap()
840 : myGenerator.newSecurityHoldingMap(getEditSet());
841 }
842 return theSecurityHoldings;
843 }
844
845 @Override
846 protected MoneyWisePortfolioList getEmptyList(final PrometheusListStyle pStyle) {
847 final MoneyWisePortfolioList myList = new MoneyWisePortfolioList(this);
848 myList.setStyle(pStyle);
849 return myList;
850 }
851
852
853
854
855
856
857
858
859 public MoneyWisePortfolioList deriveEditList(final PrometheusEditSet pEditSet) throws OceanusException {
860
861 final MoneyWisePortfolioList myList = getEmptyList(PrometheusListStyle.EDIT);
862 final MoneyWisePayeeList myPayees = pEditSet.getDataList(MoneyWiseBasicDataType.PAYEE, MoneyWisePayeeList.class);
863 myList.ensureMap(myPayees);
864 pEditSet.setEditEntryList(MoneyWiseBasicDataType.PORTFOLIO, myList);
865 myList.getValidator().setEditSet(pEditSet);
866
867
868 myList.theInfoTypeList = pEditSet.getDataList(MoneyWiseStaticDataType.ACCOUNTINFOTYPE, MoneyWiseAccountInfoTypeList.class);
869
870
871 final MoneyWisePortfolioInfoList myPortInfo = getPortfolioInfo();
872 myList.theInfoList = myPortInfo.getEmptyList(PrometheusListStyle.EDIT);
873 pEditSet.setEditEntryList(MoneyWiseBasicDataType.PORTFOLIOINFO, myList.theInfoList);
874
875
876 myList.setEditSet(pEditSet);
877
878
879 final Iterator<MoneyWisePortfolio> myIterator = iterator();
880 while (myIterator.hasNext()) {
881 final MoneyWisePortfolio myCurr = myIterator.next();
882
883
884 if (myCurr.isDeleted()) {
885 continue;
886 }
887
888
889 final MoneyWisePortfolio myPortfolio = new MoneyWisePortfolio(myList, myCurr);
890 myList.add(myPortfolio);
891 myPortfolio.resolveEditSetLinks();
892
893
894 myPortfolio.adjustMapForItem();
895 }
896
897
898 return myList;
899 }
900
901 @Override
902 public void clear() {
903 super.clear();
904 if (theSecurityHoldings != null) {
905 theSecurityHoldings.clear();
906 }
907 }
908
909 @Override
910 public MoneyWisePortfolio findItemByName(final String pName) {
911
912 return getDataMap().findItemByName(pName);
913 }
914
915 @Override
916 public boolean checkAvailableName(final String pName) {
917
918 return getDataMap().availableName(pName);
919 }
920
921 @Override
922 public boolean validNameCount(final String pName) {
923
924 return getDataMap().validNameCount(pName);
925 }
926
927
928
929
930
931
932
933 @Override
934 public MoneyWisePortfolio addCopyItem(final PrometheusDataItem pPortfolio) {
935
936 if (!(pPortfolio instanceof MoneyWisePortfolio)) {
937 throw new UnsupportedOperationException();
938 }
939
940 final MoneyWisePortfolio myPortfolio = new MoneyWisePortfolio(this, (MoneyWisePortfolio) pPortfolio);
941 add(myPortfolio);
942 return myPortfolio;
943 }
944
945
946
947
948
949
950 @Override
951 public MoneyWisePortfolio addNewItem() {
952 final MoneyWisePortfolio myPortfolio = new MoneyWisePortfolio(this);
953 add(myPortfolio);
954 return myPortfolio;
955 }
956
957
958
959
960
961
962
963 public MoneyWisePortfolio getSingularClass(final MoneyWisePortfolioClass pClass) {
964
965 return getDataMap().findSingularItem(pClass);
966 }
967
968 @Override
969 public MoneyWisePortfolio addValuesItem(final PrometheusDataValues pValues) throws OceanusException {
970
971 final MoneyWisePortfolio myPortfolio = new MoneyWisePortfolio(this, pValues);
972
973
974 if (!isIdUnique(myPortfolio.getIndexedId())) {
975 myPortfolio.addError(ERROR_DUPLICATE, MetisDataResource.DATA_ID);
976 throw new MoneyWiseDataException(myPortfolio, ERROR_VALIDATION);
977 }
978
979
980 add(myPortfolio);
981
982
983 if (pValues.hasInfoItems()) {
984
985 final Iterator<PrometheusInfoItem> myIterator = pValues.infoIterator();
986 while (myIterator.hasNext()) {
987 final PrometheusInfoItem myItem = myIterator.next();
988
989
990 final PrometheusDataValues myValues = myItem.getValues(myPortfolio);
991 theInfoList.addValuesItem(myValues);
992 }
993 }
994
995
996 return myPortfolio;
997 }
998
999
1000
1001
1002
1003
1004 private void ensureMap(final MoneyWisePayeeList pPayees) {
1005 setDataMap(new MoneyWisePortfolioDataMap(pPayees));
1006 }
1007
1008 @Override
1009 protected MoneyWisePortfolioDataMap allocateDataMap() {
1010 return new MoneyWisePortfolioDataMap(getDataSet().getDataList(MoneyWiseBasicDataType.PAYEE, MoneyWisePayeeList.class));
1011 }
1012
1013 @Override
1014 public void postProcessOnLoad() throws OceanusException {
1015
1016 super.resolveDataSetLinks();
1017 reSort();
1018 }
1019 }
1020
1021
1022
1023
1024 public static class MoneyWisePortfolioDataMap
1025 implements PrometheusDataMapItem, MetisFieldItem {
1026
1027
1028
1029 private static final MetisFieldSet<MoneyWisePortfolioDataMap> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWisePortfolioDataMap.class);
1030
1031
1032
1033
1034 static {
1035 FIELD_DEFS.declareLocalField(MoneyWiseBasicResource.MONEYWISEDATA_MAP_UNDERLYING, MoneyWisePortfolioDataMap::getUnderlyingMap);
1036 FIELD_DEFS.declareLocalField(MoneyWiseBasicResource.MONEYWISEDATA_MAP_SINGULARMAP, MoneyWisePortfolioDataMap::getPortfolioMap);
1037 FIELD_DEFS.declareLocalField(MoneyWiseBasicResource.MONEYWISEDATA_MAP_SINGULARCOUNTS, MoneyWisePortfolioDataMap::getPortfolioCountMap);
1038 }
1039
1040
1041
1042
1043 private final MoneyWiseAssetDataMap theUnderlyingMap;
1044
1045
1046
1047
1048 private final Map<Integer, Integer> thePortfolioCountMap;
1049
1050
1051
1052
1053 private final Map<Integer, MoneyWisePortfolio> thePortfolioMap;
1054
1055
1056
1057
1058
1059
1060 protected MoneyWisePortfolioDataMap(final MoneyWisePayeeList pPayees) {
1061
1062 theUnderlyingMap = pPayees.getDataMap().getUnderlyingMap();
1063
1064
1065 thePortfolioCountMap = new HashMap<>();
1066 thePortfolioMap = new HashMap<>();
1067 }
1068
1069 @Override
1070 public MetisFieldSet<MoneyWisePortfolioDataMap> getDataFieldSet() {
1071 return FIELD_DEFS;
1072 }
1073
1074 @Override
1075 public String formatObject(final OceanusDataFormatter pFormatter) {
1076 return FIELD_DEFS.getName();
1077 }
1078
1079
1080
1081
1082
1083
1084 private MoneyWiseAssetDataMap getUnderlyingMap() {
1085 return theUnderlyingMap;
1086 }
1087
1088
1089
1090
1091
1092
1093 private Map<Integer, MoneyWisePortfolio> getPortfolioMap() {
1094 return thePortfolioMap;
1095 }
1096
1097
1098
1099
1100
1101
1102 private Map<Integer, Integer> getPortfolioCountMap() {
1103 return thePortfolioCountMap;
1104 }
1105
1106 @Override
1107 public void resetMap() {
1108 thePortfolioCountMap.clear();
1109 thePortfolioMap.clear();
1110 }
1111
1112 @Override
1113 public void adjustForItem(final PrometheusDataItem pItem) {
1114
1115 final MoneyWisePortfolio myItem = (MoneyWisePortfolio) pItem;
1116 final MoneyWisePortfolioClass myClass = myItem.getCategoryClass();
1117 if (myClass.isSingular()) {
1118
1119 final Integer myId = myClass.getClassId();
1120 final Integer myCount = thePortfolioCountMap.get(myId);
1121 if (myCount == null) {
1122 thePortfolioCountMap.put(myId, PrometheusDataInstanceMap.ONE);
1123 } else {
1124 thePortfolioCountMap.put(myId, myCount + 1);
1125 }
1126
1127
1128 thePortfolioMap.put(myId, myItem);
1129 }
1130
1131
1132 theUnderlyingMap.adjustForItem(pItem);
1133 }
1134
1135
1136
1137
1138
1139
1140
1141 public MoneyWisePortfolio findItemByName(final String pName) {
1142 final MoneyWiseAssetBase myAsset = theUnderlyingMap.findAssetByName(pName);
1143 return myAsset instanceof MoneyWisePortfolio myPortfolio
1144 ? myPortfolio
1145 : null;
1146 }
1147
1148
1149
1150
1151
1152
1153
1154 public boolean validNameCount(final String pName) {
1155 return theUnderlyingMap.validNameCount(pName);
1156 }
1157
1158
1159
1160
1161
1162
1163
1164 public boolean availableName(final String pName) {
1165 return theUnderlyingMap.availableKey(pName);
1166 }
1167
1168
1169
1170
1171
1172
1173
1174 public MoneyWisePortfolio findSingularItem(final MoneyWisePortfolioClass pClass) {
1175 return thePortfolioMap.get(pClass.getClassId());
1176 }
1177
1178
1179
1180
1181
1182
1183
1184 public boolean validSingularCount(final MoneyWisePortfolioClass pClass) {
1185 final Integer myResult = thePortfolioCountMap.get(pClass.getClassId());
1186 return PrometheusDataInstanceMap.ONE.equals(myResult);
1187 }
1188 }
1189 }