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.MetisDataItem.MetisDataFieldId;
21 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
22 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseCash.MoneyWiseCashList;
23 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataValidator.MoneyWiseDataValidatorAutoCorrect;
24 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDeposit.MoneyWiseDepositList;
25 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseLoan.MoneyWiseLoanList;
26 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee.MoneyWisePayeeList;
27 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePortfolio.MoneyWisePortfolioList;
28 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryClass;
29 import io.github.tonywasher.joceanus.moneywise.exc.MoneyWiseDataException;
30 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
31 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
32 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
33 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
34 import io.github.tonywasher.joceanus.prometheus.data.PrometheusData.PrometheusDataSetCtl;
35 import io.github.tonywasher.joceanus.prometheus.data.PrometheusData.PrometheusDataSetListCtl;
36 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
37 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataResource;
38 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataSet;
39 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataValues;
40 import io.github.tonywasher.joceanus.prometheus.data.PrometheusEncryptedDataItem;
41 import io.github.tonywasher.joceanus.prometheus.data.PrometheusEncryptedFieldSet;
42 import io.github.tonywasher.joceanus.prometheus.data.PrometheusEncryptedPair;
43 import io.github.tonywasher.joceanus.prometheus.data.PrometheusEncryptedValues;
44 import io.github.tonywasher.joceanus.prometheus.data.PrometheusListStyle;
45 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
46
47
48
49
50
51
52 public abstract class MoneyWiseTransBase
53 extends PrometheusEncryptedDataItem
54 implements MoneyWiseAssetTouch {
55
56
57
58 public static final String OBJECT_NAME = MoneyWiseTransBase.class.getSimpleName();
59
60
61
62
63 private static final char CHAR_BLANK = ' ';
64
65
66
67
68 private static final PrometheusEncryptedFieldSet<MoneyWiseTransBase> FIELD_DEFS = PrometheusEncryptedFieldSet.newEncryptedFieldSet(MoneyWiseTransBase.class);
69
70
71
72
73 static {
74 FIELD_DEFS.declareLinkField(MoneyWiseBasicResource.TRANSACTION_ACCOUNT);
75 FIELD_DEFS.declareEnumField(MoneyWiseBasicResource.TRANSACTION_DIRECTION);
76 FIELD_DEFS.declareLinkField(MoneyWiseBasicResource.TRANSACTION_PARTNER);
77 FIELD_DEFS.declareEncryptedMoneyField(MoneyWiseBasicResource.TRANSACTION_AMOUNT);
78 FIELD_DEFS.declareLinkField(MoneyWiseBasicDataType.TRANSCATEGORY);
79 FIELD_DEFS.declareBooleanField(MoneyWiseBasicResource.TRANSACTION_RECONCILED);
80 }
81
82
83
84
85 public static final String ERROR_COMBO = MoneyWiseBasicResource.TRANSACTION_ERROR_ASSETPAIR.getValue();
86
87
88
89
90 protected static final String ERROR_ZEROAMOUNT = MoneyWiseBasicResource.TRANSACTION_ERROR_ZERO.getValue();
91
92
93
94
95 public static final String ERROR_CURRENCY = MoneyWiseBasicResource.MONEYWISEDATA_ERROR_CURRENCY.getValue();
96
97
98
99
100
101
102
103 protected MoneyWiseTransBase(final MoneyWiseTransBaseList<?> pList,
104 final MoneyWiseTransBase pTrans) {
105
106 super(pList, pTrans);
107 }
108
109
110
111
112
113
114 protected MoneyWiseTransBase(final MoneyWiseTransBaseList<?> pList) {
115 super(pList, 0);
116 setNextDataKeySet();
117 setValueReconciled(Boolean.FALSE);
118 }
119
120
121
122
123
124
125
126
127 protected MoneyWiseTransBase(final MoneyWiseTransBaseList<?> pList,
128 final PrometheusDataValues pValues) throws OceanusException {
129
130 super(pList, pValues);
131
132
133 final OceanusDataFormatter myFormatter = getDataSet().getDataFormatter();
134
135
136 try {
137
138 Object myValue = pValues.getValue(MoneyWiseBasicResource.TRANSACTION_DIRECTION);
139 if (myValue instanceof Boolean b) {
140 setValueDirection(b);
141 } else if (myValue instanceof String s) {
142 setValueDirection(s);
143 } else if (myValue instanceof MoneyWiseAssetDirection d) {
144 setValueDirection(d);
145 }
146
147
148 myValue = pValues.getValue(MoneyWiseBasicResource.TRANSACTION_ACCOUNT);
149 if (myValue instanceof Long l) {
150 setValueAccount(l);
151 } else if (myValue instanceof String s) {
152 setValueAccount(s);
153 } else if (myValue instanceof MoneyWiseTransAsset a) {
154 setValueAccount(a);
155 }
156
157
158 myValue = pValues.getValue(MoneyWiseBasicResource.TRANSACTION_PARTNER);
159 if (myValue instanceof Long l) {
160 setValuePartner(l);
161 } else if (myValue instanceof String s) {
162 setValuePartner(s);
163 } else if (myValue instanceof MoneyWiseTransAsset a) {
164 setValuePartner(a);
165 }
166
167
168 myValue = pValues.getValue(MoneyWiseBasicDataType.TRANSCATEGORY);
169 if (myValue instanceof Integer i) {
170 setValueCategory(i);
171 } else if (myValue instanceof String s) {
172 setValueCategory(s);
173 } else if (myValue instanceof MoneyWiseTransCategory c) {
174 setValueCategory(c);
175 }
176
177
178 myValue = pValues.getValue(MoneyWiseBasicResource.TRANSACTION_AMOUNT);
179 if (myValue instanceof OceanusMoney m) {
180 setValueAmount(m);
181 } else if (myValue instanceof byte[] ba) {
182 setValueAmount(ba);
183 } else if (myValue instanceof String myString) {
184 setValueAmount(myString);
185 setValueAmount(myFormatter.parseValue(myString, OceanusMoney.class));
186 }
187
188
189 myValue = pValues.getValue(MoneyWiseBasicResource.TRANSACTION_RECONCILED);
190 if (myValue instanceof Boolean b) {
191 setValueReconciled(b);
192 } else if (myValue instanceof String s) {
193 setValueReconciled(myFormatter.parseValue(s, Boolean.class));
194 }
195
196
197 } catch (IllegalArgumentException
198 | OceanusException e) {
199
200 throw new MoneyWiseDataException(this, ERROR_CREATEITEM, e);
201 }
202 }
203
204 @Override
205 public boolean includeXmlField(final MetisDataFieldId pField) {
206
207 if (MoneyWiseBasicResource.TRANSACTION_DIRECTION.equals(pField)) {
208 return true;
209 }
210 if (MoneyWiseBasicDataType.TRANSCATEGORY.equals(pField)) {
211 return true;
212 }
213 if (MoneyWiseBasicResource.TRANSACTION_ACCOUNT.equals(pField)) {
214 return true;
215 }
216 if (MoneyWiseBasicResource.TRANSACTION_PARTNER.equals(pField)) {
217 return true;
218 }
219 if (MoneyWiseBasicResource.TRANSACTION_AMOUNT.equals(pField)) {
220 return getAmount() != null;
221 }
222 if (MoneyWiseBasicResource.TRANSACTION_RECONCILED.equals(pField)) {
223 return isReconciled();
224 }
225
226
227 return super.includeXmlField(pField);
228 }
229
230 @Override
231 public String formatObject(final OceanusDataFormatter pFormatter) {
232 return toString();
233 }
234
235 @Override
236 public String toString() {
237
238 if (isHeader()) {
239 return PrometheusDataResource.DATAITEM_HEADER.getValue();
240 }
241
242
243 final PrometheusEncryptedValues myValues = getValues();
244 final Object myAccount = myValues.getValue(MoneyWiseBasicResource.TRANSACTION_ACCOUNT);
245 final Object myPartner = myValues.getValue(MoneyWiseBasicResource.TRANSACTION_PARTNER);
246 final Object myDir = myValues.getValue(MoneyWiseBasicResource.TRANSACTION_DIRECTION);
247 final Object myCategory = myValues.getValue(MoneyWiseBasicDataType.TRANSCATEGORY);
248 final Object myAmount = myValues.getValue(MoneyWiseBasicResource.TRANSACTION_AMOUNT);
249
250
251 final OceanusDataFormatter myFormatter = getDataSet().getDataFormatter();
252
253
254 final StringBuilder myBuilder = new StringBuilder();
255 myBuilder.append(myFormatter.formatObject(myCategory));
256 myBuilder.append(CHAR_BLANK);
257 myBuilder.append(myAmount == null
258 ? ""
259 : myFormatter.formatObject(myAmount));
260 myBuilder.append(CHAR_BLANK);
261 myBuilder.append(myFormatter.formatObject(myAccount));
262 if (myDir == null) {
263 myBuilder.append("??");
264 } else {
265 myBuilder.append(MoneyWiseAssetDirection.FROM.equals(myDir)
266 ? "<-"
267 : "->");
268 }
269 myBuilder.append(myFormatter.formatObject(myPartner));
270
271
272 return myBuilder.toString();
273 }
274
275
276
277
278
279
280 public final MoneyWiseTransCategory getCategory() {
281 return getValues().getValue(MoneyWiseBasicDataType.TRANSCATEGORY, MoneyWiseTransCategory.class);
282 }
283
284
285
286
287
288
289 public Integer getCategoryId() {
290 final MoneyWiseTransCategory myCategory = getCategory();
291 return myCategory == null
292 ? null
293 : myCategory.getIndexedId();
294 }
295
296
297
298
299
300
301 public String getCategoryName() {
302 final MoneyWiseTransCategory myCategory = getCategory();
303 return myCategory == null
304 ? null
305 : myCategory.getName();
306 }
307
308
309
310
311
312
313 public MoneyWiseTransCategoryClass getCategoryClass() {
314 final MoneyWiseTransCategory myCategory = getCategory();
315 return myCategory == null
316 ? null
317 : myCategory.getCategoryTypeClass();
318 }
319
320
321
322
323
324
325 public OceanusMoney getAmount() {
326 return getValues().getValue(MoneyWiseBasicResource.TRANSACTION_AMOUNT, OceanusMoney.class);
327 }
328
329
330
331
332
333
334 public byte[] getAmountBytes() {
335 return getValues().getEncryptedBytes(MoneyWiseBasicResource.TRANSACTION_AMOUNT);
336 }
337
338
339
340
341
342
343 protected PrometheusEncryptedPair getAmountField() {
344 return getValues().getEncryptedPair(MoneyWiseBasicResource.TRANSACTION_AMOUNT);
345 }
346
347
348
349
350
351
352 public MoneyWiseTransAsset getAccount() {
353 return getValues().getValue(MoneyWiseBasicResource.TRANSACTION_ACCOUNT, MoneyWiseTransAsset.class);
354 }
355
356
357
358
359
360
361 public Long getAccountId() {
362 final MoneyWiseTransAsset myAccount = getAccount();
363 return myAccount == null
364 ? null
365 : myAccount.getExternalId();
366 }
367
368
369
370
371
372
373 public MoneyWiseTransAsset getPartner() {
374 return getValues().getValue(MoneyWiseBasicResource.TRANSACTION_PARTNER, MoneyWiseTransAsset.class);
375 }
376
377
378
379
380
381
382 public Long getPartnerId() {
383 final MoneyWiseTransAsset myPartner = getPartner();
384 return myPartner == null
385 ? null
386 : myPartner.getExternalId();
387 }
388
389
390
391
392
393
394 public MoneyWiseAssetDirection getDirection() {
395 return getValues().getValue(MoneyWiseBasicResource.TRANSACTION_DIRECTION, MoneyWiseAssetDirection.class);
396 }
397
398 @Override
399 public Boolean isReconciled() {
400 return getValues().getValue(MoneyWiseBasicResource.TRANSACTION_RECONCILED, Boolean.class);
401 }
402
403
404
405
406
407
408 private void setValueCategory(final MoneyWiseTransCategory pValue) {
409 getValues().setUncheckedValue(MoneyWiseBasicDataType.TRANSCATEGORY, pValue);
410 }
411
412
413
414
415
416
417 private void setValueCategory(final Integer pId) {
418 getValues().setUncheckedValue(MoneyWiseBasicDataType.TRANSCATEGORY, pId);
419 }
420
421
422
423
424
425
426 private void setValueCategory(final String pName) {
427 getValues().setUncheckedValue(MoneyWiseBasicDataType.TRANSCATEGORY, pName);
428 }
429
430
431
432
433
434
435
436 private void setValueAmount(final OceanusMoney pValue) throws OceanusException {
437 setEncryptedValue(MoneyWiseBasicResource.TRANSACTION_AMOUNT, pValue);
438 }
439
440
441
442
443
444
445
446 private void setValueAmount(final byte[] pBytes) throws OceanusException {
447 setEncryptedValue(MoneyWiseBasicResource.TRANSACTION_AMOUNT, pBytes, OceanusMoney.class);
448 }
449
450
451
452
453
454
455 protected final void setValueAmount(final PrometheusEncryptedPair pValue) {
456 getValues().setUncheckedValue(MoneyWiseBasicResource.TRANSACTION_AMOUNT, pValue);
457 }
458
459
460
461
462
463
464 private void setValueAmount(final String pValue) {
465 getValues().setUncheckedValue(MoneyWiseBasicResource.TRANSACTION_AMOUNT, pValue);
466 }
467
468
469
470
471
472
473 protected final void setValueAccount(final MoneyWiseTransAsset pValue) {
474 getValues().setUncheckedValue(MoneyWiseBasicResource.TRANSACTION_ACCOUNT, pValue);
475 }
476
477
478
479
480
481
482 private void setValueAccount(final String pName) {
483 getValues().setUncheckedValue(MoneyWiseBasicResource.TRANSACTION_ACCOUNT, pName);
484 }
485
486
487
488
489
490
491 private void setValueAccount(final Long pId) {
492 getValues().setUncheckedValue(MoneyWiseBasicResource.TRANSACTION_ACCOUNT, pId);
493 }
494
495
496
497
498
499
500 protected final void setValuePartner(final MoneyWiseTransAsset pValue) {
501 getValues().setUncheckedValue(MoneyWiseBasicResource.TRANSACTION_PARTNER, pValue);
502 }
503
504
505
506
507
508
509 private void setValuePartner(final Long pId) {
510 getValues().setUncheckedValue(MoneyWiseBasicResource.TRANSACTION_PARTNER, pId);
511 }
512
513
514
515
516
517
518 private void setValuePartner(final String pName) {
519 getValues().setUncheckedValue(MoneyWiseBasicResource.TRANSACTION_PARTNER, pName);
520 }
521
522
523
524
525
526
527 protected final void setValueDirection(final MoneyWiseAssetDirection pValue) {
528 getValues().setUncheckedValue(MoneyWiseBasicResource.TRANSACTION_DIRECTION, pValue);
529 }
530
531
532
533
534
535
536 private void setValueDirection(final Boolean pValue) {
537 final MoneyWiseAssetDirection myValue = Boolean.TRUE.equals(pValue)
538 ? MoneyWiseAssetDirection.FROM
539 : MoneyWiseAssetDirection.TO;
540 setValueDirection(myValue);
541 }
542
543
544
545
546
547
548 private void setValueDirection(final String pValue) {
549 final MoneyWiseAssetDirection myValue = MoneyWiseAssetDirection.fromName(pValue);
550 setValueDirection(myValue);
551 }
552
553
554
555
556
557
558 protected final void setValueReconciled(final Boolean pValue) {
559 getValues().setUncheckedValue(MoneyWiseBasicResource.TRANSACTION_RECONCILED, pValue);
560 }
561
562 @Override
563 public MoneyWiseTransBaseList<?> getList() {
564 return (MoneyWiseTransBaseList<?>) super.getList();
565 }
566
567
568
569
570
571
572 public MoneyWisePortfolio getPortfolio() {
573
574 MoneyWiseTransAsset myAsset = getAccount();
575 if (myAsset instanceof MoneyWiseSecurityHolding myHolding) {
576 return myHolding.getPortfolio();
577 }
578
579
580 myAsset = getPartner();
581 if (myAsset instanceof MoneyWiseSecurityHolding myHolding) {
582 return myHolding.getPortfolio();
583 }
584
585
586 return null;
587 }
588
589
590
591
592
593
594
595
596 @Override
597 public int compareValues(final PrometheusDataItem pThat) {
598
599 final MoneyWiseTransBase myThat = (MoneyWiseTransBase) pThat;
600 return MetisDataDifference.compareObject(getCategory(), myThat.getCategory());
601 }
602
603 @Override
604 public void resolveDataSetLinks() throws OceanusException {
605
606 super.resolveDataSetLinks();
607
608
609 final PrometheusDataSetCtl myData = getDataSet();
610 final PrometheusEncryptedValues myValues = getValues();
611
612
613 final Object myReconciled = myValues.getValue(MoneyWiseBasicResource.TRANSACTION_RECONCILED);
614 if (myReconciled == null) {
615 setValueReconciled(Boolean.FALSE);
616 }
617
618
619 final Object myDirection = myValues.getValue(MoneyWiseBasicResource.TRANSACTION_DIRECTION);
620 if (myDirection == null) {
621 setValueDirection(MoneyWiseAssetDirection.TO);
622 }
623
624
625 resolveTransactionAsset(myData, this, MoneyWiseBasicResource.TRANSACTION_ACCOUNT);
626 resolveTransactionAsset(myData, this, MoneyWiseBasicResource.TRANSACTION_PARTNER);
627 resolveDataLink(MoneyWiseBasicDataType.TRANSCATEGORY, MoneyWiseBasicDataType.TRANSCATEGORY);
628 }
629
630 @Override
631 public boolean isLocked() {
632 final MoneyWiseTransAsset myAccount = getAccount();
633 final MoneyWiseTransAsset myPartner = getPartner();
634
635
636 return (myAccount != null && myAccount.isClosed())
637 || (myPartner != null && myPartner.isClosed());
638 }
639
640
641
642
643
644
645
646 public boolean isCategoryClass(final MoneyWiseTransCategoryClass pClass) {
647
648 return getCategoryClass().equals(pClass);
649 }
650
651
652
653
654
655
656 public boolean isDividendReInvestment() {
657
658 if (!isDividend()) {
659 return false;
660 }
661 return getAccount() != null
662 && MetisDataDifference.isEqual(getAccount(), getPartner());
663 }
664
665
666
667
668
669
670 public boolean isInterest() {
671
672 final MoneyWiseTransCategoryClass myClass = getCategoryClass();
673 return myClass != null
674 && myClass.isInterest();
675 }
676
677
678
679
680
681
682 public boolean isDividend() {
683 final MoneyWiseTransCategoryClass myClass = getCategoryClass();
684 return myClass != null
685 && myClass.isDividend();
686 }
687
688
689
690
691
692
693 public boolean needsNullAmount() {
694 final MoneyWiseTransCategoryClass myClass = getCategoryClass();
695 return myClass != null
696 && myClass.needsNullAmount();
697 }
698
699
700
701
702
703
704 public boolean canSwitchDirection() {
705 return getList().getValidator().isValidDirection(getAccount(), getCategory(), getDirection().reverse());
706 }
707
708
709
710
711
712
713 public void setAccount(final MoneyWiseTransAsset pAccount) {
714
715 setValueAccount(pAccount);
716 }
717
718
719
720
721
722
723 public void setPartner(final MoneyWiseTransAsset pPartner) {
724
725 setValuePartner(pPartner);
726 }
727
728
729
730
731
732
733 public void setDirection(final MoneyWiseAssetDirection pDirection) {
734
735 setValueDirection(pDirection);
736 }
737
738
739
740
741 public void switchDirection() {
742 setValueDirection(getDirection().reverse());
743 }
744
745
746
747
748
749
750 public void flipAssets() throws OceanusException {
751
752 final MoneyWiseTransAsset myAccount = getAccount();
753 final MoneyWiseTransAsset myPartner = getPartner();
754 setValueAccount(myPartner);
755 setValuePartner(myAccount);
756 switchDirection();
757 }
758
759
760
761
762
763
764 public void setCategory(final MoneyWiseTransCategory pCategory) {
765 setValueCategory(pCategory);
766 }
767
768
769
770
771
772
773
774 public void setAmount(final OceanusMoney pAmount) throws OceanusException {
775 setValueAmount(pAmount);
776 }
777
778
779
780
781
782
783 public void setReconciled(final Boolean pReconciled) {
784 setValueReconciled(pReconciled);
785 }
786
787 @Override
788 public void touchUnderlyingItems() {
789
790 getCategory().touchItem(this);
791
792
793 getAccount().touchItem(this);
794 getPartner().touchItem(this);
795 }
796
797
798
799
800
801
802
803
804
805 public void resolveTransactionAsset(final PrometheusDataSetListCtl pData,
806 final PrometheusDataItem pOwner,
807 final MetisDataFieldId pField) throws OceanusException {
808
809 final Object myBaseValue = pOwner.getValues().getValue(pField);
810 final Object myValue = resolveTransactionAsset(pData, myBaseValue);
811 if (myValue == null) {
812 pOwner.addError(ERROR_UNKNOWN, pField);
813 throw new MoneyWiseDataException(this, ERROR_RESOLUTION);
814 }
815 pOwner.getValues().setUncheckedValue(pField, myValue);
816 }
817
818
819
820
821
822
823
824
825
826 private MoneyWiseTransAsset resolveTransactionAsset(final PrometheusDataSetListCtl pData,
827 final Object pValue) throws OceanusException {
828
829 Object myValue = pValue;
830 if (myValue instanceof MoneyWiseTransAsset myAsset) {
831 myValue = myAsset.getExternalId();
832 }
833
834
835 if (myValue instanceof String s) {
836 return resolveTransAsset(pData, s);
837 } else if (myValue instanceof Long l) {
838 return resolveTransAsset(pData, l);
839 }
840 return null;
841 }
842
843
844
845
846
847
848
849
850
851 private static MoneyWiseTransAsset resolveTransAsset(final PrometheusDataSetListCtl pData,
852 final Long pId) throws OceanusException {
853
854 final MoneyWiseAssetType myAssetType = MoneyWiseAssetType.getAssetType(pId);
855
856
857 if (myAssetType.isSecurityHolding()) {
858 final MoneyWiseSecurityHoldingMap myMap
859 = (MoneyWiseSecurityHoldingMap) pData.getDataList(MoneyWiseBasicDataType.PORTFOLIO, MoneyWisePortfolioList.class).getSecurityHoldingsMap();
860 return myMap.findHoldingById(pId);
861 } else if (myAssetType.isPayee()) {
862 return pData.getDataList(MoneyWiseBasicDataType.PAYEE, MoneyWisePayeeList.class).findItemById(MoneyWiseAssetType.getBaseId(pId));
863 } else if (myAssetType.isDeposit()) {
864 return pData.getDataList(MoneyWiseBasicDataType.DEPOSIT, MoneyWiseDepositList.class).findItemById(MoneyWiseAssetType.getBaseId(pId));
865 } else if (myAssetType.isCash() || myAssetType.isAutoExpense()) {
866 return pData.getDataList(MoneyWiseBasicDataType.CASH, MoneyWiseCashList.class).findItemById(MoneyWiseAssetType.getBaseId(pId));
867 } else if (myAssetType.isLoan()) {
868 return pData.getDataList(MoneyWiseBasicDataType.LOAN, MoneyWiseLoanList.class).findItemById(MoneyWiseAssetType.getBaseId(pId));
869 } else if (myAssetType.isPortfolio()) {
870 return pData.getDataList(MoneyWiseBasicDataType.PORTFOLIO, MoneyWisePortfolioList.class).findItemById(MoneyWiseAssetType.getBaseId(pId));
871 } else {
872 return null;
873 }
874 }
875
876
877
878
879
880
881
882
883 private static MoneyWiseTransAsset resolveTransAsset(final PrometheusDataSetListCtl pData,
884 final String pName) {
885
886 if (pName.contains(MoneyWiseSecurityHolding.SECURITYHOLDING_SEP)) {
887 final MoneyWiseSecurityHoldingMap myMap
888 = (MoneyWiseSecurityHoldingMap) pData.getDataList(MoneyWiseBasicDataType.PORTFOLIO, MoneyWisePortfolioList.class).getSecurityHoldingsMap();
889 return myMap.findHoldingByName(pName);
890 } else {
891 MoneyWiseTransAsset myAsset = pData.getDataList(MoneyWiseBasicDataType.PAYEE, MoneyWisePayeeList.class).findItemByName(pName);
892 if (myAsset == null) {
893 myAsset = pData.getDataList(MoneyWiseBasicDataType.DEPOSIT, MoneyWiseDepositList.class).findItemByName(pName);
894 }
895 if (myAsset == null) {
896 myAsset = pData.getDataList(MoneyWiseBasicDataType.CASH, MoneyWiseCashList.class).findItemByName(pName);
897 }
898 if (myAsset == null) {
899 myAsset = pData.getDataList(MoneyWiseBasicDataType.LOAN, MoneyWiseLoanList.class).findItemByName(pName);
900 }
901 if (myAsset == null) {
902 myAsset = pData.getDataList(MoneyWiseBasicDataType.PORTFOLIO, MoneyWisePortfolioList.class).findItemByName(pName);
903 }
904 return myAsset;
905 }
906 }
907
908
909
910
911
912
913 protected void applyBasicChanges(final MoneyWiseTransBase pTrans) {
914
915 if (!MetisDataDifference.isEqual(getDirection(), pTrans.getDirection())) {
916 setValueDirection(pTrans.getDirection());
917 }
918
919
920 if (!MetisDataDifference.isEqual(getCategory(), pTrans.getCategory())) {
921 setValueCategory(pTrans.getCategory());
922 }
923
924
925 if (!MetisDataDifference.isEqual(getAccount(), pTrans.getAccount())) {
926 setValueAccount(pTrans.getAccount());
927 }
928
929
930 if (!MetisDataDifference.isEqual(getPartner(), pTrans.getPartner())) {
931 setValuePartner(pTrans.getPartner());
932 }
933
934
935 if (!MetisDataDifference.isEqual(getAmount(), pTrans.getAmount())) {
936 setValueAmount(pTrans.getAmountField());
937 }
938
939
940 if (!MetisDataDifference.isEqual(isReconciled(), pTrans.isReconciled())) {
941 setValueReconciled(pTrans.isReconciled());
942 }
943 }
944
945
946
947
948
949
950 public abstract static class MoneyWiseTransBaseList<T extends MoneyWiseTransBase>
951 extends PrometheusEncryptedList<T> {
952
953
954
955 static {
956 MetisFieldSet.newFieldSet(MoneyWiseTransBaseList.class);
957 }
958
959
960
961
962
963
964
965
966 protected MoneyWiseTransBaseList(final PrometheusDataSet pData,
967 final Class<T> pClass,
968 final MoneyWiseBasicDataType pItemType) {
969
970 super(pClass, pData, pItemType, PrometheusListStyle.CORE);
971 }
972
973
974
975
976
977
978 protected MoneyWiseTransBaseList(final MoneyWiseTransBaseList<T> pSource) {
979
980 super(pSource);
981 }
982
983 @Override
984 @SuppressWarnings("unchecked")
985 public MoneyWiseDataValidatorTrans<T> getValidator() {
986 return (MoneyWiseDataValidatorTrans<T>) super.getValidator();
987 }
988 }
989
990
991
992
993
994
995 public interface MoneyWiseDataValidatorTrans<T extends MoneyWiseTransBase>
996 extends MoneyWiseDataValidatorAutoCorrect<T> {
997
998
999
1000
1001
1002
1003 boolean isValidAccount(MoneyWiseTransAsset pAccount);
1004
1005
1006
1007
1008
1009
1010
1011
1012 boolean isValidCategory(MoneyWiseTransAsset pAccount,
1013 MoneyWiseTransCategory pCategory);
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023 boolean isValidDirection(MoneyWiseTransAsset pAccount,
1024 MoneyWiseTransCategory pCategory,
1025 MoneyWiseAssetDirection pDirection);
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035 boolean isValidPartner(MoneyWiseTransAsset pAccount,
1036 MoneyWiseTransCategory pCategory,
1037 MoneyWiseTransAsset pPartner);
1038
1039
1040
1041
1042
1043
1044
1045 MoneyWiseTransBase buildTransaction(Object pKey);
1046
1047
1048
1049
1050
1051
1052 void setRange(OceanusDateRange pRange);
1053
1054
1055
1056
1057
1058
1059 OceanusDateRange getRange();
1060
1061
1062
1063
1064
1065
1066 PrometheusEditSet getEditSet();
1067 }
1068 }