1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.data.validate;
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.OceanusMoney;
23 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusUnits;
24 import io.github.tonywasher.joceanus.metis.data.MetisDataDifference;
25 import io.github.tonywasher.joceanus.metis.field.MetisFieldRequired;
26 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseAssetDirection;
27 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseAssetType;
28 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
29 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
30 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataValidator.MoneyWiseDataValidatorTrans;
31 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDeposit;
32 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseLoan;
33 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee;
34 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePortfolio;
35 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurity;
36 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurityHolding;
37 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransAsset;
38 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransBase;
39 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransCategory;
40 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransInfoSet;
41 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransaction;
42 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseDepositCategoryClass;
43 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePayeeClass;
44 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePortfolioClass;
45 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseSecurityClass;
46 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryClass;
47 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransInfoClass;
48 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
49 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
50
51 import java.util.Currency;
52 import java.util.Objects;
53
54
55
56
57 public class MoneyWiseValidateTransaction
58 implements MoneyWiseDataValidatorTrans<MoneyWiseTransaction> {
59
60
61
62 private final boolean newValidation;
63
64
65
66
67 private final MoneyWiseValidateTransInfoSet theInfoSet;
68
69
70
71
72 private final MoneyWiseValidateTransDefaults theDefaults;
73
74
75
76
77 private PrometheusEditSet theEditSet;
78
79
80
81
82
83
84 MoneyWiseValidateTransaction(final boolean pNewValidation) {
85 newValidation = pNewValidation;
86 theInfoSet = new MoneyWiseValidateTransInfoSet(pNewValidation);
87 theDefaults = new MoneyWiseValidateTransDefaults(this);
88 }
89
90 @Override
91 public void setEditSet(final PrometheusEditSet pEditSet) {
92 theEditSet = pEditSet;
93 theInfoSet.storeEditSet(pEditSet);
94 }
95
96
97
98
99
100
101 PrometheusEditSet getEditSet() {
102 if (theEditSet == null) {
103 throw new IllegalStateException("editSet not set up");
104 }
105 return theEditSet;
106 }
107
108
109
110
111
112
113 public MoneyWiseValidateTransInfoSet getInfoSetValidator() {
114 return theInfoSet;
115 }
116
117
118
119
120
121
122 public boolean newValidation() {
123 return newValidation;
124 }
125
126 @Override
127 public void validate(final PrometheusDataItem pTrans) {
128 final MoneyWiseTransaction myTrans = (MoneyWiseTransaction) pTrans;
129 final OceanusDate myDate = myTrans.getDate();
130 final MoneyWiseTransAsset myAccount = myTrans.getAccount();
131 final MoneyWiseTransAsset myPartner = myTrans.getPartner();
132 final MoneyWiseTransCategory myCategory = myTrans.getCategory();
133 final MoneyWiseAssetDirection myDir = myTrans.getDirection();
134 final OceanusMoney myAmount = myTrans.getAmount();
135 final OceanusUnits myAccountUnits = myTrans.getAccountDeltaUnits();
136 final OceanusUnits myPartnerUnits = myTrans.getPartnerDeltaUnits();
137 boolean doCheckCombo = true;
138
139
140 if (pTrans.isHeader()) {
141 pTrans.setValidEdit();
142 return;
143 }
144
145
146 final OceanusDateRange myRange = myTrans.getDataSet().getDateRange();
147
148
149 if (myDate == null) {
150 pTrans.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseBasicResource.MONEYWISEDATA_FIELD_DATE);
151
152 } else if (myRange.compareToDate(myDate) != 0) {
153 pTrans.addError(PrometheusDataItem.ERROR_RANGE, MoneyWiseBasicResource.MONEYWISEDATA_FIELD_DATE);
154 }
155
156
157 if (myAccount == null) {
158 pTrans.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseBasicResource.TRANSACTION_ACCOUNT);
159 doCheckCombo = false;
160
161 } else {
162
163 if (!isValidAccount(myAccount)) {
164 pTrans.addError(MoneyWiseTransBase.ERROR_COMBO, MoneyWiseBasicResource.TRANSACTION_ACCOUNT);
165 doCheckCombo = false;
166 }
167 }
168
169
170 if (myCategory == null) {
171 pTrans.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseBasicDataType.TRANSCATEGORY);
172 doCheckCombo = false;
173
174
175 } else if (doCheckCombo
176 && !isValidCategory(myAccount, myCategory)) {
177 pTrans.addError(MoneyWiseTransBase.ERROR_COMBO, MoneyWiseBasicDataType.TRANSCATEGORY);
178 doCheckCombo = false;
179 }
180
181
182 if (myDir == null) {
183 pTrans.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseBasicResource.TRANSACTION_DIRECTION);
184 doCheckCombo = false;
185
186
187 } else if (doCheckCombo
188 && !isValidDirection(myAccount, myCategory, myDir)) {
189 pTrans.addError(MoneyWiseTransBase.ERROR_COMBO, MoneyWiseBasicResource.TRANSACTION_DIRECTION);
190 doCheckCombo = false;
191 }
192
193
194 if (myPartner == null) {
195 pTrans.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseBasicResource.TRANSACTION_PARTNER);
196
197 } else {
198
199 if (doCheckCombo
200 && !isValidPartner(myAccount, myCategory, myPartner)) {
201 pTrans.addError(MoneyWiseTransBase.ERROR_COMBO, MoneyWiseBasicResource.TRANSACTION_PARTNER);
202 }
203 }
204
205
206 if (myAmount == null) {
207
208 if (!needsNullAmount(myTrans)) {
209 pTrans.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseBasicResource.TRANSACTION_AMOUNT);
210 }
211
212
213 } else {
214
215 if (needsNullAmount(myTrans)) {
216 pTrans.addError(PrometheusDataItem.ERROR_EXIST, MoneyWiseBasicResource.TRANSACTION_AMOUNT);
217 }
218
219
220 if (!myAmount.isPositive()) {
221 pTrans.addError(PrometheusDataItem.ERROR_NEGATIVE, MoneyWiseBasicResource.TRANSACTION_AMOUNT);
222 }
223
224
225 if (myAccount != null) {
226 final Currency myCurrency = myAccount.getCurrency();
227 if (!myAmount.getCurrency().equals(myCurrency)) {
228 pTrans.addError(MoneyWiseTransBase.ERROR_CURRENCY, MoneyWiseBasicResource.TRANSACTION_AMOUNT);
229 }
230 }
231 }
232
233
234 if (myAccountUnits != null
235 && myPartnerUnits != null
236 && MetisDataDifference.isEqual(myAccount, myPartner)) {
237 pTrans.addError(MoneyWiseTransaction.ERROR_CIRCULAR, MoneyWiseTransInfoSet.getFieldForClass(MoneyWiseTransInfoClass.PARTNERDELTAUNITS));
238 }
239
240
241 if (myCategory != null
242 && myTrans.getInfoSet() != null) {
243
244 theInfoSet.validate(myTrans.getInfoSet());
245 }
246
247
248 if (!pTrans.hasErrors()) {
249 pTrans.setValidEdit();
250 }
251 }
252
253
254
255
256
257
258
259 public boolean needsNullAmount(final MoneyWiseTransaction pTrans) {
260 final MoneyWiseTransCategoryClass myClass = pTrans.getCategoryClass();
261 return myClass != null
262 && myClass.needsNullAmount();
263 }
264
265 @Override
266 public boolean isValidAccount(final MoneyWiseTransAsset pAccount) {
267
268 if (pAccount instanceof MoneyWiseSecurityHolding myHolding
269 && !checkSecurityHolding(myHolding)) {
270 return false;
271 }
272
273
274 if (pAccount instanceof MoneyWisePortfolio myPortfolio
275 && myPortfolio.getCategoryClass().holdsPensions()) {
276 return false;
277 }
278
279
280 final MoneyWiseAssetType myType = pAccount.getAssetType();
281 return myType.isBaseAccount() && !pAccount.isHidden();
282 }
283
284 @Override
285 public boolean isValidCategory(final MoneyWiseTransAsset pAccount,
286 final MoneyWiseTransCategory pCategory) {
287
288 final MoneyWiseAssetType myType = pAccount.getAssetType();
289 final MoneyWiseTransCategoryClass myCatClass = Objects.requireNonNull(pCategory.getCategoryTypeClass());
290
291
292 if (myCatClass.isHiddenType()) {
293 return false;
294 }
295
296
297 switch (myCatClass) {
298 case TAXEDINCOME:
299 case GROSSINCOME:
300 case RECOVEREDEXPENSES:
301 case OTHERINCOME:
302
303 return myType.isValued();
304
305 case PENSIONCONTRIB:
306
307 return (pAccount instanceof MoneyWiseSecurityHolding myHolding
308 && myHolding.getSecurity().getCategoryClass().isPension())
309 || (pAccount instanceof MoneyWisePortfolio myPortfolio
310 && myPortfolio.isPortfolioClass(MoneyWisePortfolioClass.SIPP));
311
312 case GIFTEDINCOME:
313 case INHERITED:
314
315 return myType.isAsset();
316
317 case INTEREST:
318
319 return myType.isDeposit() || myType.isPortfolio();
320
321 case DIVIDEND:
322 case SECURITYCLOSURE:
323
324 return myType.isSecurityHolding();
325
326 case BADDEBTCAPITAL:
327 case BADDEBTINTEREST:
328
329 return pAccount instanceof MoneyWiseDeposit myDeposit
330 && myDeposit.isDepositClass(MoneyWiseDepositCategoryClass.PEER2PEER);
331
332 case CASHBACK:
333 return checkCashBack(pAccount);
334
335 case LOYALTYBONUS:
336 return checkLoyaltyBonus(pAccount);
337
338 case RENTALINCOME:
339 case RENTALEXPENSE:
340 case ROOMRENTALINCOME:
341
342 return pAccount instanceof MoneyWiseSecurityHolding myHolding
343 && myHolding.getSecurity().isSecurityClass(MoneyWiseSecurityClass.PROPERTY);
344
345 case UNITSADJUST:
346 case SECURITYREPLACE:
347
348 return pAccount.isCapital();
349
350 case STOCKSPLIT:
351 case STOCKTAKEOVER:
352 case STOCKDEMERGER:
353 case STOCKRIGHTSISSUE:
354
355 return pAccount.isShares();
356
357 case WRITEOFF:
358 case LOANINTERESTEARNED:
359 case LOANINTERESTCHARGED:
360 case TAXRELIEF:
361 return myType.isLoan();
362
363 case LOCALTAXES:
364 case INCOMETAX:
365 return myType.isValued();
366
367 case EXPENSE:
368 return myType.isValued() || myType.isAutoExpense();
369
370 case PORTFOLIOXFER:
371 return pAccount instanceof MoneyWiseSecurityHolding
372 || pAccount instanceof MoneyWisePortfolio;
373
374 case TRANSFER:
375 return true;
376
377
378 default:
379 return false;
380 }
381 }
382
383 @Override
384 public boolean isValidDirection(final MoneyWiseTransAsset pAccount,
385 final MoneyWiseTransCategory pCategory,
386 final MoneyWiseAssetDirection pDirection) {
387
388
389
390 final MoneyWiseTransCategoryClass myCatClass = pCategory.getCategoryTypeClass();
391
392
393 switch (myCatClass) {
394 case TAXEDINCOME:
395 case GROSSINCOME:
396
397 return newValidation || pDirection.isFrom();
398
399 case PENSIONCONTRIB:
400
401 return pDirection.isFrom();
402
403 case GIFTEDINCOME:
404 case INHERITED:
405
406 return newValidation || pDirection.isFrom();
407
408 case RENTALINCOME:
409 case ROOMRENTALINCOME:
410
411 return pDirection.isTo();
412
413 case RENTALEXPENSE:
414
415 return pDirection.isFrom();
416
417 case INTEREST:
418
419 return newValidation || pDirection.isTo();
420
421 case DIVIDEND:
422 case SECURITYCLOSURE:
423
424 return pDirection.isTo();
425
426 case LOYALTYBONUS:
427
428 return newValidation || pDirection.isTo();
429
430 case WRITEOFF:
431 case LOANINTERESTCHARGED:
432
433 return newValidation || pDirection.isTo();
434
435 case LOANINTERESTEARNED:
436
437 return newValidation || pDirection.isFrom();
438
439 case UNITSADJUST:
440 case STOCKSPLIT:
441 case STOCKDEMERGER:
442 case STOCKTAKEOVER:
443 case SECURITYREPLACE:
444 case PORTFOLIOXFER:
445
446 return pDirection.isTo();
447
448 default:
449 return true;
450 }
451 }
452
453 @Override
454 public boolean isValidPartner(final MoneyWiseTransAsset pAccount,
455 final MoneyWiseTransCategory pCategory,
456 final MoneyWiseTransAsset pPartner) {
457
458 final boolean isRecursive = MetisDataDifference.isEqual(pAccount, pPartner);
459 final MoneyWiseAssetType myPartnerType = pPartner.getAssetType();
460 final MoneyWiseTransCategoryClass myCatClass = Objects.requireNonNull(pCategory.getCategoryTypeClass());
461
462
463 if (pPartner.isHidden()) {
464 return false;
465 }
466
467
468 if (pPartner instanceof MoneyWiseSecurityHolding myHolding
469 && !checkSecurityHolding(myHolding)) {
470 return false;
471 }
472
473
474 if (pPartner instanceof MoneyWisePortfolio myPortfolio
475 && myPortfolio.getCategoryClass().holdsPensions()) {
476 return false;
477 }
478
479
480 if (pAccount.isAutoExpense()
481 || pPartner.isAutoExpense()) {
482
483 final MoneyWiseAssetType myAccountType = pAccount.getAssetType();
484
485
486 switch (myCatClass) {
487 case TRANSFER:
488
489 return myPartnerType.isAutoExpense()
490 ? myAccountType.isValued()
491 : myPartnerType.isValued();
492
493 case EXPENSE:
494
495 return pPartner instanceof MoneyWisePayee;
496
497
498 default:
499 return false;
500 }
501 }
502
503
504 switch (myCatClass) {
505 case TAXEDINCOME:
506 case GROSSINCOME:
507
508 return pPartner instanceof MoneyWisePayee myPayee
509 && myPayee.getCategoryClass().canProvideTaxedIncome();
510
511 case PENSIONCONTRIB:
512
513 return pPartner instanceof MoneyWisePayee myPayee
514 && myPayee.getCategoryClass().canContribPension();
515
516 case OTHERINCOME:
517 case RECOVEREDEXPENSES:
518
519 return pPartner instanceof MoneyWisePayee;
520
521 case LOCALTAXES:
522
523 return pPartner instanceof MoneyWisePayee myPayee
524 && myPayee.isPayeeClass(MoneyWisePayeeClass.GOVERNMENT);
525
526 case GIFTEDINCOME:
527 case INHERITED:
528
529 return pPartner instanceof MoneyWisePayee myPayee
530 && myPayee.isPayeeClass(MoneyWisePayeeClass.INDIVIDUAL);
531
532 case RENTALINCOME:
533 case RENTALEXPENSE:
534 case ROOMRENTALINCOME:
535
536 return myPartnerType.isLoan();
537
538 case WRITEOFF:
539 case LOANINTERESTEARNED:
540 case LOANINTERESTCHARGED:
541
542 return isRecursive;
543
544 case INTEREST:
545 case CASHBACK:
546
547 return myPartnerType.isValued();
548
549 case DIVIDEND:
550 return checkDividend(pAccount, pPartner);
551
552 case LOYALTYBONUS:
553 return checkLoyaltyBonus(pAccount, pPartner);
554
555 case BADDEBTCAPITAL:
556 case BADDEBTINTEREST:
557 return pPartner instanceof MoneyWisePayee
558 && MetisDataDifference.isEqual(pPartner, pAccount.getParent());
559
560 case UNITSADJUST:
561 case STOCKSPLIT:
562
563 return isRecursive;
564
565 case SECURITYREPLACE:
566 case STOCKTAKEOVER:
567 case STOCKDEMERGER:
568 return checkTakeOver(pAccount, pPartner);
569
570 case STOCKRIGHTSISSUE:
571 return checkStockRights(pAccount, pPartner);
572
573 case TRANSFER:
574 return checkTransfer(pAccount, pPartner);
575
576 case SECURITYCLOSURE:
577 return checkSecurityClosure(pAccount, pPartner);
578
579 case EXPENSE:
580
581 return pPartner instanceof MoneyWisePayee;
582
583 case INCOMETAX:
584 case TAXRELIEF:
585 return pPartner instanceof MoneyWisePayee myPayee
586 && myPayee.isPayeeClass(MoneyWisePayeeClass.TAXMAN);
587
588 case PORTFOLIOXFER:
589 return checkPortfolioXfer(pAccount, pPartner);
590
591 default:
592 return false;
593 }
594 }
595
596
597
598
599
600
601
602 private static boolean checkSecurityHolding(final MoneyWiseSecurityHolding pHolding) {
603
604 final MoneyWisePortfolio myPortfolio = pHolding.getPortfolio();
605 final MoneyWiseSecurity mySecurity = pHolding.getSecurity();
606
607
608 if (myPortfolio.getCategoryClass().holdsPensions()) {
609
610 return mySecurity.getCategoryClass().isPension();
611 }
612
613
614 return !mySecurity.getCategoryClass().isPension();
615 }
616
617
618
619
620
621
622
623
624 private static boolean checkDividend(final MoneyWiseTransAsset pAccount,
625 final MoneyWiseTransAsset pPartner) {
626
627 if (MetisDataDifference.isEqual(pAccount, pPartner)) {
628 return true;
629 }
630
631
632 return pPartner.getAssetType().isValued();
633 }
634
635
636
637
638
639
640
641
642 private static boolean checkTakeOver(final MoneyWiseTransAsset pAccount,
643 final MoneyWiseTransAsset pPartner) {
644
645 if (!(pAccount instanceof MoneyWiseSecurityHolding)
646 || !(pPartner instanceof MoneyWiseSecurityHolding)) {
647 return false;
648 }
649
650
651 if (MetisDataDifference.isEqual(pAccount, pPartner)) {
652 return false;
653 }
654
655
656 final MoneyWiseSecurityHolding myAccount = (MoneyWiseSecurityHolding) pAccount;
657 final MoneyWiseSecurityHolding myPartner = (MoneyWiseSecurityHolding) pPartner;
658
659
660 if (!MetisDataDifference.isEqual(myAccount.getPortfolio(), myPartner.getPortfolio())) {
661 return false;
662 }
663
664
665 return MetisDataDifference.isEqual(myAccount.getSecurity().getCategory(), myPartner.getSecurity().getCategory());
666 }
667
668
669
670
671
672
673
674
675 private static boolean checkStockRights(final MoneyWiseTransAsset pAccount,
676 final MoneyWiseTransAsset pPartner) {
677
678 if (pAccount instanceof MoneyWiseSecurityHolding myHolding
679 && pPartner instanceof MoneyWisePortfolio) {
680
681 return MetisDataDifference.isEqual(myHolding.getPortfolio(), pPartner);
682 }
683
684
685 return pPartner.getAssetType().isValued();
686 }
687
688
689
690
691
692
693
694 private static boolean checkCashBack(final MoneyWiseTransAsset pAccount) {
695
696 if (pAccount instanceof MoneyWiseDeposit myDeposit) {
697 return myDeposit.getCategoryClass().canCashBack();
698 }
699
700
701 if (pAccount instanceof MoneyWiseLoan myLoan) {
702 return myLoan.getCategoryClass().canCashBack();
703 }
704
705
706 return false;
707 }
708
709
710
711
712
713
714
715 private boolean checkLoyaltyBonus(final MoneyWiseTransAsset pAccount) {
716
717 if (pAccount instanceof MoneyWiseDeposit myDeposit) {
718 return newValidation
719 || myDeposit.getCategoryClass().canLoyaltyBonus();
720 }
721
722
723 return pAccount instanceof MoneyWisePortfolio;
724 }
725
726
727
728
729
730
731
732
733 private static boolean checkLoyaltyBonus(final MoneyWiseTransAsset pAccount,
734 final MoneyWiseTransAsset pPartner) {
735
736 if (pAccount instanceof MoneyWisePortfolio
737 && pPartner instanceof MoneyWiseSecurityHolding myHolding) {
738
739 return MetisDataDifference.isEqual(myHolding.getPortfolio(), pAccount);
740 }
741
742
743 return MetisDataDifference.isEqual(pAccount, pPartner);
744 }
745
746
747
748
749
750
751
752
753 private static boolean checkTransfer(final MoneyWiseTransAsset pAccount,
754 final MoneyWiseTransAsset pPartner) {
755
756 if (MetisDataDifference.isEqual(pAccount, pPartner)) {
757 return false;
758 }
759
760
761 if (pAccount instanceof MoneyWiseSecurityHolding myHolding
762 && pPartner instanceof MoneyWisePortfolio) {
763
764 if (!MetisDataDifference.isEqual(myHolding.getPortfolio(), pPartner)) {
765 return false;
766 }
767 }
768
769
770 if (pPartner instanceof MoneyWiseSecurityHolding myHolding
771 && pAccount instanceof MoneyWisePortfolio) {
772
773 if (!MetisDataDifference.isEqual(myHolding.getPortfolio(), pAccount)) {
774 return false;
775 }
776 }
777
778
779 return pPartner.getAssetType().isAsset();
780 }
781
782
783
784
785
786
787
788
789 private static boolean checkSecurityClosure(final MoneyWiseTransAsset pAccount,
790 final MoneyWiseTransAsset pPartner) {
791
792 if (MetisDataDifference.isEqual(pAccount, pPartner)) {
793 return false;
794 }
795
796
797 return pPartner.getAssetType().isValued();
798 }
799
800
801
802
803
804
805
806
807 private static boolean checkPortfolioXfer(final MoneyWiseTransAsset pAccount,
808 final MoneyWiseTransAsset pPartner) {
809
810 if (!(pPartner instanceof MoneyWisePortfolio)) {
811 return false;
812 }
813
814
815 if (pAccount instanceof MoneyWisePortfolio) {
816
817 if (MetisDataDifference.isEqual(pAccount, pPartner)) {
818 return false;
819 }
820
821
822 return MetisDataDifference.isEqual(pAccount.getAssetCurrency(), pPartner.getAssetCurrency());
823 }
824
825
826 if (pAccount instanceof MoneyWiseSecurityHolding myHolding) {
827
828 return !MetisDataDifference.isEqual(myHolding.getPortfolio(), pPartner);
829 }
830
831
832 return false;
833 }
834
835
836
837
838
839
840
841
842 public MetisFieldRequired isClassRequired(final MoneyWiseTransaction pTrans,
843 final MoneyWiseTransInfoClass pClass) {
844 theInfoSet.storeInfoSet(pTrans.getInfoSet());
845 return theInfoSet.isClassRequired(pClass);
846 }
847
848 @Override
849 public void autoCorrect(final MoneyWiseTransaction pItem) throws OceanusException {
850 theDefaults.autoCorrect(pItem);
851 }
852
853 @Override
854 public MoneyWiseTransaction buildTransaction(final Object pKey) {
855 return theDefaults.buildTransaction(pKey);
856 }
857
858 @Override
859 public void setRange(final OceanusDateRange pRange) {
860 theDefaults.setRange(pRange);
861 }
862
863 @Override
864 public OceanusDateRange getRange() {
865 return theDefaults.getRange();
866 }
867 }